diff --git a/GNUmakefile b/GNUmakefile
index bfa8ef96d00..4a7bd528b3a 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -35,8 +35,8 @@ lint:
@golangci-lint run ./$(PKG_NAME)
tools:
- GO111MODULE=off go get -u github.com/client9/misspell/cmd/misspell
- GO111MODULE=off go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
+ GO111MODULE=on go install github.com/client9/misspell/cmd/misspell
+ GO111MODULE=on go install github.com/golangci/golangci-lint/cmd/golangci-lint
test-compile:
@if [ "$(TEST)" = "./..." ]; then \
diff --git a/go.mod b/go.mod
index 0a203690b31..bb6bb44f0de 100644
--- a/go.mod
+++ b/go.mod
@@ -9,9 +9,14 @@ require (
github.com/bgentry/speakeasy v0.1.0 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/boombuler/barcode v0.0.0-20180809052337-34fff276c74e // indirect
+ github.com/client9/misspell v0.3.4
+ github.com/go-toolsmith/pkgload v0.0.0-20181120203407-5122569a890b // indirect
github.com/gogo/protobuf v1.2.0 // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db // indirect
+ github.com/golangci/go-tools v0.0.0-20190124090046-35a9f45a5db0 // indirect
+ github.com/golangci/golangci-lint v1.15.0
+ github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb // indirect
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf // indirect
github.com/hashicorp/aws-sdk-go-base v0.3.0
github.com/hashicorp/go-cleanhttp v0.5.0
diff --git a/go.sum b/go.sum
index 44d9886e27e..81b2519e5a2 100644
--- a/go.sum
+++ b/go.sum
@@ -6,8 +6,13 @@ github.com/Azure/go-autorest v9.10.0+incompatible h1:bsri0JnC11oSNMWYkx5tCcfZziO
github.com/Azure/go-autorest v9.10.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-ntlmssp v0.0.0-20170803034930-c92175d54006 h1:dVyNL14dq1500JomYVzJTVi0XEcZFCYwwiNpDeCfoes=
github.com/Azure/go-ntlmssp v0.0.0-20170803034930-c92175d54006/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/ChrisTrenkamp/goxpath v0.0.0-20170625215350-4fe035839290 h1:K9I21XUHNbYD3GNMmJBN0UKJCpdP+glftwNZ7Bo8kqY=
github.com/ChrisTrenkamp/goxpath v0.0.0-20170625215350-4fe035839290/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
+github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2 h1:HTOmFEEYrWi4MW5ZKUx6xfeyM10Sx3kQF65xiQJMPYA=
+github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2/go.mod h1:7/4sitnI9YlQgTLLk734QlzXT8DuHVnAyztLplQjk+o=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292 h1:tuQ7w+my8a8mkwN7x2TSd7OzTjkZ7rAeSyH4xncuAMI=
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292/go.mod h1:KYCjqMOeHpNuTOiFQU6WEcTG7poCJrUs0YgyHNtn1no=
github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
@@ -51,6 +56,8 @@ github.com/chzyer/logex v1.1.11-0.20160617073814-96a4d311aa9b/go.mod h1:+Ywpsq7O
github.com/chzyer/readline v0.0.0-20161106042343-c914be64f07d h1:aG5FcWiZTOhPQzYIxwxSR1zEOxzL32fwr1CsaCfhO6w=
github.com/chzyer/readline v0.0.0-20161106042343-c914be64f07d/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20160617131543-bea8f082b6fd/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
+github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coreos/bbolt v1.3.1-coreos.1/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.2.0-rc.1.0.20170908195435-80aa810309d4+incompatible h1:VLCxgrfBsnJtqTy0WFP0GsjjwWZQiuQiNgiWnY6g6Gc=
github.com/coreos/etcd v3.2.0-rc.1.0.20170908195435-80aa810309d4+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
@@ -68,22 +75,96 @@ github.com/dnaeon/go-vcr v0.0.0-20170218072653-87d4990451a8/go.mod h1:aBB1+wY4s9
github.com/dylanmei/iso8601 v0.1.0 h1:812NGQDBcqquTfH5Yeo7lwR0nzx/cKdsmf3qMjPURUI=
github.com/dylanmei/iso8601 v0.1.0/go.mod h1:w9KhXSgIyROl1DefbMYIE7UVSIvELTbMrCfx+QkYnoQ=
github.com/dylanmei/winrmtest v0.0.0-20170819153634-c2fbb09e6c08/go.mod h1:VBVDFSBXCIW8JaHQpI8lldSKfYaLMzP9oyq6IJ4fhzY=
+github.com/fatih/color v1.6.0 h1:66qjqZk8kalYAvDRtM1AdAJQI0tj4Wrue3Eq3B3pmFU=
+github.com/fatih/color v1.6.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-critic/go-critic v0.0.0-20181204210945-ee9bf5809ead h1:qwmAYufKDopQnFdeMw+iHJVxAd2CbF+VFKHyJJwnPKk=
+github.com/go-critic/go-critic v0.0.0-20181204210945-ee9bf5809ead/go.mod h1:3MzXZKJdeXqdU9cj+rvZdNiN7SZ8V9OjybF8loZDmHU=
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
+github.com/go-lintpack/lintpack v0.5.2 h1:DI5mA3+eKdWeJ40nU4d6Wc26qmdG8RCi/btYq0TuRN0=
+github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-test/deep v1.0.1 h1:UQhStjbkDClarlmv0am7OXXO4/GaPdCGiUiMTvi28sg=
github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
+github.com/go-toolsmith/astcast v0.0.0-20181028201508-b7a89ed70af1 h1:h+1eMw+tZAlgTVclcVN0/rdPaBI/RUzG0peblT6df+Q=
+github.com/go-toolsmith/astcast v0.0.0-20181028201508-b7a89ed70af1/go.mod h1:TEo3Ghaj7PsZawQHxT/oBvo4HK/sl1RcuUHDKTTju+o=
+github.com/go-toolsmith/astcopy v0.0.0-20180903214859-79b422d080c4 h1:wVs9OMjICHbAryp9hcIuWqUOi+NqEbUSZy9zMe3W//I=
+github.com/go-toolsmith/astcopy v0.0.0-20180903214859-79b422d080c4/go.mod h1:c9CPdq2AzM8oPomdlPniEfPAC6g1s7NqZzODt8y6ib8=
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6 h1:aTBUNRTatDDU24gbOEKEoLiDwxtc98ga6K/iMTm6fvs=
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086 h1:EIMuvbE9fbtQtimdLe5yeXjuC5CeKbQt8zH6GwtIrhM=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30 h1:zRJPftZJNLPDiOtvYbFRwjSbaJAcVOf80TeEmWGe2kQ=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8 h1:vVouagbdmqTVlCIAxpyYsNNTbkKZ3V66VpKOLU/s6W4=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+github.com/go-toolsmith/pkgload v0.0.0-20181120203407-5122569a890b h1:M3arPs33ilAwsEZcEzBcZGj5XjNLo1Qohmg0IkSmrnA=
+github.com/go-toolsmith/pkgload v0.0.0-20181120203407-5122569a890b/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+github.com/go-toolsmith/strparse v0.0.0-20180903215201-830b6daa1241 h1:ZRDeQioMGTBLeJxcPxXfFifEUgYxzR7fXw7w2WR+1bo=
+github.com/go-toolsmith/strparse v0.0.0-20180903215201-830b6daa1241/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
+github.com/go-toolsmith/typep v0.0.0-20181030061450-d63dc7650676 h1:6Qrsp0+25KEkaS2bB26UE0giFgRrIc8mYXboDL5OVMA=
+github.com/go-toolsmith/typep v0.0.0-20181030061450-d63dc7650676/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
+github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
github.com/gogo/protobuf v0.0.0-20170307180453-100ba4e88506/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0 h1:xU6/SpYbvkNYiptHJYEDRseDLvYE7wSqhYYNy0QSUzI=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1 h1:G5FRp8JnTd7RQH5kemVNlMeyXQAztQ3mOWV95KxsXH8=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db h1:woRePGFeVFfLKN/pOkfl+p/TAqKOfFu+7KPlMVpok/w=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
+github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6 h1:i2jIkQFb8RG45DuQs+ElyROY848cSJIoIkBM+7XXypA=
+github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 h1:9kfjN3AdxcbsZBf8NjltjWihK2QfBBBZuv91cMFfDHw=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
+github.com/golangci/go-tools v0.0.0-20180109140146-35a9f45a5db0 h1:tYc7NX0EeSyW9wFF0EXPB57lAiKRPwKZxVkaTsGuB9k=
+github.com/golangci/go-tools v0.0.0-20180109140146-35a9f45a5db0/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
+github.com/golangci/go-tools v0.0.0-20190124090046-35a9f45a5db0 h1:MRhC9XbUjE6XDOInSJ8pwHuPagqsyO89QDU9IdVhe3o=
+github.com/golangci/go-tools v0.0.0-20190124090046-35a9f45a5db0/go.mod h1:unzUULGw35sjyOYjUt0jMTXqHlZPpPc6e+xfO4cd6mM=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3 h1:pe9JHs3cHHDQgOFXJJdYkK6fLz2PWyYtP4hthoCMvs8=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
+github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee h1:J2XAy40+7yz70uaOiMbNnluTg7gyQhtGqLQncQh+4J8=
+github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
+github.com/golangci/gofmt v0.0.0-20181105071733-0b8337e80d98 h1:ir6/L2ZOJfFrJlOTsuf/hlzdPuUwXV/VzkSlgS6f1vs=
+github.com/golangci/gofmt v0.0.0-20181105071733-0b8337e80d98/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
+github.com/golangci/golangci-lint v1.15.0 h1:Cvf5J2U5C5kAHSXxyLRJ38/OqdJbiU7SAJRYvWgO/b0=
+github.com/golangci/golangci-lint v1.15.0/go.mod h1:iEsyA2h6yMxPzFAlb/Q9UuXBrXIDtXkbUoukuqUAX/8=
+github.com/golangci/gosec v0.0.0-20180901114220-66fb7fc33547 h1:qMomh8bv+kDazm1dSLZ9S3zZ2PJZMHL4ilfBjxFOlmI=
+github.com/golangci/gosec v0.0.0-20180901114220-66fb7fc33547/go.mod h1:0qUabqiIQgfmlAmulqxyiGkkyF6/tOGSnY2cnPVwrzU=
+github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb h1:Bi7BYmZVg4C+mKGi8LeohcP2GGUl2XJD4xCkJoZSaYc=
+github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb/go.mod h1:ON/c2UR0VAAv6ZEAFKhjCLplESSmRFfZcDLASbI1GWo=
+github.com/golangci/govet v0.0.0-20180818181408-44ddbe260190 h1:SLIgprnxQNjBpkz55PK1vfb64/gKU/TgVi0obFw8Lec=
+github.com/golangci/govet v0.0.0-20180818181408-44ddbe260190/go.mod h1:pPwb+AK755h3/r73avHz5bEN6sa51/2HEZlLaV53hCo=
+github.com/golangci/ineffassign v0.0.0-20180808204949-2ee8f2867dde h1:qEGp3ZF1Qw6TkbWKn6GdJ12Ssu/CpJBaBcJ4hrUjrSo=
+github.com/golangci/ineffassign v0.0.0-20180808204949-2ee8f2867dde/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
+github.com/golangci/lint-1 v0.0.0-20180610141402-4bf9709227d1 h1:PHK2kIh21Zt4IcG0bBRzQwEDVKF64LnkoSXnm8lfJUk=
+github.com/golangci/lint-1 v0.0.0-20180610141402-4bf9709227d1/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770 h1:EL/O5HGrF7Jaq0yNhBLucz9hTuRzj2LdwGBOaENgxIk=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21 h1:leSNB7iYzLYSSx3J/s5sVf4Drkc68W2wm4Ixh/mr0us=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0 h1:HVfrLniijszjS1aiNg8JbBMO2+E1WIQ+j/gL4SQqGPg=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.1.1-0.20171002171727-8ebdfab36c66/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf h1:+RRA9JqSOZFfKrOeqr2z77+8R2RKyh8PG66dcu1V0ck=
@@ -141,6 +222,8 @@ github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f h1:UdxlrJz4JOnY8W+DbLISwf2B8WXEolNRA8BGCwI9jws=
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
+github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno=
+github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
github.com/hashicorp/hcl2 v0.0.0-20180308163058-5f8ed954abd8 h1:laCE8EKBOUVN6LwBt7Be9IX7i2RQ2cnfbt+Z5a+0PRI=
github.com/hashicorp/hcl2 v0.0.0-20180308163058-5f8ed954abd8/go.mod h1:xp1eMAxqhQKBxz+yQUTsig9bBMRRWRWw+rK3FJmHf/A=
github.com/hashicorp/hil v0.0.0-20170627220502-fa9f258a9250 h1:fooK5IvDL/KIsi4LxF/JH68nVdrBSiGNPhS2JAQjtjo=
@@ -158,6 +241,10 @@ github.com/hashicorp/vault v0.10.4 h1:4x0lHxui/ZRp/B3E0Auv1QNBJpzETqHR2kQD3mHSBJ
github.com/hashicorp/vault v0.10.4/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0=
github.com/hashicorp/yamux v0.0.0-20160720233140-d1caa6c97c9f h1:K4RDeor/qhbs5ETM85SN8xekXkk+KkOBclNXXM8+UR0=
github.com/hashicorp/yamux v0.0.0-20160720233140-d1caa6c97c9f/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
+github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jen20/awspolicyequivalence v0.0.0-20170831201602-3d48364a137a/go.mod h1:uoIMjNxUfXi48Ci40IXkPRbghZ1vbti6v9LCbNqRgHY=
github.com/jen20/awspolicyequivalence v1.0.0 h1:jLRh4GRf0IfIpMm9/m+krLnjAda4NpI9+2o5Kb/Q+G4=
github.com/jen20/awspolicyequivalence v1.0.0/go.mod h1:PV1fS2xyHhCLp83vbgSMFr2drM4GzG61wkz+k4pOG3E=
@@ -175,12 +262,23 @@ github.com/kardianos/osext v0.0.0-20160811001526-c2c54e542fb7 h1:pKv4oHt3kat9yf1
github.com/kardianos/osext v0.0.0-20160811001526-c2c54e542fb7/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba h1:NARVGAAgEXvoMeNPHhPFt1SBt1VMznA3Gnz9d0qj+co=
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
+github.com/kisielk/gotool v0.0.0-20161130080628-0de1eaf82fa3/go.mod h1:jxZFDH7ILpTPQTk+E2s+z4CUas9lVNjIuKR4c5/zKgM=
+github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kubernetes-sigs/aws-iam-authenticator v0.3.1-0.20181019024009-82544ec86140 h1:AtXWrgewhHlLux0IAfHINCbkxkf47euklyallWlximw=
github.com/kubernetes-sigs/aws-iam-authenticator v0.3.1-0.20181019024009-82544ec86140/go.mod h1:ItxiN33Ho7Di8wiC4S4XqbH1NLF0DNdDWOd/5MI9gJU=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
+github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82 h1:wnfcqULT+N2seWf6y4yHzmi7GD2kNx4Ute0qArktD48=
github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84=
+github.com/magiconair/properties v1.7.6 h1:U+1DqNen04MdEPgFiIwdOUiqZ8qPa37xgogX/sd3+54=
+github.com/magiconair/properties v1.7.6/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/masterzen/azure-sdk-for-go v0.0.0-20161014135628-ee4f0065d00c h1:FMUOnVGy8nWk1cvlMCAoftRItQGMxI0vzJ3dQjeZTCE=
github.com/masterzen/azure-sdk-for-go v0.0.0-20161014135628-ee4f0065d00c/go.mod h1:mf8fjOu33zCqxUjuiU3I8S1lJMyEAlH+0F2+M5xl3hE=
github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9 h1:SmVbOZFWAlyQshuMfOkiAx1f5oUTsOGG5IXplAEYeeM=
@@ -189,11 +287,15 @@ github.com/masterzen/winrm v0.0.0-20180224160350-7e40f93ae939 h1:cRFHA33ER97Xy5j
github.com/masterzen/winrm v0.0.0-20180224160350-7e40f93ae939/go.mod h1:CfZSN7zwz5gJiFhZJz49Uzk7mEBHIceWmbFmYx7Hf7E=
github.com/mattn/go-colorable v0.0.0-20160220075935-9cbef7c35391 h1:x4vT4RoTH2BNkPx0LgrBKeFuPQPviK1aSAIWG6ruc+Y=
github.com/mattn/go-colorable v0.0.0-20160220075935-9cbef7c35391/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.0-20161123143637-30a891c33c7c/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-shellwords v1.0.1 h1:2/mQs/EosKUge1MHnAavnrNwa0wLnWDjG4dTYMGf/kI=
github.com/mattn/go-shellwords v1.0.1/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
+github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v0.0.0-20171129193617-33edc47170b5 h1:OYr3N2fY3e3kP/x/d81CJXlcZrIV2hH8gPnuRLpiME4=
@@ -208,6 +310,7 @@ github.com/mitchellh/go-homedir v1.0.0 h1:vKb8ShqSby24Yrqr/yDYkuFz8d0WUjys40rvnG
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-linereader v0.0.0-20141013185533-07bab5fdd958 h1:wN+5lV34eSnVSZgBLWRGHr6L4giR3/wI2B9DLmVnlfI=
github.com/mitchellh/go-linereader v0.0.0-20141013185533-07bab5fdd958/go.mod h1:OaY7UOoTkkrX3wRwjpYRKafIkkyeD0UtweSHAWWiqQM=
+github.com/mitchellh/go-ps v0.0.0-20170309133038-4fdf99ab2936/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
github.com/mitchellh/go-testing-interface v0.0.0-20170730050907-9a441910b168/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77 h1:7GoSOOW2jpsfkntVKaS2rAr1TJqfcxotyaUcuxoZSzg=
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
@@ -218,6 +321,7 @@ github.com/mitchellh/hashstructure v0.0.0-20160209213820-6b17d669fac5/go.mod h1:
github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y=
github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
github.com/mitchellh/mapstructure v0.0.0-20170307201123-53818660ed49/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v0.0.0-20180220230111-00c29f56e238/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.0.0 h1:vVpGvMXJPqSDh2VYHF7gsfQj8Ncx+Xw5Y1KHeTRY+7I=
github.com/mitchellh/mapstructure v1.0.0/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/panicwrap v0.0.0-20161208170302-ba9e1a65e0f7 h1:+PBI9A4rLQJlch3eQI/RkTY2HzX+bl2lPUf3goenBxs=
@@ -231,15 +335,29 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mozilla/tls-observatory v0.0.0-20180409132520-8791a200eb40/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
+github.com/nbutton23/zxcvbn-go v0.0.0-20160627004424-a22cb81b2ecd/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
+github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663 h1:Ri1EhipkbhWsffPJ3IPlrb4SkTOPa2PfRXp3jchBczw=
+github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
+github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
+github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I=
+github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58 h1:m3CEgv3ah1Rhy82L+c0QG/U3VyY1UsvsIdkh0/rU97Y=
github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
+github.com/pelletier/go-toml v1.1.0 h1:cmiOvKzEunMsAxyhXSzpL5Q1CRKpVv0KQsnAIcSEVYM=
+github.com/pelletier/go-toml v1.1.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/errors v0.0.0-20170505043639-c605e284fe17 h1:chPfVn+gpAM5CTpTyVU9j8J+xgRGwmoDlNDLjKnJiYo=
github.com/pkg/errors v0.0.0-20170505043639-c605e284fe17/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v0.0.0-20171219111128-6bee943216c8 h1:lcb1zvdlaZyEbl2OXifN3uOYYyIvllofUbmp9bwbL+0=
@@ -250,19 +368,41 @@ github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/ryanuber/columnize v0.0.0-20161220214920-0fbbb3f0e3fb h1:/im8B/AMa1Yj8MuHvva4/KoXXWG+QR2rv8PtyKlqpVQ=
github.com/ryanuber/columnize v0.0.0-20161220214920-0fbbb3f0e3fb/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc=
github.com/satori/go.uuid v0.0.0-20160927100844-b061729afc07/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/satori/uuid v0.0.0-20160927100844-b061729afc07 h1:81vvGlnI/AZ1/TxGDirw3ofUoS64TyjmPQt5C9XODTw=
github.com/satori/uuid v0.0.0-20160927100844-b061729afc07/go.mod h1:B8HLsPLik/YNn6KKWVMDJ8nzCL8RP5WyfsnmvnAEwIU=
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
+github.com/shirou/gopsutil v0.0.0-20180427012116-c95755e4bcd7/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM=
+github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc=
+github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
+github.com/sirupsen/logrus v1.0.5 h1:8c8b5uO0zS4X6RPl/sd1ENwSkIc0/H2PaHxE3udaE8I=
+github.com/sirupsen/logrus v1.0.5/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spf13/afero v1.0.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/afero v1.1.0 h1:bopulORc2JeYaxfHLvJa5NzxviA9PoWhpiiJkru7Ji4=
+github.com/spf13/afero v1.1.0/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg=
+github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg=
+github.com/spf13/cobra v0.0.2 h1:NfkwRbgViGoyjBKsLI0QMDcuMnhM+SBg3T0cGfpvKDE=
+github.com/spf13/cobra v0.0.2/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
+github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig=
+github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/viper v1.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso=
+github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/svanharmelen/jsonapi v0.0.0-20180618144545-0c0828c3f16d h1:Z4EH+5EffvBEhh37F0C0DnpklTMh00JOkjW5zK3ofBI=
@@ -287,20 +427,35 @@ github.com/zclconf/go-cty v0.0.0-20180302160414-49fa5e03c418 h1:uZKhc0PzQtIg+6+B
github.com/zclconf/go-cty v0.0.0-20180302160414-49fa5e03c418/go.mod h1:LnDKxj8gN4aatfXUqmUNooaDjvmDcLPbAN3hYBIVoJE=
golang.org/x/crypto v0.0.0-20180211211603-9de5f2eaf759 h1:6W75OzsrwJByqag5GxxtYVTVEyP+Sy+aLDUsJ9CD8OU=
golang.org/x/crypto v0.0.0-20180211211603-9de5f2eaf759/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab h1:w4c/LoOA2vE8SYwh8wEEQVRUwpph7TtcjH7AtZvOjy0=
+golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/net v0.0.0-20170915142106-8351a756f30f/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20171004034648-a04bdaca5b32/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd h1:HuTn7WObtcDo9uEEU7rEqL0jYthdXAmZ6PP+meazmaU=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/oauth2 v0.0.0-20170928010508-bb50c06baba3 h1:YGx0PRKSN/2n/OcdFycCC0JUA/Ln+i5lPcN8VoNDus0=
golang.org/x/oauth2 v0.0.0-20170928010508-bb50c06baba3/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20171026204733-164713f0dfce/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5 h1:x6r4Jo0KNzOOzYd8lbcRsqjuqEASK6ob3auvWYM4/8U=
golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.0.0-20170915090833-1cbadb444a80/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.0.0-20171013141220-c01e4764d870/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c h1:fqgJT0MGcGpPgpWU7VRdRjuArfcOvC4AoJmILihzhDg=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20170915040203-e531a2a1c15f/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181205014116-22934f0fdb62/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190121143147-24cd39ecf745/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190125232054-379209517ffe h1:ZJ3JgA0fnPnX6nSjHp3y5XWNUf3zaTbWlilINJoPFkQ=
+golang.org/x/tools v0.0.0-20190125232054-379209517ffe/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
google.golang.org/api v0.0.0-20171005000305-7a7376eff6a5 h1:PDkJGYjSvxJyevtZRGmBSO+HjbIKuqYEEc8gB51or4o=
google.golang.org/api v0.0.0-20171005000305-7a7376eff6a5/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/appengine v0.0.0-20150527042145-b667a5000b08/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
@@ -309,13 +464,25 @@ google.golang.org/genproto v0.0.0-20171002232614-f676e0f3ac63/go.mod h1:JiN7NxoA
google.golang.org/grpc v0.0.0-20170809211603-7657092a1303/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
google.golang.org/grpc v0.0.0-20171025225919-b5eab4ccac6d h1:K+wEnjFjaXJFIWQDwduDh5V2TL0ajv+c6GYeOlhdktA=
google.golang.org/grpc v0.0.0-20171025225919-b5eab4ccac6d/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
+gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo=
+gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405 h1:829vOVxxusYHC+IqBtkX5mbKtsY9fheQiQn0MZRVLfQ=
gopkg.in/check.v1 v1.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
+gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
+gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0=
+gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170407172122-cd8b52f8269e/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
k8s.io/apimachinery v0.0.0-20190204010555-a98ff070d70e h1:7HZ9Pkl78EapVMHYAVjF1128N/w6ke+aPyo64M9I2Ds=
@@ -324,5 +491,15 @@ k8s.io/client-go v10.0.0+incompatible h1:F1IqCqw7oMBzDkqlcBymRq1450wD0eNqLE9jzUr
k8s.io/client-go v10.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s=
k8s.io/klog v0.1.0 h1:I5HMfc/DtuVaGR1KPwUrTc476K8NCqNBldC7H4dYEzk=
k8s.io/klog v0.1.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
+mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34 h1:B1LAOfRqg2QUyCdzfjf46quTSYUTAK5OCwbh6pljHbM=
+mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34/go.mod h1:H6SUd1XjIs+qQCyskXg5OFSrilMRUkD8ePJpHKDPaeY=
sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
+sourcegraph.com/sourcegraph/go-diff v0.5.1-0.20190210232911-dee78e514455 h1:qoQ5Kt+Zm+GXBtz49YwD3juBhr/E0U25jO6bBzxW6NI=
+sourcegraph.com/sourcegraph/go-diff v0.5.1-0.20190210232911-dee78e514455/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4 h1:JPJh2pk3+X4lXAkZIk2RuE/7/FoK9maXw+TNPJhVS/c=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
diff --git a/tools.go b/tools.go
new file mode 100644
index 00000000000..ea88daa1890
--- /dev/null
+++ b/tools.go
@@ -0,0 +1,8 @@
+// +build tools
+
+package main
+
+import (
+ _ "github.com/client9/misspell/cmd/misspell"
+ _ "github.com/golangci/golangci-lint/cmd/golangci-lint"
+)
diff --git a/vendor/github.com/BurntSushi/toml/.gitignore b/vendor/github.com/BurntSushi/toml/.gitignore
new file mode 100644
index 00000000000..0cd3800377d
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/.gitignore
@@ -0,0 +1,5 @@
+TAGS
+tags
+.*.swp
+tomlcheck/tomlcheck
+toml.test
diff --git a/vendor/github.com/BurntSushi/toml/.travis.yml b/vendor/github.com/BurntSushi/toml/.travis.yml
new file mode 100644
index 00000000000..8b8afc4f0e0
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/.travis.yml
@@ -0,0 +1,15 @@
+language: go
+go:
+ - 1.1
+ - 1.2
+ - 1.3
+ - 1.4
+ - 1.5
+ - 1.6
+ - tip
+install:
+ - go install ./...
+ - go get github.com/BurntSushi/toml-test
+script:
+ - export PATH="$PATH:$HOME/gopath/bin"
+ - make test
diff --git a/vendor/github.com/BurntSushi/toml/COMPATIBLE b/vendor/github.com/BurntSushi/toml/COMPATIBLE
new file mode 100644
index 00000000000..6efcfd0ce55
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/COMPATIBLE
@@ -0,0 +1,3 @@
+Compatible with TOML version
+[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md)
+
diff --git a/vendor/github.com/BurntSushi/toml/COPYING b/vendor/github.com/BurntSushi/toml/COPYING
new file mode 100644
index 00000000000..01b5743200b
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/COPYING
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 TOML authors
+
+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/BurntSushi/toml/Makefile b/vendor/github.com/BurntSushi/toml/Makefile
new file mode 100644
index 00000000000..3600848d331
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/Makefile
@@ -0,0 +1,19 @@
+install:
+ go install ./...
+
+test: install
+ go test -v
+ toml-test toml-test-decoder
+ toml-test -encoder toml-test-encoder
+
+fmt:
+ gofmt -w *.go */*.go
+ colcheck *.go */*.go
+
+tags:
+ find ./ -name '*.go' -print0 | xargs -0 gotags > TAGS
+
+push:
+ git push origin master
+ git push github master
+
diff --git a/vendor/github.com/BurntSushi/toml/README.md b/vendor/github.com/BurntSushi/toml/README.md
new file mode 100644
index 00000000000..7c1b37ecc7a
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/README.md
@@ -0,0 +1,218 @@
+## TOML parser and encoder for Go with reflection
+
+TOML stands for Tom's Obvious, Minimal Language. This Go package provides a
+reflection interface similar to Go's standard library `json` and `xml`
+packages. This package also supports the `encoding.TextUnmarshaler` and
+`encoding.TextMarshaler` interfaces so that you can define custom data
+representations. (There is an example of this below.)
+
+Spec: https://github.com/toml-lang/toml
+
+Compatible with TOML version
+[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)
+
+Documentation: https://godoc.org/github.com/BurntSushi/toml
+
+Installation:
+
+```bash
+go get github.com/BurntSushi/toml
+```
+
+Try the toml validator:
+
+```bash
+go get github.com/BurntSushi/toml/cmd/tomlv
+tomlv some-toml-file.toml
+```
+
+[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml)
+
+### Testing
+
+This package passes all tests in
+[toml-test](https://github.com/BurntSushi/toml-test) for both the decoder
+and the encoder.
+
+### Examples
+
+This package works similarly to how the Go standard library handles `XML`
+and `JSON`. Namely, data is loaded into Go values via reflection.
+
+For the simplest example, consider some TOML file as just a list of keys
+and values:
+
+```toml
+Age = 25
+Cats = [ "Cauchy", "Plato" ]
+Pi = 3.14
+Perfection = [ 6, 28, 496, 8128 ]
+DOB = 1987-07-05T05:45:00Z
+```
+
+Which could be defined in Go as:
+
+```go
+type Config struct {
+ Age int
+ Cats []string
+ Pi float64
+ Perfection []int
+ DOB time.Time // requires `import time`
+}
+```
+
+And then decoded with:
+
+```go
+var conf Config
+if _, err := toml.Decode(tomlData, &conf); err != nil {
+ // handle error
+}
+```
+
+You can also use struct tags if your struct field name doesn't map to a TOML
+key value directly:
+
+```toml
+some_key_NAME = "wat"
+```
+
+```go
+type TOML struct {
+ ObscureKey string `toml:"some_key_NAME"`
+}
+```
+
+### Using the `encoding.TextUnmarshaler` interface
+
+Here's an example that automatically parses duration strings into
+`time.Duration` values:
+
+```toml
+[[song]]
+name = "Thunder Road"
+duration = "4m49s"
+
+[[song]]
+name = "Stairway to Heaven"
+duration = "8m03s"
+```
+
+Which can be decoded with:
+
+```go
+type song struct {
+ Name string
+ Duration duration
+}
+type songs struct {
+ Song []song
+}
+var favorites songs
+if _, err := toml.Decode(blob, &favorites); err != nil {
+ log.Fatal(err)
+}
+
+for _, s := range favorites.Song {
+ fmt.Printf("%s (%s)\n", s.Name, s.Duration)
+}
+```
+
+And you'll also need a `duration` type that satisfies the
+`encoding.TextUnmarshaler` interface:
+
+```go
+type duration struct {
+ time.Duration
+}
+
+func (d *duration) UnmarshalText(text []byte) error {
+ var err error
+ d.Duration, err = time.ParseDuration(string(text))
+ return err
+}
+```
+
+### More complex usage
+
+Here's an example of how to load the example from the official spec page:
+
+```toml
+# This is a TOML document. Boom.
+
+title = "TOML Example"
+
+[owner]
+name = "Tom Preston-Werner"
+organization = "GitHub"
+bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
+dob = 1979-05-27T07:32:00Z # First class dates? Why not?
+
+[database]
+server = "192.168.1.1"
+ports = [ 8001, 8001, 8002 ]
+connection_max = 5000
+enabled = true
+
+[servers]
+
+ # You can indent as you please. Tabs or spaces. TOML don't care.
+ [servers.alpha]
+ ip = "10.0.0.1"
+ dc = "eqdc10"
+
+ [servers.beta]
+ ip = "10.0.0.2"
+ dc = "eqdc10"
+
+[clients]
+data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
+
+# Line breaks are OK when inside arrays
+hosts = [
+ "alpha",
+ "omega"
+]
+```
+
+And the corresponding Go types are:
+
+```go
+type tomlConfig struct {
+ Title string
+ Owner ownerInfo
+ DB database `toml:"database"`
+ Servers map[string]server
+ Clients clients
+}
+
+type ownerInfo struct {
+ Name string
+ Org string `toml:"organization"`
+ Bio string
+ DOB time.Time
+}
+
+type database struct {
+ Server string
+ Ports []int
+ ConnMax int `toml:"connection_max"`
+ Enabled bool
+}
+
+type server struct {
+ IP string
+ DC string
+}
+
+type clients struct {
+ Data [][]interface{}
+ Hosts []string
+}
+```
+
+Note that a case insensitive match will be tried if an exact match can't be
+found.
+
+A working example of the above can be found in `_examples/example.{go,toml}`.
diff --git a/vendor/github.com/BurntSushi/toml/decode.go b/vendor/github.com/BurntSushi/toml/decode.go
new file mode 100644
index 00000000000..b0fd51d5b6e
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/decode.go
@@ -0,0 +1,509 @@
+package toml
+
+import (
+ "fmt"
+ "io"
+ "io/ioutil"
+ "math"
+ "reflect"
+ "strings"
+ "time"
+)
+
+func e(format string, args ...interface{}) error {
+ return fmt.Errorf("toml: "+format, args...)
+}
+
+// Unmarshaler is the interface implemented by objects that can unmarshal a
+// TOML description of themselves.
+type Unmarshaler interface {
+ UnmarshalTOML(interface{}) error
+}
+
+// Unmarshal decodes the contents of `p` in TOML format into a pointer `v`.
+func Unmarshal(p []byte, v interface{}) error {
+ _, err := Decode(string(p), v)
+ return err
+}
+
+// Primitive is a TOML value that hasn't been decoded into a Go value.
+// When using the various `Decode*` functions, the type `Primitive` may
+// be given to any value, and its decoding will be delayed.
+//
+// A `Primitive` value can be decoded using the `PrimitiveDecode` function.
+//
+// The underlying representation of a `Primitive` value is subject to change.
+// Do not rely on it.
+//
+// N.B. Primitive values are still parsed, so using them will only avoid
+// the overhead of reflection. They can be useful when you don't know the
+// exact type of TOML data until run time.
+type Primitive struct {
+ undecoded interface{}
+ context Key
+}
+
+// DEPRECATED!
+//
+// Use MetaData.PrimitiveDecode instead.
+func PrimitiveDecode(primValue Primitive, v interface{}) error {
+ md := MetaData{decoded: make(map[string]bool)}
+ return md.unify(primValue.undecoded, rvalue(v))
+}
+
+// PrimitiveDecode is just like the other `Decode*` functions, except it
+// decodes a TOML value that has already been parsed. Valid primitive values
+// can *only* be obtained from values filled by the decoder functions,
+// including this method. (i.e., `v` may contain more `Primitive`
+// values.)
+//
+// Meta data for primitive values is included in the meta data returned by
+// the `Decode*` functions with one exception: keys returned by the Undecoded
+// method will only reflect keys that were decoded. Namely, any keys hidden
+// behind a Primitive will be considered undecoded. Executing this method will
+// update the undecoded keys in the meta data. (See the example.)
+func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error {
+ md.context = primValue.context
+ defer func() { md.context = nil }()
+ return md.unify(primValue.undecoded, rvalue(v))
+}
+
+// Decode will decode the contents of `data` in TOML format into a pointer
+// `v`.
+//
+// TOML hashes correspond to Go structs or maps. (Dealer's choice. They can be
+// used interchangeably.)
+//
+// TOML arrays of tables correspond to either a slice of structs or a slice
+// of maps.
+//
+// TOML datetimes correspond to Go `time.Time` values.
+//
+// All other TOML types (float, string, int, bool and array) correspond
+// to the obvious Go types.
+//
+// An exception to the above rules is if a type implements the
+// encoding.TextUnmarshaler interface. In this case, any primitive TOML value
+// (floats, strings, integers, booleans and datetimes) will be converted to
+// a byte string and given to the value's UnmarshalText method. See the
+// Unmarshaler example for a demonstration with time duration strings.
+//
+// Key mapping
+//
+// TOML keys can map to either keys in a Go map or field names in a Go
+// struct. The special `toml` struct tag may be used to map TOML keys to
+// struct fields that don't match the key name exactly. (See the example.)
+// A case insensitive match to struct names will be tried if an exact match
+// can't be found.
+//
+// The mapping between TOML values and Go values is loose. That is, there
+// may exist TOML values that cannot be placed into your representation, and
+// there may be parts of your representation that do not correspond to
+// TOML values. This loose mapping can be made stricter by using the IsDefined
+// and/or Undecoded methods on the MetaData returned.
+//
+// This decoder will not handle cyclic types. If a cyclic type is passed,
+// `Decode` will not terminate.
+func Decode(data string, v interface{}) (MetaData, error) {
+ rv := reflect.ValueOf(v)
+ if rv.Kind() != reflect.Ptr {
+ return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v))
+ }
+ if rv.IsNil() {
+ return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v))
+ }
+ p, err := parse(data)
+ if err != nil {
+ return MetaData{}, err
+ }
+ md := MetaData{
+ p.mapping, p.types, p.ordered,
+ make(map[string]bool, len(p.ordered)), nil,
+ }
+ return md, md.unify(p.mapping, indirect(rv))
+}
+
+// DecodeFile is just like Decode, except it will automatically read the
+// contents of the file at `fpath` and decode it for you.
+func DecodeFile(fpath string, v interface{}) (MetaData, error) {
+ bs, err := ioutil.ReadFile(fpath)
+ if err != nil {
+ return MetaData{}, err
+ }
+ return Decode(string(bs), v)
+}
+
+// DecodeReader is just like Decode, except it will consume all bytes
+// from the reader and decode it for you.
+func DecodeReader(r io.Reader, v interface{}) (MetaData, error) {
+ bs, err := ioutil.ReadAll(r)
+ if err != nil {
+ return MetaData{}, err
+ }
+ return Decode(string(bs), v)
+}
+
+// unify performs a sort of type unification based on the structure of `rv`,
+// which is the client representation.
+//
+// Any type mismatch produces an error. Finding a type that we don't know
+// how to handle produces an unsupported type error.
+func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
+
+ // Special case. Look for a `Primitive` value.
+ if rv.Type() == reflect.TypeOf((*Primitive)(nil)).Elem() {
+ // Save the undecoded data and the key context into the primitive
+ // value.
+ context := make(Key, len(md.context))
+ copy(context, md.context)
+ rv.Set(reflect.ValueOf(Primitive{
+ undecoded: data,
+ context: context,
+ }))
+ return nil
+ }
+
+ // Special case. Unmarshaler Interface support.
+ if rv.CanAddr() {
+ if v, ok := rv.Addr().Interface().(Unmarshaler); ok {
+ return v.UnmarshalTOML(data)
+ }
+ }
+
+ // Special case. Handle time.Time values specifically.
+ // TODO: Remove this code when we decide to drop support for Go 1.1.
+ // This isn't necessary in Go 1.2 because time.Time satisfies the encoding
+ // interfaces.
+ if rv.Type().AssignableTo(rvalue(time.Time{}).Type()) {
+ return md.unifyDatetime(data, rv)
+ }
+
+ // Special case. Look for a value satisfying the TextUnmarshaler interface.
+ if v, ok := rv.Interface().(TextUnmarshaler); ok {
+ return md.unifyText(data, v)
+ }
+ // BUG(burntsushi)
+ // The behavior here is incorrect whenever a Go type satisfies the
+ // encoding.TextUnmarshaler interface but also corresponds to a TOML
+ // hash or array. In particular, the unmarshaler should only be applied
+ // to primitive TOML values. But at this point, it will be applied to
+ // all kinds of values and produce an incorrect error whenever those values
+ // are hashes or arrays (including arrays of tables).
+
+ k := rv.Kind()
+
+ // laziness
+ if k >= reflect.Int && k <= reflect.Uint64 {
+ return md.unifyInt(data, rv)
+ }
+ switch k {
+ case reflect.Ptr:
+ elem := reflect.New(rv.Type().Elem())
+ err := md.unify(data, reflect.Indirect(elem))
+ if err != nil {
+ return err
+ }
+ rv.Set(elem)
+ return nil
+ case reflect.Struct:
+ return md.unifyStruct(data, rv)
+ case reflect.Map:
+ return md.unifyMap(data, rv)
+ case reflect.Array:
+ return md.unifyArray(data, rv)
+ case reflect.Slice:
+ return md.unifySlice(data, rv)
+ case reflect.String:
+ return md.unifyString(data, rv)
+ case reflect.Bool:
+ return md.unifyBool(data, rv)
+ case reflect.Interface:
+ // we only support empty interfaces.
+ if rv.NumMethod() > 0 {
+ return e("unsupported type %s", rv.Type())
+ }
+ return md.unifyAnything(data, rv)
+ case reflect.Float32:
+ fallthrough
+ case reflect.Float64:
+ return md.unifyFloat64(data, rv)
+ }
+ return e("unsupported type %s", rv.Kind())
+}
+
+func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
+ tmap, ok := mapping.(map[string]interface{})
+ if !ok {
+ if mapping == nil {
+ return nil
+ }
+ return e("type mismatch for %s: expected table but found %T",
+ rv.Type().String(), mapping)
+ }
+
+ for key, datum := range tmap {
+ var f *field
+ fields := cachedTypeFields(rv.Type())
+ for i := range fields {
+ ff := &fields[i]
+ if ff.name == key {
+ f = ff
+ break
+ }
+ if f == nil && strings.EqualFold(ff.name, key) {
+ f = ff
+ }
+ }
+ if f != nil {
+ subv := rv
+ for _, i := range f.index {
+ subv = indirect(subv.Field(i))
+ }
+ if isUnifiable(subv) {
+ md.decoded[md.context.add(key).String()] = true
+ md.context = append(md.context, key)
+ if err := md.unify(datum, subv); err != nil {
+ return err
+ }
+ md.context = md.context[0 : len(md.context)-1]
+ } else if f.name != "" {
+ // Bad user! No soup for you!
+ return e("cannot write unexported field %s.%s",
+ rv.Type().String(), f.name)
+ }
+ }
+ }
+ return nil
+}
+
+func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
+ tmap, ok := mapping.(map[string]interface{})
+ if !ok {
+ if tmap == nil {
+ return nil
+ }
+ return badtype("map", mapping)
+ }
+ if rv.IsNil() {
+ rv.Set(reflect.MakeMap(rv.Type()))
+ }
+ for k, v := range tmap {
+ md.decoded[md.context.add(k).String()] = true
+ md.context = append(md.context, k)
+
+ rvkey := indirect(reflect.New(rv.Type().Key()))
+ rvval := reflect.Indirect(reflect.New(rv.Type().Elem()))
+ if err := md.unify(v, rvval); err != nil {
+ return err
+ }
+ md.context = md.context[0 : len(md.context)-1]
+
+ rvkey.SetString(k)
+ rv.SetMapIndex(rvkey, rvval)
+ }
+ return nil
+}
+
+func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error {
+ datav := reflect.ValueOf(data)
+ if datav.Kind() != reflect.Slice {
+ if !datav.IsValid() {
+ return nil
+ }
+ return badtype("slice", data)
+ }
+ sliceLen := datav.Len()
+ if sliceLen != rv.Len() {
+ return e("expected array length %d; got TOML array of length %d",
+ rv.Len(), sliceLen)
+ }
+ return md.unifySliceArray(datav, rv)
+}
+
+func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error {
+ datav := reflect.ValueOf(data)
+ if datav.Kind() != reflect.Slice {
+ if !datav.IsValid() {
+ return nil
+ }
+ return badtype("slice", data)
+ }
+ n := datav.Len()
+ if rv.IsNil() || rv.Cap() < n {
+ rv.Set(reflect.MakeSlice(rv.Type(), n, n))
+ }
+ rv.SetLen(n)
+ return md.unifySliceArray(datav, rv)
+}
+
+func (md *MetaData) unifySliceArray(data, rv reflect.Value) error {
+ sliceLen := data.Len()
+ for i := 0; i < sliceLen; i++ {
+ v := data.Index(i).Interface()
+ sliceval := indirect(rv.Index(i))
+ if err := md.unify(v, sliceval); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (md *MetaData) unifyDatetime(data interface{}, rv reflect.Value) error {
+ if _, ok := data.(time.Time); ok {
+ rv.Set(reflect.ValueOf(data))
+ return nil
+ }
+ return badtype("time.Time", data)
+}
+
+func (md *MetaData) unifyString(data interface{}, rv reflect.Value) error {
+ if s, ok := data.(string); ok {
+ rv.SetString(s)
+ return nil
+ }
+ return badtype("string", data)
+}
+
+func (md *MetaData) unifyFloat64(data interface{}, rv reflect.Value) error {
+ if num, ok := data.(float64); ok {
+ switch rv.Kind() {
+ case reflect.Float32:
+ fallthrough
+ case reflect.Float64:
+ rv.SetFloat(num)
+ default:
+ panic("bug")
+ }
+ return nil
+ }
+ return badtype("float", data)
+}
+
+func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
+ if num, ok := data.(int64); ok {
+ if rv.Kind() >= reflect.Int && rv.Kind() <= reflect.Int64 {
+ switch rv.Kind() {
+ case reflect.Int, reflect.Int64:
+ // No bounds checking necessary.
+ case reflect.Int8:
+ if num < math.MinInt8 || num > math.MaxInt8 {
+ return e("value %d is out of range for int8", num)
+ }
+ case reflect.Int16:
+ if num < math.MinInt16 || num > math.MaxInt16 {
+ return e("value %d is out of range for int16", num)
+ }
+ case reflect.Int32:
+ if num < math.MinInt32 || num > math.MaxInt32 {
+ return e("value %d is out of range for int32", num)
+ }
+ }
+ rv.SetInt(num)
+ } else if rv.Kind() >= reflect.Uint && rv.Kind() <= reflect.Uint64 {
+ unum := uint64(num)
+ switch rv.Kind() {
+ case reflect.Uint, reflect.Uint64:
+ // No bounds checking necessary.
+ case reflect.Uint8:
+ if num < 0 || unum > math.MaxUint8 {
+ return e("value %d is out of range for uint8", num)
+ }
+ case reflect.Uint16:
+ if num < 0 || unum > math.MaxUint16 {
+ return e("value %d is out of range for uint16", num)
+ }
+ case reflect.Uint32:
+ if num < 0 || unum > math.MaxUint32 {
+ return e("value %d is out of range for uint32", num)
+ }
+ }
+ rv.SetUint(unum)
+ } else {
+ panic("unreachable")
+ }
+ return nil
+ }
+ return badtype("integer", data)
+}
+
+func (md *MetaData) unifyBool(data interface{}, rv reflect.Value) error {
+ if b, ok := data.(bool); ok {
+ rv.SetBool(b)
+ return nil
+ }
+ return badtype("boolean", data)
+}
+
+func (md *MetaData) unifyAnything(data interface{}, rv reflect.Value) error {
+ rv.Set(reflect.ValueOf(data))
+ return nil
+}
+
+func (md *MetaData) unifyText(data interface{}, v TextUnmarshaler) error {
+ var s string
+ switch sdata := data.(type) {
+ case TextMarshaler:
+ text, err := sdata.MarshalText()
+ if err != nil {
+ return err
+ }
+ s = string(text)
+ case fmt.Stringer:
+ s = sdata.String()
+ case string:
+ s = sdata
+ case bool:
+ s = fmt.Sprintf("%v", sdata)
+ case int64:
+ s = fmt.Sprintf("%d", sdata)
+ case float64:
+ s = fmt.Sprintf("%f", sdata)
+ default:
+ return badtype("primitive (string-like)", data)
+ }
+ if err := v.UnmarshalText([]byte(s)); err != nil {
+ return err
+ }
+ return nil
+}
+
+// rvalue returns a reflect.Value of `v`. All pointers are resolved.
+func rvalue(v interface{}) reflect.Value {
+ return indirect(reflect.ValueOf(v))
+}
+
+// indirect returns the value pointed to by a pointer.
+// Pointers are followed until the value is not a pointer.
+// New values are allocated for each nil pointer.
+//
+// An exception to this rule is if the value satisfies an interface of
+// interest to us (like encoding.TextUnmarshaler).
+func indirect(v reflect.Value) reflect.Value {
+ if v.Kind() != reflect.Ptr {
+ if v.CanSet() {
+ pv := v.Addr()
+ if _, ok := pv.Interface().(TextUnmarshaler); ok {
+ return pv
+ }
+ }
+ return v
+ }
+ if v.IsNil() {
+ v.Set(reflect.New(v.Type().Elem()))
+ }
+ return indirect(reflect.Indirect(v))
+}
+
+func isUnifiable(rv reflect.Value) bool {
+ if rv.CanSet() {
+ return true
+ }
+ if _, ok := rv.Interface().(TextUnmarshaler); ok {
+ return true
+ }
+ return false
+}
+
+func badtype(expected string, data interface{}) error {
+ return e("cannot load TOML value of type %T into a Go %s", data, expected)
+}
diff --git a/vendor/github.com/BurntSushi/toml/decode_meta.go b/vendor/github.com/BurntSushi/toml/decode_meta.go
new file mode 100644
index 00000000000..b9914a6798c
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/decode_meta.go
@@ -0,0 +1,121 @@
+package toml
+
+import "strings"
+
+// MetaData allows access to meta information about TOML data that may not
+// be inferrable via reflection. In particular, whether a key has been defined
+// and the TOML type of a key.
+type MetaData struct {
+ mapping map[string]interface{}
+ types map[string]tomlType
+ keys []Key
+ decoded map[string]bool
+ context Key // Used only during decoding.
+}
+
+// IsDefined returns true if the key given exists in the TOML data. The key
+// should be specified hierarchially. e.g.,
+//
+// // access the TOML key 'a.b.c'
+// IsDefined("a", "b", "c")
+//
+// IsDefined will return false if an empty key given. Keys are case sensitive.
+func (md *MetaData) IsDefined(key ...string) bool {
+ if len(key) == 0 {
+ return false
+ }
+
+ var hash map[string]interface{}
+ var ok bool
+ var hashOrVal interface{} = md.mapping
+ for _, k := range key {
+ if hash, ok = hashOrVal.(map[string]interface{}); !ok {
+ return false
+ }
+ if hashOrVal, ok = hash[k]; !ok {
+ return false
+ }
+ }
+ return true
+}
+
+// Type returns a string representation of the type of the key specified.
+//
+// Type will return the empty string if given an empty key or a key that
+// does not exist. Keys are case sensitive.
+func (md *MetaData) Type(key ...string) string {
+ fullkey := strings.Join(key, ".")
+ if typ, ok := md.types[fullkey]; ok {
+ return typ.typeString()
+ }
+ return ""
+}
+
+// Key is the type of any TOML key, including key groups. Use (MetaData).Keys
+// to get values of this type.
+type Key []string
+
+func (k Key) String() string {
+ return strings.Join(k, ".")
+}
+
+func (k Key) maybeQuotedAll() string {
+ var ss []string
+ for i := range k {
+ ss = append(ss, k.maybeQuoted(i))
+ }
+ return strings.Join(ss, ".")
+}
+
+func (k Key) maybeQuoted(i int) string {
+ quote := false
+ for _, c := range k[i] {
+ if !isBareKeyChar(c) {
+ quote = true
+ break
+ }
+ }
+ if quote {
+ return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\""
+ }
+ return k[i]
+}
+
+func (k Key) add(piece string) Key {
+ newKey := make(Key, len(k)+1)
+ copy(newKey, k)
+ newKey[len(k)] = piece
+ return newKey
+}
+
+// Keys returns a slice of every key in the TOML data, including key groups.
+// Each key is itself a slice, where the first element is the top of the
+// hierarchy and the last is the most specific.
+//
+// The list will have the same order as the keys appeared in the TOML data.
+//
+// All keys returned are non-empty.
+func (md *MetaData) Keys() []Key {
+ return md.keys
+}
+
+// Undecoded returns all keys that have not been decoded in the order in which
+// they appear in the original TOML document.
+//
+// This includes keys that haven't been decoded because of a Primitive value.
+// Once the Primitive value is decoded, the keys will be considered decoded.
+//
+// Also note that decoding into an empty interface will result in no decoding,
+// and so no keys will be considered decoded.
+//
+// In this sense, the Undecoded keys correspond to keys in the TOML document
+// that do not have a concrete type in your representation.
+func (md *MetaData) Undecoded() []Key {
+ undecoded := make([]Key, 0, len(md.keys))
+ for _, key := range md.keys {
+ if !md.decoded[key.String()] {
+ undecoded = append(undecoded, key)
+ }
+ }
+ return undecoded
+}
diff --git a/vendor/github.com/BurntSushi/toml/doc.go b/vendor/github.com/BurntSushi/toml/doc.go
new file mode 100644
index 00000000000..b371f396edc
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/doc.go
@@ -0,0 +1,27 @@
+/*
+Package toml provides facilities for decoding and encoding TOML configuration
+files via reflection. There is also support for delaying decoding with
+the Primitive type, and querying the set of keys in a TOML document with the
+MetaData type.
+
+The specification implemented: https://github.com/toml-lang/toml
+
+The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify
+whether a file is a valid TOML document. It can also be used to print the
+type of each key in a TOML document.
+
+Testing
+
+There are two important types of tests used for this package. The first is
+contained inside '*_test.go' files and uses the standard Go unit testing
+framework. These tests are primarily devoted to holistically testing the
+decoder and encoder.
+
+The second type of testing is used to verify the implementation's adherence
+to the TOML specification. These tests have been factored into their own
+project: https://github.com/BurntSushi/toml-test
+
+The reason the tests are in a separate project is so that they can be used by
+any implementation of TOML. Namely, it is language agnostic.
+*/
+package toml
diff --git a/vendor/github.com/BurntSushi/toml/encode.go b/vendor/github.com/BurntSushi/toml/encode.go
new file mode 100644
index 00000000000..d905c21a246
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/encode.go
@@ -0,0 +1,568 @@
+package toml
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "io"
+ "reflect"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type tomlEncodeError struct{ error }
+
+var (
+ errArrayMixedElementTypes = errors.New(
+ "toml: cannot encode array with mixed element types")
+ errArrayNilElement = errors.New(
+ "toml: cannot encode array with nil element")
+ errNonString = errors.New(
+ "toml: cannot encode a map with non-string key type")
+ errAnonNonStruct = errors.New(
+ "toml: cannot encode an anonymous field that is not a struct")
+ errArrayNoTable = errors.New(
+ "toml: TOML array element cannot contain a table")
+ errNoKey = errors.New(
+ "toml: top-level values must be Go maps or structs")
+ errAnything = errors.New("") // used in testing
+)
+
+var quotedReplacer = strings.NewReplacer(
+ "\t", "\\t",
+ "\n", "\\n",
+ "\r", "\\r",
+ "\"", "\\\"",
+ "\\", "\\\\",
+)
+
+// Encoder controls the encoding of Go values to a TOML document to some
+// io.Writer.
+//
+// The indentation level can be controlled with the Indent field.
+type Encoder struct {
+ // A single indentation level. By default it is two spaces.
+ Indent string
+
+ // hasWritten is whether we have written any output to w yet.
+ hasWritten bool
+ w *bufio.Writer
+}
+
+// NewEncoder returns a TOML encoder that encodes Go values to the io.Writer
+// given. By default, a single indentation level is 2 spaces.
+func NewEncoder(w io.Writer) *Encoder {
+ return &Encoder{
+ w: bufio.NewWriter(w),
+ Indent: " ",
+ }
+}
+
+// Encode writes a TOML representation of the Go value to the underlying
+// io.Writer. If the value given cannot be encoded to a valid TOML document,
+// then an error is returned.
+//
+// The mapping between Go values and TOML values should be precisely the same
+// as for the Decode* functions. Similarly, the TextMarshaler interface is
+// supported by encoding the resulting bytes as strings. (If you want to write
+// arbitrary binary data then you will need to use something like base64 since
+// TOML does not have any binary types.)
+//
+// When encoding TOML hashes (i.e., Go maps or structs), keys without any
+// sub-hashes are encoded first.
+//
+// If a Go map is encoded, then its keys are sorted alphabetically for
+// deterministic output. More control over this behavior may be provided if
+// there is demand for it.
+//
+// Encoding Go values without a corresponding TOML representation---like map
+// types with non-string keys---will cause an error to be returned. Similarly
+// for mixed arrays/slices, arrays/slices with nil elements, embedded
+// non-struct types and nested slices containing maps or structs.
+// (e.g., [][]map[string]string is not allowed but []map[string]string is OK
+// and so is []map[string][]string.)
+func (enc *Encoder) Encode(v interface{}) error {
+ rv := eindirect(reflect.ValueOf(v))
+ if err := enc.safeEncode(Key([]string{}), rv); err != nil {
+ return err
+ }
+ return enc.w.Flush()
+}
+
+func (enc *Encoder) safeEncode(key Key, rv reflect.Value) (err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ if terr, ok := r.(tomlEncodeError); ok {
+ err = terr.error
+ return
+ }
+ panic(r)
+ }
+ }()
+ enc.encode(key, rv)
+ return nil
+}
+
+func (enc *Encoder) encode(key Key, rv reflect.Value) {
+ // Special case. Time needs to be in ISO8601 format.
+ // Special case. If we can marshal the type to text, then we used that.
+ // Basically, this prevents the encoder for handling these types as
+ // generic structs (or whatever the underlying type of a TextMarshaler is).
+ switch rv.Interface().(type) {
+ case time.Time, TextMarshaler:
+ enc.keyEqElement(key, rv)
+ return
+ }
+
+ k := rv.Kind()
+ switch k {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
+ reflect.Int64,
+ reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
+ reflect.Uint64,
+ reflect.Float32, reflect.Float64, reflect.String, reflect.Bool:
+ enc.keyEqElement(key, rv)
+ case reflect.Array, reflect.Slice:
+ if typeEqual(tomlArrayHash, tomlTypeOfGo(rv)) {
+ enc.eArrayOfTables(key, rv)
+ } else {
+ enc.keyEqElement(key, rv)
+ }
+ case reflect.Interface:
+ if rv.IsNil() {
+ return
+ }
+ enc.encode(key, rv.Elem())
+ case reflect.Map:
+ if rv.IsNil() {
+ return
+ }
+ enc.eTable(key, rv)
+ case reflect.Ptr:
+ if rv.IsNil() {
+ return
+ }
+ enc.encode(key, rv.Elem())
+ case reflect.Struct:
+ enc.eTable(key, rv)
+ default:
+ panic(e("unsupported type for key '%s': %s", key, k))
+ }
+}
+
+// eElement encodes any value that can be an array element (primitives and
+// arrays).
+func (enc *Encoder) eElement(rv reflect.Value) {
+ switch v := rv.Interface().(type) {
+ case time.Time:
+ // Special case time.Time as a primitive. Has to come before
+ // TextMarshaler below because time.Time implements
+ // encoding.TextMarshaler, but we need to always use UTC.
+ enc.wf(v.UTC().Format("2006-01-02T15:04:05Z"))
+ return
+ case TextMarshaler:
+ // Special case. Use text marshaler if it's available for this value.
+ if s, err := v.MarshalText(); err != nil {
+ encPanic(err)
+ } else {
+ enc.writeQuoted(string(s))
+ }
+ return
+ }
+ switch rv.Kind() {
+ case reflect.Bool:
+ enc.wf(strconv.FormatBool(rv.Bool()))
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
+ reflect.Int64:
+ enc.wf(strconv.FormatInt(rv.Int(), 10))
+ case reflect.Uint, reflect.Uint8, reflect.Uint16,
+ reflect.Uint32, reflect.Uint64:
+ enc.wf(strconv.FormatUint(rv.Uint(), 10))
+ case reflect.Float32:
+ enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 32)))
+ case reflect.Float64:
+ enc.wf(floatAddDecimal(strconv.FormatFloat(rv.Float(), 'f', -1, 64)))
+ case reflect.Array, reflect.Slice:
+ enc.eArrayOrSliceElement(rv)
+ case reflect.Interface:
+ enc.eElement(rv.Elem())
+ case reflect.String:
+ enc.writeQuoted(rv.String())
+ default:
+ panic(e("unexpected primitive type: %s", rv.Kind()))
+ }
+}
+
+// By the TOML spec, all floats must have a decimal with at least one
+// number on either side.
+func floatAddDecimal(fstr string) string {
+ if !strings.Contains(fstr, ".") {
+ return fstr + ".0"
+ }
+ return fstr
+}
+
+func (enc *Encoder) writeQuoted(s string) {
+ enc.wf("\"%s\"", quotedReplacer.Replace(s))
+}
+
+func (enc *Encoder) eArrayOrSliceElement(rv reflect.Value) {
+ length := rv.Len()
+ enc.wf("[")
+ for i := 0; i < length; i++ {
+ elem := rv.Index(i)
+ enc.eElement(elem)
+ if i != length-1 {
+ enc.wf(", ")
+ }
+ }
+ enc.wf("]")
+}
+
+func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) {
+ if len(key) == 0 {
+ encPanic(errNoKey)
+ }
+ for i := 0; i < rv.Len(); i++ {
+ trv := rv.Index(i)
+ if isNil(trv) {
+ continue
+ }
+ panicIfInvalidKey(key)
+ enc.newline()
+ enc.wf("%s[[%s]]", enc.indentStr(key), key.maybeQuotedAll())
+ enc.newline()
+ enc.eMapOrStruct(key, trv)
+ }
+}
+
+func (enc *Encoder) eTable(key Key, rv reflect.Value) {
+ panicIfInvalidKey(key)
+ if len(key) == 1 {
+ // Output an extra newline between top-level tables.
+ // (The newline isn't written if nothing else has been written though.)
+ enc.newline()
+ }
+ if len(key) > 0 {
+ enc.wf("%s[%s]", enc.indentStr(key), key.maybeQuotedAll())
+ enc.newline()
+ }
+ enc.eMapOrStruct(key, rv)
+}
+
+func (enc *Encoder) eMapOrStruct(key Key, rv reflect.Value) {
+ switch rv := eindirect(rv); rv.Kind() {
+ case reflect.Map:
+ enc.eMap(key, rv)
+ case reflect.Struct:
+ enc.eStruct(key, rv)
+ default:
+ panic("eTable: unhandled reflect.Value Kind: " + rv.Kind().String())
+ }
+}
+
+func (enc *Encoder) eMap(key Key, rv reflect.Value) {
+ rt := rv.Type()
+ if rt.Key().Kind() != reflect.String {
+ encPanic(errNonString)
+ }
+
+ // Sort keys so that we have deterministic output. And write keys directly
+ // underneath this key first, before writing sub-structs or sub-maps.
+ var mapKeysDirect, mapKeysSub []string
+ for _, mapKey := range rv.MapKeys() {
+ k := mapKey.String()
+ if typeIsHash(tomlTypeOfGo(rv.MapIndex(mapKey))) {
+ mapKeysSub = append(mapKeysSub, k)
+ } else {
+ mapKeysDirect = append(mapKeysDirect, k)
+ }
+ }
+
+ var writeMapKeys = func(mapKeys []string) {
+ sort.Strings(mapKeys)
+ for _, mapKey := range mapKeys {
+ mrv := rv.MapIndex(reflect.ValueOf(mapKey))
+ if isNil(mrv) {
+ // Don't write anything for nil fields.
+ continue
+ }
+ enc.encode(key.add(mapKey), mrv)
+ }
+ }
+ writeMapKeys(mapKeysDirect)
+ writeMapKeys(mapKeysSub)
+}
+
+func (enc *Encoder) eStruct(key Key, rv reflect.Value) {
+ // Write keys for fields directly under this key first, because if we write
+ // a field that creates a new table, then all keys under it will be in that
+ // table (not the one we're writing here).
+ rt := rv.Type()
+ var fieldsDirect, fieldsSub [][]int
+ var addFields func(rt reflect.Type, rv reflect.Value, start []int)
+ addFields = func(rt reflect.Type, rv reflect.Value, start []int) {
+ for i := 0; i < rt.NumField(); i++ {
+ f := rt.Field(i)
+ // skip unexported fields
+ if f.PkgPath != "" && !f.Anonymous {
+ continue
+ }
+ frv := rv.Field(i)
+ if f.Anonymous {
+ t := f.Type
+ switch t.Kind() {
+ case reflect.Struct:
+ // Treat anonymous struct fields with
+ // tag names as though they are not
+ // anonymous, like encoding/json does.
+ if getOptions(f.Tag).name == "" {
+ addFields(t, frv, f.Index)
+ continue
+ }
+ case reflect.Ptr:
+ if t.Elem().Kind() == reflect.Struct &&
+ getOptions(f.Tag).name == "" {
+ if !frv.IsNil() {
+ addFields(t.Elem(), frv.Elem(), f.Index)
+ }
+ continue
+ }
+ // Fall through to the normal field encoding logic below
+ // for non-struct anonymous fields.
+ }
+ }
+
+ if typeIsHash(tomlTypeOfGo(frv)) {
+ fieldsSub = append(fieldsSub, append(start, f.Index...))
+ } else {
+ fieldsDirect = append(fieldsDirect, append(start, f.Index...))
+ }
+ }
+ }
+ addFields(rt, rv, nil)
+
+ var writeFields = func(fields [][]int) {
+ for _, fieldIndex := range fields {
+ sft := rt.FieldByIndex(fieldIndex)
+ sf := rv.FieldByIndex(fieldIndex)
+ if isNil(sf) {
+ // Don't write anything for nil fields.
+ continue
+ }
+
+ opts := getOptions(sft.Tag)
+ if opts.skip {
+ continue
+ }
+ keyName := sft.Name
+ if opts.name != "" {
+ keyName = opts.name
+ }
+ if opts.omitempty && isEmpty(sf) {
+ continue
+ }
+ if opts.omitzero && isZero(sf) {
+ continue
+ }
+
+ enc.encode(key.add(keyName), sf)
+ }
+ }
+ writeFields(fieldsDirect)
+ writeFields(fieldsSub)
+}
+
+// tomlTypeName returns the TOML type name of the Go value's type. It is
+// used to determine whether the types of array elements are mixed (which is
+// forbidden). If the Go value is nil, then it is illegal for it to be an array
+// element, and valueIsNil is returned as true.
+
+// Returns the TOML type of a Go value. The type may be `nil`, which means
+// no concrete TOML type could be found.
+func tomlTypeOfGo(rv reflect.Value) tomlType {
+ if isNil(rv) || !rv.IsValid() {
+ return nil
+ }
+ switch rv.Kind() {
+ case reflect.Bool:
+ return tomlBool
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32,
+ reflect.Int64,
+ reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32,
+ reflect.Uint64:
+ return tomlInteger
+ case reflect.Float32, reflect.Float64:
+ return tomlFloat
+ case reflect.Array, reflect.Slice:
+ if typeEqual(tomlHash, tomlArrayType(rv)) {
+ return tomlArrayHash
+ }
+ return tomlArray
+ case reflect.Ptr, reflect.Interface:
+ return tomlTypeOfGo(rv.Elem())
+ case reflect.String:
+ return tomlString
+ case reflect.Map:
+ return tomlHash
+ case reflect.Struct:
+ switch rv.Interface().(type) {
+ case time.Time:
+ return tomlDatetime
+ case TextMarshaler:
+ return tomlString
+ default:
+ return tomlHash
+ }
+ default:
+ panic("unexpected reflect.Kind: " + rv.Kind().String())
+ }
+}
+
+// tomlArrayType returns the element type of a TOML array. The type returned
+// may be nil if it cannot be determined (e.g., a nil slice or a zero length
+// slize). This function may also panic if it finds a type that cannot be
+// expressed in TOML (such as nil elements, heterogeneous arrays or directly
+// nested arrays of tables).
+func tomlArrayType(rv reflect.Value) tomlType {
+ if isNil(rv) || !rv.IsValid() || rv.Len() == 0 {
+ return nil
+ }
+ firstType := tomlTypeOfGo(rv.Index(0))
+ if firstType == nil {
+ encPanic(errArrayNilElement)
+ }
+
+ rvlen := rv.Len()
+ for i := 1; i < rvlen; i++ {
+ elem := rv.Index(i)
+ switch elemType := tomlTypeOfGo(elem); {
+ case elemType == nil:
+ encPanic(errArrayNilElement)
+ case !typeEqual(firstType, elemType):
+ encPanic(errArrayMixedElementTypes)
+ }
+ }
+ // If we have a nested array, then we must make sure that the nested
+ // array contains ONLY primitives.
+ // This checks arbitrarily nested arrays.
+ if typeEqual(firstType, tomlArray) || typeEqual(firstType, tomlArrayHash) {
+ nest := tomlArrayType(eindirect(rv.Index(0)))
+ if typeEqual(nest, tomlHash) || typeEqual(nest, tomlArrayHash) {
+ encPanic(errArrayNoTable)
+ }
+ }
+ return firstType
+}
+
+type tagOptions struct {
+ skip bool // "-"
+ name string
+ omitempty bool
+ omitzero bool
+}
+
+func getOptions(tag reflect.StructTag) tagOptions {
+ t := tag.Get("toml")
+ if t == "-" {
+ return tagOptions{skip: true}
+ }
+ var opts tagOptions
+ parts := strings.Split(t, ",")
+ opts.name = parts[0]
+ for _, s := range parts[1:] {
+ switch s {
+ case "omitempty":
+ opts.omitempty = true
+ case "omitzero":
+ opts.omitzero = true
+ }
+ }
+ return opts
+}
+
+func isZero(rv reflect.Value) bool {
+ switch rv.Kind() {
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return rv.Int() == 0
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return rv.Uint() == 0
+ case reflect.Float32, reflect.Float64:
+ return rv.Float() == 0.0
+ }
+ return false
+}
+
+func isEmpty(rv reflect.Value) bool {
+ switch rv.Kind() {
+ case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
+ return rv.Len() == 0
+ case reflect.Bool:
+ return !rv.Bool()
+ }
+ return false
+}
+
+func (enc *Encoder) newline() {
+ if enc.hasWritten {
+ enc.wf("\n")
+ }
+}
+
+func (enc *Encoder) keyEqElement(key Key, val reflect.Value) {
+ if len(key) == 0 {
+ encPanic(errNoKey)
+ }
+ panicIfInvalidKey(key)
+ enc.wf("%s%s = ", enc.indentStr(key), key.maybeQuoted(len(key)-1))
+ enc.eElement(val)
+ enc.newline()
+}
+
+func (enc *Encoder) wf(format string, v ...interface{}) {
+ if _, err := fmt.Fprintf(enc.w, format, v...); err != nil {
+ encPanic(err)
+ }
+ enc.hasWritten = true
+}
+
+func (enc *Encoder) indentStr(key Key) string {
+ return strings.Repeat(enc.Indent, len(key)-1)
+}
+
+func encPanic(err error) {
+ panic(tomlEncodeError{err})
+}
+
+func eindirect(v reflect.Value) reflect.Value {
+ switch v.Kind() {
+ case reflect.Ptr, reflect.Interface:
+ return eindirect(v.Elem())
+ default:
+ return v
+ }
+}
+
+func isNil(rv reflect.Value) bool {
+ switch rv.Kind() {
+ case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
+ return rv.IsNil()
+ default:
+ return false
+ }
+}
+
+func panicIfInvalidKey(key Key) {
+ for _, k := range key {
+ if len(k) == 0 {
+ encPanic(e("Key '%s' is not a valid table name. Key names "+
+ "cannot be empty.", key.maybeQuotedAll()))
+ }
+ }
+}
+
+func isValidKeyName(s string) bool {
+ return len(s) != 0
+}
diff --git a/vendor/github.com/BurntSushi/toml/encoding_types.go b/vendor/github.com/BurntSushi/toml/encoding_types.go
new file mode 100644
index 00000000000..d36e1dd6002
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/encoding_types.go
@@ -0,0 +1,19 @@
+// +build go1.2
+
+package toml
+
+// In order to support Go 1.1, we define our own TextMarshaler and
+// TextUnmarshaler types. For Go 1.2+, we just alias them with the
+// standard library interfaces.
+
+import (
+ "encoding"
+)
+
+// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here
+// so that Go 1.1 can be supported.
+type TextMarshaler encoding.TextMarshaler
+
+// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined
+// here so that Go 1.1 can be supported.
+type TextUnmarshaler encoding.TextUnmarshaler
diff --git a/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go
new file mode 100644
index 00000000000..e8d503d0469
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/encoding_types_1.1.go
@@ -0,0 +1,18 @@
+// +build !go1.2
+
+package toml
+
+// These interfaces were introduced in Go 1.2, so we add them manually when
+// compiling for Go 1.1.
+
+// TextMarshaler is a synonym for encoding.TextMarshaler. It is defined here
+// so that Go 1.1 can be supported.
+type TextMarshaler interface {
+ MarshalText() (text []byte, err error)
+}
+
+// TextUnmarshaler is a synonym for encoding.TextUnmarshaler. It is defined
+// here so that Go 1.1 can be supported.
+type TextUnmarshaler interface {
+ UnmarshalText(text []byte) error
+}
diff --git a/vendor/github.com/BurntSushi/toml/lex.go b/vendor/github.com/BurntSushi/toml/lex.go
new file mode 100644
index 00000000000..e0a742a8870
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/lex.go
@@ -0,0 +1,953 @@
+package toml
+
+import (
+ "fmt"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+)
+
+type itemType int
+
+const (
+ itemError itemType = iota
+ itemNIL // used in the parser to indicate no type
+ itemEOF
+ itemText
+ itemString
+ itemRawString
+ itemMultilineString
+ itemRawMultilineString
+ itemBool
+ itemInteger
+ itemFloat
+ itemDatetime
+ itemArray // the start of an array
+ itemArrayEnd
+ itemTableStart
+ itemTableEnd
+ itemArrayTableStart
+ itemArrayTableEnd
+ itemKeyStart
+ itemCommentStart
+ itemInlineTableStart
+ itemInlineTableEnd
+)
+
+const (
+ eof = 0
+ comma = ','
+ tableStart = '['
+ tableEnd = ']'
+ arrayTableStart = '['
+ arrayTableEnd = ']'
+ tableSep = '.'
+ keySep = '='
+ arrayStart = '['
+ arrayEnd = ']'
+ commentStart = '#'
+ stringStart = '"'
+ stringEnd = '"'
+ rawStringStart = '\''
+ rawStringEnd = '\''
+ inlineTableStart = '{'
+ inlineTableEnd = '}'
+)
+
+type stateFn func(lx *lexer) stateFn
+
+type lexer struct {
+ input string
+ start int
+ pos int
+ line int
+ state stateFn
+ items chan item
+
+ // Allow for backing up up to three runes.
+ // This is necessary because TOML contains 3-rune tokens (""" and ''').
+ prevWidths [3]int
+ nprev int // how many of prevWidths are in use
+ // If we emit an eof, we can still back up, but it is not OK to call
+ // next again.
+ atEOF bool
+
+ // A stack of state functions used to maintain context.
+ // The idea is to reuse parts of the state machine in various places.
+ // For example, values can appear at the top level or within arbitrarily
+ // nested arrays. The last state on the stack is used after a value has
+ // been lexed. Similarly for comments.
+ stack []stateFn
+}
+
+type item struct {
+ typ itemType
+ val string
+ line int
+}
+
+func (lx *lexer) nextItem() item {
+ for {
+ select {
+ case item := <-lx.items:
+ return item
+ default:
+ lx.state = lx.state(lx)
+ }
+ }
+}
+
+func lex(input string) *lexer {
+ lx := &lexer{
+ input: input,
+ state: lexTop,
+ line: 1,
+ items: make(chan item, 10),
+ stack: make([]stateFn, 0, 10),
+ }
+ return lx
+}
+
+func (lx *lexer) push(state stateFn) {
+ lx.stack = append(lx.stack, state)
+}
+
+func (lx *lexer) pop() stateFn {
+ if len(lx.stack) == 0 {
+ return lx.errorf("BUG in lexer: no states to pop")
+ }
+ last := lx.stack[len(lx.stack)-1]
+ lx.stack = lx.stack[0 : len(lx.stack)-1]
+ return last
+}
+
+func (lx *lexer) current() string {
+ return lx.input[lx.start:lx.pos]
+}
+
+func (lx *lexer) emit(typ itemType) {
+ lx.items <- item{typ, lx.current(), lx.line}
+ lx.start = lx.pos
+}
+
+func (lx *lexer) emitTrim(typ itemType) {
+ lx.items <- item{typ, strings.TrimSpace(lx.current()), lx.line}
+ lx.start = lx.pos
+}
+
+func (lx *lexer) next() (r rune) {
+ if lx.atEOF {
+ panic("next called after EOF")
+ }
+ if lx.pos >= len(lx.input) {
+ lx.atEOF = true
+ return eof
+ }
+
+ if lx.input[lx.pos] == '\n' {
+ lx.line++
+ }
+ lx.prevWidths[2] = lx.prevWidths[1]
+ lx.prevWidths[1] = lx.prevWidths[0]
+ if lx.nprev < 3 {
+ lx.nprev++
+ }
+ r, w := utf8.DecodeRuneInString(lx.input[lx.pos:])
+ lx.prevWidths[0] = w
+ lx.pos += w
+ return r
+}
+
+// ignore skips over the pending input before this point.
+func (lx *lexer) ignore() {
+ lx.start = lx.pos
+}
+
+// backup steps back one rune. Can be called only twice between calls to next.
+func (lx *lexer) backup() {
+ if lx.atEOF {
+ lx.atEOF = false
+ return
+ }
+ if lx.nprev < 1 {
+ panic("backed up too far")
+ }
+ w := lx.prevWidths[0]
+ lx.prevWidths[0] = lx.prevWidths[1]
+ lx.prevWidths[1] = lx.prevWidths[2]
+ lx.nprev--
+ lx.pos -= w
+ if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' {
+ lx.line--
+ }
+}
+
+// accept consumes the next rune if it's equal to `valid`.
+func (lx *lexer) accept(valid rune) bool {
+ if lx.next() == valid {
+ return true
+ }
+ lx.backup()
+ return false
+}
+
+// peek returns but does not consume the next rune in the input.
+func (lx *lexer) peek() rune {
+ r := lx.next()
+ lx.backup()
+ return r
+}
+
+// skip ignores all input that matches the given predicate.
+func (lx *lexer) skip(pred func(rune) bool) {
+ for {
+ r := lx.next()
+ if pred(r) {
+ continue
+ }
+ lx.backup()
+ lx.ignore()
+ return
+ }
+}
+
+// errorf stops all lexing by emitting an error and returning `nil`.
+// Note that any value that is a character is escaped if it's a special
+// character (newlines, tabs, etc.).
+func (lx *lexer) errorf(format string, values ...interface{}) stateFn {
+ lx.items <- item{
+ itemError,
+ fmt.Sprintf(format, values...),
+ lx.line,
+ }
+ return nil
+}
+
+// lexTop consumes elements at the top level of TOML data.
+func lexTop(lx *lexer) stateFn {
+ r := lx.next()
+ if isWhitespace(r) || isNL(r) {
+ return lexSkip(lx, lexTop)
+ }
+ switch r {
+ case commentStart:
+ lx.push(lexTop)
+ return lexCommentStart
+ case tableStart:
+ return lexTableStart
+ case eof:
+ if lx.pos > lx.start {
+ return lx.errorf("unexpected EOF")
+ }
+ lx.emit(itemEOF)
+ return nil
+ }
+
+ // At this point, the only valid item can be a key, so we back up
+ // and let the key lexer do the rest.
+ lx.backup()
+ lx.push(lexTopEnd)
+ return lexKeyStart
+}
+
+// lexTopEnd is entered whenever a top-level item has been consumed. (A value
+// or a table.) It must see only whitespace, and will turn back to lexTop
+// upon a newline. If it sees EOF, it will quit the lexer successfully.
+func lexTopEnd(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case r == commentStart:
+ // a comment will read to a newline for us.
+ lx.push(lexTop)
+ return lexCommentStart
+ case isWhitespace(r):
+ return lexTopEnd
+ case isNL(r):
+ lx.ignore()
+ return lexTop
+ case r == eof:
+ lx.emit(itemEOF)
+ return nil
+ }
+ return lx.errorf("expected a top-level item to end with a newline, "+
+ "comment, or EOF, but got %q instead", r)
+}
+
+// lexTable lexes the beginning of a table. Namely, it makes sure that
+// it starts with a character other than '.' and ']'.
+// It assumes that '[' has already been consumed.
+// It also handles the case that this is an item in an array of tables.
+// e.g., '[[name]]'.
+func lexTableStart(lx *lexer) stateFn {
+ if lx.peek() == arrayTableStart {
+ lx.next()
+ lx.emit(itemArrayTableStart)
+ lx.push(lexArrayTableEnd)
+ } else {
+ lx.emit(itemTableStart)
+ lx.push(lexTableEnd)
+ }
+ return lexTableNameStart
+}
+
+func lexTableEnd(lx *lexer) stateFn {
+ lx.emit(itemTableEnd)
+ return lexTopEnd
+}
+
+func lexArrayTableEnd(lx *lexer) stateFn {
+ if r := lx.next(); r != arrayTableEnd {
+ return lx.errorf("expected end of table array name delimiter %q, "+
+ "but got %q instead", arrayTableEnd, r)
+ }
+ lx.emit(itemArrayTableEnd)
+ return lexTopEnd
+}
+
+func lexTableNameStart(lx *lexer) stateFn {
+ lx.skip(isWhitespace)
+ switch r := lx.peek(); {
+ case r == tableEnd || r == eof:
+ return lx.errorf("unexpected end of table name " +
+ "(table names cannot be empty)")
+ case r == tableSep:
+ return lx.errorf("unexpected table separator " +
+ "(table names cannot be empty)")
+ case r == stringStart || r == rawStringStart:
+ lx.ignore()
+ lx.push(lexTableNameEnd)
+ return lexValue // reuse string lexing
+ default:
+ return lexBareTableName
+ }
+}
+
+// lexBareTableName lexes the name of a table. It assumes that at least one
+// valid character for the table has already been read.
+func lexBareTableName(lx *lexer) stateFn {
+ r := lx.next()
+ if isBareKeyChar(r) {
+ return lexBareTableName
+ }
+ lx.backup()
+ lx.emit(itemText)
+ return lexTableNameEnd
+}
+
+// lexTableNameEnd reads the end of a piece of a table name, optionally
+// consuming whitespace.
+func lexTableNameEnd(lx *lexer) stateFn {
+ lx.skip(isWhitespace)
+ switch r := lx.next(); {
+ case isWhitespace(r):
+ return lexTableNameEnd
+ case r == tableSep:
+ lx.ignore()
+ return lexTableNameStart
+ case r == tableEnd:
+ return lx.pop()
+ default:
+ return lx.errorf("expected '.' or ']' to end table name, "+
+ "but got %q instead", r)
+ }
+}
+
+// lexKeyStart consumes a key name up until the first non-whitespace character.
+// lexKeyStart will ignore whitespace.
+func lexKeyStart(lx *lexer) stateFn {
+ r := lx.peek()
+ switch {
+ case r == keySep:
+ return lx.errorf("unexpected key separator %q", keySep)
+ case isWhitespace(r) || isNL(r):
+ lx.next()
+ return lexSkip(lx, lexKeyStart)
+ case r == stringStart || r == rawStringStart:
+ lx.ignore()
+ lx.emit(itemKeyStart)
+ lx.push(lexKeyEnd)
+ return lexValue // reuse string lexing
+ default:
+ lx.ignore()
+ lx.emit(itemKeyStart)
+ return lexBareKey
+ }
+}
+
+// lexBareKey consumes the text of a bare key. Assumes that the first character
+// (which is not whitespace) has not yet been consumed.
+func lexBareKey(lx *lexer) stateFn {
+ switch r := lx.next(); {
+ case isBareKeyChar(r):
+ return lexBareKey
+ case isWhitespace(r):
+ lx.backup()
+ lx.emit(itemText)
+ return lexKeyEnd
+ case r == keySep:
+ lx.backup()
+ lx.emit(itemText)
+ return lexKeyEnd
+ default:
+ return lx.errorf("bare keys cannot contain %q", r)
+ }
+}
+
+// lexKeyEnd consumes the end of a key and trims whitespace (up to the key
+// separator).
+func lexKeyEnd(lx *lexer) stateFn {
+ switch r := lx.next(); {
+ case r == keySep:
+ return lexSkip(lx, lexValue)
+ case isWhitespace(r):
+ return lexSkip(lx, lexKeyEnd)
+ default:
+ return lx.errorf("expected key separator %q, but got %q instead",
+ keySep, r)
+ }
+}
+
+// lexValue starts the consumption of a value anywhere a value is expected.
+// lexValue will ignore whitespace.
+// After a value is lexed, the last state on the next is popped and returned.
+func lexValue(lx *lexer) stateFn {
+ // We allow whitespace to precede a value, but NOT newlines.
+ // In array syntax, the array states are responsible for ignoring newlines.
+ r := lx.next()
+ switch {
+ case isWhitespace(r):
+ return lexSkip(lx, lexValue)
+ case isDigit(r):
+ lx.backup() // avoid an extra state and use the same as above
+ return lexNumberOrDateStart
+ }
+ switch r {
+ case arrayStart:
+ lx.ignore()
+ lx.emit(itemArray)
+ return lexArrayValue
+ case inlineTableStart:
+ lx.ignore()
+ lx.emit(itemInlineTableStart)
+ return lexInlineTableValue
+ case stringStart:
+ if lx.accept(stringStart) {
+ if lx.accept(stringStart) {
+ lx.ignore() // Ignore """
+ return lexMultilineString
+ }
+ lx.backup()
+ }
+ lx.ignore() // ignore the '"'
+ return lexString
+ case rawStringStart:
+ if lx.accept(rawStringStart) {
+ if lx.accept(rawStringStart) {
+ lx.ignore() // Ignore """
+ return lexMultilineRawString
+ }
+ lx.backup()
+ }
+ lx.ignore() // ignore the "'"
+ return lexRawString
+ case '+', '-':
+ return lexNumberStart
+ case '.': // special error case, be kind to users
+ return lx.errorf("floats must start with a digit, not '.'")
+ }
+ if unicode.IsLetter(r) {
+ // Be permissive here; lexBool will give a nice error if the
+ // user wrote something like
+ // x = foo
+ // (i.e. not 'true' or 'false' but is something else word-like.)
+ lx.backup()
+ return lexBool
+ }
+ return lx.errorf("expected value but found %q instead", r)
+}
+
+// lexArrayValue consumes one value in an array. It assumes that '[' or ','
+// have already been consumed. All whitespace and newlines are ignored.
+func lexArrayValue(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case isWhitespace(r) || isNL(r):
+ return lexSkip(lx, lexArrayValue)
+ case r == commentStart:
+ lx.push(lexArrayValue)
+ return lexCommentStart
+ case r == comma:
+ return lx.errorf("unexpected comma")
+ case r == arrayEnd:
+ // NOTE(caleb): The spec isn't clear about whether you can have
+ // a trailing comma or not, so we'll allow it.
+ return lexArrayEnd
+ }
+
+ lx.backup()
+ lx.push(lexArrayValueEnd)
+ return lexValue
+}
+
+// lexArrayValueEnd consumes everything between the end of an array value and
+// the next value (or the end of the array): it ignores whitespace and newlines
+// and expects either a ',' or a ']'.
+func lexArrayValueEnd(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case isWhitespace(r) || isNL(r):
+ return lexSkip(lx, lexArrayValueEnd)
+ case r == commentStart:
+ lx.push(lexArrayValueEnd)
+ return lexCommentStart
+ case r == comma:
+ lx.ignore()
+ return lexArrayValue // move on to the next value
+ case r == arrayEnd:
+ return lexArrayEnd
+ }
+ return lx.errorf(
+ "expected a comma or array terminator %q, but got %q instead",
+ arrayEnd, r,
+ )
+}
+
+// lexArrayEnd finishes the lexing of an array.
+// It assumes that a ']' has just been consumed.
+func lexArrayEnd(lx *lexer) stateFn {
+ lx.ignore()
+ lx.emit(itemArrayEnd)
+ return lx.pop()
+}
+
+// lexInlineTableValue consumes one key/value pair in an inline table.
+// It assumes that '{' or ',' have already been consumed. Whitespace is ignored.
+func lexInlineTableValue(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case isWhitespace(r):
+ return lexSkip(lx, lexInlineTableValue)
+ case isNL(r):
+ return lx.errorf("newlines not allowed within inline tables")
+ case r == commentStart:
+ lx.push(lexInlineTableValue)
+ return lexCommentStart
+ case r == comma:
+ return lx.errorf("unexpected comma")
+ case r == inlineTableEnd:
+ return lexInlineTableEnd
+ }
+ lx.backup()
+ lx.push(lexInlineTableValueEnd)
+ return lexKeyStart
+}
+
+// lexInlineTableValueEnd consumes everything between the end of an inline table
+// key/value pair and the next pair (or the end of the table):
+// it ignores whitespace and expects either a ',' or a '}'.
+func lexInlineTableValueEnd(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case isWhitespace(r):
+ return lexSkip(lx, lexInlineTableValueEnd)
+ case isNL(r):
+ return lx.errorf("newlines not allowed within inline tables")
+ case r == commentStart:
+ lx.push(lexInlineTableValueEnd)
+ return lexCommentStart
+ case r == comma:
+ lx.ignore()
+ return lexInlineTableValue
+ case r == inlineTableEnd:
+ return lexInlineTableEnd
+ }
+ return lx.errorf("expected a comma or an inline table terminator %q, "+
+ "but got %q instead", inlineTableEnd, r)
+}
+
+// lexInlineTableEnd finishes the lexing of an inline table.
+// It assumes that a '}' has just been consumed.
+func lexInlineTableEnd(lx *lexer) stateFn {
+ lx.ignore()
+ lx.emit(itemInlineTableEnd)
+ return lx.pop()
+}
+
+// lexString consumes the inner contents of a string. It assumes that the
+// beginning '"' has already been consumed and ignored.
+func lexString(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case r == eof:
+ return lx.errorf("unexpected EOF")
+ case isNL(r):
+ return lx.errorf("strings cannot contain newlines")
+ case r == '\\':
+ lx.push(lexString)
+ return lexStringEscape
+ case r == stringEnd:
+ lx.backup()
+ lx.emit(itemString)
+ lx.next()
+ lx.ignore()
+ return lx.pop()
+ }
+ return lexString
+}
+
+// lexMultilineString consumes the inner contents of a string. It assumes that
+// the beginning '"""' has already been consumed and ignored.
+func lexMultilineString(lx *lexer) stateFn {
+ switch lx.next() {
+ case eof:
+ return lx.errorf("unexpected EOF")
+ case '\\':
+ return lexMultilineStringEscape
+ case stringEnd:
+ if lx.accept(stringEnd) {
+ if lx.accept(stringEnd) {
+ lx.backup()
+ lx.backup()
+ lx.backup()
+ lx.emit(itemMultilineString)
+ lx.next()
+ lx.next()
+ lx.next()
+ lx.ignore()
+ return lx.pop()
+ }
+ lx.backup()
+ }
+ }
+ return lexMultilineString
+}
+
+// lexRawString consumes a raw string. Nothing can be escaped in such a string.
+// It assumes that the beginning "'" has already been consumed and ignored.
+func lexRawString(lx *lexer) stateFn {
+ r := lx.next()
+ switch {
+ case r == eof:
+ return lx.errorf("unexpected EOF")
+ case isNL(r):
+ return lx.errorf("strings cannot contain newlines")
+ case r == rawStringEnd:
+ lx.backup()
+ lx.emit(itemRawString)
+ lx.next()
+ lx.ignore()
+ return lx.pop()
+ }
+ return lexRawString
+}
+
+// lexMultilineRawString consumes a raw string. Nothing can be escaped in such
+// a string. It assumes that the beginning "'''" has already been consumed and
+// ignored.
+func lexMultilineRawString(lx *lexer) stateFn {
+ switch lx.next() {
+ case eof:
+ return lx.errorf("unexpected EOF")
+ case rawStringEnd:
+ if lx.accept(rawStringEnd) {
+ if lx.accept(rawStringEnd) {
+ lx.backup()
+ lx.backup()
+ lx.backup()
+ lx.emit(itemRawMultilineString)
+ lx.next()
+ lx.next()
+ lx.next()
+ lx.ignore()
+ return lx.pop()
+ }
+ lx.backup()
+ }
+ }
+ return lexMultilineRawString
+}
+
+// lexMultilineStringEscape consumes an escaped character. It assumes that the
+// preceding '\\' has already been consumed.
+func lexMultilineStringEscape(lx *lexer) stateFn {
+ // Handle the special case first:
+ if isNL(lx.next()) {
+ return lexMultilineString
+ }
+ lx.backup()
+ lx.push(lexMultilineString)
+ return lexStringEscape(lx)
+}
+
+func lexStringEscape(lx *lexer) stateFn {
+ r := lx.next()
+ switch r {
+ case 'b':
+ fallthrough
+ case 't':
+ fallthrough
+ case 'n':
+ fallthrough
+ case 'f':
+ fallthrough
+ case 'r':
+ fallthrough
+ case '"':
+ fallthrough
+ case '\\':
+ return lx.pop()
+ case 'u':
+ return lexShortUnicodeEscape
+ case 'U':
+ return lexLongUnicodeEscape
+ }
+ return lx.errorf("invalid escape character %q; only the following "+
+ "escape characters are allowed: "+
+ `\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r)
+}
+
+func lexShortUnicodeEscape(lx *lexer) stateFn {
+ var r rune
+ for i := 0; i < 4; i++ {
+ r = lx.next()
+ if !isHexadecimal(r) {
+ return lx.errorf(`expected four hexadecimal digits after '\u', `+
+ "but got %q instead", lx.current())
+ }
+ }
+ return lx.pop()
+}
+
+func lexLongUnicodeEscape(lx *lexer) stateFn {
+ var r rune
+ for i := 0; i < 8; i++ {
+ r = lx.next()
+ if !isHexadecimal(r) {
+ return lx.errorf(`expected eight hexadecimal digits after '\U', `+
+ "but got %q instead", lx.current())
+ }
+ }
+ return lx.pop()
+}
+
+// lexNumberOrDateStart consumes either an integer, a float, or datetime.
+func lexNumberOrDateStart(lx *lexer) stateFn {
+ r := lx.next()
+ if isDigit(r) {
+ return lexNumberOrDate
+ }
+ switch r {
+ case '_':
+ return lexNumber
+ case 'e', 'E':
+ return lexFloat
+ case '.':
+ return lx.errorf("floats must start with a digit, not '.'")
+ }
+ return lx.errorf("expected a digit but got %q", r)
+}
+
+// lexNumberOrDate consumes either an integer, float or datetime.
+func lexNumberOrDate(lx *lexer) stateFn {
+ r := lx.next()
+ if isDigit(r) {
+ return lexNumberOrDate
+ }
+ switch r {
+ case '-':
+ return lexDatetime
+ case '_':
+ return lexNumber
+ case '.', 'e', 'E':
+ return lexFloat
+ }
+
+ lx.backup()
+ lx.emit(itemInteger)
+ return lx.pop()
+}
+
+// lexDatetime consumes a Datetime, to a first approximation.
+// The parser validates that it matches one of the accepted formats.
+func lexDatetime(lx *lexer) stateFn {
+ r := lx.next()
+ if isDigit(r) {
+ return lexDatetime
+ }
+ switch r {
+ case '-', 'T', ':', '.', 'Z', '+':
+ return lexDatetime
+ }
+
+ lx.backup()
+ lx.emit(itemDatetime)
+ return lx.pop()
+}
+
+// lexNumberStart consumes either an integer or a float. It assumes that a sign
+// has already been read, but that *no* digits have been consumed.
+// lexNumberStart will move to the appropriate integer or float states.
+func lexNumberStart(lx *lexer) stateFn {
+ // We MUST see a digit. Even floats have to start with a digit.
+ r := lx.next()
+ if !isDigit(r) {
+ if r == '.' {
+ return lx.errorf("floats must start with a digit, not '.'")
+ }
+ return lx.errorf("expected a digit but got %q", r)
+ }
+ return lexNumber
+}
+
+// lexNumber consumes an integer or a float after seeing the first digit.
+func lexNumber(lx *lexer) stateFn {
+ r := lx.next()
+ if isDigit(r) {
+ return lexNumber
+ }
+ switch r {
+ case '_':
+ return lexNumber
+ case '.', 'e', 'E':
+ return lexFloat
+ }
+
+ lx.backup()
+ lx.emit(itemInteger)
+ return lx.pop()
+}
+
+// lexFloat consumes the elements of a float. It allows any sequence of
+// float-like characters, so floats emitted by the lexer are only a first
+// approximation and must be validated by the parser.
+func lexFloat(lx *lexer) stateFn {
+ r := lx.next()
+ if isDigit(r) {
+ return lexFloat
+ }
+ switch r {
+ case '_', '.', '-', '+', 'e', 'E':
+ return lexFloat
+ }
+
+ lx.backup()
+ lx.emit(itemFloat)
+ return lx.pop()
+}
+
+// lexBool consumes a bool string: 'true' or 'false.
+func lexBool(lx *lexer) stateFn {
+ var rs []rune
+ for {
+ r := lx.next()
+ if !unicode.IsLetter(r) {
+ lx.backup()
+ break
+ }
+ rs = append(rs, r)
+ }
+ s := string(rs)
+ switch s {
+ case "true", "false":
+ lx.emit(itemBool)
+ return lx.pop()
+ }
+ return lx.errorf("expected value but found %q instead", s)
+}
+
+// lexCommentStart begins the lexing of a comment. It will emit
+// itemCommentStart and consume no characters, passing control to lexComment.
+func lexCommentStart(lx *lexer) stateFn {
+ lx.ignore()
+ lx.emit(itemCommentStart)
+ return lexComment
+}
+
+// lexComment lexes an entire comment. It assumes that '#' has been consumed.
+// It will consume *up to* the first newline character, and pass control
+// back to the last state on the stack.
+func lexComment(lx *lexer) stateFn {
+ r := lx.peek()
+ if isNL(r) || r == eof {
+ lx.emit(itemText)
+ return lx.pop()
+ }
+ lx.next()
+ return lexComment
+}
+
+// lexSkip ignores all slurped input and moves on to the next state.
+func lexSkip(lx *lexer, nextState stateFn) stateFn {
+ return func(lx *lexer) stateFn {
+ lx.ignore()
+ return nextState
+ }
+}
+
+// isWhitespace returns true if `r` is a whitespace character according
+// to the spec.
+func isWhitespace(r rune) bool {
+ return r == '\t' || r == ' '
+}
+
+func isNL(r rune) bool {
+ return r == '\n' || r == '\r'
+}
+
+func isDigit(r rune) bool {
+ return r >= '0' && r <= '9'
+}
+
+func isHexadecimal(r rune) bool {
+ return (r >= '0' && r <= '9') ||
+ (r >= 'a' && r <= 'f') ||
+ (r >= 'A' && r <= 'F')
+}
+
+func isBareKeyChar(r rune) bool {
+ return (r >= 'A' && r <= 'Z') ||
+ (r >= 'a' && r <= 'z') ||
+ (r >= '0' && r <= '9') ||
+ r == '_' ||
+ r == '-'
+}
+
+func (itype itemType) String() string {
+ switch itype {
+ case itemError:
+ return "Error"
+ case itemNIL:
+ return "NIL"
+ case itemEOF:
+ return "EOF"
+ case itemText:
+ return "Text"
+ case itemString, itemRawString, itemMultilineString, itemRawMultilineString:
+ return "String"
+ case itemBool:
+ return "Bool"
+ case itemInteger:
+ return "Integer"
+ case itemFloat:
+ return "Float"
+ case itemDatetime:
+ return "DateTime"
+ case itemTableStart:
+ return "TableStart"
+ case itemTableEnd:
+ return "TableEnd"
+ case itemKeyStart:
+ return "KeyStart"
+ case itemArray:
+ return "Array"
+ case itemArrayEnd:
+ return "ArrayEnd"
+ case itemCommentStart:
+ return "CommentStart"
+ }
+ panic(fmt.Sprintf("BUG: Unknown type '%d'.", int(itype)))
+}
+
+func (item item) String() string {
+ return fmt.Sprintf("(%s, %s)", item.typ.String(), item.val)
+}
diff --git a/vendor/github.com/BurntSushi/toml/parse.go b/vendor/github.com/BurntSushi/toml/parse.go
new file mode 100644
index 00000000000..50869ef9266
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/parse.go
@@ -0,0 +1,592 @@
+package toml
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+ "time"
+ "unicode"
+ "unicode/utf8"
+)
+
+type parser struct {
+ mapping map[string]interface{}
+ types map[string]tomlType
+ lx *lexer
+
+ // A list of keys in the order that they appear in the TOML data.
+ ordered []Key
+
+ // the full key for the current hash in scope
+ context Key
+
+ // the base key name for everything except hashes
+ currentKey string
+
+ // rough approximation of line number
+ approxLine int
+
+ // A map of 'key.group.names' to whether they were created implicitly.
+ implicits map[string]bool
+}
+
+type parseError string
+
+func (pe parseError) Error() string {
+ return string(pe)
+}
+
+func parse(data string) (p *parser, err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ var ok bool
+ if err, ok = r.(parseError); ok {
+ return
+ }
+ panic(r)
+ }
+ }()
+
+ p = &parser{
+ mapping: make(map[string]interface{}),
+ types: make(map[string]tomlType),
+ lx: lex(data),
+ ordered: make([]Key, 0),
+ implicits: make(map[string]bool),
+ }
+ for {
+ item := p.next()
+ if item.typ == itemEOF {
+ break
+ }
+ p.topLevel(item)
+ }
+
+ return p, nil
+}
+
+func (p *parser) panicf(format string, v ...interface{}) {
+ msg := fmt.Sprintf("Near line %d (last key parsed '%s'): %s",
+ p.approxLine, p.current(), fmt.Sprintf(format, v...))
+ panic(parseError(msg))
+}
+
+func (p *parser) next() item {
+ it := p.lx.nextItem()
+ if it.typ == itemError {
+ p.panicf("%s", it.val)
+ }
+ return it
+}
+
+func (p *parser) bug(format string, v ...interface{}) {
+ panic(fmt.Sprintf("BUG: "+format+"\n\n", v...))
+}
+
+func (p *parser) expect(typ itemType) item {
+ it := p.next()
+ p.assertEqual(typ, it.typ)
+ return it
+}
+
+func (p *parser) assertEqual(expected, got itemType) {
+ if expected != got {
+ p.bug("Expected '%s' but got '%s'.", expected, got)
+ }
+}
+
+func (p *parser) topLevel(item item) {
+ switch item.typ {
+ case itemCommentStart:
+ p.approxLine = item.line
+ p.expect(itemText)
+ case itemTableStart:
+ kg := p.next()
+ p.approxLine = kg.line
+
+ var key Key
+ for ; kg.typ != itemTableEnd && kg.typ != itemEOF; kg = p.next() {
+ key = append(key, p.keyString(kg))
+ }
+ p.assertEqual(itemTableEnd, kg.typ)
+
+ p.establishContext(key, false)
+ p.setType("", tomlHash)
+ p.ordered = append(p.ordered, key)
+ case itemArrayTableStart:
+ kg := p.next()
+ p.approxLine = kg.line
+
+ var key Key
+ for ; kg.typ != itemArrayTableEnd && kg.typ != itemEOF; kg = p.next() {
+ key = append(key, p.keyString(kg))
+ }
+ p.assertEqual(itemArrayTableEnd, kg.typ)
+
+ p.establishContext(key, true)
+ p.setType("", tomlArrayHash)
+ p.ordered = append(p.ordered, key)
+ case itemKeyStart:
+ kname := p.next()
+ p.approxLine = kname.line
+ p.currentKey = p.keyString(kname)
+
+ val, typ := p.value(p.next())
+ p.setValue(p.currentKey, val)
+ p.setType(p.currentKey, typ)
+ p.ordered = append(p.ordered, p.context.add(p.currentKey))
+ p.currentKey = ""
+ default:
+ p.bug("Unexpected type at top level: %s", item.typ)
+ }
+}
+
+// Gets a string for a key (or part of a key in a table name).
+func (p *parser) keyString(it item) string {
+ switch it.typ {
+ case itemText:
+ return it.val
+ case itemString, itemMultilineString,
+ itemRawString, itemRawMultilineString:
+ s, _ := p.value(it)
+ return s.(string)
+ default:
+ p.bug("Unexpected key type: %s", it.typ)
+ panic("unreachable")
+ }
+}
+
+// value translates an expected value from the lexer into a Go value wrapped
+// as an empty interface.
+func (p *parser) value(it item) (interface{}, tomlType) {
+ switch it.typ {
+ case itemString:
+ return p.replaceEscapes(it.val), p.typeOfPrimitive(it)
+ case itemMultilineString:
+ trimmed := stripFirstNewline(stripEscapedWhitespace(it.val))
+ return p.replaceEscapes(trimmed), p.typeOfPrimitive(it)
+ case itemRawString:
+ return it.val, p.typeOfPrimitive(it)
+ case itemRawMultilineString:
+ return stripFirstNewline(it.val), p.typeOfPrimitive(it)
+ case itemBool:
+ switch it.val {
+ case "true":
+ return true, p.typeOfPrimitive(it)
+ case "false":
+ return false, p.typeOfPrimitive(it)
+ }
+ p.bug("Expected boolean value, but got '%s'.", it.val)
+ case itemInteger:
+ if !numUnderscoresOK(it.val) {
+ p.panicf("Invalid integer %q: underscores must be surrounded by digits",
+ it.val)
+ }
+ val := strings.Replace(it.val, "_", "", -1)
+ num, err := strconv.ParseInt(val, 10, 64)
+ if err != nil {
+ // Distinguish integer values. Normally, it'd be a bug if the lexer
+ // provides an invalid integer, but it's possible that the number is
+ // out of range of valid values (which the lexer cannot determine).
+ // So mark the former as a bug but the latter as a legitimate user
+ // error.
+ if e, ok := err.(*strconv.NumError); ok &&
+ e.Err == strconv.ErrRange {
+
+ p.panicf("Integer '%s' is out of the range of 64-bit "+
+ "signed integers.", it.val)
+ } else {
+ p.bug("Expected integer value, but got '%s'.", it.val)
+ }
+ }
+ return num, p.typeOfPrimitive(it)
+ case itemFloat:
+ parts := strings.FieldsFunc(it.val, func(r rune) bool {
+ switch r {
+ case '.', 'e', 'E':
+ return true
+ }
+ return false
+ })
+ for _, part := range parts {
+ if !numUnderscoresOK(part) {
+ p.panicf("Invalid float %q: underscores must be "+
+ "surrounded by digits", it.val)
+ }
+ }
+ if !numPeriodsOK(it.val) {
+ // As a special case, numbers like '123.' or '1.e2',
+ // which are valid as far as Go/strconv are concerned,
+ // must be rejected because TOML says that a fractional
+ // part consists of '.' followed by 1+ digits.
+ p.panicf("Invalid float %q: '.' must be followed "+
+ "by one or more digits", it.val)
+ }
+ val := strings.Replace(it.val, "_", "", -1)
+ num, err := strconv.ParseFloat(val, 64)
+ if err != nil {
+ if e, ok := err.(*strconv.NumError); ok &&
+ e.Err == strconv.ErrRange {
+
+ p.panicf("Float '%s' is out of the range of 64-bit "+
+ "IEEE-754 floating-point numbers.", it.val)
+ } else {
+ p.panicf("Invalid float value: %q", it.val)
+ }
+ }
+ return num, p.typeOfPrimitive(it)
+ case itemDatetime:
+ var t time.Time
+ var ok bool
+ var err error
+ for _, format := range []string{
+ "2006-01-02T15:04:05Z07:00",
+ "2006-01-02T15:04:05",
+ "2006-01-02",
+ } {
+ t, err = time.ParseInLocation(format, it.val, time.Local)
+ if err == nil {
+ ok = true
+ break
+ }
+ }
+ if !ok {
+ p.panicf("Invalid TOML Datetime: %q.", it.val)
+ }
+ return t, p.typeOfPrimitive(it)
+ case itemArray:
+ array := make([]interface{}, 0)
+ types := make([]tomlType, 0)
+
+ for it = p.next(); it.typ != itemArrayEnd; it = p.next() {
+ if it.typ == itemCommentStart {
+ p.expect(itemText)
+ continue
+ }
+
+ val, typ := p.value(it)
+ array = append(array, val)
+ types = append(types, typ)
+ }
+ return array, p.typeOfArray(types)
+ case itemInlineTableStart:
+ var (
+ hash = make(map[string]interface{})
+ outerContext = p.context
+ outerKey = p.currentKey
+ )
+
+ p.context = append(p.context, p.currentKey)
+ p.currentKey = ""
+ for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() {
+ if it.typ != itemKeyStart {
+ p.bug("Expected key start but instead found %q, around line %d",
+ it.val, p.approxLine)
+ }
+ if it.typ == itemCommentStart {
+ p.expect(itemText)
+ continue
+ }
+
+ // retrieve key
+ k := p.next()
+ p.approxLine = k.line
+ kname := p.keyString(k)
+
+ // retrieve value
+ p.currentKey = kname
+ val, typ := p.value(p.next())
+ // make sure we keep metadata up to date
+ p.setType(kname, typ)
+ p.ordered = append(p.ordered, p.context.add(p.currentKey))
+ hash[kname] = val
+ }
+ p.context = outerContext
+ p.currentKey = outerKey
+ return hash, tomlHash
+ }
+ p.bug("Unexpected value type: %s", it.typ)
+ panic("unreachable")
+}
+
+// numUnderscoresOK checks whether each underscore in s is surrounded by
+// characters that are not underscores.
+func numUnderscoresOK(s string) bool {
+ accept := false
+ for _, r := range s {
+ if r == '_' {
+ if !accept {
+ return false
+ }
+ accept = false
+ continue
+ }
+ accept = true
+ }
+ return accept
+}
+
+// numPeriodsOK checks whether every period in s is followed by a digit.
+func numPeriodsOK(s string) bool {
+ period := false
+ for _, r := range s {
+ if period && !isDigit(r) {
+ return false
+ }
+ period = r == '.'
+ }
+ return !period
+}
+
+// establishContext sets the current context of the parser,
+// where the context is either a hash or an array of hashes. Which one is
+// set depends on the value of the `array` parameter.
+//
+// Establishing the context also makes sure that the key isn't a duplicate, and
+// will create implicit hashes automatically.
+func (p *parser) establishContext(key Key, array bool) {
+ var ok bool
+
+ // Always start at the top level and drill down for our context.
+ hashContext := p.mapping
+ keyContext := make(Key, 0)
+
+ // We only need implicit hashes for key[0:-1]
+ for _, k := range key[0 : len(key)-1] {
+ _, ok = hashContext[k]
+ keyContext = append(keyContext, k)
+
+ // No key? Make an implicit hash and move on.
+ if !ok {
+ p.addImplicit(keyContext)
+ hashContext[k] = make(map[string]interface{})
+ }
+
+ // If the hash context is actually an array of tables, then set
+ // the hash context to the last element in that array.
+ //
+ // Otherwise, it better be a table, since this MUST be a key group (by
+ // virtue of it not being the last element in a key).
+ switch t := hashContext[k].(type) {
+ case []map[string]interface{}:
+ hashContext = t[len(t)-1]
+ case map[string]interface{}:
+ hashContext = t
+ default:
+ p.panicf("Key '%s' was already created as a hash.", keyContext)
+ }
+ }
+
+ p.context = keyContext
+ if array {
+ // If this is the first element for this array, then allocate a new
+ // list of tables for it.
+ k := key[len(key)-1]
+ if _, ok := hashContext[k]; !ok {
+ hashContext[k] = make([]map[string]interface{}, 0, 5)
+ }
+
+ // Add a new table. But make sure the key hasn't already been used
+ // for something else.
+ if hash, ok := hashContext[k].([]map[string]interface{}); ok {
+ hashContext[k] = append(hash, make(map[string]interface{}))
+ } else {
+ p.panicf("Key '%s' was already created and cannot be used as "+
+ "an array.", keyContext)
+ }
+ } else {
+ p.setValue(key[len(key)-1], make(map[string]interface{}))
+ }
+ p.context = append(p.context, key[len(key)-1])
+}
+
+// setValue sets the given key to the given value in the current context.
+// It will make sure that the key hasn't already been defined, account for
+// implicit key groups.
+func (p *parser) setValue(key string, value interface{}) {
+ var tmpHash interface{}
+ var ok bool
+
+ hash := p.mapping
+ keyContext := make(Key, 0)
+ for _, k := range p.context {
+ keyContext = append(keyContext, k)
+ if tmpHash, ok = hash[k]; !ok {
+ p.bug("Context for key '%s' has not been established.", keyContext)
+ }
+ switch t := tmpHash.(type) {
+ case []map[string]interface{}:
+ // The context is a table of hashes. Pick the most recent table
+ // defined as the current hash.
+ hash = t[len(t)-1]
+ case map[string]interface{}:
+ hash = t
+ default:
+ p.bug("Expected hash to have type 'map[string]interface{}', but "+
+ "it has '%T' instead.", tmpHash)
+ }
+ }
+ keyContext = append(keyContext, key)
+
+ if _, ok := hash[key]; ok {
+ // Typically, if the given key has already been set, then we have
+ // to raise an error since duplicate keys are disallowed. However,
+ // it's possible that a key was previously defined implicitly. In this
+ // case, it is allowed to be redefined concretely. (See the
+ // `tests/valid/implicit-and-explicit-after.toml` test in `toml-test`.)
+ //
+ // But we have to make sure to stop marking it as an implicit. (So that
+ // another redefinition provokes an error.)
+ //
+ // Note that since it has already been defined (as a hash), we don't
+ // want to overwrite it. So our business is done.
+ if p.isImplicit(keyContext) {
+ p.removeImplicit(keyContext)
+ return
+ }
+
+ // Otherwise, we have a concrete key trying to override a previous
+ // key, which is *always* wrong.
+ p.panicf("Key '%s' has already been defined.", keyContext)
+ }
+ hash[key] = value
+}
+
+// setType sets the type of a particular value at a given key.
+// It should be called immediately AFTER setValue.
+//
+// Note that if `key` is empty, then the type given will be applied to the
+// current context (which is either a table or an array of tables).
+func (p *parser) setType(key string, typ tomlType) {
+ keyContext := make(Key, 0, len(p.context)+1)
+ for _, k := range p.context {
+ keyContext = append(keyContext, k)
+ }
+ if len(key) > 0 { // allow type setting for hashes
+ keyContext = append(keyContext, key)
+ }
+ p.types[keyContext.String()] = typ
+}
+
+// addImplicit sets the given Key as having been created implicitly.
+func (p *parser) addImplicit(key Key) {
+ p.implicits[key.String()] = true
+}
+
+// removeImplicit stops tagging the given key as having been implicitly
+// created.
+func (p *parser) removeImplicit(key Key) {
+ p.implicits[key.String()] = false
+}
+
+// isImplicit returns true if the key group pointed to by the key was created
+// implicitly.
+func (p *parser) isImplicit(key Key) bool {
+ return p.implicits[key.String()]
+}
+
+// current returns the full key name of the current context.
+func (p *parser) current() string {
+ if len(p.currentKey) == 0 {
+ return p.context.String()
+ }
+ if len(p.context) == 0 {
+ return p.currentKey
+ }
+ return fmt.Sprintf("%s.%s", p.context, p.currentKey)
+}
+
+func stripFirstNewline(s string) string {
+ if len(s) == 0 || s[0] != '\n' {
+ return s
+ }
+ return s[1:]
+}
+
+func stripEscapedWhitespace(s string) string {
+ esc := strings.Split(s, "\\\n")
+ if len(esc) > 1 {
+ for i := 1; i < len(esc); i++ {
+ esc[i] = strings.TrimLeftFunc(esc[i], unicode.IsSpace)
+ }
+ }
+ return strings.Join(esc, "")
+}
+
+func (p *parser) replaceEscapes(str string) string {
+ var replaced []rune
+ s := []byte(str)
+ r := 0
+ for r < len(s) {
+ if s[r] != '\\' {
+ c, size := utf8.DecodeRune(s[r:])
+ r += size
+ replaced = append(replaced, c)
+ continue
+ }
+ r += 1
+ if r >= len(s) {
+ p.bug("Escape sequence at end of string.")
+ return ""
+ }
+ switch s[r] {
+ default:
+ p.bug("Expected valid escape code after \\, but got %q.", s[r])
+ return ""
+ case 'b':
+ replaced = append(replaced, rune(0x0008))
+ r += 1
+ case 't':
+ replaced = append(replaced, rune(0x0009))
+ r += 1
+ case 'n':
+ replaced = append(replaced, rune(0x000A))
+ r += 1
+ case 'f':
+ replaced = append(replaced, rune(0x000C))
+ r += 1
+ case 'r':
+ replaced = append(replaced, rune(0x000D))
+ r += 1
+ case '"':
+ replaced = append(replaced, rune(0x0022))
+ r += 1
+ case '\\':
+ replaced = append(replaced, rune(0x005C))
+ r += 1
+ case 'u':
+ // At this point, we know we have a Unicode escape of the form
+ // `uXXXX` at [r, r+5). (Because the lexer guarantees this
+ // for us.)
+ escaped := p.asciiEscapeToUnicode(s[r+1 : r+5])
+ replaced = append(replaced, escaped)
+ r += 5
+ case 'U':
+ // At this point, we know we have a Unicode escape of the form
+ // `uXXXX` at [r, r+9). (Because the lexer guarantees this
+ // for us.)
+ escaped := p.asciiEscapeToUnicode(s[r+1 : r+9])
+ replaced = append(replaced, escaped)
+ r += 9
+ }
+ }
+ return string(replaced)
+}
+
+func (p *parser) asciiEscapeToUnicode(bs []byte) rune {
+ s := string(bs)
+ hex, err := strconv.ParseUint(strings.ToLower(s), 16, 32)
+ if err != nil {
+ p.bug("Could not parse '%s' as a hexadecimal number, but the "+
+ "lexer claims it's OK: %s", s, err)
+ }
+ if !utf8.ValidRune(rune(hex)) {
+ p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s)
+ }
+ return rune(hex)
+}
+
+func isStringType(ty itemType) bool {
+ return ty == itemString || ty == itemMultilineString ||
+ ty == itemRawString || ty == itemRawMultilineString
+}
diff --git a/vendor/github.com/BurntSushi/toml/session.vim b/vendor/github.com/BurntSushi/toml/session.vim
new file mode 100644
index 00000000000..562164be060
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/session.vim
@@ -0,0 +1 @@
+au BufWritePost *.go silent!make tags > /dev/null 2>&1
diff --git a/vendor/github.com/BurntSushi/toml/type_check.go b/vendor/github.com/BurntSushi/toml/type_check.go
new file mode 100644
index 00000000000..c73f8afc1a6
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/type_check.go
@@ -0,0 +1,91 @@
+package toml
+
+// tomlType represents any Go type that corresponds to a TOML type.
+// While the first draft of the TOML spec has a simplistic type system that
+// probably doesn't need this level of sophistication, we seem to be militating
+// toward adding real composite types.
+type tomlType interface {
+ typeString() string
+}
+
+// typeEqual accepts any two types and returns true if they are equal.
+func typeEqual(t1, t2 tomlType) bool {
+ if t1 == nil || t2 == nil {
+ return false
+ }
+ return t1.typeString() == t2.typeString()
+}
+
+func typeIsHash(t tomlType) bool {
+ return typeEqual(t, tomlHash) || typeEqual(t, tomlArrayHash)
+}
+
+type tomlBaseType string
+
+func (btype tomlBaseType) typeString() string {
+ return string(btype)
+}
+
+func (btype tomlBaseType) String() string {
+ return btype.typeString()
+}
+
+var (
+ tomlInteger tomlBaseType = "Integer"
+ tomlFloat tomlBaseType = "Float"
+ tomlDatetime tomlBaseType = "Datetime"
+ tomlString tomlBaseType = "String"
+ tomlBool tomlBaseType = "Bool"
+ tomlArray tomlBaseType = "Array"
+ tomlHash tomlBaseType = "Hash"
+ tomlArrayHash tomlBaseType = "ArrayHash"
+)
+
+// typeOfPrimitive returns a tomlType of any primitive value in TOML.
+// Primitive values are: Integer, Float, Datetime, String and Bool.
+//
+// Passing a lexer item other than the following will cause a BUG message
+// to occur: itemString, itemBool, itemInteger, itemFloat, itemDatetime.
+func (p *parser) typeOfPrimitive(lexItem item) tomlType {
+ switch lexItem.typ {
+ case itemInteger:
+ return tomlInteger
+ case itemFloat:
+ return tomlFloat
+ case itemDatetime:
+ return tomlDatetime
+ case itemString:
+ return tomlString
+ case itemMultilineString:
+ return tomlString
+ case itemRawString:
+ return tomlString
+ case itemRawMultilineString:
+ return tomlString
+ case itemBool:
+ return tomlBool
+ }
+ p.bug("Cannot infer primitive type of lex item '%s'.", lexItem)
+ panic("unreachable")
+}
+
+// typeOfArray returns a tomlType for an array given a list of types of its
+// values.
+//
+// In the current spec, if an array is homogeneous, then its type is always
+// "Array". If the array is not homogeneous, an error is generated.
+func (p *parser) typeOfArray(types []tomlType) tomlType {
+ // Empty arrays are cool.
+ if len(types) == 0 {
+ return tomlArray
+ }
+
+ theType := types[0]
+ for _, t := range types[1:] {
+ if !typeEqual(theType, t) {
+ p.panicf("Array contains values of type '%s' and '%s', but "+
+ "arrays must be homogeneous.", theType, t)
+ }
+ }
+ return tomlArray
+}
diff --git a/vendor/github.com/BurntSushi/toml/type_fields.go b/vendor/github.com/BurntSushi/toml/type_fields.go
new file mode 100644
index 00000000000..608997c22f6
--- /dev/null
+++ b/vendor/github.com/BurntSushi/toml/type_fields.go
@@ -0,0 +1,242 @@
+package toml
+
+// Struct field handling is adapted from code in encoding/json:
+//
+// 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 Go distribution.
+
+import (
+ "reflect"
+ "sort"
+ "sync"
+)
+
+// A field represents a single field found in a struct.
+type field struct {
+ name string // the name of the field (`toml` tag included)
+ tag bool // whether field has a `toml` tag
+ index []int // represents the depth of an anonymous field
+ typ reflect.Type // the type of the field
+}
+
+// byName sorts field by name, breaking ties with depth,
+// then breaking ties with "name came from toml tag", then
+// breaking ties with index sequence.
+type byName []field
+
+func (x byName) Len() int { return len(x) }
+
+func (x byName) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
+
+func (x byName) Less(i, j int) bool {
+ if x[i].name != x[j].name {
+ return x[i].name < x[j].name
+ }
+ if len(x[i].index) != len(x[j].index) {
+ return len(x[i].index) < len(x[j].index)
+ }
+ if x[i].tag != x[j].tag {
+ return x[i].tag
+ }
+ return byIndex(x).Less(i, j)
+}
+
+// byIndex sorts field by index sequence.
+type byIndex []field
+
+func (x byIndex) Len() int { return len(x) }
+
+func (x byIndex) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
+
+func (x byIndex) Less(i, j int) bool {
+ for k, xik := range x[i].index {
+ if k >= len(x[j].index) {
+ return false
+ }
+ if xik != x[j].index[k] {
+ return xik < x[j].index[k]
+ }
+ }
+ return len(x[i].index) < len(x[j].index)
+}
+
+// typeFields returns a list of fields that TOML should recognize for the given
+// type. The algorithm is breadth-first search over the set of structs to
+// include - the top struct and then any reachable anonymous structs.
+func typeFields(t reflect.Type) []field {
+ // Anonymous fields to explore at the current level and the next.
+ current := []field{}
+ next := []field{{typ: t}}
+
+ // Count of queued names for current level and the next.
+ count := map[reflect.Type]int{}
+ nextCount := map[reflect.Type]int{}
+
+ // Types already visited at an earlier level.
+ visited := map[reflect.Type]bool{}
+
+ // Fields found.
+ var fields []field
+
+ for len(next) > 0 {
+ current, next = next, current[:0]
+ count, nextCount = nextCount, map[reflect.Type]int{}
+
+ for _, f := range current {
+ if visited[f.typ] {
+ continue
+ }
+ visited[f.typ] = true
+
+ // Scan f.typ for fields to include.
+ for i := 0; i < f.typ.NumField(); i++ {
+ sf := f.typ.Field(i)
+ if sf.PkgPath != "" && !sf.Anonymous { // unexported
+ continue
+ }
+ opts := getOptions(sf.Tag)
+ if opts.skip {
+ continue
+ }
+ index := make([]int, len(f.index)+1)
+ copy(index, f.index)
+ index[len(f.index)] = i
+
+ ft := sf.Type
+ if ft.Name() == "" && ft.Kind() == reflect.Ptr {
+ // Follow pointer.
+ ft = ft.Elem()
+ }
+
+ // Record found field and index sequence.
+ if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct {
+ tagged := opts.name != ""
+ name := opts.name
+ if name == "" {
+ name = sf.Name
+ }
+ fields = append(fields, field{name, tagged, index, ft})
+ if count[f.typ] > 1 {
+ // If there were multiple instances, add a second,
+ // so that the annihilation code will see a duplicate.
+ // It only cares about the distinction between 1 or 2,
+ // so don't bother generating any more copies.
+ fields = append(fields, fields[len(fields)-1])
+ }
+ continue
+ }
+
+ // Record new anonymous struct to explore in next round.
+ nextCount[ft]++
+ if nextCount[ft] == 1 {
+ f := field{name: ft.Name(), index: index, typ: ft}
+ next = append(next, f)
+ }
+ }
+ }
+ }
+
+ sort.Sort(byName(fields))
+
+ // Delete all fields that are hidden by the Go rules for embedded fields,
+ // except that fields with TOML tags are promoted.
+
+ // The fields are sorted in primary order of name, secondary order
+ // of field index length. Loop over names; for each name, delete
+ // hidden fields by choosing the one dominant field that survives.
+ out := fields[:0]
+ for advance, i := 0, 0; i < len(fields); i += advance {
+ // One iteration per name.
+ // Find the sequence of fields with the name of this first field.
+ fi := fields[i]
+ name := fi.name
+ for advance = 1; i+advance < len(fields); advance++ {
+ fj := fields[i+advance]
+ if fj.name != name {
+ break
+ }
+ }
+ if advance == 1 { // Only one field with this name
+ out = append(out, fi)
+ continue
+ }
+ dominant, ok := dominantField(fields[i : i+advance])
+ if ok {
+ out = append(out, dominant)
+ }
+ }
+
+ fields = out
+ sort.Sort(byIndex(fields))
+
+ return fields
+}
+
+// dominantField looks through the fields, all of which are known to
+// have the same name, to find the single field that dominates the
+// others using Go's embedding rules, modified by the presence of
+// TOML tags. If there are multiple top-level fields, the boolean
+// will be false: This condition is an error in Go and we skip all
+// the fields.
+func dominantField(fields []field) (field, bool) {
+ // The fields are sorted in increasing index-length order. The winner
+ // must therefore be one with the shortest index length. Drop all
+ // longer entries, which is easy: just truncate the slice.
+ length := len(fields[0].index)
+ tagged := -1 // Index of first tagged field.
+ for i, f := range fields {
+ if len(f.index) > length {
+ fields = fields[:i]
+ break
+ }
+ if f.tag {
+ if tagged >= 0 {
+ // Multiple tagged fields at the same level: conflict.
+ // Return no field.
+ return field{}, false
+ }
+ tagged = i
+ }
+ }
+ if tagged >= 0 {
+ return fields[tagged], true
+ }
+ // All remaining fields have the same length. If there's more than one,
+ // we have a conflict (two fields named "X" at the same level) and we
+ // return no field.
+ if len(fields) > 1 {
+ return field{}, false
+ }
+ return fields[0], true
+}
+
+var fieldCache struct {
+ sync.RWMutex
+ m map[reflect.Type][]field
+}
+
+// cachedTypeFields is like typeFields but uses a cache to avoid repeated work.
+func cachedTypeFields(t reflect.Type) []field {
+ fieldCache.RLock()
+ f := fieldCache.m[t]
+ fieldCache.RUnlock()
+ if f != nil {
+ return f
+ }
+
+ // Compute fields without lock.
+ // Might duplicate effort but won't hold other computations back.
+ f = typeFields(t)
+ if f == nil {
+ f = []field{}
+ }
+
+ fieldCache.Lock()
+ if fieldCache.m == nil {
+ fieldCache.m = map[reflect.Type][]field{}
+ }
+ fieldCache.m[t] = f
+ fieldCache.Unlock()
+ return f
+}
diff --git a/vendor/github.com/OpenPeeDeeP/depguard/.gitignore b/vendor/github.com/OpenPeeDeeP/depguard/.gitignore
new file mode 100644
index 00000000000..f1c181ec9c5
--- /dev/null
+++ b/vendor/github.com/OpenPeeDeeP/depguard/.gitignore
@@ -0,0 +1,12 @@
+# Binaries for programs and plugins
+*.exe
+*.exe~
+*.dll
+*.so
+*.dylib
+
+# Test binary, build with `go test -c`
+*.test
+
+# Output of the go coverage tool, specifically when used with LiteIDE
+*.out
diff --git a/vendor/github.com/OpenPeeDeeP/depguard/Gopkg.lock b/vendor/github.com/OpenPeeDeeP/depguard/Gopkg.lock
new file mode 100644
index 00000000000..b6deba1b10d
--- /dev/null
+++ b/vendor/github.com/OpenPeeDeeP/depguard/Gopkg.lock
@@ -0,0 +1,43 @@
+# 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"
+
+[[projects]]
+ name = "github.com/kisielk/gotool"
+ packages = [
+ ".",
+ "internal/load"
+ ]
+ revision = "80517062f582ea3340cd4baf70e86d539ae7d84d"
+ version = "v1.0.0"
+
+[[projects]]
+ branch = "master"
+ name = "golang.org/x/tools"
+ packages = [
+ "go/ast/astutil",
+ "go/buildutil",
+ "go/loader"
+ ]
+ revision = "a5b4c53f6e8bdcafa95a94671bf2d1203365858b"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ inputs-digest = "7dd6ca0cba46360ae2d416534019ea1431850a15a69336f47a1098633d08e7b4"
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/vendor/github.com/OpenPeeDeeP/depguard/Gopkg.toml b/vendor/github.com/OpenPeeDeeP/depguard/Gopkg.toml
new file mode 100644
index 00000000000..01d61397739
--- /dev/null
+++ b/vendor/github.com/OpenPeeDeeP/depguard/Gopkg.toml
@@ -0,0 +1,43 @@
+# 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
+
+ignored = ["github.com/davecgh/go-spew/spew"]
+
+[prune]
+ go-tests = true
+ unused-packages = true
+
+[[constraint]]
+ name = "github.com/kisielk/gotool"
+ version = "1.0.0"
+
+[[constraint]]
+ branch = "master"
+ name = "golang.org/x/tools"
+
+[[constraint]]
+ name = "github.com/gobwas/glob"
+ version = "0.2.3"
diff --git a/vendor/github.com/OpenPeeDeeP/depguard/LICENSE b/vendor/github.com/OpenPeeDeeP/depguard/LICENSE
new file mode 100644
index 00000000000..94a9ed024d3
--- /dev/null
+++ b/vendor/github.com/OpenPeeDeeP/depguard/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ 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.
+
+
+ Copyright (C)
+
+ 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 .
+
+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:
+
+ Copyright (C)
+ 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
+.
+
+ 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
+.
diff --git a/vendor/github.com/OpenPeeDeeP/depguard/README.md b/vendor/github.com/OpenPeeDeeP/depguard/README.md
new file mode 100644
index 00000000000..6f742511241
--- /dev/null
+++ b/vendor/github.com/OpenPeeDeeP/depguard/README.md
@@ -0,0 +1,73 @@
+# Depguard
+
+Go linter that checks package imports are in a list of acceptable packages. It
+supports a white list and black list option and can do prefix or glob matching.
+This allows you to allow imports from a whole organization or only
+allow specific packages within a repository. It is recommended to use prefix
+matching as it is faster than glob matching. The fewer glob matches the better.
+
+> If a pattern is matched by prefix it does not try to match via glob.
+
+## Install
+
+```bash
+go get -u github.com/OpenPeeDeeP/depguard
+```
+
+## Config
+
+By default, Depguard looks for a file named `.depguard.json` in the current
+current working directory. If it is somewhere else, pass in the `-c` flag with
+the location of your configuration file.
+
+The following is an example configuration file.
+
+```json
+{
+ "type": "whitelist",
+ "packages": [
+ "github.com/OpenPeeDeeP/depguard"
+ ],
+ "includeGoRoot": true
+}
+```
+
+- `type` can be either `whitelist` or `blacklist`. This check is case insensitive.
+If not specified the default is `blacklist`.
+- `packages` is a list of packages for the list type specified.
+- Set `includeGoRoot` to true if you want to check the list against standard lib.
+If not specified the default is false.
+
+## Gometalinter
+
+The binary installation of this linter can be used with
+[Gometalinter](github.com/alecthomas/gometalinter).
+
+If you use a configuration file for Gometalinter then the following will need to
+be added to your configuration file.
+
+```json
+{
+ "linters": {
+ "depguard": {
+ "command": "depguard -c path/to/config.json",
+ "pattern": "PATH:LINE:COL:MESSAGE",
+ "installFrom": "github.com/OpenPeeDeeP/depguard",
+ "isFast": true,
+ "partitionStrategy": "packages"
+ }
+ }
+}
+```
+
+If you prefer the command line way the following will work for you as well.
+
+```bash
+gometalinter --linter='depguard:depguard -c path/to/config.json:PATH:LINE:COL:MESSAGE'
+```
+
+## Golangci-lint
+
+This linter was built with
+[Golangci-lint](https://github.com/golangci/golangci-lint) in mind. It is compatable
+and read their docs to see how to implement all their linters, including this one.
diff --git a/vendor/github.com/OpenPeeDeeP/depguard/depguard.go b/vendor/github.com/OpenPeeDeeP/depguard/depguard.go
new file mode 100644
index 00000000000..433cf8ff2fb
--- /dev/null
+++ b/vendor/github.com/OpenPeeDeeP/depguard/depguard.go
@@ -0,0 +1,185 @@
+package depguard
+
+import (
+ "go/build"
+ "go/token"
+ "os"
+ "sort"
+ "strings"
+
+ "github.com/gobwas/glob"
+ "golang.org/x/tools/go/loader"
+)
+
+//ListType states what kind of list is passed in.
+type ListType int
+
+const (
+ //LTBlacklist states the list given is a blacklist. (default)
+ LTBlacklist ListType = iota
+ //LTWhitelist states the list given is a whitelist.
+ LTWhitelist
+)
+
+//StringToListType makes it easier to turn a string into a ListType.
+//It assumes that the string representation is lower case.
+var StringToListType = map[string]ListType{
+ "whitelist": LTWhitelist,
+ "blacklist": LTBlacklist,
+}
+
+//Issue with the package with PackageName at the Position.
+type Issue struct {
+ PackageName string
+ Position token.Position
+}
+
+//Depguard checks imports to make sure they follow the given list and constraints.
+type Depguard struct {
+ ListType ListType
+ Packages []string
+ IncludeGoRoot bool
+ prefixPackages []string
+ globPackages []glob.Glob
+ buildCtx *build.Context
+ cwd string
+}
+
+//Run checks for dependencies given the program and validates them against
+//Packages.
+func (dg *Depguard) Run(config *loader.Config, prog *loader.Program) ([]*Issue, error) {
+ //Shortcut execution on an empty blacklist as that means every package is allowed
+ if dg.ListType == LTBlacklist && len(dg.Packages) == 0 {
+ return nil, nil
+ }
+
+ if err := dg.initialize(config, prog); err != nil {
+ return nil, err
+ }
+
+ directImports, err := dg.createImportMap(prog)
+ if err != nil {
+ return nil, err
+ }
+ var issues []*Issue
+ for pkg, positions := range directImports {
+ if dg.flagIt(pkg) {
+ for _, pos := range positions {
+ issues = append(issues, &Issue{
+ PackageName: pkg,
+ Position: pos,
+ })
+ }
+ }
+ }
+ return issues, nil
+}
+
+func (dg *Depguard) initialize(config *loader.Config, prog *loader.Program) error {
+ //Try and get the current working directory
+ dg.cwd = config.Cwd
+ if dg.cwd == "" {
+ var err error
+ dg.cwd, err = os.Getwd()
+ if err != nil {
+ return err
+ }
+ }
+
+ //Use the &build.Default if one is not specified
+ dg.buildCtx = config.Build
+ if dg.buildCtx == nil {
+ dg.buildCtx = &build.Default
+ }
+
+ for _, pkg := range dg.Packages {
+ if strings.ContainsAny(pkg, "!?*[]{}") {
+ g, err := glob.Compile(pkg, '/')
+ if err != nil {
+ return err
+ }
+ dg.globPackages = append(dg.globPackages, g)
+ } else {
+ dg.prefixPackages = append(dg.prefixPackages, pkg)
+ }
+ }
+
+ //Sort the packages so we can have a faster search in the array
+ sort.Strings(dg.prefixPackages)
+ return nil
+}
+
+func (dg *Depguard) createImportMap(prog *loader.Program) (map[string][]token.Position, error) {
+ importMap := make(map[string][]token.Position)
+ //For the directly imported packages
+ for _, imported := range prog.InitialPackages() {
+ //Go through their files
+ for _, file := range imported.Files {
+ //And populate a map of all direct imports and their positions
+ //This will filter out GoRoot depending on the Depguard.IncludeGoRoot
+ for _, fileImport := range file.Imports {
+ fileImportPath := cleanBasicLitString(fileImport.Path.Value)
+ if !dg.IncludeGoRoot {
+ pkg, err := dg.buildCtx.Import(fileImportPath, dg.cwd, 0)
+ if err != nil {
+ return nil, err
+ }
+ if pkg.Goroot {
+ continue
+ }
+ }
+ position := prog.Fset.Position(fileImport.Pos())
+ positions, found := importMap[fileImportPath]
+ if !found {
+ importMap[fileImportPath] = []token.Position{
+ position,
+ }
+ continue
+ }
+ importMap[fileImportPath] = append(positions, position)
+ }
+ }
+ }
+ return importMap, nil
+}
+
+func (dg *Depguard) pkgInList(pkg string) bool {
+ if dg.pkgInPrefixList(pkg) {
+ return true
+ }
+ return dg.pkgInGlobList(pkg)
+}
+
+func (dg *Depguard) pkgInPrefixList(pkg string) bool {
+ //Idx represents where in the package slice the passed in package would go
+ //when sorted. -1 Just means that it would be at the very front of the slice.
+ idx := sort.Search(len(dg.prefixPackages), func(i int) bool {
+ return dg.prefixPackages[i] > pkg
+ }) - 1
+ //This means that the package passed in has no way to be prefixed by anything
+ //in the package list as it is already smaller then everything
+ if idx == -1 {
+ return false
+ }
+ return strings.HasPrefix(pkg, dg.prefixPackages[idx])
+}
+
+func (dg *Depguard) pkgInGlobList(pkg string) bool {
+ for _, g := range dg.globPackages {
+ if g.Match(pkg) {
+ return true
+ }
+ }
+ return false
+}
+
+//InList | WhiteList | BlackList
+// y | | x
+// n | x |
+func (dg *Depguard) flagIt(pkg string) bool {
+ return dg.pkgInList(pkg) == (dg.ListType == LTBlacklist)
+}
+
+func cleanBasicLitString(value string) string {
+ return strings.Trim(value, "\"\\")
+}
diff --git a/vendor/github.com/client9/misspell/.gitignore b/vendor/github.com/client9/misspell/.gitignore
new file mode 100644
index 00000000000..b1b707e3260
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/.travis.yml b/vendor/github.com/client9/misspell/.travis.yml
new file mode 100644
index 00000000000..e63e6c2bdcc
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/Dockerfile b/vendor/github.com/client9/misspell/Dockerfile
new file mode 100644
index 00000000000..b8ea37b4c5a
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/Gopkg.lock b/vendor/github.com/client9/misspell/Gopkg.lock
new file mode 100644
index 00000000000..90ed45115f9
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/Gopkg.toml b/vendor/github.com/client9/misspell/Gopkg.toml
new file mode 100644
index 00000000000..e9b8e6a45a9
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/LICENSE b/vendor/github.com/client9/misspell/LICENSE
new file mode 100644
index 00000000000..423e1f9e0f9
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/Makefile b/vendor/github.com/client9/misspell/Makefile
new file mode 100644
index 00000000000..862ab77b0d6
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/README.md b/vendor/github.com/client9/misspell/README.md
new file mode 100644
index 00000000000..5b68af04da9
--- /dev/null
+++ b/vendor/github.com/client9/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)
+
+
+### 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
+```
+
+
+### 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.
+
+
+### 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
+```
+
+
+### 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
+```
+
+
+### 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.
+
+
+### 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.
+
+
+
+### 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
+```
+
+
+### 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;'
+```
+
+
+### 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.
+
+
+### 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 }}'
+```
+
+
+### 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.
+
+
+### 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!
+
+
+### 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.
+
+
+### 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.
+
+
+### 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!
+
+
+### 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)
+
+
+### 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)
+
+
+### 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.
+
+
+### 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/client9/misspell/RELEASE-HOWTO.md b/vendor/github.com/client9/misspell/RELEASE-HOWTO.md
new file mode 100644
index 00000000000..55b52d962e9
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/ascii.go b/vendor/github.com/client9/misspell/ascii.go
new file mode 100644
index 00000000000..1430718d6a2
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/case.go b/vendor/github.com/client9/misspell/case.go
new file mode 100644
index 00000000000..2ea3850dfa0
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/cmd/misspell/main.go b/vendor/github.com/client9/misspell/cmd/misspell/main.go
new file mode 100644
index 00000000000..174d79d882d
--- /dev/null
+++ b/vendor/github.com/client9/misspell/cmd/misspell/main.go
@@ -0,0 +1,326 @@
+// The misspell command corrects commonly misspelled English words in source files.
+package main
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "text/template"
+ "time"
+
+ "github.com/client9/misspell"
+)
+
+var (
+ defaultWrite *template.Template
+ defaultRead *template.Template
+
+ stdout *log.Logger
+ debug *log.Logger
+
+ version = "dev"
+)
+
+const (
+ // Note for gometalinter it must be "File:Line:Column: Msg"
+ // note space beteen ": Msg"
+ defaultWriteTmpl = `{{ .Filename }}:{{ .Line }}:{{ .Column }}: corrected "{{ .Original }}" to "{{ .Corrected }}"`
+ defaultReadTmpl = `{{ .Filename }}:{{ .Line }}:{{ .Column }}: "{{ .Original }}" is a misspelling of "{{ .Corrected }}"`
+ csvTmpl = `{{ printf "%q" .Filename }},{{ .Line }},{{ .Column }},{{ .Original }},{{ .Corrected }}`
+ csvHeader = `file,line,column,typo,corrected`
+ sqliteTmpl = `INSERT INTO misspell VALUES({{ printf "%q" .Filename }},{{ .Line }},{{ .Column }},{{ printf "%q" .Original }},{{ printf "%q" .Corrected }});`
+ sqliteHeader = `PRAGMA foreign_keys=OFF;
+BEGIN TRANSACTION;
+CREATE TABLE misspell(
+ "file" TEXT, "line" INTEGER, "column" INTEGER, "typo" TEXT, "corrected" TEXT
+);`
+ sqliteFooter = "COMMIT;"
+)
+
+func worker(writeit bool, r *misspell.Replacer, mode string, files <-chan string, results chan<- int) {
+ count := 0
+ for filename := range files {
+ orig, err := misspell.ReadTextFile(filename)
+ if err != nil {
+ log.Println(err)
+ continue
+ }
+ if len(orig) == 0 {
+ continue
+ }
+
+ debug.Printf("Processing %s", filename)
+
+ var updated string
+ var changes []misspell.Diff
+
+ if mode == "go" {
+ updated, changes = r.ReplaceGo(orig)
+ } else {
+ updated, changes = r.Replace(orig)
+ }
+
+ if len(changes) == 0 {
+ continue
+ }
+ count += len(changes)
+ for _, diff := range changes {
+ // add in filename
+ diff.Filename = filename
+
+ // output can be done by doing multiple goroutines
+ // and can clobber os.Stdout.
+ //
+ // the log package can be used simultaneously from multiple goroutines
+ var output bytes.Buffer
+ if writeit {
+ defaultWrite.Execute(&output, diff)
+ } else {
+ defaultRead.Execute(&output, diff)
+ }
+
+ // goroutine-safe print to os.Stdout
+ stdout.Println(output.String())
+ }
+
+ if writeit {
+ ioutil.WriteFile(filename, []byte(updated), 0)
+ }
+ }
+ results <- count
+}
+
+func main() {
+ t := time.Now()
+ var (
+ workers = flag.Int("j", 0, "Number of workers, 0 = number of CPUs")
+ writeit = flag.Bool("w", false, "Overwrite file with corrections (default is just to display)")
+ quietFlag = flag.Bool("q", false, "Do not emit misspelling output")
+ outFlag = flag.String("o", "stdout", "output file or [stderr|stdout|]")
+ format = flag.String("f", "", "'csv', 'sqlite3' or custom Golang template for output")
+ ignores = flag.String("i", "", "ignore the following corrections, comma separated")
+ locale = flag.String("locale", "", "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'")
+ mode = flag.String("source", "auto", "Source mode: auto=guess, go=golang source, text=plain or markdown-like text")
+ debugFlag = flag.Bool("debug", false, "Debug matching, very slow")
+ exitError = flag.Bool("error", false, "Exit with 2 if misspelling found")
+ showVersion = flag.Bool("v", false, "Show version and exit")
+
+ showLegal = flag.Bool("legal", false, "Show legal information and exit")
+ )
+ flag.Parse()
+
+ if *showVersion {
+ fmt.Println(version)
+ return
+ }
+ if *showLegal {
+ fmt.Println(misspell.Legal)
+ return
+ }
+ if *debugFlag {
+ debug = log.New(os.Stderr, "DEBUG ", 0)
+ } else {
+ debug = log.New(ioutil.Discard, "", 0)
+ }
+
+ r := misspell.Replacer{
+ Replacements: misspell.DictMain,
+ Debug: *debugFlag,
+ }
+ //
+ // Figure out regional variations
+ //
+ switch strings.ToUpper(*locale) {
+ case "":
+ // nothing
+ case "US":
+ r.AddRuleList(misspell.DictAmerican)
+ case "UK", "GB":
+ r.AddRuleList(misspell.DictBritish)
+ case "NZ", "AU", "CA":
+ log.Fatalf("Help wanted. https://github.com/client9/misspell/issues/6")
+ default:
+ log.Fatalf("Unknown locale: %q", *locale)
+ }
+
+ //
+ // Stuff to ignore
+ //
+ if len(*ignores) > 0 {
+ r.RemoveRule(strings.Split(*ignores, ","))
+ }
+
+ //
+ // Source input mode
+ //
+ switch *mode {
+ case "auto":
+ case "go":
+ case "text":
+ default:
+ log.Fatalf("Mode must be one of auto=guess, go=golang source, text=plain or markdown-like text")
+ }
+
+ //
+ // Custom output
+ //
+ switch {
+ case *format == "csv":
+ tmpl := template.Must(template.New("csv").Parse(csvTmpl))
+ defaultWrite = tmpl
+ defaultRead = tmpl
+ stdout.Println(csvHeader)
+ case *format == "sqlite" || *format == "sqlite3":
+ tmpl := template.Must(template.New("sqlite3").Parse(sqliteTmpl))
+ defaultWrite = tmpl
+ defaultRead = tmpl
+ stdout.Println(sqliteHeader)
+ case len(*format) > 0:
+ t, err := template.New("custom").Parse(*format)
+ if err != nil {
+ log.Fatalf("Unable to compile log format: %s", err)
+ }
+ defaultWrite = t
+ defaultRead = t
+ default: // format == ""
+ defaultWrite = template.Must(template.New("defaultWrite").Parse(defaultWriteTmpl))
+ defaultRead = template.Must(template.New("defaultRead").Parse(defaultReadTmpl))
+ }
+
+ // we cant't just write to os.Stdout directly since we have multiple goroutine
+ // all writing at the same time causing broken output. Log is routine safe.
+ // we see it so it doesn't use a prefix or include a time stamp.
+ switch {
+ case *quietFlag || *outFlag == "/dev/null":
+ stdout = log.New(ioutil.Discard, "", 0)
+ case *outFlag == "/dev/stderr" || *outFlag == "stderr":
+ stdout = log.New(os.Stderr, "", 0)
+ case *outFlag == "/dev/stdout" || *outFlag == "stdout":
+ stdout = log.New(os.Stdout, "", 0)
+ case *outFlag == "" || *outFlag == "-":
+ stdout = log.New(os.Stdout, "", 0)
+ default:
+ fo, err := os.Create(*outFlag)
+ if err != nil {
+ log.Fatalf("unable to create outfile %q: %s", *outFlag, err)
+ }
+ defer fo.Close()
+ stdout = log.New(fo, "", 0)
+ }
+
+ //
+ // Number of Workers / CPU to use
+ //
+ if *workers < 0 {
+ log.Fatalf("-j must >= 0")
+ }
+ if *workers == 0 {
+ *workers = runtime.NumCPU()
+ }
+ if *debugFlag {
+ *workers = 1
+ }
+
+ //
+ // Done with Flags.
+ // Compile the Replacer and process files
+ //
+ r.Compile()
+
+ args := flag.Args()
+ debug.Printf("initialization complete in %v", time.Since(t))
+
+ // stdin/stdout
+ if len(args) == 0 {
+ // if we are working with pipes/stdin/stdout
+ // there is no concurrency, so we can directly
+ // send data to the writers
+ var fileout io.Writer
+ var errout io.Writer
+ switch *writeit {
+ case true:
+ // if we ARE writing the corrected stream
+ // the corrected stream goes to stdout
+ // and the misspelling errors goes to stderr
+ // so we can do something like this:
+ // curl something | misspell -w | gzip > afile.gz
+ fileout = os.Stdout
+ errout = os.Stderr
+ case false:
+ // if we are not writing out the corrected stream
+ // then work just like files. Misspelling errors
+ // are sent to stdout
+ fileout = ioutil.Discard
+ errout = os.Stdout
+ }
+ count := 0
+ next := func(diff misspell.Diff) {
+ count++
+
+ // don't even evaluate the output templates
+ if *quietFlag {
+ return
+ }
+ diff.Filename = "stdin"
+ if *writeit {
+ defaultWrite.Execute(errout, diff)
+ } else {
+ defaultRead.Execute(errout, diff)
+ }
+ errout.Write([]byte{'\n'})
+
+ }
+ err := r.ReplaceReader(os.Stdin, fileout, next)
+ if err != nil {
+ os.Exit(1)
+ }
+ switch *format {
+ case "sqlite", "sqlite3":
+ fileout.Write([]byte(sqliteFooter))
+ }
+ if count != 0 && *exitError {
+ // error
+ os.Exit(2)
+ }
+ return
+ }
+
+ c := make(chan string, 64)
+ results := make(chan int, *workers)
+
+ for i := 0; i < *workers; i++ {
+ go worker(*writeit, &r, *mode, c, results)
+ }
+
+ for _, filename := range args {
+ filepath.Walk(filename, func(path string, info os.FileInfo, err error) error {
+ if err == nil && !info.IsDir() {
+ c <- path
+ }
+ return nil
+ })
+ }
+ close(c)
+
+ count := 0
+ for i := 0; i < *workers; i++ {
+ changed := <-results
+ count += changed
+ }
+
+ switch *format {
+ case "sqlite", "sqlite3":
+ stdout.Println(sqliteFooter)
+ }
+
+ if count != 0 && *exitError {
+ os.Exit(2)
+ }
+}
diff --git a/vendor/github.com/client9/misspell/goreleaser.yml b/vendor/github.com/client9/misspell/goreleaser.yml
new file mode 100644
index 00000000000..560cb3810c4
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/install-misspell.sh b/vendor/github.com/client9/misspell/install-misspell.sh
new file mode 100644
index 00000000000..8e0ff5d9470
--- /dev/null
+++ b/vendor/github.com/client9/misspell/install-misspell.sh
@@ -0,0 +1,318 @@
+#!/bin/sh
+set -e
+# Code generated by godownloader. DO NOT EDIT.
+#
+
+usage() {
+ this=$1
+ cat </dev/null
+}
+uname_os() {
+ os=$(uname -s | tr '[:upper:]' '[:lower:]')
+ 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
+ echo "$0: uname_os_check: internal error '$(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
+ echo "$0: uname_arch_check: internal error '$(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}" ;;
+ *)
+ echo "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
+ echo "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
+ giturl="https://api.github.com/repos/${owner_repo}/releases/latest"
+ html=$(github_api - "$giturl")
+ version=$(echo "$html" | grep -m 1 "\"tag_name\":" | cut -f4 -d'"')
+ 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
+ echo "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
+ echo "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
+ echo "hash_sha256_verify: unable to find checksum for '${TARGET}' in '${checksums}'"
+ return 1
+ fi
+ got=$(hash_sha256 "$TARGET")
+ if [ "$want" != "$got" ]; then
+ echo "hash_sha256_verify: checksum for '$TARGET' did not verify ${want} vs $got"
+ return 1
+ fi
+}
+cat /dev/null < 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/client9/misspell/notwords.go b/vendor/github.com/client9/misspell/notwords.go
new file mode 100644
index 00000000000..06d0d5a5adf
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/replace.go b/vendor/github.com/client9/misspell/replace.go
new file mode 100644
index 00000000000..a99bbcc582a
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/stringreplacer.go b/vendor/github.com/client9/misspell/stringreplacer.go
new file mode 100644
index 00000000000..3151eceb70f
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/stringreplacer_test.gox b/vendor/github.com/client9/misspell/stringreplacer_test.gox
new file mode 100644
index 00000000000..70da997f6e0
--- /dev/null
+++ b/vendor/github.com/client9/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(
+ "&", "&",
+ "<", "<",
+ ">", ">",
+ `"`, """,
+ "'", "'",
+)
+
+var htmlUnescaper = NewStringReplacer(
+ "&", "&",
+ "<", "<",
+ ">", ">",
+ """, `"`,
+ "'", "'",
+)
+
+// The http package's old HTML escaping function.
+func oldHTMLEscape(s string) string {
+ s = strings.Replace(s, "&", "&", -1)
+ s = strings.Replace(s, "<", "<", -1)
+ s = strings.Replace(s, ">", ">", -1)
+ s = strings.Replace(s, `"`, """, -1)
+ s = strings.Replace(s, "'", "'", -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 <3 escaping & stuff"},
+ testCase{htmlEscaper, "&&&", "&&&"},
+ 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, "&", "&"},
+ testCase{htmlUnescaper, "<b>HTML's neat</b>", "HTML's neat"},
+ 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's <b>HTML</b>!", 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/client9/misspell/url.go b/vendor/github.com/client9/misspell/url.go
new file mode 100644
index 00000000000..1a259f5f99c
--- /dev/null
+++ b/vendor/github.com/client9/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/client9/misspell/words.go b/vendor/github.com/client9/misspell/words.go
new file mode 100644
index 00000000000..c92dd19d040
--- /dev/null
+++ b/vendor/github.com/client9/misspell/words.go
@@ -0,0 +1,31158 @@
+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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "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",
+ "resovle", "resolve",
+ "respest", "respects",
+ "respone", "response",
+ "respwan", "respawn",
+ "ressits", "resists",
+ "restord", "restored",
+ "resuced", "rescued",
+ "resuces", "rescues",
+ "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",
+ "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í",
+ "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",
+ "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",
+ "sneeks", "sneaks",
+ "somene", "someone",
+ "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",
+ "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/fatih/color/.travis.yml b/vendor/github.com/fatih/color/.travis.yml
new file mode 100644
index 00000000000..95f8a1ff5c7
--- /dev/null
+++ b/vendor/github.com/fatih/color/.travis.yml
@@ -0,0 +1,5 @@
+language: go
+go:
+ - 1.8.x
+ - tip
+
diff --git a/vendor/github.com/fatih/color/Gopkg.lock b/vendor/github.com/fatih/color/Gopkg.lock
new file mode 100644
index 00000000000..7d879e9caf0
--- /dev/null
+++ b/vendor/github.com/fatih/color/Gopkg.lock
@@ -0,0 +1,27 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+ name = "github.com/mattn/go-colorable"
+ packages = ["."]
+ revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072"
+ version = "v0.0.9"
+
+[[projects]]
+ name = "github.com/mattn/go-isatty"
+ packages = ["."]
+ revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
+ version = "v0.0.3"
+
+[[projects]]
+ branch = "master"
+ name = "golang.org/x/sys"
+ packages = ["unix"]
+ revision = "37707fdb30a5b38865cfb95e5aab41707daec7fd"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ inputs-digest = "e8a50671c3cb93ea935bf210b1cd20702876b9d9226129be581ef646d1565cdc"
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/vendor/github.com/fatih/color/Gopkg.toml b/vendor/github.com/fatih/color/Gopkg.toml
new file mode 100644
index 00000000000..ff1617f71da
--- /dev/null
+++ b/vendor/github.com/fatih/color/Gopkg.toml
@@ -0,0 +1,30 @@
+
+# Gopkg.toml example
+#
+# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
+# 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"
+
+
+[[constraint]]
+ name = "github.com/mattn/go-colorable"
+ version = "0.0.9"
+
+[[constraint]]
+ name = "github.com/mattn/go-isatty"
+ version = "0.0.3"
diff --git a/vendor/github.com/fatih/color/LICENSE.md b/vendor/github.com/fatih/color/LICENSE.md
new file mode 100644
index 00000000000..25fdaf639df
--- /dev/null
+++ b/vendor/github.com/fatih/color/LICENSE.md
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 Fatih Arslan
+
+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/fatih/color/README.md b/vendor/github.com/fatih/color/README.md
new file mode 100644
index 00000000000..3fc95446028
--- /dev/null
+++ b/vendor/github.com/fatih/color/README.md
@@ -0,0 +1,179 @@
+# Color [![GoDoc](https://godoc.org/github.com/fatih/color?status.svg)](https://godoc.org/github.com/fatih/color) [![Build Status](https://img.shields.io/travis/fatih/color.svg?style=flat-square)](https://travis-ci.org/fatih/color)
+
+
+
+Color lets you use colorized outputs in terms of [ANSI Escape
+Codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors) in Go (Golang). It
+has support for Windows too! The API can be used in several ways, pick one that
+suits you.
+
+
+![Color](https://i.imgur.com/c1JI0lA.png)
+
+
+## Install
+
+```bash
+go get github.com/fatih/color
+```
+
+Note that the `vendor` folder is here for stability. Remove the folder if you
+already have the dependencies in your GOPATH.
+
+## Examples
+
+### Standard colors
+
+```go
+// Print with default helper functions
+color.Cyan("Prints text in cyan.")
+
+// A newline will be appended automatically
+color.Blue("Prints %s in blue.", "text")
+
+// These are using the default foreground colors
+color.Red("We have red")
+color.Magenta("And many others ..")
+
+```
+
+### Mix and reuse colors
+
+```go
+// Create a new color object
+c := color.New(color.FgCyan).Add(color.Underline)
+c.Println("Prints cyan text with an underline.")
+
+// Or just add them to New()
+d := color.New(color.FgCyan, color.Bold)
+d.Printf("This prints bold cyan %s\n", "too!.")
+
+// Mix up foreground and background colors, create new mixes!
+red := color.New(color.FgRed)
+
+boldRed := red.Add(color.Bold)
+boldRed.Println("This will print text in bold red.")
+
+whiteBackground := red.Add(color.BgWhite)
+whiteBackground.Println("Red text with white background.")
+```
+
+### Use your own output (io.Writer)
+
+```go
+// Use your own io.Writer output
+color.New(color.FgBlue).Fprintln(myWriter, "blue color!")
+
+blue := color.New(color.FgBlue)
+blue.Fprint(writer, "This will print text in blue.")
+```
+
+### Custom print functions (PrintFunc)
+
+```go
+// Create a custom print function for convenience
+red := color.New(color.FgRed).PrintfFunc()
+red("Warning")
+red("Error: %s", err)
+
+// Mix up multiple attributes
+notice := color.New(color.Bold, color.FgGreen).PrintlnFunc()
+notice("Don't forget this...")
+```
+
+### Custom fprint functions (FprintFunc)
+
+```go
+blue := color.New(FgBlue).FprintfFunc()
+blue(myWriter, "important notice: %s", stars)
+
+// Mix up with multiple attributes
+success := color.New(color.Bold, color.FgGreen).FprintlnFunc()
+success(myWriter, "Don't forget this...")
+```
+
+### Insert into noncolor strings (SprintFunc)
+
+```go
+// Create SprintXxx functions to mix strings with other non-colorized strings:
+yellow := color.New(color.FgYellow).SprintFunc()
+red := color.New(color.FgRed).SprintFunc()
+fmt.Printf("This is a %s and this is %s.\n", yellow("warning"), red("error"))
+
+info := color.New(color.FgWhite, color.BgGreen).SprintFunc()
+fmt.Printf("This %s rocks!\n", info("package"))
+
+// Use helper functions
+fmt.Println("This", color.RedString("warning"), "should be not neglected.")
+fmt.Printf("%v %v\n", color.GreenString("Info:"), "an important message.")
+
+// Windows supported too! Just don't forget to change the output to color.Output
+fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS"))
+```
+
+### Plug into existing code
+
+```go
+// Use handy standard colors
+color.Set(color.FgYellow)
+
+fmt.Println("Existing text will now be in yellow")
+fmt.Printf("This one %s\n", "too")
+
+color.Unset() // Don't forget to unset
+
+// You can mix up parameters
+color.Set(color.FgMagenta, color.Bold)
+defer color.Unset() // Use it in your function
+
+fmt.Println("All text will now be bold magenta.")
+```
+
+### Disable/Enable color
+
+There might be a case where you want to explicitly disable/enable color output. the
+`go-isatty` package will automatically disable color output for non-tty output streams
+(for example if the output were piped directly to `less`)
+
+`Color` has support to disable/enable colors both globally and for single color
+definitions. For example suppose you have a CLI app and a `--no-color` bool flag. You
+can easily disable the color output with:
+
+```go
+
+var flagNoColor = flag.Bool("no-color", false, "Disable color output")
+
+if *flagNoColor {
+ color.NoColor = true // disables colorized output
+}
+```
+
+It also has support for single color definitions (local). You can
+disable/enable color output on the fly:
+
+```go
+c := color.New(color.FgCyan)
+c.Println("Prints cyan text")
+
+c.DisableColor()
+c.Println("This is printed without any color")
+
+c.EnableColor()
+c.Println("This prints again cyan...")
+```
+
+## Todo
+
+* Save/Return previous values
+* Evaluate fmt.Formatter interface
+
+
+## Credits
+
+ * [Fatih Arslan](https://github.com/fatih)
+ * Windows support via @mattn: [colorable](https://github.com/mattn/go-colorable)
+
+## License
+
+The MIT License (MIT) - see [`LICENSE.md`](https://github.com/fatih/color/blob/master/LICENSE.md) for more details
+
diff --git a/vendor/github.com/fatih/color/color.go b/vendor/github.com/fatih/color/color.go
new file mode 100644
index 00000000000..b1f591d45f5
--- /dev/null
+++ b/vendor/github.com/fatih/color/color.go
@@ -0,0 +1,600 @@
+package color
+
+import (
+ "fmt"
+ "io"
+ "os"
+ "strconv"
+ "strings"
+ "sync"
+
+ "github.com/mattn/go-colorable"
+ "github.com/mattn/go-isatty"
+)
+
+var (
+ // NoColor defines if the output is colorized or not. It's dynamically set to
+ // false or true based on the stdout's file descriptor referring to a terminal
+ // or not. This is a global option and affects all colors. For more control
+ // over each color block use the methods DisableColor() individually.
+ NoColor = os.Getenv("TERM") == "dumb" ||
+ (!isatty.IsTerminal(os.Stdout.Fd()) && !isatty.IsCygwinTerminal(os.Stdout.Fd()))
+
+ // Output defines the standard output of the print functions. By default
+ // os.Stdout is used.
+ Output = colorable.NewColorableStdout()
+
+ // colorsCache is used to reduce the count of created Color objects and
+ // allows to reuse already created objects with required Attribute.
+ colorsCache = make(map[Attribute]*Color)
+ colorsCacheMu sync.Mutex // protects colorsCache
+)
+
+// Color defines a custom color object which is defined by SGR parameters.
+type Color struct {
+ params []Attribute
+ noColor *bool
+}
+
+// Attribute defines a single SGR Code
+type Attribute int
+
+const escape = "\x1b"
+
+// Base attributes
+const (
+ Reset Attribute = iota
+ Bold
+ Faint
+ Italic
+ Underline
+ BlinkSlow
+ BlinkRapid
+ ReverseVideo
+ Concealed
+ CrossedOut
+)
+
+// Foreground text colors
+const (
+ FgBlack Attribute = iota + 30
+ FgRed
+ FgGreen
+ FgYellow
+ FgBlue
+ FgMagenta
+ FgCyan
+ FgWhite
+)
+
+// Foreground Hi-Intensity text colors
+const (
+ FgHiBlack Attribute = iota + 90
+ FgHiRed
+ FgHiGreen
+ FgHiYellow
+ FgHiBlue
+ FgHiMagenta
+ FgHiCyan
+ FgHiWhite
+)
+
+// Background text colors
+const (
+ BgBlack Attribute = iota + 40
+ BgRed
+ BgGreen
+ BgYellow
+ BgBlue
+ BgMagenta
+ BgCyan
+ BgWhite
+)
+
+// Background Hi-Intensity text colors
+const (
+ BgHiBlack Attribute = iota + 100
+ BgHiRed
+ BgHiGreen
+ BgHiYellow
+ BgHiBlue
+ BgHiMagenta
+ BgHiCyan
+ BgHiWhite
+)
+
+// New returns a newly created color object.
+func New(value ...Attribute) *Color {
+ c := &Color{params: make([]Attribute, 0)}
+ c.Add(value...)
+ return c
+}
+
+// Set sets the given parameters immediately. It will change the color of
+// output with the given SGR parameters until color.Unset() is called.
+func Set(p ...Attribute) *Color {
+ c := New(p...)
+ c.Set()
+ return c
+}
+
+// Unset resets all escape attributes and clears the output. Usually should
+// be called after Set().
+func Unset() {
+ if NoColor {
+ return
+ }
+
+ fmt.Fprintf(Output, "%s[%dm", escape, Reset)
+}
+
+// Set sets the SGR sequence.
+func (c *Color) Set() *Color {
+ if c.isNoColorSet() {
+ return c
+ }
+
+ fmt.Fprintf(Output, c.format())
+ return c
+}
+
+func (c *Color) unset() {
+ if c.isNoColorSet() {
+ return
+ }
+
+ Unset()
+}
+
+func (c *Color) setWriter(w io.Writer) *Color {
+ if c.isNoColorSet() {
+ return c
+ }
+
+ fmt.Fprintf(w, c.format())
+ return c
+}
+
+func (c *Color) unsetWriter(w io.Writer) {
+ if c.isNoColorSet() {
+ return
+ }
+
+ if NoColor {
+ return
+ }
+
+ fmt.Fprintf(w, "%s[%dm", escape, Reset)
+}
+
+// Add is used to chain SGR parameters. Use as many as parameters to combine
+// and create custom color objects. Example: Add(color.FgRed, color.Underline).
+func (c *Color) Add(value ...Attribute) *Color {
+ c.params = append(c.params, value...)
+ return c
+}
+
+func (c *Color) prepend(value Attribute) {
+ c.params = append(c.params, 0)
+ copy(c.params[1:], c.params[0:])
+ c.params[0] = value
+}
+
+// Fprint formats using the default formats for its operands and writes to w.
+// Spaces are added between operands when neither is a string.
+// It returns the number of bytes written and any write error encountered.
+// On Windows, users should wrap w with colorable.NewColorable() if w is of
+// type *os.File.
+func (c *Color) Fprint(w io.Writer, a ...interface{}) (n int, err error) {
+ c.setWriter(w)
+ defer c.unsetWriter(w)
+
+ return fmt.Fprint(w, a...)
+}
+
+// Print formats using the default formats for its operands and writes to
+// standard output. Spaces are added between operands when neither is a
+// string. It returns the number of bytes written and any write error
+// encountered. This is the standard fmt.Print() method wrapped with the given
+// color.
+func (c *Color) Print(a ...interface{}) (n int, err error) {
+ c.Set()
+ defer c.unset()
+
+ return fmt.Fprint(Output, a...)
+}
+
+// Fprintf formats according to a format specifier and writes to w.
+// It returns the number of bytes written and any write error encountered.
+// On Windows, users should wrap w with colorable.NewColorable() if w is of
+// type *os.File.
+func (c *Color) Fprintf(w io.Writer, format string, a ...interface{}) (n int, err error) {
+ c.setWriter(w)
+ defer c.unsetWriter(w)
+
+ return fmt.Fprintf(w, format, a...)
+}
+
+// Printf formats according to a format specifier and writes to standard output.
+// It returns the number of bytes written and any write error encountered.
+// This is the standard fmt.Printf() method wrapped with the given color.
+func (c *Color) Printf(format string, a ...interface{}) (n int, err error) {
+ c.Set()
+ defer c.unset()
+
+ return fmt.Fprintf(Output, format, a...)
+}
+
+// Fprintln formats using the default formats for its operands and writes to w.
+// Spaces are always added between operands and a newline is appended.
+// On Windows, users should wrap w with colorable.NewColorable() if w is of
+// type *os.File.
+func (c *Color) Fprintln(w io.Writer, a ...interface{}) (n int, err error) {
+ c.setWriter(w)
+ defer c.unsetWriter(w)
+
+ return fmt.Fprintln(w, a...)
+}
+
+// Println formats using the default formats for its operands and writes to
+// standard output. Spaces are always added between operands and a newline is
+// appended. It returns the number of bytes written and any write error
+// encountered. This is the standard fmt.Print() method wrapped with the given
+// color.
+func (c *Color) Println(a ...interface{}) (n int, err error) {
+ c.Set()
+ defer c.unset()
+
+ return fmt.Fprintln(Output, a...)
+}
+
+// Sprint is just like Print, but returns a string instead of printing it.
+func (c *Color) Sprint(a ...interface{}) string {
+ return c.wrap(fmt.Sprint(a...))
+}
+
+// Sprintln is just like Println, but returns a string instead of printing it.
+func (c *Color) Sprintln(a ...interface{}) string {
+ return c.wrap(fmt.Sprintln(a...))
+}
+
+// Sprintf is just like Printf, but returns a string instead of printing it.
+func (c *Color) Sprintf(format string, a ...interface{}) string {
+ return c.wrap(fmt.Sprintf(format, a...))
+}
+
+// FprintFunc returns a new function that prints the passed arguments as
+// colorized with color.Fprint().
+func (c *Color) FprintFunc() func(w io.Writer, a ...interface{}) {
+ return func(w io.Writer, a ...interface{}) {
+ c.Fprint(w, a...)
+ }
+}
+
+// PrintFunc returns a new function that prints the passed arguments as
+// colorized with color.Print().
+func (c *Color) PrintFunc() func(a ...interface{}) {
+ return func(a ...interface{}) {
+ c.Print(a...)
+ }
+}
+
+// FprintfFunc returns a new function that prints the passed arguments as
+// colorized with color.Fprintf().
+func (c *Color) FprintfFunc() func(w io.Writer, format string, a ...interface{}) {
+ return func(w io.Writer, format string, a ...interface{}) {
+ c.Fprintf(w, format, a...)
+ }
+}
+
+// PrintfFunc returns a new function that prints the passed arguments as
+// colorized with color.Printf().
+func (c *Color) PrintfFunc() func(format string, a ...interface{}) {
+ return func(format string, a ...interface{}) {
+ c.Printf(format, a...)
+ }
+}
+
+// FprintlnFunc returns a new function that prints the passed arguments as
+// colorized with color.Fprintln().
+func (c *Color) FprintlnFunc() func(w io.Writer, a ...interface{}) {
+ return func(w io.Writer, a ...interface{}) {
+ c.Fprintln(w, a...)
+ }
+}
+
+// PrintlnFunc returns a new function that prints the passed arguments as
+// colorized with color.Println().
+func (c *Color) PrintlnFunc() func(a ...interface{}) {
+ return func(a ...interface{}) {
+ c.Println(a...)
+ }
+}
+
+// SprintFunc returns a new function that returns colorized strings for the
+// given arguments with fmt.Sprint(). Useful to put into or mix into other
+// string. Windows users should use this in conjunction with color.Output, example:
+//
+// put := New(FgYellow).SprintFunc()
+// fmt.Fprintf(color.Output, "This is a %s", put("warning"))
+func (c *Color) SprintFunc() func(a ...interface{}) string {
+ return func(a ...interface{}) string {
+ return c.wrap(fmt.Sprint(a...))
+ }
+}
+
+// SprintfFunc returns a new function that returns colorized strings for the
+// given arguments with fmt.Sprintf(). Useful to put into or mix into other
+// string. Windows users should use this in conjunction with color.Output.
+func (c *Color) SprintfFunc() func(format string, a ...interface{}) string {
+ return func(format string, a ...interface{}) string {
+ return c.wrap(fmt.Sprintf(format, a...))
+ }
+}
+
+// SprintlnFunc returns a new function that returns colorized strings for the
+// given arguments with fmt.Sprintln(). Useful to put into or mix into other
+// string. Windows users should use this in conjunction with color.Output.
+func (c *Color) SprintlnFunc() func(a ...interface{}) string {
+ return func(a ...interface{}) string {
+ return c.wrap(fmt.Sprintln(a...))
+ }
+}
+
+// sequence returns a formatted SGR sequence to be plugged into a "\x1b[...m"
+// an example output might be: "1;36" -> bold cyan
+func (c *Color) sequence() string {
+ format := make([]string, len(c.params))
+ for i, v := range c.params {
+ format[i] = strconv.Itoa(int(v))
+ }
+
+ return strings.Join(format, ";")
+}
+
+// wrap wraps the s string with the colors attributes. The string is ready to
+// be printed.
+func (c *Color) wrap(s string) string {
+ if c.isNoColorSet() {
+ return s
+ }
+
+ return c.format() + s + c.unformat()
+}
+
+func (c *Color) format() string {
+ return fmt.Sprintf("%s[%sm", escape, c.sequence())
+}
+
+func (c *Color) unformat() string {
+ return fmt.Sprintf("%s[%dm", escape, Reset)
+}
+
+// DisableColor disables the color output. Useful to not change any existing
+// code and still being able to output. Can be used for flags like
+// "--no-color". To enable back use EnableColor() method.
+func (c *Color) DisableColor() {
+ c.noColor = boolPtr(true)
+}
+
+// EnableColor enables the color output. Use it in conjunction with
+// DisableColor(). Otherwise this method has no side effects.
+func (c *Color) EnableColor() {
+ c.noColor = boolPtr(false)
+}
+
+func (c *Color) isNoColorSet() bool {
+ // check first if we have user setted action
+ if c.noColor != nil {
+ return *c.noColor
+ }
+
+ // if not return the global option, which is disabled by default
+ return NoColor
+}
+
+// Equals returns a boolean value indicating whether two colors are equal.
+func (c *Color) Equals(c2 *Color) bool {
+ if len(c.params) != len(c2.params) {
+ return false
+ }
+
+ for _, attr := range c.params {
+ if !c2.attrExists(attr) {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (c *Color) attrExists(a Attribute) bool {
+ for _, attr := range c.params {
+ if attr == a {
+ return true
+ }
+ }
+
+ return false
+}
+
+func boolPtr(v bool) *bool {
+ return &v
+}
+
+func getCachedColor(p Attribute) *Color {
+ colorsCacheMu.Lock()
+ defer colorsCacheMu.Unlock()
+
+ c, ok := colorsCache[p]
+ if !ok {
+ c = New(p)
+ colorsCache[p] = c
+ }
+
+ return c
+}
+
+func colorPrint(format string, p Attribute, a ...interface{}) {
+ c := getCachedColor(p)
+
+ if !strings.HasSuffix(format, "\n") {
+ format += "\n"
+ }
+
+ if len(a) == 0 {
+ c.Print(format)
+ } else {
+ c.Printf(format, a...)
+ }
+}
+
+func colorString(format string, p Attribute, a ...interface{}) string {
+ c := getCachedColor(p)
+
+ if len(a) == 0 {
+ return c.SprintFunc()(format)
+ }
+
+ return c.SprintfFunc()(format, a...)
+}
+
+// Black is a convenient helper function to print with black foreground. A
+// newline is appended to format by default.
+func Black(format string, a ...interface{}) { colorPrint(format, FgBlack, a...) }
+
+// Red is a convenient helper function to print with red foreground. A
+// newline is appended to format by default.
+func Red(format string, a ...interface{}) { colorPrint(format, FgRed, a...) }
+
+// Green is a convenient helper function to print with green foreground. A
+// newline is appended to format by default.
+func Green(format string, a ...interface{}) { colorPrint(format, FgGreen, a...) }
+
+// Yellow is a convenient helper function to print with yellow foreground.
+// A newline is appended to format by default.
+func Yellow(format string, a ...interface{}) { colorPrint(format, FgYellow, a...) }
+
+// Blue is a convenient helper function to print with blue foreground. A
+// newline is appended to format by default.
+func Blue(format string, a ...interface{}) { colorPrint(format, FgBlue, a...) }
+
+// Magenta is a convenient helper function to print with magenta foreground.
+// A newline is appended to format by default.
+func Magenta(format string, a ...interface{}) { colorPrint(format, FgMagenta, a...) }
+
+// Cyan is a convenient helper function to print with cyan foreground. A
+// newline is appended to format by default.
+func Cyan(format string, a ...interface{}) { colorPrint(format, FgCyan, a...) }
+
+// White is a convenient helper function to print with white foreground. A
+// newline is appended to format by default.
+func White(format string, a ...interface{}) { colorPrint(format, FgWhite, a...) }
+
+// BlackString is a convenient helper function to return a string with black
+// foreground.
+func BlackString(format string, a ...interface{}) string { return colorString(format, FgBlack, a...) }
+
+// RedString is a convenient helper function to return a string with red
+// foreground.
+func RedString(format string, a ...interface{}) string { return colorString(format, FgRed, a...) }
+
+// GreenString is a convenient helper function to return a string with green
+// foreground.
+func GreenString(format string, a ...interface{}) string { return colorString(format, FgGreen, a...) }
+
+// YellowString is a convenient helper function to return a string with yellow
+// foreground.
+func YellowString(format string, a ...interface{}) string { return colorString(format, FgYellow, a...) }
+
+// BlueString is a convenient helper function to return a string with blue
+// foreground.
+func BlueString(format string, a ...interface{}) string { return colorString(format, FgBlue, a...) }
+
+// MagentaString is a convenient helper function to return a string with magenta
+// foreground.
+func MagentaString(format string, a ...interface{}) string {
+ return colorString(format, FgMagenta, a...)
+}
+
+// CyanString is a convenient helper function to return a string with cyan
+// foreground.
+func CyanString(format string, a ...interface{}) string { return colorString(format, FgCyan, a...) }
+
+// WhiteString is a convenient helper function to return a string with white
+// foreground.
+func WhiteString(format string, a ...interface{}) string { return colorString(format, FgWhite, a...) }
+
+// HiBlack is a convenient helper function to print with hi-intensity black foreground. A
+// newline is appended to format by default.
+func HiBlack(format string, a ...interface{}) { colorPrint(format, FgHiBlack, a...) }
+
+// HiRed is a convenient helper function to print with hi-intensity red foreground. A
+// newline is appended to format by default.
+func HiRed(format string, a ...interface{}) { colorPrint(format, FgHiRed, a...) }
+
+// HiGreen is a convenient helper function to print with hi-intensity green foreground. A
+// newline is appended to format by default.
+func HiGreen(format string, a ...interface{}) { colorPrint(format, FgHiGreen, a...) }
+
+// HiYellow is a convenient helper function to print with hi-intensity yellow foreground.
+// A newline is appended to format by default.
+func HiYellow(format string, a ...interface{}) { colorPrint(format, FgHiYellow, a...) }
+
+// HiBlue is a convenient helper function to print with hi-intensity blue foreground. A
+// newline is appended to format by default.
+func HiBlue(format string, a ...interface{}) { colorPrint(format, FgHiBlue, a...) }
+
+// HiMagenta is a convenient helper function to print with hi-intensity magenta foreground.
+// A newline is appended to format by default.
+func HiMagenta(format string, a ...interface{}) { colorPrint(format, FgHiMagenta, a...) }
+
+// HiCyan is a convenient helper function to print with hi-intensity cyan foreground. A
+// newline is appended to format by default.
+func HiCyan(format string, a ...interface{}) { colorPrint(format, FgHiCyan, a...) }
+
+// HiWhite is a convenient helper function to print with hi-intensity white foreground. A
+// newline is appended to format by default.
+func HiWhite(format string, a ...interface{}) { colorPrint(format, FgHiWhite, a...) }
+
+// HiBlackString is a convenient helper function to return a string with hi-intensity black
+// foreground.
+func HiBlackString(format string, a ...interface{}) string {
+ return colorString(format, FgHiBlack, a...)
+}
+
+// HiRedString is a convenient helper function to return a string with hi-intensity red
+// foreground.
+func HiRedString(format string, a ...interface{}) string { return colorString(format, FgHiRed, a...) }
+
+// HiGreenString is a convenient helper function to return a string with hi-intensity green
+// foreground.
+func HiGreenString(format string, a ...interface{}) string {
+ return colorString(format, FgHiGreen, a...)
+}
+
+// HiYellowString is a convenient helper function to return a string with hi-intensity yellow
+// foreground.
+func HiYellowString(format string, a ...interface{}) string {
+ return colorString(format, FgHiYellow, a...)
+}
+
+// HiBlueString is a convenient helper function to return a string with hi-intensity blue
+// foreground.
+func HiBlueString(format string, a ...interface{}) string { return colorString(format, FgHiBlue, a...) }
+
+// HiMagentaString is a convenient helper function to return a string with hi-intensity magenta
+// foreground.
+func HiMagentaString(format string, a ...interface{}) string {
+ return colorString(format, FgHiMagenta, a...)
+}
+
+// HiCyanString is a convenient helper function to return a string with hi-intensity cyan
+// foreground.
+func HiCyanString(format string, a ...interface{}) string { return colorString(format, FgHiCyan, a...) }
+
+// HiWhiteString is a convenient helper function to return a string with hi-intensity white
+// foreground.
+func HiWhiteString(format string, a ...interface{}) string {
+ return colorString(format, FgHiWhite, a...)
+}
diff --git a/vendor/github.com/fatih/color/doc.go b/vendor/github.com/fatih/color/doc.go
new file mode 100644
index 00000000000..cf1e96500f4
--- /dev/null
+++ b/vendor/github.com/fatih/color/doc.go
@@ -0,0 +1,133 @@
+/*
+Package color is an ANSI color package to output colorized or SGR defined
+output to the standard output. The API can be used in several way, pick one
+that suits you.
+
+Use simple and default helper functions with predefined foreground colors:
+
+ color.Cyan("Prints text in cyan.")
+
+ // a newline will be appended automatically
+ color.Blue("Prints %s in blue.", "text")
+
+ // More default foreground colors..
+ color.Red("We have red")
+ color.Yellow("Yellow color too!")
+ color.Magenta("And many others ..")
+
+ // Hi-intensity colors
+ color.HiGreen("Bright green color.")
+ color.HiBlack("Bright black means gray..")
+ color.HiWhite("Shiny white color!")
+
+However there are times where custom color mixes are required. Below are some
+examples to create custom color objects and use the print functions of each
+separate color object.
+
+ // Create a new color object
+ c := color.New(color.FgCyan).Add(color.Underline)
+ c.Println("Prints cyan text with an underline.")
+
+ // Or just add them to New()
+ d := color.New(color.FgCyan, color.Bold)
+ d.Printf("This prints bold cyan %s\n", "too!.")
+
+
+ // Mix up foreground and background colors, create new mixes!
+ red := color.New(color.FgRed)
+
+ boldRed := red.Add(color.Bold)
+ boldRed.Println("This will print text in bold red.")
+
+ whiteBackground := red.Add(color.BgWhite)
+ whiteBackground.Println("Red text with White background.")
+
+ // Use your own io.Writer output
+ color.New(color.FgBlue).Fprintln(myWriter, "blue color!")
+
+ blue := color.New(color.FgBlue)
+ blue.Fprint(myWriter, "This will print text in blue.")
+
+You can create PrintXxx functions to simplify even more:
+
+ // Create a custom print function for convenient
+ red := color.New(color.FgRed).PrintfFunc()
+ red("warning")
+ red("error: %s", err)
+
+ // Mix up multiple attributes
+ notice := color.New(color.Bold, color.FgGreen).PrintlnFunc()
+ notice("don't forget this...")
+
+You can also FprintXxx functions to pass your own io.Writer:
+
+ blue := color.New(FgBlue).FprintfFunc()
+ blue(myWriter, "important notice: %s", stars)
+
+ // Mix up with multiple attributes
+ success := color.New(color.Bold, color.FgGreen).FprintlnFunc()
+ success(myWriter, don't forget this...")
+
+
+Or create SprintXxx functions to mix strings with other non-colorized strings:
+
+ yellow := New(FgYellow).SprintFunc()
+ red := New(FgRed).SprintFunc()
+
+ fmt.Printf("this is a %s and this is %s.\n", yellow("warning"), red("error"))
+
+ info := New(FgWhite, BgGreen).SprintFunc()
+ fmt.Printf("this %s rocks!\n", info("package"))
+
+Windows support is enabled by default. All Print functions work as intended.
+However only for color.SprintXXX functions, user should use fmt.FprintXXX and
+set the output to color.Output:
+
+ fmt.Fprintf(color.Output, "Windows support: %s", color.GreenString("PASS"))
+
+ info := New(FgWhite, BgGreen).SprintFunc()
+ fmt.Fprintf(color.Output, "this %s rocks!\n", info("package"))
+
+Using with existing code is possible. Just use the Set() method to set the
+standard output to the given parameters. That way a rewrite of an existing
+code is not required.
+
+ // Use handy standard colors.
+ color.Set(color.FgYellow)
+
+ fmt.Println("Existing text will be now in Yellow")
+ fmt.Printf("This one %s\n", "too")
+
+ color.Unset() // don't forget to unset
+
+ // You can mix up parameters
+ color.Set(color.FgMagenta, color.Bold)
+ defer color.Unset() // use it in your function
+
+ fmt.Println("All text will be now bold magenta.")
+
+There might be a case where you want to disable color output (for example to
+pipe the standard output of your app to somewhere else). `Color` has support to
+disable colors both globally and for single color definition. For example
+suppose you have a CLI app and a `--no-color` bool flag. You can easily disable
+the color output with:
+
+ var flagNoColor = flag.Bool("no-color", false, "Disable color output")
+
+ if *flagNoColor {
+ color.NoColor = true // disables colorized output
+ }
+
+It also has support for single color definitions (local). You can
+disable/enable color output on the fly:
+
+ c := color.New(color.FgCyan)
+ c.Println("Prints cyan text")
+
+ c.DisableColor()
+ c.Println("This is printed without any color")
+
+ c.EnableColor()
+ c.Println("This prints again cyan...")
+*/
+package color
diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig
new file mode 100644
index 00000000000..ba49e3c2349
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/.editorconfig
@@ -0,0 +1,5 @@
+root = true
+
+[*]
+indent_style = tab
+indent_size = 4
diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore
new file mode 100644
index 00000000000..4cd0cbaf432
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/.gitignore
@@ -0,0 +1,6 @@
+# Setup a Global .gitignore for OS and editor generated files:
+# https://help.github.com/articles/ignoring-files
+# git config --global core.excludesfile ~/.gitignore_global
+
+.vagrant
+*.sublime-project
diff --git a/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/fsnotify/fsnotify/.travis.yml
new file mode 100644
index 00000000000..981d1bb8132
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/.travis.yml
@@ -0,0 +1,30 @@
+sudo: false
+language: go
+
+go:
+ - 1.8.x
+ - 1.9.x
+ - tip
+
+matrix:
+ allow_failures:
+ - go: tip
+ fast_finish: true
+
+before_script:
+ - go get -u github.com/golang/lint/golint
+
+script:
+ - go test -v --race ./...
+
+after_script:
+ - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
+ - test -z "$(golint ./... | tee /dev/stderr)"
+ - go vet ./...
+
+os:
+ - linux
+ - osx
+
+notifications:
+ email: false
diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS
new file mode 100644
index 00000000000..5ab5d41c547
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/AUTHORS
@@ -0,0 +1,52 @@
+# Names should be added to this file as
+# Name or Organization
+# The email address is not required for organizations.
+
+# You can update this list using the following command:
+#
+# $ git shortlog -se | awk '{print $2 " " $3 " " $4}'
+
+# Please keep the list sorted.
+
+Aaron L
+Adrien Bustany
+Amit Krishnan
+Anmol Sethi
+Bjørn Erik Pedersen
+Bruno Bigras
+Caleb Spare
+Case Nelson
+Chris Howey
+Christoffer Buchholz
+Daniel Wagner-Hall
+Dave Cheney
+Evan Phoenix
+Francisco Souza
+Hari haran
+John C Barstow
+Kelvin Fo
+Ken-ichirou MATSUZAWA
+Matt Layher
+Nathan Youngman
+Nickolai Zeldovich
+Patrick
+Paul Hammond
+Pawel Knap
+Pieter Droogendijk
+Pursuit92
+Riku Voipio
+Rob Figueiredo
+Rodrigo Chiossi
+Slawek Ligus
+Soge Zhang
+Tiffany Jernigan
+Tilak Sharma
+Tom Payne
+Travis Cline
+Tudor Golubenco
+Vahe Khachikyan
+Yukang
+bronze1man
+debrando
+henrikedwards
+铁哥
diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
new file mode 100644
index 00000000000..be4d7ea2c14
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md
@@ -0,0 +1,317 @@
+# Changelog
+
+## v1.4.7 / 2018-01-09
+
+* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine)
+* Tests: Fix missing verb on format string (thanks @rchiossi)
+* Linux: Fix deadlock in Remove (thanks @aarondl)
+* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne)
+* Docs: Moved FAQ into the README (thanks @vahe)
+* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich)
+* Docs: replace references to OS X with macOS
+
+## v1.4.2 / 2016-10-10
+
+* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack)
+
+## v1.4.1 / 2016-10-04
+
+* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack)
+
+## v1.4.0 / 2016-10-01
+
+* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie)
+
+## v1.3.1 / 2016-06-28
+
+* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc)
+
+## v1.3.0 / 2016-04-19
+
+* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135)
+
+## v1.2.10 / 2016-03-02
+
+* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj)
+
+## v1.2.9 / 2016-01-13
+
+kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep)
+
+## v1.2.8 / 2015-12-17
+
+* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test)
+* inotify: fix race in test
+* enable race detection for continuous integration (Linux, Mac, Windows)
+
+## v1.2.5 / 2015-10-17
+
+* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
+* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken)
+* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie)
+* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion)
+
+## v1.2.1 / 2015-10-14
+
+* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx)
+
+## v1.2.0 / 2015-02-08
+
+* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD)
+* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD)
+* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59)
+
+## v1.1.1 / 2015-02-05
+
+* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD)
+
+## v1.1.0 / 2014-12-12
+
+* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43)
+ * add low-level functions
+ * only need to store flags on directories
+ * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13)
+ * done can be an unbuffered channel
+ * remove calls to os.NewSyscallError
+* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher)
+* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48)
+* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
+
+## v1.0.4 / 2014-09-07
+
+* kqueue: add dragonfly to the build tags.
+* Rename source code files, rearrange code so exported APIs are at the top.
+* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang)
+
+## v1.0.3 / 2014-08-19
+
+* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36)
+
+## v1.0.2 / 2014-08-17
+
+* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
+* [Fix] Make ./path and path equivalent. (thanks @zhsso)
+
+## v1.0.0 / 2014-08-15
+
+* [API] Remove AddWatch on Windows, use Add.
+* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30)
+* Minor updates based on feedback from golint.
+
+## dev / 2014-07-09
+
+* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify).
+* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno)
+
+## dev / 2014-07-04
+
+* kqueue: fix incorrect mutex used in Close()
+* Update example to demonstrate usage of Op.
+
+## dev / 2014-06-28
+
+* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4)
+* Fix for String() method on Event (thanks Alex Brainman)
+* Don't build on Plan 9 or Solaris (thanks @4ad)
+
+## dev / 2014-06-21
+
+* Events channel of type Event rather than *Event.
+* [internal] use syscall constants directly for inotify and kqueue.
+* [internal] kqueue: rename events to kevents and fileEvent to event.
+
+## dev / 2014-06-19
+
+* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally).
+* [internal] remove cookie from Event struct (unused).
+* [internal] Event struct has the same definition across every OS.
+* [internal] remove internal watch and removeWatch methods.
+
+## dev / 2014-06-12
+
+* [API] Renamed Watch() to Add() and RemoveWatch() to Remove().
+* [API] Pluralized channel names: Events and Errors.
+* [API] Renamed FileEvent struct to Event.
+* [API] Op constants replace methods like IsCreate().
+
+## dev / 2014-06-12
+
+* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
+
+## dev / 2014-05-23
+
+* [API] Remove current implementation of WatchFlags.
+ * current implementation doesn't take advantage of OS for efficiency
+ * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes
+ * no tests for the current implementation
+ * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195)
+
+## v0.9.3 / 2014-12-31
+
+* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51)
+
+## v0.9.2 / 2014-08-17
+
+* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso)
+
+## v0.9.1 / 2014-06-12
+
+* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98)
+
+## v0.9.0 / 2014-01-17
+
+* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany)
+* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare)
+* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library.
+
+## v0.8.12 / 2013-11-13
+
+* [API] Remove FD_SET and friends from Linux adapter
+
+## v0.8.11 / 2013-11-02
+
+* [Doc] Add Changelog [#72][] (thanks @nathany)
+* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond)
+
+## v0.8.10 / 2013-10-19
+
+* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott)
+* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer)
+* [Doc] specify OS-specific limits in README (thanks @debrando)
+
+## v0.8.9 / 2013-09-08
+
+* [Doc] Contributing (thanks @nathany)
+* [Doc] update package path in example code [#63][] (thanks @paulhammond)
+* [Doc] GoCI badge in README (Linux only) [#60][]
+* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany)
+
+## v0.8.8 / 2013-06-17
+
+* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie)
+
+## v0.8.7 / 2013-06-03
+
+* [API] Make syscall flags internal
+* [Fix] inotify: ignore event changes
+* [Fix] race in symlink test [#45][] (reported by @srid)
+* [Fix] tests on Windows
+* lower case error messages
+
+## v0.8.6 / 2013-05-23
+
+* kqueue: Use EVT_ONLY flag on Darwin
+* [Doc] Update README with full example
+
+## v0.8.5 / 2013-05-09
+
+* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg)
+
+## v0.8.4 / 2013-04-07
+
+* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz)
+
+## v0.8.3 / 2013-03-13
+
+* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin)
+* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin)
+
+## v0.8.2 / 2013-02-07
+
+* [Doc] add Authors
+* [Fix] fix data races for map access [#29][] (thanks @fsouza)
+
+## v0.8.1 / 2013-01-09
+
+* [Fix] Windows path separators
+* [Doc] BSD License
+
+## v0.8.0 / 2012-11-09
+
+* kqueue: directory watching improvements (thanks @vmirage)
+* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto)
+* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr)
+
+## v0.7.4 / 2012-10-09
+
+* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji)
+* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig)
+* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig)
+* [Fix] kqueue: modify after recreation of file
+
+## v0.7.3 / 2012-09-27
+
+* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage)
+* [Fix] kqueue: no longer get duplicate CREATE events
+
+## v0.7.2 / 2012-09-01
+
+* kqueue: events for created directories
+
+## v0.7.1 / 2012-07-14
+
+* [Fix] for renaming files
+
+## v0.7.0 / 2012-07-02
+
+* [Feature] FSNotify flags
+* [Fix] inotify: Added file name back to event path
+
+## v0.6.0 / 2012-06-06
+
+* kqueue: watch files after directory created (thanks @tmc)
+
+## v0.5.1 / 2012-05-22
+
+* [Fix] inotify: remove all watches before Close()
+
+## v0.5.0 / 2012-05-03
+
+* [API] kqueue: return errors during watch instead of sending over channel
+* kqueue: match symlink behavior on Linux
+* inotify: add `DELETE_SELF` (requested by @taralx)
+* [Fix] kqueue: handle EINTR (reported by @robfig)
+* [Doc] Godoc example [#1][] (thanks @davecheney)
+
+## v0.4.0 / 2012-03-30
+
+* Go 1 released: build with go tool
+* [Feature] Windows support using winfsnotify
+* Windows does not have attribute change notifications
+* Roll attribute notifications into IsModify
+
+## v0.3.0 / 2012-02-19
+
+* kqueue: add files when watch directory
+
+## v0.2.0 / 2011-12-30
+
+* update to latest Go weekly code
+
+## v0.1.0 / 2011-10-19
+
+* kqueue: add watch on file creation to match inotify
+* kqueue: create file event
+* inotify: ignore `IN_IGNORED` events
+* event String()
+* linux: common FileEvent functions
+* initial commit
+
+[#79]: https://github.com/howeyc/fsnotify/pull/79
+[#77]: https://github.com/howeyc/fsnotify/pull/77
+[#72]: https://github.com/howeyc/fsnotify/issues/72
+[#71]: https://github.com/howeyc/fsnotify/issues/71
+[#70]: https://github.com/howeyc/fsnotify/issues/70
+[#63]: https://github.com/howeyc/fsnotify/issues/63
+[#62]: https://github.com/howeyc/fsnotify/issues/62
+[#60]: https://github.com/howeyc/fsnotify/issues/60
+[#59]: https://github.com/howeyc/fsnotify/issues/59
+[#49]: https://github.com/howeyc/fsnotify/issues/49
+[#45]: https://github.com/howeyc/fsnotify/issues/45
+[#40]: https://github.com/howeyc/fsnotify/issues/40
+[#36]: https://github.com/howeyc/fsnotify/issues/36
+[#33]: https://github.com/howeyc/fsnotify/issues/33
+[#29]: https://github.com/howeyc/fsnotify/issues/29
+[#25]: https://github.com/howeyc/fsnotify/issues/25
+[#24]: https://github.com/howeyc/fsnotify/issues/24
+[#21]: https://github.com/howeyc/fsnotify/issues/21
diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
new file mode 100644
index 00000000000..828a60b24ba
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md
@@ -0,0 +1,77 @@
+# Contributing
+
+## Issues
+
+* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues).
+* Please indicate the platform you are using fsnotify on.
+* A code example to reproduce the problem is appreciated.
+
+## Pull Requests
+
+### Contributor License Agreement
+
+fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual).
+
+Please indicate that you have signed the CLA in your pull request.
+
+### How fsnotify is Developed
+
+* Development is done on feature branches.
+* Tests are run on BSD, Linux, macOS and Windows.
+* Pull requests are reviewed and [applied to master][am] using [hub][].
+ * Maintainers may modify or squash commits rather than asking contributors to.
+* To issue a new release, the maintainers will:
+ * Update the CHANGELOG
+ * Tag a version, which will become available through gopkg.in.
+
+### How to Fork
+
+For smooth sailing, always use the original import path. Installing with `go get` makes this easy.
+
+1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`)
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Ensure everything works and the tests pass (see below)
+4. Commit your changes (`git commit -am 'Add some feature'`)
+
+Contribute upstream:
+
+1. Fork fsnotify on GitHub
+2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`)
+3. Push to the branch (`git push fork my-new-feature`)
+4. Create a new Pull Request on GitHub
+
+This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/).
+
+### Testing
+
+fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows.
+
+Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on.
+
+To aid in cross-platform testing there is a Vagrantfile for Linux and BSD.
+
+* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/)
+* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder.
+* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password)
+* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`.
+* When you're done, you will want to halt or destroy the Vagrant boxes.
+
+Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory.
+
+Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads).
+
+### Maintainers
+
+Help maintaining fsnotify is welcome. To be a maintainer:
+
+* Submit a pull request and sign the CLA as above.
+* You must be able to run the test suite on Mac, Windows, Linux and BSD.
+
+To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][].
+
+All code changes should be internal pull requests.
+
+Releases are tagged using [Semantic Versioning](http://semver.org/).
+
+[hub]: https://github.com/github/hub
+[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs
diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE
new file mode 100644
index 00000000000..f21e5408009
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2012 The Go Authors. All rights reserved.
+Copyright (c) 2012 fsnotify 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/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md
new file mode 100644
index 00000000000..3993207413a
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/README.md
@@ -0,0 +1,79 @@
+# File system notifications for Go
+
+[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify)
+
+fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running:
+
+```console
+go get -u golang.org/x/sys/...
+```
+
+Cross platform: Windows, Linux, BSD and macOS.
+
+|Adapter |OS |Status |
+|----------|----------|----------|
+|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)|
+|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)|
+|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
+|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)|
+|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)|
+|fanotify |Linux 2.6.37+ | |
+|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)|
+|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)|
+
+\* Android and iOS are untested.
+
+Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information.
+
+## API stability
+
+fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA).
+
+All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number.
+
+Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`.
+
+## Contributing
+
+Please refer to [CONTRIBUTING][] before opening an issue or pull request.
+
+## Example
+
+See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go).
+
+## FAQ
+
+**When a file is moved to another directory is it still being watched?**
+
+No (it shouldn't be, unless you are watching where it was moved to).
+
+**When I watch a directory, are all subdirectories watched as well?**
+
+No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]).
+
+**Do I have to watch the Error and Event channels in a separate goroutine?**
+
+As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7])
+
+**Why am I receiving multiple events for the same file on OS X?**
+
+Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]).
+
+**How many files can be watched at once?**
+
+There are OS-specific limits as to how many watches can be created:
+* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error.
+* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error.
+
+[#62]: https://github.com/howeyc/fsnotify/issues/62
+[#18]: https://github.com/fsnotify/fsnotify/issues/18
+[#11]: https://github.com/fsnotify/fsnotify/issues/11
+[#7]: https://github.com/howeyc/fsnotify/issues/7
+
+[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md
+
+## Related Projects
+
+* [notify](https://github.com/rjeczalik/notify)
+* [fsevents](https://github.com/fsnotify/fsevents)
+
diff --git a/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/fsnotify/fsnotify/fen.go
new file mode 100644
index 00000000000..ced39cb881e
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/fen.go
@@ -0,0 +1,37 @@
+// 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.
+
+// +build solaris
+
+package fsnotify
+
+import (
+ "errors"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ return nil, errors.New("FEN based watcher not yet supported for fsnotify\n")
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ return nil
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ return nil
+}
+
+// Remove stops watching the the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ return nil
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
new file mode 100644
index 00000000000..190bf0de575
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/fsnotify.go
@@ -0,0 +1,66 @@
+// Copyright 2012 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 !plan9
+
+// Package fsnotify provides a platform-independent interface for file system notifications.
+package fsnotify
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+)
+
+// Event represents a single file system notification.
+type Event struct {
+ Name string // Relative path to the file or directory.
+ Op Op // File operation that triggered the event.
+}
+
+// Op describes a set of file operations.
+type Op uint32
+
+// These are the generalized file operations that can trigger a notification.
+const (
+ Create Op = 1 << iota
+ Write
+ Remove
+ Rename
+ Chmod
+)
+
+func (op Op) String() string {
+ // Use a buffer for efficient string concatenation
+ var buffer bytes.Buffer
+
+ if op&Create == Create {
+ buffer.WriteString("|CREATE")
+ }
+ if op&Remove == Remove {
+ buffer.WriteString("|REMOVE")
+ }
+ if op&Write == Write {
+ buffer.WriteString("|WRITE")
+ }
+ if op&Rename == Rename {
+ buffer.WriteString("|RENAME")
+ }
+ if op&Chmod == Chmod {
+ buffer.WriteString("|CHMOD")
+ }
+ if buffer.Len() == 0 {
+ return ""
+ }
+ return buffer.String()[1:] // Strip leading pipe
+}
+
+// String returns a string representation of the event in the form
+// "file: REMOVE|WRITE|..."
+func (e Event) String() string {
+ return fmt.Sprintf("%q: %s", e.Name, e.Op.String())
+}
+
+// Common errors that can be reported by a watcher
+var ErrEventOverflow = errors.New("fsnotify queue overflow")
diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go
new file mode 100644
index 00000000000..d9fd1b88a05
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/inotify.go
@@ -0,0 +1,337 @@
+// 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.
+
+// +build linux
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "sync"
+ "unsafe"
+
+ "golang.org/x/sys/unix"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+ mu sync.Mutex // Map access
+ fd int
+ poller *fdPoller
+ watches map[string]*watch // Map of inotify watches (key: path)
+ paths map[int]string // Map of watched paths (key: watch descriptor)
+ done chan struct{} // Channel for sending a "quit message" to the reader goroutine
+ doneResp chan struct{} // Channel to respond to Close
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ // Create inotify fd
+ fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC)
+ if fd == -1 {
+ return nil, errno
+ }
+ // Create epoll
+ poller, err := newFdPoller(fd)
+ if err != nil {
+ unix.Close(fd)
+ return nil, err
+ }
+ w := &Watcher{
+ fd: fd,
+ poller: poller,
+ watches: make(map[string]*watch),
+ paths: make(map[int]string),
+ Events: make(chan Event),
+ Errors: make(chan error),
+ done: make(chan struct{}),
+ doneResp: make(chan struct{}),
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+func (w *Watcher) isClosed() bool {
+ select {
+ case <-w.done:
+ return true
+ default:
+ return false
+ }
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ if w.isClosed() {
+ return nil
+ }
+
+ // Send 'close' signal to goroutine, and set the Watcher to closed.
+ close(w.done)
+
+ // Wake up goroutine
+ w.poller.wake()
+
+ // Wait for goroutine to close
+ <-w.doneResp
+
+ return nil
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ name = filepath.Clean(name)
+ if w.isClosed() {
+ return errors.New("inotify instance already closed")
+ }
+
+ const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM |
+ unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY |
+ unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF
+
+ var flags uint32 = agnosticEvents
+
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ watchEntry := w.watches[name]
+ if watchEntry != nil {
+ flags |= watchEntry.flags | unix.IN_MASK_ADD
+ }
+ wd, errno := unix.InotifyAddWatch(w.fd, name, flags)
+ if wd == -1 {
+ return errno
+ }
+
+ if watchEntry == nil {
+ w.watches[name] = &watch{wd: uint32(wd), flags: flags}
+ w.paths[wd] = name
+ } else {
+ watchEntry.wd = uint32(wd)
+ watchEntry.flags = flags
+ }
+
+ return nil
+}
+
+// Remove stops watching the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ name = filepath.Clean(name)
+
+ // Fetch the watch.
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ watch, ok := w.watches[name]
+
+ // Remove it from inotify.
+ if !ok {
+ return fmt.Errorf("can't remove non-existent inotify watch for: %s", name)
+ }
+
+ // We successfully removed the watch if InotifyRmWatch doesn't return an
+ // error, we need to clean up our internal state to ensure it matches
+ // inotify's kernel state.
+ delete(w.paths, int(watch.wd))
+ delete(w.watches, name)
+
+ // inotify_rm_watch will return EINVAL if the file has been deleted;
+ // the inotify will already have been removed.
+ // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously
+ // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE
+ // so that EINVAL means that the wd is being rm_watch()ed or its file removed
+ // by another thread and we have not received IN_IGNORE event.
+ success, errno := unix.InotifyRmWatch(w.fd, watch.wd)
+ if success == -1 {
+ // TODO: Perhaps it's not helpful to return an error here in every case.
+ // the only two possible errors are:
+ // EBADF, which happens when w.fd is not a valid file descriptor of any kind.
+ // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor.
+ // Watch descriptors are invalidated when they are removed explicitly or implicitly;
+ // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted.
+ return errno
+ }
+
+ return nil
+}
+
+type watch struct {
+ wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall)
+ flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags)
+}
+
+// readEvents reads from the inotify file descriptor, converts the
+// received events into Event objects and sends them via the Events channel
+func (w *Watcher) readEvents() {
+ var (
+ buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events
+ n int // Number of bytes read with read()
+ errno error // Syscall errno
+ ok bool // For poller.wait
+ )
+
+ defer close(w.doneResp)
+ defer close(w.Errors)
+ defer close(w.Events)
+ defer unix.Close(w.fd)
+ defer w.poller.close()
+
+ for {
+ // See if we have been closed.
+ if w.isClosed() {
+ return
+ }
+
+ ok, errno = w.poller.wait()
+ if errno != nil {
+ select {
+ case w.Errors <- errno:
+ case <-w.done:
+ return
+ }
+ continue
+ }
+
+ if !ok {
+ continue
+ }
+
+ n, errno = unix.Read(w.fd, buf[:])
+ // If a signal interrupted execution, see if we've been asked to close, and try again.
+ // http://man7.org/linux/man-pages/man7/signal.7.html :
+ // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable"
+ if errno == unix.EINTR {
+ continue
+ }
+
+ // unix.Read might have been woken up by Close. If so, we're done.
+ if w.isClosed() {
+ return
+ }
+
+ if n < unix.SizeofInotifyEvent {
+ var err error
+ if n == 0 {
+ // If EOF is received. This should really never happen.
+ err = io.EOF
+ } else if n < 0 {
+ // If an error occurred while reading.
+ err = errno
+ } else {
+ // Read was too short.
+ err = errors.New("notify: short read in readEvents()")
+ }
+ select {
+ case w.Errors <- err:
+ case <-w.done:
+ return
+ }
+ continue
+ }
+
+ var offset uint32
+ // We don't know how many events we just read into the buffer
+ // While the offset points to at least one whole event...
+ for offset <= uint32(n-unix.SizeofInotifyEvent) {
+ // Point "raw" to the event in the buffer
+ raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset]))
+
+ mask := uint32(raw.Mask)
+ nameLen := uint32(raw.Len)
+
+ if mask&unix.IN_Q_OVERFLOW != 0 {
+ select {
+ case w.Errors <- ErrEventOverflow:
+ case <-w.done:
+ return
+ }
+ }
+
+ // If the event happened to the watched directory or the watched file, the kernel
+ // doesn't append the filename to the event, but we would like to always fill the
+ // the "Name" field with a valid filename. We retrieve the path of the watch from
+ // the "paths" map.
+ w.mu.Lock()
+ name, ok := w.paths[int(raw.Wd)]
+ // IN_DELETE_SELF occurs when the file/directory being watched is removed.
+ // This is a sign to clean up the maps, otherwise we are no longer in sync
+ // with the inotify kernel state which has already deleted the watch
+ // automatically.
+ if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF {
+ delete(w.paths, int(raw.Wd))
+ delete(w.watches, name)
+ }
+ w.mu.Unlock()
+
+ if nameLen > 0 {
+ // Point "bytes" at the first byte of the filename
+ bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent]))
+ // The filename is padded with NULL bytes. TrimRight() gets rid of those.
+ name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000")
+ }
+
+ event := newEvent(name, mask)
+
+ // Send the events that are not ignored on the events channel
+ if !event.ignoreLinux(mask) {
+ select {
+ case w.Events <- event:
+ case <-w.done:
+ return
+ }
+ }
+
+ // Move to the next event in the buffer
+ offset += unix.SizeofInotifyEvent + nameLen
+ }
+ }
+}
+
+// Certain types of events can be "ignored" and not sent over the Events
+// channel. Such as events marked ignore by the kernel, or MODIFY events
+// against files that do not exist.
+func (e *Event) ignoreLinux(mask uint32) bool {
+ // Ignore anything the inotify API says to ignore
+ if mask&unix.IN_IGNORED == unix.IN_IGNORED {
+ return true
+ }
+
+ // If the event is not a DELETE or RENAME, the file must exist.
+ // Otherwise the event is ignored.
+ // *Note*: this was put in place because it was seen that a MODIFY
+ // event was sent after the DELETE. This ignores that MODIFY and
+ // assumes a DELETE will come or has come if the file doesn't exist.
+ if !(e.Op&Remove == Remove || e.Op&Rename == Rename) {
+ _, statErr := os.Lstat(e.Name)
+ return os.IsNotExist(statErr)
+ }
+ return false
+}
+
+// newEvent returns an platform-independent Event based on an inotify mask.
+func newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO {
+ e.Op |= Create
+ }
+ if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE {
+ e.Op |= Remove
+ }
+ if mask&unix.IN_MODIFY == unix.IN_MODIFY {
+ e.Op |= Write
+ }
+ if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM {
+ e.Op |= Rename
+ }
+ if mask&unix.IN_ATTRIB == unix.IN_ATTRIB {
+ e.Op |= Chmod
+ }
+ return e
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go
new file mode 100644
index 00000000000..cc7db4b22ef
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go
@@ -0,0 +1,187 @@
+// 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.
+
+// +build linux
+
+package fsnotify
+
+import (
+ "errors"
+
+ "golang.org/x/sys/unix"
+)
+
+type fdPoller struct {
+ fd int // File descriptor (as returned by the inotify_init() syscall)
+ epfd int // Epoll file descriptor
+ pipe [2]int // Pipe for waking up
+}
+
+func emptyPoller(fd int) *fdPoller {
+ poller := new(fdPoller)
+ poller.fd = fd
+ poller.epfd = -1
+ poller.pipe[0] = -1
+ poller.pipe[1] = -1
+ return poller
+}
+
+// Create a new inotify poller.
+// This creates an inotify handler, and an epoll handler.
+func newFdPoller(fd int) (*fdPoller, error) {
+ var errno error
+ poller := emptyPoller(fd)
+ defer func() {
+ if errno != nil {
+ poller.close()
+ }
+ }()
+ poller.fd = fd
+
+ // Create epoll fd
+ poller.epfd, errno = unix.EpollCreate1(0)
+ if poller.epfd == -1 {
+ return nil, errno
+ }
+ // Create pipe; pipe[0] is the read end, pipe[1] the write end.
+ errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK)
+ if errno != nil {
+ return nil, errno
+ }
+
+ // Register inotify fd with epoll
+ event := unix.EpollEvent{
+ Fd: int32(poller.fd),
+ Events: unix.EPOLLIN,
+ }
+ errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event)
+ if errno != nil {
+ return nil, errno
+ }
+
+ // Register pipe fd with epoll
+ event = unix.EpollEvent{
+ Fd: int32(poller.pipe[0]),
+ Events: unix.EPOLLIN,
+ }
+ errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event)
+ if errno != nil {
+ return nil, errno
+ }
+
+ return poller, nil
+}
+
+// Wait using epoll.
+// Returns true if something is ready to be read,
+// false if there is not.
+func (poller *fdPoller) wait() (bool, error) {
+ // 3 possible events per fd, and 2 fds, makes a maximum of 6 events.
+ // I don't know whether epoll_wait returns the number of events returned,
+ // or the total number of events ready.
+ // I decided to catch both by making the buffer one larger than the maximum.
+ events := make([]unix.EpollEvent, 7)
+ for {
+ n, errno := unix.EpollWait(poller.epfd, events, -1)
+ if n == -1 {
+ if errno == unix.EINTR {
+ continue
+ }
+ return false, errno
+ }
+ if n == 0 {
+ // If there are no events, try again.
+ continue
+ }
+ if n > 6 {
+ // This should never happen. More events were returned than should be possible.
+ return false, errors.New("epoll_wait returned more events than I know what to do with")
+ }
+ ready := events[:n]
+ epollhup := false
+ epollerr := false
+ epollin := false
+ for _, event := range ready {
+ if event.Fd == int32(poller.fd) {
+ if event.Events&unix.EPOLLHUP != 0 {
+ // This should not happen, but if it does, treat it as a wakeup.
+ epollhup = true
+ }
+ if event.Events&unix.EPOLLERR != 0 {
+ // If an error is waiting on the file descriptor, we should pretend
+ // something is ready to read, and let unix.Read pick up the error.
+ epollerr = true
+ }
+ if event.Events&unix.EPOLLIN != 0 {
+ // There is data to read.
+ epollin = true
+ }
+ }
+ if event.Fd == int32(poller.pipe[0]) {
+ if event.Events&unix.EPOLLHUP != 0 {
+ // Write pipe descriptor was closed, by us. This means we're closing down the
+ // watcher, and we should wake up.
+ }
+ if event.Events&unix.EPOLLERR != 0 {
+ // If an error is waiting on the pipe file descriptor.
+ // This is an absolute mystery, and should never ever happen.
+ return false, errors.New("Error on the pipe descriptor.")
+ }
+ if event.Events&unix.EPOLLIN != 0 {
+ // This is a regular wakeup, so we have to clear the buffer.
+ err := poller.clearWake()
+ if err != nil {
+ return false, err
+ }
+ }
+ }
+ }
+
+ if epollhup || epollerr || epollin {
+ return true, nil
+ }
+ return false, nil
+ }
+}
+
+// Close the write end of the poller.
+func (poller *fdPoller) wake() error {
+ buf := make([]byte, 1)
+ n, errno := unix.Write(poller.pipe[1], buf)
+ if n == -1 {
+ if errno == unix.EAGAIN {
+ // Buffer is full, poller will wake.
+ return nil
+ }
+ return errno
+ }
+ return nil
+}
+
+func (poller *fdPoller) clearWake() error {
+ // You have to be woken up a LOT in order to get to 100!
+ buf := make([]byte, 100)
+ n, errno := unix.Read(poller.pipe[0], buf)
+ if n == -1 {
+ if errno == unix.EAGAIN {
+ // Buffer is empty, someone else cleared our wake.
+ return nil
+ }
+ return errno
+ }
+ return nil
+}
+
+// Close all poller file descriptors, but not the one passed to it.
+func (poller *fdPoller) close() {
+ if poller.pipe[1] != -1 {
+ unix.Close(poller.pipe[1])
+ }
+ if poller.pipe[0] != -1 {
+ unix.Close(poller.pipe[0])
+ }
+ if poller.epfd != -1 {
+ unix.Close(poller.epfd)
+ }
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go
new file mode 100644
index 00000000000..86e76a3d676
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/kqueue.go
@@ -0,0 +1,521 @@
+// 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.
+
+// +build freebsd openbsd netbsd dragonfly darwin
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sync"
+ "time"
+
+ "golang.org/x/sys/unix"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+ done chan struct{} // Channel for sending a "quit message" to the reader goroutine
+
+ kq int // File descriptor (as returned by the kqueue() syscall).
+
+ mu sync.Mutex // Protects access to watcher data
+ watches map[string]int // Map of watched file descriptors (key: path).
+ externalWatches map[string]bool // Map of watches added by user of the library.
+ dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue.
+ paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events.
+ fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events).
+ isClosed bool // Set to true when Close() is first called
+}
+
+type pathInfo struct {
+ name string
+ isDir bool
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ kq, err := kqueue()
+ if err != nil {
+ return nil, err
+ }
+
+ w := &Watcher{
+ kq: kq,
+ watches: make(map[string]int),
+ dirFlags: make(map[string]uint32),
+ paths: make(map[int]pathInfo),
+ fileExists: make(map[string]bool),
+ externalWatches: make(map[string]bool),
+ Events: make(chan Event),
+ Errors: make(chan error),
+ done: make(chan struct{}),
+ }
+
+ go w.readEvents()
+ return w, nil
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ w.mu.Lock()
+ if w.isClosed {
+ w.mu.Unlock()
+ return nil
+ }
+ w.isClosed = true
+
+ // copy paths to remove while locked
+ var pathsToRemove = make([]string, 0, len(w.watches))
+ for name := range w.watches {
+ pathsToRemove = append(pathsToRemove, name)
+ }
+ w.mu.Unlock()
+ // unlock before calling Remove, which also locks
+
+ for _, name := range pathsToRemove {
+ w.Remove(name)
+ }
+
+ // send a "quit" message to the reader goroutine
+ close(w.done)
+
+ return nil
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ w.mu.Lock()
+ w.externalWatches[name] = true
+ w.mu.Unlock()
+ _, err := w.addWatch(name, noteAllEvents)
+ return err
+}
+
+// Remove stops watching the the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ name = filepath.Clean(name)
+ w.mu.Lock()
+ watchfd, ok := w.watches[name]
+ w.mu.Unlock()
+ if !ok {
+ return fmt.Errorf("can't remove non-existent kevent watch for: %s", name)
+ }
+
+ const registerRemove = unix.EV_DELETE
+ if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil {
+ return err
+ }
+
+ unix.Close(watchfd)
+
+ w.mu.Lock()
+ isDir := w.paths[watchfd].isDir
+ delete(w.watches, name)
+ delete(w.paths, watchfd)
+ delete(w.dirFlags, name)
+ w.mu.Unlock()
+
+ // Find all watched paths that are in this directory that are not external.
+ if isDir {
+ var pathsToRemove []string
+ w.mu.Lock()
+ for _, path := range w.paths {
+ wdir, _ := filepath.Split(path.name)
+ if filepath.Clean(wdir) == name {
+ if !w.externalWatches[path.name] {
+ pathsToRemove = append(pathsToRemove, path.name)
+ }
+ }
+ }
+ w.mu.Unlock()
+ for _, name := range pathsToRemove {
+ // Since these are internal, not much sense in propagating error
+ // to the user, as that will just confuse them with an error about
+ // a path they did not explicitly watch themselves.
+ w.Remove(name)
+ }
+ }
+
+ return nil
+}
+
+// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE)
+const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME
+
+// keventWaitTime to block on each read from kevent
+var keventWaitTime = durationToTimespec(100 * time.Millisecond)
+
+// addWatch adds name to the watched file set.
+// The flags are interpreted as described in kevent(2).
+// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks.
+func (w *Watcher) addWatch(name string, flags uint32) (string, error) {
+ var isDir bool
+ // Make ./name and name equivalent
+ name = filepath.Clean(name)
+
+ w.mu.Lock()
+ if w.isClosed {
+ w.mu.Unlock()
+ return "", errors.New("kevent instance already closed")
+ }
+ watchfd, alreadyWatching := w.watches[name]
+ // We already have a watch, but we can still override flags.
+ if alreadyWatching {
+ isDir = w.paths[watchfd].isDir
+ }
+ w.mu.Unlock()
+
+ if !alreadyWatching {
+ fi, err := os.Lstat(name)
+ if err != nil {
+ return "", err
+ }
+
+ // Don't watch sockets.
+ if fi.Mode()&os.ModeSocket == os.ModeSocket {
+ return "", nil
+ }
+
+ // Don't watch named pipes.
+ if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe {
+ return "", nil
+ }
+
+ // Follow Symlinks
+ // Unfortunately, Linux can add bogus symlinks to watch list without
+ // issue, and Windows can't do symlinks period (AFAIK). To maintain
+ // consistency, we will act like everything is fine. There will simply
+ // be no file events for broken symlinks.
+ // Hence the returns of nil on errors.
+ if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
+ name, err = filepath.EvalSymlinks(name)
+ if err != nil {
+ return "", nil
+ }
+
+ w.mu.Lock()
+ _, alreadyWatching = w.watches[name]
+ w.mu.Unlock()
+
+ if alreadyWatching {
+ return name, nil
+ }
+
+ fi, err = os.Lstat(name)
+ if err != nil {
+ return "", nil
+ }
+ }
+
+ watchfd, err = unix.Open(name, openMode, 0700)
+ if watchfd == -1 {
+ return "", err
+ }
+
+ isDir = fi.IsDir()
+ }
+
+ const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE
+ if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil {
+ unix.Close(watchfd)
+ return "", err
+ }
+
+ if !alreadyWatching {
+ w.mu.Lock()
+ w.watches[name] = watchfd
+ w.paths[watchfd] = pathInfo{name: name, isDir: isDir}
+ w.mu.Unlock()
+ }
+
+ if isDir {
+ // Watch the directory if it has not been watched before,
+ // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
+ w.mu.Lock()
+
+ watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE &&
+ (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE)
+ // Store flags so this watch can be updated later
+ w.dirFlags[name] = flags
+ w.mu.Unlock()
+
+ if watchDir {
+ if err := w.watchDirectoryFiles(name); err != nil {
+ return "", err
+ }
+ }
+ }
+ return name, nil
+}
+
+// readEvents reads from kqueue and converts the received kevents into
+// Event values that it sends down the Events channel.
+func (w *Watcher) readEvents() {
+ eventBuffer := make([]unix.Kevent_t, 10)
+
+loop:
+ for {
+ // See if there is a message on the "done" channel
+ select {
+ case <-w.done:
+ break loop
+ default:
+ }
+
+ // Get new events
+ kevents, err := read(w.kq, eventBuffer, &keventWaitTime)
+ // EINTR is okay, the syscall was interrupted before timeout expired.
+ if err != nil && err != unix.EINTR {
+ select {
+ case w.Errors <- err:
+ case <-w.done:
+ break loop
+ }
+ continue
+ }
+
+ // Flush the events we received to the Events channel
+ for len(kevents) > 0 {
+ kevent := &kevents[0]
+ watchfd := int(kevent.Ident)
+ mask := uint32(kevent.Fflags)
+ w.mu.Lock()
+ path := w.paths[watchfd]
+ w.mu.Unlock()
+ event := newEvent(path.name, mask)
+
+ if path.isDir && !(event.Op&Remove == Remove) {
+ // Double check to make sure the directory exists. This can happen when
+ // we do a rm -fr on a recursively watched folders and we receive a
+ // modification event first but the folder has been deleted and later
+ // receive the delete event
+ if _, err := os.Lstat(event.Name); os.IsNotExist(err) {
+ // mark is as delete event
+ event.Op |= Remove
+ }
+ }
+
+ if event.Op&Rename == Rename || event.Op&Remove == Remove {
+ w.Remove(event.Name)
+ w.mu.Lock()
+ delete(w.fileExists, event.Name)
+ w.mu.Unlock()
+ }
+
+ if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) {
+ w.sendDirectoryChangeEvents(event.Name)
+ } else {
+ // Send the event on the Events channel.
+ select {
+ case w.Events <- event:
+ case <-w.done:
+ break loop
+ }
+ }
+
+ if event.Op&Remove == Remove {
+ // Look for a file that may have overwritten this.
+ // For example, mv f1 f2 will delete f2, then create f2.
+ if path.isDir {
+ fileDir := filepath.Clean(event.Name)
+ w.mu.Lock()
+ _, found := w.watches[fileDir]
+ w.mu.Unlock()
+ if found {
+ // make sure the directory exists before we watch for changes. When we
+ // do a recursive watch and perform rm -fr, the parent directory might
+ // have gone missing, ignore the missing directory and let the
+ // upcoming delete event remove the watch from the parent directory.
+ if _, err := os.Lstat(fileDir); err == nil {
+ w.sendDirectoryChangeEvents(fileDir)
+ }
+ }
+ } else {
+ filePath := filepath.Clean(event.Name)
+ if fileInfo, err := os.Lstat(filePath); err == nil {
+ w.sendFileCreatedEventIfNew(filePath, fileInfo)
+ }
+ }
+ }
+
+ // Move to next event
+ kevents = kevents[1:]
+ }
+ }
+
+ // cleanup
+ err := unix.Close(w.kq)
+ if err != nil {
+ // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors.
+ select {
+ case w.Errors <- err:
+ default:
+ }
+ }
+ close(w.Events)
+ close(w.Errors)
+}
+
+// newEvent returns an platform-independent Event based on kqueue Fflags.
+func newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&unix.NOTE_DELETE == unix.NOTE_DELETE {
+ e.Op |= Remove
+ }
+ if mask&unix.NOTE_WRITE == unix.NOTE_WRITE {
+ e.Op |= Write
+ }
+ if mask&unix.NOTE_RENAME == unix.NOTE_RENAME {
+ e.Op |= Rename
+ }
+ if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB {
+ e.Op |= Chmod
+ }
+ return e
+}
+
+func newCreateEvent(name string) Event {
+ return Event{Name: name, Op: Create}
+}
+
+// watchDirectoryFiles to mimic inotify when adding a watch on a directory
+func (w *Watcher) watchDirectoryFiles(dirPath string) error {
+ // Get all files
+ files, err := ioutil.ReadDir(dirPath)
+ if err != nil {
+ return err
+ }
+
+ for _, fileInfo := range files {
+ filePath := filepath.Join(dirPath, fileInfo.Name())
+ filePath, err = w.internalWatch(filePath, fileInfo)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ w.fileExists[filePath] = true
+ w.mu.Unlock()
+ }
+
+ return nil
+}
+
+// sendDirectoryEvents searches the directory for newly created files
+// and sends them over the event channel. This functionality is to have
+// the BSD version of fsnotify match Linux inotify which provides a
+// create event for files created in a watched directory.
+func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
+ // Get all files
+ files, err := ioutil.ReadDir(dirPath)
+ if err != nil {
+ select {
+ case w.Errors <- err:
+ case <-w.done:
+ return
+ }
+ }
+
+ // Search for new files
+ for _, fileInfo := range files {
+ filePath := filepath.Join(dirPath, fileInfo.Name())
+ err := w.sendFileCreatedEventIfNew(filePath, fileInfo)
+
+ if err != nil {
+ return
+ }
+ }
+}
+
+// sendFileCreatedEvent sends a create event if the file isn't already being tracked.
+func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) {
+ w.mu.Lock()
+ _, doesExist := w.fileExists[filePath]
+ w.mu.Unlock()
+ if !doesExist {
+ // Send create event
+ select {
+ case w.Events <- newCreateEvent(filePath):
+ case <-w.done:
+ return
+ }
+ }
+
+ // like watchDirectoryFiles (but without doing another ReadDir)
+ filePath, err = w.internalWatch(filePath, fileInfo)
+ if err != nil {
+ return err
+ }
+
+ w.mu.Lock()
+ w.fileExists[filePath] = true
+ w.mu.Unlock()
+
+ return nil
+}
+
+func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) {
+ if fileInfo.IsDir() {
+ // mimic Linux providing delete events for subdirectories
+ // but preserve the flags used if currently watching subdirectory
+ w.mu.Lock()
+ flags := w.dirFlags[name]
+ w.mu.Unlock()
+
+ flags |= unix.NOTE_DELETE | unix.NOTE_RENAME
+ return w.addWatch(name, flags)
+ }
+
+ // watch file to mimic Linux inotify
+ return w.addWatch(name, noteAllEvents)
+}
+
+// kqueue creates a new kernel event queue and returns a descriptor.
+func kqueue() (kq int, err error) {
+ kq, err = unix.Kqueue()
+ if kq == -1 {
+ return kq, err
+ }
+ return kq, nil
+}
+
+// register events with the queue
+func register(kq int, fds []int, flags int, fflags uint32) error {
+ changes := make([]unix.Kevent_t, len(fds))
+
+ for i, fd := range fds {
+ // SetKevent converts int to the platform-specific types:
+ unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags)
+ changes[i].Fflags = fflags
+ }
+
+ // register the events
+ success, err := unix.Kevent(kq, changes, nil, nil)
+ if success == -1 {
+ return err
+ }
+ return nil
+}
+
+// read retrieves pending events, or waits until an event occurs.
+// A timeout of nil blocks indefinitely, while 0 polls the queue.
+func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) {
+ n, err := unix.Kevent(kq, nil, events, timeout)
+ if err != nil {
+ return nil, err
+ }
+ return events[0:n], nil
+}
+
+// durationToTimespec prepares a timeout value
+func durationToTimespec(d time.Duration) unix.Timespec {
+ return unix.NsecToTimespec(d.Nanoseconds())
+}
diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
new file mode 100644
index 00000000000..7d8de14513e
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go
@@ -0,0 +1,11 @@
+// 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.
+
+// +build freebsd openbsd netbsd dragonfly
+
+package fsnotify
+
+import "golang.org/x/sys/unix"
+
+const openMode = unix.O_NONBLOCK | unix.O_RDONLY
diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
new file mode 100644
index 00000000000..9139e17161b
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go
@@ -0,0 +1,12 @@
+// 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.
+
+// +build darwin
+
+package fsnotify
+
+import "golang.org/x/sys/unix"
+
+// note: this constant is not defined on BSD
+const openMode = unix.O_EVTONLY
diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go
new file mode 100644
index 00000000000..09436f31d82
--- /dev/null
+++ b/vendor/github.com/fsnotify/fsnotify/windows.go
@@ -0,0 +1,561 @@
+// 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.
+
+// +build windows
+
+package fsnotify
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "sync"
+ "syscall"
+ "unsafe"
+)
+
+// Watcher watches a set of files, delivering events to a channel.
+type Watcher struct {
+ Events chan Event
+ Errors chan error
+ isClosed bool // Set to true when Close() is first called
+ mu sync.Mutex // Map access
+ port syscall.Handle // Handle to completion port
+ watches watchMap // Map of watches (key: i-number)
+ input chan *input // Inputs to the reader are sent on this channel
+ quit chan chan<- error
+}
+
+// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events.
+func NewWatcher() (*Watcher, error) {
+ port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0)
+ if e != nil {
+ return nil, os.NewSyscallError("CreateIoCompletionPort", e)
+ }
+ w := &Watcher{
+ port: port,
+ watches: make(watchMap),
+ input: make(chan *input, 1),
+ Events: make(chan Event, 50),
+ Errors: make(chan error),
+ quit: make(chan chan<- error, 1),
+ }
+ go w.readEvents()
+ return w, nil
+}
+
+// Close removes all watches and closes the events channel.
+func (w *Watcher) Close() error {
+ if w.isClosed {
+ return nil
+ }
+ w.isClosed = true
+
+ // Send "quit" message to the reader goroutine
+ ch := make(chan error)
+ w.quit <- ch
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-ch
+}
+
+// Add starts watching the named file or directory (non-recursively).
+func (w *Watcher) Add(name string) error {
+ if w.isClosed {
+ return errors.New("watcher already closed")
+ }
+ in := &input{
+ op: opAddWatch,
+ path: filepath.Clean(name),
+ flags: sysFSALLEVENTS,
+ reply: make(chan error),
+ }
+ w.input <- in
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-in.reply
+}
+
+// Remove stops watching the the named file or directory (non-recursively).
+func (w *Watcher) Remove(name string) error {
+ in := &input{
+ op: opRemoveWatch,
+ path: filepath.Clean(name),
+ reply: make(chan error),
+ }
+ w.input <- in
+ if err := w.wakeupReader(); err != nil {
+ return err
+ }
+ return <-in.reply
+}
+
+const (
+ // Options for AddWatch
+ sysFSONESHOT = 0x80000000
+ sysFSONLYDIR = 0x1000000
+
+ // Events
+ sysFSACCESS = 0x1
+ sysFSALLEVENTS = 0xfff
+ sysFSATTRIB = 0x4
+ sysFSCLOSE = 0x18
+ sysFSCREATE = 0x100
+ sysFSDELETE = 0x200
+ sysFSDELETESELF = 0x400
+ sysFSMODIFY = 0x2
+ sysFSMOVE = 0xc0
+ sysFSMOVEDFROM = 0x40
+ sysFSMOVEDTO = 0x80
+ sysFSMOVESELF = 0x800
+
+ // Special events
+ sysFSIGNORED = 0x8000
+ sysFSQOVERFLOW = 0x4000
+)
+
+func newEvent(name string, mask uint32) Event {
+ e := Event{Name: name}
+ if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO {
+ e.Op |= Create
+ }
+ if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF {
+ e.Op |= Remove
+ }
+ if mask&sysFSMODIFY == sysFSMODIFY {
+ e.Op |= Write
+ }
+ if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM {
+ e.Op |= Rename
+ }
+ if mask&sysFSATTRIB == sysFSATTRIB {
+ e.Op |= Chmod
+ }
+ return e
+}
+
+const (
+ opAddWatch = iota
+ opRemoveWatch
+)
+
+const (
+ provisional uint64 = 1 << (32 + iota)
+)
+
+type input struct {
+ op int
+ path string
+ flags uint32
+ reply chan error
+}
+
+type inode struct {
+ handle syscall.Handle
+ volume uint32
+ index uint64
+}
+
+type watch struct {
+ ov syscall.Overlapped
+ ino *inode // i-number
+ path string // Directory path
+ mask uint64 // Directory itself is being watched with these notify flags
+ names map[string]uint64 // Map of names being watched and their notify flags
+ rename string // Remembers the old name while renaming a file
+ buf [4096]byte
+}
+
+type indexMap map[uint64]*watch
+type watchMap map[uint32]indexMap
+
+func (w *Watcher) wakeupReader() error {
+ e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil)
+ if e != nil {
+ return os.NewSyscallError("PostQueuedCompletionStatus", e)
+ }
+ return nil
+}
+
+func getDir(pathname string) (dir string, err error) {
+ attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname))
+ if e != nil {
+ return "", os.NewSyscallError("GetFileAttributes", e)
+ }
+ if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 {
+ dir = pathname
+ } else {
+ dir, _ = filepath.Split(pathname)
+ dir = filepath.Clean(dir)
+ }
+ return
+}
+
+func getIno(path string) (ino *inode, err error) {
+ h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path),
+ syscall.FILE_LIST_DIRECTORY,
+ syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE,
+ nil, syscall.OPEN_EXISTING,
+ syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0)
+ if e != nil {
+ return nil, os.NewSyscallError("CreateFile", e)
+ }
+ var fi syscall.ByHandleFileInformation
+ if e = syscall.GetFileInformationByHandle(h, &fi); e != nil {
+ syscall.CloseHandle(h)
+ return nil, os.NewSyscallError("GetFileInformationByHandle", e)
+ }
+ ino = &inode{
+ handle: h,
+ volume: fi.VolumeSerialNumber,
+ index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow),
+ }
+ return ino, nil
+}
+
+// Must run within the I/O thread.
+func (m watchMap) get(ino *inode) *watch {
+ if i := m[ino.volume]; i != nil {
+ return i[ino.index]
+ }
+ return nil
+}
+
+// Must run within the I/O thread.
+func (m watchMap) set(ino *inode, watch *watch) {
+ i := m[ino.volume]
+ if i == nil {
+ i = make(indexMap)
+ m[ino.volume] = i
+ }
+ i[ino.index] = watch
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) addWatch(pathname string, flags uint64) error {
+ dir, err := getDir(pathname)
+ if err != nil {
+ return err
+ }
+ if flags&sysFSONLYDIR != 0 && pathname != dir {
+ return nil
+ }
+ ino, err := getIno(dir)
+ if err != nil {
+ return err
+ }
+ w.mu.Lock()
+ watchEntry := w.watches.get(ino)
+ w.mu.Unlock()
+ if watchEntry == nil {
+ if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil {
+ syscall.CloseHandle(ino.handle)
+ return os.NewSyscallError("CreateIoCompletionPort", e)
+ }
+ watchEntry = &watch{
+ ino: ino,
+ path: dir,
+ names: make(map[string]uint64),
+ }
+ w.mu.Lock()
+ w.watches.set(ino, watchEntry)
+ w.mu.Unlock()
+ flags |= provisional
+ } else {
+ syscall.CloseHandle(ino.handle)
+ }
+ if pathname == dir {
+ watchEntry.mask |= flags
+ } else {
+ watchEntry.names[filepath.Base(pathname)] |= flags
+ }
+ if err = w.startRead(watchEntry); err != nil {
+ return err
+ }
+ if pathname == dir {
+ watchEntry.mask &= ^provisional
+ } else {
+ watchEntry.names[filepath.Base(pathname)] &= ^provisional
+ }
+ return nil
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) remWatch(pathname string) error {
+ dir, err := getDir(pathname)
+ if err != nil {
+ return err
+ }
+ ino, err := getIno(dir)
+ if err != nil {
+ return err
+ }
+ w.mu.Lock()
+ watch := w.watches.get(ino)
+ w.mu.Unlock()
+ if watch == nil {
+ return fmt.Errorf("can't remove non-existent watch for: %s", pathname)
+ }
+ if pathname == dir {
+ w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
+ watch.mask = 0
+ } else {
+ name := filepath.Base(pathname)
+ w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED)
+ delete(watch.names, name)
+ }
+ return w.startRead(watch)
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) deleteWatch(watch *watch) {
+ for name, mask := range watch.names {
+ if mask&provisional == 0 {
+ w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED)
+ }
+ delete(watch.names, name)
+ }
+ if watch.mask != 0 {
+ if watch.mask&provisional == 0 {
+ w.sendEvent(watch.path, watch.mask&sysFSIGNORED)
+ }
+ watch.mask = 0
+ }
+}
+
+// Must run within the I/O thread.
+func (w *Watcher) startRead(watch *watch) error {
+ if e := syscall.CancelIo(watch.ino.handle); e != nil {
+ w.Errors <- os.NewSyscallError("CancelIo", e)
+ w.deleteWatch(watch)
+ }
+ mask := toWindowsFlags(watch.mask)
+ for _, m := range watch.names {
+ mask |= toWindowsFlags(m)
+ }
+ if mask == 0 {
+ if e := syscall.CloseHandle(watch.ino.handle); e != nil {
+ w.Errors <- os.NewSyscallError("CloseHandle", e)
+ }
+ w.mu.Lock()
+ delete(w.watches[watch.ino.volume], watch.ino.index)
+ w.mu.Unlock()
+ return nil
+ }
+ e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0],
+ uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0)
+ if e != nil {
+ err := os.NewSyscallError("ReadDirectoryChanges", e)
+ if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 {
+ // Watched directory was probably removed
+ if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) {
+ if watch.mask&sysFSONESHOT != 0 {
+ watch.mask = 0
+ }
+ }
+ err = nil
+ }
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ return err
+ }
+ return nil
+}
+
+// readEvents reads from the I/O completion port, converts the
+// received events into Event objects and sends them via the Events channel.
+// Entry point to the I/O thread.
+func (w *Watcher) readEvents() {
+ var (
+ n, key uint32
+ ov *syscall.Overlapped
+ )
+ runtime.LockOSThread()
+
+ for {
+ e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE)
+ watch := (*watch)(unsafe.Pointer(ov))
+
+ if watch == nil {
+ select {
+ case ch := <-w.quit:
+ w.mu.Lock()
+ var indexes []indexMap
+ for _, index := range w.watches {
+ indexes = append(indexes, index)
+ }
+ w.mu.Unlock()
+ for _, index := range indexes {
+ for _, watch := range index {
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ }
+ }
+ var err error
+ if e := syscall.CloseHandle(w.port); e != nil {
+ err = os.NewSyscallError("CloseHandle", e)
+ }
+ close(w.Events)
+ close(w.Errors)
+ ch <- err
+ return
+ case in := <-w.input:
+ switch in.op {
+ case opAddWatch:
+ in.reply <- w.addWatch(in.path, uint64(in.flags))
+ case opRemoveWatch:
+ in.reply <- w.remWatch(in.path)
+ }
+ default:
+ }
+ continue
+ }
+
+ switch e {
+ case syscall.ERROR_MORE_DATA:
+ if watch == nil {
+ w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer")
+ } else {
+ // The i/o succeeded but the buffer is full.
+ // In theory we should be building up a full packet.
+ // In practice we can get away with just carrying on.
+ n = uint32(unsafe.Sizeof(watch.buf))
+ }
+ case syscall.ERROR_ACCESS_DENIED:
+ // Watched directory was probably removed
+ w.sendEvent(watch.path, watch.mask&sysFSDELETESELF)
+ w.deleteWatch(watch)
+ w.startRead(watch)
+ continue
+ case syscall.ERROR_OPERATION_ABORTED:
+ // CancelIo was called on this handle
+ continue
+ default:
+ w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e)
+ continue
+ case nil:
+ }
+
+ var offset uint32
+ for {
+ if n == 0 {
+ w.Events <- newEvent("", sysFSQOVERFLOW)
+ w.Errors <- errors.New("short read in readEvents()")
+ break
+ }
+
+ // Point "raw" to the event in the buffer
+ raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset]))
+ buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName))
+ name := syscall.UTF16ToString(buf[:raw.FileNameLength/2])
+ fullname := filepath.Join(watch.path, name)
+
+ var mask uint64
+ switch raw.Action {
+ case syscall.FILE_ACTION_REMOVED:
+ mask = sysFSDELETESELF
+ case syscall.FILE_ACTION_MODIFIED:
+ mask = sysFSMODIFY
+ case syscall.FILE_ACTION_RENAMED_OLD_NAME:
+ watch.rename = name
+ case syscall.FILE_ACTION_RENAMED_NEW_NAME:
+ if watch.names[watch.rename] != 0 {
+ watch.names[name] |= watch.names[watch.rename]
+ delete(watch.names, watch.rename)
+ mask = sysFSMOVESELF
+ }
+ }
+
+ sendNameEvent := func() {
+ if w.sendEvent(fullname, watch.names[name]&mask) {
+ if watch.names[name]&sysFSONESHOT != 0 {
+ delete(watch.names, name)
+ }
+ }
+ }
+ if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME {
+ sendNameEvent()
+ }
+ if raw.Action == syscall.FILE_ACTION_REMOVED {
+ w.sendEvent(fullname, watch.names[name]&sysFSIGNORED)
+ delete(watch.names, name)
+ }
+ if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) {
+ if watch.mask&sysFSONESHOT != 0 {
+ watch.mask = 0
+ }
+ }
+ if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME {
+ fullname = filepath.Join(watch.path, watch.rename)
+ sendNameEvent()
+ }
+
+ // Move to the next event in the buffer
+ if raw.NextEntryOffset == 0 {
+ break
+ }
+ offset += raw.NextEntryOffset
+
+ // Error!
+ if offset >= n {
+ w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.")
+ break
+ }
+ }
+
+ if err := w.startRead(watch); err != nil {
+ w.Errors <- err
+ }
+ }
+}
+
+func (w *Watcher) sendEvent(name string, mask uint64) bool {
+ if mask == 0 {
+ return false
+ }
+ event := newEvent(name, uint32(mask))
+ select {
+ case ch := <-w.quit:
+ w.quit <- ch
+ case w.Events <- event:
+ }
+ return true
+}
+
+func toWindowsFlags(mask uint64) uint32 {
+ var m uint32
+ if mask&sysFSACCESS != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS
+ }
+ if mask&sysFSMODIFY != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE
+ }
+ if mask&sysFSATTRIB != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES
+ }
+ if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 {
+ m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME
+ }
+ return m
+}
+
+func toFSnotifyFlags(action uint32) uint64 {
+ switch action {
+ case syscall.FILE_ACTION_ADDED:
+ return sysFSCREATE
+ case syscall.FILE_ACTION_REMOVED:
+ return sysFSDELETE
+ case syscall.FILE_ACTION_MODIFIED:
+ return sysFSMODIFY
+ case syscall.FILE_ACTION_RENAMED_OLD_NAME:
+ return sysFSMOVEDFROM
+ case syscall.FILE_ACTION_RENAMED_NEW_NAME:
+ return sysFSMOVEDTO
+ }
+ return 0
+}
diff --git a/vendor/github.com/go-critic/go-critic/LICENSE b/vendor/github.com/go-critic/go-critic/LICENSE
new file mode 100644
index 00000000000..b944b4bbdbe
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/LICENSE
@@ -0,0 +1,22 @@
+MIT License
+
+Copyright (c) 2018-2019 Alekseev Artem
+Copyright (c) 2018-2019 Ravil Bikbulatov
+
+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/go-critic/go-critic/checkers/appendAssign_checker.go b/vendor/github.com/go-critic/go-critic/checkers/appendAssign_checker.go
new file mode 100644
index 00000000000..47d12f01426
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/appendAssign_checker.go
@@ -0,0 +1,102 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/astp"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "appendAssign"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects suspicious append result assignments"
+ info.Before = `
+p.positives = append(p.negatives, x)
+p.negatives = append(p.negatives, y)`
+ info.After = `
+p.positives = append(p.positives, x)
+p.negatives = append(p.negatives, y)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&appendAssignChecker{ctx: ctx})
+ })
+}
+
+type appendAssignChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *appendAssignChecker) VisitStmt(stmt ast.Stmt) {
+ assign, ok := stmt.(*ast.AssignStmt)
+ if !ok || assign.Tok != token.ASSIGN || len(assign.Lhs) != len(assign.Rhs) {
+ return
+ }
+ for i, rhs := range assign.Rhs {
+ call, ok := rhs.(*ast.CallExpr)
+ if !ok || qualifiedName(call.Fun) != "append" {
+ continue
+ }
+ c.checkAppend(assign.Lhs[i], call)
+ }
+}
+
+func (c *appendAssignChecker) checkAppend(x ast.Expr, call *ast.CallExpr) {
+ if call.Ellipsis != token.NoPos {
+ // Try to detect `xs = append(ys, xs...)` idiom.
+ for _, arg := range call.Args[1:] {
+ y := arg
+ if arg, ok := arg.(*ast.SliceExpr); ok {
+ y = arg.X
+ }
+ if astequal.Expr(x, y) {
+ return
+ }
+ }
+ }
+
+ switch x := x.(type) {
+ case *ast.Ident:
+ if x.Name == "_" {
+ return // Don't check assignments to blank ident
+ }
+ case *ast.IndexExpr:
+ if !astp.IsIndexExpr(call.Args[0]) {
+ // Most likely `m[k] = append(x, ...)`
+ // pattern, where x was retrieved by m[k] before.
+ //
+ // TODO: it's possible to record such map/slice reads
+ // and check whether it was done before this call.
+ // But for now, treat it like x belongs to m[k].
+ return
+ }
+ }
+
+ switch y := call.Args[0].(type) {
+ case *ast.SliceExpr:
+ if _, ok := c.ctx.TypesInfo.TypeOf(y.X).(*types.Array); ok {
+ // Arrays are frequently used as scratch storages.
+ return
+ }
+ c.matchSlices(call, x, y.X)
+ case *ast.IndexExpr, *ast.Ident, *ast.SelectorExpr:
+ c.matchSlices(call, x, y)
+ }
+}
+
+func (c *appendAssignChecker) matchSlices(cause ast.Node, x, y ast.Expr) {
+ if !astequal.Expr(x, astutil.Unparen(y)) {
+ c.warn(cause)
+ }
+}
+
+func (c *appendAssignChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "append result not assigned to the same slice")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/appendCombine_checker.go b/vendor/github.com/go-critic/go-critic/checkers/appendCombine_checker.go
new file mode 100644
index 00000000000..63f5d9fea4e
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/appendCombine_checker.go
@@ -0,0 +1,102 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "appendCombine"
+ info.Tags = []string{"performance"}
+ info.Summary = "Detects `append` chains to the same slice that can be done in a single `append` call"
+ info.Before = `
+xs = append(xs, 1)
+xs = append(xs, 2)`
+ info.After = `xs = append(xs, 1, 2)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmtList(&appendCombineChecker{ctx: ctx})
+ })
+}
+
+type appendCombineChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *appendCombineChecker) VisitStmtList(list []ast.Stmt) {
+ var cause ast.Node // First append
+ var slice ast.Expr // Slice being appended to
+ chain := 0 // How much appends in a row we've seen
+
+ // Break the chain.
+ // If enough appends are in chain, print warning.
+ flush := func() {
+ if chain > 1 {
+ c.warn(cause, chain)
+ }
+ chain = 0
+ slice = nil
+ }
+
+ for _, stmt := range list {
+ call := c.matchAppend(stmt, slice)
+ if call == nil {
+ flush()
+ continue
+ }
+
+ if chain == 0 {
+ // First append in a chain.
+ chain = 1
+ slice = call.Args[0]
+ cause = stmt
+ } else {
+ chain++
+ }
+ }
+
+ // Required for printing chains that consist of trailing
+ // statements from the list.
+ flush()
+}
+
+func (c *appendCombineChecker) matchAppend(stmt ast.Stmt, slice ast.Expr) *ast.CallExpr {
+ // Seeking for:
+ // slice = append(slice, xs...)
+ // xs are 0-N append arguments, but not variadic argument,
+ // because it makes append combining impossible.
+
+ assign := astcast.ToAssignStmt(stmt)
+ if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
+ return nil
+ }
+
+ call, ok := assign.Rhs[0].(*ast.CallExpr)
+ {
+ cond := ok &&
+ qualifiedName(call.Fun) == "append" &&
+ call.Ellipsis == token.NoPos &&
+ astequal.Expr(assign.Lhs[0], call.Args[0])
+ if !cond {
+ return nil
+ }
+ }
+
+ // Check that current append slice match previous append slice.
+ // Otherwise we should break the chain.
+ if slice == nil || astequal.Expr(slice, call.Args[0]) {
+ return call
+ }
+ return nil
+}
+
+func (c *appendCombineChecker) warn(cause ast.Node, chain int) {
+ c.ctx.Warn(cause, "can combine chain of %d appends into one", chain)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/argOrder_checker.go b/vendor/github.com/go-critic/go-critic/checkers/argOrder_checker.go
new file mode 100644
index 00000000000..85a6f7c664e
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/argOrder_checker.go
@@ -0,0 +1,98 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astp"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "argOrder"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects suspicious arguments order"
+ info.Before = `strings.HasPrefix("#", userpass)`
+ info.After = `strings.HasPrefix(userpass, "#")`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&argOrderChecker{ctx: ctx})
+ })
+}
+
+type argOrderChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *argOrderChecker) VisitExpr(expr ast.Expr) {
+ call := astcast.ToCallExpr(expr)
+
+ // For now only handle functions of 2 args.
+ // TODO(Quasilyte): generalize the algorithm and add more patterns.
+ if len(call.Args) != 2 {
+ return
+ }
+
+ calledExpr := astcast.ToSelectorExpr(call.Fun)
+ obj, ok := c.ctx.TypesInfo.ObjectOf(astcast.ToIdent(calledExpr.X)).(*types.PkgName)
+ if !ok || !isStdlibPkg(obj.Imported()) {
+ return
+ }
+
+ x := call.Args[0]
+ y := call.Args[1]
+ switch calledExpr.Sel.Name {
+ case "HasPrefix", "HasSuffix", "Contains", "TrimPrefix", "TrimSuffix", "Split":
+ if obj.Name() != "bytes" && obj.Name() != "strings" {
+ return
+ }
+ if c.isConstLiteral(x) && !c.isConstLiteral(y) {
+ c.warn(call)
+ }
+ }
+}
+
+func (c *argOrderChecker) isConstLiteral(x ast.Expr) bool {
+ if c.ctx.TypesInfo.Types[x].Value != nil {
+ return true
+ }
+
+ // Also permit byte slices.
+ switch x := x.(type) {
+ case *ast.CallExpr:
+ // Handle `[]byte("abc")` as well.
+ if len(x.Args) != 1 || !astp.IsBasicLit(x.Args[0]) {
+ return false
+ }
+ typ, ok := c.ctx.TypesInfo.TypeOf(x.Fun).(*types.Slice)
+ return ok && typep.HasUint8Kind(typ.Elem())
+
+ case *ast.CompositeLit:
+ // Check if it's a const byte slice.
+ typ, ok := c.ctx.TypesInfo.TypeOf(x).(*types.Slice)
+ if !ok || !typep.HasUint8Kind(typ.Elem()) {
+ return false
+ }
+ for _, elt := range x.Elts {
+ if !astp.IsBasicLit(elt) {
+ return false
+ }
+ }
+ return true
+
+ default:
+ return false
+ }
+}
+
+func (c *argOrderChecker) warn(call *ast.CallExpr) {
+ fixed := astcopy.CallExpr(call)
+ fixed.Args[0], fixed.Args[1] = fixed.Args[1], fixed.Args[0]
+ c.ctx.Warn(call, "probably meant `%s`", fixed)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/assignOp_checker.go b/vendor/github.com/go-critic/go-critic/checkers/assignOp_checker.go
new file mode 100644
index 00000000000..e4e82c98b1a
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/assignOp_checker.go
@@ -0,0 +1,81 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "assignOp"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects assignments that can be simplified by using assignment operators"
+ info.Before = `x = x * 2`
+ info.After = `x *= 2`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&assignOpChecker{ctx: ctx})
+ })
+}
+
+type assignOpChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *assignOpChecker) VisitStmt(stmt ast.Stmt) {
+ assign, ok := stmt.(*ast.AssignStmt)
+ cond := ok &&
+ assign.Tok == token.ASSIGN &&
+ len(assign.Lhs) == 1 &&
+ len(assign.Rhs) == 1 &&
+ typep.SideEffectFree(c.ctx.TypesInfo, assign.Lhs[0])
+ if !cond {
+ return
+ }
+
+ // TODO(quasilyte): can take commutativity into account.
+ expr, ok := assign.Rhs[0].(*ast.BinaryExpr)
+ if !ok || !astequal.Expr(assign.Lhs[0], expr.X) {
+ return
+ }
+
+ // TODO(quasilyte): perform unparen?
+ switch expr.Op {
+ case token.MUL:
+ c.warn(assign, token.MUL_ASSIGN, expr.Y)
+ case token.QUO:
+ c.warn(assign, token.QUO_ASSIGN, expr.Y)
+ case token.REM:
+ c.warn(assign, token.REM_ASSIGN, expr.Y)
+ case token.ADD:
+ c.warn(assign, token.ADD_ASSIGN, expr.Y)
+ case token.SUB:
+ c.warn(assign, token.SUB_ASSIGN, expr.Y)
+ case token.AND:
+ c.warn(assign, token.AND_ASSIGN, expr.Y)
+ case token.OR:
+ c.warn(assign, token.OR_ASSIGN, expr.Y)
+ case token.XOR:
+ c.warn(assign, token.XOR_ASSIGN, expr.Y)
+ case token.SHL:
+ c.warn(assign, token.SHL_ASSIGN, expr.Y)
+ case token.SHR:
+ c.warn(assign, token.SHR_ASSIGN, expr.Y)
+ case token.AND_NOT:
+ c.warn(assign, token.AND_NOT_ASSIGN, expr.Y)
+ }
+}
+
+func (c *assignOpChecker) warn(cause *ast.AssignStmt, op token.Token, rhs ast.Expr) {
+ suggestion := astcopy.AssignStmt(cause)
+ suggestion.Tok = op
+ suggestion.Rhs[0] = rhs
+ c.ctx.Warn(cause, "replace `%s` with `%s`", cause, suggestion)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go b/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go
new file mode 100644
index 00000000000..466a89cc374
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/badCond_checker.go
@@ -0,0 +1,147 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/constant"
+ "go/token"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/typep"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "badCond"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects suspicious condition expressions"
+ info.Before = `
+for i := 0; i > n; i++ {
+ xs[i] = 0
+}`
+ info.After = `
+for i := 0; i < n; i++ {
+ xs[i] = 0
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForFuncDecl(&badCondChecker{ctx: ctx})
+ })
+}
+
+type badCondChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *badCondChecker) VisitFuncDecl(decl *ast.FuncDecl) {
+ ast.Inspect(decl.Body, func(n ast.Node) bool {
+ switch n := n.(type) {
+ case *ast.ForStmt:
+ c.checkForStmt(n)
+ case ast.Expr:
+ c.checkExpr(n)
+ }
+ return true
+ })
+}
+
+func (c *badCondChecker) checkExpr(expr ast.Expr) {
+ // TODO(Quasilyte): recognize more patterns.
+
+ cond := astcast.ToBinaryExpr(expr)
+ lhs := astcast.ToBinaryExpr(astutil.Unparen(cond.X))
+ rhs := astcast.ToBinaryExpr(astutil.Unparen(cond.Y))
+
+ if cond.Op != token.LAND {
+ return
+ }
+
+ // Notes:
+ // `x != a || x != b` handled by go vet.
+
+ // Pattern 1.
+ // `x < a && x > b`; Where `a` is less than `b`.
+ if c.lessAndGreater(lhs, rhs) {
+ c.warnCond(cond, "always false")
+ return
+ }
+
+ // Pattern 2.
+ // `x == a && x == b`
+ //
+ // Valid when `b == a` is intended, but still reported.
+ // We can disable "just suspicious" warnings by default
+ // is users are upset with the current behavior.
+ if c.equalToBoth(lhs, rhs) {
+ c.warnCond(cond, "suspicious")
+ return
+ }
+}
+
+func (c *badCondChecker) equalToBoth(lhs, rhs *ast.BinaryExpr) bool {
+ return lhs.Op == token.EQL && rhs.Op == token.EQL &&
+ astequal.Expr(lhs.X, rhs.X)
+}
+
+func (c *badCondChecker) lessAndGreater(lhs, rhs *ast.BinaryExpr) bool {
+ if lhs.Op != token.LSS || rhs.Op != token.GTR {
+ return false
+ }
+ if !astequal.Expr(lhs.X, rhs.X) {
+ return false
+ }
+ a := c.ctx.TypesInfo.Types[lhs.Y].Value
+ b := c.ctx.TypesInfo.Types[rhs.Y].Value
+ return a != nil && b != nil && constant.Compare(a, token.LSS, b)
+}
+
+func (c *badCondChecker) checkForStmt(stmt *ast.ForStmt) {
+ // TODO(Quasilyte): handle other kinds of bad conditionals.
+
+ init := astcast.ToAssignStmt(stmt.Init)
+ if init.Tok != token.DEFINE || len(init.Lhs) != 1 || len(init.Rhs) != 1 {
+ return
+ }
+ if astcast.ToBasicLit(init.Rhs[0]).Value != "0" {
+ return
+ }
+
+ iter := astcast.ToIdent(init.Lhs[0])
+ cond := astcast.ToBinaryExpr(stmt.Cond)
+ if cond.Op != token.GTR || !astequal.Expr(iter, cond.X) {
+ return
+ }
+ if !typep.SideEffectFree(c.ctx.TypesInfo, cond.Y) {
+ return
+ }
+
+ post := astcast.ToIncDecStmt(stmt.Post)
+ if post.Tok != token.INC || !astequal.Expr(iter, post.X) {
+ return
+ }
+
+ mutated := lintutil.CouldBeMutated(c.ctx.TypesInfo, stmt.Body, cond.Y) ||
+ lintutil.CouldBeMutated(c.ctx.TypesInfo, stmt.Body, iter)
+ if mutated {
+ return
+ }
+
+ c.warnForStmt(stmt, cond)
+}
+
+func (c *badCondChecker) warnForStmt(cause ast.Node, cond *ast.BinaryExpr) {
+ suggest := astcopy.BinaryExpr(cond)
+ suggest.Op = token.LSS
+ c.ctx.Warn(cause, "`%s` in loop; probably meant `%s`?",
+ cond, suggest)
+}
+
+func (c *badCondChecker) warnCond(cond *ast.BinaryExpr, tag string) {
+ c.ctx.Warn(cond, "`%s` condition is %s", cond, tag)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go b/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go
new file mode 100644
index 00000000000..81fbc2db977
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/boolExprSimplify_checker.go
@@ -0,0 +1,340 @@
+package checkers
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strconv"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/astp"
+ "github.com/go-toolsmith/typep"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "boolExprSimplify"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects bool expressions that can be simplified"
+ info.Before = `
+a := !(elapsed >= expectElapsedMin)
+b := !(x) == !(y)`
+ info.After = `
+a := elapsed < expectElapsedMin
+b := (x) == (y)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&boolExprSimplifyChecker{ctx: ctx})
+ })
+}
+
+type boolExprSimplifyChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+ hasFloats bool
+}
+
+func (c *boolExprSimplifyChecker) VisitExpr(x ast.Expr) {
+ if !astp.IsBinaryExpr(x) && !astp.IsUnaryExpr(x) {
+ return
+ }
+
+ // Throw away non-bool expressions and avoid redundant
+ // AST copying below.
+ if typ := c.ctx.TypesInfo.TypeOf(x); typ == nil || !typep.HasBoolKind(typ.Underlying()) {
+ return
+ }
+
+ // We'll loose all types info after a copy,
+ // this is why we record valuable info before doing it.
+ c.hasFloats = lintutil.ContainsNode(x, func(n ast.Node) bool {
+ if x, ok := n.(*ast.BinaryExpr); ok {
+ return typep.HasFloatProp(c.ctx.TypesInfo.TypeOf(x.X).Underlying()) ||
+ typep.HasFloatProp(c.ctx.TypesInfo.TypeOf(x.Y).Underlying())
+ }
+ return false
+ })
+
+ y := c.simplifyBool(astcopy.Expr(x))
+ if !astequal.Expr(x, y) {
+ c.warn(x, y)
+ }
+}
+
+func (c *boolExprSimplifyChecker) simplifyBool(x ast.Expr) ast.Expr {
+ return astutil.Apply(x, nil, func(cur *astutil.Cursor) bool {
+ return c.doubleNegation(cur) ||
+ c.negatedEquals(cur) ||
+ c.invertComparison(cur) ||
+ c.combineChecks(cur) ||
+ c.removeIncDec(cur) ||
+ c.foldRanges(cur) ||
+ true
+ }).(ast.Expr)
+}
+
+func (c *boolExprSimplifyChecker) doubleNegation(cur *astutil.Cursor) bool {
+ neg1 := astcast.ToUnaryExpr(cur.Node())
+ neg2 := astcast.ToUnaryExpr(astutil.Unparen(neg1.X))
+ if neg1.Op == token.NOT && neg2.Op == token.NOT {
+ cur.Replace(astutil.Unparen(neg2.X))
+ return true
+ }
+ return false
+}
+
+func (c *boolExprSimplifyChecker) negatedEquals(cur *astutil.Cursor) bool {
+ x, ok := cur.Node().(*ast.BinaryExpr)
+ if !ok || x.Op != token.EQL {
+ return false
+ }
+ neg1 := astcast.ToUnaryExpr(x.X)
+ neg2 := astcast.ToUnaryExpr(x.Y)
+ if neg1.Op == token.NOT && neg2.Op == token.NOT {
+ x.X = neg1.X
+ x.Y = neg2.X
+ return true
+ }
+ return false
+}
+
+func (c *boolExprSimplifyChecker) invertComparison(cur *astutil.Cursor) bool {
+ if c.hasFloats { // See #673
+ return false
+ }
+
+ neg := astcast.ToUnaryExpr(cur.Node())
+ cmp := astcast.ToBinaryExpr(astutil.Unparen(neg.X))
+ if neg.Op != token.NOT {
+ return false
+ }
+
+ // Replace operator to its negated form.
+ switch cmp.Op {
+ case token.EQL:
+ cmp.Op = token.NEQ
+ case token.NEQ:
+ cmp.Op = token.EQL
+ case token.LSS:
+ cmp.Op = token.GEQ
+ case token.GTR:
+ cmp.Op = token.LEQ
+ case token.LEQ:
+ cmp.Op = token.GTR
+ case token.GEQ:
+ cmp.Op = token.LSS
+
+ default:
+ return false
+ }
+ cur.Replace(cmp)
+ return true
+}
+
+func (c *boolExprSimplifyChecker) isSafe(x ast.Expr) bool {
+ return typep.SideEffectFree(c.ctx.TypesInfo, x)
+}
+
+func (c *boolExprSimplifyChecker) combineChecks(cur *astutil.Cursor) bool {
+ or, ok := cur.Node().(*ast.BinaryExpr)
+ if !ok || or.Op != token.LOR {
+ return false
+ }
+
+ lhs := astcast.ToBinaryExpr(astutil.Unparen(or.X))
+ rhs := astcast.ToBinaryExpr(astutil.Unparen(or.Y))
+
+ if !astequal.Expr(lhs.X, rhs.X) || !astequal.Expr(lhs.Y, rhs.Y) {
+ return false
+ }
+ if !c.isSafe(lhs.X) || !c.isSafe(lhs.Y) {
+ return false
+ }
+
+ combTable := [...]struct {
+ x token.Token
+ y token.Token
+ result token.Token
+ }{
+ {token.GTR, token.EQL, token.GEQ},
+ {token.EQL, token.GTR, token.GEQ},
+ {token.LSS, token.EQL, token.LEQ},
+ {token.EQL, token.LSS, token.LEQ},
+ }
+ for _, comb := range &combTable {
+ if comb.x == lhs.Op && comb.y == rhs.Op {
+ lhs.Op = comb.result
+ cur.Replace(lhs)
+ return true
+ }
+ }
+ return false
+}
+
+func (c *boolExprSimplifyChecker) removeIncDec(cur *astutil.Cursor) bool {
+ cmp := astcast.ToBinaryExpr(cur.Node())
+
+ matchOneWay := func(op token.Token, x, y *ast.BinaryExpr) bool {
+ if x.Op != op || astcast.ToBasicLit(x.Y).Value != "1" {
+ return false
+ }
+ if y.Op == op && astcast.ToBasicLit(y.Y).Value == "1" {
+ return false
+ }
+ return true
+ }
+ replace := func(lhsOp, rhsOp, replacement token.Token) bool {
+ lhs := astcast.ToBinaryExpr(cmp.X)
+ rhs := astcast.ToBinaryExpr(cmp.Y)
+ switch {
+ case matchOneWay(lhsOp, lhs, rhs):
+ cmp.X = lhs.X
+ cmp.Op = replacement
+ cur.Replace(cmp)
+ return true
+ case matchOneWay(rhsOp, rhs, lhs):
+ cmp.Y = rhs.X
+ cmp.Op = replacement
+ cur.Replace(cmp)
+ return true
+ default:
+ return false
+ }
+ }
+
+ switch cmp.Op {
+ case token.GTR:
+ // `x > y-1` => `x >= y`
+ // `x+1 > y` => `x >= y`
+ return replace(token.ADD, token.SUB, token.GEQ)
+
+ case token.GEQ:
+ // `x >= y+1` => `x > y`
+ // `x-1 >= y` => `x > y`
+ return replace(token.SUB, token.ADD, token.GTR)
+
+ case token.LSS:
+ // `x < y+1` => `x <= y`
+ // `x-1 < y` => `x <= y`
+ return replace(token.SUB, token.ADD, token.LEQ)
+
+ case token.LEQ:
+ // `x <= y-1` => `x < y`
+ // `x+1 <= y` => `x < y`
+ return replace(token.ADD, token.SUB, token.LSS)
+
+ default:
+ return false
+ }
+}
+
+func (c *boolExprSimplifyChecker) foldRanges(cur *astutil.Cursor) bool {
+ e, ok := cur.Node().(*ast.BinaryExpr)
+ if !ok {
+ return false
+ }
+ lhs := astcast.ToBinaryExpr(e.X)
+ rhs := astcast.ToBinaryExpr(e.Y)
+ if !c.isSafe(lhs.X) || !c.isSafe(rhs.X) {
+ return false
+ }
+ if !astequal.Expr(lhs.X, rhs.X) {
+ return false
+ }
+
+ c1, ok := c.int64val(lhs.Y)
+ if !ok {
+ return false
+ }
+ c2, ok := c.int64val(rhs.Y)
+ if !ok {
+ return false
+ }
+
+ type combination struct {
+ lhsOp token.Token
+ rhsOp token.Token
+ rhsDiff int64
+ resDelta int64
+ }
+ match := func(comb *combination) bool {
+ if lhs.Op != comb.lhsOp || rhs.Op != comb.rhsOp {
+ return false
+ }
+ if c2-c1 != comb.rhsDiff {
+ return false
+ }
+ return true
+ }
+
+ switch e.Op {
+ case token.LAND:
+ combTable := [...]combination{
+ // `x > c && x < c+2` => `x == c+1`
+ {token.GTR, token.LSS, 2, 1},
+ // `x >= c && x < c+1` => `x == c`
+ {token.GEQ, token.LSS, 1, 0},
+ // `x > c && x <= c+1` => `x == c+1`
+ {token.GTR, token.LEQ, 1, 1},
+ // `x >= c && x <= c` => `x == c`
+ {token.GEQ, token.LEQ, 0, 0},
+ }
+ for _, comb := range combTable {
+ if match(&comb) {
+ lhs.Op = token.EQL
+ v := c1 + comb.resDelta
+ lhs.Y.(*ast.BasicLit).Value = fmt.Sprint(v)
+ cur.Replace(lhs)
+ return true
+ }
+ }
+
+ case token.LOR:
+ combTable := [...]combination{
+ // `x < c || x > c` => `x != c`
+ {token.LSS, token.GTR, 0, 0},
+ // `x <= c || x > c+1` => `x != c+1`
+ {token.LEQ, token.GTR, 1, 1},
+ // `x < c || x >= c+1` => `x != c`
+ {token.LSS, token.GEQ, 1, 0},
+ // `x <= c || x >= c+2` => `x != c+1`
+ {token.LEQ, token.GEQ, 2, 1},
+ }
+ for _, comb := range combTable {
+ if match(&comb) {
+ lhs.Op = token.NEQ
+ v := c1 + comb.resDelta
+ lhs.Y.(*ast.BasicLit).Value = fmt.Sprint(v)
+ cur.Replace(lhs)
+ return true
+ }
+ }
+ }
+
+ return false
+}
+
+func (c *boolExprSimplifyChecker) int64val(x ast.Expr) (int64, bool) {
+ // TODO(Quasilyte): if we had types info, we could use TypesInfo.Types[x].Value,
+ // but since copying erases leaves us without it, only basic literals are handled.
+ lit, ok := x.(*ast.BasicLit)
+ if !ok {
+ return 0, false
+ }
+ v, err := strconv.ParseInt(lit.Value, 10, 64)
+ if err != nil {
+ return 0, false
+ }
+ return v, true
+}
+
+func (c *boolExprSimplifyChecker) warn(cause, suggestion ast.Expr) {
+ c.SkipChilds = true
+ c.ctx.Warn(cause, "can simplify `%s` to `%s`", cause, suggestion)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/builtinShadow_checker.go b/vendor/github.com/go-critic/go-critic/checkers/builtinShadow_checker.go
new file mode 100644
index 00000000000..24d8b7fff4f
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/builtinShadow_checker.go
@@ -0,0 +1,36 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "builtinShadow"
+ info.Tags = []string{"style", "opinionated"}
+ info.Summary = "Detects when predeclared identifiers shadowed in assignments"
+ info.Before = `len := 10`
+ info.After = `length := 10`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForLocalDef(&builtinShadowChecker{ctx: ctx}, ctx.TypesInfo)
+ })
+}
+
+type builtinShadowChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *builtinShadowChecker) VisitLocalDef(name astwalk.Name, _ ast.Expr) {
+ if isBuiltin(name.ID.Name) {
+ c.warn(name.ID)
+ }
+}
+
+func (c *builtinShadowChecker) warn(ident *ast.Ident) {
+ c.ctx.Warn(ident, "shadowing of predeclared identifier: %s", ident)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/captLocal_checker.go b/vendor/github.com/go-critic/go-critic/checkers/captLocal_checker.go
new file mode 100644
index 00000000000..bc9a2115f2f
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/captLocal_checker.go
@@ -0,0 +1,49 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "captLocal"
+ info.Tags = []string{"style"}
+ info.Params = lintpack.CheckerParams{
+ "paramsOnly": {
+ Value: true,
+ Usage: "whether to restrict checker to params only",
+ },
+ }
+ info.Summary = "Detects capitalized names for local variables"
+ info.Before = `func f(IN int, OUT *int) (ERR error) {}`
+ info.After = `func f(in int, out *int) (err error) {}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &captLocalChecker{ctx: ctx}
+ c.paramsOnly = info.Params.Bool("paramsOnly")
+ return astwalk.WalkerForLocalDef(c, ctx.TypesInfo)
+ })
+}
+
+type captLocalChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ paramsOnly bool
+}
+
+func (c *captLocalChecker) VisitLocalDef(def astwalk.Name, _ ast.Expr) {
+ if c.paramsOnly && def.Kind != astwalk.NameParam {
+ return
+ }
+ if ast.IsExported(def.ID.Name) {
+ c.warn(def.ID)
+ }
+}
+
+func (c *captLocalChecker) warn(id ast.Node) {
+ c.ctx.Warn(id, "`%s' should not be capitalized", id)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go b/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go
new file mode 100644
index 00000000000..3da6f5c87d1
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/caseOrder_checker.go
@@ -0,0 +1,80 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "caseOrder"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects erroneous case order inside switch statements"
+ info.Before = `
+switch x.(type) {
+case ast.Expr:
+ fmt.Println("expr")
+case *ast.BasicLit:
+ fmt.Println("basic lit") // Never executed
+}`
+ info.After = `
+switch x.(type) {
+case *ast.BasicLit:
+ fmt.Println("basic lit") // Now reachable
+case ast.Expr:
+ fmt.Println("expr")
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&caseOrderChecker{ctx: ctx})
+ })
+}
+
+type caseOrderChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *caseOrderChecker) VisitStmt(stmt ast.Stmt) {
+ switch stmt := stmt.(type) {
+ case *ast.TypeSwitchStmt:
+ c.checkTypeSwitch(stmt)
+ case *ast.SwitchStmt:
+ c.checkSwitch(stmt)
+ }
+}
+
+func (c *caseOrderChecker) checkTypeSwitch(s *ast.TypeSwitchStmt) {
+ type ifaceType struct {
+ node ast.Node
+ typ *types.Interface
+ }
+ var ifaces []ifaceType // Interfaces seen so far
+ for _, cc := range s.Body.List {
+ cc := cc.(*ast.CaseClause)
+ for _, x := range cc.List {
+ typ := c.ctx.TypesInfo.TypeOf(x)
+ for _, iface := range ifaces {
+ if types.Implements(typ, iface.typ) {
+ c.warnTypeSwitch(cc, x, iface.node)
+ break
+ }
+ }
+ if iface, ok := typ.Underlying().(*types.Interface); ok {
+ ifaces = append(ifaces, ifaceType{node: x, typ: iface})
+ }
+ }
+ }
+}
+
+func (c *caseOrderChecker) warnTypeSwitch(cause, concrete, iface ast.Node) {
+ c.ctx.Warn(cause, "case %s must go before the %s case", concrete, iface)
+}
+
+func (c *caseOrderChecker) checkSwitch(s *ast.SwitchStmt) {
+ // TODO(Quasilyte): can handle expression cases that overlap.
+ // Cases that have narrower value range should go before wider ones.
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/checkers.go b/vendor/github.com/go-critic/go-critic/checkers/checkers.go
new file mode 100644
index 00000000000..7cf972944ac
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/checkers.go
@@ -0,0 +1,10 @@
+// Package checkers is a gocritic linter main checkers collection.
+package checkers
+
+import (
+ "github.com/go-lintpack/lintpack"
+)
+
+var collection = &lintpack.CheckerCollection{
+ URL: "https://github.com/go-critic/checkers",
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/codegenComment_checker.go b/vendor/github.com/go-critic/go-critic/checkers/codegenComment_checker.go
new file mode 100644
index 00000000000..14d89da374b
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/codegenComment_checker.go
@@ -0,0 +1,61 @@
+package checkers
+
+import (
+ "go/ast"
+ "regexp"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "codegenComment"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects malformed 'code generated' file comments"
+ info.Before = `// This file was automatically generated by foogen`
+ info.After = `// Code generated by foogen. DO NOT EDIT.`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ patterns := []string{
+ "this (?:file|code) (?:was|is) auto(?:matically)? generated",
+ "this (?:file|code) (?:was|is) generated automatically",
+ "this (?:file|code) (?:was|is) generated by",
+ "this (?:file|code) (?:was|is) (?:auto(?:matically)? )?generated",
+ "this (?:file|code) (?:was|is) generated",
+ "code in this file (?:was|is) auto(?:matically)? generated",
+ "generated (?:file|code) - do not edit",
+ // TODO(Quasilyte): more of these.
+ }
+ re := regexp.MustCompile("(?i)" + strings.Join(patterns, "|"))
+ return &codegenCommentChecker{
+ ctx: ctx,
+ badCommentRE: re,
+ }
+ })
+}
+
+type codegenCommentChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ badCommentRE *regexp.Regexp
+}
+
+func (c *codegenCommentChecker) WalkFile(f *ast.File) {
+ if f.Doc == nil {
+ return
+ }
+
+ for _, comment := range f.Doc.List {
+ if c.badCommentRE.MatchString(comment.Text) {
+ c.warn(comment)
+ return
+ }
+ }
+}
+
+func (c *codegenCommentChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "comment should match `Code generated .* DO NOT EDIT.` regexp")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/commentFormatting_checker.go b/vendor/github.com/go-critic/go-critic/checkers/commentFormatting_checker.go
new file mode 100644
index 00000000000..ed75015e095
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/commentFormatting_checker.go
@@ -0,0 +1,77 @@
+package checkers
+
+import (
+ "go/ast"
+ "regexp"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "commentFormatting"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects comments with non-idiomatic formatting"
+ info.Before = `//This is a comment`
+ info.After = `// This is a comment`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ parts := []string{
+ `^//\w+:.*$`, //key: value
+ `^//nolint$`, //nolint
+ `^//line /.*:\d+`, //line /path/to/file:123
+ }
+ pat := "(?m)" + strings.Join(parts, "|")
+ pragmaRE := regexp.MustCompile(pat)
+ return astwalk.WalkerForComment(&commentFormattingChecker{
+ ctx: ctx,
+ pragmaRE: pragmaRE,
+ })
+ })
+}
+
+type commentFormattingChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ pragmaRE *regexp.Regexp
+}
+
+func (c *commentFormattingChecker) VisitComment(cg *ast.CommentGroup) {
+ if strings.HasPrefix(cg.List[0].Text, "/*") {
+ return
+ }
+ for _, comment := range cg.List {
+ if len(comment.Text) <= len("// ") {
+ continue
+ }
+ if c.pragmaRE.MatchString(comment.Text) {
+ continue
+ }
+
+ // Make a decision based on a first comment text rune.
+ r, _ := utf8.DecodeRuneInString(comment.Text[len("//"):])
+ if !c.specialChar(r) && !unicode.IsSpace(r) {
+ c.warn(cg)
+ return
+ }
+ }
+}
+
+func (c *commentFormattingChecker) specialChar(r rune) bool {
+ // Permitted list to avoid false-positives.
+ switch r {
+ case '+', '-', '#', '!':
+ return true
+ default:
+ return false
+ }
+}
+
+func (c *commentFormattingChecker) warn(cg *ast.CommentGroup) {
+ c.ctx.Warn(cg, "put a space between `//` and comment text")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/commentedOutCode_checker.go b/vendor/github.com/go-critic/go-critic/checkers/commentedOutCode_checker.go
new file mode 100644
index 00000000000..77b36ef33ba
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/commentedOutCode_checker.go
@@ -0,0 +1,119 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "regexp"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/strparse"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "commentedOutCode"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects commented-out code inside function bodies"
+ info.Before = `
+// fmt.Println("Debugging hard")
+foo(1, 2)`
+ info.After = `foo(1, 2)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForLocalComment(&commentedOutCodeChecker{
+ ctx: ctx,
+ notQuiteFuncCall: regexp.MustCompile(`\w+\s+\([^)]*\)\s*$`),
+ })
+ })
+}
+
+type commentedOutCodeChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ notQuiteFuncCall *regexp.Regexp
+}
+
+func (c *commentedOutCodeChecker) VisitLocalComment(cg *ast.CommentGroup) {
+ s := cg.Text() // Collect text once
+
+ // We do multiple heuristics to avoid false positives.
+ // Many things can be improved here.
+
+ markers := []string{
+ "TODO", // TODO comments with code are permitted.
+
+ // "http://" is interpreted as a label with comment.
+ // There are other protocols we might want to include.
+ "http://",
+ "https://",
+
+ "e.g. ", // Clearly not a "selector expr" (mostly due to extra space)
+ }
+ for _, m := range markers {
+ if strings.Contains(s, m) {
+ return
+ }
+ }
+
+ // Some very short comment that can be skipped.
+ // Usually triggering on these results in false positive.
+ // Unless there is a very popular call like print/println.
+ cond := len(s) < len("quite too short") &&
+ !strings.Contains(s, "print") &&
+ !strings.Contains(s, "fmt.") &&
+ !strings.Contains(s, "log.")
+ if cond {
+ return
+ }
+
+ // Almost looks like a commented-out function call,
+ // but there is a whitespace between function name and
+ // parameters list. Skip these to avoid false positives.
+ if c.notQuiteFuncCall.MatchString(s) {
+ return
+ }
+
+ stmt := strparse.Stmt(s)
+ if stmt == strparse.BadStmt {
+ return // Most likely not a code
+ }
+
+ if !c.isPermittedStmt(stmt) {
+ c.warn(cg)
+ }
+}
+
+func (c *commentedOutCodeChecker) isPermittedStmt(stmt ast.Stmt) bool {
+ switch stmt := stmt.(type) {
+ case *ast.ExprStmt:
+ return c.isPermittedExpr(stmt.X)
+ case *ast.LabeledStmt:
+ return c.isPermittedStmt(stmt.Stmt)
+ case *ast.DeclStmt:
+ decl := stmt.Decl.(*ast.GenDecl)
+ return decl.Tok == token.TYPE
+ default:
+ return false
+ }
+}
+
+func (c *commentedOutCodeChecker) isPermittedExpr(x ast.Expr) bool {
+ // Permit anything except expressions that can be used
+ // with complete result discarding.
+ switch x := x.(type) {
+ case *ast.CallExpr:
+ return false
+ case *ast.UnaryExpr:
+ // "<-" channel receive is not permitted.
+ return x.Op != token.ARROW
+ default:
+ return true
+ }
+}
+
+func (c *commentedOutCodeChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "may want to remove commented-out code")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/commentedOutImport_checker.go b/vendor/github.com/go-critic/go-critic/checkers/commentedOutImport_checker.go
new file mode 100644
index 00000000000..5aeb86c0765
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/commentedOutImport_checker.go
@@ -0,0 +1,76 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "regexp"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "commentedOutImport"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects commented-out imports"
+ info.Before = `
+import (
+ "fmt"
+ //"os"
+)`
+ info.After = `
+import (
+ "fmt"
+)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ const pattern = `(?m)^(?://|/\*)?\s*"([a-zA-Z0-9_/]+)"\s*(?:\*/)?$`
+ return &commentedOutImportChecker{
+ ctx: ctx,
+ importStringRE: regexp.MustCompile(pattern),
+ }
+ })
+}
+
+type commentedOutImportChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ importStringRE *regexp.Regexp
+}
+
+func (c *commentedOutImportChecker) WalkFile(f *ast.File) {
+ // TODO(Quasilyte): handle commented-out import spec,
+ // for example: // import "errors".
+
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.GenDecl)
+ if !ok || decl.Tok != token.IMPORT {
+ // Import decls can only be in the beginning of the file.
+ // If we've met some other decl, there will be no more
+ // import decls.
+ break
+ }
+
+ // Find comments inside this import decl span.
+ for _, cg := range f.Comments {
+ if cg.Pos() > decl.Rparen {
+ break // Below the decl, stop.
+ }
+ if cg.Pos() < decl.Lparen {
+ continue // Before the decl, skip.
+ }
+
+ for _, comment := range cg.List {
+ for _, m := range c.importStringRE.FindAllStringSubmatch(comment.Text, -1) {
+ c.warn(comment, m[1])
+ }
+ }
+ }
+ }
+}
+
+func (c *commentedOutImportChecker) warn(cause ast.Node, path string) {
+ c.ctx.Warn(cause, "remove commented-out %q import", path)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/defaultCaseOrder_checker.go b/vendor/github.com/go-critic/go-critic/checkers/defaultCaseOrder_checker.go
new file mode 100644
index 00000000000..caa0de65720
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/defaultCaseOrder_checker.go
@@ -0,0 +1,65 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "defaultCaseOrder"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects when default case in switch isn't on 1st or last position"
+ info.Before = `
+switch {
+case x > y:
+ // ...
+default: // <- not the best position
+ // ...
+case x == 10:
+ // ...
+}`
+ info.After = `
+switch {
+case x > y:
+ // ...
+case x == 10:
+ // ...
+default: // <- last case (could also be the first one)
+ // ...
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&defaultCaseOrderChecker{ctx: ctx})
+ })
+}
+
+type defaultCaseOrderChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *defaultCaseOrderChecker) VisitStmt(stmt ast.Stmt) {
+ swtch, ok := stmt.(*ast.SwitchStmt)
+ if !ok {
+ return
+ }
+ for i, stmt := range swtch.Body.List {
+ caseStmt, ok := stmt.(*ast.CaseClause)
+ if !ok {
+ continue
+ }
+ // is `default` case
+ if caseStmt.List == nil {
+ if i != 0 && i != len(swtch.Body.List)-1 {
+ c.warn(caseStmt)
+ }
+ }
+ }
+}
+
+func (c *defaultCaseOrderChecker) warn(cause *ast.CaseClause) {
+ c.ctx.Warn(cause, "consider to make `default` case as first or as last case")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/deprecatedComment_checker.go b/vendor/github.com/go-critic/go-critic/checkers/deprecatedComment_checker.go
new file mode 100644
index 00000000000..d68e32fa8e7
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/deprecatedComment_checker.go
@@ -0,0 +1,148 @@
+package checkers
+
+import (
+ "go/ast"
+ "regexp"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "deprecatedComment"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects malformed 'deprecated' doc-comments"
+ info.Before = `
+// deprecated, use FuncNew instead
+func FuncOld() int`
+ info.After = `
+// Deprecated: use FuncNew instead
+func FuncOld() int`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &deprecatedCommentChecker{ctx: ctx}
+
+ c.commonPatterns = []*regexp.Regexp{
+ regexp.MustCompile(`(?i)this (?:function|type) is deprecated`),
+ regexp.MustCompile(`(?i)deprecated[.!]? use \S* instead`),
+ regexp.MustCompile(`(?i)\[\[deprecated\]\].*`),
+ regexp.MustCompile(`(?i)note: deprecated\b.*`),
+ // TODO(quasilyte): more of these?
+ }
+
+ // TODO(quasilyte): may want to generate this list programmatically.
+ //
+ // TODO(quasilyte): currently it only handles a single missing letter.
+ // Might want to handle other kinds of common misspell/typo kinds.
+ c.commonTypos = []string{
+ "Dprecated: ",
+ "Derecated: ",
+ "Depecated: ",
+ "Deprcated: ",
+ "Depreated: ",
+ "Deprected: ",
+ "Deprecaed: ",
+ "Deprecatd: ",
+ "Deprecate: ",
+ "Derpecate: ",
+ "Derpecated: ",
+ "Depreacted: ",
+ }
+ for i := range c.commonTypos {
+ c.commonTypos[i] = strings.ToUpper(c.commonTypos[i])
+ }
+
+ return astwalk.WalkerForDocComment(c)
+ })
+}
+
+type deprecatedCommentChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ commonPatterns []*regexp.Regexp
+ commonTypos []string
+}
+
+func (c *deprecatedCommentChecker) VisitDocComment(doc *ast.CommentGroup) {
+ // There are 3 accepted forms of deprecation comments:
+ //
+ // 1. inline, that can't be handled with a DocCommentVisitor.
+ // Note that "Deprecated: " may not even be the comment prefix there.
+ // Example: "The line number in the input. Deprecated: Kept for compatibility."
+ // TODO(quasilyte): fix it.
+ //
+ // 2. Longer form-1. It's a doc-comment that only contains "deprecation" notice.
+ //
+ // 3. Like form-2, but may also include doc-comment text.
+ // Distinguished by an empty line.
+ //
+ // See https://github.com/golang/go/issues/10909#issuecomment-136492606.
+ //
+ // It's desirable to see how people make mistakes with the format,
+ // this is why there is currently no special treatment for these cases.
+ // TODO(quasilyte): do more audits and grow the negative tests suite.
+ //
+ // TODO(quasilyte): there are also multi-line deprecation comments.
+
+ for _, comment := range doc.List {
+ if strings.HasPrefix(comment.Text, "/*") {
+ // TODO(quasilyte): handle multi-line doc comments.
+ continue
+ }
+ l := comment.Text[len("//"):]
+ if len(l) < len("Deprecated: ") {
+ continue
+ }
+ l = strings.TrimSpace(l)
+
+ // Check whether someone messed up with a prefix casing.
+ upcase := strings.ToUpper(l)
+ if strings.HasPrefix(upcase, "DEPRECATED: ") && !strings.HasPrefix(l, "Deprecated: ") {
+ c.warnCasing(comment, l)
+ return
+ }
+
+ // Check is someone used comma instead of a colon.
+ if strings.HasPrefix(l, "Deprecated, ") {
+ c.warnComma(comment)
+ return
+ }
+
+ // Check for other commonly used patterns.
+ for _, pat := range c.commonPatterns {
+ if pat.MatchString(l) {
+ c.warnPattern(comment)
+ return
+ }
+ }
+
+ // Detect some simple typos.
+ for _, prefixWithTypo := range c.commonTypos {
+ if strings.HasPrefix(upcase, prefixWithTypo) {
+ c.warnTypo(comment, l)
+ return
+ }
+ }
+ }
+}
+
+func (c *deprecatedCommentChecker) warnCasing(cause ast.Node, line string) {
+ prefix := line[:len("DEPRECATED: ")]
+ c.ctx.Warn(cause, "use `Deprecated: ` (note the casing) instead of `%s`", prefix)
+}
+
+func (c *deprecatedCommentChecker) warnPattern(cause ast.Node) {
+ c.ctx.Warn(cause, "the proper format is `Deprecated: `")
+}
+
+func (c *deprecatedCommentChecker) warnComma(cause ast.Node) {
+ c.ctx.Warn(cause, "use `:` instead of `,` in `Deprecated, `")
+}
+
+func (c *deprecatedCommentChecker) warnTypo(cause ast.Node, line string) {
+ word := strings.Split(line, ":")[0]
+ c.ctx.Warn(cause, "typo in `%s`; should be `Deprecated`", word)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/docStub_checker.go b/vendor/github.com/go-critic/go-critic/checkers/docStub_checker.go
new file mode 100644
index 00000000000..5c771b31cfb
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/docStub_checker.go
@@ -0,0 +1,95 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "regexp"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "docStub"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects comments that silence go lint complaints about doc-comment"
+ info.Before = `
+// Foo ...
+func Foo() {
+}`
+ info.After = `
+// (A) - remove the doc-comment stub
+func Foo() {}
+// (B) - replace it with meaningful comment
+// Foo is a demonstration-only function.
+func Foo() {}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ re := `(?i)^\.\.\.$|^\.$|^xxx\.?$|^whatever\.?$`
+ c := &docStubChecker{
+ ctx: ctx,
+ stubCommentRE: regexp.MustCompile(re),
+ }
+ return c
+ })
+}
+
+type docStubChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ stubCommentRE *regexp.Regexp
+}
+
+func (c *docStubChecker) WalkFile(f *ast.File) {
+ for _, decl := range f.Decls {
+ switch decl := decl.(type) {
+ case *ast.FuncDecl:
+ c.visitDoc(decl, decl.Name, decl.Doc, false)
+ case *ast.GenDecl:
+ if decl.Tok != token.TYPE {
+ continue
+ }
+ if len(decl.Specs) == 1 {
+ spec := decl.Specs[0].(*ast.TypeSpec)
+ // Only 1 spec, use doc from the decl itself.
+ c.visitDoc(spec, spec.Name, decl.Doc, true)
+ }
+ // N specs, use per-spec doc.
+ for _, spec := range decl.Specs {
+ spec := spec.(*ast.TypeSpec)
+ c.visitDoc(spec, spec.Name, spec.Doc, true)
+ }
+ }
+ }
+}
+
+func (c *docStubChecker) visitDoc(decl ast.Node, sym *ast.Ident, doc *ast.CommentGroup, article bool) {
+ if !sym.IsExported() || doc == nil {
+ return
+ }
+ line := strings.TrimSpace(doc.List[0].Text[len("//"):])
+ if article {
+ // Skip optional article.
+ for _, a := range []string{"The ", "An ", "A "} {
+ if strings.HasPrefix(line, a) {
+ line = line[len(a):]
+ break
+ }
+ }
+ }
+ if !strings.HasPrefix(line, sym.Name) {
+ return
+ }
+ line = strings.TrimSpace(line[len(sym.Name):])
+ // Now try to detect the "stub" part.
+ if c.stubCommentRE.MatchString(line) {
+ c.warn(decl)
+ }
+}
+
+func (c *docStubChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "silencing go lint doc-comment warnings is unadvised")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/dupArg_checker.go b/vendor/github.com/go-critic/go-critic/checkers/dupArg_checker.go
new file mode 100644
index 00000000000..431522d8b78
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/dupArg_checker.go
@@ -0,0 +1,118 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "dupArg"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects suspicious duplicated arguments"
+ info.Before = `copy(dst, dst)`
+ info.After = `copy(dst, src)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &dupArgChecker{ctx: ctx}
+ // newMatcherFunc returns a function that matches a call if
+ // args[xIndex] and args[yIndex] are equal.
+ newMatcherFunc := func(xIndex, yIndex int) func(*ast.CallExpr) bool {
+ return func(call *ast.CallExpr) bool {
+ x := call.Args[xIndex]
+ y := call.Args[yIndex]
+ return astequal.Expr(x, y)
+ }
+ }
+
+ // m maps pattern string to a matching function.
+ // String patterns are used for documentation purposes (readability).
+ m := map[string]func(*ast.CallExpr) bool{
+ "(x, x, ...)": newMatcherFunc(0, 1),
+ "(x, _, x, ...)": newMatcherFunc(0, 2),
+ "(_, x, x, ...)": newMatcherFunc(1, 2),
+ }
+
+ // TODO(quasilyte): handle x.Equal(x) cases.
+ // Example: *math/Big.Int.Cmp method.
+
+ // TODO(quasilyte): more perky mode that will also
+ // report things like io.Copy(x, x).
+ // Probably safe thing to do even without that option
+ // if `x` is not interface (requires type checks
+ // that are not incorporated into this checker yet).
+
+ c.matchers = map[string]func(*ast.CallExpr) bool{
+ "copy": m["(x, x, ...)"],
+
+ "math.Max": m["(x, x, ...)"],
+ "math.Min": m["(x, x, ...)"],
+
+ "reflect.Copy": m["(x, x, ...)"],
+ "reflect.DeepEqual": m["(x, x, ...)"],
+
+ "strings.Contains": m["(x, x, ...)"],
+ "strings.Compare": m["(x, x, ...)"],
+ "strings.EqualFold": m["(x, x, ...)"],
+ "strings.HasPrefix": m["(x, x, ...)"],
+ "strings.HasSuffix": m["(x, x, ...)"],
+ "strings.Index": m["(x, x, ...)"],
+ "strings.LastIndex": m["(x, x, ...)"],
+ "strings.Split": m["(x, x, ...)"],
+ "strings.SplitAfter": m["(x, x, ...)"],
+ "strings.SplitAfterN": m["(x, x, ...)"],
+ "strings.SplitN": m["(x, x, ...)"],
+ "strings.Replace": m["(_, x, x, ...)"],
+ "strings.ReplaceAll": m["(_, x, x, ...)"],
+
+ "bytes.Contains": m["(x, x, ...)"],
+ "bytes.Compare": m["(x, x, ...)"],
+ "bytes.Equal": m["(x, x, ...)"],
+ "bytes.EqualFold": m["(x, x, ...)"],
+ "bytes.HasPrefix": m["(x, x, ...)"],
+ "bytes.HasSuffix": m["(x, x, ...)"],
+ "bytes.Index": m["(x, x, ...)"],
+ "bytes.LastIndex": m["(x, x, ...)"],
+ "bytes.Split": m["(x, x, ...)"],
+ "bytes.SplitAfter": m["(x, x, ...)"],
+ "bytes.SplitAfterN": m["(x, x, ...)"],
+ "bytes.SplitN": m["(x, x, ...)"],
+ "bytes.Replace": m["(_, x, x, ...)"],
+ "bytes.ReplaceAll": m["(_, x, x, ...)"],
+
+ "types.Identical": m["(x, x, ...)"],
+ "types.IdenticalIgnoreTags": m["(x, x, ...)"],
+
+ "draw.Draw": m["(x, _, x, ...)"],
+
+ // TODO(quasilyte): more of these.
+ }
+ return astwalk.WalkerForExpr(c)
+ })
+}
+
+type dupArgChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ matchers map[string]func(*ast.CallExpr) bool
+}
+
+func (c *dupArgChecker) VisitExpr(expr ast.Expr) {
+ call, ok := expr.(*ast.CallExpr)
+ if !ok {
+ return
+ }
+
+ m := c.matchers[qualifiedName(call.Fun)]
+ if m != nil && m(call) {
+ c.warn(call)
+ }
+}
+
+func (c *dupArgChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "suspicious duplicated args in `%s`", cause)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/dupBranchBody_checker.go b/vendor/github.com/go-critic/go-critic/checkers/dupBranchBody_checker.go
new file mode 100644
index 00000000000..a13884873c1
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/dupBranchBody_checker.go
@@ -0,0 +1,58 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "dupBranchBody"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects duplicated branch bodies inside conditional statements"
+ info.Before = `
+if cond {
+ println("cond=true")
+} else {
+ println("cond=true")
+}`
+ info.After = `
+if cond {
+ println("cond=true")
+} else {
+ println("cond=false")
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&dupBranchBodyChecker{ctx: ctx})
+ })
+}
+
+type dupBranchBodyChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *dupBranchBodyChecker) VisitStmt(stmt ast.Stmt) {
+ // TODO(quasilyte): extend to check switch statements as well.
+ // Should be very careful with type switches.
+
+ if stmt, ok := stmt.(*ast.IfStmt); ok {
+ c.checkIf(stmt)
+ }
+}
+
+func (c *dupBranchBodyChecker) checkIf(stmt *ast.IfStmt) {
+ thenBody := stmt.Body
+ elseBody, ok := stmt.Else.(*ast.BlockStmt)
+ if ok && astequal.Stmt(thenBody, elseBody) {
+ c.warnIf(stmt)
+ }
+}
+
+func (c *dupBranchBodyChecker) warnIf(cause ast.Node) {
+ c.ctx.Warn(cause, "both branches in if statement has same body")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/dupCase_checker.go b/vendor/github.com/go-critic/go-critic/checkers/dupCase_checker.go
new file mode 100644
index 00000000000..26ef17398f8
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/dupCase_checker.go
@@ -0,0 +1,57 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "dupCase"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects duplicated case clauses inside switch statements"
+ info.Before = `
+switch x {
+case ys[0], ys[1], ys[2], ys[0], ys[4]:
+}`
+ info.After = `
+switch x {
+case ys[0], ys[1], ys[2], ys[3], ys[4]:
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&dupCaseChecker{ctx: ctx})
+ })
+}
+
+type dupCaseChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ astSet lintutil.AstSet
+}
+
+func (c *dupCaseChecker) VisitStmt(stmt ast.Stmt) {
+ if stmt, ok := stmt.(*ast.SwitchStmt); ok {
+ c.checkSwitch(stmt)
+ }
+}
+
+func (c *dupCaseChecker) checkSwitch(stmt *ast.SwitchStmt) {
+ c.astSet.Clear()
+ for i := range stmt.Body.List {
+ cc := stmt.Body.List[i].(*ast.CaseClause)
+ for _, x := range cc.List {
+ if !c.astSet.Insert(x) {
+ c.warn(x)
+ }
+ }
+ }
+}
+
+func (c *dupCaseChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "'case %s' is duplicated", cause)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/dupSubExpr_checker.go b/vendor/github.com/go-critic/go-critic/checkers/dupSubExpr_checker.go
new file mode 100644
index 00000000000..24bb52434f3
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/dupSubExpr_checker.go
@@ -0,0 +1,102 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "dupSubExpr"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects suspicious duplicated sub-expressions"
+ info.Before = `
+sort.Slice(xs, func(i, j int) bool {
+ return xs[i].v < xs[i].v // Duplicated index
+})`
+ info.After = `
+sort.Slice(xs, func(i, j int) bool {
+ return xs[i].v < xs[j].v
+})`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &dupSubExprChecker{ctx: ctx}
+
+ ops := []struct {
+ op token.Token
+ float bool // Whether float args require special care
+ }{
+ {op: token.LOR}, // x || x
+ {op: token.LAND}, // x && x
+ {op: token.OR}, // x | x
+ {op: token.AND}, // x & x
+ {op: token.XOR}, // x ^ x
+ {op: token.LSS}, // x < x
+ {op: token.GTR}, // x > x
+ {op: token.AND_NOT}, // x &^ x
+ {op: token.REM}, // x % x
+
+ {op: token.EQL, float: true}, // x == x
+ {op: token.NEQ, float: true}, // x != x
+ {op: token.LEQ, float: true}, // x <= x
+ {op: token.GEQ, float: true}, // x >= x
+ {op: token.QUO, float: true}, // x / x
+ {op: token.SUB, float: true}, // x - x
+ }
+
+ c.opSet = make(map[token.Token]bool)
+ c.floatOpsSet = make(map[token.Token]bool)
+ for _, opInfo := range ops {
+ c.opSet[opInfo.op] = true
+ if opInfo.float {
+ c.floatOpsSet[opInfo.op] = true
+ }
+ }
+
+ return astwalk.WalkerForExpr(c)
+ })
+}
+
+type dupSubExprChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ // opSet is a set of binary operations that do not make
+ // sense with duplicated (same) RHS and LHS.
+ opSet map[token.Token]bool
+
+ floatOpsSet map[token.Token]bool
+}
+
+func (c *dupSubExprChecker) VisitExpr(expr ast.Expr) {
+ if expr, ok := expr.(*ast.BinaryExpr); ok {
+ c.checkBinaryExpr(expr)
+ }
+}
+
+func (c *dupSubExprChecker) checkBinaryExpr(expr *ast.BinaryExpr) {
+ if !c.opSet[expr.Op] {
+ return
+ }
+ if c.resultIsFloat(expr.X) && c.floatOpsSet[expr.Op] {
+ return
+ }
+ if typep.SideEffectFree(c.ctx.TypesInfo, expr) && c.opSet[expr.Op] && astequal.Expr(expr.X, expr.Y) {
+ c.warn(expr)
+ }
+}
+
+func (c *dupSubExprChecker) resultIsFloat(expr ast.Expr) bool {
+ typ, ok := c.ctx.TypesInfo.TypeOf(expr).(*types.Basic)
+ return ok && typ.Info()&types.IsFloat != 0
+}
+
+func (c *dupSubExprChecker) warn(cause *ast.BinaryExpr) {
+ c.ctx.Warn(cause, "suspicious identical LHS and RHS for `%s` operator", cause.Op)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/elseif_checker.go b/vendor/github.com/go-critic/go-critic/checkers/elseif_checker.go
new file mode 100644
index 00000000000..c3a9546bf07
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/elseif_checker.go
@@ -0,0 +1,71 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astp"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "elseif"
+ info.Tags = []string{"style"}
+ info.Params = lintpack.CheckerParams{
+ "skipBalanced": {
+ Value: true,
+ Usage: "whether to skip balanced if-else pairs",
+ },
+ }
+ info.Summary = "Detects else with nested if statement that can be replaced with else-if"
+ info.Before = `
+if cond1 {
+} else {
+ if x := cond2; x {
+ }
+}`
+ info.After = `
+if cond1 {
+} else if x := cond2; x {
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &elseifChecker{ctx: ctx}
+ c.skipBalanced = info.Params.Bool("skipBalanced")
+ return astwalk.WalkerForStmt(c)
+ })
+}
+
+type elseifChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ skipBalanced bool
+}
+
+func (c *elseifChecker) VisitStmt(stmt ast.Stmt) {
+ if stmt, ok := stmt.(*ast.IfStmt); ok {
+ elseBody, ok := stmt.Else.(*ast.BlockStmt)
+ if !ok || len(elseBody.List) != 1 {
+ return
+ }
+ innerIfStmt, ok := elseBody.List[0].(*ast.IfStmt)
+ if !ok {
+ return
+ }
+ balanced := len(stmt.Body.List) == 1 &&
+ astp.IsIfStmt(stmt.Body.List[0])
+ if balanced && c.skipBalanced {
+ return // Configured to skip balanced statements
+ }
+ if innerIfStmt.Else != nil {
+ return
+ }
+ c.warn(stmt.Else)
+ }
+}
+
+func (c *elseifChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "can replace 'else {if cond {}}' with 'else if cond {}'")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/emptyFallthrough_checker.go b/vendor/github.com/go-critic/go-critic/checkers/emptyFallthrough_checker.go
new file mode 100644
index 00000000000..5908dfa3167
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/emptyFallthrough_checker.go
@@ -0,0 +1,70 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "emptyFallthrough"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects fallthrough that can be avoided by using multi case values"
+ info.Before = `switch kind {
+case reflect.Int:
+ fallthrough
+case reflect.Int32:
+ return Int
+}`
+ info.After = `switch kind {
+case reflect.Int, reflect.Int32:
+ return Int
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&emptyFallthroughChecker{ctx: ctx})
+ })
+}
+
+type emptyFallthroughChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *emptyFallthroughChecker) VisitStmt(stmt ast.Stmt) {
+ ss, ok := stmt.(*ast.SwitchStmt)
+ if !ok {
+ return
+ }
+
+ prevCaseDefault := false
+ for i := len(ss.Body.List) - 1; i >= 0; i-- {
+ if cc, ok := ss.Body.List[i].(*ast.CaseClause); ok {
+ warn := false
+ if len(cc.Body) == 1 {
+ if bs, ok := cc.Body[0].(*ast.BranchStmt); ok && bs.Tok == token.FALLTHROUGH {
+ warn = true
+ if prevCaseDefault {
+ c.warnDefault(bs)
+ } else {
+ c.warn(bs)
+ }
+ }
+ }
+ if !warn {
+ prevCaseDefault = cc.List == nil
+ }
+ }
+ }
+}
+
+func (c *emptyFallthroughChecker) warnDefault(cause ast.Node) {
+ c.ctx.Warn(cause, "remove empty case containing only fallthrough to default case")
+}
+
+func (c *emptyFallthroughChecker) warn(cause ast.Node) {
+ c.ctx.Warn(cause, "replace empty case containing only fallthrough with expression list")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/emptyStringTest_checker.go b/vendor/github.com/go-critic/go-critic/checkers/emptyStringTest_checker.go
new file mode 100644
index 00000000000..a7be906ed08
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/emptyStringTest_checker.go
@@ -0,0 +1,58 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "emptyStringTest"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects empty string checks that can be written more idiomatically"
+ info.Before = `len(s) == 0`
+ info.After = `s == ""`
+ info.Note = "See https://dmitri.shuralyov.com/idiomatic-go#empty-string-check."
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&emptyStringTestChecker{ctx: ctx})
+ })
+}
+
+type emptyStringTestChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *emptyStringTestChecker) VisitExpr(e ast.Expr) {
+ cmp := astcast.ToBinaryExpr(e)
+ if cmp.Op != token.EQL && cmp.Op != token.NEQ {
+ return
+ }
+ lenCall := astcast.ToCallExpr(cmp.X)
+ if astcast.ToIdent(lenCall.Fun).Name != "len" {
+ return
+ }
+ s := lenCall.Args[0]
+ if !typep.HasStringProp(c.ctx.TypesInfo.TypeOf(s)) {
+ return
+ }
+ zero := astcast.ToBasicLit(cmp.Y)
+ if zero.Value != "0" {
+ return
+ }
+ c.warn(cmp, s)
+}
+
+func (c *emptyStringTestChecker) warn(cmp *ast.BinaryExpr, s ast.Expr) {
+ suggest := astcopy.BinaryExpr(cmp)
+ suggest.X = s
+ suggest.Y = &ast.BasicLit{Value: `""`}
+ c.ctx.Warn(cmp, "replace `%s` with `%s`", cmp, suggest)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/equalFold_checker.go b/vendor/github.com/go-critic/go-critic/checkers/equalFold_checker.go
new file mode 100644
index 00000000000..265b2f79bee
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/equalFold_checker.go
@@ -0,0 +1,87 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "equalFold"
+ info.Tags = []string{"performance", "experimental"}
+ info.Summary = "Detects unoptimal strings/bytes case-insensitive comparison"
+ info.Before = `strings.ToLower(x) == strings.ToLower(y)`
+ info.After = `strings.EqualFold(x, y)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&equalFoldChecker{ctx: ctx})
+ })
+}
+
+type equalFoldChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *equalFoldChecker) VisitExpr(e ast.Expr) {
+ switch e := e.(type) {
+ case *ast.CallExpr:
+ c.checkBytes(e)
+ case *ast.BinaryExpr:
+ c.checkStrings(e)
+ }
+}
+
+// uncaseCall simplifies lower(x) or upper(x) to x.
+// If no simplification is applied, second return value is false.
+func (c *equalFoldChecker) uncaseCall(x ast.Expr, lower, upper string) (ast.Expr, bool) {
+ call := astcast.ToCallExpr(x)
+ name := qualifiedName(call.Fun)
+ if name != lower && name != upper {
+ return x, false
+ }
+ return call.Args[0], true
+}
+
+func (c *equalFoldChecker) checkBytes(expr *ast.CallExpr) {
+ if qualifiedName(expr.Fun) != "bytes.Equal" {
+ return
+ }
+
+ x, ok1 := c.uncaseCall(expr.Args[0], "bytes.ToLower", "bytes.ToUpper")
+ y, ok2 := c.uncaseCall(expr.Args[1], "bytes.ToLower", "bytes.ToUpper")
+ if !ok1 && !ok2 {
+ return
+ }
+ if !astequal.Expr(x, y) {
+ c.warnBytes(expr, x, y)
+ }
+}
+
+func (c *equalFoldChecker) checkStrings(expr *ast.BinaryExpr) {
+ if expr.Op != token.EQL && expr.Op != token.NEQ {
+ return
+ }
+
+ x, ok1 := c.uncaseCall(expr.X, "strings.ToLower", "strings.ToUpper")
+ y, ok2 := c.uncaseCall(expr.Y, "strings.ToLower", "strings.ToUpper")
+ if !ok1 && !ok2 {
+ return
+ }
+ if !astequal.Expr(x, y) {
+ c.warnStrings(expr, x, y)
+ }
+}
+
+func (c *equalFoldChecker) warnStrings(cause ast.Node, x, y ast.Expr) {
+ c.ctx.Warn(cause, "consider replacing with strings.EqualFold(%s, %s)", x, y)
+}
+
+func (c *equalFoldChecker) warnBytes(cause ast.Node, x, y ast.Expr) {
+ c.ctx.Warn(cause, "consider replacing with bytes.EqualFold(%s, %s)", x, y)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/exitAfterDefer_checker.go b/vendor/github.com/go-critic/go-critic/checkers/exitAfterDefer_checker.go
new file mode 100644
index 00000000000..05ed6ae9e1a
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/exitAfterDefer_checker.go
@@ -0,0 +1,78 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astfmt"
+ "github.com/go-toolsmith/astp"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "exitAfterDefer"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects calls to exit/fatal inside functions that use defer"
+ info.Before = `
+defer os.Remove(filename)
+if bad {
+ log.Fatalf("something bad happened")
+}`
+ info.After = `
+defer os.Remove(filename)
+if bad {
+ log.Printf("something bad happened")
+ return
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForFuncDecl(&exitAfterDeferChecker{ctx: ctx})
+ })
+}
+
+type exitAfterDeferChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *exitAfterDeferChecker) VisitFuncDecl(fn *ast.FuncDecl) {
+ // TODO(Quasilyte): handle goto and other kinds of flow that break
+ // the algorithm below that expects the latter statement to be
+ // executed after the ones that come before it.
+
+ var deferStmt *ast.DeferStmt
+ pre := func(cur *astutil.Cursor) bool {
+ // Don't recurse into local anonymous functions.
+ return !astp.IsFuncLit(cur.Node())
+ }
+ post := func(cur *astutil.Cursor) bool {
+ switch n := cur.Node().(type) {
+ case *ast.DeferStmt:
+ deferStmt = n
+ case *ast.CallExpr:
+ if deferStmt != nil {
+ switch qualifiedName(n.Fun) {
+ case "log.Fatal", "log.Fatalf", "log.Fatalln", "os.Exit":
+ c.warn(n, deferStmt)
+ return false
+ }
+ }
+ }
+ return true
+ }
+ astutil.Apply(fn.Body, pre, post)
+}
+
+func (c *exitAfterDeferChecker) warn(cause *ast.CallExpr, deferStmt *ast.DeferStmt) {
+ var s string
+ if fnlit, ok := deferStmt.Call.Fun.(*ast.FuncLit); ok {
+ // To avoid long and multi-line warning messages,
+ // collapse the function literals.
+ s = "defer " + astfmt.Sprint(fnlit.Type) + "{...}(...)"
+ } else {
+ s = astfmt.Sprint(deferStmt)
+ }
+ c.ctx.Warn(cause, "%s clutters `%s`", cause.Fun, s)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/flagDeref_checker.go b/vendor/github.com/go-critic/go-critic/checkers/flagDeref_checker.go
new file mode 100644
index 00000000000..cb9faee716d
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/flagDeref_checker.go
@@ -0,0 +1,65 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "flagDeref"
+ info.Tags = []string{"diagnostic"}
+ info.Summary = "Detects immediate dereferencing of `flag` package pointers"
+ info.Details = "Suggests to use pointer to array to avoid the copy using `&` on range expression."
+ info.Before = `b := *flag.Bool("b", false, "b docs")`
+ info.After = `
+var b bool
+flag.BoolVar(&b, "b", false, "b docs")`
+ info.Note = `
+Dereferencing returned pointers will lead to hard to find errors
+where flag values are not updated after flag.Parse().`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &flagDerefChecker{
+ ctx: ctx,
+ flagPtrFuncs: map[string]bool{
+ "flag.Bool": true,
+ "flag.Duration": true,
+ "flag.Float64": true,
+ "flag.Int": true,
+ "flag.Int64": true,
+ "flag.String": true,
+ "flag.Uint": true,
+ "flag.Uint64": true,
+ },
+ }
+ return astwalk.WalkerForExpr(c)
+ })
+}
+
+type flagDerefChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ flagPtrFuncs map[string]bool
+}
+
+func (c *flagDerefChecker) VisitExpr(expr ast.Expr) {
+ if expr, ok := expr.(*ast.StarExpr); ok {
+ call, ok := expr.X.(*ast.CallExpr)
+ if !ok {
+ return
+ }
+ called := qualifiedName(call.Fun)
+ if c.flagPtrFuncs[called] {
+ c.warn(expr, called+"Var")
+ }
+ }
+}
+
+func (c *flagDerefChecker) warn(x ast.Node, suggestion string) {
+ c.ctx.Warn(x, "immediate deref in %s is most likely an error; consider using %s",
+ x, suggestion)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/flagName_checker.go b/vendor/github.com/go-critic/go-critic/checkers/flagName_checker.go
new file mode 100644
index 00000000000..1d43ba52113
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/flagName_checker.go
@@ -0,0 +1,68 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/constant"
+ "go/types"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "flagName"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects flag names with whitespace"
+ info.Before = `b := flag.Bool(" foo ", false, "description")`
+ info.After = `b := flag.Bool("foo", false, "description")`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&flagNameChecker{ctx: ctx})
+ })
+}
+
+type flagNameChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *flagNameChecker) VisitExpr(expr ast.Expr) {
+ call := astcast.ToCallExpr(expr)
+ calledExpr := astcast.ToSelectorExpr(call.Fun)
+ obj, ok := c.ctx.TypesInfo.ObjectOf(astcast.ToIdent(calledExpr.X)).(*types.PkgName)
+ if !ok {
+ return
+ }
+ sym := calledExpr.Sel
+ pkg := obj.Imported()
+ if pkg.Path() != "flag" {
+ return
+ }
+
+ switch sym.Name {
+ case "Bool", "Duration", "Float64", "String",
+ "Int", "Int64", "Uint", "Uint64":
+ c.checkFlagName(call, call.Args[0])
+ case "BoolVar", "DurationVar", "Float64Var", "StringVar",
+ "IntVar", "Int64Var", "UintVar", "Uint64Var":
+ c.checkFlagName(call, call.Args[1])
+ }
+}
+
+func (c *flagNameChecker) checkFlagName(call *ast.CallExpr, arg ast.Expr) {
+ cv := c.ctx.TypesInfo.Types[arg].Value
+ if cv == nil {
+ return // Non-constant name
+ }
+ name := constant.StringVal(cv)
+ if strings.Contains(name, " ") {
+ c.warnWhitespace(call, name)
+ }
+}
+
+func (c *flagNameChecker) warnWhitespace(cause ast.Node, name string) {
+ c.ctx.Warn(cause, "flag name %q contains whitespace", name)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/hexLiteral_checker.go b/vendor/github.com/go-critic/go-critic/checkers/hexLiteral_checker.go
new file mode 100644
index 00000000000..a700314cf3d
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/hexLiteral_checker.go
@@ -0,0 +1,60 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "hexLiteral"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects hex literals that have mixed case letter digits"
+ info.Before = `
+x := 0X12
+y := 0xfF`
+ info.After = `
+x := 0x12
+// (A)
+y := 0xff
+// (B)
+y := 0xFF`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&hexLiteralChecker{ctx: ctx})
+ })
+}
+
+type hexLiteralChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *hexLiteralChecker) warn0X(lit *ast.BasicLit) {
+ suggest := "0x" + lit.Value[len("0X"):]
+ c.ctx.Warn(lit, "prefer 0x over 0X, s/%s/%s/", lit.Value, suggest)
+}
+
+func (c *hexLiteralChecker) warnMixedDigits(lit *ast.BasicLit) {
+ c.ctx.Warn(lit, "don't mix hex literal letter digits casing")
+}
+
+func (c *hexLiteralChecker) VisitExpr(expr ast.Expr) {
+ lit := astcast.ToBasicLit(expr)
+ if lit.Kind != token.INT || len(lit.Value) < 3 {
+ return
+ }
+ if strings.HasPrefix(lit.Value, "0X") {
+ c.warn0X(lit)
+ return
+ }
+ digits := lit.Value[len("0x"):]
+ if strings.ToLower(digits) != digits && strings.ToUpper(digits) != digits {
+ c.warnMixedDigits(lit)
+ }
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/hugeParam_checker.go b/vendor/github.com/go-critic/go-critic/checkers/hugeParam_checker.go
new file mode 100644
index 00000000000..656b4cc2d79
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/hugeParam_checker.go
@@ -0,0 +1,63 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "hugeParam"
+ info.Tags = []string{"performance"}
+ info.Params = lintpack.CheckerParams{
+ "sizeThreshold": {
+ Value: 80,
+ Usage: "size in bytes that makes the warning trigger",
+ },
+ }
+ info.Summary = "Detects params that incur excessive amount of copying"
+ info.Before = `func f(x [1024]int) {}`
+ info.After = `func f(x *[1024]int) {}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForFuncDecl(&hugeParamChecker{
+ ctx: ctx,
+ sizeThreshold: int64(info.Params.Int("sizeThreshold")),
+ })
+ })
+}
+
+type hugeParamChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ sizeThreshold int64
+}
+
+func (c *hugeParamChecker) VisitFuncDecl(decl *ast.FuncDecl) {
+ // TODO(quasilyte): maybe it's worthwhile to permit skipping
+ // test files for this checker?
+ if decl.Recv != nil {
+ c.checkParams(decl.Recv.List)
+ }
+ c.checkParams(decl.Type.Params.List)
+}
+
+func (c *hugeParamChecker) checkParams(params []*ast.Field) {
+ for _, p := range params {
+ for _, id := range p.Names {
+ typ := c.ctx.TypesInfo.TypeOf(id)
+ size := c.ctx.SizesInfo.Sizeof(typ)
+ if size >= c.sizeThreshold {
+ c.warn(id, size)
+ }
+ }
+ }
+}
+
+func (c *hugeParamChecker) warn(cause *ast.Ident, size int64) {
+ c.ctx.Warn(cause, "%s is heavy (%d bytes); consider passing it by pointer",
+ cause, size)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/ifElseChain_checker.go b/vendor/github.com/go-critic/go-critic/checkers/ifElseChain_checker.go
new file mode 100644
index 00000000000..c0a456afd21
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/ifElseChain_checker.go
@@ -0,0 +1,99 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "ifElseChain"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects repeated if-else statements and suggests to replace them with switch statement"
+ info.Before = `
+if cond1 {
+ // Code A.
+} else if cond2 {
+ // Code B.
+} else {
+ // Code C.
+}`
+ info.After = `
+switch {
+case cond1:
+ // Code A.
+case cond2:
+ // Code B.
+default:
+ // Code C.
+}`
+ info.Note = `
+Permits single else or else-if; repeated else-if or else + else-if
+will trigger suggestion to use switch statement.
+See [EffectiveGo#switch](https://golang.org/doc/effective_go.html#switch).`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&ifElseChainChecker{ctx: ctx})
+ })
+}
+
+type ifElseChainChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ cause *ast.IfStmt
+ visited map[*ast.IfStmt]bool
+}
+
+func (c *ifElseChainChecker) EnterFunc(fn *ast.FuncDecl) bool {
+ if fn.Body == nil {
+ return false
+ }
+ c.visited = make(map[*ast.IfStmt]bool)
+ return true
+}
+
+func (c *ifElseChainChecker) VisitStmt(stmt ast.Stmt) {
+ if stmt, ok := stmt.(*ast.IfStmt); ok {
+ if c.visited[stmt] {
+ return
+ }
+ c.cause = stmt
+ c.checkIfStmt(stmt)
+ }
+}
+
+func (c *ifElseChainChecker) checkIfStmt(stmt *ast.IfStmt) {
+ const minThreshold = 2
+ if c.countIfelseLen(stmt) >= minThreshold {
+ c.warn()
+ }
+}
+
+func (c *ifElseChainChecker) countIfelseLen(stmt *ast.IfStmt) int {
+ count := 0
+ for {
+ switch e := stmt.Else.(type) {
+ case *ast.IfStmt:
+ if e.Init != nil {
+ return 0 // Give up
+ }
+ // Else if.
+ stmt = e
+ count++
+ c.visited[e] = true
+ case *ast.BlockStmt:
+ // Else branch.
+ return count + 1
+ default:
+ // No else or else if.
+ return count
+ }
+ }
+}
+
+func (c *ifElseChainChecker) warn() {
+ c.ctx.Warn(c.cause, "rewrite if-else to switch statement")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/importShadow_checker.go b/vendor/github.com/go-critic/go-critic/checkers/importShadow_checker.go
new file mode 100644
index 00000000000..9a2ccc55ecd
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/importShadow_checker.go
@@ -0,0 +1,47 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "importShadow"
+ info.Tags = []string{"style", "opinionated"}
+ info.Summary = "Detects when imported package names shadowed in the assignments"
+ info.Before = `
+// "path/filepath" is imported.
+filepath := "foo.txt"`
+ info.After = `
+filename := "foo.txt"`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ ctx.Require.PkgObjects = true
+ return astwalk.WalkerForLocalDef(&importShadowChecker{ctx: ctx}, ctx.TypesInfo)
+ })
+}
+
+type importShadowChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *importShadowChecker) VisitLocalDef(def astwalk.Name, _ ast.Expr) {
+ for pkgObj, name := range c.ctx.PkgObjects {
+ if name == def.ID.Name && name != "_" {
+ c.warn(def.ID, name, pkgObj.Imported())
+ }
+ }
+}
+
+func (c *importShadowChecker) warn(id ast.Node, importedName string, pkg *types.Package) {
+ if isStdlibPkg(pkg) {
+ c.ctx.Warn(id, "shadow of imported package '%s'", importedName)
+ } else {
+ c.ctx.Warn(id, "shadow of imported from '%s' package '%s'", pkg.Path(), importedName)
+ }
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/indexAlloc_checker.go b/vendor/github.com/go-critic/go-critic/checkers/indexAlloc_checker.go
new file mode 100644
index 00000000000..8fbe98c9d2b
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/indexAlloc_checker.go
@@ -0,0 +1,50 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "indexAlloc"
+ info.Tags = []string{"performance"}
+ info.Summary = "Detects strings.Index calls that may cause unwanted allocs"
+ info.Before = `strings.Index(string(x), y)`
+ info.After = `bytes.Index(x, []byte(y))`
+ info.Note = `See Go issue for details: https://github.com/golang/go/issues/25864`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&indexAllocChecker{ctx: ctx})
+ })
+}
+
+type indexAllocChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *indexAllocChecker) VisitExpr(e ast.Expr) {
+ call := astcast.ToCallExpr(e)
+ if qualifiedName(call.Fun) != "strings.Index" {
+ return
+ }
+ stringConv := astcast.ToCallExpr(call.Args[0])
+ if qualifiedName(stringConv.Fun) != "string" {
+ return
+ }
+ x := stringConv.Args[0]
+ y := call.Args[1]
+ if typep.SideEffectFree(c.ctx.TypesInfo, x) && typep.SideEffectFree(c.ctx.TypesInfo, y) {
+ c.warn(e, x, y)
+ }
+}
+
+func (c *indexAllocChecker) warn(cause ast.Node, x, y ast.Expr) {
+ c.ctx.Warn(cause, "consider replacing %s with bytes.Index(%s, []byte(%s))",
+ cause, x, y)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/initClause_checker.go b/vendor/github.com/go-critic/go-critic/checkers/initClause_checker.go
new file mode 100644
index 00000000000..bfbd661b245
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/initClause_checker.go
@@ -0,0 +1,56 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astp"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "initClause"
+ info.Tags = []string{"style", "opinionated", "experimental"}
+ info.Summary = "Detects non-assignment statements inside if/switch init clause"
+ info.Before = `if sideEffect(); cond {
+}`
+ info.After = `sideEffect()
+if cond {
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&initClauseChecker{ctx: ctx})
+ })
+}
+
+type initClauseChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *initClauseChecker) VisitStmt(stmt ast.Stmt) {
+ initClause := c.getInitClause(stmt)
+ if initClause != nil && !astp.IsAssignStmt(initClause) {
+ c.warn(stmt, initClause)
+ }
+}
+
+func (c *initClauseChecker) getInitClause(x ast.Stmt) ast.Stmt {
+ switch x := x.(type) {
+ case *ast.IfStmt:
+ return x.Init
+ case *ast.SwitchStmt:
+ return x.Init
+ default:
+ return nil
+ }
+}
+
+func (c *initClauseChecker) warn(stmt, clause ast.Stmt) {
+ name := "if"
+ if astp.IsSwitchStmt(stmt) {
+ name = "switch"
+ }
+ c.ctx.Warn(stmt, "consider to move `%s` before %s", clause, name)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astfind.go b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astfind.go
new file mode 100644
index 00000000000..3c0a95afc53
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astfind.go
@@ -0,0 +1,27 @@
+package lintutil
+
+import (
+ "go/ast"
+
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+// FindNode applies pred for root and all it's childs until it returns true.
+// Matched node is returned.
+// If none of the nodes matched predicate, nil is returned.
+func FindNode(root ast.Node, pred func(ast.Node) bool) ast.Node {
+ var found ast.Node
+ astutil.Apply(root, nil, func(cur *astutil.Cursor) bool {
+ if pred(cur.Node()) {
+ found = cur.Node()
+ return false
+ }
+ return true
+ })
+ return found
+}
+
+// ContainsNode reports whether `FindNode(root, pred)!=nil`.
+func ContainsNode(root ast.Node, pred func(ast.Node) bool) bool {
+ return FindNode(root, pred) != nil
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astflow.go b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astflow.go
new file mode 100644
index 00000000000..63d181e5eb2
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astflow.go
@@ -0,0 +1,86 @@
+package lintutil
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/astp"
+ "github.com/go-toolsmith/typep"
+)
+
+// Different utilities to make simple analysis over typed ast values flow.
+//
+// It's primitive and can't replace SSA, but the bright side is that
+// it does not require building an additional IR eagerly.
+// Expected to be used sparingly inside a few checkers.
+//
+// If proven really useful, can be moved to go-toolsmith library.
+
+// IsImmutable reports whether n can be midified through any operation.
+func IsImmutable(info *types.Info, n ast.Expr) bool {
+ if astp.IsBasicLit(n) {
+ return true
+ }
+ tv, ok := info.Types[n]
+ return ok && !tv.Assignable() && !tv.Addressable()
+}
+
+// CouldBeMutated reports whether dst can be modified inside body.
+//
+// Note that it does not take already existing pointers to dst.
+// An example of safe and correct usage is checking of something
+// that was just defined, so the dst is a result of that definition.
+func CouldBeMutated(info *types.Info, body ast.Node, dst ast.Expr) bool {
+ if IsImmutable(info, dst) { // Fast path.
+ return false
+ }
+
+ // We don't track pass-by-value.
+ // If it's already a pointer, passing it by value
+ // means that there can be a potential indirect modification.
+ //
+ // It's possible to be less conservative here and find at least
+ // one such value pass before giving up.
+ if typep.IsPointer(info.TypeOf(dst)) {
+ return true
+ }
+
+ var isDst func(x ast.Expr) bool
+ if dst, ok := dst.(*ast.Ident); ok {
+ // Identifier can be shadowed,
+ // so we need to check the object as well.
+ obj := info.ObjectOf(dst)
+ if obj == nil {
+ return true // Being conservative
+ }
+ isDst = func(x ast.Expr) bool {
+ id, ok := x.(*ast.Ident)
+ return ok && id.Name == dst.Name && info.ObjectOf(id) == obj
+ }
+ } else {
+ isDst = func(x ast.Expr) bool {
+ return astequal.Expr(dst, x)
+ }
+ }
+
+ return ContainsNode(body, func(n ast.Node) bool {
+ switch n := n.(type) {
+ case *ast.UnaryExpr:
+ if n.Op == token.AND && isDst(n.X) {
+ return true // Address taken
+ }
+ case *ast.AssignStmt:
+ for _, lhs := range n.Lhs {
+ if isDst(lhs) {
+ return true
+ }
+ }
+ case *ast.IncDecStmt:
+ // Incremented or decremented.
+ return isDst(n.X)
+ }
+ return false
+ })
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astset.go b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astset.go
new file mode 100644
index 00000000000..ebe7835e51f
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/astset.go
@@ -0,0 +1,44 @@
+package lintutil
+
+import (
+ "go/ast"
+
+ "github.com/go-toolsmith/astequal"
+)
+
+// AstSet is a simple ast.Node set.
+// Zero value is ready to use set.
+// Can be reused after Clear call.
+type AstSet struct {
+ items []ast.Node
+}
+
+// Contains reports whether s contains x.
+func (s *AstSet) Contains(x ast.Node) bool {
+ for i := range s.items {
+ if astequal.Node(s.items[i], x) {
+ return true
+ }
+ }
+ return false
+}
+
+// Insert pushes x in s if it's not already there.
+// Returns true if element was inserted.
+func (s *AstSet) Insert(x ast.Node) bool {
+ if s.Contains(x) {
+ return false
+ }
+ s.items = append(s.items, x)
+ return true
+}
+
+// Clear removes all element from set.
+func (s *AstSet) Clear() {
+ s.items = s.items[:0]
+}
+
+// Len returns the number of elements contained inside s.
+func (s *AstSet) Len() int {
+ return len(s.items)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/lintutil.go b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/lintutil.go
new file mode 100644
index 00000000000..333543b1bd3
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/internal/lintutil/lintutil.go
@@ -0,0 +1,37 @@
+package lintutil
+
+import (
+ "go/ast"
+ "go/types"
+)
+
+// TODO: this package is a way to reuse code between lint and astwalk.
+// Would be good to find it a better name.
+
+// IsTypeExpr reports whether x represents type expression.
+//
+// Type expression does not evaluate to any run time value,
+// but rather describes type that is used inside Go expression.
+// For example, (*T)(v) is a CallExpr that "calls" (*T).
+// (*T) is a type expression that tells Go compiler type v should be converted to.
+func IsTypeExpr(info *types.Info, x ast.Expr) bool {
+ switch x := x.(type) {
+ case *ast.StarExpr:
+ return IsTypeExpr(info, x.X)
+ case *ast.ParenExpr:
+ return IsTypeExpr(info, x.X)
+ case *ast.SelectorExpr:
+ return IsTypeExpr(info, x.Sel)
+ case *ast.Ident:
+ // Identifier may be a type expression if object
+ // it reffers to is a type name.
+ _, ok := info.ObjectOf(x).(*types.TypeName)
+ return ok
+
+ case *ast.FuncType, *ast.StructType, *ast.InterfaceType, *ast.ArrayType, *ast.MapType:
+ return true
+
+ default:
+ return false
+ }
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/methodExprCall_checker.go b/vendor/github.com/go-critic/go-critic/checkers/methodExprCall_checker.go
new file mode 100644
index 00000000000..60da116559c
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/methodExprCall_checker.go
@@ -0,0 +1,57 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "methodExprCall"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects method expression call that can be replaced with a method call"
+ info.Before = `f := foo{}
+foo.bar(f)`
+ info.After = `f := foo{}
+f.bar()`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&methodExprCallChecker{ctx: ctx})
+ })
+}
+
+type methodExprCallChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *methodExprCallChecker) VisitExpr(x ast.Expr) {
+ call := astcast.ToCallExpr(x)
+ s := astcast.ToSelectorExpr(call.Fun)
+
+ if len(call.Args) < 1 || astcast.ToIdent(call.Args[0]).Name == "nil" {
+ return
+ }
+
+ if typep.IsTypeExpr(c.ctx.TypesInfo, s.X) {
+ c.warn(call, s)
+ }
+}
+
+func (c *methodExprCallChecker) warn(cause *ast.CallExpr, s *ast.SelectorExpr) {
+ selector := astcopy.SelectorExpr(s)
+ selector.X = cause.Args[0]
+
+ // Remove "&" from the receiver (if any).
+ if u, ok := selector.X.(*ast.UnaryExpr); ok && u.Op == token.AND {
+ selector.X = u.X
+ }
+
+ c.ctx.Warn(cause, "consider to change `%s` to `%s`", cause.Fun, selector)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/nestingReduce_checker.go b/vendor/github.com/go-critic/go-critic/checkers/nestingReduce_checker.go
new file mode 100644
index 00000000000..4a0331d5c72
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/nestingReduce_checker.go
@@ -0,0 +1,73 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "nestingReduce"
+ info.Tags = []string{"style", "opinionated", "experimental"}
+ info.Params = lintpack.CheckerParams{
+ "bodyWidth": {
+ Value: 5,
+ Usage: "min number of statements inside a branch to trigger a warning",
+ },
+ }
+ info.Summary = "Finds where nesting level could be reduced"
+ info.Before = `
+for _, v := range a {
+ if v.Bool {
+ body()
+ }
+}`
+ info.After = `
+for _, v := range a {
+ if !v.Bool {
+ continue
+ }
+ body()
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &nestingReduceChecker{ctx: ctx}
+ c.bodyWidth = info.Params.Int("bodyWidth")
+ return astwalk.WalkerForStmt(c)
+ })
+}
+
+type nestingReduceChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ bodyWidth int
+}
+
+func (c *nestingReduceChecker) VisitStmt(stmt ast.Stmt) {
+ switch stmt := stmt.(type) {
+ case *ast.ForStmt:
+ c.checkLoopBody(stmt.Body.List)
+ case *ast.RangeStmt:
+ c.checkLoopBody(stmt.Body.List)
+ }
+}
+
+func (c *nestingReduceChecker) checkLoopBody(body []ast.Stmt) {
+ if len(body) != 1 {
+ return
+ }
+ stmt, ok := body[0].(*ast.IfStmt)
+ if !ok {
+ return
+ }
+ if len(stmt.Body.List) >= c.bodyWidth && stmt.Else == nil {
+ c.warnLoop(stmt)
+ }
+}
+
+func (c *nestingReduceChecker) warnLoop(cause ast.Node) {
+ c.ctx.Warn(cause, "invert if cond, replace body with `continue`, move old body after the statement")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/nilValReturn_checker.go b/vendor/github.com/go-critic/go-critic/checkers/nilValReturn_checker.go
new file mode 100644
index 00000000000..231e25800fa
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/nilValReturn_checker.go
@@ -0,0 +1,64 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "nilValReturn"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects return statements those results evaluate to nil"
+ info.Before = `
+if err == nil {
+ return err
+}`
+ info.After = `
+// (A) - return nil explicitly
+if err == nil {
+ return nil
+}
+// (B) - typo in "==", change to "!="
+if err != nil {
+ return err
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&nilValReturnChecker{ctx: ctx})
+ })
+}
+
+type nilValReturnChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *nilValReturnChecker) VisitStmt(stmt ast.Stmt) {
+ ifStmt, ok := stmt.(*ast.IfStmt)
+ if !ok || len(ifStmt.Body.List) != 1 {
+ return
+ }
+ ret, ok := ifStmt.Body.List[0].(*ast.ReturnStmt)
+ if !ok || len(ret.Results) != 1 {
+ return
+ }
+ expr, ok := ifStmt.Cond.(*ast.BinaryExpr)
+ cond := ok &&
+ expr.Op == token.EQL &&
+ typep.SideEffectFree(c.ctx.TypesInfo, expr.X) &&
+ qualifiedName(expr.Y) == "nil" &&
+ astequal.Expr(expr.X, ret.Results[0])
+ if cond {
+ c.warn(ret, expr.X)
+ }
+}
+
+func (c *nilValReturnChecker) warn(cause, val ast.Node) {
+ c.ctx.Warn(cause, "returned expr is always nil; replace %s with nil", val)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/octalLiteral_checker.go b/vendor/github.com/go-critic/go-critic/checkers/octalLiteral_checker.go
new file mode 100644
index 00000000000..e40ec6db5e3
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/octalLiteral_checker.go
@@ -0,0 +1,82 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "octalLiteral"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects octal literals passed to functions"
+ info.Before = `foo(02)`
+ info.After = `foo(2)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &octalLiteralChecker{
+ ctx: ctx,
+ octFriendlyPkg: map[string]bool{
+ "os": true,
+ "io/ioutil": true,
+ },
+ }
+ return astwalk.WalkerForExpr(c)
+ })
+}
+
+type octalLiteralChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ octFriendlyPkg map[string]bool
+}
+
+func (c *octalLiteralChecker) VisitExpr(expr ast.Expr) {
+ call := astcast.ToCallExpr(expr)
+ calledExpr := astcast.ToSelectorExpr(call.Fun)
+ ident := astcast.ToIdent(calledExpr.X)
+
+ if obj, ok := c.ctx.TypesInfo.ObjectOf(ident).(*types.PkgName); ok {
+ pkg := obj.Imported()
+ if c.octFriendlyPkg[pkg.Path()] {
+ return
+ }
+ }
+
+ for _, arg := range call.Args {
+ if lit := astcast.ToBasicLit(c.unsign(arg)); len(lit.Value) > 1 &&
+ c.isIntLiteral(lit) &&
+ c.isOctalLiteral(lit) {
+ c.warn(call)
+ return
+ }
+ }
+}
+
+func (c *octalLiteralChecker) unsign(e ast.Expr) ast.Expr {
+ u, ok := e.(*ast.UnaryExpr)
+ if !ok {
+ return e
+ }
+ return u.X
+}
+
+func (c *octalLiteralChecker) isIntLiteral(lit *ast.BasicLit) bool {
+ return lit.Kind == token.INT
+}
+
+func (c *octalLiteralChecker) isOctalLiteral(lit *ast.BasicLit) bool {
+ return lit.Value[0] == '0' &&
+ lit.Value[1] != 'x' &&
+ lit.Value[1] != 'X'
+}
+
+func (c *octalLiteralChecker) warn(expr ast.Expr) {
+ c.ctx.Warn(expr, "suspicious octal args in `%s`", expr)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/offBy1_checker.go b/vendor/github.com/go-critic/go-critic/checkers/offBy1_checker.go
new file mode 100644
index 00000000000..d5c8de0b796
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/offBy1_checker.go
@@ -0,0 +1,66 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "offBy1"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects various off-by-one kind of errors"
+ info.Before = `xs[len(xs)]`
+ info.After = `xs[len(xs)-1]`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&offBy1Checker{ctx: ctx})
+ })
+}
+
+type offBy1Checker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *offBy1Checker) VisitExpr(e ast.Expr) {
+ // TODO(Quasilyte): handle more off-by-1 patterns.
+ // TODO(Quasilyte): check whether go/analysis can help here.
+
+ // Detect s[len(s)] expressions that always panic.
+ // The correct form is s[len(s)-1].
+
+ indexExpr := astcast.ToIndexExpr(e)
+ indexed := indexExpr.X
+ if !typep.IsSlice(c.ctx.TypesInfo.TypeOf(indexed)) {
+ return
+ }
+ if !typep.SideEffectFree(c.ctx.TypesInfo, indexed) {
+ return
+ }
+ call := astcast.ToCallExpr(indexExpr.Index)
+ if astcast.ToIdent(call.Fun).Name != "len" {
+ return
+ }
+ if len(call.Args) != 1 || !astequal.Expr(call.Args[0], indexed) {
+ return
+ }
+ c.warnLenIndex(indexExpr)
+}
+
+func (c *offBy1Checker) warnLenIndex(cause *ast.IndexExpr) {
+ suggest := astcopy.IndexExpr(cause)
+ suggest.Index = &ast.BinaryExpr{
+ Op: token.SUB,
+ X: cause.Index,
+ Y: &ast.BasicLit{Value: "1"},
+ }
+ c.ctx.Warn(cause, "index expr always panics; maybe you wanted %s?", suggest)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/paramTypeCombine_checker.go b/vendor/github.com/go-critic/go-critic/checkers/paramTypeCombine_checker.go
new file mode 100644
index 00000000000..ffa74061e67
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/paramTypeCombine_checker.go
@@ -0,0 +1,86 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "paramTypeCombine"
+ info.Tags = []string{"style", "opinionated"}
+ info.Summary = "Detects if function parameters could be combined by type and suggest the way to do it"
+ info.Before = `func foo(a, b int, c, d int, e, f int, g int) {}`
+ info.After = `func foo(a, b, c, d, e, f, g int) {}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForFuncDecl(¶mTypeCombineChecker{ctx: ctx})
+ })
+}
+
+type paramTypeCombineChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *paramTypeCombineChecker) EnterFunc(*ast.FuncDecl) bool {
+ return true
+}
+
+func (c *paramTypeCombineChecker) VisitFuncDecl(decl *ast.FuncDecl) {
+ typ := c.optimizeFuncType(decl.Type)
+ if !astequal.Expr(typ, decl.Type) {
+ c.warn(decl.Type, typ)
+ }
+}
+
+func (c *paramTypeCombineChecker) optimizeFuncType(f *ast.FuncType) *ast.FuncType {
+ return &ast.FuncType{
+ Params: c.optimizeParams(f.Params),
+ Results: c.optimizeParams(f.Results),
+ }
+}
+func (c *paramTypeCombineChecker) optimizeParams(params *ast.FieldList) *ast.FieldList {
+ // To avoid false positives, skip unnamed param lists.
+ //
+ // We're using a property that Go only permits unnamed params
+ // for the whole list, so it's enough to check whether any of
+ // ast.Field have empty name list.
+ skip := params == nil ||
+ len(params.List) < 2 ||
+ len(params.List[0].Names) == 0
+ if skip {
+ return params
+ }
+
+ list := []*ast.Field{}
+ names := make([]*ast.Ident, len(params.List[0].Names))
+ copy(names, params.List[0].Names)
+ list = append(list, &ast.Field{
+ Names: names,
+ Type: params.List[0].Type,
+ })
+ for i, p := range params.List[1:] {
+ names = make([]*ast.Ident, len(p.Names))
+ copy(names, p.Names)
+ if astequal.Expr(p.Type, params.List[i].Type) {
+ list[len(list)-1].Names =
+ append(list[len(list)-1].Names, names...)
+ } else {
+ list = append(list, &ast.Field{
+ Names: names,
+ Type: params.List[i+1].Type,
+ })
+ }
+ }
+ return &ast.FieldList{
+ List: list,
+ }
+}
+
+func (c *paramTypeCombineChecker) warn(f1, f2 *ast.FuncType) {
+ c.ctx.Warn(f1, "%s could be replaced with %s", f1, f2)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/ptrToRefParam_checker.go b/vendor/github.com/go-critic/go-critic/checkers/ptrToRefParam_checker.go
new file mode 100644
index 00000000000..dacffc85ab4
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/ptrToRefParam_checker.go
@@ -0,0 +1,70 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "ptrToRefParam"
+ info.Tags = []string{"style", "opinionated", "experimental"}
+ info.Summary = "Detects input and output parameters that have a type of pointer to referential type"
+ info.Before = `func f(m *map[string]int) (*chan *int)`
+ info.After = `func f(m map[string]int) (chan *int)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForFuncDecl(&ptrToRefParamChecker{ctx: ctx})
+ })
+}
+
+type ptrToRefParamChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *ptrToRefParamChecker) VisitFuncDecl(fn *ast.FuncDecl) {
+ c.checkParams(fn.Type.Params.List)
+ if fn.Type.Results != nil {
+ c.checkParams(fn.Type.Results.List)
+ }
+}
+
+func (c *ptrToRefParamChecker) checkParams(params []*ast.Field) {
+ for _, param := range params {
+ ptr, ok := c.ctx.TypesInfo.TypeOf(param.Type).(*types.Pointer)
+ if !ok {
+ continue
+ }
+
+ if c.isRefType(ptr.Elem()) {
+ if len(param.Names) == 0 {
+ c.ctx.Warn(param, "consider to make non-pointer type for `%s`", param.Type)
+ } else {
+ for i := range param.Names {
+ c.warn(param.Names[i])
+ }
+ }
+ }
+ }
+}
+
+func (c *ptrToRefParamChecker) isRefType(x types.Type) bool {
+ switch typ := x.(type) {
+ case *types.Map, *types.Chan, *types.Interface:
+ return true
+ case *types.Named:
+ // Handle underlying type only for interfaces.
+ if _, ok := typ.Underlying().(*types.Interface); ok {
+ return true
+ }
+ }
+ return false
+}
+
+func (c *ptrToRefParamChecker) warn(id *ast.Ident) {
+ c.ctx.Warn(id, "consider `%s' to be of non-pointer type", id)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go b/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go
new file mode 100644
index 00000000000..387d1bbbcc0
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/rangeExprCopy_checker.go
@@ -0,0 +1,80 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "rangeExprCopy"
+ info.Tags = []string{"performance"}
+ info.Params = lintpack.CheckerParams{
+ "sizeThreshold": {
+ Value: 512,
+ Usage: "size in bytes that makes the warning trigger",
+ },
+ "skipTestFuncs": {
+ Value: true,
+ Usage: "whether to check test functions",
+ },
+ }
+ info.Summary = "Detects expensive copies of `for` loop range expressions"
+ info.Details = "Suggests to use pointer to array to avoid the copy using `&` on range expression."
+ info.Before = `
+var xs [2048]byte
+for _, x := range xs { // Copies 2048 bytes
+ // Loop body.
+}`
+ info.After = `
+var xs [2048]byte
+for _, x := range &xs { // No copy
+ // Loop body.
+}`
+ info.Note = "See Go issue for details: https://github.com/golang/go/issues/15812."
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &rangeExprCopyChecker{ctx: ctx}
+ c.sizeThreshold = int64(info.Params.Int("sizeThreshold"))
+ c.skipTestFuncs = info.Params.Bool("skipTestFuncs")
+ return astwalk.WalkerForStmt(c)
+ })
+}
+
+type rangeExprCopyChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ sizeThreshold int64
+ skipTestFuncs bool
+}
+
+func (c *rangeExprCopyChecker) EnterFunc(fn *ast.FuncDecl) bool {
+ return fn.Body != nil &&
+ !(c.skipTestFuncs && isUnitTestFunc(c.ctx, fn))
+}
+
+func (c *rangeExprCopyChecker) VisitStmt(stmt ast.Stmt) {
+ rng, ok := stmt.(*ast.RangeStmt)
+ if !ok || rng.Key == nil || rng.Value == nil {
+ return
+ }
+ tv := c.ctx.TypesInfo.Types[rng.X]
+ if !tv.Addressable() {
+ return
+ }
+ if _, ok := tv.Type.(*types.Array); !ok {
+ return
+ }
+ if size := c.ctx.SizesInfo.Sizeof(tv.Type); size >= c.sizeThreshold {
+ c.warn(rng, size)
+ }
+}
+
+func (c *rangeExprCopyChecker) warn(rng *ast.RangeStmt, size int64) {
+ c.ctx.Warn(rng, "copy of %s (%d bytes) can be avoided with &%s",
+ rng.X, size, rng.X)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go b/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go
new file mode 100644
index 00000000000..0e24369225c
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/rangeValCopy_checker.go
@@ -0,0 +1,75 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "rangeValCopy"
+ info.Tags = []string{"performance"}
+ info.Params = lintpack.CheckerParams{
+ "sizeThreshold": {
+ Value: 128,
+ Usage: "size in bytes that makes the warning trigger",
+ },
+ "skipTestFuncs": {
+ Value: true,
+ Usage: "whether to check test functions",
+ },
+ }
+ info.Summary = "Detects loops that copy big objects during each iteration"
+ info.Details = "Suggests to use index access or take address and make use pointer instead."
+ info.Before = `
+xs := make([][1024]byte, length)
+for _, x := range xs {
+ // Loop body.
+}`
+ info.After = `
+xs := make([][1024]byte, length)
+for i := range xs {
+ x := &xs[i]
+ // Loop body.
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &rangeValCopyChecker{ctx: ctx}
+ c.sizeThreshold = int64(info.Params.Int("sizeThreshold"))
+ c.skipTestFuncs = info.Params.Bool("skipTestFuncs")
+ return astwalk.WalkerForStmt(c)
+ })
+}
+
+type rangeValCopyChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ sizeThreshold int64
+ skipTestFuncs bool
+}
+
+func (c *rangeValCopyChecker) EnterFunc(fn *ast.FuncDecl) bool {
+ return fn.Body != nil &&
+ !(c.skipTestFuncs && isUnitTestFunc(c.ctx, fn))
+}
+
+func (c *rangeValCopyChecker) VisitStmt(stmt ast.Stmt) {
+ rng, ok := stmt.(*ast.RangeStmt)
+ if !ok || rng.Value == nil {
+ return
+ }
+ typ := c.ctx.TypesInfo.TypeOf(rng.Value)
+ if typ == nil {
+ return
+ }
+ if size := c.ctx.SizesInfo.Sizeof(typ); size >= c.sizeThreshold {
+ c.warn(rng, size)
+ }
+}
+
+func (c *rangeValCopyChecker) warn(node ast.Node, size int64) {
+ c.ctx.Warn(node, "each iteration copies %d bytes (consider pointers or indexing)", size)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/regexpMust_checker.go b/vendor/github.com/go-critic/go-critic/checkers/regexpMust_checker.go
new file mode 100644
index 00000000000..ef7a397877c
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/regexpMust_checker.go
@@ -0,0 +1,47 @@
+package checkers
+
+import (
+ "go/ast"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astp"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "regexpMust"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects `regexp.Compile*` that can be replaced with `regexp.MustCompile*`"
+ info.Before = `re, _ := regexp.Compile("const pattern")`
+ info.After = `re := regexp.MustCompile("const pattern")`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(®expMustChecker{ctx: ctx})
+ })
+}
+
+type regexpMustChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *regexpMustChecker) VisitExpr(x ast.Expr) {
+ if x, ok := x.(*ast.CallExpr); ok {
+ switch name := qualifiedName(x.Fun); name {
+ case "regexp.Compile", "regexp.CompilePOSIX":
+ // Only check for trivial string args, permit parenthesis.
+ if !astp.IsBasicLit(astutil.Unparen(x.Args[0])) {
+ return
+ }
+ c.warn(x, strings.Replace(name, "Compile", "MustCompile", 1))
+ }
+ }
+}
+
+func (c *regexpMustChecker) warn(cause *ast.CallExpr, suggestion string) {
+ c.ctx.Warn(cause, "for const patterns like %s, use %s",
+ cause.Args[0], suggestion)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/singleCaseSwitch_checker.go b/vendor/github.com/go-critic/go-critic/checkers/singleCaseSwitch_checker.go
new file mode 100644
index 00000000000..6cdb06aefc4
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/singleCaseSwitch_checker.go
@@ -0,0 +1,61 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "singleCaseSwitch"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects switch statements that could be better written as if statement"
+ info.Before = `
+switch x := x.(type) {
+case int:
+ body()
+}`
+ info.After = `
+if x, ok := x.(int); ok {
+ body()
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&singleCaseSwitchChecker{ctx: ctx})
+ })
+}
+
+type singleCaseSwitchChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *singleCaseSwitchChecker) VisitStmt(stmt ast.Stmt) {
+ switch stmt := stmt.(type) {
+ case *ast.SwitchStmt:
+ c.checkSwitchStmt(stmt, stmt.Body)
+ case *ast.TypeSwitchStmt:
+ c.checkSwitchStmt(stmt, stmt.Body)
+ }
+}
+
+func (c *singleCaseSwitchChecker) checkSwitchStmt(stmt ast.Stmt, body *ast.BlockStmt) {
+ if len(body.List) == 1 {
+ if body.List[0].(*ast.CaseClause).List == nil {
+ // default case.
+ c.warnDefault(stmt)
+ } else if len(body.List[0].(*ast.CaseClause).List) == 1 {
+ c.warn(stmt)
+ }
+ }
+}
+
+func (c *singleCaseSwitchChecker) warn(stmt ast.Stmt) {
+ c.ctx.Warn(stmt, "should rewrite switch statement to if statement")
+}
+
+func (c *singleCaseSwitchChecker) warnDefault(stmt ast.Stmt) {
+ c.ctx.Warn(stmt, "found switch with default case only")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/sloppyLen_checker.go b/vendor/github.com/go-critic/go-critic/checkers/sloppyLen_checker.go
new file mode 100644
index 00000000000..45123ec6bdc
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/sloppyLen_checker.go
@@ -0,0 +1,72 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astfmt"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "sloppyLen"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects usage of `len` when result is obvious or doesn't make sense"
+ info.Before = `
+len(arr) >= 0 // Sloppy
+len(arr) <= 0 // Sloppy
+len(arr) < 0 // Doesn't make sense at all`
+ info.After = `
+len(arr) > 0
+len(arr) == 0`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&sloppyLenChecker{ctx: ctx})
+ })
+}
+
+type sloppyLenChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *sloppyLenChecker) VisitExpr(x ast.Expr) {
+ expr, ok := x.(*ast.BinaryExpr)
+ if !ok {
+ return
+ }
+
+ if expr.Op == token.LSS || expr.Op == token.GEQ || expr.Op == token.LEQ {
+ if c.isLenCall(expr.X) && c.isZero(expr.Y) {
+ c.warn(expr)
+ }
+ }
+}
+
+func (c *sloppyLenChecker) isLenCall(x ast.Expr) bool {
+ call, ok := x.(*ast.CallExpr)
+ return ok && qualifiedName(call.Fun) == "len" && len(call.Args) == 1
+}
+
+func (c *sloppyLenChecker) isZero(x ast.Expr) bool {
+ value, ok := x.(*ast.BasicLit)
+ return ok && value.Value == "0"
+}
+
+func (c *sloppyLenChecker) warn(cause *ast.BinaryExpr) {
+ info := ""
+ switch cause.Op {
+ case token.LSS:
+ info = "is always false"
+ case token.GEQ:
+ info = "is always true"
+ case token.LEQ:
+ expr := astcopy.BinaryExpr(cause)
+ expr.Op = token.EQL
+ info = astfmt.Sprintf("can be %s", expr)
+ }
+ c.ctx.Warn(cause, "%s %s", cause, info)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/sloppyReassign_checker.go b/vendor/github.com/go-critic/go-critic/checkers/sloppyReassign_checker.go
new file mode 100644
index 00000000000..1a7c198774e
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/sloppyReassign_checker.go
@@ -0,0 +1,80 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "sloppyReassign"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects suspicious/confusing re-assignments"
+ info.Before = `if err = f(); err != nil { return err }`
+ info.After = `if err := f(); err != nil { return err }`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&sloppyReassignChecker{ctx: ctx})
+ })
+}
+
+type sloppyReassignChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *sloppyReassignChecker) VisitStmt(stmt ast.Stmt) {
+ // Right now only check assignments in if statements init.
+ ifStmt := astcast.ToIfStmt(stmt)
+ assign := astcast.ToAssignStmt(ifStmt.Init)
+ if assign.Tok != token.ASSIGN {
+ return
+ }
+
+ // TODO(Quasilyte): is handling of multi-value assignments worthwhile?
+ if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
+ return
+ }
+
+ // TODO(Quasilyte): handle not only the simplest, return-only case.
+ body := ifStmt.Body.List
+ if len(body) != 1 {
+ return
+ }
+
+ // Variable that is being re-assigned.
+ reAssigned := astcast.ToIdent(assign.Lhs[0])
+ if reAssigned.Name == "" {
+ return
+ }
+
+ // TODO(Quasilyte): handle not only nil comparisons.
+ eqToNil := &ast.BinaryExpr{
+ Op: token.NEQ,
+ X: reAssigned,
+ Y: &ast.Ident{Name: "nil"},
+ }
+ if !astequal.Expr(ifStmt.Cond, eqToNil) {
+ return
+ }
+
+ results := astcast.ToReturnStmt(body[0]).Results
+ for _, res := range results {
+ if astequal.Expr(reAssigned, res) {
+ c.warnAssignToDefine(assign, reAssigned.Name)
+ break
+ }
+ }
+}
+
+func (c *sloppyReassignChecker) warnAssignToDefine(assign *ast.AssignStmt, name string) {
+ suggest := astcopy.AssignStmt(assign)
+ suggest.Tok = token.DEFINE
+ c.ctx.Warn(assign, "re-assignment to `%s` can be replaced with `%s`", name, suggest)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/stringXbytes_checker.go b/vendor/github.com/go-critic/go-critic/checkers/stringXbytes_checker.go
new file mode 100644
index 00000000000..74570108e69
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/stringXbytes_checker.go
@@ -0,0 +1,47 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/typep"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "stringXbytes"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects redundant conversions between string and []byte"
+ info.Before = `copy(b, []byte(s))`
+ info.After = `copy(b, s)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&stringXbytes{ctx: ctx})
+ })
+}
+
+type stringXbytes struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *stringXbytes) VisitExpr(expr ast.Expr) {
+ x, ok := expr.(*ast.CallExpr)
+ if !ok || qualifiedName(x.Fun) != "copy" {
+ return
+ }
+
+ src := x.Args[1]
+
+ byteCast, ok := src.(*ast.CallExpr)
+ if ok && typep.IsTypeExpr(c.ctx.TypesInfo, byteCast.Fun) &&
+ typep.HasStringProp(c.ctx.TypesInfo.TypeOf(byteCast.Args[0])) {
+
+ c.warn(byteCast, byteCast.Args[0])
+ }
+}
+
+func (c *stringXbytes) warn(cause *ast.CallExpr, suggestion ast.Expr) {
+ c.ctx.Warn(cause, "can simplify `%s` to `%s`", cause, suggestion)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/switchTrue_checker.go b/vendor/github.com/go-critic/go-critic/checkers/switchTrue_checker.go
new file mode 100644
index 00000000000..3b276627697
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/switchTrue_checker.go
@@ -0,0 +1,49 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "switchTrue"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects switch-over-bool statements that use explicit `true` tag value"
+ info.Before = `
+switch true {
+case x > y:
+}`
+ info.After = `
+switch {
+case x > y:
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&switchTrueChecker{ctx: ctx})
+ })
+}
+
+type switchTrueChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *switchTrueChecker) VisitStmt(stmt ast.Stmt) {
+ if stmt, ok := stmt.(*ast.SwitchStmt); ok {
+ if qualifiedName(stmt.Tag) == "true" {
+ c.warn(stmt)
+ }
+ }
+}
+
+func (c *switchTrueChecker) warn(cause *ast.SwitchStmt) {
+ if cause.Init == nil {
+ c.ctx.Warn(cause, "replace 'switch true {}' with 'switch {}'")
+ } else {
+ c.ctx.Warn(cause, "replace 'switch %s; true {}' with 'switch %s; {}'",
+ cause.Init, cause.Init)
+ }
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/typeAssertChain_checker.go b/vendor/github.com/go-critic/go-critic/checkers/typeAssertChain_checker.go
new file mode 100644
index 00000000000..c0c42e3511c
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/typeAssertChain_checker.go
@@ -0,0 +1,132 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/astp"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "typeAssertChain"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects repeated type assertions and suggests to replace them with type switch statement"
+ info.Before = `
+if x, ok := v.(T1); ok {
+ // Code A, uses x.
+} else if x, ok := v.(T2); ok {
+ // Code B, uses x.
+} else if x, ok := v.(T3); ok {
+ // Code C, uses x.
+}`
+ info.After = `
+switch x := v.(T1) {
+case cond1:
+ // Code A, uses x.
+case cond2:
+ // Code B, uses x.
+default:
+ // Code C, uses x.
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&typeAssertChainChecker{ctx: ctx})
+ })
+}
+
+type typeAssertChainChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ cause *ast.IfStmt
+ visited map[*ast.IfStmt]bool
+ typeSet lintutil.AstSet
+}
+
+func (c *typeAssertChainChecker) EnterFunc(fn *ast.FuncDecl) bool {
+ if fn.Body == nil {
+ return false
+ }
+ c.visited = make(map[*ast.IfStmt]bool)
+ return true
+}
+
+func (c *typeAssertChainChecker) VisitStmt(stmt ast.Stmt) {
+ ifstmt, ok := stmt.(*ast.IfStmt)
+ if !ok || c.visited[ifstmt] || ifstmt.Init == nil {
+ return
+ }
+ assertion := c.getTypeAssert(ifstmt)
+ if assertion == nil {
+ return
+ }
+ c.cause = ifstmt
+ c.checkIfStmt(ifstmt, assertion)
+}
+
+func (c *typeAssertChainChecker) getTypeAssert(ifstmt *ast.IfStmt) *ast.TypeAssertExpr {
+ assign := astcast.ToAssignStmt(ifstmt.Init)
+ if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 {
+ return nil
+ }
+ if !astp.IsIdent(assign.Lhs[0]) || assign.Tok != token.DEFINE {
+ return nil
+ }
+ if !astequal.Expr(assign.Lhs[1], ifstmt.Cond) {
+ return nil
+ }
+
+ assertion, ok := assign.Rhs[0].(*ast.TypeAssertExpr)
+ if !ok {
+ return nil
+ }
+ return assertion
+}
+
+func (c *typeAssertChainChecker) checkIfStmt(stmt *ast.IfStmt, assertion *ast.TypeAssertExpr) {
+ if c.countTypeAssertions(stmt, assertion) >= 2 {
+ c.warn()
+ }
+}
+
+func (c *typeAssertChainChecker) countTypeAssertions(stmt *ast.IfStmt, assertion *ast.TypeAssertExpr) int {
+ c.typeSet.Clear()
+
+ count := 1
+ x := assertion.X
+ c.typeSet.Insert(assertion.Type)
+ for {
+ e, ok := stmt.Else.(*ast.IfStmt)
+ if !ok {
+ return count
+ }
+ assertion = c.getTypeAssert(e)
+ if assertion == nil {
+ return count
+ }
+ if !c.typeSet.Insert(assertion.Type) {
+ // Asserted type is duplicated.
+ // Type switch does not permit duplicate cases,
+ // so give up.
+ return 0
+ }
+ if !astequal.Expr(x, assertion.X) {
+ // Mixed type asserting chain.
+ // Can't be easily translated to a type switch.
+ return 0
+ }
+ stmt = e
+ count++
+ c.visited[e] = true
+ }
+}
+
+func (c *typeAssertChainChecker) warn() {
+ c.ctx.Warn(c.cause, "rewrite if-else to type switch statement")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/typeSwitchVar_checker.go b/vendor/github.com/go-critic/go-critic/checkers/typeSwitchVar_checker.go
new file mode 100644
index 00000000000..527383a7641
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/typeSwitchVar_checker.go
@@ -0,0 +1,88 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/astp"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "typeSwitchVar"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects type switches that can benefit from type guard clause with variable"
+ info.Before = `
+switch v.(type) {
+case int:
+ return v.(int)
+case point:
+ return v.(point).x + v.(point).y
+default:
+ return 0
+}`
+ info.After = `
+switch v := v.(type) {
+case int:
+ return v
+case point:
+ return v.x + v.y
+default:
+ return 0
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&typeSwitchVarChecker{ctx: ctx})
+ })
+}
+
+type typeSwitchVarChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *typeSwitchVarChecker) VisitStmt(stmt ast.Stmt) {
+ if stmt, ok := stmt.(*ast.TypeSwitchStmt); ok {
+ c.checkTypeSwitch(stmt)
+ }
+}
+
+func (c *typeSwitchVarChecker) checkTypeSwitch(root *ast.TypeSwitchStmt) {
+ if astp.IsAssignStmt(root.Assign) {
+ return // Already with type guard
+ }
+ // Must be a *ast.ExprStmt then.
+ expr := root.Assign.(*ast.ExprStmt).X.(*ast.TypeAssertExpr).X
+ object := c.ctx.TypesInfo.ObjectOf(identOf(expr))
+ if object == nil {
+ return // Give up: can't handle shadowing without object
+ }
+
+ for i, clause := range root.Body.List {
+ clause := clause.(*ast.CaseClause)
+ // Multiple types in a list mean that assert.X will have
+ // a type of interface{} inside clause body.
+ // We are looking for precise type case.
+ if len(clause.List) != 1 {
+ continue
+ }
+ // Create artificial node just for matching.
+ assert1 := ast.TypeAssertExpr{X: expr, Type: clause.List[0]}
+ for _, stmt := range clause.Body {
+ assert2 := lintutil.FindNode(stmt, func(x ast.Node) bool {
+ return astequal.Node(&assert1, x)
+ })
+ if object == c.ctx.TypesInfo.ObjectOf(identOf(assert2)) {
+ c.warn(root, i)
+ break
+ }
+ }
+ }
+}
+
+func (c *typeSwitchVarChecker) warn(node ast.Node, caseIndex int) {
+ c.ctx.Warn(node, "case %d can benefit from type switch with assignment", caseIndex)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/typeUnparen_checker.go b/vendor/github.com/go-critic/go-critic/checkers/typeUnparen_checker.go
new file mode 100644
index 00000000000..a17c77b4969
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/typeUnparen_checker.go
@@ -0,0 +1,86 @@
+package checkers
+
+import (
+ "go/ast"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astp"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "typeUnparen"
+ info.Tags = []string{"style", "opinionated"}
+ info.Summary = "Detects unneded parenthesis inside type expressions and suggests to remove them"
+ info.Before = `type foo [](func([](func())))`
+ info.After = `type foo []func([]func())`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForTypeExpr(&typeUnparenChecker{ctx: ctx}, ctx.TypesInfo)
+ })
+}
+
+type typeUnparenChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *typeUnparenChecker) VisitTypeExpr(x ast.Expr) {
+ switch x := x.(type) {
+ case *ast.ParenExpr:
+ switch x.X.(type) {
+ case *ast.StructType:
+ c.ctx.Warn(x, "could simplify (struct{...}) to struct{...}")
+ case *ast.InterfaceType:
+ c.ctx.Warn(x, "could simplify (interface{...}) to interface{...}")
+ default:
+ c.warn(x, c.unparenExpr(astcopy.Expr(x)))
+ }
+ default:
+ c.checkTypeExpr(x)
+ }
+}
+
+func (c *typeUnparenChecker) checkTypeExpr(x ast.Expr) {
+ switch x := x.(type) {
+ case *ast.ArrayType:
+ // Arrays require extra care: we don't want to unparen
+ // length expression as they are not type expressions.
+ if !c.hasParens(x.Elt) {
+ return
+ }
+ noParens := astcopy.ArrayType(x)
+ noParens.Elt = c.unparenExpr(noParens.Elt)
+ c.warn(x, noParens)
+ case *ast.StructType, *ast.InterfaceType:
+ // Only nested fields are to be reported.
+ default:
+ if !c.hasParens(x) {
+ return
+ }
+ c.warn(x, c.unparenExpr(astcopy.Expr(x)))
+ }
+}
+
+func (c *typeUnparenChecker) hasParens(x ast.Expr) bool {
+ return lintutil.ContainsNode(x, astp.IsParenExpr)
+}
+
+func (c *typeUnparenChecker) unparenExpr(x ast.Expr) ast.Expr {
+ // Replace every paren expr with expression it encloses.
+ return astutil.Apply(x, nil, func(cur *astutil.Cursor) bool {
+ if paren, ok := cur.Node().(*ast.ParenExpr); ok {
+ cur.Replace(paren.X)
+ }
+ return true
+ }).(ast.Expr)
+}
+
+func (c *typeUnparenChecker) warn(cause, noParens ast.Expr) {
+ c.SkipChilds = true
+ c.ctx.Warn(cause, "could simplify %s to %s", cause, noParens)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/underef_checker.go b/vendor/github.com/go-critic/go-critic/checkers/underef_checker.go
new file mode 100644
index 00000000000..dfc6077bbf1
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/underef_checker.go
@@ -0,0 +1,127 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astp"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "underef"
+ info.Tags = []string{"style"}
+ info.Params = lintpack.CheckerParams{
+ "skipRecvDeref": {
+ Value: true,
+ Usage: "whether to skip (*x).method() calls where x is a pointer receiver",
+ },
+ }
+ info.Summary = "Detects dereference expressions that can be omitted"
+ info.Before = `
+(*k).field = 5
+v := (*a)[5] // only if a is array`
+ info.After = `
+k.field = 5
+v := a[5]`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &underefChecker{ctx: ctx}
+ c.skipRecvDeref = info.Params.Bool("skipRecvDeref")
+ return astwalk.WalkerForExpr(c)
+ })
+}
+
+type underefChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ skipRecvDeref bool
+}
+
+func (c *underefChecker) VisitExpr(expr ast.Expr) {
+ switch n := expr.(type) {
+ case *ast.SelectorExpr:
+ expr := astcast.ToParenExpr(n.X)
+ if c.skipRecvDeref && c.isPtrRecvMethodCall(n.Sel) {
+ return
+ }
+
+ if expr, ok := expr.X.(*ast.StarExpr); ok {
+ if c.checkStarExpr(expr) {
+ c.warnSelect(n)
+ }
+ }
+ case *ast.IndexExpr:
+ expr := astcast.ToParenExpr(n.X)
+ if expr, ok := expr.X.(*ast.StarExpr); ok {
+ if !c.checkStarExpr(expr) {
+ return
+ }
+ if c.checkArray(expr) {
+ c.warnArray(n)
+ }
+ }
+ }
+}
+
+func (c *underefChecker) isPtrRecvMethodCall(fn *ast.Ident) bool {
+ typ, ok := c.ctx.TypesInfo.TypeOf(fn).(*types.Signature)
+ if ok && typ != nil && typ.Recv() != nil {
+ _, ok := typ.Recv().Type().(*types.Pointer)
+ return ok
+ }
+ return false
+}
+
+func (c *underefChecker) underef(x *ast.ParenExpr) ast.Expr {
+ // If there is only 1 deref, can remove parenthesis,
+ // otherwise can remove StarExpr only.
+ dereferenced := x.X.(*ast.StarExpr).X
+ if astp.IsStarExpr(dereferenced) {
+ return &ast.ParenExpr{X: dereferenced}
+ }
+ return dereferenced
+}
+
+func (c *underefChecker) warnSelect(expr *ast.SelectorExpr) {
+ // TODO: add () to function output.
+ c.ctx.Warn(expr, "could simplify %s to %s.%s",
+ expr,
+ c.underef(expr.X.(*ast.ParenExpr)),
+ expr.Sel.Name)
+}
+
+func (c *underefChecker) warnArray(expr *ast.IndexExpr) {
+ c.ctx.Warn(expr, "could simplify %s to %s[%s]",
+ expr,
+ c.underef(expr.X.(*ast.ParenExpr)),
+ expr.Index)
+}
+
+// checkStarExpr checks if ast.StarExpr could be simplified.
+func (c *underefChecker) checkStarExpr(expr *ast.StarExpr) bool {
+ typ, ok := c.ctx.TypesInfo.TypeOf(expr.X).Underlying().(*types.Pointer)
+ if !ok {
+ return false
+ }
+
+ switch typ.Elem().Underlying().(type) {
+ case *types.Pointer, *types.Interface:
+ return false
+ default:
+ return true
+ }
+}
+
+func (c *underefChecker) checkArray(expr *ast.StarExpr) bool {
+ typ, ok := c.ctx.TypesInfo.TypeOf(expr.X).(*types.Pointer)
+ if !ok {
+ return false
+ }
+ _, ok = typ.Elem().(*types.Array)
+ return ok
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/unlabelStmt_checker.go b/vendor/github.com/go-critic/go-critic/checkers/unlabelStmt_checker.go
new file mode 100644
index 00000000000..d90c65c2ce1
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/unlabelStmt_checker.go
@@ -0,0 +1,170 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "unlabelStmt"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects redundant statement labels"
+ info.Before = `
+derp:
+for x := range xs {
+ if x == 0 {
+ break derp
+ }
+}`
+ info.After = `
+for x := range xs {
+ if x == 0 {
+ break
+ }
+}`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmt(&unlabelStmtChecker{ctx: ctx})
+ })
+}
+
+type unlabelStmtChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *unlabelStmtChecker) EnterFunc(fn *ast.FuncDecl) bool {
+ if fn.Body == nil {
+ return false
+ }
+ // TODO(Quasilyte): should not do additional traversal here.
+ // For now, skip all functions that contain goto statement.
+ return !lintutil.ContainsNode(fn.Body, func(n ast.Node) bool {
+ br, ok := n.(*ast.BranchStmt)
+ return ok && br.Tok == token.GOTO
+ })
+}
+
+func (c *unlabelStmtChecker) VisitStmt(stmt ast.Stmt) {
+ labeled, ok := stmt.(*ast.LabeledStmt)
+ if !ok || !c.canBreakFrom(labeled.Stmt) {
+ return
+ }
+
+ // We have a labeled statement from that have labeled continue/break.
+ // This is an invariant, since unused label is a compile-time error
+ // and we're currently skipping functions containing goto.
+ //
+ // Also note that Go labels are function-scoped and there
+ // can be no re-definitions. This means that we don't
+ // need to care about label shadowing or things like that.
+ //
+ // The task is to find cases where labeled branch (continue/break)
+ // is redundant and can be re-written, decreasing the label usages
+ // and potentially leading to its redundancy,
+ // or finding the redundant labels right away.
+
+ name := labeled.Label.Name
+
+ // Simplest case that can prove that label is redundant.
+ //
+ // If labeled branch is somewhere inside the statement block itself
+ // and none of the nested break'able statements refer to that label,
+ // the label can be removed.
+ matchUsage := func(n ast.Node) bool {
+ return c.canBreakFrom(n) && c.usesLabel(c.blockStmtOf(n), name)
+ }
+ if !lintutil.ContainsNode(c.blockStmtOf(labeled.Stmt), matchUsage) {
+ c.warnRedundant(labeled)
+ return
+ }
+
+ // Only for loops: if last stmt in list is a loop
+ // that contains labeled "continue" to the outer loop label,
+ // it can be refactored to use "break" instead.
+ if c.isLoop(labeled.Stmt) {
+ body := c.blockStmtOf(labeled.Stmt)
+ if len(body.List) == 0 {
+ return
+ }
+ last := body.List[len(body.List)-1]
+ if !c.isLoop(last) {
+ return
+ }
+ br := lintutil.FindNode(c.blockStmtOf(last), func(n ast.Node) bool {
+ br, ok := n.(*ast.BranchStmt)
+ return ok && br.Label != nil &&
+ br.Label.Name == name && br.Tok == token.CONTINUE
+ })
+ if br != nil {
+ c.warnLabeledContinue(br, name)
+ }
+ }
+}
+
+// isLoop reports whether n is a loop of some kind.
+// In other words, it tells whether n body can contain "continue"
+// associated with n.
+func (c *unlabelStmtChecker) isLoop(n ast.Node) bool {
+ switch n.(type) {
+ case *ast.ForStmt, *ast.RangeStmt:
+ return true
+ default:
+ return false
+ }
+}
+
+// canBreakFrom reports whether it is possible to "break" or "continue" from n body.
+func (c *unlabelStmtChecker) canBreakFrom(n ast.Node) bool {
+ switch n.(type) {
+ case *ast.RangeStmt, *ast.ForStmt, *ast.SwitchStmt, *ast.TypeSwitchStmt, *ast.SelectStmt:
+ return true
+ default:
+ return false
+ }
+}
+
+// blockStmtOf returns body of specified node.
+//
+// TODO(quasilyte): handle other statements and see if it can be useful
+// in other checkers.
+func (c *unlabelStmtChecker) blockStmtOf(n ast.Node) *ast.BlockStmt {
+ switch n := n.(type) {
+ case *ast.RangeStmt:
+ return n.Body
+ case *ast.ForStmt:
+ return n.Body
+ case *ast.SwitchStmt:
+ return n.Body
+ case *ast.TypeSwitchStmt:
+ return n.Body
+ case *ast.SelectStmt:
+ return n.Body
+
+ default:
+ return nil
+ }
+}
+
+// usesLabel reports whether n contains a usage of label.
+func (c *unlabelStmtChecker) usesLabel(n *ast.BlockStmt, label string) bool {
+ return lintutil.ContainsNode(n, func(n ast.Node) bool {
+ branch, ok := n.(*ast.BranchStmt)
+ return ok && branch.Label != nil &&
+ branch.Label.Name == label &&
+ (branch.Tok == token.CONTINUE || branch.Tok == token.BREAK)
+ })
+}
+
+func (c *unlabelStmtChecker) warnRedundant(cause *ast.LabeledStmt) {
+ c.ctx.Warn(cause, "label %s is redundant", cause.Label)
+}
+
+func (c *unlabelStmtChecker) warnLabeledContinue(cause ast.Node, label string) {
+ c.ctx.Warn(cause, "change `continue %s` to `break`", label)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/unlambda_checker.go b/vendor/github.com/go-critic/go-critic/checkers/unlambda_checker.go
new file mode 100644
index 00000000000..846bb14d254
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/unlambda_checker.go
@@ -0,0 +1,73 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "unlambda"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects function literals that can be simplified"
+ info.Before = `func(x int) int { return fn(x) }`
+ info.After = `fn`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&unlambdaChecker{ctx: ctx})
+ })
+}
+
+type unlambdaChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *unlambdaChecker) VisitExpr(x ast.Expr) {
+ fn, ok := x.(*ast.FuncLit)
+ if !ok || len(fn.Body.List) != 1 {
+ return
+ }
+
+ ret, ok := fn.Body.List[0].(*ast.ReturnStmt)
+ if !ok || len(ret.Results) != 1 {
+ return
+ }
+
+ result := astcast.ToCallExpr(ret.Results[0])
+ callable := qualifiedName(result.Fun)
+ if callable == "" {
+ return // Skip tricky cases; only handle simple calls
+ }
+ if isBuiltin(callable) {
+ return // See #762
+ }
+ fnType := c.ctx.TypesInfo.TypeOf(fn)
+ resultType := c.ctx.TypesInfo.TypeOf(result.Fun)
+ if !types.Identical(fnType, resultType) {
+ return
+ }
+ // Now check that all arguments match the parameters.
+ n := 0
+ for _, params := range fn.Type.Params.List {
+ for _, id := range params.Names {
+ if !astequal.Expr(id, result.Args[n]) {
+ return
+ }
+ n++
+ }
+ }
+
+ if len(result.Args) == n {
+ c.warn(fn, callable)
+ }
+}
+
+func (c *unlambdaChecker) warn(cause ast.Node, suggestion string) {
+ c.ctx.Warn(cause, "replace `%s` with `%s`", cause, suggestion)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/unnamedResult_checker.go b/vendor/github.com/go-critic/go-critic/checkers/unnamedResult_checker.go
new file mode 100644
index 00000000000..09423250ad4
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/unnamedResult_checker.go
@@ -0,0 +1,103 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "unnamedResult"
+ info.Tags = []string{"style", "opinionated", "experimental"}
+ info.Params = lintpack.CheckerParams{
+ "checkExported": {
+ Value: false,
+ Usage: "whether to check exported functions",
+ },
+ }
+ info.Summary = "Detects unnamed results that may benefit from names"
+ info.Before = `func f() (float64, float64)`
+ info.After = `func f() (x, y float64)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ c := &unnamedResultChecker{ctx: ctx}
+ c.checkExported = info.Params.Bool("checkExported")
+ return astwalk.WalkerForFuncDecl(c)
+ })
+}
+
+type unnamedResultChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ checkExported bool
+}
+
+func (c *unnamedResultChecker) VisitFuncDecl(decl *ast.FuncDecl) {
+ if c.checkExported && !ast.IsExported(decl.Name.Name) {
+ return
+ }
+ results := decl.Type.Results
+ switch {
+ case results == nil:
+ return // Function has no results
+ case len(results.List) != 0 && results.List[0].Names != nil:
+ return // Skip named results
+ }
+
+ typeName := func(x ast.Expr) string { return c.typeName(c.ctx.TypesInfo.TypeOf(x)) }
+ isError := func(x ast.Expr) bool { return qualifiedName(x) == "error" }
+ isBool := func(x ast.Expr) bool { return qualifiedName(x) == "bool" }
+
+ // Main difference with case of len=2 is that we permit any
+ // typ1 as long as second type is either error or bool.
+ if results.NumFields() == 2 {
+ typ1, typ2 := results.List[0].Type, results.List[1].Type
+ name1, name2 := typeName(typ1), typeName(typ2)
+ cond := (name1 != name2 && name2 != "") ||
+ (!isError(typ1) && isError(typ2)) ||
+ (!isBool(typ1) && isBool(typ2))
+ if !cond {
+ c.warn(decl)
+ }
+ return
+ }
+
+ seen := make(map[string]bool, len(results.List))
+ for i := range results.List {
+ typ := results.List[i].Type
+ name := typeName(typ)
+ isLast := i == len(results.List)-1
+
+ cond := !seen[name] ||
+ (isLast && (isError(typ) || isBool(typ)))
+ if !cond {
+ c.warn(decl)
+ return
+ }
+
+ seen[name] = true
+ }
+}
+
+func (c *unnamedResultChecker) typeName(typ types.Type) string {
+ switch typ := typ.(type) {
+ case *types.Array:
+ return c.typeName(typ.Elem())
+ case *types.Pointer:
+ return c.typeName(typ.Elem())
+ case *types.Slice:
+ return c.typeName(typ.Elem())
+ case *types.Named:
+ return typ.Obj().Name()
+ default:
+ return ""
+ }
+}
+
+func (c *unnamedResultChecker) warn(n ast.Node) {
+ c.ctx.Warn(n, "consider giving a name to these results")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/unnecessaryBlock_checker.go b/vendor/github.com/go-critic/go-critic/checkers/unnecessaryBlock_checker.go
new file mode 100644
index 00000000000..e5dc45f7ef0
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/unnecessaryBlock_checker.go
@@ -0,0 +1,69 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "unnecessaryBlock"
+ info.Tags = []string{"style", "opinionated", "experimental"}
+ info.Summary = "Detects unnecessary braced statement blocks"
+ info.Before = `
+x := 1
+{
+ print(x)
+}`
+ info.After = `
+x := 1
+print(x)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmtList(&unnecessaryBlockChecker{ctx: ctx})
+ })
+}
+
+type unnecessaryBlockChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *unnecessaryBlockChecker) VisitStmtList(statements []ast.Stmt) {
+ // Using StmtListVisitor instead of StmtVisitor makes it easier to avoid
+ // false positives on IfStmt, RangeStmt, ForStmt and alike.
+ // We only inspect BlockStmt inside statement lists, so this method is not
+ // called for IfStmt itself, for example.
+
+ for _, stmt := range statements {
+ stmt, ok := stmt.(*ast.BlockStmt)
+ if ok && !c.hasDefinitions(stmt) {
+ c.warn(stmt)
+ }
+ }
+}
+
+func (c *unnecessaryBlockChecker) hasDefinitions(stmt *ast.BlockStmt) bool {
+ for _, bs := range stmt.List {
+ switch stmt := bs.(type) {
+ case *ast.AssignStmt:
+ if stmt.Tok == token.DEFINE {
+ return true
+ }
+ case *ast.DeclStmt:
+ decl := stmt.Decl.(*ast.GenDecl)
+ if len(decl.Specs) != 0 {
+ return true
+ }
+ }
+ }
+
+ return false
+}
+
+func (c *unnecessaryBlockChecker) warn(expr ast.Stmt) {
+ c.ctx.Warn(expr, "block doesn't have definitions, can be simply deleted")
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/unslice_checker.go b/vendor/github.com/go-critic/go-critic/checkers/unslice_checker.go
new file mode 100644
index 00000000000..06d90819c9a
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/unslice_checker.go
@@ -0,0 +1,59 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "unslice"
+ info.Tags = []string{"style"}
+ info.Summary = "Detects slice expressions that can be simplified to sliced expression itself"
+ info.Before = `
+f(s[:]) // s is string
+copy(b[:], values...) // b is []byte`
+ info.After = `
+f(s)
+copy(b, values...)`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&unsliceChecker{ctx: ctx})
+ })
+}
+
+type unsliceChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *unsliceChecker) VisitExpr(expr ast.Expr) {
+ unsliced := c.unslice(expr)
+ if !astequal.Expr(expr, unsliced) {
+ c.warn(expr, unsliced)
+ c.SkipChilds = true
+ }
+}
+
+func (c *unsliceChecker) unslice(expr ast.Expr) ast.Expr {
+ slice, ok := expr.(*ast.SliceExpr)
+ if !ok || slice.Low != nil || slice.High != nil {
+ // No need to worry about 3-index slicing,
+ // because it's only permitted if expr.High is not nil.
+ return expr
+ }
+ switch c.ctx.TypesInfo.TypeOf(slice.X).(type) {
+ case *types.Slice, *types.Basic:
+ // Basic kind catches strings, Slice cathes everything else.
+ return c.unslice(slice.X)
+ }
+ return expr
+}
+
+func (c *unsliceChecker) warn(cause, unsliced ast.Expr) {
+ c.ctx.Warn(cause, "could simplify %s to %s", cause, unsliced)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/utils.go b/vendor/github.com/go-critic/go-critic/checkers/utils.go
new file mode 100644
index 00000000000..f25a82ef521
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/utils.go
@@ -0,0 +1,130 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/types"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+)
+
+var goBuiltins = map[string]bool{
+ // Types
+ "bool": true,
+ "byte": true,
+ "complex64": true,
+ "complex128": true,
+ "error": true,
+ "float32": true,
+ "float64": true,
+ "int": true,
+ "int8": true,
+ "int16": true,
+ "int32": true,
+ "int64": true,
+ "rune": true,
+ "string": true,
+ "uint": true,
+ "uint8": true,
+ "uint16": true,
+ "uint32": true,
+ "uint64": true,
+ "uintptr": true,
+
+ // Constants
+ "true": true,
+ "false": true,
+ "iota": true,
+
+ // Zero value
+ "nil": true,
+
+ // Functions
+ "append": true,
+ "cap": true,
+ "close": true,
+ "complex": true,
+ "copy": true,
+ "delete": true,
+ "imag": true,
+ "len": true,
+ "make": true,
+ "new": true,
+ "panic": true,
+ "print": true,
+ "println": true,
+ "real": true,
+ "recover": true,
+}
+
+// isBuiltin reports whether sym belongs to a predefined identifier set.
+func isBuiltin(sym string) bool {
+ return goBuiltins[sym]
+}
+
+// isStdlibPkg reports whether pkg is a package from the Go standard library.
+func isStdlibPkg(pkg *types.Package) bool {
+ return pkg != nil && pkg.Path() == pkg.Name()
+}
+
+// isUnitTestFunc reports whether FuncDecl declares testing function.
+func isUnitTestFunc(ctx *lintpack.CheckerContext, fn *ast.FuncDecl) bool {
+ if !strings.HasPrefix(fn.Name.Name, "Test") {
+ return false
+ }
+ typ := ctx.TypesInfo.TypeOf(fn.Name)
+ if sig, ok := typ.(*types.Signature); ok {
+ return sig.Results().Len() == 0 &&
+ sig.Params().Len() == 1 &&
+ sig.Params().At(0).Type().String() == "*testing.T"
+ }
+ return false
+}
+
+// qualifiedName returns called expr fully-quallified name.
+//
+// It works for simple identifiers like f => "f" and identifiers
+// from other package like pkg.f => "pkg.f".
+//
+// For all unexpected expressions returns empty string.
+func qualifiedName(x ast.Expr) string {
+ switch x := x.(type) {
+ case *ast.SelectorExpr:
+ pkg, ok := x.X.(*ast.Ident)
+ if !ok {
+ return ""
+ }
+ return pkg.Name + "." + x.Sel.Name
+ case *ast.Ident:
+ return x.Name
+ default:
+ return ""
+ }
+}
+
+// identOf returns identifier for x that can be used to obtain associated types.Object.
+// Returns nil for expressions that yield temporary results, like `f().field`.
+func identOf(x ast.Node) *ast.Ident {
+ switch x := x.(type) {
+ case *ast.Ident:
+ return x
+ case *ast.SelectorExpr:
+ return identOf(x.Sel)
+ case *ast.TypeAssertExpr:
+ // x.(type) - x may contain ident.
+ return identOf(x.X)
+ case *ast.IndexExpr:
+ // x[i] - x may contain ident.
+ return identOf(x.X)
+ case *ast.StarExpr:
+ // *x - x may contain ident.
+ return identOf(x.X)
+ case *ast.SliceExpr:
+ // x[:] - x may contain ident.
+ return identOf(x.X)
+
+ default:
+ // Note that this function is not comprehensive.
+ return nil
+ }
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/valSwap_checker.go b/vendor/github.com/go-critic/go-critic/checkers/valSwap_checker.go
new file mode 100644
index 00000000000..ab27f920079
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/valSwap_checker.go
@@ -0,0 +1,64 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astequal"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "valSwap"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects value swapping code that are not using parallel assignment"
+ info.Before = `
+tmp := *x
+*x = *y
+*y = tmp`
+ info.After = `*x, *y = *y, *x`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForStmtList(&valSwapChecker{ctx: ctx})
+ })
+}
+
+type valSwapChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *valSwapChecker) VisitStmtList(list []ast.Stmt) {
+ for len(list) >= 3 {
+ tmpAssign := astcast.ToAssignStmt(list[0])
+ assignX := astcast.ToAssignStmt(list[1])
+ assignY := astcast.ToAssignStmt(list[2])
+
+ cond := c.isSimpleAssign(tmpAssign) &&
+ c.isSimpleAssign(assignX) &&
+ c.isSimpleAssign(assignY) &&
+ assignX.Tok == token.ASSIGN &&
+ assignY.Tok == token.ASSIGN &&
+ astequal.Expr(assignX.Lhs[0], tmpAssign.Rhs[0]) &&
+ astequal.Expr(assignX.Rhs[0], assignY.Lhs[0]) &&
+ astequal.Expr(assignY.Rhs[0], tmpAssign.Lhs[0])
+ if cond {
+ c.warn(tmpAssign, assignX.Lhs[0], assignY.Lhs[0])
+ list = list[3:]
+ } else {
+ list = list[1:]
+ }
+ }
+}
+
+func (c *valSwapChecker) isSimpleAssign(x *ast.AssignStmt) bool {
+ return len(x.Lhs) == 1 && len(x.Rhs) == 1
+}
+
+func (c *valSwapChecker) warn(cause, x, y ast.Node) {
+ c.ctx.Warn(cause, "can re-write as `%s, %s = %s, %s`",
+ x, y, y, x)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go b/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go
new file mode 100644
index 00000000000..fcd9aee527e
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/weakCond_checker.go
@@ -0,0 +1,77 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-critic/go-critic/checkers/internal/lintutil"
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/typep"
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "weakCond"
+ info.Tags = []string{"diagnostic", "experimental"}
+ info.Summary = "Detects conditions that are unsafe due to not being exhaustive"
+ info.Before = `xs != nil && xs[0] != nil`
+ info.After = `len(xs) != 0 && xs[0] != nil`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForExpr(&weakCondChecker{ctx: ctx})
+ })
+}
+
+type weakCondChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *weakCondChecker) VisitExpr(expr ast.Expr) {
+ // TODO(Quasilyte): more patterns.
+ // TODO(Quasilyte): analyze and fix false positives.
+
+ cond := astcast.ToBinaryExpr(expr)
+ lhs := astcast.ToBinaryExpr(astutil.Unparen(cond.X))
+ rhs := astutil.Unparen(cond.Y)
+
+ // Pattern 1.
+ // `x != nil && usageOf(x[i])`
+ // Pattern 2.
+ // `x == nil || usageOf(x[i])`
+
+ // lhs is `x nil`
+ x := lhs.X
+ if !typep.IsSlice(c.ctx.TypesInfo.TypeOf(x)) {
+ return
+ }
+ if astcast.ToIdent(lhs.Y).Name != "nil" {
+ return
+ }
+
+ pat1prefix := cond.Op == token.LAND && lhs.Op == token.NEQ
+ pat2prefix := cond.Op == token.LOR && lhs.Op == token.EQL
+ if !pat1prefix && !pat2prefix {
+ return
+ }
+
+ if c.isIndexed(rhs, x) {
+ c.warn(expr, "nil check may not be enough, check for len")
+ }
+}
+
+// isIndexed reports whether x is indexed inside given expr tree.
+func (c *weakCondChecker) isIndexed(tree, x ast.Expr) bool {
+ return lintutil.ContainsNode(tree, func(n ast.Node) bool {
+ indexing := astcast.ToIndexExpr(n)
+ return astequal.Expr(x, indexing.X)
+ })
+}
+
+func (c *weakCondChecker) warn(cause ast.Node, suggest string) {
+ c.ctx.Warn(cause, "suspicious `%s`; %s", cause, suggest)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/wrapperFunc_checker.go b/vendor/github.com/go-critic/go-critic/checkers/wrapperFunc_checker.go
new file mode 100644
index 00000000000..e2308ff4b67
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/wrapperFunc_checker.go
@@ -0,0 +1,214 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+ "strings"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcast"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "wrapperFunc"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects function calls that can be replaced with convenience wrappers"
+ info.Before = `wg.Add(-1)`
+ info.After = `wg.Done()`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ type arg struct {
+ index int
+ value string
+ }
+ type pattern struct {
+ pkg string
+ typ string // Only for typ patterns
+ args []arg
+ suggestion string
+ }
+ type matcher struct {
+ pkgPatterns []pattern
+ typPatterns []pattern
+ }
+
+ typPatterns := map[string][]arg{
+ "sync.WaitGroup.Add => WaitGroup.Done": {
+ {0, "-1"},
+ },
+ }
+
+ pkgPatterns := map[string][]arg{
+ "http.HandlerFunc => http.NotFoundHandler": {
+ {0, "http.NotFound"},
+ },
+
+ "strings.Replace => strings.ReplaceAll": {
+ {3, "-1"},
+ },
+ "strings.TrimFunc => strings.TrimSpace": {
+ {1, "unicode.IsSpace"},
+ },
+ "strings.Map => strings.ToTitle": {
+ {0, "unicode.ToTitle"},
+ },
+
+ "bytes.Replace => bytes.ReplaceAll": {
+ {3, "-1"},
+ },
+ "bytes.TrimFunc => bytes.TrimSpace": {
+ {1, "unicode.IsSpace"},
+ },
+ "bytes.Map => bytes.ToUpper": {
+ {0, "unicode.ToUpper"},
+ },
+ "bytes.Map => bytes.ToLower": {
+ {0, "unicode.ToLower"},
+ },
+ "bytes.Map => bytes.ToTitle": {
+ {0, "unicode.ToTitle"},
+ },
+ }
+
+ matchers := make(map[string]*matcher)
+
+ type templateKey struct {
+ from string
+ to string
+ }
+ decodeKey := func(key string) templateKey {
+ parts := strings.Split(key, " => ")
+ return templateKey{from: parts[0], to: parts[1]}
+ }
+
+ // Expand pkg patterns.
+ for key, args := range pkgPatterns {
+ key := decodeKey(key)
+ parts := strings.Split(key.from, ".")
+ fn := parts[1]
+ m := matchers[fn]
+ if m == nil {
+ m = &matcher{}
+ matchers[fn] = m
+ }
+ m.pkgPatterns = append(m.pkgPatterns, pattern{
+ pkg: parts[0],
+ args: args,
+ suggestion: key.to,
+ })
+ }
+ // Expand typ patterns.
+ for key, args := range typPatterns {
+ key := decodeKey(key)
+ parts := strings.Split(key.from, ".")
+ fn := parts[2]
+ m := matchers[fn]
+ if m == nil {
+ m = &matcher{}
+ matchers[fn] = m
+ }
+ m.typPatterns = append(m.typPatterns, pattern{
+ pkg: parts[0],
+ typ: parts[1],
+ args: args,
+ suggestion: key.to,
+ })
+ }
+
+ var valueOf func(x ast.Expr) string
+ valueOf = func(x ast.Expr) string {
+ switch x := x.(type) {
+ case *ast.Ident:
+ return x.Name
+ case *ast.SelectorExpr:
+ id, ok := x.X.(*ast.Ident)
+ if ok {
+ return id.Name + "." + x.Sel.Name
+ }
+ case *ast.BasicLit:
+ return x.Value
+ case *ast.UnaryExpr:
+ switch x.Op {
+ case token.SUB:
+ return "-" + valueOf(x.X)
+ case token.ADD:
+ return valueOf(x.X)
+ }
+ }
+ return ""
+ }
+
+ findSuggestion := func(call *ast.CallExpr, pkg, typ string, patterns []pattern) string {
+ for _, pat := range patterns {
+ if pat.pkg != pkg || pat.typ != typ {
+ continue
+ }
+ for _, arg := range pat.args {
+ if arg.value == valueOf(call.Args[arg.index]) {
+ return pat.suggestion
+ }
+ }
+ }
+ return ""
+ }
+
+ c := &wrapperFuncChecker{ctx: ctx}
+ c.findSuggestion = func(call *ast.CallExpr) string {
+ sel := astcast.ToSelectorExpr(call.Fun).Sel
+ if sel == nil {
+ return ""
+ }
+ x := astcast.ToSelectorExpr(call.Fun).X
+
+ m := matchers[sel.Name]
+ if m == nil {
+ return ""
+ }
+
+ if x, ok := x.(*ast.Ident); ok {
+ obj, ok := c.ctx.TypesInfo.ObjectOf(x).(*types.PkgName)
+ if ok {
+ return findSuggestion(call, obj.Name(), "", m.pkgPatterns)
+ }
+ }
+
+ typ := c.ctx.TypesInfo.TypeOf(x)
+ tn, ok := typ.(*types.Named)
+ if !ok {
+ return ""
+ }
+ return findSuggestion(
+ call,
+ tn.Obj().Pkg().Name(),
+ tn.Obj().Name(),
+ m.typPatterns)
+ }
+
+ return astwalk.WalkerForExpr(c)
+ })
+}
+
+type wrapperFuncChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+
+ findSuggestion func(*ast.CallExpr) string
+}
+
+func (c *wrapperFuncChecker) VisitExpr(expr ast.Expr) {
+ call := astcast.ToCallExpr(expr)
+ if len(call.Args) == 0 {
+ return
+ }
+
+ if suggest := c.findSuggestion(call); suggest != "" {
+ c.warn(call, suggest)
+ }
+}
+
+func (c *wrapperFuncChecker) warn(cause ast.Node, suggest string) {
+ c.ctx.Warn(cause, "use %s method in `%s`", suggest, cause)
+}
diff --git a/vendor/github.com/go-critic/go-critic/checkers/yodaStyleExpr_checker.go b/vendor/github.com/go-critic/go-critic/checkers/yodaStyleExpr_checker.go
new file mode 100644
index 00000000000..06577788e0c
--- /dev/null
+++ b/vendor/github.com/go-critic/go-critic/checkers/yodaStyleExpr_checker.go
@@ -0,0 +1,51 @@
+package checkers
+
+import (
+ "go/ast"
+ "go/token"
+
+ "github.com/go-lintpack/lintpack"
+ "github.com/go-lintpack/lintpack/astwalk"
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astp"
+)
+
+func init() {
+ var info lintpack.CheckerInfo
+ info.Name = "yodaStyleExpr"
+ info.Tags = []string{"style", "experimental"}
+ info.Summary = "Detects Yoda style expressions and suggests to replace them"
+ info.Before = `return nil != ptr`
+ info.After = `return ptr != nil`
+
+ collection.AddChecker(&info, func(ctx *lintpack.CheckerContext) lintpack.FileWalker {
+ return astwalk.WalkerForLocalExpr(&yodaStyleExprChecker{ctx: ctx})
+ })
+}
+
+type yodaStyleExprChecker struct {
+ astwalk.WalkHandler
+ ctx *lintpack.CheckerContext
+}
+
+func (c *yodaStyleExprChecker) VisitLocalExpr(expr ast.Expr) {
+ binexpr, ok := expr.(*ast.BinaryExpr)
+ if !ok {
+ return
+ }
+ if binexpr.Op == token.EQL || binexpr.Op == token.NEQ {
+ if c.isConstExpr(binexpr.X) && !c.isConstExpr(binexpr.Y) {
+ c.warn(binexpr)
+ }
+ }
+}
+
+func (c *yodaStyleExprChecker) isConstExpr(expr ast.Expr) bool {
+ return qualifiedName(expr) == "nil" || astp.IsBasicLit(expr)
+}
+
+func (c *yodaStyleExprChecker) warn(expr *ast.BinaryExpr) {
+ e := astcopy.BinaryExpr(expr)
+ e.X, e.Y = e.Y, e.X
+ c.ctx.Warn(expr, "consider to change order in expression to %s", e)
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/.travis.yml b/vendor/github.com/go-lintpack/lintpack/.travis.yml
new file mode 100644
index 00000000000..41a0cbac510
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/.travis.yml
@@ -0,0 +1,7 @@
+language: go
+go:
+ - 1.x
+install:
+ - # Prevent default install action "go get -t -v ./...".
+script:
+ - make ci
diff --git a/vendor/github.com/go-lintpack/lintpack/LICENSE b/vendor/github.com/go-lintpack/lintpack/LICENSE
new file mode 100644
index 00000000000..de0abccdf3d
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/LICENSE
@@ -0,0 +1,24 @@
+Copyright (c) 2018, go-lintpack maintainers
+
+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 Intel Corporation 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/go-lintpack/lintpack/Makefile b/vendor/github.com/go-lintpack/lintpack/Makefile
new file mode 100644
index 00000000000..63f21d2f93d
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/Makefile
@@ -0,0 +1,14 @@
+.PHONY: test ci
+
+%: # stubs to get makefile param for `test-checker` command
+ @: # see: https://stackoverflow.com/a/6273809/433041
+
+build:
+ go build cmd/lintpack/build.go cmd/lintpack/main.go
+
+test:
+ go test -v -count=1 ./...
+
+ci:
+ go get -t -v ./...
+ go test -v -count=1 ./...
diff --git a/vendor/github.com/go-lintpack/lintpack/README.md b/vendor/github.com/go-lintpack/lintpack/README.md
new file mode 100644
index 00000000000..5702228ebce
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/README.md
@@ -0,0 +1,32 @@
+[![Build Status][travis-image]][travis-url]
+[![Go Report Card][go-report-image]][go-report-url]
+
+[travis-image]: https://travis-ci.org/go-critic/go-critic.svg?branch=master
+[travis-url]: https://travis-ci.org/go-critic/go-critic
+[go-report-image]: https://goreportcard.com/badge/github.com/go-critic/go-critic
+[go-report-url]: https://goreportcard.com/report/github.com/go-critic/go-critic
+
+## Quick start / Installation / Usage
+
+Install `lintpack`:
+
+```bash
+go get -v -u github.com/go-lintpack/lintpack/...
+```
+
+Install checkers from [go-critic/checkers](https://github.com/go-critic/checkers):
+
+```bash
+# You'll need to have sources under your Go workspace first:
+go get -v -u github.com/go-critic/checkers
+# Now build a linter that includes all checks from that package:
+lintpack build -o gocritic github.com/go-critic/checkers
+# Executable gocritic is created and can be used as a standalone linter.
+```
+
+Produced binary includes basic help as well as supported checks documentation.
+
+So, the process is simple:
+
+* Get the `lintpack` linter builder
+* Build linter from checks implemented in different repos, by various vendors
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/comment_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/comment_walker.go
new file mode 100644
index 00000000000..6c60e3fede5
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/comment_walker.go
@@ -0,0 +1,41 @@
+package astwalk
+
+import (
+ "go/ast"
+ "strings"
+)
+
+type commentWalker struct {
+ visitor CommentVisitor
+}
+
+func (w *commentWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, cg := range f.Comments {
+ visitCommentGroups(cg, w.visitor.VisitComment)
+ }
+}
+
+func visitCommentGroups(cg *ast.CommentGroup, visit func(*ast.CommentGroup)) {
+ var group []*ast.Comment
+ visitGroup := func(list []*ast.Comment) {
+ if len(list) == 0 {
+ return
+ }
+ cg := &ast.CommentGroup{List: list}
+ visit(cg)
+ }
+ for _, comment := range cg.List {
+ if strings.HasPrefix(comment.Text, "/*") {
+ visitGroup(group)
+ group = group[:0]
+ visitGroup([]*ast.Comment{comment})
+ } else {
+ group = append(group, comment)
+ }
+ }
+ visitGroup(group)
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/doc_comment_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/doc_comment_walker.go
new file mode 100644
index 00000000000..39b5365083e
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/doc_comment_walker.go
@@ -0,0 +1,48 @@
+package astwalk
+
+import (
+ "go/ast"
+)
+
+type docCommentWalker struct {
+ visitor DocCommentVisitor
+}
+
+func (w *docCommentWalker) WalkFile(f *ast.File) {
+ for _, decl := range f.Decls {
+ switch decl := decl.(type) {
+ case *ast.FuncDecl:
+ if decl.Doc != nil {
+ w.visitor.VisitDocComment(decl.Doc)
+ }
+ case *ast.GenDecl:
+ if decl.Doc != nil {
+ w.visitor.VisitDocComment(decl.Doc)
+ }
+ for _, spec := range decl.Specs {
+ switch spec := spec.(type) {
+ case *ast.ImportSpec:
+ if spec.Doc != nil {
+ w.visitor.VisitDocComment(spec.Doc)
+ }
+ case *ast.ValueSpec:
+ if spec.Doc != nil {
+ w.visitor.VisitDocComment(spec.Doc)
+ }
+ case *ast.TypeSpec:
+ if spec.Doc != nil {
+ w.visitor.VisitDocComment(spec.Doc)
+ }
+ ast.Inspect(spec.Type, func(n ast.Node) bool {
+ if n, ok := n.(*ast.Field); ok {
+ if n.Doc != nil {
+ w.visitor.VisitDocComment(n.Doc)
+ }
+ }
+ return true
+ })
+ }
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/expr_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/expr_walker.go
new file mode 100644
index 00000000000..64098b2b7bc
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/expr_walker.go
@@ -0,0 +1,29 @@
+package astwalk
+
+import "go/ast"
+
+type exprWalker struct {
+ visitor ExprVisitor
+}
+
+func (w *exprWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ if decl, ok := decl.(*ast.FuncDecl); ok {
+ if !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ }
+
+ ast.Inspect(decl, func(x ast.Node) bool {
+ if x, ok := x.(ast.Expr); ok {
+ w.visitor.VisitExpr(x)
+ return !w.visitor.skipChilds()
+ }
+ return true
+ })
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/func_decl_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/func_decl_walker.go
new file mode 100644
index 00000000000..90d921f6ffc
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/func_decl_walker.go
@@ -0,0 +1,21 @@
+package astwalk
+
+import "go/ast"
+
+type funcDeclWalker struct {
+ visitor FuncDeclVisitor
+}
+
+func (w *funcDeclWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.FuncDecl)
+ if !ok || !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ w.visitor.VisitFuncDecl(decl)
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/local_comment_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/local_comment_walker.go
new file mode 100644
index 00000000000..e042f0d5ef5
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/local_comment_walker.go
@@ -0,0 +1,32 @@
+package astwalk
+
+import (
+ "go/ast"
+)
+
+type localCommentWalker struct {
+ visitor LocalCommentVisitor
+}
+
+func (w *localCommentWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.FuncDecl)
+ if !ok || !w.visitor.EnterFunc(decl) {
+ continue
+ }
+
+ for _, cg := range f.Comments {
+ // Not sure that decls/comments are sorted
+ // by positions, so do a naive full scan for now.
+ if cg.Pos() < decl.Pos() || cg.Pos() > decl.End() {
+ continue
+ }
+
+ visitCommentGroups(cg, w.visitor.VisitLocalComment)
+ }
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/local_def_visitor.go b/vendor/github.com/go-lintpack/lintpack/astwalk/local_def_visitor.go
new file mode 100644
index 00000000000..bed0f44ab65
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/local_def_visitor.go
@@ -0,0 +1,51 @@
+package astwalk
+
+import (
+ "go/ast"
+)
+
+// LocalDefVisitor visits every name definitions inside a function.
+//
+// Next elements are considered as name definitions:
+// - Function parameters (input, output, receiver)
+// - Every LHS of ":=" assignment that defines a new name
+// - Every local var/const declaration.
+//
+// NOTE: this visitor is experimental.
+// This is also why it lives in a separate file.
+type LocalDefVisitor interface {
+ walkerEvents
+ VisitLocalDef(Name, ast.Expr)
+}
+
+type (
+ // NameKind describes what kind of name Name object holds.
+ NameKind int
+
+ // Name holds ver/const/param definition symbol info.
+ Name struct {
+ ID *ast.Ident
+ Kind NameKind
+
+ // Index is NameVar-specific field that is used to
+ // specify nth tuple element being assigned to the name.
+ Index int
+ }
+)
+
+// NOTE: set of name kinds is not stable and may change over time.
+//
+// TODO(quasilyte): is NameRecv/NameParam/NameResult granularity desired?
+// TODO(quasilyte): is NameVar/NameBind (var vs :=) granularity desired?
+const (
+ // NameParam is function/method receiver/input/output name.
+ // Initializing expression is always nil.
+ NameParam NameKind = iota
+ // NameVar is var or ":=" declared name.
+ // Initizlizing expression may be nil for var-declared names
+ // without explicit initializing expression.
+ NameVar
+ // NameConst is const-declared name.
+ // Initializing expression is never nil.
+ NameConst
+)
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/local_def_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/local_def_walker.go
new file mode 100644
index 00000000000..f6808cbb497
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/local_def_walker.go
@@ -0,0 +1,118 @@
+package astwalk
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+type localDefWalker struct {
+ visitor LocalDefVisitor
+ info *types.Info
+}
+
+func (w *localDefWalker) WalkFile(f *ast.File) {
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.FuncDecl)
+ if !ok || !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ w.walkFunc(decl)
+ }
+}
+
+func (w *localDefWalker) walkFunc(decl *ast.FuncDecl) {
+ w.walkSignature(decl)
+ w.walkFuncBody(decl)
+}
+
+func (w *localDefWalker) walkFuncBody(decl *ast.FuncDecl) {
+ ast.Inspect(decl.Body, func(x ast.Node) bool {
+ switch x := x.(type) {
+ case *ast.AssignStmt:
+ if x.Tok != token.DEFINE {
+ return false
+ }
+ if len(x.Lhs) != len(x.Rhs) {
+ // Multi-value assignment.
+ // Invariant: there is only 1 RHS.
+ for i, lhs := range x.Lhs {
+ id, ok := lhs.(*ast.Ident)
+ if !ok || w.info.Defs[id] == nil {
+ continue
+ }
+ def := Name{ID: id, Kind: NameVar, Index: i}
+ w.visitor.VisitLocalDef(def, x.Rhs[0])
+ }
+ } else {
+ // Simple 1-1 assignments.
+ for i, lhs := range x.Lhs {
+ id, ok := lhs.(*ast.Ident)
+ if !ok || w.info.Defs[id] == nil {
+ continue
+ }
+ def := Name{ID: id, Kind: NameVar}
+ w.visitor.VisitLocalDef(def, x.Rhs[i])
+ }
+ }
+ return false
+
+ case *ast.GenDecl:
+ // Decls always introduce new names.
+ for _, spec := range x.Specs {
+ spec, ok := spec.(*ast.ValueSpec)
+ if !ok { // Ignore type/import specs
+ return false
+ }
+ switch {
+ case len(spec.Values) == 0:
+ // var-specific decls without explicit init.
+ for _, id := range spec.Names {
+ def := Name{ID: id, Kind: NameVar}
+ w.visitor.VisitLocalDef(def, nil)
+ }
+ case len(spec.Names) != len(spec.Values):
+ // var-specific decls that assign tuple results.
+ for i, id := range spec.Names {
+ def := Name{ID: id, Kind: NameVar, Index: i}
+ w.visitor.VisitLocalDef(def, spec.Values[0])
+ }
+ default:
+ // Can be either var or const decl.
+ kind := NameVar
+ if x.Tok == token.CONST {
+ kind = NameConst
+ }
+ for i, id := range spec.Names {
+ def := Name{ID: id, Kind: kind}
+ w.visitor.VisitLocalDef(def, spec.Values[i])
+ }
+ }
+ }
+ return false
+ }
+
+ return true
+ })
+}
+
+func (w *localDefWalker) walkSignature(decl *ast.FuncDecl) {
+ for _, p := range decl.Type.Params.List {
+ for _, id := range p.Names {
+ def := Name{ID: id, Kind: NameParam}
+ w.visitor.VisitLocalDef(def, nil)
+ }
+ }
+ if decl.Type.Results != nil {
+ for _, p := range decl.Type.Results.List {
+ for _, id := range p.Names {
+ def := Name{ID: id, Kind: NameParam}
+ w.visitor.VisitLocalDef(def, nil)
+ }
+ }
+ }
+ if decl.Recv != nil && len(decl.Recv.List[0].Names) != 0 {
+ def := Name{ID: decl.Recv.List[0].Names[0], Kind: NameParam}
+ w.visitor.VisitLocalDef(def, nil)
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/local_expr_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/local_expr_walker.go
new file mode 100644
index 00000000000..951fd97e596
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/local_expr_walker.go
@@ -0,0 +1,27 @@
+package astwalk
+
+import "go/ast"
+
+type localExprWalker struct {
+ visitor LocalExprVisitor
+}
+
+func (w *localExprWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.FuncDecl)
+ if !ok || !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ ast.Inspect(decl.Body, func(x ast.Node) bool {
+ if x, ok := x.(ast.Expr); ok {
+ w.visitor.VisitLocalExpr(x)
+ return !w.visitor.skipChilds()
+ }
+ return true
+ })
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/stmt_list_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/stmt_list_walker.go
new file mode 100644
index 00000000000..1cc0493a406
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/stmt_list_walker.go
@@ -0,0 +1,31 @@
+package astwalk
+
+import "go/ast"
+
+type stmtListWalker struct {
+ visitor StmtListVisitor
+}
+
+func (w *stmtListWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.FuncDecl)
+ if !ok || !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ ast.Inspect(decl.Body, func(x ast.Node) bool {
+ switch x := x.(type) {
+ case *ast.BlockStmt:
+ w.visitor.VisitStmtList(x.List)
+ case *ast.CaseClause:
+ w.visitor.VisitStmtList(x.Body)
+ case *ast.CommClause:
+ w.visitor.VisitStmtList(x.Body)
+ }
+ return !w.visitor.skipChilds()
+ })
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/stmt_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/stmt_walker.go
new file mode 100644
index 00000000000..722eeb1166a
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/stmt_walker.go
@@ -0,0 +1,27 @@
+package astwalk
+
+import "go/ast"
+
+type stmtWalker struct {
+ visitor StmtVisitor
+}
+
+func (w *stmtWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ decl, ok := decl.(*ast.FuncDecl)
+ if !ok || !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ ast.Inspect(decl.Body, func(x ast.Node) bool {
+ if x, ok := x.(ast.Stmt); ok {
+ w.visitor.VisitStmt(x)
+ return !w.visitor.skipChilds()
+ }
+ return true
+ })
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/type_expr_walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/type_expr_walker.go
new file mode 100644
index 00000000000..24c150084a7
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/type_expr_walker.go
@@ -0,0 +1,114 @@
+package astwalk
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "github.com/go-toolsmith/astp"
+ "github.com/go-toolsmith/typep"
+)
+
+type typeExprWalker struct {
+ visitor TypeExprVisitor
+ info *types.Info
+}
+
+func (w *typeExprWalker) WalkFile(f *ast.File) {
+ if !w.visitor.EnterFile(f) {
+ return
+ }
+
+ for _, decl := range f.Decls {
+ if decl, ok := decl.(*ast.FuncDecl); ok {
+ if !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ }
+ switch decl := decl.(type) {
+ case *ast.FuncDecl:
+ if !w.visitor.EnterFunc(decl) {
+ continue
+ }
+ w.walkSignature(decl.Type)
+ ast.Inspect(decl.Body, w.walk)
+ case *ast.GenDecl:
+ if decl.Tok == token.IMPORT {
+ continue
+ }
+ ast.Inspect(decl, w.walk)
+ }
+ }
+}
+
+func (w *typeExprWalker) visit(x ast.Expr) bool {
+ w.visitor.VisitTypeExpr(x)
+ return !w.visitor.skipChilds()
+}
+
+func (w *typeExprWalker) walk(x ast.Node) bool {
+ switch x := x.(type) {
+ case *ast.ParenExpr:
+ if typep.IsTypeExpr(w.info, x.X) {
+ return w.visit(x)
+ }
+ return true
+ case *ast.CallExpr:
+ // Pointer conversions require parenthesis around pointer type.
+ // These casts are represented as call expressions.
+ // Because it's impossible for the visitor to distinguish such
+ // "required" parenthesis, walker skips outmost parenthesis in such cases.
+ return w.inspectInner(x.Fun)
+ case *ast.SelectorExpr:
+ // Like with conversions, method expressions are another special.
+ return w.inspectInner(x.X)
+ case *ast.StarExpr:
+ if typep.IsTypeExpr(w.info, x.X) {
+ return w.visit(x)
+ }
+ return true
+ case *ast.MapType:
+ return w.visit(x)
+ case *ast.FuncType:
+ return w.visit(x)
+ case *ast.StructType:
+ return w.visit(x)
+ case *ast.InterfaceType:
+ if !w.visit(x) {
+ return false
+ }
+ for _, method := range x.Methods.List {
+ switch x := method.Type.(type) {
+ case *ast.FuncType:
+ w.walkSignature(x)
+ default:
+ // Embedded interface.
+ w.walk(x)
+ }
+ }
+ return false
+ case *ast.ArrayType:
+ return w.visit(x)
+ }
+ return true
+}
+
+func (w *typeExprWalker) inspectInner(x ast.Expr) bool {
+ parens, ok := x.(*ast.ParenExpr)
+ if ok && typep.IsTypeExpr(w.info, parens.X) && astp.IsStarExpr(parens.X) {
+ ast.Inspect(parens.X, w.walk)
+ return false
+ }
+ return true
+}
+
+func (w *typeExprWalker) walkSignature(typ *ast.FuncType) {
+ for _, p := range typ.Params.List {
+ ast.Inspect(p.Type, w.walk)
+ }
+ if typ.Results != nil {
+ for _, p := range typ.Results.List {
+ ast.Inspect(p.Type, w.walk)
+ }
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/visitor.go b/vendor/github.com/go-lintpack/lintpack/astwalk/visitor.go
new file mode 100644
index 00000000000..9f973a2b342
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/visitor.go
@@ -0,0 +1,80 @@
+package astwalk
+
+import (
+ "go/ast"
+)
+
+// Visitor interfaces.
+type (
+ // DocCommentVisitor visits every doc-comment.
+ // Does not visit doc-comments for function-local definitions (types, etc).
+ // Also does not visit package doc-comment (file-level doc-comments).
+ DocCommentVisitor interface {
+ VisitDocComment(*ast.CommentGroup)
+ }
+
+ // FuncDeclVisitor visits every top-level function declaration.
+ FuncDeclVisitor interface {
+ walkerEvents
+ VisitFuncDecl(*ast.FuncDecl)
+ }
+
+ // ExprVisitor visits every expression inside AST file.
+ ExprVisitor interface {
+ walkerEvents
+ VisitExpr(ast.Expr)
+ }
+
+ // LocalExprVisitor visits every expression inside function body.
+ LocalExprVisitor interface {
+ walkerEvents
+ VisitLocalExpr(ast.Expr)
+ }
+
+ // StmtListVisitor visits every statement list inside function body.
+ // This includes block statement bodies as well as implicit blocks
+ // introduced by case clauses and alike.
+ StmtListVisitor interface {
+ walkerEvents
+ VisitStmtList([]ast.Stmt)
+ }
+
+ // StmtVisitor visits every statement inside function body.
+ StmtVisitor interface {
+ walkerEvents
+ VisitStmt(ast.Stmt)
+ }
+
+ // TypeExprVisitor visits every type describing expression.
+ // It also traverses struct types and interface types to run
+ // checker over their fields/method signatures.
+ TypeExprVisitor interface {
+ walkerEvents
+ VisitTypeExpr(ast.Expr)
+ }
+
+ // LocalCommentVisitor visits every comment inside function body.
+ LocalCommentVisitor interface {
+ walkerEvents
+ VisitLocalComment(*ast.CommentGroup)
+ }
+
+ // CommentVisitor visits every comment.
+ CommentVisitor interface {
+ walkerEvents
+ VisitComment(*ast.CommentGroup)
+ }
+)
+
+// walkerEvents describes common hooks available for most visitor types.
+type walkerEvents interface {
+ // EnterFile is called for every file that is about to be traversed.
+ // If false is returned, file is not visited.
+ EnterFile(*ast.File) bool
+
+ // EnterFunc is called for every function declaration that is about
+ // to be traversed. If false is returned, function is not visited.
+ EnterFunc(*ast.FuncDecl) bool
+
+ skipChilds() bool
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/walk_handler.go b/vendor/github.com/go-lintpack/lintpack/astwalk/walk_handler.go
new file mode 100644
index 00000000000..1f6e948d5cd
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/walk_handler.go
@@ -0,0 +1,34 @@
+package astwalk
+
+import (
+ "go/ast"
+)
+
+// WalkHandler is a type to be embedded into every checker
+// that uses astwalk walkers.
+type WalkHandler struct {
+ // SkipChilds controls whether currently analyzed
+ // node childs should be traversed.
+ //
+ // Value is reset after each visitor invocation,
+ // so there is no need to set value back to false.
+ SkipChilds bool
+}
+
+// EnterFile is a default walkerEvents.EnterFile implementation
+// that reports every file as accepted candidate for checking.
+func (w *WalkHandler) EnterFile(f *ast.File) bool {
+ return true
+}
+
+// EnterFunc is a default walkerEvents.EnterFunc implementation
+// that skips extern function (ones that do not have body).
+func (w *WalkHandler) EnterFunc(decl *ast.FuncDecl) bool {
+ return decl.Body != nil
+}
+
+func (w *WalkHandler) skipChilds() bool {
+ v := w.SkipChilds
+ w.SkipChilds = false
+ return v
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/astwalk/walker.go b/vendor/github.com/go-lintpack/lintpack/astwalk/walker.go
new file mode 100644
index 00000000000..fddae710ad9
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/astwalk/walker.go
@@ -0,0 +1,57 @@
+package astwalk
+
+import (
+ "go/types"
+
+ "github.com/go-lintpack/lintpack"
+)
+
+// WalkerForFuncDecl returns file walker implementation for FuncDeclVisitor.
+func WalkerForFuncDecl(v FuncDeclVisitor) lintpack.FileWalker {
+ return &funcDeclWalker{visitor: v}
+}
+
+// WalkerForExpr returns file walker implementation for ExprVisitor.
+func WalkerForExpr(v ExprVisitor) lintpack.FileWalker {
+ return &exprWalker{visitor: v}
+}
+
+// WalkerForLocalExpr returns file walker implementation for LocalExprVisitor.
+func WalkerForLocalExpr(v LocalExprVisitor) lintpack.FileWalker {
+ return &localExprWalker{visitor: v}
+}
+
+// WalkerForStmtList returns file walker implementation for StmtListVisitor.
+func WalkerForStmtList(v StmtListVisitor) lintpack.FileWalker {
+ return &stmtListWalker{visitor: v}
+}
+
+// WalkerForStmt returns file walker implementation for StmtVisitor.
+func WalkerForStmt(v StmtVisitor) lintpack.FileWalker {
+ return &stmtWalker{visitor: v}
+}
+
+// WalkerForTypeExpr returns file walker implementation for TypeExprVisitor.
+func WalkerForTypeExpr(v TypeExprVisitor, info *types.Info) lintpack.FileWalker {
+ return &typeExprWalker{visitor: v, info: info}
+}
+
+// WalkerForLocalComment returns file walker implementation for LocalCommentVisitor.
+func WalkerForLocalComment(v LocalCommentVisitor) lintpack.FileWalker {
+ return &localCommentWalker{visitor: v}
+}
+
+// WalkerForComment returns file walker implementation for CommentVisitor.
+func WalkerForComment(v CommentVisitor) lintpack.FileWalker {
+ return &commentWalker{visitor: v}
+}
+
+// WalkerForDocComment returns file walker implementation for DocCommentVisitor.
+func WalkerForDocComment(v DocCommentVisitor) lintpack.FileWalker {
+ return &docCommentWalker{visitor: v}
+}
+
+// WalkerForLocalDef returns file walker implementation for LocalDefVisitor.
+func WalkerForLocalDef(v LocalDefVisitor, info *types.Info) lintpack.FileWalker {
+ return &localDefWalker{visitor: v, info: info}
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/checkers_db.go b/vendor/github.com/go-lintpack/lintpack/checkers_db.go
new file mode 100644
index 00000000000..83d41b4e4c0
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/checkers_db.go
@@ -0,0 +1,135 @@
+package lintpack
+
+import (
+ "fmt"
+ "regexp"
+ "sort"
+ "strings"
+
+ "github.com/go-toolsmith/astfmt"
+)
+
+type checkerProto struct {
+ info *CheckerInfo
+ constructor func(*Context) *Checker
+}
+
+// prototypes is a set of registered checkers that are not yet instantiated.
+// Registration should be done with AddChecker function.
+// Initialized checkers can be obtained with NewChecker function.
+var prototypes = make(map[string]checkerProto)
+
+func getCheckersInfo() []*CheckerInfo {
+ infoList := make([]*CheckerInfo, 0, len(prototypes))
+ for _, proto := range prototypes {
+ infoCopy := *proto.info
+ infoList = append(infoList, &infoCopy)
+ }
+ sort.Slice(infoList, func(i, j int) bool {
+ return infoList[i].Name < infoList[j].Name
+ })
+ return infoList
+}
+
+func addChecker(info *CheckerInfo, constructor func(*CheckerContext) FileWalker) {
+ if _, ok := prototypes[info.Name]; ok {
+ panic(fmt.Sprintf("checker with name %q already registered", info.Name))
+ }
+
+ // Validate param value type.
+ for pname, param := range info.Params {
+ switch param.Value.(type) {
+ case string, int, bool:
+ // OK.
+ default:
+ panic(fmt.Sprintf("unsupported %q param type value: %T",
+ pname, param.Value))
+ }
+ }
+
+ trimDocumentation := func(info *CheckerInfo) {
+ fields := []*string{
+ &info.Summary,
+ &info.Details,
+ &info.Before,
+ &info.After,
+ &info.Note,
+ }
+ for _, f := range fields {
+ *f = strings.TrimSpace(*f)
+ }
+ }
+
+ trimDocumentation(info)
+
+ if err := validateCheckerInfo(info); err != nil {
+ panic(err)
+ }
+
+ proto := checkerProto{
+ info: info,
+ constructor: func(ctx *Context) *Checker {
+ var c Checker
+ c.Info = info
+ c.ctx = CheckerContext{
+ Context: ctx,
+ printer: astfmt.NewPrinter(ctx.FileSet),
+ }
+ c.fileWalker = constructor(&c.ctx)
+ return &c
+ },
+ }
+
+ prototypes[info.Name] = proto
+}
+
+func newChecker(ctx *Context, info *CheckerInfo) *Checker {
+ proto, ok := prototypes[info.Name]
+ if !ok {
+ panic(fmt.Sprintf("checker with name %q not registered", info.Name))
+ }
+ return proto.constructor(ctx)
+}
+
+func validateCheckerInfo(info *CheckerInfo) error {
+ steps := []func(*CheckerInfo) error{
+ validateCheckerName,
+ validateCheckerDocumentation,
+ validateCheckerTags,
+ }
+
+ for _, step := range steps {
+ if err := step(info); err != nil {
+ return fmt.Errorf("%q validation error: %v", info.Name, err)
+ }
+ }
+ return nil
+}
+
+var validIdentRE = regexp.MustCompile(`^\w+$`)
+
+func validateCheckerName(info *CheckerInfo) error {
+ if !validIdentRE.MatchString(info.Name) {
+ return fmt.Errorf("checker name contains illegal chars")
+ }
+ return nil
+}
+
+func validateCheckerDocumentation(info *CheckerInfo) error {
+ // TODO(Quasilyte): validate documentation.
+ return nil
+}
+
+func validateCheckerTags(info *CheckerInfo) error {
+ tagSet := make(map[string]bool)
+ for _, tag := range info.Tags {
+ if tagSet[tag] {
+ return fmt.Errorf("duplicated tag %q", tag)
+ }
+ if !validIdentRE.MatchString(tag) {
+ return fmt.Errorf("checker tag %q contains illegal chars", tag)
+ }
+ tagSet[tag] = true
+ }
+ return nil
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/context.go b/vendor/github.com/go-lintpack/lintpack/context.go
new file mode 100644
index 00000000000..8671e175ca3
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/context.go
@@ -0,0 +1,35 @@
+package lintpack
+
+import (
+ "go/ast"
+ "go/types"
+ "strconv"
+)
+
+func resolvePkgObjects(ctx *Context, f *ast.File) {
+ ctx.PkgObjects = make(map[*types.PkgName]string, len(f.Imports))
+
+ for _, spec := range f.Imports {
+ if spec.Name != nil {
+ obj := ctx.TypesInfo.ObjectOf(spec.Name)
+ ctx.PkgObjects[obj.(*types.PkgName)] = spec.Name.Name
+ } else {
+ obj := ctx.TypesInfo.Implicits[spec]
+ ctx.PkgObjects[obj.(*types.PkgName)] = obj.Name()
+ }
+ }
+}
+
+func resolvePkgRenames(ctx *Context, f *ast.File) {
+ ctx.PkgRenames = make(map[string]string)
+
+ for _, spec := range f.Imports {
+ if spec.Name != nil {
+ path, err := strconv.Unquote(spec.Path.Value)
+ if err != nil {
+ panic(err)
+ }
+ ctx.PkgRenames[path] = spec.Name.Name
+ }
+ }
+}
diff --git a/vendor/github.com/go-lintpack/lintpack/doc.go b/vendor/github.com/go-lintpack/lintpack/doc.go
new file mode 100644
index 00000000000..4aba342f536
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/doc.go
@@ -0,0 +1,5 @@
+// Package lintpack provides shared API between the linter and its checkers.
+//
+// Linter is usually implemented by creating instances of registered checkers.
+// Checkers are registered by the AddChecker call.
+package lintpack
diff --git a/vendor/github.com/go-lintpack/lintpack/go.mod b/vendor/github.com/go-lintpack/lintpack/go.mod
new file mode 100644
index 00000000000..b2e4cd984d7
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/go.mod
@@ -0,0 +1,11 @@
+module github.com/go-lintpack/lintpack
+
+require (
+ github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6
+ github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086
+ github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30
+ github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8
+ github.com/google/go-cmp v0.2.0
+ github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e
+ golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09
+)
diff --git a/vendor/github.com/go-lintpack/lintpack/go.sum b/vendor/github.com/go-lintpack/lintpack/go.sum
new file mode 100644
index 00000000000..bd9f5dcb95e
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/go.sum
@@ -0,0 +1,14 @@
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6 h1:aTBUNRTatDDU24gbOEKEoLiDwxtc98ga6K/iMTm6fvs=
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086 h1:EIMuvbE9fbtQtimdLe5yeXjuC5CeKbQt8zH6GwtIrhM=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30 h1:zRJPftZJNLPDiOtvYbFRwjSbaJAcVOf80TeEmWGe2kQ=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8 h1:vVouagbdmqTVlCIAxpyYsNNTbkKZ3V66VpKOLU/s6W4=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e h1:9MlwzLdW7QSDrhDjFlsEYmxpFyIoXmYRon3dt0io31k=
+github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
+golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09 h1:QJFxMApN9XdBRwtqXfOidB2azUCA4ziuiMTrQ1uBGxw=
+golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
diff --git a/vendor/github.com/go-lintpack/lintpack/lintpack.go b/vendor/github.com/go-lintpack/lintpack/lintpack.go
new file mode 100644
index 00000000000..28c3a6354eb
--- /dev/null
+++ b/vendor/github.com/go-lintpack/lintpack/lintpack.go
@@ -0,0 +1,248 @@
+package lintpack
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "github.com/go-toolsmith/astfmt"
+)
+
+// CheckerCollection provides additional information for a group of checkers.
+type CheckerCollection struct {
+ // URL is a link for a main source of information on the collection.
+ URL string
+}
+
+// AddChecker registers a new checker into a checkers pool.
+// Constructor is used to create a new checker instance.
+// Checker name (defined in CheckerInfo.Name) must be unique.
+//
+// CheckerInfo.Collection is automatically set to the coll (the receiver).
+//
+// If checker is never needed, for example if it is disabled,
+// constructor will not be called.
+func (coll *CheckerCollection) AddChecker(info *CheckerInfo, constructor func(*CheckerContext) FileWalker) {
+ if coll == nil {
+ panic(fmt.Sprintf("adding checker to a nil collection"))
+ }
+ info.Collection = coll
+ addChecker(info, constructor)
+}
+
+// CheckerParam describes a single checker customizable parameter.
+type CheckerParam struct {
+ // Value holds parameter bound value.
+ // It might be overwritten by the integrating linter.
+ //
+ // Permitted types include:
+ // - int
+ // - bool
+ // - string
+ Value interface{}
+
+ // Usage gives an overview about what parameter does.
+ Usage string
+}
+
+// CheckerParams holds all checker-specific parameters.
+//
+// Provides convenient access to the loosely typed underlying map.
+type CheckerParams map[string]*CheckerParam
+
+// Int lookups pname key in underlying map and type-asserts it to int.
+func (params CheckerParams) Int(pname string) int { return params[pname].Value.(int) }
+
+// Bool lookups pname key in underlying map and type-asserts it to bool.
+func (params CheckerParams) Bool(pname string) bool { return params[pname].Value.(bool) }
+
+// String lookups pname key in underlying map and type-asserts it to string.
+func (params CheckerParams) String(pname string) string { return params[pname].Value.(string) }
+
+// CheckerInfo holds checker metadata and structured documentation.
+type CheckerInfo struct {
+ // Name is a checker name.
+ Name string
+
+ // Tags is a list of labels that can be used to enable or disable checker.
+ // Common tags are "experimental" and "performance".
+ Tags []string
+
+ // Params declares checker-specific parameters. Optional.
+ Params CheckerParams
+
+ // Summary is a short one sentence description.
+ // Should not end with a period.
+ Summary string
+
+ // Details extends summary with additional info. Optional.
+ Details string
+
+ // Before is a code snippet of code that will violate rule.
+ Before string
+
+ // After is a code snippet of fixed code that complies to the rule.
+ After string
+
+ // Note is an optional caution message or advice.
+ Note string
+
+ // Collection establishes a checker-to-collection relationship.
+ Collection *CheckerCollection
+}
+
+// GetCheckersInfo returns a checkers info list for all registered checkers.
+// The slice is sorted by a checker name.
+//
+// Info objects can be used to instantiate checkers with NewChecker function.
+func GetCheckersInfo() []*CheckerInfo {
+ return getCheckersInfo()
+}
+
+// HasTag reports whether checker described by the info has specified tag.
+func (info *CheckerInfo) HasTag(tag string) bool {
+ for i := range info.Tags {
+ if info.Tags[i] == tag {
+ return true
+ }
+ }
+ return false
+}
+
+// Checker is an implementation of a check that is described by the associated info.
+type Checker struct {
+ // Info is an info object that was used to instantiate this checker.
+ Info *CheckerInfo
+
+ ctx CheckerContext
+
+ fileWalker FileWalker
+}
+
+// Check runs rule checker over file f.
+func (c *Checker) Check(f *ast.File) []Warning {
+ c.ctx.warnings = c.ctx.warnings[:0]
+ c.fileWalker.WalkFile(f)
+ return c.ctx.warnings
+}
+
+// Warning represents issue that is found by checker.
+type Warning struct {
+ // Node is an AST node that caused warning to trigger.
+ // Can be used to obtain proper error location.
+ Node ast.Node
+
+ // Text is warning message without source location info.
+ Text string
+}
+
+// NewChecker returns initialized checker identified by an info.
+// info must be non-nil.
+// Panics if info describes a checker that was not properly registered.
+func NewChecker(ctx *Context, info *CheckerInfo) *Checker {
+ return newChecker(ctx, info)
+}
+
+// Context is a readonly state shared among every checker.
+type Context struct {
+ // TypesInfo carries parsed packages types information.
+ TypesInfo *types.Info
+
+ // SizesInfo carries alignment and type size information.
+ // Arch-dependent.
+ SizesInfo types.Sizes
+
+ // FileSet is a file set that was used during the program loading.
+ FileSet *token.FileSet
+
+ // Pkg describes package that is being checked.
+ Pkg *types.Package
+
+ // Filename is a currently checked file name.
+ Filename string
+
+ // Require records what optional resources are required
+ // by the checkers set that use this context.
+ //
+ // Every require fields makes associated context field
+ // to be properly initialized.
+ // For example, Context.require.PkgObjects => Context.PkgObjects.
+ Require struct {
+ PkgObjects bool
+ PkgRenames bool
+ }
+
+ // PkgObjects stores all imported packages and their local names.
+ PkgObjects map[*types.PkgName]string
+
+ // PkgRenames maps package path to its local renaming.
+ // Contains no entries for packages that were imported without
+ // explicit local names.
+ PkgRenames map[string]string
+}
+
+// NewContext returns new shared context to be used by every checker.
+//
+// All data carried by the context is readonly for checkers,
+// but can be modified by the integrating application.
+func NewContext(fset *token.FileSet, sizes types.Sizes) *Context {
+ return &Context{
+ FileSet: fset,
+ SizesInfo: sizes,
+ TypesInfo: &types.Info{},
+ }
+}
+
+// SetPackageInfo sets package-related metadata.
+//
+// Must be called for every package being checked.
+func (c *Context) SetPackageInfo(info *types.Info, pkg *types.Package) {
+ if info != nil {
+ // We do this kind of assignment to avoid
+ // changing c.typesInfo field address after
+ // every re-assignment.
+ *c.TypesInfo = *info
+ }
+ c.Pkg = pkg
+}
+
+// SetFileInfo sets file-related metadata.
+//
+// Must be called for every source code file being checked.
+func (c *Context) SetFileInfo(name string, f *ast.File) {
+ c.Filename = name
+ if c.Require.PkgObjects {
+ resolvePkgObjects(c, f)
+ }
+ if c.Require.PkgRenames {
+ resolvePkgRenames(c, f)
+ }
+}
+
+// CheckerContext is checker-local context copy.
+// Fields that are not from Context itself are writeable.
+type CheckerContext struct {
+ *Context
+
+ // printer used to format warning text.
+ printer *astfmt.Printer
+
+ warnings []Warning
+}
+
+// Warn adds a Warning to checker output.
+func (ctx *CheckerContext) Warn(node ast.Node, format string, args ...interface{}) {
+ ctx.warnings = append(ctx.warnings, Warning{
+ Text: ctx.printer.Sprintf(format, args...),
+ Node: node,
+ })
+}
+
+// FileWalker is an interface every checker should implement.
+//
+// The WalkFile method is executed for every Go file inside the
+// package that is being checked.
+type FileWalker interface {
+ WalkFile(*ast.File)
+}
diff --git a/vendor/github.com/go-toolsmith/astcast/LICENSE b/vendor/github.com/go-toolsmith/astcast/LICENSE
new file mode 100644
index 00000000000..eef17180f89
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcast/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 go-toolsmith
+
+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/go-toolsmith/astcast/README.md b/vendor/github.com/go-toolsmith/astcast/README.md
new file mode 100644
index 00000000000..b618da46151
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcast/README.md
@@ -0,0 +1,86 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/astcast)](https://goreportcard.com/report/github.com/go-toolsmith/astcast)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/astcast?status.svg)](https://godoc.org/github.com/go-toolsmith/astcast)
+
+# astcast
+
+Package astcast wraps type assertion operations in such way that you don't have
+to worry about nil pointer results anymore.
+
+## Installation
+
+```bash
+go get -v github.com/go-toolsmith/astcast
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/go-toolsmith/astcast"
+ "github.com/go-toolsmith/strparse"
+)
+
+func main() {
+ x := strparse.Expr(`(foo * bar) + 1`)
+
+ // x type is ast.Expr, we want to access bar operand
+ // that is a RHS of the LHS of the addition.
+ // Note that addition LHS (X field) is has parenthesis,
+ // so we have to remove them too.
+
+ add := astcast.ToBinaryExpr(x)
+ mul := astcast.ToBinaryExpr(astcast.ToParenExpr(add.X).X)
+ bar := astcast.ToIdent(mul.Y)
+ fmt.Printf("%T %s\n", bar, bar.Name) // => *ast.Ident bar
+
+ // If argument has different dynamic type,
+ // non-nil sentinel object of requested type is returned.
+ // Those sentinel objects are exported so if you need
+ // to know whether it was a nil interface value of
+ // failed type assertion, you can compare returned
+ // object with such a sentinel.
+
+ y := astcast.ToCallExpr(strparse.Expr(`x`))
+ if y == astcast.NilCallExpr {
+ fmt.Println("it is a sentinel, type assertion failed")
+ }
+}
+```
+
+Without `astcast`, you would have to do a lots of type assertions:
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/go-toolsmith/strparse"
+)
+
+func main() {
+ x := strparse.Expr(`(foo * bar) + 1`)
+
+ add, ok := x.(*ast.BinaryExpr)
+ if !ok || add == nil {
+ return
+ }
+ additionLHS, ok := add.X.(*ast.ParenExpr)
+ if !ok || additionLHS == nil {
+ return
+ }
+ mul, ok := additionLHS.X.(*ast.BinaryExpr)
+ if !ok || mul == nil {
+ return
+ }
+ bar, ok := mul.Y.(*ast.Ident)
+ if !ok || bar == nil {
+ return
+ }
+ fmt.Printf("%T %s\n", bar, bar.Name)
+}
+```
diff --git a/vendor/github.com/go-toolsmith/astcast/astcast.go b/vendor/github.com/go-toolsmith/astcast/astcast.go
new file mode 100644
index 00000000000..746d568aa3d
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcast/astcast.go
@@ -0,0 +1,590 @@
+// Code generated by astcast_generate.go; DO NOT EDIT
+
+// Package astcast wraps type assertion operations in such way that you don't have
+// to worry about nil pointer results anymore.
+package astcast
+
+import (
+ "go/ast"
+)
+
+// A set of sentinel nil-like values that are returned
+// by all "casting" functions in case of failed type assertion.
+var (
+ NilArrayType = &ast.ArrayType{}
+ NilBadExpr = &ast.BadExpr{}
+ NilBasicLit = &ast.BasicLit{}
+ NilBinaryExpr = &ast.BinaryExpr{}
+ NilCallExpr = &ast.CallExpr{}
+ NilChanType = &ast.ChanType{}
+ NilCompositeLit = &ast.CompositeLit{}
+ NilEllipsis = &ast.Ellipsis{}
+ NilFuncLit = &ast.FuncLit{}
+ NilFuncType = &ast.FuncType{}
+ NilIdent = &ast.Ident{}
+ NilIndexExpr = &ast.IndexExpr{}
+ NilInterfaceType = &ast.InterfaceType{}
+ NilKeyValueExpr = &ast.KeyValueExpr{}
+ NilMapType = &ast.MapType{}
+ NilParenExpr = &ast.ParenExpr{}
+ NilSelectorExpr = &ast.SelectorExpr{}
+ NilSliceExpr = &ast.SliceExpr{}
+ NilStarExpr = &ast.StarExpr{}
+ NilStructType = &ast.StructType{}
+ NilTypeAssertExpr = &ast.TypeAssertExpr{}
+ NilUnaryExpr = &ast.UnaryExpr{}
+ NilAssignStmt = &ast.AssignStmt{}
+ NilBadStmt = &ast.BadStmt{}
+ NilBlockStmt = &ast.BlockStmt{}
+ NilBranchStmt = &ast.BranchStmt{}
+ NilCaseClause = &ast.CaseClause{}
+ NilCommClause = &ast.CommClause{}
+ NilDeclStmt = &ast.DeclStmt{}
+ NilDeferStmt = &ast.DeferStmt{}
+ NilEmptyStmt = &ast.EmptyStmt{}
+ NilExprStmt = &ast.ExprStmt{}
+ NilForStmt = &ast.ForStmt{}
+ NilGoStmt = &ast.GoStmt{}
+ NilIfStmt = &ast.IfStmt{}
+ NilIncDecStmt = &ast.IncDecStmt{}
+ NilLabeledStmt = &ast.LabeledStmt{}
+ NilRangeStmt = &ast.RangeStmt{}
+ NilReturnStmt = &ast.ReturnStmt{}
+ NilSelectStmt = &ast.SelectStmt{}
+ NilSendStmt = &ast.SendStmt{}
+ NilSwitchStmt = &ast.SwitchStmt{}
+ NilTypeSwitchStmt = &ast.TypeSwitchStmt{}
+ NilComment = &ast.Comment{}
+ NilCommentGroup = &ast.CommentGroup{}
+ NilFieldList = &ast.FieldList{}
+ NilFile = &ast.File{}
+ NilPackage = &ast.Package{}
+)
+
+// ToArrayType returns x as a non-nil *ast.ArrayType.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilArrayType.
+func ToArrayType(x ast.Node) *ast.ArrayType {
+ if x, ok := x.(*ast.ArrayType); ok {
+ return x
+ }
+ return NilArrayType
+}
+
+// ToBadExpr returns x as a non-nil *ast.BadExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilBadExpr.
+func ToBadExpr(x ast.Node) *ast.BadExpr {
+ if x, ok := x.(*ast.BadExpr); ok {
+ return x
+ }
+ return NilBadExpr
+}
+
+// ToBasicLit returns x as a non-nil *ast.BasicLit.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilBasicLit.
+func ToBasicLit(x ast.Node) *ast.BasicLit {
+ if x, ok := x.(*ast.BasicLit); ok {
+ return x
+ }
+ return NilBasicLit
+}
+
+// ToBinaryExpr returns x as a non-nil *ast.BinaryExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilBinaryExpr.
+func ToBinaryExpr(x ast.Node) *ast.BinaryExpr {
+ if x, ok := x.(*ast.BinaryExpr); ok {
+ return x
+ }
+ return NilBinaryExpr
+}
+
+// ToCallExpr returns x as a non-nil *ast.CallExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilCallExpr.
+func ToCallExpr(x ast.Node) *ast.CallExpr {
+ if x, ok := x.(*ast.CallExpr); ok {
+ return x
+ }
+ return NilCallExpr
+}
+
+// ToChanType returns x as a non-nil *ast.ChanType.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilChanType.
+func ToChanType(x ast.Node) *ast.ChanType {
+ if x, ok := x.(*ast.ChanType); ok {
+ return x
+ }
+ return NilChanType
+}
+
+// ToCompositeLit returns x as a non-nil *ast.CompositeLit.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilCompositeLit.
+func ToCompositeLit(x ast.Node) *ast.CompositeLit {
+ if x, ok := x.(*ast.CompositeLit); ok {
+ return x
+ }
+ return NilCompositeLit
+}
+
+// ToEllipsis returns x as a non-nil *ast.Ellipsis.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilEllipsis.
+func ToEllipsis(x ast.Node) *ast.Ellipsis {
+ if x, ok := x.(*ast.Ellipsis); ok {
+ return x
+ }
+ return NilEllipsis
+}
+
+// ToFuncLit returns x as a non-nil *ast.FuncLit.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilFuncLit.
+func ToFuncLit(x ast.Node) *ast.FuncLit {
+ if x, ok := x.(*ast.FuncLit); ok {
+ return x
+ }
+ return NilFuncLit
+}
+
+// ToFuncType returns x as a non-nil *ast.FuncType.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilFuncType.
+func ToFuncType(x ast.Node) *ast.FuncType {
+ if x, ok := x.(*ast.FuncType); ok {
+ return x
+ }
+ return NilFuncType
+}
+
+// ToIdent returns x as a non-nil *ast.Ident.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilIdent.
+func ToIdent(x ast.Node) *ast.Ident {
+ if x, ok := x.(*ast.Ident); ok {
+ return x
+ }
+ return NilIdent
+}
+
+// ToIndexExpr returns x as a non-nil *ast.IndexExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilIndexExpr.
+func ToIndexExpr(x ast.Node) *ast.IndexExpr {
+ if x, ok := x.(*ast.IndexExpr); ok {
+ return x
+ }
+ return NilIndexExpr
+}
+
+// ToInterfaceType returns x as a non-nil *ast.InterfaceType.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilInterfaceType.
+func ToInterfaceType(x ast.Node) *ast.InterfaceType {
+ if x, ok := x.(*ast.InterfaceType); ok {
+ return x
+ }
+ return NilInterfaceType
+}
+
+// ToKeyValueExpr returns x as a non-nil *ast.KeyValueExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilKeyValueExpr.
+func ToKeyValueExpr(x ast.Node) *ast.KeyValueExpr {
+ if x, ok := x.(*ast.KeyValueExpr); ok {
+ return x
+ }
+ return NilKeyValueExpr
+}
+
+// ToMapType returns x as a non-nil *ast.MapType.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilMapType.
+func ToMapType(x ast.Node) *ast.MapType {
+ if x, ok := x.(*ast.MapType); ok {
+ return x
+ }
+ return NilMapType
+}
+
+// ToParenExpr returns x as a non-nil *ast.ParenExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilParenExpr.
+func ToParenExpr(x ast.Node) *ast.ParenExpr {
+ if x, ok := x.(*ast.ParenExpr); ok {
+ return x
+ }
+ return NilParenExpr
+}
+
+// ToSelectorExpr returns x as a non-nil *ast.SelectorExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilSelectorExpr.
+func ToSelectorExpr(x ast.Node) *ast.SelectorExpr {
+ if x, ok := x.(*ast.SelectorExpr); ok {
+ return x
+ }
+ return NilSelectorExpr
+}
+
+// ToSliceExpr returns x as a non-nil *ast.SliceExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilSliceExpr.
+func ToSliceExpr(x ast.Node) *ast.SliceExpr {
+ if x, ok := x.(*ast.SliceExpr); ok {
+ return x
+ }
+ return NilSliceExpr
+}
+
+// ToStarExpr returns x as a non-nil *ast.StarExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilStarExpr.
+func ToStarExpr(x ast.Node) *ast.StarExpr {
+ if x, ok := x.(*ast.StarExpr); ok {
+ return x
+ }
+ return NilStarExpr
+}
+
+// ToStructType returns x as a non-nil *ast.StructType.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilStructType.
+func ToStructType(x ast.Node) *ast.StructType {
+ if x, ok := x.(*ast.StructType); ok {
+ return x
+ }
+ return NilStructType
+}
+
+// ToTypeAssertExpr returns x as a non-nil *ast.TypeAssertExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilTypeAssertExpr.
+func ToTypeAssertExpr(x ast.Node) *ast.TypeAssertExpr {
+ if x, ok := x.(*ast.TypeAssertExpr); ok {
+ return x
+ }
+ return NilTypeAssertExpr
+}
+
+// ToUnaryExpr returns x as a non-nil *ast.UnaryExpr.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilUnaryExpr.
+func ToUnaryExpr(x ast.Node) *ast.UnaryExpr {
+ if x, ok := x.(*ast.UnaryExpr); ok {
+ return x
+ }
+ return NilUnaryExpr
+}
+
+// ToAssignStmt returns x as a non-nil *ast.AssignStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilAssignStmt.
+func ToAssignStmt(x ast.Node) *ast.AssignStmt {
+ if x, ok := x.(*ast.AssignStmt); ok {
+ return x
+ }
+ return NilAssignStmt
+}
+
+// ToBadStmt returns x as a non-nil *ast.BadStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilBadStmt.
+func ToBadStmt(x ast.Node) *ast.BadStmt {
+ if x, ok := x.(*ast.BadStmt); ok {
+ return x
+ }
+ return NilBadStmt
+}
+
+// ToBlockStmt returns x as a non-nil *ast.BlockStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilBlockStmt.
+func ToBlockStmt(x ast.Node) *ast.BlockStmt {
+ if x, ok := x.(*ast.BlockStmt); ok {
+ return x
+ }
+ return NilBlockStmt
+}
+
+// ToBranchStmt returns x as a non-nil *ast.BranchStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilBranchStmt.
+func ToBranchStmt(x ast.Node) *ast.BranchStmt {
+ if x, ok := x.(*ast.BranchStmt); ok {
+ return x
+ }
+ return NilBranchStmt
+}
+
+// ToCaseClause returns x as a non-nil *ast.CaseClause.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilCaseClause.
+func ToCaseClause(x ast.Node) *ast.CaseClause {
+ if x, ok := x.(*ast.CaseClause); ok {
+ return x
+ }
+ return NilCaseClause
+}
+
+// ToCommClause returns x as a non-nil *ast.CommClause.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilCommClause.
+func ToCommClause(x ast.Node) *ast.CommClause {
+ if x, ok := x.(*ast.CommClause); ok {
+ return x
+ }
+ return NilCommClause
+}
+
+// ToDeclStmt returns x as a non-nil *ast.DeclStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilDeclStmt.
+func ToDeclStmt(x ast.Node) *ast.DeclStmt {
+ if x, ok := x.(*ast.DeclStmt); ok {
+ return x
+ }
+ return NilDeclStmt
+}
+
+// ToDeferStmt returns x as a non-nil *ast.DeferStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilDeferStmt.
+func ToDeferStmt(x ast.Node) *ast.DeferStmt {
+ if x, ok := x.(*ast.DeferStmt); ok {
+ return x
+ }
+ return NilDeferStmt
+}
+
+// ToEmptyStmt returns x as a non-nil *ast.EmptyStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilEmptyStmt.
+func ToEmptyStmt(x ast.Node) *ast.EmptyStmt {
+ if x, ok := x.(*ast.EmptyStmt); ok {
+ return x
+ }
+ return NilEmptyStmt
+}
+
+// ToExprStmt returns x as a non-nil *ast.ExprStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilExprStmt.
+func ToExprStmt(x ast.Node) *ast.ExprStmt {
+ if x, ok := x.(*ast.ExprStmt); ok {
+ return x
+ }
+ return NilExprStmt
+}
+
+// ToForStmt returns x as a non-nil *ast.ForStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilForStmt.
+func ToForStmt(x ast.Node) *ast.ForStmt {
+ if x, ok := x.(*ast.ForStmt); ok {
+ return x
+ }
+ return NilForStmt
+}
+
+// ToGoStmt returns x as a non-nil *ast.GoStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilGoStmt.
+func ToGoStmt(x ast.Node) *ast.GoStmt {
+ if x, ok := x.(*ast.GoStmt); ok {
+ return x
+ }
+ return NilGoStmt
+}
+
+// ToIfStmt returns x as a non-nil *ast.IfStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilIfStmt.
+func ToIfStmt(x ast.Node) *ast.IfStmt {
+ if x, ok := x.(*ast.IfStmt); ok {
+ return x
+ }
+ return NilIfStmt
+}
+
+// ToIncDecStmt returns x as a non-nil *ast.IncDecStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilIncDecStmt.
+func ToIncDecStmt(x ast.Node) *ast.IncDecStmt {
+ if x, ok := x.(*ast.IncDecStmt); ok {
+ return x
+ }
+ return NilIncDecStmt
+}
+
+// ToLabeledStmt returns x as a non-nil *ast.LabeledStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilLabeledStmt.
+func ToLabeledStmt(x ast.Node) *ast.LabeledStmt {
+ if x, ok := x.(*ast.LabeledStmt); ok {
+ return x
+ }
+ return NilLabeledStmt
+}
+
+// ToRangeStmt returns x as a non-nil *ast.RangeStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilRangeStmt.
+func ToRangeStmt(x ast.Node) *ast.RangeStmt {
+ if x, ok := x.(*ast.RangeStmt); ok {
+ return x
+ }
+ return NilRangeStmt
+}
+
+// ToReturnStmt returns x as a non-nil *ast.ReturnStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilReturnStmt.
+func ToReturnStmt(x ast.Node) *ast.ReturnStmt {
+ if x, ok := x.(*ast.ReturnStmt); ok {
+ return x
+ }
+ return NilReturnStmt
+}
+
+// ToSelectStmt returns x as a non-nil *ast.SelectStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilSelectStmt.
+func ToSelectStmt(x ast.Node) *ast.SelectStmt {
+ if x, ok := x.(*ast.SelectStmt); ok {
+ return x
+ }
+ return NilSelectStmt
+}
+
+// ToSendStmt returns x as a non-nil *ast.SendStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilSendStmt.
+func ToSendStmt(x ast.Node) *ast.SendStmt {
+ if x, ok := x.(*ast.SendStmt); ok {
+ return x
+ }
+ return NilSendStmt
+}
+
+// ToSwitchStmt returns x as a non-nil *ast.SwitchStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilSwitchStmt.
+func ToSwitchStmt(x ast.Node) *ast.SwitchStmt {
+ if x, ok := x.(*ast.SwitchStmt); ok {
+ return x
+ }
+ return NilSwitchStmt
+}
+
+// ToTypeSwitchStmt returns x as a non-nil *ast.TypeSwitchStmt.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilTypeSwitchStmt.
+func ToTypeSwitchStmt(x ast.Node) *ast.TypeSwitchStmt {
+ if x, ok := x.(*ast.TypeSwitchStmt); ok {
+ return x
+ }
+ return NilTypeSwitchStmt
+}
+
+// ToComment returns x as a non-nil *ast.Comment.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilComment.
+func ToComment(x ast.Node) *ast.Comment {
+ if x, ok := x.(*ast.Comment); ok {
+ return x
+ }
+ return NilComment
+}
+
+// ToCommentGroup returns x as a non-nil *ast.CommentGroup.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilCommentGroup.
+func ToCommentGroup(x ast.Node) *ast.CommentGroup {
+ if x, ok := x.(*ast.CommentGroup); ok {
+ return x
+ }
+ return NilCommentGroup
+}
+
+// ToFieldList returns x as a non-nil *ast.FieldList.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilFieldList.
+func ToFieldList(x ast.Node) *ast.FieldList {
+ if x, ok := x.(*ast.FieldList); ok {
+ return x
+ }
+ return NilFieldList
+}
+
+// ToFile returns x as a non-nil *ast.File.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilFile.
+func ToFile(x ast.Node) *ast.File {
+ if x, ok := x.(*ast.File); ok {
+ return x
+ }
+ return NilFile
+}
+
+// ToPackage returns x as a non-nil *ast.Package.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is NilPackage.
+func ToPackage(x ast.Node) *ast.Package {
+ if x, ok := x.(*ast.Package); ok {
+ return x
+ }
+ return NilPackage
+}
diff --git a/vendor/github.com/go-toolsmith/astcast/astcast_generate.go b/vendor/github.com/go-toolsmith/astcast/astcast_generate.go
new file mode 100644
index 00000000000..e942f13136a
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcast/astcast_generate.go
@@ -0,0 +1,163 @@
+// +build ignore
+
+package main
+
+import (
+ "bytes"
+ "go/format"
+ "io"
+ "log"
+ "os"
+ "text/template"
+)
+
+func main() {
+ typeList := []string{
+ // Expressions:
+ "ArrayType",
+ "BadExpr",
+ "BasicLit",
+ "BinaryExpr",
+ "CallExpr",
+ "ChanType",
+ "CompositeLit",
+ "Ellipsis",
+ "FuncLit",
+ "FuncType",
+ "Ident",
+ "IndexExpr",
+ "InterfaceType",
+ "KeyValueExpr",
+ "MapType",
+ "ParenExpr",
+ "SelectorExpr",
+ "SliceExpr",
+ "StarExpr",
+ "StructType",
+ "TypeAssertExpr",
+ "UnaryExpr",
+
+ // Statements:
+ "AssignStmt",
+ "BadStmt",
+ "BlockStmt",
+ "BranchStmt",
+ "CaseClause",
+ "CommClause",
+ "DeclStmt",
+ "DeferStmt",
+ "EmptyStmt",
+ "ExprStmt",
+ "ForStmt",
+ "GoStmt",
+ "IfStmt",
+ "IncDecStmt",
+ "LabeledStmt",
+ "RangeStmt",
+ "ReturnStmt",
+ "SelectStmt",
+ "SendStmt",
+ "SwitchStmt",
+ "TypeSwitchStmt",
+
+ // Others:
+ "Comment",
+ "CommentGroup",
+ "FieldList",
+ "File",
+ "Package",
+ }
+
+ astcastFile, err := os.Create("astcast.go")
+ if err != nil {
+ log.Fatal(err)
+ }
+ writeCode(astcastFile, typeList)
+ astcastTestFile, err := os.Create("astcast_test.go")
+ if err != nil {
+ log.Fatal(err)
+ }
+ writeTests(astcastTestFile, typeList)
+}
+
+func generateCode(tmplText string, typeList []string) []byte {
+ tmpl := template.Must(template.New("code").Parse(tmplText))
+ var code bytes.Buffer
+ tmpl.Execute(&code, typeList)
+ prettyCode, err := format.Source(code.Bytes())
+ if err != nil {
+ panic(err)
+ }
+ return prettyCode
+}
+
+func writeCode(output io.Writer, typeList []string) {
+ code := generateCode(`// Code generated by astcast_generate.go; DO NOT EDIT
+
+// Package astcast wraps type assertion operations in such way that you don't have
+// to worry about nil pointer results anymore.
+package astcast
+
+import (
+ "go/ast"
+)
+
+// A set of sentinel nil-like values that are returned
+// by all "casting" functions in case of failed type assertion.
+var (
+{{ range . }}
+Nil{{.}} = &ast.{{.}}{}
+{{- end }}
+)
+
+{{ range . }}
+// To{{.}} returns x as a non-nil *ast.{{.}}.
+// If ast.Node actually has such dynamic type, the result is
+// identical to normal type assertion. In case if it has
+// different type, the returned value is Nil{{.}}.
+func To{{.}}(x ast.Node) *ast.{{.}} {
+ if x, ok := x.(*ast.{{.}}); ok {
+ return x
+ }
+ return Nil{{.}}
+}
+{{ end }}
+`, typeList)
+ output.Write(code)
+}
+
+func writeTests(output io.Writer, typeList []string) {
+ code := generateCode(`// Code generated by astcast_generate.go; DO NOT EDIT
+
+package astcast
+
+import (
+ "go/ast"
+ "testing"
+)
+
+{{ range . }}
+func TestTo{{.}}(t *testing.T) {
+ // Test successfull cast.
+ if x := To{{.}}(&ast.{{.}}{}); x == Nil{{.}} || x == nil {
+ t.Error("expected successfull cast, got nil")
+ }
+ // Test nil cast.
+ if x := To{{.}}(nil); x != Nil{{.}} {
+ t.Error("nil node didn't resulted in a sentinel value return")
+ }
+ // Test unsuccessfull cast.
+ {{- if (eq . "Ident") }}
+ if x := To{{.}}(&ast.CallExpr{}); x != Nil{{.}} || x == nil {
+ t.Errorf("expected unsuccessfull cast to return nil sentinel")
+ }
+ {{- else }}
+ if x := To{{.}}(&ast.Ident{}); x != Nil{{.}} || x == nil {
+ t.Errorf("expected unsuccessfull cast to return nil sentinel")
+ }
+ {{- end }}
+}
+{{ end }}
+`, typeList)
+ output.Write(code)
+}
diff --git a/vendor/github.com/go-toolsmith/astcopy/.travis.yml b/vendor/github.com/go-toolsmith/astcopy/.travis.yml
new file mode 100644
index 00000000000..8994d395c61
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcopy/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - 1.x
+install:
+ - # Prevent default install action "go get -t -v ./...".
+script:
+ - go get -t -v ./...
+ - go tool vet .
+ - go test -v -race ./...
\ No newline at end of file
diff --git a/vendor/github.com/go-toolsmith/astcopy/LICENSE b/vendor/github.com/go-toolsmith/astcopy/LICENSE
new file mode 100644
index 00000000000..eef17180f89
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcopy/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 go-toolsmith
+
+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/go-toolsmith/astcopy/README.md b/vendor/github.com/go-toolsmith/astcopy/README.md
new file mode 100644
index 00000000000..4dae5c41b21
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcopy/README.md
@@ -0,0 +1,41 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/astcopy)](https://goreportcard.com/report/github.com/go-toolsmith/astcopy)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/astcopy?status.svg)](https://godoc.org/github.com/go-toolsmith/astcopy)
+[![Build Status](https://travis-ci.org/go-toolsmith/astcopy.svg?branch=master)](https://travis-ci.org/go-toolsmith/astcopy)
+
+# astcopy
+
+Package astcopy implements Go AST reflection-free deep copy operations.
+
+## Installation:
+
+```bash
+go get github.com/go-toolsmith/astcopy
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ "github.com/go-toolsmith/astcopy"
+ "github.com/go-toolsmith/astequal"
+ "github.com/go-toolsmith/strparse"
+)
+
+func main() {
+ x := strparse.Expr(`1 + 2`).(*ast.BinaryExpr)
+ y := astcopy.BinaryExpr(x)
+ fmt.Println(astequal.Expr(x, y)) // => true
+
+ // Now modify x and make sure y is not modified.
+ z := astcopy.BinaryExpr(y)
+ x.Op = token.SUB
+ fmt.Println(astequal.Expr(y, z)) // => true
+ fmt.Println(astequal.Expr(x, y)) // => false
+}
+```
diff --git a/vendor/github.com/go-toolsmith/astcopy/astcopy.go b/vendor/github.com/go-toolsmith/astcopy/astcopy.go
new file mode 100644
index 00000000000..2feffb1994b
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcopy/astcopy.go
@@ -0,0 +1,955 @@
+// Package astcopy implements Go AST reflection-free deep copy operations.
+package astcopy
+
+import (
+ "go/ast"
+)
+
+// Node returns x node deep copy.
+// Copy of nil argument is nil.
+func Node(x ast.Node) ast.Node {
+ return copyNode(x)
+}
+
+// NodeList returns xs node slice deep copy.
+// Copy of nil argument is nil.
+func NodeList(xs []ast.Node) []ast.Node {
+ if xs == nil {
+ return nil
+ }
+ cp := make([]ast.Node, len(xs))
+ for i := range xs {
+ cp[i] = copyNode(xs[i])
+ }
+ return cp
+}
+
+// Expr returns x expression deep copy.
+// Copy of nil argument is nil.
+func Expr(x ast.Expr) ast.Expr {
+ return copyExpr(x)
+}
+
+// ExprList returns xs expression slice deep copy.
+// Copy of nil argument is nil.
+func ExprList(xs []ast.Expr) []ast.Expr {
+ if xs == nil {
+ return nil
+ }
+ cp := make([]ast.Expr, len(xs))
+ for i := range xs {
+ cp[i] = copyExpr(xs[i])
+ }
+ return cp
+}
+
+// Stmt returns x statement deep copy.
+// Copy of nil argument is nil.
+func Stmt(x ast.Stmt) ast.Stmt {
+ return copyStmt(x)
+}
+
+// StmtList returns xs statement slice deep copy.
+// Copy of nil argument is nil.
+func StmtList(xs []ast.Stmt) []ast.Stmt {
+ if xs == nil {
+ return nil
+ }
+ cp := make([]ast.Stmt, len(xs))
+ for i := range xs {
+ cp[i] = copyStmt(xs[i])
+ }
+ return cp
+}
+
+// Decl returns x declaration deep copy.
+// Copy of nil argument is nil.
+func Decl(x ast.Decl) ast.Decl {
+ return copyDecl(x)
+}
+
+// DeclList returns xs declaration slice deep copy.
+// Copy of nil argument is nil.
+func DeclList(xs []ast.Decl) []ast.Decl {
+ if xs == nil {
+ return nil
+ }
+ cp := make([]ast.Decl, len(xs))
+ for i := range xs {
+ cp[i] = copyDecl(xs[i])
+ }
+ return cp
+}
+
+// BadExpr returns x deep copy.
+// Copy of nil argument is nil.
+func BadExpr(x *ast.BadExpr) *ast.BadExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// Ident returns x deep copy.
+// Copy of nil argument is nil.
+func Ident(x *ast.Ident) *ast.Ident {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// IdentList returns xs identifier slice deep copy.
+// Copy of nil argument is nil.
+func IdentList(xs []*ast.Ident) []*ast.Ident {
+ if xs == nil {
+ return nil
+ }
+ cp := make([]*ast.Ident, len(xs))
+ for i := range xs {
+ cp[i] = Ident(xs[i])
+ }
+ return cp
+}
+
+// Ellipsis returns x deep copy.
+// Copy of nil argument is nil.
+func Ellipsis(x *ast.Ellipsis) *ast.Ellipsis {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Elt = copyExpr(x.Elt)
+ return &cp
+}
+
+// BasicLit returns x deep copy.
+// Copy of nil argument is nil.
+func BasicLit(x *ast.BasicLit) *ast.BasicLit {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// FuncLit returns x deep copy.
+// Copy of nil argument is nil.
+func FuncLit(x *ast.FuncLit) *ast.FuncLit {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Type = FuncType(x.Type)
+ cp.Body = BlockStmt(x.Body)
+ return &cp
+}
+
+// CompositeLit returns x deep copy.
+// Copy of nil argument is nil.
+func CompositeLit(x *ast.CompositeLit) *ast.CompositeLit {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Type = copyExpr(x.Type)
+ cp.Elts = ExprList(x.Elts)
+ return &cp
+}
+
+// ParenExpr returns x deep copy.
+// Copy of nil argument is nil.
+func ParenExpr(x *ast.ParenExpr) *ast.ParenExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ return &cp
+}
+
+// SelectorExpr returns x deep copy.
+// Copy of nil argument is nil.
+func SelectorExpr(x *ast.SelectorExpr) *ast.SelectorExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ cp.Sel = Ident(x.Sel)
+ return &cp
+}
+
+// IndexExpr returns x deep copy.
+// Copy of nil argument is nil.
+func IndexExpr(x *ast.IndexExpr) *ast.IndexExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ cp.Index = copyExpr(x.Index)
+ return &cp
+}
+
+// SliceExpr returns x deep copy.
+// Copy of nil argument is nil.
+func SliceExpr(x *ast.SliceExpr) *ast.SliceExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ cp.Low = copyExpr(x.Low)
+ cp.High = copyExpr(x.High)
+ cp.Max = copyExpr(x.Max)
+ return &cp
+}
+
+// TypeAssertExpr returns x deep copy.
+// Copy of nil argument is nil.
+func TypeAssertExpr(x *ast.TypeAssertExpr) *ast.TypeAssertExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ cp.Type = copyExpr(x.Type)
+ return &cp
+}
+
+// CallExpr returns x deep copy.
+// Copy of nil argument is nil.
+func CallExpr(x *ast.CallExpr) *ast.CallExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Fun = copyExpr(x.Fun)
+ cp.Args = ExprList(x.Args)
+ return &cp
+}
+
+// StarExpr returns x deep copy.
+// Copy of nil argument is nil.
+func StarExpr(x *ast.StarExpr) *ast.StarExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ return &cp
+}
+
+// UnaryExpr returns x deep copy.
+// Copy of nil argument is nil.
+func UnaryExpr(x *ast.UnaryExpr) *ast.UnaryExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ return &cp
+}
+
+// BinaryExpr returns x deep copy.
+// Copy of nil argument is nil.
+func BinaryExpr(x *ast.BinaryExpr) *ast.BinaryExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ cp.Y = copyExpr(x.Y)
+ return &cp
+}
+
+// KeyValueExpr returns x deep copy.
+// Copy of nil argument is nil.
+func KeyValueExpr(x *ast.KeyValueExpr) *ast.KeyValueExpr {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Key = copyExpr(x.Key)
+ cp.Value = copyExpr(x.Value)
+ return &cp
+}
+
+// ArrayType returns x deep copy.
+// Copy of nil argument is nil.
+func ArrayType(x *ast.ArrayType) *ast.ArrayType {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Len = copyExpr(x.Len)
+ cp.Elt = copyExpr(x.Elt)
+ return &cp
+}
+
+// StructType returns x deep copy.
+// Copy of nil argument is nil.
+func StructType(x *ast.StructType) *ast.StructType {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Fields = FieldList(x.Fields)
+ return &cp
+}
+
+// Field returns x deep copy.
+// Copy of nil argument is nil.
+func Field(x *ast.Field) *ast.Field {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Names = IdentList(x.Names)
+ cp.Type = copyExpr(x.Type)
+ cp.Tag = BasicLit(x.Tag)
+ cp.Doc = CommentGroup(x.Doc)
+ cp.Comment = CommentGroup(x.Comment)
+ return &cp
+}
+
+// FieldList returns x deep copy.
+// Copy of nil argument is nil.
+func FieldList(x *ast.FieldList) *ast.FieldList {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ if x.List != nil {
+ cp.List = make([]*ast.Field, len(x.List))
+ for i := range x.List {
+ cp.List[i] = Field(x.List[i])
+ }
+ }
+ return &cp
+}
+
+// FuncType returns x deep copy.
+// Copy of nil argument is nil.
+func FuncType(x *ast.FuncType) *ast.FuncType {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Params = FieldList(x.Params)
+ cp.Results = FieldList(x.Results)
+ return &cp
+}
+
+// InterfaceType returns x deep copy.
+// Copy of nil argument is nil.
+func InterfaceType(x *ast.InterfaceType) *ast.InterfaceType {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Methods = FieldList(x.Methods)
+ return &cp
+}
+
+// MapType returns x deep copy.
+// Copy of nil argument is nil.
+func MapType(x *ast.MapType) *ast.MapType {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Key = copyExpr(x.Key)
+ cp.Value = copyExpr(x.Value)
+ return &cp
+}
+
+// ChanType returns x deep copy.
+// Copy of nil argument is nil.
+func ChanType(x *ast.ChanType) *ast.ChanType {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Value = copyExpr(x.Value)
+ return &cp
+}
+
+// BlockStmt returns x deep copy.
+// Copy of nil argument is nil.
+func BlockStmt(x *ast.BlockStmt) *ast.BlockStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.List = StmtList(x.List)
+ return &cp
+}
+
+// ImportSpec returns x deep copy.
+// Copy of nil argument is nil.
+func ImportSpec(x *ast.ImportSpec) *ast.ImportSpec {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Name = Ident(x.Name)
+ cp.Path = BasicLit(x.Path)
+ cp.Doc = CommentGroup(x.Doc)
+ cp.Comment = CommentGroup(x.Comment)
+ return &cp
+}
+
+// ValueSpec returns x deep copy.
+// Copy of nil argument is nil.
+func ValueSpec(x *ast.ValueSpec) *ast.ValueSpec {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Names = IdentList(x.Names)
+ cp.Values = ExprList(x.Values)
+ cp.Type = copyExpr(x.Type)
+ cp.Doc = CommentGroup(x.Doc)
+ cp.Comment = CommentGroup(x.Comment)
+ return &cp
+}
+
+// TypeSpec returns x deep copy.
+// Copy of nil argument is nil.
+func TypeSpec(x *ast.TypeSpec) *ast.TypeSpec {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Name = Ident(x.Name)
+ cp.Type = copyExpr(x.Type)
+ cp.Doc = CommentGroup(x.Doc)
+ cp.Comment = CommentGroup(x.Comment)
+ return &cp
+}
+
+// Spec returns x deep copy.
+// Copy of nil argument is nil.
+func Spec(x ast.Spec) ast.Spec {
+ if x == nil {
+ return nil
+ }
+
+ switch x := x.(type) {
+ case *ast.ImportSpec:
+ return ImportSpec(x)
+ case *ast.ValueSpec:
+ return ValueSpec(x)
+ case *ast.TypeSpec:
+ return TypeSpec(x)
+ default:
+ panic("unhandled spec")
+ }
+}
+
+// SpecList returns xs spec slice deep copy.
+// Copy of nil argument is nil.
+func SpecList(xs []ast.Spec) []ast.Spec {
+ if xs == nil {
+ return nil
+ }
+ cp := make([]ast.Spec, len(xs))
+ for i := range xs {
+ cp[i] = Spec(xs[i])
+ }
+ return cp
+}
+
+// BadStmt returns x deep copy.
+// Copy of nil argument is nil.
+func BadStmt(x *ast.BadStmt) *ast.BadStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// DeclStmt returns x deep copy.
+// Copy of nil argument is nil.
+func DeclStmt(x *ast.DeclStmt) *ast.DeclStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Decl = copyDecl(x.Decl)
+ return &cp
+}
+
+// EmptyStmt returns x deep copy.
+// Copy of nil argument is nil.
+func EmptyStmt(x *ast.EmptyStmt) *ast.EmptyStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// LabeledStmt returns x deep copy.
+// Copy of nil argument is nil.
+func LabeledStmt(x *ast.LabeledStmt) *ast.LabeledStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Label = Ident(x.Label)
+ cp.Stmt = copyStmt(x.Stmt)
+ return &cp
+}
+
+// ExprStmt returns x deep copy.
+// Copy of nil argument is nil.
+func ExprStmt(x *ast.ExprStmt) *ast.ExprStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ return &cp
+}
+
+// SendStmt returns x deep copy.
+// Copy of nil argument is nil.
+func SendStmt(x *ast.SendStmt) *ast.SendStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Chan = copyExpr(x.Chan)
+ cp.Value = copyExpr(x.Value)
+ return &cp
+}
+
+// IncDecStmt returns x deep copy.
+// Copy of nil argument is nil.
+func IncDecStmt(x *ast.IncDecStmt) *ast.IncDecStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.X = copyExpr(x.X)
+ return &cp
+}
+
+// AssignStmt returns x deep copy.
+// Copy of nil argument is nil.
+func AssignStmt(x *ast.AssignStmt) *ast.AssignStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Lhs = ExprList(x.Lhs)
+ cp.Rhs = ExprList(x.Rhs)
+ return &cp
+}
+
+// GoStmt returns x deep copy.
+// Copy of nil argument is nil.
+func GoStmt(x *ast.GoStmt) *ast.GoStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Call = CallExpr(x.Call)
+ return &cp
+}
+
+// DeferStmt returns x deep copy.
+// Copy of nil argument is nil.
+func DeferStmt(x *ast.DeferStmt) *ast.DeferStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Call = CallExpr(x.Call)
+ return &cp
+}
+
+// ReturnStmt returns x deep copy.
+// Copy of nil argument is nil.
+func ReturnStmt(x *ast.ReturnStmt) *ast.ReturnStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Results = ExprList(x.Results)
+ return &cp
+}
+
+// BranchStmt returns x deep copy.
+// Copy of nil argument is nil.
+func BranchStmt(x *ast.BranchStmt) *ast.BranchStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Label = Ident(x.Label)
+ return &cp
+}
+
+// IfStmt returns x deep copy.
+// Copy of nil argument is nil.
+func IfStmt(x *ast.IfStmt) *ast.IfStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Init = copyStmt(x.Init)
+ cp.Cond = copyExpr(x.Cond)
+ cp.Body = BlockStmt(x.Body)
+ cp.Else = copyStmt(x.Else)
+ return &cp
+}
+
+// CaseClause returns x deep copy.
+// Copy of nil argument is nil.
+func CaseClause(x *ast.CaseClause) *ast.CaseClause {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.List = ExprList(x.List)
+ cp.Body = StmtList(x.Body)
+ return &cp
+}
+
+// SwitchStmt returns x deep copy.
+// Copy of nil argument is nil.
+func SwitchStmt(x *ast.SwitchStmt) *ast.SwitchStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Init = copyStmt(x.Init)
+ cp.Tag = copyExpr(x.Tag)
+ cp.Body = BlockStmt(x.Body)
+ return &cp
+}
+
+// TypeSwitchStmt returns x deep copy.
+// Copy of nil argument is nil.
+func TypeSwitchStmt(x *ast.TypeSwitchStmt) *ast.TypeSwitchStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Init = copyStmt(x.Init)
+ cp.Assign = copyStmt(x.Assign)
+ cp.Body = BlockStmt(x.Body)
+ return &cp
+}
+
+// CommClause returns x deep copy.
+// Copy of nil argument is nil.
+func CommClause(x *ast.CommClause) *ast.CommClause {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Comm = copyStmt(x.Comm)
+ cp.Body = StmtList(x.Body)
+ return &cp
+}
+
+// SelectStmt returns x deep copy.
+// Copy of nil argument is nil.
+func SelectStmt(x *ast.SelectStmt) *ast.SelectStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Body = BlockStmt(x.Body)
+ return &cp
+}
+
+// ForStmt returns x deep copy.
+// Copy of nil argument is nil.
+func ForStmt(x *ast.ForStmt) *ast.ForStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Init = copyStmt(x.Init)
+ cp.Cond = copyExpr(x.Cond)
+ cp.Post = copyStmt(x.Post)
+ cp.Body = BlockStmt(x.Body)
+ return &cp
+}
+
+// RangeStmt returns x deep copy.
+// Copy of nil argument is nil.
+func RangeStmt(x *ast.RangeStmt) *ast.RangeStmt {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Key = copyExpr(x.Key)
+ cp.Value = copyExpr(x.Value)
+ cp.X = copyExpr(x.X)
+ cp.Body = BlockStmt(x.Body)
+ return &cp
+}
+
+// Comment returns x deep copy.
+// Copy of nil argument is nil.
+func Comment(x *ast.Comment) *ast.Comment {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// CommentGroup returns x deep copy.
+// Copy of nil argument is nil.
+func CommentGroup(x *ast.CommentGroup) *ast.CommentGroup {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ if x.List != nil {
+ cp.List = make([]*ast.Comment, len(x.List))
+ for i := range x.List {
+ cp.List[i] = Comment(x.List[i])
+ }
+ }
+ return &cp
+}
+
+// File returns x deep copy.
+// Copy of nil argument is nil.
+func File(x *ast.File) *ast.File {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Doc = CommentGroup(x.Doc)
+ cp.Name = Ident(x.Name)
+ cp.Decls = DeclList(x.Decls)
+ cp.Imports = make([]*ast.ImportSpec, len(x.Imports))
+ for i := range x.Imports {
+ cp.Imports[i] = ImportSpec(x.Imports[i])
+ }
+ cp.Unresolved = IdentList(x.Unresolved)
+ cp.Comments = make([]*ast.CommentGroup, len(x.Comments))
+ for i := range x.Comments {
+ cp.Comments[i] = CommentGroup(x.Comments[i])
+ }
+ return &cp
+}
+
+// Package returns x deep copy.
+// Copy of nil argument is nil.
+func Package(x *ast.Package) *ast.Package {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Files = make(map[string]*ast.File)
+ for filename, f := range x.Files {
+ cp.Files[filename] = f
+ }
+ return &cp
+}
+
+// BadDecl returns x deep copy.
+// Copy of nil argument is nil.
+func BadDecl(x *ast.BadDecl) *ast.BadDecl {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ return &cp
+}
+
+// GenDecl returns x deep copy.
+// Copy of nil argument is nil.
+func GenDecl(x *ast.GenDecl) *ast.GenDecl {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Specs = SpecList(x.Specs)
+ cp.Doc = CommentGroup(x.Doc)
+ return &cp
+}
+
+// FuncDecl returns x deep copy.
+// Copy of nil argument is nil.
+func FuncDecl(x *ast.FuncDecl) *ast.FuncDecl {
+ if x == nil {
+ return nil
+ }
+ cp := *x
+ cp.Recv = FieldList(x.Recv)
+ cp.Name = Ident(x.Name)
+ cp.Type = FuncType(x.Type)
+ cp.Body = BlockStmt(x.Body)
+ cp.Doc = CommentGroup(x.Doc)
+ return &cp
+}
+
+func copyNode(x ast.Node) ast.Node {
+ switch x := x.(type) {
+ case ast.Expr:
+ return copyExpr(x)
+ case ast.Stmt:
+ return copyStmt(x)
+ case ast.Decl:
+ return copyDecl(x)
+
+ case ast.Spec:
+ return Spec(x)
+ case *ast.FieldList:
+ return FieldList(x)
+ case *ast.Comment:
+ return Comment(x)
+ case *ast.CommentGroup:
+ return CommentGroup(x)
+ case *ast.File:
+ return File(x)
+ case *ast.Package:
+ return Package(x)
+
+ default:
+ panic("unhandled node")
+ }
+}
+
+func copyExpr(x ast.Expr) ast.Expr {
+ if x == nil {
+ return nil
+ }
+
+ switch x := x.(type) {
+ case *ast.BadExpr:
+ return BadExpr(x)
+ case *ast.Ident:
+ return Ident(x)
+ case *ast.Ellipsis:
+ return Ellipsis(x)
+ case *ast.BasicLit:
+ return BasicLit(x)
+ case *ast.FuncLit:
+ return FuncLit(x)
+ case *ast.CompositeLit:
+ return CompositeLit(x)
+ case *ast.ParenExpr:
+ return ParenExpr(x)
+ case *ast.SelectorExpr:
+ return SelectorExpr(x)
+ case *ast.IndexExpr:
+ return IndexExpr(x)
+ case *ast.SliceExpr:
+ return SliceExpr(x)
+ case *ast.TypeAssertExpr:
+ return TypeAssertExpr(x)
+ case *ast.CallExpr:
+ return CallExpr(x)
+ case *ast.StarExpr:
+ return StarExpr(x)
+ case *ast.UnaryExpr:
+ return UnaryExpr(x)
+ case *ast.BinaryExpr:
+ return BinaryExpr(x)
+ case *ast.KeyValueExpr:
+ return KeyValueExpr(x)
+ case *ast.ArrayType:
+ return ArrayType(x)
+ case *ast.StructType:
+ return StructType(x)
+ case *ast.FuncType:
+ return FuncType(x)
+ case *ast.InterfaceType:
+ return InterfaceType(x)
+ case *ast.MapType:
+ return MapType(x)
+ case *ast.ChanType:
+ return ChanType(x)
+
+ default:
+ panic("unhandled expr")
+ }
+}
+
+func copyStmt(x ast.Stmt) ast.Stmt {
+ if x == nil {
+ return nil
+ }
+
+ switch x := x.(type) {
+ case *ast.BadStmt:
+ return BadStmt(x)
+ case *ast.DeclStmt:
+ return DeclStmt(x)
+ case *ast.EmptyStmt:
+ return EmptyStmt(x)
+ case *ast.LabeledStmt:
+ return LabeledStmt(x)
+ case *ast.ExprStmt:
+ return ExprStmt(x)
+ case *ast.SendStmt:
+ return SendStmt(x)
+ case *ast.IncDecStmt:
+ return IncDecStmt(x)
+ case *ast.AssignStmt:
+ return AssignStmt(x)
+ case *ast.GoStmt:
+ return GoStmt(x)
+ case *ast.DeferStmt:
+ return DeferStmt(x)
+ case *ast.ReturnStmt:
+ return ReturnStmt(x)
+ case *ast.BranchStmt:
+ return BranchStmt(x)
+ case *ast.BlockStmt:
+ return BlockStmt(x)
+ case *ast.IfStmt:
+ return IfStmt(x)
+ case *ast.CaseClause:
+ return CaseClause(x)
+ case *ast.SwitchStmt:
+ return SwitchStmt(x)
+ case *ast.TypeSwitchStmt:
+ return TypeSwitchStmt(x)
+ case *ast.CommClause:
+ return CommClause(x)
+ case *ast.SelectStmt:
+ return SelectStmt(x)
+ case *ast.ForStmt:
+ return ForStmt(x)
+ case *ast.RangeStmt:
+ return RangeStmt(x)
+
+ default:
+ panic("unhandled stmt")
+ }
+}
+
+func copyDecl(x ast.Decl) ast.Decl {
+ if x == nil {
+ return nil
+ }
+
+ switch x := x.(type) {
+ case *ast.BadDecl:
+ return BadDecl(x)
+ case *ast.GenDecl:
+ return GenDecl(x)
+ case *ast.FuncDecl:
+ return FuncDecl(x)
+
+ default:
+ panic("unhandled decl")
+ }
+}
diff --git a/vendor/github.com/go-toolsmith/astcopy/go.mod b/vendor/github.com/go-toolsmith/astcopy/go.mod
new file mode 100644
index 00000000000..f20e586e595
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astcopy/go.mod
@@ -0,0 +1 @@
+module github.com/go-toolsmith/astcopy
diff --git a/vendor/github.com/go-toolsmith/astequal/.gitignore b/vendor/github.com/go-toolsmith/astequal/.gitignore
new file mode 100644
index 00000000000..f38c2b852fd
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astequal/.gitignore
@@ -0,0 +1,5 @@
+bin
+pkg
+src/main
+tmp
+
diff --git a/vendor/github.com/go-toolsmith/astequal/.travis.yml b/vendor/github.com/go-toolsmith/astequal/.travis.yml
new file mode 100644
index 00000000000..8994d395c61
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astequal/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - 1.x
+install:
+ - # Prevent default install action "go get -t -v ./...".
+script:
+ - go get -t -v ./...
+ - go tool vet .
+ - go test -v -race ./...
\ No newline at end of file
diff --git a/vendor/github.com/go-toolsmith/astequal/LICENSE b/vendor/github.com/go-toolsmith/astequal/LICENSE
new file mode 100644
index 00000000000..717f894f525
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astequal/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Iskander Sharipov / Quasilyte
+
+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/go-toolsmith/astequal/README.md b/vendor/github.com/go-toolsmith/astequal/README.md
new file mode 100644
index 00000000000..b14f80f6f75
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astequal/README.md
@@ -0,0 +1,67 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/astequal)](https://goreportcard.com/report/github.com/go-toolsmith/astequal)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/astequal?status.svg)](https://godoc.org/github.com/go-toolsmith/astequal)
+[![Build Status](https://travis-ci.org/go-toolsmith/astequal.svg?branch=master)](https://travis-ci.org/go-toolsmith/astequal)
+
+
+# astequal
+
+Package astequal provides AST (deep) equallity check operations.
+
+## Installation:
+
+```bash
+go get github.com/go-toolsmith/astequal
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "log"
+ "reflect"
+
+ "github.com/go-toolsmith/astequal"
+)
+
+func main() {
+ const code = `
+ package foo
+
+ func main() {
+ x := []int{1, 2, 3}
+ x := []int{1, 2, 3}
+ }`
+
+ fset := token.NewFileSet()
+ pkg, err := parser.ParseFile(fset, "string", code, 0)
+ if err != nil {
+ log.Fatalf("parse error: %+v", err)
+ }
+
+ fn := pkg.Decls[0].(*ast.FuncDecl)
+ x := fn.Body.List[0]
+ y := fn.Body.List[1]
+
+ // Reflect DeepEqual will fail due to different Pos values.
+ // astequal only checks whether two nodes describe AST.
+ fmt.Println(reflect.DeepEqual(x, y)) // => false
+ fmt.Println(astequal.Node(x, y)) // => true
+ fmt.Println(astequal.Stmt(x, y)) // => true
+}
+```
+
+## Performance
+
+`astequal` outperforms reflection-based comparison by a big margin:
+
+```
+BenchmarkEqualExpr/astequal.Expr-8 5000000 298 ns/op 0 B/op 0 allocs/op
+BenchmarkEqualExpr/astequal.Node-8 3000000 409 ns/op 0 B/op 0 allocs/op
+BenchmarkEqualExpr/reflect.DeepEqual-8 50000 38898 ns/op 10185 B/op 156 allocs/op
+```
diff --git a/vendor/github.com/go-toolsmith/astequal/astequal.go b/vendor/github.com/go-toolsmith/astequal/astequal.go
new file mode 100644
index 00000000000..6a32d72189d
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astequal/astequal.go
@@ -0,0 +1,734 @@
+// Package astequal provides AST (deep) equallity check operations.
+package astequal
+
+import (
+ "go/ast"
+ "go/token"
+)
+
+// Node reports whether two AST nodes are structurally (deep) equal.
+//
+// Nil arguments are permitted: true is returned if x and y are both nils.
+//
+// See also: Expr, Stmt, Decl functions.
+func Node(x, y ast.Node) bool {
+ return astNodeEq(x, y)
+}
+
+// Expr reports whether two AST expressions are structurally (deep) equal.
+//
+// Nil arguments are permitted: true is returned if x and y are both nils.
+// ast.BadExpr comparison always yields false.
+func Expr(x, y ast.Expr) bool {
+ return astExprEq(x, y)
+}
+
+// Stmt reports whether two AST statements are structurally (deep) equal.
+//
+// Nil arguments are permitted: true is returned if x and y are both nils.
+// ast.BadStmt comparison always yields false.
+func Stmt(x, y ast.Stmt) bool {
+ return astStmtEq(x, y)
+}
+
+// Decl reports whether two AST declarations are structurally (deep) equal.
+//
+// Nil arguments are permitted: true is returned if x and y are both nils.
+// ast.BadDecl comparison always yields false.
+func Decl(x, y ast.Decl) bool {
+ return astDeclEq(x, y)
+}
+
+// Functions to perform deep equallity checks between arbitrary AST nodes.
+
+// Compare interface node types.
+//
+// Interfaces, as well as their values, can be nil.
+//
+// Even if AST does expect field X to be mandatory,
+// nil checks are required as nodes can be constructed
+// manually, or be partially invalid/incomplete.
+
+func astNodeEq(x, y ast.Node) bool {
+ switch x := x.(type) {
+ case ast.Expr:
+ y, ok := y.(ast.Expr)
+ return ok && astExprEq(x, y)
+ case ast.Stmt:
+ y, ok := y.(ast.Stmt)
+ return ok && astStmtEq(x, y)
+ case ast.Decl:
+ y, ok := y.(ast.Decl)
+ return ok && astDeclEq(x, y)
+ default:
+ return false
+ }
+}
+
+func astExprEq(x, y ast.Expr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+
+ switch x := x.(type) {
+ case *ast.Ident:
+ y, ok := y.(*ast.Ident)
+ return ok && astIdentEq(x, y)
+
+ case *ast.BasicLit:
+ y, ok := y.(*ast.BasicLit)
+ return ok && astBasicLitEq(x, y)
+
+ case *ast.FuncLit:
+ y, ok := y.(*ast.FuncLit)
+ return ok && astFuncLitEq(x, y)
+
+ case *ast.CompositeLit:
+ y, ok := y.(*ast.CompositeLit)
+ return ok && astCompositeLitEq(x, y)
+
+ case *ast.ParenExpr:
+ y, ok := y.(*ast.ParenExpr)
+ return ok && astParenExprEq(x, y)
+
+ case *ast.SelectorExpr:
+ y, ok := y.(*ast.SelectorExpr)
+ return ok && astSelectorExprEq(x, y)
+
+ case *ast.IndexExpr:
+ y, ok := y.(*ast.IndexExpr)
+ return ok && astIndexExprEq(x, y)
+
+ case *ast.SliceExpr:
+ y, ok := y.(*ast.SliceExpr)
+ return ok && astSliceExprEq(x, y)
+
+ case *ast.TypeAssertExpr:
+ y, ok := y.(*ast.TypeAssertExpr)
+ return ok && astTypeAssertExprEq(x, y)
+
+ case *ast.CallExpr:
+ y, ok := y.(*ast.CallExpr)
+ return ok && astCallExprEq(x, y)
+
+ case *ast.StarExpr:
+ y, ok := y.(*ast.StarExpr)
+ return ok && astStarExprEq(x, y)
+
+ case *ast.UnaryExpr:
+ y, ok := y.(*ast.UnaryExpr)
+ return ok && astUnaryExprEq(x, y)
+
+ case *ast.BinaryExpr:
+ y, ok := y.(*ast.BinaryExpr)
+ return ok && astBinaryExprEq(x, y)
+
+ case *ast.KeyValueExpr:
+ y, ok := y.(*ast.KeyValueExpr)
+ return ok && astKeyValueExprEq(x, y)
+
+ case *ast.ArrayType:
+ y, ok := y.(*ast.ArrayType)
+ return ok && astArrayTypeEq(x, y)
+
+ case *ast.StructType:
+ y, ok := y.(*ast.StructType)
+ return ok && astStructTypeEq(x, y)
+
+ case *ast.FuncType:
+ y, ok := y.(*ast.FuncType)
+ return ok && astFuncTypeEq(x, y)
+
+ case *ast.InterfaceType:
+ y, ok := y.(*ast.InterfaceType)
+ return ok && astInterfaceTypeEq(x, y)
+
+ case *ast.MapType:
+ y, ok := y.(*ast.MapType)
+ return ok && astMapTypeEq(x, y)
+
+ case *ast.ChanType:
+ y, ok := y.(*ast.ChanType)
+ return ok && astChanTypeEq(x, y)
+
+ case *ast.Ellipsis:
+ y, ok := y.(*ast.Ellipsis)
+ return ok && astEllipsisEq(x, y)
+
+ default:
+ return false
+ }
+}
+
+func astStmtEq(x, y ast.Stmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+
+ switch x := x.(type) {
+ case *ast.ExprStmt:
+ y, ok := y.(*ast.ExprStmt)
+ return ok && astExprStmtEq(x, y)
+
+ case *ast.SendStmt:
+ y, ok := y.(*ast.SendStmt)
+ return ok && astSendStmtEq(x, y)
+
+ case *ast.IncDecStmt:
+ y, ok := y.(*ast.IncDecStmt)
+ return ok && astIncDecStmtEq(x, y)
+
+ case *ast.AssignStmt:
+ y, ok := y.(*ast.AssignStmt)
+ return ok && astAssignStmtEq(x, y)
+
+ case *ast.GoStmt:
+ y, ok := y.(*ast.GoStmt)
+ return ok && astGoStmtEq(x, y)
+
+ case *ast.DeferStmt:
+ y, ok := y.(*ast.DeferStmt)
+ return ok && astDeferStmtEq(x, y)
+
+ case *ast.ReturnStmt:
+ y, ok := y.(*ast.ReturnStmt)
+ return ok && astReturnStmtEq(x, y)
+
+ case *ast.BranchStmt:
+ y, ok := y.(*ast.BranchStmt)
+ return ok && astBranchStmtEq(x, y)
+
+ case *ast.BlockStmt:
+ y, ok := y.(*ast.BlockStmt)
+ return ok && astBlockStmtEq(x, y)
+
+ case *ast.IfStmt:
+ y, ok := y.(*ast.IfStmt)
+ return ok && astIfStmtEq(x, y)
+
+ case *ast.CaseClause:
+ y, ok := y.(*ast.CaseClause)
+ return ok && astCaseClauseEq(x, y)
+
+ case *ast.SwitchStmt:
+ y, ok := y.(*ast.SwitchStmt)
+ return ok && astSwitchStmtEq(x, y)
+
+ case *ast.TypeSwitchStmt:
+ y, ok := y.(*ast.TypeSwitchStmt)
+ return ok && astTypeSwitchStmtEq(x, y)
+
+ case *ast.CommClause:
+ y, ok := y.(*ast.CommClause)
+ return ok && astCommClauseEq(x, y)
+
+ case *ast.SelectStmt:
+ y, ok := y.(*ast.SelectStmt)
+ return ok && astSelectStmtEq(x, y)
+
+ case *ast.ForStmt:
+ y, ok := y.(*ast.ForStmt)
+ return ok && astForStmtEq(x, y)
+
+ case *ast.RangeStmt:
+ y, ok := y.(*ast.RangeStmt)
+ return ok && astRangeStmtEq(x, y)
+
+ case *ast.DeclStmt:
+ y, ok := y.(*ast.DeclStmt)
+ return ok && astDeclStmtEq(x, y)
+
+ case *ast.LabeledStmt:
+ y, ok := y.(*ast.LabeledStmt)
+ return ok && astLabeledStmtEq(x, y)
+
+ case *ast.EmptyStmt:
+ y, ok := y.(*ast.EmptyStmt)
+ return ok && astEmptyStmtEq(x, y)
+
+ default:
+ return false
+ }
+}
+
+func astDeclEq(x, y ast.Decl) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+
+ switch x := x.(type) {
+ case *ast.GenDecl:
+ y, ok := y.(*ast.GenDecl)
+ return ok && astGenDeclEq(x, y)
+
+ case *ast.FuncDecl:
+ y, ok := y.(*ast.FuncDecl)
+ return ok && astFuncDeclEq(x, y)
+
+ default:
+ return false
+ }
+}
+
+// Compare concrete nodes for equallity.
+//
+// Any node of pointer type permitted to be nil,
+// hence nil checks are mandatory.
+
+func astIdentEq(x, y *ast.Ident) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Name == y.Name
+}
+
+func astKeyValueExprEq(x, y *ast.KeyValueExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Key, y.Key) && astExprEq(x.Value, y.Value)
+}
+
+func astArrayTypeEq(x, y *ast.ArrayType) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Len, y.Len) && astExprEq(x.Elt, y.Elt)
+}
+
+func astStructTypeEq(x, y *ast.StructType) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astFieldListEq(x.Fields, y.Fields)
+}
+
+func astFuncTypeEq(x, y *ast.FuncType) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astFieldListEq(x.Params, y.Params) &&
+ astFieldListEq(x.Results, y.Results)
+}
+
+func astBasicLitEq(x, y *ast.BasicLit) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Kind == y.Kind && x.Value == y.Value
+}
+
+func astBlockStmtEq(x, y *ast.BlockStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astStmtSliceEq(x.List, y.List)
+}
+
+func astFieldEq(x, y *ast.Field) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astIdentSliceEq(x.Names, y.Names) &&
+ astExprEq(x.Type, y.Type)
+}
+
+func astFuncLitEq(x, y *ast.FuncLit) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astFuncTypeEq(x.Type, y.Type) &&
+ astBlockStmtEq(x.Body, y.Body)
+}
+
+func astCompositeLitEq(x, y *ast.CompositeLit) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Type, y.Type) &&
+ astExprSliceEq(x.Elts, y.Elts)
+}
+
+func astSelectorExprEq(x, y *ast.SelectorExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X) && astIdentEq(x.Sel, y.Sel)
+}
+
+func astIndexExprEq(x, y *ast.IndexExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X) && astExprEq(x.Index, y.Index)
+}
+
+func astSliceExprEq(x, y *ast.SliceExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X) &&
+ astExprEq(x.Low, y.Low) &&
+ astExprEq(x.High, y.High) &&
+ astExprEq(x.Max, y.Max)
+}
+
+func astTypeAssertExprEq(x, y *ast.TypeAssertExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X) && astExprEq(x.Type, y.Type)
+}
+
+func astInterfaceTypeEq(x, y *ast.InterfaceType) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astFieldListEq(x.Methods, y.Methods)
+}
+
+func astMapTypeEq(x, y *ast.MapType) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Key, y.Key) && astExprEq(x.Value, y.Value)
+}
+
+func astChanTypeEq(x, y *ast.ChanType) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Dir == y.Dir && astExprEq(x.Value, y.Value)
+}
+
+func astCallExprEq(x, y *ast.CallExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Fun, y.Fun) &&
+ astExprSliceEq(x.Args, y.Args) &&
+ (x.Ellipsis == 0) == (y.Ellipsis == 0)
+}
+
+func astEllipsisEq(x, y *ast.Ellipsis) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Elt, y.Elt)
+}
+
+func astUnaryExprEq(x, y *ast.UnaryExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Op == y.Op && astExprEq(x.X, y.X)
+}
+
+func astBinaryExprEq(x, y *ast.BinaryExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Op == y.Op &&
+ astExprEq(x.X, y.X) &&
+ astExprEq(x.Y, y.Y)
+}
+
+func astParenExprEq(x, y *ast.ParenExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X)
+}
+
+func astStarExprEq(x, y *ast.StarExpr) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X)
+}
+
+func astFieldListEq(x, y *ast.FieldList) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astFieldSliceEq(x.List, y.List)
+}
+
+func astEmptyStmtEq(x, y *ast.EmptyStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Implicit == y.Implicit
+}
+
+func astLabeledStmtEq(x, y *ast.LabeledStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astIdentEq(x.Label, y.Label) && astStmtEq(x.Stmt, y.Stmt)
+}
+
+func astExprStmtEq(x, y *ast.ExprStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.X, y.X)
+}
+
+func astSendStmtEq(x, y *ast.SendStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprEq(x.Chan, y.Chan) && astExprEq(x.Value, y.Value)
+}
+
+func astDeclStmtEq(x, y *ast.DeclStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astDeclEq(x.Decl, y.Decl)
+}
+
+func astIncDecStmtEq(x, y *ast.IncDecStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Tok == y.Tok && astExprEq(x.X, y.X)
+}
+
+func astAssignStmtEq(x, y *ast.AssignStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Tok == y.Tok &&
+ astExprSliceEq(x.Lhs, y.Lhs) &&
+ astExprSliceEq(x.Rhs, y.Rhs)
+}
+
+func astGoStmtEq(x, y *ast.GoStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astCallExprEq(x.Call, y.Call)
+}
+
+func astDeferStmtEq(x, y *ast.DeferStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astCallExprEq(x.Call, y.Call)
+}
+
+func astReturnStmtEq(x, y *ast.ReturnStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprSliceEq(x.Results, y.Results)
+}
+
+func astBranchStmtEq(x, y *ast.BranchStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Tok == y.Tok && astIdentEq(x.Label, y.Label)
+}
+
+func astIfStmtEq(x, y *ast.IfStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astStmtEq(x.Init, y.Init) &&
+ astExprEq(x.Cond, y.Cond) &&
+ astBlockStmtEq(x.Body, y.Body) &&
+ astStmtEq(x.Else, y.Else)
+}
+
+func astCaseClauseEq(x, y *ast.CaseClause) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astExprSliceEq(x.List, y.List) &&
+ astStmtSliceEq(x.Body, y.Body)
+}
+
+func astSwitchStmtEq(x, y *ast.SwitchStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astStmtEq(x.Init, y.Init) &&
+ astExprEq(x.Tag, y.Tag) &&
+ astBlockStmtEq(x.Body, y.Body)
+}
+
+func astTypeSwitchStmtEq(x, y *ast.TypeSwitchStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astStmtEq(x.Init, y.Init) &&
+ astStmtEq(x.Assign, y.Assign) &&
+ astBlockStmtEq(x.Body, y.Body)
+}
+
+func astCommClauseEq(x, y *ast.CommClause) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astStmtEq(x.Comm, y.Comm) && astStmtSliceEq(x.Body, y.Body)
+}
+
+func astSelectStmtEq(x, y *ast.SelectStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astBlockStmtEq(x.Body, y.Body)
+}
+
+func astForStmtEq(x, y *ast.ForStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astStmtEq(x.Init, y.Init) &&
+ astExprEq(x.Cond, y.Cond) &&
+ astStmtEq(x.Post, y.Post) &&
+ astBlockStmtEq(x.Body, y.Body)
+}
+
+func astRangeStmtEq(x, y *ast.RangeStmt) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return x.Tok == y.Tok &&
+ astExprEq(x.Key, y.Key) &&
+ astExprEq(x.Value, y.Value) &&
+ astExprEq(x.X, y.X) &&
+ astBlockStmtEq(x.Body, y.Body)
+}
+
+func astFuncDeclEq(x, y *ast.FuncDecl) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astFieldListEq(x.Recv, y.Recv) &&
+ astIdentEq(x.Name, y.Name) &&
+ astFuncTypeEq(x.Type, y.Type) &&
+ astBlockStmtEq(x.Body, y.Body)
+}
+
+func astGenDeclEq(x, y *ast.GenDecl) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+
+ if x.Tok != y.Tok {
+ return false
+ }
+ if len(x.Specs) != len(y.Specs) {
+ return false
+ }
+
+ switch x.Tok {
+ case token.IMPORT:
+ for i := range x.Specs {
+ xspec := x.Specs[i].(*ast.ImportSpec)
+ yspec := y.Specs[i].(*ast.ImportSpec)
+ if !astImportSpecEq(xspec, yspec) {
+ return false
+ }
+ }
+ case token.TYPE:
+ for i := range x.Specs {
+ xspec := x.Specs[i].(*ast.TypeSpec)
+ yspec := y.Specs[i].(*ast.TypeSpec)
+ if !astTypeSpecEq(xspec, yspec) {
+ return false
+ }
+ }
+ default:
+ for i := range x.Specs {
+ xspec := x.Specs[i].(*ast.ValueSpec)
+ yspec := y.Specs[i].(*ast.ValueSpec)
+ if !astValueSpecEq(xspec, yspec) {
+ return false
+ }
+ }
+ }
+
+ return true
+}
+
+func astImportSpecEq(x, y *ast.ImportSpec) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astIdentEq(x.Name, y.Name) && astBasicLitEq(x.Path, y.Path)
+}
+
+func astTypeSpecEq(x, y *ast.TypeSpec) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astIdentEq(x.Name, y.Name) && astExprEq(x.Type, y.Type)
+}
+
+func astValueSpecEq(x, y *ast.ValueSpec) bool {
+ if x == nil || y == nil {
+ return x == y
+ }
+ return astIdentSliceEq(x.Names, y.Names) &&
+ astExprEq(x.Type, y.Type) &&
+ astExprSliceEq(x.Values, y.Values)
+}
+
+// Compare slices for equallity.
+//
+// Each slice element that has pointer type permitted to be nil,
+// hence instead of using adhoc comparison of values,
+// equallity functions that are defined above are used.
+
+func astIdentSliceEq(xs, ys []*ast.Ident) bool {
+ if len(xs) != len(ys) {
+ return false
+ }
+ for i := range xs {
+ if !astIdentEq(xs[i], ys[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+func astFieldSliceEq(xs, ys []*ast.Field) bool {
+ if len(xs) != len(ys) {
+ return false
+ }
+ for i := range xs {
+ if !astFieldEq(xs[i], ys[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+func astStmtSliceEq(xs, ys []ast.Stmt) bool {
+ if len(xs) != len(ys) {
+ return false
+ }
+ for i := range xs {
+ if !astStmtEq(xs[i], ys[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+func astExprSliceEq(xs, ys []ast.Expr) bool {
+ if len(xs) != len(ys) {
+ return false
+ }
+ for i := range xs {
+ if !astExprEq(xs[i], ys[i]) {
+ return false
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/go-toolsmith/astequal/go.mod b/vendor/github.com/go-toolsmith/astequal/go.mod
new file mode 100644
index 00000000000..86fa407721b
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astequal/go.mod
@@ -0,0 +1 @@
+module github.com/go-toolsmith/astequal
diff --git a/vendor/github.com/go-toolsmith/astfmt/LICENSE b/vendor/github.com/go-toolsmith/astfmt/LICENSE
new file mode 100644
index 00000000000..eef17180f89
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astfmt/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 go-toolsmith
+
+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/go-toolsmith/astfmt/README.md b/vendor/github.com/go-toolsmith/astfmt/README.md
new file mode 100644
index 00000000000..954c92bf469
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astfmt/README.md
@@ -0,0 +1,39 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/strparse)](https://goreportcard.com/report/github.com/go-toolsmith/strparse)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/strparse?status.svg)](https://godoc.org/github.com/go-toolsmith/strparse)
+
+
+# astfmt
+
+Package astfmt implements ast.Node formatting with fmt-like API.
+
+## Installation
+
+```bash
+go get github.com/go-toolsmith/astfmt
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "go/token"
+ "os"
+
+ "github.com/go-toolsmith/astfmt"
+ "github.com/go-toolsmith/strparse"
+)
+
+func Example() {
+ x := strparse.Expr(`foo(bar(baz(1+2)))`)
+ // astfmt functions add %s support for ast.Node arguments.
+ astfmt.Println(x) // => foo(bar(baz(1 + 2)))
+ astfmt.Fprintf(os.Stdout, "node=%s\n", x) // => node=foo(bar(baz(1 + 2)))
+
+ // Can use specific file set with printer.
+ fset := token.NewFileSet() // Suppose this fset is used when parsing
+ pp := astfmt.NewPrinter(fset)
+ pp.Println(x) // => foo(bar(baz(1 + 2)))
+}
+```
diff --git a/vendor/github.com/go-toolsmith/astfmt/astfmt.go b/vendor/github.com/go-toolsmith/astfmt/astfmt.go
new file mode 100644
index 00000000000..ca993e033f8
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astfmt/astfmt.go
@@ -0,0 +1,111 @@
+// Package astfmt implements `ast.Node` formatting with fmt-like API.
+package astfmt
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/printer"
+ "go/token"
+ "io"
+)
+
+// Println calls fmt.Println with additional support of %s format
+// for ast.Node arguments.
+//
+// Uses empty file set for AST printing.
+func Println(args ...interface{}) error {
+ return defaultPrinter.Println(args...)
+}
+
+// Fprintf calls fmt.Fprintf with additional support of %s format
+// for ast.Node arguments.
+//
+// Uses empty file set for AST printing.
+func Fprintf(w io.Writer, format string, args ...interface{}) error {
+ return defaultPrinter.Fprintf(w, format, args...)
+}
+
+// Sprintf calls fmt.Sprintf with additional support of %s format
+// for ast.Node arguments.
+//
+// Uses empty file set for AST printing.
+func Sprintf(format string, args ...interface{}) string {
+ return defaultPrinter.Sprintf(format, args...)
+}
+
+// Sprint calls fmt.Sprint with additional support of %s format
+// for ast.Node arguments.
+//
+// Uses empty file set for AST printing.
+func Sprint(args ...interface{}) string {
+ return defaultPrinter.Sprint(args...)
+}
+
+// NewPrinter returns printer that uses bound file set when printing AST nodes.
+func NewPrinter(fset *token.FileSet) *Printer {
+ return &Printer{fset: fset}
+}
+
+// Printer provides API close to fmt package for printing AST nodes.
+// Unlike freestanding functions from this package, it makes it possible
+// to associate appropriate file set for better output.
+type Printer struct {
+ fset *token.FileSet
+}
+
+// Println printer method is like Println function, but uses bound file set when printing.
+func (p *Printer) Println(args ...interface{}) error {
+ _, err := fmt.Println(wrapArgs(p.fset, args)...)
+ return err
+}
+
+// Fprintf printer method is like Fprintf function, but uses bound file set when printing.
+func (p *Printer) Fprintf(w io.Writer, format string, args ...interface{}) error {
+ _, err := fmt.Fprintf(w, format, wrapArgs(p.fset, args)...)
+ return err
+}
+
+// Sprintf printer method is like Sprintf function, but uses bound file set when printing.
+func (p *Printer) Sprintf(format string, args ...interface{}) string {
+ return fmt.Sprintf(format, wrapArgs(p.fset, args)...)
+}
+
+// Sprint printer method is like Sprint function, but uses bound file set when printing.
+func (p *Printer) Sprint(args ...interface{}) string {
+ return fmt.Sprint(wrapArgs(p.fset, args)...)
+}
+
+// defaultPrinter is used in printing functions like Println.
+// Uses empty file set.
+var defaultPrinter = NewPrinter(token.NewFileSet())
+
+// wrapArgs returns arguments slice with every ast.Node element
+// replaced with fmtNode wrapper that supports additional formatting.
+func wrapArgs(fset *token.FileSet, args []interface{}) []interface{} {
+ for i := range args {
+ if x, ok := args[i].(ast.Node); ok {
+ args[i] = fmtNode{fset: fset, node: x}
+ }
+ }
+ return args
+}
+
+type fmtNode struct {
+ fset *token.FileSet
+ node ast.Node
+}
+
+func (n fmtNode) String() string {
+ var buf bytes.Buffer
+ if err := printer.Fprint(&buf, n.fset, n.node); err != nil {
+ return fmt.Sprintf("%%!s(ast.Node=%s)", err)
+ }
+ return buf.String()
+}
+
+func (n fmtNode) GoString() string {
+ var buf bytes.Buffer
+ fmt.Fprintf(&buf, "%#v", n.node)
+ return buf.String()
+}
diff --git a/vendor/github.com/go-toolsmith/astfmt/go.mod b/vendor/github.com/go-toolsmith/astfmt/go.mod
new file mode 100644
index 00000000000..2acaa56fd85
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astfmt/go.mod
@@ -0,0 +1 @@
+module github.com/go-toolsmith/astfmt
diff --git a/vendor/github.com/go-toolsmith/astp/.gitignore b/vendor/github.com/go-toolsmith/astp/.gitignore
new file mode 100644
index 00000000000..1f6187ecd67
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/.gitignore
@@ -0,0 +1,4 @@
+bin
+pkg
+src/main
+tmp
\ No newline at end of file
diff --git a/vendor/github.com/go-toolsmith/astp/.travis.yml b/vendor/github.com/go-toolsmith/astp/.travis.yml
new file mode 100644
index 00000000000..8994d395c61
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - 1.x
+install:
+ - # Prevent default install action "go get -t -v ./...".
+script:
+ - go get -t -v ./...
+ - go tool vet .
+ - go test -v -race ./...
\ No newline at end of file
diff --git a/vendor/github.com/go-toolsmith/astp/LICENSE b/vendor/github.com/go-toolsmith/astp/LICENSE
new file mode 100644
index 00000000000..eef17180f89
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 go-toolsmith
+
+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/go-toolsmith/astp/README.md b/vendor/github.com/go-toolsmith/astp/README.md
new file mode 100644
index 00000000000..7313c6ab8ee
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/README.md
@@ -0,0 +1,39 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/astp)](https://goreportcard.com/report/github.com/go-toolsmith/astp)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/astp?status.svg)](https://godoc.org/github.com/go-toolsmith/astp)
+[![Build Status](https://travis-ci.org/go-toolsmith/astp.svg?branch=master)](https://travis-ci.org/go-toolsmith/astp)
+
+
+# astp
+
+Package astp provides AST predicates.
+
+## Installation:
+
+```bash
+go get github.com/go-toolsmith/astp
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/go-toolsmith/astp"
+ "github.com/go-toolsmith/strparse"
+)
+
+func main() {
+ if astp.IsIdent(strparse.Expr(`x`)) {
+ fmt.Println("ident")
+ }
+ if astp.IsBlockStmt(strparse.Stmt(`{f()}`)) {
+ fmt.Println("block stmt")
+ }
+ if astp.IsGenDecl(strparse.Decl(`var x int = 10`)) {
+ fmt.Println("gen decl")
+ }
+}
+```
diff --git a/vendor/github.com/go-toolsmith/astp/decl.go b/vendor/github.com/go-toolsmith/astp/decl.go
new file mode 100644
index 00000000000..4654ad95cf9
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/decl.go
@@ -0,0 +1,39 @@
+package astp
+
+import "go/ast"
+
+// IsDecl reports whether a node is a ast.Decl.
+func IsDecl(node ast.Node) bool {
+ _, ok := node.(ast.Decl)
+ return ok
+}
+
+// IsFuncDecl reports whether a given ast.Node is a function declaration (*ast.FuncDecl).
+func IsFuncDecl(node ast.Node) bool {
+ _, ok := node.(*ast.FuncDecl)
+ return ok
+}
+
+// IsGenDecl reports whether a given ast.Node is a generic declaration (*ast.GenDecl).
+func IsGenDecl(node ast.Node) bool {
+ _, ok := node.(*ast.GenDecl)
+ return ok
+}
+
+// IsImportSpec reports whether a given ast.Node is an import declaration (*ast.ImportSpec).
+func IsImportSpec(node ast.Node) bool {
+ _, ok := node.(*ast.ImportSpec)
+ return ok
+}
+
+// IsValueSpec reports whether a given ast.Node is a value declaration (*ast.ValueSpec).
+func IsValueSpec(node ast.Node) bool {
+ _, ok := node.(*ast.ValueSpec)
+ return ok
+}
+
+// IsTypeSpec reports whether a given ast.Node is a type declaration (*ast.TypeSpec).
+func IsTypeSpec(node ast.Node) bool {
+ _, ok := node.(*ast.TypeSpec)
+ return ok
+}
diff --git a/vendor/github.com/go-toolsmith/astp/expr.go b/vendor/github.com/go-toolsmith/astp/expr.go
new file mode 100644
index 00000000000..adf9668ce2f
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/expr.go
@@ -0,0 +1,141 @@
+package astp
+
+import "go/ast"
+
+// IsExpr reports whether a given ast.Node is an expression(ast.Expr).
+func IsExpr(node ast.Node) bool {
+ _, ok := node.(ast.Expr)
+ return ok
+}
+
+// IsBadExpr reports whether a given ast.Node is a bad expression (*ast.IsBadExpr).
+func IsBadExpr(node ast.Node) bool {
+ _, ok := node.(*ast.BadExpr)
+ return ok
+}
+
+// IsIdent reports whether a given ast.Node is an identifier (*ast.IsIdent).
+func IsIdent(node ast.Node) bool {
+ _, ok := node.(*ast.Ident)
+ return ok
+}
+
+// IsEllipsis reports whether a given ast.Node is an `...` (ellipsis) (*ast.IsEllipsis).
+func IsEllipsis(node ast.Node) bool {
+ _, ok := node.(*ast.Ellipsis)
+ return ok
+}
+
+// IsBasicLit reports whether a given ast.Node is a literal of basic type (*ast.IsBasicLit).
+func IsBasicLit(node ast.Node) bool {
+ _, ok := node.(*ast.BasicLit)
+ return ok
+}
+
+// IsFuncLit reports whether a given ast.Node is a function literal (*ast.IsFuncLit).
+func IsFuncLit(node ast.Node) bool {
+ _, ok := node.(*ast.FuncLit)
+ return ok
+}
+
+// IsCompositeLit reports whether a given ast.Node is a composite literal (*ast.IsCompositeLit).
+func IsCompositeLit(node ast.Node) bool {
+ _, ok := node.(*ast.CompositeLit)
+ return ok
+}
+
+// IsParenExpr reports whether a given ast.Node is a parenthesized expression (*ast.IsParenExpr).
+func IsParenExpr(node ast.Node) bool {
+ _, ok := node.(*ast.ParenExpr)
+ return ok
+}
+
+// IsSelectorExpr reports whether a given ast.Node is a selector expression (*ast.IsSelectorExpr).
+func IsSelectorExpr(node ast.Node) bool {
+ _, ok := node.(*ast.SelectorExpr)
+ return ok
+}
+
+// IsIndexExpr reports whether a given ast.Node is an index expression (*ast.IsIndexExpr).
+func IsIndexExpr(node ast.Node) bool {
+ _, ok := node.(*ast.IndexExpr)
+ return ok
+}
+
+// IsSliceExpr reports whether a given ast.Node is a slice expression (*ast.IsSliceExpr).
+func IsSliceExpr(node ast.Node) bool {
+ _, ok := node.(*ast.SliceExpr)
+ return ok
+}
+
+// IsTypeAssertExpr reports whether a given ast.Node is a type assert expression (*ast.IsTypeAssertExpr).
+func IsTypeAssertExpr(node ast.Node) bool {
+ _, ok := node.(*ast.TypeAssertExpr)
+ return ok
+}
+
+// IsCallExpr reports whether a given ast.Node is an expression followed by an argument list (*ast.IsCallExpr).
+func IsCallExpr(node ast.Node) bool {
+ _, ok := node.(*ast.CallExpr)
+ return ok
+}
+
+// IsStarExpr reports whether a given ast.Node is a star expression(unary "*" or apointer) (*ast.IsStarExpr)
+func IsStarExpr(node ast.Node) bool {
+ _, ok := node.(*ast.StarExpr)
+ return ok
+}
+
+// IsUnaryExpr reports whether a given ast.Node is a unary expression (*ast.IsUnaryExpr).
+func IsUnaryExpr(node ast.Node) bool {
+ _, ok := node.(*ast.UnaryExpr)
+ return ok
+}
+
+// IsBinaryExpr reports whether a given ast.Node is a binary expression (*ast.IsBinaryExpr).
+func IsBinaryExpr(node ast.Node) bool {
+ _, ok := node.(*ast.BinaryExpr)
+ return ok
+}
+
+// IsKeyValueExpr reports whether a given ast.Node is a (key:value) pair (*ast.IsKeyValueExpr).
+func IsKeyValueExpr(node ast.Node) bool {
+ _, ok := node.(*ast.KeyValueExpr)
+ return ok
+}
+
+// IsArrayType reports whether a given ast.Node is an array or slice type (*ast.IsArrayType).
+func IsArrayType(node ast.Node) bool {
+ _, ok := node.(*ast.ArrayType)
+ return ok
+}
+
+// IsStructType reports whether a given ast.Node is a struct type (*ast.IsStructType).
+func IsStructType(node ast.Node) bool {
+ _, ok := node.(*ast.StructType)
+ return ok
+}
+
+// IsFuncType reports whether a given ast.Node is a function type (*ast.IsFuncType).
+func IsFuncType(node ast.Node) bool {
+ _, ok := node.(*ast.FuncType)
+ return ok
+}
+
+// IsInterfaceType reports whether a given ast.Node is an interface type (*ast.IsInterfaceType).
+func IsInterfaceType(node ast.Node) bool {
+ _, ok := node.(*ast.InterfaceType)
+ return ok
+}
+
+// IsMapType reports whether a given ast.Node is a map type (*ast.IsMapType).
+func IsMapType(node ast.Node) bool {
+ _, ok := node.(*ast.MapType)
+ return ok
+}
+
+// IsChanType reports whether a given ast.Node is a channel type (*ast.IsChanType).
+func IsChanType(node ast.Node) bool {
+ _, ok := node.(*ast.ChanType)
+ return ok
+}
diff --git a/vendor/github.com/go-toolsmith/astp/go.mod b/vendor/github.com/go-toolsmith/astp/go.mod
new file mode 100644
index 00000000000..32da1a33f75
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/go.mod
@@ -0,0 +1 @@
+module github.com/go-toolsmith/astp
diff --git a/vendor/github.com/go-toolsmith/astp/stmt.go b/vendor/github.com/go-toolsmith/astp/stmt.go
new file mode 100644
index 00000000000..19645d212e1
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/astp/stmt.go
@@ -0,0 +1,135 @@
+package astp
+
+import "go/ast"
+
+// IsStmt reports whether a given ast.Node is a statement(ast.Stmt).
+func IsStmt(node ast.Node) bool {
+ _, ok := node.(ast.Stmt)
+ return ok
+}
+
+// IsBadStmt reports whether a given ast.Node is a bad statement(*ast.BadStmt)
+func IsBadStmt(node ast.Node) bool {
+ _, ok := node.(*ast.BadStmt)
+ return ok
+}
+
+// IsDeclStmt reports whether a given ast.Node is a declaration statement(*ast.DeclStmt)
+func IsDeclStmt(node ast.Node) bool {
+ _, ok := node.(*ast.DeclStmt)
+ return ok
+}
+
+// IsEmptyStmt reports whether a given ast.Node is an empty statement(*ast.EmptyStmt)
+func IsEmptyStmt(node ast.Node) bool {
+ _, ok := node.(*ast.EmptyStmt)
+ return ok
+}
+
+// IsLabeledStmt reports whether a given ast.Node is a label statement(*ast.LabeledStmt)
+func IsLabeledStmt(node ast.Node) bool {
+ _, ok := node.(*ast.LabeledStmt)
+ return ok
+}
+
+// IsExprStmt reports whether a given ast.Node is an expression statement(*ast.ExprStmt)
+func IsExprStmt(node ast.Node) bool {
+ _, ok := node.(*ast.ExprStmt)
+ return ok
+}
+
+// IsSendStmt reports whether a given ast.Node is a send to chan statement(*ast.SendStmt)
+func IsSendStmt(node ast.Node) bool {
+ _, ok := node.(*ast.SendStmt)
+ return ok
+}
+
+// IsIncDecStmt reports whether a given ast.Node is a increment/decrement statement(*ast.IncDecStmt)
+func IsIncDecStmt(node ast.Node) bool {
+ _, ok := node.(*ast.IncDecStmt)
+ return ok
+}
+
+// IsAssignStmt reports whether a given ast.Node is an assignment statement(*ast.AssignStmt)
+func IsAssignStmt(node ast.Node) bool {
+ _, ok := node.(*ast.AssignStmt)
+ return ok
+}
+
+// IsGoStmt reports whether a given ast.Node is a go statement(*ast.GoStmt)
+func IsGoStmt(node ast.Node) bool {
+ _, ok := node.(*ast.GoStmt)
+ return ok
+}
+
+// IsDeferStmt reports whether a given ast.Node is a defer statement(*ast.DeferStmt)
+func IsDeferStmt(node ast.Node) bool {
+ _, ok := node.(*ast.DeferStmt)
+ return ok
+}
+
+// IsReturnStmt reports whether a given ast.Node is a return statement(*ast.ReturnStmt)
+func IsReturnStmt(node ast.Node) bool {
+ _, ok := node.(*ast.ReturnStmt)
+ return ok
+}
+
+// IsBranchStmt reports whether a given ast.Node is a branch(goto/continue/break/fallthrough)statement(*ast.BranchStmt)
+func IsBranchStmt(node ast.Node) bool {
+ _, ok := node.(*ast.BranchStmt)
+ return ok
+}
+
+// IsBlockStmt reports whether a given ast.Node is a block statement(*ast.BlockStmt)
+func IsBlockStmt(node ast.Node) bool {
+ _, ok := node.(*ast.BlockStmt)
+ return ok
+}
+
+// IsIfStmt reports whether a given ast.Node is an if statement(*ast.IfStmt)
+func IsIfStmt(node ast.Node) bool {
+ _, ok := node.(*ast.IfStmt)
+ return ok
+}
+
+// IsCaseClause reports whether a given ast.Node is a case statement(*ast.CaseClause)
+func IsCaseClause(node ast.Node) bool {
+ _, ok := node.(*ast.CaseClause)
+ return ok
+}
+
+// IsSwitchStmt reports whether a given ast.Node is a switch statement(*ast.SwitchStmt)
+func IsSwitchStmt(node ast.Node) bool {
+ _, ok := node.(*ast.SwitchStmt)
+ return ok
+}
+
+// IsTypeSwitchStmt reports whether a given ast.Node is a type switch statement(*ast.TypeSwitchStmt)
+func IsTypeSwitchStmt(node ast.Node) bool {
+ _, ok := node.(*ast.TypeSwitchStmt)
+ return ok
+}
+
+// IsCommClause reports whether a given ast.Node is a select statement(*ast.CommClause)
+func IsCommClause(node ast.Node) bool {
+ _, ok := node.(*ast.CommClause)
+ return ok
+}
+
+// IsSelectStmt reports whether a given ast.Node is a selection statement(*ast.SelectStmt)
+func IsSelectStmt(node ast.Node) bool {
+ _, ok := node.(*ast.SelectStmt)
+ return ok
+}
+
+// IsForStmt reports whether a given ast.Node is a for statement(*ast.ForStmt)
+func IsForStmt(node ast.Node) bool {
+ _, ok := node.(*ast.ForStmt)
+ return ok
+}
+
+// IsRangeStmt reports whether a given ast.Node is a range statement(*ast.RangeStmt)
+func IsRangeStmt(node ast.Node) bool {
+ _, ok := node.(*ast.RangeStmt)
+ return ok
+}
diff --git a/vendor/github.com/go-toolsmith/strparse/.travis.yml b/vendor/github.com/go-toolsmith/strparse/.travis.yml
new file mode 100644
index 00000000000..8994d395c61
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/strparse/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - 1.x
+install:
+ - # Prevent default install action "go get -t -v ./...".
+script:
+ - go get -t -v ./...
+ - go tool vet .
+ - go test -v -race ./...
\ No newline at end of file
diff --git a/vendor/github.com/go-toolsmith/strparse/LICENSE b/vendor/github.com/go-toolsmith/strparse/LICENSE
new file mode 100644
index 00000000000..eef17180f89
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/strparse/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 go-toolsmith
+
+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/go-toolsmith/strparse/README.md b/vendor/github.com/go-toolsmith/strparse/README.md
new file mode 100644
index 00000000000..ae80a5398a9
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/strparse/README.md
@@ -0,0 +1,34 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/strparse)](https://goreportcard.com/report/github.com/go-toolsmith/strparse)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/strparse?status.svg)](https://godoc.org/github.com/go-toolsmith/strparse)
+[![Build Status](https://travis-ci.org/go-toolsmith/strparse.svg?branch=master)](https://travis-ci.org/go-toolsmith/strparse)
+
+
+# strparse
+
+Package strparse provides convenience wrappers around `go/parser` for simple
+expression, statement and declaretion parsing from string.
+
+## Installation
+
+```bash
+go get github.com/go-toolsmith/strparse
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "go-toolsmith/astequal"
+ "go-toolsmith/strparse"
+)
+
+func main() {
+ // Comparing AST strings for equallity (note different spacing):
+ x := strparse.Expr(`1 + f(v[0].X)`)
+ y := strparse.Expr(` 1+f( v[0].X ) `)
+ fmt.Println(astequal.Expr(x, y)) // => true
+}
+
+```
diff --git a/vendor/github.com/go-toolsmith/strparse/go.mod b/vendor/github.com/go-toolsmith/strparse/go.mod
new file mode 100644
index 00000000000..ed9d8813666
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/strparse/go.mod
@@ -0,0 +1 @@
+module github.com/go-toolsmith/strparse
diff --git a/vendor/github.com/go-toolsmith/strparse/strparse.go b/vendor/github.com/go-toolsmith/strparse/strparse.go
new file mode 100644
index 00000000000..894c7ebac34
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/strparse/strparse.go
@@ -0,0 +1,59 @@
+// Package strparse provides convenience wrappers around `go/parser` for simple
+// expression, statement and declaration parsing from string.
+//
+// Can be used to construct AST nodes using source syntax.
+package strparse
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+)
+
+var (
+ // BadExpr is returned as a parse result for malformed expressions.
+ // Should be treated as constant or readonly variable.
+ BadExpr = &ast.BadExpr{}
+
+ // BadStmt is returned as a parse result for malformed statmenents.
+ // Should be treated as constant or readonly variable.
+ BadStmt = &ast.BadStmt{}
+
+ // BadDecl is returned as a parse result for malformed declarations.
+ // Should be treated as constant or readonly variable.
+ BadDecl = &ast.BadDecl{}
+)
+
+// Expr parses single expression node from s.
+// In case of parse error, BadExpr is returned.
+func Expr(s string) ast.Expr {
+ node, err := parser.ParseExpr(s)
+ if err != nil {
+ return BadExpr
+ }
+ return node
+}
+
+// Stmt parses single statement node from s.
+// In case of parse error, BadStmt is returned.
+func Stmt(s string) ast.Stmt {
+ node, err := parser.ParseFile(token.NewFileSet(), "", "package main;func main() {"+s+"}", 0)
+ if err != nil {
+ return BadStmt
+ }
+ fn := node.Decls[0].(*ast.FuncDecl)
+ if len(fn.Body.List) != 1 {
+ return BadStmt
+ }
+ return fn.Body.List[0]
+}
+
+// Decl parses single declaration node from s.
+// In case of parse error, BadDecl is returned.
+func Decl(s string) ast.Decl {
+ node, err := parser.ParseFile(token.NewFileSet(), "", "package main;"+s, 0)
+ if err != nil || len(node.Decls) != 1 {
+ return BadDecl
+ }
+ return node.Decls[0]
+}
diff --git a/vendor/github.com/go-toolsmith/typep/LICENSE b/vendor/github.com/go-toolsmith/typep/LICENSE
new file mode 100644
index 00000000000..eef17180f89
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 go-toolsmith
+
+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/go-toolsmith/typep/README.md b/vendor/github.com/go-toolsmith/typep/README.md
new file mode 100644
index 00000000000..73665801280
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/README.md
@@ -0,0 +1,37 @@
+[![Go Report Card](https://goreportcard.com/badge/github.com/go-toolsmith/typep)](https://goreportcard.com/report/github.com/go-toolsmith/typep)
+[![GoDoc](https://godoc.org/github.com/go-toolsmith/typep?status.svg)](https://godoc.org/github.com/go-toolsmith/typep)
+
+
+# typep
+
+Package typep provides type predicates.
+
+## Installation:
+
+```bash
+go get -v github.com/go-toolsmith/typep
+```
+
+## Example
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/go-toolsmith/typep"
+ "github.com/go-toolsmith/strparse"
+)
+
+func main() {
+ floatTyp := types.Typ[types.Float32]
+ intTyp := types.Typ[types.Int]
+ ptr := types.NewPointer(intTyp)
+ arr := types.NewArray(intTyp, 64)
+ fmt.Println(typep.HasFloatProp(floatTyp)) // => true
+ fmt.Println(typep.HasFloatProp(intTyp)) // => false
+ fmt.Println(typep.IsPointer(ptr)) // => true
+ fmt.Println(typep.IsArray(arr)) // => true
+}
+```
diff --git a/vendor/github.com/go-toolsmith/typep/doc.go b/vendor/github.com/go-toolsmith/typep/doc.go
new file mode 100644
index 00000000000..990bc402c03
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/doc.go
@@ -0,0 +1,2 @@
+// Package typep provides type predicates.
+package typep
diff --git a/vendor/github.com/go-toolsmith/typep/predicates.go b/vendor/github.com/go-toolsmith/typep/predicates.go
new file mode 100644
index 00000000000..70e5b55cd17
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/predicates.go
@@ -0,0 +1,36 @@
+package typep
+
+import (
+ "go/ast"
+ "go/types"
+)
+
+// IsTypeExpr reports whether x represents a type expression.
+//
+// Type expression does not evaluate to any run time value,
+// but rather describes a type that is used inside Go expression.
+//
+// For example, (*T)(v) is a CallExpr that "calls" (*T).
+// (*T) is a type expression that tells Go compiler type v should be converted to.
+func IsTypeExpr(info *types.Info, x ast.Expr) bool {
+ switch x := x.(type) {
+ case *ast.StarExpr:
+ return IsTypeExpr(info, x.X)
+ case *ast.ParenExpr:
+ return IsTypeExpr(info, x.X)
+ case *ast.SelectorExpr:
+ return IsTypeExpr(info, x.Sel)
+
+ case *ast.Ident:
+ // Identifier may be a type expression if object
+ // it reffers to is a type name.
+ _, ok := info.ObjectOf(x).(*types.TypeName)
+ return ok
+
+ case *ast.FuncType, *ast.StructType, *ast.InterfaceType, *ast.ArrayType, *ast.MapType:
+ return true
+
+ default:
+ return false
+ }
+}
diff --git a/vendor/github.com/go-toolsmith/typep/safeExpr.go b/vendor/github.com/go-toolsmith/typep/safeExpr.go
new file mode 100644
index 00000000000..7236e6e037e
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/safeExpr.go
@@ -0,0 +1,62 @@
+package typep
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// SideEffectFree reports whether expr is softly safe expression and contains
+// no significant side-effects. As opposed to strictly safe expressions,
+// soft safe expressions permit some forms of side-effects, like
+// panic possibility during indexing or nil pointer dereference.
+//
+// Uses types info to determine type conversion expressions that
+// are the only permitted kinds of call expressions.
+// Note that is does not check whether called function really
+// has any side effects. The analysis is very conservative.
+func SideEffectFree(info *types.Info, expr ast.Expr) bool {
+ // This list switch is not comprehensive and uses
+ // whitelist to be on the conservative side.
+ // Can be extended as needed.
+
+ switch expr := expr.(type) {
+ case *ast.StarExpr:
+ return SideEffectFree(info, expr.X)
+ case *ast.BinaryExpr:
+ return SideEffectFree(info, expr.X) &&
+ SideEffectFree(info, expr.Y)
+ case *ast.UnaryExpr:
+ return expr.Op != token.ARROW &&
+ SideEffectFree(info, expr.X)
+ case *ast.BasicLit, *ast.Ident:
+ return true
+ case *ast.IndexExpr:
+ return SideEffectFree(info, expr.X) &&
+ SideEffectFree(info, expr.Index)
+ case *ast.SelectorExpr:
+ return SideEffectFree(info, expr.X)
+ case *ast.ParenExpr:
+ return SideEffectFree(info, expr.X)
+ case *ast.CompositeLit:
+ return SideEffectFreeList(info, expr.Elts)
+ case *ast.CallExpr:
+ return IsTypeExpr(info, expr.Fun) &&
+ SideEffectFreeList(info, expr.Args)
+
+ default:
+ return false
+ }
+}
+
+// SideEffectFreeList reports whether every expr in list is safe.
+//
+// See SideEffectFree.
+func SideEffectFreeList(info *types.Info, list []ast.Expr) bool {
+ for _, expr := range list {
+ if !SideEffectFree(info, expr) {
+ return false
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/go-toolsmith/typep/simplePredicates.go b/vendor/github.com/go-toolsmith/typep/simplePredicates.go
new file mode 100644
index 00000000000..3bc9c29c8fa
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/simplePredicates.go
@@ -0,0 +1,359 @@
+// Code generated by simplePredicates_generate.go; DO NOT EDIT
+
+package typep
+
+import (
+ "go/types"
+)
+
+// Simple 1-to-1 type predicates via type assertion.
+
+// IsBasic reports whether a given type has *types.Basic type.
+func IsBasic(typ types.Type) bool {
+ _, ok := typ.(*types.Basic)
+ return ok
+}
+
+// IsArray reports whether a given type has *types.Array type.
+func IsArray(typ types.Type) bool {
+ _, ok := typ.(*types.Array)
+ return ok
+}
+
+// IsSlice reports whether a given type has *types.Slice type.
+func IsSlice(typ types.Type) bool {
+ _, ok := typ.(*types.Slice)
+ return ok
+}
+
+// IsStruct reports whether a given type has *types.Struct type.
+func IsStruct(typ types.Type) bool {
+ _, ok := typ.(*types.Struct)
+ return ok
+}
+
+// IsPointer reports whether a given type has *types.Pointer type.
+func IsPointer(typ types.Type) bool {
+ _, ok := typ.(*types.Pointer)
+ return ok
+}
+
+// IsTuple reports whether a given type has *types.Tuple type.
+func IsTuple(typ types.Type) bool {
+ _, ok := typ.(*types.Tuple)
+ return ok
+}
+
+// IsSignature reports whether a given type has *types.Signature type.
+func IsSignature(typ types.Type) bool {
+ _, ok := typ.(*types.Signature)
+ return ok
+}
+
+// IsInterface reports whether a given type has *types.Interface type.
+func IsInterface(typ types.Type) bool {
+ _, ok := typ.(*types.Interface)
+ return ok
+}
+
+// IsMap reports whether a given type has *types.Map type.
+func IsMap(typ types.Type) bool {
+ _, ok := typ.(*types.Map)
+ return ok
+}
+
+// IsChan reports whether a given type has *types.Chan type.
+func IsChan(typ types.Type) bool {
+ _, ok := typ.(*types.Chan)
+ return ok
+}
+
+// IsNamed reports whether a given type has *types.Named type.
+func IsNamed(typ types.Type) bool {
+ _, ok := typ.(*types.Named)
+ return ok
+}
+
+// *types.Basic predicates for the info field.
+
+// HasBooleanProp reports whether typ is a *types.Basic has IsBoolean property.
+func HasBooleanProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsBoolean != 0
+ }
+ return false
+}
+
+// HasIntegerProp reports whether typ is a *types.Basic has IsInteger property.
+func HasIntegerProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsInteger != 0
+ }
+ return false
+}
+
+// HasUnsignedProp reports whether typ is a *types.Basic has IsUnsigned property.
+func HasUnsignedProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsUnsigned != 0
+ }
+ return false
+}
+
+// HasFloatProp reports whether typ is a *types.Basic has IsFloat property.
+func HasFloatProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsFloat != 0
+ }
+ return false
+}
+
+// HasComplexProp reports whether typ is a *types.Basic has IsComplex property.
+func HasComplexProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsComplex != 0
+ }
+ return false
+}
+
+// HasStringProp reports whether typ is a *types.Basic has IsString property.
+func HasStringProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsString != 0
+ }
+ return false
+}
+
+// HasUntypedProp reports whether typ is a *types.Basic has IsUntyped property.
+func HasUntypedProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsUntyped != 0
+ }
+ return false
+}
+
+// HasOrderedProp reports whether typ is a *types.Basic has IsOrdered property.
+func HasOrderedProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsOrdered != 0
+ }
+ return false
+}
+
+// HasNumericProp reports whether typ is a *types.Basic has IsNumeric property.
+func HasNumericProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsNumeric != 0
+ }
+ return false
+}
+
+// HasConstTypeProp reports whether typ is a *types.Basic has IsConstType property.
+func HasConstTypeProp(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.IsConstType != 0
+ }
+ return false
+}
+
+// *types.Basic predicates for the kind field.
+
+// HasBoolKind reports whether typ is a *types.Basic with its kind set to types.Bool.
+func HasBoolKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Bool
+ }
+ return false
+}
+
+// HasIntKind reports whether typ is a *types.Basic with its kind set to types.Int.
+func HasIntKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Int
+ }
+ return false
+}
+
+// HasInt8Kind reports whether typ is a *types.Basic with its kind set to types.Int8.
+func HasInt8Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Int8
+ }
+ return false
+}
+
+// HasInt16Kind reports whether typ is a *types.Basic with its kind set to types.Int16.
+func HasInt16Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Int16
+ }
+ return false
+}
+
+// HasInt32Kind reports whether typ is a *types.Basic with its kind set to types.Int32.
+func HasInt32Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Int32
+ }
+ return false
+}
+
+// HasInt64Kind reports whether typ is a *types.Basic with its kind set to types.Int64.
+func HasInt64Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Int64
+ }
+ return false
+}
+
+// HasUintKind reports whether typ is a *types.Basic with its kind set to types.Uint.
+func HasUintKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Uint
+ }
+ return false
+}
+
+// HasUint8Kind reports whether typ is a *types.Basic with its kind set to types.Uint8.
+func HasUint8Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Uint8
+ }
+ return false
+}
+
+// HasUint16Kind reports whether typ is a *types.Basic with its kind set to types.Uint16.
+func HasUint16Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Uint16
+ }
+ return false
+}
+
+// HasUint32Kind reports whether typ is a *types.Basic with its kind set to types.Uint32.
+func HasUint32Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Uint32
+ }
+ return false
+}
+
+// HasUint64Kind reports whether typ is a *types.Basic with its kind set to types.Uint64.
+func HasUint64Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Uint64
+ }
+ return false
+}
+
+// HasUintptrKind reports whether typ is a *types.Basic with its kind set to types.Uintptr.
+func HasUintptrKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Uintptr
+ }
+ return false
+}
+
+// HasFloat32Kind reports whether typ is a *types.Basic with its kind set to types.Float32.
+func HasFloat32Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Float32
+ }
+ return false
+}
+
+// HasFloat64Kind reports whether typ is a *types.Basic with its kind set to types.Float64.
+func HasFloat64Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Float64
+ }
+ return false
+}
+
+// HasComplex64Kind reports whether typ is a *types.Basic with its kind set to types.Complex64.
+func HasComplex64Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Complex64
+ }
+ return false
+}
+
+// HasComplex128Kind reports whether typ is a *types.Basic with its kind set to types.Complex128.
+func HasComplex128Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.Complex128
+ }
+ return false
+}
+
+// HasStringKind reports whether typ is a *types.Basic with its kind set to types.String.
+func HasStringKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.String
+ }
+ return false
+}
+
+// HasUnsafePointerKind reports whether typ is a *types.Basic with its kind set to types.UnsafePointer.
+func HasUnsafePointerKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UnsafePointer
+ }
+ return false
+}
+
+// HasUntypedBoolKind reports whether typ is a *types.Basic with its kind set to types.UntypedBool.
+func HasUntypedBoolKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedBool
+ }
+ return false
+}
+
+// HasUntypedIntKind reports whether typ is a *types.Basic with its kind set to types.UntypedInt.
+func HasUntypedIntKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedInt
+ }
+ return false
+}
+
+// HasUntypedRuneKind reports whether typ is a *types.Basic with its kind set to types.UntypedRune.
+func HasUntypedRuneKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedRune
+ }
+ return false
+}
+
+// HasUntypedFloatKind reports whether typ is a *types.Basic with its kind set to types.UntypedFloat.
+func HasUntypedFloatKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedFloat
+ }
+ return false
+}
+
+// HasUntypedComplexKind reports whether typ is a *types.Basic with its kind set to types.UntypedComplex.
+func HasUntypedComplexKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedComplex
+ }
+ return false
+}
+
+// HasUntypedStringKind reports whether typ is a *types.Basic with its kind set to types.UntypedString.
+func HasUntypedStringKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedString
+ }
+ return false
+}
+
+// HasUntypedNilKind reports whether typ is a *types.Basic with its kind set to types.UntypedNil.
+func HasUntypedNilKind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.UntypedNil
+ }
+ return false
+}
diff --git a/vendor/github.com/go-toolsmith/typep/simplePredicates_generate.go b/vendor/github.com/go-toolsmith/typep/simplePredicates_generate.go
new file mode 100644
index 00000000000..c0408378e62
--- /dev/null
+++ b/vendor/github.com/go-toolsmith/typep/simplePredicates_generate.go
@@ -0,0 +1,140 @@
+// +build ignore
+
+package main
+
+import (
+ "bytes"
+ "go/format"
+ "io"
+ "log"
+ "os"
+ "text/template"
+)
+
+type types struct {
+ BasicKinds []string
+ BasicProps []string
+ Types []string
+}
+
+func main() {
+ typesList := types{
+ BasicKinds: []string{
+ "Bool",
+ "Int",
+ "Int8",
+ "Int16",
+ "Int32",
+ "Int64",
+ "Uint",
+ "Uint8",
+ "Uint16",
+ "Uint32",
+ "Uint64",
+ "Uintptr",
+ "Float32",
+ "Float64",
+ "Complex64",
+ "Complex128",
+ "String",
+ "UnsafePointer",
+ "UntypedBool",
+ "UntypedInt",
+ "UntypedRune",
+ "UntypedFloat",
+ "UntypedComplex",
+ "UntypedString",
+ "UntypedNil",
+ },
+
+ BasicProps: []string{
+ "Boolean",
+ "Integer",
+ "Unsigned",
+ "Float",
+ "Complex",
+ "String",
+ "Untyped",
+ "Ordered",
+ "Numeric",
+ "ConstType",
+ },
+
+ Types: []string{
+ "Basic",
+ "Array",
+ "Slice",
+ "Struct",
+ "Pointer",
+ "Tuple",
+ "Signature",
+ "Interface",
+ "Map",
+ "Chan",
+ "Named",
+ },
+ }
+
+ simplePredicateFile, err := os.Create("simplePredicates.go")
+ if err != nil {
+ log.Fatal(err)
+ }
+ writeCode(simplePredicateFile, typesList)
+}
+
+func generateCode(tmplText string, typeList types) []byte {
+ tmpl := template.Must(template.New("code").Parse(tmplText))
+ var code bytes.Buffer
+ tmpl.Execute(&code, typeList)
+ prettyCode, err := format.Source(code.Bytes())
+ if err != nil {
+ panic(err)
+ }
+ return prettyCode
+}
+
+func writeCode(output io.Writer, typeList types) {
+ code := generateCode(`// Code generated by simplePredicates_generate.go; DO NOT EDIT
+
+package typep
+
+import (
+ "go/types"
+)
+
+// Simple 1-to-1 type predicates via type assertion.
+
+{{ range .Types }}
+// Is{{.}} reports whether a given type has *types.{{.}} type.
+func Is{{.}}(typ types.Type) bool {
+ _, ok := typ.(*types.{{.}})
+ return ok
+}
+{{ end }}
+
+// *types.Basic predicates for the info field.
+
+{{ range .BasicProps }}
+// Has{{.}}Prop reports whether typ is a *types.Basic has Is{{.}} property.
+func Has{{.}}Prop(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Info()&types.Is{{.}} != 0
+ }
+ return false
+}
+{{ end }}
+
+// *types.Basic predicates for the kind field.
+
+{{ range .BasicKinds }}
+// Has{{.}}Kind reports whether typ is a *types.Basic with its kind set to types.{{.}}.
+func Has{{.}}Kind(typ types.Type) bool {
+ if typ, ok := typ.(*types.Basic); ok {
+ return typ.Kind() == types.{{.}}
+ }
+ return false
+}
+{{ end }}
+`, typeList)
+ output.Write(code)
+}
diff --git a/vendor/github.com/gobwas/glob/.gitignore b/vendor/github.com/gobwas/glob/.gitignore
new file mode 100644
index 00000000000..b4ae623be55
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/.gitignore
@@ -0,0 +1,8 @@
+glob.iml
+.idea
+*.cpu
+*.mem
+*.test
+*.dot
+*.png
+*.svg
diff --git a/vendor/github.com/gobwas/glob/.travis.yml b/vendor/github.com/gobwas/glob/.travis.yml
new file mode 100644
index 00000000000..e8a276826cf
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/.travis.yml
@@ -0,0 +1,9 @@
+sudo: false
+
+language: go
+
+go:
+ - 1.5.3
+
+script:
+ - go test -v ./...
diff --git a/vendor/github.com/gobwas/glob/LICENSE b/vendor/github.com/gobwas/glob/LICENSE
new file mode 100644
index 00000000000..9d4735cad9f
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Sergey Kamardin
+
+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.
\ No newline at end of file
diff --git a/vendor/github.com/gobwas/glob/bench.sh b/vendor/github.com/gobwas/glob/bench.sh
new file mode 100644
index 00000000000..804cf22e646
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/bench.sh
@@ -0,0 +1,26 @@
+#! /bin/bash
+
+bench() {
+ filename="/tmp/$1-$2.bench"
+ if test -e "${filename}";
+ then
+ echo "Already exists ${filename}"
+ else
+ backup=`git rev-parse --abbrev-ref HEAD`
+ git checkout $1
+ echo -n "Creating ${filename}... "
+ go test ./... -run=NONE -bench=$2 > "${filename}" -benchmem
+ echo "OK"
+ git checkout ${backup}
+ sleep 5
+ fi
+}
+
+
+to=$1
+current=`git rev-parse --abbrev-ref HEAD`
+
+bench ${to} $2
+bench ${current} $2
+
+benchcmp $3 "/tmp/${to}-$2.bench" "/tmp/${current}-$2.bench"
diff --git a/vendor/github.com/gobwas/glob/compiler/compiler.go b/vendor/github.com/gobwas/glob/compiler/compiler.go
new file mode 100644
index 00000000000..02e7de80a0b
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/compiler/compiler.go
@@ -0,0 +1,525 @@
+package compiler
+
+// TODO use constructor with all matchers, and to their structs private
+// TODO glue multiple Text nodes (like after QuoteMeta)
+
+import (
+ "fmt"
+ "reflect"
+
+ "github.com/gobwas/glob/match"
+ "github.com/gobwas/glob/syntax/ast"
+ "github.com/gobwas/glob/util/runes"
+)
+
+func optimizeMatcher(matcher match.Matcher) match.Matcher {
+ switch m := matcher.(type) {
+
+ case match.Any:
+ if len(m.Separators) == 0 {
+ return match.NewSuper()
+ }
+
+ case match.AnyOf:
+ if len(m.Matchers) == 1 {
+ return m.Matchers[0]
+ }
+
+ return m
+
+ case match.List:
+ if m.Not == false && len(m.List) == 1 {
+ return match.NewText(string(m.List))
+ }
+
+ return m
+
+ case match.BTree:
+ m.Left = optimizeMatcher(m.Left)
+ m.Right = optimizeMatcher(m.Right)
+
+ r, ok := m.Value.(match.Text)
+ if !ok {
+ return m
+ }
+
+ var (
+ leftNil = m.Left == nil
+ rightNil = m.Right == nil
+ )
+ if leftNil && rightNil {
+ return match.NewText(r.Str)
+ }
+
+ _, leftSuper := m.Left.(match.Super)
+ lp, leftPrefix := m.Left.(match.Prefix)
+ la, leftAny := m.Left.(match.Any)
+
+ _, rightSuper := m.Right.(match.Super)
+ rs, rightSuffix := m.Right.(match.Suffix)
+ ra, rightAny := m.Right.(match.Any)
+
+ switch {
+ case leftSuper && rightSuper:
+ return match.NewContains(r.Str, false)
+
+ case leftSuper && rightNil:
+ return match.NewSuffix(r.Str)
+
+ case rightSuper && leftNil:
+ return match.NewPrefix(r.Str)
+
+ case leftNil && rightSuffix:
+ return match.NewPrefixSuffix(r.Str, rs.Suffix)
+
+ case rightNil && leftPrefix:
+ return match.NewPrefixSuffix(lp.Prefix, r.Str)
+
+ case rightNil && leftAny:
+ return match.NewSuffixAny(r.Str, la.Separators)
+
+ case leftNil && rightAny:
+ return match.NewPrefixAny(r.Str, ra.Separators)
+ }
+
+ return m
+ }
+
+ return matcher
+}
+
+func compileMatchers(matchers []match.Matcher) (match.Matcher, error) {
+ if len(matchers) == 0 {
+ return nil, fmt.Errorf("compile error: need at least one matcher")
+ }
+ if len(matchers) == 1 {
+ return matchers[0], nil
+ }
+ if m := glueMatchers(matchers); m != nil {
+ return m, nil
+ }
+
+ idx := -1
+ maxLen := -1
+ var val match.Matcher
+ for i, matcher := range matchers {
+ if l := matcher.Len(); l != -1 && l >= maxLen {
+ maxLen = l
+ idx = i
+ val = matcher
+ }
+ }
+
+ if val == nil { // not found matcher with static length
+ r, err := compileMatchers(matchers[1:])
+ if err != nil {
+ return nil, err
+ }
+ return match.NewBTree(matchers[0], nil, r), nil
+ }
+
+ left := matchers[:idx]
+ var right []match.Matcher
+ if len(matchers) > idx+1 {
+ right = matchers[idx+1:]
+ }
+
+ var l, r match.Matcher
+ var err error
+ if len(left) > 0 {
+ l, err = compileMatchers(left)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ if len(right) > 0 {
+ r, err = compileMatchers(right)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return match.NewBTree(val, l, r), nil
+}
+
+func glueMatchers(matchers []match.Matcher) match.Matcher {
+ if m := glueMatchersAsEvery(matchers); m != nil {
+ return m
+ }
+ if m := glueMatchersAsRow(matchers); m != nil {
+ return m
+ }
+ return nil
+}
+
+func glueMatchersAsRow(matchers []match.Matcher) match.Matcher {
+ if len(matchers) <= 1 {
+ return nil
+ }
+
+ var (
+ c []match.Matcher
+ l int
+ )
+ for _, matcher := range matchers {
+ if ml := matcher.Len(); ml == -1 {
+ return nil
+ } else {
+ c = append(c, matcher)
+ l += ml
+ }
+ }
+ return match.NewRow(l, c...)
+}
+
+func glueMatchersAsEvery(matchers []match.Matcher) match.Matcher {
+ if len(matchers) <= 1 {
+ return nil
+ }
+
+ var (
+ hasAny bool
+ hasSuper bool
+ hasSingle bool
+ min int
+ separator []rune
+ )
+
+ for i, matcher := range matchers {
+ var sep []rune
+
+ switch m := matcher.(type) {
+ case match.Super:
+ sep = []rune{}
+ hasSuper = true
+
+ case match.Any:
+ sep = m.Separators
+ hasAny = true
+
+ case match.Single:
+ sep = m.Separators
+ hasSingle = true
+ min++
+
+ case match.List:
+ if !m.Not {
+ return nil
+ }
+ sep = m.List
+ hasSingle = true
+ min++
+
+ default:
+ return nil
+ }
+
+ // initialize
+ if i == 0 {
+ separator = sep
+ }
+
+ if runes.Equal(sep, separator) {
+ continue
+ }
+
+ return nil
+ }
+
+ if hasSuper && !hasAny && !hasSingle {
+ return match.NewSuper()
+ }
+
+ if hasAny && !hasSuper && !hasSingle {
+ return match.NewAny(separator)
+ }
+
+ if (hasAny || hasSuper) && min > 0 && len(separator) == 0 {
+ return match.NewMin(min)
+ }
+
+ every := match.NewEveryOf()
+
+ if min > 0 {
+ every.Add(match.NewMin(min))
+
+ if !hasAny && !hasSuper {
+ every.Add(match.NewMax(min))
+ }
+ }
+
+ if len(separator) > 0 {
+ every.Add(match.NewContains(string(separator), true))
+ }
+
+ return every
+}
+
+func minimizeMatchers(matchers []match.Matcher) []match.Matcher {
+ var done match.Matcher
+ var left, right, count int
+
+ for l := 0; l < len(matchers); l++ {
+ for r := len(matchers); r > l; r-- {
+ if glued := glueMatchers(matchers[l:r]); glued != nil {
+ var swap bool
+
+ if done == nil {
+ swap = true
+ } else {
+ cl, gl := done.Len(), glued.Len()
+ swap = cl > -1 && gl > -1 && gl > cl
+ swap = swap || count < r-l
+ }
+
+ if swap {
+ done = glued
+ left = l
+ right = r
+ count = r - l
+ }
+ }
+ }
+ }
+
+ if done == nil {
+ return matchers
+ }
+
+ next := append(append([]match.Matcher{}, matchers[:left]...), done)
+ if right < len(matchers) {
+ next = append(next, matchers[right:]...)
+ }
+
+ if len(next) == len(matchers) {
+ return next
+ }
+
+ return minimizeMatchers(next)
+}
+
+// minimizeAnyOf tries to apply some heuristics to minimize number of nodes in given tree
+func minimizeTree(tree *ast.Node) *ast.Node {
+ switch tree.Kind {
+ case ast.KindAnyOf:
+ return minimizeTreeAnyOf(tree)
+ default:
+ return nil
+ }
+}
+
+// minimizeAnyOf tries to find common children of given node of AnyOf pattern
+// it searches for common children from left and from right
+// if any common children are found – then it returns new optimized ast tree
+// else it returns nil
+func minimizeTreeAnyOf(tree *ast.Node) *ast.Node {
+ if !areOfSameKind(tree.Children, ast.KindPattern) {
+ return nil
+ }
+
+ commonLeft, commonRight := commonChildren(tree.Children)
+ commonLeftCount, commonRightCount := len(commonLeft), len(commonRight)
+ if commonLeftCount == 0 && commonRightCount == 0 { // there are no common parts
+ return nil
+ }
+
+ var result []*ast.Node
+ if commonLeftCount > 0 {
+ result = append(result, ast.NewNode(ast.KindPattern, nil, commonLeft...))
+ }
+
+ var anyOf []*ast.Node
+ for _, child := range tree.Children {
+ reuse := child.Children[commonLeftCount : len(child.Children)-commonRightCount]
+ var node *ast.Node
+ if len(reuse) == 0 {
+ // this pattern is completely reduced by commonLeft and commonRight patterns
+ // so it become nothing
+ node = ast.NewNode(ast.KindNothing, nil)
+ } else {
+ node = ast.NewNode(ast.KindPattern, nil, reuse...)
+ }
+ anyOf = appendIfUnique(anyOf, node)
+ }
+ switch {
+ case len(anyOf) == 1 && anyOf[0].Kind != ast.KindNothing:
+ result = append(result, anyOf[0])
+ case len(anyOf) > 1:
+ result = append(result, ast.NewNode(ast.KindAnyOf, nil, anyOf...))
+ }
+
+ if commonRightCount > 0 {
+ result = append(result, ast.NewNode(ast.KindPattern, nil, commonRight...))
+ }
+
+ return ast.NewNode(ast.KindPattern, nil, result...)
+}
+
+func commonChildren(nodes []*ast.Node) (commonLeft, commonRight []*ast.Node) {
+ if len(nodes) <= 1 {
+ return
+ }
+
+ // find node that has least number of children
+ idx := leastChildren(nodes)
+ if idx == -1 {
+ return
+ }
+ tree := nodes[idx]
+ treeLength := len(tree.Children)
+
+ // allocate max able size for rightCommon slice
+ // to get ability insert elements in reverse order (from end to start)
+ // without sorting
+ commonRight = make([]*ast.Node, treeLength)
+ lastRight := treeLength // will use this to get results as commonRight[lastRight:]
+
+ var (
+ breakLeft bool
+ breakRight bool
+ commonTotal int
+ )
+ for i, j := 0, treeLength-1; commonTotal < treeLength && j >= 0 && !(breakLeft && breakRight); i, j = i+1, j-1 {
+ treeLeft := tree.Children[i]
+ treeRight := tree.Children[j]
+
+ for k := 0; k < len(nodes) && !(breakLeft && breakRight); k++ {
+ // skip least children node
+ if k == idx {
+ continue
+ }
+
+ restLeft := nodes[k].Children[i]
+ restRight := nodes[k].Children[j+len(nodes[k].Children)-treeLength]
+
+ breakLeft = breakLeft || !treeLeft.Equal(restLeft)
+
+ // disable searching for right common parts, if left part is already overlapping
+ breakRight = breakRight || (!breakLeft && j <= i)
+ breakRight = breakRight || !treeRight.Equal(restRight)
+ }
+
+ if !breakLeft {
+ commonTotal++
+ commonLeft = append(commonLeft, treeLeft)
+ }
+ if !breakRight {
+ commonTotal++
+ lastRight = j
+ commonRight[j] = treeRight
+ }
+ }
+
+ commonRight = commonRight[lastRight:]
+
+ return
+}
+
+func appendIfUnique(target []*ast.Node, val *ast.Node) []*ast.Node {
+ for _, n := range target {
+ if reflect.DeepEqual(n, val) {
+ return target
+ }
+ }
+ return append(target, val)
+}
+
+func areOfSameKind(nodes []*ast.Node, kind ast.Kind) bool {
+ for _, n := range nodes {
+ if n.Kind != kind {
+ return false
+ }
+ }
+ return true
+}
+
+func leastChildren(nodes []*ast.Node) int {
+ min := -1
+ idx := -1
+ for i, n := range nodes {
+ if idx == -1 || (len(n.Children) < min) {
+ min = len(n.Children)
+ idx = i
+ }
+ }
+ return idx
+}
+
+func compileTreeChildren(tree *ast.Node, sep []rune) ([]match.Matcher, error) {
+ var matchers []match.Matcher
+ for _, desc := range tree.Children {
+ m, err := compile(desc, sep)
+ if err != nil {
+ return nil, err
+ }
+ matchers = append(matchers, optimizeMatcher(m))
+ }
+ return matchers, nil
+}
+
+func compile(tree *ast.Node, sep []rune) (m match.Matcher, err error) {
+ switch tree.Kind {
+ case ast.KindAnyOf:
+ // todo this could be faster on pattern_alternatives_combine_lite (see glob_test.go)
+ if n := minimizeTree(tree); n != nil {
+ return compile(n, sep)
+ }
+ matchers, err := compileTreeChildren(tree, sep)
+ if err != nil {
+ return nil, err
+ }
+ return match.NewAnyOf(matchers...), nil
+
+ case ast.KindPattern:
+ if len(tree.Children) == 0 {
+ return match.NewNothing(), nil
+ }
+ matchers, err := compileTreeChildren(tree, sep)
+ if err != nil {
+ return nil, err
+ }
+ m, err = compileMatchers(minimizeMatchers(matchers))
+ if err != nil {
+ return nil, err
+ }
+
+ case ast.KindAny:
+ m = match.NewAny(sep)
+
+ case ast.KindSuper:
+ m = match.NewSuper()
+
+ case ast.KindSingle:
+ m = match.NewSingle(sep)
+
+ case ast.KindNothing:
+ m = match.NewNothing()
+
+ case ast.KindList:
+ l := tree.Value.(ast.List)
+ m = match.NewList([]rune(l.Chars), l.Not)
+
+ case ast.KindRange:
+ r := tree.Value.(ast.Range)
+ m = match.NewRange(r.Lo, r.Hi, r.Not)
+
+ case ast.KindText:
+ t := tree.Value.(ast.Text)
+ m = match.NewText(t.Text)
+
+ default:
+ return nil, fmt.Errorf("could not compile tree: unknown node type")
+ }
+
+ return optimizeMatcher(m), nil
+}
+
+func Compile(tree *ast.Node, sep []rune) (match.Matcher, error) {
+ m, err := compile(tree, sep)
+ if err != nil {
+ return nil, err
+ }
+
+ return m, nil
+}
diff --git a/vendor/github.com/gobwas/glob/glob.go b/vendor/github.com/gobwas/glob/glob.go
new file mode 100644
index 00000000000..2afde343af8
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/glob.go
@@ -0,0 +1,80 @@
+package glob
+
+import (
+ "github.com/gobwas/glob/compiler"
+ "github.com/gobwas/glob/syntax"
+)
+
+// Glob represents compiled glob pattern.
+type Glob interface {
+ Match(string) bool
+}
+
+// Compile creates Glob for given pattern and strings (if any present after pattern) as separators.
+// The pattern syntax is:
+//
+// pattern:
+// { term }
+//
+// term:
+// `*` matches any sequence of non-separator characters
+// `**` matches any sequence of characters
+// `?` matches any single non-separator character
+// `[` [ `!` ] { character-range } `]`
+// character class (must be non-empty)
+// `{` pattern-list `}`
+// pattern alternatives
+// c matches character c (c != `*`, `**`, `?`, `\`, `[`, `{`, `}`)
+// `\` c matches character c
+//
+// character-range:
+// c matches character c (c != `\\`, `-`, `]`)
+// `\` c matches character c
+// lo `-` hi matches character c for lo <= c <= hi
+//
+// pattern-list:
+// pattern { `,` pattern }
+// comma-separated (without spaces) patterns
+//
+func Compile(pattern string, separators ...rune) (Glob, error) {
+ ast, err := syntax.Parse(pattern)
+ if err != nil {
+ return nil, err
+ }
+
+ matcher, err := compiler.Compile(ast, separators)
+ if err != nil {
+ return nil, err
+ }
+
+ return matcher, nil
+}
+
+// MustCompile is the same as Compile, except that if Compile returns error, this will panic
+func MustCompile(pattern string, separators ...rune) Glob {
+ g, err := Compile(pattern, separators...)
+ if err != nil {
+ panic(err)
+ }
+
+ return g
+}
+
+// QuoteMeta returns a string that quotes all glob pattern meta characters
+// inside the argument text; For example, QuoteMeta(`{foo*}`) returns `\[foo\*\]`.
+func QuoteMeta(s string) string {
+ b := make([]byte, 2*len(s))
+
+ // a byte loop is correct because all meta characters are ASCII
+ j := 0
+ for i := 0; i < len(s); i++ {
+ if syntax.Special(s[i]) {
+ b[j] = '\\'
+ j++
+ }
+ b[j] = s[i]
+ j++
+ }
+
+ return string(b[0:j])
+}
diff --git a/vendor/github.com/gobwas/glob/match/any.go b/vendor/github.com/gobwas/glob/match/any.go
new file mode 100644
index 00000000000..514a9a5c450
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/any.go
@@ -0,0 +1,45 @@
+package match
+
+import (
+ "fmt"
+ "github.com/gobwas/glob/util/strings"
+)
+
+type Any struct {
+ Separators []rune
+}
+
+func NewAny(s []rune) Any {
+ return Any{s}
+}
+
+func (self Any) Match(s string) bool {
+ return strings.IndexAnyRunes(s, self.Separators) == -1
+}
+
+func (self Any) Index(s string) (int, []int) {
+ found := strings.IndexAnyRunes(s, self.Separators)
+ switch found {
+ case -1:
+ case 0:
+ return 0, segments0
+ default:
+ s = s[:found]
+ }
+
+ segments := acquireSegments(len(s))
+ for i := range s {
+ segments = append(segments, i)
+ }
+ segments = append(segments, len(s))
+
+ return 0, segments
+}
+
+func (self Any) Len() int {
+ return lenNo
+}
+
+func (self Any) String() string {
+ return fmt.Sprintf("", string(self.Separators))
+}
diff --git a/vendor/github.com/gobwas/glob/match/any_of.go b/vendor/github.com/gobwas/glob/match/any_of.go
new file mode 100644
index 00000000000..8e65356cdc9
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/any_of.go
@@ -0,0 +1,82 @@
+package match
+
+import "fmt"
+
+type AnyOf struct {
+ Matchers Matchers
+}
+
+func NewAnyOf(m ...Matcher) AnyOf {
+ return AnyOf{Matchers(m)}
+}
+
+func (self *AnyOf) Add(m Matcher) error {
+ self.Matchers = append(self.Matchers, m)
+ return nil
+}
+
+func (self AnyOf) Match(s string) bool {
+ for _, m := range self.Matchers {
+ if m.Match(s) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (self AnyOf) Index(s string) (int, []int) {
+ index := -1
+
+ segments := acquireSegments(len(s))
+ for _, m := range self.Matchers {
+ idx, seg := m.Index(s)
+ if idx == -1 {
+ continue
+ }
+
+ if index == -1 || idx < index {
+ index = idx
+ segments = append(segments[:0], seg...)
+ continue
+ }
+
+ if idx > index {
+ continue
+ }
+
+ // here idx == index
+ segments = appendMerge(segments, seg)
+ }
+
+ if index == -1 {
+ releaseSegments(segments)
+ return -1, nil
+ }
+
+ return index, segments
+}
+
+func (self AnyOf) Len() (l int) {
+ l = -1
+ for _, m := range self.Matchers {
+ ml := m.Len()
+ switch {
+ case l == -1:
+ l = ml
+ continue
+
+ case ml == -1:
+ return -1
+
+ case l != ml:
+ return -1
+ }
+ }
+
+ return
+}
+
+func (self AnyOf) String() string {
+ return fmt.Sprintf("", self.Matchers)
+}
diff --git a/vendor/github.com/gobwas/glob/match/btree.go b/vendor/github.com/gobwas/glob/match/btree.go
new file mode 100644
index 00000000000..a8130e93eae
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/btree.go
@@ -0,0 +1,146 @@
+package match
+
+import (
+ "fmt"
+ "unicode/utf8"
+)
+
+type BTree struct {
+ Value Matcher
+ Left Matcher
+ Right Matcher
+ ValueLengthRunes int
+ LeftLengthRunes int
+ RightLengthRunes int
+ LengthRunes int
+}
+
+func NewBTree(Value, Left, Right Matcher) (tree BTree) {
+ tree.Value = Value
+ tree.Left = Left
+ tree.Right = Right
+
+ lenOk := true
+ if tree.ValueLengthRunes = Value.Len(); tree.ValueLengthRunes == -1 {
+ lenOk = false
+ }
+
+ if Left != nil {
+ if tree.LeftLengthRunes = Left.Len(); tree.LeftLengthRunes == -1 {
+ lenOk = false
+ }
+ }
+
+ if Right != nil {
+ if tree.RightLengthRunes = Right.Len(); tree.RightLengthRunes == -1 {
+ lenOk = false
+ }
+ }
+
+ if lenOk {
+ tree.LengthRunes = tree.LeftLengthRunes + tree.ValueLengthRunes + tree.RightLengthRunes
+ } else {
+ tree.LengthRunes = -1
+ }
+
+ return tree
+}
+
+func (self BTree) Len() int {
+ return self.LengthRunes
+}
+
+// todo?
+func (self BTree) Index(s string) (int, []int) {
+ return -1, nil
+}
+
+func (self BTree) Match(s string) bool {
+ inputLen := len(s)
+
+ // self.Length, self.RLen and self.LLen are values meaning the length of runes for each part
+ // here we manipulating byte length for better optimizations
+ // but these checks still works, cause minLen of 1-rune string is 1 byte.
+ if self.LengthRunes != -1 && self.LengthRunes > inputLen {
+ return false
+ }
+
+ // try to cut unnecessary parts
+ // by knowledge of length of right and left part
+ var offset, limit int
+ if self.LeftLengthRunes >= 0 {
+ offset = self.LeftLengthRunes
+ }
+ if self.RightLengthRunes >= 0 {
+ limit = inputLen - self.RightLengthRunes
+ } else {
+ limit = inputLen
+ }
+
+ for offset < limit {
+ // search for matching part in substring
+ index, segments := self.Value.Index(s[offset:limit])
+ if index == -1 {
+ releaseSegments(segments)
+ return false
+ }
+
+ l := s[:offset+index]
+ var left bool
+ if self.Left != nil {
+ left = self.Left.Match(l)
+ } else {
+ left = l == ""
+ }
+
+ if left {
+ for i := len(segments) - 1; i >= 0; i-- {
+ length := segments[i]
+
+ var right bool
+ var r string
+ // if there is no string for the right branch
+ if inputLen <= offset+index+length {
+ r = ""
+ } else {
+ r = s[offset+index+length:]
+ }
+
+ if self.Right != nil {
+ right = self.Right.Match(r)
+ } else {
+ right = r == ""
+ }
+
+ if right {
+ releaseSegments(segments)
+ return true
+ }
+ }
+ }
+
+ _, step := utf8.DecodeRuneInString(s[offset+index:])
+ offset += index + step
+
+ releaseSegments(segments)
+ }
+
+ return false
+}
+
+func (self BTree) String() string {
+ const n string = ""
+ var l, r string
+ if self.Left == nil {
+ l = n
+ } else {
+ l = self.Left.String()
+ }
+ if self.Right == nil {
+ r = n
+ } else {
+ r = self.Right.String()
+ }
+
+ return fmt.Sprintf("%s]>", l, self.Value, r)
+}
diff --git a/vendor/github.com/gobwas/glob/match/contains.go b/vendor/github.com/gobwas/glob/match/contains.go
new file mode 100644
index 00000000000..0998e95b0ea
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/contains.go
@@ -0,0 +1,58 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+)
+
+type Contains struct {
+ Needle string
+ Not bool
+}
+
+func NewContains(needle string, not bool) Contains {
+ return Contains{needle, not}
+}
+
+func (self Contains) Match(s string) bool {
+ return strings.Contains(s, self.Needle) != self.Not
+}
+
+func (self Contains) Index(s string) (int, []int) {
+ var offset int
+
+ idx := strings.Index(s, self.Needle)
+
+ if !self.Not {
+ if idx == -1 {
+ return -1, nil
+ }
+
+ offset = idx + len(self.Needle)
+ if len(s) <= offset {
+ return 0, []int{offset}
+ }
+ s = s[offset:]
+ } else if idx != -1 {
+ s = s[:idx]
+ }
+
+ segments := acquireSegments(len(s) + 1)
+ for i := range s {
+ segments = append(segments, offset+i)
+ }
+
+ return 0, append(segments, offset+len(s))
+}
+
+func (self Contains) Len() int {
+ return lenNo
+}
+
+func (self Contains) String() string {
+ var not string
+ if self.Not {
+ not = "!"
+ }
+ return fmt.Sprintf("", not, self.Needle)
+}
diff --git a/vendor/github.com/gobwas/glob/match/every_of.go b/vendor/github.com/gobwas/glob/match/every_of.go
new file mode 100644
index 00000000000..7c968ee368b
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/every_of.go
@@ -0,0 +1,99 @@
+package match
+
+import (
+ "fmt"
+)
+
+type EveryOf struct {
+ Matchers Matchers
+}
+
+func NewEveryOf(m ...Matcher) EveryOf {
+ return EveryOf{Matchers(m)}
+}
+
+func (self *EveryOf) Add(m Matcher) error {
+ self.Matchers = append(self.Matchers, m)
+ return nil
+}
+
+func (self EveryOf) Len() (l int) {
+ for _, m := range self.Matchers {
+ if ml := m.Len(); l > 0 {
+ l += ml
+ } else {
+ return -1
+ }
+ }
+
+ return
+}
+
+func (self EveryOf) Index(s string) (int, []int) {
+ var index int
+ var offset int
+
+ // make `in` with cap as len(s),
+ // cause it is the maximum size of output segments values
+ next := acquireSegments(len(s))
+ current := acquireSegments(len(s))
+
+ sub := s
+ for i, m := range self.Matchers {
+ idx, seg := m.Index(sub)
+ if idx == -1 {
+ releaseSegments(next)
+ releaseSegments(current)
+ return -1, nil
+ }
+
+ if i == 0 {
+ // we use copy here instead of `current = seg`
+ // cause seg is a slice from reusable buffer `in`
+ // and it could be overwritten in next iteration
+ current = append(current, seg...)
+ } else {
+ // clear the next
+ next = next[:0]
+
+ delta := index - (idx + offset)
+ for _, ex := range current {
+ for _, n := range seg {
+ if ex+delta == n {
+ next = append(next, n)
+ }
+ }
+ }
+
+ if len(next) == 0 {
+ releaseSegments(next)
+ releaseSegments(current)
+ return -1, nil
+ }
+
+ current = append(current[:0], next...)
+ }
+
+ index = idx + offset
+ sub = s[index:]
+ offset += idx
+ }
+
+ releaseSegments(next)
+
+ return index, current
+}
+
+func (self EveryOf) Match(s string) bool {
+ for _, m := range self.Matchers {
+ if !m.Match(s) {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (self EveryOf) String() string {
+ return fmt.Sprintf("", self.Matchers)
+}
diff --git a/vendor/github.com/gobwas/glob/match/list.go b/vendor/github.com/gobwas/glob/match/list.go
new file mode 100644
index 00000000000..7fd763ecd8e
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/list.go
@@ -0,0 +1,49 @@
+package match
+
+import (
+ "fmt"
+ "github.com/gobwas/glob/util/runes"
+ "unicode/utf8"
+)
+
+type List struct {
+ List []rune
+ Not bool
+}
+
+func NewList(list []rune, not bool) List {
+ return List{list, not}
+}
+
+func (self List) Match(s string) bool {
+ r, w := utf8.DecodeRuneInString(s)
+ if len(s) > w {
+ return false
+ }
+
+ inList := runes.IndexRune(self.List, r) != -1
+ return inList == !self.Not
+}
+
+func (self List) Len() int {
+ return lenOne
+}
+
+func (self List) Index(s string) (int, []int) {
+ for i, r := range s {
+ if self.Not == (runes.IndexRune(self.List, r) == -1) {
+ return i, segmentsByRuneLength[utf8.RuneLen(r)]
+ }
+ }
+
+ return -1, nil
+}
+
+func (self List) String() string {
+ var not string
+ if self.Not {
+ not = "!"
+ }
+
+ return fmt.Sprintf("", not, string(self.List))
+}
diff --git a/vendor/github.com/gobwas/glob/match/match.go b/vendor/github.com/gobwas/glob/match/match.go
new file mode 100644
index 00000000000..f80e007fb83
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/match.go
@@ -0,0 +1,81 @@
+package match
+
+// todo common table of rune's length
+
+import (
+ "fmt"
+ "strings"
+)
+
+const lenOne = 1
+const lenZero = 0
+const lenNo = -1
+
+type Matcher interface {
+ Match(string) bool
+ Index(string) (int, []int)
+ Len() int
+ String() string
+}
+
+type Matchers []Matcher
+
+func (m Matchers) String() string {
+ var s []string
+ for _, matcher := range m {
+ s = append(s, fmt.Sprint(matcher))
+ }
+
+ return fmt.Sprintf("%s", strings.Join(s, ","))
+}
+
+// appendMerge merges and sorts given already SORTED and UNIQUE segments.
+func appendMerge(target, sub []int) []int {
+ lt, ls := len(target), len(sub)
+ out := make([]int, 0, lt+ls)
+
+ for x, y := 0, 0; x < lt || y < ls; {
+ if x >= lt {
+ out = append(out, sub[y:]...)
+ break
+ }
+
+ if y >= ls {
+ out = append(out, target[x:]...)
+ break
+ }
+
+ xValue := target[x]
+ yValue := sub[y]
+
+ switch {
+
+ case xValue == yValue:
+ out = append(out, xValue)
+ x++
+ y++
+
+ case xValue < yValue:
+ out = append(out, xValue)
+ x++
+
+ case yValue < xValue:
+ out = append(out, yValue)
+ y++
+
+ }
+ }
+
+ target = append(target[:0], out...)
+
+ return target
+}
+
+func reverseSegments(input []int) {
+ l := len(input)
+ m := l / 2
+
+ for i := 0; i < m; i++ {
+ input[i], input[l-i-1] = input[l-i-1], input[i]
+ }
+}
diff --git a/vendor/github.com/gobwas/glob/match/max.go b/vendor/github.com/gobwas/glob/match/max.go
new file mode 100644
index 00000000000..d72f69efff7
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/max.go
@@ -0,0 +1,49 @@
+package match
+
+import (
+ "fmt"
+ "unicode/utf8"
+)
+
+type Max struct {
+ Limit int
+}
+
+func NewMax(l int) Max {
+ return Max{l}
+}
+
+func (self Max) Match(s string) bool {
+ var l int
+ for range s {
+ l += 1
+ if l > self.Limit {
+ return false
+ }
+ }
+
+ return true
+}
+
+func (self Max) Index(s string) (int, []int) {
+ segments := acquireSegments(self.Limit + 1)
+ segments = append(segments, 0)
+ var count int
+ for i, r := range s {
+ count++
+ if count > self.Limit {
+ break
+ }
+ segments = append(segments, i+utf8.RuneLen(r))
+ }
+
+ return 0, segments
+}
+
+func (self Max) Len() int {
+ return lenNo
+}
+
+func (self Max) String() string {
+ return fmt.Sprintf("", self.Limit)
+}
diff --git a/vendor/github.com/gobwas/glob/match/min.go b/vendor/github.com/gobwas/glob/match/min.go
new file mode 100644
index 00000000000..db57ac8eb49
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/min.go
@@ -0,0 +1,57 @@
+package match
+
+import (
+ "fmt"
+ "unicode/utf8"
+)
+
+type Min struct {
+ Limit int
+}
+
+func NewMin(l int) Min {
+ return Min{l}
+}
+
+func (self Min) Match(s string) bool {
+ var l int
+ for range s {
+ l += 1
+ if l >= self.Limit {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (self Min) Index(s string) (int, []int) {
+ var count int
+
+ c := len(s) - self.Limit + 1
+ if c <= 0 {
+ return -1, nil
+ }
+
+ segments := acquireSegments(c)
+ for i, r := range s {
+ count++
+ if count >= self.Limit {
+ segments = append(segments, i+utf8.RuneLen(r))
+ }
+ }
+
+ if len(segments) == 0 {
+ return -1, nil
+ }
+
+ return 0, segments
+}
+
+func (self Min) Len() int {
+ return lenNo
+}
+
+func (self Min) String() string {
+ return fmt.Sprintf("", self.Limit)
+}
diff --git a/vendor/github.com/gobwas/glob/match/nothing.go b/vendor/github.com/gobwas/glob/match/nothing.go
new file mode 100644
index 00000000000..0d4ecd36b80
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/nothing.go
@@ -0,0 +1,27 @@
+package match
+
+import (
+ "fmt"
+)
+
+type Nothing struct{}
+
+func NewNothing() Nothing {
+ return Nothing{}
+}
+
+func (self Nothing) Match(s string) bool {
+ return len(s) == 0
+}
+
+func (self Nothing) Index(s string) (int, []int) {
+ return 0, segments0
+}
+
+func (self Nothing) Len() int {
+ return lenZero
+}
+
+func (self Nothing) String() string {
+ return fmt.Sprintf("")
+}
diff --git a/vendor/github.com/gobwas/glob/match/prefix.go b/vendor/github.com/gobwas/glob/match/prefix.go
new file mode 100644
index 00000000000..a7347250e8d
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/prefix.go
@@ -0,0 +1,50 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+ "unicode/utf8"
+)
+
+type Prefix struct {
+ Prefix string
+}
+
+func NewPrefix(p string) Prefix {
+ return Prefix{p}
+}
+
+func (self Prefix) Index(s string) (int, []int) {
+ idx := strings.Index(s, self.Prefix)
+ if idx == -1 {
+ return -1, nil
+ }
+
+ length := len(self.Prefix)
+ var sub string
+ if len(s) > idx+length {
+ sub = s[idx+length:]
+ } else {
+ sub = ""
+ }
+
+ segments := acquireSegments(len(sub) + 1)
+ segments = append(segments, length)
+ for i, r := range sub {
+ segments = append(segments, length+i+utf8.RuneLen(r))
+ }
+
+ return idx, segments
+}
+
+func (self Prefix) Len() int {
+ return lenNo
+}
+
+func (self Prefix) Match(s string) bool {
+ return strings.HasPrefix(s, self.Prefix)
+}
+
+func (self Prefix) String() string {
+ return fmt.Sprintf("", self.Prefix)
+}
diff --git a/vendor/github.com/gobwas/glob/match/prefix_any.go b/vendor/github.com/gobwas/glob/match/prefix_any.go
new file mode 100644
index 00000000000..8ee58fe1b3c
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/prefix_any.go
@@ -0,0 +1,55 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+ "unicode/utf8"
+
+ sutil "github.com/gobwas/glob/util/strings"
+)
+
+type PrefixAny struct {
+ Prefix string
+ Separators []rune
+}
+
+func NewPrefixAny(s string, sep []rune) PrefixAny {
+ return PrefixAny{s, sep}
+}
+
+func (self PrefixAny) Index(s string) (int, []int) {
+ idx := strings.Index(s, self.Prefix)
+ if idx == -1 {
+ return -1, nil
+ }
+
+ n := len(self.Prefix)
+ sub := s[idx+n:]
+ i := sutil.IndexAnyRunes(sub, self.Separators)
+ if i > -1 {
+ sub = sub[:i]
+ }
+
+ seg := acquireSegments(len(sub) + 1)
+ seg = append(seg, n)
+ for i, r := range sub {
+ seg = append(seg, n+i+utf8.RuneLen(r))
+ }
+
+ return idx, seg
+}
+
+func (self PrefixAny) Len() int {
+ return lenNo
+}
+
+func (self PrefixAny) Match(s string) bool {
+ if !strings.HasPrefix(s, self.Prefix) {
+ return false
+ }
+ return sutil.IndexAnyRunes(s[len(self.Prefix):], self.Separators) == -1
+}
+
+func (self PrefixAny) String() string {
+ return fmt.Sprintf("", self.Prefix, string(self.Separators))
+}
diff --git a/vendor/github.com/gobwas/glob/match/prefix_suffix.go b/vendor/github.com/gobwas/glob/match/prefix_suffix.go
new file mode 100644
index 00000000000..8208085a199
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/prefix_suffix.go
@@ -0,0 +1,62 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+)
+
+type PrefixSuffix struct {
+ Prefix, Suffix string
+}
+
+func NewPrefixSuffix(p, s string) PrefixSuffix {
+ return PrefixSuffix{p, s}
+}
+
+func (self PrefixSuffix) Index(s string) (int, []int) {
+ prefixIdx := strings.Index(s, self.Prefix)
+ if prefixIdx == -1 {
+ return -1, nil
+ }
+
+ suffixLen := len(self.Suffix)
+ if suffixLen <= 0 {
+ return prefixIdx, []int{len(s) - prefixIdx}
+ }
+
+ if (len(s) - prefixIdx) <= 0 {
+ return -1, nil
+ }
+
+ segments := acquireSegments(len(s) - prefixIdx)
+ for sub := s[prefixIdx:]; ; {
+ suffixIdx := strings.LastIndex(sub, self.Suffix)
+ if suffixIdx == -1 {
+ break
+ }
+
+ segments = append(segments, suffixIdx+suffixLen)
+ sub = sub[:suffixIdx]
+ }
+
+ if len(segments) == 0 {
+ releaseSegments(segments)
+ return -1, nil
+ }
+
+ reverseSegments(segments)
+
+ return prefixIdx, segments
+}
+
+func (self PrefixSuffix) Len() int {
+ return lenNo
+}
+
+func (self PrefixSuffix) Match(s string) bool {
+ return strings.HasPrefix(s, self.Prefix) && strings.HasSuffix(s, self.Suffix)
+}
+
+func (self PrefixSuffix) String() string {
+ return fmt.Sprintf("", self.Prefix, self.Suffix)
+}
diff --git a/vendor/github.com/gobwas/glob/match/range.go b/vendor/github.com/gobwas/glob/match/range.go
new file mode 100644
index 00000000000..ce30245a40b
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/range.go
@@ -0,0 +1,48 @@
+package match
+
+import (
+ "fmt"
+ "unicode/utf8"
+)
+
+type Range struct {
+ Lo, Hi rune
+ Not bool
+}
+
+func NewRange(lo, hi rune, not bool) Range {
+ return Range{lo, hi, not}
+}
+
+func (self Range) Len() int {
+ return lenOne
+}
+
+func (self Range) Match(s string) bool {
+ r, w := utf8.DecodeRuneInString(s)
+ if len(s) > w {
+ return false
+ }
+
+ inRange := r >= self.Lo && r <= self.Hi
+
+ return inRange == !self.Not
+}
+
+func (self Range) Index(s string) (int, []int) {
+ for i, r := range s {
+ if self.Not != (r >= self.Lo && r <= self.Hi) {
+ return i, segmentsByRuneLength[utf8.RuneLen(r)]
+ }
+ }
+
+ return -1, nil
+}
+
+func (self Range) String() string {
+ var not string
+ if self.Not {
+ not = "!"
+ }
+ return fmt.Sprintf("", not, string(self.Lo), string(self.Hi))
+}
diff --git a/vendor/github.com/gobwas/glob/match/row.go b/vendor/github.com/gobwas/glob/match/row.go
new file mode 100644
index 00000000000..4379042e42f
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/row.go
@@ -0,0 +1,77 @@
+package match
+
+import (
+ "fmt"
+)
+
+type Row struct {
+ Matchers Matchers
+ RunesLength int
+ Segments []int
+}
+
+func NewRow(len int, m ...Matcher) Row {
+ return Row{
+ Matchers: Matchers(m),
+ RunesLength: len,
+ Segments: []int{len},
+ }
+}
+
+func (self Row) matchAll(s string) bool {
+ var idx int
+ for _, m := range self.Matchers {
+ length := m.Len()
+
+ var next, i int
+ for next = range s[idx:] {
+ i++
+ if i == length {
+ break
+ }
+ }
+
+ if i < length || !m.Match(s[idx:idx+next+1]) {
+ return false
+ }
+
+ idx += next + 1
+ }
+
+ return true
+}
+
+func (self Row) lenOk(s string) bool {
+ var i int
+ for range s {
+ i++
+ if i > self.RunesLength {
+ return false
+ }
+ }
+ return self.RunesLength == i
+}
+
+func (self Row) Match(s string) bool {
+ return self.lenOk(s) && self.matchAll(s)
+}
+
+func (self Row) Len() (l int) {
+ return self.RunesLength
+}
+
+func (self Row) Index(s string) (int, []int) {
+ for i := range s {
+ if len(s[i:]) < self.RunesLength {
+ break
+ }
+ if self.matchAll(s[i:]) {
+ return i, self.Segments
+ }
+ }
+ return -1, nil
+}
+
+func (self Row) String() string {
+ return fmt.Sprintf("", self.RunesLength, self.Matchers)
+}
diff --git a/vendor/github.com/gobwas/glob/match/segments.go b/vendor/github.com/gobwas/glob/match/segments.go
new file mode 100644
index 00000000000..9ea6f309439
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/segments.go
@@ -0,0 +1,91 @@
+package match
+
+import (
+ "sync"
+)
+
+type SomePool interface {
+ Get() []int
+ Put([]int)
+}
+
+var segmentsPools [1024]sync.Pool
+
+func toPowerOfTwo(v int) int {
+ v--
+ v |= v >> 1
+ v |= v >> 2
+ v |= v >> 4
+ v |= v >> 8
+ v |= v >> 16
+ v++
+
+ return v
+}
+
+const (
+ cacheFrom = 16
+ cacheToAndHigher = 1024
+ cacheFromIndex = 15
+ cacheToAndHigherIndex = 1023
+)
+
+var (
+ segments0 = []int{0}
+ segments1 = []int{1}
+ segments2 = []int{2}
+ segments3 = []int{3}
+ segments4 = []int{4}
+)
+
+var segmentsByRuneLength [5][]int = [5][]int{
+ 0: segments0,
+ 1: segments1,
+ 2: segments2,
+ 3: segments3,
+ 4: segments4,
+}
+
+func init() {
+ for i := cacheToAndHigher; i >= cacheFrom; i >>= 1 {
+ func(i int) {
+ segmentsPools[i-1] = sync.Pool{New: func() interface{} {
+ return make([]int, 0, i)
+ }}
+ }(i)
+ }
+}
+
+func getTableIndex(c int) int {
+ p := toPowerOfTwo(c)
+ switch {
+ case p >= cacheToAndHigher:
+ return cacheToAndHigherIndex
+ case p <= cacheFrom:
+ return cacheFromIndex
+ default:
+ return p - 1
+ }
+}
+
+func acquireSegments(c int) []int {
+ // make []int with less capacity than cacheFrom
+ // is faster than acquiring it from pool
+ if c < cacheFrom {
+ return make([]int, 0, c)
+ }
+
+ return segmentsPools[getTableIndex(c)].Get().([]int)[:0]
+}
+
+func releaseSegments(s []int) {
+ c := cap(s)
+
+ // make []int with less capacity than cacheFrom
+ // is faster than acquiring it from pool
+ if c < cacheFrom {
+ return
+ }
+
+ segmentsPools[getTableIndex(c)].Put(s)
+}
diff --git a/vendor/github.com/gobwas/glob/match/single.go b/vendor/github.com/gobwas/glob/match/single.go
new file mode 100644
index 00000000000..ee6e3954c1f
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/single.go
@@ -0,0 +1,43 @@
+package match
+
+import (
+ "fmt"
+ "github.com/gobwas/glob/util/runes"
+ "unicode/utf8"
+)
+
+// single represents ?
+type Single struct {
+ Separators []rune
+}
+
+func NewSingle(s []rune) Single {
+ return Single{s}
+}
+
+func (self Single) Match(s string) bool {
+ r, w := utf8.DecodeRuneInString(s)
+ if len(s) > w {
+ return false
+ }
+
+ return runes.IndexRune(self.Separators, r) == -1
+}
+
+func (self Single) Len() int {
+ return lenOne
+}
+
+func (self Single) Index(s string) (int, []int) {
+ for i, r := range s {
+ if runes.IndexRune(self.Separators, r) == -1 {
+ return i, segmentsByRuneLength[utf8.RuneLen(r)]
+ }
+ }
+
+ return -1, nil
+}
+
+func (self Single) String() string {
+ return fmt.Sprintf("", string(self.Separators))
+}
diff --git a/vendor/github.com/gobwas/glob/match/suffix.go b/vendor/github.com/gobwas/glob/match/suffix.go
new file mode 100644
index 00000000000..85bea8c68ec
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/suffix.go
@@ -0,0 +1,35 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+)
+
+type Suffix struct {
+ Suffix string
+}
+
+func NewSuffix(s string) Suffix {
+ return Suffix{s}
+}
+
+func (self Suffix) Len() int {
+ return lenNo
+}
+
+func (self Suffix) Match(s string) bool {
+ return strings.HasSuffix(s, self.Suffix)
+}
+
+func (self Suffix) Index(s string) (int, []int) {
+ idx := strings.Index(s, self.Suffix)
+ if idx == -1 {
+ return -1, nil
+ }
+
+ return 0, []int{idx + len(self.Suffix)}
+}
+
+func (self Suffix) String() string {
+ return fmt.Sprintf("", self.Suffix)
+}
diff --git a/vendor/github.com/gobwas/glob/match/suffix_any.go b/vendor/github.com/gobwas/glob/match/suffix_any.go
new file mode 100644
index 00000000000..c5106f8196c
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/suffix_any.go
@@ -0,0 +1,43 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+
+ sutil "github.com/gobwas/glob/util/strings"
+)
+
+type SuffixAny struct {
+ Suffix string
+ Separators []rune
+}
+
+func NewSuffixAny(s string, sep []rune) SuffixAny {
+ return SuffixAny{s, sep}
+}
+
+func (self SuffixAny) Index(s string) (int, []int) {
+ idx := strings.Index(s, self.Suffix)
+ if idx == -1 {
+ return -1, nil
+ }
+
+ i := sutil.LastIndexAnyRunes(s[:idx], self.Separators) + 1
+
+ return i, []int{idx + len(self.Suffix) - i}
+}
+
+func (self SuffixAny) Len() int {
+ return lenNo
+}
+
+func (self SuffixAny) Match(s string) bool {
+ if !strings.HasSuffix(s, self.Suffix) {
+ return false
+ }
+ return sutil.IndexAnyRunes(s[:len(s)-len(self.Suffix)], self.Separators) == -1
+}
+
+func (self SuffixAny) String() string {
+ return fmt.Sprintf("", string(self.Separators), self.Suffix)
+}
diff --git a/vendor/github.com/gobwas/glob/match/super.go b/vendor/github.com/gobwas/glob/match/super.go
new file mode 100644
index 00000000000..3875950bb8c
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/super.go
@@ -0,0 +1,33 @@
+package match
+
+import (
+ "fmt"
+)
+
+type Super struct{}
+
+func NewSuper() Super {
+ return Super{}
+}
+
+func (self Super) Match(s string) bool {
+ return true
+}
+
+func (self Super) Len() int {
+ return lenNo
+}
+
+func (self Super) Index(s string) (int, []int) {
+ segments := acquireSegments(len(s) + 1)
+ for i := range s {
+ segments = append(segments, i)
+ }
+ segments = append(segments, len(s))
+
+ return 0, segments
+}
+
+func (self Super) String() string {
+ return fmt.Sprintf("")
+}
diff --git a/vendor/github.com/gobwas/glob/match/text.go b/vendor/github.com/gobwas/glob/match/text.go
new file mode 100644
index 00000000000..0a17616d3cb
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/match/text.go
@@ -0,0 +1,45 @@
+package match
+
+import (
+ "fmt"
+ "strings"
+ "unicode/utf8"
+)
+
+// raw represents raw string to match
+type Text struct {
+ Str string
+ RunesLength int
+ BytesLength int
+ Segments []int
+}
+
+func NewText(s string) Text {
+ return Text{
+ Str: s,
+ RunesLength: utf8.RuneCountInString(s),
+ BytesLength: len(s),
+ Segments: []int{len(s)},
+ }
+}
+
+func (self Text) Match(s string) bool {
+ return self.Str == s
+}
+
+func (self Text) Len() int {
+ return self.RunesLength
+}
+
+func (self Text) Index(s string) (int, []int) {
+ index := strings.Index(s, self.Str)
+ if index == -1 {
+ return -1, nil
+ }
+
+ return index, self.Segments
+}
+
+func (self Text) String() string {
+ return fmt.Sprintf("", self.Str)
+}
diff --git a/vendor/github.com/gobwas/glob/readme.md b/vendor/github.com/gobwas/glob/readme.md
new file mode 100644
index 00000000000..f58144e733e
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/readme.md
@@ -0,0 +1,148 @@
+# glob.[go](https://golang.org)
+
+[![GoDoc][godoc-image]][godoc-url] [![Build Status][travis-image]][travis-url]
+
+> Go Globbing Library.
+
+## Install
+
+```shell
+ go get github.com/gobwas/glob
+```
+
+## Example
+
+```go
+
+package main
+
+import "github.com/gobwas/glob"
+
+func main() {
+ var g glob.Glob
+
+ // create simple glob
+ g = glob.MustCompile("*.github.com")
+ g.Match("api.github.com") // true
+
+ // quote meta characters and then create simple glob
+ g = glob.MustCompile(glob.QuoteMeta("*.github.com"))
+ g.Match("*.github.com") // true
+
+ // create new glob with set of delimiters as ["."]
+ g = glob.MustCompile("api.*.com", '.')
+ g.Match("api.github.com") // true
+ g.Match("api.gi.hub.com") // false
+
+ // create new glob with set of delimiters as ["."]
+ // but now with super wildcard
+ g = glob.MustCompile("api.**.com", '.')
+ g.Match("api.github.com") // true
+ g.Match("api.gi.hub.com") // true
+
+ // create glob with single symbol wildcard
+ g = glob.MustCompile("?at")
+ g.Match("cat") // true
+ g.Match("fat") // true
+ g.Match("at") // false
+
+ // create glob with single symbol wildcard and delimiters ['f']
+ g = glob.MustCompile("?at", 'f')
+ g.Match("cat") // true
+ g.Match("fat") // false
+ g.Match("at") // false
+
+ // create glob with character-list matchers
+ g = glob.MustCompile("[abc]at")
+ g.Match("cat") // true
+ g.Match("bat") // true
+ g.Match("fat") // false
+ g.Match("at") // false
+
+ // create glob with character-list matchers
+ g = glob.MustCompile("[!abc]at")
+ g.Match("cat") // false
+ g.Match("bat") // false
+ g.Match("fat") // true
+ g.Match("at") // false
+
+ // create glob with character-range matchers
+ g = glob.MustCompile("[a-c]at")
+ g.Match("cat") // true
+ g.Match("bat") // true
+ g.Match("fat") // false
+ g.Match("at") // false
+
+ // create glob with character-range matchers
+ g = glob.MustCompile("[!a-c]at")
+ g.Match("cat") // false
+ g.Match("bat") // false
+ g.Match("fat") // true
+ g.Match("at") // false
+
+ // create glob with pattern-alternatives list
+ g = glob.MustCompile("{cat,bat,[fr]at}")
+ g.Match("cat") // true
+ g.Match("bat") // true
+ g.Match("fat") // true
+ g.Match("rat") // true
+ g.Match("at") // false
+ g.Match("zat") // false
+}
+
+```
+
+## Performance
+
+This library is created for compile-once patterns. This means, that compilation could take time, but
+strings matching is done faster, than in case when always parsing template.
+
+If you will not use compiled `glob.Glob` object, and do `g := glob.MustCompile(pattern); g.Match(...)` every time, then your code will be much more slower.
+
+Run `go test -bench=.` from source root to see the benchmarks:
+
+Pattern | Fixture | Match | Speed (ns/op)
+--------|---------|-------|--------------
+`[a-z][!a-x]*cat*[h][!b]*eyes*` | `my cat has very bright eyes` | `true` | 432
+`[a-z][!a-x]*cat*[h][!b]*eyes*` | `my dog has very bright eyes` | `false` | 199
+`https://*.google.*` | `https://account.google.com` | `true` | 96
+`https://*.google.*` | `https://google.com` | `false` | 66
+`{https://*.google.*,*yandex.*,*yahoo.*,*mail.ru}` | `http://yahoo.com` | `true` | 163
+`{https://*.google.*,*yandex.*,*yahoo.*,*mail.ru}` | `http://google.com` | `false` | 197
+`{https://*gobwas.com,http://exclude.gobwas.com}` | `https://safe.gobwas.com` | `true` | 22
+`{https://*gobwas.com,http://exclude.gobwas.com}` | `http://safe.gobwas.com` | `false` | 24
+`abc*` | `abcdef` | `true` | 8.15
+`abc*` | `af` | `false` | 5.68
+`*def` | `abcdef` | `true` | 8.84
+`*def` | `af` | `false` | 5.74
+`ab*ef` | `abcdef` | `true` | 15.2
+`ab*ef` | `af` | `false` | 10.4
+
+The same things with `regexp` package:
+
+Pattern | Fixture | Match | Speed (ns/op)
+--------|---------|-------|--------------
+`^[a-z][^a-x].*cat.*[h][^b].*eyes.*$` | `my cat has very bright eyes` | `true` | 2553
+`^[a-z][^a-x].*cat.*[h][^b].*eyes.*$` | `my dog has very bright eyes` | `false` | 1383
+`^https:\/\/.*\.google\..*$` | `https://account.google.com` | `true` | 1205
+`^https:\/\/.*\.google\..*$` | `https://google.com` | `false` | 767
+`^(https:\/\/.*\.google\..*|.*yandex\..*|.*yahoo\..*|.*mail\.ru)$` | `http://yahoo.com` | `true` | 1435
+`^(https:\/\/.*\.google\..*|.*yandex\..*|.*yahoo\..*|.*mail\.ru)$` | `http://google.com` | `false` | 1674
+`^(https:\/\/.*gobwas\.com|http://exclude.gobwas.com)$` | `https://safe.gobwas.com` | `true` | 1039
+`^(https:\/\/.*gobwas\.com|http://exclude.gobwas.com)$` | `http://safe.gobwas.com` | `false` | 272
+`^abc.*$` | `abcdef` | `true` | 237
+`^abc.*$` | `af` | `false` | 100
+`^.*def$` | `abcdef` | `true` | 464
+`^.*def$` | `af` | `false` | 265
+`^ab.*ef$` | `abcdef` | `true` | 375
+`^ab.*ef$` | `af` | `false` | 145
+
+[godoc-image]: https://godoc.org/github.com/gobwas/glob?status.svg
+[godoc-url]: https://godoc.org/github.com/gobwas/glob
+[travis-image]: https://travis-ci.org/gobwas/glob.svg?branch=master
+[travis-url]: https://travis-ci.org/gobwas/glob
+
+## Syntax
+
+Syntax is inspired by [standard wildcards](http://tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm),
+except that `**` is aka super-asterisk, that do not sensitive for separators.
\ No newline at end of file
diff --git a/vendor/github.com/gobwas/glob/syntax/ast/ast.go b/vendor/github.com/gobwas/glob/syntax/ast/ast.go
new file mode 100644
index 00000000000..3220a694a9c
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/syntax/ast/ast.go
@@ -0,0 +1,122 @@
+package ast
+
+import (
+ "bytes"
+ "fmt"
+)
+
+type Node struct {
+ Parent *Node
+ Children []*Node
+ Value interface{}
+ Kind Kind
+}
+
+func NewNode(k Kind, v interface{}, ch ...*Node) *Node {
+ n := &Node{
+ Kind: k,
+ Value: v,
+ }
+ for _, c := range ch {
+ Insert(n, c)
+ }
+ return n
+}
+
+func (a *Node) Equal(b *Node) bool {
+ if a.Kind != b.Kind {
+ return false
+ }
+ if a.Value != b.Value {
+ return false
+ }
+ if len(a.Children) != len(b.Children) {
+ return false
+ }
+ for i, c := range a.Children {
+ if !c.Equal(b.Children[i]) {
+ return false
+ }
+ }
+ return true
+}
+
+func (a *Node) String() string {
+ var buf bytes.Buffer
+ buf.WriteString(a.Kind.String())
+ if a.Value != nil {
+ buf.WriteString(" =")
+ buf.WriteString(fmt.Sprintf("%v", a.Value))
+ }
+ if len(a.Children) > 0 {
+ buf.WriteString(" [")
+ for i, c := range a.Children {
+ if i > 0 {
+ buf.WriteString(", ")
+ }
+ buf.WriteString(c.String())
+ }
+ buf.WriteString("]")
+ }
+ return buf.String()
+}
+
+func Insert(parent *Node, children ...*Node) {
+ parent.Children = append(parent.Children, children...)
+ for _, ch := range children {
+ ch.Parent = parent
+ }
+}
+
+type List struct {
+ Not bool
+ Chars string
+}
+
+type Range struct {
+ Not bool
+ Lo, Hi rune
+}
+
+type Text struct {
+ Text string
+}
+
+type Kind int
+
+const (
+ KindNothing Kind = iota
+ KindPattern
+ KindList
+ KindRange
+ KindText
+ KindAny
+ KindSuper
+ KindSingle
+ KindAnyOf
+)
+
+func (k Kind) String() string {
+ switch k {
+ case KindNothing:
+ return "Nothing"
+ case KindPattern:
+ return "Pattern"
+ case KindList:
+ return "List"
+ case KindRange:
+ return "Range"
+ case KindText:
+ return "Text"
+ case KindAny:
+ return "Any"
+ case KindSuper:
+ return "Super"
+ case KindSingle:
+ return "Single"
+ case KindAnyOf:
+ return "AnyOf"
+ default:
+ return ""
+ }
+}
diff --git a/vendor/github.com/gobwas/glob/syntax/ast/parser.go b/vendor/github.com/gobwas/glob/syntax/ast/parser.go
new file mode 100644
index 00000000000..429b4094303
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/syntax/ast/parser.go
@@ -0,0 +1,157 @@
+package ast
+
+import (
+ "errors"
+ "fmt"
+ "github.com/gobwas/glob/syntax/lexer"
+ "unicode/utf8"
+)
+
+type Lexer interface {
+ Next() lexer.Token
+}
+
+type parseFn func(*Node, Lexer) (parseFn, *Node, error)
+
+func Parse(lexer Lexer) (*Node, error) {
+ var parser parseFn
+
+ root := NewNode(KindPattern, nil)
+
+ var (
+ tree *Node
+ err error
+ )
+ for parser, tree = parserMain, root; parser != nil; {
+ parser, tree, err = parser(tree, lexer)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ return root, nil
+}
+
+func parserMain(tree *Node, lex Lexer) (parseFn, *Node, error) {
+ for {
+ token := lex.Next()
+ switch token.Type {
+ case lexer.EOF:
+ return nil, tree, nil
+
+ case lexer.Error:
+ return nil, tree, errors.New(token.Raw)
+
+ case lexer.Text:
+ Insert(tree, NewNode(KindText, Text{token.Raw}))
+ return parserMain, tree, nil
+
+ case lexer.Any:
+ Insert(tree, NewNode(KindAny, nil))
+ return parserMain, tree, nil
+
+ case lexer.Super:
+ Insert(tree, NewNode(KindSuper, nil))
+ return parserMain, tree, nil
+
+ case lexer.Single:
+ Insert(tree, NewNode(KindSingle, nil))
+ return parserMain, tree, nil
+
+ case lexer.RangeOpen:
+ return parserRange, tree, nil
+
+ case lexer.TermsOpen:
+ a := NewNode(KindAnyOf, nil)
+ Insert(tree, a)
+
+ p := NewNode(KindPattern, nil)
+ Insert(a, p)
+
+ return parserMain, p, nil
+
+ case lexer.Separator:
+ p := NewNode(KindPattern, nil)
+ Insert(tree.Parent, p)
+
+ return parserMain, p, nil
+
+ case lexer.TermsClose:
+ return parserMain, tree.Parent.Parent, nil
+
+ default:
+ return nil, tree, fmt.Errorf("unexpected token: %s", token)
+ }
+ }
+ return nil, tree, fmt.Errorf("unknown error")
+}
+
+func parserRange(tree *Node, lex Lexer) (parseFn, *Node, error) {
+ var (
+ not bool
+ lo rune
+ hi rune
+ chars string
+ )
+ for {
+ token := lex.Next()
+ switch token.Type {
+ case lexer.EOF:
+ return nil, tree, errors.New("unexpected end")
+
+ case lexer.Error:
+ return nil, tree, errors.New(token.Raw)
+
+ case lexer.Not:
+ not = true
+
+ case lexer.RangeLo:
+ r, w := utf8.DecodeRuneInString(token.Raw)
+ if len(token.Raw) > w {
+ return nil, tree, fmt.Errorf("unexpected length of lo character")
+ }
+ lo = r
+
+ case lexer.RangeBetween:
+ //
+
+ case lexer.RangeHi:
+ r, w := utf8.DecodeRuneInString(token.Raw)
+ if len(token.Raw) > w {
+ return nil, tree, fmt.Errorf("unexpected length of lo character")
+ }
+
+ hi = r
+
+ if hi < lo {
+ return nil, tree, fmt.Errorf("hi character '%s' should be greater than lo '%s'", string(hi), string(lo))
+ }
+
+ case lexer.Text:
+ chars = token.Raw
+
+ case lexer.RangeClose:
+ isRange := lo != 0 && hi != 0
+ isChars := chars != ""
+
+ if isChars == isRange {
+ return nil, tree, fmt.Errorf("could not parse range")
+ }
+
+ if isRange {
+ Insert(tree, NewNode(KindRange, Range{
+ Lo: lo,
+ Hi: hi,
+ Not: not,
+ }))
+ } else {
+ Insert(tree, NewNode(KindList, List{
+ Chars: chars,
+ Not: not,
+ }))
+ }
+
+ return parserMain, tree, nil
+ }
+ }
+}
diff --git a/vendor/github.com/gobwas/glob/syntax/lexer/lexer.go b/vendor/github.com/gobwas/glob/syntax/lexer/lexer.go
new file mode 100644
index 00000000000..a1c8d1962a0
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/syntax/lexer/lexer.go
@@ -0,0 +1,273 @@
+package lexer
+
+import (
+ "bytes"
+ "fmt"
+ "github.com/gobwas/glob/util/runes"
+ "unicode/utf8"
+)
+
+const (
+ char_any = '*'
+ char_comma = ','
+ char_single = '?'
+ char_escape = '\\'
+ char_range_open = '['
+ char_range_close = ']'
+ char_terms_open = '{'
+ char_terms_close = '}'
+ char_range_not = '!'
+ char_range_between = '-'
+)
+
+var specials = []byte{
+ char_any,
+ char_single,
+ char_escape,
+ char_range_open,
+ char_range_close,
+ char_terms_open,
+ char_terms_close,
+}
+
+func Special(c byte) bool {
+ return bytes.IndexByte(specials, c) != -1
+}
+
+type tokens []Token
+
+func (i *tokens) shift() (ret Token) {
+ ret = (*i)[0]
+ copy(*i, (*i)[1:])
+ *i = (*i)[:len(*i)-1]
+ return
+}
+
+func (i *tokens) push(v Token) {
+ *i = append(*i, v)
+}
+
+func (i *tokens) empty() bool {
+ return len(*i) == 0
+}
+
+var eof rune = 0
+
+type lexer struct {
+ data string
+ pos int
+ err error
+
+ tokens tokens
+ termsLevel int
+
+ lastRune rune
+ lastRuneSize int
+ hasRune bool
+}
+
+func NewLexer(source string) *lexer {
+ l := &lexer{
+ data: source,
+ tokens: tokens(make([]Token, 0, 4)),
+ }
+ return l
+}
+
+func (l *lexer) Next() Token {
+ if l.err != nil {
+ return Token{Error, l.err.Error()}
+ }
+ if !l.tokens.empty() {
+ return l.tokens.shift()
+ }
+
+ l.fetchItem()
+ return l.Next()
+}
+
+func (l *lexer) peek() (r rune, w int) {
+ if l.pos == len(l.data) {
+ return eof, 0
+ }
+
+ r, w = utf8.DecodeRuneInString(l.data[l.pos:])
+ if r == utf8.RuneError {
+ l.errorf("could not read rune")
+ r = eof
+ w = 0
+ }
+
+ return
+}
+
+func (l *lexer) read() rune {
+ if l.hasRune {
+ l.hasRune = false
+ l.seek(l.lastRuneSize)
+ return l.lastRune
+ }
+
+ r, s := l.peek()
+ l.seek(s)
+
+ l.lastRune = r
+ l.lastRuneSize = s
+
+ return r
+}
+
+func (l *lexer) seek(w int) {
+ l.pos += w
+}
+
+func (l *lexer) unread() {
+ if l.hasRune {
+ l.errorf("could not unread rune")
+ return
+ }
+ l.seek(-l.lastRuneSize)
+ l.hasRune = true
+}
+
+func (l *lexer) errorf(f string, v ...interface{}) {
+ l.err = fmt.Errorf(f, v...)
+}
+
+func (l *lexer) inTerms() bool {
+ return l.termsLevel > 0
+}
+
+func (l *lexer) termsEnter() {
+ l.termsLevel++
+}
+
+func (l *lexer) termsLeave() {
+ l.termsLevel--
+}
+
+var inTextBreakers = []rune{char_single, char_any, char_range_open, char_terms_open}
+var inTermsBreakers = append(inTextBreakers, char_terms_close, char_comma)
+
+func (l *lexer) fetchItem() {
+ r := l.read()
+ switch {
+ case r == eof:
+ l.tokens.push(Token{EOF, ""})
+
+ case r == char_terms_open:
+ l.termsEnter()
+ l.tokens.push(Token{TermsOpen, string(r)})
+
+ case r == char_comma && l.inTerms():
+ l.tokens.push(Token{Separator, string(r)})
+
+ case r == char_terms_close && l.inTerms():
+ l.tokens.push(Token{TermsClose, string(r)})
+ l.termsLeave()
+
+ case r == char_range_open:
+ l.tokens.push(Token{RangeOpen, string(r)})
+ l.fetchRange()
+
+ case r == char_single:
+ l.tokens.push(Token{Single, string(r)})
+
+ case r == char_any:
+ if l.read() == char_any {
+ l.tokens.push(Token{Super, string(r) + string(r)})
+ } else {
+ l.unread()
+ l.tokens.push(Token{Any, string(r)})
+ }
+
+ default:
+ l.unread()
+
+ var breakers []rune
+ if l.inTerms() {
+ breakers = inTermsBreakers
+ } else {
+ breakers = inTextBreakers
+ }
+ l.fetchText(breakers)
+ }
+}
+
+func (l *lexer) fetchRange() {
+ var wantHi bool
+ var wantClose bool
+ var seenNot bool
+ for {
+ r := l.read()
+ if r == eof {
+ l.errorf("unexpected end of input")
+ return
+ }
+
+ if wantClose {
+ if r != char_range_close {
+ l.errorf("expected close range character")
+ } else {
+ l.tokens.push(Token{RangeClose, string(r)})
+ }
+ return
+ }
+
+ if wantHi {
+ l.tokens.push(Token{RangeHi, string(r)})
+ wantClose = true
+ continue
+ }
+
+ if !seenNot && r == char_range_not {
+ l.tokens.push(Token{Not, string(r)})
+ seenNot = true
+ continue
+ }
+
+ if n, w := l.peek(); n == char_range_between {
+ l.seek(w)
+ l.tokens.push(Token{RangeLo, string(r)})
+ l.tokens.push(Token{RangeBetween, string(n)})
+ wantHi = true
+ continue
+ }
+
+ l.unread() // unread first peek and fetch as text
+ l.fetchText([]rune{char_range_close})
+ wantClose = true
+ }
+}
+
+func (l *lexer) fetchText(breakers []rune) {
+ var data []rune
+ var escaped bool
+
+reading:
+ for {
+ r := l.read()
+ if r == eof {
+ break
+ }
+
+ if !escaped {
+ if r == char_escape {
+ escaped = true
+ continue
+ }
+
+ if runes.IndexRune(breakers, r) != -1 {
+ l.unread()
+ break reading
+ }
+ }
+
+ escaped = false
+ data = append(data, r)
+ }
+
+ if len(data) > 0 {
+ l.tokens.push(Token{Text, string(data)})
+ }
+}
diff --git a/vendor/github.com/gobwas/glob/syntax/lexer/token.go b/vendor/github.com/gobwas/glob/syntax/lexer/token.go
new file mode 100644
index 00000000000..2797c4e83a4
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/syntax/lexer/token.go
@@ -0,0 +1,88 @@
+package lexer
+
+import "fmt"
+
+type TokenType int
+
+const (
+ EOF TokenType = iota
+ Error
+ Text
+ Char
+ Any
+ Super
+ Single
+ Not
+ Separator
+ RangeOpen
+ RangeClose
+ RangeLo
+ RangeHi
+ RangeBetween
+ TermsOpen
+ TermsClose
+)
+
+func (tt TokenType) String() string {
+ switch tt {
+ case EOF:
+ return "eof"
+
+ case Error:
+ return "error"
+
+ case Text:
+ return "text"
+
+ case Char:
+ return "char"
+
+ case Any:
+ return "any"
+
+ case Super:
+ return "super"
+
+ case Single:
+ return "single"
+
+ case Not:
+ return "not"
+
+ case Separator:
+ return "separator"
+
+ case RangeOpen:
+ return "range_open"
+
+ case RangeClose:
+ return "range_close"
+
+ case RangeLo:
+ return "range_lo"
+
+ case RangeHi:
+ return "range_hi"
+
+ case RangeBetween:
+ return "range_between"
+
+ case TermsOpen:
+ return "terms_open"
+
+ case TermsClose:
+ return "terms_close"
+
+ default:
+ return "undef"
+ }
+}
+
+type Token struct {
+ Type TokenType
+ Raw string
+}
+
+func (t Token) String() string {
+ return fmt.Sprintf("%v<%q>", t.Type, t.Raw)
+}
diff --git a/vendor/github.com/gobwas/glob/syntax/syntax.go b/vendor/github.com/gobwas/glob/syntax/syntax.go
new file mode 100644
index 00000000000..1d168b14829
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/syntax/syntax.go
@@ -0,0 +1,14 @@
+package syntax
+
+import (
+ "github.com/gobwas/glob/syntax/ast"
+ "github.com/gobwas/glob/syntax/lexer"
+)
+
+func Parse(s string) (*ast.Node, error) {
+ return ast.Parse(lexer.NewLexer(s))
+}
+
+func Special(b byte) bool {
+ return lexer.Special(b)
+}
diff --git a/vendor/github.com/gobwas/glob/util/runes/runes.go b/vendor/github.com/gobwas/glob/util/runes/runes.go
new file mode 100644
index 00000000000..a7235564107
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/util/runes/runes.go
@@ -0,0 +1,154 @@
+package runes
+
+func Index(s, needle []rune) int {
+ ls, ln := len(s), len(needle)
+
+ switch {
+ case ln == 0:
+ return 0
+ case ln == 1:
+ return IndexRune(s, needle[0])
+ case ln == ls:
+ if Equal(s, needle) {
+ return 0
+ }
+ return -1
+ case ln > ls:
+ return -1
+ }
+
+head:
+ for i := 0; i < ls && ls-i >= ln; i++ {
+ for y := 0; y < ln; y++ {
+ if s[i+y] != needle[y] {
+ continue head
+ }
+ }
+
+ return i
+ }
+
+ return -1
+}
+
+func LastIndex(s, needle []rune) int {
+ ls, ln := len(s), len(needle)
+
+ switch {
+ case ln == 0:
+ if ls == 0 {
+ return 0
+ }
+ return ls
+ case ln == 1:
+ return IndexLastRune(s, needle[0])
+ case ln == ls:
+ if Equal(s, needle) {
+ return 0
+ }
+ return -1
+ case ln > ls:
+ return -1
+ }
+
+head:
+ for i := ls - 1; i >= 0 && i >= ln; i-- {
+ for y := ln - 1; y >= 0; y-- {
+ if s[i-(ln-y-1)] != needle[y] {
+ continue head
+ }
+ }
+
+ return i - ln + 1
+ }
+
+ return -1
+}
+
+// IndexAny returns the index of the first instance of any Unicode code point
+// from chars in s, or -1 if no Unicode code point from chars is present in s.
+func IndexAny(s, chars []rune) int {
+ if len(chars) > 0 {
+ for i, c := range s {
+ for _, m := range chars {
+ if c == m {
+ return i
+ }
+ }
+ }
+ }
+ return -1
+}
+
+func Contains(s, needle []rune) bool {
+ return Index(s, needle) >= 0
+}
+
+func Max(s []rune) (max rune) {
+ for _, r := range s {
+ if r > max {
+ max = r
+ }
+ }
+
+ return
+}
+
+func Min(s []rune) rune {
+ min := rune(-1)
+ for _, r := range s {
+ if min == -1 {
+ min = r
+ continue
+ }
+
+ if r < min {
+ min = r
+ }
+ }
+
+ return min
+}
+
+func IndexRune(s []rune, r rune) int {
+ for i, c := range s {
+ if c == r {
+ return i
+ }
+ }
+ return -1
+}
+
+func IndexLastRune(s []rune, r rune) int {
+ for i := len(s) - 1; i >= 0; i-- {
+ if s[i] == r {
+ return i
+ }
+ }
+
+ return -1
+}
+
+func Equal(a, b []rune) bool {
+ if len(a) == len(b) {
+ for i := 0; i < len(a); i++ {
+ if a[i] != b[i] {
+ return false
+ }
+ }
+
+ return true
+ }
+
+ return false
+}
+
+// HasPrefix tests whether the string s begins with prefix.
+func HasPrefix(s, prefix []rune) bool {
+ return len(s) >= len(prefix) && Equal(s[0:len(prefix)], prefix)
+}
+
+// HasSuffix tests whether the string s ends with suffix.
+func HasSuffix(s, suffix []rune) bool {
+ return len(s) >= len(suffix) && Equal(s[len(s)-len(suffix):], suffix)
+}
diff --git a/vendor/github.com/gobwas/glob/util/strings/strings.go b/vendor/github.com/gobwas/glob/util/strings/strings.go
new file mode 100644
index 00000000000..e8ee1920b17
--- /dev/null
+++ b/vendor/github.com/gobwas/glob/util/strings/strings.go
@@ -0,0 +1,39 @@
+package strings
+
+import (
+ "strings"
+ "unicode/utf8"
+)
+
+func IndexAnyRunes(s string, rs []rune) int {
+ for _, r := range rs {
+ if i := strings.IndexRune(s, r); i != -1 {
+ return i
+ }
+ }
+
+ return -1
+}
+
+func LastIndexAnyRunes(s string, rs []rune) int {
+ for _, r := range rs {
+ i := -1
+ if 0 <= r && r < utf8.RuneSelf {
+ i = strings.LastIndexByte(s, byte(r))
+ } else {
+ sub := s
+ for len(sub) > 0 {
+ j := strings.IndexRune(s, r)
+ if j == -1 {
+ break
+ }
+ i = j
+ sub = sub[i+1:]
+ }
+ }
+ if i != -1 {
+ return i
+ }
+ }
+ return -1
+}
diff --git a/vendor/github.com/golang/mock/AUTHORS b/vendor/github.com/golang/mock/AUTHORS
new file mode 100644
index 00000000000..660b8ccc8ae
--- /dev/null
+++ b/vendor/github.com/golang/mock/AUTHORS
@@ -0,0 +1,12 @@
+# This is the official list of GoMock authors for copyright purposes.
+# This file is distinct from the CONTRIBUTORS files.
+# See the latter for an explanation.
+
+# Names should be added to this file as
+# Name or Organization
+# The email address is not required for organizations.
+
+# Please keep the list sorted.
+
+Alex Reece
+Google Inc.
diff --git a/vendor/github.com/golang/mock/CONTRIBUTORS b/vendor/github.com/golang/mock/CONTRIBUTORS
new file mode 100644
index 00000000000..def849cab1b
--- /dev/null
+++ b/vendor/github.com/golang/mock/CONTRIBUTORS
@@ -0,0 +1,37 @@
+# This is the official list of people who can contribute (and typically
+# have contributed) code to the gomock repository.
+# The AUTHORS file lists the copyright holders; this file
+# lists people. For example, Google employees are listed here
+# but not in AUTHORS, because Google holds the copyright.
+#
+# The submission process automatically checks to make sure
+# that people submitting code are listed in this file (by email address).
+#
+# Names should be added to this file only after verifying that
+# the individual or the individual's organization has agreed to
+# the appropriate Contributor License Agreement, found here:
+#
+# http://code.google.com/legal/individual-cla-v1.0.html
+# http://code.google.com/legal/corporate-cla-v1.0.html
+#
+# The agreement for individuals can be filled out on the web.
+#
+# When adding J Random Contributor's name to this file,
+# either J's name or J's organization's name should be
+# added to the AUTHORS file, depending on whether the
+# individual or corporate CLA was used.
+
+# Names should be added to this file like so:
+# Name
+#
+# An entry with two email addresses specifies that the
+# first address should be used in the submit logs and
+# that the second address should be recognized as the
+# same person when interacting with Rietveld.
+
+# Please keep the list sorted.
+
+Aaron Jacobs
+Alex Reece
+David Symonds
+Ryan Barrett
diff --git a/vendor/github.com/golang/mock/LICENSE b/vendor/github.com/golang/mock/LICENSE
new file mode 100644
index 00000000000..d6456956733
--- /dev/null
+++ b/vendor/github.com/golang/mock/LICENSE
@@ -0,0 +1,202 @@
+
+ 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/golang/mock/gomock/call.go b/vendor/github.com/golang/mock/gomock/call.go
new file mode 100644
index 00000000000..a3fa1ae419d
--- /dev/null
+++ b/vendor/github.com/golang/mock/gomock/call.go
@@ -0,0 +1,428 @@
+// Copyright 2010 Google Inc.
+//
+// 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.
+
+package gomock
+
+import (
+ "fmt"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+// Call represents an expected call to a mock.
+type Call struct {
+ t TestReporter // for triggering test failures on invalid call setup
+
+ receiver interface{} // the receiver of the method call
+ method string // the name of the method
+ methodType reflect.Type // the type of the method
+ args []Matcher // the args
+ origin string // file and line number of call setup
+
+ preReqs []*Call // prerequisite calls
+
+ // Expectations
+ minCalls, maxCalls int
+
+ numCalls int // actual number made
+
+ // actions are called when this Call is called. Each action gets the args and
+ // can set the return values by returning a non-nil slice. Actions run in the
+ // order they are created.
+ actions []func([]interface{}) []interface{}
+}
+
+// newCall creates a *Call. It requires the method type in order to support
+// unexported methods.
+func newCall(t TestReporter, receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call {
+ if h, ok := t.(testHelper); ok {
+ h.Helper()
+ }
+
+ // TODO: check arity, types.
+ margs := make([]Matcher, len(args))
+ for i, arg := range args {
+ if m, ok := arg.(Matcher); ok {
+ margs[i] = m
+ } else if arg == nil {
+ // Handle nil specially so that passing a nil interface value
+ // will match the typed nils of concrete args.
+ margs[i] = Nil()
+ } else {
+ margs[i] = Eq(arg)
+ }
+ }
+
+ origin := callerInfo(3)
+ actions := []func([]interface{}) []interface{}{func([]interface{}) []interface{} {
+ // Synthesize the zero value for each of the return args' types.
+ rets := make([]interface{}, methodType.NumOut())
+ for i := 0; i < methodType.NumOut(); i++ {
+ rets[i] = reflect.Zero(methodType.Out(i)).Interface()
+ }
+ return rets
+ }}
+ return &Call{t: t, receiver: receiver, method: method, methodType: methodType,
+ args: margs, origin: origin, minCalls: 1, maxCalls: 1, actions: actions}
+}
+
+// AnyTimes allows the expectation to be called 0 or more times
+func (c *Call) AnyTimes() *Call {
+ c.minCalls, c.maxCalls = 0, 1e8 // close enough to infinity
+ return c
+}
+
+// MinTimes requires the call to occur at least n times. If AnyTimes or MaxTimes have not been called, MinTimes also
+// sets the maximum number of calls to infinity.
+func (c *Call) MinTimes(n int) *Call {
+ c.minCalls = n
+ if c.maxCalls == 1 {
+ c.maxCalls = 1e8
+ }
+ return c
+}
+
+// MaxTimes limits the number of calls to n times. If AnyTimes or MinTimes have not been called, MaxTimes also
+// sets the minimum number of calls to 0.
+func (c *Call) MaxTimes(n int) *Call {
+ c.maxCalls = n
+ if c.minCalls == 1 {
+ c.minCalls = 0
+ }
+ return c
+}
+
+// DoAndReturn declares the action to run when the call is matched.
+// The return values from this function are returned by the mocked function.
+// It takes an interface{} argument to support n-arity functions.
+func (c *Call) DoAndReturn(f interface{}) *Call {
+ // TODO: Check arity and types here, rather than dying badly elsewhere.
+ v := reflect.ValueOf(f)
+
+ c.addAction(func(args []interface{}) []interface{} {
+ vargs := make([]reflect.Value, len(args))
+ ft := v.Type()
+ for i := 0; i < len(args); i++ {
+ if args[i] != nil {
+ vargs[i] = reflect.ValueOf(args[i])
+ } else {
+ // Use the zero value for the arg.
+ vargs[i] = reflect.Zero(ft.In(i))
+ }
+ }
+ vrets := v.Call(vargs)
+ rets := make([]interface{}, len(vrets))
+ for i, ret := range vrets {
+ rets[i] = ret.Interface()
+ }
+ return rets
+ })
+ return c
+}
+
+// Do declares the action to run when the call is matched. The function's
+// return values are ignored to retain backward compatibility. To use the
+// return values call DoAndReturn.
+// It takes an interface{} argument to support n-arity functions.
+func (c *Call) Do(f interface{}) *Call {
+ // TODO: Check arity and types here, rather than dying badly elsewhere.
+ v := reflect.ValueOf(f)
+
+ c.addAction(func(args []interface{}) []interface{} {
+ vargs := make([]reflect.Value, len(args))
+ ft := v.Type()
+ for i := 0; i < len(args); i++ {
+ if args[i] != nil {
+ vargs[i] = reflect.ValueOf(args[i])
+ } else {
+ // Use the zero value for the arg.
+ vargs[i] = reflect.Zero(ft.In(i))
+ }
+ }
+ v.Call(vargs)
+ return nil
+ })
+ return c
+}
+
+// Return declares the values to be returned by the mocked function call.
+func (c *Call) Return(rets ...interface{}) *Call {
+ if h, ok := c.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ mt := c.methodType
+ if len(rets) != mt.NumOut() {
+ c.t.Fatalf("wrong number of arguments to Return for %T.%v: got %d, want %d [%s]",
+ c.receiver, c.method, len(rets), mt.NumOut(), c.origin)
+ }
+ for i, ret := range rets {
+ if got, want := reflect.TypeOf(ret), mt.Out(i); got == want {
+ // Identical types; nothing to do.
+ } else if got == nil {
+ // Nil needs special handling.
+ switch want.Kind() {
+ case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
+ // ok
+ default:
+ c.t.Fatalf("argument %d to Return for %T.%v is nil, but %v is not nillable [%s]",
+ i, c.receiver, c.method, want, c.origin)
+ }
+ } else if got.AssignableTo(want) {
+ // Assignable type relation. Make the assignment now so that the generated code
+ // can return the values with a type assertion.
+ v := reflect.New(want).Elem()
+ v.Set(reflect.ValueOf(ret))
+ rets[i] = v.Interface()
+ } else {
+ c.t.Fatalf("wrong type of argument %d to Return for %T.%v: %v is not assignable to %v [%s]",
+ i, c.receiver, c.method, got, want, c.origin)
+ }
+ }
+
+ c.addAction(func([]interface{}) []interface{} {
+ return rets
+ })
+
+ return c
+}
+
+// Times declares the exact number of times a function call is expected to be executed.
+func (c *Call) Times(n int) *Call {
+ c.minCalls, c.maxCalls = n, n
+ return c
+}
+
+// SetArg declares an action that will set the nth argument's value,
+// indirected through a pointer. Or, in the case of a slice, SetArg
+// will copy value's elements into the nth argument.
+func (c *Call) SetArg(n int, value interface{}) *Call {
+ if h, ok := c.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ mt := c.methodType
+ // TODO: This will break on variadic methods.
+ // We will need to check those at invocation time.
+ if n < 0 || n >= mt.NumIn() {
+ c.t.Fatalf("SetArg(%d, ...) called for a method with %d args [%s]",
+ n, mt.NumIn(), c.origin)
+ }
+ // Permit setting argument through an interface.
+ // In the interface case, we don't (nay, can't) check the type here.
+ at := mt.In(n)
+ switch at.Kind() {
+ case reflect.Ptr:
+ dt := at.Elem()
+ if vt := reflect.TypeOf(value); !vt.AssignableTo(dt) {
+ c.t.Fatalf("SetArg(%d, ...) argument is a %v, not assignable to %v [%s]",
+ n, vt, dt, c.origin)
+ }
+ case reflect.Interface:
+ // nothing to do
+ case reflect.Slice:
+ // nothing to do
+ default:
+ c.t.Fatalf("SetArg(%d, ...) referring to argument of non-pointer non-interface non-slice type %v [%s]",
+ n, at, c.origin)
+ }
+
+ c.addAction(func(args []interface{}) []interface{} {
+ v := reflect.ValueOf(value)
+ switch reflect.TypeOf(args[n]).Kind() {
+ case reflect.Slice:
+ setSlice(args[n], v)
+ default:
+ reflect.ValueOf(args[n]).Elem().Set(v)
+ }
+ return nil
+ })
+ return c
+}
+
+// isPreReq returns true if other is a direct or indirect prerequisite to c.
+func (c *Call) isPreReq(other *Call) bool {
+ for _, preReq := range c.preReqs {
+ if other == preReq || preReq.isPreReq(other) {
+ return true
+ }
+ }
+ return false
+}
+
+// After declares that the call may only match after preReq has been exhausted.
+func (c *Call) After(preReq *Call) *Call {
+ if h, ok := c.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ if c == preReq {
+ c.t.Fatalf("A call isn't allowed to be its own prerequisite")
+ }
+ if preReq.isPreReq(c) {
+ c.t.Fatalf("Loop in call order: %v is a prerequisite to %v (possibly indirectly).", c, preReq)
+ }
+
+ c.preReqs = append(c.preReqs, preReq)
+ return c
+}
+
+// Returns true if the minimum number of calls have been made.
+func (c *Call) satisfied() bool {
+ return c.numCalls >= c.minCalls
+}
+
+// Returns true iff the maximum number of calls have been made.
+func (c *Call) exhausted() bool {
+ return c.numCalls >= c.maxCalls
+}
+
+func (c *Call) String() string {
+ args := make([]string, len(c.args))
+ for i, arg := range c.args {
+ args[i] = arg.String()
+ }
+ arguments := strings.Join(args, ", ")
+ return fmt.Sprintf("%T.%v(%s) %s", c.receiver, c.method, arguments, c.origin)
+}
+
+// Tests if the given call matches the expected call.
+// If yes, returns nil. If no, returns error with message explaining why it does not match.
+func (c *Call) matches(args []interface{}) error {
+ if !c.methodType.IsVariadic() {
+ if len(args) != len(c.args) {
+ return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: %d",
+ c.origin, len(args), len(c.args))
+ }
+
+ for i, m := range c.args {
+ if !m.Matches(args[i]) {
+ return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v",
+ c.origin, strconv.Itoa(i), args[i], m)
+ }
+ }
+ } else {
+ if len(c.args) < c.methodType.NumIn()-1 {
+ return fmt.Errorf("Expected call at %s has the wrong number of matchers. Got: %d, want: %d",
+ c.origin, len(c.args), c.methodType.NumIn()-1)
+ }
+ if len(c.args) != c.methodType.NumIn() && len(args) != len(c.args) {
+ return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: %d",
+ c.origin, len(args), len(c.args))
+ }
+ if len(args) < len(c.args)-1 {
+ return fmt.Errorf("Expected call at %s has the wrong number of arguments. Got: %d, want: greater than or equal to %d",
+ c.origin, len(args), len(c.args)-1)
+ }
+
+ for i, m := range c.args {
+ if i < c.methodType.NumIn()-1 {
+ // Non-variadic args
+ if !m.Matches(args[i]) {
+ return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v",
+ c.origin, strconv.Itoa(i), args[i], m)
+ }
+ continue
+ }
+ // The last arg has a possibility of a variadic argument, so let it branch
+
+ // sample: Foo(a int, b int, c ...int)
+ if i < len(c.args) && i < len(args) {
+ if m.Matches(args[i]) {
+ // Got Foo(a, b, c) want Foo(matcherA, matcherB, gomock.Any())
+ // Got Foo(a, b, c) want Foo(matcherA, matcherB, someSliceMatcher)
+ // Got Foo(a, b, c) want Foo(matcherA, matcherB, matcherC)
+ // Got Foo(a, b) want Foo(matcherA, matcherB)
+ // Got Foo(a, b, c, d) want Foo(matcherA, matcherB, matcherC, matcherD)
+ continue
+ }
+ }
+
+ // The number of actual args don't match the number of matchers,
+ // or the last matcher is a slice and the last arg is not.
+ // If this function still matches it is because the last matcher
+ // matches all the remaining arguments or the lack of any.
+ // Convert the remaining arguments, if any, into a slice of the
+ // expected type.
+ vargsType := c.methodType.In(c.methodType.NumIn() - 1)
+ vargs := reflect.MakeSlice(vargsType, 0, len(args)-i)
+ for _, arg := range args[i:] {
+ vargs = reflect.Append(vargs, reflect.ValueOf(arg))
+ }
+ if m.Matches(vargs.Interface()) {
+ // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, gomock.Any())
+ // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, someSliceMatcher)
+ // Got Foo(a, b) want Foo(matcherA, matcherB, gomock.Any())
+ // Got Foo(a, b) want Foo(matcherA, matcherB, someEmptySliceMatcher)
+ break
+ }
+ // Wrong number of matchers or not match. Fail.
+ // Got Foo(a, b) want Foo(matcherA, matcherB, matcherC, matcherD)
+ // Got Foo(a, b, c) want Foo(matcherA, matcherB, matcherC, matcherD)
+ // Got Foo(a, b, c, d) want Foo(matcherA, matcherB, matcherC, matcherD, matcherE)
+ // Got Foo(a, b, c, d, e) want Foo(matcherA, matcherB, matcherC, matcherD)
+ // Got Foo(a, b, c) want Foo(matcherA, matcherB)
+ return fmt.Errorf("Expected call at %s doesn't match the argument at index %s.\nGot: %v\nWant: %v",
+ c.origin, strconv.Itoa(i), args[i:], c.args[i])
+
+ }
+ }
+
+ // Check that all prerequisite calls have been satisfied.
+ for _, preReqCall := range c.preReqs {
+ if !preReqCall.satisfied() {
+ return fmt.Errorf("Expected call at %s doesn't have a prerequisite call satisfied:\n%v\nshould be called before:\n%v",
+ c.origin, preReqCall, c)
+ }
+ }
+
+ // Check that the call is not exhausted.
+ if c.exhausted() {
+ return fmt.Errorf("Expected call at %s has already been called the max number of times.", c.origin)
+ }
+
+ return nil
+}
+
+// dropPrereqs tells the expected Call to not re-check prerequisite calls any
+// longer, and to return its current set.
+func (c *Call) dropPrereqs() (preReqs []*Call) {
+ preReqs = c.preReqs
+ c.preReqs = nil
+ return
+}
+
+func (c *Call) call(args []interface{}) []func([]interface{}) []interface{} {
+ c.numCalls++
+ return c.actions
+}
+
+// InOrder declares that the given calls should occur in order.
+func InOrder(calls ...*Call) {
+ for i := 1; i < len(calls); i++ {
+ calls[i].After(calls[i-1])
+ }
+}
+
+func setSlice(arg interface{}, v reflect.Value) {
+ va := reflect.ValueOf(arg)
+ for i := 0; i < v.Len(); i++ {
+ va.Index(i).Set(v.Index(i))
+ }
+}
+
+func (c *Call) addAction(action func([]interface{}) []interface{}) {
+ c.actions = append(c.actions, action)
+}
diff --git a/vendor/github.com/golang/mock/gomock/callset.go b/vendor/github.com/golang/mock/gomock/callset.go
new file mode 100644
index 00000000000..c44a8a585b3
--- /dev/null
+++ b/vendor/github.com/golang/mock/gomock/callset.go
@@ -0,0 +1,108 @@
+// Copyright 2011 Google Inc.
+//
+// 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.
+
+package gomock
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// callSet represents a set of expected calls, indexed by receiver and method
+// name.
+type callSet struct {
+ // Calls that are still expected.
+ expected map[callSetKey][]*Call
+ // Calls that have been exhausted.
+ exhausted map[callSetKey][]*Call
+}
+
+// callSetKey is the key in the maps in callSet
+type callSetKey struct {
+ receiver interface{}
+ fname string
+}
+
+func newCallSet() *callSet {
+ return &callSet{make(map[callSetKey][]*Call), make(map[callSetKey][]*Call)}
+}
+
+// Add adds a new expected call.
+func (cs callSet) Add(call *Call) {
+ key := callSetKey{call.receiver, call.method}
+ m := cs.expected
+ if call.exhausted() {
+ m = cs.exhausted
+ }
+ m[key] = append(m[key], call)
+}
+
+// Remove removes an expected call.
+func (cs callSet) Remove(call *Call) {
+ key := callSetKey{call.receiver, call.method}
+ calls := cs.expected[key]
+ for i, c := range calls {
+ if c == call {
+ // maintain order for remaining calls
+ cs.expected[key] = append(calls[:i], calls[i+1:]...)
+ cs.exhausted[key] = append(cs.exhausted[key], call)
+ break
+ }
+ }
+}
+
+// FindMatch searches for a matching call. Returns error with explanation message if no call matched.
+func (cs callSet) FindMatch(receiver interface{}, method string, args []interface{}) (*Call, error) {
+ key := callSetKey{receiver, method}
+
+ // Search through the expected calls.
+ expected := cs.expected[key]
+ var callsErrors bytes.Buffer
+ for _, call := range expected {
+ err := call.matches(args)
+ if err != nil {
+ fmt.Fprintf(&callsErrors, "\n%v", err)
+ } else {
+ return call, nil
+ }
+ }
+
+ // If we haven't found a match then search through the exhausted calls so we
+ // get useful error messages.
+ exhausted := cs.exhausted[key]
+ for _, call := range exhausted {
+ if err := call.matches(args); err != nil {
+ fmt.Fprintf(&callsErrors, "\n%v", err)
+ }
+ }
+
+ if len(expected)+len(exhausted) == 0 {
+ fmt.Fprintf(&callsErrors, "there are no expected calls of the method %q for that receiver", method)
+ }
+
+ return nil, fmt.Errorf(callsErrors.String())
+}
+
+// Failures returns the calls that are not satisfied.
+func (cs callSet) Failures() []*Call {
+ failures := make([]*Call, 0, len(cs.expected))
+ for _, calls := range cs.expected {
+ for _, call := range calls {
+ if !call.satisfied() {
+ failures = append(failures, call)
+ }
+ }
+ }
+ return failures
+}
diff --git a/vendor/github.com/golang/mock/gomock/controller.go b/vendor/github.com/golang/mock/gomock/controller.go
new file mode 100644
index 00000000000..a7b79188bc8
--- /dev/null
+++ b/vendor/github.com/golang/mock/gomock/controller.go
@@ -0,0 +1,217 @@
+// Copyright 2010 Google Inc.
+//
+// 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.
+
+// GoMock - a mock framework for Go.
+//
+// Standard usage:
+// (1) Define an interface that you wish to mock.
+// type MyInterface interface {
+// SomeMethod(x int64, y string)
+// }
+// (2) Use mockgen to generate a mock from the interface.
+// (3) Use the mock in a test:
+// func TestMyThing(t *testing.T) {
+// mockCtrl := gomock.NewController(t)
+// defer mockCtrl.Finish()
+//
+// mockObj := something.NewMockMyInterface(mockCtrl)
+// mockObj.EXPECT().SomeMethod(4, "blah")
+// // pass mockObj to a real object and play with it.
+// }
+//
+// By default, expected calls are not enforced to run in any particular order.
+// Call order dependency can be enforced by use of InOrder and/or Call.After.
+// Call.After can create more varied call order dependencies, but InOrder is
+// often more convenient.
+//
+// The following examples create equivalent call order dependencies.
+//
+// Example of using Call.After to chain expected call order:
+//
+// firstCall := mockObj.EXPECT().SomeMethod(1, "first")
+// secondCall := mockObj.EXPECT().SomeMethod(2, "second").After(firstCall)
+// mockObj.EXPECT().SomeMethod(3, "third").After(secondCall)
+//
+// Example of using InOrder to declare expected call order:
+//
+// gomock.InOrder(
+// mockObj.EXPECT().SomeMethod(1, "first"),
+// mockObj.EXPECT().SomeMethod(2, "second"),
+// mockObj.EXPECT().SomeMethod(3, "third"),
+// )
+//
+// TODO:
+// - Handle different argument/return types (e.g. ..., chan, map, interface).
+package gomock
+
+import (
+ "fmt"
+ "golang.org/x/net/context"
+ "reflect"
+ "runtime"
+ "sync"
+)
+
+// A TestReporter is something that can be used to report test failures.
+// It is satisfied by the standard library's *testing.T.
+type TestReporter interface {
+ Errorf(format string, args ...interface{})
+ Fatalf(format string, args ...interface{})
+}
+
+// A Controller represents the top-level control of a mock ecosystem.
+// It defines the scope and lifetime of mock objects, as well as their expectations.
+// It is safe to call Controller's methods from multiple goroutines.
+type Controller struct {
+ mu sync.Mutex
+ t TestReporter
+ expectedCalls *callSet
+ finished bool
+}
+
+func NewController(t TestReporter) *Controller {
+ return &Controller{
+ t: t,
+ expectedCalls: newCallSet(),
+ }
+}
+
+type cancelReporter struct {
+ t TestReporter
+ cancel func()
+}
+
+func (r *cancelReporter) Errorf(format string, args ...interface{}) { r.t.Errorf(format, args...) }
+func (r *cancelReporter) Fatalf(format string, args ...interface{}) {
+ defer r.cancel()
+ r.t.Fatalf(format, args...)
+}
+
+// WithContext returns a new Controller and a Context, which is cancelled on any
+// fatal failure.
+func WithContext(ctx context.Context, t TestReporter) (*Controller, context.Context) {
+ ctx, cancel := context.WithCancel(ctx)
+ return NewController(&cancelReporter{t, cancel}), ctx
+}
+
+func (ctrl *Controller) RecordCall(receiver interface{}, method string, args ...interface{}) *Call {
+ if h, ok := ctrl.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ recv := reflect.ValueOf(receiver)
+ for i := 0; i < recv.Type().NumMethod(); i++ {
+ if recv.Type().Method(i).Name == method {
+ return ctrl.RecordCallWithMethodType(receiver, method, recv.Method(i).Type(), args...)
+ }
+ }
+ ctrl.t.Fatalf("gomock: failed finding method %s on %T", method, receiver)
+ panic("unreachable")
+}
+
+func (ctrl *Controller) RecordCallWithMethodType(receiver interface{}, method string, methodType reflect.Type, args ...interface{}) *Call {
+ if h, ok := ctrl.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ call := newCall(ctrl.t, receiver, method, methodType, args...)
+
+ ctrl.mu.Lock()
+ defer ctrl.mu.Unlock()
+ ctrl.expectedCalls.Add(call)
+
+ return call
+}
+
+func (ctrl *Controller) Call(receiver interface{}, method string, args ...interface{}) []interface{} {
+ if h, ok := ctrl.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ // Nest this code so we can use defer to make sure the lock is released.
+ actions := func() []func([]interface{}) []interface{} {
+ ctrl.mu.Lock()
+ defer ctrl.mu.Unlock()
+
+ expected, err := ctrl.expectedCalls.FindMatch(receiver, method, args)
+ if err != nil {
+ origin := callerInfo(2)
+ ctrl.t.Fatalf("Unexpected call to %T.%v(%v) at %s because: %s", receiver, method, args, origin, err)
+ }
+
+ // Two things happen here:
+ // * the matching call no longer needs to check prerequite calls,
+ // * and the prerequite calls are no longer expected, so remove them.
+ preReqCalls := expected.dropPrereqs()
+ for _, preReqCall := range preReqCalls {
+ ctrl.expectedCalls.Remove(preReqCall)
+ }
+
+ actions := expected.call(args)
+ if expected.exhausted() {
+ ctrl.expectedCalls.Remove(expected)
+ }
+ return actions
+ }()
+
+ var rets []interface{}
+ for _, action := range actions {
+ if r := action(args); r != nil {
+ rets = r
+ }
+ }
+
+ return rets
+}
+
+func (ctrl *Controller) Finish() {
+ if h, ok := ctrl.t.(testHelper); ok {
+ h.Helper()
+ }
+
+ ctrl.mu.Lock()
+ defer ctrl.mu.Unlock()
+
+ if ctrl.finished {
+ ctrl.t.Fatalf("Controller.Finish was called more than once. It has to be called exactly once.")
+ }
+ ctrl.finished = true
+
+ // If we're currently panicking, probably because this is a deferred call,
+ // pass through the panic.
+ if err := recover(); err != nil {
+ panic(err)
+ }
+
+ // Check that all remaining expected calls are satisfied.
+ failures := ctrl.expectedCalls.Failures()
+ for _, call := range failures {
+ ctrl.t.Errorf("missing call(s) to %v", call)
+ }
+ if len(failures) != 0 {
+ ctrl.t.Fatalf("aborting test due to missing call(s)")
+ }
+}
+
+func callerInfo(skip int) string {
+ if _, file, line, ok := runtime.Caller(skip + 1); ok {
+ return fmt.Sprintf("%s:%d", file, line)
+ }
+ return "unknown file"
+}
+
+type testHelper interface {
+ TestReporter
+ Helper()
+}
diff --git a/vendor/github.com/golang/mock/gomock/matchers.go b/vendor/github.com/golang/mock/gomock/matchers.go
new file mode 100644
index 00000000000..e8b1ddccf03
--- /dev/null
+++ b/vendor/github.com/golang/mock/gomock/matchers.go
@@ -0,0 +1,99 @@
+//go:generate mockgen -destination mock_matcher/mock_matcher.go github.com/golang/mock/gomock Matcher
+
+// Copyright 2010 Google Inc.
+//
+// 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.
+
+package gomock
+
+import (
+ "fmt"
+ "reflect"
+)
+
+// A Matcher is a representation of a class of values.
+// It is used to represent the valid or expected arguments to a mocked method.
+type Matcher interface {
+ // Matches returns whether x is a match.
+ Matches(x interface{}) bool
+
+ // String describes what the matcher matches.
+ String() string
+}
+
+type anyMatcher struct{}
+
+func (anyMatcher) Matches(x interface{}) bool {
+ return true
+}
+
+func (anyMatcher) String() string {
+ return "is anything"
+}
+
+type eqMatcher struct {
+ x interface{}
+}
+
+func (e eqMatcher) Matches(x interface{}) bool {
+ return reflect.DeepEqual(e.x, x)
+}
+
+func (e eqMatcher) String() string {
+ return fmt.Sprintf("is equal to %v", e.x)
+}
+
+type nilMatcher struct{}
+
+func (nilMatcher) Matches(x interface{}) bool {
+ if x == nil {
+ return true
+ }
+
+ v := reflect.ValueOf(x)
+ switch v.Kind() {
+ case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map,
+ reflect.Ptr, reflect.Slice:
+ return v.IsNil()
+ }
+
+ return false
+}
+
+func (nilMatcher) String() string {
+ return "is nil"
+}
+
+type notMatcher struct {
+ m Matcher
+}
+
+func (n notMatcher) Matches(x interface{}) bool {
+ return !n.m.Matches(x)
+}
+
+func (n notMatcher) String() string {
+ // TODO: Improve this if we add a NotString method to the Matcher interface.
+ return "not(" + n.m.String() + ")"
+}
+
+// Constructors
+func Any() Matcher { return anyMatcher{} }
+func Eq(x interface{}) Matcher { return eqMatcher{x} }
+func Nil() Matcher { return nilMatcher{} }
+func Not(x interface{}) Matcher {
+ if m, ok := x.(Matcher); ok {
+ return notMatcher{m}
+ }
+ return notMatcher{Eq(x)}
+}
diff --git a/vendor/github.com/golangci/check/LICENSE b/vendor/github.com/golangci/check/LICENSE
new file mode 100644
index 00000000000..5a1774b8e68
--- /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 00000000000..5dc5f838040
--- /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 .
+
+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 00000000000..8e93e0473b8
--- /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 .
+
+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 00000000000..33de24c0fd9
--- /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 00000000000..ab317d84136
--- /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 00000000000..f34901d7ac4
--- /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 00000000000..e9aad54c0f6
--- /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 00000000000..eb9d7c6255d
--- /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 00000000000..3030a97aec5
--- /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 00000000000..5ad9e25c7f7
--- /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, `
+
+Duplicates
+
+`)
+ return err
+}
+
+func (p *html) PrintClones(dups [][]*syntax.Node) error {
+ p.iota++
+ fmt.Fprintf(p.w, "#%d found %d clones
\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, "%s:%d
\n%s
\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 00000000000..cf39d01b78d
--- /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 00000000000..385217bfc19
--- /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 00000000000..8359fa76f49
--- /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 00000000000..ab145b4f3b6
--- /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 00000000000..73801502581
--- /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 00000000000..a0b1e77e13f
--- /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 00000000000..e2c750afd52
--- /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 00000000000..a2b16b5bd9e
--- /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 00000000000..1095adeb4de
--- /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 00000000000..2a698fcee45
--- /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 00000000000..cc42dd45d1b
--- /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 00000000000..55042312810
--- /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 00000000000..2e7cfc96298
--- /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/go-tools/LICENSE b/vendor/github.com/golangci/go-tools/LICENSE
new file mode 100644
index 00000000000..dfd03145460
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2016 Dominik Honnef
+
+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/go-tools/arg/arg.go b/vendor/github.com/golangci/go-tools/arg/arg.go
new file mode 100644
index 00000000000..6f3aafc4e5f
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/arg/arg.go
@@ -0,0 +1,40 @@
+package arg
+
+var args = map[string]int{
+ "(*sync.Pool).Put.x": 0,
+ "(*text/template.Template).Parse.text": 0,
+ "(io.Seeker).Seek.offset": 0,
+ "(time.Time).Sub.u": 0,
+ "append.elems": 1,
+ "append.slice": 0,
+ "bytes.Equal.a": 0,
+ "bytes.Equal.b": 1,
+ "encoding/binary.Write.data": 2,
+ "errors.New.text": 0,
+ "fmt.Printf.format": 0,
+ "fmt.Fprintf.format": 1,
+ "fmt.Sprintf.a[0]": 1,
+ "fmt.Sprintf.format": 0,
+ "len.v": 0,
+ "make.size[0]": 1,
+ "make.size[1]": 2,
+ "make.t": 0,
+ "net/url.Parse.rawurl": 0,
+ "os.OpenFile.flag": 1,
+ "os/exec.Command.name": 0,
+ "os/signal.Notify.c": 0,
+ "regexp.Compile.expr": 0,
+ "runtime.SetFinalizer.finalizer": 1,
+ "runtime.SetFinalizer.obj": 0,
+ "sort.Sort.data": 0,
+ "time.Parse.layout": 0,
+ "time.Sleep.d": 0,
+}
+
+func Arg(name string) int {
+ n, ok := args[name]
+ if !ok {
+ panic("unknown argument " + name)
+ }
+ return n
+}
diff --git a/vendor/github.com/golangci/go-tools/callgraph/callgraph.go b/vendor/github.com/golangci/go-tools/callgraph/callgraph.go
new file mode 100644
index 00000000000..713a80383f2
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/callgraph/callgraph.go
@@ -0,0 +1,129 @@
+// 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 callgraph defines the call graph and various algorithms
+and utilities to operate on it.
+
+A call graph is a labelled directed graph whose nodes represent
+functions and whose edge labels represent syntactic function call
+sites. The presence of a labelled edge (caller, site, callee)
+indicates that caller may call callee at the specified call site.
+
+A call graph is a multigraph: it may contain multiple edges (caller,
+*, callee) connecting the same pair of nodes, so long as the edges
+differ by label; this occurs when one function calls another function
+from multiple call sites. Also, it may contain multiple edges
+(caller, site, *) that differ only by callee; this indicates a
+polymorphic call.
+
+A SOUND call graph is one that overapproximates the dynamic calling
+behaviors of the program in all possible executions. One call graph
+is more PRECISE than another if it is a smaller overapproximation of
+the dynamic behavior.
+
+All call graphs have a synthetic root node which is responsible for
+calling main() and init().
+
+Calls to built-in functions (e.g. panic, println) are not represented
+in the call graph; they are treated like built-in operators of the
+language.
+
+*/
+package callgraph // import "github.com/golangci/go-tools/callgraph"
+
+// TODO(adonovan): add a function to eliminate wrappers from the
+// callgraph, preserving topology.
+// More generally, we could eliminate "uninteresting" nodes such as
+// nodes from packages we don't care about.
+
+import (
+ "fmt"
+ "go/token"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+// A Graph represents a call graph.
+//
+// A graph may contain nodes that are not reachable from the root.
+// If the call graph is sound, such nodes indicate unreachable
+// functions.
+//
+type Graph struct {
+ Root *Node // the distinguished root node
+ Nodes map[*ssa.Function]*Node // all nodes by function
+}
+
+// New returns a new Graph with the specified root node.
+func New(root *ssa.Function) *Graph {
+ g := &Graph{Nodes: make(map[*ssa.Function]*Node)}
+ g.Root = g.CreateNode(root)
+ return g
+}
+
+// CreateNode returns the Node for fn, creating it if not present.
+func (g *Graph) CreateNode(fn *ssa.Function) *Node {
+ n, ok := g.Nodes[fn]
+ if !ok {
+ n = &Node{Func: fn, ID: len(g.Nodes)}
+ g.Nodes[fn] = n
+ }
+ return n
+}
+
+// A Node represents a node in a call graph.
+type Node struct {
+ Func *ssa.Function // the function this node represents
+ ID int // 0-based sequence number
+ In []*Edge // unordered set of incoming call edges (n.In[*].Callee == n)
+ Out []*Edge // unordered set of outgoing call edges (n.Out[*].Caller == n)
+}
+
+func (n *Node) String() string {
+ return fmt.Sprintf("n%d:%s", n.ID, n.Func)
+}
+
+// A Edge represents an edge in the call graph.
+//
+// Site is nil for edges originating in synthetic or intrinsic
+// functions, e.g. reflect.Call or the root of the call graph.
+type Edge struct {
+ Caller *Node
+ Site ssa.CallInstruction
+ Callee *Node
+}
+
+func (e Edge) String() string {
+ return fmt.Sprintf("%s --> %s", e.Caller, e.Callee)
+}
+
+func (e Edge) Description() string {
+ var prefix string
+ switch e.Site.(type) {
+ case nil:
+ return "synthetic call"
+ case *ssa.Go:
+ prefix = "concurrent "
+ case *ssa.Defer:
+ prefix = "deferred "
+ }
+ return prefix + e.Site.Common().Description()
+}
+
+func (e Edge) Pos() token.Pos {
+ if e.Site == nil {
+ return token.NoPos
+ }
+ return e.Site.Pos()
+}
+
+// AddEdge adds the edge (caller, site, callee) to the call graph.
+// Elimination of duplicate edges is the caller's responsibility.
+func AddEdge(caller *Node, site ssa.CallInstruction, callee *Node) {
+ e := &Edge{caller, site, callee}
+ callee.In = append(callee.In, e)
+ caller.Out = append(caller.Out, e)
+}
diff --git a/vendor/github.com/golangci/go-tools/callgraph/static/static.go b/vendor/github.com/golangci/go-tools/callgraph/static/static.go
new file mode 100644
index 00000000000..6b4e1e3ba35
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/callgraph/static/static.go
@@ -0,0 +1,35 @@
+// Package static computes the call graph of a Go program containing
+// only static call edges.
+package static // import "github.com/golangci/go-tools/callgraph/static"
+
+import (
+ "github.com/golangci/go-tools/callgraph"
+ "github.com/golangci/go-tools/ssa"
+ "github.com/golangci/go-tools/ssa/ssautil"
+)
+
+// CallGraph computes the call graph of the specified program
+// considering only static calls.
+//
+func CallGraph(prog *ssa.Program) *callgraph.Graph {
+ cg := callgraph.New(nil) // TODO(adonovan) eliminate concept of rooted callgraph
+
+ // TODO(adonovan): opt: use only a single pass over the ssa.Program.
+ // TODO(adonovan): opt: this is slower than RTA (perhaps because
+ // the lower precision means so many edges are allocated)!
+ for f := range ssautil.AllFunctions(prog) {
+ fnode := cg.CreateNode(f)
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ if site, ok := instr.(ssa.CallInstruction); ok {
+ if g := site.Common().StaticCallee(); g != nil {
+ gnode := cg.CreateNode(g)
+ callgraph.AddEdge(fnode, site, gnode)
+ }
+ }
+ }
+ }
+ }
+
+ return cg
+}
diff --git a/vendor/github.com/golangci/go-tools/callgraph/util.go b/vendor/github.com/golangci/go-tools/callgraph/util.go
new file mode 100644
index 00000000000..2e8ded1dfa0
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/callgraph/util.go
@@ -0,0 +1,181 @@
+// 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 callgraph
+
+import "github.com/golangci/go-tools/ssa"
+
+// This file provides various utilities over call graphs, such as
+// visitation and path search.
+
+// CalleesOf returns a new set containing all direct callees of the
+// caller node.
+//
+func CalleesOf(caller *Node) map[*Node]bool {
+ callees := make(map[*Node]bool)
+ for _, e := range caller.Out {
+ callees[e.Callee] = true
+ }
+ return callees
+}
+
+// GraphVisitEdges visits all the edges in graph g in depth-first order.
+// The edge function is called for each edge in postorder. If it
+// returns non-nil, visitation stops and GraphVisitEdges returns that
+// value.
+//
+func GraphVisitEdges(g *Graph, edge func(*Edge) error) error {
+ seen := make(map[*Node]bool)
+ var visit func(n *Node) error
+ visit = func(n *Node) error {
+ if !seen[n] {
+ seen[n] = true
+ for _, e := range n.Out {
+ if err := visit(e.Callee); err != nil {
+ return err
+ }
+ if err := edge(e); err != nil {
+ return err
+ }
+ }
+ }
+ return nil
+ }
+ for _, n := range g.Nodes {
+ if err := visit(n); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+// PathSearch finds an arbitrary path starting at node start and
+// ending at some node for which isEnd() returns true. On success,
+// PathSearch returns the path as an ordered list of edges; on
+// failure, it returns nil.
+//
+func PathSearch(start *Node, isEnd func(*Node) bool) []*Edge {
+ stack := make([]*Edge, 0, 32)
+ seen := make(map[*Node]bool)
+ var search func(n *Node) []*Edge
+ search = func(n *Node) []*Edge {
+ if !seen[n] {
+ seen[n] = true
+ if isEnd(n) {
+ return stack
+ }
+ for _, e := range n.Out {
+ stack = append(stack, e) // push
+ if found := search(e.Callee); found != nil {
+ return found
+ }
+ stack = stack[:len(stack)-1] // pop
+ }
+ }
+ return nil
+ }
+ return search(start)
+}
+
+// DeleteSyntheticNodes removes from call graph g all nodes for
+// synthetic functions (except g.Root and package initializers),
+// preserving the topology. In effect, calls to synthetic wrappers
+// are "inlined".
+//
+func (g *Graph) DeleteSyntheticNodes() {
+ // Measurements on the standard library and go.tools show that
+ // resulting graph has ~15% fewer nodes and 4-8% fewer edges
+ // than the input.
+ //
+ // Inlining a wrapper of in-degree m, out-degree n adds m*n
+ // and removes m+n edges. Since most wrappers are monomorphic
+ // (n=1) this results in a slight reduction. Polymorphic
+ // wrappers (n>1), e.g. from embedding an interface value
+ // inside a struct to satisfy some interface, cause an
+ // increase in the graph, but they seem to be uncommon.
+
+ // Hash all existing edges to avoid creating duplicates.
+ edges := make(map[Edge]bool)
+ for _, cgn := range g.Nodes {
+ for _, e := range cgn.Out {
+ edges[*e] = true
+ }
+ }
+ for fn, cgn := range g.Nodes {
+ if cgn == g.Root || fn.Synthetic == "" || isInit(cgn.Func) {
+ continue // keep
+ }
+ for _, eIn := range cgn.In {
+ for _, eOut := range cgn.Out {
+ newEdge := Edge{eIn.Caller, eIn.Site, eOut.Callee}
+ if edges[newEdge] {
+ continue // don't add duplicate
+ }
+ AddEdge(eIn.Caller, eIn.Site, eOut.Callee)
+ edges[newEdge] = true
+ }
+ }
+ g.DeleteNode(cgn)
+ }
+}
+
+func isInit(fn *ssa.Function) bool {
+ return fn.Pkg != nil && fn.Pkg.Func("init") == fn
+}
+
+// DeleteNode removes node n and its edges from the graph g.
+// (NB: not efficient for batch deletion.)
+func (g *Graph) DeleteNode(n *Node) {
+ n.deleteIns()
+ n.deleteOuts()
+ delete(g.Nodes, n.Func)
+}
+
+// deleteIns deletes all incoming edges to n.
+func (n *Node) deleteIns() {
+ for _, e := range n.In {
+ removeOutEdge(e)
+ }
+ n.In = nil
+}
+
+// deleteOuts deletes all outgoing edges from n.
+func (n *Node) deleteOuts() {
+ for _, e := range n.Out {
+ removeInEdge(e)
+ }
+ n.Out = nil
+}
+
+// removeOutEdge removes edge.Caller's outgoing edge 'edge'.
+func removeOutEdge(edge *Edge) {
+ caller := edge.Caller
+ n := len(caller.Out)
+ for i, e := range caller.Out {
+ if e == edge {
+ // Replace it with the final element and shrink the slice.
+ caller.Out[i] = caller.Out[n-1]
+ caller.Out[n-1] = nil // aid GC
+ caller.Out = caller.Out[:n-1]
+ return
+ }
+ }
+ panic("edge not found: " + edge.String())
+}
+
+// removeInEdge removes edge.Callee's incoming edge 'edge'.
+func removeInEdge(edge *Edge) {
+ caller := edge.Callee
+ n := len(caller.In)
+ for i, e := range caller.In {
+ if e == edge {
+ // Replace it with the final element and shrink the slice.
+ caller.In[i] = caller.In[n-1]
+ caller.In[n-1] = nil // aid GC
+ caller.In = caller.In[:n-1]
+ return
+ }
+ }
+ panic("edge not found: " + edge.String())
+}
diff --git a/vendor/github.com/golangci/go-tools/config/config.go b/vendor/github.com/golangci/go-tools/config/config.go
new file mode 100644
index 00000000000..112980b498d
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/config/config.go
@@ -0,0 +1,162 @@
+package config
+
+import (
+ "os"
+ "path/filepath"
+
+ "github.com/BurntSushi/toml"
+)
+
+func mergeLists(a, b []string) []string {
+ out := make([]string, 0, len(a)+len(b))
+ for _, el := range b {
+ if el == "inherit" {
+ out = append(out, a...)
+ } else {
+ out = append(out, el)
+ }
+ }
+
+ return out
+}
+
+func normalizeList(list []string) []string {
+ if len(list) > 1 {
+ nlist := make([]string, 0, len(list))
+ nlist = append(nlist, list[0])
+ for i, el := range list[1:] {
+ if el != list[i] {
+ nlist = append(nlist, el)
+ }
+ }
+ list = nlist
+ }
+
+ for _, el := range list {
+ if el == "inherit" {
+ // This should never happen, because the default config
+ // should not use "inherit"
+ panic(`unresolved "inherit"`)
+ }
+ }
+
+ return list
+}
+
+func (cfg Config) Merge(ocfg Config) Config {
+ if ocfg.Checks != nil {
+ cfg.Checks = mergeLists(cfg.Checks, ocfg.Checks)
+ }
+ if ocfg.Initialisms != nil {
+ cfg.Initialisms = mergeLists(cfg.Initialisms, ocfg.Initialisms)
+ }
+ if ocfg.DotImportWhitelist != nil {
+ cfg.DotImportWhitelist = mergeLists(cfg.DotImportWhitelist, ocfg.DotImportWhitelist)
+ }
+ if ocfg.HTTPStatusCodeWhitelist != nil {
+ cfg.HTTPStatusCodeWhitelist = mergeLists(cfg.HTTPStatusCodeWhitelist, ocfg.HTTPStatusCodeWhitelist)
+ }
+ return cfg
+}
+
+type Config struct {
+ // TODO(dh): this implementation makes it impossible for external
+ // clients to add their own checkers with configuration. At the
+ // moment, we don't really care about that; we don't encourage
+ // that people use this package. In the future, we may. The
+ // obvious solution would be using map[string]interface{}, but
+ // that's obviously subpar.
+
+ Checks []string `toml:"checks"`
+ Initialisms []string `toml:"initialisms"`
+ DotImportWhitelist []string `toml:"dot_import_whitelist"`
+ HTTPStatusCodeWhitelist []string `toml:"http_status_code_whitelist"`
+}
+
+var defaultConfig = Config{
+ Checks: []string{"all", "-ST1000", "-ST1003", "-ST1016"},
+ Initialisms: []string{
+ "ACL", "API", "ASCII", "CPU", "CSS", "DNS",
+ "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID",
+ "IP", "JSON", "QPS", "RAM", "RPC", "SLA",
+ "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL",
+ "UDP", "UI", "GID", "UID", "UUID", "URI",
+ "URL", "UTF8", "VM", "XML", "XMPP", "XSRF",
+ "XSS",
+ },
+ DotImportWhitelist: []string{},
+ HTTPStatusCodeWhitelist: []string{"200", "400", "404", "500"},
+}
+
+const configName = "staticcheck.conf"
+
+func parseConfigs(dir string) ([]Config, error) {
+ var out []Config
+
+ // TODO(dh): consider stopping at the GOPATH/module boundary
+ for dir != "" {
+ f, err := os.Open(filepath.Join(dir, configName))
+ if os.IsNotExist(err) {
+ ndir := filepath.Dir(dir)
+ if ndir == dir {
+ break
+ }
+ dir = ndir
+ continue
+ }
+ if err != nil {
+ return nil, err
+ }
+ var cfg Config
+ _, err = toml.DecodeReader(f, &cfg)
+ f.Close()
+ if err != nil {
+ return nil, err
+ }
+ out = append(out, cfg)
+ ndir := filepath.Dir(dir)
+ if ndir == dir {
+ break
+ }
+ dir = ndir
+ }
+ out = append(out, defaultConfig)
+ if len(out) < 2 {
+ return out, nil
+ }
+ for i := 0; i < len(out)/2; i++ {
+ out[i], out[len(out)-1-i] = out[len(out)-1-i], out[i]
+ }
+ return out, nil
+}
+
+func mergeConfigs(confs []Config) Config {
+ if len(confs) == 0 {
+ // This shouldn't happen because we always have at least a
+ // default config.
+ panic("trying to merge zero configs")
+ }
+ if len(confs) == 1 {
+ return confs[0]
+ }
+ conf := confs[0]
+ for _, oconf := range confs[1:] {
+ conf = conf.Merge(oconf)
+ }
+ return conf
+}
+
+func Load(dir string) (Config, error) {
+ confs, err := parseConfigs(dir)
+ if err != nil {
+ return Config{}, err
+ }
+ conf := mergeConfigs(confs)
+
+ conf.Checks = normalizeList(conf.Checks)
+ conf.Initialisms = normalizeList(conf.Initialisms)
+ conf.DotImportWhitelist = normalizeList(conf.DotImportWhitelist)
+ conf.HTTPStatusCodeWhitelist = normalizeList(conf.HTTPStatusCodeWhitelist)
+
+ return conf, nil
+}
diff --git a/vendor/github.com/golangci/go-tools/config/example.conf b/vendor/github.com/golangci/go-tools/config/example.conf
new file mode 100644
index 00000000000..5ffc597f996
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/config/example.conf
@@ -0,0 +1,10 @@
+checks = ["all", "-ST1003", "-ST1014"]
+initialisms = ["ACL", "API", "ASCII", "CPU", "CSS", "DNS",
+ "EOF", "GUID", "HTML", "HTTP", "HTTPS", "ID",
+ "IP", "JSON", "QPS", "RAM", "RPC", "SLA",
+ "SMTP", "SQL", "SSH", "TCP", "TLS", "TTL",
+ "UDP", "UI", "GID", "UID", "UUID", "URI",
+ "URL", "UTF8", "VM", "XML", "XMPP", "XSRF",
+ "XSS"]
+dot_import_whitelist = []
+http_status_code_whitelist = ["200", "400", "404", "500"]
diff --git a/vendor/github.com/golangci/go-tools/deprecated/stdlib.go b/vendor/github.com/golangci/go-tools/deprecated/stdlib.go
new file mode 100644
index 00000000000..b6b217c3e37
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/deprecated/stdlib.go
@@ -0,0 +1,54 @@
+package deprecated
+
+type Deprecation struct {
+ DeprecatedSince int
+ AlternativeAvailableSince int
+}
+
+var Stdlib = map[string]Deprecation{
+ "image/jpeg.Reader": {4, 0},
+ // FIXME(dh): AllowBinary isn't being detected as deprecated
+ // because the comment has a newline right after "Deprecated:"
+ "go/build.AllowBinary": {7, 7},
+ "(archive/zip.FileHeader).CompressedSize": {1, 1},
+ "(archive/zip.FileHeader).UncompressedSize": {1, 1},
+ "(go/doc.Package).Bugs": {1, 1},
+ "os.SEEK_SET": {7, 7},
+ "os.SEEK_CUR": {7, 7},
+ "os.SEEK_END": {7, 7},
+ "(net.Dialer).Cancel": {7, 7},
+ "runtime.CPUProfile": {9, 0},
+ "compress/flate.ReadError": {6, 6},
+ "compress/flate.WriteError": {6, 6},
+ "path/filepath.HasPrefix": {0, 0},
+ "(net/http.Transport).Dial": {7, 7},
+ "(*net/http.Transport).CancelRequest": {6, 5},
+ "net/http.ErrWriteAfterFlush": {7, 0},
+ "net/http.ErrHeaderTooLong": {8, 0},
+ "net/http.ErrShortBody": {8, 0},
+ "net/http.ErrMissingContentLength": {8, 0},
+ "net/http/httputil.ErrPersistEOF": {0, 0},
+ "net/http/httputil.ErrClosed": {0, 0},
+ "net/http/httputil.ErrPipeline": {0, 0},
+ "net/http/httputil.ServerConn": {0, 0},
+ "net/http/httputil.NewServerConn": {0, 0},
+ "net/http/httputil.ClientConn": {0, 0},
+ "net/http/httputil.NewClientConn": {0, 0},
+ "net/http/httputil.NewProxyClientConn": {0, 0},
+ "(net/http.Request).Cancel": {7, 7},
+ "(text/template/parse.PipeNode).Line": {1, 1},
+ "(text/template/parse.ActionNode).Line": {1, 1},
+ "(text/template/parse.BranchNode).Line": {1, 1},
+ "(text/template/parse.TemplateNode).Line": {1, 1},
+ "database/sql/driver.ColumnConverter": {9, 9},
+ "database/sql/driver.Execer": {8, 8},
+ "database/sql/driver.Queryer": {8, 8},
+ "(database/sql/driver.Conn).Begin": {8, 8},
+ "(database/sql/driver.Stmt).Exec": {8, 8},
+ "(database/sql/driver.Stmt).Query": {8, 8},
+ "syscall.StringByteSlice": {1, 1},
+ "syscall.StringBytePtr": {1, 1},
+ "syscall.StringSlicePtr": {1, 1},
+ "syscall.StringToUTF16": {1, 1},
+ "syscall.StringToUTF16Ptr": {1, 1},
+}
diff --git a/vendor/github.com/golangci/go-tools/functions/concrete.go b/vendor/github.com/golangci/go-tools/functions/concrete.go
new file mode 100644
index 00000000000..4a47e9fa866
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/functions/concrete.go
@@ -0,0 +1,56 @@
+package functions
+
+import (
+ "go/token"
+ "go/types"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+func concreteReturnTypes(fn *ssa.Function) []*types.Tuple {
+ res := fn.Signature.Results()
+ if res == nil {
+ return nil
+ }
+ ifaces := make([]bool, res.Len())
+ any := false
+ for i := 0; i < res.Len(); i++ {
+ _, ifaces[i] = res.At(i).Type().Underlying().(*types.Interface)
+ any = any || ifaces[i]
+ }
+ if !any {
+ return []*types.Tuple{res}
+ }
+ var out []*types.Tuple
+ for _, block := range fn.Blocks {
+ if len(block.Instrs) == 0 {
+ continue
+ }
+ ret, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return)
+ if !ok {
+ continue
+ }
+ vars := make([]*types.Var, res.Len())
+ for i, v := range ret.Results {
+ var typ types.Type
+ if !ifaces[i] {
+ typ = res.At(i).Type()
+ } else if mi, ok := v.(*ssa.MakeInterface); ok {
+ // TODO(dh): if mi.X is a function call that returns
+ // an interface, call concreteReturnTypes on that
+ // function (or, really, go through Descriptions,
+ // avoid infinite recursion etc, just like nil error
+ // detection)
+
+ // TODO(dh): support Phi nodes
+ typ = mi.X.Type()
+ } else {
+ typ = res.At(i).Type()
+ }
+ vars[i] = types.NewParam(token.NoPos, nil, "", typ)
+ }
+ out = append(out, types.NewTuple(vars...))
+ }
+ // TODO(dh): deduplicate out
+ return out
+}
diff --git a/vendor/github.com/golangci/go-tools/functions/functions.go b/vendor/github.com/golangci/go-tools/functions/functions.go
new file mode 100644
index 00000000000..e8679603903
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/functions/functions.go
@@ -0,0 +1,150 @@
+package functions
+
+import (
+ "go/types"
+ "sync"
+
+ "github.com/golangci/go-tools/callgraph"
+ "github.com/golangci/go-tools/callgraph/static"
+ "github.com/golangci/go-tools/ssa"
+ "github.com/golangci/go-tools/staticcheck/vrp"
+)
+
+var stdlibDescs = map[string]Description{
+ "errors.New": {Pure: true},
+
+ "fmt.Errorf": {Pure: true},
+ "fmt.Sprintf": {Pure: true},
+ "fmt.Sprint": {Pure: true},
+
+ "sort.Reverse": {Pure: true},
+
+ "strings.Map": {Pure: true},
+ "strings.Repeat": {Pure: true},
+ "strings.Replace": {Pure: true},
+ "strings.Title": {Pure: true},
+ "strings.ToLower": {Pure: true},
+ "strings.ToLowerSpecial": {Pure: true},
+ "strings.ToTitle": {Pure: true},
+ "strings.ToTitleSpecial": {Pure: true},
+ "strings.ToUpper": {Pure: true},
+ "strings.ToUpperSpecial": {Pure: true},
+ "strings.Trim": {Pure: true},
+ "strings.TrimFunc": {Pure: true},
+ "strings.TrimLeft": {Pure: true},
+ "strings.TrimLeftFunc": {Pure: true},
+ "strings.TrimPrefix": {Pure: true},
+ "strings.TrimRight": {Pure: true},
+ "strings.TrimRightFunc": {Pure: true},
+ "strings.TrimSpace": {Pure: true},
+ "strings.TrimSuffix": {Pure: true},
+
+ "(*net/http.Request).WithContext": {Pure: true},
+
+ "math/rand.Read": {NilError: true},
+ "(*math/rand.Rand).Read": {NilError: true},
+}
+
+type Description struct {
+ // The function is known to be pure
+ Pure bool
+ // The function is known to be a stub
+ Stub bool
+ // The function is known to never return (panics notwithstanding)
+ Infinite bool
+ // Variable ranges
+ Ranges vrp.Ranges
+ Loops []Loop
+ // Function returns an error as its last argument, but it is
+ // always nil
+ NilError bool
+ ConcreteReturnTypes []*types.Tuple
+}
+
+type descriptionEntry struct {
+ ready chan struct{}
+ result Description
+}
+
+type Descriptions struct {
+ CallGraph *callgraph.Graph
+ mu sync.Mutex
+ cache map[*ssa.Function]*descriptionEntry
+}
+
+func NewDescriptions(prog *ssa.Program) *Descriptions {
+ return &Descriptions{
+ CallGraph: static.CallGraph(prog),
+ cache: map[*ssa.Function]*descriptionEntry{},
+ }
+}
+
+func (d *Descriptions) Get(fn *ssa.Function) Description {
+ d.mu.Lock()
+ fd := d.cache[fn]
+ if fd == nil {
+ fd = &descriptionEntry{
+ ready: make(chan struct{}),
+ }
+ d.cache[fn] = fd
+ d.mu.Unlock()
+
+ {
+ fd.result = stdlibDescs[fn.RelString(nil)]
+ fd.result.Pure = fd.result.Pure || d.IsPure(fn)
+ fd.result.Stub = fd.result.Stub || d.IsStub(fn)
+ fd.result.Infinite = fd.result.Infinite || !terminates(fn)
+ fd.result.Ranges = vrp.BuildGraph(fn).Solve()
+ fd.result.Loops = findLoops(fn)
+ fd.result.NilError = fd.result.NilError || IsNilError(fn)
+ fd.result.ConcreteReturnTypes = concreteReturnTypes(fn)
+ }
+
+ close(fd.ready)
+ } else {
+ d.mu.Unlock()
+ <-fd.ready
+ }
+ return fd.result
+}
+
+func IsNilError(fn *ssa.Function) bool {
+ // TODO(dh): This is very simplistic, as we only look for constant
+ // nil returns. A more advanced approach would work transitively.
+ // An even more advanced approach would be context-aware and
+ // determine nil errors based on inputs (e.g. io.WriteString to a
+ // bytes.Buffer will always return nil, but an io.WriteString to
+ // an os.File might not). Similarly, an os.File opened for reading
+ // won't error on Close, but other files will.
+ res := fn.Signature.Results()
+ if res.Len() == 0 {
+ return false
+ }
+ last := res.At(res.Len() - 1)
+ if types.TypeString(last.Type(), nil) != "error" {
+ return false
+ }
+
+ if fn.Blocks == nil {
+ return false
+ }
+ for _, block := range fn.Blocks {
+ if len(block.Instrs) == 0 {
+ continue
+ }
+ ins := block.Instrs[len(block.Instrs)-1]
+ ret, ok := ins.(*ssa.Return)
+ if !ok {
+ continue
+ }
+ v := ret.Results[len(ret.Results)-1]
+ c, ok := v.(*ssa.Const)
+ if !ok {
+ return false
+ }
+ if !c.IsNil() {
+ return false
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/golangci/go-tools/functions/loops.go b/vendor/github.com/golangci/go-tools/functions/loops.go
new file mode 100644
index 00000000000..377fab87c06
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/functions/loops.go
@@ -0,0 +1,50 @@
+package functions
+
+import "github.com/golangci/go-tools/ssa"
+
+type Loop map[*ssa.BasicBlock]bool
+
+func findLoops(fn *ssa.Function) []Loop {
+ if fn.Blocks == nil {
+ return nil
+ }
+ tree := fn.DomPreorder()
+ var sets []Loop
+ for _, h := range tree {
+ for _, n := range h.Preds {
+ if !h.Dominates(n) {
+ continue
+ }
+ // n is a back-edge to h
+ // h is the loop header
+ if n == h {
+ sets = append(sets, Loop{n: true})
+ continue
+ }
+ set := Loop{h: true, n: true}
+ for _, b := range allPredsBut(n, h, nil) {
+ set[b] = true
+ }
+ sets = append(sets, set)
+ }
+ }
+ return sets
+}
+
+func allPredsBut(b, but *ssa.BasicBlock, list []*ssa.BasicBlock) []*ssa.BasicBlock {
+outer:
+ for _, pred := range b.Preds {
+ if pred == but {
+ continue
+ }
+ for _, p := range list {
+ // TODO improve big-o complexity of this function
+ if pred == p {
+ continue outer
+ }
+ }
+ list = append(list, pred)
+ list = allPredsBut(pred, but, list)
+ }
+ return list
+}
diff --git a/vendor/github.com/golangci/go-tools/functions/pure.go b/vendor/github.com/golangci/go-tools/functions/pure.go
new file mode 100644
index 00000000000..ae084073fbe
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/functions/pure.go
@@ -0,0 +1,123 @@
+package functions
+
+import (
+ "go/token"
+ "go/types"
+
+ "github.com/golangci/go-tools/callgraph"
+ "github.com/golangci/go-tools/lint/lintdsl"
+ "github.com/golangci/go-tools/ssa"
+)
+
+// IsStub reports whether a function is a stub. A function is
+// considered a stub if it has no instructions or exactly one
+// instruction, which must be either returning only constant values or
+// a panic.
+func (d *Descriptions) IsStub(fn *ssa.Function) bool {
+ if len(fn.Blocks) == 0 {
+ return true
+ }
+ if len(fn.Blocks) > 1 {
+ return false
+ }
+ instrs := lintdsl.FilterDebug(fn.Blocks[0].Instrs)
+ if len(instrs) != 1 {
+ return false
+ }
+
+ switch instrs[0].(type) {
+ case *ssa.Return:
+ // Since this is the only instruction, the return value must
+ // be a constant. We consider all constants as stubs, not just
+ // the zero value. This does not, unfortunately, cover zero
+ // initialised structs, as these cause additional
+ // instructions.
+ return true
+ case *ssa.Panic:
+ return true
+ default:
+ return false
+ }
+}
+
+func (d *Descriptions) IsPure(fn *ssa.Function) bool {
+ if fn.Signature.Results().Len() == 0 {
+ // A function with no return values is empty or is doing some
+ // work we cannot see (for example because of build tags);
+ // don't consider it pure.
+ return false
+ }
+
+ for _, param := range fn.Params {
+ if _, ok := param.Type().Underlying().(*types.Basic); !ok {
+ return false
+ }
+ }
+
+ if fn.Blocks == nil {
+ return false
+ }
+ checkCall := func(common *ssa.CallCommon) bool {
+ if common.IsInvoke() {
+ return false
+ }
+ builtin, ok := common.Value.(*ssa.Builtin)
+ if !ok {
+ if common.StaticCallee() != fn {
+ if common.StaticCallee() == nil {
+ return false
+ }
+ // TODO(dh): ideally, IsPure wouldn't be responsible
+ // for avoiding infinite recursion, but
+ // FunctionDescriptions would be.
+ node := d.CallGraph.CreateNode(common.StaticCallee())
+ if callgraph.PathSearch(node, func(other *callgraph.Node) bool {
+ return other.Func == fn
+ }) != nil {
+ return false
+ }
+ if !d.Get(common.StaticCallee()).Pure {
+ return false
+ }
+ }
+ } else {
+ switch builtin.Name() {
+ case "len", "cap", "make", "new":
+ default:
+ return false
+ }
+ }
+ return true
+ }
+ for _, b := range fn.Blocks {
+ for _, ins := range b.Instrs {
+ switch ins := ins.(type) {
+ case *ssa.Call:
+ if !checkCall(ins.Common()) {
+ return false
+ }
+ case *ssa.Defer:
+ if !checkCall(&ins.Call) {
+ return false
+ }
+ case *ssa.Select:
+ return false
+ case *ssa.Send:
+ return false
+ case *ssa.Go:
+ return false
+ case *ssa.Panic:
+ return false
+ case *ssa.Store:
+ return false
+ case *ssa.FieldAddr:
+ return false
+ case *ssa.UnOp:
+ if ins.Op == token.MUL || ins.Op == token.AND {
+ return false
+ }
+ }
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/golangci/go-tools/functions/terminates.go b/vendor/github.com/golangci/go-tools/functions/terminates.go
new file mode 100644
index 00000000000..0674edadc57
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/functions/terminates.go
@@ -0,0 +1,24 @@
+package functions
+
+import "github.com/golangci/go-tools/ssa"
+
+// terminates reports whether fn is supposed to return, that is if it
+// has at least one theoretic path that returns from the function.
+// Explicit panics do not count as terminating.
+func terminates(fn *ssa.Function) bool {
+ if fn.Blocks == nil {
+ // assuming that a function terminates is the conservative
+ // choice
+ return true
+ }
+
+ for _, block := range fn.Blocks {
+ if len(block.Instrs) == 0 {
+ continue
+ }
+ if _, ok := block.Instrs[len(block.Instrs)-1].(*ssa.Return); ok {
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/go-tools/internal/sharedcheck/lint.go b/vendor/github.com/golangci/go-tools/internal/sharedcheck/lint.go
new file mode 100644
index 00000000000..0b2e91b1ecc
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/internal/sharedcheck/lint.go
@@ -0,0 +1,68 @@
+package sharedcheck
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+ "github.com/golangci/go-tools/ssa"
+)
+
+func CheckRangeStringRunes(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ fn := func(node ast.Node) bool {
+ rng, ok := node.(*ast.RangeStmt)
+ if !ok || !IsBlank(rng.Key) {
+ return true
+ }
+
+ v, _ := ssafn.ValueForExpr(rng.X)
+
+ // Check that we're converting from string to []rune
+ val, _ := v.(*ssa.Convert)
+ if val == nil {
+ return true
+ }
+ Tsrc, ok := val.X.Type().(*types.Basic)
+ if !ok || Tsrc.Kind() != types.String {
+ return true
+ }
+ Tdst, ok := val.Type().(*types.Slice)
+ if !ok {
+ return true
+ }
+ TdstElem, ok := Tdst.Elem().(*types.Basic)
+ if !ok || TdstElem.Kind() != types.Int32 {
+ return true
+ }
+
+ // Check that the result of the conversion is only used to
+ // range over
+ refs := val.Referrers()
+ if refs == nil {
+ return true
+ }
+
+ // Expect two refs: one for obtaining the length of the slice,
+ // one for accessing the elements
+ if len(FilterDebug(*refs)) != 2 {
+ // TODO(dh): right now, we check that only one place
+ // refers to our slice. This will miss cases such as
+ // ranging over the slice twice. Ideally, we'd ensure that
+ // the slice is only used for ranging over (without
+ // accessing the key), but that is harder to do because in
+ // SSA form, ranging over a slice looks like an ordinary
+ // loop with index increments and slice accesses. We'd
+ // have to look at the associated AST node to check that
+ // it's a range statement.
+ return true
+ }
+
+ j.Errorf(rng, "should range over string, not []rune(string)")
+
+ return true
+ }
+ Inspect(ssafn.Syntax(), fn)
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/lint/LICENSE b/vendor/github.com/golangci/go-tools/lint/LICENSE
new file mode 100644
index 00000000000..796130a123a
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/lint/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2013 The Go Authors. All rights reserved.
+Copyright (c) 2016 Dominik Honnef. 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/go-tools/lint/generated.go b/vendor/github.com/golangci/go-tools/lint/generated.go
new file mode 100644
index 00000000000..d407223e780
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/lint/generated.go
@@ -0,0 +1,33 @@
+package lint
+
+import (
+ "bufio"
+ "bytes"
+ "io"
+)
+
+var (
+ prefix = []byte("// Code generated ")
+ suffix = []byte(" DO NOT EDIT.")
+ nl = []byte("\n")
+ crnl = []byte("\r\n")
+)
+
+func isGenerated(r io.Reader) bool {
+ br := bufio.NewReader(r)
+ for {
+ s, err := br.ReadBytes('\n')
+ if err != nil && err != io.EOF {
+ return false
+ }
+ s = bytes.TrimSuffix(s, crnl)
+ s = bytes.TrimSuffix(s, nl)
+ if bytes.HasPrefix(s, prefix) && bytes.HasSuffix(s, suffix) {
+ return true
+ }
+ if err == io.EOF {
+ break
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/go-tools/lint/lint.go b/vendor/github.com/golangci/go-tools/lint/lint.go
new file mode 100644
index 00000000000..a5a9feef024
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/lint/lint.go
@@ -0,0 +1,717 @@
+// Package lint provides the foundation for tools like staticcheck
+package lint // import "github.com/golangci/go-tools/lint"
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "io"
+ "os"
+ "path/filepath"
+ "runtime/debug"
+ "sort"
+ "strings"
+ "sync"
+ "time"
+ "unicode"
+
+ "github.com/golangci/go-tools/config"
+ "github.com/golangci/go-tools/ssa"
+ "github.com/golangci/go-tools/ssa/ssautil"
+ "golang.org/x/tools/go/packages"
+)
+
+type Job struct {
+ Program *Program
+
+ checker string
+ check Check
+ problems []Problem
+
+ duration time.Duration
+ panicErr error
+}
+
+type Ignore interface {
+ Match(p Problem) bool
+}
+
+type LineIgnore struct {
+ File string
+ Line int
+ Checks []string
+ matched bool
+ pos token.Pos
+}
+
+func (li *LineIgnore) Match(p Problem) bool {
+ if p.Position.Filename != li.File || p.Position.Line != li.Line {
+ return false
+ }
+ for _, c := range li.Checks {
+ if m, _ := filepath.Match(c, p.Check); m {
+ li.matched = true
+ return true
+ }
+ }
+ return false
+}
+
+func (li *LineIgnore) String() string {
+ matched := "not matched"
+ if li.matched {
+ matched = "matched"
+ }
+ return fmt.Sprintf("%s:%d %s (%s)", li.File, li.Line, strings.Join(li.Checks, ", "), matched)
+}
+
+type FileIgnore struct {
+ File string
+ Checks []string
+}
+
+func (fi *FileIgnore) Match(p Problem) bool {
+ if p.Position.Filename != fi.File {
+ return false
+ }
+ for _, c := range fi.Checks {
+ if m, _ := filepath.Match(c, p.Check); m {
+ return true
+ }
+ }
+ return false
+}
+
+type GlobIgnore struct {
+ Pattern string
+ Checks []string
+}
+
+func (gi *GlobIgnore) Match(p Problem) bool {
+ if gi.Pattern != "*" {
+ pkgpath := p.Package.Types.Path()
+ if strings.HasSuffix(pkgpath, "_test") {
+ pkgpath = pkgpath[:len(pkgpath)-len("_test")]
+ }
+ name := filepath.Join(pkgpath, filepath.Base(p.Position.Filename))
+ if m, _ := filepath.Match(gi.Pattern, name); !m {
+ return false
+ }
+ }
+ for _, c := range gi.Checks {
+ if m, _ := filepath.Match(c, p.Check); m {
+ return true
+ }
+ }
+ return false
+}
+
+type Program struct {
+ SSA *ssa.Program
+ InitialPackages []*Pkg
+ InitialFunctions []*ssa.Function
+ AllPackages []*packages.Package
+ AllFunctions []*ssa.Function
+ Files []*ast.File
+ GoVersion int
+
+ tokenFileMap map[*token.File]*ast.File
+ astFileMap map[*ast.File]*Pkg
+ packagesMap map[string]*packages.Package
+
+ genMu sync.RWMutex
+ generatedMap map[string]bool
+}
+
+func (prog *Program) Fset() *token.FileSet {
+ return prog.InitialPackages[0].Fset
+}
+
+type Func func(*Job)
+
+type Severity uint8
+
+const (
+ Error Severity = iota
+ Warning
+ Ignored
+)
+
+// 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
+ Check string
+ Checker string
+ Package *Pkg
+ Severity Severity
+}
+
+func (p *Problem) String() string {
+ if p.Check == "" {
+ return p.Text
+ }
+ return fmt.Sprintf("%s (%s)", p.Text, p.Check)
+}
+
+type Checker interface {
+ Name() string
+ Prefix() string
+ Init(*Program)
+ Checks() []Check
+}
+
+type Check struct {
+ Fn Func
+ ID string
+ FilterGenerated bool
+}
+
+// A Linter lints Go source code.
+type Linter struct {
+ Checkers []Checker
+ Ignores []Ignore
+ GoVersion int
+ ReturnIgnored bool
+ Config config.Config
+
+ MaxConcurrentJobs int
+ PrintStats bool
+
+ automaticIgnores []Ignore
+}
+
+func (l *Linter) ignore(p Problem) bool {
+ ignored := false
+ for _, ig := range l.automaticIgnores {
+ // We cannot short-circuit these, as we want to record, for
+ // each ignore, whether it matched or not.
+ if ig.Match(p) {
+ ignored = true
+ }
+ }
+ if ignored {
+ // no need to execute other ignores if we've already had a
+ // match.
+ return true
+ }
+ for _, ig := range l.Ignores {
+ // We can short-circuit here, as we aren't tracking any
+ // information.
+ if ig.Match(p) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (prog *Program) File(node Positioner) *ast.File {
+ return prog.tokenFileMap[prog.SSA.Fset.File(node.Pos())]
+}
+
+func (j *Job) File(node Positioner) *ast.File {
+ return j.Program.File(node)
+}
+
+func parseDirective(s string) (cmd string, args []string) {
+ if !strings.HasPrefix(s, "//lint:") {
+ return "", nil
+ }
+ s = strings.TrimPrefix(s, "//lint:")
+ fields := strings.Split(s, " ")
+ return fields[0], fields[1:]
+}
+
+type PerfStats struct {
+ PackageLoading time.Duration
+ SSABuild time.Duration
+ OtherInitWork time.Duration
+ CheckerInits map[string]time.Duration
+ Jobs []JobStat
+}
+
+type JobStat struct {
+ Job string
+ Duration time.Duration
+}
+
+func (stats *PerfStats) Print(w io.Writer) {
+ fmt.Fprintln(w, "Package loading:", stats.PackageLoading)
+ fmt.Fprintln(w, "SSA build:", stats.SSABuild)
+ fmt.Fprintln(w, "Other init work:", stats.OtherInitWork)
+
+ fmt.Fprintln(w, "Checker inits:")
+ for checker, d := range stats.CheckerInits {
+ fmt.Fprintf(w, "\t%s: %s\n", checker, d)
+ }
+ fmt.Fprintln(w)
+
+ fmt.Fprintln(w, "Jobs:")
+ sort.Slice(stats.Jobs, func(i, j int) bool {
+ return stats.Jobs[i].Duration < stats.Jobs[j].Duration
+ })
+ var total time.Duration
+ for _, job := range stats.Jobs {
+ fmt.Fprintf(w, "\t%s: %s\n", job.Job, job.Duration)
+ total += job.Duration
+ }
+ fmt.Fprintf(w, "\tTotal: %s\n", total)
+}
+
+func (l *Linter) Lint(initial []*packages.Package, stats *PerfStats) []Problem {
+ allPkgs := allPackages(initial)
+ t := time.Now()
+ ssaprog, _ := ssautil.Packages(allPkgs, ssa.GlobalDebug)
+ ssaprog.Build()
+ if stats != nil {
+ stats.SSABuild = time.Since(t)
+ }
+
+ t = time.Now()
+ pkgMap := map[*ssa.Package]*Pkg{}
+ var pkgs []*Pkg
+ for _, pkg := range initial {
+ ssapkg := ssaprog.Package(pkg.Types)
+ var cfg config.Config
+ if len(pkg.GoFiles) != 0 {
+ path := pkg.GoFiles[0]
+ dir := filepath.Dir(path)
+ var err error
+ // OPT(dh): we're rebuilding the entire config tree for
+ // each package. for example, if we check a/b/c and
+ // a/b/c/d, we'll process a, a/b, a/b/c, a, a/b, a/b/c,
+ // a/b/c/d – we should cache configs per package and only
+ // load the new levels.
+ cfg, err = config.Load(dir)
+ if err != nil {
+ // FIXME(dh): we couldn't load the config, what are we
+ // supposed to do? probably tell the user somehow
+ }
+ cfg = cfg.Merge(l.Config)
+ }
+
+ pkg := &Pkg{
+ SSA: ssapkg,
+ Package: pkg,
+ Config: cfg,
+ }
+ pkgMap[ssapkg] = pkg
+ pkgs = append(pkgs, pkg)
+ }
+
+ prog := &Program{
+ SSA: ssaprog,
+ InitialPackages: pkgs,
+ AllPackages: allPkgs,
+ GoVersion: l.GoVersion,
+ tokenFileMap: map[*token.File]*ast.File{},
+ astFileMap: map[*ast.File]*Pkg{},
+ generatedMap: map[string]bool{},
+ }
+ prog.packagesMap = map[string]*packages.Package{}
+ for _, pkg := range allPkgs {
+ prog.packagesMap[pkg.Types.Path()] = pkg
+ }
+
+ isInitial := map[*types.Package]struct{}{}
+ for _, pkg := range pkgs {
+ isInitial[pkg.Types] = struct{}{}
+ }
+ for fn := range ssautil.AllFunctions(ssaprog) {
+ if fn.Pkg == nil {
+ continue
+ }
+ prog.AllFunctions = append(prog.AllFunctions, fn)
+ if _, ok := isInitial[fn.Pkg.Pkg]; ok {
+ prog.InitialFunctions = append(prog.InitialFunctions, fn)
+ }
+ }
+ for _, pkg := range pkgs {
+ prog.Files = append(prog.Files, pkg.Syntax...)
+
+ ssapkg := ssaprog.Package(pkg.Types)
+ for _, f := range pkg.Syntax {
+ prog.astFileMap[f] = pkgMap[ssapkg]
+ }
+ }
+
+ for _, pkg := range allPkgs {
+ for _, f := range pkg.Syntax {
+ tf := pkg.Fset.File(f.Pos())
+ prog.tokenFileMap[tf] = f
+ }
+ }
+
+ var out []Problem
+ l.automaticIgnores = nil
+ for _, pkg := range initial {
+ for _, f := range pkg.Syntax {
+ cm := ast.NewCommentMap(pkg.Fset, f, f.Comments)
+ for node, cgs := range cm {
+ for _, cg := range cgs {
+ for _, c := range cg.List {
+ if !strings.HasPrefix(c.Text, "//lint:") {
+ continue
+ }
+ cmd, args := parseDirective(c.Text)
+ switch cmd {
+ case "ignore", "file-ignore":
+ if len(args) < 2 {
+ // FIXME(dh): this causes duplicated warnings when using megacheck
+ p := Problem{
+ Position: prog.DisplayPosition(c.Pos()),
+ Text: "malformed linter directive; missing the required reason field?",
+ Check: "",
+ Checker: "lint",
+ Package: nil,
+ }
+ out = append(out, p)
+ continue
+ }
+ default:
+ // unknown directive, ignore
+ continue
+ }
+ checks := strings.Split(args[0], ",")
+ pos := prog.DisplayPosition(node.Pos())
+ var ig Ignore
+ switch cmd {
+ case "ignore":
+ ig = &LineIgnore{
+ File: pos.Filename,
+ Line: pos.Line,
+ Checks: checks,
+ pos: c.Pos(),
+ }
+ case "file-ignore":
+ ig = &FileIgnore{
+ File: pos.Filename,
+ Checks: checks,
+ }
+ }
+ l.automaticIgnores = append(l.automaticIgnores, ig)
+ }
+ }
+ }
+ }
+ }
+
+ sizes := struct {
+ types int
+ defs int
+ uses int
+ implicits int
+ selections int
+ scopes int
+ }{}
+ for _, pkg := range pkgs {
+ sizes.types += len(pkg.TypesInfo.Types)
+ sizes.defs += len(pkg.TypesInfo.Defs)
+ sizes.uses += len(pkg.TypesInfo.Uses)
+ sizes.implicits += len(pkg.TypesInfo.Implicits)
+ sizes.selections += len(pkg.TypesInfo.Selections)
+ sizes.scopes += len(pkg.TypesInfo.Scopes)
+ }
+
+ if stats != nil {
+ stats.OtherInitWork = time.Since(t)
+ }
+
+ for _, checker := range l.Checkers {
+ t := time.Now()
+ checker.Init(prog)
+ if stats != nil {
+ stats.CheckerInits[checker.Name()] = time.Since(t)
+ }
+ }
+
+ var jobs []*Job
+ var allChecks []string
+
+ for _, checker := range l.Checkers {
+ checks := checker.Checks()
+ for _, check := range checks {
+ allChecks = append(allChecks, check.ID)
+ j := &Job{
+ Program: prog,
+ checker: checker.Name(),
+ check: check,
+ }
+ jobs = append(jobs, j)
+ }
+ }
+
+ max := len(jobs)
+ if l.MaxConcurrentJobs > 0 {
+ max = l.MaxConcurrentJobs
+ }
+
+ sem := make(chan struct{}, max)
+ wg := &sync.WaitGroup{}
+ for _, j := range jobs {
+ wg.Add(1)
+ go func(j *Job) {
+ defer func() {
+ if panicErr := recover(); panicErr != nil {
+ j.panicErr = fmt.Errorf("panic: %s: %s", panicErr, string(debug.Stack()))
+ }
+ }()
+ defer wg.Done()
+ sem <- struct{}{}
+ defer func() { <-sem }()
+ fn := j.check.Fn
+ if fn == nil {
+ return
+ }
+ t := time.Now()
+ fn(j)
+ j.duration = time.Since(t)
+ }(j)
+ }
+ wg.Wait()
+
+ for _, j := range jobs {
+ if j.panicErr != nil {
+ panic(j.panicErr)
+ }
+
+ if stats != nil {
+ stats.Jobs = append(stats.Jobs, JobStat{j.check.ID, j.duration})
+ }
+ for _, p := range j.problems {
+ allowedChecks := FilterChecks(allChecks, p.Package.Config.Checks)
+
+ if l.ignore(p) {
+ p.Severity = Ignored
+ }
+ // TODO(dh): support globs in check white/blacklist
+ // OPT(dh): this approach doesn't actually disable checks,
+ // it just discards their results. For the moment, that's
+ // fine. None of our checks are super expensive. In the
+ // future, we may want to provide opt-in expensive
+ // analysis, which shouldn't run at all. It may be easiest
+ // to implement this in the individual checks.
+ if (l.ReturnIgnored || p.Severity != Ignored) && allowedChecks[p.Check] {
+ out = append(out, p)
+ }
+ }
+ }
+
+ for _, ig := range l.automaticIgnores {
+ ig, ok := ig.(*LineIgnore)
+ if !ok {
+ continue
+ }
+ if ig.matched {
+ continue
+ }
+
+ couldveMatched := false
+ for f, pkg := range prog.astFileMap {
+ if prog.Fset().Position(f.Pos()).Filename != ig.File {
+ continue
+ }
+ allowedChecks := FilterChecks(allChecks, pkg.Config.Checks)
+ for _, c := range ig.Checks {
+ if !allowedChecks[c] {
+ continue
+ }
+ couldveMatched = true
+ break
+ }
+ break
+ }
+
+ if !couldveMatched {
+ // The ignored checks were disabled for the containing package.
+ // Don't flag the ignore for not having matched.
+ continue
+ }
+ p := Problem{
+ Position: prog.DisplayPosition(ig.pos),
+ Text: "this linter directive didn't match anything; should it be removed?",
+ Check: "",
+ Checker: "lint",
+ Package: nil,
+ }
+ out = append(out, p)
+ }
+
+ sort.Slice(out, func(i int, j int) bool {
+ pi, pj := out[i].Position, out[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 out[i].Text < out[j].Text
+ })
+
+ if l.PrintStats && stats != nil {
+ stats.Print(os.Stderr)
+ }
+
+ if len(out) < 2 {
+ return out
+ }
+
+ uniq := make([]Problem, 0, len(out))
+ uniq = append(uniq, out[0])
+ prev := out[0]
+ for _, p := range out[1:] {
+ if prev.Position == p.Position && prev.Text == p.Text {
+ continue
+ }
+ prev = p
+ uniq = append(uniq, p)
+ }
+
+ return uniq
+}
+
+func FilterChecks(allChecks []string, checks []string) map[string]bool {
+ // OPT(dh): this entire computation could be cached per package
+ allowedChecks := map[string]bool{}
+
+ for _, check := range checks {
+ b := true
+ if len(check) > 1 && check[0] == '-' {
+ b = false
+ check = check[1:]
+ }
+ if check == "*" || check == "all" {
+ // Match all
+ for _, c := range allChecks {
+ allowedChecks[c] = b
+ }
+ } else if strings.HasSuffix(check, "*") {
+ // Glob
+ prefix := check[:len(check)-1]
+ isCat := strings.IndexFunc(prefix, func(r rune) bool { return unicode.IsNumber(r) }) == -1
+
+ for _, c := range allChecks {
+ idx := strings.IndexFunc(c, func(r rune) bool { return unicode.IsNumber(r) })
+ if isCat {
+ // Glob is S*, which should match S1000 but not SA1000
+ cat := c[:idx]
+ if prefix == cat {
+ allowedChecks[c] = b
+ }
+ } else {
+ // Glob is S1*
+ if strings.HasPrefix(c, prefix) {
+ allowedChecks[c] = b
+ }
+ }
+ }
+ } else {
+ // Literal check name
+ allowedChecks[check] = b
+ }
+ }
+ return allowedChecks
+}
+
+func (prog *Program) Package(path string) *packages.Package {
+ return prog.packagesMap[path]
+}
+
+// Pkg represents a package being linted.
+type Pkg struct {
+ SSA *ssa.Package
+ *packages.Package
+ Config config.Config
+}
+
+type Positioner interface {
+ Pos() token.Pos
+}
+
+func (prog *Program) DisplayPosition(p token.Pos) token.Position {
+ // Only use the adjusted position if it points to another Go file.
+ // This means we'll point to the original file for cgo files, but
+ // we won't point to a YACC grammar file.
+
+ pos := prog.Fset().PositionFor(p, false)
+ adjPos := prog.Fset().PositionFor(p, true)
+
+ if filepath.Ext(adjPos.Filename) == ".go" {
+ return adjPos
+ }
+ return pos
+}
+
+func (prog *Program) isGenerated(path string) bool {
+ // This function isn't very efficient in terms of lock contention
+ // and lack of parallelism, but it really shouldn't matter.
+ // Projects consists of thousands of files, and have hundreds of
+ // errors. That's not a lot of calls to isGenerated.
+
+ prog.genMu.RLock()
+ if b, ok := prog.generatedMap[path]; ok {
+ prog.genMu.RUnlock()
+ return b
+ }
+ prog.genMu.RUnlock()
+ prog.genMu.Lock()
+ defer prog.genMu.Unlock()
+ // recheck to avoid doing extra work in case of race
+ if b, ok := prog.generatedMap[path]; ok {
+ return b
+ }
+
+ f, err := os.Open(path)
+ if err != nil {
+ return false
+ }
+ defer f.Close()
+ b := isGenerated(f)
+ prog.generatedMap[path] = b
+ return b
+}
+
+func (j *Job) Errorf(n Positioner, format string, args ...interface{}) *Problem {
+ tf := j.Program.SSA.Fset.File(n.Pos())
+ f := j.Program.tokenFileMap[tf]
+ pkg := j.Program.astFileMap[f]
+
+ pos := j.Program.DisplayPosition(n.Pos())
+ if j.Program.isGenerated(pos.Filename) && j.check.FilterGenerated {
+ return nil
+ }
+ problem := Problem{
+ Position: pos,
+ Text: fmt.Sprintf(format, args...),
+ Check: j.check.ID,
+ Checker: j.checker,
+ Package: pkg,
+ }
+ j.problems = append(j.problems, problem)
+ return &j.problems[len(j.problems)-1]
+}
+
+func (j *Job) NodePackage(node Positioner) *Pkg {
+ f := j.File(node)
+ return j.Program.astFileMap[f]
+}
+
+func allPackages(pkgs []*packages.Package) []*packages.Package {
+ var out []*packages.Package
+ packages.Visit(
+ pkgs,
+ func(pkg *packages.Package) bool {
+ out = append(out, pkg)
+ return true
+ },
+ nil,
+ )
+ return out
+}
diff --git a/vendor/github.com/golangci/go-tools/lint/lintdsl/lintdsl.go b/vendor/github.com/golangci/go-tools/lint/lintdsl/lintdsl.go
new file mode 100644
index 00000000000..4ab5d84031c
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/lint/lintdsl/lintdsl.go
@@ -0,0 +1,342 @@
+// Package lintdsl provides helpers for implementing static analysis
+// checks. Dot-importing this package is encouraged.
+package lintdsl
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/printer"
+ "go/token"
+ "go/types"
+ "strings"
+
+ "github.com/golangci/go-tools/lint"
+ "github.com/golangci/go-tools/ssa"
+)
+
+type packager interface {
+ Package() *ssa.Package
+}
+
+func CallName(call *ssa.CallCommon) string {
+ if call.IsInvoke() {
+ return ""
+ }
+ switch v := call.Value.(type) {
+ case *ssa.Function:
+ fn, ok := v.Object().(*types.Func)
+ if !ok {
+ return ""
+ }
+ return fn.FullName()
+ case *ssa.Builtin:
+ return v.Name()
+ }
+ return ""
+}
+
+func IsCallTo(call *ssa.CallCommon, name string) bool { return CallName(call) == name }
+func IsType(T types.Type, name string) bool { return types.TypeString(T, nil) == name }
+
+func FilterDebug(instr []ssa.Instruction) []ssa.Instruction {
+ var out []ssa.Instruction
+ for _, ins := range instr {
+ if _, ok := ins.(*ssa.DebugRef); !ok {
+ out = append(out, ins)
+ }
+ }
+ return out
+}
+
+func IsExample(fn *ssa.Function) bool {
+ if !strings.HasPrefix(fn.Name(), "Example") {
+ return false
+ }
+ f := fn.Prog.Fset.File(fn.Pos())
+ if f == nil {
+ return false
+ }
+ return strings.HasSuffix(f.Name(), "_test.go")
+}
+
+func IsPointerLike(T types.Type) bool {
+ switch T := T.Underlying().(type) {
+ case *types.Interface, *types.Chan, *types.Map, *types.Pointer:
+ return true
+ case *types.Basic:
+ return T.Kind() == types.UnsafePointer
+ }
+ return false
+}
+
+func IsGenerated(f *ast.File) bool {
+ comments := f.Comments
+ if len(comments) > 0 {
+ comment := comments[0].Text()
+ return strings.Contains(comment, "Code generated by") ||
+ strings.Contains(comment, "DO NOT EDIT")
+ }
+ return false
+}
+
+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.Expr) bool {
+ ident, _ := id.(*ast.Ident)
+ return ident != nil && ident.Name == "_"
+}
+
+func IsIntLiteral(expr ast.Expr, literal string) bool {
+ lit, ok := expr.(*ast.BasicLit)
+ return ok && lit.Kind == token.INT && lit.Value == literal
+}
+
+// Deprecated: use IsIntLiteral instead
+func IsZero(expr ast.Expr) bool {
+ return IsIntLiteral(expr, "0")
+}
+
+func TypeOf(j *lint.Job, expr ast.Expr) types.Type {
+ if expr == nil {
+ return nil
+ }
+ return j.NodePackage(expr).TypesInfo.TypeOf(expr)
+}
+
+func IsOfType(j *lint.Job, expr ast.Expr, name string) bool { return IsType(TypeOf(j, expr), name) }
+
+func ObjectOf(j *lint.Job, ident *ast.Ident) types.Object {
+ if ident == nil {
+ return nil
+ }
+ return j.NodePackage(ident).TypesInfo.ObjectOf(ident)
+}
+
+func IsInTest(j *lint.Job, node lint.Positioner) bool {
+ // FIXME(dh): this doesn't work for global variables with
+ // initializers
+ f := j.Program.SSA.Fset.File(node.Pos())
+ return f != nil && strings.HasSuffix(f.Name(), "_test.go")
+}
+
+func IsInMain(j *lint.Job, node lint.Positioner) bool {
+ if node, ok := node.(packager); ok {
+ return node.Package().Pkg.Name() == "main"
+ }
+ pkg := j.NodePackage(node)
+ if pkg == nil {
+ return false
+ }
+ return pkg.Types.Name() == "main"
+}
+
+func SelectorName(j *lint.Job, expr *ast.SelectorExpr) string {
+ info := j.NodePackage(expr).TypesInfo
+ sel := info.Selections[expr]
+ if sel == nil {
+ if x, ok := expr.X.(*ast.Ident); ok {
+ pkg, ok := info.ObjectOf(x).(*types.PkgName)
+ if !ok {
+ // This shouldn't happen
+ return fmt.Sprintf("%s.%s", x.Name, expr.Sel.Name)
+ }
+ return fmt.Sprintf("%s.%s", pkg.Imported().Path(), expr.Sel.Name)
+ }
+ panic(fmt.Sprintf("unsupported selector: %v", expr))
+ }
+ return fmt.Sprintf("(%s).%s", sel.Recv(), sel.Obj().Name())
+}
+
+func IsNil(j *lint.Job, expr ast.Expr) bool {
+ return j.NodePackage(expr).TypesInfo.Types[expr].IsNil()
+}
+
+func BoolConst(j *lint.Job, expr ast.Expr) bool {
+ val := j.NodePackage(expr).TypesInfo.ObjectOf(expr.(*ast.Ident)).(*types.Const).Val()
+ return constant.BoolVal(val)
+}
+
+func IsBoolConst(j *lint.Job, expr ast.Expr) bool {
+ // We explicitly don't support typed bools because more often than
+ // not, custom bool types are used as binary enums and the
+ // explicit comparison is desired.
+
+ ident, ok := expr.(*ast.Ident)
+ if !ok {
+ return false
+ }
+ obj := j.NodePackage(expr).TypesInfo.ObjectOf(ident)
+ c, ok := obj.(*types.Const)
+ if !ok {
+ return false
+ }
+ basic, ok := c.Type().(*types.Basic)
+ if !ok {
+ return false
+ }
+ if basic.Kind() != types.UntypedBool && basic.Kind() != types.Bool {
+ return false
+ }
+ return true
+}
+
+func ExprToInt(j *lint.Job, expr ast.Expr) (int64, bool) {
+ tv := j.NodePackage(expr).TypesInfo.Types[expr]
+ if tv.Value == nil {
+ return 0, false
+ }
+ if tv.Value.Kind() != constant.Int {
+ return 0, false
+ }
+ return constant.Int64Val(tv.Value)
+}
+
+func ExprToString(j *lint.Job, expr ast.Expr) (string, bool) {
+ val := j.NodePackage(expr).TypesInfo.Types[expr].Value
+ if val == nil {
+ return "", false
+ }
+ if val.Kind() != constant.String {
+ return "", false
+ }
+ return constant.StringVal(val), true
+}
+
+// Dereference returns a pointer's element type; otherwise it returns
+// T.
+func Dereference(T types.Type) types.Type {
+ if p, ok := T.Underlying().(*types.Pointer); ok {
+ return p.Elem()
+ }
+ return T
+}
+
+// DereferenceR returns a pointer's element type; otherwise it returns
+// T. If the element type is itself a pointer, DereferenceR will be
+// applied recursively.
+func DereferenceR(T types.Type) types.Type {
+ if p, ok := T.Underlying().(*types.Pointer); ok {
+ return DereferenceR(p.Elem())
+ }
+ return T
+}
+
+func IsGoVersion(j *lint.Job, minor int) bool {
+ return j.Program.GoVersion >= minor
+}
+
+func CallNameAST(j *lint.Job, call *ast.CallExpr) string {
+ switch fun := call.Fun.(type) {
+ case *ast.SelectorExpr:
+ fn, ok := ObjectOf(j, fun.Sel).(*types.Func)
+ if !ok {
+ return ""
+ }
+ return fn.FullName()
+ case *ast.Ident:
+ obj := ObjectOf(j, fun)
+ switch obj := obj.(type) {
+ case *types.Func:
+ return obj.FullName()
+ case *types.Builtin:
+ return obj.Name()
+ default:
+ return ""
+ }
+ default:
+ return ""
+ }
+}
+
+func IsCallToAST(j *lint.Job, node ast.Node, name string) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return false
+ }
+ return CallNameAST(j, call) == name
+}
+
+func IsCallToAnyAST(j *lint.Job, node ast.Node, names ...string) bool {
+ for _, name := range names {
+ if IsCallToAST(j, node, name) {
+ return true
+ }
+ }
+ return false
+}
+
+func Render(j *lint.Job, x interface{}) string {
+ fset := j.Program.SSA.Fset
+ var buf bytes.Buffer
+ if err := printer.Fprint(&buf, fset, x); err != nil {
+ panic(err)
+ }
+ return buf.String()
+}
+
+func RenderArgs(j *lint.Job, args []ast.Expr) string {
+ var ss []string
+ for _, arg := range args {
+ ss = append(ss, Render(j, arg))
+ }
+ return strings.Join(ss, ", ")
+}
+
+func Preamble(f *ast.File) string {
+ cutoff := f.Package
+ if f.Doc != nil {
+ cutoff = f.Doc.Pos()
+ }
+ var out []string
+ for _, cmt := range f.Comments {
+ if cmt.Pos() >= cutoff {
+ break
+ }
+ out = append(out, cmt.Text())
+ }
+ return strings.Join(out, "\n")
+}
+
+func Inspect(node ast.Node, fn func(node ast.Node) bool) {
+ if node == nil {
+ return
+ }
+ ast.Inspect(node, fn)
+}
+
+func GroupSpecs(j *lint.Job, specs []ast.Spec) [][]ast.Spec {
+ if len(specs) == 0 {
+ return nil
+ }
+ fset := j.Program.SSA.Fset
+ groups := make([][]ast.Spec, 1)
+ groups[0] = append(groups[0], specs[0])
+
+ for _, spec := range specs[1:] {
+ g := groups[len(groups)-1]
+ if fset.PositionFor(spec.Pos(), false).Line-1 !=
+ fset.PositionFor(g[len(g)-1].End(), false).Line {
+
+ groups = append(groups, nil)
+ }
+
+ groups[len(groups)-1] = append(groups[len(groups)-1], spec)
+ }
+
+ return groups
+}
+
+func IsObject(obj types.Object, name string) bool {
+ var path string
+ if pkg := obj.Pkg(); pkg != nil {
+ path = pkg.Path() + "."
+ }
+ return path+obj.Name() == name
+}
diff --git a/vendor/github.com/golangci/go-tools/lint/lintutil/format/format.go b/vendor/github.com/golangci/go-tools/lint/lintutil/format/format.go
new file mode 100644
index 00000000000..96befb1cc31
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/lint/lintutil/format/format.go
@@ -0,0 +1,128 @@
+// Package format provides formatters for linter problems.
+package format
+
+import (
+ "encoding/json"
+ "fmt"
+ "go/token"
+ "io"
+ "os"
+ "path/filepath"
+ "text/tabwriter"
+
+ "github.com/golangci/go-tools/lint"
+)
+
+func shortPath(path string) string {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return path
+ }
+ if rel, err := filepath.Rel(cwd, path); err == nil && len(rel) < len(path) {
+ return rel
+ }
+ return path
+}
+
+func relativePositionString(pos token.Position) string {
+ s := shortPath(pos.Filename)
+ if pos.IsValid() {
+ if s != "" {
+ s += ":"
+ }
+ s += fmt.Sprintf("%d:%d", pos.Line, pos.Column)
+ }
+ if s == "" {
+ s = "-"
+ }
+ return s
+}
+
+type Statter interface {
+ Stats(total, errors, warnings int)
+}
+
+type Formatter interface {
+ Format(p lint.Problem)
+}
+
+type Text struct {
+ W io.Writer
+}
+
+func (o Text) Format(p lint.Problem) {
+ fmt.Fprintf(o.W, "%v: %s\n", relativePositionString(p.Position), p.String())
+}
+
+type JSON struct {
+ W io.Writer
+}
+
+func severity(s lint.Severity) string {
+ switch s {
+ case lint.Error:
+ return "error"
+ case lint.Warning:
+ return "warning"
+ case lint.Ignored:
+ return "ignored"
+ }
+ return ""
+}
+
+func (o JSON) Format(p lint.Problem) {
+ type location struct {
+ File string `json:"file"`
+ Line int `json:"line"`
+ Column int `json:"column"`
+ }
+ jp := struct {
+ Code string `json:"code"`
+ Severity string `json:"severity,omitempty"`
+ Location location `json:"location"`
+ Message string `json:"message"`
+ }{
+ Code: p.Check,
+ Severity: severity(p.Severity),
+ Location: location{
+ File: p.Position.Filename,
+ Line: p.Position.Line,
+ Column: p.Position.Column,
+ },
+ Message: p.Text,
+ }
+ _ = json.NewEncoder(o.W).Encode(jp)
+}
+
+type Stylish struct {
+ W io.Writer
+
+ prevFile string
+ tw *tabwriter.Writer
+}
+
+func (o *Stylish) Format(p lint.Problem) {
+ if p.Position.Filename == "" {
+ p.Position.Filename = "-"
+ }
+
+ if p.Position.Filename != o.prevFile {
+ if o.prevFile != "" {
+ o.tw.Flush()
+ fmt.Fprintln(o.W)
+ }
+ fmt.Fprintln(o.W, p.Position.Filename)
+ o.prevFile = p.Position.Filename
+ o.tw = tabwriter.NewWriter(o.W, 0, 4, 2, ' ', 0)
+ }
+ fmt.Fprintf(o.tw, " (%d, %d)\t%s\t%s\n", p.Position.Line, p.Position.Column, p.Check, p.Text)
+}
+
+func (o *Stylish) Stats(total, errors, warnings int) {
+ if o.tw != nil {
+ o.tw.Flush()
+ fmt.Fprintln(o.W)
+ }
+ fmt.Fprintf(o.W, " ✖ %d problems (%d errors, %d warnings)\n",
+ total, errors, warnings)
+}
diff --git a/vendor/github.com/golangci/go-tools/lint/lintutil/util.go b/vendor/github.com/golangci/go-tools/lint/lintutil/util.go
new file mode 100644
index 00000000000..a667c6a8c00
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/lint/lintutil/util.go
@@ -0,0 +1,362 @@
+// 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 lintutil provides helpers for writing linter command lines.
+package lintutil // import "github.com/golangci/go-tools/lint/lintutil"
+
+import (
+ "errors"
+ "flag"
+ "fmt"
+ "go/build"
+ "go/token"
+ "log"
+ "os"
+ "regexp"
+ "runtime"
+ "runtime/pprof"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/golangci/go-tools/config"
+ "github.com/golangci/go-tools/lint"
+ "github.com/golangci/go-tools/lint/lintutil/format"
+ "github.com/golangci/go-tools/version"
+
+ "golang.org/x/tools/go/packages"
+)
+
+func usage(name string, flags *flag.FlagSet) func() {
+ return func() {
+ fmt.Fprintf(os.Stderr, "Usage of %s:\n", name)
+ fmt.Fprintf(os.Stderr, "\t%s [flags] # runs on package in current directory\n", name)
+ fmt.Fprintf(os.Stderr, "\t%s [flags] packages\n", name)
+ fmt.Fprintf(os.Stderr, "\t%s [flags] directory\n", name)
+ fmt.Fprintf(os.Stderr, "\t%s [flags] files... # must be a single package\n", name)
+ fmt.Fprintf(os.Stderr, "Flags:\n")
+ flags.PrintDefaults()
+ }
+}
+
+func parseIgnore(s string) ([]lint.Ignore, error) {
+ var out []lint.Ignore
+ if len(s) == 0 {
+ return nil, nil
+ }
+ for _, part := range strings.Fields(s) {
+ p := strings.Split(part, ":")
+ if len(p) != 2 {
+ return nil, errors.New("malformed ignore string")
+ }
+ path := p[0]
+ checks := strings.Split(p[1], ",")
+ out = append(out, &lint.GlobIgnore{Pattern: path, Checks: checks})
+ }
+ return out, nil
+}
+
+type versionFlag int
+
+func (v *versionFlag) String() string {
+ return fmt.Sprintf("1.%d", *v)
+}
+
+func (v *versionFlag) Set(s string) error {
+ if len(s) < 3 {
+ return errors.New("invalid Go version")
+ }
+ if s[0] != '1' {
+ return errors.New("invalid Go version")
+ }
+ if s[1] != '.' {
+ return errors.New("invalid Go version")
+ }
+ i, err := strconv.Atoi(s[2:])
+ *v = versionFlag(i)
+ return err
+}
+
+func (v *versionFlag) Get() interface{} {
+ return int(*v)
+}
+
+type list []string
+
+func (list *list) String() string {
+ return `"` + strings.Join(*list, ",") + `"`
+}
+
+func (list *list) Set(s string) error {
+ if s == "" {
+ *list = nil
+ return nil
+ }
+
+ *list = strings.Split(s, ",")
+ return nil
+}
+
+func FlagSet(name string) *flag.FlagSet {
+ flags := flag.NewFlagSet("", flag.ExitOnError)
+ flags.Usage = usage(name, flags)
+ flags.String("tags", "", "List of `build tags`")
+ flags.String("ignore", "", "Deprecated: use linter directives instead")
+ flags.Bool("tests", true, "Include tests")
+ flags.Bool("version", false, "Print version and exit")
+ flags.Bool("show-ignored", false, "Don't filter ignored problems")
+ flags.String("f", "text", "Output `format` (valid choices are 'stylish', 'text' and 'json')")
+
+ flags.Int("debug.max-concurrent-jobs", 0, "Number of jobs to run concurrently")
+ flags.Bool("debug.print-stats", false, "Print debug statistics")
+ flags.String("debug.cpuprofile", "", "Write CPU profile to `file`")
+ flags.String("debug.memprofile", "", "Write memory profile to `file`")
+
+ checks := list{"inherit"}
+ fail := list{"all"}
+ flags.Var(&checks, "checks", "Comma-separated list of `checks` to enable.")
+ flags.Var(&fail, "fail", "Comma-separated list of `checks` that can cause a non-zero exit status.")
+
+ tags := build.Default.ReleaseTags
+ v := tags[len(tags)-1][2:]
+ version := new(versionFlag)
+ if err := version.Set(v); err != nil {
+ panic(fmt.Sprintf("internal error: %s", err))
+ }
+
+ flags.Var(version, "go", "Target Go `version` in the format '1.x'")
+ return flags
+}
+
+func ProcessFlagSet(cs []lint.Checker, fs *flag.FlagSet) {
+ tags := fs.Lookup("tags").Value.(flag.Getter).Get().(string)
+ ignore := fs.Lookup("ignore").Value.(flag.Getter).Get().(string)
+ tests := fs.Lookup("tests").Value.(flag.Getter).Get().(bool)
+ goVersion := fs.Lookup("go").Value.(flag.Getter).Get().(int)
+ formatter := fs.Lookup("f").Value.(flag.Getter).Get().(string)
+ printVersion := fs.Lookup("version").Value.(flag.Getter).Get().(bool)
+ showIgnored := fs.Lookup("show-ignored").Value.(flag.Getter).Get().(bool)
+
+ maxConcurrentJobs := fs.Lookup("debug.max-concurrent-jobs").Value.(flag.Getter).Get().(int)
+ printStats := fs.Lookup("debug.print-stats").Value.(flag.Getter).Get().(bool)
+ cpuProfile := fs.Lookup("debug.cpuprofile").Value.(flag.Getter).Get().(string)
+ memProfile := fs.Lookup("debug.memprofile").Value.(flag.Getter).Get().(string)
+
+ cfg := config.Config{}
+ cfg.Checks = *fs.Lookup("checks").Value.(*list)
+
+ exit := func(code int) {
+ if cpuProfile != "" {
+ pprof.StopCPUProfile()
+ }
+ if memProfile != "" {
+ f, err := os.Create(memProfile)
+ if err != nil {
+ panic(err)
+ }
+ runtime.GC()
+ pprof.WriteHeapProfile(f)
+ }
+ os.Exit(code)
+ }
+ if cpuProfile != "" {
+ f, err := os.Create(cpuProfile)
+ if err != nil {
+ log.Fatal(err)
+ }
+ pprof.StartCPUProfile(f)
+ }
+
+ if printVersion {
+ version.Print()
+ exit(0)
+ }
+
+ ps, err := Lint(cs, fs.Args(), &Options{
+ Tags: strings.Fields(tags),
+ LintTests: tests,
+ Ignores: ignore,
+ GoVersion: goVersion,
+ ReturnIgnored: showIgnored,
+ Config: cfg,
+
+ MaxConcurrentJobs: maxConcurrentJobs,
+ PrintStats: printStats,
+ })
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ exit(1)
+ }
+
+ var f format.Formatter
+ switch formatter {
+ case "text":
+ f = format.Text{W: os.Stdout}
+ case "stylish":
+ f = &format.Stylish{W: os.Stdout}
+ case "json":
+ f = format.JSON{W: os.Stdout}
+ default:
+ fmt.Fprintf(os.Stderr, "unsupported output format %q\n", formatter)
+ exit(2)
+ }
+
+ var (
+ total int
+ errors int
+ warnings int
+ )
+
+ fail := *fs.Lookup("fail").Value.(*list)
+ var allChecks []string
+ for _, p := range ps {
+ allChecks = append(allChecks, p.Check)
+ }
+
+ shouldExit := lint.FilterChecks(allChecks, fail)
+
+ total = len(ps)
+ for _, p := range ps {
+ if shouldExit[p.Check] {
+ errors++
+ } else {
+ p.Severity = lint.Warning
+ warnings++
+ }
+ f.Format(p)
+ }
+ if f, ok := f.(format.Statter); ok {
+ f.Stats(total, errors, warnings)
+ }
+ if errors > 0 {
+ exit(1)
+ }
+}
+
+type Options struct {
+ Config config.Config
+
+ Tags []string
+ LintTests bool
+ Ignores string
+ GoVersion int
+ ReturnIgnored bool
+
+ MaxConcurrentJobs int
+ PrintStats bool
+}
+
+func Lint(cs []lint.Checker, paths []string, opt *Options) ([]lint.Problem, error) {
+ stats := lint.PerfStats{
+ CheckerInits: map[string]time.Duration{},
+ }
+
+ if opt == nil {
+ opt = &Options{}
+ }
+ ignores, err := parseIgnore(opt.Ignores)
+ if err != nil {
+ return nil, err
+ }
+
+ conf := &packages.Config{
+ Mode: packages.LoadAllSyntax,
+ Tests: opt.LintTests,
+ BuildFlags: []string{
+ "-tags=" + strings.Join(opt.Tags, " "),
+ },
+ }
+
+ t := time.Now()
+ if len(paths) == 0 {
+ paths = []string{"."}
+ }
+ pkgs, err := packages.Load(conf, paths...)
+ if err != nil {
+ return nil, err
+ }
+ stats.PackageLoading = time.Since(t)
+
+ var problems []lint.Problem
+ workingPkgs := make([]*packages.Package, 0, len(pkgs))
+ for _, pkg := range pkgs {
+ if pkg.IllTyped {
+ problems = append(problems, compileErrors(pkg)...)
+ } else {
+ workingPkgs = append(workingPkgs, pkg)
+ }
+ }
+
+ if len(workingPkgs) == 0 {
+ return problems, nil
+ }
+
+ l := &lint.Linter{
+ Checkers: cs,
+ Ignores: ignores,
+ GoVersion: opt.GoVersion,
+ ReturnIgnored: opt.ReturnIgnored,
+ Config: opt.Config,
+
+ MaxConcurrentJobs: opt.MaxConcurrentJobs,
+ PrintStats: opt.PrintStats,
+ }
+ problems = append(problems, l.Lint(workingPkgs, &stats)...)
+
+ return problems, nil
+}
+
+var posRe = regexp.MustCompile(`^(.+?):(\d+):(\d+)?$`)
+
+func parsePos(pos string) token.Position {
+ if pos == "-" || pos == "" {
+ return token.Position{}
+ }
+ parts := posRe.FindStringSubmatch(pos)
+ if parts == nil {
+ panic(fmt.Sprintf("internal error: malformed position %q", pos))
+ }
+ file := parts[1]
+ line, _ := strconv.Atoi(parts[2])
+ col, _ := strconv.Atoi(parts[3])
+ return token.Position{
+ Filename: file,
+ Line: line,
+ Column: col,
+ }
+}
+
+func compileErrors(pkg *packages.Package) []lint.Problem {
+ if !pkg.IllTyped {
+ return nil
+ }
+ if len(pkg.Errors) == 0 {
+ // transitively ill-typed
+ var ps []lint.Problem
+ for _, imp := range pkg.Imports {
+ ps = append(ps, compileErrors(imp)...)
+ }
+ return ps
+ }
+ var ps []lint.Problem
+ for _, err := range pkg.Errors {
+ p := lint.Problem{
+ Position: parsePos(err.Pos),
+ Text: err.Msg,
+ Checker: "compiler",
+ Check: "compile",
+ }
+ ps = append(ps, p)
+ }
+ return ps
+}
+
+func ProcessArgs(name string, cs []lint.Checker, args []string) {
+ flags := FlagSet(name)
+ flags.Parse(args)
+
+ ProcessFlagSet(cs, flags)
+}
diff --git a/vendor/github.com/golangci/go-tools/simple/CONTRIBUTING.md b/vendor/github.com/golangci/go-tools/simple/CONTRIBUTING.md
new file mode 100644
index 00000000000..105023cf513
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/simple/CONTRIBUTING.md
@@ -0,0 +1,15 @@
+# Contributing to gosimple
+
+## Before filing an issue:
+
+### Are you having trouble building gosimple?
+
+Check you have the latest version of its dependencies. Run
+```
+go get -u github.com/golangci/go-tools/simple
+```
+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 gosimple? Make sure to carefully read `README`.
diff --git a/vendor/github.com/golangci/go-tools/simple/lint.go b/vendor/github.com/golangci/go-tools/simple/lint.go
new file mode 100644
index 00000000000..2c47c93f21b
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/simple/lint.go
@@ -0,0 +1,1964 @@
+// Package simple contains a linter for Go source code.
+package simple // import "github.com/golangci/go-tools/simple"
+
+import (
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "reflect"
+ "strings"
+
+ . "github.com/golangci/go-tools/arg"
+ "github.com/golangci/go-tools/internal/sharedcheck"
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+type Checker struct {
+ CheckGenerated bool
+ MS *typeutil.MethodSetCache
+}
+
+func NewChecker() *Checker {
+ return &Checker{
+ MS: &typeutil.MethodSetCache{},
+ }
+}
+
+func (*Checker) Name() string { return "gosimple" }
+func (*Checker) Prefix() string { return "S" }
+
+func (c *Checker) Init(prog *lint.Program) {}
+
+func (c *Checker) Checks() []lint.Check {
+ return []lint.Check{
+ {ID: "S1000", FilterGenerated: true, Fn: c.LintSingleCaseSelect},
+ {ID: "S1001", FilterGenerated: true, Fn: c.LintLoopCopy},
+ {ID: "S1002", FilterGenerated: true, Fn: c.LintIfBoolCmp},
+ {ID: "S1003", FilterGenerated: true, Fn: c.LintStringsContains},
+ {ID: "S1004", FilterGenerated: true, Fn: c.LintBytesCompare},
+ {ID: "S1005", FilterGenerated: true, Fn: c.LintUnnecessaryBlank},
+ {ID: "S1006", FilterGenerated: true, Fn: c.LintForTrue},
+ {ID: "S1007", FilterGenerated: true, Fn: c.LintRegexpRaw},
+ {ID: "S1008", FilterGenerated: true, Fn: c.LintIfReturn},
+ {ID: "S1009", FilterGenerated: true, Fn: c.LintRedundantNilCheckWithLen},
+ {ID: "S1010", FilterGenerated: true, Fn: c.LintSlicing},
+ {ID: "S1011", FilterGenerated: true, Fn: c.LintLoopAppend},
+ {ID: "S1012", FilterGenerated: true, Fn: c.LintTimeSince},
+ {ID: "S1016", FilterGenerated: true, Fn: c.LintSimplerStructConversion},
+ {ID: "S1017", FilterGenerated: true, Fn: c.LintTrim},
+ {ID: "S1018", FilterGenerated: true, Fn: c.LintLoopSlide},
+ {ID: "S1019", FilterGenerated: true, Fn: c.LintMakeLenCap},
+ {ID: "S1020", FilterGenerated: true, Fn: c.LintAssertNotNil},
+ {ID: "S1021", FilterGenerated: true, Fn: c.LintDeclareAssign},
+ {ID: "S1023", FilterGenerated: true, Fn: c.LintRedundantBreak},
+ {ID: "S1024", FilterGenerated: true, Fn: c.LintTimeUntil},
+ {ID: "S1025", FilterGenerated: true, Fn: c.LintRedundantSprintf},
+ {ID: "S1028", FilterGenerated: true, Fn: c.LintErrorsNewSprintf},
+ {ID: "S1029", FilterGenerated: false, Fn: c.LintRangeStringRunes},
+ {ID: "S1030", FilterGenerated: true, Fn: c.LintBytesBufferConversions},
+ {ID: "S1031", FilterGenerated: true, Fn: c.LintNilCheckAroundRange},
+ {ID: "S1032", FilterGenerated: true, Fn: c.LintSortHelpers},
+ {ID: "S1033", FilterGenerated: true, Fn: c.LintGuardedDelete},
+ {ID: "S1034", FilterGenerated: true, Fn: c.LintSimplifyTypeSwitch},
+ }
+}
+
+func (c *Checker) LintSingleCaseSelect(j *lint.Job) {
+ isSingleSelect := func(node ast.Node) bool {
+ v, ok := node.(*ast.SelectStmt)
+ if !ok {
+ return false
+ }
+ return len(v.Body.List) == 1
+ }
+
+ seen := map[ast.Node]struct{}{}
+ fn := func(node ast.Node) bool {
+ switch v := node.(type) {
+ case *ast.ForStmt:
+ if len(v.Body.List) != 1 {
+ return true
+ }
+ if !isSingleSelect(v.Body.List[0]) {
+ return true
+ }
+ if _, ok := v.Body.List[0].(*ast.SelectStmt).Body.List[0].(*ast.CommClause).Comm.(*ast.SendStmt); ok {
+ // Don't suggest using range for channel sends
+ return true
+ }
+ seen[v.Body.List[0]] = struct{}{}
+ j.Errorf(node, "should use for range instead of for { select {} }")
+ case *ast.SelectStmt:
+ if _, ok := seen[v]; ok {
+ return true
+ }
+ if !isSingleSelect(v) {
+ return true
+ }
+ j.Errorf(node, "should use a simple channel send/receive instead of select with a single case")
+ return true
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintLoopCopy(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.RangeStmt)
+ if !ok {
+ return true
+ }
+
+ if loop.Key == nil {
+ return true
+ }
+ if len(loop.Body.List) != 1 {
+ return true
+ }
+ stmt, ok := loop.Body.List[0].(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 {
+ return true
+ }
+ lhs, ok := stmt.Lhs[0].(*ast.IndexExpr)
+ if !ok {
+ return true
+ }
+
+ if _, ok := TypeOf(j, lhs.X).(*types.Slice); !ok {
+ return true
+ }
+ lidx, ok := lhs.Index.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ key, ok := loop.Key.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if TypeOf(j, lhs) == nil || TypeOf(j, stmt.Rhs[0]) == nil {
+ return true
+ }
+ if ObjectOf(j, lidx) != ObjectOf(j, key) {
+ return true
+ }
+ if !types.Identical(TypeOf(j, lhs), TypeOf(j, stmt.Rhs[0])) {
+ return true
+ }
+ if _, ok := TypeOf(j, loop.X).(*types.Slice); !ok {
+ return true
+ }
+
+ if rhs, ok := stmt.Rhs[0].(*ast.IndexExpr); ok {
+ rx, ok := rhs.X.(*ast.Ident)
+ _ = rx
+ if !ok {
+ return true
+ }
+ ridx, ok := rhs.Index.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if ObjectOf(j, ridx) != ObjectOf(j, key) {
+ return true
+ }
+ } else if rhs, ok := stmt.Rhs[0].(*ast.Ident); ok {
+ value, ok := loop.Value.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if ObjectOf(j, rhs) != ObjectOf(j, value) {
+ return true
+ }
+ } else {
+ return true
+ }
+ j.Errorf(loop, "should use copy() instead of a loop")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintIfBoolCmp(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ expr, ok := node.(*ast.BinaryExpr)
+ if !ok || (expr.Op != token.EQL && expr.Op != token.NEQ) {
+ return true
+ }
+ x := IsBoolConst(j, expr.X)
+ y := IsBoolConst(j, expr.Y)
+ if !x && !y {
+ return true
+ }
+ var other ast.Expr
+ var val bool
+ if x {
+ val = BoolConst(j, expr.X)
+ other = expr.Y
+ } else {
+ val = BoolConst(j, expr.Y)
+ other = expr.X
+ }
+ basic, ok := TypeOf(j, other).Underlying().(*types.Basic)
+ if !ok || basic.Kind() != types.Bool {
+ return true
+ }
+ op := ""
+ if (expr.Op == token.EQL && !val) || (expr.Op == token.NEQ && val) {
+ op = "!"
+ }
+ r := op + Render(j, other)
+ l1 := len(r)
+ r = strings.TrimLeft(r, "!")
+ if (l1-len(r))%2 == 1 {
+ r = "!" + r
+ }
+ if IsInTest(j, node) {
+ return true
+ }
+ j.Errorf(expr, "should omit comparison to bool constant, can be simplified to %s", r)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintBytesBufferConversions(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok || len(call.Args) != 1 {
+ return true
+ }
+
+ argCall, ok := call.Args[0].(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sel, ok := argCall.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+
+ typ := TypeOf(j, call.Fun)
+ if typ == types.Universe.Lookup("string").Type() && IsCallToAST(j, call.Args[0], "(*bytes.Buffer).Bytes") {
+ j.Errorf(call, "should use %v.String() instead of %v", Render(j, sel.X), Render(j, call))
+ } else if typ, ok := typ.(*types.Slice); ok && typ.Elem() == types.Universe.Lookup("byte").Type() && IsCallToAST(j, call.Args[0], "(*bytes.Buffer).String") {
+ j.Errorf(call, "should use %v.Bytes() instead of %v", Render(j, sel.X), Render(j, call))
+ }
+
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintStringsContains(j *lint.Job) {
+ // map of value to token to bool value
+ allowed := map[int64]map[token.Token]bool{
+ -1: {token.GTR: true, token.NEQ: true, token.EQL: false},
+ 0: {token.GEQ: true, token.LSS: false},
+ }
+ fn := func(node ast.Node) bool {
+ expr, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ switch expr.Op {
+ case token.GEQ, token.GTR, token.NEQ, token.LSS, token.EQL:
+ default:
+ return true
+ }
+
+ value, ok := ExprToInt(j, expr.Y)
+ if !ok {
+ return true
+ }
+
+ allowedOps, ok := allowed[value]
+ if !ok {
+ return true
+ }
+ b, ok := allowedOps[expr.Op]
+ if !ok {
+ return true
+ }
+
+ call, ok := expr.X.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ pkgIdent, ok := sel.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ funIdent := sel.Sel
+ if pkgIdent.Name != "strings" && pkgIdent.Name != "bytes" {
+ return true
+ }
+ newFunc := ""
+ switch funIdent.Name {
+ case "IndexRune":
+ newFunc = "ContainsRune"
+ case "IndexAny":
+ newFunc = "ContainsAny"
+ case "Index":
+ newFunc = "Contains"
+ default:
+ return true
+ }
+
+ prefix := ""
+ if !b {
+ prefix = "!"
+ }
+ j.Errorf(node, "should use %s%s.%s(%s) instead", prefix, pkgIdent.Name, newFunc, RenderArgs(j, call.Args))
+
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintBytesCompare(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ expr, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ if expr.Op != token.NEQ && expr.Op != token.EQL {
+ return true
+ }
+ call, ok := expr.X.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "bytes.Compare") {
+ return true
+ }
+ value, ok := ExprToInt(j, expr.Y)
+ if !ok || value != 0 {
+ return true
+ }
+ args := RenderArgs(j, call.Args)
+ prefix := ""
+ if expr.Op == token.NEQ {
+ prefix = "!"
+ }
+ j.Errorf(node, "should use %sbytes.Equal(%s) instead", prefix, args)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintForTrue(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.ForStmt)
+ if !ok {
+ return true
+ }
+ if loop.Init != nil || loop.Post != nil {
+ return true
+ }
+ if !IsBoolConst(j, loop.Cond) || !BoolConst(j, loop.Cond) {
+ return true
+ }
+ j.Errorf(loop, "should use for {} instead of for true {}")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintRegexpRaw(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "regexp.MustCompile") &&
+ !IsCallToAST(j, call, "regexp.Compile") {
+ return true
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ if len(call.Args) != 1 {
+ // invalid function call
+ return true
+ }
+ lit, ok := call.Args[Arg("regexp.Compile.expr")].(*ast.BasicLit)
+ if !ok {
+ // TODO(dominikh): support string concat, maybe support constants
+ return true
+ }
+ if lit.Kind != token.STRING {
+ // invalid function call
+ return true
+ }
+ if lit.Value[0] != '"' {
+ // already a raw string
+ return true
+ }
+ val := lit.Value
+ if !strings.Contains(val, `\\`) {
+ return true
+ }
+ if strings.Contains(val, "`") {
+ return true
+ }
+
+ bs := false
+ for _, c := range val {
+ if !bs && c == '\\' {
+ bs = true
+ continue
+ }
+ if bs && c == '\\' {
+ bs = false
+ continue
+ }
+ if bs {
+ // backslash followed by non-backslash -> escape sequence
+ return true
+ }
+ }
+
+ j.Errorf(call, "should use raw string (`...`) with regexp.%s to avoid having to escape twice", sel.Sel.Name)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintIfReturn(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ block, ok := node.(*ast.BlockStmt)
+ if !ok {
+ return true
+ }
+ l := len(block.List)
+ if l < 2 {
+ return true
+ }
+ n1, n2 := block.List[l-2], block.List[l-1]
+
+ if len(block.List) >= 3 {
+ if _, ok := block.List[l-3].(*ast.IfStmt); ok {
+ // Do not flag a series of if statements
+ return true
+ }
+ }
+ // if statement with no init, no else, a single condition
+ // checking an identifier or function call and just a return
+ // statement in the body, that returns a boolean constant
+ ifs, ok := n1.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ if ifs.Else != nil || ifs.Init != nil {
+ return true
+ }
+ if len(ifs.Body.List) != 1 {
+ return true
+ }
+ if op, ok := ifs.Cond.(*ast.BinaryExpr); ok {
+ switch op.Op {
+ case token.EQL, token.LSS, token.GTR, token.NEQ, token.LEQ, token.GEQ:
+ default:
+ return true
+ }
+ }
+ ret1, ok := ifs.Body.List[0].(*ast.ReturnStmt)
+ if !ok {
+ return true
+ }
+ if len(ret1.Results) != 1 {
+ return true
+ }
+ if !IsBoolConst(j, ret1.Results[0]) {
+ return true
+ }
+
+ ret2, ok := n2.(*ast.ReturnStmt)
+ if !ok {
+ return true
+ }
+ if len(ret2.Results) != 1 {
+ return true
+ }
+ if !IsBoolConst(j, ret2.Results[0]) {
+ return true
+ }
+ j.Errorf(n1, "should use 'return ' instead of 'if { return }; return '")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+// LintRedundantNilCheckWithLen checks for the following reduntant nil-checks:
+//
+// if x == nil || len(x) == 0 {}
+// if x != nil && len(x) != 0 {}
+// if x != nil && len(x) == N {} (where N != 0)
+// if x != nil && len(x) > N {}
+// if x != nil && len(x) >= N {} (where N != 0)
+//
+func (c *Checker) LintRedundantNilCheckWithLen(j *lint.Job) {
+ isConstZero := func(expr ast.Expr) (isConst bool, isZero bool) {
+ _, ok := expr.(*ast.BasicLit)
+ if ok {
+ return true, IsZero(expr)
+ }
+ id, ok := expr.(*ast.Ident)
+ if !ok {
+ return false, false
+ }
+ c, ok := ObjectOf(j, id).(*types.Const)
+ if !ok {
+ return false, false
+ }
+ return true, c.Val().Kind() == constant.Int && c.Val().String() == "0"
+ }
+
+ fn := func(node ast.Node) bool {
+ // check that expr is "x || y" or "x && y"
+ expr, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ if expr.Op != token.LOR && expr.Op != token.LAND {
+ return true
+ }
+ eqNil := expr.Op == token.LOR
+
+ // check that x is "xx == nil" or "xx != nil"
+ x, ok := expr.X.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ if eqNil && x.Op != token.EQL {
+ return true
+ }
+ if !eqNil && x.Op != token.NEQ {
+ return true
+ }
+ xx, ok := x.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if !IsNil(j, x.Y) {
+ return true
+ }
+
+ // check that y is "len(xx) == 0" or "len(xx) ... "
+ y, ok := expr.Y.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ if eqNil && y.Op != token.EQL { // must be len(xx) *==* 0
+ return false
+ }
+ yx, ok := y.X.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ yxFun, ok := yx.Fun.(*ast.Ident)
+ if !ok || yxFun.Name != "len" || len(yx.Args) != 1 {
+ return true
+ }
+ yxArg, ok := yx.Args[Arg("len.v")].(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if yxArg.Name != xx.Name {
+ return true
+ }
+
+ if eqNil && !IsZero(y.Y) { // must be len(x) == *0*
+ return true
+ }
+
+ if !eqNil {
+ isConst, isZero := isConstZero(y.Y)
+ if !isConst {
+ return true
+ }
+ switch y.Op {
+ case token.EQL:
+ // avoid false positive for "xx != nil && len(xx) == 0"
+ if isZero {
+ return true
+ }
+ case token.GEQ:
+ // avoid false positive for "xx != nil && len(xx) >= 0"
+ if isZero {
+ return true
+ }
+ case token.NEQ:
+ // avoid false positive for "xx != nil && len(xx) != "
+ if !isZero {
+ return true
+ }
+ case token.GTR:
+ // ok
+ default:
+ return true
+ }
+ }
+
+ // finally check that xx type is one of array, slice, map or chan
+ // this is to prevent false positive in case if xx is a pointer to an array
+ var nilType string
+ switch TypeOf(j, xx).(type) {
+ case *types.Slice:
+ nilType = "nil slices"
+ case *types.Map:
+ nilType = "nil maps"
+ case *types.Chan:
+ nilType = "nil channels"
+ default:
+ return true
+ }
+ j.Errorf(expr, "should omit nil check; len() for %s is defined as zero", nilType)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintSlicing(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ n, ok := node.(*ast.SliceExpr)
+ if !ok {
+ return true
+ }
+ if n.Max != nil {
+ return true
+ }
+ s, ok := n.X.(*ast.Ident)
+ if !ok || s.Obj == nil {
+ return true
+ }
+ call, ok := n.High.(*ast.CallExpr)
+ if !ok || len(call.Args) != 1 || call.Ellipsis.IsValid() {
+ return true
+ }
+ fun, ok := call.Fun.(*ast.Ident)
+ if !ok || fun.Name != "len" {
+ return true
+ }
+ if _, ok := ObjectOf(j, fun).(*types.Builtin); !ok {
+ return true
+ }
+ arg, ok := call.Args[Arg("len.v")].(*ast.Ident)
+ if !ok || arg.Obj != s.Obj {
+ return true
+ }
+ j.Errorf(n, "should omit second index in slice, s[a:len(s)] is identical to s[a:]")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func refersTo(j *lint.Job, expr ast.Expr, ident *ast.Ident) bool {
+ found := false
+ fn := func(node ast.Node) bool {
+ ident2, ok := node.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if ObjectOf(j, ident) == ObjectOf(j, ident2) {
+ found = true
+ return false
+ }
+ return true
+ }
+ ast.Inspect(expr, fn)
+ return found
+}
+
+func (c *Checker) LintLoopAppend(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.RangeStmt)
+ if !ok {
+ return true
+ }
+ if !IsBlank(loop.Key) {
+ return true
+ }
+ val, ok := loop.Value.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if len(loop.Body.List) != 1 {
+ return true
+ }
+ stmt, ok := loop.Body.List[0].(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if stmt.Tok != token.ASSIGN || len(stmt.Lhs) != 1 || len(stmt.Rhs) != 1 {
+ return true
+ }
+ if refersTo(j, stmt.Lhs[0], val) {
+ return true
+ }
+ call, ok := stmt.Rhs[0].(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if len(call.Args) != 2 || call.Ellipsis.IsValid() {
+ return true
+ }
+ fun, ok := call.Fun.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ obj := ObjectOf(j, fun)
+ fn, ok := obj.(*types.Builtin)
+ if !ok || fn.Name() != "append" {
+ return true
+ }
+
+ src := TypeOf(j, loop.X)
+ dst := TypeOf(j, call.Args[Arg("append.slice")])
+ // TODO(dominikh) remove nil check once Go issue #15173 has
+ // been fixed
+ if src == nil {
+ return true
+ }
+ if !types.Identical(src, dst) {
+ return true
+ }
+
+ if Render(j, stmt.Lhs[0]) != Render(j, call.Args[Arg("append.slice")]) {
+ return true
+ }
+
+ el, ok := call.Args[Arg("append.elems")].(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if ObjectOf(j, val) != ObjectOf(j, el) {
+ return true
+ }
+ j.Errorf(loop, "should replace loop with %s = append(%s, %s...)",
+ Render(j, stmt.Lhs[0]), Render(j, call.Args[Arg("append.slice")]), Render(j, loop.X))
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintTimeSince(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, sel.X, "time.Now") {
+ return true
+ }
+ if sel.Sel.Name != "Sub" {
+ return true
+ }
+ j.Errorf(call, "should use time.Since instead of time.Now().Sub")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintTimeUntil(j *lint.Job) {
+ if !IsGoVersion(j, 8) {
+ return
+ }
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "(time.Time).Sub") {
+ return true
+ }
+ if !IsCallToAST(j, call.Args[Arg("(time.Time).Sub.u")], "time.Now") {
+ return true
+ }
+ j.Errorf(call, "should use time.Until instead of t.Sub(time.Now())")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintUnnecessaryBlank(j *lint.Job) {
+ fn1 := func(node ast.Node) {
+ assign, ok := node.(*ast.AssignStmt)
+ if !ok {
+ return
+ }
+ if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 {
+ return
+ }
+ if !IsBlank(assign.Lhs[1]) {
+ return
+ }
+ switch rhs := assign.Rhs[0].(type) {
+ case *ast.IndexExpr:
+ // The type-checker should make sure that it's a map, but
+ // let's be safe.
+ if _, ok := TypeOf(j, rhs.X).Underlying().(*types.Map); !ok {
+ return
+ }
+ case *ast.UnaryExpr:
+ if rhs.Op != token.ARROW {
+ return
+ }
+ default:
+ return
+ }
+ cp := *assign
+ cp.Lhs = cp.Lhs[0:1]
+ j.Errorf(assign, "should write %s instead of %s", Render(j, &cp), Render(j, assign))
+ }
+
+ fn2 := func(node ast.Node) {
+ stmt, ok := node.(*ast.AssignStmt)
+ if !ok {
+ return
+ }
+ if len(stmt.Lhs) != len(stmt.Rhs) {
+ return
+ }
+ for i, lh := range stmt.Lhs {
+ rh := stmt.Rhs[i]
+ if !IsBlank(lh) {
+ continue
+ }
+ expr, ok := rh.(*ast.UnaryExpr)
+ if !ok {
+ continue
+ }
+ if expr.Op != token.ARROW {
+ continue
+ }
+ j.Errorf(lh, "'_ = <-ch' can be simplified to '<-ch'")
+ }
+ }
+
+ fn3 := func(node ast.Node) {
+ rs, ok := node.(*ast.RangeStmt)
+ if !ok {
+ return
+ }
+
+ // for x, _
+ if !IsBlank(rs.Key) && IsBlank(rs.Value) {
+ j.Errorf(rs.Value, "should omit value from range; this loop is equivalent to `for %s %s range ...`", Render(j, rs.Key), rs.Tok)
+ }
+ // for _, _ || for _
+ if IsBlank(rs.Key) && (IsBlank(rs.Value) || rs.Value == nil) {
+ j.Errorf(rs.Key, "should omit values from range; this loop is equivalent to `for range ...`")
+ }
+ }
+
+ fn := func(node ast.Node) bool {
+ fn1(node)
+ fn2(node)
+ if IsGoVersion(j, 4) {
+ fn3(node)
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintSimplerStructConversion(j *lint.Job) {
+ var skip ast.Node
+ fn := func(node ast.Node) bool {
+ // Do not suggest type conversion between pointers
+ if unary, ok := node.(*ast.UnaryExpr); ok && unary.Op == token.AND {
+ if lit, ok := unary.X.(*ast.CompositeLit); ok {
+ skip = lit
+ }
+ return true
+ }
+
+ if node == skip {
+ return true
+ }
+
+ lit, ok := node.(*ast.CompositeLit)
+ if !ok {
+ return true
+ }
+ typ1, _ := TypeOf(j, lit.Type).(*types.Named)
+ if typ1 == nil {
+ return true
+ }
+ s1, ok := typ1.Underlying().(*types.Struct)
+ if !ok {
+ return true
+ }
+
+ var typ2 *types.Named
+ var ident *ast.Ident
+ getSelType := func(expr ast.Expr) (types.Type, *ast.Ident, bool) {
+ sel, ok := expr.(*ast.SelectorExpr)
+ if !ok {
+ return nil, nil, false
+ }
+ ident, ok := sel.X.(*ast.Ident)
+ if !ok {
+ return nil, nil, false
+ }
+ typ := TypeOf(j, sel.X)
+ return typ, ident, typ != nil
+ }
+ if len(lit.Elts) == 0 {
+ return true
+ }
+ if s1.NumFields() != len(lit.Elts) {
+ return true
+ }
+ for i, elt := range lit.Elts {
+ var t types.Type
+ var id *ast.Ident
+ var ok bool
+ switch elt := elt.(type) {
+ case *ast.SelectorExpr:
+ t, id, ok = getSelType(elt)
+ if !ok {
+ return true
+ }
+ if i >= s1.NumFields() || s1.Field(i).Name() != elt.Sel.Name {
+ return true
+ }
+ case *ast.KeyValueExpr:
+ var sel *ast.SelectorExpr
+ sel, ok = elt.Value.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+
+ if elt.Key.(*ast.Ident).Name != sel.Sel.Name {
+ return true
+ }
+ t, id, ok = getSelType(elt.Value)
+ }
+ if !ok {
+ return true
+ }
+ // All fields must be initialized from the same object
+ if ident != nil && ident.Obj != id.Obj {
+ return true
+ }
+ typ2, _ = t.(*types.Named)
+ if typ2 == nil {
+ return true
+ }
+ ident = id
+ }
+
+ if typ2 == nil {
+ return true
+ }
+
+ if typ1.Obj().Pkg() != typ2.Obj().Pkg() {
+ // Do not suggest type conversions between different
+ // packages. Types in different packages might only match
+ // by coincidence. Furthermore, if the dependency ever
+ // adds more fields to its type, it could break the code
+ // that relies on the type conversion to work.
+ return true
+ }
+
+ s2, ok := typ2.Underlying().(*types.Struct)
+ if !ok {
+ return true
+ }
+ if typ1 == typ2 {
+ return true
+ }
+ if IsGoVersion(j, 8) {
+ if !types.IdenticalIgnoreTags(s1, s2) {
+ return true
+ }
+ } else {
+ if !types.Identical(s1, s2) {
+ return true
+ }
+ }
+ j.Errorf(node, "should convert %s (type %s) to %s instead of using struct literal",
+ ident.Name, typ2.Obj().Name(), typ1.Obj().Name())
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintTrim(j *lint.Job) {
+ sameNonDynamic := func(node1, node2 ast.Node) bool {
+ if reflect.TypeOf(node1) != reflect.TypeOf(node2) {
+ return false
+ }
+
+ switch node1 := node1.(type) {
+ case *ast.Ident:
+ return node1.Obj == node2.(*ast.Ident).Obj
+ case *ast.SelectorExpr:
+ return Render(j, node1) == Render(j, node2)
+ case *ast.IndexExpr:
+ return Render(j, node1) == Render(j, node2)
+ }
+ return false
+ }
+
+ isLenOnIdent := func(fn ast.Expr, ident ast.Expr) bool {
+ call, ok := fn.(*ast.CallExpr)
+ if !ok {
+ return false
+ }
+ if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "len" {
+ return false
+ }
+ if len(call.Args) != 1 {
+ return false
+ }
+ return sameNonDynamic(call.Args[Arg("len.v")], ident)
+ }
+
+ fn := func(node ast.Node) bool {
+ var pkg string
+ var fun string
+
+ ifstmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ if ifstmt.Init != nil {
+ return true
+ }
+ if ifstmt.Else != nil {
+ return true
+ }
+ if len(ifstmt.Body.List) != 1 {
+ return true
+ }
+ condCall, ok := ifstmt.Cond.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ switch {
+ case IsCallToAST(j, condCall, "strings.HasPrefix"):
+ pkg = "strings"
+ fun = "HasPrefix"
+ case IsCallToAST(j, condCall, "strings.HasSuffix"):
+ pkg = "strings"
+ fun = "HasSuffix"
+ case IsCallToAST(j, condCall, "strings.Contains"):
+ pkg = "strings"
+ fun = "Contains"
+ case IsCallToAST(j, condCall, "bytes.HasPrefix"):
+ pkg = "bytes"
+ fun = "HasPrefix"
+ case IsCallToAST(j, condCall, "bytes.HasSuffix"):
+ pkg = "bytes"
+ fun = "HasSuffix"
+ case IsCallToAST(j, condCall, "bytes.Contains"):
+ pkg = "bytes"
+ fun = "Contains"
+ default:
+ return true
+ }
+
+ assign, ok := ifstmt.Body.List[0].(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if assign.Tok != token.ASSIGN {
+ return true
+ }
+ if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
+ return true
+ }
+ if !sameNonDynamic(condCall.Args[0], assign.Lhs[0]) {
+ return true
+ }
+
+ switch rhs := assign.Rhs[0].(type) {
+ case *ast.CallExpr:
+ if len(rhs.Args) < 2 || !sameNonDynamic(condCall.Args[0], rhs.Args[0]) || !sameNonDynamic(condCall.Args[1], rhs.Args[1]) {
+ return true
+ }
+ if IsCallToAST(j, condCall, "strings.HasPrefix") && IsCallToAST(j, rhs, "strings.TrimPrefix") ||
+ IsCallToAST(j, condCall, "strings.HasSuffix") && IsCallToAST(j, rhs, "strings.TrimSuffix") ||
+ IsCallToAST(j, condCall, "strings.Contains") && IsCallToAST(j, rhs, "strings.Replace") ||
+ IsCallToAST(j, condCall, "bytes.HasPrefix") && IsCallToAST(j, rhs, "bytes.TrimPrefix") ||
+ IsCallToAST(j, condCall, "bytes.HasSuffix") && IsCallToAST(j, rhs, "bytes.TrimSuffix") ||
+ IsCallToAST(j, condCall, "bytes.Contains") && IsCallToAST(j, rhs, "bytes.Replace") {
+ j.Errorf(ifstmt, "should replace this if statement with an unconditional %s", CallNameAST(j, rhs))
+ }
+ return true
+ case *ast.SliceExpr:
+ slice := rhs
+ if !ok {
+ return true
+ }
+ if slice.Slice3 {
+ return true
+ }
+ if !sameNonDynamic(slice.X, condCall.Args[0]) {
+ return true
+ }
+ var index ast.Expr
+ switch fun {
+ case "HasPrefix":
+ // TODO(dh) We could detect a High that is len(s), but another
+ // rule will already flag that, anyway.
+ if slice.High != nil {
+ return true
+ }
+ index = slice.Low
+ case "HasSuffix":
+ if slice.Low != nil {
+ n, ok := ExprToInt(j, slice.Low)
+ if !ok || n != 0 {
+ return true
+ }
+ }
+ index = slice.High
+ }
+
+ switch index := index.(type) {
+ case *ast.CallExpr:
+ if fun != "HasPrefix" {
+ return true
+ }
+ if fn, ok := index.Fun.(*ast.Ident); !ok || fn.Name != "len" {
+ return true
+ }
+ if len(index.Args) != 1 {
+ return true
+ }
+ id3 := index.Args[Arg("len.v")]
+ switch oid3 := condCall.Args[1].(type) {
+ case *ast.BasicLit:
+ if pkg != "strings" {
+ return false
+ }
+ lit, ok := id3.(*ast.BasicLit)
+ if !ok {
+ return true
+ }
+ s1, ok1 := ExprToString(j, lit)
+ s2, ok2 := ExprToString(j, condCall.Args[1])
+ if !ok1 || !ok2 || s1 != s2 {
+ return true
+ }
+ default:
+ if !sameNonDynamic(id3, oid3) {
+ return true
+ }
+ }
+ case *ast.BasicLit, *ast.Ident:
+ if fun != "HasPrefix" {
+ return true
+ }
+ if pkg != "strings" {
+ return true
+ }
+ string, ok1 := ExprToString(j, condCall.Args[1])
+ int, ok2 := ExprToInt(j, slice.Low)
+ if !ok1 || !ok2 || int != int64(len(string)) {
+ return true
+ }
+ case *ast.BinaryExpr:
+ if fun != "HasSuffix" {
+ return true
+ }
+ if index.Op != token.SUB {
+ return true
+ }
+ if !isLenOnIdent(index.X, condCall.Args[0]) ||
+ !isLenOnIdent(index.Y, condCall.Args[1]) {
+ return true
+ }
+ default:
+ return true
+ }
+
+ var replacement string
+ switch fun {
+ case "HasPrefix":
+ replacement = "TrimPrefix"
+ case "HasSuffix":
+ replacement = "TrimSuffix"
+ }
+ j.Errorf(ifstmt, "should replace this if statement with an unconditional %s.%s", pkg, replacement)
+ return true
+ default:
+ return true
+ }
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintLoopSlide(j *lint.Job) {
+ // TODO(dh): detect bs[i+offset] in addition to bs[offset+i]
+ // TODO(dh): consider merging this function with LintLoopCopy
+ // TODO(dh): detect length that is an expression, not a variable name
+ // TODO(dh): support sliding to a different offset than the beginning of the slice
+
+ fn := func(node ast.Node) bool {
+ /*
+ for i := 0; i < n; i++ {
+ bs[i] = bs[offset+i]
+ }
+
+ ↓
+
+ copy(bs[:n], bs[offset:offset+n])
+ */
+
+ loop, ok := node.(*ast.ForStmt)
+ if !ok || len(loop.Body.List) != 1 || loop.Init == nil || loop.Cond == nil || loop.Post == nil {
+ return true
+ }
+ assign, ok := loop.Init.(*ast.AssignStmt)
+ if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || !IsZero(assign.Rhs[0]) {
+ return true
+ }
+ initvar, ok := assign.Lhs[0].(*ast.Ident)
+ if !ok {
+ return true
+ }
+ post, ok := loop.Post.(*ast.IncDecStmt)
+ if !ok || post.Tok != token.INC {
+ return true
+ }
+ postvar, ok := post.X.(*ast.Ident)
+ if !ok || ObjectOf(j, postvar) != ObjectOf(j, initvar) {
+ return true
+ }
+ bin, ok := loop.Cond.(*ast.BinaryExpr)
+ if !ok || bin.Op != token.LSS {
+ return true
+ }
+ binx, ok := bin.X.(*ast.Ident)
+ if !ok || ObjectOf(j, binx) != ObjectOf(j, initvar) {
+ return true
+ }
+ biny, ok := bin.Y.(*ast.Ident)
+ if !ok {
+ return true
+ }
+
+ assign, ok = loop.Body.List[0].(*ast.AssignStmt)
+ if !ok || len(assign.Lhs) != 1 || len(assign.Rhs) != 1 || assign.Tok != token.ASSIGN {
+ return true
+ }
+ lhs, ok := assign.Lhs[0].(*ast.IndexExpr)
+ if !ok {
+ return true
+ }
+ rhs, ok := assign.Rhs[0].(*ast.IndexExpr)
+ if !ok {
+ return true
+ }
+
+ bs1, ok := lhs.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ bs2, ok := rhs.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ obj1 := ObjectOf(j, bs1)
+ obj2 := ObjectOf(j, bs2)
+ if obj1 != obj2 {
+ return true
+ }
+ if _, ok := obj1.Type().Underlying().(*types.Slice); !ok {
+ return true
+ }
+
+ index1, ok := lhs.Index.(*ast.Ident)
+ if !ok || ObjectOf(j, index1) != ObjectOf(j, initvar) {
+ return true
+ }
+ index2, ok := rhs.Index.(*ast.BinaryExpr)
+ if !ok || index2.Op != token.ADD {
+ return true
+ }
+ add1, ok := index2.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ add2, ok := index2.Y.(*ast.Ident)
+ if !ok || ObjectOf(j, add2) != ObjectOf(j, initvar) {
+ return true
+ }
+
+ j.Errorf(loop, "should use copy(%s[:%s], %s[%s:]) instead", Render(j, bs1), Render(j, biny), Render(j, bs1), Render(j, add1))
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintMakeLenCap(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if fn, ok := call.Fun.(*ast.Ident); !ok || fn.Name != "make" {
+ // FIXME check whether make is indeed the built-in function
+ return true
+ }
+ switch len(call.Args) {
+ case 2:
+ // make(T, len)
+ if _, ok := TypeOf(j, call.Args[Arg("make.t")]).Underlying().(*types.Slice); ok {
+ break
+ }
+ if IsZero(call.Args[Arg("make.size[0]")]) {
+ j.Errorf(call.Args[Arg("make.size[0]")], "should use make(%s) instead", Render(j, call.Args[Arg("make.t")]))
+ }
+ case 3:
+ // make(T, len, cap)
+ if Render(j, call.Args[Arg("make.size[0]")]) == Render(j, call.Args[Arg("make.size[1]")]) {
+ j.Errorf(call.Args[Arg("make.size[0]")],
+ "should use make(%s, %s) instead",
+ Render(j, call.Args[Arg("make.t")]), Render(j, call.Args[Arg("make.size[0]")]))
+ }
+ }
+ return false
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintAssertNotNil(j *lint.Job) {
+ isNilCheck := func(ident *ast.Ident, expr ast.Expr) bool {
+ xbinop, ok := expr.(*ast.BinaryExpr)
+ if !ok || xbinop.Op != token.NEQ {
+ return false
+ }
+ xident, ok := xbinop.X.(*ast.Ident)
+ if !ok || xident.Obj != ident.Obj {
+ return false
+ }
+ if !IsNil(j, xbinop.Y) {
+ return false
+ }
+ return true
+ }
+ isOKCheck := func(ident *ast.Ident, expr ast.Expr) bool {
+ yident, ok := expr.(*ast.Ident)
+ if !ok || yident.Obj != ident.Obj {
+ return false
+ }
+ return true
+ }
+ fn1 := func(node ast.Node) bool {
+ ifstmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ assign, ok := ifstmt.Init.(*ast.AssignStmt)
+ if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) {
+ return true
+ }
+ assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr)
+ if !ok {
+ return true
+ }
+ binop, ok := ifstmt.Cond.(*ast.BinaryExpr)
+ if !ok || binop.Op != token.LAND {
+ return true
+ }
+ assertIdent, ok := assert.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ assignIdent, ok := assign.Lhs[1].(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if !(isNilCheck(assertIdent, binop.X) && isOKCheck(assignIdent, binop.Y)) &&
+ !(isNilCheck(assertIdent, binop.Y) && isOKCheck(assignIdent, binop.X)) {
+ return true
+ }
+ j.Errorf(ifstmt, "when %s is true, %s can't be nil", Render(j, assignIdent), Render(j, assertIdent))
+ return true
+ }
+ fn2 := func(node ast.Node) bool {
+ // Check that outer ifstmt is an 'if x != nil {}'
+ ifstmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ if ifstmt.Init != nil {
+ return true
+ }
+ if ifstmt.Else != nil {
+ return true
+ }
+ if len(ifstmt.Body.List) != 1 {
+ return true
+ }
+ binop, ok := ifstmt.Cond.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ if binop.Op != token.NEQ {
+ return true
+ }
+ lhs, ok := binop.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if !IsNil(j, binop.Y) {
+ return true
+ }
+
+ // Check that inner ifstmt is an `if _, ok := x.(T); ok {}`
+ ifstmt, ok = ifstmt.Body.List[0].(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ assign, ok := ifstmt.Init.(*ast.AssignStmt)
+ if !ok || len(assign.Lhs) != 2 || len(assign.Rhs) != 1 || !IsBlank(assign.Lhs[0]) {
+ return true
+ }
+ assert, ok := assign.Rhs[0].(*ast.TypeAssertExpr)
+ if !ok {
+ return true
+ }
+ assertIdent, ok := assert.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if lhs.Obj != assertIdent.Obj {
+ return true
+ }
+ assignIdent, ok := assign.Lhs[1].(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if !isOKCheck(assignIdent, ifstmt.Cond) {
+ return true
+ }
+ j.Errorf(ifstmt, "when %s is true, %s can't be nil", Render(j, assignIdent), Render(j, assertIdent))
+ return true
+ }
+ fn := func(node ast.Node) bool {
+ b1 := fn1(node)
+ b2 := fn2(node)
+ return b1 || b2
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintDeclareAssign(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ block, ok := node.(*ast.BlockStmt)
+ if !ok {
+ return true
+ }
+ if len(block.List) < 2 {
+ return true
+ }
+ for i, stmt := range block.List[:len(block.List)-1] {
+ _ = i
+ decl, ok := stmt.(*ast.DeclStmt)
+ if !ok {
+ continue
+ }
+ gdecl, ok := decl.Decl.(*ast.GenDecl)
+ if !ok || gdecl.Tok != token.VAR || len(gdecl.Specs) != 1 {
+ continue
+ }
+ vspec, ok := gdecl.Specs[0].(*ast.ValueSpec)
+ if !ok || len(vspec.Names) != 1 || len(vspec.Values) != 0 {
+ continue
+ }
+
+ assign, ok := block.List[i+1].(*ast.AssignStmt)
+ if !ok || assign.Tok != token.ASSIGN {
+ continue
+ }
+ if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
+ continue
+ }
+ ident, ok := assign.Lhs[0].(*ast.Ident)
+ if !ok {
+ continue
+ }
+ if vspec.Names[0].Obj != ident.Obj {
+ continue
+ }
+
+ if refersTo(j, assign.Rhs[0], ident) {
+ continue
+ }
+ j.Errorf(decl, "should merge variable declaration with assignment on next line")
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintRedundantBreak(j *lint.Job) {
+ fn1 := func(node ast.Node) {
+ clause, ok := node.(*ast.CaseClause)
+ if !ok {
+ return
+ }
+ if len(clause.Body) < 2 {
+ return
+ }
+ branch, ok := clause.Body[len(clause.Body)-1].(*ast.BranchStmt)
+ if !ok || branch.Tok != token.BREAK || branch.Label != nil {
+ return
+ }
+ j.Errorf(branch, "redundant break statement")
+ }
+ fn2 := func(node ast.Node) {
+ var ret *ast.FieldList
+ var body *ast.BlockStmt
+ switch x := node.(type) {
+ case *ast.FuncDecl:
+ ret = x.Type.Results
+ body = x.Body
+ case *ast.FuncLit:
+ ret = x.Type.Results
+ body = x.Body
+ default:
+ return
+ }
+ // if the func has results, a return can't be redundant.
+ // similarly, if there are no statements, there can be
+ // no return.
+ if ret != nil || body == nil || len(body.List) < 1 {
+ return
+ }
+ rst, ok := body.List[len(body.List)-1].(*ast.ReturnStmt)
+ if !ok {
+ return
+ }
+ // we don't need to check rst.Results as we already
+ // checked x.Type.Results to be nil.
+ j.Errorf(rst, "redundant return statement")
+ }
+ fn := func(node ast.Node) bool {
+ fn1(node)
+ fn2(node)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) Implements(j *lint.Job, typ types.Type, iface string) bool {
+ // OPT(dh): we can cache the type lookup
+ idx := strings.IndexRune(iface, '.')
+ var scope *types.Scope
+ var ifaceName string
+ if idx == -1 {
+ scope = types.Universe
+ ifaceName = iface
+ } else {
+ pkgName := iface[:idx]
+ pkg := j.Program.Package(pkgName)
+ if pkg == nil {
+ return false
+ }
+ scope = pkg.Types.Scope()
+ ifaceName = iface[idx+1:]
+ }
+
+ obj := scope.Lookup(ifaceName)
+ if obj == nil {
+ return false
+ }
+ i, ok := obj.Type().Underlying().(*types.Interface)
+ if !ok {
+ return false
+ }
+ return types.Implements(typ, i)
+}
+
+func (c *Checker) LintRedundantSprintf(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "fmt.Sprintf") {
+ return true
+ }
+ if len(call.Args) != 2 {
+ return true
+ }
+ if s, ok := ExprToString(j, call.Args[Arg("fmt.Sprintf.format")]); !ok || s != "%s" {
+ return true
+ }
+ arg := call.Args[Arg("fmt.Sprintf.a[0]")]
+ typ := TypeOf(j, arg)
+
+ if c.Implements(j, typ, "fmt.Stringer") {
+ j.Errorf(call, "should use String() instead of fmt.Sprintf")
+ return true
+ }
+
+ if typ.Underlying() == types.Universe.Lookup("string").Type() {
+ if typ == types.Universe.Lookup("string").Type() {
+ j.Errorf(call, "the argument is already a string, there's no need to use fmt.Sprintf")
+ } else {
+ j.Errorf(call, "the argument's underlying type is a string, should use a simple conversion instead of fmt.Sprintf")
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintErrorsNewSprintf(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ if !IsCallToAST(j, node, "errors.New") {
+ return true
+ }
+ call := node.(*ast.CallExpr)
+ if !IsCallToAST(j, call.Args[Arg("errors.New.text")], "fmt.Sprintf") {
+ return true
+ }
+ j.Errorf(node, "should use fmt.Errorf(...) instead of errors.New(fmt.Sprintf(...))")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintRangeStringRunes(j *lint.Job) {
+ sharedcheck.CheckRangeStringRunes(j)
+}
+
+func (c *Checker) LintNilCheckAroundRange(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ ifstmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+
+ cond, ok := ifstmt.Cond.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+
+ if cond.Op != token.NEQ || !IsNil(j, cond.Y) || len(ifstmt.Body.List) != 1 {
+ return true
+ }
+
+ loop, ok := ifstmt.Body.List[0].(*ast.RangeStmt)
+ if !ok {
+ return true
+ }
+ ifXIdent, ok := cond.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ rangeXIdent, ok := loop.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if ifXIdent.Obj != rangeXIdent.Obj {
+ return true
+ }
+ switch TypeOf(j, rangeXIdent).(type) {
+ case *types.Slice, *types.Map:
+ j.Errorf(node, "unnecessary nil check around range")
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func isPermissibleSort(j *lint.Job, node ast.Node) bool {
+ call := node.(*ast.CallExpr)
+ typeconv, ok := call.Args[0].(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+
+ sel, ok := typeconv.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ name := SelectorName(j, sel)
+ switch name {
+ case "sort.IntSlice", "sort.Float64Slice", "sort.StringSlice":
+ default:
+ return true
+ }
+
+ return false
+}
+
+func (c *Checker) LintSortHelpers(j *lint.Job) {
+ fnFuncs := func(node ast.Node) bool {
+ var body *ast.BlockStmt
+ switch node := node.(type) {
+ case *ast.FuncLit:
+ body = node.Body
+ case *ast.FuncDecl:
+ body = node.Body
+ default:
+ return true
+ }
+ if body == nil {
+ return true
+ }
+
+ type Error struct {
+ node lint.Positioner
+ msg string
+ }
+ var errors []Error
+ permissible := false
+ fnSorts := func(node ast.Node) bool {
+ if permissible {
+ return false
+ }
+ if !IsCallToAST(j, node, "sort.Sort") {
+ return true
+ }
+ if isPermissibleSort(j, node) {
+ permissible = true
+ return false
+ }
+ call := node.(*ast.CallExpr)
+ typeconv := call.Args[Arg("sort.Sort.data")].(*ast.CallExpr)
+ sel := typeconv.Fun.(*ast.SelectorExpr)
+ name := SelectorName(j, sel)
+
+ switch name {
+ case "sort.IntSlice":
+ errors = append(errors, Error{node, "should use sort.Ints(...) instead of sort.Sort(sort.IntSlice(...))"})
+ case "sort.Float64Slice":
+ errors = append(errors, Error{node, "should use sort.Float64s(...) instead of sort.Sort(sort.Float64Slice(...))"})
+ case "sort.StringSlice":
+ errors = append(errors, Error{node, "should use sort.Strings(...) instead of sort.Sort(sort.StringSlice(...))"})
+ }
+ return true
+ }
+ ast.Inspect(body, fnSorts)
+
+ if permissible {
+ return false
+ }
+ for _, err := range errors {
+ j.Errorf(err.node, "%s", err.msg)
+ }
+ return false
+ }
+
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fnFuncs)
+ }
+}
+
+func (c *Checker) LintGuardedDelete(j *lint.Job) {
+ isCommaOkMapIndex := func(stmt ast.Stmt) (b *ast.Ident, m ast.Expr, key ast.Expr, ok bool) {
+ // Has to be of the form `_, = []
+
+ assign, ok := stmt.(*ast.AssignStmt)
+ if !ok {
+ return nil, nil, nil, false
+ }
+ if len(assign.Lhs) != 2 || len(assign.Rhs) != 1 {
+ return nil, nil, nil, false
+ }
+ if !IsBlank(assign.Lhs[0]) {
+ return nil, nil, nil, false
+ }
+ ident, ok := assign.Lhs[1].(*ast.Ident)
+ if !ok {
+ return nil, nil, nil, false
+ }
+ index, ok := assign.Rhs[0].(*ast.IndexExpr)
+ if !ok {
+ return nil, nil, nil, false
+ }
+ if _, ok := TypeOf(j, index.X).(*types.Map); !ok {
+ return nil, nil, nil, false
+ }
+ key = index.Index
+ return ident, index.X, key, true
+ }
+ fn := func(node ast.Node) bool {
+ stmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ if len(stmt.Body.List) != 1 {
+ return true
+ }
+ expr, ok := stmt.Body.List[0].(*ast.ExprStmt)
+ if !ok {
+ return true
+ }
+ call, ok := expr.X.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "delete") {
+ return true
+ }
+ b, m, key, ok := isCommaOkMapIndex(stmt.Init)
+ if !ok {
+ return true
+ }
+ if cond, ok := stmt.Cond.(*ast.Ident); !ok || ObjectOf(j, cond) != ObjectOf(j, b) {
+ return true
+ }
+ if Render(j, call.Args[0]) != Render(j, m) || Render(j, call.Args[1]) != Render(j, key) {
+ return true
+ }
+ j.Errorf(stmt, "unnecessary guard around call to delete")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) LintSimplifyTypeSwitch(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ stmt, ok := node.(*ast.TypeSwitchStmt)
+ if !ok {
+ return true
+ }
+ if stmt.Init != nil {
+ // bailing out for now, can't anticipate how type switches with initializers are being used
+ return true
+ }
+ expr, ok := stmt.Assign.(*ast.ExprStmt)
+ if !ok {
+ // the user is in fact assigning the result
+ return true
+ }
+ assert := expr.X.(*ast.TypeAssertExpr)
+ ident, ok := assert.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ x := ObjectOf(j, ident)
+ var allOffenders []ast.Node
+ for _, clause := range stmt.Body.List {
+ clause := clause.(*ast.CaseClause)
+ if len(clause.List) != 1 {
+ continue
+ }
+ hasUnrelatedAssertion := false
+ var offenders []ast.Node
+ ast.Inspect(clause, func(node ast.Node) bool {
+ assert2, ok := node.(*ast.TypeAssertExpr)
+ if !ok {
+ return true
+ }
+ ident, ok := assert2.X.(*ast.Ident)
+ if !ok {
+ hasUnrelatedAssertion = true
+ return false
+ }
+ if ObjectOf(j, ident) != x {
+ hasUnrelatedAssertion = true
+ return false
+ }
+
+ if !types.Identical(TypeOf(j, clause.List[0]), TypeOf(j, assert2.Type)) {
+ hasUnrelatedAssertion = true
+ return false
+ }
+ offenders = append(offenders, assert2)
+ return true
+ })
+ if !hasUnrelatedAssertion {
+ // don't flag cases that have other type assertions
+ // unrelated to the one in the case clause. often
+ // times, this is done for symmetry, when two
+ // different values have to be asserted to the same
+ // type.
+ allOffenders = append(allOffenders, offenders...)
+ }
+ }
+ if len(allOffenders) != 0 {
+ at := ""
+ for _, offender := range allOffenders {
+ pos := j.Program.DisplayPosition(offender.Pos())
+ at += "\n\t" + pos.String()
+ }
+ j.Errorf(expr, "assigning the result of this type assertion to a variable (switch %s := %s.(type)) could eliminate the following type assertions:%s", Render(j, ident), Render(j, ident), at)
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/LICENSE b/vendor/github.com/golangci/go-tools/ssa/LICENSE
new file mode 100644
index 00000000000..aee48041e11
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2009 The Go Authors. All rights reserved.
+Copyright (c) 2016 Dominik Honnef. 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/go-tools/ssa/blockopt.go b/vendor/github.com/golangci/go-tools/ssa/blockopt.go
new file mode 100644
index 00000000000..22c9a4c0d42
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/blockopt.go
@@ -0,0 +1,195 @@
+// 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 ssa
+
+// Simple block optimizations to simplify the control flow graph.
+
+// TODO(adonovan): opt: instead of creating several "unreachable" blocks
+// per function in the Builder, reuse a single one (e.g. at Blocks[1])
+// to reduce garbage.
+
+import (
+ "fmt"
+ "os"
+)
+
+// If true, perform sanity checking and show progress at each
+// successive iteration of optimizeBlocks. Very verbose.
+const debugBlockOpt = false
+
+// markReachable sets Index=-1 for all blocks reachable from b.
+func markReachable(b *BasicBlock) {
+ b.Index = -1
+ for _, succ := range b.Succs {
+ if succ.Index == 0 {
+ markReachable(succ)
+ }
+ }
+}
+
+func DeleteUnreachableBlocks(f *Function) {
+ deleteUnreachableBlocks(f)
+}
+
+// deleteUnreachableBlocks marks all reachable blocks of f and
+// eliminates (nils) all others, including possibly cyclic subgraphs.
+//
+func deleteUnreachableBlocks(f *Function) {
+ const white, black = 0, -1
+ // We borrow b.Index temporarily as the mark bit.
+ for _, b := range f.Blocks {
+ b.Index = white
+ }
+ markReachable(f.Blocks[0])
+ if f.Recover != nil {
+ markReachable(f.Recover)
+ }
+ for i, b := range f.Blocks {
+ if b.Index == white {
+ for _, c := range b.Succs {
+ if c.Index == black {
+ c.removePred(b) // delete white->black edge
+ }
+ }
+ if debugBlockOpt {
+ fmt.Fprintln(os.Stderr, "unreachable", b)
+ }
+ f.Blocks[i] = nil // delete b
+ }
+ }
+ f.removeNilBlocks()
+}
+
+// jumpThreading attempts to apply simple jump-threading to block b,
+// in which a->b->c become a->c if b is just a Jump.
+// The result is true if the optimization was applied.
+//
+func jumpThreading(f *Function, b *BasicBlock) bool {
+ if b.Index == 0 {
+ return false // don't apply to entry block
+ }
+ if b.Instrs == nil {
+ return false
+ }
+ if _, ok := b.Instrs[0].(*Jump); !ok {
+ return false // not just a jump
+ }
+ c := b.Succs[0]
+ if c == b {
+ return false // don't apply to degenerate jump-to-self.
+ }
+ if c.hasPhi() {
+ return false // not sound without more effort
+ }
+ for j, a := range b.Preds {
+ a.replaceSucc(b, c)
+
+ // If a now has two edges to c, replace its degenerate If by Jump.
+ if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
+ jump := new(Jump)
+ jump.setBlock(a)
+ a.Instrs[len(a.Instrs)-1] = jump
+ a.Succs = a.Succs[:1]
+ c.removePred(b)
+ } else {
+ if j == 0 {
+ c.replacePred(b, a)
+ } else {
+ c.Preds = append(c.Preds, a)
+ }
+ }
+
+ if debugBlockOpt {
+ fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
+ }
+ }
+ f.Blocks[b.Index] = nil // delete b
+ return true
+}
+
+// fuseBlocks attempts to apply the block fusion optimization to block
+// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
+// The result is true if the optimization was applied.
+//
+func fuseBlocks(f *Function, a *BasicBlock) bool {
+ if len(a.Succs) != 1 {
+ return false
+ }
+ b := a.Succs[0]
+ if len(b.Preds) != 1 {
+ return false
+ }
+
+ // Degenerate &&/|| ops may result in a straight-line CFG
+ // containing φ-nodes. (Ideally we'd replace such them with
+ // their sole operand but that requires Referrers, built later.)
+ if b.hasPhi() {
+ return false // not sound without further effort
+ }
+
+ // Eliminate jump at end of A, then copy all of B across.
+ a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
+ for _, instr := range b.Instrs {
+ instr.setBlock(a)
+ }
+
+ // A inherits B's successors
+ a.Succs = append(a.succs2[:0], b.Succs...)
+
+ // Fix up Preds links of all successors of B.
+ for _, c := range b.Succs {
+ c.replacePred(b, a)
+ }
+
+ if debugBlockOpt {
+ fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
+ }
+
+ f.Blocks[b.Index] = nil // delete b
+ return true
+}
+
+func OptimizeBlocks(f *Function) {
+ optimizeBlocks(f)
+}
+
+// optimizeBlocks() performs some simple block optimizations on a
+// completed function: dead block elimination, block fusion, jump
+// threading.
+//
+func optimizeBlocks(f *Function) {
+ deleteUnreachableBlocks(f)
+
+ // Loop until no further progress.
+ changed := true
+ for changed {
+ changed = false
+
+ if debugBlockOpt {
+ f.WriteTo(os.Stderr)
+ mustSanityCheck(f, nil)
+ }
+
+ for _, b := range f.Blocks {
+ // f.Blocks will temporarily contain nils to indicate
+ // deleted blocks; we remove them at the end.
+ if b == nil {
+ continue
+ }
+
+ // Fuse blocks. b->c becomes bc.
+ if fuseBlocks(f, b) {
+ changed = true
+ }
+
+ // a->b->c becomes a->c if b contains only a Jump.
+ if jumpThreading(f, b) {
+ changed = true
+ continue // (b was disconnected)
+ }
+ }
+ }
+ f.removeNilBlocks()
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/builder.go b/vendor/github.com/golangci/go-tools/ssa/builder.go
new file mode 100644
index 00000000000..032819a2a11
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/builder.go
@@ -0,0 +1,2379 @@
+// 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 ssa
+
+// This file implements the BUILD phase of SSA construction.
+//
+// SSA construction has two phases, CREATE and BUILD. In the CREATE phase
+// (create.go), all packages are constructed and type-checked and
+// definitions of all package members are created, method-sets are
+// computed, and wrapper methods are synthesized.
+// ssa.Packages are created in arbitrary order.
+//
+// In the BUILD phase (builder.go), the builder traverses the AST of
+// each Go source function and generates SSA instructions for the
+// function body. Initializer expressions for package-level variables
+// are emitted to the package's init() function in the order specified
+// by go/types.Info.InitOrder, then code for each function in the
+// package is generated in lexical order.
+// The BUILD phases for distinct packages are independent and are
+// executed in parallel.
+//
+// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
+// Audit for concurrency then benchmark using more goroutines.
+//
+// The builder's and Program's indices (maps) are populated and
+// mutated during the CREATE phase, but during the BUILD phase they
+// remain constant. The sole exception is Prog.methodSets and its
+// related maps, which are protected by a dedicated mutex.
+
+import (
+ "fmt"
+ "go/ast"
+ exact "go/constant"
+ "go/token"
+ "go/types"
+ "os"
+ "sync"
+)
+
+type opaqueType struct {
+ types.Type
+ name string
+}
+
+func (t *opaqueType) String() string { return t.name }
+
+var (
+ varOk = newVar("ok", tBool)
+ varIndex = newVar("index", tInt)
+
+ // Type constants.
+ tBool = types.Typ[types.Bool]
+ tByte = types.Typ[types.Byte]
+ tInt = types.Typ[types.Int]
+ tInvalid = types.Typ[types.Invalid]
+ tString = types.Typ[types.String]
+ tUntypedNil = types.Typ[types.UntypedNil]
+ tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators
+ tEface = types.NewInterface(nil, nil).Complete()
+
+ // SSA Value constants.
+ vZero = intConst(0)
+ vOne = intConst(1)
+ vTrue = NewConst(exact.MakeBool(true), tBool)
+)
+
+// builder holds state associated with the package currently being built.
+// Its methods contain all the logic for AST-to-SSA conversion.
+type builder struct{}
+
+// cond emits to fn code to evaluate boolean condition e and jump
+// to t or f depending on its value, performing various simplifications.
+//
+// Postcondition: fn.currentBlock is nil.
+//
+func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
+ switch e := e.(type) {
+ case *ast.ParenExpr:
+ b.cond(fn, e.X, t, f)
+ return
+
+ case *ast.BinaryExpr:
+ switch e.Op {
+ case token.LAND:
+ ltrue := fn.newBasicBlock("cond.true")
+ b.cond(fn, e.X, ltrue, f)
+ fn.currentBlock = ltrue
+ b.cond(fn, e.Y, t, f)
+ return
+
+ case token.LOR:
+ lfalse := fn.newBasicBlock("cond.false")
+ b.cond(fn, e.X, t, lfalse)
+ fn.currentBlock = lfalse
+ b.cond(fn, e.Y, t, f)
+ return
+ }
+
+ case *ast.UnaryExpr:
+ if e.Op == token.NOT {
+ b.cond(fn, e.X, f, t)
+ return
+ }
+ }
+
+ // A traditional compiler would simplify "if false" (etc) here
+ // but we do not, for better fidelity to the source code.
+ //
+ // The value of a constant condition may be platform-specific,
+ // and may cause blocks that are reachable in some configuration
+ // to be hidden from subsequent analyses such as bug-finding tools.
+ emitIf(fn, b.expr(fn, e), t, f)
+}
+
+// logicalBinop emits code to fn to evaluate e, a &&- or
+// ||-expression whose reified boolean value is wanted.
+// The value is returned.
+//
+func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
+ rhs := fn.newBasicBlock("binop.rhs")
+ done := fn.newBasicBlock("binop.done")
+
+ // T(e) = T(e.X) = T(e.Y) after untyped constants have been
+ // eliminated.
+ // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
+ t := fn.Pkg.typeOf(e)
+
+ var short Value // value of the short-circuit path
+ switch e.Op {
+ case token.LAND:
+ b.cond(fn, e.X, rhs, done)
+ short = NewConst(exact.MakeBool(false), t)
+
+ case token.LOR:
+ b.cond(fn, e.X, done, rhs)
+ short = NewConst(exact.MakeBool(true), t)
+ }
+
+ // Is rhs unreachable?
+ if rhs.Preds == nil {
+ // Simplify false&&y to false, true||y to true.
+ fn.currentBlock = done
+ return short
+ }
+
+ // Is done unreachable?
+ if done.Preds == nil {
+ // Simplify true&&y (or false||y) to y.
+ fn.currentBlock = rhs
+ return b.expr(fn, e.Y)
+ }
+
+ // All edges from e.X to done carry the short-circuit value.
+ var edges []Value
+ for range done.Preds {
+ edges = append(edges, short)
+ }
+
+ // The edge from e.Y to done carries the value of e.Y.
+ fn.currentBlock = rhs
+ edges = append(edges, b.expr(fn, e.Y))
+ emitJump(fn, done)
+ fn.currentBlock = done
+
+ phi := &Phi{Edges: edges, Comment: e.Op.String()}
+ phi.pos = e.OpPos
+ phi.typ = t
+ return done.emit(phi)
+}
+
+// exprN lowers a multi-result expression e to SSA form, emitting code
+// to fn and returning a single Value whose type is a *types.Tuple.
+// The caller must access the components via Extract.
+//
+// Multi-result expressions include CallExprs in a multi-value
+// assignment or return statement, and "value,ok" uses of
+// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
+// is token.ARROW).
+//
+func (b *builder) exprN(fn *Function, e ast.Expr) Value {
+ typ := fn.Pkg.typeOf(e).(*types.Tuple)
+ switch e := e.(type) {
+ case *ast.ParenExpr:
+ return b.exprN(fn, e.X)
+
+ case *ast.CallExpr:
+ // Currently, no built-in function nor type conversion
+ // has multiple results, so we can avoid some of the
+ // cases for single-valued CallExpr.
+ var c Call
+ b.setCall(fn, e, &c.Call)
+ c.typ = typ
+ return fn.emit(&c)
+
+ case *ast.IndexExpr:
+ mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
+ lookup := &Lookup{
+ X: b.expr(fn, e.X),
+ Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
+ CommaOk: true,
+ }
+ lookup.setType(typ)
+ lookup.setPos(e.Lbrack)
+ return fn.emit(lookup)
+
+ case *ast.TypeAssertExpr:
+ return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
+
+ case *ast.UnaryExpr: // must be receive <-
+ unop := &UnOp{
+ Op: token.ARROW,
+ X: b.expr(fn, e.X),
+ CommaOk: true,
+ }
+ unop.setType(typ)
+ unop.setPos(e.OpPos)
+ return fn.emit(unop)
+ }
+ panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
+}
+
+// builtin emits to fn SSA instructions to implement a call to the
+// built-in function obj with the specified arguments
+// and return type. It returns the value defined by the result.
+//
+// The result is nil if no special handling was required; in this case
+// the caller should treat this like an ordinary library function
+// call.
+//
+func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
+ switch obj.Name() {
+ case "make":
+ switch typ.Underlying().(type) {
+ case *types.Slice:
+ n := b.expr(fn, args[1])
+ m := n
+ if len(args) == 3 {
+ m = b.expr(fn, args[2])
+ }
+ if m, ok := m.(*Const); ok {
+ // treat make([]T, n, m) as new([m]T)[:n]
+ cap := m.Int64()
+ at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
+ alloc := emitNew(fn, at, pos)
+ alloc.Comment = "makeslice"
+ v := &Slice{
+ X: alloc,
+ High: n,
+ }
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+ }
+ v := &MakeSlice{
+ Len: n,
+ Cap: m,
+ }
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+
+ case *types.Map:
+ var res Value
+ if len(args) == 2 {
+ res = b.expr(fn, args[1])
+ }
+ v := &MakeMap{Reserve: res}
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+
+ case *types.Chan:
+ var sz Value = vZero
+ if len(args) == 2 {
+ sz = b.expr(fn, args[1])
+ }
+ v := &MakeChan{Size: sz}
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+ }
+
+ case "new":
+ alloc := emitNew(fn, deref(typ), pos)
+ alloc.Comment = "new"
+ return alloc
+
+ case "len", "cap":
+ // Special case: len or cap of an array or *array is
+ // based on the type, not the value which may be nil.
+ // We must still evaluate the value, though. (If it
+ // was side-effect free, the whole call would have
+ // been constant-folded.)
+ t := deref(fn.Pkg.typeOf(args[0])).Underlying()
+ if at, ok := t.(*types.Array); ok {
+ b.expr(fn, args[0]) // for effects only
+ return intConst(at.Len())
+ }
+ // Otherwise treat as normal.
+
+ case "panic":
+ fn.emit(&Panic{
+ X: emitConv(fn, b.expr(fn, args[0]), tEface),
+ pos: pos,
+ })
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+ return vTrue // any non-nil Value will do
+ }
+ return nil // treat all others as a regular function call
+}
+
+// addr lowers a single-result addressable expression e to SSA form,
+// emitting code to fn and returning the location (an lvalue) defined
+// by the expression.
+//
+// If escaping is true, addr marks the base variable of the
+// addressable expression e as being a potentially escaping pointer
+// value. For example, in this code:
+//
+// a := A{
+// b: [1]B{B{c: 1}}
+// }
+// return &a.b[0].c
+//
+// the application of & causes a.b[0].c to have its address taken,
+// which means that ultimately the local variable a must be
+// heap-allocated. This is a simple but very conservative escape
+// analysis.
+//
+// Operations forming potentially escaping pointers include:
+// - &x, including when implicit in method call or composite literals.
+// - a[:] iff a is an array (not *array)
+// - references to variables in lexically enclosing functions.
+//
+func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
+ switch e := e.(type) {
+ case *ast.Ident:
+ if isBlankIdent(e) {
+ return blank{}
+ }
+ obj := fn.Pkg.objectOf(e)
+ v := fn.Prog.packageLevelValue(obj) // var (address)
+ if v == nil {
+ v = fn.lookup(obj, escaping)
+ }
+ return &address{addr: v, pos: e.Pos(), expr: e}
+
+ case *ast.CompositeLit:
+ t := deref(fn.Pkg.typeOf(e))
+ var v *Alloc
+ if escaping {
+ v = emitNew(fn, t, e.Lbrace)
+ } else {
+ v = fn.addLocal(t, e.Lbrace)
+ }
+ v.Comment = "complit"
+ var sb storebuf
+ b.compLit(fn, v, e, true, &sb)
+ sb.emit(fn)
+ return &address{addr: v, pos: e.Lbrace, expr: e}
+
+ case *ast.ParenExpr:
+ return b.addr(fn, e.X, escaping)
+
+ case *ast.SelectorExpr:
+ sel, ok := fn.Pkg.info.Selections[e]
+ if !ok {
+ // qualified identifier
+ return b.addr(fn, e.Sel, escaping)
+ }
+ if sel.Kind() != types.FieldVal {
+ panic(sel)
+ }
+ wantAddr := true
+ v := b.receiver(fn, e.X, wantAddr, escaping, sel)
+ last := len(sel.Index()) - 1
+ return &address{
+ addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
+ pos: e.Sel.Pos(),
+ expr: e.Sel,
+ }
+
+ case *ast.IndexExpr:
+ var x Value
+ var et types.Type
+ switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
+ case *types.Array:
+ x = b.addr(fn, e.X, escaping).address(fn)
+ et = types.NewPointer(t.Elem())
+ case *types.Pointer: // *array
+ x = b.expr(fn, e.X)
+ et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
+ case *types.Slice:
+ x = b.expr(fn, e.X)
+ et = types.NewPointer(t.Elem())
+ case *types.Map:
+ return &element{
+ m: b.expr(fn, e.X),
+ k: emitConv(fn, b.expr(fn, e.Index), t.Key()),
+ t: t.Elem(),
+ pos: e.Lbrack,
+ }
+ default:
+ panic("unexpected container type in IndexExpr: " + t.String())
+ }
+ v := &IndexAddr{
+ X: x,
+ Index: emitConv(fn, b.expr(fn, e.Index), tInt),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(et)
+ return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
+
+ case *ast.StarExpr:
+ return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
+ }
+
+ panic(fmt.Sprintf("unexpected address expression: %T", e))
+}
+
+type store struct {
+ lhs lvalue
+ rhs Value
+}
+
+type storebuf struct{ stores []store }
+
+func (sb *storebuf) store(lhs lvalue, rhs Value) {
+ sb.stores = append(sb.stores, store{lhs, rhs})
+}
+
+func (sb *storebuf) emit(fn *Function) {
+ for _, s := range sb.stores {
+ s.lhs.store(fn, s.rhs)
+ }
+}
+
+// assign emits to fn code to initialize the lvalue loc with the value
+// of expression e. If isZero is true, assign assumes that loc holds
+// the zero value for its type.
+//
+// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
+// better code in some cases, e.g., for composite literals in an
+// addressable location.
+//
+// If sb is not nil, assign generates code to evaluate expression e, but
+// not to update loc. Instead, the necessary stores are appended to the
+// storebuf sb so that they can be executed later. This allows correct
+// in-place update of existing variables when the RHS is a composite
+// literal that may reference parts of the LHS.
+//
+func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
+ // Can we initialize it in place?
+ if e, ok := unparen(e).(*ast.CompositeLit); ok {
+ // A CompositeLit never evaluates to a pointer,
+ // so if the type of the location is a pointer,
+ // an &-operation is implied.
+ if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
+ if isPointer(loc.typ()) {
+ ptr := b.addr(fn, e, true).address(fn)
+ // copy address
+ if sb != nil {
+ sb.store(loc, ptr)
+ } else {
+ loc.store(fn, ptr)
+ }
+ return
+ }
+ }
+
+ if _, ok := loc.(*address); ok {
+ if isInterface(loc.typ()) {
+ // e.g. var x interface{} = T{...}
+ // Can't in-place initialize an interface value.
+ // Fall back to copying.
+ } else {
+ // x = T{...} or x := T{...}
+ addr := loc.address(fn)
+ if sb != nil {
+ b.compLit(fn, addr, e, isZero, sb)
+ } else {
+ var sb storebuf
+ b.compLit(fn, addr, e, isZero, &sb)
+ sb.emit(fn)
+ }
+
+ // Subtle: emit debug ref for aggregate types only;
+ // slice and map are handled by store ops in compLit.
+ switch loc.typ().Underlying().(type) {
+ case *types.Struct, *types.Array:
+ emitDebugRef(fn, e, addr, true)
+ }
+
+ return
+ }
+ }
+ }
+
+ // simple case: just copy
+ rhs := b.expr(fn, e)
+ if sb != nil {
+ sb.store(loc, rhs)
+ } else {
+ loc.store(fn, rhs)
+ }
+}
+
+// expr lowers a single-result expression e to SSA form, emitting code
+// to fn and returning the Value defined by the expression.
+//
+func (b *builder) expr(fn *Function, e ast.Expr) Value {
+ e = unparen(e)
+
+ tv := fn.Pkg.info.Types[e]
+
+ // Is expression a constant?
+ if tv.Value != nil {
+ return NewConst(tv.Value, tv.Type)
+ }
+
+ var v Value
+ if tv.Addressable() {
+ // Prefer pointer arithmetic ({Index,Field}Addr) followed
+ // by Load over subelement extraction (e.g. Index, Field),
+ // to avoid large copies.
+ v = b.addr(fn, e, false).load(fn)
+ } else {
+ v = b.expr0(fn, e, tv)
+ }
+ if fn.debugInfo() {
+ emitDebugRef(fn, e, v, false)
+ }
+ return v
+}
+
+func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
+ switch e := e.(type) {
+ case *ast.BasicLit:
+ panic("non-constant BasicLit") // unreachable
+
+ case *ast.FuncLit:
+ fn2 := &Function{
+ name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
+ Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
+ pos: e.Type.Func,
+ parent: fn,
+ Pkg: fn.Pkg,
+ Prog: fn.Prog,
+ syntax: e,
+ }
+ fn.AnonFuncs = append(fn.AnonFuncs, fn2)
+ b.buildFunction(fn2)
+ if fn2.FreeVars == nil {
+ return fn2
+ }
+ v := &MakeClosure{Fn: fn2}
+ v.setType(tv.Type)
+ for _, fv := range fn2.FreeVars {
+ v.Bindings = append(v.Bindings, fv.outer)
+ fv.outer = nil
+ }
+ return fn.emit(v)
+
+ case *ast.TypeAssertExpr: // single-result form only
+ return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
+
+ case *ast.CallExpr:
+ if fn.Pkg.info.Types[e.Fun].IsType() {
+ // Explicit type conversion, e.g. string(x) or big.Int(x)
+ x := b.expr(fn, e.Args[0])
+ y := emitConv(fn, x, tv.Type)
+ if y != x {
+ switch y := y.(type) {
+ case *Convert:
+ y.pos = e.Lparen
+ case *ChangeType:
+ y.pos = e.Lparen
+ case *MakeInterface:
+ y.pos = e.Lparen
+ }
+ }
+ return y
+ }
+ // Call to "intrinsic" built-ins, e.g. new, make, panic.
+ if id, ok := unparen(e.Fun).(*ast.Ident); ok {
+ if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
+ if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
+ return v
+ }
+ }
+ }
+ // Regular function call.
+ var v Call
+ b.setCall(fn, e, &v.Call)
+ v.setType(tv.Type)
+ return fn.emit(&v)
+
+ case *ast.UnaryExpr:
+ switch e.Op {
+ case token.AND: // &X --- potentially escaping.
+ addr := b.addr(fn, e.X, true)
+ if _, ok := unparen(e.X).(*ast.StarExpr); ok {
+ // &*p must panic if p is nil (http://golang.org/s/go12nil).
+ // For simplicity, we'll just (suboptimally) rely
+ // on the side effects of a load.
+ // TODO(adonovan): emit dedicated nilcheck.
+ addr.load(fn)
+ }
+ return addr.address(fn)
+ case token.ADD:
+ return b.expr(fn, e.X)
+ case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
+ v := &UnOp{
+ Op: e.Op,
+ X: b.expr(fn, e.X),
+ }
+ v.setPos(e.OpPos)
+ v.setType(tv.Type)
+ return fn.emit(v)
+ default:
+ panic(e.Op)
+ }
+
+ case *ast.BinaryExpr:
+ switch e.Op {
+ case token.LAND, token.LOR:
+ return b.logicalBinop(fn, e)
+ case token.SHL, token.SHR:
+ fallthrough
+ case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
+ return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
+
+ case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
+ cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
+ // The type of x==y may be UntypedBool.
+ return emitConv(fn, cmp, DefaultType(tv.Type))
+ default:
+ panic("illegal op in BinaryExpr: " + e.Op.String())
+ }
+
+ case *ast.SliceExpr:
+ var low, high, max Value
+ var x Value
+ switch fn.Pkg.typeOf(e.X).Underlying().(type) {
+ case *types.Array:
+ // Potentially escaping.
+ x = b.addr(fn, e.X, true).address(fn)
+ case *types.Basic, *types.Slice, *types.Pointer: // *array
+ x = b.expr(fn, e.X)
+ default:
+ panic("unreachable")
+ }
+ if e.High != nil {
+ high = b.expr(fn, e.High)
+ }
+ if e.Low != nil {
+ low = b.expr(fn, e.Low)
+ }
+ if e.Slice3 {
+ max = b.expr(fn, e.Max)
+ }
+ v := &Slice{
+ X: x,
+ Low: low,
+ High: high,
+ Max: max,
+ }
+ v.setPos(e.Lbrack)
+ v.setType(tv.Type)
+ return fn.emit(v)
+
+ case *ast.Ident:
+ obj := fn.Pkg.info.Uses[e]
+ // Universal built-in or nil?
+ switch obj := obj.(type) {
+ case *types.Builtin:
+ return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
+ case *types.Nil:
+ return nilConst(tv.Type)
+ }
+ // Package-level func or var?
+ if v := fn.Prog.packageLevelValue(obj); v != nil {
+ if _, ok := obj.(*types.Var); ok {
+ return emitLoad(fn, v) // var (address)
+ }
+ return v // (func)
+ }
+ // Local var.
+ return emitLoad(fn, fn.lookup(obj, false)) // var (address)
+
+ case *ast.SelectorExpr:
+ sel, ok := fn.Pkg.info.Selections[e]
+ if !ok {
+ // qualified identifier
+ return b.expr(fn, e.Sel)
+ }
+ switch sel.Kind() {
+ case types.MethodExpr:
+ // (*T).f or T.f, the method f from the method-set of type T.
+ // The result is a "thunk".
+ return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
+
+ case types.MethodVal:
+ // e.f where e is an expression and f is a method.
+ // The result is a "bound".
+ obj := sel.Obj().(*types.Func)
+ rt := recvType(obj)
+ wantAddr := isPointer(rt)
+ escaping := true
+ v := b.receiver(fn, e.X, wantAddr, escaping, sel)
+ if isInterface(rt) {
+ // If v has interface type I,
+ // we must emit a check that v is non-nil.
+ // We use: typeassert v.(I).
+ emitTypeAssert(fn, v, rt, token.NoPos)
+ }
+ c := &MakeClosure{
+ Fn: makeBound(fn.Prog, obj),
+ Bindings: []Value{v},
+ }
+ c.setPos(e.Sel.Pos())
+ c.setType(tv.Type)
+ return fn.emit(c)
+
+ case types.FieldVal:
+ indices := sel.Index()
+ last := len(indices) - 1
+ v := b.expr(fn, e.X)
+ v = emitImplicitSelections(fn, v, indices[:last])
+ v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
+ return v
+ }
+
+ panic("unexpected expression-relative selector")
+
+ case *ast.IndexExpr:
+ switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
+ case *types.Array:
+ // Non-addressable array (in a register).
+ v := &Index{
+ X: b.expr(fn, e.X),
+ Index: emitConv(fn, b.expr(fn, e.Index), tInt),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(t.Elem())
+ return fn.emit(v)
+
+ case *types.Map:
+ // Maps are not addressable.
+ mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
+ v := &Lookup{
+ X: b.expr(fn, e.X),
+ Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(mapt.Elem())
+ return fn.emit(v)
+
+ case *types.Basic: // => string
+ // Strings are not addressable.
+ v := &Lookup{
+ X: b.expr(fn, e.X),
+ Index: b.expr(fn, e.Index),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(tByte)
+ return fn.emit(v)
+
+ case *types.Slice, *types.Pointer: // *array
+ // Addressable slice/array; use IndexAddr and Load.
+ return b.addr(fn, e, false).load(fn)
+
+ default:
+ panic("unexpected container type in IndexExpr: " + t.String())
+ }
+
+ case *ast.CompositeLit, *ast.StarExpr:
+ // Addressable types (lvalues)
+ return b.addr(fn, e, false).load(fn)
+ }
+
+ panic(fmt.Sprintf("unexpected expr: %T", e))
+}
+
+// stmtList emits to fn code for all statements in list.
+func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
+ for _, s := range list {
+ b.stmt(fn, s)
+ }
+}
+
+// receiver emits to fn code for expression e in the "receiver"
+// position of selection e.f (where f may be a field or a method) and
+// returns the effective receiver after applying the implicit field
+// selections of sel.
+//
+// wantAddr requests that the result is an an address. If
+// !sel.Indirect(), this may require that e be built in addr() mode; it
+// must thus be addressable.
+//
+// escaping is defined as per builder.addr().
+//
+func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
+ var v Value
+ if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
+ v = b.addr(fn, e, escaping).address(fn)
+ } else {
+ v = b.expr(fn, e)
+ }
+
+ last := len(sel.Index()) - 1
+ v = emitImplicitSelections(fn, v, sel.Index()[:last])
+ if !wantAddr && isPointer(v.Type()) {
+ v = emitLoad(fn, v)
+ }
+ return v
+}
+
+// setCallFunc populates the function parts of a CallCommon structure
+// (Func, Method, Recv, Args[0]) based on the kind of invocation
+// occurring in e.
+//
+func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
+ c.pos = e.Lparen
+
+ // Is this a method call?
+ if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
+ sel, ok := fn.Pkg.info.Selections[selector]
+ if ok && sel.Kind() == types.MethodVal {
+ obj := sel.Obj().(*types.Func)
+ recv := recvType(obj)
+ wantAddr := isPointer(recv)
+ escaping := true
+ v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
+ if isInterface(recv) {
+ // Invoke-mode call.
+ c.Value = v
+ c.Method = obj
+ } else {
+ // "Call"-mode call.
+ c.Value = fn.Prog.declaredFunc(obj)
+ c.Args = append(c.Args, v)
+ }
+ return
+ }
+
+ // sel.Kind()==MethodExpr indicates T.f() or (*T).f():
+ // a statically dispatched call to the method f in the
+ // method-set of T or *T. T may be an interface.
+ //
+ // e.Fun would evaluate to a concrete method, interface
+ // wrapper function, or promotion wrapper.
+ //
+ // For now, we evaluate it in the usual way.
+ //
+ // TODO(adonovan): opt: inline expr() here, to make the
+ // call static and to avoid generation of wrappers.
+ // It's somewhat tricky as it may consume the first
+ // actual parameter if the call is "invoke" mode.
+ //
+ // Examples:
+ // type T struct{}; func (T) f() {} // "call" mode
+ // type T interface { f() } // "invoke" mode
+ //
+ // type S struct{ T }
+ //
+ // var s S
+ // S.f(s)
+ // (*S).f(&s)
+ //
+ // Suggested approach:
+ // - consume the first actual parameter expression
+ // and build it with b.expr().
+ // - apply implicit field selections.
+ // - use MethodVal logic to populate fields of c.
+ }
+
+ // Evaluate the function operand in the usual way.
+ c.Value = b.expr(fn, e.Fun)
+}
+
+// emitCallArgs emits to f code for the actual parameters of call e to
+// a (possibly built-in) function of effective type sig.
+// The argument values are appended to args, which is then returned.
+//
+func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
+ // f(x, y, z...): pass slice z straight through.
+ if e.Ellipsis != 0 {
+ for i, arg := range e.Args {
+ v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
+ args = append(args, v)
+ }
+ return args
+ }
+
+ offset := len(args) // 1 if call has receiver, 0 otherwise
+
+ // Evaluate actual parameter expressions.
+ //
+ // If this is a chained call of the form f(g()) where g has
+ // multiple return values (MRV), they are flattened out into
+ // args; a suffix of them may end up in a varargs slice.
+ for _, arg := range e.Args {
+ v := b.expr(fn, arg)
+ if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
+ for i, n := 0, ttuple.Len(); i < n; i++ {
+ args = append(args, emitExtract(fn, v, i))
+ }
+ } else {
+ args = append(args, v)
+ }
+ }
+
+ // Actual->formal assignability conversions for normal parameters.
+ np := sig.Params().Len() // number of normal parameters
+ if sig.Variadic() {
+ np--
+ }
+ for i := 0; i < np; i++ {
+ args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
+ }
+
+ // Actual->formal assignability conversions for variadic parameter,
+ // and construction of slice.
+ if sig.Variadic() {
+ varargs := args[offset+np:]
+ st := sig.Params().At(np).Type().(*types.Slice)
+ vt := st.Elem()
+ if len(varargs) == 0 {
+ args = append(args, nilConst(st))
+ } else {
+ // Replace a suffix of args with a slice containing it.
+ at := types.NewArray(vt, int64(len(varargs)))
+ a := emitNew(fn, at, token.NoPos)
+ a.setPos(e.Rparen)
+ a.Comment = "varargs"
+ for i, arg := range varargs {
+ iaddr := &IndexAddr{
+ X: a,
+ Index: intConst(int64(i)),
+ }
+ iaddr.setType(types.NewPointer(vt))
+ fn.emit(iaddr)
+ emitStore(fn, iaddr, arg, arg.Pos())
+ }
+ s := &Slice{X: a}
+ s.setType(st)
+ args[offset+np] = fn.emit(s)
+ args = args[:offset+np+1]
+ }
+ }
+ return args
+}
+
+// setCall emits to fn code to evaluate all the parameters of a function
+// call e, and populates *c with those values.
+//
+func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
+ // First deal with the f(...) part and optional receiver.
+ b.setCallFunc(fn, e, c)
+
+ // Then append the other actual parameters.
+ sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
+ if sig == nil {
+ panic(fmt.Sprintf("no signature for call of %s", e.Fun))
+ }
+ c.Args = b.emitCallArgs(fn, sig, e, c.Args)
+}
+
+// assignOp emits to fn code to perform loc += incr or loc -= incr.
+func (b *builder) assignOp(fn *Function, loc lvalue, incr Value, op token.Token, pos token.Pos) {
+ oldv := loc.load(fn)
+ loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, incr, oldv.Type()), loc.typ(), pos))
+}
+
+// localValueSpec emits to fn code to define all of the vars in the
+// function-local ValueSpec, spec.
+//
+func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
+ switch {
+ case len(spec.Values) == len(spec.Names):
+ // e.g. var x, y = 0, 1
+ // 1:1 assignment
+ for i, id := range spec.Names {
+ if !isBlankIdent(id) {
+ fn.addLocalForIdent(id)
+ }
+ lval := b.addr(fn, id, false) // non-escaping
+ b.assign(fn, lval, spec.Values[i], true, nil)
+ }
+
+ case len(spec.Values) == 0:
+ // e.g. var x, y int
+ // Locals are implicitly zero-initialized.
+ for _, id := range spec.Names {
+ if !isBlankIdent(id) {
+ lhs := fn.addLocalForIdent(id)
+ if fn.debugInfo() {
+ emitDebugRef(fn, id, lhs, true)
+ }
+ }
+ }
+
+ default:
+ // e.g. var x, y = pos()
+ tuple := b.exprN(fn, spec.Values[0])
+ for i, id := range spec.Names {
+ if !isBlankIdent(id) {
+ fn.addLocalForIdent(id)
+ lhs := b.addr(fn, id, false) // non-escaping
+ lhs.store(fn, emitExtract(fn, tuple, i))
+ }
+ }
+ }
+}
+
+// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
+// isDef is true if this is a short variable declaration (:=).
+//
+// Note the similarity with localValueSpec.
+//
+func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
+ // Side effects of all LHSs and RHSs must occur in left-to-right order.
+ lvals := make([]lvalue, len(lhss))
+ isZero := make([]bool, len(lhss))
+ for i, lhs := range lhss {
+ var lval lvalue = blank{}
+ if !isBlankIdent(lhs) {
+ if isDef {
+ if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
+ fn.addNamedLocal(obj)
+ isZero[i] = true
+ }
+ }
+ lval = b.addr(fn, lhs, false) // non-escaping
+ }
+ lvals[i] = lval
+ }
+ if len(lhss) == len(rhss) {
+ // Simple assignment: x = f() (!isDef)
+ // Parallel assignment: x, y = f(), g() (!isDef)
+ // or short var decl: x, y := f(), g() (isDef)
+ //
+ // In all cases, the RHSs may refer to the LHSs,
+ // so we need a storebuf.
+ var sb storebuf
+ for i := range rhss {
+ b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
+ }
+ sb.emit(fn)
+ } else {
+ // e.g. x, y = pos()
+ tuple := b.exprN(fn, rhss[0])
+ emitDebugRef(fn, rhss[0], tuple, false)
+ for i, lval := range lvals {
+ lval.store(fn, emitExtract(fn, tuple, i))
+ }
+ }
+}
+
+// arrayLen returns the length of the array whose composite literal elements are elts.
+func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
+ var max int64 = -1
+ var i int64 = -1
+ for _, e := range elts {
+ if kv, ok := e.(*ast.KeyValueExpr); ok {
+ i = b.expr(fn, kv.Key).(*Const).Int64()
+ } else {
+ i++
+ }
+ if i > max {
+ max = i
+ }
+ }
+ return max + 1
+}
+
+// compLit emits to fn code to initialize a composite literal e at
+// address addr with type typ.
+//
+// Nested composite literals are recursively initialized in place
+// where possible. If isZero is true, compLit assumes that addr
+// holds the zero value for typ.
+//
+// Because the elements of a composite literal may refer to the
+// variables being updated, as in the second line below,
+// x := T{a: 1}
+// x = T{a: x.a}
+// all the reads must occur before all the writes. Thus all stores to
+// loc are emitted to the storebuf sb for later execution.
+//
+// A CompositeLit may have pointer type only in the recursive (nested)
+// case when the type name is implicit. e.g. in []*T{{}}, the inner
+// literal has type *T behaves like &T{}.
+// In that case, addr must hold a T, not a *T.
+//
+func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
+ typ := deref(fn.Pkg.typeOf(e))
+ switch t := typ.Underlying().(type) {
+ case *types.Struct:
+ if !isZero && len(e.Elts) != t.NumFields() {
+ // memclear
+ sb.store(&address{addr, e.Lbrace, nil},
+ zeroValue(fn, deref(addr.Type())))
+ isZero = true
+ }
+ for i, e := range e.Elts {
+ fieldIndex := i
+ pos := e.Pos()
+ if kv, ok := e.(*ast.KeyValueExpr); ok {
+ fname := kv.Key.(*ast.Ident).Name
+ for i, n := 0, t.NumFields(); i < n; i++ {
+ sf := t.Field(i)
+ if sf.Name() == fname {
+ fieldIndex = i
+ pos = kv.Colon
+ e = kv.Value
+ break
+ }
+ }
+ }
+ sf := t.Field(fieldIndex)
+ faddr := &FieldAddr{
+ X: addr,
+ Field: fieldIndex,
+ }
+ faddr.setType(types.NewPointer(sf.Type()))
+ fn.emit(faddr)
+ b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
+ }
+
+ case *types.Array, *types.Slice:
+ var at *types.Array
+ var array Value
+ switch t := t.(type) {
+ case *types.Slice:
+ at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
+ alloc := emitNew(fn, at, e.Lbrace)
+ alloc.Comment = "slicelit"
+ array = alloc
+ case *types.Array:
+ at = t
+ array = addr
+
+ if !isZero && int64(len(e.Elts)) != at.Len() {
+ // memclear
+ sb.store(&address{array, e.Lbrace, nil},
+ zeroValue(fn, deref(array.Type())))
+ }
+ }
+
+ var idx *Const
+ for _, e := range e.Elts {
+ pos := e.Pos()
+ if kv, ok := e.(*ast.KeyValueExpr); ok {
+ idx = b.expr(fn, kv.Key).(*Const)
+ pos = kv.Colon
+ e = kv.Value
+ } else {
+ var idxval int64
+ if idx != nil {
+ idxval = idx.Int64() + 1
+ }
+ idx = intConst(idxval)
+ }
+ iaddr := &IndexAddr{
+ X: array,
+ Index: idx,
+ }
+ iaddr.setType(types.NewPointer(at.Elem()))
+ fn.emit(iaddr)
+ if t != at { // slice
+ // backing array is unaliased => storebuf not needed.
+ b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
+ } else {
+ b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
+ }
+ }
+
+ if t != at { // slice
+ s := &Slice{X: array}
+ s.setPos(e.Lbrace)
+ s.setType(typ)
+ sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
+ }
+
+ case *types.Map:
+ m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
+ m.setPos(e.Lbrace)
+ m.setType(typ)
+ fn.emit(m)
+ for _, e := range e.Elts {
+ e := e.(*ast.KeyValueExpr)
+
+ // If a key expression in a map literal is itself a
+ // composite literal, the type may be omitted.
+ // For example:
+ // map[*struct{}]bool{{}: true}
+ // An &-operation may be implied:
+ // map[*struct{}]bool{&struct{}{}: true}
+ var key Value
+ if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) {
+ // A CompositeLit never evaluates to a pointer,
+ // so if the type of the location is a pointer,
+ // an &-operation is implied.
+ key = b.addr(fn, e.Key, true).address(fn)
+ } else {
+ key = b.expr(fn, e.Key)
+ }
+
+ loc := element{
+ m: m,
+ k: emitConv(fn, key, t.Key()),
+ t: t.Elem(),
+ pos: e.Colon,
+ }
+
+ // We call assign() only because it takes care
+ // of any &-operation required in the recursive
+ // case, e.g.,
+ // map[int]*struct{}{0: {}} implies &struct{}{}.
+ // In-place update is of course impossible,
+ // and no storebuf is needed.
+ b.assign(fn, &loc, e.Value, true, nil)
+ }
+ sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
+
+ default:
+ panic("unexpected CompositeLit type: " + t.String())
+ }
+}
+
+// switchStmt emits to fn code for the switch statement s, optionally
+// labelled by label.
+//
+func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
+ // We treat SwitchStmt like a sequential if-else chain.
+ // Multiway dispatch can be recovered later by ssautil.Switches()
+ // to those cases that are free of side effects.
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+ var tag Value = vTrue
+ if s.Tag != nil {
+ tag = b.expr(fn, s.Tag)
+ }
+ done := fn.newBasicBlock("switch.done")
+ if label != nil {
+ label._break = done
+ }
+ // We pull the default case (if present) down to the end.
+ // But each fallthrough label must point to the next
+ // body block in source order, so we preallocate a
+ // body block (fallthru) for the next case.
+ // Unfortunately this makes for a confusing block order.
+ var dfltBody *[]ast.Stmt
+ var dfltFallthrough *BasicBlock
+ var fallthru, dfltBlock *BasicBlock
+ ncases := len(s.Body.List)
+ for i, clause := range s.Body.List {
+ body := fallthru
+ if body == nil {
+ body = fn.newBasicBlock("switch.body") // first case only
+ }
+
+ // Preallocate body block for the next case.
+ fallthru = done
+ if i+1 < ncases {
+ fallthru = fn.newBasicBlock("switch.body")
+ }
+
+ cc := clause.(*ast.CaseClause)
+ if cc.List == nil {
+ // Default case.
+ dfltBody = &cc.Body
+ dfltFallthrough = fallthru
+ dfltBlock = body
+ continue
+ }
+
+ var nextCond *BasicBlock
+ for _, cond := range cc.List {
+ nextCond = fn.newBasicBlock("switch.next")
+ // TODO(adonovan): opt: when tag==vTrue, we'd
+ // get better code if we use b.cond(cond)
+ // instead of BinOp(EQL, tag, b.expr(cond))
+ // followed by If. Don't forget conversions
+ // though.
+ cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), cond.Pos())
+ emitIf(fn, cond, body, nextCond)
+ fn.currentBlock = nextCond
+ }
+ fn.currentBlock = body
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _fallthrough: fallthru,
+ }
+ b.stmtList(fn, cc.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+ fn.currentBlock = nextCond
+ }
+ if dfltBlock != nil {
+ emitJump(fn, dfltBlock)
+ fn.currentBlock = dfltBlock
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _fallthrough: dfltFallthrough,
+ }
+ b.stmtList(fn, *dfltBody)
+ fn.targets = fn.targets.tail
+ }
+ emitJump(fn, done)
+ fn.currentBlock = done
+}
+
+// typeSwitchStmt emits to fn code for the type switch statement s, optionally
+// labelled by label.
+//
+func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
+ // We treat TypeSwitchStmt like a sequential if-else chain.
+ // Multiway dispatch can be recovered later by ssautil.Switches().
+
+ // Typeswitch lowering:
+ //
+ // var x X
+ // switch y := x.(type) {
+ // case T1, T2: S1 // >1 (y := x)
+ // case nil: SN // nil (y := x)
+ // default: SD // 0 types (y := x)
+ // case T3: S3 // 1 type (y := x.(T3))
+ // }
+ //
+ // ...s.Init...
+ // x := eval x
+ // .caseT1:
+ // t1, ok1 := typeswitch,ok x
+ // if ok1 then goto S1 else goto .caseT2
+ // .caseT2:
+ // t2, ok2 := typeswitch,ok x
+ // if ok2 then goto S1 else goto .caseNil
+ // .S1:
+ // y := x
+ // ...S1...
+ // goto done
+ // .caseNil:
+ // if t2, ok2 := typeswitch,ok x
+ // if x == nil then goto SN else goto .caseT3
+ // .SN:
+ // y := x
+ // ...SN...
+ // goto done
+ // .caseT3:
+ // t3, ok3 := typeswitch,ok x
+ // if ok3 then goto S3 else goto default
+ // .S3:
+ // y := t3
+ // ...S3...
+ // goto done
+ // .default:
+ // y := x
+ // ...SD...
+ // goto done
+ // .done:
+
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+
+ var x Value
+ switch ass := s.Assign.(type) {
+ case *ast.ExprStmt: // x.(type)
+ x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
+ case *ast.AssignStmt: // y := x.(type)
+ x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
+ }
+
+ done := fn.newBasicBlock("typeswitch.done")
+ if label != nil {
+ label._break = done
+ }
+ var default_ *ast.CaseClause
+ for _, clause := range s.Body.List {
+ cc := clause.(*ast.CaseClause)
+ if cc.List == nil {
+ default_ = cc
+ continue
+ }
+ body := fn.newBasicBlock("typeswitch.body")
+ var next *BasicBlock
+ var casetype types.Type
+ var ti Value // ti, ok := typeassert,ok x
+ for _, cond := range cc.List {
+ next = fn.newBasicBlock("typeswitch.next")
+ casetype = fn.Pkg.typeOf(cond)
+ var condv Value
+ if casetype == tUntypedNil {
+ condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
+ ti = x
+ } else {
+ yok := emitTypeTest(fn, x, casetype, cc.Case)
+ ti = emitExtract(fn, yok, 0)
+ condv = emitExtract(fn, yok, 1)
+ }
+ emitIf(fn, condv, body, next)
+ fn.currentBlock = next
+ }
+ if len(cc.List) != 1 {
+ ti = x
+ }
+ fn.currentBlock = body
+ b.typeCaseBody(fn, cc, ti, done)
+ fn.currentBlock = next
+ }
+ if default_ != nil {
+ b.typeCaseBody(fn, default_, x, done)
+ } else {
+ emitJump(fn, done)
+ }
+ fn.currentBlock = done
+}
+
+func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
+ if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
+ // In a switch y := x.(type), each case clause
+ // implicitly declares a distinct object y.
+ // In a single-type case, y has that type.
+ // In multi-type cases, 'case nil' and default,
+ // y has the same type as the interface operand.
+ emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
+ }
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ b.stmtList(fn, cc.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+}
+
+// selectStmt emits to fn code for the select statement s, optionally
+// labelled by label.
+//
+func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
+ // A blocking select of a single case degenerates to a
+ // simple send or receive.
+ // TODO(adonovan): opt: is this optimization worth its weight?
+ if len(s.Body.List) == 1 {
+ clause := s.Body.List[0].(*ast.CommClause)
+ if clause.Comm != nil {
+ b.stmt(fn, clause.Comm)
+ done := fn.newBasicBlock("select.done")
+ if label != nil {
+ label._break = done
+ }
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ b.stmtList(fn, clause.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+ fn.currentBlock = done
+ return
+ }
+ }
+
+ // First evaluate all channels in all cases, and find
+ // the directions of each state.
+ var states []*SelectState
+ blocking := true
+ debugInfo := fn.debugInfo()
+ for _, clause := range s.Body.List {
+ var st *SelectState
+ switch comm := clause.(*ast.CommClause).Comm.(type) {
+ case nil: // default case
+ blocking = false
+ continue
+
+ case *ast.SendStmt: // ch<- i
+ ch := b.expr(fn, comm.Chan)
+ st = &SelectState{
+ Dir: types.SendOnly,
+ Chan: ch,
+ Send: emitConv(fn, b.expr(fn, comm.Value),
+ ch.Type().Underlying().(*types.Chan).Elem()),
+ Pos: comm.Arrow,
+ }
+ if debugInfo {
+ st.DebugNode = comm
+ }
+
+ case *ast.AssignStmt: // x := <-ch
+ recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
+ st = &SelectState{
+ Dir: types.RecvOnly,
+ Chan: b.expr(fn, recv.X),
+ Pos: recv.OpPos,
+ }
+ if debugInfo {
+ st.DebugNode = recv
+ }
+
+ case *ast.ExprStmt: // <-ch
+ recv := unparen(comm.X).(*ast.UnaryExpr)
+ st = &SelectState{
+ Dir: types.RecvOnly,
+ Chan: b.expr(fn, recv.X),
+ Pos: recv.OpPos,
+ }
+ if debugInfo {
+ st.DebugNode = recv
+ }
+ }
+ states = append(states, st)
+ }
+
+ // We dispatch on the (fair) result of Select using a
+ // sequential if-else chain, in effect:
+ //
+ // idx, recvOk, r0...r_n-1 := select(...)
+ // if idx == 0 { // receive on channel 0 (first receive => r0)
+ // x, ok := r0, recvOk
+ // ...state0...
+ // } else if v == 1 { // send on channel 1
+ // ...state1...
+ // } else {
+ // ...default...
+ // }
+ sel := &Select{
+ States: states,
+ Blocking: blocking,
+ }
+ sel.setPos(s.Select)
+ var vars []*types.Var
+ vars = append(vars, varIndex, varOk)
+ for _, st := range states {
+ if st.Dir == types.RecvOnly {
+ tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
+ vars = append(vars, anonVar(tElem))
+ }
+ }
+ sel.setType(types.NewTuple(vars...))
+
+ fn.emit(sel)
+ idx := emitExtract(fn, sel, 0)
+
+ done := fn.newBasicBlock("select.done")
+ if label != nil {
+ label._break = done
+ }
+
+ var defaultBody *[]ast.Stmt
+ state := 0
+ r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
+ for _, cc := range s.Body.List {
+ clause := cc.(*ast.CommClause)
+ if clause.Comm == nil {
+ defaultBody = &clause.Body
+ continue
+ }
+ body := fn.newBasicBlock("select.body")
+ next := fn.newBasicBlock("select.next")
+ emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
+ fn.currentBlock = body
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ switch comm := clause.Comm.(type) {
+ case *ast.ExprStmt: // <-ch
+ if debugInfo {
+ v := emitExtract(fn, sel, r)
+ emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
+ }
+ r++
+
+ case *ast.AssignStmt: // x := <-states[state].Chan
+ if comm.Tok == token.DEFINE {
+ fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
+ }
+ x := b.addr(fn, comm.Lhs[0], false) // non-escaping
+ v := emitExtract(fn, sel, r)
+ if debugInfo {
+ emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
+ }
+ x.store(fn, v)
+
+ if len(comm.Lhs) == 2 { // x, ok := ...
+ if comm.Tok == token.DEFINE {
+ fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
+ }
+ ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
+ ok.store(fn, emitExtract(fn, sel, 1))
+ }
+ r++
+ }
+ b.stmtList(fn, clause.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+ fn.currentBlock = next
+ state++
+ }
+ if defaultBody != nil {
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ b.stmtList(fn, *defaultBody)
+ fn.targets = fn.targets.tail
+ } else {
+ // A blocking select must match some case.
+ // (This should really be a runtime.errorString, not a string.)
+ fn.emit(&Panic{
+ X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
+ })
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+ }
+ emitJump(fn, done)
+ fn.currentBlock = done
+}
+
+// forStmt emits to fn code for the for statement s, optionally
+// labelled by label.
+//
+func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
+ // ...init...
+ // jump loop
+ // loop:
+ // if cond goto body else done
+ // body:
+ // ...body...
+ // jump post
+ // post: (target of continue)
+ // ...post...
+ // jump loop
+ // done: (target of break)
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+ body := fn.newBasicBlock("for.body")
+ done := fn.newBasicBlock("for.done") // target of 'break'
+ loop := body // target of back-edge
+ if s.Cond != nil {
+ loop = fn.newBasicBlock("for.loop")
+ }
+ cont := loop // target of 'continue'
+ if s.Post != nil {
+ cont = fn.newBasicBlock("for.post")
+ }
+ if label != nil {
+ label._break = done
+ label._continue = cont
+ }
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+ if loop != body {
+ b.cond(fn, s.Cond, body, done)
+ fn.currentBlock = body
+ }
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _continue: cont,
+ }
+ b.stmt(fn, s.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, cont)
+
+ if s.Post != nil {
+ fn.currentBlock = cont
+ b.stmt(fn, s.Post)
+ emitJump(fn, loop) // back-edge
+ }
+ fn.currentBlock = done
+}
+
+// rangeIndexed emits to fn the header for an integer-indexed loop
+// over array, *array or slice value x.
+// The v result is defined only if tv is non-nil.
+// forPos is the position of the "for" token.
+//
+func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
+ //
+ // length = len(x)
+ // index = -1
+ // loop: (target of continue)
+ // index++
+ // if index < length goto body else done
+ // body:
+ // k = index
+ // v = x[index]
+ // ...body...
+ // jump loop
+ // done: (target of break)
+
+ // Determine number of iterations.
+ var length Value
+ if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
+ // For array or *array, the number of iterations is
+ // known statically thanks to the type. We avoid a
+ // data dependence upon x, permitting later dead-code
+ // elimination if x is pure, static unrolling, etc.
+ // Ranging over a nil *array may have >0 iterations.
+ // We still generate code for x, in case it has effects.
+ length = intConst(arr.Len())
+ } else {
+ // length = len(x).
+ var c Call
+ c.Call.Value = makeLen(x.Type())
+ c.Call.Args = []Value{x}
+ c.setType(tInt)
+ length = fn.emit(&c)
+ }
+
+ index := fn.addLocal(tInt, token.NoPos)
+ emitStore(fn, index, intConst(-1), pos)
+
+ loop = fn.newBasicBlock("rangeindex.loop")
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+
+ incr := &BinOp{
+ Op: token.ADD,
+ X: emitLoad(fn, index),
+ Y: vOne,
+ }
+ incr.setType(tInt)
+ emitStore(fn, index, fn.emit(incr), pos)
+
+ body := fn.newBasicBlock("rangeindex.body")
+ done = fn.newBasicBlock("rangeindex.done")
+ emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
+ fn.currentBlock = body
+
+ k = emitLoad(fn, index)
+ if tv != nil {
+ switch t := x.Type().Underlying().(type) {
+ case *types.Array:
+ instr := &Index{
+ X: x,
+ Index: k,
+ }
+ instr.setType(t.Elem())
+ v = fn.emit(instr)
+
+ case *types.Pointer: // *array
+ instr := &IndexAddr{
+ X: x,
+ Index: k,
+ }
+ instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
+ v = emitLoad(fn, fn.emit(instr))
+
+ case *types.Slice:
+ instr := &IndexAddr{
+ X: x,
+ Index: k,
+ }
+ instr.setType(types.NewPointer(t.Elem()))
+ v = emitLoad(fn, fn.emit(instr))
+
+ default:
+ panic("rangeIndexed x:" + t.String())
+ }
+ }
+ return
+}
+
+// rangeIter emits to fn the header for a loop using
+// Range/Next/Extract to iterate over map or string value x.
+// tk and tv are the types of the key/value results k and v, or nil
+// if the respective component is not wanted.
+//
+func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
+ //
+ // it = range x
+ // loop: (target of continue)
+ // okv = next it (ok, key, value)
+ // ok = extract okv #0
+ // if ok goto body else done
+ // body:
+ // k = extract okv #1
+ // v = extract okv #2
+ // ...body...
+ // jump loop
+ // done: (target of break)
+ //
+
+ if tk == nil {
+ tk = tInvalid
+ }
+ if tv == nil {
+ tv = tInvalid
+ }
+
+ rng := &Range{X: x}
+ rng.setPos(pos)
+ rng.setType(tRangeIter)
+ it := fn.emit(rng)
+
+ loop = fn.newBasicBlock("rangeiter.loop")
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+
+ _, isString := x.Type().Underlying().(*types.Basic)
+
+ okv := &Next{
+ Iter: it,
+ IsString: isString,
+ }
+ okv.setType(types.NewTuple(
+ varOk,
+ newVar("k", tk),
+ newVar("v", tv),
+ ))
+ fn.emit(okv)
+
+ body := fn.newBasicBlock("rangeiter.body")
+ done = fn.newBasicBlock("rangeiter.done")
+ emitIf(fn, emitExtract(fn, okv, 0), body, done)
+ fn.currentBlock = body
+
+ if tk != tInvalid {
+ k = emitExtract(fn, okv, 1)
+ }
+ if tv != tInvalid {
+ v = emitExtract(fn, okv, 2)
+ }
+ return
+}
+
+// rangeChan emits to fn the header for a loop that receives from
+// channel x until it fails.
+// tk is the channel's element type, or nil if the k result is
+// not wanted
+// pos is the position of the '=' or ':=' token.
+//
+func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
+ //
+ // loop: (target of continue)
+ // ko = <-x (key, ok)
+ // ok = extract ko #1
+ // if ok goto body else done
+ // body:
+ // k = extract ko #0
+ // ...
+ // goto loop
+ // done: (target of break)
+
+ loop = fn.newBasicBlock("rangechan.loop")
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+ recv := &UnOp{
+ Op: token.ARROW,
+ X: x,
+ CommaOk: true,
+ }
+ recv.setPos(pos)
+ recv.setType(types.NewTuple(
+ newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
+ varOk,
+ ))
+ ko := fn.emit(recv)
+ body := fn.newBasicBlock("rangechan.body")
+ done = fn.newBasicBlock("rangechan.done")
+ emitIf(fn, emitExtract(fn, ko, 1), body, done)
+ fn.currentBlock = body
+ if tk != nil {
+ k = emitExtract(fn, ko, 0)
+ }
+ return
+}
+
+// rangeStmt emits to fn code for the range statement s, optionally
+// labelled by label.
+//
+func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
+ var tk, tv types.Type
+ if s.Key != nil && !isBlankIdent(s.Key) {
+ tk = fn.Pkg.typeOf(s.Key)
+ }
+ if s.Value != nil && !isBlankIdent(s.Value) {
+ tv = fn.Pkg.typeOf(s.Value)
+ }
+
+ // If iteration variables are defined (:=), this
+ // occurs once outside the loop.
+ //
+ // Unlike a short variable declaration, a RangeStmt
+ // using := never redeclares an existing variable; it
+ // always creates a new one.
+ if s.Tok == token.DEFINE {
+ if tk != nil {
+ fn.addLocalForIdent(s.Key.(*ast.Ident))
+ }
+ if tv != nil {
+ fn.addLocalForIdent(s.Value.(*ast.Ident))
+ }
+ }
+
+ x := b.expr(fn, s.X)
+
+ var k, v Value
+ var loop, done *BasicBlock
+ switch rt := x.Type().Underlying().(type) {
+ case *types.Slice, *types.Array, *types.Pointer: // *array
+ k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
+
+ case *types.Chan:
+ k, loop, done = b.rangeChan(fn, x, tk, s.For)
+
+ case *types.Map, *types.Basic: // string
+ k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
+
+ default:
+ panic("Cannot range over: " + rt.String())
+ }
+
+ // Evaluate both LHS expressions before we update either.
+ var kl, vl lvalue
+ if tk != nil {
+ kl = b.addr(fn, s.Key, false) // non-escaping
+ }
+ if tv != nil {
+ vl = b.addr(fn, s.Value, false) // non-escaping
+ }
+ if tk != nil {
+ kl.store(fn, k)
+ }
+ if tv != nil {
+ vl.store(fn, v)
+ }
+
+ if label != nil {
+ label._break = done
+ label._continue = loop
+ }
+
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _continue: loop,
+ }
+ b.stmt(fn, s.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, loop) // back-edge
+ fn.currentBlock = done
+}
+
+// stmt lowers statement s to SSA form, emitting code to fn.
+func (b *builder) stmt(fn *Function, _s ast.Stmt) {
+ // The label of the current statement. If non-nil, its _goto
+ // target is always set; its _break and _continue are set only
+ // within the body of switch/typeswitch/select/for/range.
+ // It is effectively an additional default-nil parameter of stmt().
+ var label *lblock
+start:
+ switch s := _s.(type) {
+ case *ast.EmptyStmt:
+ // ignore. (Usually removed by gofmt.)
+
+ case *ast.DeclStmt: // Con, Var or Typ
+ d := s.Decl.(*ast.GenDecl)
+ if d.Tok == token.VAR {
+ for _, spec := range d.Specs {
+ if vs, ok := spec.(*ast.ValueSpec); ok {
+ b.localValueSpec(fn, vs)
+ }
+ }
+ }
+
+ case *ast.LabeledStmt:
+ label = fn.labelledBlock(s.Label)
+ emitJump(fn, label._goto)
+ fn.currentBlock = label._goto
+ _s = s.Stmt
+ goto start // effectively: tailcall stmt(fn, s.Stmt, label)
+
+ case *ast.ExprStmt:
+ b.expr(fn, s.X)
+
+ case *ast.SendStmt:
+ fn.emit(&Send{
+ Chan: b.expr(fn, s.Chan),
+ X: emitConv(fn, b.expr(fn, s.Value),
+ fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
+ pos: s.Arrow,
+ })
+
+ case *ast.IncDecStmt:
+ op := token.ADD
+ if s.Tok == token.DEC {
+ op = token.SUB
+ }
+ loc := b.addr(fn, s.X, false)
+ b.assignOp(fn, loc, NewConst(exact.MakeInt64(1), loc.typ()), op, s.Pos())
+
+ case *ast.AssignStmt:
+ switch s.Tok {
+ case token.ASSIGN, token.DEFINE:
+ b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
+
+ default: // +=, etc.
+ op := s.Tok + token.ADD - token.ADD_ASSIGN
+ b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op, s.Pos())
+ }
+
+ case *ast.GoStmt:
+ // The "intrinsics" new/make/len/cap are forbidden here.
+ // panic is treated like an ordinary function call.
+ v := Go{pos: s.Go}
+ b.setCall(fn, s.Call, &v.Call)
+ fn.emit(&v)
+
+ case *ast.DeferStmt:
+ // The "intrinsics" new/make/len/cap are forbidden here.
+ // panic is treated like an ordinary function call.
+ v := Defer{pos: s.Defer}
+ b.setCall(fn, s.Call, &v.Call)
+ fn.emit(&v)
+
+ // A deferred call can cause recovery from panic,
+ // and control resumes at the Recover block.
+ createRecoverBlock(fn)
+
+ case *ast.ReturnStmt:
+ var results []Value
+ if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
+ // Return of one expression in a multi-valued function.
+ tuple := b.exprN(fn, s.Results[0])
+ ttuple := tuple.Type().(*types.Tuple)
+ for i, n := 0, ttuple.Len(); i < n; i++ {
+ results = append(results,
+ emitConv(fn, emitExtract(fn, tuple, i),
+ fn.Signature.Results().At(i).Type()))
+ }
+ } else {
+ // 1:1 return, or no-arg return in non-void function.
+ for i, r := range s.Results {
+ v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
+ results = append(results, v)
+ }
+ }
+ if fn.namedResults != nil {
+ // Function has named result parameters (NRPs).
+ // Perform parallel assignment of return operands to NRPs.
+ for i, r := range results {
+ emitStore(fn, fn.namedResults[i], r, s.Return)
+ }
+ }
+ // Run function calls deferred in this
+ // function when explicitly returning from it.
+ fn.emit(new(RunDefers))
+ if fn.namedResults != nil {
+ // Reload NRPs to form the result tuple.
+ results = results[:0]
+ for _, r := range fn.namedResults {
+ results = append(results, emitLoad(fn, r))
+ }
+ }
+ fn.emit(&Return{Results: results, pos: s.Return})
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+
+ case *ast.BranchStmt:
+ var block *BasicBlock
+ switch s.Tok {
+ case token.BREAK:
+ if s.Label != nil {
+ block = fn.labelledBlock(s.Label)._break
+ } else {
+ for t := fn.targets; t != nil && block == nil; t = t.tail {
+ block = t._break
+ }
+ }
+
+ case token.CONTINUE:
+ if s.Label != nil {
+ block = fn.labelledBlock(s.Label)._continue
+ } else {
+ for t := fn.targets; t != nil && block == nil; t = t.tail {
+ block = t._continue
+ }
+ }
+
+ case token.FALLTHROUGH:
+ for t := fn.targets; t != nil && block == nil; t = t.tail {
+ block = t._fallthrough
+ }
+
+ case token.GOTO:
+ block = fn.labelledBlock(s.Label)._goto
+ }
+ emitJump(fn, block)
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+
+ case *ast.BlockStmt:
+ b.stmtList(fn, s.List)
+
+ case *ast.IfStmt:
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+ then := fn.newBasicBlock("if.then")
+ done := fn.newBasicBlock("if.done")
+ els := done
+ if s.Else != nil {
+ els = fn.newBasicBlock("if.else")
+ }
+ b.cond(fn, s.Cond, then, els)
+ fn.currentBlock = then
+ b.stmt(fn, s.Body)
+ emitJump(fn, done)
+
+ if s.Else != nil {
+ fn.currentBlock = els
+ b.stmt(fn, s.Else)
+ emitJump(fn, done)
+ }
+
+ fn.currentBlock = done
+
+ case *ast.SwitchStmt:
+ b.switchStmt(fn, s, label)
+
+ case *ast.TypeSwitchStmt:
+ b.typeSwitchStmt(fn, s, label)
+
+ case *ast.SelectStmt:
+ b.selectStmt(fn, s, label)
+
+ case *ast.ForStmt:
+ b.forStmt(fn, s, label)
+
+ case *ast.RangeStmt:
+ b.rangeStmt(fn, s, label)
+
+ default:
+ panic(fmt.Sprintf("unexpected statement kind: %T", s))
+ }
+}
+
+// buildFunction builds SSA code for the body of function fn. Idempotent.
+func (b *builder) buildFunction(fn *Function) {
+ if fn.Blocks != nil {
+ return // building already started
+ }
+
+ var recvField *ast.FieldList
+ var body *ast.BlockStmt
+ var functype *ast.FuncType
+ switch n := fn.syntax.(type) {
+ case nil:
+ return // not a Go source function. (Synthetic, or from object file.)
+ case *ast.FuncDecl:
+ functype = n.Type
+ recvField = n.Recv
+ body = n.Body
+ case *ast.FuncLit:
+ functype = n.Type
+ body = n.Body
+ default:
+ panic(n)
+ }
+
+ if body == nil {
+ // External function.
+ if fn.Params == nil {
+ // This condition ensures we add a non-empty
+ // params list once only, but we may attempt
+ // the degenerate empty case repeatedly.
+ // TODO(adonovan): opt: don't do that.
+
+ // We set Function.Params even though there is no body
+ // code to reference them. This simplifies clients.
+ if recv := fn.Signature.Recv(); recv != nil {
+ fn.addParamObj(recv)
+ }
+ params := fn.Signature.Params()
+ for i, n := 0, params.Len(); i < n; i++ {
+ fn.addParamObj(params.At(i))
+ }
+ }
+ return
+ }
+ if fn.Prog.mode&LogSource != 0 {
+ defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
+ }
+ fn.startBody()
+ fn.createSyntacticParams(recvField, functype)
+ b.stmt(fn, body)
+ if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
+ // Control fell off the end of the function's body block.
+ //
+ // Block optimizations eliminate the current block, if
+ // unreachable. It is a builder invariant that
+ // if this no-arg return is ill-typed for
+ // fn.Signature.Results, this block must be
+ // unreachable. The sanity checker checks this.
+ fn.emit(new(RunDefers))
+ fn.emit(new(Return))
+ }
+ fn.finishBody()
+}
+
+// buildFuncDecl builds SSA code for the function or method declared
+// by decl in package pkg.
+//
+func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
+ id := decl.Name
+ if isBlankIdent(id) {
+ return // discard
+ }
+ fn := pkg.values[pkg.info.Defs[id]].(*Function)
+ if decl.Recv == nil && id.Name == "init" {
+ var v Call
+ v.Call.Value = fn
+ v.setType(types.NewTuple())
+ pkg.init.emit(&v)
+ }
+ b.buildFunction(fn)
+}
+
+// Build calls Package.Build for each package in prog.
+// Building occurs in parallel unless the BuildSerially mode flag was set.
+//
+// Build is intended for whole-program analysis; a typical compiler
+// need only build a single package.
+//
+// Build is idempotent and thread-safe.
+//
+func (prog *Program) Build() {
+ var wg sync.WaitGroup
+ for _, p := range prog.packages {
+ if prog.mode&BuildSerially != 0 {
+ p.Build()
+ } else {
+ wg.Add(1)
+ go func(p *Package) {
+ p.Build()
+ wg.Done()
+ }(p)
+ }
+ }
+ wg.Wait()
+}
+
+// Build builds SSA code for all functions and vars in package p.
+//
+// Precondition: CreatePackage must have been called for all of p's
+// direct imports (and hence its direct imports must have been
+// error-free).
+//
+// Build is idempotent and thread-safe.
+//
+func (p *Package) Build() { p.buildOnce.Do(p.build) }
+
+func (p *Package) build() {
+ if p.info == nil {
+ return // synthetic package, e.g. "testmain"
+ }
+
+ // Ensure we have runtime type info for all exported members.
+ // TODO(adonovan): ideally belongs in memberFromObject, but
+ // that would require package creation in topological order.
+ for name, mem := range p.Members {
+ if ast.IsExported(name) {
+ p.Prog.needMethodsOf(mem.Type())
+ }
+ }
+ if p.Prog.mode&LogSource != 0 {
+ defer logStack("build %s", p)()
+ }
+ init := p.init
+ init.startBody()
+
+ var done *BasicBlock
+
+ if p.Prog.mode&BareInits == 0 {
+ // Make init() skip if package is already initialized.
+ initguard := p.Var("init$guard")
+ doinit := init.newBasicBlock("init.start")
+ done = init.newBasicBlock("init.done")
+ emitIf(init, emitLoad(init, initguard), done, doinit)
+ init.currentBlock = doinit
+ emitStore(init, initguard, vTrue, token.NoPos)
+
+ // Call the init() function of each package we import.
+ for _, pkg := range p.Pkg.Imports() {
+ prereq := p.Prog.packages[pkg]
+ if prereq == nil {
+ panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path()))
+ }
+ var v Call
+ v.Call.Value = prereq.init
+ v.Call.pos = init.pos
+ v.setType(types.NewTuple())
+ init.emit(&v)
+ }
+ }
+
+ var b builder
+
+ // Initialize package-level vars in correct order.
+ for _, varinit := range p.info.InitOrder {
+ if init.Prog.mode&LogSource != 0 {
+ fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
+ varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
+ }
+ if len(varinit.Lhs) == 1 {
+ // 1:1 initialization: var x, y = a(), b()
+ var lval lvalue
+ if v := varinit.Lhs[0]; v.Name() != "_" {
+ lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
+ } else {
+ lval = blank{}
+ }
+ b.assign(init, lval, varinit.Rhs, true, nil)
+ } else {
+ // n:1 initialization: var x, y := f()
+ tuple := b.exprN(init, varinit.Rhs)
+ for i, v := range varinit.Lhs {
+ if v.Name() == "_" {
+ continue
+ }
+ emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
+ }
+ }
+ }
+
+ // Build all package-level functions, init functions
+ // and methods, including unreachable/blank ones.
+ // We build them in source order, but it's not significant.
+ for _, file := range p.files {
+ for _, decl := range file.Decls {
+ if decl, ok := decl.(*ast.FuncDecl); ok {
+ b.buildFuncDecl(p, decl)
+ }
+ }
+ }
+
+ // Finish up init().
+ if p.Prog.mode&BareInits == 0 {
+ emitJump(init, done)
+ init.currentBlock = done
+ }
+ init.emit(new(Return))
+ init.finishBody()
+
+ p.info = nil // We no longer need ASTs or go/types deductions.
+
+ if p.Prog.mode&SanityCheckFunctions != 0 {
+ sanityCheckPackage(p)
+ }
+}
+
+// Like ObjectOf, but panics instead of returning nil.
+// Only valid during p's create and build phases.
+func (p *Package) objectOf(id *ast.Ident) types.Object {
+ if o := p.info.ObjectOf(id); o != nil {
+ return o
+ }
+ panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
+ id.Name, p.Prog.Fset.Position(id.Pos())))
+}
+
+// Like TypeOf, but panics instead of returning nil.
+// Only valid during p's create and build phases.
+func (p *Package) typeOf(e ast.Expr) types.Type {
+ if T := p.info.TypeOf(e); T != nil {
+ return T
+ }
+ panic(fmt.Sprintf("no type for %T @ %s",
+ e, p.Prog.Fset.Position(e.Pos())))
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/const.go b/vendor/github.com/golangci/go-tools/ssa/const.go
new file mode 100644
index 00000000000..140e778c56b
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/const.go
@@ -0,0 +1,169 @@
+// 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 ssa
+
+// This file defines the Const SSA value type.
+
+import (
+ "fmt"
+ exact "go/constant"
+ "go/token"
+ "go/types"
+ "strconv"
+)
+
+// NewConst returns a new constant of the specified value and type.
+// val must be valid according to the specification of Const.Value.
+//
+func NewConst(val exact.Value, typ types.Type) *Const {
+ return &Const{typ, val}
+}
+
+// intConst returns an 'int' constant that evaluates to i.
+// (i is an int64 in case the host is narrower than the target.)
+func intConst(i int64) *Const {
+ return NewConst(exact.MakeInt64(i), tInt)
+}
+
+// nilConst returns a nil constant of the specified type, which may
+// be any reference type, including interfaces.
+//
+func nilConst(typ types.Type) *Const {
+ return NewConst(nil, typ)
+}
+
+// stringConst returns a 'string' constant that evaluates to s.
+func stringConst(s string) *Const {
+ return NewConst(exact.MakeString(s), tString)
+}
+
+// zeroConst returns a new "zero" constant of the specified type,
+// which must not be an array or struct type: the zero values of
+// aggregates are well-defined but cannot be represented by Const.
+//
+func zeroConst(t types.Type) *Const {
+ switch t := t.(type) {
+ case *types.Basic:
+ switch {
+ case t.Info()&types.IsBoolean != 0:
+ return NewConst(exact.MakeBool(false), t)
+ case t.Info()&types.IsNumeric != 0:
+ return NewConst(exact.MakeInt64(0), t)
+ case t.Info()&types.IsString != 0:
+ return NewConst(exact.MakeString(""), t)
+ case t.Kind() == types.UnsafePointer:
+ fallthrough
+ case t.Kind() == types.UntypedNil:
+ return nilConst(t)
+ default:
+ panic(fmt.Sprint("zeroConst for unexpected type:", t))
+ }
+ case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
+ return nilConst(t)
+ case *types.Named:
+ return NewConst(zeroConst(t.Underlying()).Value, t)
+ case *types.Array, *types.Struct, *types.Tuple:
+ panic(fmt.Sprint("zeroConst applied to aggregate:", t))
+ }
+ panic(fmt.Sprint("zeroConst: unexpected ", t))
+}
+
+func (c *Const) RelString(from *types.Package) string {
+ var s string
+ if c.Value == nil {
+ s = "nil"
+ } else if c.Value.Kind() == exact.String {
+ s = exact.StringVal(c.Value)
+ const max = 20
+ // TODO(adonovan): don't cut a rune in half.
+ if len(s) > max {
+ s = s[:max-3] + "..." // abbreviate
+ }
+ s = strconv.Quote(s)
+ } else {
+ s = c.Value.String()
+ }
+ return s + ":" + relType(c.Type(), from)
+}
+
+func (c *Const) Name() string {
+ return c.RelString(nil)
+}
+
+func (c *Const) String() string {
+ return c.Name()
+}
+
+func (c *Const) Type() types.Type {
+ return c.typ
+}
+
+func (c *Const) Referrers() *[]Instruction {
+ return nil
+}
+
+func (c *Const) Parent() *Function { return nil }
+
+func (c *Const) Pos() token.Pos {
+ return token.NoPos
+}
+
+// IsNil returns true if this constant represents a typed or untyped nil value.
+func (c *Const) IsNil() bool {
+ return c.Value == nil
+}
+
+// TODO(adonovan): move everything below into github.com/golangci/go-tools/ssa/interp.
+
+// Int64 returns the numeric value of this constant truncated to fit
+// a signed 64-bit integer.
+//
+func (c *Const) Int64() int64 {
+ switch x := exact.ToInt(c.Value); x.Kind() {
+ case exact.Int:
+ if i, ok := exact.Int64Val(x); ok {
+ return i
+ }
+ return 0
+ case exact.Float:
+ f, _ := exact.Float64Val(x)
+ return int64(f)
+ }
+ panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
+}
+
+// Uint64 returns the numeric value of this constant truncated to fit
+// an unsigned 64-bit integer.
+//
+func (c *Const) Uint64() uint64 {
+ switch x := exact.ToInt(c.Value); x.Kind() {
+ case exact.Int:
+ if u, ok := exact.Uint64Val(x); ok {
+ return u
+ }
+ return 0
+ case exact.Float:
+ f, _ := exact.Float64Val(x)
+ return uint64(f)
+ }
+ panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
+}
+
+// Float64 returns the numeric value of this constant truncated to fit
+// a float64.
+//
+func (c *Const) Float64() float64 {
+ f, _ := exact.Float64Val(c.Value)
+ return f
+}
+
+// Complex128 returns the complex value of this constant truncated to
+// fit a complex128.
+//
+func (c *Const) Complex128() complex128 {
+ re, _ := exact.Float64Val(exact.Real(c.Value))
+ im, _ := exact.Float64Val(exact.Imag(c.Value))
+ return complex(re, im)
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/create.go b/vendor/github.com/golangci/go-tools/ssa/create.go
new file mode 100644
index 00000000000..69ac12b1bf1
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/create.go
@@ -0,0 +1,263 @@
+// 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 ssa
+
+// This file implements the CREATE phase of SSA construction.
+// See builder.go for explanation.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "os"
+ "sync"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+// NewProgram returns a new SSA Program.
+//
+// mode controls diagnostics and checking during SSA construction.
+//
+func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
+ prog := &Program{
+ Fset: fset,
+ imported: make(map[string]*Package),
+ packages: make(map[*types.Package]*Package),
+ thunks: make(map[selectionKey]*Function),
+ bounds: make(map[*types.Func]*Function),
+ mode: mode,
+ }
+
+ h := typeutil.MakeHasher() // protected by methodsMu, in effect
+ prog.methodSets.SetHasher(h)
+ prog.canon.SetHasher(h)
+
+ return prog
+}
+
+// memberFromObject populates package pkg with a member for the
+// typechecker object obj.
+//
+// For objects from Go source code, syntax is the associated syntax
+// tree (for funcs and vars only); it will be used during the build
+// phase.
+//
+func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
+ name := obj.Name()
+ switch obj := obj.(type) {
+ case *types.Builtin:
+ if pkg.Pkg != types.Unsafe {
+ panic("unexpected builtin object: " + obj.String())
+ }
+
+ case *types.TypeName:
+ pkg.Members[name] = &Type{
+ object: obj,
+ pkg: pkg,
+ }
+
+ case *types.Const:
+ c := &NamedConst{
+ object: obj,
+ Value: NewConst(obj.Val(), obj.Type()),
+ pkg: pkg,
+ }
+ pkg.values[obj] = c.Value
+ pkg.Members[name] = c
+
+ case *types.Var:
+ g := &Global{
+ Pkg: pkg,
+ name: name,
+ object: obj,
+ typ: types.NewPointer(obj.Type()), // address
+ pos: obj.Pos(),
+ }
+ pkg.values[obj] = g
+ pkg.Members[name] = g
+
+ case *types.Func:
+ sig := obj.Type().(*types.Signature)
+ if sig.Recv() == nil && name == "init" {
+ pkg.ninit++
+ name = fmt.Sprintf("init#%d", pkg.ninit)
+ }
+ fn := &Function{
+ name: name,
+ object: obj,
+ Signature: sig,
+ syntax: syntax,
+ pos: obj.Pos(),
+ Pkg: pkg,
+ Prog: pkg.Prog,
+ }
+ if syntax == nil {
+ fn.Synthetic = "loaded from gc object file"
+ }
+
+ pkg.values[obj] = fn
+ if sig.Recv() == nil {
+ pkg.Members[name] = fn // package-level function
+ }
+
+ default: // (incl. *types.Package)
+ panic("unexpected Object type: " + obj.String())
+ }
+}
+
+// membersFromDecl populates package pkg with members for each
+// typechecker object (var, func, const or type) associated with the
+// specified decl.
+//
+func membersFromDecl(pkg *Package, decl ast.Decl) {
+ switch decl := decl.(type) {
+ case *ast.GenDecl: // import, const, type or var
+ switch decl.Tok {
+ case token.CONST:
+ for _, spec := range decl.Specs {
+ for _, id := range spec.(*ast.ValueSpec).Names {
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], nil)
+ }
+ }
+ }
+
+ case token.VAR:
+ for _, spec := range decl.Specs {
+ for _, id := range spec.(*ast.ValueSpec).Names {
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], spec)
+ }
+ }
+ }
+
+ case token.TYPE:
+ for _, spec := range decl.Specs {
+ id := spec.(*ast.TypeSpec).Name
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], nil)
+ }
+ }
+ }
+
+ case *ast.FuncDecl:
+ id := decl.Name
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], decl)
+ }
+ }
+}
+
+// CreatePackage constructs and returns an SSA Package from the
+// specified type-checked, error-free file ASTs, and populates its
+// Members mapping.
+//
+// importable determines whether this package should be returned by a
+// subsequent call to ImportedPackage(pkg.Path()).
+//
+// The real work of building SSA form for each function is not done
+// until a subsequent call to Package.Build().
+//
+func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package {
+ p := &Package{
+ Prog: prog,
+ Members: make(map[string]Member),
+ values: make(map[types.Object]Value),
+ Pkg: pkg,
+ info: info, // transient (CREATE and BUILD phases)
+ files: files, // transient (CREATE and BUILD phases)
+ }
+
+ // Add init() function.
+ p.init = &Function{
+ name: "init",
+ Signature: new(types.Signature),
+ Synthetic: "package initializer",
+ Pkg: p,
+ Prog: prog,
+ }
+ p.Members[p.init.name] = p.init
+
+ // CREATE phase.
+ // Allocate all package members: vars, funcs, consts and types.
+ if len(files) > 0 {
+ // Go source package.
+ for _, file := range files {
+ for _, decl := range file.Decls {
+ membersFromDecl(p, decl)
+ }
+ }
+ } else {
+ // GC-compiled binary package (or "unsafe")
+ // No code.
+ // No position information.
+ scope := p.Pkg.Scope()
+ for _, name := range scope.Names() {
+ obj := scope.Lookup(name)
+ memberFromObject(p, obj, nil)
+ if obj, ok := obj.(*types.TypeName); ok {
+ if named, ok := obj.Type().(*types.Named); ok {
+ for i, n := 0, named.NumMethods(); i < n; i++ {
+ memberFromObject(p, named.Method(i), nil)
+ }
+ }
+ }
+ }
+ }
+
+ if prog.mode&BareInits == 0 {
+ // Add initializer guard variable.
+ initguard := &Global{
+ Pkg: p,
+ name: "init$guard",
+ typ: types.NewPointer(tBool),
+ }
+ p.Members[initguard.Name()] = initguard
+ }
+
+ if prog.mode&GlobalDebug != 0 {
+ p.SetDebugMode(true)
+ }
+
+ if prog.mode&PrintPackages != 0 {
+ printMu.Lock()
+ p.WriteTo(os.Stdout)
+ printMu.Unlock()
+ }
+
+ if importable {
+ prog.imported[p.Pkg.Path()] = p
+ }
+ prog.packages[p.Pkg] = p
+
+ return p
+}
+
+// printMu serializes printing of Packages/Functions to stdout.
+var printMu sync.Mutex
+
+// AllPackages returns a new slice containing all packages in the
+// program prog in unspecified order.
+//
+func (prog *Program) AllPackages() []*Package {
+ pkgs := make([]*Package, 0, len(prog.packages))
+ for _, pkg := range prog.packages {
+ pkgs = append(pkgs, pkg)
+ }
+ return pkgs
+}
+
+// ImportedPackage returns the importable SSA Package whose import
+// path is path, or nil if no such SSA package has been created.
+//
+// Not all packages are importable. For example, no import
+// declaration can resolve to the x_test package created by 'go test'
+// or the ad-hoc main package created 'go build foo.go'.
+//
+func (prog *Program) ImportedPackage(path string) *Package {
+ return prog.imported[path]
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/doc.go b/vendor/github.com/golangci/go-tools/ssa/doc.go
new file mode 100644
index 00000000000..2406a31a18d
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/doc.go
@@ -0,0 +1,123 @@
+// 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 ssa defines a representation of the elements of Go programs
+// (packages, types, functions, variables and constants) using a
+// static single-assignment (SSA) form intermediate representation
+// (IR) for the bodies of functions.
+//
+// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
+//
+// For an introduction to SSA form, see
+// http://en.wikipedia.org/wiki/Static_single_assignment_form.
+// This page provides a broader reading list:
+// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
+//
+// The level of abstraction of the SSA form is intentionally close to
+// the source language to facilitate construction of source analysis
+// tools. It is not intended for machine code generation.
+//
+// All looping, branching and switching constructs are replaced with
+// unstructured control flow. Higher-level control flow constructs
+// such as multi-way branch can be reconstructed as needed; see
+// ssautil.Switches() for an example.
+//
+// To construct an SSA-form program, call ssautil.CreateProgram on a
+// loader.Program, a set of type-checked packages created from
+// parsed Go source files. The resulting ssa.Program contains all the
+// packages and their members, but SSA code is not created for
+// function bodies until a subsequent call to (*Package).Build.
+//
+// The builder initially builds a naive SSA form in which all local
+// variables are addresses of stack locations with explicit loads and
+// stores. Registerisation of eligible locals and φ-node insertion
+// using dominance and dataflow are then performed as a second pass
+// called "lifting" to improve the accuracy and performance of
+// subsequent analyses; this pass can be skipped by setting the
+// NaiveForm builder flag.
+//
+// The primary interfaces of this package are:
+//
+// - Member: a named member of a Go package.
+// - Value: an expression that yields a value.
+// - Instruction: a statement that consumes values and performs computation.
+// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
+//
+// A computation that yields a result implements both the Value and
+// Instruction interfaces. The following table shows for each
+// concrete type which of these interfaces it implements.
+//
+// Value? Instruction? Member?
+// *Alloc ✔ ✔
+// *BinOp ✔ ✔
+// *Builtin ✔
+// *Call ✔ ✔
+// *ChangeInterface ✔ ✔
+// *ChangeType ✔ ✔
+// *Const ✔
+// *Convert ✔ ✔
+// *DebugRef ✔
+// *Defer ✔
+// *Extract ✔ ✔
+// *Field ✔ ✔
+// *FieldAddr ✔ ✔
+// *FreeVar ✔
+// *Function ✔ ✔ (func)
+// *Global ✔ ✔ (var)
+// *Go ✔
+// *If ✔
+// *Index ✔ ✔
+// *IndexAddr ✔ ✔
+// *Jump ✔
+// *Lookup ✔ ✔
+// *MakeChan ✔ ✔
+// *MakeClosure ✔ ✔
+// *MakeInterface ✔ ✔
+// *MakeMap ✔ ✔
+// *MakeSlice ✔ ✔
+// *MapUpdate ✔
+// *NamedConst ✔ (const)
+// *Next ✔ ✔
+// *Panic ✔
+// *Parameter ✔
+// *Phi ✔ ✔
+// *Range ✔ ✔
+// *Return ✔
+// *RunDefers ✔
+// *Select ✔ ✔
+// *Send ✔
+// *Slice ✔ ✔
+// *Store ✔
+// *Type ✔ (type)
+// *TypeAssert ✔ ✔
+// *UnOp ✔ ✔
+//
+// Other key types in this package include: Program, Package, Function
+// and BasicBlock.
+//
+// The program representation constructed by this package is fully
+// resolved internally, i.e. it does not rely on the names of Values,
+// Packages, Functions, Types or BasicBlocks for the correct
+// interpretation of the program. Only the identities of objects and
+// the topology of the SSA and type graphs are semantically
+// significant. (There is one exception: Ids, used to identify field
+// and method names, contain strings.) Avoidance of name-based
+// operations simplifies the implementation of subsequent passes and
+// can make them very efficient. Many objects are nonetheless named
+// to aid in debugging, but it is not essential that the names be
+// either accurate or unambiguous. The public API exposes a number of
+// name-based maps for client convenience.
+//
+// The ssa/ssautil package provides various utilities that depend only
+// on the public API of this package.
+//
+// TODO(adonovan): Consider the exceptional control-flow implications
+// of defer and recover().
+//
+// TODO(adonovan): write a how-to document for all the various cases
+// of trying to determine corresponding elements across the four
+// domains of source locations, ast.Nodes, types.Objects,
+// ssa.Values/Instructions.
+//
+package ssa // import "github.com/golangci/go-tools/ssa"
diff --git a/vendor/github.com/golangci/go-tools/ssa/dom.go b/vendor/github.com/golangci/go-tools/ssa/dom.go
new file mode 100644
index 00000000000..12ef4308f3c
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/dom.go
@@ -0,0 +1,341 @@
+// 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 ssa
+
+// This file defines algorithms related to dominance.
+
+// Dominator tree construction ----------------------------------------
+//
+// We use the algorithm described in Lengauer & Tarjan. 1979. A fast
+// algorithm for finding dominators in a flowgraph.
+// http://doi.acm.org/10.1145/357062.357071
+//
+// We also apply the optimizations to SLT described in Georgiadis et
+// al, Finding Dominators in Practice, JGAA 2006,
+// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
+// to avoid the need for buckets of size > 1.
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+ "os"
+ "sort"
+)
+
+// Idom returns the block that immediately dominates b:
+// its parent in the dominator tree, if any.
+// Neither the entry node (b.Index==0) nor recover node
+// (b==b.Parent().Recover()) have a parent.
+//
+func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
+
+// Dominees returns the list of blocks that b immediately dominates:
+// its children in the dominator tree.
+//
+func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
+
+// Dominates reports whether b dominates c.
+func (b *BasicBlock) Dominates(c *BasicBlock) bool {
+ return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
+}
+
+type byDomPreorder []*BasicBlock
+
+func (a byDomPreorder) Len() int { return len(a) }
+func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
+
+// DomPreorder returns a new slice containing the blocks of f in
+// dominator tree preorder.
+//
+func (f *Function) DomPreorder() []*BasicBlock {
+ n := len(f.Blocks)
+ order := make(byDomPreorder, n, n)
+ copy(order, f.Blocks)
+ sort.Sort(order)
+ return order
+}
+
+// domInfo contains a BasicBlock's dominance information.
+type domInfo struct {
+ idom *BasicBlock // immediate dominator (parent in domtree)
+ children []*BasicBlock // nodes immediately dominated by this one
+ pre, post int32 // pre- and post-order numbering within domtree
+}
+
+// ltState holds the working state for Lengauer-Tarjan algorithm
+// (during which domInfo.pre is repurposed for CFG DFS preorder number).
+type ltState struct {
+ // Each slice is indexed by b.Index.
+ sdom []*BasicBlock // b's semidominator
+ parent []*BasicBlock // b's parent in DFS traversal of CFG
+ ancestor []*BasicBlock // b's ancestor with least sdom
+}
+
+// dfs implements the depth-first search part of the LT algorithm.
+func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
+ preorder[i] = v
+ v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
+ i++
+ lt.sdom[v.Index] = v
+ lt.link(nil, v)
+ for _, w := range v.Succs {
+ if lt.sdom[w.Index] == nil {
+ lt.parent[w.Index] = v
+ i = lt.dfs(w, i, preorder)
+ }
+ }
+ return i
+}
+
+// eval implements the EVAL part of the LT algorithm.
+func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
+ // TODO(adonovan): opt: do path compression per simple LT.
+ u := v
+ for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
+ if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
+ u = v
+ }
+ }
+ return u
+}
+
+// link implements the LINK part of the LT algorithm.
+func (lt *ltState) link(v, w *BasicBlock) {
+ lt.ancestor[w.Index] = v
+}
+
+// buildDomTree computes the dominator tree of f using the LT algorithm.
+// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
+//
+func buildDomTree(f *Function) {
+ // The step numbers refer to the original LT paper; the
+ // reordering is due to Georgiadis.
+
+ // Clear any previous domInfo.
+ for _, b := range f.Blocks {
+ b.dom = domInfo{}
+ }
+
+ n := len(f.Blocks)
+ // Allocate space for 5 contiguous [n]*BasicBlock arrays:
+ // sdom, parent, ancestor, preorder, buckets.
+ space := make([]*BasicBlock, 5*n, 5*n)
+ lt := ltState{
+ sdom: space[0:n],
+ parent: space[n : 2*n],
+ ancestor: space[2*n : 3*n],
+ }
+
+ // Step 1. Number vertices by depth-first preorder.
+ preorder := space[3*n : 4*n]
+ root := f.Blocks[0]
+ prenum := lt.dfs(root, 0, preorder)
+ recover := f.Recover
+ if recover != nil {
+ lt.dfs(recover, prenum, preorder)
+ }
+
+ buckets := space[4*n : 5*n]
+ copy(buckets, preorder)
+
+ // In reverse preorder...
+ for i := int32(n) - 1; i > 0; i-- {
+ w := preorder[i]
+
+ // Step 3. Implicitly define the immediate dominator of each node.
+ for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
+ u := lt.eval(v)
+ if lt.sdom[u.Index].dom.pre < i {
+ v.dom.idom = u
+ } else {
+ v.dom.idom = w
+ }
+ }
+
+ // Step 2. Compute the semidominators of all nodes.
+ lt.sdom[w.Index] = lt.parent[w.Index]
+ for _, v := range w.Preds {
+ u := lt.eval(v)
+ if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
+ lt.sdom[w.Index] = lt.sdom[u.Index]
+ }
+ }
+
+ lt.link(lt.parent[w.Index], w)
+
+ if lt.parent[w.Index] == lt.sdom[w.Index] {
+ w.dom.idom = lt.parent[w.Index]
+ } else {
+ buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
+ buckets[lt.sdom[w.Index].dom.pre] = w
+ }
+ }
+
+ // The final 'Step 3' is now outside the loop.
+ for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
+ v.dom.idom = root
+ }
+
+ // Step 4. Explicitly define the immediate dominator of each
+ // node, in preorder.
+ for _, w := range preorder[1:] {
+ if w == root || w == recover {
+ w.dom.idom = nil
+ } else {
+ if w.dom.idom != lt.sdom[w.Index] {
+ w.dom.idom = w.dom.idom.dom.idom
+ }
+ // Calculate Children relation as inverse of Idom.
+ w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
+ }
+ }
+
+ pre, post := numberDomTree(root, 0, 0)
+ if recover != nil {
+ numberDomTree(recover, pre, post)
+ }
+
+ // printDomTreeDot(os.Stderr, f) // debugging
+ // printDomTreeText(os.Stderr, root, 0) // debugging
+
+ if f.Prog.mode&SanityCheckFunctions != 0 {
+ sanityCheckDomTree(f)
+ }
+}
+
+// numberDomTree sets the pre- and post-order numbers of a depth-first
+// traversal of the dominator tree rooted at v. These are used to
+// answer dominance queries in constant time.
+//
+func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
+ v.dom.pre = pre
+ pre++
+ for _, child := range v.dom.children {
+ pre, post = numberDomTree(child, pre, post)
+ }
+ v.dom.post = post
+ post++
+ return pre, post
+}
+
+// Testing utilities ----------------------------------------
+
+// sanityCheckDomTree checks the correctness of the dominator tree
+// computed by the LT algorithm by comparing against the dominance
+// relation computed by a naive Kildall-style forward dataflow
+// analysis (Algorithm 10.16 from the "Dragon" book).
+//
+func sanityCheckDomTree(f *Function) {
+ n := len(f.Blocks)
+
+ // D[i] is the set of blocks that dominate f.Blocks[i],
+ // represented as a bit-set of block indices.
+ D := make([]big.Int, n)
+
+ one := big.NewInt(1)
+
+ // all is the set of all blocks; constant.
+ var all big.Int
+ all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
+
+ // Initialization.
+ for i, b := range f.Blocks {
+ if i == 0 || b == f.Recover {
+ // A root is dominated only by itself.
+ D[i].SetBit(&D[0], 0, 1)
+ } else {
+ // All other blocks are (initially) dominated
+ // by every block.
+ D[i].Set(&all)
+ }
+ }
+
+ // Iteration until fixed point.
+ for changed := true; changed; {
+ changed = false
+ for i, b := range f.Blocks {
+ if i == 0 || b == f.Recover {
+ continue
+ }
+ // Compute intersection across predecessors.
+ var x big.Int
+ x.Set(&all)
+ for _, pred := range b.Preds {
+ x.And(&x, &D[pred.Index])
+ }
+ x.SetBit(&x, i, 1) // a block always dominates itself.
+ if D[i].Cmp(&x) != 0 {
+ D[i].Set(&x)
+ changed = true
+ }
+ }
+ }
+
+ // Check the entire relation. O(n^2).
+ // The Recover block (if any) must be treated specially so we skip it.
+ ok := true
+ for i := 0; i < n; i++ {
+ for j := 0; j < n; j++ {
+ b, c := f.Blocks[i], f.Blocks[j]
+ if c == f.Recover {
+ continue
+ }
+ actual := b.Dominates(c)
+ expected := D[j].Bit(i) == 1
+ if actual != expected {
+ fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
+ ok = false
+ }
+ }
+ }
+
+ preorder := f.DomPreorder()
+ for _, b := range f.Blocks {
+ if got := preorder[b.dom.pre]; got != b {
+ fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
+ ok = false
+ }
+ }
+
+ if !ok {
+ panic("sanityCheckDomTree failed for " + f.String())
+ }
+
+}
+
+// Printing functions ----------------------------------------
+
+// printDomTree prints the dominator tree as text, using indentation.
+func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
+ fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
+ for _, child := range v.dom.children {
+ printDomTreeText(buf, child, indent+1)
+ }
+}
+
+// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
+// (.dot) format.
+func printDomTreeDot(buf *bytes.Buffer, f *Function) {
+ fmt.Fprintln(buf, "//", f)
+ fmt.Fprintln(buf, "digraph domtree {")
+ for i, b := range f.Blocks {
+ v := b.dom
+ fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
+ // TODO(adonovan): improve appearance of edges
+ // belonging to both dominator tree and CFG.
+
+ // Dominator tree edge.
+ if i != 0 {
+ fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
+ }
+ // CFG edges.
+ for _, pred := range b.Preds {
+ fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
+ }
+ }
+ fmt.Fprintln(buf, "}")
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/emit.go b/vendor/github.com/golangci/go-tools/ssa/emit.go
new file mode 100644
index 00000000000..1036988adcb
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/emit.go
@@ -0,0 +1,468 @@
+// 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 ssa
+
+// Helpers for emitting SSA instructions.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// emitNew emits to f a new (heap Alloc) instruction allocating an
+// object of type typ. pos is the optional source location.
+//
+func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
+ v := &Alloc{Heap: true}
+ v.setType(types.NewPointer(typ))
+ v.setPos(pos)
+ f.emit(v)
+ return v
+}
+
+// emitLoad emits to f an instruction to load the address addr into a
+// new temporary, and returns the value so defined.
+//
+func emitLoad(f *Function, addr Value) *UnOp {
+ v := &UnOp{Op: token.MUL, X: addr}
+ v.setType(deref(addr.Type()))
+ f.emit(v)
+ return v
+}
+
+// emitDebugRef emits to f a DebugRef pseudo-instruction associating
+// expression e with value v.
+//
+func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
+ if !f.debugInfo() {
+ return // debugging not enabled
+ }
+ if v == nil || e == nil {
+ panic("nil")
+ }
+ var obj types.Object
+ e = unparen(e)
+ if id, ok := e.(*ast.Ident); ok {
+ if isBlankIdent(id) {
+ return
+ }
+ obj = f.Pkg.objectOf(id)
+ switch obj.(type) {
+ case *types.Nil, *types.Const, *types.Builtin:
+ return
+ }
+ }
+ f.emit(&DebugRef{
+ X: v,
+ Expr: e,
+ IsAddr: isAddr,
+ object: obj,
+ })
+}
+
+// emitArith emits to f code to compute the binary operation op(x, y)
+// where op is an eager shift, logical or arithmetic operation.
+// (Use emitCompare() for comparisons and Builder.logicalBinop() for
+// non-eager operations.)
+//
+func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
+ switch op {
+ case token.SHL, token.SHR:
+ x = emitConv(f, x, t)
+ // y may be signed or an 'untyped' constant.
+ // TODO(adonovan): whence signed values?
+ if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
+ y = emitConv(f, y, types.Typ[types.Uint64])
+ }
+
+ case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
+ x = emitConv(f, x, t)
+ y = emitConv(f, y, t)
+
+ default:
+ panic("illegal op in emitArith: " + op.String())
+
+ }
+ v := &BinOp{
+ Op: op,
+ X: x,
+ Y: y,
+ }
+ v.setPos(pos)
+ v.setType(t)
+ return f.emit(v)
+}
+
+// emitCompare emits to f code compute the boolean result of
+// comparison comparison 'x op y'.
+//
+func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
+ xt := x.Type().Underlying()
+ yt := y.Type().Underlying()
+
+ // Special case to optimise a tagless SwitchStmt so that
+ // these are equivalent
+ // switch { case e: ...}
+ // switch true { case e: ... }
+ // if e==true { ... }
+ // even in the case when e's type is an interface.
+ // TODO(adonovan): opt: generalise to x==true, false!=y, etc.
+ if x == vTrue && op == token.EQL {
+ if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
+ return y
+ }
+ }
+
+ if types.Identical(xt, yt) {
+ // no conversion necessary
+ } else if _, ok := xt.(*types.Interface); ok {
+ y = emitConv(f, y, x.Type())
+ } else if _, ok := yt.(*types.Interface); ok {
+ x = emitConv(f, x, y.Type())
+ } else if _, ok := x.(*Const); ok {
+ x = emitConv(f, x, y.Type())
+ } else if _, ok := y.(*Const); ok {
+ y = emitConv(f, y, x.Type())
+ } else {
+ // other cases, e.g. channels. No-op.
+ }
+
+ v := &BinOp{
+ Op: op,
+ X: x,
+ Y: y,
+ }
+ v.setPos(pos)
+ v.setType(tBool)
+ return f.emit(v)
+}
+
+// isValuePreserving returns true if a conversion from ut_src to
+// ut_dst is value-preserving, i.e. just a change of type.
+// Precondition: neither argument is a named type.
+//
+func isValuePreserving(ut_src, ut_dst types.Type) bool {
+ // Identical underlying types?
+ if structTypesIdentical(ut_dst, ut_src) {
+ return true
+ }
+
+ switch ut_dst.(type) {
+ case *types.Chan:
+ // Conversion between channel types?
+ _, ok := ut_src.(*types.Chan)
+ return ok
+
+ case *types.Pointer:
+ // Conversion between pointers with identical base types?
+ _, ok := ut_src.(*types.Pointer)
+ return ok
+ }
+ return false
+}
+
+// emitConv emits to f code to convert Value val to exactly type typ,
+// and returns the converted value. Implicit conversions are required
+// by language assignability rules in assignments, parameter passing,
+// etc. Conversions cannot fail dynamically.
+//
+func emitConv(f *Function, val Value, typ types.Type) Value {
+ t_src := val.Type()
+
+ // Identical types? Conversion is a no-op.
+ if types.Identical(t_src, typ) {
+ return val
+ }
+
+ ut_dst := typ.Underlying()
+ ut_src := t_src.Underlying()
+
+ // Just a change of type, but not value or representation?
+ if isValuePreserving(ut_src, ut_dst) {
+ c := &ChangeType{X: val}
+ c.setType(typ)
+ return f.emit(c)
+ }
+
+ // Conversion to, or construction of a value of, an interface type?
+ if _, ok := ut_dst.(*types.Interface); ok {
+ // Assignment from one interface type to another?
+ if _, ok := ut_src.(*types.Interface); ok {
+ c := &ChangeInterface{X: val}
+ c.setType(typ)
+ return f.emit(c)
+ }
+
+ // Untyped nil constant? Return interface-typed nil constant.
+ if ut_src == tUntypedNil {
+ return nilConst(typ)
+ }
+
+ // Convert (non-nil) "untyped" literals to their default type.
+ if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
+ val = emitConv(f, val, DefaultType(ut_src))
+ }
+
+ f.Pkg.Prog.needMethodsOf(val.Type())
+ mi := &MakeInterface{X: val}
+ mi.setType(typ)
+ return f.emit(mi)
+ }
+
+ // Conversion of a compile-time constant value?
+ if c, ok := val.(*Const); ok {
+ if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
+ // Conversion of a compile-time constant to
+ // another constant type results in a new
+ // constant of the destination type and
+ // (initially) the same abstract value.
+ // We don't truncate the value yet.
+ return NewConst(c.Value, typ)
+ }
+
+ // We're converting from constant to non-constant type,
+ // e.g. string -> []byte/[]rune.
+ }
+
+ // A representation-changing conversion?
+ // At least one of {ut_src,ut_dst} must be *Basic.
+ // (The other may be []byte or []rune.)
+ _, ok1 := ut_src.(*types.Basic)
+ _, ok2 := ut_dst.(*types.Basic)
+ if ok1 || ok2 {
+ c := &Convert{X: val}
+ c.setType(typ)
+ return f.emit(c)
+ }
+
+ panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
+}
+
+// emitStore emits to f an instruction to store value val at location
+// addr, applying implicit conversions as required by assignability rules.
+//
+func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
+ s := &Store{
+ Addr: addr,
+ Val: emitConv(f, val, deref(addr.Type())),
+ pos: pos,
+ }
+ f.emit(s)
+ return s
+}
+
+// emitJump emits to f a jump to target, and updates the control-flow graph.
+// Postcondition: f.currentBlock is nil.
+//
+func emitJump(f *Function, target *BasicBlock) {
+ b := f.currentBlock
+ b.emit(new(Jump))
+ addEdge(b, target)
+ f.currentBlock = nil
+}
+
+// emitIf emits to f a conditional jump to tblock or fblock based on
+// cond, and updates the control-flow graph.
+// Postcondition: f.currentBlock is nil.
+//
+func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
+ b := f.currentBlock
+ b.emit(&If{Cond: cond})
+ addEdge(b, tblock)
+ addEdge(b, fblock)
+ f.currentBlock = nil
+}
+
+// emitExtract emits to f an instruction to extract the index'th
+// component of tuple. It returns the extracted value.
+//
+func emitExtract(f *Function, tuple Value, index int) Value {
+ e := &Extract{Tuple: tuple, Index: index}
+ e.setType(tuple.Type().(*types.Tuple).At(index).Type())
+ return f.emit(e)
+}
+
+// emitTypeAssert emits to f a type assertion value := x.(t) and
+// returns the value. x.Type() must be an interface.
+//
+func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
+ a := &TypeAssert{X: x, AssertedType: t}
+ a.setPos(pos)
+ a.setType(t)
+ return f.emit(a)
+}
+
+// emitTypeTest emits to f a type test value,ok := x.(t) and returns
+// a (value, ok) tuple. x.Type() must be an interface.
+//
+func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
+ a := &TypeAssert{
+ X: x,
+ AssertedType: t,
+ CommaOk: true,
+ }
+ a.setPos(pos)
+ a.setType(types.NewTuple(
+ newVar("value", t),
+ varOk,
+ ))
+ return f.emit(a)
+}
+
+// emitTailCall emits to f a function call in tail position. The
+// caller is responsible for all fields of 'call' except its type.
+// Intended for wrapper methods.
+// Precondition: f does/will not use deferred procedure calls.
+// Postcondition: f.currentBlock is nil.
+//
+func emitTailCall(f *Function, call *Call) {
+ tresults := f.Signature.Results()
+ nr := tresults.Len()
+ if nr == 1 {
+ call.typ = tresults.At(0).Type()
+ } else {
+ call.typ = tresults
+ }
+ tuple := f.emit(call)
+ var ret Return
+ switch nr {
+ case 0:
+ // no-op
+ case 1:
+ ret.Results = []Value{tuple}
+ default:
+ for i := 0; i < nr; i++ {
+ v := emitExtract(f, tuple, i)
+ // TODO(adonovan): in principle, this is required:
+ // v = emitConv(f, o.Type, f.Signature.Results[i].Type)
+ // but in practice emitTailCall is only used when
+ // the types exactly match.
+ ret.Results = append(ret.Results, v)
+ }
+ }
+ f.emit(&ret)
+ f.currentBlock = nil
+}
+
+// emitImplicitSelections emits to f code to apply the sequence of
+// implicit field selections specified by indices to base value v, and
+// returns the selected value.
+//
+// If v is the address of a struct, the result will be the address of
+// a field; if it is the value of a struct, the result will be the
+// value of a field.
+//
+func emitImplicitSelections(f *Function, v Value, indices []int) Value {
+ for _, index := range indices {
+ fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
+
+ if isPointer(v.Type()) {
+ instr := &FieldAddr{
+ X: v,
+ Field: index,
+ }
+ instr.setType(types.NewPointer(fld.Type()))
+ v = f.emit(instr)
+ // Load the field's value iff indirectly embedded.
+ if isPointer(fld.Type()) {
+ v = emitLoad(f, v)
+ }
+ } else {
+ instr := &Field{
+ X: v,
+ Field: index,
+ }
+ instr.setType(fld.Type())
+ v = f.emit(instr)
+ }
+ }
+ return v
+}
+
+// emitFieldSelection emits to f code to select the index'th field of v.
+//
+// If wantAddr, the input must be a pointer-to-struct and the result
+// will be the field's address; otherwise the result will be the
+// field's value.
+// Ident id is used for position and debug info.
+//
+func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
+ fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
+ if isPointer(v.Type()) {
+ instr := &FieldAddr{
+ X: v,
+ Field: index,
+ }
+ instr.setPos(id.Pos())
+ instr.setType(types.NewPointer(fld.Type()))
+ v = f.emit(instr)
+ // Load the field's value iff we don't want its address.
+ if !wantAddr {
+ v = emitLoad(f, v)
+ }
+ } else {
+ instr := &Field{
+ X: v,
+ Field: index,
+ }
+ instr.setPos(id.Pos())
+ instr.setType(fld.Type())
+ v = f.emit(instr)
+ }
+ emitDebugRef(f, id, v, wantAddr)
+ return v
+}
+
+// zeroValue emits to f code to produce a zero value of type t,
+// and returns it.
+//
+func zeroValue(f *Function, t types.Type) Value {
+ switch t.Underlying().(type) {
+ case *types.Struct, *types.Array:
+ return emitLoad(f, f.addLocal(t, token.NoPos))
+ default:
+ return zeroConst(t)
+ }
+}
+
+// createRecoverBlock emits to f a block of code to return after a
+// recovered panic, and sets f.Recover to it.
+//
+// If f's result parameters are named, the code loads and returns
+// their current values, otherwise it returns the zero values of their
+// type.
+//
+// Idempotent.
+//
+func createRecoverBlock(f *Function) {
+ if f.Recover != nil {
+ return // already created
+ }
+ saved := f.currentBlock
+
+ f.Recover = f.newBasicBlock("recover")
+ f.currentBlock = f.Recover
+
+ var results []Value
+ if f.namedResults != nil {
+ // Reload NRPs to form value tuple.
+ for _, r := range f.namedResults {
+ results = append(results, emitLoad(f, r))
+ }
+ } else {
+ R := f.Signature.Results()
+ for i, n := 0, R.Len(); i < n; i++ {
+ T := R.At(i).Type()
+
+ // Return zero value of each result type.
+ results = append(results, zeroValue(f, T))
+ }
+ }
+ f.emit(&Return{Results: results})
+
+ f.currentBlock = saved
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/func.go b/vendor/github.com/golangci/go-tools/ssa/func.go
new file mode 100644
index 00000000000..8e958c42258
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/func.go
@@ -0,0 +1,703 @@
+// 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 ssa
+
+// This file implements the Function and BasicBlock types.
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "io"
+ "os"
+ "strings"
+)
+
+// addEdge adds a control-flow graph edge from from to to.
+func addEdge(from, to *BasicBlock) {
+ from.Succs = append(from.Succs, to)
+ to.Preds = append(to.Preds, from)
+}
+
+// Parent returns the function that contains block b.
+func (b *BasicBlock) Parent() *Function { return b.parent }
+
+// String returns a human-readable label of this block.
+// It is not guaranteed unique within the function.
+//
+func (b *BasicBlock) String() string {
+ return fmt.Sprintf("%d", b.Index)
+}
+
+// emit appends an instruction to the current basic block.
+// If the instruction defines a Value, it is returned.
+//
+func (b *BasicBlock) emit(i Instruction) Value {
+ i.setBlock(b)
+ b.Instrs = append(b.Instrs, i)
+ v, _ := i.(Value)
+ return v
+}
+
+// predIndex returns the i such that b.Preds[i] == c or panics if
+// there is none.
+func (b *BasicBlock) predIndex(c *BasicBlock) int {
+ for i, pred := range b.Preds {
+ if pred == c {
+ return i
+ }
+ }
+ panic(fmt.Sprintf("no edge %s -> %s", c, b))
+}
+
+// hasPhi returns true if b.Instrs contains φ-nodes.
+func (b *BasicBlock) hasPhi() bool {
+ _, ok := b.Instrs[0].(*Phi)
+ return ok
+}
+
+func (b *BasicBlock) Phis() []Instruction {
+ return b.phis()
+}
+
+// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
+func (b *BasicBlock) phis() []Instruction {
+ for i, instr := range b.Instrs {
+ if _, ok := instr.(*Phi); !ok {
+ return b.Instrs[:i]
+ }
+ }
+ return nil // unreachable in well-formed blocks
+}
+
+// replacePred replaces all occurrences of p in b's predecessor list with q.
+// Ordinarily there should be at most one.
+//
+func (b *BasicBlock) replacePred(p, q *BasicBlock) {
+ for i, pred := range b.Preds {
+ if pred == p {
+ b.Preds[i] = q
+ }
+ }
+}
+
+// replaceSucc replaces all occurrences of p in b's successor list with q.
+// Ordinarily there should be at most one.
+//
+func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
+ for i, succ := range b.Succs {
+ if succ == p {
+ b.Succs[i] = q
+ }
+ }
+}
+
+func (b *BasicBlock) RemovePred(p *BasicBlock) {
+ b.removePred(p)
+}
+
+// removePred removes all occurrences of p in b's
+// predecessor list and φ-nodes.
+// Ordinarily there should be at most one.
+//
+func (b *BasicBlock) removePred(p *BasicBlock) {
+ phis := b.phis()
+
+ // We must preserve edge order for φ-nodes.
+ j := 0
+ for i, pred := range b.Preds {
+ if pred != p {
+ b.Preds[j] = b.Preds[i]
+ // Strike out φ-edge too.
+ for _, instr := range phis {
+ phi := instr.(*Phi)
+ phi.Edges[j] = phi.Edges[i]
+ }
+ j++
+ }
+ }
+ // Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
+ for i := j; i < len(b.Preds); i++ {
+ b.Preds[i] = nil
+ for _, instr := range phis {
+ instr.(*Phi).Edges[i] = nil
+ }
+ }
+ b.Preds = b.Preds[:j]
+ for _, instr := range phis {
+ phi := instr.(*Phi)
+ phi.Edges = phi.Edges[:j]
+ }
+}
+
+// Destinations associated with unlabelled for/switch/select stmts.
+// We push/pop one of these as we enter/leave each construct and for
+// each BranchStmt we scan for the innermost target of the right type.
+//
+type targets struct {
+ tail *targets // rest of stack
+ _break *BasicBlock
+ _continue *BasicBlock
+ _fallthrough *BasicBlock
+}
+
+// Destinations associated with a labelled block.
+// We populate these as labels are encountered in forward gotos or
+// labelled statements.
+//
+type lblock struct {
+ _goto *BasicBlock
+ _break *BasicBlock
+ _continue *BasicBlock
+}
+
+// labelledBlock returns the branch target associated with the
+// specified label, creating it if needed.
+//
+func (f *Function) labelledBlock(label *ast.Ident) *lblock {
+ lb := f.lblocks[label.Obj]
+ if lb == nil {
+ lb = &lblock{_goto: f.newBasicBlock(label.Name)}
+ if f.lblocks == nil {
+ f.lblocks = make(map[*ast.Object]*lblock)
+ }
+ f.lblocks[label.Obj] = lb
+ }
+ return lb
+}
+
+// addParam adds a (non-escaping) parameter to f.Params of the
+// specified name, type and source position.
+//
+func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
+ v := &Parameter{
+ name: name,
+ typ: typ,
+ pos: pos,
+ parent: f,
+ }
+ f.Params = append(f.Params, v)
+ return v
+}
+
+func (f *Function) addParamObj(obj types.Object) *Parameter {
+ name := obj.Name()
+ if name == "" {
+ name = fmt.Sprintf("arg%d", len(f.Params))
+ }
+ param := f.addParam(name, obj.Type(), obj.Pos())
+ param.object = obj
+ return param
+}
+
+// addSpilledParam declares a parameter that is pre-spilled to the
+// stack; the function body will load/store the spilled location.
+// Subsequent lifting will eliminate spills where possible.
+//
+func (f *Function) addSpilledParam(obj types.Object) {
+ param := f.addParamObj(obj)
+ spill := &Alloc{Comment: obj.Name()}
+ spill.setType(types.NewPointer(obj.Type()))
+ spill.setPos(obj.Pos())
+ f.objects[obj] = spill
+ f.Locals = append(f.Locals, spill)
+ f.emit(spill)
+ f.emit(&Store{Addr: spill, Val: param})
+}
+
+// startBody initializes the function prior to generating SSA code for its body.
+// Precondition: f.Type() already set.
+//
+func (f *Function) startBody() {
+ f.currentBlock = f.newBasicBlock("entry")
+ f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
+}
+
+// createSyntacticParams populates f.Params and generates code (spills
+// and named result locals) for all the parameters declared in the
+// syntax. In addition it populates the f.objects mapping.
+//
+// Preconditions:
+// f.startBody() was called.
+// Postcondition:
+// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
+//
+func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
+ // Receiver (at most one inner iteration).
+ if recv != nil {
+ for _, field := range recv.List {
+ for _, n := range field.Names {
+ f.addSpilledParam(f.Pkg.info.Defs[n])
+ }
+ // Anonymous receiver? No need to spill.
+ if field.Names == nil {
+ f.addParamObj(f.Signature.Recv())
+ }
+ }
+ }
+
+ // Parameters.
+ if functype.Params != nil {
+ n := len(f.Params) // 1 if has recv, 0 otherwise
+ for _, field := range functype.Params.List {
+ for _, n := range field.Names {
+ f.addSpilledParam(f.Pkg.info.Defs[n])
+ }
+ // Anonymous parameter? No need to spill.
+ if field.Names == nil {
+ f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
+ }
+ }
+ }
+
+ // Named results.
+ if functype.Results != nil {
+ for _, field := range functype.Results.List {
+ // Implicit "var" decl of locals for named results.
+ for _, n := range field.Names {
+ f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
+ }
+ }
+ }
+}
+
+type setNumable interface {
+ setNum(int)
+}
+
+// numberRegisters assigns numbers to all SSA registers
+// (value-defining Instructions) in f, to aid debugging.
+// (Non-Instruction Values are named at construction.)
+//
+func numberRegisters(f *Function) {
+ v := 0
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ switch instr.(type) {
+ case Value:
+ instr.(setNumable).setNum(v)
+ v++
+ }
+ }
+ }
+}
+
+// buildReferrers populates the def/use information in all non-nil
+// Value.Referrers slice.
+// Precondition: all such slices are initially empty.
+func buildReferrers(f *Function) {
+ var rands []*Value
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ rands = instr.Operands(rands[:0]) // recycle storage
+ for _, rand := range rands {
+ if r := *rand; r != nil {
+ if ref := r.Referrers(); ref != nil {
+ *ref = append(*ref, instr)
+ }
+ }
+ }
+ }
+ }
+}
+
+// finishBody() finalizes the function after SSA code generation of its body.
+func (f *Function) finishBody() {
+ f.objects = nil
+ f.currentBlock = nil
+ f.lblocks = nil
+
+ // Don't pin the AST in memory (except in debug mode).
+ if n := f.syntax; n != nil && !f.debugInfo() {
+ f.syntax = extentNode{n.Pos(), n.End()}
+ }
+
+ // Remove from f.Locals any Allocs that escape to the heap.
+ j := 0
+ for _, l := range f.Locals {
+ if !l.Heap {
+ f.Locals[j] = l
+ j++
+ }
+ }
+ // Nil out f.Locals[j:] to aid GC.
+ for i := j; i < len(f.Locals); i++ {
+ f.Locals[i] = nil
+ }
+ f.Locals = f.Locals[:j]
+
+ optimizeBlocks(f)
+
+ buildReferrers(f)
+
+ buildDomTree(f)
+
+ if f.Prog.mode&NaiveForm == 0 {
+ // For debugging pre-state of lifting pass:
+ // numberRegisters(f)
+ // f.WriteTo(os.Stderr)
+ lift(f)
+ }
+
+ f.namedResults = nil // (used by lifting)
+
+ numberRegisters(f)
+
+ if f.Prog.mode&PrintFunctions != 0 {
+ printMu.Lock()
+ f.WriteTo(os.Stdout)
+ printMu.Unlock()
+ }
+
+ if f.Prog.mode&SanityCheckFunctions != 0 {
+ mustSanityCheck(f, nil)
+ }
+}
+
+func (f *Function) RemoveNilBlocks() {
+ f.removeNilBlocks()
+}
+
+// removeNilBlocks eliminates nils from f.Blocks and updates each
+// BasicBlock.Index. Use this after any pass that may delete blocks.
+//
+func (f *Function) removeNilBlocks() {
+ j := 0
+ for _, b := range f.Blocks {
+ if b != nil {
+ b.Index = j
+ f.Blocks[j] = b
+ j++
+ }
+ }
+ // Nil out f.Blocks[j:] to aid GC.
+ for i := j; i < len(f.Blocks); i++ {
+ f.Blocks[i] = nil
+ }
+ f.Blocks = f.Blocks[:j]
+}
+
+// SetDebugMode sets the debug mode for package pkg. If true, all its
+// functions will include full debug info. This greatly increases the
+// size of the instruction stream, and causes Functions to depend upon
+// the ASTs, potentially keeping them live in memory for longer.
+//
+func (pkg *Package) SetDebugMode(debug bool) {
+ // TODO(adonovan): do we want ast.File granularity?
+ pkg.debug = debug
+}
+
+// debugInfo reports whether debug info is wanted for this function.
+func (f *Function) debugInfo() bool {
+ return f.Pkg != nil && f.Pkg.debug
+}
+
+// addNamedLocal creates a local variable, adds it to function f and
+// returns it. Its name and type are taken from obj. Subsequent
+// calls to f.lookup(obj) will return the same local.
+//
+func (f *Function) addNamedLocal(obj types.Object) *Alloc {
+ l := f.addLocal(obj.Type(), obj.Pos())
+ l.Comment = obj.Name()
+ f.objects[obj] = l
+ return l
+}
+
+func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
+ return f.addNamedLocal(f.Pkg.info.Defs[id])
+}
+
+// addLocal creates an anonymous local variable of type typ, adds it
+// to function f and returns it. pos is the optional source location.
+//
+func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
+ v := &Alloc{}
+ v.setType(types.NewPointer(typ))
+ v.setPos(pos)
+ f.Locals = append(f.Locals, v)
+ f.emit(v)
+ return v
+}
+
+// lookup returns the address of the named variable identified by obj
+// that is local to function f or one of its enclosing functions.
+// If escaping, the reference comes from a potentially escaping pointer
+// expression and the referent must be heap-allocated.
+//
+func (f *Function) lookup(obj types.Object, escaping bool) Value {
+ if v, ok := f.objects[obj]; ok {
+ if alloc, ok := v.(*Alloc); ok && escaping {
+ alloc.Heap = true
+ }
+ return v // function-local var (address)
+ }
+
+ // Definition must be in an enclosing function;
+ // plumb it through intervening closures.
+ if f.parent == nil {
+ panic("no ssa.Value for " + obj.String())
+ }
+ outer := f.parent.lookup(obj, true) // escaping
+ v := &FreeVar{
+ name: obj.Name(),
+ typ: outer.Type(),
+ pos: outer.Pos(),
+ outer: outer,
+ parent: f,
+ }
+ f.objects[obj] = v
+ f.FreeVars = append(f.FreeVars, v)
+ return v
+}
+
+// emit emits the specified instruction to function f.
+func (f *Function) emit(instr Instruction) Value {
+ return f.currentBlock.emit(instr)
+}
+
+// RelString returns the full name of this function, qualified by
+// package name, receiver type, etc.
+//
+// The specific formatting rules are not guaranteed and may change.
+//
+// Examples:
+// "math.IsNaN" // a package-level function
+// "(*bytes.Buffer).Bytes" // a declared method or a wrapper
+// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
+// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
+// "main.main$1" // an anonymous function in main
+// "main.init#1" // a declared init function
+// "main.init" // the synthesized package initializer
+//
+// When these functions are referred to from within the same package
+// (i.e. from == f.Pkg.Object), they are rendered without the package path.
+// For example: "IsNaN", "(*Buffer).Bytes", etc.
+//
+// All non-synthetic functions have distinct package-qualified names.
+// (But two methods may have the same name "(T).f" if one is a synthetic
+// wrapper promoting a non-exported method "f" from another package; in
+// that case, the strings are equal but the identifiers "f" are distinct.)
+//
+func (f *Function) RelString(from *types.Package) string {
+ // Anonymous?
+ if f.parent != nil {
+ // An anonymous function's Name() looks like "parentName$1",
+ // but its String() should include the type/package/etc.
+ parent := f.parent.RelString(from)
+ for i, anon := range f.parent.AnonFuncs {
+ if anon == f {
+ return fmt.Sprintf("%s$%d", parent, 1+i)
+ }
+ }
+
+ return f.name // should never happen
+ }
+
+ // Method (declared or wrapper)?
+ if recv := f.Signature.Recv(); recv != nil {
+ return f.relMethod(from, recv.Type())
+ }
+
+ // Thunk?
+ if f.method != nil {
+ return f.relMethod(from, f.method.Recv())
+ }
+
+ // Bound?
+ if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
+ return f.relMethod(from, f.FreeVars[0].Type())
+ }
+
+ // Package-level function?
+ // Prefix with package name for cross-package references only.
+ if p := f.pkg(); p != nil && p != from {
+ return fmt.Sprintf("%s.%s", p.Path(), f.name)
+ }
+
+ // Unknown.
+ return f.name
+}
+
+func (f *Function) relMethod(from *types.Package, recv types.Type) string {
+ return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
+}
+
+// writeSignature writes to buf the signature sig in declaration syntax.
+func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
+ buf.WriteString("func ")
+ if recv := sig.Recv(); recv != nil {
+ buf.WriteString("(")
+ if n := params[0].Name(); n != "" {
+ buf.WriteString(n)
+ buf.WriteString(" ")
+ }
+ types.WriteType(buf, params[0].Type(), types.RelativeTo(from))
+ buf.WriteString(") ")
+ }
+ buf.WriteString(name)
+ types.WriteSignature(buf, sig, types.RelativeTo(from))
+}
+
+func (f *Function) pkg() *types.Package {
+ if f.Pkg != nil {
+ return f.Pkg.Pkg
+ }
+ return nil
+}
+
+var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
+
+func (f *Function) WriteTo(w io.Writer) (int64, error) {
+ var buf bytes.Buffer
+ WriteFunction(&buf, f)
+ n, err := w.Write(buf.Bytes())
+ return int64(n), err
+}
+
+// WriteFunction writes to buf a human-readable "disassembly" of f.
+func WriteFunction(buf *bytes.Buffer, f *Function) {
+ fmt.Fprintf(buf, "# Name: %s\n", f.String())
+ if f.Pkg != nil {
+ fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path())
+ }
+ if syn := f.Synthetic; syn != "" {
+ fmt.Fprintln(buf, "# Synthetic:", syn)
+ }
+ if pos := f.Pos(); pos.IsValid() {
+ fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
+ }
+
+ if f.parent != nil {
+ fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
+ }
+
+ if f.Recover != nil {
+ fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
+ }
+
+ from := f.pkg()
+
+ if f.FreeVars != nil {
+ buf.WriteString("# Free variables:\n")
+ for i, fv := range f.FreeVars {
+ fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
+ }
+ }
+
+ if len(f.Locals) > 0 {
+ buf.WriteString("# Locals:\n")
+ for i, l := range f.Locals {
+ fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
+ }
+ }
+ writeSignature(buf, from, f.Name(), f.Signature, f.Params)
+ buf.WriteString(":\n")
+
+ if f.Blocks == nil {
+ buf.WriteString("\t(external)\n")
+ }
+
+ // NB. column calculations are confused by non-ASCII
+ // characters and assume 8-space tabs.
+ const punchcard = 80 // for old time's sake.
+ const tabwidth = 8
+ for _, b := range f.Blocks {
+ if b == nil {
+ // Corrupt CFG.
+ fmt.Fprintf(buf, ".nil:\n")
+ continue
+ }
+ n, _ := fmt.Fprintf(buf, "%d:", b.Index)
+ bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
+ fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
+
+ if false { // CFG debugging
+ fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
+ }
+ for _, instr := range b.Instrs {
+ buf.WriteString("\t")
+ switch v := instr.(type) {
+ case Value:
+ l := punchcard - tabwidth
+ // Left-align the instruction.
+ if name := v.Name(); name != "" {
+ n, _ := fmt.Fprintf(buf, "%s = ", name)
+ l -= n
+ }
+ n, _ := buf.WriteString(instr.String())
+ l -= n
+ // Right-align the type if there's space.
+ if t := v.Type(); t != nil {
+ buf.WriteByte(' ')
+ ts := relType(t, from)
+ l -= len(ts) + len(" ") // (spaces before and after type)
+ if l > 0 {
+ fmt.Fprintf(buf, "%*s", l, "")
+ }
+ buf.WriteString(ts)
+ }
+ case nil:
+ // Be robust against bad transforms.
+ buf.WriteString("")
+ default:
+ buf.WriteString(instr.String())
+ }
+ buf.WriteString("\n")
+ }
+ }
+ fmt.Fprintf(buf, "\n")
+}
+
+// newBasicBlock adds to f a new basic block and returns it. It does
+// not automatically become the current block for subsequent calls to emit.
+// comment is an optional string for more readable debugging output.
+//
+func (f *Function) newBasicBlock(comment string) *BasicBlock {
+ b := &BasicBlock{
+ Index: len(f.Blocks),
+ Comment: comment,
+ parent: f,
+ }
+ b.Succs = b.succs2[:0]
+ f.Blocks = append(f.Blocks, b)
+ return b
+}
+
+// NewFunction returns a new synthetic Function instance belonging to
+// prog, with its name and signature fields set as specified.
+//
+// The caller is responsible for initializing the remaining fields of
+// the function object, e.g. Pkg, Params, Blocks.
+//
+// It is practically impossible for clients to construct well-formed
+// SSA functions/packages/programs directly, so we assume this is the
+// job of the Builder alone. NewFunction exists to provide clients a
+// little flexibility. For example, analysis tools may wish to
+// construct fake Functions for the root of the callgraph, a fake
+// "reflect" package, etc.
+//
+// TODO(adonovan): think harder about the API here.
+//
+func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
+ return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
+}
+
+type extentNode [2]token.Pos
+
+func (n extentNode) Pos() token.Pos { return n[0] }
+func (n extentNode) End() token.Pos { return n[1] }
+
+// Syntax returns an ast.Node whose Pos/End methods provide the
+// lexical extent of the function if it was defined by Go source code
+// (f.Synthetic==""), or nil otherwise.
+//
+// If f was built with debug information (see Package.SetDebugRef),
+// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
+// function. Otherwise, it is an opaque Node providing only position
+// information; this avoids pinning the AST in memory.
+//
+func (f *Function) Syntax() ast.Node { return f.syntax }
diff --git a/vendor/github.com/golangci/go-tools/ssa/identical.go b/vendor/github.com/golangci/go-tools/ssa/identical.go
new file mode 100644
index 00000000000..53cbee107b6
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/identical.go
@@ -0,0 +1,7 @@
+// +build go1.8
+
+package ssa
+
+import "go/types"
+
+var structTypesIdentical = types.IdenticalIgnoreTags
diff --git a/vendor/github.com/golangci/go-tools/ssa/identical_17.go b/vendor/github.com/golangci/go-tools/ssa/identical_17.go
new file mode 100644
index 00000000000..da89d3339a5
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/identical_17.go
@@ -0,0 +1,7 @@
+// +build !go1.8
+
+package ssa
+
+import "go/types"
+
+var structTypesIdentical = types.Identical
diff --git a/vendor/github.com/golangci/go-tools/ssa/lift.go b/vendor/github.com/golangci/go-tools/ssa/lift.go
new file mode 100644
index 00000000000..048e9b03260
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/lift.go
@@ -0,0 +1,653 @@
+// 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 ssa
+
+// This file defines the lifting pass which tries to "lift" Alloc
+// cells (new/local variables) into SSA registers, replacing loads
+// with the dominating stored value, eliminating loads and stores, and
+// inserting φ-nodes as needed.
+
+// Cited papers and resources:
+//
+// Ron Cytron et al. 1991. Efficiently computing SSA form...
+// http://doi.acm.org/10.1145/115372.115320
+//
+// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm.
+// Software Practice and Experience 2001, 4:1-10.
+// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
+//
+// Daniel Berlin, llvmdev mailing list, 2012.
+// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
+// (Be sure to expand the whole thread.)
+
+// TODO(adonovan): opt: there are many optimizations worth evaluating, and
+// the conventional wisdom for SSA construction is that a simple
+// algorithm well engineered often beats those of better asymptotic
+// complexity on all but the most egregious inputs.
+//
+// Danny Berlin suggests that the Cooper et al. algorithm for
+// computing the dominance frontier is superior to Cytron et al.
+// Furthermore he recommends that rather than computing the DF for the
+// whole function then renaming all alloc cells, it may be cheaper to
+// compute the DF for each alloc cell separately and throw it away.
+//
+// Consider exploiting liveness information to avoid creating dead
+// φ-nodes which we then immediately remove.
+//
+// Also see many other "TODO: opt" suggestions in the code.
+
+import (
+ "fmt"
+ "go/token"
+ "go/types"
+ "math/big"
+ "os"
+)
+
+// If true, show diagnostic information at each step of lifting.
+// Very verbose.
+const debugLifting = false
+
+// domFrontier maps each block to the set of blocks in its dominance
+// frontier. The outer slice is conceptually a map keyed by
+// Block.Index. The inner slice is conceptually a set, possibly
+// containing duplicates.
+//
+// TODO(adonovan): opt: measure impact of dups; consider a packed bit
+// representation, e.g. big.Int, and bitwise parallel operations for
+// the union step in the Children loop.
+//
+// domFrontier's methods mutate the slice's elements but not its
+// length, so their receivers needn't be pointers.
+//
+type domFrontier [][]*BasicBlock
+
+func (df domFrontier) add(u, v *BasicBlock) {
+ p := &df[u.Index]
+ *p = append(*p, v)
+}
+
+// build builds the dominance frontier df for the dominator (sub)tree
+// rooted at u, using the Cytron et al. algorithm.
+//
+// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
+// by pruning the entire IDF computation, rather than merely pruning
+// the DF -> IDF step.
+func (df domFrontier) build(u *BasicBlock) {
+ // Encounter each node u in postorder of dom tree.
+ for _, child := range u.dom.children {
+ df.build(child)
+ }
+ for _, vb := range u.Succs {
+ if v := vb.dom; v.idom != u {
+ df.add(u, vb)
+ }
+ }
+ for _, w := range u.dom.children {
+ for _, vb := range df[w.Index] {
+ // TODO(adonovan): opt: use word-parallel bitwise union.
+ if v := vb.dom; v.idom != u {
+ df.add(u, vb)
+ }
+ }
+ }
+}
+
+func buildDomFrontier(fn *Function) domFrontier {
+ df := make(domFrontier, len(fn.Blocks))
+ df.build(fn.Blocks[0])
+ if fn.Recover != nil {
+ df.build(fn.Recover)
+ }
+ return df
+}
+
+func removeInstr(refs []Instruction, instr Instruction) []Instruction {
+ i := 0
+ for _, ref := range refs {
+ if ref == instr {
+ continue
+ }
+ refs[i] = ref
+ i++
+ }
+ for j := i; j != len(refs); j++ {
+ refs[j] = nil // aid GC
+ }
+ return refs[:i]
+}
+
+// lift replaces local and new Allocs accessed only with
+// load/store by SSA registers, inserting φ-nodes where necessary.
+// The result is a program in classical pruned SSA form.
+//
+// Preconditions:
+// - fn has no dead blocks (blockopt has run).
+// - Def/use info (Operands and Referrers) is up-to-date.
+// - The dominator tree is up-to-date.
+//
+func lift(fn *Function) {
+ // TODO(adonovan): opt: lots of little optimizations may be
+ // worthwhile here, especially if they cause us to avoid
+ // buildDomFrontier. For example:
+ //
+ // - Alloc never loaded? Eliminate.
+ // - Alloc never stored? Replace all loads with a zero constant.
+ // - Alloc stored once? Replace loads with dominating store;
+ // don't forget that an Alloc is itself an effective store
+ // of zero.
+ // - Alloc used only within a single block?
+ // Use degenerate algorithm avoiding φ-nodes.
+ // - Consider synergy with scalar replacement of aggregates (SRA).
+ // e.g. *(&x.f) where x is an Alloc.
+ // Perhaps we'd get better results if we generated this as x.f
+ // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
+ // Unclear.
+ //
+ // But we will start with the simplest correct code.
+ df := buildDomFrontier(fn)
+
+ if debugLifting {
+ title := false
+ for i, blocks := range df {
+ if blocks != nil {
+ if !title {
+ fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
+ title = true
+ }
+ fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
+ }
+ }
+ }
+
+ newPhis := make(newPhiMap)
+
+ // During this pass we will replace some BasicBlock.Instrs
+ // (allocs, loads and stores) with nil, keeping a count in
+ // BasicBlock.gaps. At the end we will reset Instrs to the
+ // concatenation of all non-dead newPhis and non-nil Instrs
+ // for the block, reusing the original array if space permits.
+
+ // While we're here, we also eliminate 'rundefers'
+ // instructions in functions that contain no 'defer'
+ // instructions.
+ usesDefer := false
+
+ // A counter used to generate ~unique ids for Phi nodes, as an
+ // aid to debugging. We use large numbers to make them highly
+ // visible. All nodes are renumbered later.
+ fresh := 1000
+
+ // Determine which allocs we can lift and number them densely.
+ // The renaming phase uses this numbering for compact maps.
+ numAllocs := 0
+ for _, b := range fn.Blocks {
+ b.gaps = 0
+ b.rundefers = 0
+ for _, instr := range b.Instrs {
+ switch instr := instr.(type) {
+ case *Alloc:
+ index := -1
+ if liftAlloc(df, instr, newPhis, &fresh) {
+ index = numAllocs
+ numAllocs++
+ }
+ instr.index = index
+ case *Defer:
+ usesDefer = true
+ case *RunDefers:
+ b.rundefers++
+ }
+ }
+ }
+
+ // renaming maps an alloc (keyed by index) to its replacement
+ // value. Initially the renaming contains nil, signifying the
+ // zero constant of the appropriate type; we construct the
+ // Const lazily at most once on each path through the domtree.
+ // TODO(adonovan): opt: cache per-function not per subtree.
+ renaming := make([]Value, numAllocs)
+
+ // Renaming.
+ rename(fn.Blocks[0], renaming, newPhis)
+
+ // Eliminate dead φ-nodes.
+ removeDeadPhis(fn.Blocks, newPhis)
+
+ // Prepend remaining live φ-nodes to each block.
+ for _, b := range fn.Blocks {
+ nps := newPhis[b]
+ j := len(nps)
+
+ rundefersToKill := b.rundefers
+ if usesDefer {
+ rundefersToKill = 0
+ }
+
+ if j+b.gaps+rundefersToKill == 0 {
+ continue // fast path: no new phis or gaps
+ }
+
+ // Compact nps + non-nil Instrs into a new slice.
+ // TODO(adonovan): opt: compact in situ (rightwards)
+ // if Instrs has sufficient space or slack.
+ dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
+ for i, np := range nps {
+ dst[i] = np.phi
+ }
+ for _, instr := range b.Instrs {
+ if instr == nil {
+ continue
+ }
+ if !usesDefer {
+ if _, ok := instr.(*RunDefers); ok {
+ continue
+ }
+ }
+ dst[j] = instr
+ j++
+ }
+ b.Instrs = dst
+ }
+
+ // Remove any fn.Locals that were lifted.
+ j := 0
+ for _, l := range fn.Locals {
+ if l.index < 0 {
+ fn.Locals[j] = l
+ j++
+ }
+ }
+ // Nil out fn.Locals[j:] to aid GC.
+ for i := j; i < len(fn.Locals); i++ {
+ fn.Locals[i] = nil
+ }
+ fn.Locals = fn.Locals[:j]
+}
+
+// removeDeadPhis removes φ-nodes not transitively needed by a
+// non-Phi, non-DebugRef instruction.
+func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) {
+ // First pass: find the set of "live" φ-nodes: those reachable
+ // from some non-Phi instruction.
+ //
+ // We compute reachability in reverse, starting from each φ,
+ // rather than forwards, starting from each live non-Phi
+ // instruction, because this way visits much less of the
+ // Value graph.
+ livePhis := make(map[*Phi]bool)
+ for _, npList := range newPhis {
+ for _, np := range npList {
+ phi := np.phi
+ if !livePhis[phi] && phiHasDirectReferrer(phi) {
+ markLivePhi(livePhis, phi)
+ }
+ }
+ }
+
+ // Existing φ-nodes due to && and || operators
+ // are all considered live (see Go issue 19622).
+ for _, b := range blocks {
+ for _, phi := range b.phis() {
+ markLivePhi(livePhis, phi.(*Phi))
+ }
+ }
+
+ // Second pass: eliminate unused phis from newPhis.
+ for block, npList := range newPhis {
+ j := 0
+ for _, np := range npList {
+ if livePhis[np.phi] {
+ npList[j] = np
+ j++
+ } else {
+ // discard it, first removing it from referrers
+ for _, val := range np.phi.Edges {
+ if refs := val.Referrers(); refs != nil {
+ *refs = removeInstr(*refs, np.phi)
+ }
+ }
+ np.phi.block = nil
+ }
+ }
+ newPhis[block] = npList[:j]
+ }
+}
+
+// markLivePhi marks phi, and all φ-nodes transitively reachable via
+// its Operands, live.
+func markLivePhi(livePhis map[*Phi]bool, phi *Phi) {
+ livePhis[phi] = true
+ for _, rand := range phi.Operands(nil) {
+ if q, ok := (*rand).(*Phi); ok {
+ if !livePhis[q] {
+ markLivePhi(livePhis, q)
+ }
+ }
+ }
+}
+
+// phiHasDirectReferrer reports whether phi is directly referred to by
+// a non-Phi instruction. Such instructions are the
+// roots of the liveness traversal.
+func phiHasDirectReferrer(phi *Phi) bool {
+ for _, instr := range *phi.Referrers() {
+ if _, ok := instr.(*Phi); !ok {
+ return true
+ }
+ }
+ return false
+}
+
+type blockSet struct{ big.Int } // (inherit methods from Int)
+
+// add adds b to the set and returns true if the set changed.
+func (s *blockSet) add(b *BasicBlock) bool {
+ i := b.Index
+ if s.Bit(i) != 0 {
+ return false
+ }
+ s.SetBit(&s.Int, i, 1)
+ return true
+}
+
+// take removes an arbitrary element from a set s and
+// returns its index, or returns -1 if empty.
+func (s *blockSet) take() int {
+ l := s.BitLen()
+ for i := 0; i < l; i++ {
+ if s.Bit(i) == 1 {
+ s.SetBit(&s.Int, i, 0)
+ return i
+ }
+ }
+ return -1
+}
+
+// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
+// it replaces.
+type newPhi struct {
+ phi *Phi
+ alloc *Alloc
+}
+
+// newPhiMap records for each basic block, the set of newPhis that
+// must be prepended to the block.
+type newPhiMap map[*BasicBlock][]newPhi
+
+// liftAlloc determines whether alloc can be lifted into registers,
+// and if so, it populates newPhis with all the φ-nodes it may require
+// and returns true.
+//
+// fresh is a source of fresh ids for phi nodes.
+//
+func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool {
+ // Don't lift aggregates into registers, because we don't have
+ // a way to express their zero-constants.
+ switch deref(alloc.Type()).Underlying().(type) {
+ case *types.Array, *types.Struct:
+ return false
+ }
+
+ // Don't lift named return values in functions that defer
+ // calls that may recover from panic.
+ if fn := alloc.Parent(); fn.Recover != nil {
+ for _, nr := range fn.namedResults {
+ if nr == alloc {
+ return false
+ }
+ }
+ }
+
+ // Compute defblocks, the set of blocks containing a
+ // definition of the alloc cell.
+ var defblocks blockSet
+ for _, instr := range *alloc.Referrers() {
+ // Bail out if we discover the alloc is not liftable;
+ // the only operations permitted to use the alloc are
+ // loads/stores into the cell, and DebugRef.
+ switch instr := instr.(type) {
+ case *Store:
+ if instr.Val == alloc {
+ return false // address used as value
+ }
+ if instr.Addr != alloc {
+ panic("Alloc.Referrers is inconsistent")
+ }
+ defblocks.add(instr.Block())
+ case *UnOp:
+ if instr.Op != token.MUL {
+ return false // not a load
+ }
+ if instr.X != alloc {
+ panic("Alloc.Referrers is inconsistent")
+ }
+ case *DebugRef:
+ // ok
+ default:
+ return false // some other instruction
+ }
+ }
+ // The Alloc itself counts as a (zero) definition of the cell.
+ defblocks.add(alloc.Block())
+
+ if debugLifting {
+ fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
+ }
+
+ fn := alloc.Parent()
+
+ // Φ-insertion.
+ //
+ // What follows is the body of the main loop of the insert-φ
+ // function described by Cytron et al, but instead of using
+ // counter tricks, we just reset the 'hasAlready' and 'work'
+ // sets each iteration. These are bitmaps so it's pretty cheap.
+ //
+ // TODO(adonovan): opt: recycle slice storage for W,
+ // hasAlready, defBlocks across liftAlloc calls.
+ var hasAlready blockSet
+
+ // Initialize W and work to defblocks.
+ var work blockSet = defblocks // blocks seen
+ var W blockSet // blocks to do
+ W.Set(&defblocks.Int)
+
+ // Traverse iterated dominance frontier, inserting φ-nodes.
+ for i := W.take(); i != -1; i = W.take() {
+ u := fn.Blocks[i]
+ for _, v := range df[u.Index] {
+ if hasAlready.add(v) {
+ // Create φ-node.
+ // It will be prepended to v.Instrs later, if needed.
+ phi := &Phi{
+ Edges: make([]Value, len(v.Preds)),
+ Comment: alloc.Comment,
+ }
+ // This is merely a debugging aid:
+ phi.setNum(*fresh)
+ *fresh++
+
+ phi.pos = alloc.Pos()
+ phi.setType(deref(alloc.Type()))
+ phi.block = v
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
+ }
+ newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
+
+ if work.add(v) {
+ W.add(v)
+ }
+ }
+ }
+ }
+
+ return true
+}
+
+// replaceAll replaces all intraprocedural uses of x with y,
+// updating x.Referrers and y.Referrers.
+// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
+//
+func replaceAll(x, y Value) {
+ var rands []*Value
+ pxrefs := x.Referrers()
+ pyrefs := y.Referrers()
+ for _, instr := range *pxrefs {
+ rands = instr.Operands(rands[:0]) // recycle storage
+ for _, rand := range rands {
+ if *rand != nil {
+ if *rand == x {
+ *rand = y
+ }
+ }
+ }
+ if pyrefs != nil {
+ *pyrefs = append(*pyrefs, instr) // dups ok
+ }
+ }
+ *pxrefs = nil // x is now unreferenced
+}
+
+// renamed returns the value to which alloc is being renamed,
+// constructing it lazily if it's the implicit zero initialization.
+//
+func renamed(renaming []Value, alloc *Alloc) Value {
+ v := renaming[alloc.index]
+ if v == nil {
+ v = zeroConst(deref(alloc.Type()))
+ renaming[alloc.index] = v
+ }
+ return v
+}
+
+// rename implements the (Cytron et al) SSA renaming algorithm, a
+// preorder traversal of the dominator tree replacing all loads of
+// Alloc cells with the value stored to that cell by the dominating
+// store instruction. For lifting, we need only consider loads,
+// stores and φ-nodes.
+//
+// renaming is a map from *Alloc (keyed by index number) to its
+// dominating stored value; newPhis[x] is the set of new φ-nodes to be
+// prepended to block x.
+//
+func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
+ // Each φ-node becomes the new name for its associated Alloc.
+ for _, np := range newPhis[u] {
+ phi := np.phi
+ alloc := np.alloc
+ renaming[alloc.index] = phi
+ }
+
+ // Rename loads and stores of allocs.
+ for i, instr := range u.Instrs {
+ switch instr := instr.(type) {
+ case *Alloc:
+ if instr.index >= 0 { // store of zero to Alloc cell
+ // Replace dominated loads by the zero value.
+ renaming[instr.index] = nil
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
+ }
+ // Delete the Alloc.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+
+ case *Store:
+ if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
+ // Replace dominated loads by the stored value.
+ renaming[alloc.index] = instr.Val
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
+ instr, instr.Val.Name())
+ }
+ // Remove the store from the referrer list of the stored value.
+ if refs := instr.Val.Referrers(); refs != nil {
+ *refs = removeInstr(*refs, instr)
+ }
+ // Delete the Store.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+
+ case *UnOp:
+ if instr.Op == token.MUL {
+ if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
+ newval := renamed(renaming, alloc)
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
+ instr.Name(), instr, newval.Name())
+ }
+ // Replace all references to
+ // the loaded value by the
+ // dominating stored value.
+ replaceAll(instr, newval)
+ // Delete the Load.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+ }
+
+ case *DebugRef:
+ if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
+ if instr.IsAddr {
+ instr.X = renamed(renaming, alloc)
+ instr.IsAddr = false
+
+ // Add DebugRef to instr.X's referrers.
+ if refs := instr.X.Referrers(); refs != nil {
+ *refs = append(*refs, instr)
+ }
+ } else {
+ // A source expression denotes the address
+ // of an Alloc that was optimized away.
+ instr.X = nil
+
+ // Delete the DebugRef.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+ }
+ }
+ }
+
+ // For each φ-node in a CFG successor, rename the edge.
+ for _, v := range u.Succs {
+ phis := newPhis[v]
+ if len(phis) == 0 {
+ continue
+ }
+ i := v.predIndex(u)
+ for _, np := range phis {
+ phi := np.phi
+ alloc := np.alloc
+ newval := renamed(renaming, alloc)
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
+ phi.Name(), u, v, i, alloc.Name(), newval.Name())
+ }
+ phi.Edges[i] = newval
+ if prefs := newval.Referrers(); prefs != nil {
+ *prefs = append(*prefs, phi)
+ }
+ }
+ }
+
+ // Continue depth-first recursion over domtree, pushing a
+ // fresh copy of the renaming map for each subtree.
+ for i, v := range u.dom.children {
+ r := renaming
+ if i < len(u.dom.children)-1 {
+ // On all but the final iteration, we must make
+ // a copy to avoid destructive update.
+ r = make([]Value, len(renaming))
+ copy(r, renaming)
+ }
+ rename(v, r, newPhis)
+ }
+
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/lvalue.go b/vendor/github.com/golangci/go-tools/ssa/lvalue.go
new file mode 100644
index 00000000000..eb5d71e188f
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/lvalue.go
@@ -0,0 +1,123 @@
+// 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 ssa
+
+// lvalues are the union of addressable expressions and map-index
+// expressions.
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// An lvalue represents an assignable location that may appear on the
+// left-hand side of an assignment. This is a generalization of a
+// pointer to permit updates to elements of maps.
+//
+type lvalue interface {
+ store(fn *Function, v Value) // stores v into the location
+ load(fn *Function) Value // loads the contents of the location
+ address(fn *Function) Value // address of the location
+ typ() types.Type // returns the type of the location
+}
+
+// An address is an lvalue represented by a true pointer.
+type address struct {
+ addr Value
+ pos token.Pos // source position
+ expr ast.Expr // source syntax of the value (not address) [debug mode]
+}
+
+func (a *address) load(fn *Function) Value {
+ load := emitLoad(fn, a.addr)
+ load.pos = a.pos
+ return load
+}
+
+func (a *address) store(fn *Function, v Value) {
+ store := emitStore(fn, a.addr, v, a.pos)
+ if a.expr != nil {
+ // store.Val is v, converted for assignability.
+ emitDebugRef(fn, a.expr, store.Val, false)
+ }
+}
+
+func (a *address) address(fn *Function) Value {
+ if a.expr != nil {
+ emitDebugRef(fn, a.expr, a.addr, true)
+ }
+ return a.addr
+}
+
+func (a *address) typ() types.Type {
+ return deref(a.addr.Type())
+}
+
+// An element is an lvalue represented by m[k], the location of an
+// element of a map or string. These locations are not addressable
+// since pointers cannot be formed from them, but they do support
+// load(), and in the case of maps, store().
+//
+type element struct {
+ m, k Value // map or string
+ t types.Type // map element type or string byte type
+ pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v)
+}
+
+func (e *element) load(fn *Function) Value {
+ l := &Lookup{
+ X: e.m,
+ Index: e.k,
+ }
+ l.setPos(e.pos)
+ l.setType(e.t)
+ return fn.emit(l)
+}
+
+func (e *element) store(fn *Function, v Value) {
+ up := &MapUpdate{
+ Map: e.m,
+ Key: e.k,
+ Value: emitConv(fn, v, e.t),
+ }
+ up.pos = e.pos
+ fn.emit(up)
+}
+
+func (e *element) address(fn *Function) Value {
+ panic("map/string elements are not addressable")
+}
+
+func (e *element) typ() types.Type {
+ return e.t
+}
+
+// A blank is a dummy variable whose name is "_".
+// It is not reified: loads are illegal and stores are ignored.
+//
+type blank struct{}
+
+func (bl blank) load(fn *Function) Value {
+ panic("blank.load is illegal")
+}
+
+func (bl blank) store(fn *Function, v Value) {
+ s := &BlankStore{
+ Val: v,
+ }
+ fn.emit(s)
+}
+
+func (bl blank) address(fn *Function) Value {
+ panic("blank var is not addressable")
+}
+
+func (bl blank) typ() types.Type {
+ // This should be the type of the blank Ident; the typechecker
+ // doesn't provide this yet, but fortunately, we don't need it
+ // yet either.
+ panic("blank.typ is unimplemented")
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/methods.go b/vendor/github.com/golangci/go-tools/ssa/methods.go
new file mode 100644
index 00000000000..080dca968ef
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/methods.go
@@ -0,0 +1,239 @@
+// 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 ssa
+
+// This file defines utilities for population of method sets.
+
+import (
+ "fmt"
+ "go/types"
+)
+
+// MethodValue returns the Function implementing method sel, building
+// wrapper methods on demand. It returns nil if sel denotes an
+// abstract (interface) method.
+//
+// Precondition: sel.Kind() == MethodVal.
+//
+// Thread-safe.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
+//
+func (prog *Program) MethodValue(sel *types.Selection) *Function {
+ if sel.Kind() != types.MethodVal {
+ panic(fmt.Sprintf("Method(%s) kind != MethodVal", sel))
+ }
+ T := sel.Recv()
+ if isInterface(T) {
+ return nil // abstract method
+ }
+ if prog.mode&LogSource != 0 {
+ defer logStack("Method %s %v", T, sel)()
+ }
+
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+
+ return prog.addMethod(prog.createMethodSet(T), sel)
+}
+
+// LookupMethod returns the implementation of the method of type T
+// identified by (pkg, name). It returns nil if the method exists but
+// is abstract, and panics if T has no such method.
+//
+func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
+ sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
+ if sel == nil {
+ panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
+ }
+ return prog.MethodValue(sel)
+}
+
+// methodSet contains the (concrete) methods of a non-interface type.
+type methodSet struct {
+ mapping map[string]*Function // populated lazily
+ complete bool // mapping contains all methods
+}
+
+// Precondition: !isInterface(T).
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+func (prog *Program) createMethodSet(T types.Type) *methodSet {
+ mset, ok := prog.methodSets.At(T).(*methodSet)
+ if !ok {
+ mset = &methodSet{mapping: make(map[string]*Function)}
+ prog.methodSets.Set(T, mset)
+ }
+ return mset
+}
+
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
+ if sel.Kind() == types.MethodExpr {
+ panic(sel)
+ }
+ id := sel.Obj().Id()
+ fn := mset.mapping[id]
+ if fn == nil {
+ obj := sel.Obj().(*types.Func)
+
+ needsPromotion := len(sel.Index()) > 1
+ needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
+ if needsPromotion || needsIndirection {
+ fn = makeWrapper(prog, sel)
+ } else {
+ fn = prog.declaredFunc(obj)
+ }
+ if fn.Signature.Recv() == nil {
+ panic(fn) // missing receiver
+ }
+ mset.mapping[id] = fn
+ }
+ return fn
+}
+
+// RuntimeTypes returns a new unordered slice containing all
+// concrete types in the program for which a complete (non-empty)
+// method set is required at run-time.
+//
+// Thread-safe.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
+//
+func (prog *Program) RuntimeTypes() []types.Type {
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+
+ var res []types.Type
+ prog.methodSets.Iterate(func(T types.Type, v interface{}) {
+ if v.(*methodSet).complete {
+ res = append(res, T)
+ }
+ })
+ return res
+}
+
+// declaredFunc returns the concrete function/method denoted by obj.
+// Panic ensues if there is none.
+//
+func (prog *Program) declaredFunc(obj *types.Func) *Function {
+ if v := prog.packageLevelValue(obj); v != nil {
+ return v.(*Function)
+ }
+ panic("no concrete method: " + obj.String())
+}
+
+// needMethodsOf ensures that runtime type information (including the
+// complete method set) is available for the specified type T and all
+// its subcomponents.
+//
+// needMethodsOf must be called for at least every type that is an
+// operand of some MakeInterface instruction, and for the type of
+// every exported package member.
+//
+// Precondition: T is not a method signature (*Signature with Recv()!=nil).
+//
+// Thread-safe. (Called via emitConv from multiple builder goroutines.)
+//
+// TODO(adonovan): make this faster. It accounts for 20% of SSA build time.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
+//
+func (prog *Program) needMethodsOf(T types.Type) {
+ prog.methodsMu.Lock()
+ prog.needMethods(T, false)
+ prog.methodsMu.Unlock()
+}
+
+// Precondition: T is not a method signature (*Signature with Recv()!=nil).
+// Recursive case: skip => don't create methods for T.
+//
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+//
+func (prog *Program) needMethods(T types.Type, skip bool) {
+ // Each package maintains its own set of types it has visited.
+ if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
+ // needMethods(T) was previously called
+ if !prevSkip || skip {
+ return // already seen, with same or false 'skip' value
+ }
+ }
+ prog.runtimeTypes.Set(T, skip)
+
+ tmset := prog.MethodSets.MethodSet(T)
+
+ if !skip && !isInterface(T) && tmset.Len() > 0 {
+ // Create methods of T.
+ mset := prog.createMethodSet(T)
+ if !mset.complete {
+ mset.complete = true
+ n := tmset.Len()
+ for i := 0; i < n; i++ {
+ prog.addMethod(mset, tmset.At(i))
+ }
+ }
+ }
+
+ // Recursion over signatures of each method.
+ for i := 0; i < tmset.Len(); i++ {
+ sig := tmset.At(i).Type().(*types.Signature)
+ prog.needMethods(sig.Params(), false)
+ prog.needMethods(sig.Results(), false)
+ }
+
+ switch t := T.(type) {
+ case *types.Basic:
+ // nop
+
+ case *types.Interface:
+ // nop---handled by recursion over method set.
+
+ case *types.Pointer:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Slice:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Chan:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Map:
+ prog.needMethods(t.Key(), false)
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Signature:
+ if t.Recv() != nil {
+ panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
+ }
+ prog.needMethods(t.Params(), false)
+ prog.needMethods(t.Results(), false)
+
+ case *types.Named:
+ // A pointer-to-named type can be derived from a named
+ // type via reflection. It may have methods too.
+ prog.needMethods(types.NewPointer(T), false)
+
+ // Consider 'type T struct{S}' where S has methods.
+ // Reflection provides no way to get from T to struct{S},
+ // only to S, so the method set of struct{S} is unwanted,
+ // so set 'skip' flag during recursion.
+ prog.needMethods(t.Underlying(), true)
+
+ case *types.Array:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Struct:
+ for i, n := 0, t.NumFields(); i < n; i++ {
+ prog.needMethods(t.Field(i).Type(), false)
+ }
+
+ case *types.Tuple:
+ for i, n := 0, t.Len(); i < n; i++ {
+ prog.needMethods(t.At(i).Type(), false)
+ }
+
+ default:
+ panic(T)
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/mode.go b/vendor/github.com/golangci/go-tools/ssa/mode.go
new file mode 100644
index 00000000000..d2a269893a7
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/mode.go
@@ -0,0 +1,100 @@
+// 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.
+
+package ssa
+
+// This file defines the BuilderMode type and its command-line flag.
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// BuilderMode is a bitmask of options for diagnostics and checking.
+//
+// *BuilderMode satisfies the flag.Value interface. Example:
+//
+// var mode = ssa.BuilderMode(0)
+// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
+//
+type BuilderMode uint
+
+const (
+ PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
+ PrintFunctions // Print function SSA code to stdout
+ LogSource // Log source locations as SSA builder progresses
+ SanityCheckFunctions // Perform sanity checking of function bodies
+ NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers
+ BuildSerially // Build packages serially, not in parallel.
+ GlobalDebug // Enable debug info for all packages
+ BareInits // Build init functions without guards or calls to dependent inits
+)
+
+const BuilderModeDoc = `Options controlling the SSA builder.
+The value is a sequence of zero or more of these letters:
+C perform sanity [C]hecking of the SSA form.
+D include [D]ebug info for every function.
+P print [P]ackage inventory.
+F print [F]unction SSA code.
+S log [S]ource locations as SSA builder progresses.
+L build distinct packages seria[L]ly instead of in parallel.
+N build [N]aive SSA form: don't replace local loads/stores with registers.
+I build bare [I]nit functions: no init guards or calls to dependent inits.
+`
+
+func (m BuilderMode) String() string {
+ var buf bytes.Buffer
+ if m&GlobalDebug != 0 {
+ buf.WriteByte('D')
+ }
+ if m&PrintPackages != 0 {
+ buf.WriteByte('P')
+ }
+ if m&PrintFunctions != 0 {
+ buf.WriteByte('F')
+ }
+ if m&LogSource != 0 {
+ buf.WriteByte('S')
+ }
+ if m&SanityCheckFunctions != 0 {
+ buf.WriteByte('C')
+ }
+ if m&NaiveForm != 0 {
+ buf.WriteByte('N')
+ }
+ if m&BuildSerially != 0 {
+ buf.WriteByte('L')
+ }
+ return buf.String()
+}
+
+// Set parses the flag characters in s and updates *m.
+func (m *BuilderMode) Set(s string) error {
+ var mode BuilderMode
+ for _, c := range s {
+ switch c {
+ case 'D':
+ mode |= GlobalDebug
+ case 'P':
+ mode |= PrintPackages
+ case 'F':
+ mode |= PrintFunctions
+ case 'S':
+ mode |= LogSource | BuildSerially
+ case 'C':
+ mode |= SanityCheckFunctions
+ case 'N':
+ mode |= NaiveForm
+ case 'L':
+ mode |= BuildSerially
+ default:
+ return fmt.Errorf("unknown BuilderMode option: %q", c)
+ }
+ }
+ *m = mode
+ return nil
+}
+
+// Get returns m.
+func (m BuilderMode) Get() interface{} { return m }
diff --git a/vendor/github.com/golangci/go-tools/ssa/print.go b/vendor/github.com/golangci/go-tools/ssa/print.go
new file mode 100644
index 00000000000..6fd277277c0
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/print.go
@@ -0,0 +1,435 @@
+// 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 ssa
+
+// This file implements the String() methods for all Value and
+// Instruction types.
+
+import (
+ "bytes"
+ "fmt"
+ "go/types"
+ "io"
+ "reflect"
+ "sort"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+// relName returns the name of v relative to i.
+// In most cases, this is identical to v.Name(), but references to
+// Functions (including methods) and Globals use RelString and
+// all types are displayed with relType, so that only cross-package
+// references are package-qualified.
+//
+func relName(v Value, i Instruction) string {
+ var from *types.Package
+ if i != nil {
+ from = i.Parent().pkg()
+ }
+ switch v := v.(type) {
+ case Member: // *Function or *Global
+ return v.RelString(from)
+ case *Const:
+ return v.RelString(from)
+ }
+ return v.Name()
+}
+
+func relType(t types.Type, from *types.Package) string {
+ return types.TypeString(t, types.RelativeTo(from))
+}
+
+func relString(m Member, from *types.Package) string {
+ // NB: not all globals have an Object (e.g. init$guard),
+ // so use Package().Object not Object.Package().
+ if pkg := m.Package().Pkg; pkg != nil && pkg != from {
+ return fmt.Sprintf("%s.%s", pkg.Path(), m.Name())
+ }
+ return m.Name()
+}
+
+// Value.String()
+//
+// This method is provided only for debugging.
+// It never appears in disassembly, which uses Value.Name().
+
+func (v *Parameter) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
+}
+
+func (v *FreeVar) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
+}
+
+func (v *Builtin) String() string {
+ return fmt.Sprintf("builtin %s", v.Name())
+}
+
+// Instruction.String()
+
+func (v *Alloc) String() string {
+ op := "local"
+ if v.Heap {
+ op = "new"
+ }
+ from := v.Parent().pkg()
+ return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
+}
+
+func (v *Phi) String() string {
+ var b bytes.Buffer
+ b.WriteString("phi [")
+ for i, edge := range v.Edges {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ // Be robust against malformed CFG.
+ if v.block == nil {
+ b.WriteString("??")
+ continue
+ }
+ block := -1
+ if i < len(v.block.Preds) {
+ block = v.block.Preds[i].Index
+ }
+ fmt.Fprintf(&b, "%d: ", block)
+ edgeVal := "" // be robust
+ if edge != nil {
+ edgeVal = relName(edge, v)
+ }
+ b.WriteString(edgeVal)
+ }
+ b.WriteString("]")
+ if v.Comment != "" {
+ b.WriteString(" #")
+ b.WriteString(v.Comment)
+ }
+ return b.String()
+}
+
+func printCall(v *CallCommon, prefix string, instr Instruction) string {
+ var b bytes.Buffer
+ b.WriteString(prefix)
+ if !v.IsInvoke() {
+ b.WriteString(relName(v.Value, instr))
+ } else {
+ fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
+ }
+ b.WriteString("(")
+ for i, arg := range v.Args {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ b.WriteString(relName(arg, instr))
+ }
+ if v.Signature().Variadic() {
+ b.WriteString("...")
+ }
+ b.WriteString(")")
+ return b.String()
+}
+
+func (c *CallCommon) String() string {
+ return printCall(c, "", nil)
+}
+
+func (v *Call) String() string {
+ return printCall(&v.Call, "", v)
+}
+
+func (v *BinOp) String() string {
+ return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
+}
+
+func (v *UnOp) String() string {
+ return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
+}
+
+func printConv(prefix string, v, x Value) string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("%s %s <- %s (%s)",
+ prefix,
+ relType(v.Type(), from),
+ relType(x.Type(), from),
+ relName(x, v.(Instruction)))
+}
+
+func (v *ChangeType) String() string { return printConv("changetype", v, v.X) }
+func (v *Convert) String() string { return printConv("convert", v, v.X) }
+func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
+func (v *MakeInterface) String() string { return printConv("make", v, v.X) }
+
+func (v *MakeClosure) String() string {
+ var b bytes.Buffer
+ fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
+ if v.Bindings != nil {
+ b.WriteString(" [")
+ for i, c := range v.Bindings {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ b.WriteString(relName(c, v))
+ }
+ b.WriteString("]")
+ }
+ return b.String()
+}
+
+func (v *MakeSlice) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("make %s %s %s",
+ relType(v.Type(), from),
+ relName(v.Len, v),
+ relName(v.Cap, v))
+}
+
+func (v *Slice) String() string {
+ var b bytes.Buffer
+ b.WriteString("slice ")
+ b.WriteString(relName(v.X, v))
+ b.WriteString("[")
+ if v.Low != nil {
+ b.WriteString(relName(v.Low, v))
+ }
+ b.WriteString(":")
+ if v.High != nil {
+ b.WriteString(relName(v.High, v))
+ }
+ if v.Max != nil {
+ b.WriteString(":")
+ b.WriteString(relName(v.Max, v))
+ }
+ b.WriteString("]")
+ return b.String()
+}
+
+func (v *MakeMap) String() string {
+ res := ""
+ if v.Reserve != nil {
+ res = relName(v.Reserve, v)
+ }
+ from := v.Parent().pkg()
+ return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
+}
+
+func (v *MakeChan) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
+}
+
+func (v *FieldAddr) String() string {
+ st := deref(v.X.Type()).Underlying().(*types.Struct)
+ // Be robust against a bad index.
+ name := "?"
+ if 0 <= v.Field && v.Field < st.NumFields() {
+ name = st.Field(v.Field).Name()
+ }
+ return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
+}
+
+func (v *Field) String() string {
+ st := v.X.Type().Underlying().(*types.Struct)
+ // Be robust against a bad index.
+ name := "?"
+ if 0 <= v.Field && v.Field < st.NumFields() {
+ name = st.Field(v.Field).Name()
+ }
+ return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
+}
+
+func (v *IndexAddr) String() string {
+ return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
+}
+
+func (v *Index) String() string {
+ return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
+}
+
+func (v *Lookup) String() string {
+ return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
+}
+
+func (v *Range) String() string {
+ return "range " + relName(v.X, v)
+}
+
+func (v *Next) String() string {
+ return "next " + relName(v.Iter, v)
+}
+
+func (v *TypeAssert) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
+}
+
+func (v *Extract) String() string {
+ return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
+}
+
+func (s *Jump) String() string {
+ // Be robust against malformed CFG.
+ block := -1
+ if s.block != nil && len(s.block.Succs) == 1 {
+ block = s.block.Succs[0].Index
+ }
+ return fmt.Sprintf("jump %d", block)
+}
+
+func (s *If) String() string {
+ // Be robust against malformed CFG.
+ tblock, fblock := -1, -1
+ if s.block != nil && len(s.block.Succs) == 2 {
+ tblock = s.block.Succs[0].Index
+ fblock = s.block.Succs[1].Index
+ }
+ return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
+}
+
+func (s *Go) String() string {
+ return printCall(&s.Call, "go ", s)
+}
+
+func (s *Panic) String() string {
+ return "panic " + relName(s.X, s)
+}
+
+func (s *Return) String() string {
+ var b bytes.Buffer
+ b.WriteString("return")
+ for i, r := range s.Results {
+ if i == 0 {
+ b.WriteString(" ")
+ } else {
+ b.WriteString(", ")
+ }
+ b.WriteString(relName(r, s))
+ }
+ return b.String()
+}
+
+func (*RunDefers) String() string {
+ return "rundefers"
+}
+
+func (s *Send) String() string {
+ return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
+}
+
+func (s *Defer) String() string {
+ return printCall(&s.Call, "defer ", s)
+}
+
+func (s *Select) String() string {
+ var b bytes.Buffer
+ for i, st := range s.States {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ if st.Dir == types.RecvOnly {
+ b.WriteString("<-")
+ b.WriteString(relName(st.Chan, s))
+ } else {
+ b.WriteString(relName(st.Chan, s))
+ b.WriteString("<-")
+ b.WriteString(relName(st.Send, s))
+ }
+ }
+ non := ""
+ if !s.Blocking {
+ non = "non"
+ }
+ return fmt.Sprintf("select %sblocking [%s]", non, b.String())
+}
+
+func (s *Store) String() string {
+ return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
+}
+
+func (s *BlankStore) String() string {
+ return fmt.Sprintf("_ = %s", relName(s.Val, s))
+}
+
+func (s *MapUpdate) String() string {
+ return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
+}
+
+func (s *DebugRef) String() string {
+ p := s.Parent().Prog.Fset.Position(s.Pos())
+ var descr interface{}
+ if s.object != nil {
+ descr = s.object // e.g. "var x int"
+ } else {
+ descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
+ }
+ var addr string
+ if s.IsAddr {
+ addr = "address of "
+ }
+ return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
+}
+
+func (p *Package) String() string {
+ return "package " + p.Pkg.Path()
+}
+
+var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
+
+func (p *Package) WriteTo(w io.Writer) (int64, error) {
+ var buf bytes.Buffer
+ WritePackage(&buf, p)
+ n, err := w.Write(buf.Bytes())
+ return int64(n), err
+}
+
+// WritePackage writes to buf a human-readable summary of p.
+func WritePackage(buf *bytes.Buffer, p *Package) {
+ fmt.Fprintf(buf, "%s:\n", p)
+
+ var names []string
+ maxname := 0
+ for name := range p.Members {
+ if l := len(name); l > maxname {
+ maxname = l
+ }
+ names = append(names, name)
+ }
+
+ from := p.Pkg
+ sort.Strings(names)
+ for _, name := range names {
+ switch mem := p.Members[name].(type) {
+ case *NamedConst:
+ fmt.Fprintf(buf, " const %-*s %s = %s\n",
+ maxname, name, mem.Name(), mem.Value.RelString(from))
+
+ case *Function:
+ fmt.Fprintf(buf, " func %-*s %s\n",
+ maxname, name, relType(mem.Type(), from))
+
+ case *Type:
+ fmt.Fprintf(buf, " type %-*s %s\n",
+ maxname, name, relType(mem.Type().Underlying(), from))
+ for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
+ fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from)))
+ }
+
+ case *Global:
+ fmt.Fprintf(buf, " var %-*s %s\n",
+ maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
+ }
+ }
+
+ fmt.Fprintf(buf, "\n")
+}
+
+func commaOk(x bool) string {
+ if x {
+ return ",ok"
+ }
+ return ""
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/sanity.go b/vendor/github.com/golangci/go-tools/ssa/sanity.go
new file mode 100644
index 00000000000..c56b2682c08
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/sanity.go
@@ -0,0 +1,523 @@
+// 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 ssa
+
+// An optional pass for sanity-checking invariants of the SSA representation.
+// Currently it checks CFG invariants but little at the instruction level.
+
+import (
+ "fmt"
+ "go/types"
+ "io"
+ "os"
+ "strings"
+)
+
+type sanity struct {
+ reporter io.Writer
+ fn *Function
+ block *BasicBlock
+ instrs map[Instruction]struct{}
+ insane bool
+}
+
+// sanityCheck performs integrity checking of the SSA representation
+// of the function fn and returns true if it was valid. Diagnostics
+// are written to reporter if non-nil, os.Stderr otherwise. Some
+// diagnostics are only warnings and do not imply a negative result.
+//
+// Sanity-checking is intended to facilitate the debugging of code
+// transformation passes.
+//
+func sanityCheck(fn *Function, reporter io.Writer) bool {
+ if reporter == nil {
+ reporter = os.Stderr
+ }
+ return (&sanity{reporter: reporter}).checkFunction(fn)
+}
+
+// mustSanityCheck is like sanityCheck but panics instead of returning
+// a negative result.
+//
+func mustSanityCheck(fn *Function, reporter io.Writer) {
+ if !sanityCheck(fn, reporter) {
+ fn.WriteTo(os.Stderr)
+ panic("SanityCheck failed")
+ }
+}
+
+func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
+ fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
+ if s.block != nil {
+ fmt.Fprintf(s.reporter, ", block %s", s.block)
+ }
+ io.WriteString(s.reporter, ": ")
+ fmt.Fprintf(s.reporter, format, args...)
+ io.WriteString(s.reporter, "\n")
+}
+
+func (s *sanity) errorf(format string, args ...interface{}) {
+ s.insane = true
+ s.diagnostic("Error", format, args...)
+}
+
+func (s *sanity) warnf(format string, args ...interface{}) {
+ s.diagnostic("Warning", format, args...)
+}
+
+// findDuplicate returns an arbitrary basic block that appeared more
+// than once in blocks, or nil if all were unique.
+func findDuplicate(blocks []*BasicBlock) *BasicBlock {
+ if len(blocks) < 2 {
+ return nil
+ }
+ if blocks[0] == blocks[1] {
+ return blocks[0]
+ }
+ // Slow path:
+ m := make(map[*BasicBlock]bool)
+ for _, b := range blocks {
+ if m[b] {
+ return b
+ }
+ m[b] = true
+ }
+ return nil
+}
+
+func (s *sanity) checkInstr(idx int, instr Instruction) {
+ switch instr := instr.(type) {
+ case *If, *Jump, *Return, *Panic:
+ s.errorf("control flow instruction not at end of block")
+ case *Phi:
+ if idx == 0 {
+ // It suffices to apply this check to just the first phi node.
+ if dup := findDuplicate(s.block.Preds); dup != nil {
+ s.errorf("phi node in block with duplicate predecessor %s", dup)
+ }
+ } else {
+ prev := s.block.Instrs[idx-1]
+ if _, ok := prev.(*Phi); !ok {
+ s.errorf("Phi instruction follows a non-Phi: %T", prev)
+ }
+ }
+ if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
+ s.errorf("phi node has %d edges but %d predecessors", ne, np)
+
+ } else {
+ for i, e := range instr.Edges {
+ if e == nil {
+ s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
+ }
+ }
+ }
+
+ case *Alloc:
+ if !instr.Heap {
+ found := false
+ for _, l := range s.fn.Locals {
+ if l == instr {
+ found = true
+ break
+ }
+ }
+ if !found {
+ s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
+ }
+ }
+
+ case *BinOp:
+ case *Call:
+ case *ChangeInterface:
+ case *ChangeType:
+ case *Convert:
+ if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
+ if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
+ s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
+ }
+ }
+
+ case *Defer:
+ case *Extract:
+ case *Field:
+ case *FieldAddr:
+ case *Go:
+ case *Index:
+ case *IndexAddr:
+ case *Lookup:
+ case *MakeChan:
+ case *MakeClosure:
+ numFree := len(instr.Fn.(*Function).FreeVars)
+ numBind := len(instr.Bindings)
+ if numFree != numBind {
+ s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
+ numBind, instr.Fn, numFree)
+
+ }
+ if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
+ s.errorf("MakeClosure's type includes receiver %s", recv.Type())
+ }
+
+ case *MakeInterface:
+ case *MakeMap:
+ case *MakeSlice:
+ case *MapUpdate:
+ case *Next:
+ case *Range:
+ case *RunDefers:
+ case *Select:
+ case *Send:
+ case *Slice:
+ case *Store:
+ case *TypeAssert:
+ case *UnOp:
+ case *DebugRef:
+ case *BlankStore:
+ case *Sigma:
+ // TODO(adonovan): implement checks.
+ default:
+ panic(fmt.Sprintf("Unknown instruction type: %T", instr))
+ }
+
+ if call, ok := instr.(CallInstruction); ok {
+ if call.Common().Signature() == nil {
+ s.errorf("nil signature: %s", call)
+ }
+ }
+
+ // Check that value-defining instructions have valid types
+ // and a valid referrer list.
+ if v, ok := instr.(Value); ok {
+ t := v.Type()
+ if t == nil {
+ s.errorf("no type: %s = %s", v.Name(), v)
+ } else if t == tRangeIter {
+ // not a proper type; ignore.
+ } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
+ s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
+ }
+ s.checkReferrerList(v)
+ }
+
+ // Untyped constants are legal as instruction Operands(),
+ // for example:
+ // _ = "foo"[0]
+ // or:
+ // if wordsize==64 {...}
+
+ // All other non-Instruction Values can be found via their
+ // enclosing Function or Package.
+}
+
+func (s *sanity) checkFinalInstr(instr Instruction) {
+ switch instr := instr.(type) {
+ case *If:
+ if nsuccs := len(s.block.Succs); nsuccs != 2 {
+ s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
+ return
+ }
+ if s.block.Succs[0] == s.block.Succs[1] {
+ s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
+ return
+ }
+
+ case *Jump:
+ if nsuccs := len(s.block.Succs); nsuccs != 1 {
+ s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
+ return
+ }
+
+ case *Return:
+ if nsuccs := len(s.block.Succs); nsuccs != 0 {
+ s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
+ return
+ }
+ if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
+ s.errorf("%d-ary return in %d-ary function", na, nf)
+ }
+
+ case *Panic:
+ if nsuccs := len(s.block.Succs); nsuccs != 0 {
+ s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
+ return
+ }
+
+ default:
+ s.errorf("non-control flow instruction at end of block")
+ }
+}
+
+func (s *sanity) checkBlock(b *BasicBlock, index int) {
+ s.block = b
+
+ if b.Index != index {
+ s.errorf("block has incorrect Index %d", b.Index)
+ }
+ if b.parent != s.fn {
+ s.errorf("block has incorrect parent %s", b.parent)
+ }
+
+ // Check all blocks are reachable.
+ // (The entry block is always implicitly reachable,
+ // as is the Recover block, if any.)
+ if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
+ s.warnf("unreachable block")
+ if b.Instrs == nil {
+ // Since this block is about to be pruned,
+ // tolerating transient problems in it
+ // simplifies other optimizations.
+ return
+ }
+ }
+
+ // Check predecessor and successor relations are dual,
+ // and that all blocks in CFG belong to same function.
+ for _, a := range b.Preds {
+ found := false
+ for _, bb := range a.Succs {
+ if bb == b {
+ found = true
+ break
+ }
+ }
+ if !found {
+ s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
+ }
+ if a.parent != s.fn {
+ s.errorf("predecessor %s belongs to different function %s", a, a.parent)
+ }
+ }
+ for _, c := range b.Succs {
+ found := false
+ for _, bb := range c.Preds {
+ if bb == b {
+ found = true
+ break
+ }
+ }
+ if !found {
+ s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
+ }
+ if c.parent != s.fn {
+ s.errorf("successor %s belongs to different function %s", c, c.parent)
+ }
+ }
+
+ // Check each instruction is sane.
+ n := len(b.Instrs)
+ if n == 0 {
+ s.errorf("basic block contains no instructions")
+ }
+ var rands [10]*Value // reuse storage
+ for j, instr := range b.Instrs {
+ if instr == nil {
+ s.errorf("nil instruction at index %d", j)
+ continue
+ }
+ if b2 := instr.Block(); b2 == nil {
+ s.errorf("nil Block() for instruction at index %d", j)
+ continue
+ } else if b2 != b {
+ s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
+ continue
+ }
+ if j < n-1 {
+ s.checkInstr(j, instr)
+ } else {
+ s.checkFinalInstr(instr)
+ }
+
+ // Check Instruction.Operands.
+ operands:
+ for i, op := range instr.Operands(rands[:0]) {
+ if op == nil {
+ s.errorf("nil operand pointer %d of %s", i, instr)
+ continue
+ }
+ val := *op
+ if val == nil {
+ continue // a nil operand is ok
+ }
+
+ // Check that "untyped" types only appear on constant operands.
+ if _, ok := (*op).(*Const); !ok {
+ if basic, ok := (*op).Type().(*types.Basic); ok {
+ if basic.Info()&types.IsUntyped != 0 {
+ s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
+ }
+ }
+ }
+
+ // Check that Operands that are also Instructions belong to same function.
+ // TODO(adonovan): also check their block dominates block b.
+ if val, ok := val.(Instruction); ok {
+ if val.Block() == nil {
+ s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val)
+ } else if val.Parent() != s.fn {
+ s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
+ }
+ }
+
+ // Check that each function-local operand of
+ // instr refers back to instr. (NB: quadratic)
+ switch val := val.(type) {
+ case *Const, *Global, *Builtin:
+ continue // not local
+ case *Function:
+ if val.parent == nil {
+ continue // only anon functions are local
+ }
+ }
+
+ // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
+
+ if refs := val.Referrers(); refs != nil {
+ for _, ref := range *refs {
+ if ref == instr {
+ continue operands
+ }
+ }
+ s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
+ } else {
+ s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
+ }
+ }
+ }
+}
+
+func (s *sanity) checkReferrerList(v Value) {
+ refs := v.Referrers()
+ if refs == nil {
+ s.errorf("%s has missing referrer list", v.Name())
+ return
+ }
+ for i, ref := range *refs {
+ if _, ok := s.instrs[ref]; !ok {
+ s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
+ }
+ }
+}
+
+func (s *sanity) checkFunction(fn *Function) bool {
+ // TODO(adonovan): check Function invariants:
+ // - check params match signature
+ // - check transient fields are nil
+ // - warn if any fn.Locals do not appear among block instructions.
+ s.fn = fn
+ if fn.Prog == nil {
+ s.errorf("nil Prog")
+ }
+
+ fn.String() // must not crash
+ fn.RelString(fn.pkg()) // must not crash
+
+ // All functions have a package, except delegates (which are
+ // shared across packages, or duplicated as weak symbols in a
+ // separate-compilation model), and error.Error.
+ if fn.Pkg == nil {
+ if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
+ strings.HasPrefix(fn.Synthetic, "bound ") ||
+ strings.HasPrefix(fn.Synthetic, "thunk ") ||
+ strings.HasSuffix(fn.name, "Error") {
+ // ok
+ } else {
+ s.errorf("nil Pkg")
+ }
+ }
+ if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
+ s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
+ }
+ for i, l := range fn.Locals {
+ if l.Parent() != fn {
+ s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
+ }
+ if l.Heap {
+ s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
+ }
+ }
+ // Build the set of valid referrers.
+ s.instrs = make(map[Instruction]struct{})
+ for _, b := range fn.Blocks {
+ for _, instr := range b.Instrs {
+ s.instrs[instr] = struct{}{}
+ }
+ }
+ for i, p := range fn.Params {
+ if p.Parent() != fn {
+ s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
+ }
+ s.checkReferrerList(p)
+ }
+ for i, fv := range fn.FreeVars {
+ if fv.Parent() != fn {
+ s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
+ }
+ s.checkReferrerList(fv)
+ }
+
+ if fn.Blocks != nil && len(fn.Blocks) == 0 {
+ // Function _had_ blocks (so it's not external) but
+ // they were "optimized" away, even the entry block.
+ s.errorf("Blocks slice is non-nil but empty")
+ }
+ for i, b := range fn.Blocks {
+ if b == nil {
+ s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
+ continue
+ }
+ s.checkBlock(b, i)
+ }
+ if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
+ s.errorf("Recover block is not in Blocks slice")
+ }
+
+ s.block = nil
+ for i, anon := range fn.AnonFuncs {
+ if anon.Parent() != fn {
+ s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
+ }
+ }
+ s.fn = nil
+ return !s.insane
+}
+
+// sanityCheckPackage checks invariants of packages upon creation.
+// It does not require that the package is built.
+// Unlike sanityCheck (for functions), it just panics at the first error.
+func sanityCheckPackage(pkg *Package) {
+ if pkg.Pkg == nil {
+ panic(fmt.Sprintf("Package %s has no Object", pkg))
+ }
+ pkg.String() // must not crash
+
+ for name, mem := range pkg.Members {
+ if name != mem.Name() {
+ panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
+ pkg.Pkg.Path(), mem, mem.Name(), name))
+ }
+ obj := mem.Object()
+ if obj == nil {
+ // This check is sound because fields
+ // {Global,Function}.object have type
+ // types.Object. (If they were declared as
+ // *types.{Var,Func}, we'd have a non-empty
+ // interface containing a nil pointer.)
+
+ continue // not all members have typechecker objects
+ }
+ if obj.Name() != name {
+ if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
+ // Ok. The name of a declared init function varies between
+ // its types.Func ("init") and its ssa.Function ("init#%d").
+ } else {
+ panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
+ pkg.Pkg.Path(), mem, obj.Name(), name))
+ }
+ }
+ if obj.Pos() != mem.Pos() {
+ panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/source.go b/vendor/github.com/golangci/go-tools/ssa/source.go
new file mode 100644
index 00000000000..6d2223edaa3
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/source.go
@@ -0,0 +1,293 @@
+// 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 ssa
+
+// This file defines utilities for working with source positions
+// or source-level named entities ("objects").
+
+// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
+// the originating syntax, as specified.
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// EnclosingFunction returns the function that contains the syntax
+// node denoted by path.
+//
+// Syntax associated with package-level variable specifications is
+// enclosed by the package's init() function.
+//
+// Returns nil if not found; reasons might include:
+// - the node is not enclosed by any function.
+// - the node is within an anonymous function (FuncLit) and
+// its SSA function has not been created yet
+// (pkg.Build() has not yet been called).
+//
+func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
+ // Start with package-level function...
+ fn := findEnclosingPackageLevelFunction(pkg, path)
+ if fn == nil {
+ return nil // not in any function
+ }
+
+ // ...then walk down the nested anonymous functions.
+ n := len(path)
+outer:
+ for i := range path {
+ if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
+ for _, anon := range fn.AnonFuncs {
+ if anon.Pos() == lit.Type.Func {
+ fn = anon
+ continue outer
+ }
+ }
+ // SSA function not found:
+ // - package not yet built, or maybe
+ // - builder skipped FuncLit in dead block
+ // (in principle; but currently the Builder
+ // generates even dead FuncLits).
+ return nil
+ }
+ }
+ return fn
+}
+
+// HasEnclosingFunction returns true if the AST node denoted by path
+// is contained within the declaration of some function or
+// package-level variable.
+//
+// Unlike EnclosingFunction, the behaviour of this function does not
+// depend on whether SSA code for pkg has been built, so it can be
+// used to quickly reject check inputs that will cause
+// EnclosingFunction to fail, prior to SSA building.
+//
+func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
+ return findEnclosingPackageLevelFunction(pkg, path) != nil
+}
+
+// findEnclosingPackageLevelFunction returns the Function
+// corresponding to the package-level function enclosing path.
+//
+func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
+ if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
+ switch decl := path[n-2].(type) {
+ case *ast.GenDecl:
+ if decl.Tok == token.VAR && n >= 3 {
+ // Package-level 'var' initializer.
+ return pkg.init
+ }
+
+ case *ast.FuncDecl:
+ if decl.Recv == nil && decl.Name.Name == "init" {
+ // Explicit init() function.
+ for _, b := range pkg.init.Blocks {
+ for _, instr := range b.Instrs {
+ if instr, ok := instr.(*Call); ok {
+ if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
+ return callee
+ }
+ }
+ }
+ }
+ // Hack: return non-nil when SSA is not yet
+ // built so that HasEnclosingFunction works.
+ return pkg.init
+ }
+ // Declared function/method.
+ return findNamedFunc(pkg, decl.Name.NamePos)
+ }
+ }
+ return nil // not in any function
+}
+
+// findNamedFunc returns the named function whose FuncDecl.Ident is at
+// position pos.
+//
+func findNamedFunc(pkg *Package, pos token.Pos) *Function {
+ // Look at all package members and method sets of named types.
+ // Not very efficient.
+ for _, mem := range pkg.Members {
+ switch mem := mem.(type) {
+ case *Function:
+ if mem.Pos() == pos {
+ return mem
+ }
+ case *Type:
+ mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
+ for i, n := 0, mset.Len(); i < n; i++ {
+ // Don't call Program.Method: avoid creating wrappers.
+ obj := mset.At(i).Obj().(*types.Func)
+ if obj.Pos() == pos {
+ return pkg.values[obj].(*Function)
+ }
+ }
+ }
+ }
+ return nil
+}
+
+// ValueForExpr returns the SSA Value that corresponds to non-constant
+// expression e.
+//
+// It returns nil if no value was found, e.g.
+// - the expression is not lexically contained within f;
+// - f was not built with debug information; or
+// - e is a constant expression. (For efficiency, no debug
+// information is stored for constants. Use
+// go/types.Info.Types[e].Value instead.)
+// - e is a reference to nil or a built-in function.
+// - the value was optimised away.
+//
+// If e is an addressable expression used in an lvalue context,
+// value is the address denoted by e, and isAddr is true.
+//
+// The types of e (or &e, if isAddr) and the result are equal
+// (modulo "untyped" bools resulting from comparisons).
+//
+// (Tip: to find the ssa.Value given a source position, use
+// importer.PathEnclosingInterval to locate the ast.Node, then
+// EnclosingFunction to locate the Function, then ValueForExpr to find
+// the ssa.Value.)
+//
+func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
+ if f.debugInfo() { // (opt)
+ e = unparen(e)
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ if ref, ok := instr.(*DebugRef); ok {
+ if ref.Expr == e {
+ return ref.X, ref.IsAddr
+ }
+ }
+ }
+ }
+ }
+ return
+}
+
+// --- Lookup functions for source-level named entities (types.Objects) ---
+
+// Package returns the SSA Package corresponding to the specified
+// type-checker package object.
+// It returns nil if no such SSA package has been created.
+//
+func (prog *Program) Package(obj *types.Package) *Package {
+ return prog.packages[obj]
+}
+
+// packageLevelValue returns the package-level value corresponding to
+// the specified named object, which may be a package-level const
+// (*Const), var (*Global) or func (*Function) of some package in
+// prog. It returns nil if the object is not found.
+//
+func (prog *Program) packageLevelValue(obj types.Object) Value {
+ if pkg, ok := prog.packages[obj.Pkg()]; ok {
+ return pkg.values[obj]
+ }
+ return nil
+}
+
+// FuncValue returns the concrete Function denoted by the source-level
+// named function obj, or nil if obj denotes an interface method.
+//
+// TODO(adonovan): check the invariant that obj.Type() matches the
+// result's Signature, both in the params/results and in the receiver.
+//
+func (prog *Program) FuncValue(obj *types.Func) *Function {
+ fn, _ := prog.packageLevelValue(obj).(*Function)
+ return fn
+}
+
+// ConstValue returns the SSA Value denoted by the source-level named
+// constant obj.
+//
+func (prog *Program) ConstValue(obj *types.Const) *Const {
+ // TODO(adonovan): opt: share (don't reallocate)
+ // Consts for const objects and constant ast.Exprs.
+
+ // Universal constant? {true,false,nil}
+ if obj.Parent() == types.Universe {
+ return NewConst(obj.Val(), obj.Type())
+ }
+ // Package-level named constant?
+ if v := prog.packageLevelValue(obj); v != nil {
+ return v.(*Const)
+ }
+ return NewConst(obj.Val(), obj.Type())
+}
+
+// VarValue returns the SSA Value that corresponds to a specific
+// identifier denoting the source-level named variable obj.
+//
+// VarValue returns nil if a local variable was not found, perhaps
+// because its package was not built, the debug information was not
+// requested during SSA construction, or the value was optimized away.
+//
+// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
+// and that ident must resolve to obj.
+//
+// pkg is the package enclosing the reference. (A reference to a var
+// always occurs within a function, so we need to know where to find it.)
+//
+// If the identifier is a field selector and its base expression is
+// non-addressable, then VarValue returns the value of that field.
+// For example:
+// func f() struct {x int}
+// f().x // VarValue(x) returns a *Field instruction of type int
+//
+// All other identifiers denote addressable locations (variables).
+// For them, VarValue may return either the variable's address or its
+// value, even when the expression is evaluated only for its value; the
+// situation is reported by isAddr, the second component of the result.
+//
+// If !isAddr, the returned value is the one associated with the
+// specific identifier. For example,
+// var x int // VarValue(x) returns Const 0 here
+// x = 1 // VarValue(x) returns Const 1 here
+//
+// It is not specified whether the value or the address is returned in
+// any particular case, as it may depend upon optimizations performed
+// during SSA code generation, such as registerization, constant
+// folding, avoidance of materialization of subexpressions, etc.
+//
+func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
+ // All references to a var are local to some function, possibly init.
+ fn := EnclosingFunction(pkg, ref)
+ if fn == nil {
+ return // e.g. def of struct field; SSA not built?
+ }
+
+ id := ref[0].(*ast.Ident)
+
+ // Defining ident of a parameter?
+ if id.Pos() == obj.Pos() {
+ for _, param := range fn.Params {
+ if param.Object() == obj {
+ return param, false
+ }
+ }
+ }
+
+ // Other ident?
+ for _, b := range fn.Blocks {
+ for _, instr := range b.Instrs {
+ if dr, ok := instr.(*DebugRef); ok {
+ if dr.Pos() == id.Pos() {
+ return dr.X, dr.IsAddr
+ }
+ }
+ }
+ }
+
+ // Defining ident of package-level var?
+ if v := prog.packageLevelValue(obj); v != nil {
+ return v.(*Global), true
+ }
+
+ return // e.g. debug info not requested, or var optimized away
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/ssa.go b/vendor/github.com/golangci/go-tools/ssa/ssa.go
new file mode 100644
index 00000000000..8825e7b5990
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/ssa.go
@@ -0,0 +1,1745 @@
+// 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 ssa
+
+// This package defines a high-level intermediate representation for
+// Go programs using static single-assignment (SSA) form.
+
+import (
+ "fmt"
+ "go/ast"
+ exact "go/constant"
+ "go/token"
+ "go/types"
+ "sync"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+// A Program is a partial or complete Go program converted to SSA form.
+type Program struct {
+ Fset *token.FileSet // position information for the files of this Program
+ imported map[string]*Package // all importable Packages, keyed by import path
+ packages map[*types.Package]*Package // all loaded Packages, keyed by object
+ mode BuilderMode // set of mode bits for SSA construction
+ MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets
+
+ methodsMu sync.Mutex // guards the following maps:
+ methodSets typeutil.Map // maps type to its concrete methodSet
+ runtimeTypes typeutil.Map // types for which rtypes are needed
+ canon typeutil.Map // type canonicalization map
+ bounds map[*types.Func]*Function // bounds for curried x.Method closures
+ thunks map[selectionKey]*Function // thunks for T.Method expressions
+}
+
+// A Package is a single analyzed Go package containing Members for
+// all package-level functions, variables, constants and types it
+// declares. These may be accessed directly via Members, or via the
+// type-specific accessor methods Func, Type, Var and Const.
+//
+// Members also contains entries for "init" (the synthetic package
+// initializer) and "init#%d", the nth declared init function,
+// and unspecified other things too.
+//
+type Package struct {
+ Prog *Program // the owning program
+ Pkg *types.Package // the corresponding go/types.Package
+ Members map[string]Member // all package members keyed by name (incl. init and init#%d)
+ values map[types.Object]Value // package members (incl. types and methods), keyed by object
+ init *Function // Func("init"); the package's init function
+ debug bool // include full debug info in this package
+
+ // The following fields are set transiently, then cleared
+ // after building.
+ buildOnce sync.Once // ensures package building occurs once
+ ninit int32 // number of init functions
+ info *types.Info // package type information
+ files []*ast.File // package ASTs
+}
+
+// A Member is a member of a Go package, implemented by *NamedConst,
+// *Global, *Function, or *Type; they are created by package-level
+// const, var, func and type declarations respectively.
+//
+type Member interface {
+ Name() string // declared name of the package member
+ String() string // package-qualified name of the package member
+ RelString(*types.Package) string // like String, but relative refs are unqualified
+ Object() types.Object // typechecker's object for this member, if any
+ Pos() token.Pos // position of member's declaration, if known
+ Type() types.Type // type of the package member
+ Token() token.Token // token.{VAR,FUNC,CONST,TYPE}
+ Package() *Package // the containing package
+}
+
+// A Type is a Member of a Package representing a package-level named type.
+type Type struct {
+ object *types.TypeName
+ pkg *Package
+}
+
+// A NamedConst is a Member of a Package representing a package-level
+// named constant.
+//
+// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
+// identifier.
+//
+// NB: a NamedConst is not a Value; it contains a constant Value, which
+// it augments with the name and position of its 'const' declaration.
+//
+type NamedConst struct {
+ object *types.Const
+ Value *Const
+ pkg *Package
+}
+
+// A Value is an SSA value that can be referenced by an instruction.
+type Value interface {
+ // Name returns the name of this value, and determines how
+ // this Value appears when used as an operand of an
+ // Instruction.
+ //
+ // This is the same as the source name for Parameters,
+ // Builtins, Functions, FreeVars, Globals.
+ // For constants, it is a representation of the constant's value
+ // and type. For all other Values this is the name of the
+ // virtual register defined by the instruction.
+ //
+ // The name of an SSA Value is not semantically significant,
+ // and may not even be unique within a function.
+ Name() string
+
+ // If this value is an Instruction, String returns its
+ // disassembled form; otherwise it returns unspecified
+ // human-readable information about the Value, such as its
+ // kind, name and type.
+ String() string
+
+ // Type returns the type of this value. Many instructions
+ // (e.g. IndexAddr) change their behaviour depending on the
+ // types of their operands.
+ Type() types.Type
+
+ // Parent returns the function to which this Value belongs.
+ // It returns nil for named Functions, Builtin, Const and Global.
+ Parent() *Function
+
+ // Referrers returns the list of instructions that have this
+ // value as one of their operands; it may contain duplicates
+ // if an instruction has a repeated operand.
+ //
+ // Referrers actually returns a pointer through which the
+ // caller may perform mutations to the object's state.
+ //
+ // Referrers is currently only defined if Parent()!=nil,
+ // i.e. for the function-local values FreeVar, Parameter,
+ // Functions (iff anonymous) and all value-defining instructions.
+ // It returns nil for named Functions, Builtin, Const and Global.
+ //
+ // Instruction.Operands contains the inverse of this relation.
+ Referrers() *[]Instruction
+
+ // Pos returns the location of the AST token most closely
+ // associated with the operation that gave rise to this value,
+ // or token.NoPos if it was not explicit in the source.
+ //
+ // For each ast.Node type, a particular token is designated as
+ // the closest location for the expression, e.g. the Lparen
+ // for an *ast.CallExpr. This permits a compact but
+ // approximate mapping from Values to source positions for use
+ // in diagnostic messages, for example.
+ //
+ // (Do not use this position to determine which Value
+ // corresponds to an ast.Expr; use Function.ValueForExpr
+ // instead. NB: it requires that the function was built with
+ // debug information.)
+ Pos() token.Pos
+}
+
+// An Instruction is an SSA instruction that computes a new Value or
+// has some effect.
+//
+// An Instruction that defines a value (e.g. BinOp) also implements
+// the Value interface; an Instruction that only has an effect (e.g. Store)
+// does not.
+//
+type Instruction interface {
+ // String returns the disassembled form of this value.
+ //
+ // Examples of Instructions that are Values:
+ // "x + y" (BinOp)
+ // "len([])" (Call)
+ // Note that the name of the Value is not printed.
+ //
+ // Examples of Instructions that are not Values:
+ // "return x" (Return)
+ // "*y = x" (Store)
+ //
+ // (The separation Value.Name() from Value.String() is useful
+ // for some analyses which distinguish the operation from the
+ // value it defines, e.g., 'y = local int' is both an allocation
+ // of memory 'local int' and a definition of a pointer y.)
+ String() string
+
+ // Parent returns the function to which this instruction
+ // belongs.
+ Parent() *Function
+
+ // Block returns the basic block to which this instruction
+ // belongs.
+ Block() *BasicBlock
+
+ // setBlock sets the basic block to which this instruction belongs.
+ setBlock(*BasicBlock)
+
+ // Operands returns the operands of this instruction: the
+ // set of Values it references.
+ //
+ // Specifically, it appends their addresses to rands, a
+ // user-provided slice, and returns the resulting slice,
+ // permitting avoidance of memory allocation.
+ //
+ // The operands are appended in undefined order, but the order
+ // is consistent for a given Instruction; the addresses are
+ // always non-nil but may point to a nil Value. Clients may
+ // store through the pointers, e.g. to effect a value
+ // renaming.
+ //
+ // Value.Referrers is a subset of the inverse of this
+ // relation. (Referrers are not tracked for all types of
+ // Values.)
+ Operands(rands []*Value) []*Value
+
+ // Pos returns the location of the AST token most closely
+ // associated with the operation that gave rise to this
+ // instruction, or token.NoPos if it was not explicit in the
+ // source.
+ //
+ // For each ast.Node type, a particular token is designated as
+ // the closest location for the expression, e.g. the Go token
+ // for an *ast.GoStmt. This permits a compact but approximate
+ // mapping from Instructions to source positions for use in
+ // diagnostic messages, for example.
+ //
+ // (Do not use this position to determine which Instruction
+ // corresponds to an ast.Expr; see the notes for Value.Pos.
+ // This position may be used to determine which non-Value
+ // Instruction corresponds to some ast.Stmts, but not all: If
+ // and Jump instructions have no Pos(), for example.)
+ Pos() token.Pos
+}
+
+// A Node is a node in the SSA value graph. Every concrete type that
+// implements Node is also either a Value, an Instruction, or both.
+//
+// Node contains the methods common to Value and Instruction, plus the
+// Operands and Referrers methods generalized to return nil for
+// non-Instructions and non-Values, respectively.
+//
+// Node is provided to simplify SSA graph algorithms. Clients should
+// use the more specific and informative Value or Instruction
+// interfaces where appropriate.
+//
+type Node interface {
+ // Common methods:
+ String() string
+ Pos() token.Pos
+ Parent() *Function
+
+ // Partial methods:
+ Operands(rands []*Value) []*Value // nil for non-Instructions
+ Referrers() *[]Instruction // nil for non-Values
+}
+
+// Function represents the parameters, results, and code of a function
+// or method.
+//
+// If Blocks is nil, this indicates an external function for which no
+// Go source code is available. In this case, FreeVars and Locals
+// are nil too. Clients performing whole-program analysis must
+// handle external functions specially.
+//
+// Blocks contains the function's control-flow graph (CFG).
+// Blocks[0] is the function entry point; block order is not otherwise
+// semantically significant, though it may affect the readability of
+// the disassembly.
+// To iterate over the blocks in dominance order, use DomPreorder().
+//
+// Recover is an optional second entry point to which control resumes
+// after a recovered panic. The Recover block may contain only a return
+// statement, preceded by a load of the function's named return
+// parameters, if any.
+//
+// A nested function (Parent()!=nil) that refers to one or more
+// lexically enclosing local variables ("free variables") has FreeVars.
+// Such functions cannot be called directly but require a
+// value created by MakeClosure which, via its Bindings, supplies
+// values for these parameters.
+//
+// If the function is a method (Signature.Recv() != nil) then the first
+// element of Params is the receiver parameter.
+//
+// A Go package may declare many functions called "init".
+// For each one, Object().Name() returns "init" but Name() returns
+// "init#1", etc, in declaration order.
+//
+// Pos() returns the declaring ast.FuncLit.Type.Func or the position
+// of the ast.FuncDecl.Name, if the function was explicit in the
+// source. Synthetic wrappers, for which Synthetic != "", may share
+// the same position as the function they wrap.
+// Syntax.Pos() always returns the position of the declaring "func" token.
+//
+// Type() returns the function's Signature.
+//
+type Function struct {
+ name string
+ object types.Object // a declared *types.Func or one of its wrappers
+ method *types.Selection // info about provenance of synthetic methods
+ Signature *types.Signature
+ pos token.Pos
+
+ Synthetic string // provenance of synthetic function; "" for true source functions
+ syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
+ parent *Function // enclosing function if anon; nil if global
+ Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error)
+ Prog *Program // enclosing program
+ Params []*Parameter // function parameters; for methods, includes receiver
+ FreeVars []*FreeVar // free variables whose values must be supplied by closure
+ Locals []*Alloc // local variables of this function
+ Blocks []*BasicBlock // basic blocks of the function; nil => external
+ Recover *BasicBlock // optional; control transfers here after recovered panic
+ AnonFuncs []*Function // anonymous functions directly beneath this one
+ referrers []Instruction // referring instructions (iff Parent() != nil)
+
+ // The following fields are set transiently during building,
+ // then cleared.
+ currentBlock *BasicBlock // where to emit code
+ objects map[types.Object]Value // addresses of local variables
+ namedResults []*Alloc // tuple of named results
+ targets *targets // linked stack of branch targets
+ lblocks map[*ast.Object]*lblock // labelled blocks
+}
+
+// BasicBlock represents an SSA basic block.
+//
+// The final element of Instrs is always an explicit transfer of
+// control (If, Jump, Return, or Panic).
+//
+// A block may contain no Instructions only if it is unreachable,
+// i.e., Preds is nil. Empty blocks are typically pruned.
+//
+// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
+// graph independent of the SSA Value graph: the control-flow graph or
+// CFG. It is illegal for multiple edges to exist between the same
+// pair of blocks.
+//
+// Each BasicBlock is also a node in the dominator tree of the CFG.
+// The tree may be navigated using Idom()/Dominees() and queried using
+// Dominates().
+//
+// The order of Preds and Succs is significant (to Phi and If
+// instructions, respectively).
+//
+type BasicBlock struct {
+ Index int // index of this block within Parent().Blocks
+ Comment string // optional label; no semantic significance
+ parent *Function // parent function
+ Instrs []Instruction // instructions in order
+ Preds, Succs []*BasicBlock // predecessors and successors
+ succs2 [2]*BasicBlock // initial space for Succs
+ dom domInfo // dominator tree info
+ gaps int // number of nil Instrs (transient)
+ rundefers int // number of rundefers (transient)
+}
+
+// Pure values ----------------------------------------
+
+// A FreeVar represents a free variable of the function to which it
+// belongs.
+//
+// FreeVars are used to implement anonymous functions, whose free
+// variables are lexically captured in a closure formed by
+// MakeClosure. The value of such a free var is an Alloc or another
+// FreeVar and is considered a potentially escaping heap address, with
+// pointer type.
+//
+// FreeVars are also used to implement bound method closures. Such a
+// free var represents the receiver value and may be of any type that
+// has concrete methods.
+//
+// Pos() returns the position of the value that was captured, which
+// belongs to an enclosing function.
+//
+type FreeVar struct {
+ name string
+ typ types.Type
+ pos token.Pos
+ parent *Function
+ referrers []Instruction
+
+ // Transiently needed during building.
+ outer Value // the Value captured from the enclosing context.
+}
+
+// A Parameter represents an input parameter of a function.
+//
+type Parameter struct {
+ name string
+ object types.Object // a *types.Var; nil for non-source locals
+ typ types.Type
+ pos token.Pos
+ parent *Function
+ referrers []Instruction
+}
+
+// A Const represents the value of a constant expression.
+//
+// The underlying type of a constant may be any boolean, numeric, or
+// string type. In addition, a Const may represent the nil value of
+// any reference type---interface, map, channel, pointer, slice, or
+// function---but not "untyped nil".
+//
+// All source-level constant expressions are represented by a Const
+// of the same type and value.
+//
+// Value holds the exact value of the constant, independent of its
+// Type(), using the same representation as package go/exact uses for
+// constants, or nil for a typed nil value.
+//
+// Pos() returns token.NoPos.
+//
+// Example printed form:
+// 42:int
+// "hello":untyped string
+// 3+4i:MyComplex
+//
+type Const struct {
+ typ types.Type
+ Value exact.Value
+}
+
+// A Global is a named Value holding the address of a package-level
+// variable.
+//
+// Pos() returns the position of the ast.ValueSpec.Names[*]
+// identifier.
+//
+type Global struct {
+ name string
+ object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
+ typ types.Type
+ pos token.Pos
+
+ Pkg *Package
+}
+
+// A Builtin represents a specific use of a built-in function, e.g. len.
+//
+// Builtins are immutable values. Builtins do not have addresses.
+// Builtins can only appear in CallCommon.Func.
+//
+// Name() indicates the function: one of the built-in functions from the
+// Go spec (excluding "make" and "new") or one of these ssa-defined
+// intrinsics:
+//
+// // wrapnilchk returns ptr if non-nil, panics otherwise.
+// // (For use in indirection wrappers.)
+// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
+//
+// Object() returns a *types.Builtin for built-ins defined by the spec,
+// nil for others.
+//
+// Type() returns a *types.Signature representing the effective
+// signature of the built-in for this call.
+//
+type Builtin struct {
+ name string
+ sig *types.Signature
+}
+
+// Value-defining instructions ----------------------------------------
+
+// The Alloc instruction reserves space for a variable of the given type,
+// zero-initializes it, and yields its address.
+//
+// Alloc values are always addresses, and have pointer types, so the
+// type of the allocated variable is actually
+// Type().Underlying().(*types.Pointer).Elem().
+//
+// If Heap is false, Alloc allocates space in the function's
+// activation record (frame); we refer to an Alloc(Heap=false) as a
+// "local" alloc. Each local Alloc returns the same address each time
+// it is executed within the same activation; the space is
+// re-initialized to zero.
+//
+// If Heap is true, Alloc allocates space in the heap; we
+// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc
+// returns a different address each time it is executed.
+//
+// When Alloc is applied to a channel, map or slice type, it returns
+// the address of an uninitialized (nil) reference of that kind; store
+// the result of MakeSlice, MakeMap or MakeChan in that location to
+// instantiate these types.
+//
+// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
+// or the ast.CallExpr.Rparen for a call to new() or for a call that
+// allocates a varargs slice.
+//
+// Example printed form:
+// t0 = local int
+// t1 = new int
+//
+type Alloc struct {
+ register
+ Comment string
+ Heap bool
+ index int // dense numbering; for lifting
+}
+
+var _ Instruction = (*Sigma)(nil)
+var _ Value = (*Sigma)(nil)
+
+type Sigma struct {
+ register
+ X Value
+ Branch bool
+}
+
+func (p *Sigma) Value() Value {
+ v := p.X
+ for {
+ sigma, ok := v.(*Sigma)
+ if !ok {
+ break
+ }
+ v = sigma
+ }
+ return v
+}
+
+func (p *Sigma) String() string {
+ return fmt.Sprintf("σ [%s.%t]", relName(p.X, p), p.Branch)
+}
+
+// The Phi instruction represents an SSA φ-node, which combines values
+// that differ across incoming control-flow edges and yields a new
+// value. Within a block, all φ-nodes must appear before all non-φ
+// nodes.
+//
+// Pos() returns the position of the && or || for short-circuit
+// control-flow joins, or that of the *Alloc for φ-nodes inserted
+// during SSA renaming.
+//
+// Example printed form:
+// t2 = phi [0: t0, 1: t1]
+//
+type Phi struct {
+ register
+ Comment string // a hint as to its purpose
+ Edges []Value // Edges[i] is value for Block().Preds[i]
+}
+
+// The Call instruction represents a function or method call.
+//
+// The Call instruction yields the function result if there is exactly
+// one. Otherwise it returns a tuple, the components of which are
+// accessed via Extract.
+//
+// See CallCommon for generic function call documentation.
+//
+// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
+//
+// Example printed form:
+// t2 = println(t0, t1)
+// t4 = t3()
+// t7 = invoke t5.Println(...t6)
+//
+type Call struct {
+ register
+ Call CallCommon
+}
+
+// The BinOp instruction yields the result of binary operation X Op Y.
+//
+// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
+//
+// Example printed form:
+// t1 = t0 + 1:int
+//
+type BinOp struct {
+ register
+ // One of:
+ // ADD SUB MUL QUO REM + - * / %
+ // AND OR XOR SHL SHR AND_NOT & | ^ << >> &~
+ // EQL LSS GTR NEQ LEQ GEQ == != < <= < >=
+ Op token.Token
+ X, Y Value
+}
+
+// The UnOp instruction yields the result of Op X.
+// ARROW is channel receive.
+// MUL is pointer indirection (load).
+// XOR is bitwise complement.
+// SUB is negation.
+// NOT is logical negation.
+//
+// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
+// and a boolean indicating the success of the receive. The
+// components of the tuple are accessed using Extract.
+//
+// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
+// For receive operations (ARROW) implicit in ranging over a channel,
+// Pos() returns the ast.RangeStmt.For.
+// For implicit memory loads (STAR), Pos() returns the position of the
+// most closely associated source-level construct; the details are not
+// specified.
+//
+// Example printed form:
+// t0 = *x
+// t2 = <-t1,ok
+//
+type UnOp struct {
+ register
+ Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
+ X Value
+ CommaOk bool
+}
+
+// The ChangeType instruction applies to X a value-preserving type
+// change to Type().
+//
+// Type changes are permitted:
+// - between a named type and its underlying type.
+// - between two named types of the same underlying type.
+// - between (possibly named) pointers to identical base types.
+// - from a bidirectional channel to a read- or write-channel,
+// optionally adding/removing a name.
+//
+// This operation cannot fail dynamically.
+//
+// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
+// from an explicit conversion in the source.
+//
+// Example printed form:
+// t1 = changetype *int <- IntPtr (t0)
+//
+type ChangeType struct {
+ register
+ X Value
+}
+
+// The Convert instruction yields the conversion of value X to type
+// Type(). One or both of those types is basic (but possibly named).
+//
+// A conversion may change the value and representation of its operand.
+// Conversions are permitted:
+// - between real numeric types.
+// - between complex numeric types.
+// - between string and []byte or []rune.
+// - between pointers and unsafe.Pointer.
+// - between unsafe.Pointer and uintptr.
+// - from (Unicode) integer to (UTF-8) string.
+// A conversion may imply a type name change also.
+//
+// This operation cannot fail dynamically.
+//
+// Conversions of untyped string/number/bool constants to a specific
+// representation are eliminated during SSA construction.
+//
+// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
+// from an explicit conversion in the source.
+//
+// Example printed form:
+// t1 = convert []byte <- string (t0)
+//
+type Convert struct {
+ register
+ X Value
+}
+
+// ChangeInterface constructs a value of one interface type from a
+// value of another interface type known to be assignable to it.
+// This operation cannot fail.
+//
+// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
+// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
+// instruction arose from an explicit e.(T) operation; or token.NoPos
+// otherwise.
+//
+// Example printed form:
+// t1 = change interface interface{} <- I (t0)
+//
+type ChangeInterface struct {
+ register
+ X Value
+}
+
+// MakeInterface constructs an instance of an interface type from a
+// value of a concrete type.
+//
+// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
+// of X, and Program.Method(m) to find the implementation of a method.
+//
+// To construct the zero value of an interface type T, use:
+// NewConst(exact.MakeNil(), T, pos)
+//
+// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
+// from an explicit conversion in the source.
+//
+// Example printed form:
+// t1 = make interface{} <- int (42:int)
+// t2 = make Stringer <- t0
+//
+type MakeInterface struct {
+ register
+ X Value
+}
+
+// The MakeClosure instruction yields a closure value whose code is
+// Fn and whose free variables' values are supplied by Bindings.
+//
+// Type() returns a (possibly named) *types.Signature.
+//
+// Pos() returns the ast.FuncLit.Type.Func for a function literal
+// closure or the ast.SelectorExpr.Sel for a bound method closure.
+//
+// Example printed form:
+// t0 = make closure anon@1.2 [x y z]
+// t1 = make closure bound$(main.I).add [i]
+//
+type MakeClosure struct {
+ register
+ Fn Value // always a *Function
+ Bindings []Value // values for each free variable in Fn.FreeVars
+}
+
+// The MakeMap instruction creates a new hash-table-based map object
+// and yields a value of kind map.
+//
+// Type() returns a (possibly named) *types.Map.
+//
+// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
+// the ast.CompositeLit.Lbrack if created by a literal.
+//
+// Example printed form:
+// t1 = make map[string]int t0
+// t1 = make StringIntMap t0
+//
+type MakeMap struct {
+ register
+ Reserve Value // initial space reservation; nil => default
+}
+
+// The MakeChan instruction creates a new channel object and yields a
+// value of kind chan.
+//
+// Type() returns a (possibly named) *types.Chan.
+//
+// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
+// created it.
+//
+// Example printed form:
+// t0 = make chan int 0
+// t0 = make IntChan 0
+//
+type MakeChan struct {
+ register
+ Size Value // int; size of buffer; zero => synchronous.
+}
+
+// The MakeSlice instruction yields a slice of length Len backed by a
+// newly allocated array of length Cap.
+//
+// Both Len and Cap must be non-nil Values of integer type.
+//
+// (Alloc(types.Array) followed by Slice will not suffice because
+// Alloc can only create arrays of constant length.)
+//
+// Type() returns a (possibly named) *types.Slice.
+//
+// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
+// created it.
+//
+// Example printed form:
+// t1 = make []string 1:int t0
+// t1 = make StringSlice 1:int t0
+//
+type MakeSlice struct {
+ register
+ Len Value
+ Cap Value
+}
+
+// The Slice instruction yields a slice of an existing string, slice
+// or *array X between optional integer bounds Low and High.
+//
+// Dynamically, this instruction panics if X evaluates to a nil *array
+// pointer.
+//
+// Type() returns string if the type of X was string, otherwise a
+// *types.Slice with the same element type as X.
+//
+// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
+// operation, the ast.CompositeLit.Lbrace if created by a literal, or
+// NoPos if not explicit in the source (e.g. a variadic argument slice).
+//
+// Example printed form:
+// t1 = slice t0[1:]
+//
+type Slice struct {
+ register
+ X Value // slice, string, or *array
+ Low, High, Max Value // each may be nil
+}
+
+// The FieldAddr instruction yields the address of Field of *struct X.
+//
+// The field is identified by its index within the field list of the
+// struct type of X.
+//
+// Dynamically, this instruction panics if X evaluates to a nil
+// pointer.
+//
+// Type() returns a (possibly named) *types.Pointer.
+//
+// Pos() returns the position of the ast.SelectorExpr.Sel for the
+// field, if explicit in the source.
+//
+// Example printed form:
+// t1 = &t0.name [#1]
+//
+type FieldAddr struct {
+ register
+ X Value // *struct
+ Field int // index into X.Type().Deref().(*types.Struct).Fields
+}
+
+// The Field instruction yields the Field of struct X.
+//
+// The field is identified by its index within the field list of the
+// struct type of X; by using numeric indices we avoid ambiguity of
+// package-local identifiers and permit compact representations.
+//
+// Pos() returns the position of the ast.SelectorExpr.Sel for the
+// field, if explicit in the source.
+//
+// Example printed form:
+// t1 = t0.name [#1]
+//
+type Field struct {
+ register
+ X Value // struct
+ Field int // index into X.Type().(*types.Struct).Fields
+}
+
+// The IndexAddr instruction yields the address of the element at
+// index Index of collection X. Index is an integer expression.
+//
+// The elements of maps and strings are not addressable; use Lookup or
+// MapUpdate instead.
+//
+// Dynamically, this instruction panics if X evaluates to a nil *array
+// pointer.
+//
+// Type() returns a (possibly named) *types.Pointer.
+//
+// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
+// explicit in the source.
+//
+// Example printed form:
+// t2 = &t0[t1]
+//
+type IndexAddr struct {
+ register
+ X Value // slice or *array,
+ Index Value // numeric index
+}
+
+// The Index instruction yields element Index of array X.
+//
+// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
+// explicit in the source.
+//
+// Example printed form:
+// t2 = t0[t1]
+//
+type Index struct {
+ register
+ X Value // array
+ Index Value // integer index
+}
+
+// The Lookup instruction yields element Index of collection X, a map
+// or string. Index is an integer expression if X is a string or the
+// appropriate key type if X is a map.
+//
+// If CommaOk, the result is a 2-tuple of the value above and a
+// boolean indicating the result of a map membership test for the key.
+// The components of the tuple are accessed using Extract.
+//
+// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
+//
+// Example printed form:
+// t2 = t0[t1]
+// t5 = t3[t4],ok
+//
+type Lookup struct {
+ register
+ X Value // string or map
+ Index Value // numeric or key-typed index
+ CommaOk bool // return a value,ok pair
+}
+
+// SelectState is a helper for Select.
+// It represents one goal state and its corresponding communication.
+//
+type SelectState struct {
+ Dir types.ChanDir // direction of case (SendOnly or RecvOnly)
+ Chan Value // channel to use (for send or receive)
+ Send Value // value to send (for send)
+ Pos token.Pos // position of token.ARROW
+ DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
+}
+
+// The Select instruction tests whether (or blocks until) one
+// of the specified sent or received states is entered.
+//
+// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator.
+}
+
+// The TypeAssert instruction tests whether interface value X has type
+// AssertedType.
+//
+// If !CommaOk, on success it returns v, the result of the conversion
+// (defined below); on failure it panics.
+//
+// If CommaOk: on success it returns a pair (v, true) where v is the
+// result of the conversion; on failure it returns (z, false) where z
+// is AssertedType's zero value. The components of the pair must be
+// accessed using the Extract instruction.
+//
+// If AssertedType is a concrete type, TypeAssert checks whether the
+// dynamic type in interface X is equal to it, and if so, the result
+// of the conversion is a copy of the value in the interface.
+//
+// If AssertedType is an interface, TypeAssert checks whether the
+// dynamic type of the interface is assignable to it, and if so, the
+// result of the conversion is a copy of the interface value X.
+// If AssertedType is a superinterface of X.Type(), the operation will
+// fail iff the operand is nil. (Contrast with ChangeInterface, which
+// performs no nil-check.)
+//
+// Type() reflects the actual type of the result, possibly a
+// 2-types.Tuple; AssertedType is the asserted type.
+//
+// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
+// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
+// instruction arose from an explicit e.(T) operation; or the
+// ast.CaseClause.Case if the instruction arose from a case of a
+// type-switch statement.
+//
+// Example printed form:
+// t1 = typeassert t0.(int)
+// t3 = typeassert,ok t2.(T)
+//
+type TypeAssert struct {
+ register
+ X Value
+ AssertedType types.Type
+ CommaOk bool
+}
+
+// The Extract instruction yields component Index of Tuple.
+//
+// This is used to access the results of instructions with multiple
+// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
+// IndexExpr(Map).
+//
+// Example printed form:
+// t1 = extract t0 #1
+//
+type Extract struct {
+ register
+ Tuple Value
+ Index int
+}
+
+// Instructions executed for effect. They do not yield a value. --------------------
+
+// The Jump instruction transfers control to the sole successor of its
+// owning block.
+//
+// A Jump must be the last instruction of its containing BasicBlock.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// jump done
+//
+type Jump struct {
+ anInstruction
+}
+
+// The If instruction transfers control to one of the two successors
+// of its owning block, depending on the boolean Cond: the first if
+// true, the second if false.
+//
+// An If instruction must be the last instruction of its containing
+// BasicBlock.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// if t0 goto done else body
+//
+type If struct {
+ anInstruction
+ Cond Value
+}
+
+// The Return instruction returns values and control back to the calling
+// function.
+//
+// len(Results) is always equal to the number of results in the
+// function's signature.
+//
+// If len(Results) > 1, Return returns a tuple value with the specified
+// components which the caller must access using Extract instructions.
+//
+// There is no instruction to return a ready-made tuple like those
+// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
+// a tail-call to a function with multiple result parameters.
+//
+// Return must be the last instruction of its containing BasicBlock.
+// Such a block has no successors.
+//
+// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
+//
+// Example printed form:
+// return
+// return nil:I, 2:int
+//
+type Return struct {
+ anInstruction
+ Results []Value
+ pos token.Pos
+}
+
+// The RunDefers instruction pops and invokes the entire stack of
+// procedure calls pushed by Defer instructions in this function.
+//
+// It is legal to encounter multiple 'rundefers' instructions in a
+// single control-flow path through a function; this is useful in
+// the combined init() function, for example.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// rundefers
+//
+type RunDefers struct {
+ anInstruction
+}
+
+// The Panic instruction initiates a panic with value X.
+//
+// A Panic instruction must be the last instruction of its containing
+// BasicBlock, which must have no successors.
+//
+// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
+// they are treated as calls to a built-in function.
+//
+// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
+// in the source.
+//
+// Example printed form:
+// panic t0
+//
+type Panic struct {
+ anInstruction
+ X Value // an interface{}
+ pos token.Pos
+}
+
+// The Go instruction creates a new goroutine and calls the specified
+// function within it.
+//
+// See CallCommon for generic function call documentation.
+//
+// Pos() returns the ast.GoStmt.Go.
+//
+// Example printed form:
+// go println(t0, t1)
+// go t3()
+// go invoke t5.Println(...t6)
+//
+type Go struct {
+ anInstruction
+ Call CallCommon
+ pos token.Pos
+}
+
+// The Defer instruction pushes the specified call onto a stack of
+// functions to be called by a RunDefers instruction or by a panic.
+//
+// See CallCommon for generic function call documentation.
+//
+// Pos() returns the ast.DeferStmt.Defer.
+//
+// Example printed form:
+// defer println(t0, t1)
+// defer t3()
+// defer invoke t5.Println(...t6)
+//
+type Defer struct {
+ anInstruction
+ Call CallCommon
+ pos token.Pos
+}
+
+// The Send instruction sends X on channel Chan.
+//
+// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
+//
+// Example printed form:
+// send t0 <- t1
+//
+type Send struct {
+ anInstruction
+ Chan, X Value
+ pos token.Pos
+}
+
+// The Store instruction stores Val at address Addr.
+// Stores can be of arbitrary types.
+//
+// Pos() returns the position of the source-level construct most closely
+// associated with the memory store operation.
+// Since implicit memory stores are numerous and varied and depend upon
+// implementation choices, the details are not specified.
+//
+// Example printed form:
+// *x = y
+//
+type Store struct {
+ anInstruction
+ Addr Value
+ Val Value
+ pos token.Pos
+}
+
+// The BlankStore instruction is emitted for assignments to the blank
+// identifier.
+//
+// BlankStore is a pseudo-instruction: it has no dynamic effect.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// _ = t0
+//
+type BlankStore struct {
+ anInstruction
+ Val Value
+}
+
+// The MapUpdate instruction updates the association of Map[Key] to
+// Value.
+//
+// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
+// if explicit in the source.
+//
+// Example printed form:
+// t0[t1] = t2
+//
+type MapUpdate struct {
+ anInstruction
+ Map Value
+ Key Value
+ Value Value
+ pos token.Pos
+}
+
+// A DebugRef instruction maps a source-level expression Expr to the
+// SSA value X that represents the value (!IsAddr) or address (IsAddr)
+// of that expression.
+//
+// DebugRef is a pseudo-instruction: it has no dynamic effect.
+//
+// Pos() returns Expr.Pos(), the start position of the source-level
+// expression. This is not the same as the "designated" token as
+// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
+// position of the ("designated") Lparen token.
+//
+// If Expr is an *ast.Ident denoting a var or func, Object() returns
+// the object; though this information can be obtained from the type
+// checker, including it here greatly facilitates debugging.
+// For non-Ident expressions, Object() returns nil.
+//
+// DebugRefs are generated only for functions built with debugging
+// enabled; see Package.SetDebugMode() and the GlobalDebug builder
+// mode flag.
+//
+// DebugRefs are not emitted for ast.Idents referring to constants or
+// predeclared identifiers, since they are trivial and numerous.
+// Nor are they emitted for ast.ParenExprs.
+//
+// (By representing these as instructions, rather than out-of-band,
+// consistency is maintained during transformation passes by the
+// ordinary SSA renaming machinery.)
+//
+// Example printed form:
+// ; *ast.CallExpr @ 102:9 is t5
+// ; var x float64 @ 109:72 is x
+// ; address of *ast.CompositeLit @ 216:10 is t0
+//
+type DebugRef struct {
+ anInstruction
+ Expr ast.Expr // the referring expression (never *ast.ParenExpr)
+ object types.Object // the identity of the source var/func
+ IsAddr bool // Expr is addressable and X is the address it denotes
+ X Value // the value or address of Expr
+}
+
+// Embeddable mix-ins and helpers for common parts of other structs. -----------
+
+// register is a mix-in embedded by all SSA values that are also
+// instructions, i.e. virtual registers, and provides a uniform
+// implementation of most of the Value interface: Value.Name() is a
+// numbered register (e.g. "t0"); the other methods are field accessors.
+//
+// Temporary names are automatically assigned to each register on
+// completion of building a function in SSA form.
+//
+// Clients must not assume that the 'id' value (and the Name() derived
+// from it) is unique within a function. As always in this API,
+// semantics are determined only by identity; names exist only to
+// facilitate debugging.
+//
+type register struct {
+ anInstruction
+ num int // "name" of virtual register, e.g. "t0". Not guaranteed unique.
+ typ types.Type // type of virtual register
+ pos token.Pos // position of source expression, or NoPos
+ referrers []Instruction
+}
+
+// anInstruction is a mix-in embedded by all Instructions.
+// It provides the implementations of the Block and setBlock methods.
+type anInstruction struct {
+ block *BasicBlock // the basic block of this instruction
+}
+
+// CallCommon is contained by Go, Defer and Call to hold the
+// common parts of a function or method call.
+//
+// Each CallCommon exists in one of two modes, function call and
+// interface method invocation, or "call" and "invoke" for short.
+//
+// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
+// represents an ordinary function call of the value in Value,
+// which may be a *Builtin, a *Function or any other value of kind
+// 'func'.
+//
+// Value may be one of:
+// (a) a *Function, indicating a statically dispatched call
+// to a package-level function, an anonymous function, or
+// a method of a named type.
+// (b) a *MakeClosure, indicating an immediately applied
+// function literal with free variables.
+// (c) a *Builtin, indicating a statically dispatched call
+// to a built-in function.
+// (d) any other value, indicating a dynamically dispatched
+// function call.
+// StaticCallee returns the identity of the callee in cases
+// (a) and (b), nil otherwise.
+//
+// Args contains the arguments to the call. If Value is a method,
+// Args[0] contains the receiver parameter.
+//
+// Example printed form:
+// t2 = println(t0, t1)
+// go t3()
+// defer t5(...t6)
+//
+// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
+// represents a dynamically dispatched call to an interface method.
+// In this mode, Value is the interface value and Method is the
+// interface's abstract method. Note: an abstract method may be
+// shared by multiple interfaces due to embedding; Value.Type()
+// provides the specific interface used for this call.
+//
+// Value is implicitly supplied to the concrete method implementation
+// as the receiver parameter; in other words, Args[0] holds not the
+// receiver but the first true argument.
+//
+// Example printed form:
+// t1 = invoke t0.String()
+// go invoke t3.Run(t2)
+// defer invoke t4.Handle(...t5)
+//
+// For all calls to variadic functions (Signature().Variadic()),
+// the last element of Args is a slice.
+//
+type CallCommon struct {
+ Value Value // receiver (invoke mode) or func value (call mode)
+ Method *types.Func // abstract method (invoke mode)
+ Args []Value // actual parameters (in static method call, includes receiver)
+ pos token.Pos // position of CallExpr.Lparen, iff explicit in source
+}
+
+// IsInvoke returns true if this call has "invoke" (not "call") mode.
+func (c *CallCommon) IsInvoke() bool {
+ return c.Method != nil
+}
+
+func (c *CallCommon) Pos() token.Pos { return c.pos }
+
+// Signature returns the signature of the called function.
+//
+// For an "invoke"-mode call, the signature of the interface method is
+// returned.
+//
+// In either "call" or "invoke" mode, if the callee is a method, its
+// receiver is represented by sig.Recv, not sig.Params().At(0).
+//
+func (c *CallCommon) Signature() *types.Signature {
+ if c.Method != nil {
+ return c.Method.Type().(*types.Signature)
+ }
+ return c.Value.Type().Underlying().(*types.Signature)
+}
+
+// StaticCallee returns the callee if this is a trivially static
+// "call"-mode call to a function.
+func (c *CallCommon) StaticCallee() *Function {
+ switch fn := c.Value.(type) {
+ case *Function:
+ return fn
+ case *MakeClosure:
+ return fn.Fn.(*Function)
+ }
+ return nil
+}
+
+// Description returns a description of the mode of this call suitable
+// for a user interface, e.g., "static method call".
+func (c *CallCommon) Description() string {
+ switch fn := c.Value.(type) {
+ case *Builtin:
+ return "built-in function call"
+ case *MakeClosure:
+ return "static function closure call"
+ case *Function:
+ if fn.Signature.Recv() != nil {
+ return "static method call"
+ }
+ return "static function call"
+ }
+ if c.IsInvoke() {
+ return "dynamic method call" // ("invoke" mode)
+ }
+ return "dynamic function call"
+}
+
+// The CallInstruction interface, implemented by *Go, *Defer and *Call,
+// exposes the common parts of function-calling instructions,
+// yet provides a way back to the Value defined by *Call alone.
+//
+type CallInstruction interface {
+ Instruction
+ Common() *CallCommon // returns the common parts of the call
+ Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer)
+}
+
+func (s *Call) Common() *CallCommon { return &s.Call }
+func (s *Defer) Common() *CallCommon { return &s.Call }
+func (s *Go) Common() *CallCommon { return &s.Call }
+
+func (s *Call) Value() *Call { return s }
+func (s *Defer) Value() *Call { return nil }
+func (s *Go) Value() *Call { return nil }
+
+func (v *Builtin) Type() types.Type { return v.sig }
+func (v *Builtin) Name() string { return v.name }
+func (*Builtin) Referrers() *[]Instruction { return nil }
+func (v *Builtin) Pos() token.Pos { return token.NoPos }
+func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) }
+func (v *Builtin) Parent() *Function { return nil }
+
+func (v *FreeVar) Type() types.Type { return v.typ }
+func (v *FreeVar) Name() string { return v.name }
+func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
+func (v *FreeVar) Pos() token.Pos { return v.pos }
+func (v *FreeVar) Parent() *Function { return v.parent }
+
+func (v *Global) Type() types.Type { return v.typ }
+func (v *Global) Name() string { return v.name }
+func (v *Global) Parent() *Function { return nil }
+func (v *Global) Pos() token.Pos { return v.pos }
+func (v *Global) Referrers() *[]Instruction { return nil }
+func (v *Global) Token() token.Token { return token.VAR }
+func (v *Global) Object() types.Object { return v.object }
+func (v *Global) String() string { return v.RelString(nil) }
+func (v *Global) Package() *Package { return v.Pkg }
+func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
+
+func (v *Function) Name() string { return v.name }
+func (v *Function) Type() types.Type { return v.Signature }
+func (v *Function) Pos() token.Pos { return v.pos }
+func (v *Function) Token() token.Token { return token.FUNC }
+func (v *Function) Object() types.Object { return v.object }
+func (v *Function) String() string { return v.RelString(nil) }
+func (v *Function) Package() *Package { return v.Pkg }
+func (v *Function) Parent() *Function { return v.parent }
+func (v *Function) Referrers() *[]Instruction {
+ if v.parent != nil {
+ return &v.referrers
+ }
+ return nil
+}
+
+func (v *Parameter) Type() types.Type { return v.typ }
+func (v *Parameter) Name() string { return v.name }
+func (v *Parameter) Object() types.Object { return v.object }
+func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
+func (v *Parameter) Pos() token.Pos { return v.pos }
+func (v *Parameter) Parent() *Function { return v.parent }
+
+func (v *Alloc) Type() types.Type { return v.typ }
+func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
+func (v *Alloc) Pos() token.Pos { return v.pos }
+
+func (v *register) Type() types.Type { return v.typ }
+func (v *register) setType(typ types.Type) { v.typ = typ }
+func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) }
+func (v *register) setNum(num int) { v.num = num }
+func (v *register) Referrers() *[]Instruction { return &v.referrers }
+func (v *register) Pos() token.Pos { return v.pos }
+func (v *register) setPos(pos token.Pos) { v.pos = pos }
+
+func (v *anInstruction) Parent() *Function { return v.block.parent }
+func (v *anInstruction) Block() *BasicBlock { return v.block }
+func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
+func (v *anInstruction) Referrers() *[]Instruction { return nil }
+
+func (t *Type) Name() string { return t.object.Name() }
+func (t *Type) Pos() token.Pos { return t.object.Pos() }
+func (t *Type) Type() types.Type { return t.object.Type() }
+func (t *Type) Token() token.Token { return token.TYPE }
+func (t *Type) Object() types.Object { return t.object }
+func (t *Type) String() string { return t.RelString(nil) }
+func (t *Type) Package() *Package { return t.pkg }
+func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
+
+func (c *NamedConst) Name() string { return c.object.Name() }
+func (c *NamedConst) Pos() token.Pos { return c.object.Pos() }
+func (c *NamedConst) String() string { return c.RelString(nil) }
+func (c *NamedConst) Type() types.Type { return c.object.Type() }
+func (c *NamedConst) Token() token.Token { return token.CONST }
+func (c *NamedConst) Object() types.Object { return c.object }
+func (c *NamedConst) Package() *Package { return c.pkg }
+func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
+
+// Func returns the package-level function of the specified name,
+// or nil if not found.
+//
+func (p *Package) Func(name string) (f *Function) {
+ f, _ = p.Members[name].(*Function)
+ return
+}
+
+// Var returns the package-level variable of the specified name,
+// or nil if not found.
+//
+func (p *Package) Var(name string) (g *Global) {
+ g, _ = p.Members[name].(*Global)
+ return
+}
+
+// Const returns the package-level constant of the specified name,
+// or nil if not found.
+//
+func (p *Package) Const(name string) (c *NamedConst) {
+ c, _ = p.Members[name].(*NamedConst)
+ return
+}
+
+// Type returns the package-level type of the specified name,
+// or nil if not found.
+//
+func (p *Package) Type(name string) (t *Type) {
+ t, _ = p.Members[name].(*Type)
+ return
+}
+
+func (v *Call) Pos() token.Pos { return v.Call.pos }
+func (s *Defer) Pos() token.Pos { return s.pos }
+func (s *Go) Pos() token.Pos { return s.pos }
+func (s *MapUpdate) Pos() token.Pos { return s.pos }
+func (s *Panic) Pos() token.Pos { return s.pos }
+func (s *Return) Pos() token.Pos { return s.pos }
+func (s *Send) Pos() token.Pos { return s.pos }
+func (s *Store) Pos() token.Pos { return s.pos }
+func (s *BlankStore) Pos() token.Pos { return token.NoPos }
+func (s *If) Pos() token.Pos { return token.NoPos }
+func (s *Jump) Pos() token.Pos { return token.NoPos }
+func (s *RunDefers) Pos() token.Pos { return token.NoPos }
+func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() }
+
+// Operands.
+
+func (v *Alloc) Operands(rands []*Value) []*Value {
+ return rands
+}
+
+func (v *BinOp) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Y)
+}
+
+func (c *CallCommon) Operands(rands []*Value) []*Value {
+ rands = append(rands, &c.Value)
+ for i := range c.Args {
+ rands = append(rands, &c.Args[i])
+ }
+ return rands
+}
+
+func (s *Go) Operands(rands []*Value) []*Value {
+ return s.Call.Operands(rands)
+}
+
+func (s *Call) Operands(rands []*Value) []*Value {
+ return s.Call.Operands(rands)
+}
+
+func (s *Defer) Operands(rands []*Value) []*Value {
+ return s.Call.Operands(rands)
+}
+
+func (v *ChangeInterface) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *ChangeType) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *Convert) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (s *DebugRef) Operands(rands []*Value) []*Value {
+ return append(rands, &s.X)
+}
+
+func (v *Extract) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Tuple)
+}
+
+func (v *Field) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *FieldAddr) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (s *If) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Cond)
+}
+
+func (v *Index) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Index)
+}
+
+func (v *IndexAddr) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Index)
+}
+
+func (*Jump) Operands(rands []*Value) []*Value {
+ return rands
+}
+
+func (v *Lookup) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Index)
+}
+
+func (v *MakeChan) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Size)
+}
+
+func (v *MakeClosure) Operands(rands []*Value) []*Value {
+ rands = append(rands, &v.Fn)
+ for i := range v.Bindings {
+ rands = append(rands, &v.Bindings[i])
+ }
+ return rands
+}
+
+func (v *MakeInterface) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *MakeMap) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Reserve)
+}
+
+func (v *MakeSlice) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Len, &v.Cap)
+}
+
+func (v *MapUpdate) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Map, &v.Key, &v.Value)
+}
+
+func (v *Next) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Iter)
+}
+
+func (s *Panic) Operands(rands []*Value) []*Value {
+ return append(rands, &s.X)
+}
+
+func (v *Sigma) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *Phi) Operands(rands []*Value) []*Value {
+ for i := range v.Edges {
+ rands = append(rands, &v.Edges[i])
+ }
+ return rands
+}
+
+func (v *Range) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (s *Return) Operands(rands []*Value) []*Value {
+ for i := range s.Results {
+ rands = append(rands, &s.Results[i])
+ }
+ return rands
+}
+
+func (*RunDefers) Operands(rands []*Value) []*Value {
+ return rands
+}
+
+func (v *Select) Operands(rands []*Value) []*Value {
+ for i := range v.States {
+ rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
+ }
+ return rands
+}
+
+func (s *Send) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Chan, &s.X)
+}
+
+func (v *Slice) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Low, &v.High, &v.Max)
+}
+
+func (s *Store) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Addr, &s.Val)
+}
+
+func (s *BlankStore) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Val)
+}
+
+func (v *TypeAssert) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *UnOp) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+// Non-Instruction Values:
+func (v *Builtin) Operands(rands []*Value) []*Value { return rands }
+func (v *FreeVar) Operands(rands []*Value) []*Value { return rands }
+func (v *Const) Operands(rands []*Value) []*Value { return rands }
+func (v *Function) Operands(rands []*Value) []*Value { return rands }
+func (v *Global) Operands(rands []*Value) []*Value { return rands }
+func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
diff --git a/vendor/github.com/golangci/go-tools/ssa/ssautil/load.go b/vendor/github.com/golangci/go-tools/ssa/ssautil/load.go
new file mode 100644
index 00000000000..c7832678b9b
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/ssautil/load.go
@@ -0,0 +1,143 @@
+// 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.
+
+package ssautil
+
+// This file defines utility functions for constructing programs in SSA form.
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/loader"
+ "golang.org/x/tools/go/packages"
+ "github.com/golangci/go-tools/ssa"
+)
+
+// Packages creates an SSA program for a set of packages loaded from
+// source syntax using the golang.org/x/tools/go/packages.Load function.
+// It creates and returns an SSA package for each well-typed package in
+// the initial list. The resulting list of packages has the same length
+// as initial, and contains a nil if SSA could not be constructed for
+// the corresponding initial package.
+//
+// Code for bodies of functions is not built until Build is called
+// on the resulting Program.
+//
+// The mode parameter controls diagnostics and checking during SSA construction.
+//
+func Packages(initial []*packages.Package, mode ssa.BuilderMode) (*ssa.Program, []*ssa.Package) {
+ var fset *token.FileSet
+ if len(initial) > 0 {
+ fset = initial[0].Fset
+ }
+
+ prog := ssa.NewProgram(fset, mode)
+ seen := make(map[*packages.Package]*ssa.Package)
+ var create func(p *packages.Package) *ssa.Package
+ create = func(p *packages.Package) *ssa.Package {
+ ssapkg, ok := seen[p]
+ if !ok {
+ if p.Types == nil || p.IllTyped {
+ // not well typed
+ seen[p] = nil
+ return nil
+ }
+
+ ssapkg = prog.CreatePackage(p.Types, p.Syntax, p.TypesInfo, true)
+ seen[p] = ssapkg
+
+ for _, imp := range p.Imports {
+ create(imp)
+ }
+ }
+ return ssapkg
+ }
+
+ var ssapkgs []*ssa.Package
+ for _, p := range initial {
+ ssapkgs = append(ssapkgs, create(p))
+ }
+ return prog, ssapkgs
+}
+
+// CreateProgram returns a new program in SSA form, given a program
+// loaded from source. An SSA package is created for each transitively
+// error-free package of lprog.
+//
+// Code for bodies of functions is not built until Build is called
+// on the result.
+//
+// mode controls diagnostics and checking during SSA construction.
+//
+func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program {
+ prog := ssa.NewProgram(lprog.Fset, mode)
+
+ for _, info := range lprog.AllPackages {
+ if info.TransitivelyErrorFree {
+ prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable)
+ }
+ }
+
+ return prog
+}
+
+// BuildPackage builds an SSA program with IR for a single package.
+//
+// It populates pkg by type-checking the specified file ASTs. All
+// dependencies are loaded using the importer specified by tc, which
+// typically loads compiler export data; SSA code cannot be built for
+// those packages. BuildPackage then constructs an ssa.Program with all
+// dependency packages created, and builds and returns the SSA package
+// corresponding to pkg.
+//
+// The caller must have set pkg.Path() to the import path.
+//
+// The operation fails if there were any type-checking or import errors.
+//
+// See ../ssa/example_test.go for an example.
+//
+func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) {
+ if fset == nil {
+ panic("no token.FileSet")
+ }
+ if pkg.Path() == "" {
+ panic("package has no import path")
+ }
+
+ info := &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),
+ }
+ if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil {
+ return nil, nil, err
+ }
+
+ prog := ssa.NewProgram(fset, mode)
+
+ // Create SSA packages for all imports.
+ // Order is not significant.
+ created := make(map[*types.Package]bool)
+ var createAll func(pkgs []*types.Package)
+ createAll = func(pkgs []*types.Package) {
+ for _, p := range pkgs {
+ if !created[p] {
+ created[p] = true
+ prog.CreatePackage(p, nil, nil, true)
+ createAll(p.Imports())
+ }
+ }
+ }
+ createAll(pkg.Imports())
+
+ // Create and build the primary package.
+ ssapkg := prog.CreatePackage(pkg, files, info, false)
+ ssapkg.Build()
+ return ssapkg, info, nil
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/ssautil/switch.go b/vendor/github.com/golangci/go-tools/ssa/ssautil/switch.go
new file mode 100644
index 00000000000..05c388b2b43
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/ssautil/switch.go
@@ -0,0 +1,234 @@
+// 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 ssautil
+
+// This file implements discovery of switch and type-switch constructs
+// from low-level control flow.
+//
+// Many techniques exist for compiling a high-level switch with
+// constant cases to efficient machine code. The optimal choice will
+// depend on the data type, the specific case values, the code in the
+// body of each case, and the hardware.
+// Some examples:
+// - a lookup table (for a switch that maps constants to constants)
+// - a computed goto
+// - a binary tree
+// - a perfect hash
+// - a two-level switch (to partition constant strings by their first byte).
+
+import (
+ "bytes"
+ "fmt"
+ "go/token"
+ "go/types"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+// A ConstCase represents a single constant comparison.
+// It is part of a Switch.
+type ConstCase struct {
+ Block *ssa.BasicBlock // block performing the comparison
+ Body *ssa.BasicBlock // body of the case
+ Value *ssa.Const // case comparand
+}
+
+// A TypeCase represents a single type assertion.
+// It is part of a Switch.
+type TypeCase struct {
+ Block *ssa.BasicBlock // block performing the type assert
+ Body *ssa.BasicBlock // body of the case
+ Type types.Type // case type
+ Binding ssa.Value // value bound by this case
+}
+
+// A Switch is a logical high-level control flow operation
+// (a multiway branch) discovered by analysis of a CFG containing
+// only if/else chains. It is not part of the ssa.Instruction set.
+//
+// One of ConstCases and TypeCases has length >= 2;
+// the other is nil.
+//
+// In a value switch, the list of cases may contain duplicate constants.
+// A type switch may contain duplicate types, or types assignable
+// to an interface type also in the list.
+// TODO(adonovan): eliminate such duplicates.
+//
+type Switch struct {
+ Start *ssa.BasicBlock // block containing start of if/else chain
+ X ssa.Value // the switch operand
+ ConstCases []ConstCase // ordered list of constant comparisons
+ TypeCases []TypeCase // ordered list of type assertions
+ Default *ssa.BasicBlock // successor if all comparisons fail
+}
+
+func (sw *Switch) String() string {
+ // We represent each block by the String() of its
+ // first Instruction, e.g. "print(42:int)".
+ var buf bytes.Buffer
+ if sw.ConstCases != nil {
+ fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name())
+ for _, c := range sw.ConstCases {
+ fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0])
+ }
+ } else {
+ fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name())
+ for _, c := range sw.TypeCases {
+ fmt.Fprintf(&buf, "case %s %s: %s\n",
+ c.Binding.Name(), c.Type, c.Body.Instrs[0])
+ }
+ }
+ if sw.Default != nil {
+ fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0])
+ }
+ fmt.Fprintf(&buf, "}")
+ return buf.String()
+}
+
+// Switches examines the control-flow graph of fn and returns the
+// set of inferred value and type switches. A value switch tests an
+// ssa.Value for equality against two or more compile-time constant
+// values. Switches involving link-time constants (addresses) are
+// ignored. A type switch type-asserts an ssa.Value against two or
+// more types.
+//
+// The switches are returned in dominance order.
+//
+// The resulting switches do not necessarily correspond to uses of the
+// 'switch' keyword in the source: for example, a single source-level
+// switch statement with non-constant cases may result in zero, one or
+// many Switches, one per plural sequence of constant cases.
+// Switches may even be inferred from if/else- or goto-based control flow.
+// (In general, the control flow constructs of the source program
+// cannot be faithfully reproduced from the SSA representation.)
+//
+func Switches(fn *ssa.Function) []Switch {
+ // Traverse the CFG in dominance order, so we don't
+ // enter an if/else-chain in the middle.
+ var switches []Switch
+ seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet
+ for _, b := range fn.DomPreorder() {
+ if x, k := isComparisonBlock(b); x != nil {
+ // Block b starts a switch.
+ sw := Switch{Start: b, X: x}
+ valueSwitch(&sw, k, seen)
+ if len(sw.ConstCases) > 1 {
+ switches = append(switches, sw)
+ }
+ }
+
+ if y, x, T := isTypeAssertBlock(b); y != nil {
+ // Block b starts a type switch.
+ sw := Switch{Start: b, X: x}
+ typeSwitch(&sw, y, T, seen)
+ if len(sw.TypeCases) > 1 {
+ switches = append(switches, sw)
+ }
+ }
+ }
+ return switches
+}
+
+func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) {
+ b := sw.Start
+ x := sw.X
+ for x == sw.X {
+ if seen[b] {
+ break
+ }
+ seen[b] = true
+
+ sw.ConstCases = append(sw.ConstCases, ConstCase{
+ Block: b,
+ Body: b.Succs[0],
+ Value: k,
+ })
+ b = b.Succs[1]
+ if len(b.Instrs) > 2 {
+ // Block b contains not just 'if x == k',
+ // so it may have side effects that
+ // make it unsafe to elide.
+ break
+ }
+ if len(b.Preds) != 1 {
+ // Block b has multiple predecessors,
+ // so it cannot be treated as a case.
+ break
+ }
+ x, k = isComparisonBlock(b)
+ }
+ sw.Default = b
+}
+
+func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) {
+ b := sw.Start
+ x := sw.X
+ for x == sw.X {
+ if seen[b] {
+ break
+ }
+ seen[b] = true
+
+ sw.TypeCases = append(sw.TypeCases, TypeCase{
+ Block: b,
+ Body: b.Succs[0],
+ Type: T,
+ Binding: y,
+ })
+ b = b.Succs[1]
+ if len(b.Instrs) > 4 {
+ // Block b contains not just
+ // {TypeAssert; Extract #0; Extract #1; If}
+ // so it may have side effects that
+ // make it unsafe to elide.
+ break
+ }
+ if len(b.Preds) != 1 {
+ // Block b has multiple predecessors,
+ // so it cannot be treated as a case.
+ break
+ }
+ y, x, T = isTypeAssertBlock(b)
+ }
+ sw.Default = b
+}
+
+// isComparisonBlock returns the operands (v, k) if a block ends with
+// a comparison v==k, where k is a compile-time constant.
+//
+func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) {
+ if n := len(b.Instrs); n >= 2 {
+ if i, ok := b.Instrs[n-1].(*ssa.If); ok {
+ if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL {
+ if k, ok := binop.Y.(*ssa.Const); ok {
+ return binop.X, k
+ }
+ if k, ok := binop.X.(*ssa.Const); ok {
+ return binop.Y, k
+ }
+ }
+ }
+ }
+ return
+}
+
+// isTypeAssertBlock returns the operands (y, x, T) if a block ends with
+// a type assertion "if y, ok := x.(T); ok {".
+//
+func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) {
+ if n := len(b.Instrs); n >= 4 {
+ if i, ok := b.Instrs[n-1].(*ssa.If); ok {
+ if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 {
+ if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b {
+ // hack: relies upon instruction ordering.
+ if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok {
+ return ext0, ta.X, ta.AssertedType
+ }
+ }
+ }
+ }
+ }
+ return
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/ssautil/visit.go b/vendor/github.com/golangci/go-tools/ssa/ssautil/visit.go
new file mode 100644
index 00000000000..02b2aac20f2
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/ssautil/visit.go
@@ -0,0 +1,79 @@
+// 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 ssautil // import "github.com/golangci/go-tools/ssa/ssautil"
+
+import "github.com/golangci/go-tools/ssa"
+
+// This file defines utilities for visiting the SSA representation of
+// a Program.
+//
+// TODO(adonovan): test coverage.
+
+// AllFunctions finds and returns the set of functions potentially
+// needed by program prog, as determined by a simple linker-style
+// reachability algorithm starting from the members and method-sets of
+// each package. The result may include anonymous functions and
+// synthetic wrappers.
+//
+// Precondition: all packages are built.
+//
+func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool {
+ visit := visitor{
+ prog: prog,
+ seen: make(map[*ssa.Function]bool),
+ }
+ visit.program()
+ return visit.seen
+}
+
+type visitor struct {
+ prog *ssa.Program
+ seen map[*ssa.Function]bool
+}
+
+func (visit *visitor) program() {
+ for _, pkg := range visit.prog.AllPackages() {
+ for _, mem := range pkg.Members {
+ if fn, ok := mem.(*ssa.Function); ok {
+ visit.function(fn)
+ }
+ }
+ }
+ for _, T := range visit.prog.RuntimeTypes() {
+ mset := visit.prog.MethodSets.MethodSet(T)
+ for i, n := 0, mset.Len(); i < n; i++ {
+ visit.function(visit.prog.MethodValue(mset.At(i)))
+ }
+ }
+}
+
+func (visit *visitor) function(fn *ssa.Function) {
+ if !visit.seen[fn] {
+ visit.seen[fn] = true
+ var buf [10]*ssa.Value // avoid alloc in common case
+ for _, b := range fn.Blocks {
+ for _, instr := range b.Instrs {
+ for _, op := range instr.Operands(buf[:0]) {
+ if fn, ok := (*op).(*ssa.Function); ok {
+ visit.function(fn)
+ }
+ }
+ }
+ }
+ }
+}
+
+// MainPackages returns the subset of the specified packages
+// named "main" that define a main function.
+// The result may include synthetic "testmain" packages.
+func MainPackages(pkgs []*ssa.Package) []*ssa.Package {
+ var mains []*ssa.Package
+ for _, pkg := range pkgs {
+ if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil {
+ mains = append(mains, pkg)
+ }
+ }
+ return mains
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/testmain.go b/vendor/github.com/golangci/go-tools/ssa/testmain.go
new file mode 100644
index 00000000000..ea232ada951
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/testmain.go
@@ -0,0 +1,267 @@
+// 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 ssa
+
+// CreateTestMainPackage synthesizes a main package that runs all the
+// tests of the supplied packages.
+// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
+//
+// TODO(adonovan): this file no longer needs to live in the ssa package.
+// Move it to ssautil.
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/types"
+ "log"
+ "os"
+ "strings"
+ "text/template"
+)
+
+// FindTests returns the Test, Benchmark, and Example functions
+// (as defined by "go test") defined in the specified package,
+// and its TestMain function, if any.
+func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) {
+ prog := pkg.Prog
+
+ // The first two of these may be nil: if the program doesn't import "testing",
+ // it can't contain any tests, but it may yet contain Examples.
+ var testSig *types.Signature // func(*testing.T)
+ var benchmarkSig *types.Signature // func(*testing.B)
+ var exampleSig = types.NewSignature(nil, nil, nil, false) // func()
+
+ // Obtain the types from the parameters of testing.MainStart.
+ if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
+ mainStart := testingPkg.Func("MainStart")
+ params := mainStart.Signature.Params()
+ testSig = funcField(params.At(1).Type())
+ benchmarkSig = funcField(params.At(2).Type())
+
+ // Does the package define this function?
+ // func TestMain(*testing.M)
+ if f := pkg.Func("TestMain"); f != nil {
+ sig := f.Type().(*types.Signature)
+ starM := mainStart.Signature.Results().At(0).Type() // *testing.M
+ if sig.Results().Len() == 0 &&
+ sig.Params().Len() == 1 &&
+ types.Identical(sig.Params().At(0).Type(), starM) {
+ main = f
+ }
+ }
+ }
+
+ // TODO(adonovan): use a stable order, e.g. lexical.
+ for _, mem := range pkg.Members {
+ if f, ok := mem.(*Function); ok &&
+ ast.IsExported(f.Name()) &&
+ strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
+
+ switch {
+ case testSig != nil && isTestSig(f, "Test", testSig):
+ tests = append(tests, f)
+ case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
+ benchmarks = append(benchmarks, f)
+ case isTestSig(f, "Example", exampleSig):
+ examples = append(examples, f)
+ default:
+ continue
+ }
+ }
+ }
+ return
+}
+
+// Like isTest, but checks the signature too.
+func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
+ return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
+}
+
+// Given the type of one of the three slice parameters of testing.Main,
+// returns the function type.
+func funcField(slice types.Type) *types.Signature {
+ return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
+}
+
+// isTest tells whether name looks like a test (or benchmark, according to prefix).
+// It is a Test (say) if there is a character after Test that is not a lower-case letter.
+// We don't want TesticularCancer.
+// Plundered from $GOROOT/src/cmd/go/test.go
+func isTest(name, prefix string) bool {
+ if !strings.HasPrefix(name, prefix) {
+ return false
+ }
+ if len(name) == len(prefix) { // "Test" is ok
+ return true
+ }
+ return ast.IsExported(name[len(prefix):])
+}
+
+// CreateTestMainPackage creates and returns a synthetic "testmain"
+// package for the specified package if it defines tests, benchmarks or
+// executable examples, or nil otherwise. The new package is named
+// "main" and provides a function named "main" that runs the tests,
+// similar to the one that would be created by the 'go test' tool.
+//
+// Subsequent calls to prog.AllPackages include the new package.
+// The package pkg must belong to the program prog.
+func (prog *Program) CreateTestMainPackage(pkg *Package) *Package {
+ if pkg.Prog != prog {
+ log.Fatal("Package does not belong to Program")
+ }
+
+ // Template data
+ var data struct {
+ Pkg *Package
+ Tests, Benchmarks, Examples []*Function
+ Main *Function
+ Go18 bool
+ }
+ data.Pkg = pkg
+
+ // Enumerate tests.
+ data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg)
+ if data.Main == nil &&
+ data.Tests == nil && data.Benchmarks == nil && data.Examples == nil {
+ return nil
+ }
+
+ // Synthesize source for testmain package.
+ path := pkg.Pkg.Path() + "$testmain"
+ tmpl := testmainTmpl
+ if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
+ // In Go 1.8, testing.MainStart's first argument is an interface, not a func.
+ data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type())
+ } else {
+ // The program does not import "testing", but FindTests
+ // returned non-nil, which must mean there were Examples
+ // but no Test, Benchmark, or TestMain functions.
+
+ // We'll simply call them from testmain.main; this will
+ // ensure they don't panic, but will not check any
+ // "Output:" comments.
+ // (We should not execute an Example that has no
+ // "Output:" comment, but it's impossible to tell here.)
+ tmpl = examplesOnlyTmpl
+ }
+ var buf bytes.Buffer
+ if err := tmpl.Execute(&buf, data); err != nil {
+ log.Fatalf("internal error expanding template for %s: %v", path, err)
+ }
+ if false { // debugging
+ fmt.Fprintln(os.Stderr, buf.String())
+ }
+
+ // Parse and type-check the testmain package.
+ f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0))
+ if err != nil {
+ log.Fatalf("internal error parsing %s: %v", path, err)
+ }
+ conf := types.Config{
+ DisableUnusedImportCheck: true,
+ Importer: importer{pkg},
+ }
+ files := []*ast.File{f}
+ info := &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),
+ }
+ testmainPkg, err := conf.Check(path, prog.Fset, files, info)
+ if err != nil {
+ log.Fatalf("internal error type-checking %s: %v", path, err)
+ }
+
+ // Create and build SSA code.
+ testmain := prog.CreatePackage(testmainPkg, files, info, false)
+ testmain.SetDebugMode(false)
+ testmain.Build()
+ testmain.Func("main").Synthetic = "test main function"
+ testmain.Func("init").Synthetic = "package initializer"
+ return testmain
+}
+
+// An implementation of types.Importer for an already loaded SSA program.
+type importer struct {
+ pkg *Package // package under test; may be non-importable
+}
+
+func (imp importer) Import(path string) (*types.Package, error) {
+ if p := imp.pkg.Prog.ImportedPackage(path); p != nil {
+ return p.Pkg, nil
+ }
+ if path == imp.pkg.Pkg.Path() {
+ return imp.pkg.Pkg, nil
+ }
+ return nil, fmt.Errorf("not found") // can't happen
+}
+
+var testmainTmpl = template.Must(template.New("testmain").Parse(`
+package main
+
+import "io"
+import "os"
+import "testing"
+import p {{printf "%q" .Pkg.Pkg.Path}}
+
+{{if .Go18}}
+type deps struct{}
+
+func (deps) ImportPath() string { return "" }
+func (deps) MatchString(pat, str string) (bool, error) { return true, nil }
+func (deps) StartCPUProfile(io.Writer) error { return nil }
+func (deps) StartTestLog(io.Writer) {}
+func (deps) StopCPUProfile() {}
+func (deps) StopTestLog() error { return nil }
+func (deps) WriteHeapProfile(io.Writer) error { return nil }
+func (deps) WriteProfileTo(string, io.Writer, int) error { return nil }
+
+var match deps
+{{else}}
+func match(_, _ string) (bool, error) { return true, nil }
+{{end}}
+
+func main() {
+ tests := []testing.InternalTest{
+{{range .Tests}}
+ { {{printf "%q" .Name}}, p.{{.Name}} },
+{{end}}
+ }
+ benchmarks := []testing.InternalBenchmark{
+{{range .Benchmarks}}
+ { {{printf "%q" .Name}}, p.{{.Name}} },
+{{end}}
+ }
+ examples := []testing.InternalExample{
+{{range .Examples}}
+ {Name: {{printf "%q" .Name}}, F: p.{{.Name}}},
+{{end}}
+ }
+ m := testing.MainStart(match, tests, benchmarks, examples)
+{{with .Main}}
+ p.{{.Name}}(m)
+{{else}}
+ os.Exit(m.Run())
+{{end}}
+}
+
+`))
+
+var examplesOnlyTmpl = template.Must(template.New("examples").Parse(`
+package main
+
+import p {{printf "%q" .Pkg.Pkg.Path}}
+
+func main() {
+{{range .Examples}}
+ p.{{.Name}}()
+{{end}}
+}
+`))
diff --git a/vendor/github.com/golangci/go-tools/ssa/util.go b/vendor/github.com/golangci/go-tools/ssa/util.go
new file mode 100644
index 00000000000..ddb11846096
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/util.go
@@ -0,0 +1,119 @@
+// 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 ssa
+
+// This file defines a number of miscellaneous utility functions.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "io"
+ "os"
+
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+//// AST utilities
+
+func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
+
+// isBlankIdent returns true iff e is an Ident with name "_".
+// They have no associated types.Object, and thus no type.
+//
+func isBlankIdent(e ast.Expr) bool {
+ id, ok := e.(*ast.Ident)
+ return ok && id.Name == "_"
+}
+
+//// Type utilities. Some of these belong in go/types.
+
+// isPointer returns true for types whose underlying type is a pointer.
+func isPointer(typ types.Type) bool {
+ _, ok := typ.Underlying().(*types.Pointer)
+ return ok
+}
+
+func isInterface(T types.Type) bool { return types.IsInterface(T) }
+
+// deref returns a pointer's element type; otherwise it returns typ.
+func deref(typ types.Type) types.Type {
+ if p, ok := typ.Underlying().(*types.Pointer); ok {
+ return p.Elem()
+ }
+ return typ
+}
+
+// recvType returns the receiver type of method obj.
+func recvType(obj *types.Func) types.Type {
+ return obj.Type().(*types.Signature).Recv().Type()
+}
+
+// DefaultType returns the default "typed" type for an "untyped" type;
+// it returns the incoming type for all other types. The default type
+// for untyped nil is untyped nil.
+//
+// Exported to ssa/interp.
+//
+// TODO(adonovan): use go/types.DefaultType after 1.8.
+//
+func DefaultType(typ types.Type) types.Type {
+ if t, ok := typ.(*types.Basic); ok {
+ k := t.Kind()
+ switch k {
+ case types.UntypedBool:
+ k = types.Bool
+ case types.UntypedInt:
+ k = types.Int
+ case types.UntypedRune:
+ k = types.Rune
+ case types.UntypedFloat:
+ k = types.Float64
+ case types.UntypedComplex:
+ k = types.Complex128
+ case types.UntypedString:
+ k = types.String
+ }
+ typ = types.Typ[k]
+ }
+ return typ
+}
+
+// logStack prints the formatted "start" message to stderr and
+// returns a closure that prints the corresponding "end" message.
+// Call using 'defer logStack(...)()' to show builder stack on panic.
+// Don't forget trailing parens!
+//
+func logStack(format string, args ...interface{}) func() {
+ msg := fmt.Sprintf(format, args...)
+ io.WriteString(os.Stderr, msg)
+ io.WriteString(os.Stderr, "\n")
+ return func() {
+ io.WriteString(os.Stderr, msg)
+ io.WriteString(os.Stderr, " end\n")
+ }
+}
+
+// newVar creates a 'var' for use in a types.Tuple.
+func newVar(name string, typ types.Type) *types.Var {
+ return types.NewParam(token.NoPos, nil, name, typ)
+}
+
+// anonVar creates an anonymous 'var' for use in a types.Tuple.
+func anonVar(typ types.Type) *types.Var {
+ return newVar("", typ)
+}
+
+var lenResults = types.NewTuple(anonVar(tInt))
+
+// makeLen returns the len builtin specialized to type func(T)int.
+func makeLen(T types.Type) *Builtin {
+ lenParams := types.NewTuple(anonVar(T))
+ return &Builtin{
+ name: "len",
+ sig: types.NewSignature(nil, lenParams, lenResults, false),
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/wrappers.go b/vendor/github.com/golangci/go-tools/ssa/wrappers.go
new file mode 100644
index 00000000000..701dd90d7d9
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/wrappers.go
@@ -0,0 +1,294 @@
+// 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 ssa
+
+// This file defines synthesis of Functions that delegate to declared
+// methods; they come in three kinds:
+//
+// (1) wrappers: methods that wrap declared methods, performing
+// implicit pointer indirections and embedded field selections.
+//
+// (2) thunks: funcs that wrap declared methods. Like wrappers,
+// thunks perform indirections and field selections. The thunk's
+// first parameter is used as the receiver for the method call.
+//
+// (3) bounds: funcs that wrap declared methods. The bound's sole
+// free variable, supplied by a closure, is used as the receiver
+// for the method call. No indirections or field selections are
+// performed since they can be done before the call.
+
+import (
+ "fmt"
+
+ "go/types"
+)
+
+// -- wrappers -----------------------------------------------------------
+
+// makeWrapper returns a synthetic method that delegates to the
+// declared method denoted by meth.Obj(), first performing any
+// necessary pointer indirections or field selections implied by meth.
+//
+// The resulting method's receiver type is meth.Recv().
+//
+// This function is versatile but quite subtle! Consider the
+// following axes of variation when making changes:
+// - optional receiver indirection
+// - optional implicit field selections
+// - meth.Obj() may denote a concrete or an interface method
+// - the result may be a thunk or a wrapper.
+//
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+//
+func makeWrapper(prog *Program, sel *types.Selection) *Function {
+ obj := sel.Obj().(*types.Func) // the declared function
+ sig := sel.Type().(*types.Signature) // type of this wrapper
+
+ var recv *types.Var // wrapper's receiver or thunk's params[0]
+ name := obj.Name()
+ var description string
+ var start int // first regular param
+ if sel.Kind() == types.MethodExpr {
+ name += "$thunk"
+ description = "thunk"
+ recv = sig.Params().At(0)
+ start = 1
+ } else {
+ description = "wrapper"
+ recv = sig.Recv()
+ }
+
+ description = fmt.Sprintf("%s for %s", description, sel.Obj())
+ if prog.mode&LogSource != 0 {
+ defer logStack("make %s to (%s)", description, recv.Type())()
+ }
+ fn := &Function{
+ name: name,
+ method: sel,
+ object: obj,
+ Signature: sig,
+ Synthetic: description,
+ Prog: prog,
+ pos: obj.Pos(),
+ }
+ fn.startBody()
+ fn.addSpilledParam(recv)
+ createParams(fn, start)
+
+ indices := sel.Index()
+
+ var v Value = fn.Locals[0] // spilled receiver
+ if isPointer(sel.Recv()) {
+ v = emitLoad(fn, v)
+
+ // For simple indirection wrappers, perform an informative nil-check:
+ // "value method (T).f called using nil *T pointer"
+ if len(indices) == 1 && !isPointer(recvType(obj)) {
+ var c Call
+ c.Call.Value = &Builtin{
+ name: "ssa:wrapnilchk",
+ sig: types.NewSignature(nil,
+ types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
+ types.NewTuple(anonVar(sel.Recv())), false),
+ }
+ c.Call.Args = []Value{
+ v,
+ stringConst(deref(sel.Recv()).String()),
+ stringConst(sel.Obj().Name()),
+ }
+ c.setType(v.Type())
+ v = fn.emit(&c)
+ }
+ }
+
+ // Invariant: v is a pointer, either
+ // value of *A receiver param, or
+ // address of A spilled receiver.
+
+ // We use pointer arithmetic (FieldAddr possibly followed by
+ // Load) in preference to value extraction (Field possibly
+ // preceded by Load).
+
+ v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
+
+ // Invariant: v is a pointer, either
+ // value of implicit *C field, or
+ // address of implicit C field.
+
+ var c Call
+ if r := recvType(obj); !isInterface(r) { // concrete method
+ if !isPointer(r) {
+ v = emitLoad(fn, v)
+ }
+ c.Call.Value = prog.declaredFunc(obj)
+ c.Call.Args = append(c.Call.Args, v)
+ } else {
+ c.Call.Method = obj
+ c.Call.Value = emitLoad(fn, v)
+ }
+ for _, arg := range fn.Params[1:] {
+ c.Call.Args = append(c.Call.Args, arg)
+ }
+ emitTailCall(fn, &c)
+ fn.finishBody()
+ return fn
+}
+
+// createParams creates parameters for wrapper method fn based on its
+// Signature.Params, which do not include the receiver.
+// start is the index of the first regular parameter to use.
+//
+func createParams(fn *Function, start int) {
+ var last *Parameter
+ tparams := fn.Signature.Params()
+ for i, n := start, tparams.Len(); i < n; i++ {
+ last = fn.addParamObj(tparams.At(i))
+ }
+ if fn.Signature.Variadic() {
+ last.typ = types.NewSlice(last.typ)
+ }
+}
+
+// -- bounds -----------------------------------------------------------
+
+// makeBound returns a bound method wrapper (or "bound"), a synthetic
+// function that delegates to a concrete or interface method denoted
+// by obj. The resulting function has no receiver, but has one free
+// variable which will be used as the method's receiver in the
+// tail-call.
+//
+// Use MakeClosure with such a wrapper to construct a bound method
+// closure. e.g.:
+//
+// type T int or: type T interface { meth() }
+// func (t T) meth()
+// var t T
+// f := t.meth
+// f() // calls t.meth()
+//
+// f is a closure of a synthetic wrapper defined as if by:
+//
+// f := func() { return t.meth() }
+//
+// Unlike makeWrapper, makeBound need perform no indirection or field
+// selections because that can be done before the closure is
+// constructed.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
+//
+func makeBound(prog *Program, obj *types.Func) *Function {
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+ fn, ok := prog.bounds[obj]
+ if !ok {
+ description := fmt.Sprintf("bound method wrapper for %s", obj)
+ if prog.mode&LogSource != 0 {
+ defer logStack("%s", description)()
+ }
+ fn = &Function{
+ name: obj.Name() + "$bound",
+ object: obj,
+ Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
+ Synthetic: description,
+ Prog: prog,
+ pos: obj.Pos(),
+ }
+
+ fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
+ fn.FreeVars = []*FreeVar{fv}
+ fn.startBody()
+ createParams(fn, 0)
+ var c Call
+
+ if !isInterface(recvType(obj)) { // concrete
+ c.Call.Value = prog.declaredFunc(obj)
+ c.Call.Args = []Value{fv}
+ } else {
+ c.Call.Value = fv
+ c.Call.Method = obj
+ }
+ for _, arg := range fn.Params {
+ c.Call.Args = append(c.Call.Args, arg)
+ }
+ emitTailCall(fn, &c)
+ fn.finishBody()
+
+ prog.bounds[obj] = fn
+ }
+ return fn
+}
+
+// -- thunks -----------------------------------------------------------
+
+// makeThunk returns a thunk, a synthetic function that delegates to a
+// concrete or interface method denoted by sel.Obj(). The resulting
+// function has no receiver, but has an additional (first) regular
+// parameter.
+//
+// Precondition: sel.Kind() == types.MethodExpr.
+//
+// type T int or: type T interface { meth() }
+// func (t T) meth()
+// f := T.meth
+// var t T
+// f(t) // calls t.meth()
+//
+// f is a synthetic wrapper defined as if by:
+//
+// f := func(t T) { return t.meth() }
+//
+// TODO(adonovan): opt: currently the stub is created even when used
+// directly in a function call: C.f(i, 0). This is less efficient
+// than inlining the stub.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
+//
+func makeThunk(prog *Program, sel *types.Selection) *Function {
+ if sel.Kind() != types.MethodExpr {
+ panic(sel)
+ }
+
+ key := selectionKey{
+ kind: sel.Kind(),
+ recv: sel.Recv(),
+ obj: sel.Obj(),
+ index: fmt.Sprint(sel.Index()),
+ indirect: sel.Indirect(),
+ }
+
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+
+ // Canonicalize key.recv to avoid constructing duplicate thunks.
+ canonRecv, ok := prog.canon.At(key.recv).(types.Type)
+ if !ok {
+ canonRecv = key.recv
+ prog.canon.Set(key.recv, canonRecv)
+ }
+ key.recv = canonRecv
+
+ fn, ok := prog.thunks[key]
+ if !ok {
+ fn = makeWrapper(prog, sel)
+ if fn.Signature.Recv() != nil {
+ panic(fn) // unexpected receiver
+ }
+ prog.thunks[key] = fn
+ }
+ return fn
+}
+
+func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
+ return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic())
+}
+
+// selectionKey is like types.Selection but a usable map key.
+type selectionKey struct {
+ kind types.SelectionKind
+ recv types.Type // canonicalized via Program.canon
+ obj types.Object
+ index string
+ indirect bool
+}
diff --git a/vendor/github.com/golangci/go-tools/ssa/write.go b/vendor/github.com/golangci/go-tools/ssa/write.go
new file mode 100644
index 00000000000..89761a18a55
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssa/write.go
@@ -0,0 +1,5 @@
+package ssa
+
+func NewJump(parent *BasicBlock) *Jump {
+ return &Jump{anInstruction{parent}}
+}
diff --git a/vendor/github.com/golangci/go-tools/ssautil/ssautil.go b/vendor/github.com/golangci/go-tools/ssautil/ssautil.go
new file mode 100644
index 00000000000..19b7e101886
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/ssautil/ssautil.go
@@ -0,0 +1,41 @@
+package ssautil
+
+import (
+ "github.com/golangci/go-tools/ssa"
+)
+
+func Reachable(from, to *ssa.BasicBlock) bool {
+ if from == to {
+ return true
+ }
+ if from.Dominates(to) {
+ return true
+ }
+
+ found := false
+ Walk(from, func(b *ssa.BasicBlock) bool {
+ if b == to {
+ found = true
+ return false
+ }
+ return true
+ })
+ return found
+}
+
+func Walk(b *ssa.BasicBlock, fn func(*ssa.BasicBlock) bool) {
+ seen := map[*ssa.BasicBlock]bool{}
+ wl := []*ssa.BasicBlock{b}
+ for len(wl) > 0 {
+ b := wl[len(wl)-1]
+ wl = wl[:len(wl)-1]
+ if seen[b] {
+ continue
+ }
+ seen[b] = true
+ if !fn(b) {
+ continue
+ }
+ wl = append(wl, b.Succs...)
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/CONTRIBUTING.md b/vendor/github.com/golangci/go-tools/staticcheck/CONTRIBUTING.md
new file mode 100644
index 00000000000..42573b78be0
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/CONTRIBUTING.md
@@ -0,0 +1,15 @@
+# Contributing to staticcheck
+
+## Before filing an issue:
+
+### Are you having trouble building staticcheck?
+
+Check you have the latest version of its dependencies. Run
+```
+go get -u github.com/golangci/go-tools/staticcheck
+```
+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 staticcheck? Make sure to carefully read `README`.
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/buildtag.go b/vendor/github.com/golangci/go-tools/staticcheck/buildtag.go
new file mode 100644
index 00000000000..d617d60298b
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/buildtag.go
@@ -0,0 +1,21 @@
+package staticcheck
+
+import (
+ "go/ast"
+ "strings"
+
+ . "github.com/golangci/go-tools/lint/lintdsl"
+)
+
+func buildTags(f *ast.File) [][]string {
+ var out [][]string
+ for _, line := range strings.Split(Preamble(f), "\n") {
+ if !strings.HasPrefix(line, "+build ") {
+ continue
+ }
+ line = strings.TrimSpace(strings.TrimPrefix(line, "+build "))
+ fields := strings.Fields(line)
+ out = append(out, fields)
+ }
+ return out
+}
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/lint.go b/vendor/github.com/golangci/go-tools/staticcheck/lint.go
new file mode 100644
index 00000000000..46c869bb111
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/lint.go
@@ -0,0 +1,3008 @@
+// Package staticcheck contains a linter for Go source code.
+package staticcheck // import "github.com/golangci/go-tools/staticcheck"
+
+import (
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ htmltemplate "html/template"
+ "net/http"
+ "regexp"
+ "regexp/syntax"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ texttemplate "text/template"
+
+ . "github.com/golangci/go-tools/arg"
+ "github.com/golangci/go-tools/deprecated"
+ "github.com/golangci/go-tools/functions"
+ "github.com/golangci/go-tools/internal/sharedcheck"
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+ "github.com/golangci/go-tools/ssa"
+ "github.com/golangci/go-tools/ssautil"
+ "github.com/golangci/go-tools/staticcheck/vrp"
+
+ "golang.org/x/tools/go/ast/astutil"
+ "golang.org/x/tools/go/packages"
+)
+
+func validRegexp(call *Call) {
+ arg := call.Args[0]
+ err := ValidateRegexp(arg.Value)
+ if err != nil {
+ arg.Invalid(err.Error())
+ }
+}
+
+type runeSlice []rune
+
+func (rs runeSlice) Len() int { return len(rs) }
+func (rs runeSlice) Less(i int, j int) bool { return rs[i] < rs[j] }
+func (rs runeSlice) Swap(i int, j int) { rs[i], rs[j] = rs[j], rs[i] }
+
+func utf8Cutset(call *Call) {
+ arg := call.Args[1]
+ if InvalidUTF8(arg.Value) {
+ arg.Invalid(MsgInvalidUTF8)
+ }
+}
+
+func uniqueCutset(call *Call) {
+ arg := call.Args[1]
+ if !UniqueStringCutset(arg.Value) {
+ arg.Invalid(MsgNonUniqueCutset)
+ }
+}
+
+func unmarshalPointer(name string, arg int) CallCheck {
+ return func(call *Call) {
+ if !Pointer(call.Args[arg].Value) {
+ call.Args[arg].Invalid(fmt.Sprintf("%s expects to unmarshal into a pointer, but the provided value is not a pointer", name))
+ }
+ }
+}
+
+func pointlessIntMath(call *Call) {
+ if ConvertedFromInt(call.Args[0].Value) {
+ call.Invalid(fmt.Sprintf("calling %s on a converted integer is pointless", CallName(call.Instr.Common())))
+ }
+}
+
+func checkValidHostPort(arg int) CallCheck {
+ return func(call *Call) {
+ if !ValidHostPort(call.Args[arg].Value) {
+ call.Args[arg].Invalid(MsgInvalidHostPort)
+ }
+ }
+}
+
+var (
+ checkRegexpRules = map[string]CallCheck{
+ "regexp.MustCompile": validRegexp,
+ "regexp.Compile": validRegexp,
+ "regexp.Match": validRegexp,
+ "regexp.MatchReader": validRegexp,
+ "regexp.MatchString": validRegexp,
+ }
+
+ checkTimeParseRules = map[string]CallCheck{
+ "time.Parse": func(call *Call) {
+ arg := call.Args[Arg("time.Parse.layout")]
+ err := ValidateTimeLayout(arg.Value)
+ if err != nil {
+ arg.Invalid(err.Error())
+ }
+ },
+ }
+
+ checkEncodingBinaryRules = map[string]CallCheck{
+ "encoding/binary.Write": func(call *Call) {
+ arg := call.Args[Arg("encoding/binary.Write.data")]
+ if !CanBinaryMarshal(call.Job, arg.Value) {
+ arg.Invalid(fmt.Sprintf("value of type %s cannot be used with binary.Write", arg.Value.Value.Type()))
+ }
+ },
+ }
+
+ checkURLsRules = map[string]CallCheck{
+ "net/url.Parse": func(call *Call) {
+ arg := call.Args[Arg("net/url.Parse.rawurl")]
+ err := ValidateURL(arg.Value)
+ if err != nil {
+ arg.Invalid(err.Error())
+ }
+ },
+ }
+
+ checkSyncPoolValueRules = map[string]CallCheck{
+ "(*sync.Pool).Put": func(call *Call) {
+ arg := call.Args[Arg("(*sync.Pool).Put.x")]
+ typ := arg.Value.Value.Type()
+ if !IsPointerLike(typ) {
+ arg.Invalid("argument should be pointer-like to avoid allocations")
+ }
+ },
+ }
+
+ checkRegexpFindAllRules = map[string]CallCheck{
+ "(*regexp.Regexp).FindAll": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllIndex": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllString": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllStringIndex": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllStringSubmatch": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllStringSubmatchIndex": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllSubmatch": RepeatZeroTimes("a FindAll method", 1),
+ "(*regexp.Regexp).FindAllSubmatchIndex": RepeatZeroTimes("a FindAll method", 1),
+ }
+
+ checkUTF8CutsetRules = map[string]CallCheck{
+ "strings.IndexAny": utf8Cutset,
+ "strings.LastIndexAny": utf8Cutset,
+ "strings.ContainsAny": utf8Cutset,
+ "strings.Trim": utf8Cutset,
+ "strings.TrimLeft": utf8Cutset,
+ "strings.TrimRight": utf8Cutset,
+ }
+
+ checkUniqueCutsetRules = map[string]CallCheck{
+ "strings.Trim": uniqueCutset,
+ "strings.TrimLeft": uniqueCutset,
+ "strings.TrimRight": uniqueCutset,
+ }
+
+ checkUnmarshalPointerRules = map[string]CallCheck{
+ "encoding/xml.Unmarshal": unmarshalPointer("xml.Unmarshal", 1),
+ "(*encoding/xml.Decoder).Decode": unmarshalPointer("Decode", 0),
+ "(*encoding/xml.Decoder).DecodeElement": unmarshalPointer("DecodeElement", 0),
+ "encoding/json.Unmarshal": unmarshalPointer("json.Unmarshal", 1),
+ "(*encoding/json.Decoder).Decode": unmarshalPointer("Decode", 0),
+ }
+
+ checkUnbufferedSignalChanRules = map[string]CallCheck{
+ "os/signal.Notify": func(call *Call) {
+ arg := call.Args[Arg("os/signal.Notify.c")]
+ if UnbufferedChannel(arg.Value) {
+ arg.Invalid("the channel used with signal.Notify should be buffered")
+ }
+ },
+ }
+
+ checkMathIntRules = map[string]CallCheck{
+ "math.Ceil": pointlessIntMath,
+ "math.Floor": pointlessIntMath,
+ "math.IsNaN": pointlessIntMath,
+ "math.Trunc": pointlessIntMath,
+ "math.IsInf": pointlessIntMath,
+ }
+
+ checkStringsReplaceZeroRules = map[string]CallCheck{
+ "strings.Replace": RepeatZeroTimes("strings.Replace", 3),
+ "bytes.Replace": RepeatZeroTimes("bytes.Replace", 3),
+ }
+
+ checkListenAddressRules = map[string]CallCheck{
+ "net/http.ListenAndServe": checkValidHostPort(0),
+ "net/http.ListenAndServeTLS": checkValidHostPort(0),
+ }
+
+ checkBytesEqualIPRules = map[string]CallCheck{
+ "bytes.Equal": func(call *Call) {
+ if ConvertedFrom(call.Args[Arg("bytes.Equal.a")].Value, "net.IP") &&
+ ConvertedFrom(call.Args[Arg("bytes.Equal.b")].Value, "net.IP") {
+ call.Invalid("use net.IP.Equal to compare net.IPs, not bytes.Equal")
+ }
+ },
+ }
+
+ checkRegexpMatchLoopRules = map[string]CallCheck{
+ "regexp.Match": loopedRegexp("regexp.Match"),
+ "regexp.MatchReader": loopedRegexp("regexp.MatchReader"),
+ "regexp.MatchString": loopedRegexp("regexp.MatchString"),
+ }
+)
+
+type Checker struct {
+ CheckGenerated bool
+ funcDescs *functions.Descriptions
+ deprecatedObjs map[types.Object]string
+}
+
+func NewChecker() *Checker {
+ return &Checker{}
+}
+
+func (*Checker) Name() string { return "staticcheck" }
+func (*Checker) Prefix() string { return "SA" }
+
+func (c *Checker) Checks() []lint.Check {
+ return []lint.Check{
+ {ID: "SA1000", FilterGenerated: false, Fn: c.callChecker(checkRegexpRules)},
+ {ID: "SA1001", FilterGenerated: false, Fn: c.CheckTemplate},
+ {ID: "SA1002", FilterGenerated: false, Fn: c.callChecker(checkTimeParseRules)},
+ {ID: "SA1003", FilterGenerated: false, Fn: c.callChecker(checkEncodingBinaryRules)},
+ {ID: "SA1004", FilterGenerated: false, Fn: c.CheckTimeSleepConstant},
+ {ID: "SA1005", FilterGenerated: false, Fn: c.CheckExec},
+ {ID: "SA1006", FilterGenerated: false, Fn: c.CheckUnsafePrintf},
+ {ID: "SA1007", FilterGenerated: false, Fn: c.callChecker(checkURLsRules)},
+ {ID: "SA1008", FilterGenerated: false, Fn: c.CheckCanonicalHeaderKey},
+ {ID: "SA1010", FilterGenerated: false, Fn: c.callChecker(checkRegexpFindAllRules)},
+ {ID: "SA1011", FilterGenerated: false, Fn: c.callChecker(checkUTF8CutsetRules)},
+ {ID: "SA1012", FilterGenerated: false, Fn: c.CheckNilContext},
+ {ID: "SA1013", FilterGenerated: false, Fn: c.CheckSeeker},
+ {ID: "SA1014", FilterGenerated: false, Fn: c.callChecker(checkUnmarshalPointerRules)},
+ {ID: "SA1015", FilterGenerated: false, Fn: c.CheckLeakyTimeTick},
+ {ID: "SA1016", FilterGenerated: false, Fn: c.CheckUntrappableSignal},
+ {ID: "SA1017", FilterGenerated: false, Fn: c.callChecker(checkUnbufferedSignalChanRules)},
+ {ID: "SA1018", FilterGenerated: false, Fn: c.callChecker(checkStringsReplaceZeroRules)},
+ {ID: "SA1019", FilterGenerated: false, Fn: c.CheckDeprecated},
+ {ID: "SA1020", FilterGenerated: false, Fn: c.callChecker(checkListenAddressRules)},
+ {ID: "SA1021", FilterGenerated: false, Fn: c.callChecker(checkBytesEqualIPRules)},
+ {ID: "SA1023", FilterGenerated: false, Fn: c.CheckWriterBufferModified},
+ {ID: "SA1024", FilterGenerated: false, Fn: c.callChecker(checkUniqueCutsetRules)},
+ {ID: "SA1025", FilterGenerated: false, Fn: c.CheckTimerResetReturnValue},
+
+ {ID: "SA2000", FilterGenerated: false, Fn: c.CheckWaitgroupAdd},
+ {ID: "SA2001", FilterGenerated: false, Fn: c.CheckEmptyCriticalSection},
+ {ID: "SA2002", FilterGenerated: false, Fn: c.CheckConcurrentTesting},
+ {ID: "SA2003", FilterGenerated: false, Fn: c.CheckDeferLock},
+
+ {ID: "SA3000", FilterGenerated: false, Fn: c.CheckTestMainExit},
+ {ID: "SA3001", FilterGenerated: false, Fn: c.CheckBenchmarkN},
+
+ {ID: "SA4000", FilterGenerated: false, Fn: c.CheckLhsRhsIdentical},
+ {ID: "SA4001", FilterGenerated: false, Fn: c.CheckIneffectiveCopy},
+ {ID: "SA4002", FilterGenerated: false, Fn: c.CheckDiffSizeComparison},
+ {ID: "SA4003", FilterGenerated: false, Fn: c.CheckExtremeComparison},
+ {ID: "SA4004", FilterGenerated: false, Fn: c.CheckIneffectiveLoop},
+ {ID: "SA4006", FilterGenerated: false, Fn: c.CheckUnreadVariableValues},
+ {ID: "SA4008", FilterGenerated: false, Fn: c.CheckLoopCondition},
+ {ID: "SA4009", FilterGenerated: false, Fn: c.CheckArgOverwritten},
+ {ID: "SA4010", FilterGenerated: false, Fn: c.CheckIneffectiveAppend},
+ {ID: "SA4011", FilterGenerated: false, Fn: c.CheckScopedBreak},
+ {ID: "SA4012", FilterGenerated: false, Fn: c.CheckNaNComparison},
+ {ID: "SA4013", FilterGenerated: false, Fn: c.CheckDoubleNegation},
+ {ID: "SA4014", FilterGenerated: false, Fn: c.CheckRepeatedIfElse},
+ {ID: "SA4015", FilterGenerated: false, Fn: c.callChecker(checkMathIntRules)},
+ {ID: "SA4016", FilterGenerated: false, Fn: c.CheckSillyBitwiseOps},
+ {ID: "SA4017", FilterGenerated: false, Fn: c.CheckPureFunctions},
+ {ID: "SA4018", FilterGenerated: true, Fn: c.CheckSelfAssignment},
+ {ID: "SA4019", FilterGenerated: true, Fn: c.CheckDuplicateBuildConstraints},
+ {ID: "SA4020", FilterGenerated: false, Fn: c.CheckUnreachableTypeCases},
+
+ {ID: "SA5000", FilterGenerated: false, Fn: c.CheckNilMaps},
+ {ID: "SA5001", FilterGenerated: false, Fn: c.CheckEarlyDefer},
+ {ID: "SA5002", FilterGenerated: false, Fn: c.CheckInfiniteEmptyLoop},
+ {ID: "SA5003", FilterGenerated: false, Fn: c.CheckDeferInInfiniteLoop},
+ {ID: "SA5004", FilterGenerated: false, Fn: c.CheckLoopEmptyDefault},
+ {ID: "SA5005", FilterGenerated: false, Fn: c.CheckCyclicFinalizer},
+ {ID: "SA5007", FilterGenerated: false, Fn: c.CheckInfiniteRecursion},
+
+ {ID: "SA6000", FilterGenerated: false, Fn: c.callChecker(checkRegexpMatchLoopRules)},
+ {ID: "SA6001", FilterGenerated: false, Fn: c.CheckMapBytesKey},
+ {ID: "SA6002", FilterGenerated: false, Fn: c.callChecker(checkSyncPoolValueRules)},
+ {ID: "SA6003", FilterGenerated: false, Fn: c.CheckRangeStringRunes},
+ // {ID: "SA6004", FilterGenerated: false, Fn: c.CheckSillyRegexp},
+ {ID: "SA6005", FilterGenerated: false, Fn: c.CheckToLowerToUpperComparison},
+
+ {ID: "SA9001", FilterGenerated: false, Fn: c.CheckDubiousDeferInChannelRangeLoop},
+ {ID: "SA9002", FilterGenerated: false, Fn: c.CheckNonOctalFileMode},
+ {ID: "SA9003", FilterGenerated: false, Fn: c.CheckEmptyBranch},
+ {ID: "SA9004", FilterGenerated: false, Fn: c.CheckMissingEnumTypesInDeclaration},
+ }
+
+ // "SA5006": c.CheckSliceOutOfBounds,
+ // "SA4007": c.CheckPredeterminedBooleanExprs,
+}
+
+func (c *Checker) findDeprecated(prog *lint.Program) {
+ var docs []*ast.CommentGroup
+ var names []*ast.Ident
+
+ doDocs := func(pkg *packages.Package, names []*ast.Ident, docs []*ast.CommentGroup) {
+ var alt string
+ for _, doc := range docs {
+ if doc == nil {
+ continue
+ }
+ parts := strings.Split(doc.Text(), "\n\n")
+ last := parts[len(parts)-1]
+ if !strings.HasPrefix(last, "Deprecated: ") {
+ continue
+ }
+ alt = last[len("Deprecated: "):]
+ alt = strings.Replace(alt, "\n", " ", -1)
+ break
+ }
+ if alt == "" {
+ return
+ }
+
+ for _, name := range names {
+ obj := pkg.TypesInfo.ObjectOf(name)
+ c.deprecatedObjs[obj] = alt
+ }
+ }
+
+ for _, pkg := range prog.AllPackages {
+ for _, f := range pkg.Syntax {
+ fn := func(node ast.Node) bool {
+ if node == nil {
+ return true
+ }
+ var ret bool
+ switch node := node.(type) {
+ case *ast.GenDecl:
+ switch node.Tok {
+ case token.TYPE, token.CONST, token.VAR:
+ docs = append(docs, node.Doc)
+ return true
+ default:
+ return false
+ }
+ case *ast.FuncDecl:
+ docs = append(docs, node.Doc)
+ names = []*ast.Ident{node.Name}
+ ret = false
+ case *ast.TypeSpec:
+ docs = append(docs, node.Doc)
+ names = []*ast.Ident{node.Name}
+ ret = true
+ case *ast.ValueSpec:
+ docs = append(docs, node.Doc)
+ names = node.Names
+ ret = false
+ case *ast.File:
+ return true
+ case *ast.StructType:
+ for _, field := range node.Fields.List {
+ doDocs(pkg, field.Names, []*ast.CommentGroup{field.Doc})
+ }
+ return false
+ case *ast.InterfaceType:
+ for _, field := range node.Methods.List {
+ doDocs(pkg, field.Names, []*ast.CommentGroup{field.Doc})
+ }
+ return false
+ default:
+ return false
+ }
+ if len(names) == 0 || len(docs) == 0 {
+ return ret
+ }
+ doDocs(pkg, names, docs)
+
+ docs = docs[:0]
+ names = nil
+ return ret
+ }
+ ast.Inspect(f, fn)
+ }
+ }
+}
+
+func (c *Checker) Init(prog *lint.Program) {
+ wg := &sync.WaitGroup{}
+ wg.Add(2)
+ go func() {
+ c.funcDescs = functions.NewDescriptions(prog.SSA)
+ for _, fn := range prog.AllFunctions {
+ if fn.Blocks != nil {
+ applyStdlibKnowledge(fn)
+ ssa.OptimizeBlocks(fn)
+ }
+ }
+ wg.Done()
+ }()
+
+ go func() {
+ c.deprecatedObjs = map[types.Object]string{}
+ c.findDeprecated(prog)
+ wg.Done()
+ }()
+
+ wg.Wait()
+}
+
+func (c *Checker) isInLoop(b *ssa.BasicBlock) bool {
+ sets := c.funcDescs.Get(b.Parent()).Loops
+ for _, set := range sets {
+ if set[b] {
+ return true
+ }
+ }
+ return false
+}
+
+func applyStdlibKnowledge(fn *ssa.Function) {
+ if len(fn.Blocks) == 0 {
+ return
+ }
+
+ // comma-ok receiving from a time.Tick channel will never return
+ // ok == false, so any branching on the value of ok can be
+ // replaced with an unconditional jump. This will primarily match
+ // `for range time.Tick(x)` loops, but it can also match
+ // user-written code.
+ for _, block := range fn.Blocks {
+ if len(block.Instrs) < 3 {
+ continue
+ }
+ if len(block.Succs) != 2 {
+ continue
+ }
+ var instrs []*ssa.Instruction
+ for i, ins := range block.Instrs {
+ if _, ok := ins.(*ssa.DebugRef); ok {
+ continue
+ }
+ instrs = append(instrs, &block.Instrs[i])
+ }
+
+ for i, ins := range instrs {
+ unop, ok := (*ins).(*ssa.UnOp)
+ if !ok || unop.Op != token.ARROW {
+ continue
+ }
+ call, ok := unop.X.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ if !IsCallTo(call.Common(), "time.Tick") {
+ continue
+ }
+ ex, ok := (*instrs[i+1]).(*ssa.Extract)
+ if !ok || ex.Tuple != unop || ex.Index != 1 {
+ continue
+ }
+
+ ifstmt, ok := (*instrs[i+2]).(*ssa.If)
+ if !ok || ifstmt.Cond != ex {
+ continue
+ }
+
+ *instrs[i+2] = ssa.NewJump(block)
+ succ := block.Succs[1]
+ block.Succs = block.Succs[0:1]
+ succ.RemovePred(block)
+ }
+ }
+}
+
+func hasType(j *lint.Job, expr ast.Expr, name string) bool {
+ T := TypeOf(j, expr)
+ return IsType(T, name)
+}
+
+func (c *Checker) CheckUntrappableSignal(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAnyAST(j, call,
+ "os/signal.Ignore", "os/signal.Notify", "os/signal.Reset") {
+ return true
+ }
+ for _, arg := range call.Args {
+ if conv, ok := arg.(*ast.CallExpr); ok && isName(j, conv.Fun, "os.Signal") {
+ arg = conv.Args[0]
+ }
+
+ if isName(j, arg, "os.Kill") || isName(j, arg, "syscall.SIGKILL") {
+ j.Errorf(arg, "%s cannot be trapped (did you mean syscall.SIGTERM?)", Render(j, arg))
+ }
+ if isName(j, arg, "syscall.SIGSTOP") {
+ j.Errorf(arg, "%s signal cannot be trapped", Render(j, arg))
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckTemplate(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ var kind string
+ if IsCallToAST(j, call, "(*text/template.Template).Parse") {
+ kind = "text"
+ } else if IsCallToAST(j, call, "(*html/template.Template).Parse") {
+ kind = "html"
+ } else {
+ return true
+ }
+ sel := call.Fun.(*ast.SelectorExpr)
+ if !IsCallToAST(j, sel.X, "text/template.New") &&
+ !IsCallToAST(j, sel.X, "html/template.New") {
+ // TODO(dh): this is a cheap workaround for templates with
+ // different delims. A better solution with less false
+ // negatives would use data flow analysis to see where the
+ // template comes from and where it has been
+ return true
+ }
+ s, ok := ExprToString(j, call.Args[Arg("(*text/template.Template).Parse.text")])
+ if !ok {
+ return true
+ }
+ var err error
+ switch kind {
+ case "text":
+ _, err = texttemplate.New("").Parse(s)
+ case "html":
+ _, err = htmltemplate.New("").Parse(s)
+ }
+ if err != nil {
+ // TODO(dominikh): whitelist other parse errors, if any
+ if strings.Contains(err.Error(), "unexpected") {
+ j.Errorf(call.Args[Arg("(*text/template.Template).Parse.text")], "%s", err)
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckTimeSleepConstant(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "time.Sleep") {
+ return true
+ }
+ lit, ok := call.Args[Arg("time.Sleep.d")].(*ast.BasicLit)
+ if !ok {
+ return true
+ }
+ n, err := strconv.Atoi(lit.Value)
+ if err != nil {
+ return true
+ }
+ if n == 0 || n > 120 {
+ // time.Sleep(0) is a seldom used pattern in concurrency
+ // tests. >120 might be intentional. 120 was chosen
+ // because the user could've meant 2 minutes.
+ return true
+ }
+ recommendation := "time.Sleep(time.Nanosecond)"
+ if n != 1 {
+ recommendation = fmt.Sprintf("time.Sleep(%d * time.Nanosecond)", n)
+ }
+ j.Errorf(call.Args[Arg("time.Sleep.d")],
+ "sleeping for %d nanoseconds is probably a bug. Be explicit if it isn't: %s", n, recommendation)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckWaitgroupAdd(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ g, ok := node.(*ast.GoStmt)
+ if !ok {
+ return true
+ }
+ fun, ok := g.Call.Fun.(*ast.FuncLit)
+ if !ok {
+ return true
+ }
+ if len(fun.Body.List) == 0 {
+ return true
+ }
+ stmt, ok := fun.Body.List[0].(*ast.ExprStmt)
+ if !ok {
+ return true
+ }
+ call, ok := stmt.X.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ fn, ok := ObjectOf(j, sel.Sel).(*types.Func)
+ if !ok {
+ return true
+ }
+ if fn.FullName() == "(*sync.WaitGroup).Add" {
+ j.Errorf(sel, "should call %s before starting the goroutine to avoid a race",
+ Render(j, stmt))
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckInfiniteEmptyLoop(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.ForStmt)
+ if !ok || len(loop.Body.List) != 0 || loop.Post != nil {
+ return true
+ }
+
+ if loop.Init != nil {
+ // TODO(dh): this isn't strictly necessary, it just makes
+ // the check easier.
+ return true
+ }
+ // An empty loop is bad news in two cases: 1) The loop has no
+ // condition. In that case, it's just a loop that spins
+ // forever and as fast as it can, keeping a core busy. 2) The
+ // loop condition only consists of variable or field reads and
+ // operators on those. The only way those could change their
+ // value is with unsynchronised access, which constitutes a
+ // data race.
+ //
+ // If the condition contains any function calls, its behaviour
+ // is dynamic and the loop might terminate. Similarly for
+ // channel receives.
+
+ if loop.Cond != nil {
+ if hasSideEffects(loop.Cond) {
+ return true
+ }
+ if ident, ok := loop.Cond.(*ast.Ident); ok {
+ if k, ok := ObjectOf(j, ident).(*types.Const); ok {
+ if !constant.BoolVal(k.Val()) {
+ // don't flag `for false {}` loops. They're a debug aid.
+ return true
+ }
+ }
+ }
+ j.Errorf(loop, "loop condition never changes or has a race condition")
+ }
+ j.Errorf(loop, "this loop will spin, using 100%% CPU")
+
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckDeferInInfiniteLoop(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ mightExit := false
+ var defers []ast.Stmt
+ loop, ok := node.(*ast.ForStmt)
+ if !ok || loop.Cond != nil {
+ return true
+ }
+ fn2 := func(node ast.Node) bool {
+ switch stmt := node.(type) {
+ case *ast.ReturnStmt:
+ mightExit = true
+ case *ast.BranchStmt:
+ // TODO(dominikh): if this sees a break in a switch or
+ // select, it doesn't check if it breaks the loop or
+ // just the select/switch. This causes some false
+ // negatives.
+ if stmt.Tok == token.BREAK {
+ mightExit = true
+ }
+ case *ast.DeferStmt:
+ defers = append(defers, stmt)
+ case *ast.FuncLit:
+ // Don't look into function bodies
+ return false
+ }
+ return true
+ }
+ ast.Inspect(loop.Body, fn2)
+ if mightExit {
+ return true
+ }
+ for _, stmt := range defers {
+ j.Errorf(stmt, "defers in this infinite loop will never run")
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckDubiousDeferInChannelRangeLoop(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.RangeStmt)
+ if !ok {
+ return true
+ }
+ typ := TypeOf(j, loop.X)
+ _, ok = typ.Underlying().(*types.Chan)
+ if !ok {
+ return true
+ }
+ fn2 := func(node ast.Node) bool {
+ switch stmt := node.(type) {
+ case *ast.DeferStmt:
+ j.Errorf(stmt, "defers in this range loop won't run unless the channel gets closed")
+ case *ast.FuncLit:
+ // Don't look into function bodies
+ return false
+ }
+ return true
+ }
+ ast.Inspect(loop.Body, fn2)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckTestMainExit(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ if !isTestMain(j, node) {
+ return true
+ }
+
+ arg := ObjectOf(j, node.(*ast.FuncDecl).Type.Params.List[0].Names[0])
+ callsRun := false
+ fn2 := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ ident, ok := sel.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if arg != ObjectOf(j, ident) {
+ return true
+ }
+ if sel.Sel.Name == "Run" {
+ callsRun = true
+ return false
+ }
+ return true
+ }
+ ast.Inspect(node.(*ast.FuncDecl).Body, fn2)
+
+ callsExit := false
+ fn3 := func(node ast.Node) bool {
+ if IsCallToAST(j, node, "os.Exit") {
+ callsExit = true
+ return false
+ }
+ return true
+ }
+ ast.Inspect(node.(*ast.FuncDecl).Body, fn3)
+ if !callsExit && callsRun {
+ j.Errorf(node, "TestMain should call os.Exit to set exit code")
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func isTestMain(j *lint.Job, node ast.Node) bool {
+ decl, ok := node.(*ast.FuncDecl)
+ if !ok {
+ return false
+ }
+ if decl.Name.Name != "TestMain" {
+ return false
+ }
+ if len(decl.Type.Params.List) != 1 {
+ return false
+ }
+ arg := decl.Type.Params.List[0]
+ if len(arg.Names) != 1 {
+ return false
+ }
+ return IsOfType(j, arg.Type, "*testing.M")
+}
+
+func (c *Checker) CheckExec(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if !IsCallToAST(j, call, "os/exec.Command") {
+ return true
+ }
+ val, ok := ExprToString(j, call.Args[Arg("os/exec.Command.name")])
+ if !ok {
+ return true
+ }
+ if !strings.Contains(val, " ") || strings.Contains(val, `\`) || strings.Contains(val, "/") {
+ return true
+ }
+ j.Errorf(call.Args[Arg("os/exec.Command.name")],
+ "first argument to exec.Command looks like a shell command, but a program name or path are expected")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckLoopEmptyDefault(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.ForStmt)
+ if !ok || len(loop.Body.List) != 1 || loop.Cond != nil || loop.Init != nil {
+ return true
+ }
+ sel, ok := loop.Body.List[0].(*ast.SelectStmt)
+ if !ok {
+ return true
+ }
+ for _, c := range sel.Body.List {
+ if comm, ok := c.(*ast.CommClause); ok && comm.Comm == nil && len(comm.Body) == 0 {
+ j.Errorf(comm, "should not have an empty default case in a for+select loop. The loop will spin.")
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckLhsRhsIdentical(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ op, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ switch op.Op {
+ case token.EQL, token.NEQ:
+ if basic, ok := TypeOf(j, op.X).Underlying().(*types.Basic); ok {
+ if kind := basic.Kind(); kind == types.Float32 || kind == types.Float64 {
+ // f == f and f != f might be used to check for NaN
+ return true
+ }
+ }
+ case token.SUB, token.QUO, token.AND, token.REM, token.OR, token.XOR, token.AND_NOT,
+ token.LAND, token.LOR, token.LSS, token.GTR, token.LEQ, token.GEQ:
+ default:
+ // For some ops, such as + and *, it can make sense to
+ // have identical operands
+ return true
+ }
+
+ if Render(j, op.X) != Render(j, op.Y) {
+ return true
+ }
+ j.Errorf(op, "identical expressions on the left and right side of the '%s' operator", op.Op)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckScopedBreak(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ var body *ast.BlockStmt
+ switch node := node.(type) {
+ case *ast.ForStmt:
+ body = node.Body
+ case *ast.RangeStmt:
+ body = node.Body
+ default:
+ return true
+ }
+ for _, stmt := range body.List {
+ var blocks [][]ast.Stmt
+ switch stmt := stmt.(type) {
+ case *ast.SwitchStmt:
+ for _, c := range stmt.Body.List {
+ blocks = append(blocks, c.(*ast.CaseClause).Body)
+ }
+ case *ast.SelectStmt:
+ for _, c := range stmt.Body.List {
+ blocks = append(blocks, c.(*ast.CommClause).Body)
+ }
+ default:
+ continue
+ }
+
+ for _, body := range blocks {
+ if len(body) == 0 {
+ continue
+ }
+ lasts := []ast.Stmt{body[len(body)-1]}
+ // TODO(dh): unfold all levels of nested block
+ // statements, not just a single level if statement
+ if ifs, ok := lasts[0].(*ast.IfStmt); ok {
+ if len(ifs.Body.List) == 0 {
+ continue
+ }
+ lasts[0] = ifs.Body.List[len(ifs.Body.List)-1]
+
+ if block, ok := ifs.Else.(*ast.BlockStmt); ok {
+ if len(block.List) != 0 {
+ lasts = append(lasts, block.List[len(block.List)-1])
+ }
+ }
+ }
+ for _, last := range lasts {
+ branch, ok := last.(*ast.BranchStmt)
+ if !ok || branch.Tok != token.BREAK || branch.Label != nil {
+ continue
+ }
+ j.Errorf(branch, "ineffective break statement. Did you mean to break out of the outer loop?")
+ }
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckUnsafePrintf(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ var arg int
+ if IsCallToAnyAST(j, call, "fmt.Printf", "fmt.Sprintf", "log.Printf") {
+ arg = Arg("fmt.Printf.format")
+ } else if IsCallToAnyAST(j, call, "fmt.Fprintf") {
+ arg = Arg("fmt.Fprintf.format")
+ } else {
+ return true
+ }
+ if len(call.Args) != arg+1 {
+ return true
+ }
+ switch call.Args[arg].(type) {
+ case *ast.CallExpr, *ast.Ident:
+ default:
+ return true
+ }
+ j.Errorf(call.Args[arg],
+ "printf-style function with dynamic format string and no further arguments should use print-style function instead")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckEarlyDefer(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ block, ok := node.(*ast.BlockStmt)
+ if !ok {
+ return true
+ }
+ if len(block.List) < 2 {
+ return true
+ }
+ for i, stmt := range block.List {
+ if i == len(block.List)-1 {
+ break
+ }
+ assign, ok := stmt.(*ast.AssignStmt)
+ if !ok {
+ continue
+ }
+ if len(assign.Rhs) != 1 {
+ continue
+ }
+ if len(assign.Lhs) < 2 {
+ continue
+ }
+ if lhs, ok := assign.Lhs[len(assign.Lhs)-1].(*ast.Ident); ok && lhs.Name == "_" {
+ continue
+ }
+ call, ok := assign.Rhs[0].(*ast.CallExpr)
+ if !ok {
+ continue
+ }
+ sig, ok := TypeOf(j, call.Fun).(*types.Signature)
+ if !ok {
+ continue
+ }
+ if sig.Results().Len() < 2 {
+ continue
+ }
+ last := sig.Results().At(sig.Results().Len() - 1)
+ // FIXME(dh): check that it's error from universe, not
+ // another type of the same name
+ if last.Type().String() != "error" {
+ continue
+ }
+ lhs, ok := assign.Lhs[0].(*ast.Ident)
+ if !ok {
+ continue
+ }
+ def, ok := block.List[i+1].(*ast.DeferStmt)
+ if !ok {
+ continue
+ }
+ sel, ok := def.Call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ continue
+ }
+ ident, ok := selectorX(sel).(*ast.Ident)
+ if !ok {
+ continue
+ }
+ if ident.Obj != lhs.Obj {
+ continue
+ }
+ if sel.Sel.Name != "Close" {
+ continue
+ }
+ j.Errorf(def, "should check returned error before deferring %s", Render(j, def.Call))
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func selectorX(sel *ast.SelectorExpr) ast.Node {
+ switch x := sel.X.(type) {
+ case *ast.SelectorExpr:
+ return selectorX(x)
+ default:
+ return x
+ }
+}
+
+func (c *Checker) CheckEmptyCriticalSection(j *lint.Job) {
+ // Initially it might seem like this check would be easier to
+ // implement in SSA. After all, we're only checking for two
+ // consecutive method calls. In reality, however, there may be any
+ // number of other instructions between the lock and unlock, while
+ // still constituting an empty critical section. For example,
+ // given `m.x().Lock(); m.x().Unlock()`, there will be a call to
+ // x(). In the AST-based approach, this has a tiny potential for a
+ // false positive (the second call to x might be doing work that
+ // is protected by the mutex). In an SSA-based approach, however,
+ // it would miss a lot of real bugs.
+
+ mutexParams := func(s ast.Stmt) (x ast.Expr, funcName string, ok bool) {
+ expr, ok := s.(*ast.ExprStmt)
+ if !ok {
+ return nil, "", false
+ }
+ call, ok := expr.X.(*ast.CallExpr)
+ if !ok {
+ return nil, "", false
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return nil, "", false
+ }
+
+ fn, ok := ObjectOf(j, sel.Sel).(*types.Func)
+ if !ok {
+ return nil, "", false
+ }
+ sig := fn.Type().(*types.Signature)
+ if sig.Params().Len() != 0 || sig.Results().Len() != 0 {
+ return nil, "", false
+ }
+
+ return sel.X, fn.Name(), true
+ }
+
+ fn := func(node ast.Node) bool {
+ block, ok := node.(*ast.BlockStmt)
+ if !ok {
+ return true
+ }
+ if len(block.List) < 2 {
+ return true
+ }
+ for i := range block.List[:len(block.List)-1] {
+ sel1, method1, ok1 := mutexParams(block.List[i])
+ sel2, method2, ok2 := mutexParams(block.List[i+1])
+
+ if !ok1 || !ok2 || Render(j, sel1) != Render(j, sel2) {
+ continue
+ }
+ if (method1 == "Lock" && method2 == "Unlock") ||
+ (method1 == "RLock" && method2 == "RUnlock") {
+ j.Errorf(block.List[i+1], "empty critical section")
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+// cgo produces code like fn(&*_Cvar_kSomeCallbacks) which we don't
+// want to flag.
+var cgoIdent = regexp.MustCompile(`^_C(func|var)_.+$`)
+
+func (c *Checker) CheckIneffectiveCopy(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ if unary, ok := node.(*ast.UnaryExpr); ok {
+ if star, ok := unary.X.(*ast.StarExpr); ok && unary.Op == token.AND {
+ ident, ok := star.X.(*ast.Ident)
+ if !ok || !cgoIdent.MatchString(ident.Name) {
+ j.Errorf(unary, "&*x will be simplified to x. It will not copy x.")
+ }
+ }
+ }
+
+ if star, ok := node.(*ast.StarExpr); ok {
+ if unary, ok := star.X.(*ast.UnaryExpr); ok && unary.Op == token.AND {
+ j.Errorf(star, "*&x will be simplified to x. It will not copy x.")
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckDiffSizeComparison(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, b := range ssafn.Blocks {
+ for _, ins := range b.Instrs {
+ binop, ok := ins.(*ssa.BinOp)
+ if !ok {
+ continue
+ }
+ if binop.Op != token.EQL && binop.Op != token.NEQ {
+ continue
+ }
+ _, ok1 := binop.X.(*ssa.Slice)
+ _, ok2 := binop.Y.(*ssa.Slice)
+ if !ok1 && !ok2 {
+ continue
+ }
+ r := c.funcDescs.Get(ssafn).Ranges
+ r1, ok1 := r.Get(binop.X).(vrp.StringInterval)
+ r2, ok2 := r.Get(binop.Y).(vrp.StringInterval)
+ if !ok1 || !ok2 {
+ continue
+ }
+ if r1.Length.Intersection(r2.Length).Empty() {
+ j.Errorf(binop, "comparing strings of different sizes for equality will always return false")
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckCanonicalHeaderKey(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ assign, ok := node.(*ast.AssignStmt)
+ if ok {
+ // TODO(dh): This risks missing some Header reads, for
+ // example in `h1["foo"] = h2["foo"]` – these edge
+ // cases are probably rare enough to ignore for now.
+ for _, expr := range assign.Lhs {
+ op, ok := expr.(*ast.IndexExpr)
+ if !ok {
+ continue
+ }
+ if hasType(j, op.X, "net/http.Header") {
+ return false
+ }
+ }
+ return true
+ }
+ op, ok := node.(*ast.IndexExpr)
+ if !ok {
+ return true
+ }
+ if !hasType(j, op.X, "net/http.Header") {
+ return true
+ }
+ s, ok := ExprToString(j, op.Index)
+ if !ok {
+ return true
+ }
+ if s == http.CanonicalHeaderKey(s) {
+ return true
+ }
+ j.Errorf(op, "keys in http.Header are canonicalized, %q is not canonical; fix the constant or use http.CanonicalHeaderKey", s)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckBenchmarkN(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ assign, ok := node.(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if len(assign.Lhs) != 1 || len(assign.Rhs) != 1 {
+ return true
+ }
+ sel, ok := assign.Lhs[0].(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ if sel.Sel.Name != "N" {
+ return true
+ }
+ if !hasType(j, sel.X, "*testing.B") {
+ return true
+ }
+ j.Errorf(assign, "should not assign to %s", Render(j, sel))
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckUnreadVariableValues(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ if IsExample(ssafn) {
+ continue
+ }
+ node := ssafn.Syntax()
+ if node == nil {
+ continue
+ }
+
+ ast.Inspect(node, func(node ast.Node) bool {
+ assign, ok := node.(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if len(assign.Lhs) > 1 && len(assign.Rhs) == 1 {
+ // Either a function call with multiple return values,
+ // or a comma-ok assignment
+
+ val, _ := ssafn.ValueForExpr(assign.Rhs[0])
+ if val == nil {
+ return true
+ }
+ refs := val.Referrers()
+ if refs == nil {
+ return true
+ }
+ for _, ref := range *refs {
+ ex, ok := ref.(*ssa.Extract)
+ if !ok {
+ continue
+ }
+ exrefs := ex.Referrers()
+ if exrefs == nil {
+ continue
+ }
+ if len(FilterDebug(*exrefs)) == 0 {
+ lhs := assign.Lhs[ex.Index]
+ if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" {
+ continue
+ }
+ j.Errorf(lhs, "this value of %s is never used", lhs)
+ }
+ }
+ return true
+ }
+ for i, lhs := range assign.Lhs {
+ rhs := assign.Rhs[i]
+ if ident, ok := lhs.(*ast.Ident); !ok || ok && ident.Name == "_" {
+ continue
+ }
+ val, _ := ssafn.ValueForExpr(rhs)
+ if val == nil {
+ continue
+ }
+
+ refs := val.Referrers()
+ if refs == nil {
+ // TODO investigate why refs can be nil
+ return true
+ }
+ if len(FilterDebug(*refs)) == 0 {
+ j.Errorf(lhs, "this value of %s is never used", lhs)
+ }
+ }
+ return true
+ })
+ }
+}
+
+func (c *Checker) CheckPredeterminedBooleanExprs(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ ssabinop, ok := ins.(*ssa.BinOp)
+ if !ok {
+ continue
+ }
+ switch ssabinop.Op {
+ case token.GTR, token.LSS, token.EQL, token.NEQ, token.LEQ, token.GEQ:
+ default:
+ continue
+ }
+
+ xs, ok1 := consts(ssabinop.X, nil, nil)
+ ys, ok2 := consts(ssabinop.Y, nil, nil)
+ if !ok1 || !ok2 || len(xs) == 0 || len(ys) == 0 {
+ continue
+ }
+
+ trues := 0
+ for _, x := range xs {
+ for _, y := range ys {
+ if x.Value == nil {
+ if y.Value == nil {
+ trues++
+ }
+ continue
+ }
+ if constant.Compare(x.Value, ssabinop.Op, y.Value) {
+ trues++
+ }
+ }
+ }
+ b := trues != 0
+ if trues == 0 || trues == len(xs)*len(ys) {
+ j.Errorf(ssabinop, "binary expression is always %t for all possible values (%s %s %s)",
+ b, xs, ssabinop.Op, ys)
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckNilMaps(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ mu, ok := ins.(*ssa.MapUpdate)
+ if !ok {
+ continue
+ }
+ c, ok := mu.Map.(*ssa.Const)
+ if !ok {
+ continue
+ }
+ if c.Value != nil {
+ continue
+ }
+ j.Errorf(mu, "assignment to nil map")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckExtremeComparison(j *lint.Job) {
+ isobj := func(expr ast.Expr, name string) bool {
+ sel, ok := expr.(*ast.SelectorExpr)
+ if !ok {
+ return false
+ }
+ return IsObject(ObjectOf(j, sel.Sel), name)
+ }
+
+ fn := func(node ast.Node) bool {
+ expr, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ tx := TypeOf(j, expr.X)
+ basic, ok := tx.Underlying().(*types.Basic)
+ if !ok {
+ return true
+ }
+
+ var max string
+ var min string
+
+ switch basic.Kind() {
+ case types.Uint8:
+ max = "math.MaxUint8"
+ case types.Uint16:
+ max = "math.MaxUint16"
+ case types.Uint32:
+ max = "math.MaxUint32"
+ case types.Uint64:
+ max = "math.MaxUint64"
+ case types.Uint:
+ max = "math.MaxUint64"
+
+ case types.Int8:
+ min = "math.MinInt8"
+ max = "math.MaxInt8"
+ case types.Int16:
+ min = "math.MinInt16"
+ max = "math.MaxInt16"
+ case types.Int32:
+ min = "math.MinInt32"
+ max = "math.MaxInt32"
+ case types.Int64:
+ min = "math.MinInt64"
+ max = "math.MaxInt64"
+ case types.Int:
+ min = "math.MinInt64"
+ max = "math.MaxInt64"
+ }
+
+ if (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.Y, max) ||
+ (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.X, max) {
+ j.Errorf(expr, "no value of type %s is greater than %s", basic, max)
+ }
+ if expr.Op == token.LEQ && isobj(expr.Y, max) ||
+ expr.Op == token.GEQ && isobj(expr.X, max) {
+ j.Errorf(expr, "every value of type %s is <= %s", basic, max)
+ }
+
+ if (basic.Info() & types.IsUnsigned) != 0 {
+ if (expr.Op == token.LSS || expr.Op == token.LEQ) && IsIntLiteral(expr.Y, "0") ||
+ (expr.Op == token.GTR || expr.Op == token.GEQ) && IsIntLiteral(expr.X, "0") {
+ j.Errorf(expr, "no value of type %s is less than 0", basic)
+ }
+ if expr.Op == token.GEQ && IsIntLiteral(expr.Y, "0") ||
+ expr.Op == token.LEQ && IsIntLiteral(expr.X, "0") {
+ j.Errorf(expr, "every value of type %s is >= 0", basic)
+ }
+ } else {
+ if (expr.Op == token.LSS || expr.Op == token.LEQ) && isobj(expr.Y, min) ||
+ (expr.Op == token.GTR || expr.Op == token.GEQ) && isobj(expr.X, min) {
+ j.Errorf(expr, "no value of type %s is less than %s", basic, min)
+ }
+ if expr.Op == token.GEQ && isobj(expr.Y, min) ||
+ expr.Op == token.LEQ && isobj(expr.X, min) {
+ j.Errorf(expr, "every value of type %s is >= %s", basic, min)
+ }
+ }
+
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func consts(val ssa.Value, out []*ssa.Const, visitedPhis map[string]bool) ([]*ssa.Const, bool) {
+ if visitedPhis == nil {
+ visitedPhis = map[string]bool{}
+ }
+ var ok bool
+ switch val := val.(type) {
+ case *ssa.Phi:
+ if visitedPhis[val.Name()] {
+ break
+ }
+ visitedPhis[val.Name()] = true
+ vals := val.Operands(nil)
+ for _, phival := range vals {
+ out, ok = consts(*phival, out, visitedPhis)
+ if !ok {
+ return nil, false
+ }
+ }
+ case *ssa.Const:
+ out = append(out, val)
+ case *ssa.Convert:
+ out, ok = consts(val.X, out, visitedPhis)
+ if !ok {
+ return nil, false
+ }
+ default:
+ return nil, false
+ }
+ if len(out) < 2 {
+ return out, true
+ }
+ uniq := []*ssa.Const{out[0]}
+ for _, val := range out[1:] {
+ if val.Value == uniq[len(uniq)-1].Value {
+ continue
+ }
+ uniq = append(uniq, val)
+ }
+ return uniq, true
+}
+
+func (c *Checker) CheckLoopCondition(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ fn := func(node ast.Node) bool {
+ loop, ok := node.(*ast.ForStmt)
+ if !ok {
+ return true
+ }
+ if loop.Init == nil || loop.Cond == nil || loop.Post == nil {
+ return true
+ }
+ init, ok := loop.Init.(*ast.AssignStmt)
+ if !ok || len(init.Lhs) != 1 || len(init.Rhs) != 1 {
+ return true
+ }
+ cond, ok := loop.Cond.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ x, ok := cond.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ lhs, ok := init.Lhs[0].(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if x.Obj != lhs.Obj {
+ return true
+ }
+ if _, ok := loop.Post.(*ast.IncDecStmt); !ok {
+ return true
+ }
+
+ v, isAddr := ssafn.ValueForExpr(cond.X)
+ if v == nil || isAddr {
+ return true
+ }
+ switch v := v.(type) {
+ case *ssa.Phi:
+ ops := v.Operands(nil)
+ if len(ops) != 2 {
+ return true
+ }
+ _, ok := (*ops[0]).(*ssa.Const)
+ if !ok {
+ return true
+ }
+ sigma, ok := (*ops[1]).(*ssa.Sigma)
+ if !ok {
+ return true
+ }
+ if sigma.X != v {
+ return true
+ }
+ case *ssa.UnOp:
+ return true
+ }
+ j.Errorf(cond, "variable in loop condition never changes")
+
+ return true
+ }
+ Inspect(ssafn.Syntax(), fn)
+ }
+}
+
+func (c *Checker) CheckArgOverwritten(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ fn := func(node ast.Node) bool {
+ var typ *ast.FuncType
+ var body *ast.BlockStmt
+ switch fn := node.(type) {
+ case *ast.FuncDecl:
+ typ = fn.Type
+ body = fn.Body
+ case *ast.FuncLit:
+ typ = fn.Type
+ body = fn.Body
+ }
+ if body == nil {
+ return true
+ }
+ if len(typ.Params.List) == 0 {
+ return true
+ }
+ for _, field := range typ.Params.List {
+ for _, arg := range field.Names {
+ obj := ObjectOf(j, arg)
+ var ssaobj *ssa.Parameter
+ for _, param := range ssafn.Params {
+ if param.Object() == obj {
+ ssaobj = param
+ break
+ }
+ }
+ if ssaobj == nil {
+ continue
+ }
+ refs := ssaobj.Referrers()
+ if refs == nil {
+ continue
+ }
+ if len(FilterDebug(*refs)) != 0 {
+ continue
+ }
+
+ assigned := false
+ ast.Inspect(body, func(node ast.Node) bool {
+ assign, ok := node.(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ for _, lhs := range assign.Lhs {
+ ident, ok := lhs.(*ast.Ident)
+ if !ok {
+ continue
+ }
+ if ObjectOf(j, ident) == obj {
+ assigned = true
+ return false
+ }
+ }
+ return true
+ })
+ if assigned {
+ j.Errorf(arg, "argument %s is overwritten before first use", arg)
+ }
+ }
+ }
+ return true
+ }
+ Inspect(ssafn.Syntax(), fn)
+ }
+}
+
+func (c *Checker) CheckIneffectiveLoop(j *lint.Job) {
+ // This check detects some, but not all unconditional loop exits.
+ // We give up in the following cases:
+ //
+ // - a goto anywhere in the loop. The goto might skip over our
+ // return, and we don't check that it doesn't.
+ //
+ // - any nested, unlabelled continue, even if it is in another
+ // loop or closure.
+ fn := func(node ast.Node) bool {
+ var body *ast.BlockStmt
+ switch fn := node.(type) {
+ case *ast.FuncDecl:
+ body = fn.Body
+ case *ast.FuncLit:
+ body = fn.Body
+ default:
+ return true
+ }
+ if body == nil {
+ return true
+ }
+ labels := map[*ast.Object]ast.Stmt{}
+ ast.Inspect(body, func(node ast.Node) bool {
+ label, ok := node.(*ast.LabeledStmt)
+ if !ok {
+ return true
+ }
+ labels[label.Label.Obj] = label.Stmt
+ return true
+ })
+
+ ast.Inspect(body, func(node ast.Node) bool {
+ var loop ast.Node
+ var body *ast.BlockStmt
+ switch node := node.(type) {
+ case *ast.ForStmt:
+ body = node.Body
+ loop = node
+ case *ast.RangeStmt:
+ typ := TypeOf(j, node.X)
+ if _, ok := typ.Underlying().(*types.Map); ok {
+ // looping once over a map is a valid pattern for
+ // getting an arbitrary element.
+ return true
+ }
+ body = node.Body
+ loop = node
+ default:
+ return true
+ }
+ if len(body.List) < 2 {
+ // avoid flagging the somewhat common pattern of using
+ // a range loop to get the first element in a slice,
+ // or the first rune in a string.
+ return true
+ }
+ var unconditionalExit ast.Node
+ hasBranching := false
+ for _, stmt := range body.List {
+ switch stmt := stmt.(type) {
+ case *ast.BranchStmt:
+ switch stmt.Tok {
+ case token.BREAK:
+ if stmt.Label == nil || labels[stmt.Label.Obj] == loop {
+ unconditionalExit = stmt
+ }
+ case token.CONTINUE:
+ if stmt.Label == nil || labels[stmt.Label.Obj] == loop {
+ unconditionalExit = nil
+ return false
+ }
+ }
+ case *ast.ReturnStmt:
+ unconditionalExit = stmt
+ case *ast.IfStmt, *ast.ForStmt, *ast.RangeStmt, *ast.SwitchStmt, *ast.SelectStmt:
+ hasBranching = true
+ }
+ }
+ if unconditionalExit == nil || !hasBranching {
+ return false
+ }
+ ast.Inspect(body, func(node ast.Node) bool {
+ if branch, ok := node.(*ast.BranchStmt); ok {
+
+ switch branch.Tok {
+ case token.GOTO:
+ unconditionalExit = nil
+ return false
+ case token.CONTINUE:
+ if branch.Label != nil && labels[branch.Label.Obj] != loop {
+ return true
+ }
+ unconditionalExit = nil
+ return false
+ }
+ }
+ return true
+ })
+ if unconditionalExit != nil {
+ j.Errorf(unconditionalExit, "the surrounding loop is unconditionally terminated")
+ }
+ return true
+ })
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckNilContext(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ if len(call.Args) == 0 {
+ return true
+ }
+ if typ, ok := TypeOf(j, call.Args[0]).(*types.Basic); !ok || typ.Kind() != types.UntypedNil {
+ return true
+ }
+ sig, ok := TypeOf(j, call.Fun).(*types.Signature)
+ if !ok {
+ return true
+ }
+ if sig.Params().Len() == 0 {
+ return true
+ }
+ if !IsType(sig.Params().At(0).Type(), "context.Context") {
+ return true
+ }
+ j.Errorf(call.Args[0],
+ "do not pass a nil Context, even if a function permits it; pass context.TODO if you are unsure about which Context to use")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckSeeker(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ if sel.Sel.Name != "Seek" {
+ return true
+ }
+ if len(call.Args) != 2 {
+ return true
+ }
+ arg0, ok := call.Args[Arg("(io.Seeker).Seek.offset")].(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+ switch arg0.Sel.Name {
+ case "SeekStart", "SeekCurrent", "SeekEnd":
+ default:
+ return true
+ }
+ pkg, ok := arg0.X.(*ast.Ident)
+ if !ok {
+ return true
+ }
+ if pkg.Name != "io" {
+ return true
+ }
+ j.Errorf(call, "the first argument of io.Seeker is the offset, but an io.Seek* constant is being used instead")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckIneffectiveAppend(j *lint.Job) {
+ isAppend := func(ins ssa.Value) bool {
+ call, ok := ins.(*ssa.Call)
+ if !ok {
+ return false
+ }
+ if call.Call.IsInvoke() {
+ return false
+ }
+ if builtin, ok := call.Call.Value.(*ssa.Builtin); !ok || builtin.Name() != "append" {
+ return false
+ }
+ return true
+ }
+
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ val, ok := ins.(ssa.Value)
+ if !ok || !isAppend(val) {
+ continue
+ }
+
+ isUsed := false
+ visited := map[ssa.Instruction]bool{}
+ var walkRefs func(refs []ssa.Instruction)
+ walkRefs = func(refs []ssa.Instruction) {
+ loop:
+ for _, ref := range refs {
+ if visited[ref] {
+ continue
+ }
+ visited[ref] = true
+ if _, ok := ref.(*ssa.DebugRef); ok {
+ continue
+ }
+ switch ref := ref.(type) {
+ case *ssa.Phi:
+ walkRefs(*ref.Referrers())
+ case *ssa.Sigma:
+ walkRefs(*ref.Referrers())
+ case ssa.Value:
+ if !isAppend(ref) {
+ isUsed = true
+ } else {
+ walkRefs(*ref.Referrers())
+ }
+ case ssa.Instruction:
+ isUsed = true
+ break loop
+ }
+ }
+ }
+ refs := val.Referrers()
+ if refs == nil {
+ continue
+ }
+ walkRefs(*refs)
+ if !isUsed {
+ j.Errorf(ins, "this result of append is never used, except maybe in other appends")
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckConcurrentTesting(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ gostmt, ok := ins.(*ssa.Go)
+ if !ok {
+ continue
+ }
+ var fn *ssa.Function
+ switch val := gostmt.Call.Value.(type) {
+ case *ssa.Function:
+ fn = val
+ case *ssa.MakeClosure:
+ fn = val.Fn.(*ssa.Function)
+ default:
+ continue
+ }
+ if fn.Blocks == nil {
+ continue
+ }
+ for _, block := range fn.Blocks {
+ for _, ins := range block.Instrs {
+ call, ok := ins.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ if call.Call.IsInvoke() {
+ continue
+ }
+ callee := call.Call.StaticCallee()
+ if callee == nil {
+ continue
+ }
+ recv := callee.Signature.Recv()
+ if recv == nil {
+ continue
+ }
+ if !IsType(recv.Type(), "*testing.common") {
+ continue
+ }
+ fn, ok := call.Call.StaticCallee().Object().(*types.Func)
+ if !ok {
+ continue
+ }
+ name := fn.Name()
+ switch name {
+ case "FailNow", "Fatal", "Fatalf", "SkipNow", "Skip", "Skipf":
+ default:
+ continue
+ }
+ j.Errorf(gostmt, "the goroutine calls T.%s, which must be called in the same goroutine as the test", name)
+ }
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckCyclicFinalizer(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ node := c.funcDescs.CallGraph.CreateNode(ssafn)
+ for _, edge := range node.Out {
+ if edge.Callee.Func.RelString(nil) != "runtime.SetFinalizer" {
+ continue
+ }
+ arg0 := edge.Site.Common().Args[Arg("runtime.SetFinalizer.obj")]
+ if iface, ok := arg0.(*ssa.MakeInterface); ok {
+ arg0 = iface.X
+ }
+ unop, ok := arg0.(*ssa.UnOp)
+ if !ok {
+ continue
+ }
+ v, ok := unop.X.(*ssa.Alloc)
+ if !ok {
+ continue
+ }
+ arg1 := edge.Site.Common().Args[Arg("runtime.SetFinalizer.finalizer")]
+ if iface, ok := arg1.(*ssa.MakeInterface); ok {
+ arg1 = iface.X
+ }
+ mc, ok := arg1.(*ssa.MakeClosure)
+ if !ok {
+ continue
+ }
+ for _, b := range mc.Bindings {
+ if b == v {
+ pos := j.Program.DisplayPosition(mc.Fn.Pos())
+ j.Errorf(edge.Site, "the finalizer closes over the object, preventing the finalizer from ever running (at %s)", pos)
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckSliceOutOfBounds(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ ia, ok := ins.(*ssa.IndexAddr)
+ if !ok {
+ continue
+ }
+ if _, ok := ia.X.Type().Underlying().(*types.Slice); !ok {
+ continue
+ }
+ sr, ok1 := c.funcDescs.Get(ssafn).Ranges[ia.X].(vrp.SliceInterval)
+ idxr, ok2 := c.funcDescs.Get(ssafn).Ranges[ia.Index].(vrp.IntInterval)
+ if !ok1 || !ok2 || !sr.IsKnown() || !idxr.IsKnown() || sr.Length.Empty() || idxr.Empty() {
+ continue
+ }
+ if idxr.Lower.Cmp(sr.Length.Upper) >= 0 {
+ j.Errorf(ia, "index out of bounds")
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckDeferLock(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ instrs := FilterDebug(block.Instrs)
+ if len(instrs) < 2 {
+ continue
+ }
+ for i, ins := range instrs[:len(instrs)-1] {
+ call, ok := ins.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ if !IsCallTo(call.Common(), "(*sync.Mutex).Lock") && !IsCallTo(call.Common(), "(*sync.RWMutex).RLock") {
+ continue
+ }
+ nins, ok := instrs[i+1].(*ssa.Defer)
+ if !ok {
+ continue
+ }
+ if !IsCallTo(&nins.Call, "(*sync.Mutex).Lock") && !IsCallTo(&nins.Call, "(*sync.RWMutex).RLock") {
+ continue
+ }
+ if call.Common().Args[0] != nins.Call.Args[0] {
+ continue
+ }
+ name := shortCallName(call.Common())
+ alt := ""
+ switch name {
+ case "Lock":
+ alt = "Unlock"
+ case "RLock":
+ alt = "RUnlock"
+ }
+ j.Errorf(nins, "deferring %s right after having locked already; did you mean to defer %s?", name, alt)
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckNaNComparison(j *lint.Job) {
+ isNaN := func(v ssa.Value) bool {
+ call, ok := v.(*ssa.Call)
+ if !ok {
+ return false
+ }
+ return IsCallTo(call.Common(), "math.NaN")
+ }
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ ins, ok := ins.(*ssa.BinOp)
+ if !ok {
+ continue
+ }
+ if isNaN(ins.X) || isNaN(ins.Y) {
+ j.Errorf(ins, "no value is equal to NaN, not even NaN itself")
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckInfiniteRecursion(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ node := c.funcDescs.CallGraph.CreateNode(ssafn)
+ for _, edge := range node.Out {
+ if edge.Callee != node {
+ continue
+ }
+ if _, ok := edge.Site.(*ssa.Go); ok {
+ // Recursively spawning goroutines doesn't consume
+ // stack space infinitely, so don't flag it.
+ continue
+ }
+
+ block := edge.Site.Block()
+ canReturn := false
+ for _, b := range ssafn.Blocks {
+ if block.Dominates(b) {
+ continue
+ }
+ if len(b.Instrs) == 0 {
+ continue
+ }
+ if _, ok := b.Instrs[len(b.Instrs)-1].(*ssa.Return); ok {
+ canReturn = true
+ break
+ }
+ }
+ if canReturn {
+ continue
+ }
+ j.Errorf(edge.Site, "infinite recursive call")
+ }
+ }
+}
+
+func objectName(obj types.Object) string {
+ if obj == nil {
+ return ""
+ }
+ var name string
+ if obj.Pkg() != nil && obj.Pkg().Scope().Lookup(obj.Name()) == obj {
+ s := obj.Pkg().Path()
+ if s != "" {
+ name += s + "."
+ }
+ }
+ name += obj.Name()
+ return name
+}
+
+func isName(j *lint.Job, expr ast.Expr, name string) bool {
+ var obj types.Object
+ switch expr := expr.(type) {
+ case *ast.Ident:
+ obj = ObjectOf(j, expr)
+ case *ast.SelectorExpr:
+ obj = ObjectOf(j, expr.Sel)
+ }
+ return objectName(obj) == name
+}
+
+func (c *Checker) CheckLeakyTimeTick(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ if IsInMain(j, ssafn) || IsInTest(j, ssafn) {
+ continue
+ }
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ call, ok := ins.(*ssa.Call)
+ if !ok || !IsCallTo(call.Common(), "time.Tick") {
+ continue
+ }
+ if c.funcDescs.Get(call.Parent()).Infinite {
+ continue
+ }
+ j.Errorf(call, "using time.Tick leaks the underlying ticker, consider using it only in endless functions, tests and the main package, and use time.NewTicker here")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckDoubleNegation(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ unary1, ok := node.(*ast.UnaryExpr)
+ if !ok {
+ return true
+ }
+ unary2, ok := unary1.X.(*ast.UnaryExpr)
+ if !ok {
+ return true
+ }
+ if unary1.Op != token.NOT || unary2.Op != token.NOT {
+ return true
+ }
+ j.Errorf(unary1, "negating a boolean twice has no effect; is this a typo?")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func hasSideEffects(node ast.Node) bool {
+ dynamic := false
+ ast.Inspect(node, func(node ast.Node) bool {
+ switch node := node.(type) {
+ case *ast.CallExpr:
+ dynamic = true
+ return false
+ case *ast.UnaryExpr:
+ if node.Op == token.ARROW {
+ dynamic = true
+ return false
+ }
+ }
+ return true
+ })
+ return dynamic
+}
+
+func (c *Checker) CheckRepeatedIfElse(j *lint.Job) {
+ seen := map[ast.Node]bool{}
+
+ var collectConds func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr)
+ collectConds = func(ifstmt *ast.IfStmt, inits []ast.Stmt, conds []ast.Expr) ([]ast.Stmt, []ast.Expr) {
+ seen[ifstmt] = true
+ if ifstmt.Init != nil {
+ inits = append(inits, ifstmt.Init)
+ }
+ conds = append(conds, ifstmt.Cond)
+ if elsestmt, ok := ifstmt.Else.(*ast.IfStmt); ok {
+ return collectConds(elsestmt, inits, conds)
+ }
+ return inits, conds
+ }
+ fn := func(node ast.Node) bool {
+ ifstmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ if seen[ifstmt] {
+ return true
+ }
+ inits, conds := collectConds(ifstmt, nil, nil)
+ if len(inits) > 0 {
+ return true
+ }
+ for _, cond := range conds {
+ if hasSideEffects(cond) {
+ return true
+ }
+ }
+ counts := map[string]int{}
+ for _, cond := range conds {
+ s := Render(j, cond)
+ counts[s]++
+ if counts[s] == 2 {
+ j.Errorf(cond, "this condition occurs multiple times in this if/else if chain")
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckSillyBitwiseOps(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ ins, ok := ins.(*ssa.BinOp)
+ if !ok {
+ continue
+ }
+
+ if c, ok := ins.Y.(*ssa.Const); !ok || c.Value == nil || c.Value.Kind() != constant.Int || c.Uint64() != 0 {
+ continue
+ }
+ switch ins.Op {
+ case token.AND, token.OR, token.XOR:
+ default:
+ // we do not flag shifts because too often, x<<0 is part
+ // of a pattern, x<<0, x<<8, x<<16, ...
+ continue
+ }
+ path, _ := astutil.PathEnclosingInterval(j.File(ins), ins.Pos(), ins.Pos())
+ if len(path) == 0 {
+ continue
+ }
+ if node, ok := path[0].(*ast.BinaryExpr); !ok || !IsZero(node.Y) {
+ continue
+ }
+
+ switch ins.Op {
+ case token.AND:
+ j.Errorf(ins, "x & 0 always equals 0")
+ case token.OR, token.XOR:
+ j.Errorf(ins, "x %s 0 always equals x", ins.Op)
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckNonOctalFileMode(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+ sig, ok := TypeOf(j, call.Fun).(*types.Signature)
+ if !ok {
+ return true
+ }
+ n := sig.Params().Len()
+ var args []int
+ for i := 0; i < n; i++ {
+ typ := sig.Params().At(i).Type()
+ if IsType(typ, "os.FileMode") {
+ args = append(args, i)
+ }
+ }
+ for _, i := range args {
+ lit, ok := call.Args[i].(*ast.BasicLit)
+ if !ok {
+ continue
+ }
+ if len(lit.Value) == 3 &&
+ lit.Value[0] != '0' &&
+ lit.Value[0] >= '0' && lit.Value[0] <= '7' &&
+ lit.Value[1] >= '0' && lit.Value[1] <= '7' &&
+ lit.Value[2] >= '0' && lit.Value[2] <= '7' {
+
+ v, err := strconv.ParseInt(lit.Value, 10, 64)
+ if err != nil {
+ continue
+ }
+ j.Errorf(call.Args[i], "file mode '%s' evaluates to %#o; did you mean '0%s'?", lit.Value, v, lit.Value)
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckPureFunctions(j *lint.Job) {
+fnLoop:
+ for _, ssafn := range j.Program.InitialFunctions {
+ if IsInTest(j, ssafn) {
+ params := ssafn.Signature.Params()
+ for i := 0; i < params.Len(); i++ {
+ param := params.At(i)
+ if IsType(param.Type(), "*testing.B") {
+ // Ignore discarded pure functions in code related
+ // to benchmarks. Instead of matching BenchmarkFoo
+ // functions, we match any function accepting a
+ // *testing.B. Benchmarks sometimes call generic
+ // functions for doing the actual work, and
+ // checking for the parameter is a lot easier and
+ // faster than analyzing call trees.
+ continue fnLoop
+ }
+ }
+ }
+
+ for _, b := range ssafn.Blocks {
+ for _, ins := range b.Instrs {
+ ins, ok := ins.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ refs := ins.Referrers()
+ if refs == nil || len(FilterDebug(*refs)) > 0 {
+ continue
+ }
+ callee := ins.Common().StaticCallee()
+ if callee == nil {
+ continue
+ }
+ if c.funcDescs.Get(callee).Pure && !c.funcDescs.Get(callee).Stub {
+ j.Errorf(ins, "%s is a pure function but its return value is ignored", callee.Name())
+ continue
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) isDeprecated(j *lint.Job, ident *ast.Ident) (bool, string) {
+ obj := ObjectOf(j, ident)
+ if obj.Pkg() == nil {
+ return false, ""
+ }
+ alt := c.deprecatedObjs[obj]
+ return alt != "", alt
+}
+
+func (c *Checker) CheckDeprecated(j *lint.Job) {
+ // Selectors can appear outside of function literals, e.g. when
+ // declaring package level variables.
+
+ var ssafn *ssa.Function
+ stack := 0
+ fn := func(node ast.Node) bool {
+ if node == nil {
+ stack--
+ } else {
+ stack++
+ }
+ if stack == 1 {
+ ssafn = nil
+ }
+ if fn, ok := node.(*ast.FuncDecl); ok {
+ ssafn = j.Program.SSA.FuncValue(ObjectOf(j, fn.Name).(*types.Func))
+ }
+ sel, ok := node.(*ast.SelectorExpr)
+ if !ok {
+ return true
+ }
+
+ obj := ObjectOf(j, sel.Sel)
+ if obj.Pkg() == nil {
+ return true
+ }
+ nodePkg := j.NodePackage(node).Types
+ if nodePkg == obj.Pkg() || obj.Pkg().Path()+"_test" == nodePkg.Path() {
+ // Don't flag stuff in our own package
+ return true
+ }
+ if ok, alt := c.isDeprecated(j, sel.Sel); ok {
+ // Look for the first available alternative, not the first
+ // version something was deprecated in. If a function was
+ // deprecated in Go 1.6, an alternative has been available
+ // already in 1.0, and we're targeting 1.2, it still
+ // makes sense to use the alternative from 1.0, to be
+ // future-proof.
+ minVersion := deprecated.Stdlib[SelectorName(j, sel)].AlternativeAvailableSince
+ if !IsGoVersion(j, minVersion) {
+ return true
+ }
+
+ if ssafn != nil {
+ if _, ok := c.deprecatedObjs[ssafn.Object()]; ok {
+ // functions that are deprecated may use deprecated
+ // symbols
+ return true
+ }
+ }
+ j.Errorf(sel, "%s is deprecated: %s", Render(j, sel), alt)
+ return true
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) callChecker(rules map[string]CallCheck) func(j *lint.Job) {
+ return func(j *lint.Job) {
+ c.checkCalls(j, rules)
+ }
+}
+
+func (c *Checker) checkCalls(j *lint.Job, rules map[string]CallCheck) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ node := c.funcDescs.CallGraph.CreateNode(ssafn)
+ for _, edge := range node.Out {
+ callee := edge.Callee.Func
+ obj, ok := callee.Object().(*types.Func)
+ if !ok {
+ continue
+ }
+
+ r, ok := rules[obj.FullName()]
+ if !ok {
+ continue
+ }
+ var args []*Argument
+ ssaargs := edge.Site.Common().Args
+ if callee.Signature.Recv() != nil {
+ ssaargs = ssaargs[1:]
+ }
+ for _, arg := range ssaargs {
+ if iarg, ok := arg.(*ssa.MakeInterface); ok {
+ arg = iarg.X
+ }
+ vr := c.funcDescs.Get(edge.Site.Parent()).Ranges[arg]
+ args = append(args, &Argument{Value: Value{arg, vr}})
+ }
+ call := &Call{
+ Job: j,
+ Instr: edge.Site,
+ Args: args,
+ Checker: c,
+ Parent: edge.Site.Parent(),
+ }
+ r(call)
+ for idx, arg := range call.Args {
+ _ = idx
+ for _, e := range arg.invalids {
+ // path, _ := astutil.PathEnclosingInterval(f.File, edge.Site.Pos(), edge.Site.Pos())
+ // if len(path) < 2 {
+ // continue
+ // }
+ // astcall, ok := path[0].(*ast.CallExpr)
+ // if !ok {
+ // continue
+ // }
+ // j.Errorf(astcall.Args[idx], "%s", e)
+
+ j.Errorf(edge.Site, "%s", e)
+ }
+ }
+ for _, e := range call.invalids {
+ j.Errorf(call.Instr.Common(), "%s", e)
+ }
+ }
+ }
+}
+
+func shortCallName(call *ssa.CallCommon) string {
+ if call.IsInvoke() {
+ return ""
+ }
+ switch v := call.Value.(type) {
+ case *ssa.Function:
+ fn, ok := v.Object().(*types.Func)
+ if !ok {
+ return ""
+ }
+ return fn.Name()
+ case *ssa.Builtin:
+ return v.Name()
+ }
+ return ""
+}
+
+func (c *Checker) CheckWriterBufferModified(j *lint.Job) {
+ // TODO(dh): this might be a good candidate for taint analysis.
+ // Taint the argument as MUST_NOT_MODIFY, then propagate that
+ // through functions like bytes.Split
+
+ for _, ssafn := range j.Program.InitialFunctions {
+ sig := ssafn.Signature
+ if ssafn.Name() != "Write" || sig.Recv() == nil || sig.Params().Len() != 1 || sig.Results().Len() != 2 {
+ continue
+ }
+ tArg, ok := sig.Params().At(0).Type().(*types.Slice)
+ if !ok {
+ continue
+ }
+ if basic, ok := tArg.Elem().(*types.Basic); !ok || basic.Kind() != types.Byte {
+ continue
+ }
+ if basic, ok := sig.Results().At(0).Type().(*types.Basic); !ok || basic.Kind() != types.Int {
+ continue
+ }
+ if named, ok := sig.Results().At(1).Type().(*types.Named); !ok || !IsType(named, "error") {
+ continue
+ }
+
+ for _, block := range ssafn.Blocks {
+ for _, ins := range block.Instrs {
+ switch ins := ins.(type) {
+ case *ssa.Store:
+ addr, ok := ins.Addr.(*ssa.IndexAddr)
+ if !ok {
+ continue
+ }
+ if addr.X != ssafn.Params[1] {
+ continue
+ }
+ j.Errorf(ins, "io.Writer.Write must not modify the provided buffer, not even temporarily")
+ case *ssa.Call:
+ if !IsCallTo(ins.Common(), "append") {
+ continue
+ }
+ if ins.Common().Args[0] != ssafn.Params[1] {
+ continue
+ }
+ j.Errorf(ins, "io.Writer.Write must not modify the provided buffer, not even temporarily")
+ }
+ }
+ }
+ }
+}
+
+func loopedRegexp(name string) CallCheck {
+ return func(call *Call) {
+ if len(extractConsts(call.Args[0].Value.Value)) == 0 {
+ return
+ }
+ if !call.Checker.isInLoop(call.Instr.Block()) {
+ return
+ }
+ call.Invalid(fmt.Sprintf("calling %s in a loop has poor performance, consider using regexp.Compile", name))
+ }
+}
+
+func (c *Checker) CheckEmptyBranch(j *lint.Job) {
+ for _, ssafn := range j.Program.InitialFunctions {
+ if ssafn.Syntax() == nil {
+ continue
+ }
+ if IsGenerated(j.File(ssafn.Syntax())) {
+ continue
+ }
+ if IsExample(ssafn) {
+ continue
+ }
+ fn := func(node ast.Node) bool {
+ ifstmt, ok := node.(*ast.IfStmt)
+ if !ok {
+ return true
+ }
+ if ifstmt.Else != nil {
+ b, ok := ifstmt.Else.(*ast.BlockStmt)
+ if !ok || len(b.List) != 0 {
+ return true
+ }
+ j.Errorf(ifstmt.Else, "empty branch")
+ }
+ if len(ifstmt.Body.List) != 0 {
+ return true
+ }
+ j.Errorf(ifstmt, "empty branch")
+ return true
+ }
+ Inspect(ssafn.Syntax(), fn)
+ }
+}
+
+func (c *Checker) CheckMapBytesKey(j *lint.Job) {
+ for _, fn := range j.Program.InitialFunctions {
+ for _, b := range fn.Blocks {
+ insLoop:
+ for _, ins := range b.Instrs {
+ // find []byte -> string conversions
+ conv, ok := ins.(*ssa.Convert)
+ if !ok || conv.Type() != types.Universe.Lookup("string").Type() {
+ continue
+ }
+ if s, ok := conv.X.Type().(*types.Slice); !ok || s.Elem() != types.Universe.Lookup("byte").Type() {
+ continue
+ }
+ refs := conv.Referrers()
+ // need at least two (DebugRef) references: the
+ // conversion and the *ast.Ident
+ if refs == nil || len(*refs) < 2 {
+ continue
+ }
+ ident := false
+ // skip first reference, that's the conversion itself
+ for _, ref := range (*refs)[1:] {
+ switch ref := ref.(type) {
+ case *ssa.DebugRef:
+ if _, ok := ref.Expr.(*ast.Ident); !ok {
+ // the string seems to be used somewhere
+ // unexpected; the default branch should
+ // catch this already, but be safe
+ continue insLoop
+ } else {
+ ident = true
+ }
+ case *ssa.Lookup:
+ default:
+ // the string is used somewhere else than a
+ // map lookup
+ continue insLoop
+ }
+ }
+
+ // the result of the conversion wasn't assigned to an
+ // identifier
+ if !ident {
+ continue
+ }
+ j.Errorf(conv, "m[string(key)] would be more efficient than k := string(key); m[k]")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckRangeStringRunes(j *lint.Job) {
+ sharedcheck.CheckRangeStringRunes(j)
+}
+
+func (c *Checker) CheckSelfAssignment(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ assign, ok := node.(*ast.AssignStmt)
+ if !ok {
+ return true
+ }
+ if assign.Tok != token.ASSIGN || len(assign.Lhs) != len(assign.Rhs) {
+ return true
+ }
+ for i, stmt := range assign.Lhs {
+ rlh := Render(j, stmt)
+ rrh := Render(j, assign.Rhs[i])
+ if rlh == rrh {
+ j.Errorf(assign, "self-assignment of %s to %s", rrh, rlh)
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func buildTagsIdentical(s1, s2 []string) bool {
+ if len(s1) != len(s2) {
+ return false
+ }
+ s1s := make([]string, len(s1))
+ copy(s1s, s1)
+ sort.Strings(s1s)
+ s2s := make([]string, len(s2))
+ copy(s2s, s2)
+ sort.Strings(s2s)
+ for i, s := range s1s {
+ if s != s2s[i] {
+ return false
+ }
+ }
+ return true
+}
+
+func (c *Checker) CheckDuplicateBuildConstraints(job *lint.Job) {
+ for _, f := range job.Program.Files {
+ constraints := buildTags(f)
+ for i, constraint1 := range constraints {
+ for j, constraint2 := range constraints {
+ if i >= j {
+ continue
+ }
+ if buildTagsIdentical(constraint1, constraint2) {
+ job.Errorf(f, "identical build constraints %q and %q",
+ strings.Join(constraint1, " "),
+ strings.Join(constraint2, " "))
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckSillyRegexp(j *lint.Job) {
+ // We could use the rule checking engine for this, but the
+ // arguments aren't really invalid.
+ for _, fn := range j.Program.InitialFunctions {
+ for _, b := range fn.Blocks {
+ for _, ins := range b.Instrs {
+ call, ok := ins.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ switch CallName(call.Common()) {
+ case "regexp.MustCompile", "regexp.Compile", "regexp.Match", "regexp.MatchReader", "regexp.MatchString":
+ default:
+ continue
+ }
+ c, ok := call.Common().Args[0].(*ssa.Const)
+ if !ok {
+ continue
+ }
+ s := constant.StringVal(c.Value)
+ re, err := syntax.Parse(s, 0)
+ if err != nil {
+ continue
+ }
+ if re.Op != syntax.OpLiteral && re.Op != syntax.OpEmptyMatch {
+ continue
+ }
+ j.Errorf(call, "regular expression does not contain any meta characters")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckMissingEnumTypesInDeclaration(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ decl, ok := node.(*ast.GenDecl)
+ if !ok {
+ return true
+ }
+ if !decl.Lparen.IsValid() {
+ return true
+ }
+ if decl.Tok != token.CONST {
+ return true
+ }
+
+ groups := GroupSpecs(j, decl.Specs)
+ groupLoop:
+ for _, group := range groups {
+ if len(group) < 2 {
+ continue
+ }
+ if group[0].(*ast.ValueSpec).Type == nil {
+ // first constant doesn't have a type
+ continue groupLoop
+ }
+ for i, spec := range group {
+ spec := spec.(*ast.ValueSpec)
+ if len(spec.Names) != 1 || len(spec.Values) != 1 {
+ continue groupLoop
+ }
+ switch v := spec.Values[0].(type) {
+ case *ast.BasicLit:
+ case *ast.UnaryExpr:
+ if _, ok := v.X.(*ast.BasicLit); !ok {
+ continue groupLoop
+ }
+ default:
+ // if it's not a literal it might be typed, such as
+ // time.Microsecond = 1000 * Nanosecond
+ continue groupLoop
+ }
+ if i == 0 {
+ continue
+ }
+ if spec.Type != nil {
+ continue groupLoop
+ }
+ }
+ j.Errorf(group[0], "only the first constant in this group has an explicit type")
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckTimerResetReturnValue(j *lint.Job) {
+ for _, fn := range j.Program.InitialFunctions {
+ for _, block := range fn.Blocks {
+ for _, ins := range block.Instrs {
+ call, ok := ins.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ if !IsCallTo(call.Common(), "(*time.Timer).Reset") {
+ continue
+ }
+ refs := call.Referrers()
+ if refs == nil {
+ continue
+ }
+ for _, ref := range FilterDebug(*refs) {
+ ifstmt, ok := ref.(*ssa.If)
+ if !ok {
+ continue
+ }
+
+ found := false
+ for _, succ := range ifstmt.Block().Succs {
+ if len(succ.Preds) != 1 {
+ // Merge point, not a branch in the
+ // syntactical sense.
+
+ // FIXME(dh): this is broken for if
+ // statements a la "if x || y"
+ continue
+ }
+ ssautil.Walk(succ, func(b *ssa.BasicBlock) bool {
+ if !succ.Dominates(b) {
+ // We've reached the end of the branch
+ return false
+ }
+ for _, ins := range b.Instrs {
+ // TODO(dh): we should check that
+ // we're receiving from the channel of
+ // a time.Timer to further reduce
+ // false positives. Not a key
+ // priority, considering the rarity of
+ // Reset and the tiny likeliness of a
+ // false positive
+ if ins, ok := ins.(*ssa.UnOp); ok && ins.Op == token.ARROW && IsType(ins.X.Type(), "<-chan time.Time") {
+ found = true
+ return false
+ }
+ }
+ return true
+ })
+ }
+
+ if found {
+ j.Errorf(call, "it is not possible to use Reset's return value correctly, as there is a race condition between draining the channel and the new timer expiring")
+ }
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckToLowerToUpperComparison(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ binExpr, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+
+ var negative bool
+ switch binExpr.Op {
+ case token.EQL:
+ negative = false
+ case token.NEQ:
+ negative = true
+ default:
+ return true
+ }
+
+ const (
+ lo = "strings.ToLower"
+ up = "strings.ToUpper"
+ )
+
+ var call string
+ if IsCallToAST(j, binExpr.X, lo) && IsCallToAST(j, binExpr.Y, lo) {
+ call = lo
+ } else if IsCallToAST(j, binExpr.X, up) && IsCallToAST(j, binExpr.Y, up) {
+ call = up
+ } else {
+ return true
+ }
+
+ bang := ""
+ if negative {
+ bang = "!"
+ }
+
+ j.Errorf(binExpr, "should use %sstrings.EqualFold(a, b) instead of %s(a) %s %s(b)", bang, call, binExpr.Op, call)
+ return true
+ }
+
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckUnreachableTypeCases(j *lint.Job) {
+ // Check if T subsumes V in a type switch. T subsumes V if T is an interface and T's method set is a subset of V's method set.
+ subsumes := func(T, V types.Type) bool {
+ tIface, ok := T.Underlying().(*types.Interface)
+ if !ok {
+ return false
+ }
+
+ return types.Implements(V, tIface)
+ }
+
+ subsumesAny := func(Ts, Vs []types.Type) (types.Type, types.Type, bool) {
+ for _, T := range Ts {
+ for _, V := range Vs {
+ if subsumes(T, V) {
+ return T, V, true
+ }
+ }
+ }
+
+ return nil, nil, false
+ }
+
+ fn := func(node ast.Node) bool {
+ tsStmt, ok := node.(*ast.TypeSwitchStmt)
+ if !ok {
+ return true
+ }
+
+ type ccAndTypes struct {
+ cc *ast.CaseClause
+ types []types.Type
+ }
+
+ // All asserted types in the order of case clauses.
+ ccs := make([]ccAndTypes, 0, len(tsStmt.Body.List))
+ for _, stmt := range tsStmt.Body.List {
+ cc, _ := stmt.(*ast.CaseClause)
+
+ // Exclude the 'default' case.
+ if len(cc.List) == 0 {
+ continue
+ }
+
+ Ts := make([]types.Type, len(cc.List))
+ for i, expr := range cc.List {
+ Ts[i] = TypeOf(j, expr)
+ }
+
+ ccs = append(ccs, ccAndTypes{cc: cc, types: Ts})
+ }
+
+ if len(ccs) <= 1 {
+ // Zero or one case clauses, nothing to check.
+ return true
+ }
+
+ // Check if case clauses following cc have types that are subsumed by cc.
+ for i, cc := range ccs[:len(ccs)-1] {
+ for _, next := range ccs[i+1:] {
+ if T, V, yes := subsumesAny(cc.types, next.types); yes {
+ j.Errorf(next.cc, "unreachable case clause: %s will always match before %s", T.String(), V.String())
+ }
+ }
+ }
+
+ return true
+ }
+
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/rules.go b/vendor/github.com/golangci/go-tools/staticcheck/rules.go
new file mode 100644
index 00000000000..1e6ef8ce3e8
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/rules.go
@@ -0,0 +1,322 @@
+package staticcheck
+
+import (
+ "fmt"
+ "go/constant"
+ "go/types"
+ "net"
+ "net/url"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+ "unicode/utf8"
+
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+ "github.com/golangci/go-tools/ssa"
+ "github.com/golangci/go-tools/staticcheck/vrp"
+)
+
+const (
+ MsgInvalidHostPort = "invalid port or service name in host:port pair"
+ MsgInvalidUTF8 = "argument is not a valid UTF-8 encoded string"
+ MsgNonUniqueCutset = "cutset contains duplicate characters"
+)
+
+type Call struct {
+ Job *lint.Job
+ Instr ssa.CallInstruction
+ Args []*Argument
+
+ Checker *Checker
+ Parent *ssa.Function
+
+ invalids []string
+}
+
+func (c *Call) Invalid(msg string) {
+ c.invalids = append(c.invalids, msg)
+}
+
+type Argument struct {
+ Value Value
+ invalids []string
+}
+
+func (arg *Argument) Invalid(msg string) {
+ arg.invalids = append(arg.invalids, msg)
+}
+
+type Value struct {
+ Value ssa.Value
+ Range vrp.Range
+}
+
+type CallCheck func(call *Call)
+
+func extractConsts(v ssa.Value) []*ssa.Const {
+ switch v := v.(type) {
+ case *ssa.Const:
+ return []*ssa.Const{v}
+ case *ssa.MakeInterface:
+ return extractConsts(v.X)
+ default:
+ return nil
+ }
+}
+
+func ValidateRegexp(v Value) error {
+ for _, c := range extractConsts(v.Value) {
+ if c.Value == nil {
+ continue
+ }
+ if c.Value.Kind() != constant.String {
+ continue
+ }
+ s := constant.StringVal(c.Value)
+ if _, err := regexp.Compile(s); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func ValidateTimeLayout(v Value) error {
+ for _, c := range extractConsts(v.Value) {
+ if c.Value == nil {
+ continue
+ }
+ if c.Value.Kind() != constant.String {
+ continue
+ }
+ s := constant.StringVal(c.Value)
+ s = strings.Replace(s, "_", " ", -1)
+ s = strings.Replace(s, "Z", "-", -1)
+ _, err := time.Parse(s, s)
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func ValidateURL(v Value) error {
+ for _, c := range extractConsts(v.Value) {
+ if c.Value == nil {
+ continue
+ }
+ if c.Value.Kind() != constant.String {
+ continue
+ }
+ s := constant.StringVal(c.Value)
+ _, err := url.Parse(s)
+ if err != nil {
+ return fmt.Errorf("%q is not a valid URL: %s", s, err)
+ }
+ }
+ return nil
+}
+
+func IntValue(v Value, z vrp.Z) bool {
+ r, ok := v.Range.(vrp.IntInterval)
+ if !ok || !r.IsKnown() {
+ return false
+ }
+ if r.Lower != r.Upper {
+ return false
+ }
+ if r.Lower.Cmp(z) == 0 {
+ return true
+ }
+ return false
+}
+
+func InvalidUTF8(v Value) bool {
+ for _, c := range extractConsts(v.Value) {
+ if c.Value == nil {
+ continue
+ }
+ if c.Value.Kind() != constant.String {
+ continue
+ }
+ s := constant.StringVal(c.Value)
+ if !utf8.ValidString(s) {
+ return true
+ }
+ }
+ return false
+}
+
+func UnbufferedChannel(v Value) bool {
+ r, ok := v.Range.(vrp.ChannelInterval)
+ if !ok || !r.IsKnown() {
+ return false
+ }
+ if r.Size.Lower.Cmp(vrp.NewZ(0)) == 0 &&
+ r.Size.Upper.Cmp(vrp.NewZ(0)) == 0 {
+ return true
+ }
+ return false
+}
+
+func Pointer(v Value) bool {
+ switch v.Value.Type().Underlying().(type) {
+ case *types.Pointer, *types.Interface:
+ return true
+ }
+ return false
+}
+
+func ConvertedFromInt(v Value) bool {
+ conv, ok := v.Value.(*ssa.Convert)
+ if !ok {
+ return false
+ }
+ b, ok := conv.X.Type().Underlying().(*types.Basic)
+ if !ok {
+ return false
+ }
+ if (b.Info() & types.IsInteger) == 0 {
+ return false
+ }
+ return true
+}
+
+func validEncodingBinaryType(j *lint.Job, typ types.Type) bool {
+ typ = typ.Underlying()
+ switch typ := typ.(type) {
+ case *types.Basic:
+ switch typ.Kind() {
+ case types.Uint8, types.Uint16, types.Uint32, types.Uint64,
+ types.Int8, types.Int16, types.Int32, types.Int64,
+ types.Float32, types.Float64, types.Complex64, types.Complex128, types.Invalid:
+ return true
+ case types.Bool:
+ return IsGoVersion(j, 8)
+ }
+ return false
+ case *types.Struct:
+ n := typ.NumFields()
+ for i := 0; i < n; i++ {
+ if !validEncodingBinaryType(j, typ.Field(i).Type()) {
+ return false
+ }
+ }
+ return true
+ case *types.Array:
+ return validEncodingBinaryType(j, typ.Elem())
+ case *types.Interface:
+ // we can't determine if it's a valid type or not
+ return true
+ }
+ return false
+}
+
+func CanBinaryMarshal(j *lint.Job, v Value) bool {
+ typ := v.Value.Type().Underlying()
+ if ttyp, ok := typ.(*types.Pointer); ok {
+ typ = ttyp.Elem().Underlying()
+ }
+ if ttyp, ok := typ.(interface {
+ Elem() types.Type
+ }); ok {
+ if _, ok := ttyp.(*types.Pointer); !ok {
+ typ = ttyp.Elem()
+ }
+ }
+
+ return validEncodingBinaryType(j, typ)
+}
+
+func RepeatZeroTimes(name string, arg int) CallCheck {
+ return func(call *Call) {
+ arg := call.Args[arg]
+ if IntValue(arg.Value, vrp.NewZ(0)) {
+ arg.Invalid(fmt.Sprintf("calling %s with n == 0 will return no results, did you mean -1?", name))
+ }
+ }
+}
+
+func validateServiceName(s string) bool {
+ if len(s) < 1 || len(s) > 15 {
+ return false
+ }
+ if s[0] == '-' || s[len(s)-1] == '-' {
+ return false
+ }
+ if strings.Contains(s, "--") {
+ return false
+ }
+ hasLetter := false
+ for _, r := range s {
+ if (r >= 'A' && r <= 'Z') || (r >= 'a' && r <= 'z') {
+ hasLetter = true
+ continue
+ }
+ if r >= '0' && r <= '9' {
+ continue
+ }
+ return false
+ }
+ return hasLetter
+}
+
+func validatePort(s string) bool {
+ n, err := strconv.ParseInt(s, 10, 64)
+ if err != nil {
+ return validateServiceName(s)
+ }
+ return n >= 0 && n <= 65535
+}
+
+func ValidHostPort(v Value) bool {
+ for _, k := range extractConsts(v.Value) {
+ if k.Value == nil {
+ continue
+ }
+ if k.Value.Kind() != constant.String {
+ continue
+ }
+ s := constant.StringVal(k.Value)
+ _, port, err := net.SplitHostPort(s)
+ if err != nil {
+ return false
+ }
+ // TODO(dh): check hostname
+ if !validatePort(port) {
+ return false
+ }
+ }
+ return true
+}
+
+// ConvertedFrom reports whether value v was converted from type typ.
+func ConvertedFrom(v Value, typ string) bool {
+ change, ok := v.Value.(*ssa.ChangeType)
+ return ok && IsType(change.X.Type(), typ)
+}
+
+func UniqueStringCutset(v Value) bool {
+ for _, c := range extractConsts(v.Value) {
+ if c.Value == nil {
+ continue
+ }
+ if c.Value.Kind() != constant.String {
+ continue
+ }
+ s := constant.StringVal(c.Value)
+ rs := runeSlice(s)
+ if len(rs) < 2 {
+ continue
+ }
+ sort.Sort(rs)
+ for i, r := range rs[1:] {
+ if rs[i] == r {
+ return false
+ }
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/vrp/channel.go b/vendor/github.com/golangci/go-tools/staticcheck/vrp/channel.go
new file mode 100644
index 00000000000..8f8a8fdfdb3
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/vrp/channel.go
@@ -0,0 +1,73 @@
+package vrp
+
+import (
+ "fmt"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+type ChannelInterval struct {
+ Size IntInterval
+}
+
+func (c ChannelInterval) Union(other Range) Range {
+ i, ok := other.(ChannelInterval)
+ if !ok {
+ i = ChannelInterval{EmptyIntInterval}
+ }
+ if c.Size.Empty() || !c.Size.IsKnown() {
+ return i
+ }
+ if i.Size.Empty() || !i.Size.IsKnown() {
+ return c
+ }
+ return ChannelInterval{
+ Size: c.Size.Union(i.Size).(IntInterval),
+ }
+}
+
+func (c ChannelInterval) String() string {
+ return c.Size.String()
+}
+
+func (c ChannelInterval) IsKnown() bool {
+ return c.Size.IsKnown()
+}
+
+type MakeChannelConstraint struct {
+ aConstraint
+ Buffer ssa.Value
+}
+type ChannelChangeTypeConstraint struct {
+ aConstraint
+ X ssa.Value
+}
+
+func NewMakeChannelConstraint(buffer, y ssa.Value) Constraint {
+ return &MakeChannelConstraint{NewConstraint(y), buffer}
+}
+func NewChannelChangeTypeConstraint(x, y ssa.Value) Constraint {
+ return &ChannelChangeTypeConstraint{NewConstraint(y), x}
+}
+
+func (c *MakeChannelConstraint) Operands() []ssa.Value { return []ssa.Value{c.Buffer} }
+func (c *ChannelChangeTypeConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
+
+func (c *MakeChannelConstraint) String() string {
+ return fmt.Sprintf("%s = make(chan, %s)", c.Y().Name(), c.Buffer.Name())
+}
+func (c *ChannelChangeTypeConstraint) String() string {
+ return fmt.Sprintf("%s = changetype(%s)", c.Y().Name(), c.X.Name())
+}
+
+func (c *MakeChannelConstraint) Eval(g *Graph) Range {
+ i, ok := g.Range(c.Buffer).(IntInterval)
+ if !ok {
+ return ChannelInterval{NewIntInterval(NewZ(0), PInfinity)}
+ }
+ if i.Lower.Sign() == -1 {
+ i.Lower = NewZ(0)
+ }
+ return ChannelInterval{i}
+}
+func (c *ChannelChangeTypeConstraint) Eval(g *Graph) Range { return g.Range(c.X) }
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/vrp/int.go b/vendor/github.com/golangci/go-tools/staticcheck/vrp/int.go
new file mode 100644
index 00000000000..630965930e4
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/vrp/int.go
@@ -0,0 +1,476 @@
+package vrp
+
+import (
+ "fmt"
+ "go/token"
+ "go/types"
+ "math/big"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+type Zs []Z
+
+func (zs Zs) Len() int {
+ return len(zs)
+}
+
+func (zs Zs) Less(i int, j int) bool {
+ return zs[i].Cmp(zs[j]) == -1
+}
+
+func (zs Zs) Swap(i int, j int) {
+ zs[i], zs[j] = zs[j], zs[i]
+}
+
+type Z struct {
+ infinity int8
+ integer *big.Int
+}
+
+func NewZ(n int64) Z {
+ return NewBigZ(big.NewInt(n))
+}
+
+func NewBigZ(n *big.Int) Z {
+ return Z{integer: n}
+}
+
+func (z1 Z) Infinite() bool {
+ return z1.infinity != 0
+}
+
+func (z1 Z) Add(z2 Z) Z {
+ if z2.Sign() == -1 {
+ return z1.Sub(z2.Negate())
+ }
+ if z1 == NInfinity {
+ return NInfinity
+ }
+ if z1 == PInfinity {
+ return PInfinity
+ }
+ if z2 == PInfinity {
+ return PInfinity
+ }
+
+ if !z1.Infinite() && !z2.Infinite() {
+ n := &big.Int{}
+ n.Add(z1.integer, z2.integer)
+ return NewBigZ(n)
+ }
+
+ panic(fmt.Sprintf("%s + %s is not defined", z1, z2))
+}
+
+func (z1 Z) Sub(z2 Z) Z {
+ if z2.Sign() == -1 {
+ return z1.Add(z2.Negate())
+ }
+ if !z1.Infinite() && !z2.Infinite() {
+ n := &big.Int{}
+ n.Sub(z1.integer, z2.integer)
+ return NewBigZ(n)
+ }
+
+ if z1 != PInfinity && z2 == PInfinity {
+ return NInfinity
+ }
+ if z1.Infinite() && !z2.Infinite() {
+ return Z{infinity: z1.infinity}
+ }
+ if z1 == PInfinity && z2 == PInfinity {
+ return PInfinity
+ }
+ panic(fmt.Sprintf("%s - %s is not defined", z1, z2))
+}
+
+func (z1 Z) Mul(z2 Z) Z {
+ if (z1.integer != nil && z1.integer.Sign() == 0) ||
+ (z2.integer != nil && z2.integer.Sign() == 0) {
+ return NewBigZ(&big.Int{})
+ }
+
+ if z1.infinity != 0 || z2.infinity != 0 {
+ return Z{infinity: int8(z1.Sign() * z2.Sign())}
+ }
+
+ n := &big.Int{}
+ n.Mul(z1.integer, z2.integer)
+ return NewBigZ(n)
+}
+
+func (z1 Z) Negate() Z {
+ if z1.infinity == 1 {
+ return NInfinity
+ }
+ if z1.infinity == -1 {
+ return PInfinity
+ }
+ n := &big.Int{}
+ n.Neg(z1.integer)
+ return NewBigZ(n)
+}
+
+func (z1 Z) Sign() int {
+ if z1.infinity != 0 {
+ return int(z1.infinity)
+ }
+ return z1.integer.Sign()
+}
+
+func (z1 Z) String() string {
+ if z1 == NInfinity {
+ return "-∞"
+ }
+ if z1 == PInfinity {
+ return "∞"
+ }
+ return fmt.Sprintf("%d", z1.integer)
+}
+
+func (z1 Z) Cmp(z2 Z) int {
+ if z1.infinity == z2.infinity && z1.infinity != 0 {
+ return 0
+ }
+ if z1 == PInfinity {
+ return 1
+ }
+ if z1 == NInfinity {
+ return -1
+ }
+ if z2 == NInfinity {
+ return 1
+ }
+ if z2 == PInfinity {
+ return -1
+ }
+ return z1.integer.Cmp(z2.integer)
+}
+
+func MaxZ(zs ...Z) Z {
+ if len(zs) == 0 {
+ panic("Max called with no arguments")
+ }
+ if len(zs) == 1 {
+ return zs[0]
+ }
+ ret := zs[0]
+ for _, z := range zs[1:] {
+ if z.Cmp(ret) == 1 {
+ ret = z
+ }
+ }
+ return ret
+}
+
+func MinZ(zs ...Z) Z {
+ if len(zs) == 0 {
+ panic("Min called with no arguments")
+ }
+ if len(zs) == 1 {
+ return zs[0]
+ }
+ ret := zs[0]
+ for _, z := range zs[1:] {
+ if z.Cmp(ret) == -1 {
+ ret = z
+ }
+ }
+ return ret
+}
+
+var NInfinity = Z{infinity: -1}
+var PInfinity = Z{infinity: 1}
+var EmptyIntInterval = IntInterval{true, PInfinity, NInfinity}
+
+func InfinityFor(v ssa.Value) IntInterval {
+ if b, ok := v.Type().Underlying().(*types.Basic); ok {
+ if (b.Info() & types.IsUnsigned) != 0 {
+ return NewIntInterval(NewZ(0), PInfinity)
+ }
+ }
+ return NewIntInterval(NInfinity, PInfinity)
+}
+
+type IntInterval struct {
+ known bool
+ Lower Z
+ Upper Z
+}
+
+func NewIntInterval(l, u Z) IntInterval {
+ if u.Cmp(l) == -1 {
+ return EmptyIntInterval
+ }
+ return IntInterval{known: true, Lower: l, Upper: u}
+}
+
+func (i IntInterval) IsKnown() bool {
+ return i.known
+}
+
+func (i IntInterval) Empty() bool {
+ return i.Lower == PInfinity && i.Upper == NInfinity
+}
+
+func (i IntInterval) IsMaxRange() bool {
+ return i.Lower == NInfinity && i.Upper == PInfinity
+}
+
+func (i1 IntInterval) Intersection(i2 IntInterval) IntInterval {
+ if !i1.IsKnown() {
+ return i2
+ }
+ if !i2.IsKnown() {
+ return i1
+ }
+ if i1.Empty() || i2.Empty() {
+ return EmptyIntInterval
+ }
+ i3 := NewIntInterval(MaxZ(i1.Lower, i2.Lower), MinZ(i1.Upper, i2.Upper))
+ if i3.Lower.Cmp(i3.Upper) == 1 {
+ return EmptyIntInterval
+ }
+ return i3
+}
+
+func (i1 IntInterval) Union(other Range) Range {
+ i2, ok := other.(IntInterval)
+ if !ok {
+ i2 = EmptyIntInterval
+ }
+ if i1.Empty() || !i1.IsKnown() {
+ return i2
+ }
+ if i2.Empty() || !i2.IsKnown() {
+ return i1
+ }
+ return NewIntInterval(MinZ(i1.Lower, i2.Lower), MaxZ(i1.Upper, i2.Upper))
+}
+
+func (i1 IntInterval) Add(i2 IntInterval) IntInterval {
+ if i1.Empty() || i2.Empty() {
+ return EmptyIntInterval
+ }
+ l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper
+ return NewIntInterval(l1.Add(l2), u1.Add(u2))
+}
+
+func (i1 IntInterval) Sub(i2 IntInterval) IntInterval {
+ if i1.Empty() || i2.Empty() {
+ return EmptyIntInterval
+ }
+ l1, u1, l2, u2 := i1.Lower, i1.Upper, i2.Lower, i2.Upper
+ return NewIntInterval(l1.Sub(u2), u1.Sub(l2))
+}
+
+func (i1 IntInterval) Mul(i2 IntInterval) IntInterval {
+ if i1.Empty() || i2.Empty() {
+ return EmptyIntInterval
+ }
+ x1, x2 := i1.Lower, i1.Upper
+ y1, y2 := i2.Lower, i2.Upper
+ return NewIntInterval(
+ MinZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)),
+ MaxZ(x1.Mul(y1), x1.Mul(y2), x2.Mul(y1), x2.Mul(y2)),
+ )
+}
+
+func (i1 IntInterval) String() string {
+ if !i1.IsKnown() {
+ return "[⊥, ⊥]"
+ }
+ if i1.Empty() {
+ return "{}"
+ }
+ return fmt.Sprintf("[%s, %s]", i1.Lower, i1.Upper)
+}
+
+type IntArithmeticConstraint struct {
+ aConstraint
+ A ssa.Value
+ B ssa.Value
+ Op token.Token
+ Fn func(IntInterval, IntInterval) IntInterval
+}
+
+type IntAddConstraint struct{ *IntArithmeticConstraint }
+type IntSubConstraint struct{ *IntArithmeticConstraint }
+type IntMulConstraint struct{ *IntArithmeticConstraint }
+
+type IntConversionConstraint struct {
+ aConstraint
+ X ssa.Value
+}
+
+type IntIntersectionConstraint struct {
+ aConstraint
+ ranges Ranges
+ A ssa.Value
+ B ssa.Value
+ Op token.Token
+ I IntInterval
+ resolved bool
+}
+
+type IntIntervalConstraint struct {
+ aConstraint
+ I IntInterval
+}
+
+func NewIntArithmeticConstraint(a, b, y ssa.Value, op token.Token, fn func(IntInterval, IntInterval) IntInterval) *IntArithmeticConstraint {
+ return &IntArithmeticConstraint{NewConstraint(y), a, b, op, fn}
+}
+func NewIntAddConstraint(a, b, y ssa.Value) Constraint {
+ return &IntAddConstraint{NewIntArithmeticConstraint(a, b, y, token.ADD, IntInterval.Add)}
+}
+func NewIntSubConstraint(a, b, y ssa.Value) Constraint {
+ return &IntSubConstraint{NewIntArithmeticConstraint(a, b, y, token.SUB, IntInterval.Sub)}
+}
+func NewIntMulConstraint(a, b, y ssa.Value) Constraint {
+ return &IntMulConstraint{NewIntArithmeticConstraint(a, b, y, token.MUL, IntInterval.Mul)}
+}
+func NewIntConversionConstraint(x, y ssa.Value) Constraint {
+ return &IntConversionConstraint{NewConstraint(y), x}
+}
+func NewIntIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint {
+ return &IntIntersectionConstraint{
+ aConstraint: NewConstraint(y),
+ ranges: ranges,
+ A: a,
+ B: b,
+ Op: op,
+ }
+}
+func NewIntIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
+ return &IntIntervalConstraint{NewConstraint(y), i}
+}
+
+func (c *IntArithmeticConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
+func (c *IntConversionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
+func (c *IntIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} }
+func (s *IntIntervalConstraint) Operands() []ssa.Value { return nil }
+
+func (c *IntArithmeticConstraint) String() string {
+ return fmt.Sprintf("%s = %s %s %s", c.Y().Name(), c.A.Name(), c.Op, c.B.Name())
+}
+func (c *IntConversionConstraint) String() string {
+ return fmt.Sprintf("%s = %s(%s)", c.Y().Name(), c.Y().Type(), c.X.Name())
+}
+func (c *IntIntersectionConstraint) String() string {
+ return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch)
+}
+func (c *IntIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
+
+func (c *IntArithmeticConstraint) Eval(g *Graph) Range {
+ i1, i2 := g.Range(c.A).(IntInterval), g.Range(c.B).(IntInterval)
+ if !i1.IsKnown() || !i2.IsKnown() {
+ return IntInterval{}
+ }
+ return c.Fn(i1, i2)
+}
+func (c *IntConversionConstraint) Eval(g *Graph) Range {
+ s := &types.StdSizes{
+ // XXX is it okay to assume the largest word size, or do we
+ // need to be platform specific?
+ WordSize: 8,
+ MaxAlign: 1,
+ }
+ fromI := g.Range(c.X).(IntInterval)
+ toI := g.Range(c.Y()).(IntInterval)
+ fromT := c.X.Type().Underlying().(*types.Basic)
+ toT := c.Y().Type().Underlying().(*types.Basic)
+ fromB := s.Sizeof(c.X.Type())
+ toB := s.Sizeof(c.Y().Type())
+
+ if !fromI.IsKnown() {
+ return toI
+ }
+ if !toI.IsKnown() {
+ return fromI
+ }
+
+ // uint -> sint/uint, M > N: [max(0, l1), min(2**N-1, u2)]
+ if (fromT.Info()&types.IsUnsigned != 0) &&
+ toB > fromB {
+
+ n := big.NewInt(1)
+ n.Lsh(n, uint(fromB*8))
+ n.Sub(n, big.NewInt(1))
+ return NewIntInterval(
+ MaxZ(NewZ(0), fromI.Lower),
+ MinZ(NewBigZ(n), toI.Upper),
+ )
+ }
+
+ // sint -> sint, M > N; [max(-∞, l1), min(2**N-1, u2)]
+ if (fromT.Info()&types.IsUnsigned == 0) &&
+ (toT.Info()&types.IsUnsigned == 0) &&
+ toB > fromB {
+
+ n := big.NewInt(1)
+ n.Lsh(n, uint(fromB*8))
+ n.Sub(n, big.NewInt(1))
+ return NewIntInterval(
+ MaxZ(NInfinity, fromI.Lower),
+ MinZ(NewBigZ(n), toI.Upper),
+ )
+ }
+
+ return fromI
+}
+func (c *IntIntersectionConstraint) Eval(g *Graph) Range {
+ xi := g.Range(c.A).(IntInterval)
+ if !xi.IsKnown() {
+ return c.I
+ }
+ return xi.Intersection(c.I)
+}
+func (c *IntIntervalConstraint) Eval(*Graph) Range { return c.I }
+
+func (c *IntIntersectionConstraint) Futures() []ssa.Value {
+ return []ssa.Value{c.B}
+}
+
+func (c *IntIntersectionConstraint) Resolve() {
+ r, ok := c.ranges[c.B].(IntInterval)
+ if !ok {
+ c.I = InfinityFor(c.Y())
+ return
+ }
+
+ switch c.Op {
+ case token.EQL:
+ c.I = r
+ case token.GTR:
+ c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity)
+ case token.GEQ:
+ c.I = NewIntInterval(r.Lower, PInfinity)
+ case token.LSS:
+ // TODO(dh): do we need 0 instead of NInfinity for uints?
+ c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1)))
+ case token.LEQ:
+ c.I = NewIntInterval(NInfinity, r.Upper)
+ case token.NEQ:
+ c.I = InfinityFor(c.Y())
+ default:
+ panic("unsupported op " + c.Op.String())
+ }
+}
+
+func (c *IntIntersectionConstraint) IsKnown() bool {
+ return c.I.IsKnown()
+}
+
+func (c *IntIntersectionConstraint) MarkUnresolved() {
+ c.resolved = false
+}
+
+func (c *IntIntersectionConstraint) MarkResolved() {
+ c.resolved = true
+}
+
+func (c *IntIntersectionConstraint) IsResolved() bool {
+ return c.resolved
+}
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/vrp/slice.go b/vendor/github.com/golangci/go-tools/staticcheck/vrp/slice.go
new file mode 100644
index 00000000000..75ab9465f31
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/vrp/slice.go
@@ -0,0 +1,273 @@
+package vrp
+
+// TODO(dh): most of the constraints have implementations identical to
+// that of strings. Consider reusing them.
+
+import (
+ "fmt"
+ "go/types"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+type SliceInterval struct {
+ Length IntInterval
+}
+
+func (s SliceInterval) Union(other Range) Range {
+ i, ok := other.(SliceInterval)
+ if !ok {
+ i = SliceInterval{EmptyIntInterval}
+ }
+ if s.Length.Empty() || !s.Length.IsKnown() {
+ return i
+ }
+ if i.Length.Empty() || !i.Length.IsKnown() {
+ return s
+ }
+ return SliceInterval{
+ Length: s.Length.Union(i.Length).(IntInterval),
+ }
+}
+func (s SliceInterval) String() string { return s.Length.String() }
+func (s SliceInterval) IsKnown() bool { return s.Length.IsKnown() }
+
+type SliceAppendConstraint struct {
+ aConstraint
+ A ssa.Value
+ B ssa.Value
+}
+
+type SliceSliceConstraint struct {
+ aConstraint
+ X ssa.Value
+ Lower ssa.Value
+ Upper ssa.Value
+}
+
+type ArraySliceConstraint struct {
+ aConstraint
+ X ssa.Value
+ Lower ssa.Value
+ Upper ssa.Value
+}
+
+type SliceIntersectionConstraint struct {
+ aConstraint
+ X ssa.Value
+ I IntInterval
+}
+
+type SliceLengthConstraint struct {
+ aConstraint
+ X ssa.Value
+}
+
+type MakeSliceConstraint struct {
+ aConstraint
+ Size ssa.Value
+}
+
+type SliceIntervalConstraint struct {
+ aConstraint
+ I IntInterval
+}
+
+func NewSliceAppendConstraint(a, b, y ssa.Value) Constraint {
+ return &SliceAppendConstraint{NewConstraint(y), a, b}
+}
+func NewSliceSliceConstraint(x, lower, upper, y ssa.Value) Constraint {
+ return &SliceSliceConstraint{NewConstraint(y), x, lower, upper}
+}
+func NewArraySliceConstraint(x, lower, upper, y ssa.Value) Constraint {
+ return &ArraySliceConstraint{NewConstraint(y), x, lower, upper}
+}
+func NewSliceIntersectionConstraint(x ssa.Value, i IntInterval, y ssa.Value) Constraint {
+ return &SliceIntersectionConstraint{NewConstraint(y), x, i}
+}
+func NewSliceLengthConstraint(x, y ssa.Value) Constraint {
+ return &SliceLengthConstraint{NewConstraint(y), x}
+}
+func NewMakeSliceConstraint(size, y ssa.Value) Constraint {
+ return &MakeSliceConstraint{NewConstraint(y), size}
+}
+func NewSliceIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
+ return &SliceIntervalConstraint{NewConstraint(y), i}
+}
+
+func (c *SliceAppendConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
+func (c *SliceSliceConstraint) Operands() []ssa.Value {
+ ops := []ssa.Value{c.X}
+ if c.Lower != nil {
+ ops = append(ops, c.Lower)
+ }
+ if c.Upper != nil {
+ ops = append(ops, c.Upper)
+ }
+ return ops
+}
+func (c *ArraySliceConstraint) Operands() []ssa.Value {
+ ops := []ssa.Value{c.X}
+ if c.Lower != nil {
+ ops = append(ops, c.Lower)
+ }
+ if c.Upper != nil {
+ ops = append(ops, c.Upper)
+ }
+ return ops
+}
+func (c *SliceIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
+func (c *SliceLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
+func (c *MakeSliceConstraint) Operands() []ssa.Value { return []ssa.Value{c.Size} }
+func (s *SliceIntervalConstraint) Operands() []ssa.Value { return nil }
+
+func (c *SliceAppendConstraint) String() string {
+ return fmt.Sprintf("%s = append(%s, %s)", c.Y().Name(), c.A.Name(), c.B.Name())
+}
+func (c *SliceSliceConstraint) String() string {
+ var lname, uname string
+ if c.Lower != nil {
+ lname = c.Lower.Name()
+ }
+ if c.Upper != nil {
+ uname = c.Upper.Name()
+ }
+ return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
+}
+func (c *ArraySliceConstraint) String() string {
+ var lname, uname string
+ if c.Lower != nil {
+ lname = c.Lower.Name()
+ }
+ if c.Upper != nil {
+ uname = c.Upper.Name()
+ }
+ return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
+}
+func (c *SliceIntersectionConstraint) String() string {
+ return fmt.Sprintf("%s = %s.%t ⊓ %s", c.Y().Name(), c.X.Name(), c.Y().(*ssa.Sigma).Branch, c.I)
+}
+func (c *SliceLengthConstraint) String() string {
+ return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name())
+}
+func (c *MakeSliceConstraint) String() string {
+ return fmt.Sprintf("%s = make(slice, %s)", c.Y().Name(), c.Size.Name())
+}
+func (c *SliceIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
+
+func (c *SliceAppendConstraint) Eval(g *Graph) Range {
+ l1 := g.Range(c.A).(SliceInterval).Length
+ var l2 IntInterval
+ switch r := g.Range(c.B).(type) {
+ case SliceInterval:
+ l2 = r.Length
+ case StringInterval:
+ l2 = r.Length
+ default:
+ return SliceInterval{}
+ }
+ if !l1.IsKnown() || !l2.IsKnown() {
+ return SliceInterval{}
+ }
+ return SliceInterval{
+ Length: l1.Add(l2),
+ }
+}
+func (c *SliceSliceConstraint) Eval(g *Graph) Range {
+ lr := NewIntInterval(NewZ(0), NewZ(0))
+ if c.Lower != nil {
+ lr = g.Range(c.Lower).(IntInterval)
+ }
+ ur := g.Range(c.X).(SliceInterval).Length
+ if c.Upper != nil {
+ ur = g.Range(c.Upper).(IntInterval)
+ }
+ if !lr.IsKnown() || !ur.IsKnown() {
+ return SliceInterval{}
+ }
+
+ ls := []Z{
+ ur.Lower.Sub(lr.Lower),
+ ur.Upper.Sub(lr.Lower),
+ ur.Lower.Sub(lr.Upper),
+ ur.Upper.Sub(lr.Upper),
+ }
+ // TODO(dh): if we don't truncate lengths to 0 we might be able to
+ // easily detect slices with high < low. we'd need to treat -∞
+ // specially, though.
+ for i, l := range ls {
+ if l.Sign() == -1 {
+ ls[i] = NewZ(0)
+ }
+ }
+
+ return SliceInterval{
+ Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
+ }
+}
+func (c *ArraySliceConstraint) Eval(g *Graph) Range {
+ lr := NewIntInterval(NewZ(0), NewZ(0))
+ if c.Lower != nil {
+ lr = g.Range(c.Lower).(IntInterval)
+ }
+ var l int64
+ switch typ := c.X.Type().(type) {
+ case *types.Array:
+ l = typ.Len()
+ case *types.Pointer:
+ l = typ.Elem().(*types.Array).Len()
+ }
+ ur := NewIntInterval(NewZ(l), NewZ(l))
+ if c.Upper != nil {
+ ur = g.Range(c.Upper).(IntInterval)
+ }
+ if !lr.IsKnown() || !ur.IsKnown() {
+ return SliceInterval{}
+ }
+
+ ls := []Z{
+ ur.Lower.Sub(lr.Lower),
+ ur.Upper.Sub(lr.Lower),
+ ur.Lower.Sub(lr.Upper),
+ ur.Upper.Sub(lr.Upper),
+ }
+ // TODO(dh): if we don't truncate lengths to 0 we might be able to
+ // easily detect slices with high < low. we'd need to treat -∞
+ // specially, though.
+ for i, l := range ls {
+ if l.Sign() == -1 {
+ ls[i] = NewZ(0)
+ }
+ }
+
+ return SliceInterval{
+ Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
+ }
+}
+func (c *SliceIntersectionConstraint) Eval(g *Graph) Range {
+ xi := g.Range(c.X).(SliceInterval)
+ if !xi.IsKnown() {
+ return c.I
+ }
+ return SliceInterval{
+ Length: xi.Length.Intersection(c.I),
+ }
+}
+func (c *SliceLengthConstraint) Eval(g *Graph) Range {
+ i := g.Range(c.X).(SliceInterval).Length
+ if !i.IsKnown() {
+ return NewIntInterval(NewZ(0), PInfinity)
+ }
+ return i
+}
+func (c *MakeSliceConstraint) Eval(g *Graph) Range {
+ i, ok := g.Range(c.Size).(IntInterval)
+ if !ok {
+ return SliceInterval{NewIntInterval(NewZ(0), PInfinity)}
+ }
+ if i.Lower.Sign() == -1 {
+ i.Lower = NewZ(0)
+ }
+ return SliceInterval{i}
+}
+func (c *SliceIntervalConstraint) Eval(*Graph) Range { return SliceInterval{c.I} }
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/vrp/string.go b/vendor/github.com/golangci/go-tools/staticcheck/vrp/string.go
new file mode 100644
index 00000000000..42e556ba77a
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/vrp/string.go
@@ -0,0 +1,258 @@
+package vrp
+
+import (
+ "fmt"
+ "go/token"
+ "go/types"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+type StringInterval struct {
+ Length IntInterval
+}
+
+func (s StringInterval) Union(other Range) Range {
+ i, ok := other.(StringInterval)
+ if !ok {
+ i = StringInterval{EmptyIntInterval}
+ }
+ if s.Length.Empty() || !s.Length.IsKnown() {
+ return i
+ }
+ if i.Length.Empty() || !i.Length.IsKnown() {
+ return s
+ }
+ return StringInterval{
+ Length: s.Length.Union(i.Length).(IntInterval),
+ }
+}
+
+func (s StringInterval) String() string {
+ return s.Length.String()
+}
+
+func (s StringInterval) IsKnown() bool {
+ return s.Length.IsKnown()
+}
+
+type StringSliceConstraint struct {
+ aConstraint
+ X ssa.Value
+ Lower ssa.Value
+ Upper ssa.Value
+}
+
+type StringIntersectionConstraint struct {
+ aConstraint
+ ranges Ranges
+ A ssa.Value
+ B ssa.Value
+ Op token.Token
+ I IntInterval
+ resolved bool
+}
+
+type StringConcatConstraint struct {
+ aConstraint
+ A ssa.Value
+ B ssa.Value
+}
+
+type StringLengthConstraint struct {
+ aConstraint
+ X ssa.Value
+}
+
+type StringIntervalConstraint struct {
+ aConstraint
+ I IntInterval
+}
+
+func NewStringSliceConstraint(x, lower, upper, y ssa.Value) Constraint {
+ return &StringSliceConstraint{NewConstraint(y), x, lower, upper}
+}
+func NewStringIntersectionConstraint(a, b ssa.Value, op token.Token, ranges Ranges, y ssa.Value) Constraint {
+ return &StringIntersectionConstraint{
+ aConstraint: NewConstraint(y),
+ ranges: ranges,
+ A: a,
+ B: b,
+ Op: op,
+ }
+}
+func NewStringConcatConstraint(a, b, y ssa.Value) Constraint {
+ return &StringConcatConstraint{NewConstraint(y), a, b}
+}
+func NewStringLengthConstraint(x ssa.Value, y ssa.Value) Constraint {
+ return &StringLengthConstraint{NewConstraint(y), x}
+}
+func NewStringIntervalConstraint(i IntInterval, y ssa.Value) Constraint {
+ return &StringIntervalConstraint{NewConstraint(y), i}
+}
+
+func (c *StringSliceConstraint) Operands() []ssa.Value {
+ vs := []ssa.Value{c.X}
+ if c.Lower != nil {
+ vs = append(vs, c.Lower)
+ }
+ if c.Upper != nil {
+ vs = append(vs, c.Upper)
+ }
+ return vs
+}
+func (c *StringIntersectionConstraint) Operands() []ssa.Value { return []ssa.Value{c.A} }
+func (c StringConcatConstraint) Operands() []ssa.Value { return []ssa.Value{c.A, c.B} }
+func (c *StringLengthConstraint) Operands() []ssa.Value { return []ssa.Value{c.X} }
+func (s *StringIntervalConstraint) Operands() []ssa.Value { return nil }
+
+func (c *StringSliceConstraint) String() string {
+ var lname, uname string
+ if c.Lower != nil {
+ lname = c.Lower.Name()
+ }
+ if c.Upper != nil {
+ uname = c.Upper.Name()
+ }
+ return fmt.Sprintf("%s[%s:%s]", c.X.Name(), lname, uname)
+}
+func (c *StringIntersectionConstraint) String() string {
+ return fmt.Sprintf("%s = %s %s %s (%t branch)", c.Y().Name(), c.A.Name(), c.Op, c.B.Name(), c.Y().(*ssa.Sigma).Branch)
+}
+func (c StringConcatConstraint) String() string {
+ return fmt.Sprintf("%s = %s + %s", c.Y().Name(), c.A.Name(), c.B.Name())
+}
+func (c *StringLengthConstraint) String() string {
+ return fmt.Sprintf("%s = len(%s)", c.Y().Name(), c.X.Name())
+}
+func (c *StringIntervalConstraint) String() string { return fmt.Sprintf("%s = %s", c.Y().Name(), c.I) }
+
+func (c *StringSliceConstraint) Eval(g *Graph) Range {
+ lr := NewIntInterval(NewZ(0), NewZ(0))
+ if c.Lower != nil {
+ lr = g.Range(c.Lower).(IntInterval)
+ }
+ ur := g.Range(c.X).(StringInterval).Length
+ if c.Upper != nil {
+ ur = g.Range(c.Upper).(IntInterval)
+ }
+ if !lr.IsKnown() || !ur.IsKnown() {
+ return StringInterval{}
+ }
+
+ ls := []Z{
+ ur.Lower.Sub(lr.Lower),
+ ur.Upper.Sub(lr.Lower),
+ ur.Lower.Sub(lr.Upper),
+ ur.Upper.Sub(lr.Upper),
+ }
+ // TODO(dh): if we don't truncate lengths to 0 we might be able to
+ // easily detect slices with high < low. we'd need to treat -∞
+ // specially, though.
+ for i, l := range ls {
+ if l.Sign() == -1 {
+ ls[i] = NewZ(0)
+ }
+ }
+
+ return StringInterval{
+ Length: NewIntInterval(MinZ(ls...), MaxZ(ls...)),
+ }
+}
+func (c *StringIntersectionConstraint) Eval(g *Graph) Range {
+ var l IntInterval
+ switch r := g.Range(c.A).(type) {
+ case StringInterval:
+ l = r.Length
+ case IntInterval:
+ l = r
+ }
+
+ if !l.IsKnown() {
+ return StringInterval{c.I}
+ }
+ return StringInterval{
+ Length: l.Intersection(c.I),
+ }
+}
+func (c StringConcatConstraint) Eval(g *Graph) Range {
+ i1, i2 := g.Range(c.A).(StringInterval), g.Range(c.B).(StringInterval)
+ if !i1.Length.IsKnown() || !i2.Length.IsKnown() {
+ return StringInterval{}
+ }
+ return StringInterval{
+ Length: i1.Length.Add(i2.Length),
+ }
+}
+func (c *StringLengthConstraint) Eval(g *Graph) Range {
+ i := g.Range(c.X).(StringInterval).Length
+ if !i.IsKnown() {
+ return NewIntInterval(NewZ(0), PInfinity)
+ }
+ return i
+}
+func (c *StringIntervalConstraint) Eval(*Graph) Range { return StringInterval{c.I} }
+
+func (c *StringIntersectionConstraint) Futures() []ssa.Value {
+ return []ssa.Value{c.B}
+}
+
+func (c *StringIntersectionConstraint) Resolve() {
+ if (c.A.Type().Underlying().(*types.Basic).Info() & types.IsString) != 0 {
+ // comparing two strings
+ r, ok := c.ranges[c.B].(StringInterval)
+ if !ok {
+ c.I = NewIntInterval(NewZ(0), PInfinity)
+ return
+ }
+ switch c.Op {
+ case token.EQL:
+ c.I = r.Length
+ case token.GTR, token.GEQ:
+ c.I = NewIntInterval(r.Length.Lower, PInfinity)
+ case token.LSS, token.LEQ:
+ c.I = NewIntInterval(NewZ(0), r.Length.Upper)
+ case token.NEQ:
+ default:
+ panic("unsupported op " + c.Op.String())
+ }
+ } else {
+ r, ok := c.ranges[c.B].(IntInterval)
+ if !ok {
+ c.I = NewIntInterval(NewZ(0), PInfinity)
+ return
+ }
+ // comparing two lengths
+ switch c.Op {
+ case token.EQL:
+ c.I = r
+ case token.GTR:
+ c.I = NewIntInterval(r.Lower.Add(NewZ(1)), PInfinity)
+ case token.GEQ:
+ c.I = NewIntInterval(r.Lower, PInfinity)
+ case token.LSS:
+ c.I = NewIntInterval(NInfinity, r.Upper.Sub(NewZ(1)))
+ case token.LEQ:
+ c.I = NewIntInterval(NInfinity, r.Upper)
+ case token.NEQ:
+ default:
+ panic("unsupported op " + c.Op.String())
+ }
+ }
+}
+
+func (c *StringIntersectionConstraint) IsKnown() bool {
+ return c.I.IsKnown()
+}
+
+func (c *StringIntersectionConstraint) MarkUnresolved() {
+ c.resolved = false
+}
+
+func (c *StringIntersectionConstraint) MarkResolved() {
+ c.resolved = true
+}
+
+func (c *StringIntersectionConstraint) IsResolved() bool {
+ return c.resolved
+}
diff --git a/vendor/github.com/golangci/go-tools/staticcheck/vrp/vrp.go b/vendor/github.com/golangci/go-tools/staticcheck/vrp/vrp.go
new file mode 100644
index 00000000000..d05c43e44ea
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/staticcheck/vrp/vrp.go
@@ -0,0 +1,1049 @@
+package vrp
+
+// TODO(dh) widening and narrowing have a lot of code in common. Make
+// it reusable.
+
+import (
+ "fmt"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "math/big"
+ "sort"
+ "strings"
+
+ "github.com/golangci/go-tools/ssa"
+)
+
+type Future interface {
+ Constraint
+ Futures() []ssa.Value
+ Resolve()
+ IsKnown() bool
+ MarkUnresolved()
+ MarkResolved()
+ IsResolved() bool
+}
+
+type Range interface {
+ Union(other Range) Range
+ IsKnown() bool
+}
+
+type Constraint interface {
+ Y() ssa.Value
+ isConstraint()
+ String() string
+ Eval(*Graph) Range
+ Operands() []ssa.Value
+}
+
+type aConstraint struct {
+ y ssa.Value
+}
+
+func NewConstraint(y ssa.Value) aConstraint {
+ return aConstraint{y}
+}
+
+func (aConstraint) isConstraint() {}
+func (c aConstraint) Y() ssa.Value { return c.y }
+
+type PhiConstraint struct {
+ aConstraint
+ Vars []ssa.Value
+}
+
+func NewPhiConstraint(vars []ssa.Value, y ssa.Value) Constraint {
+ uniqm := map[ssa.Value]struct{}{}
+ for _, v := range vars {
+ uniqm[v] = struct{}{}
+ }
+ var uniq []ssa.Value
+ for v := range uniqm {
+ uniq = append(uniq, v)
+ }
+ return &PhiConstraint{
+ aConstraint: NewConstraint(y),
+ Vars: uniq,
+ }
+}
+
+func (c *PhiConstraint) Operands() []ssa.Value {
+ return c.Vars
+}
+
+func (c *PhiConstraint) Eval(g *Graph) Range {
+ i := Range(nil)
+ for _, v := range c.Vars {
+ i = g.Range(v).Union(i)
+ }
+ return i
+}
+
+func (c *PhiConstraint) String() string {
+ names := make([]string, len(c.Vars))
+ for i, v := range c.Vars {
+ names[i] = v.Name()
+ }
+ return fmt.Sprintf("%s = φ(%s)", c.Y().Name(), strings.Join(names, ", "))
+}
+
+func isSupportedType(typ types.Type) bool {
+ switch typ := typ.Underlying().(type) {
+ case *types.Basic:
+ switch typ.Kind() {
+ case types.String, types.UntypedString:
+ return true
+ default:
+ if (typ.Info() & types.IsInteger) == 0 {
+ return false
+ }
+ }
+ case *types.Chan:
+ return true
+ case *types.Slice:
+ return true
+ default:
+ return false
+ }
+ return true
+}
+
+func ConstantToZ(c constant.Value) Z {
+ s := constant.ToInt(c).ExactString()
+ n := &big.Int{}
+ n.SetString(s, 10)
+ return NewBigZ(n)
+}
+
+func sigmaInteger(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
+ op := cond.Op
+ if !ins.Branch {
+ op = (invertToken(op))
+ }
+
+ switch op {
+ case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ:
+ default:
+ return nil
+ }
+ var a, b ssa.Value
+ if (*ops[0]) == ins.X {
+ a = *ops[0]
+ b = *ops[1]
+ } else {
+ a = *ops[1]
+ b = *ops[0]
+ op = flipToken(op)
+ }
+ return NewIntIntersectionConstraint(a, b, op, g.ranges, ins)
+}
+
+func sigmaString(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
+ op := cond.Op
+ if !ins.Branch {
+ op = (invertToken(op))
+ }
+
+ switch op {
+ case token.EQL, token.GTR, token.GEQ, token.LSS, token.LEQ:
+ default:
+ return nil
+ }
+
+ if ((*ops[0]).Type().Underlying().(*types.Basic).Info() & types.IsString) == 0 {
+ var a, b ssa.Value
+ call, ok := (*ops[0]).(*ssa.Call)
+ if ok && call.Common().Args[0] == ins.X {
+ a = *ops[0]
+ b = *ops[1]
+ } else {
+ a = *ops[1]
+ b = *ops[0]
+ op = flipToken(op)
+ }
+ return NewStringIntersectionConstraint(a, b, op, g.ranges, ins)
+ }
+ var a, b ssa.Value
+ if (*ops[0]) == ins.X {
+ a = *ops[0]
+ b = *ops[1]
+ } else {
+ a = *ops[1]
+ b = *ops[0]
+ op = flipToken(op)
+ }
+ return NewStringIntersectionConstraint(a, b, op, g.ranges, ins)
+}
+
+func sigmaSlice(g *Graph, ins *ssa.Sigma, cond *ssa.BinOp, ops []*ssa.Value) Constraint {
+ // TODO(dh) sigmaSlice and sigmaString are a lot alike. Can they
+ // be merged?
+ //
+ // XXX support futures
+
+ op := cond.Op
+ if !ins.Branch {
+ op = (invertToken(op))
+ }
+
+ k, ok := (*ops[1]).(*ssa.Const)
+ // XXX investigate in what cases this wouldn't be a Const
+ //
+ // XXX what if left and right are swapped?
+ if !ok {
+ return nil
+ }
+
+ call, ok := (*ops[0]).(*ssa.Call)
+ if !ok {
+ return nil
+ }
+ builtin, ok := call.Common().Value.(*ssa.Builtin)
+ if !ok {
+ return nil
+ }
+ if builtin.Name() != "len" {
+ return nil
+ }
+ callops := call.Operands(nil)
+
+ v := ConstantToZ(k.Value)
+ c := NewSliceIntersectionConstraint(*callops[1], IntInterval{}, ins).(*SliceIntersectionConstraint)
+ switch op {
+ case token.EQL:
+ c.I = NewIntInterval(v, v)
+ case token.GTR, token.GEQ:
+ off := int64(0)
+ if cond.Op == token.GTR {
+ off = 1
+ }
+ c.I = NewIntInterval(
+ v.Add(NewZ(off)),
+ PInfinity,
+ )
+ case token.LSS, token.LEQ:
+ off := int64(0)
+ if cond.Op == token.LSS {
+ off = -1
+ }
+ c.I = NewIntInterval(
+ NInfinity,
+ v.Add(NewZ(off)),
+ )
+ default:
+ return nil
+ }
+ return c
+}
+
+func BuildGraph(f *ssa.Function) *Graph {
+ g := &Graph{
+ Vertices: map[interface{}]*Vertex{},
+ ranges: Ranges{},
+ }
+
+ var cs []Constraint
+
+ ops := make([]*ssa.Value, 16)
+ seen := map[ssa.Value]bool{}
+ for _, block := range f.Blocks {
+ for _, ins := range block.Instrs {
+ ops = ins.Operands(ops[:0])
+ for _, op := range ops {
+ if c, ok := (*op).(*ssa.Const); ok {
+ if seen[c] {
+ continue
+ }
+ seen[c] = true
+ if c.Value == nil {
+ switch c.Type().Underlying().(type) {
+ case *types.Slice:
+ cs = append(cs, NewSliceIntervalConstraint(NewIntInterval(NewZ(0), NewZ(0)), c))
+ }
+ continue
+ }
+ switch c.Value.Kind() {
+ case constant.Int:
+ v := ConstantToZ(c.Value)
+ cs = append(cs, NewIntIntervalConstraint(NewIntInterval(v, v), c))
+ case constant.String:
+ s := constant.StringVal(c.Value)
+ n := NewZ(int64(len(s)))
+ cs = append(cs, NewStringIntervalConstraint(NewIntInterval(n, n), c))
+ }
+ }
+ }
+ }
+ }
+ for _, block := range f.Blocks {
+ for _, ins := range block.Instrs {
+ switch ins := ins.(type) {
+ case *ssa.Convert:
+ switch v := ins.Type().Underlying().(type) {
+ case *types.Basic:
+ if (v.Info() & types.IsInteger) == 0 {
+ continue
+ }
+ cs = append(cs, NewIntConversionConstraint(ins.X, ins))
+ }
+ case *ssa.Call:
+ if static := ins.Common().StaticCallee(); static != nil {
+ if fn, ok := static.Object().(*types.Func); ok {
+ switch fn.FullName() {
+ case "bytes.Index", "bytes.IndexAny", "bytes.IndexByte",
+ "bytes.IndexFunc", "bytes.IndexRune", "bytes.LastIndex",
+ "bytes.LastIndexAny", "bytes.LastIndexByte", "bytes.LastIndexFunc",
+ "strings.Index", "strings.IndexAny", "strings.IndexByte",
+ "strings.IndexFunc", "strings.IndexRune", "strings.LastIndex",
+ "strings.LastIndexAny", "strings.LastIndexByte", "strings.LastIndexFunc":
+ // TODO(dh): instead of limiting by +∞,
+ // limit by the upper bound of the passed
+ // string
+ cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), PInfinity), ins))
+ case "bytes.Title", "bytes.ToLower", "bytes.ToTitle", "bytes.ToUpper",
+ "strings.Title", "strings.ToLower", "strings.ToTitle", "strings.ToUpper":
+ cs = append(cs, NewCopyConstraint(ins.Common().Args[0], ins))
+ case "bytes.ToLowerSpecial", "bytes.ToTitleSpecial", "bytes.ToUpperSpecial",
+ "strings.ToLowerSpecial", "strings.ToTitleSpecial", "strings.ToUpperSpecial":
+ cs = append(cs, NewCopyConstraint(ins.Common().Args[1], ins))
+ case "bytes.Compare", "strings.Compare":
+ cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(-1), NewZ(1)), ins))
+ case "bytes.Count", "strings.Count":
+ // TODO(dh): instead of limiting by +∞,
+ // limit by the upper bound of the passed
+ // string.
+ cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins))
+ case "bytes.Map", "bytes.TrimFunc", "bytes.TrimLeft", "bytes.TrimLeftFunc",
+ "bytes.TrimRight", "bytes.TrimRightFunc", "bytes.TrimSpace",
+ "strings.Map", "strings.TrimFunc", "strings.TrimLeft", "strings.TrimLeftFunc",
+ "strings.TrimRight", "strings.TrimRightFunc", "strings.TrimSpace":
+ // TODO(dh): lower = 0, upper = upper of passed string
+ case "bytes.TrimPrefix", "bytes.TrimSuffix",
+ "strings.TrimPrefix", "strings.TrimSuffix":
+ // TODO(dh) range between "unmodified" and len(cutset) removed
+ case "(*bytes.Buffer).Cap", "(*bytes.Buffer).Len", "(*bytes.Reader).Len", "(*bytes.Reader).Size":
+ cs = append(cs, NewIntIntervalConstraint(NewIntInterval(NewZ(0), PInfinity), ins))
+ }
+ }
+ }
+ builtin, ok := ins.Common().Value.(*ssa.Builtin)
+ ops := ins.Operands(nil)
+ if !ok {
+ continue
+ }
+ switch builtin.Name() {
+ case "len":
+ switch op1 := (*ops[1]).Type().Underlying().(type) {
+ case *types.Basic:
+ if op1.Kind() == types.String || op1.Kind() == types.UntypedString {
+ cs = append(cs, NewStringLengthConstraint(*ops[1], ins))
+ }
+ case *types.Slice:
+ cs = append(cs, NewSliceLengthConstraint(*ops[1], ins))
+ }
+
+ case "append":
+ cs = append(cs, NewSliceAppendConstraint(ins.Common().Args[0], ins.Common().Args[1], ins))
+ }
+ case *ssa.BinOp:
+ ops := ins.Operands(nil)
+ basic, ok := (*ops[0]).Type().Underlying().(*types.Basic)
+ if !ok {
+ continue
+ }
+ switch basic.Kind() {
+ case types.Int, types.Int8, types.Int16, types.Int32, types.Int64,
+ types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt:
+ fns := map[token.Token]func(ssa.Value, ssa.Value, ssa.Value) Constraint{
+ token.ADD: NewIntAddConstraint,
+ token.SUB: NewIntSubConstraint,
+ token.MUL: NewIntMulConstraint,
+ // XXX support QUO, REM, SHL, SHR
+ }
+ fn, ok := fns[ins.Op]
+ if ok {
+ cs = append(cs, fn(*ops[0], *ops[1], ins))
+ }
+ case types.String, types.UntypedString:
+ if ins.Op == token.ADD {
+ cs = append(cs, NewStringConcatConstraint(*ops[0], *ops[1], ins))
+ }
+ }
+ case *ssa.Slice:
+ typ := ins.X.Type().Underlying()
+ switch typ := typ.(type) {
+ case *types.Basic:
+ cs = append(cs, NewStringSliceConstraint(ins.X, ins.Low, ins.High, ins))
+ case *types.Slice:
+ cs = append(cs, NewSliceSliceConstraint(ins.X, ins.Low, ins.High, ins))
+ case *types.Array:
+ cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins))
+ case *types.Pointer:
+ if _, ok := typ.Elem().(*types.Array); !ok {
+ continue
+ }
+ cs = append(cs, NewArraySliceConstraint(ins.X, ins.Low, ins.High, ins))
+ }
+ case *ssa.Phi:
+ if !isSupportedType(ins.Type()) {
+ continue
+ }
+ ops := ins.Operands(nil)
+ dops := make([]ssa.Value, len(ops))
+ for i, op := range ops {
+ dops[i] = *op
+ }
+ cs = append(cs, NewPhiConstraint(dops, ins))
+ case *ssa.Sigma:
+ pred := ins.Block().Preds[0]
+ instrs := pred.Instrs
+ cond, ok := instrs[len(instrs)-1].(*ssa.If).Cond.(*ssa.BinOp)
+ ops := cond.Operands(nil)
+ if !ok {
+ continue
+ }
+ switch typ := ins.Type().Underlying().(type) {
+ case *types.Basic:
+ var c Constraint
+ switch typ.Kind() {
+ case types.Int, types.Int8, types.Int16, types.Int32, types.Int64,
+ types.Uint, types.Uint8, types.Uint16, types.Uint32, types.Uint64, types.UntypedInt:
+ c = sigmaInteger(g, ins, cond, ops)
+ case types.String, types.UntypedString:
+ c = sigmaString(g, ins, cond, ops)
+ }
+ if c != nil {
+ cs = append(cs, c)
+ }
+ case *types.Slice:
+ c := sigmaSlice(g, ins, cond, ops)
+ if c != nil {
+ cs = append(cs, c)
+ }
+ default:
+ //log.Printf("unsupported sigma type %T", typ) // XXX
+ }
+ case *ssa.MakeChan:
+ cs = append(cs, NewMakeChannelConstraint(ins.Size, ins))
+ case *ssa.MakeSlice:
+ cs = append(cs, NewMakeSliceConstraint(ins.Len, ins))
+ case *ssa.ChangeType:
+ switch ins.X.Type().Underlying().(type) {
+ case *types.Chan:
+ cs = append(cs, NewChannelChangeTypeConstraint(ins.X, ins))
+ }
+ }
+ }
+ }
+
+ for _, c := range cs {
+ if c == nil {
+ panic("nil constraint")
+ }
+ // If V is used in constraint C, then we create an edge V->C
+ for _, op := range c.Operands() {
+ g.AddEdge(op, c, false)
+ }
+ if c, ok := c.(Future); ok {
+ for _, op := range c.Futures() {
+ g.AddEdge(op, c, true)
+ }
+ }
+ // If constraint C defines variable V, then we create an edge
+ // C->V
+ g.AddEdge(c, c.Y(), false)
+ }
+
+ g.FindSCCs()
+ g.sccEdges = make([][]Edge, len(g.SCCs))
+ g.futures = make([][]Future, len(g.SCCs))
+ for _, e := range g.Edges {
+ g.sccEdges[e.From.SCC] = append(g.sccEdges[e.From.SCC], e)
+ if !e.control {
+ continue
+ }
+ if c, ok := e.To.Value.(Future); ok {
+ g.futures[e.From.SCC] = append(g.futures[e.From.SCC], c)
+ }
+ }
+ return g
+}
+
+func (g *Graph) Solve() Ranges {
+ var consts []Z
+ off := NewZ(1)
+ for _, n := range g.Vertices {
+ if c, ok := n.Value.(*ssa.Const); ok {
+ basic, ok := c.Type().Underlying().(*types.Basic)
+ if !ok {
+ continue
+ }
+ if (basic.Info() & types.IsInteger) != 0 {
+ z := ConstantToZ(c.Value)
+ consts = append(consts, z)
+ consts = append(consts, z.Add(off))
+ consts = append(consts, z.Sub(off))
+ }
+ }
+
+ }
+ sort.Sort(Zs(consts))
+
+ for scc, vertices := range g.SCCs {
+ n := 0
+ n = len(vertices)
+ if n == 1 {
+ g.resolveFutures(scc)
+ v := vertices[0]
+ if v, ok := v.Value.(ssa.Value); ok {
+ switch typ := v.Type().Underlying().(type) {
+ case *types.Basic:
+ switch typ.Kind() {
+ case types.String, types.UntypedString:
+ if !g.Range(v).(StringInterval).IsKnown() {
+ g.SetRange(v, StringInterval{NewIntInterval(NewZ(0), PInfinity)})
+ }
+ default:
+ if !g.Range(v).(IntInterval).IsKnown() {
+ g.SetRange(v, InfinityFor(v))
+ }
+ }
+ case *types.Chan:
+ if !g.Range(v).(ChannelInterval).IsKnown() {
+ g.SetRange(v, ChannelInterval{NewIntInterval(NewZ(0), PInfinity)})
+ }
+ case *types.Slice:
+ if !g.Range(v).(SliceInterval).IsKnown() {
+ g.SetRange(v, SliceInterval{NewIntInterval(NewZ(0), PInfinity)})
+ }
+ }
+ }
+ if c, ok := v.Value.(Constraint); ok {
+ g.SetRange(c.Y(), c.Eval(g))
+ }
+ } else {
+ uses := g.uses(scc)
+ entries := g.entries(scc)
+ for len(entries) > 0 {
+ v := entries[len(entries)-1]
+ entries = entries[:len(entries)-1]
+ for _, use := range uses[v] {
+ if g.widen(use, consts) {
+ entries = append(entries, use.Y())
+ }
+ }
+ }
+
+ g.resolveFutures(scc)
+
+ // XXX this seems to be necessary, but shouldn't be.
+ // removing it leads to nil pointer derefs; investigate
+ // where we're not setting values correctly.
+ for _, n := range vertices {
+ if v, ok := n.Value.(ssa.Value); ok {
+ i, ok := g.Range(v).(IntInterval)
+ if !ok {
+ continue
+ }
+ if !i.IsKnown() {
+ g.SetRange(v, InfinityFor(v))
+ }
+ }
+ }
+
+ actives := g.actives(scc)
+ for len(actives) > 0 {
+ v := actives[len(actives)-1]
+ actives = actives[:len(actives)-1]
+ for _, use := range uses[v] {
+ if g.narrow(use) {
+ actives = append(actives, use.Y())
+ }
+ }
+ }
+ }
+ // propagate scc
+ for _, edge := range g.sccEdges[scc] {
+ if edge.control {
+ continue
+ }
+ if edge.From.SCC == edge.To.SCC {
+ continue
+ }
+ if c, ok := edge.To.Value.(Constraint); ok {
+ g.SetRange(c.Y(), c.Eval(g))
+ }
+ if c, ok := edge.To.Value.(Future); ok {
+ if !c.IsKnown() {
+ c.MarkUnresolved()
+ }
+ }
+ }
+ }
+
+ for v, r := range g.ranges {
+ i, ok := r.(IntInterval)
+ if !ok {
+ continue
+ }
+ if (v.Type().Underlying().(*types.Basic).Info() & types.IsUnsigned) == 0 {
+ if i.Upper != PInfinity {
+ s := &types.StdSizes{
+ // XXX is it okay to assume the largest word size, or do we
+ // need to be platform specific?
+ WordSize: 8,
+ MaxAlign: 1,
+ }
+ bits := (s.Sizeof(v.Type()) * 8) - 1
+ n := big.NewInt(1)
+ n = n.Lsh(n, uint(bits))
+ upper, lower := &big.Int{}, &big.Int{}
+ upper.Sub(n, big.NewInt(1))
+ lower.Neg(n)
+
+ if i.Upper.Cmp(NewBigZ(upper)) == 1 {
+ i = NewIntInterval(NInfinity, PInfinity)
+ } else if i.Lower.Cmp(NewBigZ(lower)) == -1 {
+ i = NewIntInterval(NInfinity, PInfinity)
+ }
+ }
+ }
+
+ g.ranges[v] = i
+ }
+
+ return g.ranges
+}
+
+func VertexString(v *Vertex) string {
+ switch v := v.Value.(type) {
+ case Constraint:
+ return v.String()
+ case ssa.Value:
+ return v.Name()
+ case nil:
+ return "BUG: nil vertex value"
+ default:
+ panic(fmt.Sprintf("unexpected type %T", v))
+ }
+}
+
+type Vertex struct {
+ Value interface{} // one of Constraint or ssa.Value
+ SCC int
+ index int
+ lowlink int
+ stack bool
+
+ Succs []Edge
+}
+
+type Ranges map[ssa.Value]Range
+
+func (r Ranges) Get(x ssa.Value) Range {
+ if x == nil {
+ return nil
+ }
+ i, ok := r[x]
+ if !ok {
+ switch x := x.Type().Underlying().(type) {
+ case *types.Basic:
+ switch x.Kind() {
+ case types.String, types.UntypedString:
+ return StringInterval{}
+ default:
+ return IntInterval{}
+ }
+ case *types.Chan:
+ return ChannelInterval{}
+ case *types.Slice:
+ return SliceInterval{}
+ }
+ }
+ return i
+}
+
+type Graph struct {
+ Vertices map[interface{}]*Vertex
+ Edges []Edge
+ SCCs [][]*Vertex
+ ranges Ranges
+
+ // map SCCs to futures
+ futures [][]Future
+ // map SCCs to edges
+ sccEdges [][]Edge
+}
+
+func (g Graph) Graphviz() string {
+ var lines []string
+ lines = append(lines, "digraph{")
+ ids := map[interface{}]int{}
+ i := 1
+ for _, v := range g.Vertices {
+ ids[v] = i
+ shape := "box"
+ if _, ok := v.Value.(ssa.Value); ok {
+ shape = "oval"
+ }
+ lines = append(lines, fmt.Sprintf(`n%d [shape="%s", label=%q, colorscheme=spectral11, style="filled", fillcolor="%d"]`,
+ i, shape, VertexString(v), (v.SCC%11)+1))
+ i++
+ }
+ for _, e := range g.Edges {
+ style := "solid"
+ if e.control {
+ style = "dashed"
+ }
+ lines = append(lines, fmt.Sprintf(`n%d -> n%d [style="%s"]`, ids[e.From], ids[e.To], style))
+ }
+ lines = append(lines, "}")
+ return strings.Join(lines, "\n")
+}
+
+func (g *Graph) SetRange(x ssa.Value, r Range) {
+ g.ranges[x] = r
+}
+
+func (g *Graph) Range(x ssa.Value) Range {
+ return g.ranges.Get(x)
+}
+
+func (g *Graph) widen(c Constraint, consts []Z) bool {
+ setRange := func(i Range) {
+ g.SetRange(c.Y(), i)
+ }
+ widenIntInterval := func(oi, ni IntInterval) (IntInterval, bool) {
+ if !ni.IsKnown() {
+ return oi, false
+ }
+ nlc := NInfinity
+ nuc := PInfinity
+ for _, co := range consts {
+ if co.Cmp(ni.Lower) <= 0 {
+ nlc = co
+ break
+ }
+ }
+ for _, co := range consts {
+ if co.Cmp(ni.Upper) >= 0 {
+ nuc = co
+ break
+ }
+ }
+
+ if !oi.IsKnown() {
+ return ni, true
+ }
+ if ni.Lower.Cmp(oi.Lower) == -1 && ni.Upper.Cmp(oi.Upper) == 1 {
+ return NewIntInterval(nlc, nuc), true
+ }
+ if ni.Lower.Cmp(oi.Lower) == -1 {
+ return NewIntInterval(nlc, oi.Upper), true
+ }
+ if ni.Upper.Cmp(oi.Upper) == 1 {
+ return NewIntInterval(oi.Lower, nuc), true
+ }
+ return oi, false
+ }
+ switch oi := g.Range(c.Y()).(type) {
+ case IntInterval:
+ ni := c.Eval(g).(IntInterval)
+ si, changed := widenIntInterval(oi, ni)
+ if changed {
+ setRange(si)
+ return true
+ }
+ return false
+ case StringInterval:
+ ni := c.Eval(g).(StringInterval)
+ si, changed := widenIntInterval(oi.Length, ni.Length)
+ if changed {
+ setRange(StringInterval{si})
+ return true
+ }
+ return false
+ case SliceInterval:
+ ni := c.Eval(g).(SliceInterval)
+ si, changed := widenIntInterval(oi.Length, ni.Length)
+ if changed {
+ setRange(SliceInterval{si})
+ return true
+ }
+ return false
+ default:
+ return false
+ }
+}
+
+func (g *Graph) narrow(c Constraint) bool {
+ narrowIntInterval := func(oi, ni IntInterval) (IntInterval, bool) {
+ oLower := oi.Lower
+ oUpper := oi.Upper
+ nLower := ni.Lower
+ nUpper := ni.Upper
+
+ if oLower == NInfinity && nLower != NInfinity {
+ return NewIntInterval(nLower, oUpper), true
+ }
+ if oUpper == PInfinity && nUpper != PInfinity {
+ return NewIntInterval(oLower, nUpper), true
+ }
+ if oLower.Cmp(nLower) == 1 {
+ return NewIntInterval(nLower, oUpper), true
+ }
+ if oUpper.Cmp(nUpper) == -1 {
+ return NewIntInterval(oLower, nUpper), true
+ }
+ return oi, false
+ }
+ switch oi := g.Range(c.Y()).(type) {
+ case IntInterval:
+ ni := c.Eval(g).(IntInterval)
+ si, changed := narrowIntInterval(oi, ni)
+ if changed {
+ g.SetRange(c.Y(), si)
+ return true
+ }
+ return false
+ case StringInterval:
+ ni := c.Eval(g).(StringInterval)
+ si, changed := narrowIntInterval(oi.Length, ni.Length)
+ if changed {
+ g.SetRange(c.Y(), StringInterval{si})
+ return true
+ }
+ return false
+ case SliceInterval:
+ ni := c.Eval(g).(SliceInterval)
+ si, changed := narrowIntInterval(oi.Length, ni.Length)
+ if changed {
+ g.SetRange(c.Y(), SliceInterval{si})
+ return true
+ }
+ return false
+ default:
+ return false
+ }
+}
+
+func (g *Graph) resolveFutures(scc int) {
+ for _, c := range g.futures[scc] {
+ c.Resolve()
+ }
+}
+
+func (g *Graph) entries(scc int) []ssa.Value {
+ var entries []ssa.Value
+ for _, n := range g.Vertices {
+ if n.SCC != scc {
+ continue
+ }
+ if v, ok := n.Value.(ssa.Value); ok {
+ // XXX avoid quadratic runtime
+ //
+ // XXX I cannot think of any code where the future and its
+ // variables aren't in the same SCC, in which case this
+ // code isn't very useful (the variables won't be resolved
+ // yet). Before we have a cross-SCC example, however, we
+ // can't really verify that this code is working
+ // correctly, or indeed doing anything useful.
+ for _, on := range g.Vertices {
+ if c, ok := on.Value.(Future); ok {
+ if c.Y() == v {
+ if !c.IsResolved() {
+ g.SetRange(c.Y(), c.Eval(g))
+ c.MarkResolved()
+ }
+ break
+ }
+ }
+ }
+ if g.Range(v).IsKnown() {
+ entries = append(entries, v)
+ }
+ }
+ }
+ return entries
+}
+
+func (g *Graph) uses(scc int) map[ssa.Value][]Constraint {
+ m := map[ssa.Value][]Constraint{}
+ for _, e := range g.sccEdges[scc] {
+ if e.control {
+ continue
+ }
+ if v, ok := e.From.Value.(ssa.Value); ok {
+ c := e.To.Value.(Constraint)
+ sink := c.Y()
+ if g.Vertices[sink].SCC == scc {
+ m[v] = append(m[v], c)
+ }
+ }
+ }
+ return m
+}
+
+func (g *Graph) actives(scc int) []ssa.Value {
+ var actives []ssa.Value
+ for _, n := range g.Vertices {
+ if n.SCC != scc {
+ continue
+ }
+ if v, ok := n.Value.(ssa.Value); ok {
+ if _, ok := v.(*ssa.Const); !ok {
+ actives = append(actives, v)
+ }
+ }
+ }
+ return actives
+}
+
+func (g *Graph) AddEdge(from, to interface{}, ctrl bool) {
+ vf, ok := g.Vertices[from]
+ if !ok {
+ vf = &Vertex{Value: from}
+ g.Vertices[from] = vf
+ }
+ vt, ok := g.Vertices[to]
+ if !ok {
+ vt = &Vertex{Value: to}
+ g.Vertices[to] = vt
+ }
+ e := Edge{From: vf, To: vt, control: ctrl}
+ g.Edges = append(g.Edges, e)
+ vf.Succs = append(vf.Succs, e)
+}
+
+type Edge struct {
+ From, To *Vertex
+ control bool
+}
+
+func (e Edge) String() string {
+ return fmt.Sprintf("%s -> %s", VertexString(e.From), VertexString(e.To))
+}
+
+func (g *Graph) FindSCCs() {
+ // use Tarjan to find the SCCs
+
+ index := 1
+ var s []*Vertex
+
+ scc := 0
+ var strongconnect func(v *Vertex)
+ strongconnect = func(v *Vertex) {
+ // set the depth index for v to the smallest unused index
+ v.index = index
+ v.lowlink = index
+ index++
+ s = append(s, v)
+ v.stack = true
+
+ for _, e := range v.Succs {
+ w := e.To
+ if w.index == 0 {
+ // successor w has not yet been visited; recurse on it
+ strongconnect(w)
+ if w.lowlink < v.lowlink {
+ v.lowlink = w.lowlink
+ }
+ } else if w.stack {
+ // successor w is in stack s and hence in the current scc
+ if w.index < v.lowlink {
+ v.lowlink = w.index
+ }
+ }
+ }
+
+ if v.lowlink == v.index {
+ for {
+ w := s[len(s)-1]
+ s = s[:len(s)-1]
+ w.stack = false
+ w.SCC = scc
+ if w == v {
+ break
+ }
+ }
+ scc++
+ }
+ }
+ for _, v := range g.Vertices {
+ if v.index == 0 {
+ strongconnect(v)
+ }
+ }
+
+ g.SCCs = make([][]*Vertex, scc)
+ for _, n := range g.Vertices {
+ n.SCC = scc - n.SCC - 1
+ g.SCCs[n.SCC] = append(g.SCCs[n.SCC], n)
+ }
+}
+
+func invertToken(tok token.Token) token.Token {
+ switch tok {
+ case token.LSS:
+ return token.GEQ
+ case token.GTR:
+ return token.LEQ
+ case token.EQL:
+ return token.NEQ
+ case token.NEQ:
+ return token.EQL
+ case token.GEQ:
+ return token.LSS
+ case token.LEQ:
+ return token.GTR
+ default:
+ panic(fmt.Sprintf("unsupported token %s", tok))
+ }
+}
+
+func flipToken(tok token.Token) token.Token {
+ switch tok {
+ case token.LSS:
+ return token.GTR
+ case token.GTR:
+ return token.LSS
+ case token.EQL:
+ return token.EQL
+ case token.NEQ:
+ return token.NEQ
+ case token.GEQ:
+ return token.LEQ
+ case token.LEQ:
+ return token.GEQ
+ default:
+ panic(fmt.Sprintf("unsupported token %s", tok))
+ }
+}
+
+type CopyConstraint struct {
+ aConstraint
+ X ssa.Value
+}
+
+func (c *CopyConstraint) String() string {
+ return fmt.Sprintf("%s = copy(%s)", c.Y().Name(), c.X.Name())
+}
+
+func (c *CopyConstraint) Eval(g *Graph) Range {
+ return g.Range(c.X)
+}
+
+func (c *CopyConstraint) Operands() []ssa.Value {
+ return []ssa.Value{c.X}
+}
+
+func NewCopyConstraint(x, y ssa.Value) Constraint {
+ return &CopyConstraint{
+ aConstraint: aConstraint{
+ y: y,
+ },
+ X: x,
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/stylecheck/lint.go b/vendor/github.com/golangci/go-tools/stylecheck/lint.go
new file mode 100644
index 00000000000..38f9d6667f3
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/stylecheck/lint.go
@@ -0,0 +1,650 @@
+package stylecheck // import "github.com/golangci/go-tools/stylecheck"
+
+import (
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "strconv"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+ "github.com/golangci/go-tools/ssa"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+type Checker struct {
+ CheckGenerated bool
+}
+
+func NewChecker() *Checker {
+ return &Checker{}
+}
+
+func (*Checker) Name() string { return "stylecheck" }
+func (*Checker) Prefix() string { return "ST" }
+func (c *Checker) Init(prog *lint.Program) {}
+
+func (c *Checker) Checks() []lint.Check {
+ return []lint.Check{
+ {ID: "ST1000", FilterGenerated: false, Fn: c.CheckPackageComment},
+ {ID: "ST1001", FilterGenerated: true, Fn: c.CheckDotImports},
+ // {ID: "ST1002", FilterGenerated: true, Fn: c.CheckBlankImports},
+ {ID: "ST1003", FilterGenerated: true, Fn: c.CheckNames},
+ // {ID: "ST1004", FilterGenerated: false, Fn: nil, },
+ {ID: "ST1005", FilterGenerated: false, Fn: c.CheckErrorStrings},
+ {ID: "ST1006", FilterGenerated: false, Fn: c.CheckReceiverNames},
+ // {ID: "ST1007", FilterGenerated: true, Fn: c.CheckIncDec},
+ {ID: "ST1008", FilterGenerated: false, Fn: c.CheckErrorReturn},
+ // {ID: "ST1009", FilterGenerated: false, Fn: c.CheckUnexportedReturn},
+ // {ID: "ST1010", FilterGenerated: false, Fn: c.CheckContextFirstArg},
+ {ID: "ST1011", FilterGenerated: false, Fn: c.CheckTimeNames},
+ {ID: "ST1012", FilterGenerated: false, Fn: c.CheckErrorVarNames},
+ {ID: "ST1013", FilterGenerated: true, Fn: c.CheckHTTPStatusCodes},
+ {ID: "ST1015", FilterGenerated: true, Fn: c.CheckDefaultCaseOrder},
+ {ID: "ST1016", FilterGenerated: false, Fn: c.CheckReceiverNamesIdentical},
+ {ID: "ST1017", FilterGenerated: true, Fn: c.CheckYodaConditions},
+ }
+}
+
+func (c *Checker) CheckPackageComment(j *lint.Job) {
+ // - At least one file in a non-main package should have a package comment
+ //
+ // - The comment should be of the form
+ // "Package x ...". This has a slight potential for false
+ // positives, as multiple files can have package comments, in
+ // which case they get appended. But that doesn't happen a lot in
+ // the real world.
+
+ for _, pkg := range j.Program.InitialPackages {
+ if pkg.Name == "main" {
+ continue
+ }
+ hasDocs := false
+ for _, f := range pkg.Syntax {
+ if IsInTest(j, f) {
+ continue
+ }
+ if f.Doc != nil && len(f.Doc.List) > 0 {
+ hasDocs = true
+ prefix := "Package " + f.Name.Name + " "
+ if !strings.HasPrefix(strings.TrimSpace(f.Doc.Text()), prefix) {
+ j.Errorf(f.Doc, `package comment should be of the form "%s..."`, prefix)
+ }
+ f.Doc.Text()
+ }
+ }
+
+ if !hasDocs {
+ for _, f := range pkg.Syntax {
+ if IsInTest(j, f) {
+ continue
+ }
+ j.Errorf(f, "at least one file in a package should have a package comment")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckDotImports(j *lint.Job) {
+ for _, pkg := range j.Program.InitialPackages {
+ for _, f := range pkg.Syntax {
+ imports:
+ for _, imp := range f.Imports {
+ path := imp.Path.Value
+ path = path[1 : len(path)-1]
+ for _, w := range pkg.Config.DotImportWhitelist {
+ if w == path {
+ continue imports
+ }
+ }
+
+ if imp.Name != nil && imp.Name.Name == "." && !IsInTest(j, f) {
+ j.Errorf(imp, "should not use dot imports")
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckBlankImports(j *lint.Job) {
+ fset := j.Program.Fset()
+ for _, f := range j.Program.Files {
+ if IsInMain(j, f) || IsInTest(j, f) {
+ continue
+ }
+
+ // Collect imports of the form `import _ "foo"`, i.e. with no
+ // parentheses, as their comment will be associated with the
+ // (paren-free) GenDecl, not the import spec itself.
+ //
+ // We don't directly process the GenDecl so that we can
+ // correctly handle the following:
+ //
+ // import _ "foo"
+ // import _ "bar"
+ //
+ // where only the first import should get flagged.
+ skip := map[ast.Spec]bool{}
+ ast.Inspect(f, func(node ast.Node) bool {
+ switch node := node.(type) {
+ case *ast.File:
+ return true
+ case *ast.GenDecl:
+ if node.Tok != token.IMPORT {
+ return false
+ }
+ if node.Lparen == token.NoPos && node.Doc != nil {
+ skip[node.Specs[0]] = true
+ }
+ return false
+ }
+ return false
+ })
+ for i, imp := range f.Imports {
+ pos := fset.Position(imp.Pos())
+
+ if !IsBlank(imp.Name) {
+ continue
+ }
+ // Only flag the first blank import in a group of imports,
+ // or don't flag any of them, if the first one is
+ // commented
+ if i > 0 {
+ prev := f.Imports[i-1]
+ prevPos := fset.Position(prev.Pos())
+ if pos.Line-1 == prevPos.Line && IsBlank(prev.Name) {
+ continue
+ }
+ }
+
+ if imp.Doc == nil && imp.Comment == nil && !skip[imp] {
+ j.Errorf(imp, "a blank import should be only in a main or test package, or have a comment justifying it")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckIncDec(j *lint.Job) {
+ // TODO(dh): this can be noisy for function bodies that look like this:
+ // x += 3
+ // ...
+ // x += 2
+ // ...
+ // x += 1
+ fn := func(node ast.Node) bool {
+ assign, ok := node.(*ast.AssignStmt)
+ if !ok || (assign.Tok != token.ADD_ASSIGN && assign.Tok != token.SUB_ASSIGN) {
+ return true
+ }
+ if (len(assign.Lhs) != 1 || len(assign.Rhs) != 1) ||
+ !IsIntLiteral(assign.Rhs[0], "1") {
+ return true
+ }
+
+ suffix := ""
+ switch assign.Tok {
+ case token.ADD_ASSIGN:
+ suffix = "++"
+ case token.SUB_ASSIGN:
+ suffix = "--"
+ }
+
+ j.Errorf(assign, "should replace %s with %s%s", Render(j, assign), Render(j, assign.Lhs[0]), suffix)
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckErrorReturn(j *lint.Job) {
+fnLoop:
+ for _, fn := range j.Program.InitialFunctions {
+ sig := fn.Type().(*types.Signature)
+ rets := sig.Results()
+ if rets == nil || rets.Len() < 2 {
+ continue
+ }
+
+ if rets.At(rets.Len()-1).Type() == types.Universe.Lookup("error").Type() {
+ // Last return type is error. If the function also returns
+ // errors in other positions, that's fine.
+ continue
+ }
+ for i := rets.Len() - 2; i >= 0; i-- {
+ if rets.At(i).Type() == types.Universe.Lookup("error").Type() {
+ j.Errorf(rets.At(i), "error should be returned as the last argument")
+ continue fnLoop
+ }
+ }
+ }
+}
+
+// CheckUnexportedReturn checks that exported functions on exported
+// types do not return unexported types.
+func (c *Checker) CheckUnexportedReturn(j *lint.Job) {
+ for _, fn := range j.Program.InitialFunctions {
+ if fn.Synthetic != "" || fn.Parent() != nil {
+ continue
+ }
+ if !ast.IsExported(fn.Name()) || IsInMain(j, fn) || IsInTest(j, fn) {
+ continue
+ }
+ sig := fn.Type().(*types.Signature)
+ if sig.Recv() != nil && !ast.IsExported(Dereference(sig.Recv().Type()).(*types.Named).Obj().Name()) {
+ continue
+ }
+ res := sig.Results()
+ for i := 0; i < res.Len(); i++ {
+ if named, ok := DereferenceR(res.At(i).Type()).(*types.Named); ok &&
+ !ast.IsExported(named.Obj().Name()) &&
+ named != types.Universe.Lookup("error").Type() {
+ j.Errorf(fn, "should not return unexported type")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckReceiverNames(j *lint.Job) {
+ for _, pkg := range j.Program.InitialPackages {
+ if pkg.SSA == nil {
+ continue
+ }
+ for _, m := range pkg.SSA.Members {
+ if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() {
+ ms := typeutil.IntuitiveMethodSet(T.Type(), nil)
+ for _, sel := range ms {
+ fn := sel.Obj().(*types.Func)
+ recv := fn.Type().(*types.Signature).Recv()
+ if Dereference(recv.Type()) != T.Type() {
+ // skip embedded methods
+ continue
+ }
+ if recv.Name() == "self" || recv.Name() == "this" {
+ j.Errorf(recv, `receiver name should be a reflection of its identity; don't use generic names such as "this" or "self"`)
+ }
+ if recv.Name() == "_" {
+ j.Errorf(recv, "receiver name should not be an underscore, omit the name if it is unused")
+ }
+ }
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckReceiverNamesIdentical(j *lint.Job) {
+ for _, pkg := range j.Program.InitialPackages {
+ if pkg.SSA == nil {
+ continue
+ }
+
+ for _, m := range pkg.SSA.Members {
+ names := map[string]int{}
+
+ var firstFn *types.Func
+ if T, ok := m.Object().(*types.TypeName); ok && !T.IsAlias() {
+ ms := typeutil.IntuitiveMethodSet(T.Type(), nil)
+ for _, sel := range ms {
+ fn := sel.Obj().(*types.Func)
+ recv := fn.Type().(*types.Signature).Recv()
+ if Dereference(recv.Type()) != T.Type() {
+ // skip embedded methods
+ continue
+ }
+ if firstFn == nil {
+ firstFn = fn
+ }
+ if recv.Name() != "" && recv.Name() != "_" {
+ names[recv.Name()]++
+ }
+ }
+ }
+
+ if len(names) > 1 {
+ var seen []string
+ for name, count := range names {
+ seen = append(seen, fmt.Sprintf("%dx %q", count, name))
+ }
+
+ j.Errorf(firstFn, "methods on the same type should have the same receiver name (seen %s)", strings.Join(seen, ", "))
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckContextFirstArg(j *lint.Job) {
+ // TODO(dh): this check doesn't apply to test helpers. Example from the stdlib:
+ // func helperCommandContext(t *testing.T, ctx context.Context, s ...string) (cmd *exec.Cmd) {
+fnLoop:
+ for _, fn := range j.Program.InitialFunctions {
+ if fn.Synthetic != "" || fn.Parent() != nil {
+ continue
+ }
+ params := fn.Signature.Params()
+ if params.Len() < 2 {
+ continue
+ }
+ if types.TypeString(params.At(0).Type(), nil) == "context.Context" {
+ continue
+ }
+ for i := 1; i < params.Len(); i++ {
+ param := params.At(i)
+ if types.TypeString(param.Type(), nil) == "context.Context" {
+ j.Errorf(param, "context.Context should be the first argument of a function")
+ continue fnLoop
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckErrorStrings(j *lint.Job) {
+ fnNames := map[*ssa.Package]map[string]bool{}
+ for _, fn := range j.Program.InitialFunctions {
+ m := fnNames[fn.Package()]
+ if m == nil {
+ m = map[string]bool{}
+ fnNames[fn.Package()] = m
+ }
+ m[fn.Name()] = true
+ }
+
+ for _, fn := range j.Program.InitialFunctions {
+ if IsInTest(j, fn) {
+ // We don't care about malformed error messages in tests;
+ // they're usually for direct human consumption, not part
+ // of an API
+ continue
+ }
+ for _, block := range fn.Blocks {
+ instrLoop:
+ for _, ins := range block.Instrs {
+ call, ok := ins.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ if !IsCallTo(call.Common(), "errors.New") && !IsCallTo(call.Common(), "fmt.Errorf") {
+ continue
+ }
+
+ k, ok := call.Common().Args[0].(*ssa.Const)
+ if !ok {
+ continue
+ }
+
+ s := constant.StringVal(k.Value)
+ if len(s) == 0 {
+ continue
+ }
+ switch s[len(s)-1] {
+ case '.', ':', '!', '\n':
+ j.Errorf(call, "error strings should not end with punctuation or a newline")
+ }
+ idx := strings.IndexByte(s, ' ')
+ if idx == -1 {
+ // single word error message, probably not a real
+ // error but something used in tests or during
+ // debugging
+ continue
+ }
+ word := s[:idx]
+ first, n := utf8.DecodeRuneInString(word)
+ if !unicode.IsUpper(first) {
+ continue
+ }
+ for _, c := range word[n:] {
+ if unicode.IsUpper(c) {
+ // Word is probably an initialism or
+ // multi-word function name
+ continue instrLoop
+ }
+ }
+
+ word = strings.TrimRightFunc(word, func(r rune) bool { return unicode.IsPunct(r) })
+ if fnNames[fn.Package()][word] {
+ // Word is probably the name of a function in this package
+ continue
+ }
+ // First word in error starts with a capital
+ // letter, and the word doesn't contain any other
+ // capitals, making it unlikely to be an
+ // initialism or multi-word function name.
+ //
+ // It could still be a proper noun, though.
+
+ j.Errorf(call, "error strings should not be capitalized")
+ }
+ }
+ }
+}
+
+func (c *Checker) CheckTimeNames(j *lint.Job) {
+ suffixes := []string{
+ "Sec", "Secs", "Seconds",
+ "Msec", "Msecs",
+ "Milli", "Millis", "Milliseconds",
+ "Usec", "Usecs", "Microseconds",
+ "MS", "Ms",
+ }
+ fn := func(T types.Type, names []*ast.Ident) {
+ if !IsType(T, "time.Duration") && !IsType(T, "*time.Duration") {
+ return
+ }
+ for _, name := range names {
+ for _, suffix := range suffixes {
+ if strings.HasSuffix(name.Name, suffix) {
+ j.Errorf(name, "var %s is of type %v; don't use unit-specific suffix %q", name.Name, T, suffix)
+ break
+ }
+ }
+ }
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, func(node ast.Node) bool {
+ switch node := node.(type) {
+ case *ast.ValueSpec:
+ T := TypeOf(j, node.Type)
+ fn(T, node.Names)
+ case *ast.FieldList:
+ for _, field := range node.List {
+ T := TypeOf(j, field.Type)
+ fn(T, field.Names)
+ }
+ }
+ return true
+ })
+ }
+}
+
+func (c *Checker) CheckErrorVarNames(j *lint.Job) {
+ for _, f := range j.Program.Files {
+ for _, decl := range f.Decls {
+ gen, ok := decl.(*ast.GenDecl)
+ if !ok || gen.Tok != token.VAR {
+ continue
+ }
+ for _, spec := range gen.Specs {
+ spec := spec.(*ast.ValueSpec)
+ if len(spec.Names) != len(spec.Values) {
+ continue
+ }
+
+ for i, name := range spec.Names {
+ val := spec.Values[i]
+ if !IsCallToAST(j, val, "errors.New") && !IsCallToAST(j, val, "fmt.Errorf") {
+ continue
+ }
+
+ prefix := "err"
+ if name.IsExported() {
+ prefix = "Err"
+ }
+ if !strings.HasPrefix(name.Name, prefix) {
+ j.Errorf(name, "error var %s should have name of the form %sFoo", name.Name, prefix)
+ }
+ }
+ }
+ }
+ }
+}
+
+var httpStatusCodes = map[int]string{
+ 100: "StatusContinue",
+ 101: "StatusSwitchingProtocols",
+ 102: "StatusProcessing",
+ 200: "StatusOK",
+ 201: "StatusCreated",
+ 202: "StatusAccepted",
+ 203: "StatusNonAuthoritativeInfo",
+ 204: "StatusNoContent",
+ 205: "StatusResetContent",
+ 206: "StatusPartialContent",
+ 207: "StatusMultiStatus",
+ 208: "StatusAlreadyReported",
+ 226: "StatusIMUsed",
+ 300: "StatusMultipleChoices",
+ 301: "StatusMovedPermanently",
+ 302: "StatusFound",
+ 303: "StatusSeeOther",
+ 304: "StatusNotModified",
+ 305: "StatusUseProxy",
+ 307: "StatusTemporaryRedirect",
+ 308: "StatusPermanentRedirect",
+ 400: "StatusBadRequest",
+ 401: "StatusUnauthorized",
+ 402: "StatusPaymentRequired",
+ 403: "StatusForbidden",
+ 404: "StatusNotFound",
+ 405: "StatusMethodNotAllowed",
+ 406: "StatusNotAcceptable",
+ 407: "StatusProxyAuthRequired",
+ 408: "StatusRequestTimeout",
+ 409: "StatusConflict",
+ 410: "StatusGone",
+ 411: "StatusLengthRequired",
+ 412: "StatusPreconditionFailed",
+ 413: "StatusRequestEntityTooLarge",
+ 414: "StatusRequestURITooLong",
+ 415: "StatusUnsupportedMediaType",
+ 416: "StatusRequestedRangeNotSatisfiable",
+ 417: "StatusExpectationFailed",
+ 418: "StatusTeapot",
+ 422: "StatusUnprocessableEntity",
+ 423: "StatusLocked",
+ 424: "StatusFailedDependency",
+ 426: "StatusUpgradeRequired",
+ 428: "StatusPreconditionRequired",
+ 429: "StatusTooManyRequests",
+ 431: "StatusRequestHeaderFieldsTooLarge",
+ 451: "StatusUnavailableForLegalReasons",
+ 500: "StatusInternalServerError",
+ 501: "StatusNotImplemented",
+ 502: "StatusBadGateway",
+ 503: "StatusServiceUnavailable",
+ 504: "StatusGatewayTimeout",
+ 505: "StatusHTTPVersionNotSupported",
+ 506: "StatusVariantAlsoNegotiates",
+ 507: "StatusInsufficientStorage",
+ 508: "StatusLoopDetected",
+ 510: "StatusNotExtended",
+ 511: "StatusNetworkAuthenticationRequired",
+}
+
+func (c *Checker) CheckHTTPStatusCodes(j *lint.Job) {
+ for _, pkg := range j.Program.InitialPackages {
+ whitelist := map[string]bool{}
+ for _, code := range pkg.Config.HTTPStatusCodeWhitelist {
+ whitelist[code] = true
+ }
+ fn := func(node ast.Node) bool {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return true
+ }
+
+ var arg int
+ switch CallNameAST(j, call) {
+ case "net/http.Error":
+ arg = 2
+ case "net/http.Redirect":
+ arg = 3
+ case "net/http.StatusText":
+ arg = 0
+ case "net/http.RedirectHandler":
+ arg = 1
+ default:
+ return true
+ }
+ lit, ok := call.Args[arg].(*ast.BasicLit)
+ if !ok {
+ return true
+ }
+ if whitelist[lit.Value] {
+ return true
+ }
+
+ n, err := strconv.Atoi(lit.Value)
+ if err != nil {
+ return true
+ }
+ s, ok := httpStatusCodes[n]
+ if !ok {
+ return true
+ }
+ j.Errorf(lit, "should use constant http.%s instead of numeric literal %d", s, n)
+ return true
+ }
+ for _, f := range pkg.Syntax {
+ ast.Inspect(f, fn)
+ }
+ }
+}
+
+func (c *Checker) CheckDefaultCaseOrder(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ stmt, ok := node.(*ast.SwitchStmt)
+ if !ok {
+ return true
+ }
+ list := stmt.Body.List
+ for i, c := range list {
+ if c.(*ast.CaseClause).List == nil && i != 0 && i != len(list)-1 {
+ j.Errorf(c, "default case should be first or last in switch statement")
+ break
+ }
+ }
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
+
+func (c *Checker) CheckYodaConditions(j *lint.Job) {
+ fn := func(node ast.Node) bool {
+ cond, ok := node.(*ast.BinaryExpr)
+ if !ok {
+ return true
+ }
+ if cond.Op != token.EQL && cond.Op != token.NEQ {
+ return true
+ }
+ if _, ok := cond.X.(*ast.BasicLit); !ok {
+ return true
+ }
+ if _, ok := cond.Y.(*ast.BasicLit); ok {
+ // Don't flag lit == lit conditions, just in case
+ return true
+ }
+ j.Errorf(cond, "don't use Yoda conditions")
+ return true
+ }
+ for _, f := range j.Program.Files {
+ ast.Inspect(f, fn)
+ }
+}
diff --git a/vendor/github.com/golangci/go-tools/stylecheck/names.go b/vendor/github.com/golangci/go-tools/stylecheck/names.go
new file mode 100644
index 00000000000..342b708f1cd
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/stylecheck/names.go
@@ -0,0 +1,263 @@
+// Copyright (c) 2013 The Go Authors. All rights reserved.
+// Copyright (c) 2018 Dominik Honnef. All rights reserved.
+
+package stylecheck
+
+import (
+ "go/ast"
+ "go/token"
+ "strings"
+ "unicode"
+
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+)
+
+// 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 (c *Checker) CheckNames(j *lint.Job) {
+ // A large part of this function is copied from
+ // github.com/golang/lint, Copyright (c) 2013 The Go Authors,
+ // licensed under the BSD 3-clause license.
+
+ allCaps := func(s string) bool {
+ for _, r := range s {
+ if !((r >= 'A' && r <= 'Z') || (r >= '0' && r <= '9') || r == '_') {
+ return false
+ }
+ }
+ return true
+ }
+
+ check := func(id *ast.Ident, thing string, initialisms map[string]bool) {
+ 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 && allCaps(id.Name) && strings.Contains(id.Name, "_") {
+ j.Errorf(id, "should not use ALL_CAPS in Go names; use CamelCase instead")
+ return
+ }
+
+ should := lintName(id.Name, initialisms)
+ if id.Name == should {
+ return
+ }
+
+ if len(id.Name) > 2 && strings.Contains(id.Name[1:len(id.Name)-1], "_") {
+ j.Errorf(id, "should not use underscores in Go names; %s %s should be %s", thing, id.Name, should)
+ return
+ }
+ j.Errorf(id, "%s %s should be %s", thing, id.Name, should)
+ }
+ checkList := func(fl *ast.FieldList, thing string, initialisms map[string]bool) {
+ if fl == nil {
+ return
+ }
+ for _, f := range fl.List {
+ for _, id := range f.Names {
+ check(id, thing, initialisms)
+ }
+ }
+ }
+
+ for _, pkg := range j.Program.InitialPackages {
+ initialisms := make(map[string]bool, len(pkg.Config.Initialisms))
+ for _, word := range pkg.Config.Initialisms {
+ initialisms[word] = true
+ }
+ for _, f := range pkg.Syntax {
+ // Package names need slightly different handling than other names.
+ if !strings.HasSuffix(f.Name.Name, "_test") && strings.Contains(f.Name.Name, "_") {
+ j.Errorf(f, "should not use underscores in package names")
+ }
+ if strings.IndexFunc(f.Name.Name, unicode.IsUpper) != -1 {
+ j.Errorf(f, "should not use MixedCaps in package name; %s should be %s", f.Name.Name, strings.ToLower(f.Name.Name))
+ }
+
+ ast.Inspect(f, func(node ast.Node) bool {
+ switch v := node.(type) {
+ case *ast.AssignStmt:
+ if v.Tok != token.DEFINE {
+ return true
+ }
+ for _, exp := range v.Lhs {
+ if id, ok := exp.(*ast.Ident); ok {
+ check(id, "var", initialisms)
+ }
+ }
+ case *ast.FuncDecl:
+ // Functions with no body are defined elsewhere (in
+ // assembly, or via go:linkname). These are likely to
+ // be something very low level (such as the runtime),
+ // where our rules don't apply.
+ if v.Body == nil {
+ return true
+ }
+
+ if IsInTest(j, v) && (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"
+ }
+
+ if !isTechnicallyExported(v) {
+ check(v.Name, thing, initialisms)
+ }
+
+ checkList(v.Type.Params, thing+" parameter", initialisms)
+ checkList(v.Type.Results, thing+" result", initialisms)
+ 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, initialisms)
+ case *ast.ValueSpec:
+ for _, id := range s.Names {
+ check(id, thing, initialisms)
+ }
+ }
+ }
+ 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", initialisms)
+ checkList(ft.Results, "interface method result", initialisms)
+ }
+ case *ast.RangeStmt:
+ if v.Tok == token.ASSIGN {
+ return true
+ }
+ if id, ok := v.Key.(*ast.Ident); ok {
+ check(id, "range var", initialisms)
+ }
+ if id, ok := v.Value.(*ast.Ident); ok {
+ check(id, "range var", initialisms)
+ }
+ case *ast.StructType:
+ for _, f := range v.Fields.List {
+ for _, id := range f.Names {
+ check(id, "struct field", initialisms)
+ }
+ }
+ }
+ return true
+ })
+ }
+ }
+}
+
+// lintName returns a different name if it should be different.
+func lintName(name string, initialisms map[string]bool) (should string) {
+ // A large part of this function is copied from
+ // github.com/golang/lint, Copyright (c) 2013 The Go Authors,
+ // licensed under the BSD 3-clause license.
+
+ // Fast path for simple cases: "_" and all lowercase.
+ if name == "_" {
+ return name
+ }
+ if strings.IndexFunc(name, func(r rune) bool { return !unicode.IsLower(r) }) == -1 {
+ 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] == '_' && i+1 != len(runes)-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); initialisms[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.
+ // TODO(dh): this won't be true once we allow custom initialisms
+ 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)
+}
+
+func isTechnicallyExported(f *ast.FuncDecl) bool {
+ if f.Recv != nil || f.Doc == nil {
+ return false
+ }
+
+ const export = "//export "
+ const linkname = "//go:linkname "
+ for _, c := range f.Doc.List {
+ if strings.HasPrefix(c.Text, export) && len(c.Text) == len(export)+len(f.Name.Name) && c.Text[len(export):] == f.Name.Name {
+ return true
+ }
+
+ if strings.HasPrefix(c.Text, linkname) {
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/go-tools/unused/unused.go b/vendor/github.com/golangci/go-tools/unused/unused.go
new file mode 100644
index 00000000000..180fa1a19ff
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/unused/unused.go
@@ -0,0 +1,1087 @@
+package unused // import "github.com/golangci/go-tools/unused"
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "io"
+ "path/filepath"
+ "strings"
+
+ "github.com/golangci/go-tools/lint"
+ . "github.com/golangci/go-tools/lint/lintdsl"
+
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+func NewLintChecker(c *Checker) *LintChecker {
+ l := &LintChecker{
+ c: c,
+ }
+ return l
+}
+
+type LintChecker struct {
+ c *Checker
+}
+
+func (*LintChecker) Name() string { return "unused" }
+func (*LintChecker) Prefix() string { return "U" }
+
+func (l *LintChecker) Init(*lint.Program) {}
+func (l *LintChecker) Checks() []lint.Check {
+ return []lint.Check{
+ {ID: "U1000", FilterGenerated: true, Fn: l.Lint},
+ }
+}
+
+func typString(obj types.Object) string {
+ switch obj := obj.(type) {
+ case *types.Func:
+ return "func"
+ case *types.Var:
+ if obj.IsField() {
+ return "field"
+ }
+ return "var"
+ case *types.Const:
+ return "const"
+ case *types.TypeName:
+ return "type"
+ default:
+ // log.Printf("%T", obj)
+ return "identifier"
+ }
+}
+
+func (l *LintChecker) Lint(j *lint.Job) {
+ unused := l.c.Check(j.Program)
+ for _, u := range unused {
+ name := u.Obj.Name()
+ if sig, ok := u.Obj.Type().(*types.Signature); ok && sig.Recv() != nil {
+ switch sig.Recv().Type().(type) {
+ case *types.Named, *types.Pointer:
+ typ := types.TypeString(sig.Recv().Type(), func(*types.Package) string { return "" })
+ if len(typ) > 0 && typ[0] == '*' {
+ name = fmt.Sprintf("(%s).%s", typ, u.Obj.Name())
+ } else if len(typ) > 0 {
+ name = fmt.Sprintf("%s.%s", typ, u.Obj.Name())
+ }
+ }
+ }
+ j.Errorf(u.Obj, "%s %s is unused", typString(u.Obj), name)
+ }
+}
+
+type graph struct {
+ roots []*graphNode
+ nodes map[interface{}]*graphNode
+}
+
+func (g *graph) markUsedBy(obj, usedBy interface{}) {
+ objNode := g.getNode(obj)
+ usedByNode := g.getNode(usedBy)
+ if objNode.obj == usedByNode.obj {
+ return
+ }
+ usedByNode.uses[objNode] = struct{}{}
+}
+
+var labelCounter = 1
+
+func (g *graph) getNode(obj interface{}) *graphNode {
+ for {
+ if pt, ok := obj.(*types.Pointer); ok {
+ obj = pt.Elem()
+ } else {
+ break
+ }
+ }
+ _, ok := g.nodes[obj]
+ if !ok {
+ g.addObj(obj)
+ }
+
+ return g.nodes[obj]
+}
+
+func (g *graph) addObj(obj interface{}) {
+ if pt, ok := obj.(*types.Pointer); ok {
+ obj = pt.Elem()
+ }
+ node := &graphNode{obj: obj, uses: make(map[*graphNode]struct{}), n: labelCounter}
+ g.nodes[obj] = node
+ labelCounter++
+
+ if obj, ok := obj.(*types.Struct); ok {
+ n := obj.NumFields()
+ for i := 0; i < n; i++ {
+ field := obj.Field(i)
+ g.markUsedBy(obj, field)
+ }
+ }
+}
+
+type graphNode struct {
+ obj interface{}
+ uses map[*graphNode]struct{}
+ used bool
+ quiet bool
+ n int
+}
+
+type CheckMode int
+
+const (
+ CheckConstants CheckMode = 1 << iota
+ CheckFields
+ CheckFunctions
+ CheckTypes
+ CheckVariables
+
+ CheckAll = CheckConstants | CheckFields | CheckFunctions | CheckTypes | CheckVariables
+)
+
+type Unused struct {
+ Obj types.Object
+ Position token.Position
+}
+
+type Checker struct {
+ Mode CheckMode
+ WholeProgram bool
+ ConsiderReflection bool
+ Debug io.Writer
+
+ graph *graph
+
+ msCache typeutil.MethodSetCache
+ prog *lint.Program
+ topmostCache map[*types.Scope]*types.Scope
+ interfaces []*types.Interface
+}
+
+func NewChecker(mode CheckMode) *Checker {
+ return &Checker{
+ Mode: mode,
+ graph: &graph{
+ nodes: make(map[interface{}]*graphNode),
+ },
+ topmostCache: make(map[*types.Scope]*types.Scope),
+ }
+}
+
+func (c *Checker) checkConstants() bool { return (c.Mode & CheckConstants) > 0 }
+func (c *Checker) checkFields() bool { return (c.Mode & CheckFields) > 0 }
+func (c *Checker) checkFunctions() bool { return (c.Mode & CheckFunctions) > 0 }
+func (c *Checker) checkTypes() bool { return (c.Mode & CheckTypes) > 0 }
+func (c *Checker) checkVariables() bool { return (c.Mode & CheckVariables) > 0 }
+
+func (c *Checker) markFields(typ types.Type) {
+ structType, ok := typ.Underlying().(*types.Struct)
+ if !ok {
+ return
+ }
+ n := structType.NumFields()
+ for i := 0; i < n; i++ {
+ field := structType.Field(i)
+ c.graph.markUsedBy(field, typ)
+ }
+}
+
+type Error struct {
+ Errors map[string][]error
+}
+
+func (e Error) Error() string {
+ return fmt.Sprintf("errors in %d packages", len(e.Errors))
+}
+
+func (c *Checker) Check(prog *lint.Program) []Unused {
+ var unused []Unused
+ c.prog = prog
+ if c.WholeProgram {
+ c.findExportedInterfaces()
+ }
+ for _, pkg := range prog.InitialPackages {
+ c.processDefs(pkg)
+ c.processUses(pkg)
+ c.processTypes(pkg)
+ c.processSelections(pkg)
+ c.processAST(pkg)
+ }
+
+ for _, node := range c.graph.nodes {
+ obj, ok := node.obj.(types.Object)
+ if !ok {
+ continue
+ }
+ typNode, ok := c.graph.nodes[obj.Type()]
+ if !ok {
+ continue
+ }
+ node.uses[typNode] = struct{}{}
+ }
+
+ roots := map[*graphNode]struct{}{}
+ for _, root := range c.graph.roots {
+ roots[root] = struct{}{}
+ }
+ markNodesUsed(roots)
+ c.markNodesQuiet()
+ c.deduplicate()
+
+ if c.Debug != nil {
+ c.printDebugGraph(c.Debug)
+ }
+
+ for _, node := range c.graph.nodes {
+ if node.used || node.quiet {
+ continue
+ }
+ obj, ok := node.obj.(types.Object)
+ if !ok {
+ continue
+ }
+ found := false
+ if !false {
+ for _, pkg := range prog.InitialPackages {
+ if pkg.Types == obj.Pkg() {
+ found = true
+ break
+ }
+ }
+ }
+ if !found {
+ continue
+ }
+
+ pos := c.prog.Fset().Position(obj.Pos())
+ if pos.Filename == "" || filepath.Base(pos.Filename) == "C" {
+ continue
+ }
+
+ unused = append(unused, Unused{Obj: obj, Position: pos})
+ }
+ return unused
+}
+
+// isNoCopyType reports whether a type represents the NoCopy sentinel
+// type. The NoCopy type is a named struct with no fields and exactly
+// one method `func Lock()` that is empty.
+//
+// FIXME(dh): currently we're not checking that the function body is
+// empty.
+func isNoCopyType(typ types.Type) bool {
+ st, ok := typ.Underlying().(*types.Struct)
+ if !ok {
+ return false
+ }
+ if st.NumFields() != 0 {
+ return false
+ }
+
+ named, ok := typ.(*types.Named)
+ if !ok {
+ return false
+ }
+ if named.NumMethods() != 1 {
+ return false
+ }
+ meth := named.Method(0)
+ if meth.Name() != "Lock" {
+ return false
+ }
+ sig := meth.Type().(*types.Signature)
+ if sig.Params().Len() != 0 || sig.Results().Len() != 0 {
+ return false
+ }
+ return true
+}
+
+func (c *Checker) useNoCopyFields(typ types.Type) {
+ if st, ok := typ.Underlying().(*types.Struct); ok {
+ n := st.NumFields()
+ for i := 0; i < n; i++ {
+ field := st.Field(i)
+ if isNoCopyType(field.Type()) {
+ c.graph.markUsedBy(field, typ)
+ c.graph.markUsedBy(field.Type().(*types.Named).Method(0), field.Type())
+ }
+ }
+ }
+}
+
+func (c *Checker) useExportedFields(typ types.Type, by types.Type) bool {
+ any := false
+ if st, ok := typ.Underlying().(*types.Struct); ok {
+ n := st.NumFields()
+ for i := 0; i < n; i++ {
+ field := st.Field(i)
+ if field.Anonymous() {
+ if c.useExportedFields(field.Type(), typ) {
+ c.graph.markUsedBy(field, typ)
+ }
+ }
+ if field.Exported() {
+ c.graph.markUsedBy(field, by)
+ any = true
+ }
+ }
+ }
+ return any
+}
+
+func (c *Checker) useExportedMethods(typ types.Type) {
+ named, ok := typ.(*types.Named)
+ if !ok {
+ return
+ }
+ ms := typeutil.IntuitiveMethodSet(named, &c.msCache)
+ for i := 0; i < len(ms); i++ {
+ meth := ms[i].Obj()
+ if meth.Exported() {
+ c.graph.markUsedBy(meth, typ)
+ }
+ }
+
+ st, ok := named.Underlying().(*types.Struct)
+ if !ok {
+ return
+ }
+ n := st.NumFields()
+ for i := 0; i < n; i++ {
+ field := st.Field(i)
+ if !field.Anonymous() {
+ continue
+ }
+ ms := typeutil.IntuitiveMethodSet(field.Type(), &c.msCache)
+ for j := 0; j < len(ms); j++ {
+ if ms[j].Obj().Exported() {
+ c.graph.markUsedBy(field, typ)
+ break
+ }
+ }
+ }
+}
+
+func (c *Checker) processDefs(pkg *lint.Pkg) {
+ for _, obj := range pkg.TypesInfo.Defs {
+ if obj == nil {
+ continue
+ }
+ c.graph.getNode(obj)
+
+ if obj, ok := obj.(*types.TypeName); ok {
+ c.graph.markUsedBy(obj.Type().Underlying(), obj.Type())
+ c.graph.markUsedBy(obj.Type(), obj) // TODO is this needed?
+ c.graph.markUsedBy(obj, obj.Type())
+
+ // We mark all exported fields as used. For normal
+ // operation, we have to. The user may use these fields
+ // without us knowing.
+ //
+ // TODO(dh): In whole-program mode, however, we mark them
+ // as used because of reflection (such as JSON
+ // marshaling). Strictly speaking, we would only need to
+ // mark them used if an instance of the type was
+ // accessible via an interface value.
+ if !c.WholeProgram || c.ConsiderReflection {
+ c.useExportedFields(obj.Type(), obj.Type())
+ }
+
+ // TODO(dh): Traditionally we have not marked all exported
+ // methods as exported, even though they're strictly
+ // speaking accessible through reflection. We've done that
+ // because using methods just via reflection is rare, and
+ // not worth the false negatives. With the new -reflect
+ // flag, however, we should reconsider that choice.
+ if !c.WholeProgram {
+ c.useExportedMethods(obj.Type())
+ }
+ }
+
+ switch obj := obj.(type) {
+ case *types.Var, *types.Const, *types.Func, *types.TypeName:
+ if obj.Exported() {
+ // Exported variables and constants use their types,
+ // even if there's no expression using them in the
+ // checked program.
+ //
+ // Also operates on funcs and type names, but that's
+ // irrelevant/redundant.
+ c.graph.markUsedBy(obj.Type(), obj)
+ }
+ if obj.Name() == "_" {
+ node := c.graph.getNode(obj)
+ node.quiet = true
+ scope := c.topmostScope(pkg.Types.Scope().Innermost(obj.Pos()), pkg.Types)
+ if scope == pkg.Types.Scope() {
+ c.graph.roots = append(c.graph.roots, node)
+ } else {
+ c.graph.markUsedBy(obj, scope)
+ }
+ } else {
+ // Variables declared in functions are used. This is
+ // done so that arguments and return parameters are
+ // always marked as used.
+ if _, ok := obj.(*types.Var); ok {
+ if obj.Parent() != obj.Pkg().Scope() && obj.Parent() != nil {
+ c.graph.markUsedBy(obj, c.topmostScope(obj.Parent(), obj.Pkg()))
+ c.graph.markUsedBy(obj.Type(), obj)
+ }
+ }
+ }
+ }
+
+ if fn, ok := obj.(*types.Func); ok {
+ // A function uses its signature
+ c.graph.markUsedBy(fn, fn.Type())
+
+ // A function uses its return types
+ sig := fn.Type().(*types.Signature)
+ res := sig.Results()
+ n := res.Len()
+ for i := 0; i < n; i++ {
+ c.graph.markUsedBy(res.At(i).Type(), fn)
+ }
+ }
+
+ if obj, ok := obj.(interface {
+ Scope() *types.Scope
+ Pkg() *types.Package
+ }); ok {
+ scope := obj.Scope()
+ c.graph.markUsedBy(c.topmostScope(scope, obj.Pkg()), obj)
+ }
+
+ if c.isRoot(obj) {
+ node := c.graph.getNode(obj)
+ c.graph.roots = append(c.graph.roots, node)
+ if obj, ok := obj.(*types.PkgName); ok {
+ scope := obj.Pkg().Scope()
+ c.graph.markUsedBy(scope, obj)
+ }
+ }
+ }
+}
+
+func (c *Checker) processUses(pkg *lint.Pkg) {
+ for ident, usedObj := range pkg.TypesInfo.Uses {
+ if _, ok := usedObj.(*types.PkgName); ok {
+ continue
+ }
+ pos := ident.Pos()
+ scope := pkg.Types.Scope().Innermost(pos)
+ scope = c.topmostScope(scope, pkg.Types)
+ if scope != pkg.Types.Scope() {
+ c.graph.markUsedBy(usedObj, scope)
+ }
+
+ switch usedObj.(type) {
+ case *types.Var, *types.Const:
+ c.graph.markUsedBy(usedObj.Type(), usedObj)
+ }
+ }
+}
+
+func (c *Checker) findExportedInterfaces() {
+ c.interfaces = []*types.Interface{types.Universe.Lookup("error").Type().(*types.Named).Underlying().(*types.Interface)}
+ var pkgs []*packages.Package
+ if c.WholeProgram {
+ pkgs = append(pkgs, c.prog.AllPackages...)
+ } else {
+ for _, pkg := range c.prog.InitialPackages {
+ pkgs = append(pkgs, pkg.Package)
+ }
+ }
+
+ for _, pkg := range pkgs {
+ for _, tv := range pkg.TypesInfo.Types {
+ iface, ok := tv.Type.(*types.Interface)
+ if !ok {
+ continue
+ }
+ if iface.NumMethods() == 0 {
+ continue
+ }
+ c.interfaces = append(c.interfaces, iface)
+ }
+ }
+}
+
+func (c *Checker) processTypes(pkg *lint.Pkg) {
+ named := map[*types.Named]*types.Pointer{}
+ var interfaces []*types.Interface
+ for _, tv := range pkg.TypesInfo.Types {
+ if typ, ok := tv.Type.(interface {
+ Elem() types.Type
+ }); ok {
+ c.graph.markUsedBy(typ.Elem(), typ)
+ }
+
+ switch obj := tv.Type.(type) {
+ case *types.Named:
+ named[obj] = types.NewPointer(obj)
+ c.graph.markUsedBy(obj, obj.Underlying())
+ c.graph.markUsedBy(obj.Underlying(), obj)
+ case *types.Interface:
+ if obj.NumMethods() > 0 {
+ interfaces = append(interfaces, obj)
+ }
+ case *types.Struct:
+ c.useNoCopyFields(obj)
+ if pkg.Types.Name() != "main" && !c.WholeProgram {
+ c.useExportedFields(obj, obj)
+ }
+ }
+ }
+
+ // Pretend that all types are meant to implement as many
+ // interfaces as possible.
+ //
+ // TODO(dh): For normal operations, that's the best we can do, as
+ // we have no idea what external users will do with our types. In
+ // whole-program mode, we could be more precise, in two ways:
+ // 1) Only consider interfaces if a type has been assigned to one
+ // 2) Use SSA and flow analysis and determine the exact set of
+ // interfaces that is relevant.
+ fn := func(iface *types.Interface) {
+ for i := 0; i < iface.NumEmbeddeds(); i++ {
+ c.graph.markUsedBy(iface.Embedded(i), iface)
+ }
+ for obj, objPtr := range named {
+ if !types.Implements(obj, iface) && !types.Implements(objPtr, iface) {
+ continue
+ }
+ ifaceMethods := make(map[string]struct{}, iface.NumMethods())
+ n := iface.NumMethods()
+ for i := 0; i < n; i++ {
+ meth := iface.Method(i)
+ ifaceMethods[meth.Name()] = struct{}{}
+ }
+ for _, obj := range []types.Type{obj, objPtr} {
+ ms := c.msCache.MethodSet(obj)
+ n := ms.Len()
+ for i := 0; i < n; i++ {
+ sel := ms.At(i)
+ meth := sel.Obj().(*types.Func)
+ _, found := ifaceMethods[meth.Name()]
+ if !found {
+ continue
+ }
+ c.graph.markUsedBy(meth.Type().(*types.Signature).Recv().Type(), obj) // embedded receiver
+ if len(sel.Index()) > 1 {
+ f := getField(obj, sel.Index()[0])
+ c.graph.markUsedBy(f, obj) // embedded receiver
+ }
+ c.graph.markUsedBy(meth, obj)
+ }
+ }
+ }
+ }
+
+ for _, iface := range interfaces {
+ fn(iface)
+ }
+ for _, iface := range c.interfaces {
+ fn(iface)
+ }
+}
+
+func (c *Checker) processSelections(pkg *lint.Pkg) {
+ fn := func(expr *ast.SelectorExpr, sel *types.Selection, offset int) {
+ scope := pkg.Types.Scope().Innermost(expr.Pos())
+ c.graph.markUsedBy(expr.X, c.topmostScope(scope, pkg.Types))
+ c.graph.markUsedBy(sel.Obj(), expr.X)
+ if len(sel.Index()) > 1 {
+ typ := sel.Recv()
+ indices := sel.Index()
+ for _, idx := range indices[:len(indices)-offset] {
+ obj := getField(typ, idx)
+ typ = obj.Type()
+ c.graph.markUsedBy(obj, expr.X)
+ }
+ }
+ }
+
+ for expr, sel := range pkg.TypesInfo.Selections {
+ switch sel.Kind() {
+ case types.FieldVal:
+ fn(expr, sel, 0)
+ case types.MethodVal:
+ fn(expr, sel, 1)
+ }
+ }
+}
+
+func dereferenceType(typ types.Type) types.Type {
+ if typ, ok := typ.(*types.Pointer); ok {
+ return typ.Elem()
+ }
+ return typ
+}
+
+// processConversion marks fields as used if they're part of a type conversion.
+func (c *Checker) processConversion(pkg *lint.Pkg, node ast.Node) {
+ if node, ok := node.(*ast.CallExpr); ok {
+ callTyp := pkg.TypesInfo.TypeOf(node.Fun)
+ var typDst *types.Struct
+ var ok bool
+ switch typ := callTyp.(type) {
+ case *types.Named:
+ typDst, ok = typ.Underlying().(*types.Struct)
+ case *types.Pointer:
+ typDst, ok = typ.Elem().Underlying().(*types.Struct)
+ default:
+ return
+ }
+ if !ok {
+ return
+ }
+
+ if typ, ok := pkg.TypesInfo.TypeOf(node.Args[0]).(*types.Basic); ok && typ.Kind() == types.UnsafePointer {
+ // This is an unsafe conversion. Assume that all the
+ // fields are relevant (they are, because of memory
+ // layout)
+ n := typDst.NumFields()
+ for i := 0; i < n; i++ {
+ c.graph.markUsedBy(typDst.Field(i), typDst)
+ }
+ return
+ }
+
+ typSrc, ok := dereferenceType(pkg.TypesInfo.TypeOf(node.Args[0])).Underlying().(*types.Struct)
+ if !ok {
+ return
+ }
+
+ // When we convert from type t1 to t2, were t1 and t2 are
+ // structs, all fields are relevant, as otherwise the
+ // conversion would fail.
+ //
+ // We mark t2's fields as used by t1's fields, and vice
+ // versa. That way, if no code actually refers to a field
+ // in either type, it's still correctly marked as unused.
+ // If a field is used in either struct, it's implicitly
+ // relevant in the other one, too.
+ //
+ // It works in a similar way for conversions between types
+ // of two packages, only that the extra information in the
+ // graph is redundant unless we're in whole program mode.
+ n := typDst.NumFields()
+ for i := 0; i < n; i++ {
+ fDst := typDst.Field(i)
+ fSrc := typSrc.Field(i)
+ c.graph.markUsedBy(fDst, fSrc)
+ c.graph.markUsedBy(fSrc, fDst)
+ }
+ }
+}
+
+// processCompositeLiteral marks fields as used if the struct is used
+// in a composite literal.
+func (c *Checker) processCompositeLiteral(pkg *lint.Pkg, node ast.Node) {
+ // XXX how does this actually work? wouldn't it match t{}?
+ if node, ok := node.(*ast.CompositeLit); ok {
+ typ := pkg.TypesInfo.TypeOf(node)
+ if _, ok := typ.(*types.Named); ok {
+ typ = typ.Underlying()
+ }
+ if _, ok := typ.(*types.Struct); !ok {
+ return
+ }
+
+ if isBasicStruct(node.Elts) {
+ c.markFields(typ)
+ }
+ }
+}
+
+// processCgoExported marks functions as used if they're being
+// exported to cgo.
+func (c *Checker) processCgoExported(pkg *lint.Pkg, node ast.Node) {
+ if node, ok := node.(*ast.FuncDecl); ok {
+ if node.Doc == nil {
+ return
+ }
+ for _, cmt := range node.Doc.List {
+ if !strings.HasPrefix(cmt.Text, "//go:cgo_export_") {
+ return
+ }
+ obj := pkg.TypesInfo.ObjectOf(node.Name)
+ c.graph.roots = append(c.graph.roots, c.graph.getNode(obj))
+ }
+ }
+}
+
+func (c *Checker) processVariableDeclaration(pkg *lint.Pkg, node ast.Node) {
+ if decl, ok := node.(*ast.GenDecl); ok {
+ for _, spec := range decl.Specs {
+ spec, ok := spec.(*ast.ValueSpec)
+ if !ok {
+ continue
+ }
+ for i, name := range spec.Names {
+ if i >= len(spec.Values) {
+ break
+ }
+ value := spec.Values[i]
+ fn := func(node ast.Node) bool {
+ if node3, ok := node.(*ast.Ident); ok {
+ obj := pkg.TypesInfo.ObjectOf(node3)
+ if _, ok := obj.(*types.PkgName); ok {
+ return true
+ }
+ c.graph.markUsedBy(obj, pkg.TypesInfo.ObjectOf(name))
+ }
+ return true
+ }
+ ast.Inspect(value, fn)
+ }
+ }
+ }
+}
+
+func (c *Checker) processArrayConstants(pkg *lint.Pkg, node ast.Node) {
+ if decl, ok := node.(*ast.ArrayType); ok {
+ ident, ok := decl.Len.(*ast.Ident)
+ if !ok {
+ return
+ }
+ c.graph.markUsedBy(pkg.TypesInfo.ObjectOf(ident), pkg.TypesInfo.TypeOf(decl))
+ }
+}
+
+func (c *Checker) processKnownReflectMethodCallers(pkg *lint.Pkg, node ast.Node) {
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return
+ }
+ if !IsType(pkg.TypesInfo.TypeOf(sel.X), "*net/rpc.Server") {
+ x, ok := sel.X.(*ast.Ident)
+ if !ok {
+ return
+ }
+ pkgname, ok := pkg.TypesInfo.ObjectOf(x).(*types.PkgName)
+ if !ok {
+ return
+ }
+ if pkgname.Imported().Path() != "net/rpc" {
+ return
+ }
+ }
+
+ var arg ast.Expr
+ switch sel.Sel.Name {
+ case "Register":
+ if len(call.Args) != 1 {
+ return
+ }
+ arg = call.Args[0]
+ case "RegisterName":
+ if len(call.Args) != 2 {
+ return
+ }
+ arg = call.Args[1]
+ }
+ typ := pkg.TypesInfo.TypeOf(arg)
+ ms := types.NewMethodSet(typ)
+ for i := 0; i < ms.Len(); i++ {
+ c.graph.markUsedBy(ms.At(i).Obj(), typ)
+ }
+}
+
+func (c *Checker) processAST(pkg *lint.Pkg) {
+ fn := func(node ast.Node) bool {
+ c.processConversion(pkg, node)
+ c.processKnownReflectMethodCallers(pkg, node)
+ c.processCompositeLiteral(pkg, node)
+ c.processCgoExported(pkg, node)
+ c.processVariableDeclaration(pkg, node)
+ c.processArrayConstants(pkg, node)
+ return true
+ }
+ for _, file := range pkg.Syntax {
+ ast.Inspect(file, fn)
+ }
+}
+
+func isBasicStruct(elts []ast.Expr) bool {
+ for _, elt := range elts {
+ if _, ok := elt.(*ast.KeyValueExpr); !ok {
+ return true
+ }
+ }
+ return false
+}
+
+func isPkgScope(obj types.Object) bool {
+ return obj.Parent() == obj.Pkg().Scope()
+}
+
+func isMain(obj types.Object) bool {
+ if obj.Pkg().Name() != "main" {
+ return false
+ }
+ if obj.Name() != "main" {
+ return false
+ }
+ if !isPkgScope(obj) {
+ return false
+ }
+ if !isFunction(obj) {
+ return false
+ }
+ if isMethod(obj) {
+ return false
+ }
+ return true
+}
+
+func isFunction(obj types.Object) bool {
+ _, ok := obj.(*types.Func)
+ return ok
+}
+
+func isMethod(obj types.Object) bool {
+ if !isFunction(obj) {
+ return false
+ }
+ return obj.(*types.Func).Type().(*types.Signature).Recv() != nil
+}
+
+func isVariable(obj types.Object) bool {
+ _, ok := obj.(*types.Var)
+ return ok
+}
+
+func isConstant(obj types.Object) bool {
+ _, ok := obj.(*types.Const)
+ return ok
+}
+
+func isType(obj types.Object) bool {
+ _, ok := obj.(*types.TypeName)
+ return ok
+}
+
+func isField(obj types.Object) bool {
+ if obj, ok := obj.(*types.Var); ok && obj.IsField() {
+ return true
+ }
+ return false
+}
+
+func (c *Checker) checkFlags(v interface{}) bool {
+ obj, ok := v.(types.Object)
+ if !ok {
+ return false
+ }
+ if isFunction(obj) && !c.checkFunctions() {
+ return false
+ }
+ if isVariable(obj) && !c.checkVariables() {
+ return false
+ }
+ if isConstant(obj) && !c.checkConstants() {
+ return false
+ }
+ if isType(obj) && !c.checkTypes() {
+ return false
+ }
+ if isField(obj) && !c.checkFields() {
+ return false
+ }
+ return true
+}
+
+func (c *Checker) isRoot(obj types.Object) bool {
+ // - in local mode, main, init, tests, and non-test, non-main exported are roots
+ // - in global mode (not yet implemented), main, init and tests are roots
+
+ if _, ok := obj.(*types.PkgName); ok {
+ return true
+ }
+
+ if isMain(obj) || (isFunction(obj) && !isMethod(obj) && obj.Name() == "init") {
+ return true
+ }
+ if obj.Exported() {
+ f := c.prog.Fset().Position(obj.Pos()).Filename
+ if strings.HasSuffix(f, "_test.go") {
+ return strings.HasPrefix(obj.Name(), "Test") ||
+ strings.HasPrefix(obj.Name(), "Benchmark") ||
+ strings.HasPrefix(obj.Name(), "Example")
+ }
+
+ // Package-level are used, except in package main
+ if isPkgScope(obj) && obj.Pkg().Name() != "main" && !c.WholeProgram {
+ return true
+ }
+ }
+ return false
+}
+
+func markNodesUsed(nodes map[*graphNode]struct{}) {
+ for node := range nodes {
+ wasUsed := node.used
+ node.used = true
+ if !wasUsed {
+ markNodesUsed(node.uses)
+ }
+ }
+}
+
+// deduplicate merges objects based on their positions. This is done
+// to work around packages existing multiple times in go/packages.
+func (c *Checker) deduplicate() {
+ m := map[token.Position]struct{ used, quiet bool }{}
+ for _, node := range c.graph.nodes {
+ obj, ok := node.obj.(types.Object)
+ if !ok {
+ continue
+ }
+ pos := c.prog.Fset().Position(obj.Pos())
+ m[pos] = struct{ used, quiet bool }{
+ m[pos].used || node.used,
+ m[pos].quiet || node.quiet,
+ }
+ }
+
+ for _, node := range c.graph.nodes {
+ obj, ok := node.obj.(types.Object)
+ if !ok {
+ continue
+ }
+ pos := c.prog.Fset().Position(obj.Pos())
+ node.used = m[pos].used
+ node.quiet = m[pos].quiet
+ }
+}
+
+func (c *Checker) markNodesQuiet() {
+ for _, node := range c.graph.nodes {
+ if node.used {
+ continue
+ }
+ if obj, ok := node.obj.(types.Object); ok && !c.checkFlags(obj) {
+ node.quiet = true
+ continue
+ }
+ c.markObjQuiet(node.obj)
+ }
+}
+
+func (c *Checker) markObjQuiet(obj interface{}) {
+ switch obj := obj.(type) {
+ case *types.Named:
+ n := obj.NumMethods()
+ for i := 0; i < n; i++ {
+ meth := obj.Method(i)
+ node := c.graph.getNode(meth)
+ node.quiet = true
+ c.markObjQuiet(meth.Scope())
+ }
+ case *types.Struct:
+ n := obj.NumFields()
+ for i := 0; i < n; i++ {
+ field := obj.Field(i)
+ c.graph.nodes[field].quiet = true
+ }
+ case *types.Func:
+ c.markObjQuiet(obj.Scope())
+ case *types.Scope:
+ if obj == nil {
+ return
+ }
+ if obj.Parent() == types.Universe {
+ return
+ }
+ for _, name := range obj.Names() {
+ v := obj.Lookup(name)
+ if n, ok := c.graph.nodes[v]; ok {
+ n.quiet = true
+ }
+ }
+ n := obj.NumChildren()
+ for i := 0; i < n; i++ {
+ c.markObjQuiet(obj.Child(i))
+ }
+ }
+}
+
+func getField(typ types.Type, idx int) *types.Var {
+ switch obj := typ.(type) {
+ case *types.Pointer:
+ return getField(obj.Elem(), idx)
+ case *types.Named:
+ switch v := obj.Underlying().(type) {
+ case *types.Struct:
+ return v.Field(idx)
+ case *types.Pointer:
+ return getField(v.Elem(), idx)
+ default:
+ panic(fmt.Sprintf("unexpected type %s", typ))
+ }
+ case *types.Struct:
+ return obj.Field(idx)
+ }
+ return nil
+}
+
+func (c *Checker) topmostScope(scope *types.Scope, pkg *types.Package) (ret *types.Scope) {
+ if top, ok := c.topmostCache[scope]; ok {
+ return top
+ }
+ defer func() {
+ c.topmostCache[scope] = ret
+ }()
+ if scope == pkg.Scope() {
+ return scope
+ }
+ if scope.Parent().Parent() == pkg.Scope() {
+ return scope
+ }
+ return c.topmostScope(scope.Parent(), pkg)
+}
+
+func (c *Checker) printDebugGraph(w io.Writer) {
+ fmt.Fprintln(w, "digraph {")
+ fmt.Fprintln(w, "n0 [label = roots]")
+ for _, node := range c.graph.nodes {
+ s := fmt.Sprintf("%s (%T)", node.obj, node.obj)
+ s = strings.Replace(s, "\n", "", -1)
+ s = strings.Replace(s, `"`, "", -1)
+ fmt.Fprintf(w, `n%d [label = %q]`, node.n, s)
+ color := "black"
+ switch {
+ case node.used:
+ color = "green"
+ case node.quiet:
+ color = "orange"
+ case !c.checkFlags(node.obj):
+ color = "purple"
+ default:
+ color = "red"
+ }
+ fmt.Fprintf(w, "[color = %s]", color)
+ fmt.Fprintln(w)
+ }
+
+ for _, node1 := range c.graph.nodes {
+ for node2 := range node1.uses {
+ fmt.Fprintf(w, "n%d -> n%d\n", node1.n, node2.n)
+ }
+ }
+ for _, root := range c.graph.roots {
+ fmt.Fprintf(w, "n0 -> n%d\n", root.n)
+ }
+ fmt.Fprintln(w, "}")
+}
diff --git a/vendor/github.com/golangci/go-tools/version/version.go b/vendor/github.com/golangci/go-tools/version/version.go
new file mode 100644
index 00000000000..232cf7e74f3
--- /dev/null
+++ b/vendor/github.com/golangci/go-tools/version/version.go
@@ -0,0 +1,17 @@
+package version
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+)
+
+const Version = "devel"
+
+func Print() {
+ if Version == "devel" {
+ fmt.Printf("%s (no version)\n", filepath.Base(os.Args[0]))
+ } else {
+ fmt.Printf("%s %s\n", filepath.Base(os.Args[0]), Version)
+ }
+}
diff --git a/vendor/github.com/golangci/goconst/LICENSE b/vendor/github.com/golangci/goconst/LICENSE
new file mode 100644
index 00000000000..e926495431e
--- /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 00000000000..04fc9b01525
--- /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
+
+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 00000000000..ab5f99a5073
--- /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 00000000000..a86421f6d69
--- /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 00000000000..1c09f1a06ac
--- /dev/null
+++ b/vendor/github.com/golangci/gocyclo/CONTRIBUTORS
@@ -0,0 +1,7 @@
+# Names should be added to this file like so:
+# Name
+
+# Please keep the list sorted.
+
+Frederik Zipp
+Harshavardhana
diff --git a/vendor/github.com/golangci/gocyclo/LICENSE b/vendor/github.com/golangci/gocyclo/LICENSE
new file mode 100644
index 00000000000..45f88d6cb34
--- /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 00000000000..a1f33310f28
--- /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 00000000000..6a66aea5eaf
--- /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 00000000000..da0c8581dde
--- /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 00000000000..a6b09fcd7e3
--- /dev/null
+++ b/vendor/github.com/golangci/gofmt/gofmt/gofmt.go
@@ -0,0 +1,323 @@
+// 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"
+)
+
+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
+)
+
+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() {
+ 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("", 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 with permissions perm,
+// with 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 00000000000..73741e0a9c8
--- /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 00000000000..2c75495a695
--- /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 00000000000..6a66aea5eaf
--- /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 00000000000..8878b700db7
--- /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 ""
+ 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 .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("", 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 00000000000..e9d013d5854
--- /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 00000000000..e72bfddabc1
--- /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.
+ 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.
+
+
+ Copyright (C)
+
+ 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 .
+
+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:
+
+ Copyright (C)
+ 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
+.
+
+ 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
+.
\ 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 00000000000..079fc85d556
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/main.go
@@ -0,0 +1,24 @@
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/golangci/golangci-lint/pkg/commands"
+)
+
+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(1)
+ }
+}
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 00000000000..16f7493c0ad
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/cmd/golangci-lint/mod_version.go
@@ -0,0 +1,18 @@
+// +build go1.12
+
+package main
+
+import (
+ "fmt"
+ "runtime/debug"
+)
+
+func init() {
+ if info, available := debug.ReadBuildInfo(); available {
+ if date == "" && info.Main.Version != "(devel)" {
+ 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/pkg/commands/config.go b/vendor/github.com/golangci/golangci-lint/pkg/commands/config.go
new file mode 100644
index 00000000000..537b36fb090
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/config.go
@@ -0,0 +1,58 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/spf13/viper"
+
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+
+ "github.com/spf13/cobra"
+)
+
+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) executePathCmd(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint config path")
+ }
+
+ usedConfigFile := viper.ConfigFileUsed()
+ if usedConfigFile == "" {
+ e.log.Warnf("No config file detected")
+ os.Exit(exitcodes.NoConfigFileDetected)
+ }
+
+ usedConfigFile, err := fsutils.ShortestRelPath(usedConfigFile, "")
+ if err != nil {
+ e.log.Warnf("Can't pretty print config file path: %s", err)
+ }
+
+ 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 00000000000..0075668e182
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/executor.go
@@ -0,0 +1,87 @@
+package commands
+
+import (
+ "github.com/spf13/cobra"
+ "github.com/spf13/pflag"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "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"
+)
+
+type Executor struct {
+ rootCmd *cobra.Command
+ runCmd *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
+}
+
+func NewExecutor(version, commit, date string) *Executor {
+ e := &Executor{
+ cfg: config.NewDefault(),
+ version: version,
+ commit: commit,
+ date: date,
+ DBManager: lintersdb.NewManager(),
+ }
+
+ 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)
+ }
+
+ // 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()
+
+ // 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)
+ }
+
+ 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())
+
+ 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.contextLoader = lint.NewContextLoader(e.cfg, e.log.Child("loader"), e.goenv)
+
+ return e
+}
+
+func (e *Executor) Execute() error {
+ return e.rootCmd.Execute()
+}
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 00000000000..39b2ef81f0f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/help.go
@@ -0,0 +1,79 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+ "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) {
+ 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.NeedsSSARepr, 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())
+ }
+ 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 00000000000..84452201945
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/linters.go
@@ -0,0 +1,57 @@
+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() {
+ lintersCmd := &cobra.Command{
+ Use: "linters",
+ Short: "List current linters configuration",
+ Run: e.executeLinters,
+ }
+ e.rootCmd.AddCommand(lintersCmd)
+ e.initRunConfiguration(lintersCmd)
+}
+
+func IsLinterInConfigsList(name string, linters []*linter.Config) bool {
+ for _, lc := range linters {
+ if lc.Name() == name {
+ return true
+ }
+ }
+
+ return false
+}
+
+func (e *Executor) executeLinters(_ *cobra.Command, args []string) {
+ if len(args) != 0 {
+ e.log.Fatalf("Usage: golangci-lint linters")
+ }
+
+ enabledLCs, err := e.EnabledLintersSet.Get(false)
+ if err != nil {
+ log.Fatalf("Can't get enabled linters: %s", err)
+ }
+
+ color.Green("Enabled by your configuration linters:\n")
+ printLinterConfigs(enabledLCs)
+
+ var disabledLCs []*linter.Config
+ for _, lc := range e.DBManager.GetAllSupportedLinterConfigs() {
+ if !IsLinterInConfigsList(lc.Name(), enabledLCs) {
+ 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 00000000000..f41e957de08
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/root.go
@@ -0,0 +1,106 @@
+package commands
+
+import (
+ "fmt"
+ "os"
+ "runtime"
+ "runtime/pprof"
+
+ "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)
+ }
+ }
+}
+
+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)
+ }
+ runtime.GC() // get up-to-date statistics
+ if err := pprof.WriteHeapProfile(f); err != nil {
+ e.log.Fatalf("Can't write heap profile: %s", err)
+ }
+ }
+
+ os.Exit(e.exitCode)
+}
+
+func getDefaultConcurrency() int {
+ if os.Getenv("HELP_RUN") == "1" {
+ return 8 // to make stable concurrency for README help generating builds
+ }
+
+ 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.IntVarP(&cfg.Run.Concurrency, "concurrency", "j", getDefaultConcurrency(), wh("Concurrency (default NumCPU)"))
+ if needVersionOption {
+ fs.BoolVar(&cfg.Run.PrintVersion, "version", false, wh("Print version"))
+ }
+}
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 00000000000..e262711ce0c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/commands/run.go
@@ -0,0 +1,463 @@
+package commands
+
+import (
+ "context"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+ "runtime"
+ "strings"
+ "time"
+
+ "github.com/golangci/golangci-lint/pkg/result/processors"
+
+ "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/printers"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+func getDefaultExcludeHelp() string {
+ parts := []string{"Use or not use default excludes:"}
+ for _, ep := range config.DefaultExcludePatterns {
+ parts = append(parts,
+ fmt.Sprintf(" # %s: %s", ep.Linter, ep.Why),
+ fmt.Sprintf(" - %s", color.YellowString(ep.Pattern)),
+ "",
+ )
+ }
+ 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)
+}
+
+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.PrintWelcomeMessage, "print-welcome", false, wh("Print welcome message"))
+ hideFlag("print-welcome") // no longer used
+
+ // Run config
+ rc := &cfg.Run
+ 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.Deadline, "deadline", time.Minute, wh("Deadline 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.StringSliceVar(&rc.SkipFiles, "skip-files", nil, wh("Regexps of files to skip"))
+
+ // 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"))
+ 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, getDefaultExcludeHelp())
+
+ 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,
+ }
+ 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) (<-chan result.Issue, error) {
+ e.cfg.Run.Args = args
+
+ enabledLinters, err := e.EnabledLintersSet.Get(true)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, lc := range e.DBManager.GetAllSupportedLinterConfigs() {
+ isEnabled := false
+ for _, enabledLC := range enabledLinters {
+ if enabledLC.Name() == lc.Name() {
+ isEnabled = true
+ break
+ }
+ }
+ e.reportData.AddLinter(lc.Name(), isEnabled, lc.EnabledByDefault)
+ }
+
+ lintCtx, err := e.contextLoader.Load(ctx, enabledLinters)
+ if err != nil {
+ return nil, errors.Wrap(err, "context loading failed")
+ }
+ lintCtx.Log = e.log.Child("linters context")
+
+ runner, err := lint.NewRunner(lintCtx.ASTCache, e.cfg, e.log.Child("runner"), e.goenv)
+ if err != nil {
+ return nil, err
+ }
+
+ issuesCh := runner.Run(ctx, enabledLinters, lintCtx)
+ fixer := processors.NewFixer(e.cfg, e.log)
+ return fixer.Process(issuesCh), 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 <-chan result.Issue) <-chan result.Issue {
+ resCh := make(chan result.Issue, 1024)
+
+ go func() {
+ issuesFound := false
+ for i := range issues {
+ issuesFound = true
+ resCh <- i
+ }
+
+ if issuesFound {
+ e.exitCode = e.cfg.Run.ExitCodeIfIssuesFound
+ }
+
+ close(resCh)
+ }()
+
+ return resCh
+}
+
+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
+ }
+
+ issues = e.setExitCodeIfIssuesFound(issues)
+
+ if err = p.Print(ctx, issues); err != nil {
+ return fmt.Errorf("can't print %d issues: %s", len(issues), err)
+ }
+
+ 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()
+ 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
+ }
+ }()
+
+ ctx, cancel := context.WithTimeout(context.Background(), e.cfg.Run.Deadline)
+ defer cancel()
+
+ if needTrackResources {
+ go watchResources(ctx, trackResourcesEndCh, e.log)
+ }
+
+ 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)
+}
+
+func (e *Executor) setupExitCode(ctx context.Context) {
+ if ctx.Err() != nil {
+ e.exitCode = exitcodes.Timeout
+ e.log.Errorf("Deadline exceeded: try increase it by passing --deadline option")
+ }
+
+ if e.exitCode == exitcodes.Success &&
+ (os.Getenv("GL_TEST_RUN") == "1" || os.Getenv("FAIL_ON_WARNINGS") == "1") &&
+ len(e.reportData.Warnings) != 0 {
+
+ e.exitCode = exitcodes.WarningInTest
+ }
+}
+
+func watchResources(ctx context.Context, done chan struct{}, logger logutils.Log) {
+ startedAt := time.Now()
+
+ var rssValues []uint64
+ ticker := time.NewTicker(100 * time.Millisecond)
+ defer ticker.Stop()
+
+ for {
+ var m runtime.MemStats
+ runtime.ReadMemStats(&m)
+
+ rssValues = append(rssValues, m.Sys)
+
+ stop := false
+ select {
+ case <-ctx.Done():
+ stop = true
+ case <-ticker.C: // track every second
+ }
+
+ if stop {
+ break
+ }
+ }
+
+ var avg, max uint64
+ for _, v := range rssValues {
+ avg += v
+ if v > max {
+ max = v
+ }
+ }
+ avg /= uint64(len(rssValues))
+
+ const MB = 1024 * 1024
+ maxMB := float64(max) / MB
+ logger.Infof("Memory: %d samples, avg is %.1fMB, max is %.1fMB",
+ len(rssValues), float64(avg)/MB, maxMB)
+ logger.Infof("Execution took %s", time.Since(startedAt))
+ close(done)
+}
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 00000000000..0b2dcdeb33a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/config.go
@@ -0,0 +1,307 @@
+package config
+
+import (
+ "errors"
+ "fmt"
+ "regexp"
+ "time"
+)
+
+const (
+ OutFormatJSON = "json"
+ OutFormatLineNumber = "line-number"
+ OutFormatColoredLineNumber = "colored-line-number"
+ OutFormatTab = "tab"
+ OutFormatCheckstyle = "checkstyle"
+ OutFormatCodeClimate = "code-climate"
+)
+
+var OutFormats = []string{
+ OutFormatColoredLineNumber,
+ OutFormatLineNumber,
+ OutFormatJSON,
+ OutFormatTab,
+ OutFormatCheckstyle,
+ OutFormatCodeClimate,
+}
+
+type ExcludePattern struct {
+ Pattern string
+ Linter string
+ Why string
+}
+
+var DefaultExcludePatterns = []ExcludePattern{
+ {
+ Pattern: "Error return value of .((os\\.)?std(out|err)\\..*|.*Close" +
+ "|.*Flush|os\\.Remove(All)?|.*printf?|os\\.(Un)?Setenv). is not checked",
+ Linter: "errcheck",
+ Why: "Almost all programs ignore errors on these functions and in most cases it's ok",
+ },
+ {
+ 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",
+ },
+ {
+ 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'",
+ },
+ {
+ Pattern: "(possible misuse of unsafe.Pointer|should have signature)",
+ Linter: "govet",
+ Why: "Common false positives",
+ },
+ {
+ 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",
+ },
+ {
+ Pattern: "Use of unsafe calls should be audited",
+ Linter: "gosec",
+ Why: "Too many false-positives on 'unsafe' usage",
+ },
+ {
+ Pattern: "Subprocess launch(ed with variable|ing should be audited)",
+ Linter: "gosec",
+ Why: "Too many false-positives for parametrized shell calls",
+ },
+ {
+ Pattern: "G104",
+ Linter: "gosec",
+ Why: "Duplicated errcheck checks",
+ },
+ {
+ 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",
+ },
+ {
+ Pattern: "Potential file inclusion via variable",
+ Linter: "gosec",
+ Why: "False positive is triggered by 'src, err := ioutil.ReadFile(filename)'",
+ },
+}
+
+func GetDefaultExcludePatternsStrings() []string {
+ var ret []string
+ for _, p := range DefaultExcludePatterns {
+ ret = append(ret, p.Pattern)
+ }
+
+ return ret
+}
+
+type Run struct {
+ IsVerbose bool `mapstructure:"verbose"`
+ Silent bool
+ CPUProfilePath string
+ MemProfilePath 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"`
+ Deadline time.Duration
+ PrintVersion bool
+
+ SkipFiles []string `mapstructure:"skip-files"`
+ SkipDirs []string `mapstructure:"skip-dirs"`
+}
+
+type LintersSettings struct {
+ Govet struct {
+ CheckShadowing bool `mapstructure:"check-shadowing"`
+ }
+ 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"`
+ }
+ Depguard struct {
+ ListType string `mapstructure:"list-type"`
+ Packages []string
+ IncludeGoRoot bool `mapstructure:"include-go-root"`
+ }
+ Misspell struct {
+ Locale string
+ IgnoreWords []string `mapstructure:"ignore-words"`
+ }
+ Unused struct {
+ CheckExported bool `mapstructure:"check-exported"`
+ }
+
+ Lll LllSettings
+ Unparam UnparamSettings
+ Nakedret NakedretSettings
+ Prealloc PreallocSettings
+ Errcheck ErrcheckSettings
+ Gocritic GocriticSettings
+}
+
+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"`
+}
+
+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{},
+ },
+}
+
+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
+}
+
+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)
+ }
+ nonBlank := 0
+ if len(e.Linters) > 0 {
+ nonBlank++
+ }
+ if e.Path != "" {
+ nonBlank++
+ }
+ if e.Text != "" {
+ nonBlank++
+ }
+ if nonBlank < 2 {
+ return errors.New("at least 2 of (text, path, linters) should be set")
+ }
+ return nil
+}
+
+type Issues struct {
+ 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 { //nolint:maligned
+ Run Run
+
+ Output struct {
+ Format string
+ PrintIssuedLine bool `mapstructure:"print-issued-lines"`
+ PrintLinterName bool `mapstructure:"print-linter-name"`
+ 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 00000000000..faf2a8bf4bb
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/config_gocritic.go
@@ -0,0 +1,305 @@
+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)
+var isGocriticDebug = logutils.HaveDebugTag(gocriticDebugKey)
+
+var allGocriticCheckers = lintpack.GetCheckersInfo()
+
+type GocriticCheckSettings map[string]interface{}
+
+type GocriticSettings struct {
+ EnabledChecks []string `mapstructure:"enabled-checks"`
+ DisabledChecks []string `mapstructure:"disabled-checks"`
+ EnabledTags []string `mapstructure:"enabled-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")
+ }
+}
+
+//nolint:gocyclo
+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
+ 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...)
+ }
+
+ 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)
+ }
+ }
+
+ 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 disabled by config, was it's not enabled, no need to disable it",
+ 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
+}
+
+//nolint:gocyclo
+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 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
+}
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 00000000000..df72632fa3c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/config/reader.go
@@ -0,0 +1,199 @@
+package config
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/spf13/viper"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+
+ homedir "github.com/mitchellh/go-homedir"
+)
+
+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.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)
+ }
+ }
+
+ 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 00000000000..82bd2cdc297
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/exitcodes/exitcodes.go
@@ -0,0 +1,27 @@
+package exitcodes
+
+const (
+ Success = 0
+ IssuesFound = 1
+ WarningInTest = 2
+ Failure = 3
+ Timeout = 4
+ NoGoFiles = 5
+ NoConfigFileDetected = 6
+)
+
+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,
+ }
+)
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 00000000000..fa5fda6a8c3
--- /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/golinters/deadcode.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go
new file mode 100644
index 00000000000..d6ab4f26e5d
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/deadcode.go
@@ -0,0 +1,42 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+
+ deadcodeAPI "github.com/golangci/go-misc/deadcode"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Deadcode struct{}
+
+func (Deadcode) Name() string {
+ return "deadcode"
+}
+
+func (Deadcode) Desc() string {
+ return "Finds unused code"
+}
+
+func (d Deadcode) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ issues, err := deadcodeAPI.Run(lintCtx.Program)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("%s is unused", formatCode(i.UnusedIdentName, lintCtx.Cfg)),
+ FromLinter: d.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..a00af5c9f1a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/depguard.go
@@ -0,0 +1,59 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "strings"
+
+ depguardAPI "github.com/OpenPeeDeeP/depguard"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Depguard struct{}
+
+func (Depguard) Name() string {
+ return "depguard"
+}
+
+func (Depguard) Desc() string {
+ return "Go linter that checks if package imports are in a list of acceptable packages"
+}
+
+func (d Depguard) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ dg := &depguardAPI.Depguard{
+ Packages: lintCtx.Settings().Depguard.Packages,
+ IncludeGoRoot: lintCtx.Settings().Depguard.IncludeGoRoot,
+ }
+ listType := lintCtx.Settings().Depguard.ListType
+ var found bool
+ dg.ListType, found = depguardAPI.StringToListType[strings.ToLower(listType)]
+ if !found {
+ if listType != "" {
+ return nil, fmt.Errorf("unsure what list type %s is", listType)
+ }
+ dg.ListType = depguardAPI.LTBlacklist
+ }
+
+ issues, err := dg.Run(lintCtx.LoaderConfig, lintCtx.Program)
+ if err != nil {
+ return nil, err
+ }
+ if len(issues) == 0 {
+ return nil, nil
+ }
+ msgSuffix := "is in the blacklist"
+ if dg.ListType == depguardAPI.LTWhitelist {
+ msgSuffix = "is not in the whitelist"
+ }
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, result.Issue{
+ Pos: i.Position,
+ Text: fmt.Sprintf("%s %s", formatCode(i.PackageName, lintCtx.Cfg), msgSuffix),
+ FromLinter: d.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..c31c87795ce
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/dupl.go
@@ -0,0 +1,60 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/token"
+
+ duplAPI "github.com/golangci/dupl"
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Dupl struct{}
+
+func (Dupl) Name() string {
+ return "dupl"
+}
+
+func (Dupl) Desc() string {
+ return "Tool for code clone detection"
+}
+
+func (d Dupl) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ issues, err := duplAPI.Run(getAllFileNames(lintCtx), lintCtx.Settings().Dupl.Threshold)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.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, 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: d.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..bd1d7c3ef73
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/errcheck.go
@@ -0,0 +1,204 @@
+package golinters
+
+import (
+ "bufio"
+ "context"
+ "fmt"
+ "os"
+ "os/user"
+ "path/filepath"
+ "regexp"
+ "strings"
+
+ errcheckAPI "github.com/golangci/errcheck/golangci"
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Errcheck struct{}
+
+func (Errcheck) Name() string {
+ return "errcheck"
+}
+
+func (Errcheck) Desc() string {
+ return "Errcheck is a program for checking for unchecked errors " +
+ "in go programs. These unchecked errors can be critical bugs in some cases"
+}
+
+func (e Errcheck) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ errCfg, err := genConfig(&lintCtx.Settings().Errcheck)
+ if err != nil {
+ return nil, err
+ }
+ issues, err := errcheckAPI.RunWithConfig(lintCtx.Program, errCfg)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ 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"
+ }
+ res = append(res, result.Issue{
+ FromLinter: e.Name(),
+ Text: text,
+ Pos: i.Pos,
+ })
+ }
+
+ return res, nil
+}
+
+// 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) (*errcheckAPI.Config, error) {
+ ignoreConfig, err := parseIgnoreConfig(errCfg.Ignore)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to parse 'ignore' directive")
+ }
+
+ c := &errcheckAPI.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/gochecknoglobals.go b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoglobals.go
new file mode 100644
index 00000000000..d2b66501b71
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoglobals.go
@@ -0,0 +1,77 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Gochecknoglobals struct{}
+
+func (Gochecknoglobals) Name() string {
+ return "gochecknoglobals"
+}
+
+func (Gochecknoglobals) Desc() string {
+ return "Checks that no globals are present in Go code"
+}
+
+func (lint Gochecknoglobals) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+ for _, f := range lintCtx.ASTCache.GetAllValidFiles() {
+ res = append(res, lint.checkFile(f.F, f.Fset)...)
+ }
+
+ return res, nil
+}
+
+func (lint Gochecknoglobals) checkFile(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: lint.Name(),
+ })
+ }
+ }
+ }
+
+ return res
+}
+
+func isWhitelisted(i *ast.Ident) bool {
+ return i.Name == "_" || 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 00000000000..6cd74decfd9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gochecknoinits.go
@@ -0,0 +1,51 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Gochecknoinits struct{}
+
+func (Gochecknoinits) Name() string {
+ return "gochecknoinits"
+}
+
+func (Gochecknoinits) Desc() string {
+ return "Checks that no init functions are present in Go code"
+}
+
+func (lint Gochecknoinits) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+ for _, f := range lintCtx.ASTCache.GetAllValidFiles() {
+ res = append(res, lint.checkFile(f.F, f.Fset)...)
+ }
+
+ return res, nil
+}
+
+func (lint Gochecknoinits) checkFile(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: lint.Name(),
+ })
+ }
+ }
+
+ return res
+}
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 00000000000..87011df9d27
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/goconst.go
@@ -0,0 +1,64 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+
+ goconstAPI "github.com/golangci/goconst"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Goconst struct{}
+
+func (Goconst) Name() string {
+ return "goconst"
+}
+
+func (Goconst) Desc() string {
+ return "Finds repeated strings that could be replaced by a constant"
+}
+
+func (lint Goconst) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var goconstIssues []goconstAPI.Issue
+ cfg := goconstAPI.Config{
+ MatchWithConstants: true,
+ MinStringLength: lintCtx.Settings().Goconst.MinStringLen,
+ MinOccurrences: lintCtx.Settings().Goconst.MinOccurrencesCount,
+ }
+ for _, pkg := range lintCtx.Packages {
+ files, fset, err := getASTFilesForGoPkg(lintCtx, pkg)
+ if err != nil {
+ return nil, err
+ }
+
+ issues, err := goconstAPI.Run(files, fset, &cfg)
+ if err != nil {
+ return nil, err
+ }
+
+ goconstIssues = append(goconstIssues, issues...)
+ }
+ if len(goconstIssues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.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, result.Issue{
+ Pos: i.Pos,
+ Text: textBegin + textEnd,
+ FromLinter: lint.Name(),
+ })
+ }
+
+ 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 00000000000..669c57b3ccc
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocritic.go
@@ -0,0 +1,169 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+ "go/types"
+ "path/filepath"
+ "runtime"
+ "runtime/debug"
+ "sort"
+ "strings"
+ "sync"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+
+ "github.com/go-lintpack/lintpack"
+ "golang.org/x/tools/go/loader"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Gocritic struct{}
+
+func (Gocritic) Name() string {
+ return "gocritic"
+}
+
+func (Gocritic) Desc() string {
+ return "The most opinionated Go source code linter"
+}
+
+func (Gocritic) 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 (lint Gocritic) 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 := lint.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 (lint Gocritic) 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 := lint.configureCheckerInfo(info, allParams); err != nil {
+ return nil, err
+ }
+
+ c := lintpack.NewChecker(lintpackCtx, info)
+ enabledCheckers = append(enabledCheckers, c)
+ }
+
+ return enabledCheckers, nil
+}
+
+func (lint Gocritic) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ sizes := types.SizesFor("gc", runtime.GOARCH)
+ lintpackCtx := lintpack.NewContext(lintCtx.Program.Fset, sizes)
+
+ enabledCheckers, err := lint.buildEnabledCheckers(lintCtx, lintpackCtx)
+ if err != nil {
+ return nil, err
+ }
+
+ issuesCh := make(chan result.Issue, 1024)
+ var panicErr error
+ go func() {
+ defer func() {
+ if err := recover(); err != nil {
+ panicErr = fmt.Errorf("panic occured: %s", err)
+ lintCtx.Log.Warnf("Panic: %s", debug.Stack())
+ }
+ }()
+
+ for _, pkgInfo := range lintCtx.Program.InitialPackages() {
+ lintpackCtx.SetPackageInfo(&pkgInfo.Info, pkgInfo.Pkg)
+ lint.runOnPackage(lintpackCtx, enabledCheckers, pkgInfo, issuesCh)
+ }
+ close(issuesCh)
+ }()
+
+ var res []result.Issue
+ for i := range issuesCh {
+ res = append(res, i)
+ }
+ if panicErr != nil {
+ return nil, panicErr
+ }
+
+ return res, nil
+}
+
+func (lint Gocritic) runOnPackage(lintpackCtx *lintpack.Context, checkers []*lintpack.Checker,
+ pkgInfo *loader.PackageInfo, ret chan<- result.Issue) {
+
+ for _, f := range pkgInfo.Files {
+ filename := filepath.Base(lintpackCtx.FileSet.Position(f.Pos()).Filename)
+ lintpackCtx.SetFileInfo(filename, f)
+
+ lint.runOnFile(lintpackCtx, f, checkers, ret)
+ }
+}
+
+func (lint Gocritic) runOnFile(ctx *lintpack.Context, f *ast.File, checkers []*lintpack.Checker,
+ ret chan<- result.Issue) {
+
+ var wg sync.WaitGroup
+ wg.Add(len(checkers))
+ for _, c := range checkers {
+ // All checkers are expected to use *lint.Context
+ // as read-only structure, so no copying is required.
+ go func(c *lintpack.Checker) {
+ defer wg.Done()
+
+ for _, warn := range c.Check(f) {
+ pos := ctx.FileSet.Position(warn.Node.Pos())
+ ret <- result.Issue{
+ Pos: pos,
+ Text: fmt.Sprintf("%s: %s", c.Info.Name, warn.Text),
+ FromLinter: lint.Name(),
+ }
+ }
+ }(c)
+ }
+
+ wg.Wait()
+}
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 00000000000..68811caf1ac
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gocyclo.go
@@ -0,0 +1,52 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "sort"
+
+ gocycloAPI "github.com/golangci/gocyclo/pkg/gocyclo"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Gocyclo struct{}
+
+func (Gocyclo) Name() string {
+ return "gocyclo"
+}
+
+func (Gocyclo) Desc() string {
+ return "Computes and checks the cyclomatic complexity of functions"
+}
+
+func (g Gocyclo) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var stats []gocycloAPI.Stat
+ for _, f := range lintCtx.ASTCache.GetAllValidFiles() {
+ stats = gocycloAPI.BuildStats(f.F, f.Fset, stats)
+ }
+ if len(stats) == 0 {
+ return nil, nil
+ }
+
+ sort.Slice(stats, func(i, j int) bool {
+ return stats[i].Complexity > stats[j].Complexity
+ })
+
+ res := make([]result.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, 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: g.Name(),
+ })
+ }
+
+ return res, nil
+}
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 00000000000..a2399cb9512
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gofmt.go
@@ -0,0 +1,313 @@
+package golinters
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "go/token"
+ "strings"
+
+ gofmtAPI "github.com/golangci/gofmt/gofmt"
+ goimportsAPI "github.com/golangci/gofmt/goimports"
+ "github.com/pkg/errors"
+ "golang.org/x/tools/imports"
+ diffpkg "sourcegraph.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 Gofmt struct {
+ UseGoimports bool
+}
+
+func (g Gofmt) Name() string {
+ if g.UseGoimports {
+ return "goimports"
+ }
+
+ return "gofmt"
+}
+
+func (g Gofmt) Desc() string {
+ if g.UseGoimports {
+ return "Goimports does everything that gofmt does. Additionally it checks unused imports"
+ }
+
+ return "Gofmt checks whether code was gofmt-ed. By default " +
+ "this tool runs with -s option to check for code simplification"
+}
+
+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)
+
+ //nolint:gocritic
+ 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 addings
+ 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 (g Gofmt) extractIssuesFromPatch(patch string, log logutils.Log) ([]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 {
+ text := "File is not `gofmt`-ed with `-s`"
+ if g.UseGoimports {
+ text = "File is not `goimports`-ed"
+ }
+ p := hunkChangesParser{
+ log: log,
+ }
+ changes := p.parse(hunk)
+ for _, change := range changes {
+ change := change // fix scope
+ i := result.Issue{
+ FromLinter: g.Name(),
+ 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
+}
+
+func (g Gofmt) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var issues []result.Issue
+
+ for _, f := range getAllFileNames(lintCtx) {
+ var diff []byte
+ var err error
+ if g.UseGoimports {
+ imports.LocalPrefix = lintCtx.Settings().Goimports.LocalPrefixes
+ diff, err = goimportsAPI.Run(f)
+ } else {
+ diff, err = gofmtAPI.Run(f, lintCtx.Settings().Gofmt.Simplify)
+ }
+ if err != nil { // TODO: skip
+ return nil, err
+ }
+ if diff == nil {
+ continue
+ }
+
+ is, err := g.extractIssuesFromPatch(string(diff), lintCtx.Log)
+ if err != nil {
+ return nil, fmt.Errorf("can't extract issues from gofmt diff output %q: %s", string(diff), err)
+ }
+
+ issues = append(issues, is...)
+ }
+
+ return issues, nil
+}
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 00000000000..de58d0a7a33
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/golint.go
@@ -0,0 +1,72 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ lintAPI "github.com/golangci/lint-1"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Golint struct{}
+
+func (Golint) Name() string {
+ return "golint"
+}
+
+func (Golint) Desc() string {
+ return "Golint differs from gofmt. Gofmt reformats Go source code, whereas golint prints out style mistakes"
+}
+
+func (g Golint) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var issues []result.Issue
+ var lintErr error
+ for _, pkg := range lintCtx.Packages {
+ files, fset, err := getASTFilesForGoPkg(lintCtx, pkg)
+ if err != nil {
+ return nil, err
+ }
+
+ i, err := g.lintPkg(lintCtx.Settings().Golint.MinConfidence, files, fset)
+ if err != nil {
+ lintErr = err
+ continue
+ }
+ issues = append(issues, i...)
+ }
+ if lintErr != nil {
+ lintCtx.Log.Warnf("Golint: %s", lintErr)
+ }
+
+ return issues, nil
+}
+
+func (g Golint) lintPkg(minConfidence float64, files []*ast.File, fset *token.FileSet) ([]result.Issue, error) {
+ l := new(lintAPI.Linter)
+ ps, err := l.LintASTFiles(files, fset)
+ 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: g.Name(),
+ })
+ // TODO: use p.Link and p.Category
+ }
+ }
+
+ return issues, nil
+}
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 00000000000..247988878be
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/gosec.go
@@ -0,0 +1,67 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/token"
+ "io/ioutil"
+ "log"
+ "strconv"
+
+ "github.com/golangci/gosec"
+ "github.com/golangci/gosec/rules"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Gosec struct{}
+
+func (Gosec) Name() string {
+ return "gosec"
+}
+
+func (Gosec) Desc() string {
+ return "Inspects source code for security problems"
+}
+
+func (lint Gosec) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ gasConfig := gosec.NewConfig()
+ enabledRules := rules.Generate()
+ logger := log.New(ioutil.Discard, "", 0)
+ analyzer := gosec.NewAnalyzer(gasConfig, logger)
+ analyzer.LoadRules(enabledRules.Builders())
+
+ analyzer.ProcessProgram(lintCtx.Program)
+ issues, _ := analyzer.Report()
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.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
+ }
+
+ res = append(res, result.Issue{
+ Pos: token.Position{
+ Filename: i.File,
+ Line: line,
+ },
+ Text: text,
+ LineRange: r,
+ FromLinter: lint.Name(),
+ })
+ }
+
+ return res, nil
+}
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 00000000000..b7b362661ea
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/govet.go
@@ -0,0 +1,70 @@
+package golinters
+
+import (
+ "context"
+ "go/ast"
+ "go/token"
+
+ govetAPI "github.com/golangci/govet"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Govet struct{}
+
+func (Govet) Name() string {
+ return "govet"
+}
+
+func (Govet) Desc() string {
+ return "Vet examines Go source code and reports suspicious constructs, " +
+ "such as Printf calls whose arguments do not align with the format string"
+}
+
+func (g Govet) Run(_ context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var govetIssues []govetAPI.Issue
+ var err error
+ govetIssues, err = g.runImpl(lintCtx)
+ if err != nil {
+ return nil, err
+ }
+
+ if len(govetIssues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(govetIssues))
+ for _, i := range govetIssues {
+ res = append(res, result.Issue{
+ Pos: i.Pos,
+ Text: i.Message,
+ FromLinter: g.Name(),
+ })
+ }
+ return res, nil
+}
+
+func (g Govet) runImpl(lintCtx *linter.Context) ([]govetAPI.Issue, error) {
+ // TODO: check .S asm files: govet can do it if pass dirs
+ var govetIssues []govetAPI.Issue
+ for _, pkg := range lintCtx.Program.InitialPackages() {
+ if len(pkg.Files) == 0 {
+ continue
+ }
+
+ issues, err := govetAPI.Analyze(pkg.Files, lintCtx.Program.Fset, pkg,
+ lintCtx.Settings().Govet.CheckShadowing, getPath)
+ if err != nil {
+ return nil, err
+ }
+ govetIssues = append(govetIssues, issues...)
+ }
+
+ return govetIssues, nil
+}
+
+func getPath(f *ast.File, fset *token.FileSet) (string, error) {
+ return fsutils.ShortestRelPath(fset.Position(f.Pos()).Filename, "")
+}
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 00000000000..b5d047b68a9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/ineffassign.go
@@ -0,0 +1,38 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+
+ ineffassignAPI "github.com/golangci/ineffassign"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Ineffassign struct{}
+
+func (Ineffassign) Name() string {
+ return "ineffassign"
+}
+
+func (Ineffassign) Desc() string {
+ return "Detects when assignments to existing variables are not used"
+}
+
+func (lint Ineffassign) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ issues := ineffassignAPI.Run(getAllFileNames(lintCtx))
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("ineffectual assignment to %s", formatCode(i.IdentName, lintCtx.Cfg)),
+ FromLinter: lint.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..f3652e4901d
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/interfacer.go
@@ -0,0 +1,46 @@
+package golinters
+
+import (
+ "context"
+
+ "mvdan.cc/interfacer/check"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Interfacer struct{}
+
+func (Interfacer) Name() string {
+ return "interfacer"
+}
+
+func (Interfacer) Desc() string {
+ return "Linter that suggests narrower interface types"
+}
+
+func (lint Interfacer) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ c := new(check.Checker)
+ c.Program(lintCtx.Program)
+ c.ProgramSSA(lintCtx.SSAProgram)
+
+ issues, err := c.Check()
+ if err != nil {
+ return nil, err
+ }
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ pos := lintCtx.SSAProgram.Fset.Position(i.Pos())
+ res = append(res, result.Issue{
+ Pos: pos,
+ Text: i.Message(),
+ FromLinter: lint.Name(),
+ })
+ }
+
+ return res, nil
+}
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 00000000000..ad90830df4a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/lll.go
@@ -0,0 +1,95 @@
+package golinters
+
+import (
+ "bufio"
+ "context"
+ "fmt"
+ "go/token"
+ "os"
+ "strings"
+ "unicode/utf8"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Lll struct{}
+
+func (Lll) Name() string {
+ return "lll"
+}
+
+func (Lll) Desc() string {
+ return "Reports long lines"
+}
+
+func (lint Lll) getIssuesForFile(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: lint.Name(),
+ })
+ }
+ 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: lint.Name(),
+ })
+ } else {
+ return nil, fmt.Errorf("can't scan file %s: %s", filename, err)
+ }
+ }
+
+ return res, nil
+}
+
+func (lint Lll) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+ spaces := strings.Repeat(" ", lintCtx.Settings().Lll.TabWidth)
+ for _, f := range getAllFileNames(lintCtx) {
+ issues, err := lint.getIssuesForFile(f, lintCtx.Settings().Lll.LineLength, spaces)
+ if err != nil {
+ return nil, err
+ }
+ res = append(res, issues...)
+ }
+
+ return res, nil
+}
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 00000000000..624a7774b1c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/maligned.go
@@ -0,0 +1,42 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+
+ malignedAPI "github.com/golangci/maligned"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Maligned struct{}
+
+func (Maligned) Name() string {
+ return "maligned"
+}
+
+func (Maligned) Desc() string {
+ return "Tool to detect Go structs that would take less memory if their fields were sorted"
+}
+
+func (m Maligned) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ issues := malignedAPI.Run(lintCtx.Program)
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ 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))
+ }
+ res = append(res, result.Issue{
+ Pos: i.Pos,
+ Text: text,
+ FromLinter: m.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..864253417e0
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/megacheck.go
@@ -0,0 +1,352 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "strings"
+ "time"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/go-tools/config"
+ "github.com/golangci/go-tools/stylecheck"
+
+ "github.com/golangci/go-tools/lint"
+ "github.com/golangci/go-tools/lint/lintutil"
+ "github.com/golangci/go-tools/simple"
+ "github.com/golangci/go-tools/staticcheck"
+ "github.com/golangci/go-tools/unused"
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ libpackages "github.com/golangci/golangci-lint/pkg/packages"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+const (
+ MegacheckParentName = "megacheck"
+ MegacheckStaticcheckName = "staticcheck"
+ MegacheckUnusedName = "unused"
+ MegacheckGosimpleName = "gosimple"
+ MegacheckStylecheckName = "stylecheck"
+)
+
+type Staticcheck struct {
+ megacheck
+}
+
+func NewStaticcheck() *Staticcheck {
+ return &Staticcheck{
+ megacheck: megacheck{
+ staticcheckEnabled: true,
+ },
+ }
+}
+
+func (Staticcheck) Name() string { return MegacheckStaticcheckName }
+func (Staticcheck) Desc() string {
+ return "Staticcheck is a go vet on steroids, applying a ton of static analysis checks"
+}
+
+type Gosimple struct {
+ megacheck
+}
+
+func NewGosimple() *Gosimple {
+ return &Gosimple{
+ megacheck: megacheck{
+ gosimpleEnabled: true,
+ },
+ }
+}
+
+func (Gosimple) Name() string { return MegacheckGosimpleName }
+func (Gosimple) Desc() string {
+ return "Linter for Go source code that specializes in simplifying a code"
+}
+
+type Unused struct {
+ megacheck
+}
+
+func NewUnused() *Unused {
+ return &Unused{
+ megacheck: megacheck{
+ unusedEnabled: true,
+ },
+ }
+}
+
+func (Unused) Name() string { return MegacheckUnusedName }
+func (Unused) Desc() string {
+ return "Checks Go code for unused constants, variables, functions and types"
+}
+
+type Stylecheck struct {
+ megacheck
+}
+
+func NewStylecheck() *Stylecheck {
+ return &Stylecheck{
+ megacheck: megacheck{
+ stylecheckEnabled: true,
+ },
+ }
+}
+
+func (Stylecheck) Name() string { return MegacheckStylecheckName }
+func (Stylecheck) Desc() string { return "Stylecheck is a replacement for golint" }
+
+type megacheck struct {
+ unusedEnabled bool
+ gosimpleEnabled bool
+ staticcheckEnabled bool
+ stylecheckEnabled bool
+}
+
+func (megacheck) Name() string {
+ return MegacheckParentName
+}
+
+func (megacheck) Desc() string {
+ return "" // shouldn't be called
+}
+
+func (m *megacheck) enableChildLinter(name string) error {
+ switch name {
+ case MegacheckStaticcheckName:
+ m.staticcheckEnabled = true
+ case MegacheckGosimpleName:
+ m.gosimpleEnabled = true
+ case MegacheckUnusedName:
+ m.unusedEnabled = true
+ case MegacheckStylecheckName:
+ m.stylecheckEnabled = true
+ default:
+ return fmt.Errorf("invalid child linter name %s for metalinter %s", name, m.Name())
+ }
+
+ return nil
+}
+
+type MegacheckMetalinter struct{}
+
+func (MegacheckMetalinter) Name() string {
+ return MegacheckParentName
+}
+
+func (MegacheckMetalinter) BuildLinterConfig(enabledChildren []string) (*linter.Config, error) {
+ var m megacheck
+ for _, name := range enabledChildren {
+ if err := m.enableChildLinter(name); err != nil {
+ return nil, err
+ }
+ }
+
+ // TODO: merge linter.Config and linter.Linter or refactor it in another way
+ return &linter.Config{
+ Linter: m,
+ EnabledByDefault: false,
+ NeedsTypeInfo: true,
+ NeedsSSARepr: true,
+ InPresets: []string{linter.PresetStyle, linter.PresetBugs, linter.PresetUnused},
+ Speed: 1,
+ AlternativeNames: nil,
+ OriginalURL: "",
+ ParentLinterName: "",
+ }, nil
+}
+
+func (MegacheckMetalinter) DefaultChildLinterNames() []string {
+ // no stylecheck here for backwards compatibility for users who enabled megacheck: don't enable extra
+ // linter for them
+ return []string{MegacheckStaticcheckName, MegacheckGosimpleName, MegacheckUnusedName}
+}
+
+func (m MegacheckMetalinter) AllChildLinterNames() []string {
+ return append(m.DefaultChildLinterNames(), MegacheckStylecheckName)
+}
+
+func (m MegacheckMetalinter) isValidChild(name string) bool {
+ for _, child := range m.AllChildLinterNames() {
+ if child == name {
+ return true
+ }
+ }
+
+ return false
+}
+
+func prettifyCompilationError(err packages.Error) error {
+ i, _ := TypeCheck{}.parseError(err)
+ if i == nil {
+ return err
+ }
+
+ shortFilename, pathErr := fsutils.ShortestRelPath(i.Pos.Filename, "")
+ if pathErr != nil {
+ return err
+ }
+
+ errText := shortFilename
+ if i.Line() != 0 {
+ errText += fmt.Sprintf(":%d", i.Line())
+ }
+ errText += fmt.Sprintf(": %s", i.Text)
+ return errors.New(errText)
+}
+
+func (m megacheck) canAnalyze(lintCtx *linter.Context) bool {
+ if len(lintCtx.NotCompilingPackages) == 0 {
+ return true
+ }
+
+ var errPkgs []string
+ var errs []packages.Error
+ for _, p := range lintCtx.NotCompilingPackages {
+ if p.Name == "main" {
+ // megacheck crashes on not compiling packages but main packages
+ // aren't reachable by megacheck: other packages can't depend on them.
+ continue
+ }
+
+ errPkgs = append(errPkgs, p.String())
+ errs = append(errs, libpackages.ExtractErrors(p, lintCtx.ASTCache)...)
+ }
+
+ if len(errPkgs) == 0 { // only main packages do not compile
+ return true
+ }
+
+ // TODO: print real linter names in this message
+ warnText := fmt.Sprintf("Can't run megacheck because of compilation errors in packages %s", errPkgs)
+ if len(errs) != 0 {
+ warnText += fmt.Sprintf(": %s", prettifyCompilationError(errs[0]))
+ if len(errs) > 1 {
+ const runCmd = "golangci-lint run --no-config --disable-all -E typecheck"
+ warnText += fmt.Sprintf(" and %d more errors: run `%s` to see all errors", len(errs)-1, runCmd)
+ }
+ }
+ lintCtx.Log.Warnf("%s", warnText)
+
+ // megacheck crashes if there are not compiling packages
+ return false
+}
+
+func (m megacheck) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ if !m.canAnalyze(lintCtx) {
+ return nil, nil
+ }
+
+ issues, err := m.runMegacheck(lintCtx.Packages, lintCtx.Settings().Unused.CheckExported)
+ if err != nil {
+ return nil, errors.Wrap(err, "failed to run megacheck")
+ }
+
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ meta := MegacheckMetalinter{}
+ for _, i := range issues {
+ if !meta.isValidChild(i.Checker) {
+ lintCtx.Log.Warnf("Bad megacheck checker name %q", i.Checker)
+ continue
+ }
+
+ res = append(res, result.Issue{
+ Pos: i.Position,
+ // TODO: use severity
+ Text: fmt.Sprintf("%s: %s", i.Check, i.Text),
+ FromLinter: i.Checker,
+ })
+ }
+ return res, nil
+}
+
+func (m megacheck) runMegacheck(workingPkgs []*packages.Package, checkExportedUnused bool) ([]lint.Problem, error) {
+ var checkers []lint.Checker
+
+ if m.gosimpleEnabled {
+ checkers = append(checkers, simple.NewChecker())
+ }
+ if m.staticcheckEnabled {
+ checkers = append(checkers, staticcheck.NewChecker())
+ }
+ if m.stylecheckEnabled {
+ checkers = append(checkers, stylecheck.NewChecker())
+ }
+ if m.unusedEnabled {
+ uc := unused.NewChecker(unused.CheckAll)
+ uc.ConsiderReflection = true
+ uc.WholeProgram = checkExportedUnused
+ checkers = append(checkers, unused.NewLintChecker(uc))
+ }
+
+ if len(checkers) == 0 {
+ return nil, nil
+ }
+
+ cfg := config.Config{}
+ opts := &lintutil.Options{
+ // TODO: get current go version, but now it doesn't matter,
+ // may be needed after next updates of megacheck
+ GoVersion: 11,
+
+ Config: cfg,
+ // TODO: support Ignores option
+ }
+
+ return runMegacheckCheckers(checkers, opts, workingPkgs)
+}
+
+// parseIgnore is a copy from megacheck code just to not fork megacheck
+func parseIgnore(s string) ([]lint.Ignore, error) {
+ var out []lint.Ignore
+ if s == "" {
+ return nil, nil
+ }
+ for _, part := range strings.Fields(s) {
+ p := strings.Split(part, ":")
+ if len(p) != 2 {
+ return nil, errors.New("malformed ignore string")
+ }
+ path := p[0]
+ checks := strings.Split(p[1], ",")
+ out = append(out, &lint.GlobIgnore{Pattern: path, Checks: checks})
+ }
+ return out, nil
+}
+
+func runMegacheckCheckers(cs []lint.Checker, opt *lintutil.Options, workingPkgs []*packages.Package) ([]lint.Problem, error) {
+ stats := lint.PerfStats{
+ CheckerInits: map[string]time.Duration{},
+ }
+
+ ignores, err := parseIgnore(opt.Ignores)
+ if err != nil {
+ return nil, err
+ }
+
+ var problems []lint.Problem
+ if len(workingPkgs) == 0 {
+ return problems, nil
+ }
+
+ l := &lint.Linter{
+ Checkers: cs,
+ Ignores: ignores,
+ GoVersion: opt.GoVersion,
+ ReturnIgnored: opt.ReturnIgnored,
+ Config: opt.Config,
+
+ MaxConcurrentJobs: opt.MaxConcurrentJobs,
+ PrintStats: opt.PrintStats,
+ }
+ problems = append(problems, l.Lint(workingPkgs, &stats)...)
+
+ return problems, nil
+}
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 00000000000..3936966dad9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/misspell.go
@@ -0,0 +1,75 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/token"
+ "io/ioutil"
+ "strings"
+
+ "github.com/golangci/misspell"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Misspell struct{}
+
+func (Misspell) Name() string {
+ return "misspell"
+}
+
+func (Misspell) Desc() string {
+ return "Finds commonly misspelled English words in comments"
+}
+
+func (lint Misspell) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ 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":
+ return nil, fmt.Errorf("unknown locale: %q", locale)
+ }
+
+ if len(settings.IgnoreWords) != 0 {
+ r.RemoveRule(settings.IgnoreWords)
+ }
+
+ r.Compile()
+
+ var res []result.Issue
+ for _, f := range getAllFileNames(lintCtx) {
+ fileContent, err := ioutil.ReadFile(f)
+ if err != nil {
+ return nil, fmt.Errorf("can't read file %s: %s", f, err)
+ }
+
+ _, diffs := r.ReplaceGo(string(fileContent))
+ for _, diff := range diffs {
+ text := fmt.Sprintf("`%s` is a misspelling of `%s`", diff.Original, diff.Corrected)
+ pos := token.Position{
+ Filename: f,
+ Line: diff.Line,
+ Column: diff.Column + 1,
+ }
+ res = append(res, result.Issue{
+ Pos: pos,
+ Text: text,
+ FromLinter: lint.Name(),
+ })
+ }
+ }
+
+ return res, nil
+}
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 00000000000..b935faa7ce2
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/nakedret.go
@@ -0,0 +1,100 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Nakedret struct{}
+
+func (Nakedret) Name() string {
+ return "nakedret"
+}
+
+func (Nakedret) Desc() string {
+ return "Finds naked returns in functions greater than a specified function length"
+}
+
+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: Nakedret{}.Name(),
+ 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
+}
+
+func (lint Nakedret) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+ for _, f := range lintCtx.ASTCache.GetAllValidFiles() {
+ v := nakedretVisitor{
+ maxLength: lintCtx.Settings().Nakedret.MaxFuncLines,
+ f: f.Fset,
+ }
+ ast.Walk(&v, f.F)
+ res = append(res, v.issues...)
+ }
+
+ return res, 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 00000000000..6b2e032c107
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/prealloc.go
@@ -0,0 +1,40 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+
+ "github.com/golangci/prealloc"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Prealloc struct{}
+
+func (Prealloc) Name() string {
+ return "prealloc"
+}
+
+func (Prealloc) Desc() string {
+ return "Finds slice declarations that could potentially be preallocated"
+}
+
+func (lint Prealloc) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+
+ s := &lintCtx.Settings().Prealloc
+ for _, f := range lintCtx.ASTCache.GetAllValidFiles() {
+ hints := prealloc.Check([]*ast.File{f.F}, s.Simple, s.RangeLoops, s.ForLoops)
+ for _, hint := range hints {
+ res = append(res, result.Issue{
+ Pos: f.Fset.Position(hint.Pos),
+ Text: fmt.Sprintf("Consider preallocating %s", formatCode(hint.DeclaredSliceName, lintCtx.Cfg)),
+ FromLinter: lint.Name(),
+ })
+ }
+ }
+
+ return res, nil
+}
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 00000000000..cce7809b871
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/scopelint.go
@@ -0,0 +1,139 @@
+package golinters
+
+import (
+ "context"
+ "fmt"
+ "go/ast"
+ "go/token"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Scopelint struct{}
+
+func (Scopelint) Name() string {
+ return "scopelint"
+}
+
+func (Scopelint) Desc() string {
+ return "Scopelint checks for unpinned variables in go programs"
+}
+
+func (lint Scopelint) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ var res []result.Issue
+
+ for _, f := range lintCtx.ASTCache.GetAllValidFiles() {
+ n := Node{
+ fset: f.Fset,
+ dangerObjects: map[*ast.Object]struct{}{},
+ unsafeObjects: map[*ast.Object]struct{}{},
+ skipFuncs: map[*ast.FuncLit]struct{}{},
+ issues: &res,
+ }
+ ast.Walk(&n, f.F)
+ }
+
+ return res, nil
+}
+
+// The code below is copy-pasted from https://github.com/kyoh86/scopelint
+
+// Node represents a Node being linted.
+type Node struct {
+ fset *token.FileSet
+ dangerObjects map[*ast.Object]struct{}
+ unsafeObjects map[*ast.Object]struct{}
+ skipFuncs map[*ast.FuncLit]struct{}
+ 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] = struct{}{}
+ }
+ }
+ }
+
+ case *ast.RangeStmt:
+ // Memory variables declarated in range statement
+ switch k := typedNode.Key.(type) {
+ case *ast.Ident:
+ f.unsafeObjects[k.Obj] = struct{}{}
+ }
+ switch v := typedNode.Value.(type) {
+ case *ast.Ident:
+ f.unsafeObjects[v.Obj] = struct{}{}
+ }
+
+ 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] = struct{}{}
+ }
+
+ case *ast.FuncLit:
+ if _, skip := f.skipFuncs[typedNode]; !skip {
+ dangers := map[*ast.Object]struct{}{}
+ for d := range f.dangerObjects {
+ dangers[d] = struct{}{}
+ }
+ for u := range f.unsafeObjects {
+ dangers[u] = struct{}{}
+ }
+ return &Node{
+ fset: f.fset,
+ dangerObjects: dangers,
+ unsafeObjects: f.unsafeObjects,
+ 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.errorfAt(pos, format, args...)
+}
+
+func (f *Node) errorfAt(pos token.Position, format string, args ...interface{}) {
+ *f.issues = append(*f.issues, result.Issue{
+ Pos: pos,
+ Text: fmt.Sprintf(format, args...),
+ FromLinter: Scopelint{}.Name(),
+ })
+}
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 00000000000..4b6b106f3ca
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/structcheck.go
@@ -0,0 +1,38 @@
+package golinters // nolint:dupl
+
+import (
+ "context"
+ "fmt"
+
+ structcheckAPI "github.com/golangci/check/cmd/structcheck"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Structcheck struct{}
+
+func (Structcheck) Name() string {
+ return "structcheck"
+}
+
+func (Structcheck) Desc() string {
+ return "Finds an unused struct fields"
+}
+
+func (s Structcheck) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ issues := structcheckAPI.Run(lintCtx.Program, lintCtx.Settings().Structcheck.CheckExportedFields)
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("%s is unused", formatCode(i.FieldName, lintCtx.Cfg)),
+ FromLinter: s.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..fde1756b32c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/typecheck.go
@@ -0,0 +1,57 @@
+package golinters
+
+import (
+ "context"
+
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ libpackages "github.com/golangci/golangci-lint/pkg/packages"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type TypeCheck struct{}
+
+func (TypeCheck) Name() string {
+ return "typecheck"
+}
+
+func (TypeCheck) Desc() string {
+ return "Like the front-end of a Go compiler, parses and type-checks Go code"
+}
+
+func (lint TypeCheck) 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: lint.Name(),
+ }, nil
+}
+
+func (lint TypeCheck) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ uniqReportedIssues := map[string]bool{}
+
+ var res []result.Issue
+ for _, pkg := range lintCtx.NotCompilingPackages {
+ errors := libpackages.ExtractErrors(pkg, lintCtx.ASTCache)
+ for _, err := range errors {
+ i, perr := lint.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 {
+ res = append(res, *i)
+ }
+ }
+ }
+
+ return res, nil
+}
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 00000000000..20ba45dc032
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unconvert.go
@@ -0,0 +1,38 @@
+package golinters
+
+import (
+ "context"
+
+ unconvertAPI "github.com/golangci/unconvert"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Unconvert struct{}
+
+func (Unconvert) Name() string {
+ return "unconvert"
+}
+
+func (Unconvert) Desc() string {
+ return "Remove unnecessary type conversions"
+}
+
+func (lint Unconvert) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ positions := unconvertAPI.Run(lintCtx.Program)
+ if len(positions) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(positions))
+ for _, pos := range positions {
+ res = append(res, result.Issue{
+ Pos: pos,
+ Text: "unnecessary conversion",
+ FromLinter: lint.Name(),
+ })
+ }
+
+ return res, nil
+}
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 00000000000..c45a79333c8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/unparam.go
@@ -0,0 +1,49 @@
+package golinters
+
+import (
+ "context"
+
+ "mvdan.cc/unparam/check"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Unparam struct{}
+
+func (Unparam) Name() string {
+ return "unparam"
+}
+
+func (Unparam) Desc() string {
+ return "Reports unused function parameters"
+}
+
+func (lint Unparam) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ us := &lintCtx.Settings().Unparam
+
+ if us.Algo != "cha" {
+ lintCtx.Log.Warnf("`linters-settings.unparam.algo` isn't supported by the newest `unparam`")
+ }
+
+ c := &check.Checker{}
+ c.CheckExportedFuncs(us.CheckExported)
+ c.Packages(lintCtx.Packages)
+ c.ProgramSSA(lintCtx.SSAProgram)
+
+ unparamIssues, err := c.Check()
+ if err != nil {
+ return nil, err
+ }
+
+ var res []result.Issue
+ for _, i := range unparamIssues {
+ res = append(res, result.Issue{
+ Pos: lintCtx.Program.Fset.Position(i.Pos()),
+ Text: i.Message(),
+ FromLinter: lint.Name(),
+ })
+ }
+
+ return res, nil
+}
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 00000000000..ee2919c0132
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/util.go
@@ -0,0 +1,64 @@
+package golinters
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strings"
+
+ gopackages "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+)
+
+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)
+}
+
+func getAllFileNames(ctx *linter.Context) []string {
+ var ret []string
+ uniqFiles := map[string]bool{} // files are duplicated for test packages
+ for _, pkg := range ctx.Packages {
+ for _, f := range pkg.GoFiles {
+ if uniqFiles[f] {
+ continue
+ }
+ uniqFiles[f] = true
+ ret = append(ret, f)
+ }
+ }
+ return ret
+}
+
+func getASTFilesForGoPkg(ctx *linter.Context, pkg *gopackages.Package) ([]*ast.File, *token.FileSet, error) {
+ var files []*ast.File
+ var fset *token.FileSet
+ for _, filename := range pkg.GoFiles {
+ f := ctx.ASTCache.Get(filename)
+ if f == nil {
+ return nil, nil, fmt.Errorf("no AST for file %s in cache: %+v", filename, *ctx.ASTCache)
+ }
+
+ if f.Err != nil {
+ return nil, nil, fmt.Errorf("can't load AST for file %s: %s", f.Name, f.Err)
+ }
+
+ files = append(files, f.F)
+ fset = f.Fset
+ }
+
+ return files, fset, nil
+}
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 00000000000..17e2eee69b4
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/golinters/varcheck.go
@@ -0,0 +1,38 @@
+package golinters // nolint:dupl
+
+import (
+ "context"
+ "fmt"
+
+ varcheckAPI "github.com/golangci/check/cmd/varcheck"
+
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Varcheck struct{}
+
+func (Varcheck) Name() string {
+ return "varcheck"
+}
+
+func (Varcheck) Desc() string {
+ return "Finds unused global variables and constants"
+}
+
+func (v Varcheck) Run(ctx context.Context, lintCtx *linter.Context) ([]result.Issue, error) {
+ issues := varcheckAPI.Run(lintCtx.Program, lintCtx.Settings().Varcheck.CheckExportedFields)
+ if len(issues) == 0 {
+ return nil, nil
+ }
+
+ res := make([]result.Issue, 0, len(issues))
+ for _, i := range issues {
+ res = append(res, result.Issue{
+ Pos: i.Pos,
+ Text: fmt.Sprintf("%s is unused", formatCode(i.VarName, lintCtx.Cfg)),
+ FromLinter: v.Name(),
+ })
+ }
+ return res, nil
+}
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 00000000000..e09362240bf
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/goutil/env.go
@@ -0,0 +1,49 @@
+package goutil
+
+import (
+ "context"
+ "encoding/json"
+ "os"
+ "os/exec"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+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 {
+ out, err := exec.CommandContext(ctx, "go", "env", "-json").Output()
+ if err != nil {
+ return errors.Wrap(err, "failed to run 'go env'")
+ }
+
+ if err = json.Unmarshal(out, &e.vars); err != nil {
+ return errors.Wrap(err, "failed to parse go env json")
+ }
+
+ e.debugf("Read go env: %#v", e.vars)
+ return nil
+}
+
+func (e Env) Get(k string) string {
+ envValue := os.Getenv(k)
+ if envValue != "" {
+ return envValue
+ }
+
+ return e.vars[k]
+}
diff --git a/vendor/github.com/golangci/golangci-lint/pkg/lint/astcache/astcache.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/astcache/astcache.go
new file mode 100644
index 00000000000..35f11d0001f
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/astcache/astcache.go
@@ -0,0 +1,158 @@
+package astcache
+
+import (
+ "go/ast"
+ "go/parser"
+ "go/token"
+ "path/filepath"
+ "time"
+
+ "golang.org/x/tools/go/packages"
+
+ "github.com/golangci/golangci-lint/pkg/fsutils"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type File struct {
+ F *ast.File
+ Fset *token.FileSet
+ Name string
+ Err error
+}
+
+type Cache struct {
+ m map[string]*File // map from absolute file path to file data
+ s []*File
+ log logutils.Log
+}
+
+func NewCache(log logutils.Log) *Cache {
+ return &Cache{
+ m: map[string]*File{},
+ log: log,
+ }
+}
+
+func (c Cache) ParsedFilenames() []string {
+ var keys []string
+ for k := range c.m {
+ keys = append(keys, k)
+ }
+ return keys
+}
+
+func (c Cache) normalizeFilename(filename string) string {
+ absPath := func() string {
+ if filepath.IsAbs(filename) {
+ return filepath.Clean(filename)
+ }
+
+ absFilename, err := filepath.Abs(filename)
+ if err != nil {
+ c.log.Warnf("Can't abs-ify filename %s: %s", filename, err)
+ return filename
+ }
+
+ return absFilename
+ }()
+
+ ret, err := fsutils.EvalSymlinks(absPath)
+ if err != nil {
+ c.log.Warnf("Failed to eval symlinks for %s: %s", absPath, err)
+ return absPath
+ }
+
+ return ret
+}
+
+func (c Cache) Get(filename string) *File {
+ return c.m[c.normalizeFilename(filename)]
+}
+
+func (c Cache) GetAllValidFiles() []*File {
+ return c.s
+}
+
+func (c *Cache) prepareValidFiles() {
+ files := make([]*File, 0, len(c.m))
+ for _, f := range c.m {
+ if f.Err != nil || f.F == nil {
+ continue
+ }
+ files = append(files, f)
+ }
+ c.s = files
+}
+
+func LoadFromFilenames(log logutils.Log, filenames ...string) *Cache {
+ c := NewCache(log)
+
+ fset := token.NewFileSet()
+ for _, filename := range filenames {
+ c.parseFile(filename, fset)
+ }
+
+ c.prepareValidFiles()
+ return c
+}
+
+func LoadFromPackages(pkgs []*packages.Package, log logutils.Log) (*Cache, error) {
+ c := NewCache(log)
+
+ for _, pkg := range pkgs {
+ c.loadFromPackage(pkg)
+ }
+
+ c.prepareValidFiles()
+ return c, nil
+}
+
+func (c *Cache) loadFromPackage(pkg *packages.Package) {
+ if len(pkg.Syntax) == 0 || len(pkg.GoFiles) != len(pkg.CompiledGoFiles) {
+ // len(pkg.Syntax) == 0 if only filenames are loaded
+ // lengths aren't equal if there are preprocessed files (cgo)
+ startedAt := time.Now()
+
+ // can't use pkg.Fset: it will overwrite offsets by preprocessed files
+ fset := token.NewFileSet()
+ for _, f := range pkg.GoFiles {
+ c.parseFile(f, fset)
+ }
+
+ c.log.Infof("Parsed AST of all pkg.GoFiles: %s for %s", pkg.GoFiles, time.Since(startedAt))
+ return
+ }
+
+ for _, f := range pkg.Syntax {
+ pos := pkg.Fset.Position(f.Pos())
+ if pos.Filename == "" {
+ continue
+ }
+
+ c.m[pos.Filename] = &File{
+ F: f,
+ Fset: pkg.Fset,
+ Name: pos.Filename,
+ }
+ }
+}
+
+func (c *Cache) parseFile(filePath string, fset *token.FileSet) {
+ if fset == nil {
+ fset = token.NewFileSet()
+ }
+
+ filePath = c.normalizeFilename(filePath)
+
+ // comments needed by e.g. golint
+ f, err := parser.ParseFile(fset, filePath, nil, parser.ParseComments)
+ c.m[filePath] = &File{
+ F: f,
+ Fset: fset,
+ Err: err,
+ Name: filePath,
+ }
+ if err != nil {
+ c.log.Warnf("Can't parse AST of %s: %s", filePath, err)
+ }
+}
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 00000000000..32848eca479
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/config.go
@@ -0,0 +1,85 @@
+package linter
+
+const (
+ PresetFormatting = "format"
+ PresetComplexity = "complexity"
+ PresetStyle = "style"
+ PresetBugs = "bugs"
+ PresetUnused = "unused"
+ PresetPerformance = "performance"
+)
+
+type Config struct {
+ Linter Linter
+ EnabledByDefault bool
+
+ NeedsTypeInfo bool
+ NeedsSSARepr bool
+
+ InPresets []string
+ Speed int // more value means faster execution of linter
+ AlternativeNames []string
+
+ OriginalURL string // URL of original (not forked) repo, needed for autogenerated README
+ ParentLinterName string // used only for megacheck's children now
+ CanAutoFix bool
+}
+
+func (lc *Config) WithTypeInfo() *Config {
+ lc.NeedsTypeInfo = true
+ return lc
+}
+
+func (lc *Config) WithSSA() *Config {
+ lc.NeedsTypeInfo = true
+ lc.NeedsSSARepr = true
+ return lc
+}
+
+func (lc *Config) WithPresets(presets ...string) *Config {
+ lc.InPresets = presets
+ return lc
+}
+
+func (lc *Config) WithSpeed(speed int) *Config {
+ lc.Speed = speed
+ 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) WithParent(parentLinterName string) *Config {
+ lc.ParentLinterName = parentLinterName
+ return lc
+}
+
+func (lc *Config) WithAutoFix() *Config {
+ lc.CanAutoFix = true
+ return lc
+}
+
+func (lc *Config) GetSpeed() int {
+ return lc.Speed
+}
+
+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 {
+ return &Config{
+ Linter: linter,
+ }
+}
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 00000000000..f9aeb233646
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/context.go
@@ -0,0 +1,29 @@
+package linter
+
+import (
+ "golang.org/x/tools/go/loader"
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/go/ssa"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/lint/astcache"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+type Context struct {
+ Packages []*packages.Package
+ NotCompilingPackages []*packages.Package
+
+ LoaderConfig *loader.Config // deprecated, don't use for new linters
+ Program *loader.Program // deprecated, use Packages for new linters
+
+ SSAProgram *ssa.Program // for unparam and interfacer but not for megacheck (it change it)
+
+ Cfg *config.Config
+ ASTCache *astcache.Cache
+ Log logutils.Log
+}
+
+func (c *Context) Settings() *config.LintersSettings {
+ return &c.Cfg.LintersSettings
+}
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 00000000000..cfe9ec02090
--- /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/linter/metalinter.go b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/metalinter.go
new file mode 100644
index 00000000000..ee235640f2e
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/linter/metalinter.go
@@ -0,0 +1,8 @@
+package linter
+
+type MetaLinter interface {
+ Name() string
+ BuildLinterConfig(enabledChildren []string) (*Config, error)
+ AllChildLinterNames() []string
+ DefaultChildLinterNames() []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 00000000000..3799912f4b0
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/enabled_set.go
@@ -0,0 +1,149 @@
+package lintersdb
+
+import (
+ "sort"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "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
+}
+
+func NewEnabledSet(m *Manager, v *Validator, log logutils.Log, cfg *config.Config) *EnabledSet {
+ return &EnabledSet{
+ m: m,
+ v: v,
+ log: log,
+ cfg: cfg,
+ }
+}
+
+// nolint:gocyclo
+func (es EnabledSet) build(lcfg *config.Linters, enabledByDefaultLinters []*linter.Config) map[string]*linter.Config {
+ 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 := range resultLintersSet {
+ if es.m.GetLinterConfig(name).NeedsSSARepr {
+ delete(resultLintersSet, name)
+ }
+ }
+ }
+
+ metaLinters := es.m.GetMetaLinters()
+
+ for _, name := range lcfg.Enable {
+ if metaLinter := metaLinters[name]; metaLinter != nil {
+ // e.g. if we use --enable=megacheck we should add staticcheck,unused and gosimple to result set
+ for _, childLinter := range metaLinter.DefaultChildLinterNames() {
+ resultLintersSet[childLinter] = es.m.GetLinterConfig(childLinter)
+ }
+ continue
+ }
+
+ lc := es.m.GetLinterConfig(name)
+ // it's important to use lc.Name() nor name because name can be alias
+ resultLintersSet[lc.Name()] = lc
+ }
+
+ for _, name := range lcfg.Disable {
+ if metaLinter := metaLinters[name]; metaLinter != nil {
+ // e.g. if we use --disable=megacheck we should remove staticcheck,unused and gosimple from result set
+ for _, childLinter := range metaLinter.DefaultChildLinterNames() {
+ delete(resultLintersSet, childLinter)
+ }
+ continue
+ }
+
+ lc := es.m.GetLinterConfig(name)
+ // it's important to use lc.Name() nor name because name can be alias
+ delete(resultLintersSet, lc.Name())
+ }
+
+ return resultLintersSet
+}
+
+func (es EnabledSet) optimizeLintersSet(linters map[string]*linter.Config) {
+ for _, metaLinter := range es.m.GetMetaLinters() {
+ var children []string
+ for _, child := range metaLinter.AllChildLinterNames() {
+ if _, ok := linters[child]; ok {
+ children = append(children, child)
+ }
+ }
+
+ if len(children) <= 1 {
+ continue
+ }
+
+ for _, child := range children {
+ delete(linters, child)
+ }
+ builtLinterConfig, err := metaLinter.BuildLinterConfig(children)
+ if err != nil {
+ panic("shouldn't fail during linter building: " + err.Error())
+ }
+ linters[metaLinter.Name()] = builtLinterConfig
+ es.log.Infof("Optimized sublinters %s into metalinter %s", children, metaLinter.Name())
+ }
+}
+
+func (es EnabledSet) Get(optimize bool) ([]*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)
+ if optimize {
+ es.optimizeLintersSet(resultLintersSet)
+ }
+
+ var resultLinters []*linter.Config
+ for _, lc := range resultLintersSet {
+ resultLinters = append(resultLinters, lc)
+ }
+
+ return resultLinters, nil
+}
+
+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 00000000000..7a2027bbed8
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/lintersdb/manager.go
@@ -0,0 +1,283 @@
+package lintersdb
+
+import (
+ "os"
+
+ "github.com/golangci/golangci-lint/pkg/golinters"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+)
+
+type Manager struct {
+ nameToLC map[string]*linter.Config
+}
+
+func NewManager() *Manager {
+ m := &Manager{}
+ nameToLC := make(map[string]*linter.Config)
+ for _, lc := range m.GetAllSupportedLinterConfigs() {
+ for _, name := range lc.AllNames() {
+ nameToLC[name] = lc
+ }
+ }
+
+ m.nameToLC = nameToLC
+ return m
+}
+
+func (Manager) AllPresets() []string {
+ return []string{linter.PresetBugs, linter.PresetUnused, linter.PresetFormatting,
+ linter.PresetStyle, linter.PresetComplexity, linter.PresetPerformance}
+}
+
+func (m Manager) allPresetsSet() map[string]bool {
+ ret := map[string]bool{}
+ for _, p := range m.AllPresets() {
+ ret[p] = true
+ }
+ return ret
+}
+
+func (m Manager) GetMetaLinter(name string) linter.MetaLinter {
+ return m.GetMetaLinters()[name]
+}
+
+func (m Manager) GetLinterConfig(name string) *linter.Config {
+ lc, ok := m.nameToLC[name]
+ if !ok {
+ return nil
+ }
+
+ return lc
+}
+
+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
+}
+
+func (Manager) GetMetaLinters() map[string]linter.MetaLinter {
+ metaLinters := []linter.MetaLinter{
+ golinters.MegacheckMetalinter{},
+ }
+
+ ret := map[string]linter.MetaLinter{}
+ for _, metaLinter := range metaLinters {
+ ret[metaLinter.Name()] = metaLinter
+ }
+
+ return ret
+}
+
+func (Manager) GetAllSupportedLinterConfigs() []*linter.Config {
+ lcs := []*linter.Config{
+ linter.NewConfig(golinters.Govet{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetBugs).
+ WithSpeed(4).
+ WithAlternativeNames("vet", "vetshadow").
+ WithURL("https://golang.org/cmd/vet/"),
+ linter.NewConfig(golinters.Errcheck{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetBugs).
+ WithSpeed(10).
+ WithURL("https://github.com/kisielk/errcheck"),
+ linter.NewConfig(golinters.Golint{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(3).
+ WithURL("https://github.com/golang/lint"),
+
+ linter.NewConfig(golinters.NewStaticcheck()).
+ WithSSA().
+ WithPresets(linter.PresetBugs).
+ WithSpeed(2).
+ WithURL("https://staticcheck.io/"),
+ linter.NewConfig(golinters.NewUnused()).
+ WithSSA().
+ WithPresets(linter.PresetUnused).
+ WithSpeed(5).
+ WithURL("https://github.com/dominikh/go-tools/tree/master/cmd/unused"),
+ linter.NewConfig(golinters.NewGosimple()).
+ WithSSA().
+ WithPresets(linter.PresetStyle).
+ WithSpeed(5).
+ WithURL("https://github.com/dominikh/go-tools/tree/master/cmd/gosimple"),
+ linter.NewConfig(golinters.NewStylecheck()).
+ WithSSA().
+ WithPresets(linter.PresetStyle).
+ WithSpeed(5).
+ WithURL("https://github.com/dominikh/go-tools/tree/master/stylecheck"),
+
+ linter.NewConfig(golinters.Gosec{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetBugs).
+ WithSpeed(8).
+ WithURL("https://github.com/securego/gosec").
+ WithAlternativeNames("gas"),
+ linter.NewConfig(golinters.Structcheck{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetUnused).
+ WithSpeed(10).
+ WithURL("https://github.com/opennota/check"),
+ linter.NewConfig(golinters.Varcheck{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetUnused).
+ WithSpeed(10).
+ WithURL("https://github.com/opennota/check"),
+ linter.NewConfig(golinters.Interfacer{}).
+ WithSSA().
+ WithPresets(linter.PresetStyle).
+ WithSpeed(6).
+ WithURL("https://github.com/mvdan/interfacer"),
+ linter.NewConfig(golinters.Unconvert{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetStyle).
+ WithSpeed(10).
+ WithURL("https://github.com/mdempsky/unconvert"),
+ linter.NewConfig(golinters.Ineffassign{}).
+ WithPresets(linter.PresetUnused).
+ WithSpeed(9).
+ WithURL("https://github.com/gordonklaus/ineffassign"),
+ linter.NewConfig(golinters.Dupl{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(7).
+ WithURL("https://github.com/mibk/dupl"),
+ linter.NewConfig(golinters.Goconst{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(9).
+ WithURL("https://github.com/jgautheron/goconst"),
+ linter.NewConfig(golinters.Deadcode{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetUnused).
+ WithSpeed(10).
+ WithURL("https://github.com/remyoudompheng/go-misc/tree/master/deadcode"),
+ linter.NewConfig(golinters.Gocyclo{}).
+ WithPresets(linter.PresetComplexity).
+ WithSpeed(8).
+ WithURL("https://github.com/alecthomas/gocyclo"),
+ linter.NewConfig(golinters.TypeCheck{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetBugs).
+ WithSpeed(10).
+ WithURL(""),
+
+ linter.NewConfig(golinters.Gofmt{}).
+ WithPresets(linter.PresetFormatting).
+ WithSpeed(7).
+ WithAutoFix().
+ WithURL("https://golang.org/cmd/gofmt/"),
+ linter.NewConfig(golinters.Gofmt{UseGoimports: true}).
+ WithPresets(linter.PresetFormatting).
+ WithSpeed(5).
+ WithAutoFix().
+ WithURL("https://godoc.org/golang.org/x/tools/cmd/goimports"),
+ linter.NewConfig(golinters.Maligned{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetPerformance).
+ WithSpeed(10).
+ WithURL("https://github.com/mdempsky/maligned"),
+ linter.NewConfig(golinters.Depguard{}).
+ WithTypeInfo().
+ WithPresets(linter.PresetStyle).
+ WithSpeed(6).
+ WithURL("https://github.com/OpenPeeDeeP/depguard"),
+ linter.NewConfig(golinters.Misspell{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(7).
+ WithAutoFix().
+ WithURL("https://github.com/client9/misspell"),
+ linter.NewConfig(golinters.Lll{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(10).
+ WithURL("https://github.com/walle/lll"),
+ linter.NewConfig(golinters.Unparam{}).
+ WithPresets(linter.PresetUnused).
+ WithSpeed(3).
+ WithSSA().
+ WithURL("https://github.com/mvdan/unparam"),
+ linter.NewConfig(golinters.Nakedret{}).
+ WithPresets(linter.PresetComplexity).
+ WithSpeed(10).
+ WithURL("https://github.com/alexkohler/nakedret"),
+ linter.NewConfig(golinters.Prealloc{}).
+ WithPresets(linter.PresetPerformance).
+ WithSpeed(8).
+ WithURL("https://github.com/alexkohler/prealloc"),
+ linter.NewConfig(golinters.Scopelint{}).
+ WithPresets(linter.PresetBugs).
+ WithSpeed(8).
+ WithURL("https://github.com/kyoh86/scopelint"),
+ linter.NewConfig(golinters.Gocritic{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(5).
+ WithTypeInfo().
+ WithURL("https://github.com/go-critic/go-critic"),
+ linter.NewConfig(golinters.Gochecknoinits{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(10).
+ WithURL("https://github.com/leighmcculloch/gochecknoinits"),
+ linter.NewConfig(golinters.Gochecknoglobals{}).
+ WithPresets(linter.PresetStyle).
+ WithSpeed(10).
+ WithURL("https://github.com/leighmcculloch/gochecknoglobals"),
+ }
+
+ isLocalRun := os.Getenv("GOLANGCI_COM_RUN") == ""
+ enabledByDefault := map[string]bool{
+ golinters.Govet{}.Name(): true,
+ golinters.Errcheck{}.Name(): true,
+ golinters.Staticcheck{}.Name(): true,
+ golinters.Unused{}.Name(): true,
+ golinters.Gosimple{}.Name(): true,
+ golinters.Structcheck{}.Name(): true,
+ golinters.Varcheck{}.Name(): true,
+ golinters.Ineffassign{}.Name(): true,
+ golinters.Deadcode{}.Name(): true,
+
+ // don't typecheck for golangci.com: too many troubles
+ golinters.TypeCheck{}.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
+}
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 00000000000..7e1f878897b
--- /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.GetLinterConfig(name) == nil && v.m.GetMetaLinter(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 00000000000..bddbd4e59d6
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/load.go
@@ -0,0 +1,385 @@
+package lint
+
+import (
+ "context"
+ "fmt"
+ "go/build"
+ "go/types"
+ "os"
+ "path/filepath"
+ "regexp"
+ "strings"
+ "time"
+
+ "github.com/pkg/errors"
+ "golang.org/x/tools/go/loader"
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/go/ssa"
+ "golang.org/x/tools/go/ssa/ssautil"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/exitcodes"
+ "github.com/golangci/golangci-lint/pkg/goutil"
+ "github.com/golangci/golangci-lint/pkg/lint/astcache"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ libpackages "github.com/golangci/golangci-lint/pkg/packages"
+)
+
+type ContextLoader struct {
+ cfg *config.Config
+ log logutils.Log
+ debugf logutils.DebugFunc
+ goenv *goutil.Env
+ pkgTestIDRe *regexp.Regexp
+}
+
+func NewContextLoader(cfg *config.Config, log logutils.Log, goenv *goutil.Env) *ContextLoader {
+ return &ContextLoader{
+ cfg: cfg,
+ log: log,
+ debugf: logutils.Debug("loader"),
+ goenv: goenv,
+ pkgTestIDRe: regexp.MustCompile(`^(.*) \[(.*)\.test\]`),
+ }
+}
+
+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("GOROOT")
+ if goroot == "" {
+ return
+ }
+
+ os.Setenv("GOROOT", goroot)
+ build.Default.GOROOT = goroot
+ build.Default.BuildTags = cl.cfg.Run.BuildTags
+}
+
+func (cl ContextLoader) makeFakeLoaderPackageInfo(pkg *packages.Package) *loader.PackageInfo {
+ var errs []error
+ for _, err := range pkg.Errors {
+ errs = append(errs, err)
+ }
+
+ typeInfo := &types.Info{}
+ if pkg.TypesInfo != nil {
+ typeInfo = pkg.TypesInfo
+ }
+
+ return &loader.PackageInfo{
+ Pkg: pkg.Types,
+ Importable: true, // not used
+ TransitivelyErrorFree: !pkg.IllTyped,
+
+ // use compiled (preprocessed) go files AST;
+ // AST linters use not preprocessed go files AST
+ Files: pkg.Syntax,
+ Errors: errs,
+ Info: *typeInfo,
+ }
+}
+
+func shouldSkipPkg(pkg *packages.Package) bool {
+ // it's an implicit testmain package
+ return pkg.Name == "main" && strings.HasSuffix(pkg.PkgPath, ".test")
+}
+
+func (cl ContextLoader) makeFakeLoaderProgram(pkgs []*packages.Package) *loader.Program {
+ var createdPkgs []*loader.PackageInfo
+ for _, pkg := range pkgs {
+ if pkg.IllTyped {
+ // some linters crash on packages with errors,
+ // skip them and warn about them in another place
+ continue
+ }
+
+ pkgInfo := cl.makeFakeLoaderPackageInfo(pkg)
+ createdPkgs = append(createdPkgs, pkgInfo)
+ }
+
+ allPkgs := map[*types.Package]*loader.PackageInfo{}
+ for _, pkg := range createdPkgs {
+ pkg := pkg
+ allPkgs[pkg.Pkg] = pkg
+ }
+ for _, pkg := range pkgs {
+ if pkg.IllTyped {
+ // some linters crash on packages with errors,
+ // skip them and warn about them in another place
+ continue
+ }
+
+ for _, impPkg := range pkg.Imports {
+ // don't use astcache for imported packages: we don't find issues in cgo imported deps
+ pkgInfo := cl.makeFakeLoaderPackageInfo(impPkg)
+ allPkgs[pkgInfo.Pkg] = pkgInfo
+ }
+ }
+
+ return &loader.Program{
+ Fset: pkgs[0].Fset,
+ Imported: nil, // not used without .Created in any linter
+ Created: createdPkgs, // all initial packages
+ AllPackages: allPkgs, // all initial packages and their depndencies
+ }
+}
+
+func (cl ContextLoader) buildSSAProgram(pkgs []*packages.Package) *ssa.Program {
+ startedAt := time.Now()
+ var pkgsBuiltDuration time.Duration
+ defer func() {
+ cl.log.Infof("SSA repr building timing: packages building %s, total %s",
+ pkgsBuiltDuration, time.Since(startedAt))
+ }()
+
+ ssaProg, _ := ssautil.Packages(pkgs, ssa.GlobalDebug)
+ pkgsBuiltDuration = time.Since(startedAt)
+ ssaProg.Build()
+ return ssaProg
+}
+
+func (cl ContextLoader) findLoadMode(linters []*linter.Config) packages.LoadMode {
+ maxLoadMode := packages.LoadFiles
+ for _, lc := range linters {
+ curLoadMode := packages.LoadFiles
+ if lc.NeedsTypeInfo {
+ curLoadMode = packages.LoadSyntax
+ }
+ if lc.NeedsSSARepr {
+ curLoadMode = packages.LoadAllSyntax
+ }
+ if curLoadMode > maxLoadMode {
+ maxLoadMode = curLoadMode
+ }
+ }
+
+ return maxLoadMode
+}
+
+func stringifyLoadMode(mode packages.LoadMode) string {
+ switch mode {
+ case packages.LoadFiles:
+ return "load files"
+ case packages.LoadImports:
+ return "load imports"
+ case packages.LoadTypes:
+ return "load types"
+ case packages.LoadSyntax:
+ return "load types and syntax"
+ case packages.LoadAllSyntax:
+ return "load deps types and syntax"
+ }
+ return "unknown"
+}
+
+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, " "))
+ }
+
+ 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 (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,
+ //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")
+ }
+ 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)
+ }
+
+ for _, pkg := range pkgs {
+ for _, err := range pkg.Errors {
+ if strings.Contains(err.Msg, "no Go files") {
+ return nil, errors.Wrapf(exitcodes.ErrNoGoFiles, "package %s", pkg.PkgPath)
+ }
+ }
+ }
+
+ return cl.filterPackages(pkgs), nil
+}
+
+func (cl ContextLoader) tryParseTestPackage(pkg *packages.Package) (name, testName string, isTest bool) {
+ matches := cl.pkgTestIDRe.FindStringSubmatch(pkg.ID)
+ if matches == nil {
+ return "", "", false
+ }
+
+ return matches[1], matches[2], true
+}
+
+func (cl ContextLoader) filterPackages(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 {
+ if shouldSkipPkg(pkg) {
+ cl.debugf("skip pkg ID=%s", pkg.ID)
+ continue
+ }
+
+ _, _, 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
+}
+
+//nolint:gocyclo
+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
+ }
+
+ if len(pkgs) == 0 {
+ return nil, exitcodes.ErrNoGoFiles
+ }
+
+ var prog *loader.Program
+ if loadMode >= packages.LoadSyntax {
+ prog = cl.makeFakeLoaderProgram(pkgs)
+ }
+
+ var ssaProg *ssa.Program
+ if loadMode == packages.LoadAllSyntax {
+ ssaProg = cl.buildSSAProgram(pkgs)
+ }
+
+ astLog := cl.log.Child("astcache")
+ astCache, err := astcache.LoadFromPackages(pkgs, astLog)
+ if err != nil {
+ return nil, err
+ }
+
+ ret := &linter.Context{
+ Packages: pkgs,
+ Program: prog,
+ SSAProgram: ssaProg,
+ LoaderConfig: &loader.Config{
+ Cwd: "", // used by depguard and fallbacked to os.Getcwd
+ Build: nil, // used by depguard and megacheck and fallbacked to build.Default
+ },
+ Cfg: cl.cfg,
+ ASTCache: astCache,
+ Log: cl.log,
+ }
+
+ if prog != nil {
+ saveNotCompilingPackages(ret)
+ } else {
+ for _, pkg := range pkgs {
+ if pkg.IllTyped {
+ cl.log.Infof("Pkg %s errors: %v", pkg.ID, libpackages.ExtractErrors(pkg, astCache))
+ }
+ }
+ }
+
+ return ret, nil
+}
+
+// saveNotCompilingPackages saves not compiling packages into separate slice:
+// a lot of linters crash on such packages. Leave them only for those linters
+// which can work with them.
+func saveNotCompilingPackages(lintCtx *linter.Context) {
+ for _, pkg := range lintCtx.Packages {
+ if pkg.IllTyped {
+ lintCtx.NotCompilingPackages = append(lintCtx.NotCompilingPackages, pkg)
+ }
+ }
+
+ if len(lintCtx.NotCompilingPackages) != 0 {
+ lintCtx.Log.Infof("Packages that do not compile: %+v", lintCtx.NotCompilingPackages)
+ }
+}
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 00000000000..de9e9146b4e
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/lint/runner.go
@@ -0,0 +1,312 @@
+package lint
+
+import (
+ "context"
+ "fmt"
+ "runtime/debug"
+ "sort"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/goutil"
+ "github.com/golangci/golangci-lint/pkg/lint/astcache"
+ "github.com/golangci/golangci-lint/pkg/lint/linter"
+ "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"
+)
+
+type Runner struct {
+ Processors []processors.Processor
+ Log logutils.Log
+}
+
+func NewRunner(astCache *astcache.Cache, cfg *config.Config, log logutils.Log, goenv *goutil.Env) (*Runner, error) {
+ icfg := cfg.Issues
+ excludePatterns := icfg.ExcludePatterns
+ if icfg.UseDefaultExcludes {
+ excludePatterns = append(excludePatterns, config.GetDefaultExcludePatternsStrings()...)
+ }
+
+ var excludeTotalPattern string
+ if len(excludePatterns) != 0 {
+ excludeTotalPattern = fmt.Sprintf("(%s)", strings.Join(excludePatterns, "|"))
+ }
+
+ skipFilesProcessor, err := processors.NewSkipFiles(cfg.Run.SkipFiles)
+ if err != nil {
+ return nil, err
+ }
+
+ skipDirs := append([]string{}, packages.StdExcludeDirRegexps...)
+ skipDirs = append(skipDirs, cfg.Run.SkipDirs...)
+ 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,
+ Path: r.Path,
+ Linters: r.Linters,
+ })
+ }
+
+ return &Runner{
+ Processors: []processors.Processor{
+ processors.NewPathPrettifier(), // must be before diff, nolint and exclude autogenerated processor at least
+ processors.NewCgo(goenv),
+ skipFilesProcessor,
+ skipDirsProcessor, // must be after path prettifier
+
+ processors.NewAutogeneratedExclude(astCache),
+ processors.NewIdentifierMarker(), // must be befor exclude
+ processors.NewExclude(excludeTotalPattern),
+ processors.NewExcludeRules(excludeRules),
+ processors.NewNolint(astCache, log.Child("nolint")),
+
+ processors.NewUniqByLine(),
+ 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(log.Child("source_code")),
+ processors.NewReplacementBuilder(log.Child("replacement_builder")), // must be after source code
+ processors.NewPathShortener(),
+ },
+ Log: log,
+ }, nil
+}
+
+type lintRes struct {
+ linter *linter.Config
+ err error
+ issues []result.Issue
+}
+
+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 {
+ err = fmt.Errorf("panic occurred: %s", panicData)
+ r.Log.Warnf("Panic stack trace: %s", debug.Stack())
+ }
+ }()
+
+ specificLintCtx := *lintCtx
+ specificLintCtx.Log = r.Log.Child(lc.Name())
+ issues, err := lc.Linter.Run(ctx, &specificLintCtx)
+ if err != nil {
+ return nil, err
+ }
+
+ for _, i := range issues {
+ i.FromLinter = lc.Name()
+ }
+
+ return issues, nil
+}
+
+func (r Runner) runWorker(ctx context.Context, lintCtx *linter.Context,
+ tasksCh <-chan *linter.Config, lintResultsCh chan<- lintRes, name string) {
+
+ sw := timeutils.NewStopwatch(name, r.Log)
+ defer sw.Print()
+
+ for {
+ select {
+ case <-ctx.Done():
+ return
+ case lc, ok := <-tasksCh:
+ if !ok {
+ return
+ }
+ if ctx.Err() != nil {
+ // XXX: if check it in only int a select
+ // it's possible to not enter to this case until tasksCh is empty.
+ return
+ }
+ var issues []result.Issue
+ var err error
+ sw.TrackStage(lc.Name(), func() {
+ issues, err = r.runLinterSafe(ctx, lintCtx, lc)
+ })
+ lintResultsCh <- lintRes{
+ linter: lc,
+ err: err,
+ issues: issues,
+ }
+ }
+ }
+}
+
+func (r Runner) logWorkersStat(workersFinishTimes []time.Time) {
+ lastFinishTime := workersFinishTimes[0]
+ for _, t := range workersFinishTimes {
+ if t.After(lastFinishTime) {
+ lastFinishTime = t
+ }
+ }
+
+ logStrings := []string{}
+ for i, t := range workersFinishTimes {
+ if t.Equal(lastFinishTime) {
+ continue
+ }
+
+ logStrings = append(logStrings, fmt.Sprintf("#%d: %s", i+1, lastFinishTime.Sub(t)))
+ }
+
+ r.Log.Infof("Workers idle times: %s", strings.Join(logStrings, ", "))
+}
+
+func getSortedLintersConfigs(linters []*linter.Config) []*linter.Config {
+ ret := make([]*linter.Config, len(linters))
+ copy(ret, linters)
+
+ sort.Slice(ret, func(i, j int) bool {
+ return ret[i].GetSpeed() < ret[j].GetSpeed()
+ })
+
+ return ret
+}
+
+func (r *Runner) runWorkers(ctx context.Context, lintCtx *linter.Context, linters []*linter.Config) <-chan lintRes {
+ tasksCh := make(chan *linter.Config, len(linters))
+ lintResultsCh := make(chan lintRes, len(linters))
+ var wg sync.WaitGroup
+
+ workersFinishTimes := make([]time.Time, lintCtx.Cfg.Run.Concurrency)
+
+ for i := 0; i < lintCtx.Cfg.Run.Concurrency; i++ {
+ wg.Add(1)
+ go func(i int) {
+ defer wg.Done()
+ name := fmt.Sprintf("worker.%d", i+1)
+ r.runWorker(ctx, lintCtx, tasksCh, lintResultsCh, name)
+ workersFinishTimes[i] = time.Now()
+ }(i)
+ }
+
+ lcs := getSortedLintersConfigs(linters)
+ for _, lc := range lcs {
+ tasksCh <- lc
+ }
+ close(tasksCh)
+
+ go func() {
+ wg.Wait()
+ close(lintResultsCh)
+
+ r.logWorkersStat(workersFinishTimes)
+ }()
+
+ return lintResultsCh
+}
+
+func (r Runner) processLintResults(inCh <-chan lintRes) <-chan lintRes {
+ outCh := make(chan lintRes, 64)
+
+ go func() {
+ sw := timeutils.NewStopwatch("processing", r.Log)
+
+ var issuesBefore, issuesAfter int
+ defer close(outCh)
+
+ for res := range inCh {
+ if res.err != nil {
+ r.Log.Warnf("Can't run linter %s: %s", res.linter.Name(), res.err)
+ continue
+ }
+
+ if len(res.issues) != 0 {
+ issuesBefore += len(res.issues)
+ res.issues = r.processIssues(res.issues, sw)
+ issuesAfter += len(res.issues)
+ outCh <- res
+ }
+ }
+
+ // 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)
+ }
+ sw.PrintStages()
+ }()
+
+ return outCh
+}
+
+func collectIssues(resCh <-chan lintRes) <-chan result.Issue {
+ retIssues := make(chan result.Issue, 1024)
+ go func() {
+ defer close(retIssues)
+
+ for res := range resCh {
+ if len(res.issues) == 0 {
+ continue
+ }
+
+ for _, i := range res.issues {
+ retIssues <- i
+ }
+ }
+ }()
+
+ return retIssues
+}
+
+func (r Runner) Run(ctx context.Context, linters []*linter.Config, lintCtx *linter.Context) <-chan result.Issue {
+ lintResultsCh := r.runWorkers(ctx, lintCtx, linters)
+ processedLintResultsCh := r.processLintResults(lintResultsCh)
+ if ctx.Err() != nil {
+ // XXX: always process issues, even if timeout occurred
+ finishedLintersN := 0
+ for range processedLintResultsCh {
+ finishedLintersN++
+ }
+
+ r.Log.Errorf("%d/%d linters finished: deadline exceeded",
+ finishedLintersN, len(linters))
+ }
+
+ return collectIssues(processedLintResultsCh)
+}
+
+func (r *Runner) processIssues(issues []result.Issue, sw *timeutils.Stopwatch) []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 {
+ 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 00000000000..178075bc464
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/log.go
@@ -0,0 +1,32 @@
+package logutils
+
+//go:generate mockgen -package logutils -source log.go -destination log_mock.go
+
+type Log interface {
+ Fatalf(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 message, 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/log_mock.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/log_mock.go
new file mode 100644
index 00000000000..5e7a50c26ae
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/log_mock.go
@@ -0,0 +1,115 @@
+// Code generated by MockGen. DO NOT EDIT.
+// Source: log.go
+
+package logutils
+
+import (
+ reflect "reflect"
+
+ gomock "github.com/golang/mock/gomock"
+)
+
+// MockLog is a mock of Log interface
+type MockLog struct {
+ ctrl *gomock.Controller
+ recorder *MockLogMockRecorder
+}
+
+// MockLogMockRecorder is the mock recorder for MockLog
+type MockLogMockRecorder struct {
+ mock *MockLog
+}
+
+// NewMockLog creates a new mock instance
+func NewMockLog(ctrl *gomock.Controller) *MockLog {
+ mock := &MockLog{ctrl: ctrl}
+ mock.recorder = &MockLogMockRecorder{mock}
+ return mock
+}
+
+// EXPECT returns an object that allows the caller to indicate expected use
+func (_m *MockLog) EXPECT() *MockLogMockRecorder {
+ return _m.recorder
+}
+
+// Fatalf mocks base method
+func (_m *MockLog) Fatalf(format string, args ...interface{}) {
+ _s := []interface{}{format}
+ for _, _x := range args {
+ _s = append(_s, _x)
+ }
+ _m.ctrl.Call(_m, "Fatalf", _s...)
+}
+
+// Fatalf indicates an expected call of Fatalf
+func (_mr *MockLogMockRecorder) Fatalf(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
+ _s := append([]interface{}{arg0}, arg1...)
+ return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "Fatalf", reflect.TypeOf((*MockLog)(nil).Fatalf), _s...)
+}
+
+// Errorf mocks base method
+func (_m *MockLog) Errorf(format string, args ...interface{}) {
+ _s := []interface{}{format}
+ for _, _x := range args {
+ _s = append(_s, _x)
+ }
+ _m.ctrl.Call(_m, "Errorf", _s...)
+}
+
+// Errorf indicates an expected call of Errorf
+func (_mr *MockLogMockRecorder) Errorf(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
+ _s := append([]interface{}{arg0}, arg1...)
+ return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "Errorf", reflect.TypeOf((*MockLog)(nil).Errorf), _s...)
+}
+
+// Warnf mocks base method
+func (_m *MockLog) Warnf(format string, args ...interface{}) {
+ _s := []interface{}{format}
+ for _, _x := range args {
+ _s = append(_s, _x)
+ }
+ _m.ctrl.Call(_m, "Warnf", _s...)
+}
+
+// Warnf indicates an expected call of Warnf
+func (_mr *MockLogMockRecorder) Warnf(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
+ _s := append([]interface{}{arg0}, arg1...)
+ return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "Warnf", reflect.TypeOf((*MockLog)(nil).Warnf), _s...)
+}
+
+// Infof mocks base method
+func (_m *MockLog) Infof(format string, args ...interface{}) {
+ _s := []interface{}{format}
+ for _, _x := range args {
+ _s = append(_s, _x)
+ }
+ _m.ctrl.Call(_m, "Infof", _s...)
+}
+
+// Infof indicates an expected call of Infof
+func (_mr *MockLogMockRecorder) Infof(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
+ _s := append([]interface{}{arg0}, arg1...)
+ return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "Infof", reflect.TypeOf((*MockLog)(nil).Infof), _s...)
+}
+
+// Child mocks base method
+func (_m *MockLog) Child(name string) Log {
+ ret := _m.ctrl.Call(_m, "Child", name)
+ ret0, _ := ret[0].(Log)
+ return ret0
+}
+
+// Child indicates an expected call of Child
+func (_mr *MockLogMockRecorder) Child(arg0 interface{}) *gomock.Call {
+ return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "Child", reflect.TypeOf((*MockLog)(nil).Child), arg0)
+}
+
+// SetLevel mocks base method
+func (_m *MockLog) SetLevel(level LogLevel) {
+ _m.ctrl.Call(_m, "SetLevel", level)
+}
+
+// SetLevel indicates an expected call of SetLevel
+func (_mr *MockLogMockRecorder) SetLevel(arg0 interface{}) *gomock.Call {
+ return _mr.mock.ctrl.RecordCallWithMethodType(_mr.mock, "SetLevel", reflect.TypeOf((*MockLog)(nil).SetLevel), arg0)
+}
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 00000000000..7dd23e234e0
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/logutils.go
@@ -0,0 +1,48 @@
+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
+ }
+
+ return func(format string, args ...interface{}) {
+ logger := NewStderrLog(tag)
+ logger.SetLevel(LogLevelDebug)
+ 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/out.go b/vendor/github.com/golangci/golangci-lint/pkg/logutils/out.go
new file mode 100644
index 00000000000..67c70dc8f28
--- /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 00000000000..10a3ed03dac
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/logutils/stderr_log.go
@@ -0,0 +1,99 @@
+package logutils
+
+import (
+ "fmt"
+ "os"
+
+ "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,
+ }
+
+ // control log level in logutils, not in logrus
+ sl.logger.SetLevel(logrus.DebugLevel)
+ sl.logger.Out = StdErr
+ sl.logger.Formatter = &logrus.TextFormatter{
+ DisableTimestamp: true, // `INFO[0007] msg` -> `INFO msg`
+ }
+ 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) 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 00000000000..72fb8601ab7
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/packages/errors.go
@@ -0,0 +1,38 @@
+package packages
+
+import (
+ "fmt"
+ "go/token"
+ "strconv"
+ "strings"
+
+ "github.com/pkg/errors"
+)
+
+func ParseErrorPosition(pos string) (*token.Position, error) {
+ // file:line(: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 00000000000..cdd327f5d88
--- /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 00000000000..6d368ac6fdd
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/packages/util.go
@@ -0,0 +1,74 @@
+package packages
+
+import (
+ "fmt"
+
+ "github.com/golangci/golangci-lint/pkg/lint/astcache"
+
+ "golang.org/x/tools/go/packages"
+)
+
+//nolint:gocyclo
+func ExtractErrors(pkg *packages.Package, astCache *astcache.Cache) []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 {
+ errPos, parseErr := ParseErrorPosition(uniqErrors[i].Pos)
+ if parseErr != nil || astCache.Get(errPos.Filename) == 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 00000000000..8853b6eef3a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/checkstyle.go
@@ -0,0 +1,79 @@
+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 <-chan result.Issue) error {
+ out := checkstyleOutput{
+ Version: "5.0",
+ }
+
+ files := map[string]*checkstyleFile{}
+
+ for issue := range issues {
+ 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 00000000000..0faebe329fb
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/codeclimate.go
@@ -0,0 +1,56 @@
+package printers
+
+import (
+ "context"
+ "crypto/md5"
+ "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 <-chan result.Issue) error {
+ allIssues := []CodeClimateIssue{}
+ for i := range issues {
+ 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
+ hash := md5.New()
+ _, _ = hash.Write([]byte(i.Pos.Filename + i.Text + i.SourceLines[0]))
+ 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/json.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/json.go
new file mode 100644
index 00000000000..c3778fd3e5a
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/json.go
@@ -0,0 +1,46 @@
+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 <-chan result.Issue) error {
+ allIssues := []result.Issue{}
+ for i := range issues {
+ allIssues = append(allIssues, i)
+ }
+
+ res := JSONResult{
+ Issues: allIssues,
+ 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/printer.go b/vendor/github.com/golangci/golangci-lint/pkg/printers/printer.go
new file mode 100644
index 00000000000..a063bd91484
--- /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 <-chan 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 00000000000..5045d771c33
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/tab.go
@@ -0,0 +1,59 @@
+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 <-chan result.Issue) error {
+ w := tabwriter.NewWriter(logutils.StdOut, 0, 0, 2, ' ', 0)
+
+ for i := range issues {
+ i := i
+ p.printIssue(&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 00000000000..c0cc5e2c844
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/printers/text.go
@@ -0,0 +1,91 @@
+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 <-chan result.Issue) error {
+ for i := range issues {
+ i := i
+ p.printIssue(&i)
+
+ if !p.printIssuedLine {
+ continue
+ }
+
+ p.printSourceCode(&i)
+ p.printUnderLinePointer(&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 00000000000..f083fa9f518
--- /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 00000000000..c18007a6daa
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/report/log.go
@@ -0,0 +1,60 @@
+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) 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 00000000000..dd1442789f9
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/issue.go
@@ -0,0 +1,59 @@
+package result
+
+import "go/token"
+
+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
+}
+
+type Issue struct {
+ FromLinter string
+ Text string
+
+ Pos token.Position
+ LineRange *Range `json:",omitempty"`
+
+ // HunkPos is used only when golangci-lint is run over a diff
+ HunkPos int `json:",omitempty"`
+
+ // 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
+}
+
+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 00000000000..aa8c01f3023
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/autogenerated_exclude.go
@@ -0,0 +1,151 @@
+package processors
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/lint/astcache"
+ "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
+ astCache *astcache.Cache
+}
+
+func NewAutogeneratedExclude(astCache *astcache.Cache) *AutogeneratedExclude {
+ return &AutogeneratedExclude{
+ fileSummaryCache: ageFileSummaryCache{},
+ astCache: astCache,
+ }
+}
+
+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 (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
+ }
+
+ 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")
+ }
+
+ f := p.astCache.Get(i.FilePath())
+ if f == nil || f.Err != nil {
+ return nil, fmt.Errorf("can't parse file %s: %v", i.FilePath(), f)
+ }
+
+ autogenDebugf("file %q: astcache file is %+v", i.FilePath(), *f)
+
+ doc := getDoc(f.F, f.Fset, i.FilePath())
+
+ fs.isGenerated = isGeneratedFileByComment(doc)
+ autogenDebugf("file %q is generated: %t", i.FilePath(), fs.isGenerated)
+ return fs, nil
+}
+
+func getDoc(f *ast.File, fset *token.FileSet, filePath string) string {
+ // don't use just f.Doc: e.g. mockgen leaves extra line between comment and package name
+
+ var importPos token.Pos
+ if len(f.Imports) != 0 {
+ importPos = f.Imports[0].Pos()
+ autogenDebugf("file %q: search comments until first import pos %d (%s)",
+ filePath, importPos, fset.Position(importPos))
+ } else {
+ importPos = f.End()
+ autogenDebugf("file %q: search comments until EOF pos %d (%s)",
+ filePath, importPos, fset.Position(importPos))
+ }
+
+ var neededComments []string
+ for _, g := range f.Comments {
+ pos := g.Pos()
+ filePos := fset.Position(pos)
+ text := g.Text()
+
+ // 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
+ isCgoGenerated := strings.Contains(text, "Created by cgo") || strings.Contains(text, "Code generated by cmd/cgo")
+
+ isAllowed := pos < importPos && filePos.Column == 1 && !isCgoGenerated
+ if isAllowed {
+ autogenDebugf("file %q: pos=%d, filePos=%s: comment %q: it's allowed", filePath, pos, filePos, text)
+ neededComments = append(neededComments, text)
+ } else {
+ autogenDebugf("file %q: pos=%d, filePos=%s: comment %q: it's NOT allowed", filePath, pos, filePos, text)
+ }
+ }
+
+ autogenDebugf("file %q: got %d allowed comments", filePath, len(neededComments))
+
+ if len(neededComments) == 0 {
+ return ""
+ }
+
+ return strings.Join(neededComments, "\n")
+}
+
+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 00000000000..2ce45877723
--- /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("GOCACHE"),
+ }
+}
+
+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 00000000000..fc4aba4b939
--- /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 00000000000..80c4b8945d6
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude.go
@@ -0,0 +1,39 @@
+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() {}
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 00000000000..e7dc7f39e52
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/exclude_rules.go
@@ -0,0 +1,84 @@
+package processors
+
+import (
+ "regexp"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type excludeRule struct {
+ text *regexp.Regexp
+ path *regexp.Regexp
+ linters []string
+}
+
+func (r *excludeRule) isEmpty() bool {
+ return r.text == nil && r.path == nil && len(r.linters) == 0
+}
+
+func (r excludeRule) Match(i *result.Issue) 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 {
+ return true
+ }
+ for _, l := range r.linters {
+ if l == i.FromLinter {
+ return true
+ }
+ }
+ return false
+}
+
+type ExcludeRule struct {
+ Text string
+ Path string
+ Linters []string
+}
+
+func NewExcludeRules(rules []ExcludeRule) *ExcludeRules {
+ r := new(ExcludeRules)
+ for _, rule := range rules {
+ parsedRule := excludeRule{
+ linters: rule.Linters,
+ }
+ if rule.Text != "" {
+ parsedRule.text = regexp.MustCompile("(?i)" + rule.Text)
+ }
+ if rule.Path != "" {
+ parsedRule.path = regexp.MustCompile(rule.Path)
+ }
+ r.rules = append(r.rules, parsedRule)
+ }
+ return r
+}
+
+type ExcludeRules struct {
+ rules []excludeRule
+}
+
+func (r ExcludeRules) Process(issues []result.Issue) ([]result.Issue, error) {
+ if len(r.rules) == 0 {
+ return issues, nil
+ }
+ return filterIssues(issues, func(i *result.Issue) bool {
+ for _, rule := range r.rules {
+ if rule.Match(i) {
+ return false
+ }
+ }
+ return true
+ }), nil
+}
+
+func (ExcludeRules) Name() string { return "exclude-rules" }
+func (ExcludeRules) Finish() {}
+
+var _ Processor = ExcludeRules{}
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 00000000000..599f1aa4185
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/fixer.go
@@ -0,0 +1,149 @@
+package processors
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+
+ "github.com/pkg/errors"
+
+ "github.com/golangci/golangci-lint/pkg/config"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type Fixer struct {
+ cfg *config.Config
+ log logutils.Log
+}
+
+func NewFixer(cfg *config.Config, log logutils.Log) *Fixer {
+ return &Fixer{cfg: cfg, log: log}
+}
+
+func (f Fixer) Process(issues <-chan result.Issue) <-chan result.Issue {
+ if !f.cfg.Issues.NeedFix {
+ return issues
+ }
+
+ outCh := make(chan result.Issue, 1024)
+
+ go func() {
+ issuesToFixPerFile := map[string][]result.Issue{}
+ for issue := range issues {
+ if issue.Replacement == nil {
+ outCh <- issue
+ continue
+ }
+
+ issuesToFixPerFile[issue.FilePath()] = append(issuesToFixPerFile[issue.FilePath()], issue)
+ }
+
+ for file, issuesToFix := range issuesToFixPerFile {
+ if err := f.fixIssuesInFile(file, issuesToFix); err != nil {
+ f.log.Errorf("Failed to fix issues in file %s: %s", file, err)
+
+ // show issues only if can't fix them
+ for _, issue := range issuesToFix {
+ outCh <- issue
+ }
+ }
+ }
+ close(outCh)
+ }()
+
+ return outCh
+}
+
+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 := ioutil.ReadFile(filePath)
+ if err != nil {
+ return errors.Wrapf(err, "failed to read %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)
+ }
+
+ 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) findNotIntersectingIssues(issues []result.Issue) []result.Issue {
+ sort.SliceStable(issues, func(i, j int) bool {
+ return issues[i].Line() < issues[j].Line() //nolint:scopelint
+ })
+
+ var ret []result.Issue
+ var currentEnd int
+ for _, issue := range issues {
+ 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.Line() {
+ outLine = string(origFileLines[i])
+ } else {
+ nextIssueIndex++
+ rng := nextIssue.GetLineRange()
+ 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 00000000000..2d1fb580cbf
--- /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
+ {`^(\S+) arg list ends with redundant newline$`, "`${1}` arg list ends with redundant newline"},
+ {`^(\S+) composite literal uses unkeyed fields$`, "`${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 00000000000..0129cc8c631
--- /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
+ }
+
+ if p.cfg.Issues.NeedFix {
+ // we need to fix all issues at once => we need to return all of them
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ 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 00000000000..e9842966b5a
--- /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{}, //nolint:goimports,gofmt
+ 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 00000000000..4f0af44df57
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/max_same_issues.go
@@ -0,0 +1,82 @@
+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
+ }
+
+ if p.cfg.Issues.NeedFix {
+ // we need to fix all issues at once => we need to return all of them
+ return issues, nil
+ }
+
+ return filterIssues(issues, func(i *result.Issue) bool {
+ 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 00000000000..a4a2593631c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/nolint.go
@@ -0,0 +1,256 @@
+package processors
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "sort"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/lint/astcache"
+ "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
+ result.Range
+ col int
+}
+
+func (i *ignoredRange) doesMatch(issue *result.Issue) bool {
+ if issue.Line() < i.From || issue.Line() > i.To {
+ return false
+ }
+
+ 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
+ astCache *astcache.Cache
+ dbManager *lintersdb.Manager
+ log logutils.Log
+
+ unknownLintersSet map[string]bool
+}
+
+func NewNolint(astCache *astcache.Cache, log logutils.Log) *Nolint {
+ return &Nolint{
+ cache: filesCache{},
+ astCache: astCache,
+ dbManager: lintersdb.NewManager(), // TODO: get it in constructor
+ 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) {
+ 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")
+ }
+
+ file := p.astCache.Get(i.FilePath())
+ if file == nil || file.Err != nil {
+ return nil, fmt.Errorf("can't parse file %s: %v, astcache is %v", i.FilePath(), file, p.astCache.ParsedFilenames())
+ }
+
+ fd.ignoredRanges = p.buildIgnoredRangesForFile(file.F, file.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) {
+ fd, err := p.getOrCreateFileData(i)
+ if err != nil {
+ return false, err
+ }
+
+ for _, ir := range fd.ignoredRanges {
+ if ir.doesMatch(i) {
+ 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,
+ }
+ }
+
+ 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))
+ metaLinter := p.dbManager.GetMetaLinter(linterName)
+ if metaLinter != nil {
+ // user can set metalinter name in nolint directive (e.g. megacheck), then
+ // we should add to nolint all the metalinter's default children
+ linters = append(linters, metaLinter.DefaultChildLinterNames()...)
+ continue
+ }
+
+ lc := p.dbManager.GetLinterConfig(linterName)
+ if lc == nil {
+ p.unknownLintersSet[linterName] = true
+ gotUnknownLinters = true
+ continue
+ }
+
+ 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, ", "))
+}
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 00000000000..3a140999c02
--- /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 00000000000..484f7f1f115
--- /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 00000000000..1daec62ea19
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/processor.go
@@ -0,0 +1,9 @@
+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/replacement_builder.go b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/replacement_builder.go
new file mode 100644
index 00000000000..352fb66d6a2
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/replacement_builder.go
@@ -0,0 +1,92 @@
+package processors
+
+import (
+ "fmt"
+ "regexp"
+ "strings"
+
+ "github.com/golangci/golangci-lint/pkg/golinters"
+ "github.com/golangci/golangci-lint/pkg/logutils"
+
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type ReplacementBuilder struct {
+ log logutils.Log
+}
+
+func NewReplacementBuilder(log logutils.Log) *ReplacementBuilder {
+ return &ReplacementBuilder{log: log}
+}
+
+func (p ReplacementBuilder) Process(issues []result.Issue) ([]result.Issue, error) {
+ return transformIssues(issues, p.processIssue), nil
+}
+
+func (p ReplacementBuilder) processIssue(i *result.Issue) *result.Issue {
+ misspellName := golinters.Misspell{}.Name()
+ if i.FromLinter == misspellName {
+ newIssue, err := p.processMisspellIssue(i)
+ if err != nil {
+ p.log.Warnf("Failed to build replacement for misspell issue: %s", err)
+ return i
+ }
+ return newIssue
+ }
+
+ return i
+}
+
+func (p ReplacementBuilder) processMisspellIssue(i *result.Issue) (*result.Issue, error) {
+ if len(i.SourceLines) != 1 {
+ return nil, fmt.Errorf("invalid count of source lines: %d", len(i.SourceLines))
+ }
+ sourceLine := i.SourceLines[0]
+
+ if i.Column() <= 0 {
+ return nil, fmt.Errorf("invalid column %d", i.Column())
+ }
+ col0 := i.Column() - 1
+ if col0 >= len(sourceLine) {
+ return nil, fmt.Errorf("too big column %d", i.Column())
+ }
+
+ issueTextRE := regexp.MustCompile("`(.+)` is a misspelling of `(.+)`")
+ submatches := issueTextRE.FindStringSubmatch(i.Text)
+ if len(submatches) != 3 {
+ return nil, fmt.Errorf("invalid count of submatches %d", len(submatches))
+ }
+
+ from, to := submatches[1], submatches[2]
+ if !strings.HasPrefix(sourceLine[col0:], from) {
+ return nil, fmt.Errorf("invalid prefix of source line `%s`", sourceLine)
+ }
+
+ newSourceLine := ""
+ if col0 != 0 {
+ newSourceLine += sourceLine[:col0]
+ }
+
+ newSourceLine += to
+
+ sourceLineFromEnd := col0 + len(from)
+ if sourceLineFromEnd < len(sourceLine) {
+ newSourceLine += sourceLine[sourceLineFromEnd:]
+ }
+
+ if i.Replacement != nil {
+ return nil, fmt.Errorf("issue replacement isn't nil")
+ }
+
+ iCopy := *i
+ iCopy.Replacement = &result.Replacement{
+ NewLines: []string{newSourceLine},
+ }
+ return &iCopy, nil
+}
+
+func (p ReplacementBuilder) Name() string {
+ return "replacement_builder"
+}
+
+func (p ReplacementBuilder) 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 00000000000..3dc43bf4925
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_dirs.go
@@ -0,0 +1,114 @@
+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 SkipDirs struct {
+ patterns []*regexp.Regexp
+ log logutils.Log
+ skippedDirs map[string][]string // regexp to dir mapping
+ absArgsDirs []string
+}
+
+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 {
+ 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][]string{},
+ absArgsDirs: absArgsDirs,
+ }, 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()) {
+ p.log.Warnf("Got abs path in skip dirs processor, it should be relative")
+ return true
+ }
+
+ issueRelDir := filepath.Dir(i.FilePath())
+ issueAbsDir, err := filepath.Abs(issueRelDir)
+ if err != nil {
+ p.log.Warnf("Can't abs-ify path %q: %s", issueRelDir, err)
+ return true
+ }
+
+ 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()
+ p.skippedDirs[ps] = append(p.skippedDirs[ps], issueRelDir)
+ return false
+ }
+ }
+
+ return true
+}
+
+func (p SkipDirs) Finish() {
+ for pattern, dirs := range p.skippedDirs {
+ p.log.Infof("Skipped by pattern %s dirs: %s", pattern, dirs)
+ }
+}
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 00000000000..92fd1a29be3
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/skip_files.go
@@ -0,0 +1,51 @@
+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 {
+ 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 00000000000..44710a0d9c1
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/source_code.go
@@ -0,0 +1,81 @@
+package processors
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type linesCache [][]byte
+type filesLineCache map[string]linesCache
+
+type SourceCode struct {
+ cache filesLineCache
+ log logutils.Log
+}
+
+var _ Processor = SourceCode{}
+
+func NewSourceCode(log logutils.Log) *SourceCode {
+ return &SourceCode{
+ cache: filesLineCache{},
+ 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 {
+ lines, err := p.getFileLinesForIssue(i)
+ if err != nil {
+ p.log.Warnf("Failed to get lines for file %s: %s", i.FilePath(), err)
+ return i
+ }
+
+ newI := *i
+
+ lineRange := i.GetLineRange()
+ var lineStr string
+ for line := lineRange.From; line <= lineRange.To; line++ {
+ if line == 0 { // some linters, e.g. gosec can do it: it really means first line
+ line = 1
+ }
+
+ zeroIndexedLine := line - 1
+ if zeroIndexedLine >= len(lines) {
+ p.log.Warnf("No line %d in file %s", line, i.FilePath())
+ break
+ }
+
+ lineStr = string(bytes.Trim(lines[zeroIndexedLine], "\r"))
+ newI.SourceLines = append(newI.SourceLines, lineStr)
+ }
+
+ return &newI
+ }), nil
+}
+
+func (p *SourceCode) getFileLinesForIssue(i *result.Issue) (linesCache, error) {
+ fc := p.cache[i.FilePath()]
+ if fc != nil {
+ return fc, nil
+ }
+
+ // TODO: make more optimal algorithm: don't load all files into memory
+ fileBytes, err := ioutil.ReadFile(i.FilePath())
+ if err != nil {
+ return nil, fmt.Errorf("can't read file %s for printing issued line: %s", i.FilePath(), err)
+ }
+ lines := bytes.Split(fileBytes, []byte("\n")) // TODO: what about \r\n?
+ fc = lines
+ p.cache[i.FilePath()] = fc
+ return fc, 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 00000000000..402ed5e2475
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/uniq_by_line.go
@@ -0,0 +1,45 @@
+package processors
+
+import (
+ "github.com/golangci/golangci-lint/pkg/result"
+)
+
+type lineToCount map[int]int
+type fileToLineToCount map[string]lineToCount
+
+type UniqByLine struct {
+ flc fileToLineToCount
+}
+
+func NewUniqByLine() *UniqByLine {
+ return &UniqByLine{
+ flc: fileToLineToCount{},
+ }
+}
+
+var _ Processor = &UniqByLine{}
+
+func (p UniqByLine) Name() string {
+ return "uniq_by_line"
+}
+
+func (p *UniqByLine) Process(issues []result.Issue) ([]result.Issue, error) {
+ return filterIssues(issues, func(i *result.Issue) bool {
+ 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 00000000000..9d8ff9343dc
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/result/processors/utils.go
@@ -0,0 +1,49 @@
+package processors
+
+import (
+ "fmt"
+
+ "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 {
+ i := i
+ if filter(&i) {
+ retIssues = append(retIssues, 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 {
+ i := i
+ ok, err := filter(&i)
+ if err != nil {
+ return nil, fmt.Errorf("can't filter issue %#v: %s", i, err)
+ }
+
+ if ok {
+ retIssues = append(retIssues, 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 {
+ i := i
+ newI := transform(&i)
+ if newI != nil {
+ retIssues = append(retIssues, *newI)
+ }
+ }
+
+ return retIssues
+}
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 00000000000..4390bf35a93
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go
@@ -0,0 +1,80 @@
+package timeutils
+
+import (
+ "fmt"
+ "sort"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+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) sprintStages() string {
+ 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
+ })
+ 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) 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) 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/golangci-lint/pkg/timeutils/track.go b/vendor/github.com/golangci/golangci-lint/pkg/timeutils/track.go
new file mode 100644
index 00000000000..ada1b9a4a7c
--- /dev/null
+++ b/vendor/github.com/golangci/golangci-lint/pkg/timeutils/track.go
@@ -0,0 +1,12 @@
+package timeutils
+
+import (
+ "fmt"
+ "time"
+
+ "github.com/golangci/golangci-lint/pkg/logutils"
+)
+
+func Track(from time.Time, log logutils.Log, format string, args ...interface{}) {
+ log.Infof("%s took %s", fmt.Sprintf(format, args...), time.Since(from))
+}
diff --git a/vendor/github.com/golangci/gosec/.gitignore b/vendor/github.com/golangci/gosec/.gitignore
new file mode 100644
index 00000000000..ee144d51b84
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/.gitignore
@@ -0,0 +1,31 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+*.swp
+
+# Folders
+_obj
+_test
+vendor
+dist
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.test
+*.prof
+
+.DS_Store
+
+.vscode
diff --git a/vendor/github.com/golangci/gosec/.goreleaser.yml b/vendor/github.com/golangci/gosec/.goreleaser.yml
new file mode 100644
index 00000000000..3112dc8dedf
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/.goreleaser.yml
@@ -0,0 +1,17 @@
+builds:
+ - main : ./cmd/gosec/
+ binary: gosec
+ goos:
+ - darwin
+ - linux
+ - windows
+ goarch:
+ - amd64
+ ldflags: -X main.Version={{.Version}} -X main.GitTag={{.Tag}} -X main.BuildDate={{.Date}}
+ env:
+ - CGO_ENABLED=0
+
+archive:
+ files:
+ - README.md
+ - LICENSE.txt
diff --git a/vendor/github.com/golangci/gosec/.travis.yml b/vendor/github.com/golangci/gosec/.travis.yml
new file mode 100644
index 00000000000..6a6a96eb648
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/.travis.yml
@@ -0,0 +1,19 @@
+language: go
+
+go:
+ - 1.9
+ - "1.10"
+ - tip
+
+install:
+ - go get -u github.com/golang/dep/cmd/dep
+ - go get -u github.com/golang/lint/golint
+ - go get -u github.com/onsi/ginkgo/ginkgo
+ - go get -u github.com/onsi/gomega
+ - go get -u golang.org/x/crypto/ssh
+ - go get -u github.com/golangci/gosec/cmd/gosec/...
+ - go get -v -t ./...
+ - export PATH=$PATH:$HOME/gopath/bin
+
+script: make test
+
diff --git a/vendor/github.com/golangci/gosec/Dockerfile b/vendor/github.com/golangci/gosec/Dockerfile
new file mode 100644
index 00000000000..8bdf4313f4e
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/Dockerfile
@@ -0,0 +1,10 @@
+FROM golang:1.10.3-alpine3.8
+
+ENV BIN=gosec
+ENV GOROOT=/usr/local/go
+ENV GOPATH=/go
+
+COPY $BIN /go/bin/$BIN
+COPY docker-entrypoint.sh /usr/local/bin
+
+ENTRYPOINT ["docker-entrypoint.sh"]
diff --git a/vendor/github.com/golangci/gosec/Gopkg.lock b/vendor/github.com/golangci/gosec/Gopkg.lock
new file mode 100644
index 00000000000..ff4f2ac7b89
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/Gopkg.lock
@@ -0,0 +1,165 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+ digest = "1:39170dcf72d0ac5933791daaf27a80782c24e9946cdc60fe98928d9429a9726d"
+ name = "github.com/kisielk/gotool"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "0de1eaf82fa3f583ce21fde859f1e7e0c5e9b220"
+
+[[projects]]
+ branch = "master"
+ digest = "1:bdb092d0984bf77804e133403f739ad84b16abaa256e21f5e7b88aabbb6d546b"
+ name = "github.com/mozilla/tls-observatory"
+ packages = ["constants"]
+ pruneopts = "UT"
+ revision = "8791a200eb40f8625a152bfb8336171305f5f35c"
+
+[[projects]]
+ digest = "1:0a32435e3f12b75f2c0cd806c5b21fb92e29f70e5f76880dc852bba5e10f6585"
+ name = "github.com/nbutton23/zxcvbn-go"
+ packages = [
+ ".",
+ "adjacency",
+ "data",
+ "entropy",
+ "frequency",
+ "match",
+ "matching",
+ "scoring",
+ "utils/math",
+ ]
+ pruneopts = "UT"
+ revision = "a22cb81b2ecdde8b68e9ffb8824731cbf88e1de4"
+
+[[projects]]
+ digest = "1:e54fe200d15850589f578095e5b23ed0afb8d44fb39122e63b5195cbd3858f30"
+ name = "github.com/onsi/ginkgo"
+ packages = [
+ ".",
+ "config",
+ "internal/codelocation",
+ "internal/containernode",
+ "internal/failer",
+ "internal/leafnodes",
+ "internal/remote",
+ "internal/spec",
+ "internal/spec_iterator",
+ "internal/specrunner",
+ "internal/suite",
+ "internal/testingtproxy",
+ "internal/writer",
+ "reporters",
+ "reporters/stenographer",
+ "reporters/stenographer/support/go-colorable",
+ "reporters/stenographer/support/go-isatty",
+ "types",
+ ]
+ pruneopts = "UT"
+ revision = "11459a886d9cd66b319dac7ef1e917ee221372c9"
+
+[[projects]]
+ digest = "1:e340739c2403b0e6ee006e83c375754f44c1a483b695eff1b588acf8c4824925"
+ name = "github.com/onsi/gomega"
+ packages = [
+ ".",
+ "format",
+ "internal/assertion",
+ "internal/asyncassertion",
+ "internal/oraclematcher",
+ "internal/testingtsupport",
+ "matchers",
+ "matchers/support/goraph/bipartitegraph",
+ "matchers/support/goraph/edge",
+ "matchers/support/goraph/node",
+ "matchers/support/goraph/util",
+ "types",
+ ]
+ pruneopts = "UT"
+ revision = "dcabb60a477c2b6f456df65037cb6708210fbb02"
+
+[[projects]]
+ branch = "master"
+ digest = "1:5b92d232e81c3e8eec282c92dcaa2e0e1ad3c23157be19a01b3e33f7e6e8d137"
+ name = "github.com/ryanuber/go-glob"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "256dc444b735e061061cf46c809487313d5b0065"
+
+[[projects]]
+ digest = "1:499075870f4939e64e9d93c84c5fdf9b6253ec6e89c5dcb0a69f91292d6a2b30"
+ name = "golang.org/x/net"
+ packages = [
+ "html",
+ "html/atom",
+ "html/charset",
+ ]
+ pruneopts = "UT"
+ revision = "8351a756f30f1297fe94bbf4b767ec589c6ea6d0"
+
+[[projects]]
+ digest = "1:dae112b8ead03c5ae8106611d0788be212309815b1885ff1667bd3a41d509a4e"
+ name = "golang.org/x/sys"
+ packages = ["unix"]
+ pruneopts = "UT"
+ revision = "164713f0dfcec4e80be8b53e1f0811f5f0d84578"
+
+[[projects]]
+ digest = "1:387e284158b231a5993cd01407562fc211f076a8904821db6993cf8dbf57b948"
+ name = "golang.org/x/text"
+ packages = [
+ "encoding",
+ "encoding/charmap",
+ "encoding/htmlindex",
+ "encoding/internal",
+ "encoding/internal/identifier",
+ "encoding/japanese",
+ "encoding/korean",
+ "encoding/simplifiedchinese",
+ "encoding/traditionalchinese",
+ "encoding/unicode",
+ "internal/gen",
+ "internal/tag",
+ "internal/utf8internal",
+ "language",
+ "runes",
+ "transform",
+ "unicode/cldr",
+ ]
+ pruneopts = "UT"
+ revision = "1cbadb444a806fd9430d14ad08967ed91da4fa0a"
+
+[[projects]]
+ digest = "1:96b9641eaaf0d03defe4e63d05e4711bf8066c543d4de838438244955811ff17"
+ name = "golang.org/x/tools"
+ packages = [
+ "go/ast/astutil",
+ "go/buildutil",
+ "go/loader",
+ ]
+ pruneopts = "UT"
+ revision = "e531a2a1c15f94033f6fa87666caeb19a688175f"
+
+[[projects]]
+ digest = "1:6570992c02a2137a20be83990a979b6fe892e20ecdc6b756449989b2a7efb8ae"
+ name = "gopkg.in/yaml.v2"
+ packages = ["."]
+ pruneopts = "UT"
+ revision = "eb3733d160e74a9c7e442f435eb3bea458e1d19f"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ input-imports = [
+ "github.com/kisielk/gotool",
+ "github.com/mozilla/tls-observatory/constants",
+ "github.com/nbutton23/zxcvbn-go",
+ "github.com/onsi/ginkgo",
+ "github.com/onsi/gomega",
+ "github.com/ryanuber/go-glob",
+ "golang.org/x/tools/go/loader",
+ "gopkg.in/yaml.v2",
+ ]
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/vendor/github.com/golangci/gosec/Gopkg.toml b/vendor/github.com/golangci/gosec/Gopkg.toml
new file mode 100644
index 00000000000..bc7319c93a0
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/Gopkg.toml
@@ -0,0 +1,38 @@
+# 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]]
+ branch = "master"
+ name = "github.com/mozilla/tls-observatory"
+
+[[constraint]]
+ branch = "master"
+ name = "github.com/ryanuber/go-glob"
+
+[prune]
+ go-tests = true
+ unused-packages = true
diff --git a/vendor/github.com/golangci/gosec/LICENSE.txt b/vendor/github.com/golangci/gosec/LICENSE.txt
new file mode 100644
index 00000000000..1756c782162
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/LICENSE.txt
@@ -0,0 +1,154 @@
+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:
+
+You must give any other recipients of the Work or Derivative Works a copy of
+this License; and You must cause any modified files to carry prominent notices
+stating that You changed the files; and 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 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
diff --git a/vendor/github.com/golangci/gosec/Makefile b/vendor/github.com/golangci/gosec/Makefile
new file mode 100644
index 00000000000..1aca3df6568
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/Makefile
@@ -0,0 +1,48 @@
+GIT_TAG?= $(shell git describe --always --tags)
+BIN = gosec
+FMT_CMD = $(gofmt -s -l -w $(find . -type f -name '*.go' -not -path './vendor/*') | tee /dev/stderr)
+IMAGE_REPO = securego
+BUILDFLAGS := ''
+CGO_ENABLED = 0
+
+default:
+ $(MAKE) bootstrap
+ $(MAKE) build
+
+bootstrap:
+ dep ensure
+
+test: bootstrap
+ test -z '$(FMT_CMD)'
+ go vet $(go list ./... | grep -v /vendor/)
+ golint -set_exit_status $(shell go list ./... | grep -v vendor)
+ gosec ./...
+ ginkgo -r -v
+
+build:
+ go build -o $(BIN) ./cmd/gosec/
+
+clean:
+ rm -rf build vendor dist
+ rm -f release image bootstrap $(BIN)
+
+release: bootstrap
+ @echo "Releasing the gosec binary..."
+ goreleaser release
+
+build-linux:
+ CGO_ENABLED=$(CGO_ENABLED) GOOS=linux GOARCH=amd64 go build -ldflags $(BUILDFLAGS) -o $(BIN) ./cmd/gosec/
+
+image: build-linux
+ @echo "Building the Docker image..."
+ docker build -t $(IMAGE_REPO)/$(BIN):$(GIT_TAG) .
+ docker tag $(IMAGE_REPO)/$(BIN):$(GIT_TAG) $(IMAGE_REPO)/$(BIN):latest
+ touch image
+
+image-push: image
+ @echo "Pushing the Docker image..."
+ docker push $(IMAGE_REPO)/$(BIN):$(GIT_TAG)
+ docker push $(IMAGE_REPO)/$(BIN):latest
+
+.PHONY: test build clean release image image-push
+
diff --git a/vendor/github.com/golangci/gosec/README.md b/vendor/github.com/golangci/gosec/README.md
new file mode 100644
index 00000000000..f161f1159ff
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/README.md
@@ -0,0 +1,205 @@
+
+
+## gosec -Golang Security Checker
+
+Inspects source code for security problems by scanning the Go AST.
+
+### License
+
+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 [here](http://www.apache.org/licenses/LICENSE-2.0).
+
+### Project status
+
+[![Build Status](https://travis-ci.org/securego/gosec.svg?branch=master)](https://travis-ci.org/securego/gosec)
+[![GoDoc](https://godoc.org/github.com/golangci/gosec?status.svg)](https://godoc.org/github.com/golangci/gosec)
+[![Slack](http://securego.herokuapp.com/badge.svg)](http://securego.herokuapp.com)
+
+
+### Install
+
+`$ go get github.com/golangci/gosec/cmd/gosec/...`
+
+### Usage
+
+Gosec can be configured to only run a subset of rules, to exclude certain file
+paths, and produce reports in different formats. By default all rules will be
+run against the supplied input files. To recursively scan from the current
+directory you can supply './...' as the input argument.
+
+#### Selecting rules
+
+By default gosec will run all rules against the supplied file paths. It is however possible to select a subset of rules to run via the '-include=' flag,
+or to specify a set of rules to explicitly exclude using the '-exclude=' flag.
+
+##### Available rules
+
+ - G101: Look for hardcoded credentials
+ - G102: Bind to all interfaces
+ - G103: Audit the use of unsafe block
+ - G104: Audit errors not checked
+ - G105: Audit the use of math/big.Int.Exp
+ - G106: Audit the use of ssh.InsecureIgnoreHostKey
+ - G201: SQL query construction using format string
+ - G202: SQL query construction using string concatenation
+ - G203: Use of unescaped data in HTML templates
+ - G204: Audit use of command execution
+ - G301: Poor file permissions used when creating a directory
+ - G302: Poor file permisions used with chmod
+ - G303: Creating tempfile using a predictable path
+ - G304: File path provided as taint input
+ - G305: File traversal when extracting zip archive
+ - G401: Detect the usage of DES, RC4, MD5 or SHA1
+ - G402: Look for bad TLS connection settings
+ - G403: Ensure minimum RSA key length of 2048 bits
+ - G404: Insecure random number source (rand)
+ - G501: Import blacklist: crypto/md5
+ - G502: Import blacklist: crypto/des
+ - G503: Import blacklist: crypto/rc4
+ - G504: Import blacklist: net/http/cgi
+ - G505: Import blacklist: crypto/sha1
+
+
+```
+# Run a specific set of rules
+$ gosec -include=G101,G203,G401 ./...
+
+# Run everything except for rule G303
+$ gosec -exclude=G303 ./...
+```
+
+#### Excluding files:
+
+gosec will ignore dependencies in your vendor directory any files
+that are not considered build artifacts by the compiler (so test files).
+
+#### Annotating code
+
+As with all automated detection tools there will be cases of false positives. In cases where gosec reports a failure that has been manually verified as being safe it is possible to annotate the code with a '#nosec' comment.
+
+The annotation causes gosec to stop processing any further nodes within the
+AST so can apply to a whole block or more granularly to a single expression.
+
+```go
+
+import "md5" // #nosec
+
+
+func main(){
+
+ /* #nosec */
+ if x > y {
+ h := md5.New() // this will also be ignored
+ }
+
+}
+
+```
+
+When a specific false positive has been identified and verified as safe, you may wish to suppress only that single rule (or a specific set of rules) within a section of code, while continuing to scan for other problems. To do this, you can list the rule(s) to be suppressed within the `#nosec` annotation, e.g: `/* #nosec G401 */` or `// #nosec G201 G202 G203 `
+
+In some cases you may also want to revisit places where #nosec annotations
+have been used. To run the scanner and ignore any #nosec annotations you
+can do the following:
+
+```
+$ gosec -nosec=true ./...
+```
+#### Build tags
+
+gosec is able to pass your [Go build tags](https://golang.org/pkg/go/build/) to the analyzer.
+They can be provided as a comma separated list as follows:
+
+```
+$ gosec -tag debug,ignore ./...
+```
+
+### Output formats
+
+gosec currently supports text, json, yaml, csv and JUnit XML output formats. By default
+results will be reported to stdout, but can also be written to an output
+file. The output format is controlled by the '-fmt' flag, and the output file is controlled by the '-out' flag as follows:
+
+```
+# Write output in json format to results.json
+$ gosec -fmt=json -out=results.json *.go
+```
+### Development
+
+#### Prerequisites
+
+Install dep according to the instructions here: https://github.com/golang/dep
+Install the latest version of golint: https://github.com/golang/lint
+
+#### Build
+
+```
+make
+```
+
+#### Tests
+
+```
+make test
+```
+
+#### Release Build
+
+Make sure you have installed the [goreleaser](https://github.com/goreleaser/goreleaser) tool and then you can release gosec as follows:
+
+```
+git tag 1.0.0
+export GITHUB_TOKEN=
+make release
+```
+
+The released version of the tool is available in the `dist` folder. The build information should be displayed in the usage text.
+
+```
+./dist/darwin_amd64/gosec -h
+gosec - Golang security checker
+
+gosec analyzes Go source code to look for common programming mistakes that
+can lead to security problems.
+
+VERSION: 1.0.0
+GIT TAG: 1.0.0
+BUILD DATE: 2018-04-27T12:41:38Z
+```
+
+Note that all released archives are also uploaded to GitHub.
+
+#### Docker image
+
+You can build the docker image as follows:
+
+```
+make image
+```
+
+You can run the `gosec` tool in a container against your local Go project. You just have to mount the project in the
+`GOPATH` of the container:
+
+```
+docker run -it -v $GOPATH/src/:/go/src/ securego/gosec /go/src/
+```
+
+#### Generate TLS rule
+
+The configuration of TLS rule can be generated from [Mozilla's TLS ciphers recommendation](https://statics.tls.security.mozilla.org/server-side-tls-conf.json).
+
+
+First you need to install the generator tool:
+
+```
+go get github.com/golangci/gosec/cmd/tlsconfig/...
+```
+
+You can invoke now the `go generate` in the root of the project:
+
+```
+go generate ./...
+```
+
+This will generate the `rules/tls_config.go` file with will contain the current ciphers recommendation from Mozilla.
diff --git a/vendor/github.com/golangci/gosec/analyzer.go b/vendor/github.com/golangci/gosec/analyzer.go
new file mode 100644
index 00000000000..9ce2bc743b4
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/analyzer.go
@@ -0,0 +1,250 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+// Modifications copyright (C) 2018 GolangCI
+
+// Package gosec holds the central scanning logic used by gosec security scanner
+package gosec
+
+import (
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "go/types"
+ "log"
+ "os"
+ "path"
+ "reflect"
+ "regexp"
+ "strings"
+
+ "golang.org/x/tools/go/loader"
+)
+
+// The Context is populated with data parsed from the source code as it is scanned.
+// It is passed through to all rule functions as they are called. Rules may use
+// this data in conjunction withe the encoutered AST node.
+type Context struct {
+ FileSet *token.FileSet
+ Comments ast.CommentMap
+ Info *types.Info
+ Pkg *types.Package
+ Root *ast.File
+ Config map[string]interface{}
+ Imports *ImportTracker
+ Ignores []map[string]bool
+}
+
+// Metrics used when reporting information about a scanning run.
+type Metrics struct {
+ NumFiles int `json:"files"`
+ NumLines int `json:"lines"`
+ NumNosec int `json:"nosec"`
+ NumFound int `json:"found"`
+}
+
+// Analyzer object is the main object of gosec. It has methods traverse an AST
+// and invoke the correct checking rules as on each node as required.
+type Analyzer struct {
+ ignoreNosec bool
+ ruleset RuleSet
+ context *Context
+ config Config
+ logger *log.Logger
+ issues []*Issue
+ stats *Metrics
+}
+
+// NewAnalyzer builds a new anaylzer.
+func NewAnalyzer(conf Config, logger *log.Logger) *Analyzer {
+ ignoreNoSec := false
+ if setting, err := conf.GetGlobal("nosec"); err == nil {
+ ignoreNoSec = setting == "true" || setting == "enabled"
+ }
+ if logger == nil {
+ logger = log.New(os.Stderr, "[gosec]", log.LstdFlags)
+ }
+ return &Analyzer{
+ ignoreNosec: ignoreNoSec,
+ ruleset: make(RuleSet),
+ context: &Context{},
+ config: conf,
+ logger: logger,
+ issues: make([]*Issue, 0, 16),
+ stats: &Metrics{},
+ }
+}
+
+// LoadRules instantiates all the rules to be used when analyzing source
+// packages
+func (gosec *Analyzer) LoadRules(ruleDefinitions map[string]RuleBuilder) {
+ for id, def := range ruleDefinitions {
+ r, nodes := def(id, gosec.config)
+ gosec.ruleset.Register(r, nodes...)
+ }
+}
+
+// Process kicks off the analysis process for a given package
+func (gosec *Analyzer) Process(buildTags []string, packagePaths ...string) error {
+ ctx := build.Default
+ ctx.BuildTags = append(ctx.BuildTags, buildTags...)
+ packageConfig := loader.Config{
+ Build: &ctx,
+ ParserMode: parser.ParseComments,
+ AllowErrors: true,
+ }
+ for _, packagePath := range packagePaths {
+ abspath, err := GetPkgAbsPath(packagePath)
+ if err != nil {
+ gosec.logger.Printf("Skipping: %s. Path doesn't exist.", abspath)
+ continue
+ }
+ gosec.logger.Println("Searching directory:", abspath)
+
+ basePackage, err := build.Default.ImportDir(packagePath, build.ImportComment)
+ if err != nil {
+ return err
+ }
+
+ var packageFiles []string
+ for _, filename := range basePackage.GoFiles {
+ packageFiles = append(packageFiles, path.Join(packagePath, filename))
+ }
+
+ packageConfig.CreateFromFilenames(basePackage.Name, packageFiles...)
+ }
+
+ builtPackage, err := packageConfig.Load()
+ if err != nil {
+ return err
+ }
+
+ gosec.ProcessProgram(builtPackage)
+ return nil
+}
+
+// ProcessProgram kicks off the analysis process for a given program
+func (gosec *Analyzer) ProcessProgram(builtPackage *loader.Program) {
+ for _, pkg := range builtPackage.InitialPackages() {
+ gosec.logger.Println("Checking package:", pkg.String())
+ for _, file := range pkg.Files {
+ gosec.logger.Println("Checking file:", builtPackage.Fset.File(file.Pos()).Name())
+ gosec.context.FileSet = builtPackage.Fset
+ gosec.context.Config = gosec.config
+ gosec.context.Comments = ast.NewCommentMap(gosec.context.FileSet, file, file.Comments)
+ gosec.context.Root = file
+ gosec.context.Info = &pkg.Info
+ gosec.context.Pkg = pkg.Pkg
+ gosec.context.Imports = NewImportTracker()
+ gosec.context.Imports.TrackPackages(gosec.context.Pkg.Imports()...)
+ ast.Walk(gosec, file)
+ gosec.stats.NumFiles++
+ gosec.stats.NumLines += builtPackage.Fset.File(file.Pos()).LineCount()
+ }
+ }
+}
+
+// ignore a node (and sub-tree) if it is tagged with a "#nosec" comment
+func (gosec *Analyzer) ignore(n ast.Node) ([]string, bool) {
+ if groups, ok := gosec.context.Comments[n]; ok && !gosec.ignoreNosec {
+ for _, group := range groups {
+ if strings.Contains(group.Text(), "#nosec") {
+ gosec.stats.NumNosec++
+
+ // Pull out the specific rules that are listed to be ignored.
+ re := regexp.MustCompile("(G\\d{3})")
+ matches := re.FindAllStringSubmatch(group.Text(), -1)
+
+ // If no specific rules were given, ignore everything.
+ if matches == nil || len(matches) == 0 {
+ return nil, true
+ }
+
+ // Find the rule IDs to ignore.
+ var ignores []string
+ for _, v := range matches {
+ ignores = append(ignores, v[1])
+ }
+ return ignores, false
+ }
+ }
+ }
+ return nil, false
+}
+
+// Visit runs the gosec visitor logic over an AST created by parsing go code.
+// Rule methods added with AddRule will be invoked as necessary.
+func (gosec *Analyzer) Visit(n ast.Node) ast.Visitor {
+ // If we've reached the end of this branch, pop off the ignores stack.
+ if n == nil {
+ if len(gosec.context.Ignores) > 0 {
+ gosec.context.Ignores = gosec.context.Ignores[1:]
+ }
+ return gosec
+ }
+
+ // Get any new rule exclusions.
+ ignoredRules, ignoreAll := gosec.ignore(n)
+ if ignoreAll {
+ return nil
+ }
+
+ // Now create the union of exclusions.
+ ignores := make(map[string]bool, 0)
+ if len(gosec.context.Ignores) > 0 {
+ for k, v := range gosec.context.Ignores[0] {
+ ignores[k] = v
+ }
+ }
+
+ for _, v := range ignoredRules {
+ ignores[v] = true
+ }
+
+ // Push the new set onto the stack.
+ gosec.context.Ignores = append([]map[string]bool{ignores}, gosec.context.Ignores...)
+
+ // Track aliased and initialization imports
+ gosec.context.Imports.TrackImport(n)
+
+ for _, rule := range gosec.ruleset.RegisteredFor(n) {
+ if _, ok := ignores[rule.ID()]; ok {
+ continue
+ }
+ issue, err := rule.Match(n, gosec.context)
+ if err != nil {
+ file, line := GetLocation(n, gosec.context)
+ file = path.Base(file)
+ gosec.logger.Printf("Rule error: %v => %s (%s:%d)\n", reflect.TypeOf(rule), err, file, line)
+ }
+ if issue != nil {
+ gosec.issues = append(gosec.issues, issue)
+ gosec.stats.NumFound++
+ }
+ }
+ return gosec
+}
+
+// Report returns the current issues discovered and the metrics about the scan
+func (gosec *Analyzer) Report() ([]*Issue, *Metrics) {
+ return gosec.issues, gosec.stats
+}
+
+// Reset clears state such as context, issues and metrics from the configured analyzer
+func (gosec *Analyzer) Reset() {
+ gosec.context = &Context{}
+ gosec.issues = make([]*Issue, 0, 16)
+ gosec.stats = &Metrics{}
+}
diff --git a/vendor/github.com/golangci/gosec/call_list.go b/vendor/github.com/golangci/gosec/call_list.go
new file mode 100644
index 00000000000..8370f8f42be
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/call_list.go
@@ -0,0 +1,78 @@
+//
+// 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.
+
+package gosec
+
+import (
+ "go/ast"
+)
+
+type set map[string]bool
+
+// CallList is used to check for usage of specific packages
+// and functions.
+type CallList map[string]set
+
+// NewCallList creates a new empty CallList
+func NewCallList() CallList {
+ return make(CallList)
+}
+
+// AddAll will add several calls to the call list at once
+func (c CallList) AddAll(selector string, idents ...string) {
+ for _, ident := range idents {
+ c.Add(selector, ident)
+ }
+}
+
+// Add a selector and call to the call list
+func (c CallList) Add(selector, ident string) {
+ if _, ok := c[selector]; !ok {
+ c[selector] = make(set)
+ }
+ c[selector][ident] = true
+}
+
+// Contains returns true if the package and function are
+/// members of this call list.
+func (c CallList) Contains(selector, ident string) bool {
+ if idents, ok := c[selector]; ok {
+ _, found := idents[ident]
+ return found
+ }
+ return false
+}
+
+// ContainsCallExpr resolves the call expression name and type
+/// or package and determines if it exists within the CallList
+func (c CallList) ContainsCallExpr(n ast.Node, ctx *Context) *ast.CallExpr {
+ selector, ident, err := GetCallInfo(n, ctx)
+ if err != nil {
+ return nil
+ }
+
+ // Use only explicit path to reduce conflicts
+ if path, ok := GetImportPath(selector, ctx); ok && c.Contains(path, ident) {
+ return n.(*ast.CallExpr)
+ }
+
+ /*
+ // Try direct resolution
+ if c.Contains(selector, ident) {
+ log.Printf("c.Contains == true, %s, %s.", selector, ident)
+ return n.(*ast.CallExpr)
+ }
+ */
+
+ return nil
+}
diff --git a/vendor/github.com/golangci/gosec/config.go b/vendor/github.com/golangci/gosec/config.go
new file mode 100644
index 00000000000..a19937f0e61
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/config.go
@@ -0,0 +1,88 @@
+package gosec
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "io"
+ "io/ioutil"
+)
+
+const (
+ // Globals are applicable to all rules and used for general
+ // configuration settings for gosec.
+ Globals = "global"
+)
+
+// Config is used to provide configuration and customization to each of the rules.
+type Config map[string]interface{}
+
+// NewConfig initializes a new configuration instance. The configuration data then
+// needs to be loaded via c.ReadFrom(strings.NewReader("config data"))
+// or from a *os.File.
+func NewConfig() Config {
+ cfg := make(Config)
+ cfg[Globals] = make(map[string]string)
+ return cfg
+}
+
+// ReadFrom implements the io.ReaderFrom interface. This
+// should be used with io.Reader to load configuration from
+//file or from string etc.
+func (c Config) ReadFrom(r io.Reader) (int64, error) {
+ data, err := ioutil.ReadAll(r)
+ if err != nil {
+ return int64(len(data)), err
+ }
+ if err = json.Unmarshal(data, &c); err != nil {
+ return int64(len(data)), err
+ }
+ return int64(len(data)), nil
+}
+
+// WriteTo implements the io.WriteTo interface. This should
+// be used to save or print out the configuration information.
+func (c Config) WriteTo(w io.Writer) (int64, error) {
+ data, err := json.Marshal(c)
+ if err != nil {
+ return int64(len(data)), err
+ }
+ return io.Copy(w, bytes.NewReader(data))
+}
+
+// Get returns the configuration section for the supplied key
+func (c Config) Get(section string) (interface{}, error) {
+ settings, found := c[section]
+ if !found {
+ return nil, fmt.Errorf("Section %s not in configuration", section)
+ }
+ return settings, nil
+}
+
+// Set section in the configuration to specified value
+func (c Config) Set(section string, value interface{}) {
+ c[section] = value
+}
+
+// GetGlobal returns value associated with global configuration option
+func (c Config) GetGlobal(option string) (string, error) {
+ if globals, ok := c[Globals]; ok {
+ if settings, ok := globals.(map[string]string); ok {
+ if value, ok := settings[option]; ok {
+ return value, nil
+ }
+ return "", fmt.Errorf("global setting for %s not found", option)
+ }
+ }
+ return "", fmt.Errorf("no global config options found")
+
+}
+
+// SetGlobal associates a value with a global configuration ooption
+func (c Config) SetGlobal(option, value string) {
+ if globals, ok := c[Globals]; ok {
+ if settings, ok := globals.(map[string]string); ok {
+ settings[option] = value
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/gosec/docker-entrypoint.sh b/vendor/github.com/golangci/gosec/docker-entrypoint.sh
new file mode 100644
index 00000000000..52bb2679991
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/docker-entrypoint.sh
@@ -0,0 +1,2 @@
+#!/usr/bin/env sh
+${BIN} "$@"
diff --git a/vendor/github.com/golangci/gosec/helpers.go b/vendor/github.com/golangci/gosec/helpers.go
new file mode 100644
index 00000000000..638129b1dfa
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/helpers.go
@@ -0,0 +1,313 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package gosec
+
+import (
+ "errors"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "os"
+ "os/user"
+ "path/filepath"
+ "runtime"
+ "strconv"
+ "strings"
+)
+
+// MatchCallByPackage ensures that the specified package is imported,
+// adjusts the name for any aliases and ignores cases that are
+// initialization only imports.
+//
+// Usage:
+// node, matched := MatchCallByPackage(n, ctx, "math/rand", "Read")
+//
+func MatchCallByPackage(n ast.Node, c *Context, pkg string, names ...string) (*ast.CallExpr, bool) {
+
+ importedName, found := GetImportedName(pkg, c)
+ if !found {
+ return nil, false
+ }
+
+ if callExpr, ok := n.(*ast.CallExpr); ok {
+ packageName, callName, err := GetCallInfo(callExpr, c)
+ if err != nil {
+ return nil, false
+ }
+ if packageName == importedName {
+ for _, name := range names {
+ if callName == name {
+ return callExpr, true
+ }
+ }
+ }
+ }
+ return nil, false
+}
+
+// MatchCallByType ensures that the node is a call expression to a
+// specific object type.
+//
+// Usage:
+// node, matched := MatchCallByType(n, ctx, "bytes.Buffer", "WriteTo", "Write")
+//
+func MatchCallByType(n ast.Node, ctx *Context, requiredType string, calls ...string) (*ast.CallExpr, bool) {
+ if callExpr, ok := n.(*ast.CallExpr); ok {
+ typeName, callName, err := GetCallInfo(callExpr, ctx)
+ if err != nil {
+ return nil, false
+ }
+ if typeName == requiredType {
+ for _, call := range calls {
+ if call == callName {
+ return callExpr, true
+ }
+ }
+ }
+ }
+ return nil, false
+}
+
+// MatchCompLit will match an ast.CompositeLit based on the supplied type
+func MatchCompLit(n ast.Node, ctx *Context, required string) *ast.CompositeLit {
+ if complit, ok := n.(*ast.CompositeLit); ok {
+ typeOf := ctx.Info.TypeOf(complit)
+ if typeOf.String() == required {
+ return complit
+ }
+ }
+ return nil
+}
+
+// GetInt will read and return an integer value from an ast.BasicLit
+func GetInt(n ast.Node) (int64, error) {
+ if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.INT {
+ return strconv.ParseInt(node.Value, 0, 64)
+ }
+ return 0, fmt.Errorf("Unexpected AST node type: %T", n)
+}
+
+// GetFloat will read and return a float value from an ast.BasicLit
+func GetFloat(n ast.Node) (float64, error) {
+ if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.FLOAT {
+ return strconv.ParseFloat(node.Value, 64)
+ }
+ return 0.0, fmt.Errorf("Unexpected AST node type: %T", n)
+}
+
+// GetChar will read and return a char value from an ast.BasicLit
+func GetChar(n ast.Node) (byte, error) {
+ if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.CHAR {
+ return node.Value[0], nil
+ }
+ return 0, fmt.Errorf("Unexpected AST node type: %T", n)
+}
+
+// GetString will read and return a string value from an ast.BasicLit
+func GetString(n ast.Node) (string, error) {
+ if node, ok := n.(*ast.BasicLit); ok && node.Kind == token.STRING {
+ return strconv.Unquote(node.Value)
+ }
+ return "", fmt.Errorf("Unexpected AST node type: %T", n)
+}
+
+// GetCallObject returns the object and call expression and associated
+// object for a given AST node. nil, nil will be returned if the
+// object cannot be resolved.
+func GetCallObject(n ast.Node, ctx *Context) (*ast.CallExpr, types.Object) {
+ switch node := n.(type) {
+ case *ast.CallExpr:
+ switch fn := node.Fun.(type) {
+ case *ast.Ident:
+ return node, ctx.Info.Uses[fn]
+ case *ast.SelectorExpr:
+ return node, ctx.Info.Uses[fn.Sel]
+ }
+ }
+ return nil, nil
+}
+
+// GetCallInfo returns the package or type and name associated with a
+// call expression.
+func GetCallInfo(n ast.Node, ctx *Context) (string, string, error) {
+ switch node := n.(type) {
+ case *ast.CallExpr:
+ switch fn := node.Fun.(type) {
+ case *ast.SelectorExpr:
+ switch expr := fn.X.(type) {
+ case *ast.Ident:
+ if expr.Obj != nil && expr.Obj.Kind == ast.Var {
+ t := ctx.Info.TypeOf(expr)
+ if t != nil {
+ return t.String(), fn.Sel.Name, nil
+ }
+ return "undefined", fn.Sel.Name, fmt.Errorf("missing type info")
+ }
+ return expr.Name, fn.Sel.Name, nil
+ }
+ case *ast.Ident:
+ return ctx.Pkg.Name(), fn.Name, nil
+ }
+ }
+ return "", "", fmt.Errorf("unable to determine call info")
+}
+
+// GetImportedName returns the name used for the package within the
+// code. It will resolve aliases and ignores initalization only imports.
+func GetImportedName(path string, ctx *Context) (string, bool) {
+ importName, imported := ctx.Imports.Imported[path]
+ if !imported {
+ return "", false
+ }
+
+ if _, initonly := ctx.Imports.InitOnly[path]; initonly {
+ return "", false
+ }
+
+ if alias, ok := ctx.Imports.Aliased[path]; ok {
+ importName = alias
+ }
+ return importName, true
+}
+
+// GetImportPath resolves the full import path of an identifer based on
+// the imports in the current context.
+func GetImportPath(name string, ctx *Context) (string, bool) {
+ for path := range ctx.Imports.Imported {
+ if imported, ok := GetImportedName(path, ctx); ok && imported == name {
+ return path, true
+ }
+ }
+ return "", false
+}
+
+// GetLocation returns the filename and line number of an ast.Node
+func GetLocation(n ast.Node, ctx *Context) (string, int) {
+ fobj := ctx.FileSet.File(n.Pos())
+ return fobj.Name(), fobj.Line(n.Pos())
+}
+
+// Gopath returns all GOPATHs
+func Gopath() []string {
+ defaultGoPath := runtime.GOROOT()
+ if u, err := user.Current(); err == nil {
+ defaultGoPath = filepath.Join(u.HomeDir, "go")
+ }
+ path := Getenv("GOPATH", defaultGoPath)
+ paths := strings.Split(path, string(os.PathListSeparator))
+ for idx, path := range paths {
+ if abs, err := filepath.Abs(path); err == nil {
+ paths[idx] = abs
+ }
+ }
+ return paths
+}
+
+// Getenv returns the values of the environment variable, otherwise
+//returns the default if variable is not set
+func Getenv(key, userDefault string) string {
+ if val := os.Getenv(key); val != "" {
+ return val
+ }
+ return userDefault
+}
+
+// GetPkgRelativePath returns the Go relative relative path derived
+// form the given path
+func GetPkgRelativePath(path string) (string, error) {
+ abspath, err := filepath.Abs(path)
+ if err != nil {
+ abspath = path
+ }
+ if strings.HasSuffix(abspath, ".go") {
+ abspath = filepath.Dir(abspath)
+ }
+ for _, base := range Gopath() {
+ projectRoot := filepath.FromSlash(fmt.Sprintf("%s/src/", base))
+ if strings.HasPrefix(abspath, projectRoot) {
+ return strings.TrimPrefix(abspath, projectRoot), nil
+ }
+ }
+ return "", errors.New("no project relative path found")
+}
+
+// GetPkgAbsPath returns the Go package absolute path derived from
+// the given path
+func GetPkgAbsPath(pkgPath string) (string, error) {
+ absPath, err := filepath.Abs(pkgPath)
+ if err != nil {
+ return "", err
+ }
+ if _, err := os.Stat(absPath); os.IsNotExist(err) {
+ return "", errors.New("no project absolute path found")
+ }
+ return absPath, nil
+}
+
+// ConcatString recusively concatenates strings from a binary expression
+func ConcatString(n *ast.BinaryExpr) (string, bool) {
+ var s string
+ // sub expressions are found in X object, Y object is always last BasicLit
+ if rightOperand, ok := n.Y.(*ast.BasicLit); ok {
+ if str, err := GetString(rightOperand); err == nil {
+ s = str + s
+ }
+ } else {
+ return "", false
+ }
+ if leftOperand, ok := n.X.(*ast.BinaryExpr); ok {
+ if recursion, ok := ConcatString(leftOperand); ok {
+ s = recursion + s
+ }
+ } else if leftOperand, ok := n.X.(*ast.BasicLit); ok {
+ if str, err := GetString(leftOperand); err == nil {
+ s = str + s
+ }
+ } else {
+ return "", false
+ }
+ return s, true
+}
+
+// FindVarIdentities returns array of all variable identities in a given binary expression
+func FindVarIdentities(n *ast.BinaryExpr, c *Context) ([]*ast.Ident, bool) {
+ identities := []*ast.Ident{}
+ // sub expressions are found in X object, Y object is always the last term
+ if rightOperand, ok := n.Y.(*ast.Ident); ok {
+ obj := c.Info.ObjectOf(rightOperand)
+ if _, ok := obj.(*types.Var); ok && !TryResolve(rightOperand, c) {
+ identities = append(identities, rightOperand)
+ }
+ }
+ if leftOperand, ok := n.X.(*ast.BinaryExpr); ok {
+ if leftIdentities, ok := FindVarIdentities(leftOperand, c); ok {
+ identities = append(identities, leftIdentities...)
+ }
+ } else {
+ if leftOperand, ok := n.X.(*ast.Ident); ok {
+ obj := c.Info.ObjectOf(leftOperand)
+ if _, ok := obj.(*types.Var); ok && !TryResolve(leftOperand, c) {
+ identities = append(identities, leftOperand)
+ }
+ }
+ }
+
+ if len(identities) > 0 {
+ return identities, true
+ }
+ // if nil or error, return false
+ return nil, false
+}
diff --git a/vendor/github.com/golangci/gosec/import_tracker.go b/vendor/github.com/golangci/gosec/import_tracker.go
new file mode 100644
index 00000000000..b56b65a6065
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/import_tracker.go
@@ -0,0 +1,67 @@
+// 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.
+
+package gosec
+
+import (
+ "go/ast"
+ "go/types"
+ "strings"
+)
+
+// ImportTracker is used to normalize the packages that have been imported
+// by a source file. It is able to differentiate between plain imports, aliased
+// imports and init only imports.
+type ImportTracker struct {
+ Imported map[string]string
+ Aliased map[string]string
+ InitOnly map[string]bool
+}
+
+// NewImportTracker creates an empty Import tracker instance
+func NewImportTracker() *ImportTracker {
+ return &ImportTracker{
+ make(map[string]string),
+ make(map[string]string),
+ make(map[string]bool),
+ }
+}
+
+// TrackPackages tracks all the imports used by the supplied packages
+func (t *ImportTracker) TrackPackages(pkgs ...*types.Package) {
+ for _, pkg := range pkgs {
+ t.Imported[pkg.Path()] = pkg.Name()
+ // Transient imports
+ //for _, imp := range pkg.Imports() {
+ // t.Imported[imp.Path()] = imp.Name()
+ //}
+ }
+}
+
+// TrackImport tracks imports and handles the 'unsafe' import
+func (t *ImportTracker) TrackImport(n ast.Node) {
+ if imported, ok := n.(*ast.ImportSpec); ok {
+ path := strings.Trim(imported.Path.Value, `"`)
+ if imported.Name != nil {
+ if imported.Name.Name == "_" {
+ // Initialization only import
+ t.InitOnly[path] = true
+ } else {
+ // Aliased import
+ t.Aliased[path] = imported.Name.Name
+ }
+ }
+ if path == "unsafe" {
+ t.Imported[path] = path
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/gosec/issue.go b/vendor/github.com/golangci/gosec/issue.go
new file mode 100644
index 00000000000..40bfa3d431a
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/issue.go
@@ -0,0 +1,122 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package gosec
+
+import (
+ "encoding/json"
+ "fmt"
+ "go/ast"
+ "os"
+ "strconv"
+)
+
+// Score type used by severity and confidence values
+type Score int
+
+const (
+ // Low severity or confidence
+ Low Score = iota
+ // Medium severity or confidence
+ Medium
+ // High severity or confidence
+ High
+)
+
+// Issue is returnd by a gosec rule if it discovers an issue with the scanned code.
+type Issue struct {
+ Severity Score `json:"severity"` // issue severity (how problematic it is)
+ Confidence Score `json:"confidence"` // issue confidence (how sure we are we found it)
+ RuleID string `json:"rule_id"` // Human readable explanation
+ What string `json:"details"` // Human readable explanation
+ File string `json:"file"` // File name we found it in
+ Code string `json:"code"` // Impacted code line
+ Line string `json:"line"` // Line number in file
+}
+
+// MetaData is embedded in all gosec rules. The Severity, Confidence and What message
+// will be passed tbhrough to reported issues.
+type MetaData struct {
+ ID string
+ Severity Score
+ Confidence Score
+ What string
+}
+
+// MarshalJSON is used convert a Score object into a JSON representation
+func (c Score) MarshalJSON() ([]byte, error) {
+ return json.Marshal(c.String())
+}
+
+// String converts a Score into a string
+func (c Score) String() string {
+ switch c {
+ case High:
+ return "HIGH"
+ case Medium:
+ return "MEDIUM"
+ case Low:
+ return "LOW"
+ }
+ return "UNDEFINED"
+}
+
+func codeSnippet(file *os.File, start int64, end int64, n ast.Node) (string, error) {
+ if n == nil {
+ return "", fmt.Errorf("Invalid AST node provided")
+ }
+
+ size := (int)(end - start) // Go bug, os.File.Read should return int64 ...
+ file.Seek(start, 0) // #nosec
+
+ buf := make([]byte, size)
+ if nread, err := file.Read(buf); err != nil || nread != size {
+ return "", fmt.Errorf("Unable to read code")
+ }
+ return string(buf), nil
+}
+
+// NewIssue creates a new Issue
+func NewIssue(ctx *Context, node ast.Node, ruleID, desc string, severity Score, confidence Score) *Issue {
+ var code string
+ fobj := ctx.FileSet.File(node.Pos())
+ name := fobj.Name()
+
+ start, end := fobj.Line(node.Pos()), fobj.Line(node.End())
+ line := strconv.Itoa(start)
+ if start != end {
+ line = fmt.Sprintf("%d-%d", start, end)
+ }
+
+ // #nosec
+ if file, err := os.Open(fobj.Name()); err == nil {
+ defer file.Close()
+ s := (int64)(fobj.Position(node.Pos()).Offset) // Go bug, should be int64
+ e := (int64)(fobj.Position(node.End()).Offset) // Go bug, should be int64
+ code, err = codeSnippet(file, s, e, node)
+ if err != nil {
+ code = err.Error()
+ }
+ }
+
+ return &Issue{
+ File: name,
+ Line: line,
+ RuleID: ruleID,
+ What: desc,
+ Confidence: confidence,
+ Severity: severity,
+ Code: code,
+ }
+}
diff --git a/vendor/github.com/golangci/gosec/resolve.go b/vendor/github.com/golangci/gosec/resolve.go
new file mode 100644
index 00000000000..b563e7ddfd6
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/resolve.go
@@ -0,0 +1,82 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package gosec
+
+import "go/ast"
+
+func resolveIdent(n *ast.Ident, c *Context) bool {
+
+ if n.Obj == nil || n.Obj.Kind != ast.Var {
+ return true
+ }
+ if node, ok := n.Obj.Decl.(ast.Node); ok {
+ return TryResolve(node, c)
+ }
+ return false
+}
+
+func resolveAssign(n *ast.AssignStmt, c *Context) bool {
+ for _, arg := range n.Rhs {
+ if !TryResolve(arg, c) {
+ return false
+ }
+ }
+ return true
+}
+
+func resolveCompLit(n *ast.CompositeLit, c *Context) bool {
+ for _, arg := range n.Elts {
+ if !TryResolve(arg, c) {
+ return false
+ }
+ }
+ return true
+}
+
+func resolveBinExpr(n *ast.BinaryExpr, c *Context) bool {
+ return (TryResolve(n.X, c) && TryResolve(n.Y, c))
+}
+
+func resolveCallExpr(n *ast.CallExpr, c *Context) bool {
+ // TODO(tkelsey): next step, full function resolution
+ return false
+}
+
+// TryResolve will attempt, given a subtree starting at some ATS node, to resolve
+// all values contained within to a known constant. It is used to check for any
+// unkown values in compound expressions.
+func TryResolve(n ast.Node, c *Context) bool {
+ switch node := n.(type) {
+ case *ast.BasicLit:
+ return true
+
+ case *ast.CompositeLit:
+ return resolveCompLit(node, c)
+
+ case *ast.Ident:
+ return resolveIdent(node, c)
+
+ case *ast.AssignStmt:
+ return resolveAssign(node, c)
+
+ case *ast.CallExpr:
+ return resolveCallExpr(node, c)
+
+ case *ast.BinaryExpr:
+ return resolveBinExpr(node, c)
+ }
+
+ return false
+}
diff --git a/vendor/github.com/golangci/gosec/rule.go b/vendor/github.com/golangci/gosec/rule.go
new file mode 100644
index 00000000000..415c7085b57
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rule.go
@@ -0,0 +1,59 @@
+// 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.
+
+package gosec
+
+import (
+ "go/ast"
+ "reflect"
+)
+
+// The Rule interface used by all rules supported by gosec.
+type Rule interface {
+ ID() string
+ Match(ast.Node, *Context) (*Issue, error)
+}
+
+// RuleBuilder is used to register a rule definition with the analyzer
+type RuleBuilder func(id string, c Config) (Rule, []ast.Node)
+
+// A RuleSet maps lists of rules to the type of AST node they should be run on.
+// The anaylzer will only invoke rules contained in the list associated with the
+// type of AST node it is currently visiting.
+type RuleSet map[reflect.Type][]Rule
+
+// NewRuleSet constructs a new RuleSet
+func NewRuleSet() RuleSet {
+ return make(RuleSet)
+}
+
+// Register adds a trigger for the supplied rule for the the
+// specified ast nodes.
+func (r RuleSet) Register(rule Rule, nodes ...ast.Node) {
+ for _, n := range nodes {
+ t := reflect.TypeOf(n)
+ if rules, ok := r[t]; ok {
+ r[t] = append(rules, rule)
+ } else {
+ r[t] = []Rule{rule}
+ }
+ }
+}
+
+// RegisteredFor will return all rules that are registered for a
+// specified ast node.
+func (r RuleSet) RegisteredFor(n ast.Node) []Rule {
+ if rules, found := r[reflect.TypeOf(n)]; found {
+ return rules
+ }
+ return []Rule{}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/archive.go b/vendor/github.com/golangci/gosec/rules/archive.go
new file mode 100644
index 00000000000..0eafd088df4
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/archive.go
@@ -0,0 +1,60 @@
+package rules
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/golangci/gosec"
+)
+
+type archive struct {
+ gosec.MetaData
+ calls gosec.CallList
+ argType string
+}
+
+func (a *archive) ID() string {
+ return a.MetaData.ID
+}
+
+// Match inspects AST nodes to determine if the filepath.Joins uses any argument derived from type zip.File
+func (a *archive) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if node := a.calls.ContainsCallExpr(n, c); node != nil {
+ for _, arg := range node.Args {
+ var argType types.Type
+ if selector, ok := arg.(*ast.SelectorExpr); ok {
+ argType = c.Info.TypeOf(selector.X)
+ } else if ident, ok := arg.(*ast.Ident); ok {
+ if ident.Obj != nil && ident.Obj.Kind == ast.Var {
+ decl := ident.Obj.Decl
+ if assign, ok := decl.(*ast.AssignStmt); ok {
+ if selector, ok := assign.Rhs[0].(*ast.SelectorExpr); ok {
+ argType = c.Info.TypeOf(selector.X)
+ }
+ }
+ }
+ }
+
+ if argType != nil && argType.String() == a.argType {
+ return gosec.NewIssue(c, n, a.ID(), a.What, a.Severity, a.Confidence), nil
+ }
+ }
+ }
+ return nil, nil
+}
+
+// NewArchive creates a new rule which detects the file traversal when extracting zip archives
+func NewArchive(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ calls := gosec.NewCallList()
+ calls.Add("path/filepath", "Join")
+ return &archive{
+ calls: calls,
+ argType: "*archive/zip.File",
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: "File traversal when extracting zip archive",
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/big.go b/vendor/github.com/golangci/gosec/rules/big.go
new file mode 100644
index 00000000000..35a37ec0861
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/big.go
@@ -0,0 +1,52 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type usingBigExp struct {
+ gosec.MetaData
+ pkg string
+ calls []string
+}
+
+func (r *usingBigExp) ID() string {
+ return r.MetaData.ID
+}
+
+func (r *usingBigExp) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) {
+ if _, matched := gosec.MatchCallByType(n, c, r.pkg, r.calls...); matched {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ return nil, nil
+}
+
+// NewUsingBigExp detects issues with modulus == 0 for Bignum
+func NewUsingBigExp(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &usingBigExp{
+ pkg: "*math/big.Int",
+ calls: []string{"Exp"},
+ MetaData: gosec.MetaData{
+ ID: id,
+ What: "Use of math/big.Int.Exp function should be audited for modulus == 0",
+ Severity: gosec.Low,
+ Confidence: gosec.High,
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/bind.go b/vendor/github.com/golangci/gosec/rules/bind.go
new file mode 100644
index 00000000000..a53f82e5998
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/bind.go
@@ -0,0 +1,64 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "regexp"
+
+ "github.com/golangci/gosec"
+)
+
+// Looks for net.Listen("0.0.0.0") or net.Listen(":8080")
+type bindsToAllNetworkInterfaces struct {
+ gosec.MetaData
+ calls gosec.CallList
+ pattern *regexp.Regexp
+}
+
+func (r *bindsToAllNetworkInterfaces) ID() string {
+ return r.MetaData.ID
+}
+
+func (r *bindsToAllNetworkInterfaces) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ callExpr := r.calls.ContainsCallExpr(n, c)
+ if callExpr == nil {
+ return nil, nil
+ }
+ if arg, err := gosec.GetString(callExpr.Args[1]); err == nil {
+ if r.pattern.MatchString(arg) {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewBindsToAllNetworkInterfaces detects socket connections that are setup to
+// listen on all network interfaces.
+func NewBindsToAllNetworkInterfaces(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ calls := gosec.NewCallList()
+ calls.Add("net", "Listen")
+ calls.Add("crypto/tls", "Listen")
+ return &bindsToAllNetworkInterfaces{
+ calls: calls,
+ pattern: regexp.MustCompile(`^(0.0.0.0|:).*$`),
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: "Binds to all network interfaces",
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/blacklist.go b/vendor/github.com/golangci/gosec/rules/blacklist.go
new file mode 100644
index 00000000000..cf57f2c7403
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/blacklist.go
@@ -0,0 +1,94 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "strings"
+
+ "github.com/golangci/gosec"
+)
+
+type blacklistedImport struct {
+ gosec.MetaData
+ Blacklisted map[string]string
+}
+
+func unquote(original string) string {
+ copy := strings.TrimSpace(original)
+ copy = strings.TrimLeft(copy, `"`)
+ return strings.TrimRight(copy, `"`)
+}
+
+func (r *blacklistedImport) ID() string {
+ return r.MetaData.ID
+}
+
+func (r *blacklistedImport) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if node, ok := n.(*ast.ImportSpec); ok {
+ if description, ok := r.Blacklisted[unquote(node.Path.Value)]; ok {
+ return gosec.NewIssue(c, node, r.ID(), description, r.Severity, r.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewBlacklistedImports reports when a blacklisted import is being used.
+// Typically when a deprecated technology is being used.
+func NewBlacklistedImports(id string, conf gosec.Config, blacklist map[string]string) (gosec.Rule, []ast.Node) {
+ return &blacklistedImport{
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ },
+ Blacklisted: blacklist,
+ }, []ast.Node{(*ast.ImportSpec)(nil)}
+}
+
+// NewBlacklistedImportMD5 fails if MD5 is imported
+func NewBlacklistedImportMD5(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return NewBlacklistedImports(id, conf, map[string]string{
+ "crypto/md5": "Blacklisted import crypto/md5: weak cryptographic primitive",
+ })
+}
+
+// NewBlacklistedImportDES fails if DES is imported
+func NewBlacklistedImportDES(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return NewBlacklistedImports(id, conf, map[string]string{
+ "crypto/des": "Blacklisted import crypto/des: weak cryptographic primitive",
+ })
+}
+
+// NewBlacklistedImportRC4 fails if DES is imported
+func NewBlacklistedImportRC4(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return NewBlacklistedImports(id, conf, map[string]string{
+ "crypto/rc4": "Blacklisted import crypto/rc4: weak cryptographic primitive",
+ })
+}
+
+// NewBlacklistedImportCGI fails if CGI is imported
+func NewBlacklistedImportCGI(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return NewBlacklistedImports(id, conf, map[string]string{
+ "net/http/cgi": "Blacklisted import net/http/cgi: Go versions < 1.6.3 are vulnerable to Httpoxy attack: (CVE-2016-5386)",
+ })
+}
+
+// NewBlacklistedImportSHA1 fails if SHA1 is imported
+func NewBlacklistedImportSHA1(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return NewBlacklistedImports(id, conf, map[string]string{
+ "crypto/sha1": "Blacklisted import crypto/sha1: weak cryptographic primitive",
+ })
+}
diff --git a/vendor/github.com/golangci/gosec/rules/errors.go b/vendor/github.com/golangci/gosec/rules/errors.go
new file mode 100644
index 00000000000..e7e7773c70e
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/errors.go
@@ -0,0 +1,102 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/golangci/gosec"
+)
+
+type noErrorCheck struct {
+ gosec.MetaData
+ whitelist gosec.CallList
+}
+
+func (r *noErrorCheck) ID() string {
+ return r.MetaData.ID
+}
+
+func returnsError(callExpr *ast.CallExpr, ctx *gosec.Context) int {
+ if tv := ctx.Info.TypeOf(callExpr); tv != nil {
+ switch t := tv.(type) {
+ case *types.Tuple:
+ for pos := 0; pos < t.Len(); pos++ {
+ variable := t.At(pos)
+ if variable != nil && variable.Type().String() == "error" {
+ return pos
+ }
+ }
+ case *types.Named:
+ if t.String() == "error" {
+ return 0
+ }
+ }
+ }
+ return -1
+}
+
+func (r *noErrorCheck) Match(n ast.Node, ctx *gosec.Context) (*gosec.Issue, error) {
+ switch stmt := n.(type) {
+ case *ast.AssignStmt:
+ for _, expr := range stmt.Rhs {
+ if callExpr, ok := expr.(*ast.CallExpr); ok && r.whitelist.ContainsCallExpr(expr, ctx) == nil {
+ pos := returnsError(callExpr, ctx)
+ if pos < 0 || pos >= len(stmt.Lhs) {
+ return nil, nil
+ }
+ if id, ok := stmt.Lhs[pos].(*ast.Ident); ok && id.Name == "_" {
+ return gosec.NewIssue(ctx, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ }
+ case *ast.ExprStmt:
+ if callExpr, ok := stmt.X.(*ast.CallExpr); ok && r.whitelist.ContainsCallExpr(stmt.X, ctx) == nil {
+ pos := returnsError(callExpr, ctx)
+ if pos >= 0 {
+ return gosec.NewIssue(ctx, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ }
+ return nil, nil
+}
+
+// NewNoErrorCheck detects if the returned error is unchecked
+func NewNoErrorCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ // TODO(gm) Come up with sensible defaults here. Or flip it to use a
+ // black list instead.
+ whitelist := gosec.NewCallList()
+ whitelist.AddAll("bytes.Buffer", "Write", "WriteByte", "WriteRune", "WriteString")
+ whitelist.AddAll("fmt", "Print", "Printf", "Println", "Fprint", "Fprintf", "Fprintln")
+ whitelist.Add("io.PipeWriter", "CloseWithError")
+
+ if configured, ok := conf["G104"]; ok {
+ if whitelisted, ok := configured.(map[string][]string); ok {
+ for key, val := range whitelisted {
+ whitelist.AddAll(key, val...)
+ }
+ }
+ }
+ return &noErrorCheck{
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Low,
+ Confidence: gosec.High,
+ What: "Errors unhandled.",
+ },
+ whitelist: whitelist,
+ }, []ast.Node{(*ast.AssignStmt)(nil), (*ast.ExprStmt)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/fileperms.go b/vendor/github.com/golangci/gosec/rules/fileperms.go
new file mode 100644
index 00000000000..7458bfec34b
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/fileperms.go
@@ -0,0 +1,95 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "fmt"
+ "go/ast"
+ "strconv"
+
+ "github.com/golangci/gosec"
+)
+
+type filePermissions struct {
+ gosec.MetaData
+ mode int64
+ pkg string
+ calls []string
+}
+
+func (r *filePermissions) ID() string {
+ return r.MetaData.ID
+}
+
+func getConfiguredMode(conf map[string]interface{}, configKey string, defaultMode int64) int64 {
+ var mode = defaultMode
+ if value, ok := conf[configKey]; ok {
+ switch value.(type) {
+ case int64:
+ mode = value.(int64)
+ case string:
+ if m, e := strconv.ParseInt(value.(string), 0, 64); e != nil {
+ mode = defaultMode
+ } else {
+ mode = m
+ }
+ }
+ }
+ return mode
+}
+
+func (r *filePermissions) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if callexpr, matched := gosec.MatchCallByPackage(n, c, r.pkg, r.calls...); matched {
+ modeArg := callexpr.Args[len(callexpr.Args)-1]
+ if mode, err := gosec.GetInt(modeArg); err == nil && mode > r.mode {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewFilePerms creates a rule to detect file creation with a more permissive than configured
+// permission mask.
+func NewFilePerms(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ mode := getConfiguredMode(conf, "G302", 0600)
+ return &filePermissions{
+ mode: mode,
+ pkg: "os",
+ calls: []string{"OpenFile", "Chmod"},
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: fmt.Sprintf("Expect file permissions to be %#o or less", mode),
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
+
+// NewMkdirPerms creates a rule to detect directory creation with more permissive than
+// configured permission mask.
+func NewMkdirPerms(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ mode := getConfiguredMode(conf, "G301", 0750)
+ return &filePermissions{
+ mode: mode,
+ pkg: "os",
+ calls: []string{"Mkdir", "MkdirAll"},
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: fmt.Sprintf("Expect directory permissions to be %#o or less", mode),
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/hardcoded_credentials.go b/vendor/github.com/golangci/gosec/rules/hardcoded_credentials.go
new file mode 100644
index 00000000000..2e0dd9a9257
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/hardcoded_credentials.go
@@ -0,0 +1,147 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "regexp"
+ "strconv"
+
+ zxcvbn "github.com/nbutton23/zxcvbn-go"
+ "github.com/golangci/gosec"
+)
+
+type credentials struct {
+ gosec.MetaData
+ pattern *regexp.Regexp
+ entropyThreshold float64
+ perCharThreshold float64
+ truncate int
+ ignoreEntropy bool
+}
+
+func (r *credentials) ID() string {
+ return r.MetaData.ID
+}
+
+func truncate(s string, n int) string {
+ if n > len(s) {
+ return s
+ }
+ return s[:n]
+}
+
+func (r *credentials) isHighEntropyString(str string) bool {
+ s := truncate(str, r.truncate)
+ info := zxcvbn.PasswordStrength(s, []string{})
+ entropyPerChar := info.Entropy / float64(len(s))
+ return (info.Entropy >= r.entropyThreshold ||
+ (info.Entropy >= (r.entropyThreshold/2) &&
+ entropyPerChar >= r.perCharThreshold))
+}
+
+func (r *credentials) Match(n ast.Node, ctx *gosec.Context) (*gosec.Issue, error) {
+ switch node := n.(type) {
+ case *ast.AssignStmt:
+ return r.matchAssign(node, ctx)
+ case *ast.ValueSpec:
+ return r.matchValueSpec(node, ctx)
+ }
+ return nil, nil
+}
+
+func (r *credentials) matchAssign(assign *ast.AssignStmt, ctx *gosec.Context) (*gosec.Issue, error) {
+ for _, i := range assign.Lhs {
+ if ident, ok := i.(*ast.Ident); ok {
+ if r.pattern.MatchString(ident.Name) {
+ for _, e := range assign.Rhs {
+ if val, err := gosec.GetString(e); err == nil {
+ if r.ignoreEntropy || (!r.ignoreEntropy && r.isHighEntropyString(val)) {
+ return gosec.NewIssue(ctx, assign, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ }
+ }
+ }
+ }
+ return nil, nil
+}
+
+func (r *credentials) matchValueSpec(valueSpec *ast.ValueSpec, ctx *gosec.Context) (*gosec.Issue, error) {
+ for index, ident := range valueSpec.Names {
+ if r.pattern.MatchString(ident.Name) && valueSpec.Values != nil {
+ // const foo, bar = "same value"
+ if len(valueSpec.Values) <= index {
+ index = len(valueSpec.Values) - 1
+ }
+ if val, err := gosec.GetString(valueSpec.Values[index]); err == nil {
+ if r.ignoreEntropy || (!r.ignoreEntropy && r.isHighEntropyString(val)) {
+ return gosec.NewIssue(ctx, valueSpec, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ }
+ }
+ return nil, nil
+}
+
+// NewHardcodedCredentials attempts to find high entropy string constants being
+// assigned to variables that appear to be related to credentials.
+func NewHardcodedCredentials(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ pattern := `(?i)passwd|pass|password|pwd|secret|token`
+ entropyThreshold := 80.0
+ perCharThreshold := 3.0
+ ignoreEntropy := false
+ var truncateString = 16
+ if val, ok := conf["G101"]; ok {
+ conf := val.(map[string]string)
+ if configPattern, ok := conf["pattern"]; ok {
+ pattern = configPattern
+ }
+ if configIgnoreEntropy, ok := conf["ignore_entropy"]; ok {
+ if parsedBool, err := strconv.ParseBool(configIgnoreEntropy); err == nil {
+ ignoreEntropy = parsedBool
+ }
+ }
+ if configEntropyThreshold, ok := conf["entropy_threshold"]; ok {
+ if parsedNum, err := strconv.ParseFloat(configEntropyThreshold, 64); err == nil {
+ entropyThreshold = parsedNum
+ }
+ }
+ if configCharThreshold, ok := conf["per_char_threshold"]; ok {
+ if parsedNum, err := strconv.ParseFloat(configCharThreshold, 64); err == nil {
+ perCharThreshold = parsedNum
+ }
+ }
+ if configTruncate, ok := conf["truncate"]; ok {
+ if parsedInt, err := strconv.Atoi(configTruncate); err == nil {
+ truncateString = parsedInt
+ }
+ }
+ }
+
+ return &credentials{
+ pattern: regexp.MustCompile(pattern),
+ entropyThreshold: entropyThreshold,
+ perCharThreshold: perCharThreshold,
+ ignoreEntropy: ignoreEntropy,
+ truncate: truncateString,
+ MetaData: gosec.MetaData{
+ ID: id,
+ What: "Potential hardcoded credentials",
+ Confidence: gosec.Low,
+ Severity: gosec.High,
+ },
+ }, []ast.Node{(*ast.AssignStmt)(nil), (*ast.ValueSpec)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/rand.go b/vendor/github.com/golangci/gosec/rules/rand.go
new file mode 100644
index 00000000000..c1254d37da6
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/rand.go
@@ -0,0 +1,55 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type weakRand struct {
+ gosec.MetaData
+ funcNames []string
+ packagePath string
+}
+
+func (w *weakRand) ID() string {
+ return w.MetaData.ID
+}
+
+func (w *weakRand) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ for _, funcName := range w.funcNames {
+ if _, matched := gosec.MatchCallByPackage(n, c, w.packagePath, funcName); matched {
+ return gosec.NewIssue(c, n, w.ID(), w.What, w.Severity, w.Confidence), nil
+ }
+ }
+
+ return nil, nil
+}
+
+// NewWeakRandCheck detects the use of random number generator that isn't cryptographically secure
+func NewWeakRandCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &weakRand{
+ funcNames: []string{"Read", "Int"},
+ packagePath: "math/rand",
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.High,
+ Confidence: gosec.Medium,
+ What: "Use of weak random number generator (math/rand instead of crypto/rand)",
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/readfile.go b/vendor/github.com/golangci/gosec/rules/readfile.go
new file mode 100644
index 00000000000..e32597b05e1
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/readfile.go
@@ -0,0 +1,106 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/golangci/gosec"
+)
+
+type readfile struct {
+ gosec.MetaData
+ gosec.CallList
+ pathJoin gosec.CallList
+}
+
+// ID returns the identifier for this rule
+func (r *readfile) ID() string {
+ return r.MetaData.ID
+}
+
+// isJoinFunc checks if there is a filepath.Join or other join function
+func (r *readfile) isJoinFunc(n ast.Node, c *gosec.Context) bool {
+ if call := r.pathJoin.ContainsCallExpr(n, c); call != nil {
+ for _, arg := range call.Args {
+ // edge case: check if one of the args is a BinaryExpr
+ if binExp, ok := arg.(*ast.BinaryExpr); ok {
+ // iterate and resolve all found identites from the BinaryExpr
+ if _, ok := gosec.FindVarIdentities(binExp, c); ok {
+ return true
+ }
+ }
+
+ // try and resolve identity
+ if ident, ok := arg.(*ast.Ident); ok {
+ obj := c.Info.ObjectOf(ident)
+ if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) {
+ return true
+ }
+ }
+ }
+}
+ return false
+}
+
+// Match inspects AST nodes to determine if the match the methods `os.Open` or `ioutil.ReadFile`
+func (r *readfile) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if node := r.ContainsCallExpr(n, c); node != nil {
+ for _, arg := range node.Args {
+ // handles path joining functions in Arg
+ // eg. os.Open(filepath.Join("/tmp/", file))
+ if callExpr, ok := arg.(*ast.CallExpr); ok {
+ if r.isJoinFunc(callExpr, c) {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ // handles binary string concatenation eg. ioutil.Readfile("/tmp/" + file + "/blob")
+ if binExp, ok := arg.(*ast.BinaryExpr); ok {
+ // resolve all found identites from the BinaryExpr
+ if _, ok := gosec.FindVarIdentities(binExp, c); ok {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+
+ if ident, ok := arg.(*ast.Ident); ok {
+ obj := c.Info.ObjectOf(ident)
+ if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ }
+ }
+ return nil, nil
+}
+
+// NewReadFile detects cases where we read files
+func NewReadFile(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ rule := &readfile{
+ pathJoin: gosec.NewCallList(),
+ CallList: gosec.NewCallList(),
+ MetaData: gosec.MetaData{
+ ID: id,
+ What: "Potential file inclusion via variable",
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ },
+ }
+ rule.pathJoin.Add("path/filepath", "Join")
+ rule.pathJoin.Add("path", "Join")
+ rule.Add("io/ioutil", "ReadFile")
+ rule.Add("os", "Open")
+ return rule, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/rsa.go b/vendor/github.com/golangci/gosec/rules/rsa.go
new file mode 100644
index 00000000000..860cb07f9dc
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/rsa.go
@@ -0,0 +1,58 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "fmt"
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type weakKeyStrength struct {
+ gosec.MetaData
+ calls gosec.CallList
+ bits int
+}
+
+func (w *weakKeyStrength) ID() string {
+ return w.MetaData.ID
+}
+
+func (w *weakKeyStrength) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if callExpr := w.calls.ContainsCallExpr(n, c); callExpr != nil {
+ if bits, err := gosec.GetInt(callExpr.Args[1]); err == nil && bits < (int64)(w.bits) {
+ return gosec.NewIssue(c, n, w.ID(), w.What, w.Severity, w.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewWeakKeyStrength builds a rule that detects RSA keys < 2048 bits
+func NewWeakKeyStrength(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ calls := gosec.NewCallList()
+ calls.Add("crypto/rsa", "GenerateKey")
+ bits := 2048
+ return &weakKeyStrength{
+ calls: calls,
+ bits: bits,
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: fmt.Sprintf("RSA keys should be at least %d bits", bits),
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/rulelist.go b/vendor/github.com/golangci/gosec/rules/rulelist.go
new file mode 100644
index 00000000000..8ea937a6a49
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/rulelist.go
@@ -0,0 +1,108 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import "github.com/golangci/gosec"
+
+// RuleDefinition contains the description of a rule and a mechanism to
+// create it.
+type RuleDefinition struct {
+ ID string
+ Description string
+ Create gosec.RuleBuilder
+}
+
+// RuleList is a mapping of rule ID's to rule definitions
+type RuleList map[string]RuleDefinition
+
+// Builders returns all the create methods for a given rule list
+func (rl RuleList) Builders() map[string]gosec.RuleBuilder {
+ builders := make(map[string]gosec.RuleBuilder)
+ for _, def := range rl {
+ builders[def.ID] = def.Create
+ }
+ return builders
+}
+
+// RuleFilter can be used to include or exclude a rule depending on the return
+// value of the function
+type RuleFilter func(string) bool
+
+// NewRuleFilter is a closure that will include/exclude the rule ID's based on
+// the supplied boolean value.
+func NewRuleFilter(action bool, ruleIDs ...string) RuleFilter {
+ rulelist := make(map[string]bool)
+ for _, rule := range ruleIDs {
+ rulelist[rule] = true
+ }
+ return func(rule string) bool {
+ if _, found := rulelist[rule]; found {
+ return action
+ }
+ return !action
+ }
+}
+
+// Generate the list of rules to use
+func Generate(filters ...RuleFilter) RuleList {
+ rules := []RuleDefinition{
+ // misc
+ {"G101", "Look for hardcoded credentials", NewHardcodedCredentials},
+ {"G102", "Bind to all interfaces", NewBindsToAllNetworkInterfaces},
+ {"G103", "Audit the use of unsafe block", NewUsingUnsafe},
+ {"G104", "Audit errors not checked", NewNoErrorCheck},
+ {"G105", "Audit the use of big.Exp function", NewUsingBigExp},
+ {"G106", "Audit the use of ssh.InsecureIgnoreHostKey function", NewSSHHostKey},
+
+ // injection
+ {"G201", "SQL query construction using format string", NewSQLStrFormat},
+ {"G202", "SQL query construction using string concatenation", NewSQLStrConcat},
+ {"G203", "Use of unescaped data in HTML templates", NewTemplateCheck},
+ {"G204", "Audit use of command execution", NewSubproc},
+
+ // filesystem
+ {"G301", "Poor file permissions used when creating a directory", NewMkdirPerms},
+ {"G302", "Poor file permisions used when creation file or using chmod", NewFilePerms},
+ {"G303", "Creating tempfile using a predictable path", NewBadTempFile},
+ {"G304", "File path provided as taint input", NewReadFile},
+ {"G305", "File path traversal when extracting zip archive", NewArchive},
+
+ // crypto
+ {"G401", "Detect the usage of DES, RC4, MD5 or SHA1", NewUsesWeakCryptography},
+ {"G402", "Look for bad TLS connection settings", NewIntermediateTLSCheck},
+ {"G403", "Ensure minimum RSA key length of 2048 bits", NewWeakKeyStrength},
+ {"G404", "Insecure random number source (rand)", NewWeakRandCheck},
+
+ // blacklist
+ {"G501", "Import blacklist: crypto/md5", NewBlacklistedImportMD5},
+ {"G502", "Import blacklist: crypto/des", NewBlacklistedImportDES},
+ {"G503", "Import blacklist: crypto/rc4", NewBlacklistedImportRC4},
+ {"G504", "Import blacklist: net/http/cgi", NewBlacklistedImportCGI},
+ {"G505", "Import blacklist: crypto/sha1", NewBlacklistedImportSHA1},
+ }
+
+ ruleMap := make(map[string]RuleDefinition)
+
+RULES:
+ for _, rule := range rules {
+ for _, filter := range filters {
+ if filter(rule.ID) {
+ continue RULES
+ }
+ }
+ ruleMap[rule.ID] = rule
+ }
+ return ruleMap
+}
diff --git a/vendor/github.com/golangci/gosec/rules/sql.go b/vendor/github.com/golangci/gosec/rules/sql.go
new file mode 100644
index 00000000000..14201386cce
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/sql.go
@@ -0,0 +1,166 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "regexp"
+
+ "github.com/golangci/gosec"
+)
+
+type sqlStatement struct {
+ gosec.MetaData
+
+ // Contains a list of patterns which must all match for the rule to match.
+ patterns []*regexp.Regexp
+}
+
+func (s *sqlStatement) ID() string {
+ return s.MetaData.ID
+}
+
+// See if the string matches the patterns for the statement.
+func (s *sqlStatement) MatchPatterns(str string) bool {
+ for _, pattern := range s.patterns {
+ if !pattern.MatchString(str) {
+ return false
+ }
+ }
+ return true
+}
+
+type sqlStrConcat struct {
+ sqlStatement
+}
+
+func (s *sqlStrConcat) ID() string {
+ return s.MetaData.ID
+}
+
+// see if we can figure out what it is
+func (s *sqlStrConcat) checkObject(n *ast.Ident) bool {
+ if n.Obj != nil {
+ return n.Obj.Kind != ast.Var && n.Obj.Kind != ast.Fun
+ }
+ return false
+}
+
+// Look for "SELECT * FROM table WHERE " + " ' OR 1=1"
+func (s *sqlStrConcat) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if node, ok := n.(*ast.BinaryExpr); ok {
+ if start, ok := node.X.(*ast.BasicLit); ok {
+ if str, e := gosec.GetString(start); e == nil {
+ if !s.MatchPatterns(str) {
+ return nil, nil
+ }
+ if _, ok := node.Y.(*ast.BasicLit); ok {
+ return nil, nil // string cat OK
+ }
+ if second, ok := node.Y.(*ast.Ident); ok && s.checkObject(second) {
+ return nil, nil
+ }
+ return gosec.NewIssue(c, n, s.ID(), s.What, s.Severity, s.Confidence), nil
+ }
+ }
+ }
+ return nil, nil
+}
+
+// NewSQLStrConcat looks for cases where we are building SQL strings via concatenation
+func NewSQLStrConcat(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &sqlStrConcat{
+ sqlStatement: sqlStatement{
+ patterns: []*regexp.Regexp{
+ regexp.MustCompile(`(?)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) `),
+ },
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: "SQL string concatenation",
+ },
+ },
+ }, []ast.Node{(*ast.BinaryExpr)(nil)}
+}
+
+type sqlStrFormat struct {
+ sqlStatement
+ calls gosec.CallList
+ noIssue gosec.CallList
+}
+
+// Looks for "fmt.Sprintf("SELECT * FROM foo where '%s', userInput)"
+func (s *sqlStrFormat) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+
+ // argIndex changes the function argument which gets matched to the regex
+ argIndex := 0
+
+ // TODO(gm) improve confidence if database/sql is being used
+ if node := s.calls.ContainsCallExpr(n, c); node != nil {
+ // if the function is fmt.Fprintf, search for SQL statement in Args[1] instead
+ if sel, ok := node.Fun.(*ast.SelectorExpr); ok {
+ if sel.Sel.Name == "Fprintf" {
+ // if os.Stderr or os.Stdout is in Arg[0], mark as no issue
+ if arg, ok := node.Args[0].(*ast.SelectorExpr); ok {
+ if ident, ok := arg.X.(*ast.Ident); ok {
+ if s.noIssue.Contains(ident.Name, arg.Sel.Name) {
+ return nil, nil
+ }
+ }
+ }
+ // the function is Fprintf so set argIndex = 1
+ argIndex = 1
+ }
+ }
+ // concats callexpr arg strings together if needed before regex evaluation
+ if argExpr, ok := node.Args[argIndex].(*ast.BinaryExpr); ok {
+ if fullStr, ok := gosec.ConcatString(argExpr); ok {
+ if s.MatchPatterns(fullStr) {
+ return gosec.NewIssue(c, n, s.ID(), s.What, s.Severity, s.Confidence),
+ nil
+ }
+ }
+ }
+
+ if arg, e := gosec.GetString(node.Args[argIndex]); s.MatchPatterns(arg) && e == nil {
+ return gosec.NewIssue(c, n, s.ID(), s.What, s.Severity, s.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewSQLStrFormat looks for cases where we're building SQL query strings using format strings
+func NewSQLStrFormat(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ rule := &sqlStrFormat{
+ calls: gosec.NewCallList(),
+ noIssue: gosec.NewCallList(),
+ sqlStatement: sqlStatement{
+ patterns: []*regexp.Regexp{
+ regexp.MustCompile("(?)(SELECT|DELETE|INSERT|UPDATE|INTO|FROM|WHERE) "),
+ regexp.MustCompile("%[^bdoxXfFp]"),
+ },
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: "SQL string formatting",
+ },
+ },
+ }
+ rule.calls.AddAll("fmt", "Sprint", "Sprintf", "Sprintln", "Fprintf")
+ rule.noIssue.AddAll("os", "Stdout", "Stderr")
+ return rule, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/ssh.go b/vendor/github.com/golangci/gosec/rules/ssh.go
new file mode 100644
index 00000000000..dfab3dd3041
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/ssh.go
@@ -0,0 +1,38 @@
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type sshHostKey struct {
+ gosec.MetaData
+ pkg string
+ calls []string
+}
+
+func (r *sshHostKey) ID() string {
+ return r.MetaData.ID
+}
+
+func (r *sshHostKey) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) {
+ if _, matches := gosec.MatchCallByPackage(n, c, r.pkg, r.calls...); matches {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ return nil, nil
+}
+
+// NewSSHHostKey rule detects the use of insecure ssh HostKeyCallback.
+func NewSSHHostKey(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &sshHostKey{
+ pkg: "golang.org/x/crypto/ssh",
+ calls: []string{"InsecureIgnoreHostKey"},
+ MetaData: gosec.MetaData{
+ ID: id,
+ What: "Use of ssh InsecureIgnoreHostKey should be audited",
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/subproc.go b/vendor/github.com/golangci/gosec/rules/subproc.go
new file mode 100644
index 00000000000..f2735da6d9c
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/subproc.go
@@ -0,0 +1,64 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "go/types"
+
+ "github.com/golangci/gosec"
+)
+
+type subprocess struct {
+ gosec.MetaData
+ gosec.CallList
+}
+
+func (r *subprocess) ID() string {
+ return r.MetaData.ID
+}
+
+// TODO(gm) The only real potential for command injection with a Go project
+// is something like this:
+//
+// syscall.Exec("/bin/sh", []string{"-c", tainted})
+//
+// E.g. Input is correctly escaped but the execution context being used
+// is unsafe. For example:
+//
+// syscall.Exec("echo", "foobar" + tainted)
+func (r *subprocess) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if node := r.ContainsCallExpr(n, c); node != nil {
+ for _, arg := range node.Args {
+ if ident, ok := arg.(*ast.Ident); ok {
+ obj := c.Info.ObjectOf(ident)
+ if _, ok := obj.(*types.Var); ok && !gosec.TryResolve(ident, c) {
+ return gosec.NewIssue(c, n, r.ID(), "Subprocess launched with variable", gosec.Medium, gosec.High), nil
+ }
+ }
+ }
+ return gosec.NewIssue(c, n, r.ID(), "Subprocess launching should be audited", gosec.Low, gosec.High), nil
+ }
+ return nil, nil
+}
+
+// NewSubproc detects cases where we are forking out to an external process
+func NewSubproc(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ rule := &subprocess{gosec.MetaData{ID: id}, gosec.NewCallList()}
+ rule.Add("os/exec", "Command")
+ rule.Add("os/exec", "CommandContext")
+ rule.Add("syscall", "Exec")
+ return rule, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/tempfiles.go b/vendor/github.com/golangci/gosec/rules/tempfiles.go
new file mode 100644
index 00000000000..b14640cc9a1
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/tempfiles.go
@@ -0,0 +1,58 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+ "regexp"
+
+ "github.com/golangci/gosec"
+)
+
+type badTempFile struct {
+ gosec.MetaData
+ calls gosec.CallList
+ args *regexp.Regexp
+}
+
+func (t *badTempFile) ID() string {
+ return t.MetaData.ID
+}
+
+func (t *badTempFile) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) {
+ if node := t.calls.ContainsCallExpr(n, c); node != nil {
+ if arg, e := gosec.GetString(node.Args[0]); t.args.MatchString(arg) && e == nil {
+ return gosec.NewIssue(c, n, t.ID(), t.What, t.Severity, t.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewBadTempFile detects direct writes to predictable path in temporary directory
+func NewBadTempFile(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ calls := gosec.NewCallList()
+ calls.Add("io/ioutil", "WriteFile")
+ calls.Add("os", "Create")
+ return &badTempFile{
+ calls: calls,
+ args: regexp.MustCompile(`^/tmp/.*$|^/var/tmp/.*$`),
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: "File creation in shared tmp directory without using ioutil.Tempfile",
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/templates.go b/vendor/github.com/golangci/gosec/rules/templates.go
new file mode 100644
index 00000000000..a45141eace6
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/templates.go
@@ -0,0 +1,61 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type templateCheck struct {
+ gosec.MetaData
+ calls gosec.CallList
+}
+
+func (t *templateCheck) ID() string {
+ return t.MetaData.ID
+}
+
+func (t *templateCheck) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if node := t.calls.ContainsCallExpr(n, c); node != nil {
+ for _, arg := range node.Args {
+ if _, ok := arg.(*ast.BasicLit); !ok { // basic lits are safe
+ return gosec.NewIssue(c, n, t.ID(), t.What, t.Severity, t.Confidence), nil
+ }
+ }
+ }
+ return nil, nil
+}
+
+// NewTemplateCheck constructs the template check rule. This rule is used to
+// find use of tempaltes where HTML/JS escaping is not being used
+func NewTemplateCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+
+ calls := gosec.NewCallList()
+ calls.Add("html/template", "HTML")
+ calls.Add("html/template", "HTMLAttr")
+ calls.Add("html/template", "JS")
+ calls.Add("html/template", "URL")
+ return &templateCheck{
+ calls: calls,
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.Low,
+ What: "this method will not auto-escape HTML. Verify data is well formed.",
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/tls.go b/vendor/github.com/golangci/gosec/rules/tls.go
new file mode 100644
index 00000000000..b518581d170
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/tls.go
@@ -0,0 +1,130 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+//go:generate tlsconfig
+
+package rules
+
+import (
+ "fmt"
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type insecureConfigTLS struct {
+ gosec.MetaData
+ MinVersion int16
+ MaxVersion int16
+ requiredType string
+ goodCiphers []string
+}
+
+func (t *insecureConfigTLS) ID() string {
+ return t.MetaData.ID
+}
+
+func stringInSlice(a string, list []string) bool {
+ for _, b := range list {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
+
+func (t *insecureConfigTLS) processTLSCipherSuites(n ast.Node, c *gosec.Context) *gosec.Issue {
+
+ if ciphers, ok := n.(*ast.CompositeLit); ok {
+ for _, cipher := range ciphers.Elts {
+ if ident, ok := cipher.(*ast.SelectorExpr); ok {
+ if !stringInSlice(ident.Sel.Name, t.goodCiphers) {
+ err := fmt.Sprintf("TLS Bad Cipher Suite: %s", ident.Sel.Name)
+ return gosec.NewIssue(c, ident, t.ID(), err, gosec.High, gosec.High)
+ }
+ }
+ }
+ }
+ return nil
+}
+
+func (t *insecureConfigTLS) processTLSConfVal(n *ast.KeyValueExpr, c *gosec.Context) *gosec.Issue {
+ if ident, ok := n.Key.(*ast.Ident); ok {
+ switch ident.Name {
+
+ case "InsecureSkipVerify":
+ if node, ok := n.Value.(*ast.Ident); ok {
+ if node.Name != "false" {
+ return gosec.NewIssue(c, n, t.ID(), "TLS InsecureSkipVerify set true.", gosec.High, gosec.High)
+ }
+ } else {
+ // TODO(tk): symbol tab look up to get the actual value
+ return gosec.NewIssue(c, n, t.ID(), "TLS InsecureSkipVerify may be true.", gosec.High, gosec.Low)
+ }
+
+ case "PreferServerCipherSuites":
+ if node, ok := n.Value.(*ast.Ident); ok {
+ if node.Name == "false" {
+ return gosec.NewIssue(c, n, t.ID(), "TLS PreferServerCipherSuites set false.", gosec.Medium, gosec.High)
+ }
+ } else {
+ // TODO(tk): symbol tab look up to get the actual value
+ return gosec.NewIssue(c, n, t.ID(), "TLS PreferServerCipherSuites may be false.", gosec.Medium, gosec.Low)
+ }
+
+ case "MinVersion":
+ if ival, ierr := gosec.GetInt(n.Value); ierr == nil {
+ if (int16)(ival) < t.MinVersion {
+ return gosec.NewIssue(c, n, t.ID(), "TLS MinVersion too low.", gosec.High, gosec.High)
+ }
+ // TODO(tk): symbol tab look up to get the actual value
+ return gosec.NewIssue(c, n, t.ID(), "TLS MinVersion may be too low.", gosec.High, gosec.Low)
+ }
+
+ case "MaxVersion":
+ if ival, ierr := gosec.GetInt(n.Value); ierr == nil {
+ if (int16)(ival) < t.MaxVersion {
+ return gosec.NewIssue(c, n, t.ID(), "TLS MaxVersion too low.", gosec.High, gosec.High)
+ }
+ // TODO(tk): symbol tab look up to get the actual value
+ return gosec.NewIssue(c, n, t.ID(), "TLS MaxVersion may be too low.", gosec.High, gosec.Low)
+ }
+
+ case "CipherSuites":
+ if ret := t.processTLSCipherSuites(n.Value, c); ret != nil {
+ return ret
+ }
+
+ }
+
+ }
+ return nil
+}
+
+func (t *insecureConfigTLS) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ if complit, ok := n.(*ast.CompositeLit); ok && complit.Type != nil {
+ actualType := c.Info.TypeOf(complit.Type)
+ if actualType != nil && actualType.String() == t.requiredType {
+ for _, elt := range complit.Elts {
+ if kve, ok := elt.(*ast.KeyValueExpr); ok {
+ issue := t.processTLSConfVal(kve, c)
+ if issue != nil {
+ return issue, nil
+ }
+ }
+ }
+ }
+ }
+ return nil, nil
+}
diff --git a/vendor/github.com/golangci/gosec/rules/tls_config.go b/vendor/github.com/golangci/gosec/rules/tls_config.go
new file mode 100644
index 00000000000..bfb241be8f0
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/tls_config.go
@@ -0,0 +1,141 @@
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+// NewModernTLSCheck creates a check for Modern TLS ciphers
+// DO NOT EDIT - generated by tlsconfig tool
+func NewModernTLSCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &insecureConfigTLS{
+ MetaData: gosec.MetaData{ID: id},
+ requiredType: "crypto/tls.Config",
+ MinVersion: 0x0303,
+ MaxVersion: 0x0303,
+ goodCiphers: []string{
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
+ },
+ }, []ast.Node{(*ast.CompositeLit)(nil)}
+}
+
+// NewIntermediateTLSCheck creates a check for Intermediate TLS ciphers
+// DO NOT EDIT - generated by tlsconfig tool
+func NewIntermediateTLSCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &insecureConfigTLS{
+ MetaData: gosec.MetaData{ID: id},
+ requiredType: "crypto/tls.Config",
+ MinVersion: 0x0301,
+ MaxVersion: 0x0303,
+ goodCiphers: []string{
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
+ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_RSA_WITH_AES_256_CBC_SHA256",
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
+ },
+ }, []ast.Node{(*ast.CompositeLit)(nil)}
+}
+
+// NewOldTLSCheck creates a check for Old TLS ciphers
+// DO NOT EDIT - generated by tlsconfig tool
+func NewOldTLSCheck(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &insecureConfigTLS{
+ MetaData: gosec.MetaData{ID: id},
+ requiredType: "crypto/tls.Config",
+ MinVersion: 0x0300,
+ MaxVersion: 0x0303,
+ goodCiphers: []string{
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
+ "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256",
+ "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384",
+ "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
+ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
+ "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
+ "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
+ "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_RSA_WITH_AES_128_GCM_SHA256",
+ "TLS_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_RSA_WITH_AES_128_CBC_SHA256",
+ "TLS_RSA_WITH_AES_256_CBC_SHA256",
+ "TLS_RSA_WITH_AES_128_CBC_SHA",
+ "TLS_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
+ "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384",
+ "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384",
+ "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256",
+ "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA",
+ "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA",
+ "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256",
+ "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+ "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256",
+ "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA",
+ "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA",
+ "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256",
+ "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA",
+ "TLS_DHE_RSA_WITH_SEED_CBC_SHA",
+ "TLS_DHE_DSS_WITH_SEED_CBC_SHA",
+ "TLS_RSA_WITH_SEED_CBC_SHA",
+ },
+ }, []ast.Node{(*ast.CompositeLit)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/unsafe.go b/vendor/github.com/golangci/gosec/rules/unsafe.go
new file mode 100644
index 00000000000..1498ee45d2e
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/unsafe.go
@@ -0,0 +1,53 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type usingUnsafe struct {
+ gosec.MetaData
+ pkg string
+ calls []string
+}
+
+func (r *usingUnsafe) ID() string {
+ return r.MetaData.ID
+}
+
+func (r *usingUnsafe) Match(n ast.Node, c *gosec.Context) (gi *gosec.Issue, err error) {
+ if _, matches := gosec.MatchCallByPackage(n, c, r.pkg, r.calls...); matches {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ return nil, nil
+}
+
+// NewUsingUnsafe rule detects the use of the unsafe package. This is only
+// really useful for auditing purposes.
+func NewUsingUnsafe(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ return &usingUnsafe{
+ pkg: "unsafe",
+ calls: []string{"Alignof", "Offsetof", "Sizeof", "Pointer"},
+ MetaData: gosec.MetaData{
+ ID: id,
+ What: "Use of unsafe calls should be audited",
+ Severity: gosec.Low,
+ Confidence: gosec.High,
+ },
+ }, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/gosec/rules/weakcrypto.go b/vendor/github.com/golangci/gosec/rules/weakcrypto.go
new file mode 100644
index 00000000000..fa2273f40ee
--- /dev/null
+++ b/vendor/github.com/golangci/gosec/rules/weakcrypto.go
@@ -0,0 +1,58 @@
+// (c) Copyright 2016 Hewlett Packard Enterprise Development LP
+//
+// 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.
+
+package rules
+
+import (
+ "go/ast"
+
+ "github.com/golangci/gosec"
+)
+
+type usesWeakCryptography struct {
+ gosec.MetaData
+ blacklist map[string][]string
+}
+
+func (r *usesWeakCryptography) ID() string {
+ return r.MetaData.ID
+}
+
+func (r *usesWeakCryptography) Match(n ast.Node, c *gosec.Context) (*gosec.Issue, error) {
+ for pkg, funcs := range r.blacklist {
+ if _, matched := gosec.MatchCallByPackage(n, c, pkg, funcs...); matched {
+ return gosec.NewIssue(c, n, r.ID(), r.What, r.Severity, r.Confidence), nil
+ }
+ }
+ return nil, nil
+}
+
+// NewUsesWeakCryptography detects uses of des.* md5.* or rc4.*
+func NewUsesWeakCryptography(id string, conf gosec.Config) (gosec.Rule, []ast.Node) {
+ calls := make(map[string][]string)
+ calls["crypto/des"] = []string{"NewCipher", "NewTripleDESCipher"}
+ calls["crypto/md5"] = []string{"New", "Sum"}
+ calls["crypto/sha1"] = []string{"New", "Sum"}
+ calls["crypto/rc4"] = []string{"NewCipher"}
+ rule := &usesWeakCryptography{
+ blacklist: calls,
+ MetaData: gosec.MetaData{
+ ID: id,
+ Severity: gosec.Medium,
+ Confidence: gosec.High,
+ What: "Use of weak cryptographic primitive",
+ },
+ }
+ return rule, []ast.Node{(*ast.CallExpr)(nil)}
+}
diff --git a/vendor/github.com/golangci/govet/LICENSE b/vendor/github.com/golangci/govet/LICENSE
new file mode 100644
index 00000000000..6a66aea5eaf
--- /dev/null
+++ b/vendor/github.com/golangci/govet/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/govet/README b/vendor/github.com/golangci/govet/README
new file mode 100644
index 00000000000..5ab75494d3e
--- /dev/null
+++ b/vendor/github.com/golangci/govet/README
@@ -0,0 +1,33 @@
+Vet is a tool that checks correctness of Go programs. It runs a suite of tests,
+each tailored to check for a particular class of errors. Examples include incorrect
+Printf format verbs and malformed build tags.
+
+Over time many checks have been added to vet's suite, but many more have been
+rejected as not appropriate for the tool. The criteria applied when selecting which
+checks to add are:
+
+Correctness:
+
+Vet's checks are about correctness, not style. A vet check must identify real or
+potential bugs that could cause incorrect compilation or execution. A check that
+only identifies stylistic points or alternative correct approaches to a situation
+is not acceptable.
+
+Frequency:
+
+Vet is run every day by many programmers, often as part of every compilation or
+submission. The cost in execution time is considerable, especially in aggregate,
+so checks must be likely enough to find real problems that they are worth the
+overhead of the added check. A new check that finds only a handful of problems
+across all existing programs, even if the problem is significant, is not worth
+adding to the suite everyone runs daily.
+
+Precision:
+
+Most of vet's checks are heuristic and can generate both false positives (flagging
+correct programs) and false negatives (not flagging incorrect ones). The rate of
+both these failures must be very small. A check that is too noisy will be ignored
+by the programmer overwhelmed by the output; a check that misses too many of the
+cases it's looking for will give a false sense of security. Neither is acceptable.
+A vet check must be accurate enough that everything it reports is worth examining,
+and complete enough to encourage real confidence.
diff --git a/vendor/github.com/golangci/govet/asmdecl.go b/vendor/github.com/golangci/govet/asmdecl.go
new file mode 100644
index 00000000000..01ef3fdbc34
--- /dev/null
+++ b/vendor/github.com/golangci/govet/asmdecl.go
@@ -0,0 +1,730 @@
+// 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.
+
+// Identify mismatches between assembly files and Go func declarations.
+
+package govet
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/token"
+ "go/types"
+ "regexp"
+ "strconv"
+ "strings"
+)
+
+// 'kind' is a kind of assembly variable.
+// The kinds 1, 2, 4, 8 stand for values of that size.
+type asmKind int
+
+// These special kinds are not valid sizes.
+const (
+ asmString asmKind = 100 + iota
+ asmSlice
+ asmArray
+ asmInterface
+ asmEmptyInterface
+ asmStruct
+ asmComplex
+)
+
+// An asmArch describes assembly parameters for an architecture
+type asmArch struct {
+ name string
+ bigEndian bool
+ stack string
+ lr bool
+ // calculated during initialization
+ sizes types.Sizes
+ intSize int
+ ptrSize int
+ maxAlign int
+}
+
+// An asmFunc describes the expected variables for a function on a given architecture.
+type asmFunc struct {
+ arch *asmArch
+ size int // size of all arguments
+ vars map[string]*asmVar
+ varByOffset map[int]*asmVar
+}
+
+// An asmVar describes a single assembly variable.
+type asmVar struct {
+ name string
+ kind asmKind
+ typ string
+ off int
+ size int
+ inner []*asmVar
+}
+
+var (
+ asmArch386 = asmArch{name: "386", bigEndian: false, stack: "SP", lr: false}
+ asmArchArm = asmArch{name: "arm", bigEndian: false, stack: "R13", lr: true}
+ asmArchArm64 = asmArch{name: "arm64", bigEndian: false, stack: "RSP", lr: true}
+ asmArchAmd64 = asmArch{name: "amd64", bigEndian: false, stack: "SP", lr: false}
+ asmArchAmd64p32 = asmArch{name: "amd64p32", bigEndian: false, stack: "SP", lr: false}
+ asmArchMips = asmArch{name: "mips", bigEndian: true, stack: "R29", lr: true}
+ asmArchMipsLE = asmArch{name: "mipsle", bigEndian: false, stack: "R29", lr: true}
+ asmArchMips64 = asmArch{name: "mips64", bigEndian: true, stack: "R29", lr: true}
+ asmArchMips64LE = asmArch{name: "mips64le", bigEndian: false, stack: "R29", lr: true}
+ asmArchPpc64 = asmArch{name: "ppc64", bigEndian: true, stack: "R1", lr: true}
+ asmArchPpc64LE = asmArch{name: "ppc64le", bigEndian: false, stack: "R1", lr: true}
+ asmArchS390X = asmArch{name: "s390x", bigEndian: true, stack: "R15", lr: true}
+
+ arches = []*asmArch{
+ &asmArch386,
+ &asmArchArm,
+ &asmArchArm64,
+ &asmArchAmd64,
+ &asmArchAmd64p32,
+ &asmArchMips,
+ &asmArchMipsLE,
+ &asmArchMips64,
+ &asmArchMips64LE,
+ &asmArchPpc64,
+ &asmArchPpc64LE,
+ &asmArchS390X,
+ }
+)
+
+func init() {
+ for _, arch := range arches {
+ arch.sizes = types.SizesFor("gc", arch.name)
+ if arch.sizes == nil {
+ panic("missing SizesFor for gc/" + arch.name)
+ }
+ arch.intSize = int(arch.sizes.Sizeof(types.Typ[types.Int]))
+ arch.ptrSize = int(arch.sizes.Sizeof(types.Typ[types.UnsafePointer]))
+ arch.maxAlign = int(arch.sizes.Alignof(types.Typ[types.Int64]))
+ }
+}
+
+var (
+ re = regexp.MustCompile
+ asmPlusBuild = re(`//\s+\+build\s+([^\n]+)`)
+ asmTEXT = re(`\bTEXT\b(.*)·([^\(]+)\(SB\)(?:\s*,\s*([0-9A-Z|+()]+))?(?:\s*,\s*\$(-?[0-9]+)(?:-([0-9]+))?)?`)
+ asmDATA = re(`\b(DATA|GLOBL)\b`)
+ asmNamedFP = re(`([a-zA-Z0-9_\xFF-\x{10FFFF}]+)(?:\+([0-9]+))\(FP\)`)
+ asmUnnamedFP = re(`[^+\-0-9](([0-9]+)\(FP\))`)
+ asmSP = re(`[^+\-0-9](([0-9]+)\(([A-Z0-9]+)\))`)
+ asmOpcode = re(`^\s*(?:[A-Z0-9a-z_]+:)?\s*([A-Z]+)\s*([^,]*)(?:,\s*(.*))?`)
+ ppc64Suff = re(`([BHWD])(ZU|Z|U|BR)?$`)
+)
+
+func asmCheck(pkg *Package) {
+ if !vet("asmdecl") {
+ return
+ }
+
+ // No work if no assembly files.
+ if !pkg.hasFileWithSuffix(".s") {
+ return
+ }
+
+ // Gather declarations. knownFunc[name][arch] is func description.
+ knownFunc := make(map[string]map[string]*asmFunc)
+
+ for _, f := range pkg.files {
+ if f.file != nil {
+ for _, decl := range f.file.Decls {
+ if decl, ok := decl.(*ast.FuncDecl); ok && decl.Body == nil {
+ knownFunc[decl.Name.Name] = f.asmParseDecl(decl)
+ }
+ }
+ }
+ }
+
+Files:
+ for _, f := range pkg.files {
+ if !strings.HasSuffix(f.name, ".s") {
+ continue
+ }
+ Println("Checking file", f.name)
+
+ // Determine architecture from file name if possible.
+ var arch string
+ var archDef *asmArch
+ for _, a := range arches {
+ if strings.HasSuffix(f.name, "_"+a.name+".s") {
+ arch = a.name
+ archDef = a
+ break
+ }
+ }
+
+ lines := strings.SplitAfter(string(f.content), "\n")
+ var (
+ fn *asmFunc
+ fnName string
+ localSize, argSize int
+ wroteSP bool
+ haveRetArg bool
+ retLine []int
+ )
+
+ flushRet := func() {
+ if fn != nil && fn.vars["ret"] != nil && !haveRetArg && len(retLine) > 0 {
+ v := fn.vars["ret"]
+ for _, line := range retLine {
+ f.Badf(token.NoPos, "%s:%d: [%s] %s: RET without writing to %d-byte ret+%d(FP)", f.name, line, arch, fnName, v.size, v.off)
+ }
+ }
+ retLine = nil
+ }
+ for lineno, line := range lines {
+ lineno++
+
+ badf := func(format string, args ...interface{}) {
+ f.Badf(token.NoPos, "%s:%d: [%s] %s: %s", f.name, lineno, arch, fnName, fmt.Sprintf(format, args...))
+ }
+
+ if arch == "" {
+ // Determine architecture from +build line if possible.
+ if m := asmPlusBuild.FindStringSubmatch(line); m != nil {
+ // There can be multiple architectures in a single +build line,
+ // so accumulate them all and then prefer the one that
+ // matches build.Default.GOARCH.
+ var archCandidates []*asmArch
+ for _, fld := range strings.Fields(m[1]) {
+ for _, a := range arches {
+ if a.name == fld {
+ archCandidates = append(archCandidates, a)
+ }
+ }
+ }
+ for _, a := range archCandidates {
+ if a.name == build.Default.GOARCH {
+ archCandidates = []*asmArch{a}
+ break
+ }
+ }
+ if len(archCandidates) > 0 {
+ arch = archCandidates[0].name
+ archDef = archCandidates[0]
+ }
+ }
+ }
+
+ if m := asmTEXT.FindStringSubmatch(line); m != nil {
+ flushRet()
+ if arch == "" {
+ // Arch not specified by filename or build tags.
+ // Fall back to build.Default.GOARCH.
+ for _, a := range arches {
+ if a.name == build.Default.GOARCH {
+ arch = a.name
+ archDef = a
+ break
+ }
+ }
+ if arch == "" {
+ f.Warnf(token.NoPos, "%s: cannot determine architecture for assembly file", f.name)
+ continue Files
+ }
+ }
+ fnName = m[2]
+ if pkgName := strings.TrimSpace(m[1]); pkgName != "" {
+ pathParts := strings.Split(pkgName, "∕")
+ pkgName = pathParts[len(pathParts)-1]
+ if pkgName != f.pkg.path {
+ f.Warnf(token.NoPos, "%s:%d: [%s] cannot check cross-package assembly function: %s is in package %s", f.name, lineno, arch, fnName, pkgName)
+ fn = nil
+ fnName = ""
+ continue
+ }
+ }
+ flag := m[3]
+ fn = knownFunc[fnName][arch]
+ if fn != nil {
+ size, _ := strconv.Atoi(m[5])
+ if size != fn.size && (flag != "7" && !strings.Contains(flag, "NOSPLIT") || size != 0) {
+ badf("wrong argument size %d; expected $...-%d", size, fn.size)
+ }
+ }
+ localSize, _ = strconv.Atoi(m[4])
+ localSize += archDef.intSize
+ if archDef.lr && !strings.Contains(flag, "NOFRAME") {
+ // Account for caller's saved LR
+ localSize += archDef.intSize
+ }
+ argSize, _ = strconv.Atoi(m[5])
+ if fn == nil && !strings.Contains(fnName, "<>") {
+ badf("function %s missing Go declaration", fnName)
+ }
+ wroteSP = false
+ haveRetArg = false
+ continue
+ } else if strings.Contains(line, "TEXT") && strings.Contains(line, "SB") {
+ // function, but not visible from Go (didn't match asmTEXT), so stop checking
+ flushRet()
+ fn = nil
+ fnName = ""
+ continue
+ }
+
+ if strings.Contains(line, "RET") {
+ retLine = append(retLine, lineno)
+ }
+
+ if fnName == "" {
+ continue
+ }
+
+ if asmDATA.FindStringSubmatch(line) != nil {
+ fn = nil
+ }
+
+ if archDef == nil {
+ continue
+ }
+
+ if strings.Contains(line, ", "+archDef.stack) || strings.Contains(line, ",\t"+archDef.stack) {
+ wroteSP = true
+ continue
+ }
+
+ for _, m := range asmSP.FindAllStringSubmatch(line, -1) {
+ if m[3] != archDef.stack || wroteSP {
+ continue
+ }
+ off := 0
+ if m[1] != "" {
+ off, _ = strconv.Atoi(m[2])
+ }
+ if off >= localSize {
+ if fn != nil {
+ v := fn.varByOffset[off-localSize]
+ if v != nil {
+ badf("%s should be %s+%d(FP)", m[1], v.name, off-localSize)
+ continue
+ }
+ }
+ if off >= localSize+argSize {
+ badf("use of %s points beyond argument frame", m[1])
+ continue
+ }
+ badf("use of %s to access argument frame", m[1])
+ }
+ }
+
+ if fn == nil {
+ continue
+ }
+
+ for _, m := range asmUnnamedFP.FindAllStringSubmatch(line, -1) {
+ off, _ := strconv.Atoi(m[2])
+ v := fn.varByOffset[off]
+ if v != nil {
+ badf("use of unnamed argument %s; offset %d is %s+%d(FP)", m[1], off, v.name, v.off)
+ } else {
+ badf("use of unnamed argument %s", m[1])
+ }
+ }
+
+ for _, m := range asmNamedFP.FindAllStringSubmatch(line, -1) {
+ name := m[1]
+ off := 0
+ if m[2] != "" {
+ off, _ = strconv.Atoi(m[2])
+ }
+ if name == "ret" || strings.HasPrefix(name, "ret_") {
+ haveRetArg = true
+ }
+ v := fn.vars[name]
+ if v == nil {
+ // Allow argframe+0(FP).
+ if name == "argframe" && off == 0 {
+ continue
+ }
+ v = fn.varByOffset[off]
+ if v != nil {
+ badf("unknown variable %s; offset %d is %s+%d(FP)", name, off, v.name, v.off)
+ } else {
+ badf("unknown variable %s", name)
+ }
+ continue
+ }
+ asmCheckVar(badf, fn, line, m[0], off, v)
+ }
+ }
+ flushRet()
+ }
+}
+
+func asmKindForType(t types.Type, size int) asmKind {
+ switch t := t.Underlying().(type) {
+ case *types.Basic:
+ switch t.Kind() {
+ case types.String:
+ return asmString
+ case types.Complex64, types.Complex128:
+ return asmComplex
+ }
+ return asmKind(size)
+ case *types.Pointer, *types.Chan, *types.Map, *types.Signature:
+ return asmKind(size)
+ case *types.Struct:
+ return asmStruct
+ case *types.Interface:
+ if t.Empty() {
+ return asmEmptyInterface
+ }
+ return asmInterface
+ case *types.Array:
+ return asmArray
+ case *types.Slice:
+ return asmSlice
+ }
+ panic("unreachable")
+}
+
+// A component is an assembly-addressable component of a composite type,
+// or a composite type itself.
+type component struct {
+ size int
+ offset int
+ kind asmKind
+ typ string
+ suffix string // Such as _base for string base, _0_lo for lo half of first element of [1]uint64 on 32 bit machine.
+ outer string // The suffix for immediately containing composite type.
+}
+
+func newComponent(suffix string, kind asmKind, typ string, offset, size int, outer string) component {
+ return component{suffix: suffix, kind: kind, typ: typ, offset: offset, size: size, outer: outer}
+}
+
+// componentsOfType generates a list of components of type t.
+// For example, given string, the components are the string itself, the base, and the length.
+func componentsOfType(arch *asmArch, t types.Type) []component {
+ return appendComponentsRecursive(arch, t, nil, "", 0)
+}
+
+// appendComponentsRecursive implements componentsOfType.
+// Recursion is required to correct handle structs and arrays,
+// which can contain arbitrary other types.
+func appendComponentsRecursive(arch *asmArch, t types.Type, cc []component, suffix string, off int) []component {
+ s := t.String()
+ size := int(arch.sizes.Sizeof(t))
+ kind := asmKindForType(t, size)
+ cc = append(cc, newComponent(suffix, kind, s, off, size, suffix))
+
+ switch kind {
+ case 8:
+ if arch.ptrSize == 4 {
+ w1, w2 := "lo", "hi"
+ if arch.bigEndian {
+ w1, w2 = w2, w1
+ }
+ cc = append(cc, newComponent(suffix+"_"+w1, 4, "half "+s, off, 4, suffix))
+ cc = append(cc, newComponent(suffix+"_"+w2, 4, "half "+s, off+4, 4, suffix))
+ }
+
+ case asmEmptyInterface:
+ cc = append(cc, newComponent(suffix+"_type", asmKind(arch.ptrSize), "interface type", off, arch.ptrSize, suffix))
+ cc = append(cc, newComponent(suffix+"_data", asmKind(arch.ptrSize), "interface data", off+arch.ptrSize, arch.ptrSize, suffix))
+
+ case asmInterface:
+ cc = append(cc, newComponent(suffix+"_itable", asmKind(arch.ptrSize), "interface itable", off, arch.ptrSize, suffix))
+ cc = append(cc, newComponent(suffix+"_data", asmKind(arch.ptrSize), "interface data", off+arch.ptrSize, arch.ptrSize, suffix))
+
+ case asmSlice:
+ cc = append(cc, newComponent(suffix+"_base", asmKind(arch.ptrSize), "slice base", off, arch.ptrSize, suffix))
+ cc = append(cc, newComponent(suffix+"_len", asmKind(arch.intSize), "slice len", off+arch.ptrSize, arch.intSize, suffix))
+ cc = append(cc, newComponent(suffix+"_cap", asmKind(arch.intSize), "slice cap", off+arch.ptrSize+arch.intSize, arch.intSize, suffix))
+
+ case asmString:
+ cc = append(cc, newComponent(suffix+"_base", asmKind(arch.ptrSize), "string base", off, arch.ptrSize, suffix))
+ cc = append(cc, newComponent(suffix+"_len", asmKind(arch.intSize), "string len", off+arch.ptrSize, arch.intSize, suffix))
+
+ case asmComplex:
+ fsize := size / 2
+ cc = append(cc, newComponent(suffix+"_real", asmKind(fsize), fmt.Sprintf("real(complex%d)", size*8), off, fsize, suffix))
+ cc = append(cc, newComponent(suffix+"_imag", asmKind(fsize), fmt.Sprintf("imag(complex%d)", size*8), off+fsize, fsize, suffix))
+
+ case asmStruct:
+ tu := t.Underlying().(*types.Struct)
+ fields := make([]*types.Var, tu.NumFields())
+ for i := 0; i < tu.NumFields(); i++ {
+ fields[i] = tu.Field(i)
+ }
+ offsets := arch.sizes.Offsetsof(fields)
+ for i, f := range fields {
+ cc = appendComponentsRecursive(arch, f.Type(), cc, suffix+"_"+f.Name(), off+int(offsets[i]))
+ }
+
+ case asmArray:
+ tu := t.Underlying().(*types.Array)
+ elem := tu.Elem()
+ // Calculate offset of each element array.
+ fields := []*types.Var{
+ types.NewVar(token.NoPos, nil, "fake0", elem),
+ types.NewVar(token.NoPos, nil, "fake1", elem),
+ }
+ offsets := arch.sizes.Offsetsof(fields)
+ elemoff := int(offsets[1])
+ for i := 0; i < int(tu.Len()); i++ {
+ cc = appendComponentsRecursive(arch, elem, cc, suffix+"_"+strconv.Itoa(i), i*elemoff)
+ }
+ }
+
+ return cc
+}
+
+// asmParseDecl parses a function decl for expected assembly variables.
+func (f *File) asmParseDecl(decl *ast.FuncDecl) map[string]*asmFunc {
+ var (
+ arch *asmArch
+ fn *asmFunc
+ offset int
+ )
+
+ // addParams adds asmVars for each of the parameters in list.
+ // isret indicates whether the list are the arguments or the return values.
+ addParams := func(list []*ast.Field, isret bool) {
+ argnum := 0
+ for _, fld := range list {
+ t := f.pkg.types[fld.Type].Type
+ align := int(arch.sizes.Alignof(t))
+ size := int(arch.sizes.Sizeof(t))
+ offset += -offset & (align - 1)
+ cc := componentsOfType(arch, t)
+
+ // names is the list of names with this type.
+ names := fld.Names
+ if len(names) == 0 {
+ // Anonymous args will be called arg, arg1, arg2, ...
+ // Similarly so for return values: ret, ret1, ret2, ...
+ name := "arg"
+ if isret {
+ name = "ret"
+ }
+ if argnum > 0 {
+ name += strconv.Itoa(argnum)
+ }
+ names = []*ast.Ident{ast.NewIdent(name)}
+ }
+ argnum += len(names)
+
+ // Create variable for each name.
+ for _, id := range names {
+ name := id.Name
+ for _, c := range cc {
+ outer := name + c.outer
+ v := asmVar{
+ name: name + c.suffix,
+ kind: c.kind,
+ typ: c.typ,
+ off: offset + c.offset,
+ size: c.size,
+ }
+ if vo := fn.vars[outer]; vo != nil {
+ vo.inner = append(vo.inner, &v)
+ }
+ fn.vars[v.name] = &v
+ for i := 0; i < v.size; i++ {
+ fn.varByOffset[v.off+i] = &v
+ }
+ }
+ offset += size
+ }
+ }
+ }
+
+ m := make(map[string]*asmFunc)
+ for _, arch = range arches {
+ fn = &asmFunc{
+ arch: arch,
+ vars: make(map[string]*asmVar),
+ varByOffset: make(map[int]*asmVar),
+ }
+ offset = 0
+ addParams(decl.Type.Params.List, false)
+ if decl.Type.Results != nil && len(decl.Type.Results.List) > 0 {
+ offset += -offset & (arch.maxAlign - 1)
+ addParams(decl.Type.Results.List, true)
+ }
+ fn.size = offset
+ m[arch.name] = fn
+ }
+
+ return m
+}
+
+// asmCheckVar checks a single variable reference.
+func asmCheckVar(badf func(string, ...interface{}), fn *asmFunc, line, expr string, off int, v *asmVar) {
+ m := asmOpcode.FindStringSubmatch(line)
+ if m == nil {
+ if !strings.HasPrefix(strings.TrimSpace(line), "//") {
+ badf("cannot find assembly opcode")
+ }
+ return
+ }
+
+ // Determine operand sizes from instruction.
+ // Typically the suffix suffices, but there are exceptions.
+ var src, dst, kind asmKind
+ op := m[1]
+ switch fn.arch.name + "." + op {
+ case "386.FMOVLP":
+ src, dst = 8, 4
+ case "arm.MOVD":
+ src = 8
+ case "arm.MOVW":
+ src = 4
+ case "arm.MOVH", "arm.MOVHU":
+ src = 2
+ case "arm.MOVB", "arm.MOVBU":
+ src = 1
+ // LEA* opcodes don't really read the second arg.
+ // They just take the address of it.
+ case "386.LEAL":
+ dst = 4
+ case "amd64.LEAQ":
+ dst = 8
+ case "amd64p32.LEAL":
+ dst = 4
+ default:
+ switch fn.arch.name {
+ case "386", "amd64":
+ if strings.HasPrefix(op, "F") && (strings.HasSuffix(op, "D") || strings.HasSuffix(op, "DP")) {
+ // FMOVDP, FXCHD, etc
+ src = 8
+ break
+ }
+ if strings.HasPrefix(op, "P") && strings.HasSuffix(op, "RD") {
+ // PINSRD, PEXTRD, etc
+ src = 4
+ break
+ }
+ if strings.HasPrefix(op, "F") && (strings.HasSuffix(op, "F") || strings.HasSuffix(op, "FP")) {
+ // FMOVFP, FXCHF, etc
+ src = 4
+ break
+ }
+ if strings.HasSuffix(op, "SD") {
+ // MOVSD, SQRTSD, etc
+ src = 8
+ break
+ }
+ if strings.HasSuffix(op, "SS") {
+ // MOVSS, SQRTSS, etc
+ src = 4
+ break
+ }
+ if strings.HasPrefix(op, "SET") {
+ // SETEQ, etc
+ src = 1
+ break
+ }
+ switch op[len(op)-1] {
+ case 'B':
+ src = 1
+ case 'W':
+ src = 2
+ case 'L':
+ src = 4
+ case 'D', 'Q':
+ src = 8
+ }
+ case "ppc64", "ppc64le":
+ // Strip standard suffixes to reveal size letter.
+ m := ppc64Suff.FindStringSubmatch(op)
+ if m != nil {
+ switch m[1][0] {
+ case 'B':
+ src = 1
+ case 'H':
+ src = 2
+ case 'W':
+ src = 4
+ case 'D':
+ src = 8
+ }
+ }
+ case "mips", "mipsle", "mips64", "mips64le":
+ switch op {
+ case "MOVB", "MOVBU":
+ src = 1
+ case "MOVH", "MOVHU":
+ src = 2
+ case "MOVW", "MOVWU", "MOVF":
+ src = 4
+ case "MOVV", "MOVD":
+ src = 8
+ }
+ case "s390x":
+ switch op {
+ case "MOVB", "MOVBZ":
+ src = 1
+ case "MOVH", "MOVHZ":
+ src = 2
+ case "MOVW", "MOVWZ", "FMOVS":
+ src = 4
+ case "MOVD", "FMOVD":
+ src = 8
+ }
+ }
+ }
+ if dst == 0 {
+ dst = src
+ }
+
+ // Determine whether the match we're holding
+ // is the first or second argument.
+ if strings.Index(line, expr) > strings.Index(line, ",") {
+ kind = dst
+ } else {
+ kind = src
+ }
+
+ vk := v.kind
+ vs := v.size
+ vt := v.typ
+ switch vk {
+ case asmInterface, asmEmptyInterface, asmString, asmSlice:
+ // allow reference to first word (pointer)
+ vk = v.inner[0].kind
+ vs = v.inner[0].size
+ vt = v.inner[0].typ
+ }
+
+ if off != v.off {
+ var inner bytes.Buffer
+ for i, vi := range v.inner {
+ if len(v.inner) > 1 {
+ fmt.Fprintf(&inner, ",")
+ }
+ fmt.Fprintf(&inner, " ")
+ if i == len(v.inner)-1 {
+ fmt.Fprintf(&inner, "or ")
+ }
+ fmt.Fprintf(&inner, "%s+%d(FP)", vi.name, vi.off)
+ }
+ badf("invalid offset %s; expected %s+%d(FP)%s", expr, v.name, v.off, inner.String())
+ return
+ }
+ if kind != 0 && kind != vk {
+ var inner bytes.Buffer
+ if len(v.inner) > 0 {
+ fmt.Fprintf(&inner, " containing")
+ for i, vi := range v.inner {
+ if i > 0 && len(v.inner) > 2 {
+ fmt.Fprintf(&inner, ",")
+ }
+ fmt.Fprintf(&inner, " ")
+ if i > 0 && i == len(v.inner)-1 {
+ fmt.Fprintf(&inner, "and ")
+ }
+ fmt.Fprintf(&inner, "%s+%d(FP)", vi.name, vi.off)
+ }
+ }
+ badf("invalid %s of %s; %s is %d-byte value%s", op, expr, vt, vs, inner.String())
+ }
+}
diff --git a/vendor/github.com/golangci/govet/assign.go b/vendor/github.com/golangci/govet/assign.go
new file mode 100644
index 00000000000..9003c05b3a8
--- /dev/null
+++ b/vendor/github.com/golangci/govet/assign.go
@@ -0,0 +1,52 @@
+// 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.
+
+/*
+This file contains the code to check for useless assignments.
+*/
+
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+ "reflect"
+)
+
+func init() {
+ register("assign",
+ "check for useless assignments",
+ checkAssignStmt,
+ assignStmt)
+}
+
+// TODO: should also check for assignments to struct fields inside methods
+// that are on T instead of *T.
+
+// checkAssignStmt checks for assignments of the form " = ".
+// These are almost always useless, and even when they aren't they are usually a mistake.
+func checkAssignStmt(f *File, node ast.Node) {
+ stmt := node.(*ast.AssignStmt)
+ if stmt.Tok != token.ASSIGN {
+ return // ignore :=
+ }
+ if len(stmt.Lhs) != len(stmt.Rhs) {
+ // If LHS and RHS have different cardinality, they can't be the same.
+ return
+ }
+ for i, lhs := range stmt.Lhs {
+ rhs := stmt.Rhs[i]
+ if hasSideEffects(f, lhs) || hasSideEffects(f, rhs) {
+ continue // expressions may not be equal
+ }
+ if reflect.TypeOf(lhs) != reflect.TypeOf(rhs) {
+ continue // short-circuit the heavy-weight gofmt check
+ }
+ le := f.gofmt(lhs)
+ re := f.gofmt(rhs)
+ if le == re {
+ f.Badf(stmt.Pos(), "self-assignment of %s to %s", re, le)
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/govet/atomic.go b/vendor/github.com/golangci/govet/atomic.go
new file mode 100644
index 00000000000..8b8b96d6486
--- /dev/null
+++ b/vendor/github.com/golangci/govet/atomic.go
@@ -0,0 +1,71 @@
+// 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 govet
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("atomic",
+ "check for common mistaken usages of the sync/atomic package",
+ checkAtomicAssignment,
+ assignStmt)
+}
+
+// checkAtomicAssignment walks the assignment statement checking for common
+// mistaken usage of atomic package, such as: x = atomic.AddUint64(&x, 1)
+func checkAtomicAssignment(f *File, node ast.Node) {
+ n := node.(*ast.AssignStmt)
+ if len(n.Lhs) != len(n.Rhs) {
+ return
+ }
+ if len(n.Lhs) == 1 && n.Tok == token.DEFINE {
+ return
+ }
+
+ for i, right := range n.Rhs {
+ call, ok := right.(*ast.CallExpr)
+ if !ok {
+ continue
+ }
+ sel, ok := call.Fun.(*ast.SelectorExpr)
+ if !ok {
+ continue
+ }
+ pkgIdent, _ := sel.X.(*ast.Ident)
+ pkgName, ok := f.pkg.uses[pkgIdent].(*types.PkgName)
+ if !ok || pkgName.Imported().Path() != "sync/atomic" {
+ continue
+ }
+
+ switch sel.Sel.Name {
+ case "AddInt32", "AddInt64", "AddUint32", "AddUint64", "AddUintptr":
+ f.checkAtomicAddAssignment(n.Lhs[i], call)
+ }
+ }
+}
+
+// checkAtomicAddAssignment walks the atomic.Add* method calls checking for assigning the return value
+// to the same variable being used in the operation
+func (f *File) checkAtomicAddAssignment(left ast.Expr, call *ast.CallExpr) {
+ if len(call.Args) != 2 {
+ return
+ }
+ arg := call.Args[0]
+ broken := false
+
+ if uarg, ok := arg.(*ast.UnaryExpr); ok && uarg.Op == token.AND {
+ broken = f.gofmt(left) == f.gofmt(uarg.X)
+ } else if star, ok := left.(*ast.StarExpr); ok {
+ broken = f.gofmt(star.X) == f.gofmt(arg)
+ }
+
+ if broken {
+ f.Bad(left.Pos(), "direct assignment to atomic value")
+ }
+}
diff --git a/vendor/github.com/golangci/govet/bool.go b/vendor/github.com/golangci/govet/bool.go
new file mode 100644
index 00000000000..b7a75b059b4
--- /dev/null
+++ b/vendor/github.com/golangci/govet/bool.go
@@ -0,0 +1,197 @@
+// Copyright 2014 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.
+
+// This file contains boolean condition tests.
+
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("bool",
+ "check for mistakes involving boolean operators",
+ checkBool,
+ binaryExpr)
+}
+
+func checkBool(f *File, n ast.Node) {
+ e := n.(*ast.BinaryExpr)
+
+ var op boolOp
+ switch e.Op {
+ case token.LOR:
+ op = or
+ case token.LAND:
+ op = and
+ default:
+ return
+ }
+
+ comm := op.commutativeSets(f, e)
+ for _, exprs := range comm {
+ op.checkRedundant(f, exprs)
+ op.checkSuspect(f, exprs)
+ }
+}
+
+type boolOp struct {
+ name string
+ tok token.Token // token corresponding to this operator
+ badEq token.Token // token corresponding to the equality test that should not be used with this operator
+}
+
+var (
+ or = boolOp{"or", token.LOR, token.NEQ}
+ and = boolOp{"and", token.LAND, token.EQL}
+)
+
+// commutativeSets returns all side effect free sets of
+// expressions in e that are connected by op.
+// For example, given 'a || b || f() || c || d' with the or op,
+// commutativeSets returns {{b, a}, {d, c}}.
+func (op boolOp) commutativeSets(f *File, e *ast.BinaryExpr) [][]ast.Expr {
+ exprs := op.split(e)
+
+ // Partition the slice of expressions into commutative sets.
+ i := 0
+ var sets [][]ast.Expr
+ for j := 0; j <= len(exprs); j++ {
+ if j == len(exprs) || hasSideEffects(f, exprs[j]) {
+ if i < j {
+ sets = append(sets, exprs[i:j])
+ }
+ i = j + 1
+ }
+ }
+
+ return sets
+}
+
+// checkRedundant checks for expressions of the form
+// e && e
+// e || e
+// Exprs must contain only side effect free expressions.
+func (op boolOp) checkRedundant(f *File, exprs []ast.Expr) {
+ seen := make(map[string]bool)
+ for _, e := range exprs {
+ efmt := f.gofmt(e)
+ if seen[efmt] {
+ f.Badf(e.Pos(), "redundant %s: %s %s %s", op.name, efmt, op.tok, efmt)
+ } else {
+ seen[efmt] = true
+ }
+ }
+}
+
+// checkSuspect checks for expressions of the form
+// x != c1 || x != c2
+// x == c1 && x == c2
+// where c1 and c2 are constant expressions.
+// If c1 and c2 are the same then it's redundant;
+// if c1 and c2 are different then it's always true or always false.
+// Exprs must contain only side effect free expressions.
+func (op boolOp) checkSuspect(f *File, exprs []ast.Expr) {
+ // seen maps from expressions 'x' to equality expressions 'x != c'.
+ seen := make(map[string]string)
+
+ for _, e := range exprs {
+ bin, ok := e.(*ast.BinaryExpr)
+ if !ok || bin.Op != op.badEq {
+ continue
+ }
+
+ // In order to avoid false positives, restrict to cases
+ // in which one of the operands is constant. We're then
+ // interested in the other operand.
+ // In the rare case in which both operands are constant
+ // (e.g. runtime.GOOS and "windows"), we'll only catch
+ // mistakes if the LHS is repeated, which is how most
+ // code is written.
+ var x ast.Expr
+ switch {
+ case f.pkg.types[bin.Y].Value != nil:
+ x = bin.X
+ case f.pkg.types[bin.X].Value != nil:
+ x = bin.Y
+ default:
+ continue
+ }
+
+ // e is of the form 'x != c' or 'x == c'.
+ xfmt := f.gofmt(x)
+ efmt := f.gofmt(e)
+ if prev, found := seen[xfmt]; found {
+ // checkRedundant handles the case in which efmt == prev.
+ if efmt != prev {
+ f.Badf(e.Pos(), "suspect %s: %s %s %s", op.name, efmt, op.tok, prev)
+ }
+ } else {
+ seen[xfmt] = efmt
+ }
+ }
+}
+
+// hasSideEffects reports whether evaluation of e has side effects.
+func hasSideEffects(f *File, e ast.Expr) bool {
+ safe := true
+ ast.Inspect(e, func(node ast.Node) bool {
+ switch n := node.(type) {
+ case *ast.CallExpr:
+ // Don't call Type.Underlying(), since its lack
+ // lets us see the NamedFuncType(x) type
+ // conversion as a *types.Named.
+ _, ok := f.pkg.types[n.Fun].Type.(*types.Signature)
+ if ok {
+ // Conservatively assume that all function and
+ // method calls have side effects for
+ // now. This will include func type
+ // conversions, but it's ok given that
+ // this is the conservative side.
+ safe = false
+ return false
+ }
+ // It's a type conversion, which cannot
+ // have side effects.
+ case *ast.UnaryExpr:
+ if n.Op == token.ARROW {
+ safe = false
+ return false
+ }
+ }
+ return true
+ })
+ return !safe
+}
+
+// split returns a slice of all subexpressions in e that are connected by op.
+// For example, given 'a || (b || c) || d' with the or op,
+// split returns []{d, c, b, a}.
+func (op boolOp) split(e ast.Expr) (exprs []ast.Expr) {
+ for {
+ e = unparen(e)
+ if b, ok := e.(*ast.BinaryExpr); ok && b.Op == op.tok {
+ exprs = append(exprs, op.split(b.Y)...)
+ e = b.X
+ } else {
+ exprs = append(exprs, e)
+ break
+ }
+ }
+ return
+}
+
+// unparen returns e with any enclosing parentheses stripped.
+func unparen(e ast.Expr) ast.Expr {
+ for {
+ p, ok := e.(*ast.ParenExpr)
+ if !ok {
+ return e
+ }
+ e = p.X
+ }
+}
diff --git a/vendor/github.com/golangci/govet/buildtag.go b/vendor/github.com/golangci/govet/buildtag.go
new file mode 100644
index 00000000000..f5d06c99d7f
--- /dev/null
+++ b/vendor/github.com/golangci/govet/buildtag.go
@@ -0,0 +1,91 @@
+// 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 govet
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "strings"
+ "unicode"
+)
+
+var (
+ nl = []byte("\n")
+ slashSlash = []byte("//")
+ plusBuild = []byte("+build")
+)
+
+// checkBuildTag checks that build tags are in the correct location and well-formed.
+func checkBuildTag(name string, data []byte) {
+ if !vet("buildtags") {
+ return
+ }
+ lines := bytes.SplitAfter(data, nl)
+
+ // Determine cutpoint where +build comments are no longer valid.
+ // They are valid in leading // comments in the file followed by
+ // a blank line.
+ var cutoff int
+ for i, line := range lines {
+ line = bytes.TrimSpace(line)
+ if len(line) == 0 {
+ cutoff = i
+ continue
+ }
+ if bytes.HasPrefix(line, slashSlash) {
+ continue
+ }
+ break
+ }
+
+ for i, line := range lines {
+ line = bytes.TrimSpace(line)
+ if !bytes.HasPrefix(line, slashSlash) {
+ continue
+ }
+ text := bytes.TrimSpace(line[2:])
+ if bytes.HasPrefix(text, plusBuild) {
+ fields := bytes.Fields(text)
+ if !bytes.Equal(fields[0], plusBuild) {
+ // Comment is something like +buildasdf not +build.
+ fmt.Fprintf(os.Stderr, "%s:%d: possible malformed +build comment\n", name, i+1)
+ setExit(1)
+ continue
+ }
+ if i >= cutoff {
+ fmt.Fprintf(os.Stderr, "%s:%d: +build comment must appear before package clause and be followed by a blank line\n", name, i+1)
+ setExit(1)
+ continue
+ }
+ // Check arguments.
+ Args:
+ for _, arg := range fields[1:] {
+ for _, elem := range strings.Split(string(arg), ",") {
+ if strings.HasPrefix(elem, "!!") {
+ fmt.Fprintf(os.Stderr, "%s:%d: invalid double negative in build constraint: %s\n", name, i+1, arg)
+ setExit(1)
+ break Args
+ }
+ elem = strings.TrimPrefix(elem, "!")
+ for _, c := range elem {
+ if !unicode.IsLetter(c) && !unicode.IsDigit(c) && c != '_' && c != '.' {
+ fmt.Fprintf(os.Stderr, "%s:%d: invalid non-alphanumeric build constraint: %s\n", name, i+1, arg)
+ setExit(1)
+ break Args
+ }
+ }
+ }
+ }
+ continue
+ }
+ // Comment with +build but not at beginning.
+ if bytes.Contains(line, plusBuild) && i < cutoff {
+ fmt.Fprintf(os.Stderr, "%s:%d: possible malformed +build comment\n", name, i+1)
+ setExit(1)
+ continue
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/govet/cgo.go b/vendor/github.com/golangci/govet/cgo.go
new file mode 100644
index 00000000000..b5b2dcfd546
--- /dev/null
+++ b/vendor/github.com/golangci/govet/cgo.go
@@ -0,0 +1,141 @@
+// 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.
+
+// Check for invalid cgo pointer passing.
+// This looks for code that uses cgo to call C code passing values
+// whose types are almost always invalid according to the cgo pointer
+// sharing rules.
+// Specifically, it warns about attempts to pass a Go chan, map, func,
+// or slice to C, either directly, or via a pointer, array, or struct.
+
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("cgocall",
+ "check for types that may not be passed to cgo calls",
+ checkCgoCall,
+ callExpr)
+}
+
+func checkCgoCall(f *File, node ast.Node) {
+ x := node.(*ast.CallExpr)
+
+ // We are only looking for calls to functions imported from
+ // the "C" package.
+ sel, ok := x.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return
+ }
+ id, ok := sel.X.(*ast.Ident)
+ if !ok {
+ return
+ }
+
+ pkgname, ok := f.pkg.uses[id].(*types.PkgName)
+ if !ok || pkgname.Imported().Path() != "C" {
+ return
+ }
+
+ // A call to C.CBytes passes a pointer but is always safe.
+ if sel.Sel.Name == "CBytes" {
+ return
+ }
+
+ for _, arg := range x.Args {
+ if !typeOKForCgoCall(cgoBaseType(f, arg), make(map[types.Type]bool)) {
+ f.Badf(arg.Pos(), "possibly passing Go type with embedded pointer to C")
+ }
+
+ // Check for passing the address of a bad type.
+ if conv, ok := arg.(*ast.CallExpr); ok && len(conv.Args) == 1 && f.hasBasicType(conv.Fun, types.UnsafePointer) {
+ arg = conv.Args[0]
+ }
+ if u, ok := arg.(*ast.UnaryExpr); ok && u.Op == token.AND {
+ if !typeOKForCgoCall(cgoBaseType(f, u.X), make(map[types.Type]bool)) {
+ f.Badf(arg.Pos(), "possibly passing Go type with embedded pointer to C")
+ }
+ }
+ }
+}
+
+// cgoBaseType tries to look through type conversions involving
+// unsafe.Pointer to find the real type. It converts:
+// unsafe.Pointer(x) => x
+// *(*unsafe.Pointer)(unsafe.Pointer(&x)) => x
+func cgoBaseType(f *File, arg ast.Expr) types.Type {
+ switch arg := arg.(type) {
+ case *ast.CallExpr:
+ if len(arg.Args) == 1 && f.hasBasicType(arg.Fun, types.UnsafePointer) {
+ return cgoBaseType(f, arg.Args[0])
+ }
+ case *ast.StarExpr:
+ call, ok := arg.X.(*ast.CallExpr)
+ if !ok || len(call.Args) != 1 {
+ break
+ }
+ // Here arg is *f(v).
+ t := f.pkg.types[call.Fun].Type
+ if t == nil {
+ break
+ }
+ ptr, ok := t.Underlying().(*types.Pointer)
+ if !ok {
+ break
+ }
+ // Here arg is *(*p)(v)
+ elem, ok := ptr.Elem().Underlying().(*types.Basic)
+ if !ok || elem.Kind() != types.UnsafePointer {
+ break
+ }
+ // Here arg is *(*unsafe.Pointer)(v)
+ call, ok = call.Args[0].(*ast.CallExpr)
+ if !ok || len(call.Args) != 1 {
+ break
+ }
+ // Here arg is *(*unsafe.Pointer)(f(v))
+ if !f.hasBasicType(call.Fun, types.UnsafePointer) {
+ break
+ }
+ // Here arg is *(*unsafe.Pointer)(unsafe.Pointer(v))
+ u, ok := call.Args[0].(*ast.UnaryExpr)
+ if !ok || u.Op != token.AND {
+ break
+ }
+ // Here arg is *(*unsafe.Pointer)(unsafe.Pointer(&v))
+ return cgoBaseType(f, u.X)
+ }
+
+ return f.pkg.types[arg].Type
+}
+
+// typeOKForCgoCall reports whether the type of arg is OK to pass to a
+// C function using cgo. This is not true for Go types with embedded
+// pointers. m is used to avoid infinite recursion on recursive types.
+func typeOKForCgoCall(t types.Type, m map[types.Type]bool) bool {
+ if t == nil || m[t] {
+ return true
+ }
+ m[t] = true
+ switch t := t.Underlying().(type) {
+ case *types.Chan, *types.Map, *types.Signature, *types.Slice:
+ return false
+ case *types.Pointer:
+ return typeOKForCgoCall(t.Elem(), m)
+ case *types.Array:
+ return typeOKForCgoCall(t.Elem(), m)
+ case *types.Struct:
+ for i := 0; i < t.NumFields(); i++ {
+ if !typeOKForCgoCall(t.Field(i).Type(), m) {
+ return false
+ }
+ }
+ }
+ return true
+}
diff --git a/vendor/github.com/golangci/govet/composite.go b/vendor/github.com/golangci/govet/composite.go
new file mode 100644
index 00000000000..feab049ac64
--- /dev/null
+++ b/vendor/github.com/golangci/govet/composite.go
@@ -0,0 +1,94 @@
+// Copyright 2012 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.
+
+// This file contains the test for unkeyed struct literals.
+
+package govet
+
+import (
+ "flag"
+ "go/ast"
+ "go/types"
+ "strings"
+
+ "github.com/golangci/govet/lib/whitelist"
+)
+
+var compositeWhiteList = flag.Bool("compositewhitelist", true, "use composite white list; for testing only")
+
+func init() {
+ register("composites",
+ "check that composite literals used field-keyed elements",
+ checkUnkeyedLiteral,
+ compositeLit)
+}
+
+// checkUnkeyedLiteral checks if a composite literal is a struct literal with
+// unkeyed fields.
+func checkUnkeyedLiteral(f *File, node ast.Node) {
+ if strings.HasSuffix(f.name, "_test.go") {
+ return
+ }
+
+ cl := node.(*ast.CompositeLit)
+
+ typ := f.pkg.types[cl].Type
+ if typ == nil {
+ // cannot determine composite literals' type, skip it
+ return
+ }
+ typeName := typ.String()
+ if *compositeWhiteList && whitelist.UnkeyedLiteral[typeName] {
+ // skip whitelisted types
+ return
+ }
+ under := typ.Underlying()
+ for {
+ ptr, ok := under.(*types.Pointer)
+ if !ok {
+ break
+ }
+ under = ptr.Elem().Underlying()
+ }
+ if _, ok := under.(*types.Struct); !ok {
+ // skip non-struct composite literals
+ return
+ }
+ if isLocalType(f, typ) {
+ // allow unkeyed locally defined composite literal
+ return
+ }
+
+ // check if the CompositeLit contains an unkeyed field
+ allKeyValue := true
+ for _, e := range cl.Elts {
+ if _, ok := e.(*ast.KeyValueExpr); !ok {
+ allKeyValue = false
+ break
+ }
+ }
+ if allKeyValue {
+ // all the composite literal fields are keyed
+ return
+ }
+
+ f.Badf(cl.Pos(), "%s composite literal uses unkeyed fields",
+ types.TypeString(typ, func(pkg *types.Package) string {
+ return pkg.Name()
+ }))
+}
+
+func isLocalType(f *File, typ types.Type) bool {
+ switch x := typ.(type) {
+ case *types.Struct:
+ // struct literals are local types
+ return true
+ case *types.Pointer:
+ return isLocalType(f, x.Elem())
+ case *types.Named:
+ // names in package foo are local to foo_test too
+ return strings.TrimSuffix(x.Obj().Pkg().Path(), "_test") == strings.TrimSuffix(f.pkg.typesPkg.Path(), "_test")
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/govet/copylock.go b/vendor/github.com/golangci/govet/copylock.go
new file mode 100644
index 00000000000..d8b1389ae61
--- /dev/null
+++ b/vendor/github.com/golangci/govet/copylock.go
@@ -0,0 +1,256 @@
+// 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.
+
+// This file contains the code to check that locks are not passed by value.
+
+package govet
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("copylocks",
+ "check that locks are not passed by value",
+ checkCopyLocks,
+ funcDecl, rangeStmt, funcLit, callExpr, assignStmt, genDecl, compositeLit, returnStmt)
+}
+
+// checkCopyLocks checks whether node might
+// inadvertently copy a lock.
+func checkCopyLocks(f *File, node ast.Node) {
+ switch node := node.(type) {
+ case *ast.RangeStmt:
+ checkCopyLocksRange(f, node)
+ case *ast.FuncDecl:
+ checkCopyLocksFunc(f, node.Name.Name, node.Recv, node.Type)
+ case *ast.FuncLit:
+ checkCopyLocksFunc(f, "func", nil, node.Type)
+ case *ast.CallExpr:
+ checkCopyLocksCallExpr(f, node)
+ case *ast.AssignStmt:
+ checkCopyLocksAssign(f, node)
+ case *ast.GenDecl:
+ checkCopyLocksGenDecl(f, node)
+ case *ast.CompositeLit:
+ checkCopyLocksCompositeLit(f, node)
+ case *ast.ReturnStmt:
+ checkCopyLocksReturnStmt(f, node)
+ }
+}
+
+// checkCopyLocksAssign checks whether an assignment
+// copies a lock.
+func checkCopyLocksAssign(f *File, as *ast.AssignStmt) {
+ for i, x := range as.Rhs {
+ if path := lockPathRhs(f, x); path != nil {
+ f.Badf(x.Pos(), "assignment copies lock value to %v: %v", f.gofmt(as.Lhs[i]), path)
+ }
+ }
+}
+
+// checkCopyLocksGenDecl checks whether lock is copied
+// in variable declaration.
+func checkCopyLocksGenDecl(f *File, gd *ast.GenDecl) {
+ if gd.Tok != token.VAR {
+ return
+ }
+ for _, spec := range gd.Specs {
+ valueSpec := spec.(*ast.ValueSpec)
+ for i, x := range valueSpec.Values {
+ if path := lockPathRhs(f, x); path != nil {
+ f.Badf(x.Pos(), "variable declaration copies lock value to %v: %v", valueSpec.Names[i].Name, path)
+ }
+ }
+ }
+}
+
+// checkCopyLocksCompositeLit detects lock copy inside a composite literal
+func checkCopyLocksCompositeLit(f *File, cl *ast.CompositeLit) {
+ for _, x := range cl.Elts {
+ if node, ok := x.(*ast.KeyValueExpr); ok {
+ x = node.Value
+ }
+ if path := lockPathRhs(f, x); path != nil {
+ f.Badf(x.Pos(), "literal copies lock value from %v: %v", f.gofmt(x), path)
+ }
+ }
+}
+
+// checkCopyLocksReturnStmt detects lock copy in return statement
+func checkCopyLocksReturnStmt(f *File, rs *ast.ReturnStmt) {
+ for _, x := range rs.Results {
+ if path := lockPathRhs(f, x); path != nil {
+ f.Badf(x.Pos(), "return copies lock value: %v", path)
+ }
+ }
+}
+
+// checkCopyLocksCallExpr detects lock copy in the arguments to a function call
+func checkCopyLocksCallExpr(f *File, ce *ast.CallExpr) {
+ var id *ast.Ident
+ switch fun := ce.Fun.(type) {
+ case *ast.Ident:
+ id = fun
+ case *ast.SelectorExpr:
+ id = fun.Sel
+ }
+ if fun, ok := f.pkg.uses[id].(*types.Builtin); ok {
+ switch fun.Name() {
+ case "new", "len", "cap", "Sizeof":
+ return
+ }
+ }
+ for _, x := range ce.Args {
+ if path := lockPathRhs(f, x); path != nil {
+ f.Badf(x.Pos(), "call of %s copies lock value: %v", f.gofmt(ce.Fun), path)
+ }
+ }
+}
+
+// checkCopyLocksFunc checks whether a function might
+// inadvertently copy a lock, by checking whether
+// its receiver, parameters, or return values
+// are locks.
+func checkCopyLocksFunc(f *File, name string, recv *ast.FieldList, typ *ast.FuncType) {
+ if recv != nil && len(recv.List) > 0 {
+ expr := recv.List[0].Type
+ if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil {
+ f.Badf(expr.Pos(), "%s passes lock by value: %v", name, path)
+ }
+ }
+
+ if typ.Params != nil {
+ for _, field := range typ.Params.List {
+ expr := field.Type
+ if path := lockPath(f.pkg.typesPkg, f.pkg.types[expr].Type); path != nil {
+ f.Badf(expr.Pos(), "%s passes lock by value: %v", name, path)
+ }
+ }
+ }
+
+ // Don't check typ.Results. If T has a Lock field it's OK to write
+ // return T{}
+ // because that is returning the zero value. Leave result checking
+ // to the return statement.
+}
+
+// checkCopyLocksRange checks whether a range statement
+// might inadvertently copy a lock by checking whether
+// any of the range variables are locks.
+func checkCopyLocksRange(f *File, r *ast.RangeStmt) {
+ checkCopyLocksRangeVar(f, r.Tok, r.Key)
+ checkCopyLocksRangeVar(f, r.Tok, r.Value)
+}
+
+func checkCopyLocksRangeVar(f *File, rtok token.Token, e ast.Expr) {
+ if e == nil {
+ return
+ }
+ id, isId := e.(*ast.Ident)
+ if isId && id.Name == "_" {
+ return
+ }
+
+ var typ types.Type
+ if rtok == token.DEFINE {
+ if !isId {
+ return
+ }
+ obj := f.pkg.defs[id]
+ if obj == nil {
+ return
+ }
+ typ = obj.Type()
+ } else {
+ typ = f.pkg.types[e].Type
+ }
+
+ if typ == nil {
+ return
+ }
+ if path := lockPath(f.pkg.typesPkg, typ); path != nil {
+ f.Badf(e.Pos(), "range var %s copies lock: %v", f.gofmt(e), path)
+ }
+}
+
+type typePath []types.Type
+
+// String pretty-prints a typePath.
+func (path typePath) String() string {
+ n := len(path)
+ var buf bytes.Buffer
+ for i := range path {
+ if i > 0 {
+ fmt.Fprint(&buf, " contains ")
+ }
+ // The human-readable path is in reverse order, outermost to innermost.
+ fmt.Fprint(&buf, path[n-i-1].String())
+ }
+ return buf.String()
+}
+
+func lockPathRhs(f *File, x ast.Expr) typePath {
+ if _, ok := x.(*ast.CompositeLit); ok {
+ return nil
+ }
+ if _, ok := x.(*ast.CallExpr); ok {
+ // A call may return a zero value.
+ return nil
+ }
+ if star, ok := x.(*ast.StarExpr); ok {
+ if _, ok := star.X.(*ast.CallExpr); ok {
+ // A call may return a pointer to a zero value.
+ return nil
+ }
+ }
+ return lockPath(f.pkg.typesPkg, f.pkg.types[x].Type)
+}
+
+// lockPath returns a typePath describing the location of a lock value
+// contained in typ. If there is no contained lock, it returns nil.
+func lockPath(tpkg *types.Package, typ types.Type) typePath {
+ if typ == nil {
+ return nil
+ }
+
+ for {
+ atyp, ok := typ.Underlying().(*types.Array)
+ if !ok {
+ break
+ }
+ typ = atyp.Elem()
+ }
+
+ // We're only interested in the case in which the underlying
+ // type is a struct. (Interfaces and pointers are safe to copy.)
+ styp, ok := typ.Underlying().(*types.Struct)
+ if !ok {
+ return nil
+ }
+
+ // We're looking for cases in which a reference to this type
+ // can be locked, but a value cannot. This differentiates
+ // embedded interfaces from embedded values.
+ if plock := types.NewMethodSet(types.NewPointer(typ)).Lookup(tpkg, "Lock"); plock != nil {
+ if lock := types.NewMethodSet(typ).Lookup(tpkg, "Lock"); lock == nil {
+ return []types.Type{typ}
+ }
+ }
+
+ nfields := styp.NumFields()
+ for i := 0; i < nfields; i++ {
+ ftyp := styp.Field(i).Type()
+ subpath := lockPath(tpkg, ftyp)
+ if subpath != nil {
+ return append(subpath, typ)
+ }
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/golangci/govet/dead.go b/vendor/github.com/golangci/govet/dead.go
new file mode 100644
index 00000000000..1d7f97727d7
--- /dev/null
+++ b/vendor/github.com/golangci/govet/dead.go
@@ -0,0 +1,108 @@
+// 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.
+//
+// Simplified dead code detector. Used for skipping certain checks
+// on unreachable code (for instance, shift checks on arch-specific code).
+
+package govet
+
+import (
+ "go/ast"
+ "go/constant"
+)
+
+// updateDead puts unreachable "if" and "case" nodes into f.dead.
+func (f *File) updateDead(node ast.Node) {
+ if f.dead[node] {
+ // The node is already marked as dead.
+ return
+ }
+
+ switch stmt := node.(type) {
+ case *ast.IfStmt:
+ // "if" branch is dead if its condition evaluates
+ // to constant false.
+ v := f.pkg.types[stmt.Cond].Value
+ if v == nil {
+ return
+ }
+ if !constant.BoolVal(v) {
+ f.setDead(stmt.Body)
+ return
+ }
+ f.setDead(stmt.Else)
+ case *ast.SwitchStmt:
+ // Case clause with empty switch tag is dead if it evaluates
+ // to constant false.
+ if stmt.Tag == nil {
+ BodyLoopBool:
+ for _, stmt := range stmt.Body.List {
+ cc := stmt.(*ast.CaseClause)
+ if cc.List == nil {
+ // Skip default case.
+ continue
+ }
+ for _, expr := range cc.List {
+ v := f.pkg.types[expr].Value
+ if v == nil || v.Kind() != constant.Bool || constant.BoolVal(v) {
+ continue BodyLoopBool
+ }
+ }
+ f.setDead(cc)
+ }
+ return
+ }
+
+ // Case clause is dead if its constant value doesn't match
+ // the constant value from the switch tag.
+ // TODO: This handles integer comparisons only.
+ v := f.pkg.types[stmt.Tag].Value
+ if v == nil || v.Kind() != constant.Int {
+ return
+ }
+ tagN, ok := constant.Uint64Val(v)
+ if !ok {
+ return
+ }
+ BodyLoopInt:
+ for _, x := range stmt.Body.List {
+ cc := x.(*ast.CaseClause)
+ if cc.List == nil {
+ // Skip default case.
+ continue
+ }
+ for _, expr := range cc.List {
+ v := f.pkg.types[expr].Value
+ if v == nil {
+ continue BodyLoopInt
+ }
+ n, ok := constant.Uint64Val(v)
+ if !ok || tagN == n {
+ continue BodyLoopInt
+ }
+ }
+ f.setDead(cc)
+ }
+ }
+}
+
+// setDead marks the node and all the children as dead.
+func (f *File) setDead(node ast.Node) {
+ dv := deadVisitor{
+ f: f,
+ }
+ ast.Walk(dv, node)
+}
+
+type deadVisitor struct {
+ f *File
+}
+
+func (dv deadVisitor) Visit(node ast.Node) ast.Visitor {
+ if node == nil {
+ return nil
+ }
+ dv.f.dead[node] = true
+ return dv
+}
diff --git a/vendor/github.com/golangci/govet/deadcode.go b/vendor/github.com/golangci/govet/deadcode.go
new file mode 100644
index 00000000000..7fdad5e8911
--- /dev/null
+++ b/vendor/github.com/golangci/govet/deadcode.go
@@ -0,0 +1,298 @@
+// 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.
+
+// Check for syntactically unreachable code.
+
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+)
+
+func init() {
+ register("unreachable",
+ "check for unreachable code",
+ checkUnreachable,
+ funcDecl, funcLit)
+}
+
+type deadState struct {
+ f *File
+ hasBreak map[ast.Stmt]bool
+ hasGoto map[string]bool
+ labels map[string]ast.Stmt
+ breakTarget ast.Stmt
+
+ reachable bool
+}
+
+// checkUnreachable checks a function body for dead code.
+//
+// TODO(adonovan): use the new cfg package, which is more precise.
+func checkUnreachable(f *File, node ast.Node) {
+ var body *ast.BlockStmt
+ switch n := node.(type) {
+ case *ast.FuncDecl:
+ body = n.Body
+ case *ast.FuncLit:
+ body = n.Body
+ }
+ if body == nil {
+ return
+ }
+
+ d := &deadState{
+ f: f,
+ hasBreak: make(map[ast.Stmt]bool),
+ hasGoto: make(map[string]bool),
+ labels: make(map[string]ast.Stmt),
+ }
+
+ d.findLabels(body)
+
+ d.reachable = true
+ d.findDead(body)
+}
+
+// findLabels gathers information about the labels defined and used by stmt
+// and about which statements break, whether a label is involved or not.
+func (d *deadState) findLabels(stmt ast.Stmt) {
+ switch x := stmt.(type) {
+ default:
+ d.f.Warnf(x.Pos(), "internal error in findLabels: unexpected statement %T", x)
+
+ case *ast.AssignStmt,
+ *ast.BadStmt,
+ *ast.DeclStmt,
+ *ast.DeferStmt,
+ *ast.EmptyStmt,
+ *ast.ExprStmt,
+ *ast.GoStmt,
+ *ast.IncDecStmt,
+ *ast.ReturnStmt,
+ *ast.SendStmt:
+ // no statements inside
+
+ case *ast.BlockStmt:
+ for _, stmt := range x.List {
+ d.findLabels(stmt)
+ }
+
+ case *ast.BranchStmt:
+ switch x.Tok {
+ case token.GOTO:
+ if x.Label != nil {
+ d.hasGoto[x.Label.Name] = true
+ }
+
+ case token.BREAK:
+ stmt := d.breakTarget
+ if x.Label != nil {
+ stmt = d.labels[x.Label.Name]
+ }
+ if stmt != nil {
+ d.hasBreak[stmt] = true
+ }
+ }
+
+ case *ast.IfStmt:
+ d.findLabels(x.Body)
+ if x.Else != nil {
+ d.findLabels(x.Else)
+ }
+
+ case *ast.LabeledStmt:
+ d.labels[x.Label.Name] = x.Stmt
+ d.findLabels(x.Stmt)
+
+ // These cases are all the same, but the x.Body only works
+ // when the specific type of x is known, so the cases cannot
+ // be merged.
+ case *ast.ForStmt:
+ outer := d.breakTarget
+ d.breakTarget = x
+ d.findLabels(x.Body)
+ d.breakTarget = outer
+
+ case *ast.RangeStmt:
+ outer := d.breakTarget
+ d.breakTarget = x
+ d.findLabels(x.Body)
+ d.breakTarget = outer
+
+ case *ast.SelectStmt:
+ outer := d.breakTarget
+ d.breakTarget = x
+ d.findLabels(x.Body)
+ d.breakTarget = outer
+
+ case *ast.SwitchStmt:
+ outer := d.breakTarget
+ d.breakTarget = x
+ d.findLabels(x.Body)
+ d.breakTarget = outer
+
+ case *ast.TypeSwitchStmt:
+ outer := d.breakTarget
+ d.breakTarget = x
+ d.findLabels(x.Body)
+ d.breakTarget = outer
+
+ case *ast.CommClause:
+ for _, stmt := range x.Body {
+ d.findLabels(stmt)
+ }
+
+ case *ast.CaseClause:
+ for _, stmt := range x.Body {
+ d.findLabels(stmt)
+ }
+ }
+}
+
+// findDead walks the statement looking for dead code.
+// If d.reachable is false on entry, stmt itself is dead.
+// When findDead returns, d.reachable tells whether the
+// statement following stmt is reachable.
+func (d *deadState) findDead(stmt ast.Stmt) {
+ // Is this a labeled goto target?
+ // If so, assume it is reachable due to the goto.
+ // This is slightly conservative, in that we don't
+ // check that the goto is reachable, so
+ // L: goto L
+ // will not provoke a warning.
+ // But it's good enough.
+ if x, isLabel := stmt.(*ast.LabeledStmt); isLabel && d.hasGoto[x.Label.Name] {
+ d.reachable = true
+ }
+
+ if !d.reachable {
+ switch stmt.(type) {
+ case *ast.EmptyStmt:
+ // do not warn about unreachable empty statements
+ default:
+ d.f.Bad(stmt.Pos(), "unreachable code")
+ d.reachable = true // silence error about next statement
+ }
+ }
+
+ switch x := stmt.(type) {
+ default:
+ d.f.Warnf(x.Pos(), "internal error in findDead: unexpected statement %T", x)
+
+ case *ast.AssignStmt,
+ *ast.BadStmt,
+ *ast.DeclStmt,
+ *ast.DeferStmt,
+ *ast.EmptyStmt,
+ *ast.GoStmt,
+ *ast.IncDecStmt,
+ *ast.SendStmt:
+ // no control flow
+
+ case *ast.BlockStmt:
+ for _, stmt := range x.List {
+ d.findDead(stmt)
+ }
+
+ case *ast.BranchStmt:
+ switch x.Tok {
+ case token.BREAK, token.GOTO, token.FALLTHROUGH:
+ d.reachable = false
+ case token.CONTINUE:
+ // NOTE: We accept "continue" statements as terminating.
+ // They are not necessary in the spec definition of terminating,
+ // because a continue statement cannot be the final statement
+ // before a return. But for the more general problem of syntactically
+ // identifying dead code, continue redirects control flow just
+ // like the other terminating statements.
+ d.reachable = false
+ }
+
+ case *ast.ExprStmt:
+ // Call to panic?
+ call, ok := x.X.(*ast.CallExpr)
+ if ok {
+ name, ok := call.Fun.(*ast.Ident)
+ if ok && name.Name == "panic" && name.Obj == nil {
+ d.reachable = false
+ }
+ }
+
+ case *ast.ForStmt:
+ d.findDead(x.Body)
+ d.reachable = x.Cond != nil || d.hasBreak[x]
+
+ case *ast.IfStmt:
+ d.findDead(x.Body)
+ if x.Else != nil {
+ r := d.reachable
+ d.reachable = true
+ d.findDead(x.Else)
+ d.reachable = d.reachable || r
+ } else {
+ // might not have executed if statement
+ d.reachable = true
+ }
+
+ case *ast.LabeledStmt:
+ d.findDead(x.Stmt)
+
+ case *ast.RangeStmt:
+ d.findDead(x.Body)
+ d.reachable = true
+
+ case *ast.ReturnStmt:
+ d.reachable = false
+
+ case *ast.SelectStmt:
+ // NOTE: Unlike switch and type switch below, we don't care
+ // whether a select has a default, because a select without a
+ // default blocks until one of the cases can run. That's different
+ // from a switch without a default, which behaves like it has
+ // a default with an empty body.
+ anyReachable := false
+ for _, comm := range x.Body.List {
+ d.reachable = true
+ for _, stmt := range comm.(*ast.CommClause).Body {
+ d.findDead(stmt)
+ }
+ anyReachable = anyReachable || d.reachable
+ }
+ d.reachable = anyReachable || d.hasBreak[x]
+
+ case *ast.SwitchStmt:
+ anyReachable := false
+ hasDefault := false
+ for _, cas := range x.Body.List {
+ cc := cas.(*ast.CaseClause)
+ if cc.List == nil {
+ hasDefault = true
+ }
+ d.reachable = true
+ for _, stmt := range cc.Body {
+ d.findDead(stmt)
+ }
+ anyReachable = anyReachable || d.reachable
+ }
+ d.reachable = anyReachable || d.hasBreak[x] || !hasDefault
+
+ case *ast.TypeSwitchStmt:
+ anyReachable := false
+ hasDefault := false
+ for _, cas := range x.Body.List {
+ cc := cas.(*ast.CaseClause)
+ if cc.List == nil {
+ hasDefault = true
+ }
+ d.reachable = true
+ for _, stmt := range cc.Body {
+ d.findDead(stmt)
+ }
+ anyReachable = anyReachable || d.reachable
+ }
+ d.reachable = anyReachable || d.hasBreak[x] || !hasDefault
+ }
+}
diff --git a/vendor/github.com/golangci/govet/doc.go b/vendor/github.com/golangci/govet/doc.go
new file mode 100644
index 00000000000..7dee3393fdc
--- /dev/null
+++ b/vendor/github.com/golangci/govet/doc.go
@@ -0,0 +1,224 @@
+// 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.
+
+/*
+
+Vet examines Go source code and reports suspicious constructs, such as Printf
+calls whose arguments do not align with the format string. Vet uses heuristics
+that do not guarantee all reports are genuine problems, but it can find errors
+not caught by the compilers.
+
+Vet is normally invoked using the go command by running "go vet":
+
+ go vet
+vets the package in the current directory.
+
+ go vet package/path/name
+vets the package whose path is provided.
+
+Use "go help packages" to see other ways of specifying which packages to vet.
+
+Vet's exit code is 2 for erroneous invocation of the tool, 1 if a
+problem was reported, and 0 otherwise. Note that the tool does not
+check every possible problem and depends on unreliable heuristics
+so it should be used as guidance only, not as a firm indicator of
+program correctness.
+
+By default the -all flag is set so all checks are performed.
+If any flags are explicitly set to true, only those tests are run. Conversely, if
+any flag is explicitly set to false, only those tests are disabled. Thus -printf=true
+runs the printf check, -printf=false runs all checks except the printf check.
+
+By default vet uses the object files generated by 'go install some/pkg' to typecheck the code.
+If the -source flag is provided, vet uses only source code.
+
+Available checks:
+
+Assembly declarations
+
+Flag: -asmdecl
+
+Mismatches between assembly files and Go function declarations.
+
+Useless assignments
+
+Flag: -assign
+
+Check for useless assignments.
+
+Atomic mistakes
+
+Flag: -atomic
+
+Common mistaken usages of the sync/atomic package.
+
+Boolean conditions
+
+Flag: -bool
+
+Mistakes involving boolean operators.
+
+Build tags
+
+Flag: -buildtags
+
+Badly formed or misplaced +build tags.
+
+Invalid uses of cgo
+
+Flag: -cgocall
+
+Detect some violations of the cgo pointer passing rules.
+
+Unkeyed composite literals
+
+Flag: -composites
+
+Composite struct literals that do not use the field-keyed syntax.
+
+Copying locks
+
+Flag: -copylocks
+
+Locks that are erroneously passed by value.
+
+HTTP responses used incorrectly
+
+Flag: -httpresponse
+
+Mistakes deferring a function call on an HTTP response before
+checking whether the error returned with the response was nil.
+
+Failure to call the cancelation function returned by WithCancel
+
+Flag: -lostcancel
+
+The cancelation function returned by context.WithCancel, WithTimeout,
+and WithDeadline must be called or the new context will remain live
+until its parent context is cancelled.
+(The background context is never cancelled.)
+
+Methods
+
+Flag: -methods
+
+Non-standard signatures for methods with familiar names, including:
+ Format GobEncode GobDecode MarshalJSON MarshalXML
+ Peek ReadByte ReadFrom ReadRune Scan Seek
+ UnmarshalJSON UnreadByte UnreadRune WriteByte
+ WriteTo
+
+Nil function comparison
+
+Flag: -nilfunc
+
+Comparisons between functions and nil.
+
+Printf family
+
+Flag: -printf
+
+Suspicious calls to functions in the Printf family, including any functions
+with these names, disregarding case:
+ Print Printf Println
+ Fprint Fprintf Fprintln
+ Sprint Sprintf Sprintln
+ Error Errorf
+ Fatal Fatalf
+ Log Logf
+ Panic Panicf Panicln
+The -printfuncs flag can be used to redefine this list.
+If the function name ends with an 'f', the function is assumed to take
+a format descriptor string in the manner of fmt.Printf. If not, vet
+complains about arguments that look like format descriptor strings.
+
+It also checks for errors such as using a Writer as the first argument of
+Printf.
+
+Range loop variables
+
+Flag: -rangeloops
+
+Incorrect uses of range loop variables in closures.
+
+Shadowed variables
+
+Flag: -shadow=false (experimental; must be set explicitly)
+
+Variables that may have been unintentionally shadowed.
+
+Shifts
+
+Flag: -shift
+
+Shifts equal to or longer than the variable's length.
+
+Struct tags
+
+Flag: -structtags
+
+Struct tags that do not follow the format understood by reflect.StructTag.Get.
+Well-known encoding struct tags (json, xml) used with unexported fields.
+
+Tests and documentation examples
+
+Flag: -tests
+
+Mistakes involving tests including functions with incorrect names or signatures
+and example tests that document identifiers not in the package.
+
+Unreachable code
+
+Flag: -unreachable
+
+Unreachable code.
+
+Misuse of unsafe Pointers
+
+Flag: -unsafeptr
+
+Likely incorrect uses of unsafe.Pointer to convert integers to pointers.
+A conversion from uintptr to unsafe.Pointer is invalid if it implies that
+there is a uintptr-typed word in memory that holds a pointer value,
+because that word will be invisible to stack copying and to the garbage
+collector.
+
+Unused result of certain function calls
+
+Flag: -unusedresult
+
+Calls to well-known functions and methods that return a value that is
+discarded. By default, this includes functions like fmt.Errorf and
+fmt.Sprintf and methods like String and Error. The flags -unusedfuncs
+and -unusedstringmethods control the set.
+
+Other flags
+
+These flags configure the behavior of vet:
+
+ -all (default true)
+ Enable all non-experimental checks.
+ -v
+ Verbose mode
+ -printfuncs
+ A comma-separated list of print-like function names
+ to supplement the standard list.
+ For more information, see the discussion of the -printf flag.
+ -shadowstrict
+ Whether to be strict about shadowing; can be noisy.
+
+Using vet directly
+
+For testing and debugging vet can be run directly by invoking
+"go tool vet" or just running the binary. Run this way, vet might not
+have up to date information for imported packages.
+
+ go tool vet source/directory/*.go
+vets the files named, all of which must be in the same package.
+
+ go tool vet source/directory
+recursively descends the directory, vetting each package it finds.
+
+*/
+package govet
diff --git a/vendor/github.com/golangci/govet/golangci.go b/vendor/github.com/golangci/govet/golangci.go
new file mode 100644
index 00000000000..42b77d34ad5
--- /dev/null
+++ b/vendor/github.com/golangci/govet/golangci.go
@@ -0,0 +1,51 @@
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+ "strings"
+
+ "golang.org/x/tools/go/loader"
+)
+
+type Issue struct {
+ Pos token.Position
+ Message string
+}
+
+var foundIssues []Issue
+
+func Analyze(files []*ast.File, fset *token.FileSet, pkgInfo *loader.PackageInfo, checkShadowing bool, pg astFilePathGetter) ([]Issue, error) {
+ foundIssues = nil
+ *source = false // import type data for "fmt" from installed packages
+
+ if checkShadowing {
+ experimental["shadow"] = false
+ }
+ for name, setting := range report {
+ if *setting == unset && !experimental[name] {
+ *setting = setTrue
+ }
+ }
+
+ initPrintFlags()
+ initUnusedFlags()
+
+ filesRun = true
+ for _, f := range files {
+ name := fset.Position(f.Pos()).Filename
+ if !strings.HasSuffix(name, "_test.go") {
+ includesNonTest = true
+ }
+ }
+ pkg, err := doPackage(nil, pkgInfo, fset, files, pg)
+ if err != nil {
+ return nil, err
+ }
+
+ if pkg == nil {
+ return nil, nil
+ }
+
+ return foundIssues, nil
+}
diff --git a/vendor/github.com/golangci/govet/httpresponse.go b/vendor/github.com/golangci/govet/httpresponse.go
new file mode 100644
index 00000000000..1f16832bfcb
--- /dev/null
+++ b/vendor/github.com/golangci/govet/httpresponse.go
@@ -0,0 +1,137 @@
+// Copyright 2016 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.
+
+// This file contains the check for http.Response values being used before
+// checking for errors.
+
+package govet
+
+import (
+ "go/ast"
+ "go/types"
+)
+
+func init() {
+ register("httpresponse",
+ "check errors are checked before using an http Response",
+ checkHTTPResponse, callExpr)
+}
+
+func checkHTTPResponse(f *File, node ast.Node) {
+ call := node.(*ast.CallExpr)
+ if !isHTTPFuncOrMethodOnClient(f, call) {
+ return // the function call is not related to this check.
+ }
+
+ finder := &blockStmtFinder{node: call}
+ ast.Walk(finder, f.file)
+ stmts := finder.stmts()
+ if len(stmts) < 2 {
+ return // the call to the http function is the last statement of the block.
+ }
+
+ asg, ok := stmts[0].(*ast.AssignStmt)
+ if !ok {
+ return // the first statement is not assignment.
+ }
+ resp := rootIdent(asg.Lhs[0])
+ if resp == nil {
+ return // could not find the http.Response in the assignment.
+ }
+
+ def, ok := stmts[1].(*ast.DeferStmt)
+ if !ok {
+ return // the following statement is not a defer.
+ }
+ root := rootIdent(def.Call.Fun)
+ if root == nil {
+ return // could not find the receiver of the defer call.
+ }
+
+ if resp.Obj == root.Obj {
+ f.Badf(root.Pos(), "using %s before checking for errors", resp.Name)
+ }
+}
+
+// isHTTPFuncOrMethodOnClient checks whether the given call expression is on
+// either a function of the net/http package or a method of http.Client that
+// returns (*http.Response, error).
+func isHTTPFuncOrMethodOnClient(f *File, expr *ast.CallExpr) bool {
+ fun, _ := expr.Fun.(*ast.SelectorExpr)
+ sig, _ := f.pkg.types[fun].Type.(*types.Signature)
+ if sig == nil {
+ return false // the call is not on of the form x.f()
+ }
+
+ res := sig.Results()
+ if res.Len() != 2 {
+ return false // the function called does not return two values.
+ }
+ if ptr, ok := res.At(0).Type().(*types.Pointer); !ok || !isNamedType(ptr.Elem(), "net/http", "Response") {
+ return false // the first return type is not *http.Response.
+ }
+ if !types.Identical(res.At(1).Type().Underlying(), errorType) {
+ return false // the second return type is not error
+ }
+
+ typ := f.pkg.types[fun.X].Type
+ if typ == nil {
+ id, ok := fun.X.(*ast.Ident)
+ return ok && id.Name == "http" // function in net/http package.
+ }
+
+ if isNamedType(typ, "net/http", "Client") {
+ return true // method on http.Client.
+ }
+ ptr, ok := typ.(*types.Pointer)
+ return ok && isNamedType(ptr.Elem(), "net/http", "Client") // method on *http.Client.
+}
+
+// blockStmtFinder is an ast.Visitor that given any ast node can find the
+// statement containing it and its succeeding statements in the same block.
+type blockStmtFinder struct {
+ node ast.Node // target of search
+ stmt ast.Stmt // innermost statement enclosing argument to Visit
+ block *ast.BlockStmt // innermost block enclosing argument to Visit.
+}
+
+// Visit finds f.node performing a search down the ast tree.
+// It keeps the last block statement and statement seen for later use.
+func (f *blockStmtFinder) Visit(node ast.Node) ast.Visitor {
+ if node == nil || f.node.Pos() < node.Pos() || f.node.End() > node.End() {
+ return nil // not here
+ }
+ switch n := node.(type) {
+ case *ast.BlockStmt:
+ f.block = n
+ case ast.Stmt:
+ f.stmt = n
+ }
+ if f.node.Pos() == node.Pos() && f.node.End() == node.End() {
+ return nil // found
+ }
+ return f // keep looking
+}
+
+// stmts returns the statements of f.block starting from the one including f.node.
+func (f *blockStmtFinder) stmts() []ast.Stmt {
+ for i, v := range f.block.List {
+ if f.stmt == v {
+ return f.block.List[i:]
+ }
+ }
+ return nil
+}
+
+// rootIdent finds the root identifier x in a chain of selections x.y.z, or nil if not found.
+func rootIdent(n ast.Node) *ast.Ident {
+ switch n := n.(type) {
+ case *ast.SelectorExpr:
+ return rootIdent(n.X)
+ case *ast.Ident:
+ return n
+ default:
+ return nil
+ }
+}
diff --git a/vendor/github.com/golangci/govet/lib/cfg/builder.go b/vendor/github.com/golangci/govet/lib/cfg/builder.go
new file mode 100644
index 00000000000..da1cc7e6384
--- /dev/null
+++ b/vendor/github.com/golangci/govet/lib/cfg/builder.go
@@ -0,0 +1,512 @@
+// Copyright 2016 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 cfg
+
+// This file implements the CFG construction pass.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+)
+
+type builder struct {
+ cfg *CFG
+ mayReturn func(*ast.CallExpr) bool
+ current *Block
+ lblocks map[*ast.Object]*lblock // labeled blocks
+ targets *targets // linked stack of branch targets
+}
+
+func (b *builder) stmt(_s ast.Stmt) {
+ // The label of the current statement. If non-nil, its _goto
+ // target is always set; its _break and _continue are set only
+ // within the body of switch/typeswitch/select/for/range.
+ // It is effectively an additional default-nil parameter of stmt().
+ var label *lblock
+start:
+ switch s := _s.(type) {
+ case *ast.BadStmt,
+ *ast.SendStmt,
+ *ast.IncDecStmt,
+ *ast.GoStmt,
+ *ast.DeferStmt,
+ *ast.EmptyStmt,
+ *ast.AssignStmt:
+ // No effect on control flow.
+ b.add(s)
+
+ case *ast.ExprStmt:
+ b.add(s)
+ if call, ok := s.X.(*ast.CallExpr); ok && !b.mayReturn(call) {
+ // Calls to panic, os.Exit, etc, never return.
+ b.current = b.newUnreachableBlock("unreachable.call")
+ }
+
+ case *ast.DeclStmt:
+ // Treat each var ValueSpec as a separate statement.
+ d := s.Decl.(*ast.GenDecl)
+ if d.Tok == token.VAR {
+ for _, spec := range d.Specs {
+ if spec, ok := spec.(*ast.ValueSpec); ok {
+ b.add(spec)
+ }
+ }
+ }
+
+ case *ast.LabeledStmt:
+ label = b.labeledBlock(s.Label)
+ b.jump(label._goto)
+ b.current = label._goto
+ _s = s.Stmt
+ goto start // effectively: tailcall stmt(g, s.Stmt, label)
+
+ case *ast.ReturnStmt:
+ b.add(s)
+ b.current = b.newUnreachableBlock("unreachable.return")
+
+ case *ast.BranchStmt:
+ var block *Block
+ switch s.Tok {
+ case token.BREAK:
+ if s.Label != nil {
+ if lb := b.labeledBlock(s.Label); lb != nil {
+ block = lb._break
+ }
+ } else {
+ for t := b.targets; t != nil && block == nil; t = t.tail {
+ block = t._break
+ }
+ }
+
+ case token.CONTINUE:
+ if s.Label != nil {
+ if lb := b.labeledBlock(s.Label); lb != nil {
+ block = lb._continue
+ }
+ } else {
+ for t := b.targets; t != nil && block == nil; t = t.tail {
+ block = t._continue
+ }
+ }
+
+ case token.FALLTHROUGH:
+ for t := b.targets; t != nil; t = t.tail {
+ block = t._fallthrough
+ }
+
+ case token.GOTO:
+ if s.Label != nil {
+ block = b.labeledBlock(s.Label)._goto
+ }
+ }
+ if block == nil {
+ block = b.newBlock("undefined.branch")
+ }
+ b.jump(block)
+ b.current = b.newUnreachableBlock("unreachable.branch")
+
+ case *ast.BlockStmt:
+ b.stmtList(s.List)
+
+ case *ast.IfStmt:
+ if s.Init != nil {
+ b.stmt(s.Init)
+ }
+ then := b.newBlock("if.then")
+ done := b.newBlock("if.done")
+ _else := done
+ if s.Else != nil {
+ _else = b.newBlock("if.else")
+ }
+ b.add(s.Cond)
+ b.ifelse(then, _else)
+ b.current = then
+ b.stmt(s.Body)
+ b.jump(done)
+
+ if s.Else != nil {
+ b.current = _else
+ b.stmt(s.Else)
+ b.jump(done)
+ }
+
+ b.current = done
+
+ case *ast.SwitchStmt:
+ b.switchStmt(s, label)
+
+ case *ast.TypeSwitchStmt:
+ b.typeSwitchStmt(s, label)
+
+ case *ast.SelectStmt:
+ b.selectStmt(s, label)
+
+ case *ast.ForStmt:
+ b.forStmt(s, label)
+
+ case *ast.RangeStmt:
+ b.rangeStmt(s, label)
+
+ default:
+ panic(fmt.Sprintf("unexpected statement kind: %T", s))
+ }
+}
+
+func (b *builder) stmtList(list []ast.Stmt) {
+ for _, s := range list {
+ b.stmt(s)
+ }
+}
+
+func (b *builder) switchStmt(s *ast.SwitchStmt, label *lblock) {
+ if s.Init != nil {
+ b.stmt(s.Init)
+ }
+ if s.Tag != nil {
+ b.add(s.Tag)
+ }
+ done := b.newBlock("switch.done")
+ if label != nil {
+ label._break = done
+ }
+ // We pull the default case (if present) down to the end.
+ // But each fallthrough label must point to the next
+ // body block in source order, so we preallocate a
+ // body block (fallthru) for the next case.
+ // Unfortunately this makes for a confusing block order.
+ var defaultBody *[]ast.Stmt
+ var defaultFallthrough *Block
+ var fallthru, defaultBlock *Block
+ ncases := len(s.Body.List)
+ for i, clause := range s.Body.List {
+ body := fallthru
+ if body == nil {
+ body = b.newBlock("switch.body") // first case only
+ }
+
+ // Preallocate body block for the next case.
+ fallthru = done
+ if i+1 < ncases {
+ fallthru = b.newBlock("switch.body")
+ }
+
+ cc := clause.(*ast.CaseClause)
+ if cc.List == nil {
+ // Default case.
+ defaultBody = &cc.Body
+ defaultFallthrough = fallthru
+ defaultBlock = body
+ continue
+ }
+
+ var nextCond *Block
+ for _, cond := range cc.List {
+ nextCond = b.newBlock("switch.next")
+ b.add(cond) // one half of the tag==cond condition
+ b.ifelse(body, nextCond)
+ b.current = nextCond
+ }
+ b.current = body
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ _fallthrough: fallthru,
+ }
+ b.stmtList(cc.Body)
+ b.targets = b.targets.tail
+ b.jump(done)
+ b.current = nextCond
+ }
+ if defaultBlock != nil {
+ b.jump(defaultBlock)
+ b.current = defaultBlock
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ _fallthrough: defaultFallthrough,
+ }
+ b.stmtList(*defaultBody)
+ b.targets = b.targets.tail
+ }
+ b.jump(done)
+ b.current = done
+}
+
+func (b *builder) typeSwitchStmt(s *ast.TypeSwitchStmt, label *lblock) {
+ if s.Init != nil {
+ b.stmt(s.Init)
+ }
+ if s.Assign != nil {
+ b.add(s.Assign)
+ }
+
+ done := b.newBlock("typeswitch.done")
+ if label != nil {
+ label._break = done
+ }
+ var default_ *ast.CaseClause
+ for _, clause := range s.Body.List {
+ cc := clause.(*ast.CaseClause)
+ if cc.List == nil {
+ default_ = cc
+ continue
+ }
+ body := b.newBlock("typeswitch.body")
+ var next *Block
+ for _, casetype := range cc.List {
+ next = b.newBlock("typeswitch.next")
+ // casetype is a type, so don't call b.add(casetype).
+ // This block logically contains a type assertion,
+ // x.(casetype), but it's unclear how to represent x.
+ _ = casetype
+ b.ifelse(body, next)
+ b.current = next
+ }
+ b.current = body
+ b.typeCaseBody(cc, done)
+ b.current = next
+ }
+ if default_ != nil {
+ b.typeCaseBody(default_, done)
+ } else {
+ b.jump(done)
+ }
+ b.current = done
+}
+
+func (b *builder) typeCaseBody(cc *ast.CaseClause, done *Block) {
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ }
+ b.stmtList(cc.Body)
+ b.targets = b.targets.tail
+ b.jump(done)
+}
+
+func (b *builder) selectStmt(s *ast.SelectStmt, label *lblock) {
+ // First evaluate channel expressions.
+ // TODO(adonovan): fix: evaluate only channel exprs here.
+ for _, clause := range s.Body.List {
+ if comm := clause.(*ast.CommClause).Comm; comm != nil {
+ b.stmt(comm)
+ }
+ }
+
+ done := b.newBlock("select.done")
+ if label != nil {
+ label._break = done
+ }
+
+ var defaultBody *[]ast.Stmt
+ for _, cc := range s.Body.List {
+ clause := cc.(*ast.CommClause)
+ if clause.Comm == nil {
+ defaultBody = &clause.Body
+ continue
+ }
+ body := b.newBlock("select.body")
+ next := b.newBlock("select.next")
+ b.ifelse(body, next)
+ b.current = body
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ }
+ switch comm := clause.Comm.(type) {
+ case *ast.ExprStmt: // <-ch
+ // nop
+ case *ast.AssignStmt: // x := <-states[state].Chan
+ b.add(comm.Lhs[0])
+ }
+ b.stmtList(clause.Body)
+ b.targets = b.targets.tail
+ b.jump(done)
+ b.current = next
+ }
+ if defaultBody != nil {
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ }
+ b.stmtList(*defaultBody)
+ b.targets = b.targets.tail
+ b.jump(done)
+ }
+ b.current = done
+}
+
+func (b *builder) forStmt(s *ast.ForStmt, label *lblock) {
+ // ...init...
+ // jump loop
+ // loop:
+ // if cond goto body else done
+ // body:
+ // ...body...
+ // jump post
+ // post: (target of continue)
+ // ...post...
+ // jump loop
+ // done: (target of break)
+ if s.Init != nil {
+ b.stmt(s.Init)
+ }
+ body := b.newBlock("for.body")
+ done := b.newBlock("for.done") // target of 'break'
+ loop := body // target of back-edge
+ if s.Cond != nil {
+ loop = b.newBlock("for.loop")
+ }
+ cont := loop // target of 'continue'
+ if s.Post != nil {
+ cont = b.newBlock("for.post")
+ }
+ if label != nil {
+ label._break = done
+ label._continue = cont
+ }
+ b.jump(loop)
+ b.current = loop
+ if loop != body {
+ b.add(s.Cond)
+ b.ifelse(body, done)
+ b.current = body
+ }
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ _continue: cont,
+ }
+ b.stmt(s.Body)
+ b.targets = b.targets.tail
+ b.jump(cont)
+
+ if s.Post != nil {
+ b.current = cont
+ b.stmt(s.Post)
+ b.jump(loop) // back-edge
+ }
+ b.current = done
+}
+
+func (b *builder) rangeStmt(s *ast.RangeStmt, label *lblock) {
+ b.add(s.X)
+
+ if s.Key != nil {
+ b.add(s.Key)
+ }
+ if s.Value != nil {
+ b.add(s.Value)
+ }
+
+ // ...
+ // loop: (target of continue)
+ // if ... goto body else done
+ // body:
+ // ...
+ // jump loop
+ // done: (target of break)
+
+ loop := b.newBlock("range.loop")
+ b.jump(loop)
+ b.current = loop
+
+ body := b.newBlock("range.body")
+ done := b.newBlock("range.done")
+ b.ifelse(body, done)
+ b.current = body
+
+ if label != nil {
+ label._break = done
+ label._continue = loop
+ }
+ b.targets = &targets{
+ tail: b.targets,
+ _break: done,
+ _continue: loop,
+ }
+ b.stmt(s.Body)
+ b.targets = b.targets.tail
+ b.jump(loop) // back-edge
+ b.current = done
+}
+
+// -------- helpers --------
+
+// Destinations associated with unlabeled for/switch/select stmts.
+// We push/pop one of these as we enter/leave each construct and for
+// each BranchStmt we scan for the innermost target of the right type.
+//
+type targets struct {
+ tail *targets // rest of stack
+ _break *Block
+ _continue *Block
+ _fallthrough *Block
+}
+
+// Destinations associated with a labeled block.
+// We populate these as labels are encountered in forward gotos or
+// labeled statements.
+//
+type lblock struct {
+ _goto *Block
+ _break *Block
+ _continue *Block
+}
+
+// labeledBlock returns the branch target associated with the
+// specified label, creating it if needed.
+//
+func (b *builder) labeledBlock(label *ast.Ident) *lblock {
+ lb := b.lblocks[label.Obj]
+ if lb == nil {
+ lb = &lblock{_goto: b.newBlock(label.Name)}
+ if b.lblocks == nil {
+ b.lblocks = make(map[*ast.Object]*lblock)
+ }
+ b.lblocks[label.Obj] = lb
+ }
+ return lb
+}
+
+// newBlock appends a new unconnected basic block to b.cfg's block
+// slice and returns it.
+// It does not automatically become the current block.
+// comment is an optional string for more readable debugging output.
+func (b *builder) newBlock(comment string) *Block {
+ g := b.cfg
+ block := &Block{
+ index: int32(len(g.Blocks)),
+ comment: comment,
+ }
+ block.Succs = block.succs2[:0]
+ g.Blocks = append(g.Blocks, block)
+ return block
+}
+
+func (b *builder) newUnreachableBlock(comment string) *Block {
+ block := b.newBlock(comment)
+ block.unreachable = true
+ return block
+}
+
+func (b *builder) add(n ast.Node) {
+ b.current.Nodes = append(b.current.Nodes, n)
+}
+
+// jump adds an edge from the current block to the target block,
+// and sets b.current to nil.
+func (b *builder) jump(target *Block) {
+ b.current.Succs = append(b.current.Succs, target)
+ b.current = nil
+}
+
+// ifelse emits edges from the current block to the t and f blocks,
+// and sets b.current to nil.
+func (b *builder) ifelse(t, f *Block) {
+ b.current.Succs = append(b.current.Succs, t, f)
+ b.current = nil
+}
diff --git a/vendor/github.com/golangci/govet/lib/cfg/cfg.go b/vendor/github.com/golangci/govet/lib/cfg/cfg.go
new file mode 100644
index 00000000000..e4d5bfe5d2d
--- /dev/null
+++ b/vendor/github.com/golangci/govet/lib/cfg/cfg.go
@@ -0,0 +1,142 @@
+// Copyright 2016 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.
+
+// This package constructs a simple control-flow graph (CFG) of the
+// statements and expressions within a single function.
+//
+// Use cfg.New to construct the CFG for a function body.
+//
+// The blocks of the CFG contain all the function's non-control
+// statements. The CFG does not contain control statements such as If,
+// Switch, Select, and Branch, but does contain their subexpressions.
+// For example, this source code:
+//
+// if x := f(); x != nil {
+// T()
+// } else {
+// F()
+// }
+//
+// produces this CFG:
+//
+// 1: x := f()
+// x != nil
+// succs: 2, 3
+// 2: T()
+// succs: 4
+// 3: F()
+// succs: 4
+// 4:
+//
+// The CFG does contain Return statements; even implicit returns are
+// materialized (at the position of the function's closing brace).
+//
+// The CFG does not record conditions associated with conditional branch
+// edges, nor the short-circuit semantics of the && and || operators,
+// nor abnormal control flow caused by panic. If you need this
+// information, use golang.org/x/tools/go/ssa instead.
+//
+package cfg
+
+// Although the vet tool has type information, it is often extremely
+// fragmentary, so for simplicity this package does not depend on
+// go/types. Consequently control-flow conditions are ignored even
+// when constant, and "mayReturn" information must be provided by the
+// client.
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/format"
+ "go/token"
+)
+
+// A CFG represents the control-flow graph of a single function.
+//
+// The entry point is Blocks[0]; there may be multiple return blocks.
+type CFG struct {
+ Blocks []*Block // block[0] is entry; order otherwise undefined
+}
+
+// A Block represents a basic block: a list of statements and
+// expressions that are always evaluated sequentially.
+//
+// A block may have 0-2 successors: zero for a return block or a block
+// that calls a function such as panic that never returns; one for a
+// normal (jump) block; and two for a conditional (if) block.
+type Block struct {
+ Nodes []ast.Node // statements, expressions, and ValueSpecs
+ Succs []*Block // successor nodes in the graph
+
+ comment string // for debugging
+ index int32 // index within CFG.Blocks
+ unreachable bool // is block of stmts following return/panic/for{}
+ succs2 [2]*Block // underlying array for Succs
+}
+
+// New returns a new control-flow graph for the specified function body,
+// which must be non-nil.
+//
+// The CFG builder calls mayReturn to determine whether a given function
+// call may return. For example, calls to panic, os.Exit, and log.Fatal
+// do not return, so the builder can remove infeasible graph edges
+// following such calls. The builder calls mayReturn only for a
+// CallExpr beneath an ExprStmt.
+func New(body *ast.BlockStmt, mayReturn func(*ast.CallExpr) bool) *CFG {
+ b := builder{
+ mayReturn: mayReturn,
+ cfg: new(CFG),
+ }
+ b.current = b.newBlock("entry")
+ b.stmt(body)
+
+ // Does control fall off the end of the function's body?
+ // Make implicit return explicit.
+ if b.current != nil && !b.current.unreachable {
+ b.add(&ast.ReturnStmt{
+ Return: body.End() - 1,
+ })
+ }
+
+ return b.cfg
+}
+
+func (b *Block) String() string {
+ return fmt.Sprintf("block %d (%s)", b.index, b.comment)
+}
+
+// Return returns the return statement at the end of this block if present, nil otherwise.
+func (b *Block) Return() (ret *ast.ReturnStmt) {
+ if len(b.Nodes) > 0 {
+ ret, _ = b.Nodes[len(b.Nodes)-1].(*ast.ReturnStmt)
+ }
+ return
+}
+
+// Format formats the control-flow graph for ease of debugging.
+func (g *CFG) Format(fset *token.FileSet) string {
+ var buf bytes.Buffer
+ for _, b := range g.Blocks {
+ fmt.Fprintf(&buf, ".%d: # %s\n", b.index, b.comment)
+ for _, n := range b.Nodes {
+ fmt.Fprintf(&buf, "\t%s\n", formatNode(fset, n))
+ }
+ if len(b.Succs) > 0 {
+ fmt.Fprintf(&buf, "\tsuccs:")
+ for _, succ := range b.Succs {
+ fmt.Fprintf(&buf, " %d", succ.index)
+ }
+ buf.WriteByte('\n')
+ }
+ buf.WriteByte('\n')
+ }
+ return buf.String()
+}
+
+func formatNode(fset *token.FileSet, n ast.Node) string {
+ var buf bytes.Buffer
+ format.Node(&buf, fset, n)
+ // Indent secondary lines by a tab.
+ return string(bytes.Replace(buf.Bytes(), []byte("\n"), []byte("\n\t"), -1))
+}
diff --git a/vendor/github.com/golangci/govet/lib/whitelist/whitelist.go b/vendor/github.com/golangci/govet/lib/whitelist/whitelist.go
new file mode 100644
index 00000000000..fdd65d37323
--- /dev/null
+++ b/vendor/github.com/golangci/govet/lib/whitelist/whitelist.go
@@ -0,0 +1,28 @@
+// 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 whitelist defines exceptions for the vet tool.
+package whitelist
+
+// UnkeyedLiteral is a white list of types in the standard packages
+// that are used with unkeyed literals we deem to be acceptable.
+var UnkeyedLiteral = map[string]bool{
+ // These image and image/color struct types are frozen. We will never add fields to them.
+ "image/color.Alpha16": true,
+ "image/color.Alpha": true,
+ "image/color.CMYK": true,
+ "image/color.Gray16": true,
+ "image/color.Gray": true,
+ "image/color.NRGBA64": true,
+ "image/color.NRGBA": true,
+ "image/color.NYCbCrA": true,
+ "image/color.RGBA64": true,
+ "image/color.RGBA": true,
+ "image/color.YCbCr": true,
+ "image.Point": true,
+ "image.Rectangle": true,
+ "image.Uniform": true,
+
+ "unicode.Range16": true,
+}
diff --git a/vendor/github.com/golangci/govet/lostcancel.go b/vendor/github.com/golangci/govet/lostcancel.go
new file mode 100644
index 00000000000..387b77b5fa4
--- /dev/null
+++ b/vendor/github.com/golangci/govet/lostcancel.go
@@ -0,0 +1,323 @@
+// Copyright 2016 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 govet
+
+import (
+ "fmt"
+ "go/ast"
+ "go/types"
+ "strconv"
+
+ "github.com/golangci/govet/lib/cfg"
+)
+
+func init() {
+ register("lostcancel",
+ "check for failure to call cancelation function returned by context.WithCancel",
+ checkLostCancel,
+ funcDecl, funcLit)
+}
+
+const debugLostCancel = false
+
+var contextPackage = "context"
+
+// checkLostCancel reports a failure to the call the cancel function
+// returned by context.WithCancel, either because the variable was
+// assigned to the blank identifier, or because there exists a
+// control-flow path from the call to a return statement and that path
+// does not "use" the cancel function. Any reference to the variable
+// counts as a use, even within a nested function literal.
+//
+// checkLostCancel analyzes a single named or literal function.
+func checkLostCancel(f *File, node ast.Node) {
+ // Fast path: bypass check if file doesn't use context.WithCancel.
+ if !hasImport(f.file, contextPackage) {
+ return
+ }
+
+ // Maps each cancel variable to its defining ValueSpec/AssignStmt.
+ cancelvars := make(map[*types.Var]ast.Node)
+
+ // Find the set of cancel vars to analyze.
+ stack := make([]ast.Node, 0, 32)
+ ast.Inspect(node, func(n ast.Node) bool {
+ switch n.(type) {
+ case *ast.FuncLit:
+ if len(stack) > 0 {
+ return false // don't stray into nested functions
+ }
+ case nil:
+ stack = stack[:len(stack)-1] // pop
+ return true
+ }
+ stack = append(stack, n) // push
+
+ // Look for [{AssignStmt,ValueSpec} CallExpr SelectorExpr]:
+ //
+ // ctx, cancel := context.WithCancel(...)
+ // ctx, cancel = context.WithCancel(...)
+ // var ctx, cancel = context.WithCancel(...)
+ //
+ if isContextWithCancel(f, n) && isCall(stack[len(stack)-2]) {
+ var id *ast.Ident // id of cancel var
+ stmt := stack[len(stack)-3]
+ switch stmt := stmt.(type) {
+ case *ast.ValueSpec:
+ if len(stmt.Names) > 1 {
+ id = stmt.Names[1]
+ }
+ case *ast.AssignStmt:
+ if len(stmt.Lhs) > 1 {
+ id, _ = stmt.Lhs[1].(*ast.Ident)
+ }
+ }
+ if id != nil {
+ if id.Name == "_" {
+ f.Badf(id.Pos(), "the cancel function returned by context.%s should be called, not discarded, to avoid a context leak",
+ n.(*ast.SelectorExpr).Sel.Name)
+ } else if v, ok := f.pkg.uses[id].(*types.Var); ok {
+ cancelvars[v] = stmt
+ } else if v, ok := f.pkg.defs[id].(*types.Var); ok {
+ cancelvars[v] = stmt
+ }
+ }
+ }
+
+ return true
+ })
+
+ if len(cancelvars) == 0 {
+ return // no need to build CFG
+ }
+
+ // Tell the CFG builder which functions never return.
+ info := &types.Info{Uses: f.pkg.uses, Selections: f.pkg.selectors}
+ mayReturn := func(call *ast.CallExpr) bool {
+ name := callName(info, call)
+ return !noReturnFuncs[name]
+ }
+
+ // Build the CFG.
+ var g *cfg.CFG
+ var sig *types.Signature
+ switch node := node.(type) {
+ case *ast.FuncDecl:
+ obj := f.pkg.defs[node.Name]
+ if obj == nil {
+ return // type error (e.g. duplicate function declaration)
+ }
+ sig, _ = obj.Type().(*types.Signature)
+ g = cfg.New(node.Body, mayReturn)
+ case *ast.FuncLit:
+ sig, _ = f.pkg.types[node.Type].Type.(*types.Signature)
+ g = cfg.New(node.Body, mayReturn)
+ }
+
+ // Print CFG.
+ if debugLostCancel {
+ fmt.Println(g.Format(f.fset))
+ }
+
+ // Examine the CFG for each variable in turn.
+ // (It would be more efficient to analyze all cancelvars in a
+ // single pass over the AST, but seldom is there more than one.)
+ for v, stmt := range cancelvars {
+ if ret := lostCancelPath(f, g, v, stmt, sig); ret != nil {
+ lineno := f.fset.Position(stmt.Pos()).Line
+ f.Badf(stmt.Pos(), "the %s function is not used on all paths (possible context leak)", v.Name())
+ f.Badf(ret.Pos(), "this return statement may be reached without using the %s var defined on line %d", v.Name(), lineno)
+ }
+ }
+}
+
+func isCall(n ast.Node) bool { _, ok := n.(*ast.CallExpr); return ok }
+
+func hasImport(f *ast.File, path string) bool {
+ for _, imp := range f.Imports {
+ v, _ := strconv.Unquote(imp.Path.Value)
+ if v == path {
+ return true
+ }
+ }
+ return false
+}
+
+// isContextWithCancel reports whether n is one of the qualified identifiers
+// context.With{Cancel,Timeout,Deadline}.
+func isContextWithCancel(f *File, n ast.Node) bool {
+ if sel, ok := n.(*ast.SelectorExpr); ok {
+ switch sel.Sel.Name {
+ case "WithCancel", "WithTimeout", "WithDeadline":
+ if x, ok := sel.X.(*ast.Ident); ok {
+ if pkgname, ok := f.pkg.uses[x].(*types.PkgName); ok {
+ return pkgname.Imported().Path() == contextPackage
+ }
+ // Import failed, so we can't check package path.
+ // Just check the local package name (heuristic).
+ return x.Name == "context"
+ }
+ }
+ }
+ return false
+}
+
+// lostCancelPath finds a path through the CFG, from stmt (which defines
+// the 'cancel' variable v) to a return statement, that doesn't "use" v.
+// If it finds one, it returns the return statement (which may be synthetic).
+// sig is the function's type, if known.
+func lostCancelPath(f *File, g *cfg.CFG, v *types.Var, stmt ast.Node, sig *types.Signature) *ast.ReturnStmt {
+ vIsNamedResult := sig != nil && tupleContains(sig.Results(), v)
+
+ // uses reports whether stmts contain a "use" of variable v.
+ uses := func(f *File, v *types.Var, stmts []ast.Node) bool {
+ found := false
+ for _, stmt := range stmts {
+ ast.Inspect(stmt, func(n ast.Node) bool {
+ switch n := n.(type) {
+ case *ast.Ident:
+ if f.pkg.uses[n] == v {
+ found = true
+ }
+ case *ast.ReturnStmt:
+ // A naked return statement counts as a use
+ // of the named result variables.
+ if n.Results == nil && vIsNamedResult {
+ found = true
+ }
+ }
+ return !found
+ })
+ }
+ return found
+ }
+
+ // blockUses computes "uses" for each block, caching the result.
+ memo := make(map[*cfg.Block]bool)
+ blockUses := func(f *File, v *types.Var, b *cfg.Block) bool {
+ res, ok := memo[b]
+ if !ok {
+ res = uses(f, v, b.Nodes)
+ memo[b] = res
+ }
+ return res
+ }
+
+ // Find the var's defining block in the CFG,
+ // plus the rest of the statements of that block.
+ var defblock *cfg.Block
+ var rest []ast.Node
+outer:
+ for _, b := range g.Blocks {
+ for i, n := range b.Nodes {
+ if n == stmt {
+ defblock = b
+ rest = b.Nodes[i+1:]
+ break outer
+ }
+ }
+ }
+ if defblock == nil {
+ panic("internal error: can't find defining block for cancel var")
+ }
+
+ // Is v "used" in the remainder of its defining block?
+ if uses(f, v, rest) {
+ return nil
+ }
+
+ // Does the defining block return without using v?
+ if ret := defblock.Return(); ret != nil {
+ return ret
+ }
+
+ // Search the CFG depth-first for a path, from defblock to a
+ // return block, in which v is never "used".
+ seen := make(map[*cfg.Block]bool)
+ var search func(blocks []*cfg.Block) *ast.ReturnStmt
+ search = func(blocks []*cfg.Block) *ast.ReturnStmt {
+ for _, b := range blocks {
+ if !seen[b] {
+ seen[b] = true
+
+ // Prune the search if the block uses v.
+ if blockUses(f, v, b) {
+ continue
+ }
+
+ // Found path to return statement?
+ if ret := b.Return(); ret != nil {
+ if debugLostCancel {
+ fmt.Printf("found path to return in block %s\n", b)
+ }
+ return ret // found
+ }
+
+ // Recur
+ if ret := search(b.Succs); ret != nil {
+ if debugLostCancel {
+ fmt.Printf(" from block %s\n", b)
+ }
+ return ret
+ }
+ }
+ }
+ return nil
+ }
+ return search(defblock.Succs)
+}
+
+func tupleContains(tuple *types.Tuple, v *types.Var) bool {
+ for i := 0; i < tuple.Len(); i++ {
+ if tuple.At(i) == v {
+ return true
+ }
+ }
+ return false
+}
+
+var noReturnFuncs = map[string]bool{
+ "(*testing.common).FailNow": true,
+ "(*testing.common).Fatal": true,
+ "(*testing.common).Fatalf": true,
+ "(*testing.common).Skip": true,
+ "(*testing.common).SkipNow": true,
+ "(*testing.common).Skipf": true,
+ "log.Fatal": true,
+ "log.Fatalf": true,
+ "log.Fatalln": true,
+ "os.Exit": true,
+ "panic": true,
+ "runtime.Goexit": true,
+}
+
+// callName returns the canonical name of the builtin, method, or
+// function called by call, if known.
+func callName(info *types.Info, call *ast.CallExpr) string {
+ switch fun := call.Fun.(type) {
+ case *ast.Ident:
+ // builtin, e.g. "panic"
+ if obj, ok := info.Uses[fun].(*types.Builtin); ok {
+ return obj.Name()
+ }
+ case *ast.SelectorExpr:
+ if sel, ok := info.Selections[fun]; ok && sel.Kind() == types.MethodVal {
+ // method call, e.g. "(*testing.common).Fatal"
+ meth := sel.Obj()
+ return fmt.Sprintf("(%s).%s",
+ meth.Type().(*types.Signature).Recv().Type(),
+ meth.Name())
+ }
+ if obj, ok := info.Uses[fun.Sel]; ok {
+ // qualified identifier, e.g. "os.Exit"
+ return fmt.Sprintf("%s.%s",
+ obj.Pkg().Path(),
+ obj.Name())
+ }
+ }
+
+ // function with no name, or defined in missing imported package
+ return ""
+}
diff --git a/vendor/github.com/golangci/govet/main.go b/vendor/github.com/golangci/govet/main.go
new file mode 100644
index 00000000000..8f2e949f847
--- /dev/null
+++ b/vendor/github.com/golangci/govet/main.go
@@ -0,0 +1,614 @@
+// 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.
+
+// Vet is a simple checker for static errors in Go source code.
+// See doc.go for more information.
+package govet
+
+import (
+ "bytes"
+ "encoding/json"
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/importer"
+ "go/printer"
+ "go/token"
+ "go/types"
+ "io"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strconv"
+ "strings"
+
+ "golang.org/x/tools/go/loader"
+)
+
+// Important! If you add flags here, make sure to update cmd/go/internal/vet/vetflag.go.
+
+var (
+ verbose = flag.Bool("v", true, "verbose")
+ source = flag.Bool("source", false, "import from source instead of compiled object files")
+ tags = flag.String("tags", "", "space-separated list of build tags to apply when parsing")
+ tagList = []string{} // exploded version of tags flag; set in main
+
+ vcfg vetConfig
+ mustTypecheck bool
+)
+
+var exitCode = 0
+
+// "-all" flag enables all non-experimental checks
+var all = triStateFlag("all", unset, "enable all non-experimental checks")
+
+// Flags to control which individual checks to perform.
+var report = map[string]*triState{
+ // Only unusual checks are written here.
+ // Most checks that operate during the AST walk are added by register.
+ "asmdecl": triStateFlag("asmdecl", unset, "check assembly against Go declarations"),
+ "buildtags": triStateFlag("buildtags", unset, "check that +build tags are valid"),
+}
+
+// experimental records the flags enabling experimental features. These must be
+// requested explicitly; they are not enabled by -all.
+var experimental = map[string]bool{}
+
+// setTrueCount record how many flags are explicitly set to true.
+var setTrueCount int
+
+// dirsRun and filesRun indicate whether the vet is applied to directory or
+// file targets. The distinction affects which checks are run.
+var dirsRun, filesRun bool
+
+// includesNonTest indicates whether the vet is applied to non-test targets.
+// Certain checks are relevant only if they touch both test and non-test files.
+var includesNonTest bool
+
+// A triState is a boolean that knows whether it has been set to either true or false.
+// It is used to identify if a flag appears; the standard boolean flag cannot
+// distinguish missing from unset. It also satisfies flag.Value.
+type triState int
+
+const (
+ unset triState = iota
+ setTrue
+ setFalse
+)
+
+func triStateFlag(name string, value triState, usage string) *triState {
+ flag.Var(&value, name, usage)
+ return &value
+}
+
+// triState implements flag.Value, flag.Getter, and flag.boolFlag.
+// They work like boolean flags: we can say vet -printf as well as vet -printf=true
+func (ts *triState) Get() interface{} {
+ return *ts == setTrue
+}
+
+func (ts triState) isTrue() bool {
+ return ts == setTrue
+}
+
+func (ts *triState) Set(value string) error {
+ b, err := strconv.ParseBool(value)
+ if err != nil {
+ return err
+ }
+ if b {
+ *ts = setTrue
+ setTrueCount++
+ } else {
+ *ts = setFalse
+ }
+ return nil
+}
+
+func (ts *triState) String() string {
+ switch *ts {
+ case unset:
+ return "true" // An unset flag will be set by -all, so defaults to true.
+ case setTrue:
+ return "true"
+ case setFalse:
+ return "false"
+ }
+ panic("not reached")
+}
+
+func (ts triState) IsBoolFlag() bool {
+ return true
+}
+
+// vet tells whether to report errors for the named check, a flag name.
+func vet(name string) bool {
+ return report[name].isTrue()
+}
+
+// setExit sets the value for os.Exit when it is called, later. It
+// remembers the highest value.
+func setExit(err int) {
+ if err > exitCode {
+ exitCode = err
+ }
+}
+
+var (
+ // Each of these vars has a corresponding case in (*File).Visit.
+ assignStmt *ast.AssignStmt
+ binaryExpr *ast.BinaryExpr
+ callExpr *ast.CallExpr
+ compositeLit *ast.CompositeLit
+ exprStmt *ast.ExprStmt
+ forStmt *ast.ForStmt
+ funcDecl *ast.FuncDecl
+ funcLit *ast.FuncLit
+ genDecl *ast.GenDecl
+ interfaceType *ast.InterfaceType
+ rangeStmt *ast.RangeStmt
+ returnStmt *ast.ReturnStmt
+ structType *ast.StructType
+
+ // checkers is a two-level map.
+ // The outer level is keyed by a nil pointer, one of the AST vars above.
+ // The inner level is keyed by checker name.
+ checkers = make(map[ast.Node]map[string]func(*File, ast.Node))
+)
+
+func register(name, usage string, fn func(*File, ast.Node), types ...ast.Node) {
+ report[name] = triStateFlag(name, unset, usage)
+ for _, typ := range types {
+ m := checkers[typ]
+ if m == nil {
+ m = make(map[string]func(*File, ast.Node))
+ checkers[typ] = m
+ }
+ m[name] = fn
+ }
+}
+
+// Usage is a replacement usage function for the flags package.
+func Usage() {
+ fmt.Fprintf(os.Stderr, "Usage of vet:\n")
+ fmt.Fprintf(os.Stderr, "\tvet [flags] directory...\n")
+ fmt.Fprintf(os.Stderr, "\tvet [flags] files... # Must be a single package\n")
+ fmt.Fprintf(os.Stderr, "By default, -all is set and all non-experimental checks are run.\n")
+ fmt.Fprintf(os.Stderr, "For more information run\n")
+ fmt.Fprintf(os.Stderr, "\tgo doc cmd/vet\n\n")
+ fmt.Fprintf(os.Stderr, "Flags:\n")
+ flag.PrintDefaults()
+ os.Exit(2)
+}
+
+// File is a wrapper for the state of a file used in the parser.
+// The parse tree walkers are all methods of this type.
+type File struct {
+ pkg *Package
+ fset *token.FileSet
+ name string
+ content []byte
+ file *ast.File
+ b bytes.Buffer // for use by methods
+
+ // Parsed package "foo" when checking package "foo_test"
+ basePkg *Package
+
+ // The keys are the objects that are receivers of a "String()
+ // string" method. The value reports whether the method has a
+ // pointer receiver.
+ // This is used by the recursiveStringer method in print.go.
+ stringerPtrs map[*ast.Object]bool
+
+ // Registered checkers to run.
+ checkers map[ast.Node][]func(*File, ast.Node)
+
+ // Unreachable nodes; can be ignored in shift check.
+ dead map[ast.Node]bool
+}
+
+func main() {
+ flag.Usage = Usage
+ flag.Parse()
+
+ // If any flag is set, we run only those checks requested.
+ // If all flag is set true or if no flags are set true, set all the non-experimental ones
+ // not explicitly set (in effect, set the "-all" flag).
+ if setTrueCount == 0 || *all == setTrue {
+ for name, setting := range report {
+ if *setting == unset && !experimental[name] {
+ *setting = setTrue
+ }
+ }
+ }
+
+ // Accept space-separated tags because that matches
+ // the go command's other subcommands.
+ // Accept commas because go tool vet traditionally has.
+ tagList = strings.Fields(strings.Replace(*tags, ",", " ", -1))
+
+ initPrintFlags()
+ initUnusedFlags()
+
+ if flag.NArg() == 0 {
+ Usage()
+ }
+
+ // Special case for "go vet" passing an explicit configuration:
+ // single argument ending in vet.cfg.
+ // Once we have a more general mechanism for obtaining this
+ // information from build tools like the go command,
+ // vet should be changed to use it. This vet.cfg hack is an
+ // experiment to learn about what form that information should take.
+ if flag.NArg() == 1 && strings.HasSuffix(flag.Arg(0), "vet.cfg") {
+ doPackageCfg(flag.Arg(0))
+ os.Exit(exitCode)
+ }
+
+ for _, name := range flag.Args() {
+ // Is it a directory?
+ fi, err := os.Stat(name)
+ if err != nil {
+ warnf("error walking tree: %s", err)
+ continue
+ }
+ if fi.IsDir() {
+ dirsRun = true
+ } else {
+ filesRun = true
+ if !strings.HasSuffix(name, "_test.go") {
+ includesNonTest = true
+ }
+ }
+ }
+ if dirsRun && filesRun {
+ Usage()
+ }
+ if dirsRun {
+ for _, name := range flag.Args() {
+ walkDir(name)
+ }
+ os.Exit(exitCode)
+ }
+ if pkg, _ := doPackage(nil, nil, nil, nil, nil); pkg == nil {
+ warnf("no files checked")
+ }
+ os.Exit(exitCode)
+}
+
+// prefixDirectory places the directory name on the beginning of each name in the list.
+func prefixDirectory(directory string, names []string) {
+ if directory != "." {
+ for i, name := range names {
+ names[i] = filepath.Join(directory, name)
+ }
+ }
+}
+
+// vetConfig is the JSON config struct prepared by the Go command.
+type vetConfig struct {
+ Compiler string
+ Dir string
+ ImportPath string
+ GoFiles []string
+ ImportMap map[string]string
+ PackageFile map[string]string
+
+ SucceedOnTypecheckFailure bool
+
+ imp types.Importer
+}
+
+func (v *vetConfig) Import(path string) (*types.Package, error) {
+ if v.imp == nil {
+ v.imp = importer.For(v.Compiler, v.openPackageFile)
+ }
+ if path == "unsafe" {
+ return v.imp.Import("unsafe")
+ }
+ p := v.ImportMap[path]
+ if p == "" {
+ return nil, fmt.Errorf("unknown import path %q", path)
+ }
+ if v.PackageFile[p] == "" {
+ return nil, fmt.Errorf("unknown package file for import %q", path)
+ }
+ return v.imp.Import(p)
+}
+
+func (v *vetConfig) openPackageFile(path string) (io.ReadCloser, error) {
+ file := v.PackageFile[path]
+ if file == "" {
+ // Note that path here has been translated via v.ImportMap,
+ // unlike in the error in Import above. We prefer the error in
+ // Import, but it's worth diagnosing this one too, just in case.
+ return nil, fmt.Errorf("unknown package file for %q", path)
+ }
+ f, err := os.Open(file)
+ if err != nil {
+ return nil, err
+ }
+ return f, nil
+}
+
+// doPackageCfg analyzes a single package described in a config file.
+func doPackageCfg(cfgFile string) {
+ js, err := ioutil.ReadFile(cfgFile)
+ if err != nil {
+ errorf("%v", err)
+ }
+ if err := json.Unmarshal(js, &vcfg); err != nil {
+ errorf("parsing vet config %s: %v", cfgFile, err)
+ }
+ stdImporter = &vcfg
+ inittypes()
+ mustTypecheck = true
+ doPackage(nil, nil, nil, nil, nil)
+}
+
+// doPackageDir analyzes the single package found in the directory, if there is one,
+// plus a test package, if there is one.
+func doPackageDir(directory string) {
+ context := build.Default
+ if len(context.BuildTags) != 0 {
+ warnf("build tags %s previously set", context.BuildTags)
+ }
+ context.BuildTags = append(tagList, context.BuildTags...)
+
+ pkg, err := context.ImportDir(directory, 0)
+ if err != nil {
+ // If it's just that there are no go source files, that's fine.
+ if _, nogo := err.(*build.NoGoError); nogo {
+ return
+ }
+ // Non-fatal: we are doing a recursive walk and there may be other directories.
+ warnf("cannot process directory %s: %s", directory, err)
+ return
+ }
+ var names []string
+ names = append(names, pkg.GoFiles...)
+ names = append(names, pkg.CgoFiles...)
+ names = append(names, pkg.TestGoFiles...) // These are also in the "foo" package.
+ names = append(names, pkg.SFiles...)
+ prefixDirectory(directory, names)
+ basePkg, _ := doPackage(nil, nil, nil, nil, nil)
+ // Is there also a "foo_test" package? If so, do that one as well.
+ if len(pkg.XTestGoFiles) > 0 {
+ names = pkg.XTestGoFiles
+ prefixDirectory(directory, names)
+ doPackage(basePkg, nil, nil, nil, nil)
+ }
+}
+
+type Package struct {
+ path string
+ defs map[*ast.Ident]types.Object
+ uses map[*ast.Ident]types.Object
+ selectors map[*ast.SelectorExpr]*types.Selection
+ types map[ast.Expr]types.TypeAndValue
+ spans map[types.Object]Span
+ files []*File
+ typesPkg *types.Package
+}
+
+type astFilePathGetter func(f *ast.File, fset *token.FileSet) (string, error)
+
+// doPackage analyzes the single package constructed from the named files.
+// It returns the parsed Package or nil if none of the files have been checked.
+func doPackage(basePkg *Package, pkgInfo *loader.PackageInfo, fs *token.FileSet, astFiles []*ast.File, pg astFilePathGetter) (*Package, error) {
+ var files []*File
+ for _, parsedFile := range astFiles {
+ name, err := pg(parsedFile, fs)
+ if err != nil {
+ return nil, err
+ }
+
+ data, err := ioutil.ReadFile(name)
+ if err != nil {
+ return nil, fmt.Errorf("can't read %q: %s", name, err)
+ }
+
+ checkBuildTag(name, data)
+
+ files = append(files, &File{
+ fset: fs,
+ content: data,
+ name: name,
+ file: parsedFile,
+ dead: make(map[ast.Node]bool),
+ })
+ }
+
+ pkg := new(Package)
+ pkg.path = astFiles[0].Name.Name
+ pkg.files = files
+ // Type check the package.
+ errs := pkg.check(fs, astFiles, pkgInfo)
+ if errs != nil {
+ errors := []string{}
+ for _, err := range errs {
+ errors = append(errors, err.Error())
+ }
+
+ return nil, fmt.Errorf("can't typecheck package: %s", strings.Join(errors, "|"))
+ }
+
+ // Check.
+ chk := make(map[ast.Node][]func(*File, ast.Node))
+ for typ, set := range checkers {
+ for name, fn := range set {
+ if vet(name) {
+ chk[typ] = append(chk[typ], fn)
+ }
+ }
+ }
+ for _, file := range files {
+ file.pkg = pkg
+ file.basePkg = basePkg
+ file.checkers = chk
+ if file.file != nil {
+ file.walkFile(file.name, file.file)
+ }
+ }
+ asmCheck(pkg)
+ return pkg, nil
+}
+
+func visit(path string, f os.FileInfo, err error) error {
+ if err != nil {
+ warnf("walk error: %s", err)
+ return err
+ }
+ // One package per directory. Ignore the files themselves.
+ if !f.IsDir() {
+ return nil
+ }
+ doPackageDir(path)
+ return nil
+}
+
+func (pkg *Package) hasFileWithSuffix(suffix string) bool {
+ for _, f := range pkg.files {
+ if strings.HasSuffix(f.name, suffix) {
+ return true
+ }
+ }
+ return false
+}
+
+// walkDir recursively walks the tree looking for Go packages.
+func walkDir(root string) {
+ filepath.Walk(root, visit)
+}
+
+// errorf formats the error to standard error, adding program
+// identification and a newline, and exits.
+func errorf(format string, args ...interface{}) {
+ fmt.Fprintf(os.Stderr, "vet: "+format+"\n", args...)
+}
+
+// warnf formats the error to standard error, adding program
+// identification and a newline, but does not exit.
+func warnf(format string, args ...interface{}) {
+ fmt.Fprintf(os.Stderr, "vet: "+format+"\n", args...)
+ setExit(1)
+}
+
+// Println is fmt.Println guarded by -v.
+func Println(args ...interface{}) {
+ if !*verbose {
+ return
+ }
+ fmt.Println(args...)
+}
+
+// Printf is fmt.Printf guarded by -v.
+func Printf(format string, args ...interface{}) {
+ if !*verbose {
+ return
+ }
+ fmt.Printf(format+"\n", args...)
+}
+
+// Bad reports an error and sets the exit code..
+func (f *File) Bad(pos token.Pos, args ...interface{}) {
+ foundIssues = append(foundIssues, Issue{
+ Pos: f.fset.Position(pos),
+ Message: fmt.Sprint(args...),
+ })
+ f.Warn(pos, args...)
+ setExit(1)
+}
+
+// Badf reports a formatted error and sets the exit code.
+func (f *File) Badf(pos token.Pos, format string, args ...interface{}) {
+ foundIssues = append(foundIssues, Issue{
+ Pos: f.fset.Position(pos),
+ Message: fmt.Sprintf(format, args...),
+ })
+ f.Warnf(pos, format, args...)
+ setExit(1)
+}
+
+// loc returns a formatted representation of the position.
+func (f *File) loc(pos token.Pos) string {
+ if pos == token.NoPos {
+ return ""
+ }
+ // Do not print columns. Because the pos often points to the start of an
+ // expression instead of the inner part with the actual error, the
+ // precision can mislead.
+ posn := f.fset.Position(pos)
+ return fmt.Sprintf("%s:%d", f.name, posn.Line)
+}
+
+// locPrefix returns a formatted representation of the position for use as a line prefix.
+func (f *File) locPrefix(pos token.Pos) string {
+ if pos == token.NoPos {
+ return ""
+ }
+ return fmt.Sprintf("%s: ", f.loc(pos))
+}
+
+// Warn reports an error but does not set the exit code.
+func (f *File) Warn(pos token.Pos, args ...interface{}) {
+ fmt.Fprintf(os.Stderr, "%s%s", f.locPrefix(pos), fmt.Sprintln(args...))
+}
+
+// Warnf reports a formatted error but does not set the exit code.
+func (f *File) Warnf(pos token.Pos, format string, args ...interface{}) {
+ fmt.Fprintf(os.Stderr, "%s%s\n", f.locPrefix(pos), fmt.Sprintf(format, args...))
+}
+
+// walkFile walks the file's tree.
+func (f *File) walkFile(name string, file *ast.File) {
+ Println("Checking file", name)
+ ast.Walk(f, file)
+}
+
+// Visit implements the ast.Visitor interface.
+func (f *File) Visit(node ast.Node) ast.Visitor {
+ f.updateDead(node)
+ var key ast.Node
+ switch node.(type) {
+ case *ast.AssignStmt:
+ key = assignStmt
+ case *ast.BinaryExpr:
+ key = binaryExpr
+ case *ast.CallExpr:
+ key = callExpr
+ case *ast.CompositeLit:
+ key = compositeLit
+ case *ast.ExprStmt:
+ key = exprStmt
+ case *ast.ForStmt:
+ key = forStmt
+ case *ast.FuncDecl:
+ key = funcDecl
+ case *ast.FuncLit:
+ key = funcLit
+ case *ast.GenDecl:
+ key = genDecl
+ case *ast.InterfaceType:
+ key = interfaceType
+ case *ast.RangeStmt:
+ key = rangeStmt
+ case *ast.ReturnStmt:
+ key = returnStmt
+ case *ast.StructType:
+ key = structType
+ }
+ for _, fn := range f.checkers[key] {
+ fn(f, node)
+ }
+ return f
+}
+
+// gofmt returns a string representation of the expression.
+func (f *File) gofmt(x ast.Expr) string {
+ f.b.Reset()
+ printer.Fprint(&f.b, f.fset, x)
+ return f.b.String()
+}
diff --git a/vendor/github.com/golangci/govet/method.go b/vendor/github.com/golangci/govet/method.go
new file mode 100644
index 00000000000..ad494a0d229
--- /dev/null
+++ b/vendor/github.com/golangci/govet/method.go
@@ -0,0 +1,179 @@
+// 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.
+
+// This file contains the code to check canonical methods.
+
+package govet
+
+import (
+ "fmt"
+ "go/ast"
+ "go/printer"
+ "strings"
+)
+
+func init() {
+ register("methods",
+ "check that canonically named methods are canonically defined",
+ checkCanonicalMethod,
+ funcDecl, interfaceType)
+}
+
+type MethodSig struct {
+ args []string
+ results []string
+}
+
+// canonicalMethods lists the input and output types for Go methods
+// that are checked using dynamic interface checks. Because the
+// checks are dynamic, such methods would not cause a compile error
+// if they have the wrong signature: instead the dynamic check would
+// fail, sometimes mysteriously. If a method is found with a name listed
+// here but not the input/output types listed here, vet complains.
+//
+// A few of the canonical methods have very common names.
+// For example, a type might implement a Scan method that
+// has nothing to do with fmt.Scanner, but we still want to check
+// the methods that are intended to implement fmt.Scanner.
+// To do that, the arguments that have a = prefix are treated as
+// signals that the canonical meaning is intended: if a Scan
+// method doesn't have a fmt.ScanState as its first argument,
+// we let it go. But if it does have a fmt.ScanState, then the
+// rest has to match.
+var canonicalMethods = map[string]MethodSig{
+ // "Flush": {{}, {"error"}}, // http.Flusher and jpeg.writer conflict
+ "Format": {[]string{"=fmt.State", "rune"}, []string{}}, // fmt.Formatter
+ "GobDecode": {[]string{"[]byte"}, []string{"error"}}, // gob.GobDecoder
+ "GobEncode": {[]string{}, []string{"[]byte", "error"}}, // gob.GobEncoder
+ "MarshalJSON": {[]string{}, []string{"[]byte", "error"}}, // json.Marshaler
+ "MarshalXML": {[]string{"*xml.Encoder", "xml.StartElement"}, []string{"error"}}, // xml.Marshaler
+ "ReadByte": {[]string{}, []string{"byte", "error"}}, // io.ByteReader
+ "ReadFrom": {[]string{"=io.Reader"}, []string{"int64", "error"}}, // io.ReaderFrom
+ "ReadRune": {[]string{}, []string{"rune", "int", "error"}}, // io.RuneReader
+ "Scan": {[]string{"=fmt.ScanState", "rune"}, []string{"error"}}, // fmt.Scanner
+ "Seek": {[]string{"=int64", "int"}, []string{"int64", "error"}}, // io.Seeker
+ "UnmarshalJSON": {[]string{"[]byte"}, []string{"error"}}, // json.Unmarshaler
+ "UnmarshalXML": {[]string{"*xml.Decoder", "xml.StartElement"}, []string{"error"}}, // xml.Unmarshaler
+ "UnreadByte": {[]string{}, []string{"error"}},
+ "UnreadRune": {[]string{}, []string{"error"}},
+ "WriteByte": {[]string{"byte"}, []string{"error"}}, // jpeg.writer (matching bufio.Writer)
+ "WriteTo": {[]string{"=io.Writer"}, []string{"int64", "error"}}, // io.WriterTo
+}
+
+func checkCanonicalMethod(f *File, node ast.Node) {
+ switch n := node.(type) {
+ case *ast.FuncDecl:
+ if n.Recv != nil {
+ canonicalMethod(f, n.Name, n.Type)
+ }
+ case *ast.InterfaceType:
+ for _, field := range n.Methods.List {
+ for _, id := range field.Names {
+ canonicalMethod(f, id, field.Type.(*ast.FuncType))
+ }
+ }
+ }
+}
+
+func canonicalMethod(f *File, id *ast.Ident, t *ast.FuncType) {
+ // Expected input/output.
+ expect, ok := canonicalMethods[id.Name]
+ if !ok {
+ return
+ }
+
+ // Actual input/output
+ args := typeFlatten(t.Params.List)
+ var results []ast.Expr
+ if t.Results != nil {
+ results = typeFlatten(t.Results.List)
+ }
+
+ // Do the =s (if any) all match?
+ if !f.matchParams(expect.args, args, "=") || !f.matchParams(expect.results, results, "=") {
+ return
+ }
+
+ // Everything must match.
+ if !f.matchParams(expect.args, args, "") || !f.matchParams(expect.results, results, "") {
+ expectFmt := id.Name + "(" + argjoin(expect.args) + ")"
+ if len(expect.results) == 1 {
+ expectFmt += " " + argjoin(expect.results)
+ } else if len(expect.results) > 1 {
+ expectFmt += " (" + argjoin(expect.results) + ")"
+ }
+
+ f.b.Reset()
+ if err := printer.Fprint(&f.b, f.fset, t); err != nil {
+ fmt.Fprintf(&f.b, "<%s>", err)
+ }
+ actual := f.b.String()
+ actual = strings.TrimPrefix(actual, "func")
+ actual = id.Name + actual
+
+ f.Badf(id.Pos(), "method %s should have signature %s", actual, expectFmt)
+ }
+}
+
+func argjoin(x []string) string {
+ y := make([]string, len(x))
+ for i, s := range x {
+ if s[0] == '=' {
+ s = s[1:]
+ }
+ y[i] = s
+ }
+ return strings.Join(y, ", ")
+}
+
+// Turn parameter list into slice of types
+// (in the ast, types are Exprs).
+// Have to handle f(int, bool) and f(x, y, z int)
+// so not a simple 1-to-1 conversion.
+func typeFlatten(l []*ast.Field) []ast.Expr {
+ var t []ast.Expr
+ for _, f := range l {
+ if len(f.Names) == 0 {
+ t = append(t, f.Type)
+ continue
+ }
+ for range f.Names {
+ t = append(t, f.Type)
+ }
+ }
+ return t
+}
+
+// Does each type in expect with the given prefix match the corresponding type in actual?
+func (f *File) matchParams(expect []string, actual []ast.Expr, prefix string) bool {
+ for i, x := range expect {
+ if !strings.HasPrefix(x, prefix) {
+ continue
+ }
+ if i >= len(actual) {
+ return false
+ }
+ if !f.matchParamType(x, actual[i]) {
+ return false
+ }
+ }
+ if prefix == "" && len(actual) > len(expect) {
+ return false
+ }
+ return true
+}
+
+// Does this one type match?
+func (f *File) matchParamType(expect string, actual ast.Expr) bool {
+ expect = strings.TrimPrefix(expect, "=")
+ // Strip package name if we're in that package.
+ if n := len(f.file.Name.Name); len(expect) > n && expect[:n] == f.file.Name.Name && expect[n] == '.' {
+ expect = expect[n+1:]
+ }
+
+ // Overkill but easy.
+ f.b.Reset()
+ printer.Fprint(&f.b, f.fset, actual)
+ return f.b.String() == expect
+}
diff --git a/vendor/github.com/golangci/govet/nilfunc.go b/vendor/github.com/golangci/govet/nilfunc.go
new file mode 100644
index 00000000000..839970f9d73
--- /dev/null
+++ b/vendor/github.com/golangci/govet/nilfunc.go
@@ -0,0 +1,67 @@
+// 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.
+
+/*
+This file contains the code to check for useless function comparisons.
+A useless comparison is one like f == nil as opposed to f() == nil.
+*/
+
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("nilfunc",
+ "check for comparisons between functions and nil",
+ checkNilFuncComparison,
+ binaryExpr)
+}
+
+func checkNilFuncComparison(f *File, node ast.Node) {
+ e := node.(*ast.BinaryExpr)
+
+ // Only want == or != comparisons.
+ if e.Op != token.EQL && e.Op != token.NEQ {
+ return
+ }
+
+ // Only want comparisons with a nil identifier on one side.
+ var e2 ast.Expr
+ switch {
+ case f.isNil(e.X):
+ e2 = e.Y
+ case f.isNil(e.Y):
+ e2 = e.X
+ default:
+ return
+ }
+
+ // Only want identifiers or selector expressions.
+ var obj types.Object
+ switch v := e2.(type) {
+ case *ast.Ident:
+ obj = f.pkg.uses[v]
+ case *ast.SelectorExpr:
+ obj = f.pkg.uses[v.Sel]
+ default:
+ return
+ }
+
+ // Only want functions.
+ if _, ok := obj.(*types.Func); !ok {
+ return
+ }
+
+ f.Badf(e.Pos(), "comparison of function %v %v nil is always %v", obj.Name(), e.Op, e.Op == token.NEQ)
+}
+
+// isNil reports whether the provided expression is the built-in nil
+// identifier.
+func (f *File) isNil(e ast.Expr) bool {
+ return f.pkg.types[e].Type == types.Typ[types.UntypedNil]
+}
diff --git a/vendor/github.com/golangci/govet/print.go b/vendor/github.com/golangci/govet/print.go
new file mode 100644
index 00000000000..cdce54097bf
--- /dev/null
+++ b/vendor/github.com/golangci/govet/print.go
@@ -0,0 +1,807 @@
+// 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.
+
+// This file contains the printf-checker.
+
+package govet
+
+import (
+ "bytes"
+ "flag"
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "regexp"
+ "strconv"
+ "strings"
+ "unicode/utf8"
+)
+
+var printfuncs = flag.String("printfuncs", "", "comma-separated list of print function names to check")
+
+func init() {
+ register("printf",
+ "check printf-like invocations",
+ checkFmtPrintfCall,
+ funcDecl, callExpr)
+}
+
+func initPrintFlags() {
+ if *printfuncs == "" {
+ return
+ }
+ for _, name := range strings.Split(*printfuncs, ",") {
+ if len(name) == 0 {
+ flag.Usage()
+ }
+
+ // Backwards compatibility: skip optional first argument
+ // index after the colon.
+ if colon := strings.LastIndex(name, ":"); colon > 0 {
+ name = name[:colon]
+ }
+
+ isPrint[strings.ToLower(name)] = true
+ }
+}
+
+// TODO(rsc): Incorporate user-defined printf wrappers again.
+// The general plan is to allow vet of one package P to output
+// additional information to supply to later vets of packages
+// importing P. Then vet of P can record a list of printf wrappers
+// and the later vet using P.Printf will find it in the list and check it.
+// That's not ready for Go 1.10.
+// When that does happen, uncomment the user-defined printf
+// wrapper tests in testdata/print.go.
+
+// isPrint records the print functions.
+// If a key ends in 'f' then it is assumed to be a formatted print.
+var isPrint = map[string]bool{
+ "fmt.Errorf": true,
+ "fmt.Fprint": true,
+ "fmt.Fprintf": true,
+ "fmt.Fprintln": true,
+ "fmt.Print": true,
+ "fmt.Printf": true,
+ "fmt.Println": true,
+ "fmt.Sprint": true,
+ "fmt.Sprintf": true,
+ "fmt.Sprintln": true,
+ "log.Fatal": true,
+ "log.Fatalf": true,
+ "log.Fatalln": true,
+ "log.Logger.Fatal": true,
+ "log.Logger.Fatalf": true,
+ "log.Logger.Fatalln": true,
+ "log.Logger.Panic": true,
+ "log.Logger.Panicf": true,
+ "log.Logger.Panicln": true,
+ "log.Logger.Printf": true,
+ "log.Logger.Println": true,
+ "log.Panic": true,
+ "log.Panicf": true,
+ "log.Panicln": true,
+ "log.Print": true,
+ "log.Printf": true,
+ "log.Println": true,
+ "testing.B.Error": true,
+ "testing.B.Errorf": true,
+ "testing.B.Fatal": true,
+ "testing.B.Fatalf": true,
+ "testing.B.Log": true,
+ "testing.B.Logf": true,
+ "testing.B.Skip": true,
+ "testing.B.Skipf": true,
+ "testing.T.Error": true,
+ "testing.T.Errorf": true,
+ "testing.T.Fatal": true,
+ "testing.T.Fatalf": true,
+ "testing.T.Log": true,
+ "testing.T.Logf": true,
+ "testing.T.Skip": true,
+ "testing.T.Skipf": true,
+ "testing.TB.Error": true,
+ "testing.TB.Errorf": true,
+ "testing.TB.Fatal": true,
+ "testing.TB.Fatalf": true,
+ "testing.TB.Log": true,
+ "testing.TB.Logf": true,
+ "testing.TB.Skip": true,
+ "testing.TB.Skipf": true,
+}
+
+// formatString returns the format string argument and its index within
+// the given printf-like call expression.
+//
+// The last parameter before variadic arguments is assumed to be
+// a format string.
+//
+// The first string literal or string constant is assumed to be a format string
+// if the call's signature cannot be determined.
+//
+// If it cannot find any format string parameter, it returns ("", -1).
+func formatString(f *File, call *ast.CallExpr) (format string, idx int) {
+ typ := f.pkg.types[call.Fun].Type
+ if typ != nil {
+ if sig, ok := typ.(*types.Signature); ok {
+ if !sig.Variadic() {
+ // Skip checking non-variadic functions.
+ return "", -1
+ }
+ idx := sig.Params().Len() - 2
+ if idx < 0 {
+ // Skip checking variadic functions without
+ // fixed arguments.
+ return "", -1
+ }
+ s, ok := stringConstantArg(f, call, idx)
+ if !ok {
+ // The last argument before variadic args isn't a string.
+ return "", -1
+ }
+ return s, idx
+ }
+ }
+
+ // Cannot determine call's signature. Fall back to scanning for the first
+ // string constant in the call.
+ for idx := range call.Args {
+ if s, ok := stringConstantArg(f, call, idx); ok {
+ return s, idx
+ }
+ if f.pkg.types[call.Args[idx]].Type == types.Typ[types.String] {
+ // Skip checking a call with a non-constant format
+ // string argument, since its contents are unavailable
+ // for validation.
+ return "", -1
+ }
+ }
+ return "", -1
+}
+
+// stringConstantArg returns call's string constant argument at the index idx.
+//
+// ("", false) is returned if call's argument at the index idx isn't a string
+// constant.
+func stringConstantArg(f *File, call *ast.CallExpr, idx int) (string, bool) {
+ if idx >= len(call.Args) {
+ return "", false
+ }
+ arg := call.Args[idx]
+ lit := f.pkg.types[arg].Value
+ if lit != nil && lit.Kind() == constant.String {
+ return constant.StringVal(lit), true
+ }
+ return "", false
+}
+
+// checkCall triggers the print-specific checks if the call invokes a print function.
+func checkFmtPrintfCall(f *File, node ast.Node) {
+ if f.pkg.typesPkg == nil {
+ // This check now requires type information.
+ return
+ }
+
+ if d, ok := node.(*ast.FuncDecl); ok && isStringer(f, d) {
+ // Remember we saw this.
+ if f.stringerPtrs == nil {
+ f.stringerPtrs = make(map[*ast.Object]bool)
+ }
+ if l := d.Recv.List; len(l) == 1 {
+ if n := l[0].Names; len(n) == 1 {
+ typ := f.pkg.types[l[0].Type]
+ _, ptrRecv := typ.Type.(*types.Pointer)
+ f.stringerPtrs[n[0].Obj] = ptrRecv
+ }
+ }
+ return
+ }
+
+ call, ok := node.(*ast.CallExpr)
+ if !ok {
+ return
+ }
+
+ // Construct name like pkg.Printf or pkg.Type.Printf for lookup.
+ var name string
+ switch x := call.Fun.(type) {
+ case *ast.Ident:
+ if fn, ok := f.pkg.uses[x].(*types.Func); ok {
+ var pkg string
+ if fn.Pkg() == nil || fn.Pkg() == f.pkg.typesPkg {
+ pkg = vcfg.ImportPath
+ } else {
+ pkg = fn.Pkg().Path()
+ }
+ name = pkg + "." + x.Name
+ break
+ }
+
+ case *ast.SelectorExpr:
+ // Check for "fmt.Printf".
+ if id, ok := x.X.(*ast.Ident); ok {
+ if pkgName, ok := f.pkg.uses[id].(*types.PkgName); ok {
+ name = pkgName.Imported().Path() + "." + x.Sel.Name
+ break
+ }
+ }
+
+ // Check for t.Logf where t is a *testing.T.
+ if sel := f.pkg.selectors[x]; sel != nil {
+ recv := sel.Recv()
+ if p, ok := recv.(*types.Pointer); ok {
+ recv = p.Elem()
+ }
+ if named, ok := recv.(*types.Named); ok {
+ obj := named.Obj()
+ var pkg string
+ if obj.Pkg() == nil || obj.Pkg() == f.pkg.typesPkg {
+ pkg = vcfg.ImportPath
+ } else {
+ pkg = obj.Pkg().Path()
+ }
+ name = pkg + "." + obj.Name() + "." + x.Sel.Name
+ break
+ }
+ }
+ }
+ if name == "" {
+ return
+ }
+
+ shortName := name[strings.LastIndex(name, ".")+1:]
+
+ _, ok = isPrint[name]
+ if !ok {
+ // Next look up just "printf", for use with -printfuncs.
+ _, ok = isPrint[strings.ToLower(shortName)]
+ }
+ if ok {
+ if strings.HasSuffix(name, "f") {
+ f.checkPrintf(call, shortName)
+ } else {
+ f.checkPrint(call, shortName)
+ }
+ }
+}
+
+// isStringer returns true if the provided declaration is a "String() string"
+// method, an implementation of fmt.Stringer.
+func isStringer(f *File, d *ast.FuncDecl) bool {
+ return d.Recv != nil && d.Name.Name == "String" && d.Type.Results != nil &&
+ len(d.Type.Params.List) == 0 && len(d.Type.Results.List) == 1 &&
+ f.pkg.types[d.Type.Results.List[0].Type].Type == types.Typ[types.String]
+}
+
+// isFormatter reports whether t satisfies fmt.Formatter.
+// Unlike fmt.Stringer, it's impossible to satisfy fmt.Formatter without importing fmt.
+func (f *File) isFormatter(t types.Type) bool {
+ return formatterType != nil && types.Implements(t, formatterType)
+}
+
+// formatState holds the parsed representation of a printf directive such as "%3.*[4]d".
+// It is constructed by parsePrintfVerb.
+type formatState struct {
+ verb rune // the format verb: 'd' for "%d"
+ format string // the full format directive from % through verb, "%.3d".
+ name string // Printf, Sprintf etc.
+ flags []byte // the list of # + etc.
+ argNums []int // the successive argument numbers that are consumed, adjusted to refer to actual arg in call
+ firstArg int // Index of first argument after the format in the Printf call.
+ // Used only during parse.
+ file *File
+ call *ast.CallExpr
+ argNum int // Which argument we're expecting to format now.
+ hasIndex bool // Whether the argument is indexed.
+ indexPending bool // Whether we have an indexed argument that has not resolved.
+ nbytes int // number of bytes of the format string consumed.
+}
+
+// checkPrintf checks a call to a formatted print routine such as Printf.
+func (f *File) checkPrintf(call *ast.CallExpr, name string) {
+ format, idx := formatString(f, call)
+ if idx < 0 {
+ if *verbose {
+ f.Warn(call.Pos(), "can't check non-constant format in call to", name)
+ }
+ return
+ }
+
+ firstArg := idx + 1 // Arguments are immediately after format string.
+ if !strings.Contains(format, "%") {
+ if len(call.Args) > firstArg {
+ f.Badf(call.Pos(), "%s call has arguments but no formatting directives", name)
+ }
+ return
+ }
+ // Hard part: check formats against args.
+ argNum := firstArg
+ maxArgNum := firstArg
+ anyIndex := false
+ for i, w := 0, 0; i < len(format); i += w {
+ w = 1
+ if format[i] != '%' {
+ continue
+ }
+ state := f.parsePrintfVerb(call, name, format[i:], firstArg, argNum)
+ if state == nil {
+ return
+ }
+ w = len(state.format)
+ if !f.okPrintfArg(call, state) { // One error per format is enough.
+ return
+ }
+ if state.hasIndex {
+ anyIndex = true
+ }
+ if len(state.argNums) > 0 {
+ // Continue with the next sequential argument.
+ argNum = state.argNums[len(state.argNums)-1] + 1
+ }
+ for _, n := range state.argNums {
+ if n >= maxArgNum {
+ maxArgNum = n + 1
+ }
+ }
+ }
+ // Dotdotdot is hard.
+ if call.Ellipsis.IsValid() && maxArgNum >= len(call.Args)-1 {
+ return
+ }
+ // If any formats are indexed, extra arguments are ignored.
+ if anyIndex {
+ return
+ }
+ // There should be no leftover arguments.
+ if maxArgNum != len(call.Args) {
+ expect := maxArgNum - firstArg
+ numArgs := len(call.Args) - firstArg
+ f.Badf(call.Pos(), "%s call needs %v but has %v", name, count(expect, "arg"), count(numArgs, "arg"))
+ }
+}
+
+// parseFlags accepts any printf flags.
+func (s *formatState) parseFlags() {
+ for s.nbytes < len(s.format) {
+ switch c := s.format[s.nbytes]; c {
+ case '#', '0', '+', '-', ' ':
+ s.flags = append(s.flags, c)
+ s.nbytes++
+ default:
+ return
+ }
+ }
+}
+
+// scanNum advances through a decimal number if present.
+func (s *formatState) scanNum() {
+ for ; s.nbytes < len(s.format); s.nbytes++ {
+ c := s.format[s.nbytes]
+ if c < '0' || '9' < c {
+ return
+ }
+ }
+}
+
+// parseIndex scans an index expression. It returns false if there is a syntax error.
+func (s *formatState) parseIndex() bool {
+ if s.nbytes == len(s.format) || s.format[s.nbytes] != '[' {
+ return true
+ }
+ // Argument index present.
+ s.nbytes++ // skip '['
+ start := s.nbytes
+ s.scanNum()
+ ok := true
+ if s.nbytes == len(s.format) || s.nbytes == start || s.format[s.nbytes] != ']' {
+ ok = false
+ s.nbytes = strings.Index(s.format, "]")
+ if s.nbytes < 0 {
+ s.file.Badf(s.call.Pos(), "%s format %s is missing closing ]", s.name, s.format)
+ return false
+ }
+ }
+ arg32, err := strconv.ParseInt(s.format[start:s.nbytes], 10, 32)
+ if err != nil || !ok || arg32 <= 0 || arg32 > int64(len(s.call.Args)-s.firstArg) {
+ s.file.Badf(s.call.Pos(), "%s format has invalid argument index [%s]", s.name, s.format[start:s.nbytes])
+ return false
+ }
+ s.nbytes++ // skip ']'
+ arg := int(arg32)
+ arg += s.firstArg - 1 // We want to zero-index the actual arguments.
+ s.argNum = arg
+ s.hasIndex = true
+ s.indexPending = true
+ return true
+}
+
+// parseNum scans a width or precision (or *). It returns false if there's a bad index expression.
+func (s *formatState) parseNum() bool {
+ if s.nbytes < len(s.format) && s.format[s.nbytes] == '*' {
+ if s.indexPending { // Absorb it.
+ s.indexPending = false
+ }
+ s.nbytes++
+ s.argNums = append(s.argNums, s.argNum)
+ s.argNum++
+ } else {
+ s.scanNum()
+ }
+ return true
+}
+
+// parsePrecision scans for a precision. It returns false if there's a bad index expression.
+func (s *formatState) parsePrecision() bool {
+ // If there's a period, there may be a precision.
+ if s.nbytes < len(s.format) && s.format[s.nbytes] == '.' {
+ s.flags = append(s.flags, '.') // Treat precision as a flag.
+ s.nbytes++
+ if !s.parseIndex() {
+ return false
+ }
+ if !s.parseNum() {
+ return false
+ }
+ }
+ return true
+}
+
+// parsePrintfVerb looks the formatting directive that begins the format string
+// and returns a formatState that encodes what the directive wants, without looking
+// at the actual arguments present in the call. The result is nil if there is an error.
+func (f *File) parsePrintfVerb(call *ast.CallExpr, name, format string, firstArg, argNum int) *formatState {
+ state := &formatState{
+ format: format,
+ name: name,
+ flags: make([]byte, 0, 5),
+ argNum: argNum,
+ argNums: make([]int, 0, 1),
+ nbytes: 1, // There's guaranteed to be a percent sign.
+ firstArg: firstArg,
+ file: f,
+ call: call,
+ }
+ // There may be flags.
+ state.parseFlags()
+ // There may be an index.
+ if !state.parseIndex() {
+ return nil
+ }
+ // There may be a width.
+ if !state.parseNum() {
+ return nil
+ }
+ // There may be a precision.
+ if !state.parsePrecision() {
+ return nil
+ }
+ // Now a verb, possibly prefixed by an index (which we may already have).
+ if !state.indexPending && !state.parseIndex() {
+ return nil
+ }
+ if state.nbytes == len(state.format) {
+ f.Badf(call.Pos(), "%s format %s is missing verb at end of string", name, state.format)
+ return nil
+ }
+ verb, w := utf8.DecodeRuneInString(state.format[state.nbytes:])
+ state.verb = verb
+ state.nbytes += w
+ if verb != '%' {
+ state.argNums = append(state.argNums, state.argNum)
+ }
+ state.format = state.format[:state.nbytes]
+ return state
+}
+
+// printfArgType encodes the types of expressions a printf verb accepts. It is a bitmask.
+type printfArgType int
+
+const (
+ argBool printfArgType = 1 << iota
+ argInt
+ argRune
+ argString
+ argFloat
+ argComplex
+ argPointer
+ anyType printfArgType = ^0
+)
+
+type printVerb struct {
+ verb rune // User may provide verb through Formatter; could be a rune.
+ flags string // known flags are all ASCII
+ typ printfArgType
+}
+
+// Common flag sets for printf verbs.
+const (
+ noFlag = ""
+ numFlag = " -+.0"
+ sharpNumFlag = " -+.0#"
+ allFlags = " -+.0#"
+)
+
+// printVerbs identifies which flags are known to printf for each verb.
+var printVerbs = []printVerb{
+ // '-' is a width modifier, always valid.
+ // '.' is a precision for float, max width for strings.
+ // '+' is required sign for numbers, Go format for %v.
+ // '#' is alternate format for several verbs.
+ // ' ' is spacer for numbers
+ {'%', noFlag, 0},
+ {'b', numFlag, argInt | argFloat | argComplex},
+ {'c', "-", argRune | argInt},
+ {'d', numFlag, argInt | argPointer},
+ {'e', sharpNumFlag, argFloat | argComplex},
+ {'E', sharpNumFlag, argFloat | argComplex},
+ {'f', sharpNumFlag, argFloat | argComplex},
+ {'F', sharpNumFlag, argFloat | argComplex},
+ {'g', sharpNumFlag, argFloat | argComplex},
+ {'G', sharpNumFlag, argFloat | argComplex},
+ {'o', sharpNumFlag, argInt},
+ {'p', "-#", argPointer},
+ {'q', " -+.0#", argRune | argInt | argString},
+ {'s', " -+.0", argString},
+ {'t', "-", argBool},
+ {'T', "-", anyType},
+ {'U', "-#", argRune | argInt},
+ {'v', allFlags, anyType},
+ {'x', sharpNumFlag, argRune | argInt | argString | argPointer},
+ {'X', sharpNumFlag, argRune | argInt | argString | argPointer},
+}
+
+// okPrintfArg compares the formatState to the arguments actually present,
+// reporting any discrepancies it can discern. If the final argument is ellipsissed,
+// there's little it can do for that.
+func (f *File) okPrintfArg(call *ast.CallExpr, state *formatState) (ok bool) {
+ var v printVerb
+ found := false
+ // Linear scan is fast enough for a small list.
+ for _, v = range printVerbs {
+ if v.verb == state.verb {
+ found = true
+ break
+ }
+ }
+
+ // Does current arg implement fmt.Formatter?
+ formatter := false
+ if state.argNum < len(call.Args) {
+ if tv, ok := f.pkg.types[call.Args[state.argNum]]; ok {
+ formatter = f.isFormatter(tv.Type)
+ }
+ }
+
+ if !formatter {
+ if !found {
+ f.Badf(call.Pos(), "%s format %s has unknown verb %c", state.name, state.format, state.verb)
+ return false
+ }
+ for _, flag := range state.flags {
+ // TODO: Disable complaint about '0' for Go 1.10. To be fixed properly in 1.11.
+ // See issues 23598 and 23605.
+ if flag == '0' {
+ continue
+ }
+ if !strings.ContainsRune(v.flags, rune(flag)) {
+ f.Badf(call.Pos(), "%s format %s has unrecognized flag %c", state.name, state.format, flag)
+ return false
+ }
+ }
+ }
+ // Verb is good. If len(state.argNums)>trueArgs, we have something like %.*s and all
+ // but the final arg must be an integer.
+ trueArgs := 1
+ if state.verb == '%' {
+ trueArgs = 0
+ }
+ nargs := len(state.argNums)
+ for i := 0; i < nargs-trueArgs; i++ {
+ argNum := state.argNums[i]
+ if !f.argCanBeChecked(call, i, state) {
+ return
+ }
+ arg := call.Args[argNum]
+ if !f.matchArgType(argInt, nil, arg) {
+ f.Badf(call.Pos(), "%s format %s uses non-int %s as argument of *", state.name, state.format, f.gofmt(arg))
+ return false
+ }
+ }
+ if state.verb == '%' || formatter {
+ return true
+ }
+ argNum := state.argNums[len(state.argNums)-1]
+ if !f.argCanBeChecked(call, len(state.argNums)-1, state) {
+ return false
+ }
+ arg := call.Args[argNum]
+ if f.isFunctionValue(arg) && state.verb != 'p' && state.verb != 'T' {
+ f.Badf(call.Pos(), "%s format %s arg %s is a func value, not called", state.name, state.format, f.gofmt(arg))
+ return false
+ }
+ if !f.matchArgType(v.typ, nil, arg) {
+ typeString := ""
+ if typ := f.pkg.types[arg].Type; typ != nil {
+ typeString = typ.String()
+ }
+ f.Badf(call.Pos(), "%s format %s has arg %s of wrong type %s", state.name, state.format, f.gofmt(arg), typeString)
+ return false
+ }
+ if v.typ&argString != 0 && v.verb != 'T' && !bytes.Contains(state.flags, []byte{'#'}) && f.recursiveStringer(arg) {
+ f.Badf(call.Pos(), "%s format %s with arg %s causes recursive String method call", state.name, state.format, f.gofmt(arg))
+ return false
+ }
+ return true
+}
+
+// recursiveStringer reports whether the provided argument is r or &r for the
+// fmt.Stringer receiver identifier r.
+func (f *File) recursiveStringer(e ast.Expr) bool {
+ if len(f.stringerPtrs) == 0 {
+ return false
+ }
+ ptr := false
+ var obj *ast.Object
+ switch e := e.(type) {
+ case *ast.Ident:
+ obj = e.Obj
+ case *ast.UnaryExpr:
+ if id, ok := e.X.(*ast.Ident); ok && e.Op == token.AND {
+ obj = id.Obj
+ ptr = true
+ }
+ }
+
+ // It's unlikely to be a recursive stringer if it has a Format method.
+ if typ := f.pkg.types[e].Type; typ != nil {
+ if f.isFormatter(typ) {
+ return false
+ }
+ }
+
+ // We compare the underlying Object, which checks that the identifier
+ // is the one we declared as the receiver for the String method in
+ // which this printf appears.
+ ptrRecv, exist := f.stringerPtrs[obj]
+ if !exist {
+ return false
+ }
+ // We also need to check that using &t when we declared String
+ // on (t *T) is ok; in such a case, the address is printed.
+ if ptr && ptrRecv {
+ return false
+ }
+ return true
+}
+
+// isFunctionValue reports whether the expression is a function as opposed to a function call.
+// It is almost always a mistake to print a function value.
+func (f *File) isFunctionValue(e ast.Expr) bool {
+ if typ := f.pkg.types[e].Type; typ != nil {
+ _, ok := typ.(*types.Signature)
+ return ok
+ }
+ return false
+}
+
+// argCanBeChecked reports whether the specified argument is statically present;
+// it may be beyond the list of arguments or in a terminal slice... argument, which
+// means we can't see it.
+func (f *File) argCanBeChecked(call *ast.CallExpr, formatArg int, state *formatState) bool {
+ argNum := state.argNums[formatArg]
+ if argNum <= 0 {
+ // Shouldn't happen, so catch it with prejudice.
+ panic("negative arg num")
+ }
+ if argNum < len(call.Args)-1 {
+ return true // Always OK.
+ }
+ if call.Ellipsis.IsValid() {
+ return false // We just can't tell; there could be many more arguments.
+ }
+ if argNum < len(call.Args) {
+ return true
+ }
+ // There are bad indexes in the format or there are fewer arguments than the format needs.
+ // This is the argument number relative to the format: Printf("%s", "hi") will give 1 for the "hi".
+ arg := argNum - state.firstArg + 1 // People think of arguments as 1-indexed.
+ f.Badf(call.Pos(), "%s format %s reads arg #%d, but call has %v", state.name, state.format, arg, count(len(call.Args)-state.firstArg, "arg"))
+ return false
+}
+
+// printFormatRE is the regexp we match and report as a possible format string
+// in the first argument to unformatted prints like fmt.Print.
+// We exclude the space flag, so that printing a string like "x % y" is not reported as a format.
+var printFormatRE = regexp.MustCompile(`%` + flagsRE + numOptRE + `\.?` + numOptRE + indexOptRE + verbRE)
+
+const (
+ flagsRE = `[+\-#]*`
+ indexOptRE = `(\[[0-9]+\])?`
+ numOptRE = `([0-9]+|` + indexOptRE + `\*)?`
+ verbRE = `[bcdefgopqstvxEFGTUX]`
+)
+
+// checkPrint checks a call to an unformatted print routine such as Println.
+func (f *File) checkPrint(call *ast.CallExpr, name string) {
+ firstArg := 0
+ typ := f.pkg.types[call.Fun].Type
+ if typ == nil {
+ // Skip checking functions with unknown type.
+ return
+ }
+ if sig, ok := typ.(*types.Signature); ok {
+ if !sig.Variadic() {
+ // Skip checking non-variadic functions.
+ return
+ }
+ params := sig.Params()
+ firstArg = params.Len() - 1
+
+ typ := params.At(firstArg).Type()
+ typ = typ.(*types.Slice).Elem()
+ it, ok := typ.(*types.Interface)
+ if !ok || !it.Empty() {
+ // Skip variadic functions accepting non-interface{} args.
+ return
+ }
+ }
+ args := call.Args
+ if len(args) <= firstArg {
+ // Skip calls without variadic args.
+ return
+ }
+ args = args[firstArg:]
+
+ if firstArg == 0 {
+ if sel, ok := call.Args[0].(*ast.SelectorExpr); ok {
+ if x, ok := sel.X.(*ast.Ident); ok {
+ if x.Name == "os" && strings.HasPrefix(sel.Sel.Name, "Std") {
+ f.Badf(call.Pos(), "%s does not take io.Writer but has first arg %s", name, f.gofmt(call.Args[0]))
+ }
+ }
+ }
+ }
+
+ arg := args[0]
+ if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ // Ignore trailing % character in lit.Value.
+ // The % in "abc 0.0%" couldn't be a formatting directive.
+ s := strings.TrimSuffix(lit.Value, `%"`)
+ if strings.Contains(s, "%") {
+ m := printFormatRE.FindStringSubmatch(s)
+ if m != nil {
+ f.Badf(call.Pos(), "%s call has possible formatting directive %s", name, m[0])
+ }
+ }
+ }
+ if strings.HasSuffix(name, "ln") {
+ // The last item, if a string, should not have a newline.
+ arg = args[len(args)-1]
+ if lit, ok := arg.(*ast.BasicLit); ok && lit.Kind == token.STRING {
+ str, _ := strconv.Unquote(lit.Value)
+ if strings.HasSuffix(str, "\n") {
+ f.Badf(call.Pos(), "%s arg list ends with redundant newline", name)
+ }
+ }
+ }
+ for _, arg := range args {
+ if f.isFunctionValue(arg) {
+ f.Badf(call.Pos(), "%s arg %s is a func value, not called", name, f.gofmt(arg))
+ }
+ if f.recursiveStringer(arg) {
+ f.Badf(call.Pos(), "%s arg %s causes recursive call to String method", name, f.gofmt(arg))
+ }
+ }
+}
+
+// count(n, what) returns "1 what" or "N whats"
+// (assuming the plural of what is whats).
+func count(n int, what string) string {
+ if n == 1 {
+ return "1 " + what
+ }
+ return fmt.Sprintf("%d %ss", n, what)
+}
diff --git a/vendor/github.com/golangci/govet/rangeloop.go b/vendor/github.com/golangci/govet/rangeloop.go
new file mode 100644
index 00000000000..5f19da17f49
--- /dev/null
+++ b/vendor/github.com/golangci/govet/rangeloop.go
@@ -0,0 +1,105 @@
+// Copyright 2012 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.
+
+/*
+This file contains the code to check range loop variables bound inside function
+literals that are deferred or launched in new goroutines. We only check
+instances where the defer or go statement is the last statement in the loop
+body, as otherwise we would need whole program analysis.
+
+For example:
+
+ for i, v := range s {
+ go func() {
+ println(i, v) // not what you might expect
+ }()
+ }
+
+See: https://golang.org/doc/go_faq.html#closures_and_goroutines
+*/
+
+package govet
+
+import "go/ast"
+
+func init() {
+ register("rangeloops",
+ "check that loop variables are used correctly",
+ checkLoop,
+ rangeStmt, forStmt)
+}
+
+// checkLoop walks the body of the provided loop statement, checking whether
+// its index or value variables are used unsafely inside goroutines or deferred
+// function literals.
+func checkLoop(f *File, node ast.Node) {
+ // Find the variables updated by the loop statement.
+ var vars []*ast.Ident
+ addVar := func(expr ast.Expr) {
+ if id, ok := expr.(*ast.Ident); ok {
+ vars = append(vars, id)
+ }
+ }
+ var body *ast.BlockStmt
+ switch n := node.(type) {
+ case *ast.RangeStmt:
+ body = n.Body
+ addVar(n.Key)
+ addVar(n.Value)
+ case *ast.ForStmt:
+ body = n.Body
+ switch post := n.Post.(type) {
+ case *ast.AssignStmt:
+ // e.g. for p = head; p != nil; p = p.next
+ for _, lhs := range post.Lhs {
+ addVar(lhs)
+ }
+ case *ast.IncDecStmt:
+ // e.g. for i := 0; i < n; i++
+ addVar(post.X)
+ }
+ }
+ if vars == nil {
+ return
+ }
+
+ // Inspect a go or defer statement
+ // if it's the last one in the loop body.
+ // (We give up if there are following statements,
+ // because it's hard to prove go isn't followed by wait,
+ // or defer by return.)
+ if len(body.List) == 0 {
+ return
+ }
+ var last *ast.CallExpr
+ switch s := body.List[len(body.List)-1].(type) {
+ case *ast.GoStmt:
+ last = s.Call
+ case *ast.DeferStmt:
+ last = s.Call
+ default:
+ return
+ }
+ lit, ok := last.Fun.(*ast.FuncLit)
+ if !ok {
+ return
+ }
+ ast.Inspect(lit.Body, func(n ast.Node) bool {
+ id, ok := n.(*ast.Ident)
+ if !ok || id.Obj == nil {
+ return true
+ }
+ if f.pkg.types[id].Type == nil {
+ // Not referring to a variable (e.g. struct field name)
+ return true
+ }
+ for _, v := range vars {
+ if v.Obj == id.Obj {
+ f.Badf(id.Pos(), "loop variable %s captured by func literal",
+ id.Name)
+ }
+ }
+ return true
+ })
+}
diff --git a/vendor/github.com/golangci/govet/shadow.go b/vendor/github.com/golangci/govet/shadow.go
new file mode 100644
index 00000000000..f29482ca766
--- /dev/null
+++ b/vendor/github.com/golangci/govet/shadow.go
@@ -0,0 +1,246 @@
+// 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.
+
+/*
+This file contains the code to check for shadowed variables.
+A shadowed variable is a variable declared in an inner scope
+with the same name and type as a variable in an outer scope,
+and where the outer variable is mentioned after the inner one
+is declared.
+
+(This definition can be refined; the module generates too many
+false positives and is not yet enabled by default.)
+
+For example:
+
+ func BadRead(f *os.File, buf []byte) error {
+ var err error
+ for {
+ n, err := f.Read(buf) // shadows the function variable 'err'
+ if err != nil {
+ break // causes return of wrong value
+ }
+ foo(buf)
+ }
+ return err
+ }
+
+*/
+
+package govet
+
+import (
+ "flag"
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+var strictShadowing = flag.Bool("shadowstrict", false, "whether to be strict about shadowing; can be noisy")
+
+func init() {
+ register("shadow",
+ "check for shadowed variables (experimental; must be set explicitly)",
+ checkShadow,
+ assignStmt, genDecl)
+ experimental["shadow"] = true
+}
+
+func checkShadow(f *File, node ast.Node) {
+ switch n := node.(type) {
+ case *ast.AssignStmt:
+ checkShadowAssignment(f, n)
+ case *ast.GenDecl:
+ checkShadowDecl(f, n)
+ }
+}
+
+// Span stores the minimum range of byte positions in the file in which a
+// given variable (types.Object) is mentioned. It is lexically defined: it spans
+// from the beginning of its first mention to the end of its last mention.
+// A variable is considered shadowed (if *strictShadowing is off) only if the
+// shadowing variable is declared within the span of the shadowed variable.
+// In other words, if a variable is shadowed but not used after the shadowed
+// variable is declared, it is inconsequential and not worth complaining about.
+// This simple check dramatically reduces the nuisance rate for the shadowing
+// check, at least until something cleverer comes along.
+//
+// One wrinkle: A "naked return" is a silent use of a variable that the Span
+// will not capture, but the compilers catch naked returns of shadowed
+// variables so we don't need to.
+//
+// Cases this gets wrong (TODO):
+// - If a for loop's continuation statement mentions a variable redeclared in
+// the block, we should complain about it but don't.
+// - A variable declared inside a function literal can falsely be identified
+// as shadowing a variable in the outer function.
+//
+type Span struct {
+ min token.Pos
+ max token.Pos
+}
+
+// contains reports whether the position is inside the span.
+func (s Span) contains(pos token.Pos) bool {
+ return s.min <= pos && pos < s.max
+}
+
+// growSpan expands the span for the object to contain the instance represented
+// by the identifier.
+func (pkg *Package) growSpan(ident *ast.Ident, obj types.Object) {
+ if *strictShadowing {
+ return // No need
+ }
+ pos := ident.Pos()
+ end := ident.End()
+ span, ok := pkg.spans[obj]
+ if ok {
+ if span.min > pos {
+ span.min = pos
+ }
+ if span.max < end {
+ span.max = end
+ }
+ } else {
+ span = Span{pos, end}
+ }
+ pkg.spans[obj] = span
+}
+
+// checkShadowAssignment checks for shadowing in a short variable declaration.
+func checkShadowAssignment(f *File, a *ast.AssignStmt) {
+ if a.Tok != token.DEFINE {
+ return
+ }
+ if f.idiomaticShortRedecl(a) {
+ return
+ }
+ for _, expr := range a.Lhs {
+ ident, ok := expr.(*ast.Ident)
+ if !ok {
+ f.Badf(expr.Pos(), "invalid AST: short variable declaration of non-identifier")
+ return
+ }
+ checkShadowing(f, ident)
+ }
+}
+
+// idiomaticShortRedecl reports whether this short declaration can be ignored for
+// the purposes of shadowing, that is, that any redeclarations it contains are deliberate.
+func (f *File) idiomaticShortRedecl(a *ast.AssignStmt) bool {
+ // Don't complain about deliberate redeclarations of the form
+ // i := i
+ // Such constructs are idiomatic in range loops to create a new variable
+ // for each iteration. Another example is
+ // switch n := n.(type)
+ if len(a.Rhs) != len(a.Lhs) {
+ return false
+ }
+ // We know it's an assignment, so the LHS must be all identifiers. (We check anyway.)
+ for i, expr := range a.Lhs {
+ lhs, ok := expr.(*ast.Ident)
+ if !ok {
+ f.Badf(expr.Pos(), "invalid AST: short variable declaration of non-identifier")
+ return true // Don't do any more processing.
+ }
+ switch rhs := a.Rhs[i].(type) {
+ case *ast.Ident:
+ if lhs.Name != rhs.Name {
+ return false
+ }
+ case *ast.TypeAssertExpr:
+ if id, ok := rhs.X.(*ast.Ident); ok {
+ if lhs.Name != id.Name {
+ return false
+ }
+ }
+ default:
+ return false
+ }
+ }
+ return true
+}
+
+// idiomaticRedecl reports whether this declaration spec can be ignored for
+// the purposes of shadowing, that is, that any redeclarations it contains are deliberate.
+func (f *File) idiomaticRedecl(d *ast.ValueSpec) bool {
+ // Don't complain about deliberate redeclarations of the form
+ // var i, j = i, j
+ if len(d.Names) != len(d.Values) {
+ return false
+ }
+ for i, lhs := range d.Names {
+ if rhs, ok := d.Values[i].(*ast.Ident); ok {
+ if lhs.Name != rhs.Name {
+ return false
+ }
+ }
+ }
+ return true
+}
+
+// checkShadowDecl checks for shadowing in a general variable declaration.
+func checkShadowDecl(f *File, d *ast.GenDecl) {
+ if d.Tok != token.VAR {
+ return
+ }
+ for _, spec := range d.Specs {
+ valueSpec, ok := spec.(*ast.ValueSpec)
+ if !ok {
+ f.Badf(spec.Pos(), "invalid AST: var GenDecl not ValueSpec")
+ return
+ }
+ // Don't complain about deliberate redeclarations of the form
+ // var i = i
+ if f.idiomaticRedecl(valueSpec) {
+ return
+ }
+ for _, ident := range valueSpec.Names {
+ checkShadowing(f, ident)
+ }
+ }
+}
+
+// checkShadowing checks whether the identifier shadows an identifier in an outer scope.
+func checkShadowing(f *File, ident *ast.Ident) {
+ if ident.Name == "_" {
+ // Can't shadow the blank identifier.
+ return
+ }
+ obj := f.pkg.defs[ident]
+ if obj == nil {
+ return
+ }
+ // obj.Parent.Parent is the surrounding scope. If we can find another declaration
+ // starting from there, we have a shadowed identifier.
+ _, shadowed := obj.Parent().Parent().LookupParent(obj.Name(), obj.Pos())
+ if shadowed == nil {
+ return
+ }
+ // Don't complain if it's shadowing a universe-declared identifier; that's fine.
+ if shadowed.Parent() == types.Universe {
+ return
+ }
+ if *strictShadowing {
+ // The shadowed identifier must appear before this one to be an instance of shadowing.
+ if shadowed.Pos() > ident.Pos() {
+ return
+ }
+ } else {
+ // Don't complain if the span of validity of the shadowed identifier doesn't include
+ // the shadowing identifier.
+ span, ok := f.pkg.spans[shadowed]
+ if !ok {
+ f.Badf(ident.Pos(), "internal error: no range for %q", ident.Name)
+ return
+ }
+ if !span.contains(ident.Pos()) {
+ return
+ }
+ }
+ // Don't complain if the types differ: that implies the programmer really wants two different things.
+ if types.Identical(obj.Type(), shadowed.Type()) {
+ f.Badf(ident.Pos(), "declaration of %q shadows declaration at %s", obj.Name(), f.loc(shadowed.Pos()))
+ }
+}
diff --git a/vendor/github.com/golangci/govet/shift.go b/vendor/github.com/golangci/govet/shift.go
new file mode 100644
index 00000000000..c38d8b7dcfe
--- /dev/null
+++ b/vendor/github.com/golangci/govet/shift.go
@@ -0,0 +1,98 @@
+// Copyright 2014 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.
+
+/*
+This file contains the code to check for suspicious shifts.
+*/
+
+package govet
+
+import (
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("shift",
+ "check for useless shifts",
+ checkShift,
+ binaryExpr, assignStmt)
+}
+
+func checkShift(f *File, node ast.Node) {
+ if f.dead[node] {
+ // Skip shift checks on unreachable nodes.
+ return
+ }
+
+ switch node := node.(type) {
+ case *ast.BinaryExpr:
+ if node.Op == token.SHL || node.Op == token.SHR {
+ checkLongShift(f, node, node.X, node.Y)
+ }
+ case *ast.AssignStmt:
+ if len(node.Lhs) != 1 || len(node.Rhs) != 1 {
+ return
+ }
+ if node.Tok == token.SHL_ASSIGN || node.Tok == token.SHR_ASSIGN {
+ checkLongShift(f, node, node.Lhs[0], node.Rhs[0])
+ }
+ }
+}
+
+// checkLongShift checks if shift or shift-assign operations shift by more than
+// the length of the underlying variable.
+func checkLongShift(f *File, node ast.Node, x, y ast.Expr) {
+ if f.pkg.types[x].Value != nil {
+ // Ignore shifts of constants.
+ // These are frequently used for bit-twiddling tricks
+ // like ^uint(0) >> 63 for 32/64 bit detection and compatibility.
+ return
+ }
+
+ v := f.pkg.types[y].Value
+ if v == nil {
+ return
+ }
+ amt, ok := constant.Int64Val(v)
+ if !ok {
+ return
+ }
+ t := f.pkg.types[x].Type
+ if t == nil {
+ return
+ }
+ b, ok := t.Underlying().(*types.Basic)
+ if !ok {
+ return
+ }
+ var size int64
+ switch b.Kind() {
+ case types.Uint8, types.Int8:
+ size = 8
+ case types.Uint16, types.Int16:
+ size = 16
+ case types.Uint32, types.Int32:
+ size = 32
+ case types.Uint64, types.Int64:
+ size = 64
+ case types.Int, types.Uint:
+ size = uintBitSize
+ case types.Uintptr:
+ size = uintptrBitSize
+ default:
+ return
+ }
+ if amt >= size {
+ ident := f.gofmt(x)
+ f.Badf(node.Pos(), "%s (%d bits) too small for shift of %d", ident, size, amt)
+ }
+}
+
+var (
+ uintBitSize = 8 * archSizes.Sizeof(types.Typ[types.Uint])
+ uintptrBitSize = 8 * archSizes.Sizeof(types.Typ[types.Uintptr])
+)
diff --git a/vendor/github.com/golangci/govet/structtag.go b/vendor/github.com/golangci/govet/structtag.go
new file mode 100644
index 00000000000..e29c12c8001
--- /dev/null
+++ b/vendor/github.com/golangci/govet/structtag.go
@@ -0,0 +1,226 @@
+// 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.
+
+// This file contains the test for canonical struct tags.
+
+package govet
+
+import (
+ "errors"
+ "go/ast"
+ "go/token"
+ "reflect"
+ "strconv"
+ "strings"
+)
+
+func init() {
+ register("structtags",
+ "check that struct field tags have canonical format and apply to exported fields as needed",
+ checkStructFieldTags,
+ structType)
+}
+
+// checkStructFieldTags checks all the field tags of a struct, including checking for duplicates.
+func checkStructFieldTags(f *File, node ast.Node) {
+ var seen map[[2]string]token.Pos
+ for _, field := range node.(*ast.StructType).Fields.List {
+ checkCanonicalFieldTag(f, field, &seen)
+ }
+}
+
+var checkTagDups = []string{"json", "xml"}
+var checkTagSpaces = map[string]bool{"json": true, "xml": true, "asn1": true}
+
+// checkCanonicalFieldTag checks a single struct field tag.
+func checkCanonicalFieldTag(f *File, field *ast.Field, seen *map[[2]string]token.Pos) {
+ if field.Tag == nil {
+ return
+ }
+
+ tag, err := strconv.Unquote(field.Tag.Value)
+ if err != nil {
+ f.Badf(field.Pos(), "unable to read struct tag %s", field.Tag.Value)
+ return
+ }
+
+ if err := validateStructTag(tag); err != nil {
+ raw, _ := strconv.Unquote(field.Tag.Value) // field.Tag.Value is known to be a quoted string
+ f.Badf(field.Pos(), "struct field tag %#q not compatible with reflect.StructTag.Get: %s", raw, err)
+ }
+
+ for _, key := range checkTagDups {
+ val := reflect.StructTag(tag).Get(key)
+ if val == "" || val == "-" || val[0] == ',' {
+ continue
+ }
+ if key == "xml" && len(field.Names) > 0 && field.Names[0].Name == "XMLName" {
+ // XMLName defines the XML element name of the struct being
+ // checked. That name cannot collide with element or attribute
+ // names defined on other fields of the struct. Vet does not have a
+ // check for untagged fields of type struct defining their own name
+ // by containing a field named XMLName; see issue 18256.
+ continue
+ }
+ if i := strings.Index(val, ","); i >= 0 {
+ if key == "xml" {
+ // Use a separate namespace for XML attributes.
+ for _, opt := range strings.Split(val[i:], ",") {
+ if opt == "attr" {
+ key += " attribute" // Key is part of the error message.
+ break
+ }
+ }
+ }
+ val = val[:i]
+ }
+ if *seen == nil {
+ *seen = map[[2]string]token.Pos{}
+ }
+ if pos, ok := (*seen)[[2]string{key, val}]; ok {
+ var name string
+ if len(field.Names) > 0 {
+ name = field.Names[0].Name
+ } else {
+ name = field.Type.(*ast.Ident).Name
+ }
+ f.Badf(field.Pos(), "struct field %s repeats %s tag %q also at %s", name, key, val, f.loc(pos))
+ } else {
+ (*seen)[[2]string{key, val}] = field.Pos()
+ }
+ }
+
+ // Check for use of json or xml tags with unexported fields.
+
+ // Embedded struct. Nothing to do for now, but that
+ // may change, depending on what happens with issue 7363.
+ if len(field.Names) == 0 {
+ return
+ }
+
+ if field.Names[0].IsExported() {
+ return
+ }
+
+ for _, enc := range [...]string{"json", "xml"} {
+ if reflect.StructTag(tag).Get(enc) != "" {
+ f.Badf(field.Pos(), "struct field %s has %s tag but is not exported", field.Names[0].Name, enc)
+ return
+ }
+ }
+}
+
+var (
+ errTagSyntax = errors.New("bad syntax for struct tag pair")
+ errTagKeySyntax = errors.New("bad syntax for struct tag key")
+ errTagValueSyntax = errors.New("bad syntax for struct tag value")
+ errTagValueSpace = errors.New("suspicious space in struct tag value")
+ errTagSpace = errors.New("key:\"value\" pairs not separated by spaces")
+)
+
+// validateStructTag parses the struct tag and returns an error if it is not
+// in the canonical format, which is a space-separated list of key:"value"
+// settings. The value may contain spaces.
+func validateStructTag(tag string) error {
+ // This code is based on the StructTag.Get code in package reflect.
+
+ n := 0
+ for ; tag != ""; n++ {
+ if n > 0 && tag != "" && tag[0] != ' ' {
+ // More restrictive than reflect, but catches likely mistakes
+ // like `x:"foo",y:"bar"`, which parses as `x:"foo" ,y:"bar"` with second key ",y".
+ return errTagSpace
+ }
+ // Skip leading space.
+ i := 0
+ for i < len(tag) && tag[i] == ' ' {
+ i++
+ }
+ tag = tag[i:]
+ if tag == "" {
+ break
+ }
+
+ // Scan to colon. A space, a quote or a control character is a syntax error.
+ // Strictly speaking, control chars include the range [0x7f, 0x9f], not just
+ // [0x00, 0x1f], but in practice, we ignore the multi-byte control characters
+ // as it is simpler to inspect the tag's bytes than the tag's runes.
+ i = 0
+ for i < len(tag) && tag[i] > ' ' && tag[i] != ':' && tag[i] != '"' && tag[i] != 0x7f {
+ i++
+ }
+ if i == 0 {
+ return errTagKeySyntax
+ }
+ if i+1 >= len(tag) || tag[i] != ':' {
+ return errTagSyntax
+ }
+ if tag[i+1] != '"' {
+ return errTagValueSyntax
+ }
+ key := tag[:i]
+ tag = tag[i+1:]
+
+ // Scan quoted string to find value.
+ i = 1
+ for i < len(tag) && tag[i] != '"' {
+ if tag[i] == '\\' {
+ i++
+ }
+ i++
+ }
+ if i >= len(tag) {
+ return errTagValueSyntax
+ }
+ qvalue := tag[:i+1]
+ tag = tag[i+1:]
+
+ value, err := strconv.Unquote(qvalue)
+ if err != nil {
+ return errTagValueSyntax
+ }
+
+ if !checkTagSpaces[key] {
+ continue
+ }
+
+ switch key {
+ case "xml":
+ // If the first or last character in the XML tag is a space, it is
+ // suspicious.
+ if strings.Trim(value, " ") != value {
+ return errTagValueSpace
+ }
+
+ // If there are multiple spaces, they are suspicious.
+ if strings.Count(value, " ") > 1 {
+ return errTagValueSpace
+ }
+
+ // If there is no comma, skip the rest of the checks.
+ comma := strings.IndexRune(value, ',')
+ if comma < 0 {
+ continue
+ }
+
+ // If the character before a comma is a space, this is suspicious.
+ if comma > 0 && value[comma-1] == ' ' {
+ return errTagValueSpace
+ }
+ value = value[comma+1:]
+ case "json":
+ // JSON allows using spaces in the name, so skip it.
+ comma := strings.IndexRune(value, ',')
+ if comma < 0 {
+ continue
+ }
+ value = value[comma+1:]
+ }
+
+ if strings.IndexByte(value, ' ') >= 0 {
+ return errTagValueSpace
+ }
+ }
+ return nil
+}
diff --git a/vendor/github.com/golangci/govet/tests.go b/vendor/github.com/golangci/govet/tests.go
new file mode 100644
index 00000000000..6241ee1f23b
--- /dev/null
+++ b/vendor/github.com/golangci/govet/tests.go
@@ -0,0 +1,187 @@
+// 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.
+
+package govet
+
+import (
+ "go/ast"
+ "go/types"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+)
+
+func init() {
+ register("tests",
+ "check for common mistaken usages of tests/documentation examples",
+ checkTestFunctions,
+ funcDecl)
+}
+
+func isExampleSuffix(s string) bool {
+ r, size := utf8.DecodeRuneInString(s)
+ return size > 0 && unicode.IsLower(r)
+}
+
+func isTestSuffix(name string) bool {
+ if len(name) == 0 {
+ // "Test" is ok.
+ return true
+ }
+ r, _ := utf8.DecodeRuneInString(name)
+ return !unicode.IsLower(r)
+}
+
+func isTestParam(typ ast.Expr, wantType string) bool {
+ ptr, ok := typ.(*ast.StarExpr)
+ if !ok {
+ // Not a pointer.
+ return false
+ }
+ // No easy way of making sure it's a *testing.T or *testing.B:
+ // ensure the name of the type matches.
+ if name, ok := ptr.X.(*ast.Ident); ok {
+ return name.Name == wantType
+ }
+ if sel, ok := ptr.X.(*ast.SelectorExpr); ok {
+ return sel.Sel.Name == wantType
+ }
+ return false
+}
+
+func lookup(name string, scopes []*types.Scope) types.Object {
+ for _, scope := range scopes {
+ if o := scope.Lookup(name); o != nil {
+ return o
+ }
+ }
+ return nil
+}
+
+func extendedScope(f *File) []*types.Scope {
+ scopes := []*types.Scope{f.pkg.typesPkg.Scope()}
+ if f.basePkg != nil {
+ scopes = append(scopes, f.basePkg.typesPkg.Scope())
+ } else {
+ // If basePkg is not specified (e.g. when checking a single file) try to
+ // find it among imports.
+ pkgName := f.pkg.typesPkg.Name()
+ if strings.HasSuffix(pkgName, "_test") {
+ basePkgName := strings.TrimSuffix(pkgName, "_test")
+ for _, p := range f.pkg.typesPkg.Imports() {
+ if p.Name() == basePkgName {
+ scopes = append(scopes, p.Scope())
+ break
+ }
+ }
+ }
+ }
+ return scopes
+}
+
+func checkExample(fn *ast.FuncDecl, f *File, report reporter) {
+ fnName := fn.Name.Name
+ if params := fn.Type.Params; len(params.List) != 0 {
+ report("%s should be niladic", fnName)
+ }
+ if results := fn.Type.Results; results != nil && len(results.List) != 0 {
+ report("%s should return nothing", fnName)
+ }
+
+ if filesRun && !includesNonTest {
+ // The coherence checks between a test and the package it tests
+ // will report false positives if no non-test files have
+ // been provided.
+ return
+ }
+
+ if fnName == "Example" {
+ // Nothing more to do.
+ return
+ }
+
+ var (
+ exName = strings.TrimPrefix(fnName, "Example")
+ elems = strings.SplitN(exName, "_", 3)
+ ident = elems[0]
+ obj = lookup(ident, extendedScope(f))
+ )
+ if ident != "" && obj == nil {
+ // Check ExampleFoo and ExampleBadFoo.
+ report("%s refers to unknown identifier: %s", fnName, ident)
+ // Abort since obj is absent and no subsequent checks can be performed.
+ return
+ }
+ if len(elems) < 2 {
+ // Nothing more to do.
+ return
+ }
+
+ if ident == "" {
+ // Check Example_suffix and Example_BadSuffix.
+ if residual := strings.TrimPrefix(exName, "_"); !isExampleSuffix(residual) {
+ report("%s has malformed example suffix: %s", fnName, residual)
+ }
+ return
+ }
+
+ mmbr := elems[1]
+ if !isExampleSuffix(mmbr) {
+ // Check ExampleFoo_Method and ExampleFoo_BadMethod.
+ if obj, _, _ := types.LookupFieldOrMethod(obj.Type(), true, obj.Pkg(), mmbr); obj == nil {
+ report("%s refers to unknown field or method: %s.%s", fnName, ident, mmbr)
+ }
+ }
+ if len(elems) == 3 && !isExampleSuffix(elems[2]) {
+ // Check ExampleFoo_Method_suffix and ExampleFoo_Method_Badsuffix.
+ report("%s has malformed example suffix: %s", fnName, elems[2])
+ }
+}
+
+func checkTest(fn *ast.FuncDecl, prefix string, report reporter) {
+ // Want functions with 0 results and 1 parameter.
+ if fn.Type.Results != nil && len(fn.Type.Results.List) > 0 ||
+ fn.Type.Params == nil ||
+ len(fn.Type.Params.List) != 1 ||
+ len(fn.Type.Params.List[0].Names) > 1 {
+ return
+ }
+
+ // The param must look like a *testing.T or *testing.B.
+ if !isTestParam(fn.Type.Params.List[0].Type, prefix[:1]) {
+ return
+ }
+
+ if !isTestSuffix(fn.Name.Name[len(prefix):]) {
+ report("%s has malformed name: first letter after '%s' must not be lowercase", fn.Name.Name, prefix)
+ }
+}
+
+type reporter func(format string, args ...interface{})
+
+// checkTestFunctions walks Test, Benchmark and Example functions checking
+// malformed names, wrong signatures and examples documenting nonexistent
+// identifiers.
+func checkTestFunctions(f *File, node ast.Node) {
+ if !strings.HasSuffix(f.name, "_test.go") {
+ return
+ }
+
+ fn, ok := node.(*ast.FuncDecl)
+ if !ok || fn.Recv != nil {
+ // Ignore non-functions or functions with receivers.
+ return
+ }
+
+ report := func(format string, args ...interface{}) { f.Badf(node.Pos(), format, args...) }
+
+ switch {
+ case strings.HasPrefix(fn.Name.Name, "Example"):
+ checkExample(fn, f, report)
+ case strings.HasPrefix(fn.Name.Name, "Test"):
+ checkTest(fn, "Test", report)
+ case strings.HasPrefix(fn.Name.Name, "Benchmark"):
+ checkTest(fn, "Benchmark", report)
+ }
+}
diff --git a/vendor/github.com/golangci/govet/types.go b/vendor/github.com/golangci/govet/types.go
new file mode 100644
index 00000000000..ad5984f3b68
--- /dev/null
+++ b/vendor/github.com/golangci/govet/types.go
@@ -0,0 +1,347 @@
+// 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.
+
+// This file contains the pieces of the tool that use typechecking from the go/types package.
+
+package govet
+
+import (
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/importer"
+ "go/token"
+ "go/types"
+ "os"
+ "time"
+
+ "golang.org/x/tools/go/gcexportdata"
+ "golang.org/x/tools/go/loader"
+)
+
+// stdImporter is the importer we use to import packages.
+// It is shared so that all packages are imported by the same importer.
+var stdImporter types.Importer
+
+var (
+ errorType *types.Interface
+ stringerType *types.Interface // possibly nil
+ formatterType *types.Interface // possibly nil
+)
+
+func newGCExportDataImporter(fset *token.FileSet) types.ImporterFrom {
+ return gcexportdata.NewImporter(fset, make(map[string]*types.Package))
+}
+
+func inittypes() error {
+ errorType = types.Universe.Lookup("error").Type().Underlying().(*types.Interface)
+
+ typ, err := importType("fmt", "Stringer")
+ if err != nil {
+ return err
+ }
+ stringerType = typ.Underlying().(*types.Interface)
+
+ typ, err = importType("fmt", "Formatter")
+ if err != nil {
+ return err
+ }
+ formatterType = typ.Underlying().(*types.Interface)
+
+ return nil
+}
+
+// isNamedType reports whether t is the named type path.name.
+func isNamedType(t types.Type, path, name string) bool {
+ n, ok := t.(*types.Named)
+ if !ok {
+ return false
+ }
+ obj := n.Obj()
+ return obj.Name() == name && obj.Pkg() != nil && obj.Pkg().Path() == path
+}
+
+// importType returns the type denoted by the qualified identifier
+// path.name, and adds the respective package to the imports map
+// as a side effect. In case of an error, importType returns nil.
+func importType(path, name string) (types.Type, error) {
+ startedAt := time.Now()
+ defer func() {
+ fmt.Fprintf(os.Stderr, "vet: import of type %s.%s took %s\n", path, name, time.Since(startedAt))
+ }()
+
+ pkg, err := stdImporter.Import(path)
+ if err != nil {
+ // This can happen if the package at path hasn't been compiled yet.
+ return nil, fmt.Errorf("import of type %s.%s failed: %v", path, name, err)
+ }
+ if obj, ok := pkg.Scope().Lookup(name).(*types.TypeName); ok {
+ return obj.Type(), nil
+ }
+
+ return nil, fmt.Errorf("can't import type %s.%s: invalid type name %q", path, name, name)
+}
+
+func (pkg *Package) check(fs *token.FileSet, astFiles []*ast.File, pkgInfo *loader.PackageInfo) []error {
+ if stdImporter == nil {
+ if *source {
+ stdImporter = importer.For("source", nil)
+ } else {
+ stdImporter = newGCExportDataImporter(fs)
+ }
+ if err := inittypes(); err != nil {
+ return []error{fmt.Errorf("can't init std types: %s", err)}
+ }
+ }
+
+ var allErrors []error
+ pkg.spans = make(map[types.Object]Span)
+ if pkgInfo != nil {
+ pkg.defs = pkgInfo.Defs
+ pkg.uses = pkgInfo.Uses
+ pkg.selectors = pkgInfo.Selections
+ pkg.types = pkgInfo.Types
+ pkg.typesPkg = pkgInfo.Pkg
+ } else {
+ pkg.defs = make(map[*ast.Ident]types.Object)
+ pkg.uses = make(map[*ast.Ident]types.Object)
+ pkg.selectors = make(map[*ast.SelectorExpr]*types.Selection)
+ pkg.types = make(map[ast.Expr]types.TypeAndValue)
+
+ config := types.Config{
+ // We use the same importer for all imports to ensure that
+ // everybody sees identical packages for the given paths.
+ Importer: stdImporter,
+ // By providing a Config with our own error function, it will continue
+ // past the first error. We collect them all for printing later.
+ Error: func(e error) {
+ allErrors = append(allErrors, e)
+ },
+
+ Sizes: archSizes,
+ }
+ info := &types.Info{
+ Selections: pkg.selectors,
+ Types: pkg.types,
+ Defs: pkg.defs,
+ Uses: pkg.uses,
+ }
+ typesPkg, err := config.Check(pkg.path, fs, astFiles, info)
+ if len(allErrors) == 0 && err != nil {
+ allErrors = append(allErrors, fmt.Errorf("type checker failed: %s", err))
+ }
+
+ pkg.typesPkg = typesPkg
+ }
+
+ // update spans
+ for id, obj := range pkg.defs {
+ pkg.growSpan(id, obj)
+ }
+ for id, obj := range pkg.uses {
+ pkg.growSpan(id, obj)
+ }
+ return allErrors
+}
+
+// matchArgType reports an error if printf verb t is not appropriate
+// for operand arg.
+//
+// typ is used only for recursive calls; external callers must supply nil.
+//
+// (Recursion arises from the compound types {map,chan,slice} which
+// may be printed with %d etc. if that is appropriate for their element
+// types.)
+func (f *File) matchArgType(t printfArgType, typ types.Type, arg ast.Expr) bool {
+ return f.matchArgTypeInternal(t, typ, arg, make(map[types.Type]bool))
+}
+
+// matchArgTypeInternal is the internal version of matchArgType. It carries a map
+// remembering what types are in progress so we don't recur when faced with recursive
+// types or mutually recursive types.
+func (f *File) matchArgTypeInternal(t printfArgType, typ types.Type, arg ast.Expr, inProgress map[types.Type]bool) bool {
+ // %v, %T accept any argument type.
+ if t == anyType {
+ return true
+ }
+ if typ == nil {
+ // external call
+ typ = f.pkg.types[arg].Type
+ if typ == nil {
+ return true // probably a type check problem
+ }
+ }
+ // If the type implements fmt.Formatter, we have nothing to check.
+ if f.isFormatter(typ) {
+ return true
+ }
+ // If we can use a string, might arg (dynamically) implement the Stringer or Error interface?
+ if t&argString != 0 && isConvertibleToString(typ) {
+ return true
+ }
+
+ typ = typ.Underlying()
+ if inProgress[typ] {
+ // We're already looking at this type. The call that started it will take care of it.
+ return true
+ }
+ inProgress[typ] = true
+
+ switch typ := typ.(type) {
+ case *types.Signature:
+ return t&argPointer != 0
+
+ case *types.Map:
+ // Recur: map[int]int matches %d.
+ return t&argPointer != 0 ||
+ (f.matchArgTypeInternal(t, typ.Key(), arg, inProgress) && f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress))
+
+ case *types.Chan:
+ return t&argPointer != 0
+
+ case *types.Array:
+ // Same as slice.
+ if types.Identical(typ.Elem().Underlying(), types.Typ[types.Byte]) && t&argString != 0 {
+ return true // %s matches []byte
+ }
+ // Recur: []int matches %d.
+ return t&argPointer != 0 || f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress)
+
+ case *types.Slice:
+ // Same as array.
+ if types.Identical(typ.Elem().Underlying(), types.Typ[types.Byte]) && t&argString != 0 {
+ return true // %s matches []byte
+ }
+ // Recur: []int matches %d. But watch out for
+ // type T []T
+ // If the element is a pointer type (type T[]*T), it's handled fine by the Pointer case below.
+ return t&argPointer != 0 || f.matchArgTypeInternal(t, typ.Elem(), arg, inProgress)
+
+ case *types.Pointer:
+ // Ugly, but dealing with an edge case: a known pointer to an invalid type,
+ // probably something from a failed import.
+ if typ.Elem().String() == "invalid type" {
+ if *verbose {
+ f.Warnf(arg.Pos(), "printf argument %v is pointer to invalid or unknown type", f.gofmt(arg))
+ }
+ return true // special case
+ }
+ // If it's actually a pointer with %p, it prints as one.
+ if t == argPointer {
+ return true
+ }
+ // If it's pointer to struct, that's equivalent in our analysis to whether we can print the struct.
+ if str, ok := typ.Elem().Underlying().(*types.Struct); ok {
+ return f.matchStructArgType(t, str, arg, inProgress)
+ }
+ // Check whether the rest can print pointers.
+ return t&argPointer != 0
+
+ case *types.Struct:
+ return f.matchStructArgType(t, typ, arg, inProgress)
+
+ case *types.Interface:
+ // There's little we can do.
+ // Whether any particular verb is valid depends on the argument.
+ // The user may have reasonable prior knowledge of the contents of the interface.
+ return true
+
+ case *types.Basic:
+ switch typ.Kind() {
+ case types.UntypedBool,
+ types.Bool:
+ return t&argBool != 0
+
+ case types.UntypedInt,
+ types.Int,
+ types.Int8,
+ types.Int16,
+ types.Int32,
+ types.Int64,
+ types.Uint,
+ types.Uint8,
+ types.Uint16,
+ types.Uint32,
+ types.Uint64,
+ types.Uintptr:
+ return t&argInt != 0
+
+ case types.UntypedFloat,
+ types.Float32,
+ types.Float64:
+ return t&argFloat != 0
+
+ case types.UntypedComplex,
+ types.Complex64,
+ types.Complex128:
+ return t&argComplex != 0
+
+ case types.UntypedString,
+ types.String:
+ return t&argString != 0
+
+ case types.UnsafePointer:
+ return t&(argPointer|argInt) != 0
+
+ case types.UntypedRune:
+ return t&(argInt|argRune) != 0
+
+ case types.UntypedNil:
+ return false
+
+ case types.Invalid:
+ if *verbose {
+ f.Warnf(arg.Pos(), "printf argument %v has invalid or unknown type", f.gofmt(arg))
+ }
+ return true // Probably a type check problem.
+ }
+ panic("unreachable")
+ }
+
+ return false
+}
+
+func isConvertibleToString(typ types.Type) bool {
+ if bt, ok := typ.(*types.Basic); ok && bt.Kind() == types.UntypedNil {
+ // We explicitly don't want untyped nil, which is
+ // convertible to both of the interfaces below, as it
+ // would just panic anyway.
+ return false
+ }
+ if types.ConvertibleTo(typ, errorType) {
+ return true // via .Error()
+ }
+ if stringerType != nil && types.ConvertibleTo(typ, stringerType) {
+ return true // via .String()
+ }
+ return false
+}
+
+// hasBasicType reports whether x's type is a types.Basic with the given kind.
+func (f *File) hasBasicType(x ast.Expr, kind types.BasicKind) bool {
+ t := f.pkg.types[x].Type
+ if t != nil {
+ t = t.Underlying()
+ }
+ b, ok := t.(*types.Basic)
+ return ok && b.Kind() == kind
+}
+
+// matchStructArgType reports whether all the elements of the struct match the expected
+// type. For instance, with "%d" all the elements must be printable with the "%d" format.
+func (f *File) matchStructArgType(t printfArgType, typ *types.Struct, arg ast.Expr, inProgress map[types.Type]bool) bool {
+ for i := 0; i < typ.NumFields(); i++ {
+ typf := typ.Field(i)
+ if !f.matchArgTypeInternal(t, typf.Type(), arg, inProgress) {
+ return false
+ }
+ if t&argString != 0 && !typf.Exported() && isConvertibleToString(typf.Type()) {
+ // Issue #17798: unexported Stringer or error cannot be properly fomatted.
+ return false
+ }
+ }
+ return true
+}
+
+var archSizes = types.SizesFor("gc", build.Default.GOARCH)
diff --git a/vendor/github.com/golangci/govet/unsafeptr.go b/vendor/github.com/golangci/govet/unsafeptr.go
new file mode 100644
index 00000000000..757b2933988
--- /dev/null
+++ b/vendor/github.com/golangci/govet/unsafeptr.go
@@ -0,0 +1,97 @@
+// Copyright 2014 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.
+
+// Check for invalid uintptr -> unsafe.Pointer conversions.
+
+package govet
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+func init() {
+ register("unsafeptr",
+ "check for misuse of unsafe.Pointer",
+ checkUnsafePointer,
+ callExpr)
+}
+
+func checkUnsafePointer(f *File, node ast.Node) {
+ x := node.(*ast.CallExpr)
+ if len(x.Args) != 1 {
+ return
+ }
+ if f.hasBasicType(x.Fun, types.UnsafePointer) && f.hasBasicType(x.Args[0], types.Uintptr) && !f.isSafeUintptr(x.Args[0]) {
+ f.Badf(x.Pos(), "possible misuse of unsafe.Pointer")
+ }
+}
+
+// isSafeUintptr reports whether x - already known to be a uintptr -
+// is safe to convert to unsafe.Pointer. It is safe if x is itself derived
+// directly from an unsafe.Pointer via conversion and pointer arithmetic
+// or if x is the result of reflect.Value.Pointer or reflect.Value.UnsafeAddr
+// or obtained from the Data field of a *reflect.SliceHeader or *reflect.StringHeader.
+func (f *File) isSafeUintptr(x ast.Expr) bool {
+ switch x := x.(type) {
+ case *ast.ParenExpr:
+ return f.isSafeUintptr(x.X)
+
+ case *ast.SelectorExpr:
+ switch x.Sel.Name {
+ case "Data":
+ // reflect.SliceHeader and reflect.StringHeader are okay,
+ // but only if they are pointing at a real slice or string.
+ // It's not okay to do:
+ // var x SliceHeader
+ // x.Data = uintptr(unsafe.Pointer(...))
+ // ... use x ...
+ // p := unsafe.Pointer(x.Data)
+ // because in the middle the garbage collector doesn't
+ // see x.Data as a pointer and so x.Data may be dangling
+ // by the time we get to the conversion at the end.
+ // For now approximate by saying that *Header is okay
+ // but Header is not.
+ pt, ok := f.pkg.types[x.X].Type.(*types.Pointer)
+ if ok {
+ t, ok := pt.Elem().(*types.Named)
+ if ok && t.Obj().Pkg().Path() == "reflect" {
+ switch t.Obj().Name() {
+ case "StringHeader", "SliceHeader":
+ return true
+ }
+ }
+ }
+ }
+
+ case *ast.CallExpr:
+ switch len(x.Args) {
+ case 0:
+ // maybe call to reflect.Value.Pointer or reflect.Value.UnsafeAddr.
+ sel, ok := x.Fun.(*ast.SelectorExpr)
+ if !ok {
+ break
+ }
+ switch sel.Sel.Name {
+ case "Pointer", "UnsafeAddr":
+ t, ok := f.pkg.types[sel.X].Type.(*types.Named)
+ if ok && t.Obj().Pkg().Path() == "reflect" && t.Obj().Name() == "Value" {
+ return true
+ }
+ }
+
+ case 1:
+ // maybe conversion of uintptr to unsafe.Pointer
+ return f.hasBasicType(x.Fun, types.Uintptr) && f.hasBasicType(x.Args[0], types.UnsafePointer)
+ }
+
+ case *ast.BinaryExpr:
+ switch x.Op {
+ case token.ADD, token.SUB, token.AND_NOT:
+ return f.isSafeUintptr(x.X) && !f.isSafeUintptr(x.Y)
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/golangci/govet/unused.go b/vendor/github.com/golangci/govet/unused.go
new file mode 100644
index 00000000000..25339659ddf
--- /dev/null
+++ b/vendor/github.com/golangci/govet/unused.go
@@ -0,0 +1,93 @@
+// 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.
+
+// This file defines the check for unused results of calls to certain
+// pure functions.
+
+package govet
+
+import (
+ "flag"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "strings"
+)
+
+var unusedFuncsFlag = flag.String("unusedfuncs",
+ "errors.New,fmt.Errorf,fmt.Sprintf,fmt.Sprint,sort.Reverse",
+ "comma-separated list of functions whose results must be used")
+
+var unusedStringMethodsFlag = flag.String("unusedstringmethods",
+ "Error,String",
+ "comma-separated list of names of methods of type func() string whose results must be used")
+
+func init() {
+ register("unusedresult",
+ "check for unused result of calls to functions in -unusedfuncs list and methods in -unusedstringmethods list",
+ checkUnusedResult,
+ exprStmt)
+}
+
+// func() string
+var sigNoArgsStringResult = types.NewSignature(nil, nil,
+ types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.String])),
+ false)
+
+var unusedFuncs = make(map[string]bool)
+var unusedStringMethods = make(map[string]bool)
+
+func initUnusedFlags() {
+ commaSplit := func(s string, m map[string]bool) {
+ if s != "" {
+ for _, name := range strings.Split(s, ",") {
+ if len(name) == 0 {
+ flag.Usage()
+ }
+ m[name] = true
+ }
+ }
+ }
+ commaSplit(*unusedFuncsFlag, unusedFuncs)
+ commaSplit(*unusedStringMethodsFlag, unusedStringMethods)
+}
+
+func checkUnusedResult(f *File, n ast.Node) {
+ call, ok := unparen(n.(*ast.ExprStmt).X).(*ast.CallExpr)
+ if !ok {
+ return // not a call statement
+ }
+ fun := unparen(call.Fun)
+
+ if f.pkg.types[fun].IsType() {
+ return // a conversion, not a call
+ }
+
+ selector, ok := fun.(*ast.SelectorExpr)
+ if !ok {
+ return // neither a method call nor a qualified ident
+ }
+
+ sel, ok := f.pkg.selectors[selector]
+ if ok && sel.Kind() == types.MethodVal {
+ // method (e.g. foo.String())
+ obj := sel.Obj().(*types.Func)
+ sig := sel.Type().(*types.Signature)
+ if types.Identical(sig, sigNoArgsStringResult) {
+ if unusedStringMethods[obj.Name()] {
+ f.Badf(call.Lparen, "result of (%s).%s call not used",
+ sig.Recv().Type(), obj.Name())
+ }
+ }
+ } else if !ok {
+ // package-qualified function (e.g. fmt.Errorf)
+ obj := f.pkg.uses[selector.Sel]
+ if obj, ok := obj.(*types.Func); ok {
+ qname := obj.Pkg().Path() + "." + obj.Name()
+ if unusedFuncs[qname] {
+ f.Badf(call.Lparen, "result of %v call not used", qname)
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/golangci/ineffassign/.gitignore b/vendor/github.com/golangci/ineffassign/.gitignore
new file mode 100644
index 00000000000..c4feb4ff032
--- /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 00000000000..9e3d9bcc021
--- /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 00000000000..6dcb9f0cce1
--- /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 00000000000..468177e0a41
--- /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 00000000000..3b61b36f2b0
--- /dev/null
+++ b/vendor/github.com/golangci/ineffassign/ineffassign.go
@@ -0,0 +1,606 @@
+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) && isZeroLiteral(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)
+ }
+ res := bld.results[len(bld.results)-1]
+ if res == nil {
+ break
+ }
+ for _, f := range res.List {
+ for _, id := range f.Names {
+ if n.Results != nil {
+ bld.assign(id)
+ }
+ bld.use(id)
+ }
+ }
+ 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 isZeroLiteral(x ast.Expr) bool {
+ b, ok := x.(*ast.BasicLit)
+ if !ok {
+ return false
+ }
+ switch b.Value {
+ case "0", "0.0", "0.", ".0", `""`:
+ return true
+ }
+ 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 00000000000..7e6b1e75ade
--- /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 00000000000..591d026e474
--- /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 00000000000..47af085f2bc
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/.travis.yml
@@ -0,0 +1,18 @@
+sudo: false
+language: go
+go:
+ - 1.7.x
+ - 1.8.x
+ - 1.9.x
+ - master
+
+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 00000000000..1fadda62d2f
--- /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 golang.org/x/lint/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 00000000000..65d761bc9f2
--- /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 00000000000..fb61933d16c
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/README.md
@@ -0,0 +1,86 @@
+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 golang.org/x/lint/golint
+
+## 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/golang/lint/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/lint.go b/vendor/github.com/golangci/lint-1/lint.go
new file mode 100644
index 00000000000..0668635f30d
--- /dev/null
+++ b/vendor/github.com/golangci/lint-1/lint.go
@@ -0,0 +1,1712 @@
+// 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 (
+ "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) LintASTFiles(files []*ast.File, fset *token.FileSet) ([]Problem, error) {
+ pkg := &pkg{
+ fset: fset,
+ files: make(map[string]*file),
+ }
+ var pkgName string
+ for _, f := range files {
+ filename := fset.Position(f.Pos()).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 {
+ if err := p.typeCheck(); err != nil {
+ /* TODO(dsymonds): Consider reporting these errors when golint operates on entire packages.
+ if e, ok := err.(types.Error); ok {
+ pos := p.fset.Position(e.Pos)
+ conf := 1.0
+ if strings.Contains(e.Msg, "can't find import: ") {
+ // Golint is probably being run in a context that doesn't support
+ // typechecking (e.g. package files aren't found), so don't warn about it.
+ conf = 0
+ }
+ if conf > 0 {
+ p.errorfAt(pos, conf, category("typechecking"), e.Msg)
+ }
+
+ // TODO(dsymonds): Abort if !e.Soft?
+ }
+ */
+ }
+
+ 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.lintVarDecls()
+ 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)
+ }
+}
+
+// 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() {
+ 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,
+}
+
+// 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, "_") {
+ f.errorf(id, 0.8, link(styleGuideBase+"#mixed-caps"), category("naming"), "don't use ALL_CAPS in Go names; use CamelCase")
+ return
+ }
+ 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,
+}
+
+// lintVarDecls examines variable declarations. It complains about declarations with
+// redundant LHS types that can be inferred from the RHS.
+func (f *file) lintVarDecls() {
+ var lastGen *ast.GenDecl // last GenDecl entered.
+
+ f.walk(func(node ast.Node) bool {
+ switch v := node.(type) {
+ case *ast.GenDecl:
+ if v.Tok != token.CONST && v.Tok != token.VAR {
+ return false
+ }
+ lastGen = v
+ return true
+ case *ast.ValueSpec:
+ if lastGen.Tok == token.CONST {
+ return false
+ }
+ if len(v.Names) > 1 || v.Type == nil || len(v.Values) == 0 {
+ return false
+ }
+ rhs := v.Values[0]
+ // An underscore var appears in a common idiom for compile-time interface satisfaction,
+ // as in "var _ Interface = (*Concrete)(nil)".
+ if isIdent(v.Names[0], "_") {
+ return false
+ }
+ // If the RHS is a zero value, suggest dropping it.
+ zero := false
+ if lit, ok := rhs.(*ast.BasicLit); ok {
+ zero = zeroLiteral[lit.Value]
+ } else if isIdent(rhs, "nil") {
+ zero = true
+ }
+ if zero {
+ f.errorf(rhs, 0.9, category("zero-value"), "should drop = %s from declaration of var %s; it is the zero value", f.render(rhs), v.Names[0])
+ return false
+ }
+ lhsTyp := f.pkg.typeOf(v.Type)
+ rhsTyp := f.pkg.typeOf(rhs)
+
+ if !validType(lhsTyp) || !validType(rhsTyp) {
+ // Type checking failed (often due to missing imports).
+ return false
+ }
+
+ if !types.Identical(lhsTyp, rhsTyp) {
+ // Assignment to a different type is not redundant.
+ return false
+ }
+
+ // The next three conditions are for suppressing the warning in situations
+ // where we were unable to typecheck.
+
+ // If the LHS type is an interface, don't warn, since it is probably a
+ // concrete type on the RHS. Note that our feeble lexical check here
+ // will only pick up interface{} and other literal interface types;
+ // that covers most of the cases we care to exclude right now.
+ if _, ok := v.Type.(*ast.InterfaceType); ok {
+ return false
+ }
+ // If the RHS is an untyped const, only warn if the LHS type is its default type.
+ if defType, ok := f.isUntypedConst(rhs); ok && !isIdent(v.Type, defType) {
+ return false
+ }
+
+ f.errorf(v.Type, 0.8, category("type-inference"), "should omit type %s from declaration of var %s; it will be inferred from the right-hand side", f.render(v.Type), v.Names[0])
+ return false
+ }
+ return true
+ })
+}
+
+func validType(T types.Type) bool {
+ return T != nil &&
+ T != types.Typ[types.Invalid] &&
+ !strings.Contains(T.String(), "invalid type") // good but not foolproof
+}
+
+// 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 00000000000..74487567632
--- /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 00000000000..4e57f6eab24
--- /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 00000000000..c2492b2ffac
--- /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 00000000000..b1b707e3260
--- /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 00000000000..e63e6c2bdcc
--- /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 00000000000..b8ea37b4c5a
--- /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 00000000000..90ed45115f9
--- /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 00000000000..e9b8e6a45a9
--- /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 00000000000..423e1f9e0f9
--- /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 00000000000..862ab77b0d6
--- /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 00000000000..5b68af04da9
--- /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)
+
+
+### 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
+```
+
+
+### 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.
+
+
+### 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
+```
+
+
+### 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
+```
+
+
+### 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.
+
+
+### 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.
+
+
+
+### 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
+```
+
+
+### 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;'
+```
+
+
+### 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.
+
+
+### 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 }}'
+```
+
+
+### 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.
+
+
+### 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!
+
+
+### 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.
+
+
+### 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.
+
+
+### 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!
+
+
+### 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)
+
+
+### 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)
+
+
+### 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.
+
+
+### 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 00000000000..55b52d962e9
--- /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 00000000000..1430718d6a2
--- /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 00000000000..2ea3850dfa0
--- /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 00000000000..560cb3810c4
--- /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 00000000000..e24a84a20b3
--- /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 </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 < 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 00000000000..06d0d5a5adf
--- /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 00000000000..a99bbcc582a
--- /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 00000000000..3151eceb70f
--- /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 00000000000..70da997f6e0
--- /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(
+ "&", "&",
+ "<", "<",
+ ">", ">",
+ `"`, """,
+ "'", "'",
+)
+
+var htmlUnescaper = NewStringReplacer(
+ "&", "&",
+ "<", "<",
+ ">", ">",
+ """, `"`,
+ "'", "'",
+)
+
+// The http package's old HTML escaping function.
+func oldHTMLEscape(s string) string {
+ s = strings.Replace(s, "&", "&", -1)
+ s = strings.Replace(s, "<", "<", -1)
+ s = strings.Replace(s, ">", ">", -1)
+ s = strings.Replace(s, `"`, """, -1)
+ s = strings.Replace(s, "'", "'", -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 <3 escaping & stuff"},
+ testCase{htmlEscaper, "&&&", "&&&"},
+ 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, "&", "&"},
+ testCase{htmlUnescaper, "<b>HTML's neat</b>", "HTML's neat"},
+ 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's <b>HTML</b>!", 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 00000000000..1a259f5f99c
--- /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 00000000000..1603d87e6b1
--- /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 00000000000..9310fbcffb7
--- /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 00000000000..162ede3bac7
--- /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 00000000000..b747965eed8
--- /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 00000000000..1235ad363ee
--- /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 00000000000..0540fe2caff
--- /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 00000000000..d16d8b5bd40
--- /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 00000000000..8dada3edaf5
--- /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 00000000000..31faefee99e
--- /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
+
+ 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 00000000000..1a56dcf4ec9
--- /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 00000000000..74487567632
--- /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 00000000000..dbaea4f5721
--- /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 00000000000..38737d39f72
--- /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]
+}
diff --git a/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/hashicorp/hcl/.travis.yml
index 3f83d902387..cb63a32161b 100644
--- a/vendor/github.com/hashicorp/hcl/.travis.yml
+++ b/vendor/github.com/hashicorp/hcl/.travis.yml
@@ -3,7 +3,8 @@ sudo: false
language: go
go:
- - 1.8
+ - 1.x
+ - tip
branches:
only:
diff --git a/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/hashicorp/hcl/decoder.go
index 0b39c1b952a..bed9ebbe141 100644
--- a/vendor/github.com/hashicorp/hcl/decoder.go
+++ b/vendor/github.com/hashicorp/hcl/decoder.go
@@ -89,7 +89,7 @@ func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error
switch k.Kind() {
case reflect.Bool:
return d.decodeBool(name, node, result)
- case reflect.Float64:
+ case reflect.Float32, reflect.Float64:
return d.decodeFloat(name, node, result)
case reflect.Int, reflect.Int32, reflect.Int64:
return d.decodeInt(name, node, result)
@@ -137,13 +137,13 @@ func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) e
func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error {
switch n := node.(type) {
case *ast.LiteralType:
- if n.Token.Type == token.FLOAT {
+ if n.Token.Type == token.FLOAT || n.Token.Type == token.NUMBER {
v, err := strconv.ParseFloat(n.Token.Text, 64)
if err != nil {
return err
}
- result.Set(reflect.ValueOf(v))
+ result.Set(reflect.ValueOf(v).Convert(result.Type()))
return nil
}
}
@@ -573,7 +573,11 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value)
// Compile the list of all the fields that we're going to be decoding
// from all the structs.
- fields := make(map[*reflect.StructField]reflect.Value)
+ type field struct {
+ field reflect.StructField
+ val reflect.Value
+ }
+ fields := []field{}
for len(structs) > 0 {
structVal := structs[0]
structs = structs[1:]
@@ -616,7 +620,7 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value)
}
// Normal struct field, store it away
- fields[&fieldType] = structVal.Field(i)
+ fields = append(fields, field{fieldType, structVal.Field(i)})
}
}
@@ -624,26 +628,27 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value)
decodedFields := make([]string, 0, len(fields))
decodedFieldsVal := make([]reflect.Value, 0)
unusedKeysVal := make([]reflect.Value, 0)
- for fieldType, field := range fields {
- if !field.IsValid() {
+ for _, f := range fields {
+ field, fieldValue := f.field, f.val
+ if !fieldValue.IsValid() {
// This should never happen
panic("field is not valid")
}
// If we can't set the field, then it is unexported or something,
// and we just continue onwards.
- if !field.CanSet() {
+ if !fieldValue.CanSet() {
continue
}
- fieldName := fieldType.Name
+ fieldName := field.Name
- tagValue := fieldType.Tag.Get(tagName)
+ tagValue := field.Tag.Get(tagName)
tagParts := strings.SplitN(tagValue, ",", 2)
if len(tagParts) >= 2 {
switch tagParts[1] {
case "decodedFields":
- decodedFieldsVal = append(decodedFieldsVal, field)
+ decodedFieldsVal = append(decodedFieldsVal, fieldValue)
continue
case "key":
if item == nil {
@@ -654,10 +659,10 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value)
}
}
- field.SetString(item.Keys[0].Token.Value().(string))
+ fieldValue.SetString(item.Keys[0].Token.Value().(string))
continue
case "unusedKeys":
- unusedKeysVal = append(unusedKeysVal, field)
+ unusedKeysVal = append(unusedKeysVal, fieldValue)
continue
}
}
@@ -684,7 +689,7 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value)
// because we actually want the value.
fieldName = fmt.Sprintf("%s.%s", name, fieldName)
if len(prefixMatches.Items) > 0 {
- if err := d.decode(fieldName, prefixMatches, field); err != nil {
+ if err := d.decode(fieldName, prefixMatches, fieldValue); err != nil {
return err
}
}
@@ -694,12 +699,12 @@ func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value)
decodeNode = &ast.ObjectList{Items: ot.List.Items}
}
- if err := d.decode(fieldName, decodeNode, field); err != nil {
+ if err := d.decode(fieldName, decodeNode, fieldValue); err != nil {
return err
}
}
- decodedFields = append(decodedFields, fieldType.Name)
+ decodedFields = append(decodedFields, field.Name)
}
if len(decodedFieldsVal) > 0 {
diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
index b4881806e78..64c83bcfb55 100644
--- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
+++ b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go
@@ -197,9 +197,18 @@ func (p *Parser) objectItem() (*ast.ObjectItem, error) {
keyStr = append(keyStr, k.Token.Text)
}
- return nil, fmt.Errorf(
- "key '%s' expected start of object ('{') or assignment ('=')",
- strings.Join(keyStr, " "))
+ return nil, &PosError{
+ Pos: p.tok.Pos,
+ Err: fmt.Errorf(
+ "key '%s' expected start of object ('{') or assignment ('=')",
+ strings.Join(keyStr, " ")),
+ }
+ }
+
+ // key=#comment
+ // val
+ if p.lineComment != nil {
+ o.LineComment, p.lineComment = p.lineComment, nil
}
// do a look-ahead for line comment
@@ -319,7 +328,10 @@ func (p *Parser) objectType() (*ast.ObjectType, error) {
// No error, scan and expect the ending to be a brace
if tok := p.scan(); tok.Type != token.RBRACE {
- return nil, fmt.Errorf("object expected closing RBRACE got: %s", tok.Type)
+ return nil, &PosError{
+ Pos: tok.Pos,
+ Err: fmt.Errorf("object expected closing RBRACE got: %s", tok.Type),
+ }
}
o.List = l
diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go
new file mode 100644
index 00000000000..7c038d12a23
--- /dev/null
+++ b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go
@@ -0,0 +1,789 @@
+package printer
+
+import (
+ "bytes"
+ "fmt"
+ "sort"
+
+ "github.com/hashicorp/hcl/hcl/ast"
+ "github.com/hashicorp/hcl/hcl/token"
+)
+
+const (
+ blank = byte(' ')
+ newline = byte('\n')
+ tab = byte('\t')
+ infinity = 1 << 30 // offset or line
+)
+
+var (
+ unindent = []byte("\uE123") // in the private use space
+)
+
+type printer struct {
+ cfg Config
+ prev token.Pos
+
+ comments []*ast.CommentGroup // may be nil, contains all comments
+ standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node)
+
+ enableTrace bool
+ indentTrace int
+}
+
+type ByPosition []*ast.CommentGroup
+
+func (b ByPosition) Len() int { return len(b) }
+func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
+func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) }
+
+// collectComments comments all standalone comments which are not lead or line
+// comment
+func (p *printer) collectComments(node ast.Node) {
+ // first collect all comments. This is already stored in
+ // ast.File.(comments)
+ ast.Walk(node, func(nn ast.Node) (ast.Node, bool) {
+ switch t := nn.(type) {
+ case *ast.File:
+ p.comments = t.Comments
+ return nn, false
+ }
+ return nn, true
+ })
+
+ standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0)
+ for _, c := range p.comments {
+ standaloneComments[c.Pos()] = c
+ }
+
+ // next remove all lead and line comments from the overall comment map.
+ // This will give us comments which are standalone, comments which are not
+ // assigned to any kind of node.
+ ast.Walk(node, func(nn ast.Node) (ast.Node, bool) {
+ switch t := nn.(type) {
+ case *ast.LiteralType:
+ if t.LeadComment != nil {
+ for _, comment := range t.LeadComment.List {
+ if _, ok := standaloneComments[comment.Pos()]; ok {
+ delete(standaloneComments, comment.Pos())
+ }
+ }
+ }
+
+ if t.LineComment != nil {
+ for _, comment := range t.LineComment.List {
+ if _, ok := standaloneComments[comment.Pos()]; ok {
+ delete(standaloneComments, comment.Pos())
+ }
+ }
+ }
+ case *ast.ObjectItem:
+ if t.LeadComment != nil {
+ for _, comment := range t.LeadComment.List {
+ if _, ok := standaloneComments[comment.Pos()]; ok {
+ delete(standaloneComments, comment.Pos())
+ }
+ }
+ }
+
+ if t.LineComment != nil {
+ for _, comment := range t.LineComment.List {
+ if _, ok := standaloneComments[comment.Pos()]; ok {
+ delete(standaloneComments, comment.Pos())
+ }
+ }
+ }
+ }
+
+ return nn, true
+ })
+
+ for _, c := range standaloneComments {
+ p.standaloneComments = append(p.standaloneComments, c)
+ }
+
+ sort.Sort(ByPosition(p.standaloneComments))
+}
+
+// output prints creates b printable HCL output and returns it.
+func (p *printer) output(n interface{}) []byte {
+ var buf bytes.Buffer
+
+ switch t := n.(type) {
+ case *ast.File:
+ // File doesn't trace so we add the tracing here
+ defer un(trace(p, "File"))
+ return p.output(t.Node)
+ case *ast.ObjectList:
+ defer un(trace(p, "ObjectList"))
+
+ var index int
+ for {
+ // Determine the location of the next actual non-comment
+ // item. If we're at the end, the next item is at "infinity"
+ var nextItem token.Pos
+ if index != len(t.Items) {
+ nextItem = t.Items[index].Pos()
+ } else {
+ nextItem = token.Pos{Offset: infinity, Line: infinity}
+ }
+
+ // Go through the standalone comments in the file and print out
+ // the comments that we should be for this object item.
+ for _, c := range p.standaloneComments {
+ // Go through all the comments in the group. The group
+ // should be printed together, not separated by double newlines.
+ printed := false
+ newlinePrinted := false
+ for _, comment := range c.List {
+ // We only care about comments after the previous item
+ // we've printed so that comments are printed in the
+ // correct locations (between two objects for example).
+ // And before the next item.
+ if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) {
+ // if we hit the end add newlines so we can print the comment
+ // we don't do this if prev is invalid which means the
+ // beginning of the file since the first comment should
+ // be at the first line.
+ if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) {
+ buf.Write([]byte{newline, newline})
+ newlinePrinted = true
+ }
+
+ // Write the actual comment.
+ buf.WriteString(comment.Text)
+ buf.WriteByte(newline)
+
+ // Set printed to true to note that we printed something
+ printed = true
+ }
+ }
+
+ // If we're not at the last item, write a new line so
+ // that there is a newline separating this comment from
+ // the next object.
+ if printed && index != len(t.Items) {
+ buf.WriteByte(newline)
+ }
+ }
+
+ if index == len(t.Items) {
+ break
+ }
+
+ buf.Write(p.output(t.Items[index]))
+ if index != len(t.Items)-1 {
+ // Always write a newline to separate us from the next item
+ buf.WriteByte(newline)
+
+ // Need to determine if we're going to separate the next item
+ // with a blank line. The logic here is simple, though there
+ // are a few conditions:
+ //
+ // 1. The next object is more than one line away anyways,
+ // so we need an empty line.
+ //
+ // 2. The next object is not a "single line" object, so
+ // we need an empty line.
+ //
+ // 3. This current object is not a single line object,
+ // so we need an empty line.
+ current := t.Items[index]
+ next := t.Items[index+1]
+ if next.Pos().Line != t.Items[index].Pos().Line+1 ||
+ !p.isSingleLineObject(next) ||
+ !p.isSingleLineObject(current) {
+ buf.WriteByte(newline)
+ }
+ }
+ index++
+ }
+ case *ast.ObjectKey:
+ buf.WriteString(t.Token.Text)
+ case *ast.ObjectItem:
+ p.prev = t.Pos()
+ buf.Write(p.objectItem(t))
+ case *ast.LiteralType:
+ buf.Write(p.literalType(t))
+ case *ast.ListType:
+ buf.Write(p.list(t))
+ case *ast.ObjectType:
+ buf.Write(p.objectType(t))
+ default:
+ fmt.Printf(" unknown type: %T\n", n)
+ }
+
+ return buf.Bytes()
+}
+
+func (p *printer) literalType(lit *ast.LiteralType) []byte {
+ result := []byte(lit.Token.Text)
+ switch lit.Token.Type {
+ case token.HEREDOC:
+ // Clear the trailing newline from heredocs
+ if result[len(result)-1] == '\n' {
+ result = result[:len(result)-1]
+ }
+
+ // Poison lines 2+ so that we don't indent them
+ result = p.heredocIndent(result)
+ case token.STRING:
+ // If this is a multiline string, poison lines 2+ so we don't
+ // indent them.
+ if bytes.IndexRune(result, '\n') >= 0 {
+ result = p.heredocIndent(result)
+ }
+ }
+
+ return result
+}
+
+// objectItem returns the printable HCL form of an object item. An object type
+// starts with one/multiple keys and has a value. The value might be of any
+// type.
+func (p *printer) objectItem(o *ast.ObjectItem) []byte {
+ defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text)))
+ var buf bytes.Buffer
+
+ if o.LeadComment != nil {
+ for _, comment := range o.LeadComment.List {
+ buf.WriteString(comment.Text)
+ buf.WriteByte(newline)
+ }
+ }
+
+ // If key and val are on different lines, treat line comments like lead comments.
+ if o.LineComment != nil && o.Val.Pos().Line != o.Keys[0].Pos().Line {
+ for _, comment := range o.LineComment.List {
+ buf.WriteString(comment.Text)
+ buf.WriteByte(newline)
+ }
+ }
+
+ for i, k := range o.Keys {
+ buf.WriteString(k.Token.Text)
+ buf.WriteByte(blank)
+
+ // reach end of key
+ if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 {
+ buf.WriteString("=")
+ buf.WriteByte(blank)
+ }
+ }
+
+ buf.Write(p.output(o.Val))
+
+ if o.LineComment != nil && o.Val.Pos().Line == o.Keys[0].Pos().Line {
+ buf.WriteByte(blank)
+ for _, comment := range o.LineComment.List {
+ buf.WriteString(comment.Text)
+ }
+ }
+
+ return buf.Bytes()
+}
+
+// objectType returns the printable HCL form of an object type. An object type
+// begins with a brace and ends with a brace.
+func (p *printer) objectType(o *ast.ObjectType) []byte {
+ defer un(trace(p, "ObjectType"))
+ var buf bytes.Buffer
+ buf.WriteString("{")
+
+ var index int
+ var nextItem token.Pos
+ var commented, newlinePrinted bool
+ for {
+ // Determine the location of the next actual non-comment
+ // item. If we're at the end, the next item is the closing brace
+ if index != len(o.List.Items) {
+ nextItem = o.List.Items[index].Pos()
+ } else {
+ nextItem = o.Rbrace
+ }
+
+ // Go through the standalone comments in the file and print out
+ // the comments that we should be for this object item.
+ for _, c := range p.standaloneComments {
+ printed := false
+ var lastCommentPos token.Pos
+ for _, comment := range c.List {
+ // We only care about comments after the previous item
+ // we've printed so that comments are printed in the
+ // correct locations (between two objects for example).
+ // And before the next item.
+ if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) {
+ // If there are standalone comments and the initial newline has not
+ // been printed yet, do it now.
+ if !newlinePrinted {
+ newlinePrinted = true
+ buf.WriteByte(newline)
+ }
+
+ // add newline if it's between other printed nodes
+ if index > 0 {
+ commented = true
+ buf.WriteByte(newline)
+ }
+
+ // Store this position
+ lastCommentPos = comment.Pos()
+
+ // output the comment itself
+ buf.Write(p.indent(p.heredocIndent([]byte(comment.Text))))
+
+ // Set printed to true to note that we printed something
+ printed = true
+
+ /*
+ if index != len(o.List.Items) {
+ buf.WriteByte(newline) // do not print on the end
+ }
+ */
+ }
+ }
+
+ // Stuff to do if we had comments
+ if printed {
+ // Always write a newline
+ buf.WriteByte(newline)
+
+ // If there is another item in the object and our comment
+ // didn't hug it directly, then make sure there is a blank
+ // line separating them.
+ if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 {
+ buf.WriteByte(newline)
+ }
+ }
+ }
+
+ if index == len(o.List.Items) {
+ p.prev = o.Rbrace
+ break
+ }
+
+ // At this point we are sure that it's not a totally empty block: print
+ // the initial newline if it hasn't been printed yet by the previous
+ // block about standalone comments.
+ if !newlinePrinted {
+ buf.WriteByte(newline)
+ newlinePrinted = true
+ }
+
+ // check if we have adjacent one liner items. If yes we'll going to align
+ // the comments.
+ var aligned []*ast.ObjectItem
+ for _, item := range o.List.Items[index:] {
+ // we don't group one line lists
+ if len(o.List.Items) == 1 {
+ break
+ }
+
+ // one means a oneliner with out any lead comment
+ // two means a oneliner with lead comment
+ // anything else might be something else
+ cur := lines(string(p.objectItem(item)))
+ if cur > 2 {
+ break
+ }
+
+ curPos := item.Pos()
+
+ nextPos := token.Pos{}
+ if index != len(o.List.Items)-1 {
+ nextPos = o.List.Items[index+1].Pos()
+ }
+
+ prevPos := token.Pos{}
+ if index != 0 {
+ prevPos = o.List.Items[index-1].Pos()
+ }
+
+ // fmt.Println("DEBUG ----------------")
+ // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos)
+ // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos)
+ // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos)
+
+ if curPos.Line+1 == nextPos.Line {
+ aligned = append(aligned, item)
+ index++
+ continue
+ }
+
+ if curPos.Line-1 == prevPos.Line {
+ aligned = append(aligned, item)
+ index++
+
+ // finish if we have a new line or comment next. This happens
+ // if the next item is not adjacent
+ if curPos.Line+1 != nextPos.Line {
+ break
+ }
+ continue
+ }
+
+ break
+ }
+
+ // put newlines if the items are between other non aligned items.
+ // newlines are also added if there is a standalone comment already, so
+ // check it too
+ if !commented && index != len(aligned) {
+ buf.WriteByte(newline)
+ }
+
+ if len(aligned) >= 1 {
+ p.prev = aligned[len(aligned)-1].Pos()
+
+ items := p.alignedItems(aligned)
+ buf.Write(p.indent(items))
+ } else {
+ p.prev = o.List.Items[index].Pos()
+
+ buf.Write(p.indent(p.objectItem(o.List.Items[index])))
+ index++
+ }
+
+ buf.WriteByte(newline)
+ }
+
+ buf.WriteString("}")
+ return buf.Bytes()
+}
+
+func (p *printer) alignedItems(items []*ast.ObjectItem) []byte {
+ var buf bytes.Buffer
+
+ // find the longest key and value length, needed for alignment
+ var longestKeyLen int // longest key length
+ var longestValLen int // longest value length
+ for _, item := range items {
+ key := len(item.Keys[0].Token.Text)
+ val := len(p.output(item.Val))
+
+ if key > longestKeyLen {
+ longestKeyLen = key
+ }
+
+ if val > longestValLen {
+ longestValLen = val
+ }
+ }
+
+ for i, item := range items {
+ if item.LeadComment != nil {
+ for _, comment := range item.LeadComment.List {
+ buf.WriteString(comment.Text)
+ buf.WriteByte(newline)
+ }
+ }
+
+ for i, k := range item.Keys {
+ keyLen := len(k.Token.Text)
+ buf.WriteString(k.Token.Text)
+ for i := 0; i < longestKeyLen-keyLen+1; i++ {
+ buf.WriteByte(blank)
+ }
+
+ // reach end of key
+ if i == len(item.Keys)-1 && len(item.Keys) == 1 {
+ buf.WriteString("=")
+ buf.WriteByte(blank)
+ }
+ }
+
+ val := p.output(item.Val)
+ valLen := len(val)
+ buf.Write(val)
+
+ if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil {
+ for i := 0; i < longestValLen-valLen+1; i++ {
+ buf.WriteByte(blank)
+ }
+
+ for _, comment := range item.LineComment.List {
+ buf.WriteString(comment.Text)
+ }
+ }
+
+ // do not print for the last item
+ if i != len(items)-1 {
+ buf.WriteByte(newline)
+ }
+ }
+
+ return buf.Bytes()
+}
+
+// list returns the printable HCL form of an list type.
+func (p *printer) list(l *ast.ListType) []byte {
+ if p.isSingleLineList(l) {
+ return p.singleLineList(l)
+ }
+
+ var buf bytes.Buffer
+ buf.WriteString("[")
+ buf.WriteByte(newline)
+
+ var longestLine int
+ for _, item := range l.List {
+ // for now we assume that the list only contains literal types
+ if lit, ok := item.(*ast.LiteralType); ok {
+ lineLen := len(lit.Token.Text)
+ if lineLen > longestLine {
+ longestLine = lineLen
+ }
+ }
+ }
+
+ haveEmptyLine := false
+ for i, item := range l.List {
+ // If we have a lead comment, then we want to write that first
+ leadComment := false
+ if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil {
+ leadComment = true
+
+ // Ensure an empty line before every element with a
+ // lead comment (except the first item in a list).
+ if !haveEmptyLine && i != 0 {
+ buf.WriteByte(newline)
+ }
+
+ for _, comment := range lit.LeadComment.List {
+ buf.Write(p.indent([]byte(comment.Text)))
+ buf.WriteByte(newline)
+ }
+ }
+
+ // also indent each line
+ val := p.output(item)
+ curLen := len(val)
+ buf.Write(p.indent(val))
+
+ // if this item is a heredoc, then we output the comma on
+ // the next line. This is the only case this happens.
+ comma := []byte{','}
+ if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC {
+ buf.WriteByte(newline)
+ comma = p.indent(comma)
+ }
+
+ buf.Write(comma)
+
+ if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil {
+ // if the next item doesn't have any comments, do not align
+ buf.WriteByte(blank) // align one space
+ for i := 0; i < longestLine-curLen; i++ {
+ buf.WriteByte(blank)
+ }
+
+ for _, comment := range lit.LineComment.List {
+ buf.WriteString(comment.Text)
+ }
+ }
+
+ buf.WriteByte(newline)
+
+ // Ensure an empty line after every element with a
+ // lead comment (except the first item in a list).
+ haveEmptyLine = leadComment && i != len(l.List)-1
+ if haveEmptyLine {
+ buf.WriteByte(newline)
+ }
+ }
+
+ buf.WriteString("]")
+ return buf.Bytes()
+}
+
+// isSingleLineList returns true if:
+// * they were previously formatted entirely on one line
+// * they consist entirely of literals
+// * there are either no heredoc strings or the list has exactly one element
+// * there are no line comments
+func (printer) isSingleLineList(l *ast.ListType) bool {
+ for _, item := range l.List {
+ if item.Pos().Line != l.Lbrack.Line {
+ return false
+ }
+
+ lit, ok := item.(*ast.LiteralType)
+ if !ok {
+ return false
+ }
+
+ if lit.Token.Type == token.HEREDOC && len(l.List) != 1 {
+ return false
+ }
+
+ if lit.LineComment != nil {
+ return false
+ }
+ }
+
+ return true
+}
+
+// singleLineList prints a simple single line list.
+// For a definition of "simple", see isSingleLineList above.
+func (p *printer) singleLineList(l *ast.ListType) []byte {
+ buf := &bytes.Buffer{}
+
+ buf.WriteString("[")
+ for i, item := range l.List {
+ if i != 0 {
+ buf.WriteString(", ")
+ }
+
+ // Output the item itself
+ buf.Write(p.output(item))
+
+ // The heredoc marker needs to be at the end of line.
+ if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC {
+ buf.WriteByte(newline)
+ }
+ }
+
+ buf.WriteString("]")
+ return buf.Bytes()
+}
+
+// indent indents the lines of the given buffer for each non-empty line
+func (p *printer) indent(buf []byte) []byte {
+ var prefix []byte
+ if p.cfg.SpacesWidth != 0 {
+ for i := 0; i < p.cfg.SpacesWidth; i++ {
+ prefix = append(prefix, blank)
+ }
+ } else {
+ prefix = []byte{tab}
+ }
+
+ var res []byte
+ bol := true
+ for _, c := range buf {
+ if bol && c != '\n' {
+ res = append(res, prefix...)
+ }
+
+ res = append(res, c)
+ bol = c == '\n'
+ }
+ return res
+}
+
+// unindent removes all the indentation from the tombstoned lines
+func (p *printer) unindent(buf []byte) []byte {
+ var res []byte
+ for i := 0; i < len(buf); i++ {
+ skip := len(buf)-i <= len(unindent)
+ if !skip {
+ skip = !bytes.Equal(unindent, buf[i:i+len(unindent)])
+ }
+ if skip {
+ res = append(res, buf[i])
+ continue
+ }
+
+ // We have a marker. we have to backtrace here and clean out
+ // any whitespace ahead of our tombstone up to a \n
+ for j := len(res) - 1; j >= 0; j-- {
+ if res[j] == '\n' {
+ break
+ }
+
+ res = res[:j]
+ }
+
+ // Skip the entire unindent marker
+ i += len(unindent) - 1
+ }
+
+ return res
+}
+
+// heredocIndent marks all the 2nd and further lines as unindentable
+func (p *printer) heredocIndent(buf []byte) []byte {
+ var res []byte
+ bol := false
+ for _, c := range buf {
+ if bol && c != '\n' {
+ res = append(res, unindent...)
+ }
+ res = append(res, c)
+ bol = c == '\n'
+ }
+ return res
+}
+
+// isSingleLineObject tells whether the given object item is a single
+// line object such as "obj {}".
+//
+// A single line object:
+//
+// * has no lead comments (hence multi-line)
+// * has no assignment
+// * has no values in the stanza (within {})
+//
+func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool {
+ // If there is a lead comment, can't be one line
+ if val.LeadComment != nil {
+ return false
+ }
+
+ // If there is assignment, we always break by line
+ if val.Assign.IsValid() {
+ return false
+ }
+
+ // If it isn't an object type, then its not a single line object
+ ot, ok := val.Val.(*ast.ObjectType)
+ if !ok {
+ return false
+ }
+
+ // If the object has no items, it is single line!
+ return len(ot.List.Items) == 0
+}
+
+func lines(txt string) int {
+ endline := 1
+ for i := 0; i < len(txt); i++ {
+ if txt[i] == '\n' {
+ endline++
+ }
+ }
+ return endline
+}
+
+// ----------------------------------------------------------------------------
+// Tracing support
+
+func (p *printer) printTrace(a ...interface{}) {
+ if !p.enableTrace {
+ return
+ }
+
+ const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "
+ const n = len(dots)
+ i := 2 * p.indentTrace
+ for i > n {
+ fmt.Print(dots)
+ i -= n
+ }
+ // i <= n
+ fmt.Print(dots[0:i])
+ fmt.Println(a...)
+}
+
+func trace(p *printer, msg string) *printer {
+ p.printTrace(msg, "(")
+ p.indentTrace++
+ return p
+}
+
+// Usage pattern: defer un(trace(p, "..."))
+func un(p *printer) {
+ p.indentTrace--
+ p.printTrace(")")
+}
diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go
new file mode 100644
index 00000000000..6617ab8e7a2
--- /dev/null
+++ b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go
@@ -0,0 +1,66 @@
+// Package printer implements printing of AST nodes to HCL format.
+package printer
+
+import (
+ "bytes"
+ "io"
+ "text/tabwriter"
+
+ "github.com/hashicorp/hcl/hcl/ast"
+ "github.com/hashicorp/hcl/hcl/parser"
+)
+
+var DefaultConfig = Config{
+ SpacesWidth: 2,
+}
+
+// A Config node controls the output of Fprint.
+type Config struct {
+ SpacesWidth int // if set, it will use spaces instead of tabs for alignment
+}
+
+func (c *Config) Fprint(output io.Writer, node ast.Node) error {
+ p := &printer{
+ cfg: *c,
+ comments: make([]*ast.CommentGroup, 0),
+ standaloneComments: make([]*ast.CommentGroup, 0),
+ // enableTrace: true,
+ }
+
+ p.collectComments(node)
+
+ if _, err := output.Write(p.unindent(p.output(node))); err != nil {
+ return err
+ }
+
+ // flush tabwriter, if any
+ var err error
+ if tw, _ := output.(*tabwriter.Writer); tw != nil {
+ err = tw.Flush()
+ }
+
+ return err
+}
+
+// Fprint "pretty-prints" an HCL node to output
+// It calls Config.Fprint with default settings.
+func Fprint(output io.Writer, node ast.Node) error {
+ return DefaultConfig.Fprint(output, node)
+}
+
+// Format formats src HCL and returns the result.
+func Format(src []byte) ([]byte, error) {
+ node, err := parser.Parse(src)
+ if err != nil {
+ return nil, err
+ }
+
+ var buf bytes.Buffer
+ if err := DefaultConfig.Fprint(&buf, node); err != nil {
+ return nil, err
+ }
+
+ // Add trailing newline to result
+ buf.WriteString("\n")
+ return buf.Bytes(), nil
+}
diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go
index 69662367f05..624a18fe3a7 100644
--- a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go
+++ b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go
@@ -74,14 +74,6 @@ func (s *Scanner) next() rune {
return eof
}
- if ch == utf8.RuneError && size == 1 {
- s.srcPos.Column++
- s.srcPos.Offset += size
- s.lastCharLen = size
- s.err("illegal UTF-8 encoding")
- return ch
- }
-
// remember last position
s.prevPos = s.srcPos
@@ -89,18 +81,27 @@ func (s *Scanner) next() rune {
s.lastCharLen = size
s.srcPos.Offset += size
+ if ch == utf8.RuneError && size == 1 {
+ s.err("illegal UTF-8 encoding")
+ return ch
+ }
+
if ch == '\n' {
s.srcPos.Line++
s.lastLineLen = s.srcPos.Column
s.srcPos.Column = 0
}
- // If we see a null character with data left, then that is an error
- if ch == '\x00' && s.buf.Len() > 0 {
+ if ch == '\x00' {
s.err("unexpected null character (0x00)")
return eof
}
+ if ch == '\uE123' {
+ s.err("unicode code point U+E123 reserved for internal use")
+ return utf8.RuneError
+ }
+
// debug
// fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column)
return ch
@@ -351,7 +352,7 @@ func (s *Scanner) scanNumber(ch rune) token.Type {
return token.NUMBER
}
-// scanMantissa scans the mantissa begining from the rune. It returns the next
+// scanMantissa scans the mantissa beginning from the rune. It returns the next
// non decimal rune. It's used to determine wheter it's a fraction or exponent.
func (s *Scanner) scanMantissa(ch rune) rune {
scanned := false
@@ -432,16 +433,16 @@ func (s *Scanner) scanHeredoc() {
// Read the identifier
identBytes := s.src[offs : s.srcPos.Offset-s.lastCharLen]
- if len(identBytes) == 0 {
+ if len(identBytes) == 0 || (len(identBytes) == 1 && identBytes[0] == '-') {
s.err("zero-length heredoc anchor")
return
}
var identRegexp *regexp.Regexp
if identBytes[0] == '-' {
- identRegexp = regexp.MustCompile(fmt.Sprintf(`[[:space:]]*%s\z`, identBytes[1:]))
+ identRegexp = regexp.MustCompile(fmt.Sprintf(`^[[:space:]]*%s\r*\z`, identBytes[1:]))
} else {
- identRegexp = regexp.MustCompile(fmt.Sprintf(`[[:space:]]*%s\z`, identBytes))
+ identRegexp = regexp.MustCompile(fmt.Sprintf(`^[[:space:]]*%s\r*\z`, identBytes))
}
// Read the actual string value
@@ -551,7 +552,7 @@ func (s *Scanner) scanDigits(ch rune, base, n int) rune {
s.err("illegal char escape")
}
- if n != start {
+ if n != start && ch != eof {
// we scanned all digits, put the last non digit char back,
// only if we read anything at all
s.unread()
diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go
index dd5c72bb3d5..fe3f0f09502 100644
--- a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go
+++ b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go
@@ -246,7 +246,7 @@ func (s *Scanner) scanNumber(ch rune) token.Type {
return token.NUMBER
}
-// scanMantissa scans the mantissa begining from the rune. It returns the next
+// scanMantissa scans the mantissa beginning from the rune. It returns the next
// non decimal rune. It's used to determine wheter it's a fraction or exponent.
func (s *Scanner) scanMantissa(ch rune) rune {
scanned := false
diff --git a/vendor/github.com/inconshreveable/mousetrap/LICENSE b/vendor/github.com/inconshreveable/mousetrap/LICENSE
new file mode 100644
index 00000000000..5f0d1fb6a7b
--- /dev/null
+++ b/vendor/github.com/inconshreveable/mousetrap/LICENSE
@@ -0,0 +1,13 @@
+Copyright 2014 Alan Shreve
+
+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/inconshreveable/mousetrap/README.md b/vendor/github.com/inconshreveable/mousetrap/README.md
new file mode 100644
index 00000000000..7a950d1774f
--- /dev/null
+++ b/vendor/github.com/inconshreveable/mousetrap/README.md
@@ -0,0 +1,23 @@
+# mousetrap
+
+mousetrap is a tiny library that answers a single question.
+
+On a Windows machine, was the process invoked by someone double clicking on
+the executable file while browsing in explorer?
+
+### Motivation
+
+Windows developers unfamiliar with command line tools will often "double-click"
+the executable for a tool. Because most CLI tools print the help and then exit
+when invoked without arguments, this is often very frustrating for those users.
+
+mousetrap provides a way to detect these invocations so that you can provide
+more helpful behavior and instructions on how to run the CLI tool. To see what
+this looks like, both from an organizational and a technical perspective, see
+https://inconshreveable.com/09-09-2014/sweat-the-small-stuff/
+
+### The interface
+
+The library exposes a single interface:
+
+ func StartedByExplorer() (bool)
diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_others.go b/vendor/github.com/inconshreveable/mousetrap/trap_others.go
new file mode 100644
index 00000000000..9d2d8a4bab9
--- /dev/null
+++ b/vendor/github.com/inconshreveable/mousetrap/trap_others.go
@@ -0,0 +1,15 @@
+// +build !windows
+
+package mousetrap
+
+// StartedByExplorer returns true if the program was invoked by the user
+// double-clicking on the executable from explorer.exe
+//
+// It is conservative and returns false if any of the internal calls fail.
+// It does not guarantee that the program was run from a terminal. It only can tell you
+// whether it was launched from explorer.exe
+//
+// On non-Windows platforms, it always returns false.
+func StartedByExplorer() bool {
+ return false
+}
diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows.go
new file mode 100644
index 00000000000..336142a5e3e
--- /dev/null
+++ b/vendor/github.com/inconshreveable/mousetrap/trap_windows.go
@@ -0,0 +1,98 @@
+// +build windows
+// +build !go1.4
+
+package mousetrap
+
+import (
+ "fmt"
+ "os"
+ "syscall"
+ "unsafe"
+)
+
+const (
+ // defined by the Win32 API
+ th32cs_snapprocess uintptr = 0x2
+)
+
+var (
+ kernel = syscall.MustLoadDLL("kernel32.dll")
+ CreateToolhelp32Snapshot = kernel.MustFindProc("CreateToolhelp32Snapshot")
+ Process32First = kernel.MustFindProc("Process32FirstW")
+ Process32Next = kernel.MustFindProc("Process32NextW")
+)
+
+// ProcessEntry32 structure defined by the Win32 API
+type processEntry32 struct {
+ dwSize uint32
+ cntUsage uint32
+ th32ProcessID uint32
+ th32DefaultHeapID int
+ th32ModuleID uint32
+ cntThreads uint32
+ th32ParentProcessID uint32
+ pcPriClassBase int32
+ dwFlags uint32
+ szExeFile [syscall.MAX_PATH]uint16
+}
+
+func getProcessEntry(pid int) (pe *processEntry32, err error) {
+ snapshot, _, e1 := CreateToolhelp32Snapshot.Call(th32cs_snapprocess, uintptr(0))
+ if snapshot == uintptr(syscall.InvalidHandle) {
+ err = fmt.Errorf("CreateToolhelp32Snapshot: %v", e1)
+ return
+ }
+ defer syscall.CloseHandle(syscall.Handle(snapshot))
+
+ var processEntry processEntry32
+ processEntry.dwSize = uint32(unsafe.Sizeof(processEntry))
+ ok, _, e1 := Process32First.Call(snapshot, uintptr(unsafe.Pointer(&processEntry)))
+ if ok == 0 {
+ err = fmt.Errorf("Process32First: %v", e1)
+ return
+ }
+
+ for {
+ if processEntry.th32ProcessID == uint32(pid) {
+ pe = &processEntry
+ return
+ }
+
+ ok, _, e1 = Process32Next.Call(snapshot, uintptr(unsafe.Pointer(&processEntry)))
+ if ok == 0 {
+ err = fmt.Errorf("Process32Next: %v", e1)
+ return
+ }
+ }
+}
+
+func getppid() (pid int, err error) {
+ pe, err := getProcessEntry(os.Getpid())
+ if err != nil {
+ return
+ }
+
+ pid = int(pe.th32ParentProcessID)
+ return
+}
+
+// StartedByExplorer returns true if the program was invoked by the user double-clicking
+// on the executable from explorer.exe
+//
+// It is conservative and returns false if any of the internal calls fail.
+// It does not guarantee that the program was run from a terminal. It only can tell you
+// whether it was launched from explorer.exe
+func StartedByExplorer() bool {
+ ppid, err := getppid()
+ if err != nil {
+ return false
+ }
+
+ pe, err := getProcessEntry(ppid)
+ if err != nil {
+ return false
+ }
+
+ name := syscall.UTF16ToString(pe.szExeFile[:])
+ return name == "explorer.exe"
+}
diff --git a/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go b/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go
new file mode 100644
index 00000000000..9a28e57c3c3
--- /dev/null
+++ b/vendor/github.com/inconshreveable/mousetrap/trap_windows_1.4.go
@@ -0,0 +1,46 @@
+// +build windows
+// +build go1.4
+
+package mousetrap
+
+import (
+ "os"
+ "syscall"
+ "unsafe"
+)
+
+func getProcessEntry(pid int) (*syscall.ProcessEntry32, error) {
+ snapshot, err := syscall.CreateToolhelp32Snapshot(syscall.TH32CS_SNAPPROCESS, 0)
+ if err != nil {
+ return nil, err
+ }
+ defer syscall.CloseHandle(snapshot)
+ var procEntry syscall.ProcessEntry32
+ procEntry.Size = uint32(unsafe.Sizeof(procEntry))
+ if err = syscall.Process32First(snapshot, &procEntry); err != nil {
+ return nil, err
+ }
+ for {
+ if procEntry.ProcessID == uint32(pid) {
+ return &procEntry, nil
+ }
+ err = syscall.Process32Next(snapshot, &procEntry)
+ if err != nil {
+ return nil, err
+ }
+ }
+}
+
+// StartedByExplorer returns true if the program was invoked by the user double-clicking
+// on the executable from explorer.exe
+//
+// It is conservative and returns false if any of the internal calls fail.
+// It does not guarantee that the program was run from a terminal. It only can tell you
+// whether it was launched from explorer.exe
+func StartedByExplorer() bool {
+ pe, err := getProcessEntry(os.Getppid())
+ if err != nil {
+ return false
+ }
+ return "explorer.exe" == syscall.UTF16ToString(pe.ExeFile[:])
+}
diff --git a/vendor/github.com/kisielk/gotool/.travis.yml b/vendor/github.com/kisielk/gotool/.travis.yml
new file mode 100644
index 00000000000..d1784e1e23b
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/.travis.yml
@@ -0,0 +1,23 @@
+sudo: false
+language: go
+go:
+ - 1.2
+ - 1.3
+ - 1.4
+ - 1.5
+ - 1.6
+ - 1.7
+ - 1.8
+ - 1.9
+ - master
+matrix:
+ allow_failures:
+ - go: master
+ fast_finish: true
+install:
+ - # Skip.
+script:
+ - go get -t -v ./...
+ - diff -u <(echo -n) <(gofmt -d .)
+ - go tool vet .
+ - go test -v -race ./...
diff --git a/vendor/github.com/kisielk/gotool/LEGAL b/vendor/github.com/kisielk/gotool/LEGAL
new file mode 100644
index 00000000000..72b859cd621
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/LEGAL
@@ -0,0 +1,32 @@
+All the files in this distribution are covered under either the MIT
+license (see the file LICENSE) except some files mentioned below.
+
+match.go, match_test.go:
+
+ 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/kisielk/gotool/LICENSE b/vendor/github.com/kisielk/gotool/LICENSE
new file mode 100644
index 00000000000..1cbf651e2fc
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/LICENSE
@@ -0,0 +1,20 @@
+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/kisielk/gotool/README.md b/vendor/github.com/kisielk/gotool/README.md
new file mode 100644
index 00000000000..6e4e92b2f60
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/README.md
@@ -0,0 +1,6 @@
+gotool
+======
+[![GoDoc](https://godoc.org/github.com/kisielk/gotool?status.svg)](https://godoc.org/github.com/kisielk/gotool)
+[![Build Status](https://travis-ci.org/kisielk/gotool.svg?branch=master)](https://travis-ci.org/kisielk/gotool)
+
+Package gotool contains utility functions used to implement the standard "cmd/go" tool, provided as a convenience to developers who want to write tools with similar semantics.
diff --git a/vendor/github.com/kisielk/gotool/go.mod b/vendor/github.com/kisielk/gotool/go.mod
new file mode 100644
index 00000000000..503b37c6fb1
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/go.mod
@@ -0,0 +1 @@
+module "github.com/kisielk/gotool"
diff --git a/vendor/github.com/kisielk/gotool/go13.go b/vendor/github.com/kisielk/gotool/go13.go
new file mode 100644
index 00000000000..2dd9b3fdf0a
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/go13.go
@@ -0,0 +1,15 @@
+// +build !go1.4
+
+package gotool
+
+import (
+ "go/build"
+ "path/filepath"
+ "runtime"
+)
+
+var gorootSrc = filepath.Join(runtime.GOROOT(), "src", "pkg")
+
+func shouldIgnoreImport(p *build.Package) bool {
+ return true
+}
diff --git a/vendor/github.com/kisielk/gotool/go14-15.go b/vendor/github.com/kisielk/gotool/go14-15.go
new file mode 100644
index 00000000000..aa99a32270b
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/go14-15.go
@@ -0,0 +1,15 @@
+// +build go1.4,!go1.6
+
+package gotool
+
+import (
+ "go/build"
+ "path/filepath"
+ "runtime"
+)
+
+var gorootSrc = filepath.Join(runtime.GOROOT(), "src")
+
+func shouldIgnoreImport(p *build.Package) bool {
+ return true
+}
diff --git a/vendor/github.com/kisielk/gotool/go16-18.go b/vendor/github.com/kisielk/gotool/go16-18.go
new file mode 100644
index 00000000000..f25cec14a83
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/go16-18.go
@@ -0,0 +1,15 @@
+// +build go1.6,!go1.9
+
+package gotool
+
+import (
+ "go/build"
+ "path/filepath"
+ "runtime"
+)
+
+var gorootSrc = filepath.Join(runtime.GOROOT(), "src")
+
+func shouldIgnoreImport(p *build.Package) bool {
+ return p == nil || len(p.InvalidGoFiles) == 0
+}
diff --git a/vendor/github.com/kisielk/gotool/internal/load/path.go b/vendor/github.com/kisielk/gotool/internal/load/path.go
new file mode 100644
index 00000000000..74e15b9d324
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/internal/load/path.go
@@ -0,0 +1,27 @@
+// 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.
+
+// +build go1.9
+
+package load
+
+import (
+ "strings"
+)
+
+// 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
+ }
+}
diff --git a/vendor/github.com/kisielk/gotool/internal/load/pkg.go b/vendor/github.com/kisielk/gotool/internal/load/pkg.go
new file mode 100644
index 00000000000..b937ede759d
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/internal/load/pkg.go
@@ -0,0 +1,25 @@
+// 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.
+
+// +build go1.9
+
+// Package load loads packages.
+package load
+
+import (
+ "strings"
+)
+
+// isStandardImportPath reports whether $GOROOT/src/path should be considered
+// part of the standard distribution. For historical reasons we allow people to add
+// their own code to $GOROOT instead of using $GOPATH, but we assume that
+// code will start with a domain name (dot in the first element).
+func isStandardImportPath(path string) bool {
+ i := strings.Index(path, "/")
+ if i < 0 {
+ i = len(path)
+ }
+ elem := path[:i]
+ return !strings.Contains(elem, ".")
+}
diff --git a/vendor/github.com/kisielk/gotool/internal/load/search.go b/vendor/github.com/kisielk/gotool/internal/load/search.go
new file mode 100644
index 00000000000..17ed62ddae7
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/internal/load/search.go
@@ -0,0 +1,354 @@
+// 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.
+
+// +build go1.9
+
+package load
+
+import (
+ "fmt"
+ "go/build"
+ "log"
+ "os"
+ "path"
+ "path/filepath"
+ "regexp"
+ "strings"
+)
+
+// Context specifies values for operation of ImportPaths that would
+// otherwise come from cmd/go/internal/cfg package.
+//
+// This is a construct added for gotool purposes and doesn't have
+// an equivalent upstream in cmd/go.
+type Context struct {
+ // BuildContext is the build context to use.
+ BuildContext build.Context
+
+ // GOROOTsrc is the location of the src directory in GOROOT.
+ // At this time, it's used only in MatchPackages to skip
+ // GOOROOT/src entry from BuildContext.SrcDirs output.
+ GOROOTsrc string
+}
+
+// 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),
+// "cmd" (standard commands), or a path including "...".
+func (c *Context) allPackages(pattern string) []string {
+ pkgs := c.MatchPackages(pattern)
+ if len(pkgs) == 0 {
+ fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
+ }
+ 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 (c *Context) allPackagesInFS(pattern string) []string {
+ pkgs := c.MatchPackagesInFS(pattern)
+ if len(pkgs) == 0 {
+ fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
+ }
+ return pkgs
+}
+
+// MatchPackages returns a list of package paths matching pattern
+// (see go help packages for pattern syntax).
+func (c *Context) MatchPackages(pattern string) []string {
+ match := func(string) bool { return true }
+ treeCanMatch := func(string) bool { return true }
+ if !IsMetaPackage(pattern) {
+ match = matchPattern(pattern)
+ treeCanMatch = treeCanMatchPattern(pattern)
+ }
+
+ have := map[string]bool{
+ "builtin": true, // ignore pseudo-package that exists only for documentation
+ }
+ if !c.BuildContext.CgoEnabled {
+ have["runtime/cgo"] = true // ignore during walk
+ }
+ var pkgs []string
+
+ for _, src := range c.BuildContext.SrcDirs() {
+ if (pattern == "std" || pattern == "cmd") && src != c.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 || path == src {
+ return nil
+ }
+
+ want := true
+ // Avoid .foo, _foo, and testdata directory trees.
+ _, elem := filepath.Split(path)
+ if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
+ want = false
+ }
+
+ name := filepath.ToSlash(path[len(src):])
+ if pattern == "std" && (!isStandardImportPath(name) || name == "cmd") {
+ // The name "std" is only the standard library.
+ // If the name is cmd, it's the root of the command tree.
+ want = false
+ }
+ if !treeCanMatch(name) {
+ want = false
+ }
+
+ if !fi.IsDir() {
+ if fi.Mode()&os.ModeSymlink != 0 && want {
+ if target, err := os.Stat(path); err == nil && target.IsDir() {
+ fmt.Fprintf(os.Stderr, "warning: ignoring symlink %s\n", path)
+ }
+ }
+ return nil
+ }
+ if !want {
+ return filepath.SkipDir
+ }
+
+ if have[name] {
+ return nil
+ }
+ have[name] = true
+ if !match(name) {
+ return nil
+ }
+ pkg, err := c.BuildContext.ImportDir(path, 0)
+ if err != nil {
+ if _, noGo := err.(*build.NoGoError); noGo {
+ return nil
+ }
+ }
+
+ // If we are expanding "cmd", skip main
+ // packages under cmd/vendor. At least as of
+ // March, 2017, there is one there for the
+ // vendored pprof tool.
+ if pattern == "cmd" && strings.HasPrefix(pkg.ImportPath, "cmd/vendor") && pkg.Name == "main" {
+ return nil
+ }
+
+ pkgs = append(pkgs, name)
+ return nil
+ })
+ }
+ return pkgs
+}
+
+// MatchPackagesInFS returns a list of package paths matching pattern,
+// which must begin with ./ or ../
+// (see go help packages for pattern syntax).
+func (c *Context) 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; 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, and testdata directory trees, but do not avoid "." or "..".
+ _, elem := filepath.Split(path)
+ dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
+ if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
+ return filepath.SkipDir
+ }
+
+ name := prefix + filepath.ToSlash(path)
+ if !match(name) {
+ return nil
+ }
+
+ // We keep the directory if we can import it, or if we can't import it
+ // due to invalid Go source files. This means that directories containing
+ // parse errors will be built (and fail) instead of being silently skipped
+ // as not matching the pattern. Go 1.5 and earlier skipped, but that
+ // behavior means people miss serious mistakes.
+ // See golang.org/issue/11407.
+ if p, err := c.BuildContext.ImportDir(path, 0); err != nil && (p == nil || len(p.InvalidGoFiles) == 0) {
+ if _, noGo := err.(*build.NoGoError); !noGo {
+ log.Print(err)
+ }
+ return nil
+ }
+ pkgs = append(pkgs, name)
+ return nil
+ })
+ return pkgs
+}
+
+// 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)
+ }
+}
+
+// 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.
+// Unfortunately, there are two special cases. Quoting "go help packages":
+//
+// First, /... at the end of the pattern can match an empty string,
+// so that net/... matches both net and packages in its subdirectories, like net/http.
+// Second, any slash-separted pattern element containing a wildcard never
+// participates in a match of the "vendor" element in the path of a vendored
+// package, so that ./... does not match packages in subdirectories of
+// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do.
+// Note, however, that a directory named vendor that itself contains code
+// is not a vendored package: cmd/vendor would be a command named vendor,
+// and the pattern cmd/... matches it.
+func matchPattern(pattern string) func(name string) bool {
+ // Convert pattern to regular expression.
+ // The strategy for the trailing /... is to nest it in an explicit ? expression.
+ // The strategy for the vendor exclusion is to change the unmatchable
+ // vendor strings to a disallowed code point (vendorChar) and to use
+ // "(anything but that codepoint)*" as the implementation of the ... wildcard.
+ // This is a bit complicated but the obvious alternative,
+ // namely a hand-written search like in most shell glob matchers,
+ // is too easy to make accidentally exponential.
+ // Using package regexp guarantees linear-time matching.
+
+ const vendorChar = "\x00"
+
+ if strings.Contains(pattern, vendorChar) {
+ return func(name string) bool { return false }
+ }
+
+ re := regexp.QuoteMeta(pattern)
+ re = replaceVendor(re, vendorChar)
+ switch {
+ case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`):
+ re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)`
+ case re == vendorChar+`/\.\.\.`:
+ re = `(/vendor|/` + vendorChar + `/\.\.\.)`
+ case strings.HasSuffix(re, `/\.\.\.`):
+ re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?`
+ }
+ re = strings.Replace(re, `\.\.\.`, `[^`+vendorChar+`]*`, -1)
+
+ reg := regexp.MustCompile(`^` + re + `$`)
+
+ return func(name string) bool {
+ if strings.Contains(name, vendorChar) {
+ return false
+ }
+ return reg.MatchString(replaceVendor(name, vendorChar))
+ }
+}
+
+// replaceVendor returns the result of replacing
+// non-trailing vendor path elements in x with repl.
+func replaceVendor(x, repl string) string {
+ if !strings.Contains(x, "vendor") {
+ return x
+ }
+ elem := strings.Split(x, "/")
+ for i := 0; i < len(elem)-1; i++ {
+ if elem[i] == "vendor" {
+ elem[i] = repl
+ }
+ }
+ return strings.Join(elem, "/")
+}
+
+// ImportPaths returns the import paths to use for the given command line.
+func (c *Context) ImportPaths(args []string) []string {
+ args = c.ImportPathsNoDotExpansion(args)
+ var out []string
+ for _, a := range args {
+ if strings.Contains(a, "...") {
+ if build.IsLocalImport(a) {
+ out = append(out, c.allPackagesInFS(a)...)
+ } else {
+ out = append(out, c.allPackages(a)...)
+ }
+ continue
+ }
+ out = append(out, a)
+ }
+ return out
+}
+
+// ImportPathsNoDotExpansion returns the import paths to use for the given
+// command line, but it does no ... expansion.
+func (c *Context) 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 IsMetaPackage(a) {
+ out = append(out, c.allPackages(a)...)
+ continue
+ }
+ out = append(out, a)
+ }
+ return out
+}
+
+// IsMetaPackage checks if name is a reserved package name that expands to multiple packages.
+func IsMetaPackage(name string) bool {
+ return name == "std" || name == "cmd" || name == "all"
+}
diff --git a/vendor/github.com/kisielk/gotool/match.go b/vendor/github.com/kisielk/gotool/match.go
new file mode 100644
index 00000000000..4dbdbff47f9
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/match.go
@@ -0,0 +1,56 @@
+// 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.
+
+// +build go1.9
+
+package gotool
+
+import (
+ "path/filepath"
+
+ "github.com/kisielk/gotool/internal/load"
+)
+
+// importPaths returns the import paths to use for the given command line.
+func (c *Context) importPaths(args []string) []string {
+ lctx := load.Context{
+ BuildContext: c.BuildContext,
+ GOROOTsrc: c.joinPath(c.BuildContext.GOROOT, "src"),
+ }
+ return lctx.ImportPaths(args)
+}
+
+// joinPath calls c.BuildContext.JoinPath (if not nil) or else filepath.Join.
+//
+// It's a copy of the unexported build.Context.joinPath helper.
+func (c *Context) joinPath(elem ...string) string {
+ if f := c.BuildContext.JoinPath; f != nil {
+ return f(elem...)
+ }
+ return filepath.Join(elem...)
+}
diff --git a/vendor/github.com/kisielk/gotool/match18.go b/vendor/github.com/kisielk/gotool/match18.go
new file mode 100644
index 00000000000..6d6b1368c8d
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/match18.go
@@ -0,0 +1,317 @@
+// 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.
+
+// +build !go1.9
+
+package gotool
+
+import (
+ "fmt"
+ "go/build"
+ "log"
+ "os"
+ "path"
+ "path/filepath"
+ "regexp"
+ "strings"
+)
+
+// This file contains code from the Go distribution.
+
+// 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 reg.MatchString
+}
+
+// matchPackages returns a list of package paths matching pattern
+// (see go help packages for pattern syntax).
+func (c *Context) matchPackages(pattern string) []string {
+ match := func(string) bool { return true }
+ treeCanMatch := func(string) bool { return true }
+ if !isMetaPackage(pattern) {
+ match = matchPattern(pattern)
+ treeCanMatch = treeCanMatchPattern(pattern)
+ }
+
+ have := map[string]bool{
+ "builtin": true, // ignore pseudo-package that exists only for documentation
+ }
+ if !c.BuildContext.CgoEnabled {
+ have["runtime/cgo"] = true // ignore during walk
+ }
+ var pkgs []string
+
+ for _, src := range c.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, and testdata directory trees.
+ _, elem := filepath.Split(path)
+ if strings.HasPrefix(elem, ".") || strings.HasPrefix(elem, "_") || elem == "testdata" {
+ return filepath.SkipDir
+ }
+
+ name := filepath.ToSlash(path[len(src):])
+ if pattern == "std" && (!isStandardImportPath(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 = c.BuildContext.ImportDir(path, 0)
+ if err != nil {
+ if _, noGo := err.(*build.NoGoError); noGo {
+ return nil
+ }
+ }
+ pkgs = append(pkgs, name)
+ return nil
+ })
+ }
+ return pkgs
+}
+
+// importPathsNoDotExpansion returns the import paths to use for the given
+// command line, but it does no ... expansion.
+func (c *Context) 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 isMetaPackage(a) {
+ out = append(out, c.allPackages(a)...)
+ continue
+ }
+ out = append(out, a)
+ }
+ return out
+}
+
+// importPaths returns the import paths to use for the given command line.
+func (c *Context) importPaths(args []string) []string {
+ args = c.importPathsNoDotExpansion(args)
+ var out []string
+ for _, a := range args {
+ if strings.Contains(a, "...") {
+ if build.IsLocalImport(a) {
+ out = append(out, c.allPackagesInFS(a)...)
+ } else {
+ out = append(out, c.allPackages(a)...)
+ }
+ continue
+ }
+ out = append(out, a)
+ }
+ return out
+}
+
+// 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),
+// "cmd" (standard commands), or a path including "...".
+func (c *Context) allPackages(pattern string) []string {
+ pkgs := c.matchPackages(pattern)
+ if len(pkgs) == 0 {
+ fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
+ }
+ 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 (c *Context) allPackagesInFS(pattern string) []string {
+ pkgs := c.matchPackagesInFS(pattern)
+ if len(pkgs) == 0 {
+ fmt.Fprintf(os.Stderr, "warning: %q matched no packages\n", pattern)
+ }
+ return pkgs
+}
+
+// matchPackagesInFS returns a list of package paths matching pattern,
+// which must begin with ./ or ../
+// (see go help packages for pattern syntax).
+func (c *Context) 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; 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, and testdata directory trees, but do not avoid "." or "..".
+ _, elem := filepath.Split(path)
+ dot := strings.HasPrefix(elem, ".") && elem != "." && elem != ".."
+ if dot || strings.HasPrefix(elem, "_") || elem == "testdata" {
+ return filepath.SkipDir
+ }
+
+ name := prefix + filepath.ToSlash(path)
+ if !match(name) {
+ return nil
+ }
+
+ // We keep the directory if we can import it, or if we can't import it
+ // due to invalid Go source files. This means that directories containing
+ // parse errors will be built (and fail) instead of being silently skipped
+ // as not matching the pattern. Go 1.5 and earlier skipped, but that
+ // behavior means people miss serious mistakes.
+ // See golang.org/issue/11407.
+ if p, err := c.BuildContext.ImportDir(path, 0); err != nil && shouldIgnoreImport(p) {
+ if _, noGo := err.(*build.NoGoError); !noGo {
+ log.Print(err)
+ }
+ return nil
+ }
+ pkgs = append(pkgs, name)
+ return nil
+ })
+ return pkgs
+}
+
+// isMetaPackage checks if name is a reserved package name that expands to multiple packages.
+func isMetaPackage(name string) bool {
+ return name == "std" || name == "cmd" || name == "all"
+}
+
+// isStandardImportPath reports whether $GOROOT/src/path should be considered
+// part of the standard distribution. For historical reasons we allow people to add
+// their own code to $GOROOT instead of using $GOPATH, but we assume that
+// code will start with a domain name (dot in the first element).
+func isStandardImportPath(path string) bool {
+ i := strings.Index(path, "/")
+ if i < 0 {
+ i = len(path)
+ }
+ elem := path[:i]
+ return !strings.Contains(elem, ".")
+}
+
+// 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)
+ }
+}
diff --git a/vendor/github.com/kisielk/gotool/tool.go b/vendor/github.com/kisielk/gotool/tool.go
new file mode 100644
index 00000000000..c7409e11e6a
--- /dev/null
+++ b/vendor/github.com/kisielk/gotool/tool.go
@@ -0,0 +1,48 @@
+// Package gotool contains utility functions used to implement the standard
+// "cmd/go" tool, provided as a convenience to developers who want to write
+// tools with similar semantics.
+package gotool
+
+import "go/build"
+
+// Export functions here to make it easier to keep the implementations up to date with upstream.
+
+// DefaultContext is the default context that uses build.Default.
+var DefaultContext = Context{
+ BuildContext: build.Default,
+}
+
+// A Context specifies the supporting context.
+type Context struct {
+ // BuildContext is the build.Context that is used when computing import paths.
+ BuildContext build.Context
+}
+
+// ImportPaths returns the import paths to use for the given command line.
+//
+// The path "all" is expanded to all packages in $GOPATH and $GOROOT.
+// The path "std" is expanded to all packages in the Go standard library.
+// The path "cmd" is expanded to all Go standard commands.
+// The string "..." is treated as a wildcard within a path.
+// When matching recursively, directories are ignored if they are prefixed with
+// a dot or an underscore (such as ".foo" or "_foo"), or are named "testdata".
+// Relative import paths are not converted to full import paths.
+// If args is empty, a single element "." is returned.
+func (c *Context) ImportPaths(args []string) []string {
+ return c.importPaths(args)
+}
+
+// ImportPaths returns the import paths to use for the given command line
+// using default context.
+//
+// The path "all" is expanded to all packages in $GOPATH and $GOROOT.
+// The path "std" is expanded to all packages in the Go standard library.
+// The path "cmd" is expanded to all Go standard commands.
+// The string "..." is treated as a wildcard within a path.
+// When matching recursively, directories are ignored if they are prefixed with
+// a dot or an underscore (such as ".foo" or "_foo"), or are named "testdata".
+// Relative import paths are not converted to full import paths.
+// If args is empty, a single element "." is returned.
+func ImportPaths(args []string) []string {
+ return DefaultContext.importPaths(args)
+}
diff --git a/vendor/github.com/magiconair/properties/.gitignore b/vendor/github.com/magiconair/properties/.gitignore
new file mode 100644
index 00000000000..e7081ff522f
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/.gitignore
@@ -0,0 +1,6 @@
+*.sublime-project
+*.sublime-workspace
+*.un~
+*.swp
+.idea/
+*.iml
diff --git a/vendor/github.com/magiconair/properties/.travis.yml b/vendor/github.com/magiconair/properties/.travis.yml
new file mode 100644
index 00000000000..ab980390290
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - 1.4.x
+ - 1.5.x
+ - 1.6.x
+ - 1.7.x
+ - 1.8.x
+ - 1.9.x
+ - tip
diff --git a/vendor/github.com/magiconair/properties/CHANGELOG.md b/vendor/github.com/magiconair/properties/CHANGELOG.md
new file mode 100644
index 00000000000..adefa17e8aa
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/CHANGELOG.md
@@ -0,0 +1,123 @@
+## Changelog
+
+### [1.7.6](https://github.com/magiconair/properties/tree/v1.7.6) - 14 Feb 2018
+
+ * [PR #29](https://github.com/magiconair/properties/pull/29): Reworked expansion logic to handle more complex cases.
+
+ See PR for an example.
+
+ Thanks to [@yobert](https://github.com/yobert) for the fix.
+
+### [1.7.5](https://github.com/magiconair/properties/tree/v1.7.5) - 13 Feb 2018
+
+ * [PR #28](https://github.com/magiconair/properties/pull/28): Support duplicate expansions in the same value
+
+ Values which expand the same key multiple times (e.g. `key=${a} ${a}`) will no longer fail
+ with a `circular reference error`.
+
+ Thanks to [@yobert](https://github.com/yobert) for the fix.
+
+### [1.7.4](https://github.com/magiconair/properties/tree/v1.7.4) - 31 Oct 2017
+
+ * [Issue #23](https://github.com/magiconair/properties/issues/23): Ignore blank lines with whitespaces
+
+ * [PR #24](https://github.com/magiconair/properties/pull/24): Update keys when DisableExpansion is enabled
+
+ Thanks to [@mgurov](https://github.com/mgurov) for the fix.
+
+### [1.7.3](https://github.com/magiconair/properties/tree/v1.7.3) - 10 Jul 2017
+
+ * [Issue #17](https://github.com/magiconair/properties/issues/17): Add [SetValue()](http://godoc.org/github.com/magiconair/properties#Properties.SetValue) method to set values generically
+ * [Issue #22](https://github.com/magiconair/properties/issues/22): Add [LoadMap()](http://godoc.org/github.com/magiconair/properties#LoadMap) function to load properties from a string map
+
+### [1.7.2](https://github.com/magiconair/properties/tree/v1.7.2) - 20 Mar 2017
+
+ * [Issue #15](https://github.com/magiconair/properties/issues/15): Drop gocheck dependency
+ * [PR #21](https://github.com/magiconair/properties/pull/21): Add [Map()](http://godoc.org/github.com/magiconair/properties#Properties.Map) and [FilterFunc()](http://godoc.org/github.com/magiconair/properties#Properties.FilterFunc)
+
+### [1.7.1](https://github.com/magiconair/properties/tree/v1.7.1) - 13 Jan 2017
+
+ * [Issue #14](https://github.com/magiconair/properties/issues/14): Decouple TestLoadExpandedFile from `$USER`
+ * [PR #12](https://github.com/magiconair/properties/pull/12): Load from files and URLs
+ * [PR #16](https://github.com/magiconair/properties/pull/16): Keep gofmt happy
+ * [PR #18](https://github.com/magiconair/properties/pull/18): Fix Delete() function
+
+### [1.7.0](https://github.com/magiconair/properties/tree/v1.7.0) - 20 Mar 2016
+
+ * [Issue #10](https://github.com/magiconair/properties/issues/10): Add [LoadURL,LoadURLs,MustLoadURL,MustLoadURLs](http://godoc.org/github.com/magiconair/properties#LoadURL) method to load properties from a URL.
+ * [Issue #11](https://github.com/magiconair/properties/issues/11): Add [LoadString,MustLoadString](http://godoc.org/github.com/magiconair/properties#LoadString) method to load properties from an UTF8 string.
+ * [PR #8](https://github.com/magiconair/properties/pull/8): Add [MustFlag](http://godoc.org/github.com/magiconair/properties#Properties.MustFlag) method to provide overrides via command line flags. (@pascaldekloe)
+
+### [1.6.0](https://github.com/magiconair/properties/tree/v1.6.0) - 11 Dec 2015
+
+ * Add [Decode](http://godoc.org/github.com/magiconair/properties#Properties.Decode) method to populate struct from properties via tags.
+
+### [1.5.6](https://github.com/magiconair/properties/tree/v1.5.6) - 18 Oct 2015
+
+ * Vendored in gopkg.in/check.v1
+
+### [1.5.5](https://github.com/magiconair/properties/tree/v1.5.5) - 31 Jul 2015
+
+ * [PR #6](https://github.com/magiconair/properties/pull/6): Add [Delete](http://godoc.org/github.com/magiconair/properties#Properties.Delete) method to remove keys including comments. (@gerbenjacobs)
+
+### [1.5.4](https://github.com/magiconair/properties/tree/v1.5.4) - 23 Jun 2015
+
+ * [Issue #5](https://github.com/magiconair/properties/issues/5): Allow disabling of property expansion [DisableExpansion](http://godoc.org/github.com/magiconair/properties#Properties.DisableExpansion). When property expansion is disabled Properties become a simple key/value store and don't check for circular references.
+
+### [1.5.3](https://github.com/magiconair/properties/tree/v1.5.3) - 02 Jun 2015
+
+ * [Issue #4](https://github.com/magiconair/properties/issues/4): Maintain key order in [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) and [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp)
+
+### [1.5.2](https://github.com/magiconair/properties/tree/v1.5.2) - 10 Apr 2015
+
+ * [Issue #3](https://github.com/magiconair/properties/issues/3): Don't print comments in [WriteComment()](http://godoc.org/github.com/magiconair/properties#Properties.WriteComment) if they are all empty
+ * Add clickable links to README
+
+### [1.5.1](https://github.com/magiconair/properties/tree/v1.5.1) - 08 Dec 2014
+
+ * Added [GetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.GetParsedDuration) and [MustGetParsedDuration()](http://godoc.org/github.com/magiconair/properties#Properties.MustGetParsedDuration) for values specified compatible with
+ [time.ParseDuration()](http://golang.org/pkg/time/#ParseDuration).
+
+### [1.5.0](https://github.com/magiconair/properties/tree/v1.5.0) - 18 Nov 2014
+
+ * Added support for single and multi-line comments (reading, writing and updating)
+ * The order of keys is now preserved
+ * Calling [Set()](http://godoc.org/github.com/magiconair/properties#Properties.Set) with an empty key now silently ignores the call and does not create a new entry
+ * Added a [MustSet()](http://godoc.org/github.com/magiconair/properties#Properties.MustSet) method
+ * Migrated test library from launchpad.net/gocheck to [gopkg.in/check.v1](http://gopkg.in/check.v1)
+
+### [1.4.2](https://github.com/magiconair/properties/tree/v1.4.2) - 15 Nov 2014
+
+ * [Issue #2](https://github.com/magiconair/properties/issues/2): Fixed goroutine leak in parser which created two lexers but cleaned up only one
+
+### [1.4.1](https://github.com/magiconair/properties/tree/v1.4.1) - 13 Nov 2014
+
+ * [Issue #1](https://github.com/magiconair/properties/issues/1): Fixed bug in Keys() method which returned an empty string
+
+### [1.4.0](https://github.com/magiconair/properties/tree/v1.4.0) - 23 Sep 2014
+
+ * Added [Keys()](http://godoc.org/github.com/magiconair/properties#Properties.Keys) to get the keys
+ * Added [Filter()](http://godoc.org/github.com/magiconair/properties#Properties.Filter), [FilterRegexp()](http://godoc.org/github.com/magiconair/properties#Properties.FilterRegexp) and [FilterPrefix()](http://godoc.org/github.com/magiconair/properties#Properties.FilterPrefix) to get a subset of the properties
+
+### [1.3.0](https://github.com/magiconair/properties/tree/v1.3.0) - 18 Mar 2014
+
+* Added support for time.Duration
+* Made MustXXX() failure beha[ior configurable (log.Fatal, panic](https://github.com/magiconair/properties/tree/vior configurable (log.Fatal, panic) - custom)
+* Changed default of MustXXX() failure from panic to log.Fatal
+
+### [1.2.0](https://github.com/magiconair/properties/tree/v1.2.0) - 05 Mar 2014
+
+* Added MustGet... functions
+* Added support for int and uint with range checks on 32 bit platforms
+
+### [1.1.0](https://github.com/magiconair/properties/tree/v1.1.0) - 20 Jan 2014
+
+* Renamed from goproperties to properties
+* Added support for expansion of environment vars in
+ filenames and value expressions
+* Fixed bug where value expressions were not at the
+ start of the string
+
+### [1.0.0](https://github.com/magiconair/properties/tree/v1.0.0) - 7 Jan 2014
+
+* Initial release
diff --git a/vendor/github.com/magiconair/properties/LICENSE b/vendor/github.com/magiconair/properties/LICENSE
new file mode 100644
index 00000000000..b387087c556
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/LICENSE
@@ -0,0 +1,25 @@
+goproperties - properties file decoder for Go
+
+Copyright (c) 2013-2018 - Frank Schroeder
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+2. 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.
+
+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/magiconair/properties/README.md b/vendor/github.com/magiconair/properties/README.md
new file mode 100644
index 00000000000..15dfde5cb36
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/README.md
@@ -0,0 +1,128 @@
+[![](https://img.shields.io/github/tag/magiconair/properties.svg?style=flat-square&label=release)](https://github.com/magiconair/properties/releases)
+[![Build Status](https://img.shields.io/travis/magiconair/properties.svg?branch=master&style=flat-square)](https://travis-ci.org/magiconair/properties)
+[![License](https://img.shields.io/badge/License-BSD%202--Clause-orange.svg?style=flat-square)](https://raw.githubusercontent.com/magiconair/properties/master/LICENSE)
+[![GoDoc](http://img.shields.io/badge/godoc-reference-5272B4.svg?style=flat-square)](http://godoc.org/github.com/magiconair/properties)
+
+# Overview
+
+#### Please run `git pull --tags` to update the tags. See [below](#updated-git-tags) why.
+
+properties is a Go library for reading and writing properties files.
+
+It supports reading from multiple files or URLs and Spring style recursive
+property expansion of expressions like `${key}` to their corresponding value.
+Value expressions can refer to other keys like in `${key}` or to environment
+variables like in `${USER}`. Filenames can also contain environment variables
+like in `/home/${USER}/myapp.properties`.
+
+Properties can be decoded into structs, maps, arrays and values through
+struct tags.
+
+Comments and the order of keys are preserved. Comments can be modified
+and can be written to the output.
+
+The properties library supports both ISO-8859-1 and UTF-8 encoded data.
+
+Starting from version 1.3.0 the behavior of the MustXXX() functions is
+configurable by providing a custom `ErrorHandler` function. The default has
+changed from `panic` to `log.Fatal` but this is configurable and custom
+error handling functions can be provided. See the package documentation for
+details.
+
+Read the full documentation on [GoDoc](https://godoc.org/github.com/magiconair/properties) [![GoDoc](https://godoc.org/github.com/magiconair/properties?status.png)](https://godoc.org/github.com/magiconair/properties)
+
+## Getting Started
+
+```go
+import (
+ "flag"
+ "github.com/magiconair/properties"
+)
+
+func main() {
+ // init from a file
+ p := properties.MustLoadFile("${HOME}/config.properties", properties.UTF8)
+
+ // or multiple files
+ p = properties.MustLoadFiles([]string{
+ "${HOME}/config.properties",
+ "${HOME}/config-${USER}.properties",
+ }, properties.UTF8, true)
+
+ // or from a map
+ p = properties.LoadMap(map[string]string{"key": "value", "abc": "def"})
+
+ // or from a string
+ p = properties.MustLoadString("key=value\nabc=def")
+
+ // or from a URL
+ p = properties.MustLoadURL("http://host/path")
+
+ // or from multiple URLs
+ p = properties.MustLoadURL([]string{
+ "http://host/config",
+ "http://host/config-${USER}",
+ }, true)
+
+ // or from flags
+ p.MustFlag(flag.CommandLine)
+
+ // get values through getters
+ host := p.MustGetString("host")
+ port := p.GetInt("port", 8080)
+
+ // or through Decode
+ type Config struct {
+ Host string `properties:"host"`
+ Port int `properties:"port,default=9000"`
+ Accept []string `properties:"accept,default=image/png;image;gif"`
+ Timeout time.Duration `properties:"timeout,default=5s"`
+ }
+ var cfg Config
+ if err := p.Decode(&cfg); err != nil {
+ log.Fatal(err)
+ }
+}
+
+```
+
+## Installation and Upgrade
+
+```
+$ go get -u github.com/magiconair/properties
+```
+
+## License
+
+2 clause BSD license. See [LICENSE](https://github.com/magiconair/properties/blob/master/LICENSE) file for details.
+
+## ToDo
+
+* Dump contents with passwords and secrets obscured
+
+## Updated Git tags
+
+#### 13 Feb 2018
+
+I realized that all of the git tags I had pushed before v1.7.5 were lightweight tags
+and I've only recently learned that this doesn't play well with `git describe` 😞
+
+I have replaced all lightweight tags with signed tags using this script which should
+retain the commit date, name and email address. Please run `git pull --tags` to update them.
+
+Worst case you have to reclone the repo.
+
+```shell
+#!/bin/bash
+tag=$1
+echo "Updating $tag"
+date=$(git show ${tag}^0 --format=%aD | head -1)
+email=$(git show ${tag}^0 --format=%aE | head -1)
+name=$(git show ${tag}^0 --format=%aN | head -1)
+GIT_COMMITTER_DATE="$date" GIT_COMMITTER_NAME="$name" GIT_COMMITTER_EMAIL="$email" git tag -s -f ${tag} ${tag}^0 -m ${tag}
+```
+
+I apologize for the inconvenience.
+
+Frank
+
diff --git a/vendor/github.com/magiconair/properties/decode.go b/vendor/github.com/magiconair/properties/decode.go
new file mode 100644
index 00000000000..0a961bb0443
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/decode.go
@@ -0,0 +1,289 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package properties
+
+import (
+ "fmt"
+ "reflect"
+ "strconv"
+ "strings"
+ "time"
+)
+
+// Decode assigns property values to exported fields of a struct.
+//
+// Decode traverses v recursively and returns an error if a value cannot be
+// converted to the field type or a required value is missing for a field.
+//
+// The following type dependent decodings are used:
+//
+// String, boolean, numeric fields have the value of the property key assigned.
+// The property key name is the name of the field. A different key and a default
+// value can be set in the field's tag. Fields without default value are
+// required. If the value cannot be converted to the field type an error is
+// returned.
+//
+// time.Duration fields have the result of time.ParseDuration() assigned.
+//
+// time.Time fields have the vaule of time.Parse() assigned. The default layout
+// is time.RFC3339 but can be set in the field's tag.
+//
+// Arrays and slices of string, boolean, numeric, time.Duration and time.Time
+// fields have the value interpreted as a comma separated list of values. The
+// individual values are trimmed of whitespace and empty values are ignored. A
+// default value can be provided as a semicolon separated list in the field's
+// tag.
+//
+// Struct fields are decoded recursively using the field name plus "." as
+// prefix. The prefix (without dot) can be overridden in the field's tag.
+// Default values are not supported in the field's tag. Specify them on the
+// fields of the inner struct instead.
+//
+// Map fields must have a key of type string and are decoded recursively by
+// using the field's name plus ".' as prefix and the next element of the key
+// name as map key. The prefix (without dot) can be overridden in the field's
+// tag. Default values are not supported.
+//
+// Examples:
+//
+// // Field is ignored.
+// Field int `properties:"-"`
+//
+// // Field is assigned value of 'Field'.
+// Field int
+//
+// // Field is assigned value of 'myName'.
+// Field int `properties:"myName"`
+//
+// // Field is assigned value of key 'myName' and has a default
+// // value 15 if the key does not exist.
+// Field int `properties:"myName,default=15"`
+//
+// // Field is assigned value of key 'Field' and has a default
+// // value 15 if the key does not exist.
+// Field int `properties:",default=15"`
+//
+// // Field is assigned value of key 'date' and the date
+// // is in format 2006-01-02
+// Field time.Time `properties:"date,layout=2006-01-02"`
+//
+// // Field is assigned the non-empty and whitespace trimmed
+// // values of key 'Field' split by commas.
+// Field []string
+//
+// // Field is assigned the non-empty and whitespace trimmed
+// // values of key 'Field' split by commas and has a default
+// // value ["a", "b", "c"] if the key does not exist.
+// Field []string `properties:",default=a;b;c"`
+//
+// // Field is decoded recursively with "Field." as key prefix.
+// Field SomeStruct
+//
+// // Field is decoded recursively with "myName." as key prefix.
+// Field SomeStruct `properties:"myName"`
+//
+// // Field is decoded recursively with "Field." as key prefix
+// // and the next dotted element of the key as map key.
+// Field map[string]string
+//
+// // Field is decoded recursively with "myName." as key prefix
+// // and the next dotted element of the key as map key.
+// Field map[string]string `properties:"myName"`
+func (p *Properties) Decode(x interface{}) error {
+ t, v := reflect.TypeOf(x), reflect.ValueOf(x)
+ if t.Kind() != reflect.Ptr || v.Elem().Type().Kind() != reflect.Struct {
+ return fmt.Errorf("not a pointer to struct: %s", t)
+ }
+ if err := dec(p, "", nil, nil, v); err != nil {
+ return err
+ }
+ return nil
+}
+
+func dec(p *Properties, key string, def *string, opts map[string]string, v reflect.Value) error {
+ t := v.Type()
+
+ // value returns the property value for key or the default if provided.
+ value := func() (string, error) {
+ if val, ok := p.Get(key); ok {
+ return val, nil
+ }
+ if def != nil {
+ return *def, nil
+ }
+ return "", fmt.Errorf("missing required key %s", key)
+ }
+
+ // conv converts a string to a value of the given type.
+ conv := func(s string, t reflect.Type) (val reflect.Value, err error) {
+ var v interface{}
+
+ switch {
+ case isDuration(t):
+ v, err = time.ParseDuration(s)
+
+ case isTime(t):
+ layout := opts["layout"]
+ if layout == "" {
+ layout = time.RFC3339
+ }
+ v, err = time.Parse(layout, s)
+
+ case isBool(t):
+ v, err = boolVal(s), nil
+
+ case isString(t):
+ v, err = s, nil
+
+ case isFloat(t):
+ v, err = strconv.ParseFloat(s, 64)
+
+ case isInt(t):
+ v, err = strconv.ParseInt(s, 10, 64)
+
+ case isUint(t):
+ v, err = strconv.ParseUint(s, 10, 64)
+
+ default:
+ return reflect.Zero(t), fmt.Errorf("unsupported type %s", t)
+ }
+ if err != nil {
+ return reflect.Zero(t), err
+ }
+ return reflect.ValueOf(v).Convert(t), nil
+ }
+
+ // keydef returns the property key and the default value based on the
+ // name of the struct field and the options in the tag.
+ keydef := func(f reflect.StructField) (string, *string, map[string]string) {
+ _key, _opts := parseTag(f.Tag.Get("properties"))
+
+ var _def *string
+ if d, ok := _opts["default"]; ok {
+ _def = &d
+ }
+ if _key != "" {
+ return _key, _def, _opts
+ }
+ return f.Name, _def, _opts
+ }
+
+ switch {
+ case isDuration(t) || isTime(t) || isBool(t) || isString(t) || isFloat(t) || isInt(t) || isUint(t):
+ s, err := value()
+ if err != nil {
+ return err
+ }
+ val, err := conv(s, t)
+ if err != nil {
+ return err
+ }
+ v.Set(val)
+
+ case isPtr(t):
+ return dec(p, key, def, opts, v.Elem())
+
+ case isStruct(t):
+ for i := 0; i < v.NumField(); i++ {
+ fv := v.Field(i)
+ fk, def, opts := keydef(t.Field(i))
+ if !fv.CanSet() {
+ return fmt.Errorf("cannot set %s", t.Field(i).Name)
+ }
+ if fk == "-" {
+ continue
+ }
+ if key != "" {
+ fk = key + "." + fk
+ }
+ if err := dec(p, fk, def, opts, fv); err != nil {
+ return err
+ }
+ }
+ return nil
+
+ case isArray(t):
+ val, err := value()
+ if err != nil {
+ return err
+ }
+ vals := split(val, ";")
+ a := reflect.MakeSlice(t, 0, len(vals))
+ for _, s := range vals {
+ val, err := conv(s, t.Elem())
+ if err != nil {
+ return err
+ }
+ a = reflect.Append(a, val)
+ }
+ v.Set(a)
+
+ case isMap(t):
+ valT := t.Elem()
+ m := reflect.MakeMap(t)
+ for postfix := range p.FilterStripPrefix(key + ".").m {
+ pp := strings.SplitN(postfix, ".", 2)
+ mk, mv := pp[0], reflect.New(valT)
+ if err := dec(p, key+"."+mk, nil, nil, mv); err != nil {
+ return err
+ }
+ m.SetMapIndex(reflect.ValueOf(mk), mv.Elem())
+ }
+ v.Set(m)
+
+ default:
+ return fmt.Errorf("unsupported type %s", t)
+ }
+ return nil
+}
+
+// split splits a string on sep, trims whitespace of elements
+// and omits empty elements
+func split(s string, sep string) []string {
+ var a []string
+ for _, v := range strings.Split(s, sep) {
+ if v = strings.TrimSpace(v); v != "" {
+ a = append(a, v)
+ }
+ }
+ return a
+}
+
+// parseTag parses a "key,k=v,k=v,..."
+func parseTag(tag string) (key string, opts map[string]string) {
+ opts = map[string]string{}
+ for i, s := range strings.Split(tag, ",") {
+ if i == 0 {
+ key = s
+ continue
+ }
+
+ pp := strings.SplitN(s, "=", 2)
+ if len(pp) == 1 {
+ opts[pp[0]] = ""
+ } else {
+ opts[pp[0]] = pp[1]
+ }
+ }
+ return key, opts
+}
+
+func isArray(t reflect.Type) bool { return t.Kind() == reflect.Array || t.Kind() == reflect.Slice }
+func isBool(t reflect.Type) bool { return t.Kind() == reflect.Bool }
+func isDuration(t reflect.Type) bool { return t == reflect.TypeOf(time.Second) }
+func isMap(t reflect.Type) bool { return t.Kind() == reflect.Map }
+func isPtr(t reflect.Type) bool { return t.Kind() == reflect.Ptr }
+func isString(t reflect.Type) bool { return t.Kind() == reflect.String }
+func isStruct(t reflect.Type) bool { return t.Kind() == reflect.Struct }
+func isTime(t reflect.Type) bool { return t == reflect.TypeOf(time.Time{}) }
+func isFloat(t reflect.Type) bool {
+ return t.Kind() == reflect.Float32 || t.Kind() == reflect.Float64
+}
+func isInt(t reflect.Type) bool {
+ return t.Kind() == reflect.Int || t.Kind() == reflect.Int8 || t.Kind() == reflect.Int16 || t.Kind() == reflect.Int32 || t.Kind() == reflect.Int64
+}
+func isUint(t reflect.Type) bool {
+ return t.Kind() == reflect.Uint || t.Kind() == reflect.Uint8 || t.Kind() == reflect.Uint16 || t.Kind() == reflect.Uint32 || t.Kind() == reflect.Uint64
+}
diff --git a/vendor/github.com/magiconair/properties/doc.go b/vendor/github.com/magiconair/properties/doc.go
new file mode 100644
index 00000000000..36c8368089f
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/doc.go
@@ -0,0 +1,156 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// Package properties provides functions for reading and writing
+// ISO-8859-1 and UTF-8 encoded .properties files and has
+// support for recursive property expansion.
+//
+// Java properties files are ISO-8859-1 encoded and use Unicode
+// literals for characters outside the ISO character set. Unicode
+// literals can be used in UTF-8 encoded properties files but
+// aren't necessary.
+//
+// To load a single properties file use MustLoadFile():
+//
+// p := properties.MustLoadFile(filename, properties.UTF8)
+//
+// To load multiple properties files use MustLoadFiles()
+// which loads the files in the given order and merges the
+// result. Missing properties files can be ignored if the
+// 'ignoreMissing' flag is set to true.
+//
+// Filenames can contain environment variables which are expanded
+// before loading.
+//
+// f1 := "/etc/myapp/myapp.conf"
+// f2 := "/home/${USER}/myapp.conf"
+// p := MustLoadFiles([]string{f1, f2}, properties.UTF8, true)
+//
+// All of the different key/value delimiters ' ', ':' and '=' are
+// supported as well as the comment characters '!' and '#' and
+// multi-line values.
+//
+// ! this is a comment
+// # and so is this
+//
+// # the following expressions are equal
+// key value
+// key=value
+// key:value
+// key = value
+// key : value
+// key = val\
+// ue
+//
+// Properties stores all comments preceding a key and provides
+// GetComments() and SetComments() methods to retrieve and
+// update them. The convenience functions GetComment() and
+// SetComment() allow access to the last comment. The
+// WriteComment() method writes properties files including
+// the comments and with the keys in the original order.
+// This can be used for sanitizing properties files.
+//
+// Property expansion is recursive and circular references
+// and malformed expressions are not allowed and cause an
+// error. Expansion of environment variables is supported.
+//
+// # standard property
+// key = value
+//
+// # property expansion: key2 = value
+// key2 = ${key}
+//
+// # recursive expansion: key3 = value
+// key3 = ${key2}
+//
+// # circular reference (error)
+// key = ${key}
+//
+// # malformed expression (error)
+// key = ${ke
+//
+// # refers to the users' home dir
+// home = ${HOME}
+//
+// # local key takes precendence over env var: u = foo
+// USER = foo
+// u = ${USER}
+//
+// The default property expansion format is ${key} but can be
+// changed by setting different pre- and postfix values on the
+// Properties object.
+//
+// p := properties.NewProperties()
+// p.Prefix = "#["
+// p.Postfix = "]#"
+//
+// Properties provides convenience functions for getting typed
+// values with default values if the key does not exist or the
+// type conversion failed.
+//
+// # Returns true if the value is either "1", "on", "yes" or "true"
+// # Returns false for every other value and the default value if
+// # the key does not exist.
+// v = p.GetBool("key", false)
+//
+// # Returns the value if the key exists and the format conversion
+// # was successful. Otherwise, the default value is returned.
+// v = p.GetInt64("key", 999)
+// v = p.GetUint64("key", 999)
+// v = p.GetFloat64("key", 123.0)
+// v = p.GetString("key", "def")
+// v = p.GetDuration("key", 999)
+//
+// As an alterantive properties may be applied with the standard
+// library's flag implementation at any time.
+//
+// # Standard configuration
+// v = flag.Int("key", 999, "help message")
+// flag.Parse()
+//
+// # Merge p into the flag set
+// p.MustFlag(flag.CommandLine)
+//
+// Properties provides several MustXXX() convenience functions
+// which will terminate the app if an error occurs. The behavior
+// of the failure is configurable and the default is to call
+// log.Fatal(err). To have the MustXXX() functions panic instead
+// of logging the error set a different ErrorHandler before
+// you use the Properties package.
+//
+// properties.ErrorHandler = properties.PanicHandler
+//
+// # Will panic instead of logging an error
+// p := properties.MustLoadFile("config.properties")
+//
+// You can also provide your own ErrorHandler function. The only requirement
+// is that the error handler function must exit after handling the error.
+//
+// properties.ErrorHandler = func(err error) {
+// fmt.Println(err)
+// os.Exit(1)
+// }
+//
+// # Will write to stdout and then exit
+// p := properties.MustLoadFile("config.properties")
+//
+// Properties can also be loaded into a struct via the `Decode`
+// method, e.g.
+//
+// type S struct {
+// A string `properties:"a,default=foo"`
+// D time.Duration `properties:"timeout,default=5s"`
+// E time.Time `properties:"expires,layout=2006-01-02,default=2015-01-01"`
+// }
+//
+// See `Decode()` method for the full documentation.
+//
+// The following documents provide a description of the properties
+// file format.
+//
+// http://en.wikipedia.org/wiki/.properties
+//
+// http://docs.oracle.com/javase/7/docs/api/java/util/Properties.html#load%28java.io.Reader%29
+//
+package properties
diff --git a/vendor/github.com/magiconair/properties/integrate.go b/vendor/github.com/magiconair/properties/integrate.go
new file mode 100644
index 00000000000..0d775e0350b
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/integrate.go
@@ -0,0 +1,34 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package properties
+
+import "flag"
+
+// MustFlag sets flags that are skipped by dst.Parse when p contains
+// the respective key for flag.Flag.Name.
+//
+// It's use is recommended with command line arguments as in:
+// flag.Parse()
+// p.MustFlag(flag.CommandLine)
+func (p *Properties) MustFlag(dst *flag.FlagSet) {
+ m := make(map[string]*flag.Flag)
+ dst.VisitAll(func(f *flag.Flag) {
+ m[f.Name] = f
+ })
+ dst.Visit(func(f *flag.Flag) {
+ delete(m, f.Name) // overridden
+ })
+
+ for name, f := range m {
+ v, ok := p.Get(name)
+ if !ok {
+ continue
+ }
+
+ if err := f.Value.Set(v); err != nil {
+ ErrorHandler(err)
+ }
+ }
+}
diff --git a/vendor/github.com/magiconair/properties/lex.go b/vendor/github.com/magiconair/properties/lex.go
new file mode 100644
index 00000000000..c63fcc60d7a
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/lex.go
@@ -0,0 +1,407 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+//
+// Parts of the lexer are from the template/text/parser package
+// For these parts the following applies:
+//
+// 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 of the go 1.2
+// distribution.
+
+package properties
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+ "unicode/utf8"
+)
+
+// item represents a token or text string returned from the scanner.
+type item struct {
+ typ itemType // The type of this item.
+ pos int // The starting position, in bytes, of this item in the input string.
+ val string // The value of this item.
+}
+
+func (i item) String() string {
+ switch {
+ case i.typ == itemEOF:
+ return "EOF"
+ case i.typ == itemError:
+ return i.val
+ case len(i.val) > 10:
+ return fmt.Sprintf("%.10q...", i.val)
+ }
+ return fmt.Sprintf("%q", i.val)
+}
+
+// itemType identifies the type of lex items.
+type itemType int
+
+const (
+ itemError itemType = iota // error occurred; value is text of error
+ itemEOF
+ itemKey // a key
+ itemValue // a value
+ itemComment // a comment
+)
+
+// defines a constant for EOF
+const eof = -1
+
+// permitted whitespace characters space, FF and TAB
+const whitespace = " \f\t"
+
+// stateFn represents the state of the scanner as a function that returns the next state.
+type stateFn func(*lexer) stateFn
+
+// lexer holds the state of the scanner.
+type lexer struct {
+ input string // the string being scanned
+ state stateFn // the next lexing function to enter
+ pos int // current position in the input
+ start int // start position of this item
+ width int // width of last rune read from input
+ lastPos int // position of most recent item returned by nextItem
+ runes []rune // scanned runes for this item
+ items chan item // channel of scanned items
+}
+
+// next returns the next rune in the input.
+func (l *lexer) next() rune {
+ if l.pos >= len(l.input) {
+ l.width = 0
+ return eof
+ }
+ r, w := utf8.DecodeRuneInString(l.input[l.pos:])
+ l.width = w
+ l.pos += l.width
+ return r
+}
+
+// peek returns but does not consume the next rune in the input.
+func (l *lexer) peek() rune {
+ r := l.next()
+ l.backup()
+ return r
+}
+
+// backup steps back one rune. Can only be called once per call of next.
+func (l *lexer) backup() {
+ l.pos -= l.width
+}
+
+// emit passes an item back to the client.
+func (l *lexer) emit(t itemType) {
+ i := item{t, l.start, string(l.runes)}
+ l.items <- i
+ l.start = l.pos
+ l.runes = l.runes[:0]
+}
+
+// ignore skips over the pending input before this point.
+func (l *lexer) ignore() {
+ l.start = l.pos
+}
+
+// appends the rune to the current value
+func (l *lexer) appendRune(r rune) {
+ l.runes = append(l.runes, r)
+}
+
+// accept consumes the next rune if it's from the valid set.
+func (l *lexer) accept(valid string) bool {
+ if strings.ContainsRune(valid, l.next()) {
+ return true
+ }
+ l.backup()
+ return false
+}
+
+// acceptRun consumes a run of runes from the valid set.
+func (l *lexer) acceptRun(valid string) {
+ for strings.ContainsRune(valid, l.next()) {
+ }
+ l.backup()
+}
+
+// acceptRunUntil consumes a run of runes up to a terminator.
+func (l *lexer) acceptRunUntil(term rune) {
+ for term != l.next() {
+ }
+ l.backup()
+}
+
+// hasText returns true if the current parsed text is not empty.
+func (l *lexer) isNotEmpty() bool {
+ return l.pos > l.start
+}
+
+// lineNumber reports which line we're on, based on the position of
+// the previous item returned by nextItem. Doing it this way
+// means we don't have to worry about peek double counting.
+func (l *lexer) lineNumber() int {
+ return 1 + strings.Count(l.input[:l.lastPos], "\n")
+}
+
+// errorf returns an error token and terminates the scan by passing
+// back a nil pointer that will be the next state, terminating l.nextItem.
+func (l *lexer) errorf(format string, args ...interface{}) stateFn {
+ l.items <- item{itemError, l.start, fmt.Sprintf(format, args...)}
+ return nil
+}
+
+// nextItem returns the next item from the input.
+func (l *lexer) nextItem() item {
+ i := <-l.items
+ l.lastPos = i.pos
+ return i
+}
+
+// lex creates a new scanner for the input string.
+func lex(input string) *lexer {
+ l := &lexer{
+ input: input,
+ items: make(chan item),
+ runes: make([]rune, 0, 32),
+ }
+ go l.run()
+ return l
+}
+
+// run runs the state machine for the lexer.
+func (l *lexer) run() {
+ for l.state = lexBeforeKey(l); l.state != nil; {
+ l.state = l.state(l)
+ }
+}
+
+// state functions
+
+// lexBeforeKey scans until a key begins.
+func lexBeforeKey(l *lexer) stateFn {
+ switch r := l.next(); {
+ case isEOF(r):
+ l.emit(itemEOF)
+ return nil
+
+ case isEOL(r):
+ l.ignore()
+ return lexBeforeKey
+
+ case isComment(r):
+ return lexComment
+
+ case isWhitespace(r):
+ l.ignore()
+ return lexBeforeKey
+
+ default:
+ l.backup()
+ return lexKey
+ }
+}
+
+// lexComment scans a comment line. The comment character has already been scanned.
+func lexComment(l *lexer) stateFn {
+ l.acceptRun(whitespace)
+ l.ignore()
+ for {
+ switch r := l.next(); {
+ case isEOF(r):
+ l.ignore()
+ l.emit(itemEOF)
+ return nil
+ case isEOL(r):
+ l.emit(itemComment)
+ return lexBeforeKey
+ default:
+ l.appendRune(r)
+ }
+ }
+}
+
+// lexKey scans the key up to a delimiter
+func lexKey(l *lexer) stateFn {
+ var r rune
+
+Loop:
+ for {
+ switch r = l.next(); {
+
+ case isEscape(r):
+ err := l.scanEscapeSequence()
+ if err != nil {
+ return l.errorf(err.Error())
+ }
+
+ case isEndOfKey(r):
+ l.backup()
+ break Loop
+
+ case isEOF(r):
+ break Loop
+
+ default:
+ l.appendRune(r)
+ }
+ }
+
+ if len(l.runes) > 0 {
+ l.emit(itemKey)
+ }
+
+ if isEOF(r) {
+ l.emit(itemEOF)
+ return nil
+ }
+
+ return lexBeforeValue
+}
+
+// lexBeforeValue scans the delimiter between key and value.
+// Leading and trailing whitespace is ignored.
+// We expect to be just after the key.
+func lexBeforeValue(l *lexer) stateFn {
+ l.acceptRun(whitespace)
+ l.accept(":=")
+ l.acceptRun(whitespace)
+ l.ignore()
+ return lexValue
+}
+
+// lexValue scans text until the end of the line. We expect to be just after the delimiter.
+func lexValue(l *lexer) stateFn {
+ for {
+ switch r := l.next(); {
+ case isEscape(r):
+ if isEOL(l.peek()) {
+ l.next()
+ l.acceptRun(whitespace)
+ } else {
+ err := l.scanEscapeSequence()
+ if err != nil {
+ return l.errorf(err.Error())
+ }
+ }
+
+ case isEOL(r):
+ l.emit(itemValue)
+ l.ignore()
+ return lexBeforeKey
+
+ case isEOF(r):
+ l.emit(itemValue)
+ l.emit(itemEOF)
+ return nil
+
+ default:
+ l.appendRune(r)
+ }
+ }
+}
+
+// scanEscapeSequence scans either one of the escaped characters
+// or a unicode literal. We expect to be after the escape character.
+func (l *lexer) scanEscapeSequence() error {
+ switch r := l.next(); {
+
+ case isEscapedCharacter(r):
+ l.appendRune(decodeEscapedCharacter(r))
+ return nil
+
+ case atUnicodeLiteral(r):
+ return l.scanUnicodeLiteral()
+
+ case isEOF(r):
+ return fmt.Errorf("premature EOF")
+
+ // silently drop the escape character and append the rune as is
+ default:
+ l.appendRune(r)
+ return nil
+ }
+}
+
+// scans a unicode literal in the form \uXXXX. We expect to be after the \u.
+func (l *lexer) scanUnicodeLiteral() error {
+ // scan the digits
+ d := make([]rune, 4)
+ for i := 0; i < 4; i++ {
+ d[i] = l.next()
+ if d[i] == eof || !strings.ContainsRune("0123456789abcdefABCDEF", d[i]) {
+ return fmt.Errorf("invalid unicode literal")
+ }
+ }
+
+ // decode the digits into a rune
+ r, err := strconv.ParseInt(string(d), 16, 0)
+ if err != nil {
+ return err
+ }
+
+ l.appendRune(rune(r))
+ return nil
+}
+
+// decodeEscapedCharacter returns the unescaped rune. We expect to be after the escape character.
+func decodeEscapedCharacter(r rune) rune {
+ switch r {
+ case 'f':
+ return '\f'
+ case 'n':
+ return '\n'
+ case 'r':
+ return '\r'
+ case 't':
+ return '\t'
+ default:
+ return r
+ }
+}
+
+// atUnicodeLiteral reports whether we are at a unicode literal.
+// The escape character has already been consumed.
+func atUnicodeLiteral(r rune) bool {
+ return r == 'u'
+}
+
+// isComment reports whether we are at the start of a comment.
+func isComment(r rune) bool {
+ return r == '#' || r == '!'
+}
+
+// isEndOfKey reports whether the rune terminates the current key.
+func isEndOfKey(r rune) bool {
+ return strings.ContainsRune(" \f\t\r\n:=", r)
+}
+
+// isEOF reports whether we are at EOF.
+func isEOF(r rune) bool {
+ return r == eof
+}
+
+// isEOL reports whether we are at a new line character.
+func isEOL(r rune) bool {
+ return r == '\n' || r == '\r'
+}
+
+// isEscape reports whether the rune is the escape character which
+// prefixes unicode literals and other escaped characters.
+func isEscape(r rune) bool {
+ return r == '\\'
+}
+
+// isEscapedCharacter reports whether we are at one of the characters that need escaping.
+// The escape character has already been consumed.
+func isEscapedCharacter(r rune) bool {
+ return strings.ContainsRune(" :=fnrt", r)
+}
+
+// isWhitespace reports whether the rune is a whitespace character.
+func isWhitespace(r rune) bool {
+ return strings.ContainsRune(whitespace, r)
+}
diff --git a/vendor/github.com/magiconair/properties/load.go b/vendor/github.com/magiconair/properties/load.go
new file mode 100644
index 00000000000..9c83fd63886
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/load.go
@@ -0,0 +1,241 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package properties
+
+import (
+ "fmt"
+ "io/ioutil"
+ "net/http"
+ "os"
+ "strings"
+)
+
+// Encoding specifies encoding of the input data.
+type Encoding uint
+
+const (
+ // UTF8 interprets the input data as UTF-8.
+ UTF8 Encoding = 1 << iota
+
+ // ISO_8859_1 interprets the input data as ISO-8859-1.
+ ISO_8859_1
+)
+
+// Load reads a buffer into a Properties struct.
+func Load(buf []byte, enc Encoding) (*Properties, error) {
+ return loadBuf(buf, enc)
+}
+
+// LoadString reads an UTF8 string into a properties struct.
+func LoadString(s string) (*Properties, error) {
+ return loadBuf([]byte(s), UTF8)
+}
+
+// LoadMap creates a new Properties struct from a string map.
+func LoadMap(m map[string]string) *Properties {
+ p := NewProperties()
+ for k, v := range m {
+ p.Set(k, v)
+ }
+ return p
+}
+
+// LoadFile reads a file into a Properties struct.
+func LoadFile(filename string, enc Encoding) (*Properties, error) {
+ return loadAll([]string{filename}, enc, false)
+}
+
+// LoadFiles reads multiple files in the given order into
+// a Properties struct. If 'ignoreMissing' is true then
+// non-existent files will not be reported as error.
+func LoadFiles(filenames []string, enc Encoding, ignoreMissing bool) (*Properties, error) {
+ return loadAll(filenames, enc, ignoreMissing)
+}
+
+// LoadURL reads the content of the URL into a Properties struct.
+//
+// The encoding is determined via the Content-Type header which
+// should be set to 'text/plain'. If the 'charset' parameter is
+// missing, 'iso-8859-1' or 'latin1' the encoding is set to
+// ISO-8859-1. If the 'charset' parameter is set to 'utf-8' the
+// encoding is set to UTF-8. A missing content type header is
+// interpreted as 'text/plain; charset=utf-8'.
+func LoadURL(url string) (*Properties, error) {
+ return loadAll([]string{url}, UTF8, false)
+}
+
+// LoadURLs reads the content of multiple URLs in the given order into a
+// Properties struct. If 'ignoreMissing' is true then a 404 status code will
+// not be reported as error. See LoadURL for the Content-Type header
+// and the encoding.
+func LoadURLs(urls []string, ignoreMissing bool) (*Properties, error) {
+ return loadAll(urls, UTF8, ignoreMissing)
+}
+
+// LoadAll reads the content of multiple URLs or files in the given order into a
+// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will
+// not be reported as error. Encoding sets the encoding for files. For the URLs please see
+// LoadURL for the Content-Type header and the encoding.
+func LoadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) {
+ return loadAll(names, enc, ignoreMissing)
+}
+
+// MustLoadString reads an UTF8 string into a Properties struct and
+// panics on error.
+func MustLoadString(s string) *Properties {
+ return must(LoadString(s))
+}
+
+// MustLoadFile reads a file into a Properties struct and
+// panics on error.
+func MustLoadFile(filename string, enc Encoding) *Properties {
+ return must(LoadFile(filename, enc))
+}
+
+// MustLoadFiles reads multiple files in the given order into
+// a Properties struct and panics on error. If 'ignoreMissing'
+// is true then non-existent files will not be reported as error.
+func MustLoadFiles(filenames []string, enc Encoding, ignoreMissing bool) *Properties {
+ return must(LoadFiles(filenames, enc, ignoreMissing))
+}
+
+// MustLoadURL reads the content of a URL into a Properties struct and
+// panics on error.
+func MustLoadURL(url string) *Properties {
+ return must(LoadURL(url))
+}
+
+// MustLoadURLs reads the content of multiple URLs in the given order into a
+// Properties struct and panics on error. If 'ignoreMissing' is true then a 404
+// status code will not be reported as error.
+func MustLoadURLs(urls []string, ignoreMissing bool) *Properties {
+ return must(LoadURLs(urls, ignoreMissing))
+}
+
+// MustLoadAll reads the content of multiple URLs or files in the given order into a
+// Properties struct. If 'ignoreMissing' is true then a 404 status code or missing file will
+// not be reported as error. Encoding sets the encoding for files. For the URLs please see
+// LoadURL for the Content-Type header and the encoding. It panics on error.
+func MustLoadAll(names []string, enc Encoding, ignoreMissing bool) *Properties {
+ return must(LoadAll(names, enc, ignoreMissing))
+}
+
+func loadBuf(buf []byte, enc Encoding) (*Properties, error) {
+ p, err := parse(convert(buf, enc))
+ if err != nil {
+ return nil, err
+ }
+ return p, p.check()
+}
+
+func loadAll(names []string, enc Encoding, ignoreMissing bool) (*Properties, error) {
+ result := NewProperties()
+ for _, name := range names {
+ n, err := expandName(name)
+ if err != nil {
+ return nil, err
+ }
+ var p *Properties
+ if strings.HasPrefix(n, "http://") || strings.HasPrefix(n, "https://") {
+ p, err = loadURL(n, ignoreMissing)
+ } else {
+ p, err = loadFile(n, enc, ignoreMissing)
+ }
+ if err != nil {
+ return nil, err
+ }
+ result.Merge(p)
+
+ }
+ return result, result.check()
+}
+
+func loadFile(filename string, enc Encoding, ignoreMissing bool) (*Properties, error) {
+ data, err := ioutil.ReadFile(filename)
+ if err != nil {
+ if ignoreMissing && os.IsNotExist(err) {
+ LogPrintf("properties: %s not found. skipping", filename)
+ return NewProperties(), nil
+ }
+ return nil, err
+ }
+ p, err := parse(convert(data, enc))
+ if err != nil {
+ return nil, err
+ }
+ return p, nil
+}
+
+func loadURL(url string, ignoreMissing bool) (*Properties, error) {
+ resp, err := http.Get(url)
+ if err != nil {
+ return nil, fmt.Errorf("properties: error fetching %q. %s", url, err)
+ }
+ if resp.StatusCode == 404 && ignoreMissing {
+ LogPrintf("properties: %s returned %d. skipping", url, resp.StatusCode)
+ return NewProperties(), nil
+ }
+ if resp.StatusCode != 200 {
+ return nil, fmt.Errorf("properties: %s returned %d", url, resp.StatusCode)
+ }
+ body, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ return nil, fmt.Errorf("properties: %s error reading response. %s", url, err)
+ }
+ if err = resp.Body.Close(); err != nil {
+ return nil, fmt.Errorf("properties: %s error reading response. %s", url, err)
+ }
+
+ ct := resp.Header.Get("Content-Type")
+ var enc Encoding
+ switch strings.ToLower(ct) {
+ case "text/plain", "text/plain; charset=iso-8859-1", "text/plain; charset=latin1":
+ enc = ISO_8859_1
+ case "", "text/plain; charset=utf-8":
+ enc = UTF8
+ default:
+ return nil, fmt.Errorf("properties: invalid content type %s", ct)
+ }
+
+ p, err := parse(convert(body, enc))
+ if err != nil {
+ return nil, err
+ }
+ return p, nil
+}
+
+func must(p *Properties, err error) *Properties {
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return p
+}
+
+// expandName expands ${ENV_VAR} expressions in a name.
+// If the environment variable does not exist then it will be replaced
+// with an empty string. Malformed expressions like "${ENV_VAR" will
+// be reported as error.
+func expandName(name string) (string, error) {
+ return expand(name, []string{}, "${", "}", make(map[string]string))
+}
+
+// Interprets a byte buffer either as an ISO-8859-1 or UTF-8 encoded string.
+// For ISO-8859-1 we can convert each byte straight into a rune since the
+// first 256 unicode code points cover ISO-8859-1.
+func convert(buf []byte, enc Encoding) string {
+ switch enc {
+ case UTF8:
+ return string(buf)
+ case ISO_8859_1:
+ runes := make([]rune, len(buf))
+ for i, b := range buf {
+ runes[i] = rune(b)
+ }
+ return string(runes)
+ default:
+ ErrorHandler(fmt.Errorf("unsupported encoding %v", enc))
+ }
+ panic("ErrorHandler should exit")
+}
diff --git a/vendor/github.com/magiconair/properties/parser.go b/vendor/github.com/magiconair/properties/parser.go
new file mode 100644
index 00000000000..90f555cb93d
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/parser.go
@@ -0,0 +1,95 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package properties
+
+import (
+ "fmt"
+ "runtime"
+)
+
+type parser struct {
+ lex *lexer
+}
+
+func parse(input string) (properties *Properties, err error) {
+ p := &parser{lex: lex(input)}
+ defer p.recover(&err)
+
+ properties = NewProperties()
+ key := ""
+ comments := []string{}
+
+ for {
+ token := p.expectOneOf(itemComment, itemKey, itemEOF)
+ switch token.typ {
+ case itemEOF:
+ goto done
+ case itemComment:
+ comments = append(comments, token.val)
+ continue
+ case itemKey:
+ key = token.val
+ if _, ok := properties.m[key]; !ok {
+ properties.k = append(properties.k, key)
+ }
+ }
+
+ token = p.expectOneOf(itemValue, itemEOF)
+ if len(comments) > 0 {
+ properties.c[key] = comments
+ comments = []string{}
+ }
+ switch token.typ {
+ case itemEOF:
+ properties.m[key] = ""
+ goto done
+ case itemValue:
+ properties.m[key] = token.val
+ }
+ }
+
+done:
+ return properties, nil
+}
+
+func (p *parser) errorf(format string, args ...interface{}) {
+ format = fmt.Sprintf("properties: Line %d: %s", p.lex.lineNumber(), format)
+ panic(fmt.Errorf(format, args...))
+}
+
+func (p *parser) expect(expected itemType) (token item) {
+ token = p.lex.nextItem()
+ if token.typ != expected {
+ p.unexpected(token)
+ }
+ return token
+}
+
+func (p *parser) expectOneOf(expected ...itemType) (token item) {
+ token = p.lex.nextItem()
+ for _, v := range expected {
+ if token.typ == v {
+ return token
+ }
+ }
+ p.unexpected(token)
+ panic("unexpected token")
+}
+
+func (p *parser) unexpected(token item) {
+ p.errorf(token.String())
+}
+
+// recover is the handler that turns panics into returns from the top level of Parse.
+func (p *parser) recover(errp *error) {
+ e := recover()
+ if e != nil {
+ if _, ok := e.(runtime.Error); ok {
+ panic(e)
+ }
+ *errp = e.(error)
+ }
+ return
+}
diff --git a/vendor/github.com/magiconair/properties/properties.go b/vendor/github.com/magiconair/properties/properties.go
new file mode 100644
index 00000000000..53f5b2ff092
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/properties.go
@@ -0,0 +1,822 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package properties
+
+// BUG(frank): Set() does not check for invalid unicode literals since this is currently handled by the lexer.
+// BUG(frank): Write() does not allow to configure the newline character. Therefore, on Windows LF is used.
+
+import (
+ "fmt"
+ "io"
+ "log"
+ "os"
+ "regexp"
+ "strconv"
+ "strings"
+ "time"
+ "unicode/utf8"
+)
+
+const maxExpansionDepth = 64
+
+// ErrorHandlerFunc defines the type of function which handles failures
+// of the MustXXX() functions. An error handler function must exit
+// the application after handling the error.
+type ErrorHandlerFunc func(error)
+
+// ErrorHandler is the function which handles failures of the MustXXX()
+// functions. The default is LogFatalHandler.
+var ErrorHandler ErrorHandlerFunc = LogFatalHandler
+
+// LogHandlerFunc defines the function prototype for logging errors.
+type LogHandlerFunc func(fmt string, args ...interface{})
+
+// LogPrintf defines a log handler which uses log.Printf.
+var LogPrintf LogHandlerFunc = log.Printf
+
+// LogFatalHandler handles the error by logging a fatal error and exiting.
+func LogFatalHandler(err error) {
+ log.Fatal(err)
+}
+
+// PanicHandler handles the error by panicking.
+func PanicHandler(err error) {
+ panic(err)
+}
+
+// -----------------------------------------------------------------------------
+
+// A Properties contains the key/value pairs from the properties input.
+// All values are stored in unexpanded form and are expanded at runtime
+type Properties struct {
+ // Pre-/Postfix for property expansion.
+ Prefix string
+ Postfix string
+
+ // DisableExpansion controls the expansion of properties on Get()
+ // and the check for circular references on Set(). When set to
+ // true Properties behaves like a simple key/value store and does
+ // not check for circular references on Get() or on Set().
+ DisableExpansion bool
+
+ // Stores the key/value pairs
+ m map[string]string
+
+ // Stores the comments per key.
+ c map[string][]string
+
+ // Stores the keys in order of appearance.
+ k []string
+}
+
+// NewProperties creates a new Properties struct with the default
+// configuration for "${key}" expressions.
+func NewProperties() *Properties {
+ return &Properties{
+ Prefix: "${",
+ Postfix: "}",
+ m: map[string]string{},
+ c: map[string][]string{},
+ k: []string{},
+ }
+}
+
+// Get returns the expanded value for the given key if exists.
+// Otherwise, ok is false.
+func (p *Properties) Get(key string) (value string, ok bool) {
+ v, ok := p.m[key]
+ if p.DisableExpansion {
+ return v, ok
+ }
+ if !ok {
+ return "", false
+ }
+
+ expanded, err := p.expand(key, v)
+
+ // we guarantee that the expanded value is free of
+ // circular references and malformed expressions
+ // so we panic if we still get an error here.
+ if err != nil {
+ ErrorHandler(fmt.Errorf("%s in %q", err, key+" = "+v))
+ }
+
+ return expanded, true
+}
+
+// MustGet returns the expanded value for the given key if exists.
+// Otherwise, it panics.
+func (p *Properties) MustGet(key string) string {
+ if v, ok := p.Get(key); ok {
+ return v
+ }
+ ErrorHandler(invalidKeyError(key))
+ panic("ErrorHandler should exit")
+}
+
+// ----------------------------------------------------------------------------
+
+// ClearComments removes the comments for all keys.
+func (p *Properties) ClearComments() {
+ p.c = map[string][]string{}
+}
+
+// ----------------------------------------------------------------------------
+
+// GetComment returns the last comment before the given key or an empty string.
+func (p *Properties) GetComment(key string) string {
+ comments, ok := p.c[key]
+ if !ok || len(comments) == 0 {
+ return ""
+ }
+ return comments[len(comments)-1]
+}
+
+// ----------------------------------------------------------------------------
+
+// GetComments returns all comments that appeared before the given key or nil.
+func (p *Properties) GetComments(key string) []string {
+ if comments, ok := p.c[key]; ok {
+ return comments
+ }
+ return nil
+}
+
+// ----------------------------------------------------------------------------
+
+// SetComment sets the comment for the key.
+func (p *Properties) SetComment(key, comment string) {
+ p.c[key] = []string{comment}
+}
+
+// ----------------------------------------------------------------------------
+
+// SetComments sets the comments for the key. If the comments are nil then
+// all comments for this key are deleted.
+func (p *Properties) SetComments(key string, comments []string) {
+ if comments == nil {
+ delete(p.c, key)
+ return
+ }
+ p.c[key] = comments
+}
+
+// ----------------------------------------------------------------------------
+
+// GetBool checks if the expanded value is one of '1', 'yes',
+// 'true' or 'on' if the key exists. The comparison is case-insensitive.
+// If the key does not exist the default value is returned.
+func (p *Properties) GetBool(key string, def bool) bool {
+ v, err := p.getBool(key)
+ if err != nil {
+ return def
+ }
+ return v
+}
+
+// MustGetBool checks if the expanded value is one of '1', 'yes',
+// 'true' or 'on' if the key exists. The comparison is case-insensitive.
+// If the key does not exist the function panics.
+func (p *Properties) MustGetBool(key string) bool {
+ v, err := p.getBool(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return v
+}
+
+func (p *Properties) getBool(key string) (value bool, err error) {
+ if v, ok := p.Get(key); ok {
+ return boolVal(v), nil
+ }
+ return false, invalidKeyError(key)
+}
+
+func boolVal(v string) bool {
+ v = strings.ToLower(v)
+ return v == "1" || v == "true" || v == "yes" || v == "on"
+}
+
+// ----------------------------------------------------------------------------
+
+// GetDuration parses the expanded value as an time.Duration (in ns) if the
+// key exists. If key does not exist or the value cannot be parsed the default
+// value is returned. In almost all cases you want to use GetParsedDuration().
+func (p *Properties) GetDuration(key string, def time.Duration) time.Duration {
+ v, err := p.getInt64(key)
+ if err != nil {
+ return def
+ }
+ return time.Duration(v)
+}
+
+// MustGetDuration parses the expanded value as an time.Duration (in ns) if
+// the key exists. If key does not exist or the value cannot be parsed the
+// function panics. In almost all cases you want to use MustGetParsedDuration().
+func (p *Properties) MustGetDuration(key string) time.Duration {
+ v, err := p.getInt64(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return time.Duration(v)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetParsedDuration parses the expanded value with time.ParseDuration() if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned.
+func (p *Properties) GetParsedDuration(key string, def time.Duration) time.Duration {
+ s, ok := p.Get(key)
+ if !ok {
+ return def
+ }
+ v, err := time.ParseDuration(s)
+ if err != nil {
+ return def
+ }
+ return v
+}
+
+// MustGetParsedDuration parses the expanded value with time.ParseDuration() if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetParsedDuration(key string) time.Duration {
+ s, ok := p.Get(key)
+ if !ok {
+ ErrorHandler(invalidKeyError(key))
+ }
+ v, err := time.ParseDuration(s)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return v
+}
+
+// ----------------------------------------------------------------------------
+
+// GetFloat64 parses the expanded value as a float64 if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned.
+func (p *Properties) GetFloat64(key string, def float64) float64 {
+ v, err := p.getFloat64(key)
+ if err != nil {
+ return def
+ }
+ return v
+}
+
+// MustGetFloat64 parses the expanded value as a float64 if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetFloat64(key string) float64 {
+ v, err := p.getFloat64(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return v
+}
+
+func (p *Properties) getFloat64(key string) (value float64, err error) {
+ if v, ok := p.Get(key); ok {
+ value, err = strconv.ParseFloat(v, 64)
+ if err != nil {
+ return 0, err
+ }
+ return value, nil
+ }
+ return 0, invalidKeyError(key)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetInt parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned. If the value does not fit into an int the
+// function panics with an out of range error.
+func (p *Properties) GetInt(key string, def int) int {
+ v, err := p.getInt64(key)
+ if err != nil {
+ return def
+ }
+ return intRangeCheck(key, v)
+}
+
+// MustGetInt parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+// If the value does not fit into an int the function panics with
+// an out of range error.
+func (p *Properties) MustGetInt(key string) int {
+ v, err := p.getInt64(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return intRangeCheck(key, v)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetInt64 parses the expanded value as an int64 if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned.
+func (p *Properties) GetInt64(key string, def int64) int64 {
+ v, err := p.getInt64(key)
+ if err != nil {
+ return def
+ }
+ return v
+}
+
+// MustGetInt64 parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetInt64(key string) int64 {
+ v, err := p.getInt64(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return v
+}
+
+func (p *Properties) getInt64(key string) (value int64, err error) {
+ if v, ok := p.Get(key); ok {
+ value, err = strconv.ParseInt(v, 10, 64)
+ if err != nil {
+ return 0, err
+ }
+ return value, nil
+ }
+ return 0, invalidKeyError(key)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetUint parses the expanded value as an uint if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned. If the value does not fit into an int the
+// function panics with an out of range error.
+func (p *Properties) GetUint(key string, def uint) uint {
+ v, err := p.getUint64(key)
+ if err != nil {
+ return def
+ }
+ return uintRangeCheck(key, v)
+}
+
+// MustGetUint parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+// If the value does not fit into an int the function panics with
+// an out of range error.
+func (p *Properties) MustGetUint(key string) uint {
+ v, err := p.getUint64(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return uintRangeCheck(key, v)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetUint64 parses the expanded value as an uint64 if the key exists.
+// If key does not exist or the value cannot be parsed the default
+// value is returned.
+func (p *Properties) GetUint64(key string, def uint64) uint64 {
+ v, err := p.getUint64(key)
+ if err != nil {
+ return def
+ }
+ return v
+}
+
+// MustGetUint64 parses the expanded value as an int if the key exists.
+// If key does not exist or the value cannot be parsed the function panics.
+func (p *Properties) MustGetUint64(key string) uint64 {
+ v, err := p.getUint64(key)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return v
+}
+
+func (p *Properties) getUint64(key string) (value uint64, err error) {
+ if v, ok := p.Get(key); ok {
+ value, err = strconv.ParseUint(v, 10, 64)
+ if err != nil {
+ return 0, err
+ }
+ return value, nil
+ }
+ return 0, invalidKeyError(key)
+}
+
+// ----------------------------------------------------------------------------
+
+// GetString returns the expanded value for the given key if exists or
+// the default value otherwise.
+func (p *Properties) GetString(key, def string) string {
+ if v, ok := p.Get(key); ok {
+ return v
+ }
+ return def
+}
+
+// MustGetString returns the expanded value for the given key if exists or
+// panics otherwise.
+func (p *Properties) MustGetString(key string) string {
+ if v, ok := p.Get(key); ok {
+ return v
+ }
+ ErrorHandler(invalidKeyError(key))
+ panic("ErrorHandler should exit")
+}
+
+// ----------------------------------------------------------------------------
+
+// Filter returns a new properties object which contains all properties
+// for which the key matches the pattern.
+func (p *Properties) Filter(pattern string) (*Properties, error) {
+ re, err := regexp.Compile(pattern)
+ if err != nil {
+ return nil, err
+ }
+
+ return p.FilterRegexp(re), nil
+}
+
+// FilterRegexp returns a new properties object which contains all properties
+// for which the key matches the regular expression.
+func (p *Properties) FilterRegexp(re *regexp.Regexp) *Properties {
+ pp := NewProperties()
+ for _, k := range p.k {
+ if re.MatchString(k) {
+ // TODO(fs): we are ignoring the error which flags a circular reference.
+ // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed)
+ pp.Set(k, p.m[k])
+ }
+ }
+ return pp
+}
+
+// FilterPrefix returns a new properties object with a subset of all keys
+// with the given prefix.
+func (p *Properties) FilterPrefix(prefix string) *Properties {
+ pp := NewProperties()
+ for _, k := range p.k {
+ if strings.HasPrefix(k, prefix) {
+ // TODO(fs): we are ignoring the error which flags a circular reference.
+ // TODO(fs): since we are just copying a subset of keys this cannot happen (fingers crossed)
+ pp.Set(k, p.m[k])
+ }
+ }
+ return pp
+}
+
+// FilterStripPrefix returns a new properties object with a subset of all keys
+// with the given prefix and the prefix removed from the keys.
+func (p *Properties) FilterStripPrefix(prefix string) *Properties {
+ pp := NewProperties()
+ n := len(prefix)
+ for _, k := range p.k {
+ if len(k) > len(prefix) && strings.HasPrefix(k, prefix) {
+ // TODO(fs): we are ignoring the error which flags a circular reference.
+ // TODO(fs): since we are modifying keys I am not entirely sure whether we can create a circular reference
+ // TODO(fs): this function should probably return an error but the signature is fixed
+ pp.Set(k[n:], p.m[k])
+ }
+ }
+ return pp
+}
+
+// Len returns the number of keys.
+func (p *Properties) Len() int {
+ return len(p.m)
+}
+
+// Keys returns all keys in the same order as in the input.
+func (p *Properties) Keys() []string {
+ keys := make([]string, len(p.k))
+ copy(keys, p.k)
+ return keys
+}
+
+// Set sets the property key to the corresponding value.
+// If a value for key existed before then ok is true and prev
+// contains the previous value. If the value contains a
+// circular reference or a malformed expression then
+// an error is returned.
+// An empty key is silently ignored.
+func (p *Properties) Set(key, value string) (prev string, ok bool, err error) {
+ if key == "" {
+ return "", false, nil
+ }
+
+ // if expansion is disabled we allow circular references
+ if p.DisableExpansion {
+ prev, ok = p.Get(key)
+ p.m[key] = value
+ if !ok {
+ p.k = append(p.k, key)
+ }
+ return prev, ok, nil
+ }
+
+ // to check for a circular reference we temporarily need
+ // to set the new value. If there is an error then revert
+ // to the previous state. Only if all tests are successful
+ // then we add the key to the p.k list.
+ prev, ok = p.Get(key)
+ p.m[key] = value
+
+ // now check for a circular reference
+ _, err = p.expand(key, value)
+ if err != nil {
+
+ // revert to the previous state
+ if ok {
+ p.m[key] = prev
+ } else {
+ delete(p.m, key)
+ }
+
+ return "", false, err
+ }
+
+ if !ok {
+ p.k = append(p.k, key)
+ }
+
+ return prev, ok, nil
+}
+
+// SetValue sets property key to the default string value
+// as defined by fmt.Sprintf("%v").
+func (p *Properties) SetValue(key string, value interface{}) error {
+ _, _, err := p.Set(key, fmt.Sprintf("%v", value))
+ return err
+}
+
+// MustSet sets the property key to the corresponding value.
+// If a value for key existed before then ok is true and prev
+// contains the previous value. An empty key is silently ignored.
+func (p *Properties) MustSet(key, value string) (prev string, ok bool) {
+ prev, ok, err := p.Set(key, value)
+ if err != nil {
+ ErrorHandler(err)
+ }
+ return prev, ok
+}
+
+// String returns a string of all expanded 'key = value' pairs.
+func (p *Properties) String() string {
+ var s string
+ for _, key := range p.k {
+ value, _ := p.Get(key)
+ s = fmt.Sprintf("%s%s = %s\n", s, key, value)
+ }
+ return s
+}
+
+// Write writes all unexpanded 'key = value' pairs to the given writer.
+// Write returns the number of bytes written and any write error encountered.
+func (p *Properties) Write(w io.Writer, enc Encoding) (n int, err error) {
+ return p.WriteComment(w, "", enc)
+}
+
+// WriteComment writes all unexpanced 'key = value' pairs to the given writer.
+// If prefix is not empty then comments are written with a blank line and the
+// given prefix. The prefix should be either "# " or "! " to be compatible with
+// the properties file format. Otherwise, the properties parser will not be
+// able to read the file back in. It returns the number of bytes written and
+// any write error encountered.
+func (p *Properties) WriteComment(w io.Writer, prefix string, enc Encoding) (n int, err error) {
+ var x int
+
+ for _, key := range p.k {
+ value := p.m[key]
+
+ if prefix != "" {
+ if comments, ok := p.c[key]; ok {
+ // don't print comments if they are all empty
+ allEmpty := true
+ for _, c := range comments {
+ if c != "" {
+ allEmpty = false
+ break
+ }
+ }
+
+ if !allEmpty {
+ // add a blank line between entries but not at the top
+ if len(comments) > 0 && n > 0 {
+ x, err = fmt.Fprintln(w)
+ if err != nil {
+ return
+ }
+ n += x
+ }
+
+ for _, c := range comments {
+ x, err = fmt.Fprintf(w, "%s%s\n", prefix, encode(c, "", enc))
+ if err != nil {
+ return
+ }
+ n += x
+ }
+ }
+ }
+ }
+
+ x, err = fmt.Fprintf(w, "%s = %s\n", encode(key, " :", enc), encode(value, "", enc))
+ if err != nil {
+ return
+ }
+ n += x
+ }
+ return
+}
+
+// Map returns a copy of the properties as a map.
+func (p *Properties) Map() map[string]string {
+ m := make(map[string]string)
+ for k, v := range p.m {
+ m[k] = v
+ }
+ return m
+}
+
+// FilterFunc returns a copy of the properties which includes the values which passed all filters.
+func (p *Properties) FilterFunc(filters ...func(k, v string) bool) *Properties {
+ pp := NewProperties()
+outer:
+ for k, v := range p.m {
+ for _, f := range filters {
+ if !f(k, v) {
+ continue outer
+ }
+ pp.Set(k, v)
+ }
+ }
+ return pp
+}
+
+// ----------------------------------------------------------------------------
+
+// Delete removes the key and its comments.
+func (p *Properties) Delete(key string) {
+ delete(p.m, key)
+ delete(p.c, key)
+ newKeys := []string{}
+ for _, k := range p.k {
+ if k != key {
+ newKeys = append(newKeys, k)
+ }
+ }
+ p.k = newKeys
+}
+
+// Merge merges properties, comments and keys from other *Properties into p
+func (p *Properties) Merge(other *Properties) {
+ for k, v := range other.m {
+ p.m[k] = v
+ }
+ for k, v := range other.c {
+ p.c[k] = v
+ }
+
+outer:
+ for _, otherKey := range other.k {
+ for _, key := range p.k {
+ if otherKey == key {
+ continue outer
+ }
+ }
+ p.k = append(p.k, otherKey)
+ }
+}
+
+// ----------------------------------------------------------------------------
+
+// check expands all values and returns an error if a circular reference or
+// a malformed expression was found.
+func (p *Properties) check() error {
+ for key, value := range p.m {
+ if _, err := p.expand(key, value); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (p *Properties) expand(key, input string) (string, error) {
+ // no pre/postfix -> nothing to expand
+ if p.Prefix == "" && p.Postfix == "" {
+ return input, nil
+ }
+
+ return expand(input, []string{key}, p.Prefix, p.Postfix, p.m)
+}
+
+// expand recursively expands expressions of '(prefix)key(postfix)' to their corresponding values.
+// The function keeps track of the keys that were already expanded and stops if it
+// detects a circular reference or a malformed expression of the form '(prefix)key'.
+func expand(s string, keys []string, prefix, postfix string, values map[string]string) (string, error) {
+ if len(keys) > maxExpansionDepth {
+ return "", fmt.Errorf("expansion too deep")
+ }
+
+ for {
+ start := strings.Index(s, prefix)
+ if start == -1 {
+ return s, nil
+ }
+
+ keyStart := start + len(prefix)
+ keyLen := strings.Index(s[keyStart:], postfix)
+ if keyLen == -1 {
+ return "", fmt.Errorf("malformed expression")
+ }
+
+ end := keyStart + keyLen + len(postfix) - 1
+ key := s[keyStart : keyStart+keyLen]
+
+ // fmt.Printf("s:%q pp:%q start:%d end:%d keyStart:%d keyLen:%d key:%q\n", s, prefix + "..." + postfix, start, end, keyStart, keyLen, key)
+
+ for _, k := range keys {
+ if key == k {
+ return "", fmt.Errorf("circular reference")
+ }
+ }
+
+ val, ok := values[key]
+ if !ok {
+ val = os.Getenv(key)
+ }
+ new_val, err := expand(val, append(keys, key), prefix, postfix, values)
+ if err != nil {
+ return "", err
+ }
+ s = s[:start] + new_val + s[end+1:]
+ }
+ return s, nil
+}
+
+// encode encodes a UTF-8 string to ISO-8859-1 and escapes some characters.
+func encode(s string, special string, enc Encoding) string {
+ switch enc {
+ case UTF8:
+ return encodeUtf8(s, special)
+ case ISO_8859_1:
+ return encodeIso(s, special)
+ default:
+ panic(fmt.Sprintf("unsupported encoding %v", enc))
+ }
+}
+
+func encodeUtf8(s string, special string) string {
+ v := ""
+ for pos := 0; pos < len(s); {
+ r, w := utf8.DecodeRuneInString(s[pos:])
+ pos += w
+ v += escape(r, special)
+ }
+ return v
+}
+
+func encodeIso(s string, special string) string {
+ var r rune
+ var w int
+ var v string
+ for pos := 0; pos < len(s); {
+ switch r, w = utf8.DecodeRuneInString(s[pos:]); {
+ case r < 1<<8: // single byte rune -> escape special chars only
+ v += escape(r, special)
+ case r < 1<<16: // two byte rune -> unicode literal
+ v += fmt.Sprintf("\\u%04x", r)
+ default: // more than two bytes per rune -> can't encode
+ v += "?"
+ }
+ pos += w
+ }
+ return v
+}
+
+func escape(r rune, special string) string {
+ switch r {
+ case '\f':
+ return "\\f"
+ case '\n':
+ return "\\n"
+ case '\r':
+ return "\\r"
+ case '\t':
+ return "\\t"
+ default:
+ if strings.ContainsRune(special, r) {
+ return "\\" + string(r)
+ }
+ return string(r)
+ }
+}
+
+func invalidKeyError(key string) error {
+ return fmt.Errorf("unknown property: %s", key)
+}
diff --git a/vendor/github.com/magiconair/properties/rangecheck.go b/vendor/github.com/magiconair/properties/rangecheck.go
new file mode 100644
index 00000000000..2e907d540b9
--- /dev/null
+++ b/vendor/github.com/magiconair/properties/rangecheck.go
@@ -0,0 +1,31 @@
+// Copyright 2017 Frank Schroeder. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package properties
+
+import (
+ "fmt"
+ "math"
+)
+
+// make this a var to overwrite it in a test
+var is32Bit = ^uint(0) == math.MaxUint32
+
+// intRangeCheck checks if the value fits into the int type and
+// panics if it does not.
+func intRangeCheck(key string, v int64) int {
+ if is32Bit && (v < math.MinInt32 || v > math.MaxInt32) {
+ panic(fmt.Sprintf("Value %d for key %s out of range", v, key))
+ }
+ return int(v)
+}
+
+// uintRangeCheck checks if the value fits into the uint type and
+// panics if it does not.
+func uintRangeCheck(key string, v uint64) uint {
+ if is32Bit && v > math.MaxUint32 {
+ panic(fmt.Sprintf("Value %d for key %s out of range", v, key))
+ }
+ return uint(v)
+}
diff --git a/vendor/github.com/mattn/go-colorable/.travis.yml b/vendor/github.com/mattn/go-colorable/.travis.yml
new file mode 100644
index 00000000000..98db8f060bd
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/.travis.yml
@@ -0,0 +1,9 @@
+language: go
+go:
+ - tip
+
+before_install:
+ - go get github.com/mattn/goveralls
+ - go get golang.org/x/tools/cmd/cover
+script:
+ - $HOME/gopath/bin/goveralls -repotoken xnXqRGwgW3SXIguzxf90ZSK1GPYZPaGrw
diff --git a/vendor/github.com/mattn/go-colorable/LICENSE b/vendor/github.com/mattn/go-colorable/LICENSE
new file mode 100644
index 00000000000..91b5cef30eb
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2016 Yasuhiro Matsumoto
+
+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/mattn/go-colorable/README.md b/vendor/github.com/mattn/go-colorable/README.md
new file mode 100644
index 00000000000..56729a92ca6
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/README.md
@@ -0,0 +1,48 @@
+# go-colorable
+
+[![Godoc Reference](https://godoc.org/github.com/mattn/go-colorable?status.svg)](http://godoc.org/github.com/mattn/go-colorable)
+[![Build Status](https://travis-ci.org/mattn/go-colorable.svg?branch=master)](https://travis-ci.org/mattn/go-colorable)
+[![Coverage Status](https://coveralls.io/repos/github/mattn/go-colorable/badge.svg?branch=master)](https://coveralls.io/github/mattn/go-colorable?branch=master)
+[![Go Report Card](https://goreportcard.com/badge/mattn/go-colorable)](https://goreportcard.com/report/mattn/go-colorable)
+
+Colorable writer for windows.
+
+For example, most of logger packages doesn't show colors on windows. (I know we can do it with ansicon. But I don't want.)
+This package is possible to handle escape sequence for ansi color on windows.
+
+## Too Bad!
+
+![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/bad.png)
+
+
+## So Good!
+
+![](https://raw.githubusercontent.com/mattn/go-colorable/gh-pages/good.png)
+
+## Usage
+
+```go
+logrus.SetFormatter(&logrus.TextFormatter{ForceColors: true})
+logrus.SetOutput(colorable.NewColorableStdout())
+
+logrus.Info("succeeded")
+logrus.Warn("not correct")
+logrus.Error("something error")
+logrus.Fatal("panic")
+```
+
+You can compile above code on non-windows OSs.
+
+## Installation
+
+```
+$ go get github.com/mattn/go-colorable
+```
+
+# License
+
+MIT
+
+# Author
+
+Yasuhiro Matsumoto (a.k.a mattn)
diff --git a/vendor/github.com/mattn/go-colorable/colorable_appengine.go b/vendor/github.com/mattn/go-colorable/colorable_appengine.go
new file mode 100644
index 00000000000..1f28d773d74
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/colorable_appengine.go
@@ -0,0 +1,29 @@
+// +build appengine
+
+package colorable
+
+import (
+ "io"
+ "os"
+
+ _ "github.com/mattn/go-isatty"
+)
+
+// NewColorable return new instance of Writer which handle escape sequence.
+func NewColorable(file *os.File) io.Writer {
+ if file == nil {
+ panic("nil passed instead of *os.File to NewColorable()")
+ }
+
+ return file
+}
+
+// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.
+func NewColorableStdout() io.Writer {
+ return os.Stdout
+}
+
+// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.
+func NewColorableStderr() io.Writer {
+ return os.Stderr
+}
diff --git a/vendor/github.com/mattn/go-colorable/colorable_others.go b/vendor/github.com/mattn/go-colorable/colorable_others.go
new file mode 100644
index 00000000000..887f203dc7f
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/colorable_others.go
@@ -0,0 +1,30 @@
+// +build !windows
+// +build !appengine
+
+package colorable
+
+import (
+ "io"
+ "os"
+
+ _ "github.com/mattn/go-isatty"
+)
+
+// NewColorable return new instance of Writer which handle escape sequence.
+func NewColorable(file *os.File) io.Writer {
+ if file == nil {
+ panic("nil passed instead of *os.File to NewColorable()")
+ }
+
+ return file
+}
+
+// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.
+func NewColorableStdout() io.Writer {
+ return os.Stdout
+}
+
+// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.
+func NewColorableStderr() io.Writer {
+ return os.Stderr
+}
diff --git a/vendor/github.com/mattn/go-colorable/colorable_windows.go b/vendor/github.com/mattn/go-colorable/colorable_windows.go
new file mode 100644
index 00000000000..e17a5474e98
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/colorable_windows.go
@@ -0,0 +1,884 @@
+// +build windows
+// +build !appengine
+
+package colorable
+
+import (
+ "bytes"
+ "io"
+ "math"
+ "os"
+ "strconv"
+ "strings"
+ "syscall"
+ "unsafe"
+
+ "github.com/mattn/go-isatty"
+)
+
+const (
+ foregroundBlue = 0x1
+ foregroundGreen = 0x2
+ foregroundRed = 0x4
+ foregroundIntensity = 0x8
+ foregroundMask = (foregroundRed | foregroundBlue | foregroundGreen | foregroundIntensity)
+ backgroundBlue = 0x10
+ backgroundGreen = 0x20
+ backgroundRed = 0x40
+ backgroundIntensity = 0x80
+ backgroundMask = (backgroundRed | backgroundBlue | backgroundGreen | backgroundIntensity)
+)
+
+type wchar uint16
+type short int16
+type dword uint32
+type word uint16
+
+type coord struct {
+ x short
+ y short
+}
+
+type smallRect struct {
+ left short
+ top short
+ right short
+ bottom short
+}
+
+type consoleScreenBufferInfo struct {
+ size coord
+ cursorPosition coord
+ attributes word
+ window smallRect
+ maximumWindowSize coord
+}
+
+type consoleCursorInfo struct {
+ size dword
+ visible int32
+}
+
+var (
+ kernel32 = syscall.NewLazyDLL("kernel32.dll")
+ procGetConsoleScreenBufferInfo = kernel32.NewProc("GetConsoleScreenBufferInfo")
+ procSetConsoleTextAttribute = kernel32.NewProc("SetConsoleTextAttribute")
+ procSetConsoleCursorPosition = kernel32.NewProc("SetConsoleCursorPosition")
+ procFillConsoleOutputCharacter = kernel32.NewProc("FillConsoleOutputCharacterW")
+ procFillConsoleOutputAttribute = kernel32.NewProc("FillConsoleOutputAttribute")
+ procGetConsoleCursorInfo = kernel32.NewProc("GetConsoleCursorInfo")
+ procSetConsoleCursorInfo = kernel32.NewProc("SetConsoleCursorInfo")
+ procSetConsoleTitle = kernel32.NewProc("SetConsoleTitleW")
+)
+
+// Writer provide colorable Writer to the console
+type Writer struct {
+ out io.Writer
+ handle syscall.Handle
+ oldattr word
+ oldpos coord
+}
+
+// NewColorable return new instance of Writer which handle escape sequence from File.
+func NewColorable(file *os.File) io.Writer {
+ if file == nil {
+ panic("nil passed instead of *os.File to NewColorable()")
+ }
+
+ if isatty.IsTerminal(file.Fd()) {
+ var csbi consoleScreenBufferInfo
+ handle := syscall.Handle(file.Fd())
+ procGetConsoleScreenBufferInfo.Call(uintptr(handle), uintptr(unsafe.Pointer(&csbi)))
+ return &Writer{out: file, handle: handle, oldattr: csbi.attributes, oldpos: coord{0, 0}}
+ }
+ return file
+}
+
+// NewColorableStdout return new instance of Writer which handle escape sequence for stdout.
+func NewColorableStdout() io.Writer {
+ return NewColorable(os.Stdout)
+}
+
+// NewColorableStderr return new instance of Writer which handle escape sequence for stderr.
+func NewColorableStderr() io.Writer {
+ return NewColorable(os.Stderr)
+}
+
+var color256 = map[int]int{
+ 0: 0x000000,
+ 1: 0x800000,
+ 2: 0x008000,
+ 3: 0x808000,
+ 4: 0x000080,
+ 5: 0x800080,
+ 6: 0x008080,
+ 7: 0xc0c0c0,
+ 8: 0x808080,
+ 9: 0xff0000,
+ 10: 0x00ff00,
+ 11: 0xffff00,
+ 12: 0x0000ff,
+ 13: 0xff00ff,
+ 14: 0x00ffff,
+ 15: 0xffffff,
+ 16: 0x000000,
+ 17: 0x00005f,
+ 18: 0x000087,
+ 19: 0x0000af,
+ 20: 0x0000d7,
+ 21: 0x0000ff,
+ 22: 0x005f00,
+ 23: 0x005f5f,
+ 24: 0x005f87,
+ 25: 0x005faf,
+ 26: 0x005fd7,
+ 27: 0x005fff,
+ 28: 0x008700,
+ 29: 0x00875f,
+ 30: 0x008787,
+ 31: 0x0087af,
+ 32: 0x0087d7,
+ 33: 0x0087ff,
+ 34: 0x00af00,
+ 35: 0x00af5f,
+ 36: 0x00af87,
+ 37: 0x00afaf,
+ 38: 0x00afd7,
+ 39: 0x00afff,
+ 40: 0x00d700,
+ 41: 0x00d75f,
+ 42: 0x00d787,
+ 43: 0x00d7af,
+ 44: 0x00d7d7,
+ 45: 0x00d7ff,
+ 46: 0x00ff00,
+ 47: 0x00ff5f,
+ 48: 0x00ff87,
+ 49: 0x00ffaf,
+ 50: 0x00ffd7,
+ 51: 0x00ffff,
+ 52: 0x5f0000,
+ 53: 0x5f005f,
+ 54: 0x5f0087,
+ 55: 0x5f00af,
+ 56: 0x5f00d7,
+ 57: 0x5f00ff,
+ 58: 0x5f5f00,
+ 59: 0x5f5f5f,
+ 60: 0x5f5f87,
+ 61: 0x5f5faf,
+ 62: 0x5f5fd7,
+ 63: 0x5f5fff,
+ 64: 0x5f8700,
+ 65: 0x5f875f,
+ 66: 0x5f8787,
+ 67: 0x5f87af,
+ 68: 0x5f87d7,
+ 69: 0x5f87ff,
+ 70: 0x5faf00,
+ 71: 0x5faf5f,
+ 72: 0x5faf87,
+ 73: 0x5fafaf,
+ 74: 0x5fafd7,
+ 75: 0x5fafff,
+ 76: 0x5fd700,
+ 77: 0x5fd75f,
+ 78: 0x5fd787,
+ 79: 0x5fd7af,
+ 80: 0x5fd7d7,
+ 81: 0x5fd7ff,
+ 82: 0x5fff00,
+ 83: 0x5fff5f,
+ 84: 0x5fff87,
+ 85: 0x5fffaf,
+ 86: 0x5fffd7,
+ 87: 0x5fffff,
+ 88: 0x870000,
+ 89: 0x87005f,
+ 90: 0x870087,
+ 91: 0x8700af,
+ 92: 0x8700d7,
+ 93: 0x8700ff,
+ 94: 0x875f00,
+ 95: 0x875f5f,
+ 96: 0x875f87,
+ 97: 0x875faf,
+ 98: 0x875fd7,
+ 99: 0x875fff,
+ 100: 0x878700,
+ 101: 0x87875f,
+ 102: 0x878787,
+ 103: 0x8787af,
+ 104: 0x8787d7,
+ 105: 0x8787ff,
+ 106: 0x87af00,
+ 107: 0x87af5f,
+ 108: 0x87af87,
+ 109: 0x87afaf,
+ 110: 0x87afd7,
+ 111: 0x87afff,
+ 112: 0x87d700,
+ 113: 0x87d75f,
+ 114: 0x87d787,
+ 115: 0x87d7af,
+ 116: 0x87d7d7,
+ 117: 0x87d7ff,
+ 118: 0x87ff00,
+ 119: 0x87ff5f,
+ 120: 0x87ff87,
+ 121: 0x87ffaf,
+ 122: 0x87ffd7,
+ 123: 0x87ffff,
+ 124: 0xaf0000,
+ 125: 0xaf005f,
+ 126: 0xaf0087,
+ 127: 0xaf00af,
+ 128: 0xaf00d7,
+ 129: 0xaf00ff,
+ 130: 0xaf5f00,
+ 131: 0xaf5f5f,
+ 132: 0xaf5f87,
+ 133: 0xaf5faf,
+ 134: 0xaf5fd7,
+ 135: 0xaf5fff,
+ 136: 0xaf8700,
+ 137: 0xaf875f,
+ 138: 0xaf8787,
+ 139: 0xaf87af,
+ 140: 0xaf87d7,
+ 141: 0xaf87ff,
+ 142: 0xafaf00,
+ 143: 0xafaf5f,
+ 144: 0xafaf87,
+ 145: 0xafafaf,
+ 146: 0xafafd7,
+ 147: 0xafafff,
+ 148: 0xafd700,
+ 149: 0xafd75f,
+ 150: 0xafd787,
+ 151: 0xafd7af,
+ 152: 0xafd7d7,
+ 153: 0xafd7ff,
+ 154: 0xafff00,
+ 155: 0xafff5f,
+ 156: 0xafff87,
+ 157: 0xafffaf,
+ 158: 0xafffd7,
+ 159: 0xafffff,
+ 160: 0xd70000,
+ 161: 0xd7005f,
+ 162: 0xd70087,
+ 163: 0xd700af,
+ 164: 0xd700d7,
+ 165: 0xd700ff,
+ 166: 0xd75f00,
+ 167: 0xd75f5f,
+ 168: 0xd75f87,
+ 169: 0xd75faf,
+ 170: 0xd75fd7,
+ 171: 0xd75fff,
+ 172: 0xd78700,
+ 173: 0xd7875f,
+ 174: 0xd78787,
+ 175: 0xd787af,
+ 176: 0xd787d7,
+ 177: 0xd787ff,
+ 178: 0xd7af00,
+ 179: 0xd7af5f,
+ 180: 0xd7af87,
+ 181: 0xd7afaf,
+ 182: 0xd7afd7,
+ 183: 0xd7afff,
+ 184: 0xd7d700,
+ 185: 0xd7d75f,
+ 186: 0xd7d787,
+ 187: 0xd7d7af,
+ 188: 0xd7d7d7,
+ 189: 0xd7d7ff,
+ 190: 0xd7ff00,
+ 191: 0xd7ff5f,
+ 192: 0xd7ff87,
+ 193: 0xd7ffaf,
+ 194: 0xd7ffd7,
+ 195: 0xd7ffff,
+ 196: 0xff0000,
+ 197: 0xff005f,
+ 198: 0xff0087,
+ 199: 0xff00af,
+ 200: 0xff00d7,
+ 201: 0xff00ff,
+ 202: 0xff5f00,
+ 203: 0xff5f5f,
+ 204: 0xff5f87,
+ 205: 0xff5faf,
+ 206: 0xff5fd7,
+ 207: 0xff5fff,
+ 208: 0xff8700,
+ 209: 0xff875f,
+ 210: 0xff8787,
+ 211: 0xff87af,
+ 212: 0xff87d7,
+ 213: 0xff87ff,
+ 214: 0xffaf00,
+ 215: 0xffaf5f,
+ 216: 0xffaf87,
+ 217: 0xffafaf,
+ 218: 0xffafd7,
+ 219: 0xffafff,
+ 220: 0xffd700,
+ 221: 0xffd75f,
+ 222: 0xffd787,
+ 223: 0xffd7af,
+ 224: 0xffd7d7,
+ 225: 0xffd7ff,
+ 226: 0xffff00,
+ 227: 0xffff5f,
+ 228: 0xffff87,
+ 229: 0xffffaf,
+ 230: 0xffffd7,
+ 231: 0xffffff,
+ 232: 0x080808,
+ 233: 0x121212,
+ 234: 0x1c1c1c,
+ 235: 0x262626,
+ 236: 0x303030,
+ 237: 0x3a3a3a,
+ 238: 0x444444,
+ 239: 0x4e4e4e,
+ 240: 0x585858,
+ 241: 0x626262,
+ 242: 0x6c6c6c,
+ 243: 0x767676,
+ 244: 0x808080,
+ 245: 0x8a8a8a,
+ 246: 0x949494,
+ 247: 0x9e9e9e,
+ 248: 0xa8a8a8,
+ 249: 0xb2b2b2,
+ 250: 0xbcbcbc,
+ 251: 0xc6c6c6,
+ 252: 0xd0d0d0,
+ 253: 0xdadada,
+ 254: 0xe4e4e4,
+ 255: 0xeeeeee,
+}
+
+// `\033]0;TITLESTR\007`
+func doTitleSequence(er *bytes.Reader) error {
+ var c byte
+ var err error
+
+ c, err = er.ReadByte()
+ if err != nil {
+ return err
+ }
+ if c != '0' && c != '2' {
+ return nil
+ }
+ c, err = er.ReadByte()
+ if err != nil {
+ return err
+ }
+ if c != ';' {
+ return nil
+ }
+ title := make([]byte, 0, 80)
+ for {
+ c, err = er.ReadByte()
+ if err != nil {
+ return err
+ }
+ if c == 0x07 || c == '\n' {
+ break
+ }
+ title = append(title, c)
+ }
+ if len(title) > 0 {
+ title8, err := syscall.UTF16PtrFromString(string(title))
+ if err == nil {
+ procSetConsoleTitle.Call(uintptr(unsafe.Pointer(title8)))
+ }
+ }
+ return nil
+}
+
+// Write write data on console
+func (w *Writer) Write(data []byte) (n int, err error) {
+ var csbi consoleScreenBufferInfo
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+
+ er := bytes.NewReader(data)
+ var bw [1]byte
+loop:
+ for {
+ c1, err := er.ReadByte()
+ if err != nil {
+ break loop
+ }
+ if c1 != 0x1b {
+ bw[0] = c1
+ w.out.Write(bw[:])
+ continue
+ }
+ c2, err := er.ReadByte()
+ if err != nil {
+ break loop
+ }
+
+ if c2 == ']' {
+ if err := doTitleSequence(er); err != nil {
+ break loop
+ }
+ continue
+ }
+ if c2 != 0x5b {
+ continue
+ }
+
+ var buf bytes.Buffer
+ var m byte
+ for {
+ c, err := er.ReadByte()
+ if err != nil {
+ break loop
+ }
+ if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
+ m = c
+ break
+ }
+ buf.Write([]byte(string(c)))
+ }
+
+ switch m {
+ case 'A':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.y -= short(n)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'B':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.y += short(n)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'C':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.x += short(n)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'D':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.x -= short(n)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'E':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.x = 0
+ csbi.cursorPosition.y += short(n)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'F':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.x = 0
+ csbi.cursorPosition.y -= short(n)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'G':
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ csbi.cursorPosition.x = short(n - 1)
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'H', 'f':
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ if buf.Len() > 0 {
+ token := strings.Split(buf.String(), ";")
+ switch len(token) {
+ case 1:
+ n1, err := strconv.Atoi(token[0])
+ if err != nil {
+ continue
+ }
+ csbi.cursorPosition.y = short(n1 - 1)
+ case 2:
+ n1, err := strconv.Atoi(token[0])
+ if err != nil {
+ continue
+ }
+ n2, err := strconv.Atoi(token[1])
+ if err != nil {
+ continue
+ }
+ csbi.cursorPosition.x = short(n2 - 1)
+ csbi.cursorPosition.y = short(n1 - 1)
+ }
+ } else {
+ csbi.cursorPosition.y = 0
+ }
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&csbi.cursorPosition)))
+ case 'J':
+ n := 0
+ if buf.Len() > 0 {
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ }
+ var count, written dword
+ var cursor coord
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ switch n {
+ case 0:
+ cursor = coord{x: csbi.cursorPosition.x, y: csbi.cursorPosition.y}
+ count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x)
+ case 1:
+ cursor = coord{x: csbi.window.left, y: csbi.window.top}
+ count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.window.top-csbi.cursorPosition.y)*csbi.size.x)
+ case 2:
+ cursor = coord{x: csbi.window.left, y: csbi.window.top}
+ count = dword(csbi.size.x - csbi.cursorPosition.x + (csbi.size.y-csbi.cursorPosition.y)*csbi.size.x)
+ }
+ procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
+ procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
+ case 'K':
+ n := 0
+ if buf.Len() > 0 {
+ n, err = strconv.Atoi(buf.String())
+ if err != nil {
+ continue
+ }
+ }
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ var cursor coord
+ var count, written dword
+ switch n {
+ case 0:
+ cursor = coord{x: csbi.cursorPosition.x + 1, y: csbi.cursorPosition.y}
+ count = dword(csbi.size.x - csbi.cursorPosition.x - 1)
+ case 1:
+ cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y}
+ count = dword(csbi.size.x - csbi.cursorPosition.x)
+ case 2:
+ cursor = coord{x: csbi.window.left, y: csbi.window.top + csbi.cursorPosition.y}
+ count = dword(csbi.size.x)
+ }
+ procFillConsoleOutputCharacter.Call(uintptr(w.handle), uintptr(' '), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
+ procFillConsoleOutputAttribute.Call(uintptr(w.handle), uintptr(csbi.attributes), uintptr(count), *(*uintptr)(unsafe.Pointer(&cursor)), uintptr(unsafe.Pointer(&written)))
+ case 'm':
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ attr := csbi.attributes
+ cs := buf.String()
+ if cs == "" {
+ procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(w.oldattr))
+ continue
+ }
+ token := strings.Split(cs, ";")
+ for i := 0; i < len(token); i++ {
+ ns := token[i]
+ if n, err = strconv.Atoi(ns); err == nil {
+ switch {
+ case n == 0 || n == 100:
+ attr = w.oldattr
+ case 1 <= n && n <= 5:
+ attr |= foregroundIntensity
+ case n == 7:
+ attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4)
+ case n == 22 || n == 25:
+ attr |= foregroundIntensity
+ case n == 27:
+ attr = ((attr & foregroundMask) << 4) | ((attr & backgroundMask) >> 4)
+ case 30 <= n && n <= 37:
+ attr &= backgroundMask
+ if (n-30)&1 != 0 {
+ attr |= foregroundRed
+ }
+ if (n-30)&2 != 0 {
+ attr |= foregroundGreen
+ }
+ if (n-30)&4 != 0 {
+ attr |= foregroundBlue
+ }
+ case n == 38: // set foreground color.
+ if i < len(token)-2 && (token[i+1] == "5" || token[i+1] == "05") {
+ if n256, err := strconv.Atoi(token[i+2]); err == nil {
+ if n256foreAttr == nil {
+ n256setup()
+ }
+ attr &= backgroundMask
+ attr |= n256foreAttr[n256]
+ i += 2
+ }
+ } else {
+ attr = attr & (w.oldattr & backgroundMask)
+ }
+ case n == 39: // reset foreground color.
+ attr &= backgroundMask
+ attr |= w.oldattr & foregroundMask
+ case 40 <= n && n <= 47:
+ attr &= foregroundMask
+ if (n-40)&1 != 0 {
+ attr |= backgroundRed
+ }
+ if (n-40)&2 != 0 {
+ attr |= backgroundGreen
+ }
+ if (n-40)&4 != 0 {
+ attr |= backgroundBlue
+ }
+ case n == 48: // set background color.
+ if i < len(token)-2 && token[i+1] == "5" {
+ if n256, err := strconv.Atoi(token[i+2]); err == nil {
+ if n256backAttr == nil {
+ n256setup()
+ }
+ attr &= foregroundMask
+ attr |= n256backAttr[n256]
+ i += 2
+ }
+ } else {
+ attr = attr & (w.oldattr & foregroundMask)
+ }
+ case n == 49: // reset foreground color.
+ attr &= foregroundMask
+ attr |= w.oldattr & backgroundMask
+ case 90 <= n && n <= 97:
+ attr = (attr & backgroundMask)
+ attr |= foregroundIntensity
+ if (n-90)&1 != 0 {
+ attr |= foregroundRed
+ }
+ if (n-90)&2 != 0 {
+ attr |= foregroundGreen
+ }
+ if (n-90)&4 != 0 {
+ attr |= foregroundBlue
+ }
+ case 100 <= n && n <= 107:
+ attr = (attr & foregroundMask)
+ attr |= backgroundIntensity
+ if (n-100)&1 != 0 {
+ attr |= backgroundRed
+ }
+ if (n-100)&2 != 0 {
+ attr |= backgroundGreen
+ }
+ if (n-100)&4 != 0 {
+ attr |= backgroundBlue
+ }
+ }
+ procSetConsoleTextAttribute.Call(uintptr(w.handle), uintptr(attr))
+ }
+ }
+ case 'h':
+ var ci consoleCursorInfo
+ cs := buf.String()
+ if cs == "5>" {
+ procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ ci.visible = 0
+ procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ } else if cs == "?25" {
+ procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ ci.visible = 1
+ procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ }
+ case 'l':
+ var ci consoleCursorInfo
+ cs := buf.String()
+ if cs == "5>" {
+ procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ ci.visible = 1
+ procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ } else if cs == "?25" {
+ procGetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ ci.visible = 0
+ procSetConsoleCursorInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&ci)))
+ }
+ case 's':
+ procGetConsoleScreenBufferInfo.Call(uintptr(w.handle), uintptr(unsafe.Pointer(&csbi)))
+ w.oldpos = csbi.cursorPosition
+ case 'u':
+ procSetConsoleCursorPosition.Call(uintptr(w.handle), *(*uintptr)(unsafe.Pointer(&w.oldpos)))
+ }
+ }
+
+ return len(data), nil
+}
+
+type consoleColor struct {
+ rgb int
+ red bool
+ green bool
+ blue bool
+ intensity bool
+}
+
+func (c consoleColor) foregroundAttr() (attr word) {
+ if c.red {
+ attr |= foregroundRed
+ }
+ if c.green {
+ attr |= foregroundGreen
+ }
+ if c.blue {
+ attr |= foregroundBlue
+ }
+ if c.intensity {
+ attr |= foregroundIntensity
+ }
+ return
+}
+
+func (c consoleColor) backgroundAttr() (attr word) {
+ if c.red {
+ attr |= backgroundRed
+ }
+ if c.green {
+ attr |= backgroundGreen
+ }
+ if c.blue {
+ attr |= backgroundBlue
+ }
+ if c.intensity {
+ attr |= backgroundIntensity
+ }
+ return
+}
+
+var color16 = []consoleColor{
+ {0x000000, false, false, false, false},
+ {0x000080, false, false, true, false},
+ {0x008000, false, true, false, false},
+ {0x008080, false, true, true, false},
+ {0x800000, true, false, false, false},
+ {0x800080, true, false, true, false},
+ {0x808000, true, true, false, false},
+ {0xc0c0c0, true, true, true, false},
+ {0x808080, false, false, false, true},
+ {0x0000ff, false, false, true, true},
+ {0x00ff00, false, true, false, true},
+ {0x00ffff, false, true, true, true},
+ {0xff0000, true, false, false, true},
+ {0xff00ff, true, false, true, true},
+ {0xffff00, true, true, false, true},
+ {0xffffff, true, true, true, true},
+}
+
+type hsv struct {
+ h, s, v float32
+}
+
+func (a hsv) dist(b hsv) float32 {
+ dh := a.h - b.h
+ switch {
+ case dh > 0.5:
+ dh = 1 - dh
+ case dh < -0.5:
+ dh = -1 - dh
+ }
+ ds := a.s - b.s
+ dv := a.v - b.v
+ return float32(math.Sqrt(float64(dh*dh + ds*ds + dv*dv)))
+}
+
+func toHSV(rgb int) hsv {
+ r, g, b := float32((rgb&0xFF0000)>>16)/256.0,
+ float32((rgb&0x00FF00)>>8)/256.0,
+ float32(rgb&0x0000FF)/256.0
+ min, max := minmax3f(r, g, b)
+ h := max - min
+ if h > 0 {
+ if max == r {
+ h = (g - b) / h
+ if h < 0 {
+ h += 6
+ }
+ } else if max == g {
+ h = 2 + (b-r)/h
+ } else {
+ h = 4 + (r-g)/h
+ }
+ }
+ h /= 6.0
+ s := max - min
+ if max != 0 {
+ s /= max
+ }
+ v := max
+ return hsv{h: h, s: s, v: v}
+}
+
+type hsvTable []hsv
+
+func toHSVTable(rgbTable []consoleColor) hsvTable {
+ t := make(hsvTable, len(rgbTable))
+ for i, c := range rgbTable {
+ t[i] = toHSV(c.rgb)
+ }
+ return t
+}
+
+func (t hsvTable) find(rgb int) consoleColor {
+ hsv := toHSV(rgb)
+ n := 7
+ l := float32(5.0)
+ for i, p := range t {
+ d := hsv.dist(p)
+ if d < l {
+ l, n = d, i
+ }
+ }
+ return color16[n]
+}
+
+func minmax3f(a, b, c float32) (min, max float32) {
+ if a < b {
+ if b < c {
+ return a, c
+ } else if a < c {
+ return a, b
+ } else {
+ return c, b
+ }
+ } else {
+ if a < c {
+ return b, c
+ } else if b < c {
+ return b, a
+ } else {
+ return c, a
+ }
+ }
+}
+
+var n256foreAttr []word
+var n256backAttr []word
+
+func n256setup() {
+ n256foreAttr = make([]word, 256)
+ n256backAttr = make([]word, 256)
+ t := toHSVTable(color16)
+ for i, rgb := range color256 {
+ c := t.find(rgb)
+ n256foreAttr[i] = c.foregroundAttr()
+ n256backAttr[i] = c.backgroundAttr()
+ }
+}
diff --git a/vendor/github.com/mattn/go-colorable/noncolorable.go b/vendor/github.com/mattn/go-colorable/noncolorable.go
new file mode 100644
index 00000000000..9721e16f4bf
--- /dev/null
+++ b/vendor/github.com/mattn/go-colorable/noncolorable.go
@@ -0,0 +1,55 @@
+package colorable
+
+import (
+ "bytes"
+ "io"
+)
+
+// NonColorable hold writer but remove escape sequence.
+type NonColorable struct {
+ out io.Writer
+}
+
+// NewNonColorable return new instance of Writer which remove escape sequence from Writer.
+func NewNonColorable(w io.Writer) io.Writer {
+ return &NonColorable{out: w}
+}
+
+// Write write data on console
+func (w *NonColorable) Write(data []byte) (n int, err error) {
+ er := bytes.NewReader(data)
+ var bw [1]byte
+loop:
+ for {
+ c1, err := er.ReadByte()
+ if err != nil {
+ break loop
+ }
+ if c1 != 0x1b {
+ bw[0] = c1
+ w.out.Write(bw[:])
+ continue
+ }
+ c2, err := er.ReadByte()
+ if err != nil {
+ break loop
+ }
+ if c2 != 0x5b {
+ continue
+ }
+
+ var buf bytes.Buffer
+ for {
+ c, err := er.ReadByte()
+ if err != nil {
+ break loop
+ }
+ if ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || c == '@' {
+ break
+ }
+ buf.Write([]byte(string(c)))
+ }
+ }
+
+ return len(data), nil
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/.gitignore b/vendor/github.com/nbutton23/zxcvbn-go/.gitignore
new file mode 100644
index 00000000000..4bff1a28e42
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/.gitignore
@@ -0,0 +1,2 @@
+zxcvbn
+debug.test
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/Gopkg.lock b/vendor/github.com/nbutton23/zxcvbn-go/Gopkg.lock
new file mode 100644
index 00000000000..b5a62a38020
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/Gopkg.lock
@@ -0,0 +1,27 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+ name = "github.com/davecgh/go-spew"
+ packages = ["spew"]
+ revision = "346938d642f2ec3594ed81d874461961cd0faa76"
+ version = "v1.1.0"
+
+[[projects]]
+ name = "github.com/pmezard/go-difflib"
+ packages = ["difflib"]
+ revision = "792786c7400a136282c1664665ae0a8db921c6c2"
+ version = "v1.0.0"
+
+[[projects]]
+ name = "github.com/stretchr/testify"
+ packages = ["assert"]
+ revision = "69483b4bd14f5845b5a1e55bca19e954e827f1d0"
+ version = "v1.1.4"
+
+[solve-meta]
+ analyzer-name = "dep"
+ analyzer-version = 1
+ inputs-digest = "b750880cdc8ce044e6f9bf3b331d8a392471c328107b8c3d42e3e11022d76858"
+ solver-name = "gps-cdcl"
+ solver-version = 1
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/Gopkg.toml b/vendor/github.com/nbutton23/zxcvbn-go/Gopkg.toml
new file mode 100644
index 00000000000..c59386c0a10
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/Gopkg.toml
@@ -0,0 +1,26 @@
+
+# Gopkg.toml example
+#
+# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
+# 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"
+
+
+[[constraint]]
+ name = "github.com/stretchr/testify"
+ version = "1.1.4"
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/LICENSE.txt b/vendor/github.com/nbutton23/zxcvbn-go/LICENSE.txt
new file mode 100644
index 00000000000..e8f59e06d23
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) Nathan Button
+
+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/nbutton23/zxcvbn-go/README.md b/vendor/github.com/nbutton23/zxcvbn-go/README.md
new file mode 100644
index 00000000000..a9d2f78368e
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/README.md
@@ -0,0 +1,78 @@
+This is a goLang port of python-zxcvbn and [zxcvbn](https://github.com/dropbox/zxcvbn), which are python and JavaScript password strength
+generators. zxcvbn attempts to give sound password advice through pattern
+matching and conservative entropy calculations. It finds 10k common passwords,
+common American names and surnames, common English words, and common patterns
+like dates, repeats (aaa), sequences (abcd), and QWERTY patterns.
+
+Please refer to http://tech.dropbox.com/?p=165 for the full details and
+motivation behind zxcbvn. The source code for the original JavaScript (well,
+actually CoffeeScript) implementation can be found at:
+
+https://github.com/lowe/zxcvbn
+
+Python at:
+
+https://github.com/dropbox/python-zxcvbn
+
+For full motivation, see:
+
+http://tech.dropbox.com/?p=165
+
+------------------------------------------------------------------------
+Use
+------------------------------------------------------------------------
+
+The zxcvbn module has the public method PasswordStrength() function. Import zxcvbn, and
+call PasswordStrength(password string, userInputs []string). The function will return a
+result dictionary with the following keys:
+
+Entropy # bits
+
+CrackTime # estimation of actual crack time, in seconds.
+
+CrackTimeDisplay # same crack time, as a friendlier string:
+ # "instant", "6 minutes", "centuries", etc.
+
+Score # [0,1,2,3,4] if crack time is less than
+ # [10^2, 10^4, 10^6, 10^8, Infinity].
+ # (useful for implementing a strength bar.)
+
+MatchSequence # the list of patterns that zxcvbn based the
+ # entropy calculation on.
+
+CalcTime # how long it took to calculate an answer,
+ # in milliseconds. usually only a few ms.
+
+The userInputs argument is an splice of strings that zxcvbn
+will add to its internal dictionary. This can be whatever list of
+strings you like, but is meant for user inputs from other fields of the
+form, like name and email. That way a password that includes the user's
+personal info can be heavily penalized. This list is also good for
+site-specific vocabulary.
+
+Bug reports and pull requests welcome!
+
+------------------------------------------------------------------------
+Project Status
+------------------------------------------------------------------------
+
+Use zxcvbn_test.go to check how close to feature parity the project is.
+
+------------------------------------------------------------------------
+Acknowledgment
+------------------------------------------------------------------------
+
+Thanks to Dan Wheeler (https://github.com/lowe) for the CoffeeScript implementation
+(see above.) To repeat his outside acknowledgements (which remain useful, as always):
+
+Many thanks to Mark Burnett for releasing his 10k top passwords list:
+http://xato.net/passwords/more-top-worst-passwords
+and for his 2006 book,
+"Perfect Passwords: Selection, Protection, Authentication"
+
+Huge thanks to Wiktionary contributors for building a frequency list
+of English as used in television and movies:
+http://en.wiktionary.org/wiki/Wiktionary:Frequency_lists
+
+Last but not least, big thanks to xkcd :)
+https://xkcd.com/936/
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go b/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go
new file mode 100644
index 00000000000..3320d59683a
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/adjacency/adjcmartix.go
@@ -0,0 +1,96 @@
+package adjacency
+
+import (
+ "encoding/json"
+ "log"
+ // "fmt"
+ "github.com/nbutton23/zxcvbn-go/data"
+)
+
+type AdjacencyGraph struct {
+ Graph map[string][]string
+ averageDegree float64
+ Name string
+}
+
+var AdjacencyGph = make(map[string]AdjacencyGraph)
+
+func init() {
+ AdjacencyGph["qwerty"] = BuildQwerty()
+ AdjacencyGph["dvorak"] = BuildDvorak()
+ AdjacencyGph["keypad"] = BuildKeypad()
+ AdjacencyGph["macKeypad"] = BuildMacKeypad()
+ AdjacencyGph["l33t"] = BuildLeet()
+}
+
+func BuildQwerty() AdjacencyGraph {
+ data, err := zxcvbn_data.Asset("data/Qwerty.json")
+ if err != nil {
+ panic("Can't find asset")
+ }
+ return GetAdjancencyGraphFromFile(data, "qwerty")
+}
+func BuildDvorak() AdjacencyGraph {
+ data, err := zxcvbn_data.Asset("data/Dvorak.json")
+ if err != nil {
+ panic("Can't find asset")
+ }
+ return GetAdjancencyGraphFromFile(data, "dvorak")
+}
+func BuildKeypad() AdjacencyGraph {
+ data, err := zxcvbn_data.Asset("data/Keypad.json")
+ if err != nil {
+ panic("Can't find asset")
+ }
+ return GetAdjancencyGraphFromFile(data, "keypad")
+}
+func BuildMacKeypad() AdjacencyGraph {
+ data, err := zxcvbn_data.Asset("data/MacKeypad.json")
+ if err != nil {
+ panic("Can't find asset")
+ }
+ return GetAdjancencyGraphFromFile(data, "mac_keypad")
+}
+func BuildLeet() AdjacencyGraph {
+ data, err := zxcvbn_data.Asset("data/L33t.json")
+ if err != nil {
+ panic("Can't find asset")
+ }
+ return GetAdjancencyGraphFromFile(data, "keypad")
+}
+
+func GetAdjancencyGraphFromFile(data []byte, name string) AdjacencyGraph {
+
+ var graph AdjacencyGraph
+ err := json.Unmarshal(data, &graph)
+ if err != nil {
+ log.Fatal(err)
+ }
+ graph.Name = name
+ return graph
+}
+
+//on qwerty, 'g' has degree 6, being adjacent to 'ftyhbv'. '\' has degree 1.
+//this calculates the average over all keys.
+//TODO double check that i ported this correctly scoring.coffee ln 5
+func (adjGrp AdjacencyGraph) CalculateAvgDegree() float64 {
+ if adjGrp.averageDegree != float64(0) {
+ return adjGrp.averageDegree
+ }
+ var avg float64
+ var count float64
+ for _, value := range adjGrp.Graph {
+
+ for _, char := range value {
+ if char != "" || char != " " {
+ avg += float64(len(char))
+ count++
+ }
+ }
+
+ }
+
+ adjGrp.averageDegree = avg / count
+
+ return adjGrp.averageDegree
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go b/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go
new file mode 100644
index 00000000000..e5dfede4d18
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/data/bindata.go
@@ -0,0 +1,444 @@
+// Code generated by go-bindata.
+// sources:
+// data/Dvorak.json
+// data/English.json
+// data/FemaleNames.json
+// data/Keypad.json
+// data/L33t.json
+// data/MacKeypad.json
+// data/MaleNames.json
+// data/Passwords.json
+// data/Qwerty.json
+// data/Surnames.json
+// DO NOT EDIT!
+
+package zxcvbn_data
+
+import (
+ "bytes"
+ "compress/gzip"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+func bindataRead(data []byte, name string) ([]byte, error) {
+ gz, err := gzip.NewReader(bytes.NewBuffer(data))
+ if err != nil {
+ return nil, fmt.Errorf("Read %q: %v", name, err)
+ }
+
+ var buf bytes.Buffer
+ _, err = io.Copy(&buf, gz)
+ clErr := gz.Close()
+
+ if err != nil {
+ return nil, fmt.Errorf("Read %q: %v", name, err)
+ }
+ if clErr != nil {
+ return nil, err
+ }
+
+ return buf.Bytes(), nil
+}
+
+type asset struct {
+ bytes []byte
+ info os.FileInfo
+}
+
+type bindataFileInfo struct {
+ name string
+ size int64
+ mode os.FileMode
+ modTime time.Time
+}
+
+func (fi bindataFileInfo) Name() string {
+ return fi.name
+}
+func (fi bindataFileInfo) Size() int64 {
+ return fi.size
+}
+func (fi bindataFileInfo) Mode() os.FileMode {
+ return fi.mode
+}
+func (fi bindataFileInfo) ModTime() time.Time {
+ return fi.modTime
+}
+func (fi bindataFileInfo) IsDir() bool {
+ return false
+}
+func (fi bindataFileInfo) Sys() interface{} {
+ return nil
+}
+
+var _dataDvorakJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x98\x57\x57\x1b\x41\x0c\x85\xdf\xf9\x15\xb0\x74\x30\xbd\xf7\xde\x7b\x6f\xa6\x77\x30\xbd\x17\xf3\xdb\x33\x26\x39\x99\xef\x9e\x78\x96\x7d\x88\x5e\x72\xc6\x61\xf9\xa4\x95\xae\x34\xd7\x7c\x14\x14\x16\x46\x63\xf7\xfb\xb7\x67\x51\x67\x61\xee\x83\xfb\x58\xef\x8e\x5b\xdf\x47\xf7\xa1\xa3\x22\x4a\xfd\x39\x5f\x3f\x65\x32\xf9\xce\xd1\xd6\xc7\xdf\x67\xa2\xcc\xb4\x3f\xdf\x2f\x46\xdf\xc7\xed\xdf\xff\x13\x35\x10\xbc\xf7\xf5\x33\xb8\xb1\xdf\xc3\xca\xd3\x91\xfc\x82\x90\x1b\x49\x6e\x28\xfa\x99\xdc\x54\xec\xc9\xa9\x6e\x8d\x22\xe4\x26\x92\x91\x4f\x90\xdc\x5c\xe2\x69\xb5\xbd\x12\x45\xc0\xcd\x04\x23\x9d\x20\xb8\xa5\xd4\xc3\x6e\xe7\x25\x88\x80\x5b\x08\x46\x36\x41\x70\xeb\x8e\x87\xbd\x6d\x48\x10\x01\xb7\x12\x8c\x6c\x82\xe0\xb6\x32\x0f\x3b\x19\x95\x20\x02\x6e\x23\x18\xd9\x04\xc1\xed\x55\x1e\x76\x3a\x26\x41\x04\xdc\x4e\x30\xb2\x09\x82\xa1\xf6\xe8\x70\x48\x82\x08\xb8\x83\x60\x64\x13\x04\xd7\x57\xca\x58\x30\x88\x80\x8b\xcc\x46\xc4\xfd\xcc\xa3\x05\x81\x79\x11\x1c\xe7\x62\x7f\x20\x4c\x2e\xb6\x1a\x91\x12\xab\x11\x29\xb5\x1a\x91\x32\x2b\x25\x97\x5b\x35\xaf\xc2\x4a\xc9\x95\x56\xb7\x48\x95\xd5\x50\x57\x13\x5c\xd7\xe7\x1f\xdc\xce\xe6\x0d\x12\xa5\xd3\x9f\xf9\x7f\x50\xb3\xab\xe4\x14\xc9\x9c\x52\x69\x19\xef\x24\x8e\xc5\xcd\x9c\xb4\x52\xc8\x35\x24\x3f\x2c\xf9\x07\x99\x7f\x4f\xf5\xcf\x45\x7a\xdf\x54\x70\x2d\xc1\x14\x13\xb3\xe4\x20\x73\xde\x8e\x47\x24\x7b\x01\xd7\x11\xcc\x3e\xb3\xff\xa8\x38\xb3\xcf\x15\x36\x85\xb7\x15\x70\x67\x68\x44\x20\x7f\xa9\xe5\xdd\x42\xb0\x2c\x02\xee\xb2\x02\x77\x9b\xc9\xa2\xc7\x4c\xca\xbd\x56\xba\xe8\xb3\xd2\x45\xbf\x99\x37\x1c\x08\x09\x43\x7a\x49\x04\x7b\xd6\xd5\x19\xde\xca\x83\xcc\xf9\x75\xdd\xff\xd2\xd1\xb0\x3f\x9f\x8d\xfb\xf3\xd5\x4c\x32\xc9\x0d\x11\xcc\x0b\x87\x17\x11\x17\x26\x57\xfc\xe3\xb2\x04\x17\xf0\x30\xc1\xe7\x13\xf9\x8d\x1f\x03\x32\xfb\x83\x41\x7f\x76\x6f\x2b\xe0\x11\x82\x59\x3f\xce\x02\x45\xf6\xb4\xe2\xcf\x17\x93\x32\x95\x02\x1e\x25\x98\x97\x3a\x2f\x7b\x5a\x58\x66\xcf\x3e\xb8\xb7\x15\xf0\x18\xc1\x7c\x7d\xc2\x58\x6f\x5e\x4a\x2c\x8b\x0b\x22\xe0\x71\x82\x99\x01\x33\x23\x8c\x0d\x83\x42\x72\xf5\x16\xf0\x04\xc1\xac\x1f\xcb\xc2\x37\x61\x70\xca\xf3\x72\x4a\xc1\x93\x04\x63\x2d\xca\x26\x60\x40\x07\x48\xa4\xe3\x29\x82\xd9\x65\xc2\x28\x43\x64\x19\x0b\x9e\x26\x98\xe2\xa7\xef\xe1\x4a\xe2\x76\xe5\x05\x7c\x3d\xab\xa5\x98\x21\x98\x82\x67\xc7\xd9\xb0\x97\xb5\x64\x19\xcf\x12\x4c\x00\xb3\xe7\x42\x65\x96\xcf\xab\x12\x50\xc0\x73\x04\xf3\xae\xe3\x46\xe3\x14\xb2\xa9\x6c\xb6\xdb\x74\x02\x9e\x27\x98\x00\xde\x1b\xf4\xf2\x94\x21\x1b\xec\x02\x0a\x78\x81\x60\xec\x57\xd9\x1b\xcc\x12\xca\x89\xad\xf1\x22\xc1\x9c\x30\xae\x4a\x2a\x84\xf5\x76\x4a\x60\x83\x05\xbc\x44\x30\x1f\x24\x80\x12\xe3\x4d\xe7\x3c\x1b\x1b\x29\xe0\x65\x82\x29\x31\x66\x4f\x85\x30\x38\xa4\x97\xdb\x1b\x02\x5e\x21\x98\xb5\xe4\x0e\x66\xc3\x38\x85\x18\xef\x5c\xed\x05\xbc\x4a\x30\x33\x60\x66\xd4\x2e\x5e\x3f\xb6\x79\x6b\x04\x73\x0d\x72\x58\x18\x04\x43\x11\x0b\x5e\x27\x98\xaf\xc6\x57\xe6\xaa\xc4\xd8\xc7\x82\x37\x08\x66\x5d\x39\x14\xbc\xa6\xb8\x9b\x19\xdc\x0d\x8b\x80\x37\x09\xe6\xec\xb3\xae\x90\x58\xc8\x23\xfd\x93\xf1\x16\xc1\x18\x84\xa0\xc9\xa2\x93\xa3\xbe\x9d\xee\x05\x9c\x4e\x93\x9c\xe0\x9b\x4c\xe2\x94\xb7\x09\xc6\x46\x4f\x02\x13\xf3\xe9\xd2\x17\xf0\x8e\xd5\xdf\xc9\x76\xad\xbe\xec\xed\x05\x8c\x6c\x10\x10\x63\xa3\x05\xbc\x6f\xe6\x90\x0f\xac\x1c\xf2\xa1\x95\x43\x3e\xb2\x72\xc8\xc7\x56\x0e\xf9\xc4\xca\x21\x9f\x5a\x39\xe4\x33\x2b\x87\x7c\x6e\xe5\x90\x2f\xac\x1c\xf2\xa5\x95\x43\xce\x58\x39\xe4\x2b\x2b\x87\x7c\x6d\xe5\x90\x6f\xac\x1c\xf2\xad\x95\x43\xbe\xb3\x72\xc8\xf7\x56\x0e\xf9\xc1\xca\x21\x3f\x5a\x39\xe4\x27\x2b\x87\xfc\x6c\xe5\x90\x5f\xac\x1c\xf2\xab\x95\x43\x7e\xb3\x72\xc8\xef\x56\x0e\xf9\xc3\xca\x21\x7f\x5a\x19\xe4\xac\x95\x41\xfe\xfa\xef\x76\xd3\xfd\x9b\x2d\xc8\x16\xfc\x0a\x00\x00\xff\xff\xd5\xc4\xca\x21\xce\x20\x00\x00")
+
+func dataDvorakJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataDvorakJson,
+ "data/Dvorak.json",
+ )
+}
+
+func dataDvorakJson() (*asset, error) {
+ bytes, err := dataDvorakJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/Dvorak.json", size: 8398, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataEnglishJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\xbd\x4b\x9a\xe3\xca\x0e\x34\xb6\x15\x7f\x9a\xf4\xe4\xae\xc0\x6b\xf0\x0e\x3c\x4a\x92\x29\x31\x4b\x24\x93\x87\x0f\xa9\xd4\xde\xbc\x81\x88\x40\x52\xfd\x0f\xee\xed\xea\x3e\x55\x2a\x32\x1f\x78\x04\x02\x81\xff\xef\xf6\xff\x94\xfd\xb8\xfd\xdf\xff\xef\xff\x75\xfb\xd4\xf3\xf6\xbf\x5b\xb1\xff\x1d\xd5\xff\x6f\xcc\xf6\xff\xc9\xff\xb7\x0c\xf8\x7b\x3a\xfc\xbf\xfb\xff\xd5\xbb\xfd\xdf\xec\xff\xfd\xad\x7f\xdd\xfd\xff\x16\x7c\x1b\xbe\x7e\x2e\xf5\xed\xff\xf4\x67\xb6\xff\xbf\xd7\xcd\xfe\x7f\xf1\x4f\x1d\xd3\xcb\x7f\x6c\xfe\xd8\xff\x0d\x75\xf9\xe3\x3f\xfc\x73\xee\x07\xfe\xfb\x81\x7f\xb4\xff\xeb\xfc\x7b\xaa\x7f\x9c\x3d\x94\xff\xec\x3b\xf9\x87\xbe\x33\x1e\xe0\x0f\xbe\x2e\xc7\x68\x7f\xec\xf8\xf6\xd3\x7f\x32\x4d\x13\xbe\x07\x7f\xa4\xcd\xbf\x17\xaf\x50\xfd\xfb\x52\x57\xf1\x4d\x5b\x79\x8c\x07\x3f\xf7\x0f\xbe\xe5\x91\x0f\x7c\x23\xfe\xc2\xef\x79\xd4\xb2\x3c\xec\xcf\xa9\x3c\xfd\x1f\x3f\x39\xf9\x27\x94\x3b\xbf\xcf\x7f\x29\x3e\xb7\x4f\xfe\x80\xe7\x8a\xc7\x5b\x0e\xbe\xfb\xf2\xd4\x52\xe1\x21\xb9\x08\x0f\xbc\x78\xf1\x95\xc0\x62\x8d\xfa\x57\xfe\x88\x7e\xf3\xe2\xff\x3f\x94\x01\x6b\xea\xab\xb3\x67\xfc\x92\x8a\x65\x7e\xd4\xca\x3d\xc8\xfe\x9f\xb6\x6c\xef\xea\x5f\x70\x55\xea\x39\xf9\x7f\x9c\x6a\x7d\xe2\xa7\x33\xf6\xa1\x70\x7f\x0a\x96\xa3\x3e\x93\x7f\x7f\x97\xfa\x27\x9f\x1c\x0b\x3f\x67\xbc\xc2\xc1\x25\x2b\x7f\xf0\xc7\x7d\xab\x33\xde\xf4\x83\xd5\xd4\x3a\xe2\x75\x7a\xfd\x26\x7b\x4c\x7e\xc0\x27\xef\x78\xb5\x1d\x7b\x86\xdf\x8b\xad\xde\xed\xa9\x7d\x31\x1e\x78\x1e\xee\x68\x9f\xce\x3d\xeb\xbf\xe1\x20\xe8\x85\xfc\x87\x76\x3c\x1d\x1e\xff\x48\x58\x74\x3c\xd8\x1b\xff\x7c\xee\xd8\x8b\xe3\x98\x70\x72\xf8\xdf\x97\x9c\x07\xac\xcb\xb2\x24\xfc\xf5\x85\x9d\x79\x67\xee\xea\x51\x2b\xf7\x09\xcf\x5d\xfe\xe0\xd0\xed\x27\xff\xdb\x98\xfd\x05\xe7\xca\x85\xe7\x0f\xf2\x98\xed\x75\xdb\x3e\x5c\xc3\x2d\x4e\x37\x3e\x61\xca\xb1\xbf\xfe\x4a\x09\x3f\x9f\x3e\x38\xa6\x43\x7d\x2f\xf8\xeb\x82\xb7\xf2\xef\x3e\xfd\xbc\xd8\xe7\x62\xc9\x3f\xb1\xcb\xf8\xa0\x7d\xd4\x1a\xa6\xe5\x13\x1f\xb7\x27\x6c\xfb\x7c\xf6\x23\xff\x03\xde\xf7\xee\x1f\x6e\xaf\x85\x45\xbd\xdf\xf1\x9b\xf8\xfd\x76\xbc\x70\xcc\x1e\xe5\xc5\xa3\x33\xf1\x77\xd4\x93\x67\x7b\xcc\x93\x1f\xca\xe3\x8d\x6b\x9c\x26\xff\xde\x35\xd7\x75\xe2\x49\xf2\xdf\xb5\x1f\x3c\x17\xef\x84\xfb\x5c\x16\x5c\xf9\x7b\xc1\x4d\xb7\x8b\x18\x2f\xfa\x48\x71\xa9\x97\x87\xd6\x01\xaf\x31\xd4\xbc\xf3\x08\xf4\xbc\x76\x47\xc5\x5b\x3d\xec\x68\x1e\xd8\xee\x3b\x97\xb7\xcb\xc7\x81\x05\xd6\x06\x2d\xba\x7f\xfe\x0e\xfe\x0b\xb8\xc5\xf7\xb2\xed\xfc\xb1\xa9\x64\xbe\xd4\xc1\xab\x76\xcf\x79\xd2\x4f\xb7\xf5\x7a\xd7\xcd\x5f\xc9\xaf\x30\xbe\xd7\x1e\x1b\x27\x8a\x07\x2b\xdd\xf9\x0b\xa7\xb4\xeb\x82\xe1\xd8\x0d\xf8\x45\xcf\x9c\x57\x3d\xbe\x2f\x0a\xed\xc6\x56\xcf\x85\x8b\x52\x57\x5d\x32\x9e\xa2\xf2\x07\xef\x74\xfa\x4f\x16\xbd\x6f\x9a\xec\x91\x79\x22\xf7\x23\xf3\x94\x2e\x07\x0e\xe3\xbc\xf1\xbb\x71\x27\x70\x06\x6c\x4f\xf0\xcb\xbb\x02\x7b\x82\x1b\x3f\xa6\x75\xcd\x4b\x1e\x62\x23\x79\x85\xf9\xe1\xc7\xf6\xe1\x2b\x3e\xb9\x13\xef\xad\x6a\xc7\x37\xdf\x5c\x6d\x27\xbf\x65\x4e\x03\x2f\xc2\x1b\x0b\xc7\x7f\x7c\x9c\x79\xe7\x95\xc4\xd6\x70\x0b\x70\xd3\x66\xdc\xea\x2d\xcf\x79\xee\xb0\x3e\x66\xf8\x0e\xad\x67\xfe\xa3\x3d\xb4\x7f\xe3\xb2\x0f\xf8\x99\x29\xd3\x5a\xaf\x53\xea\xfd\x4f\x5b\xa6\x6c\x1b\x45\x7f\x00\xb3\xa3\x35\xe9\x8f\x53\x16\x69\xcc\x69\xc3\xef\xc4\xb9\x5f\x0a\x7e\xee\x9e\xf4\xb1\x79\xa2\x09\x38\x92\xec\x3f\x2e\x59\xd2\xd2\xda\x37\x15\xff\x2e\x33\x33\x1b\xbe\x6f\xd6\x61\x99\xb9\x1a\x59\x57\x2a\x2f\xb1\x18\x1b\x7f\x25\x9e\xbe\x4f\x73\x98\x17\x7e\xae\x9f\x0f\x1a\x3f\x5c\xd0\x7b\x9a\xcb\xc4\xcb\x5d\x27\x9a\x98\x38\x64\x76\x73\x76\xfd\x84\xfd\xe2\xc9\xef\x5a\x19\x32\x5c\xdf\xfe\xc4\xea\xe2\x28\xcd\xf4\x53\x66\x92\xb9\x6e\xb5\x99\xdd\x38\x97\x34\x02\xef\xb1\xe0\x26\x9b\xe3\xd8\x7c\x33\xb6\x8a\xb5\x9f\xf2\xdd\x7f\xfc\xc9\x1d\x3b\x6a\x5c\x05\xb7\xe6\x78\x70\x18\x90\xba\x62\x57\xf5\x32\xfc\xe3\x9d\xe1\x5e\x4e\xd8\xe5\x79\xd6\x21\xf2\x77\x59\x37\xdb\x45\x78\x8b\x04\x9f\x52\x36\x7c\x54\xa1\x97\x82\x9f\xb9\x6f\x25\x63\xf9\xd2\x64\xbf\x69\xe0\x37\xeb\x98\x2d\xf9\x97\x0b\xbf\xc1\xd9\xfc\xd4\x0e\x9f\x59\xbb\x89\x26\xb2\x2c\xe7\x81\x0d\xd4\x0d\xb1\x9b\x37\xf1\xe0\x9a\xa3\xe3\x47\xb8\x43\xe7\xf6\xf9\xd6\x0f\x78\x85\x05\xbe\x63\x4e\xba\xfa\xf3\x47\x8b\xda\x5f\x47\x26\xff\xda\xa1\xe1\x89\x49\x2f\x19\x9b\x51\xbf\x3c\x75\xfa\x0f\x7e\x51\x78\x3e\x71\x0c\xc7\x73\x83\x91\xa8\xb0\xab\x15\xfe\xdf\xd6\x1a\x9b\x69\xdb\x45\x7f\x70\x1c\xd8\xb7\x89\x67\x60\x2f\x0b\x4e\x60\xfe\xed\xcf\x38\x7a\xf8\x90\x27\xed\xdf\xc8\x47\xf6\xa3\x82\xf7\xaa\x34\x13\x3d\x0e\x71\x2c\xd7\xb9\x98\xb5\xbc\x31\xe4\x60\x84\xe0\x57\x1e\xd7\x8c\x47\xc0\xfe\x0a\x2f\xf4\x81\x97\xd8\xe9\x08\x07\x6e\xeb\x41\xaf\x5c\xf9\x1c\x0f\x3e\x96\x1b\x4d\x9a\x8c\xba\x2d\x72\x02\xe7\xba\x9a\xb1\x18\xda\x8e\xed\x5c\x52\x1a\xa6\x13\x0e\x60\xae\x38\x80\x27\xbf\xed\x2d\x67\xb5\xe7\xbe\x62\x77\x56\xbe\xda\x44\xb7\x70\x6c\x27\x23\xa4\x7e\xac\x15\x8e\x9d\x97\xd8\x0c\x33\x63\x1e\xfb\x06\x98\x87\xd3\x16\x89\x56\x23\x27\x9c\xdb\xcb\x53\xe3\x48\x7a\x28\xe7\xff\xf5\xce\x73\x6b\xb7\x4d\xc7\x9d\x2e\xca\xae\x13\x5c\x02\x7f\xa6\x37\x93\x86\x5f\xb3\x9d\xf0\x8a\xf5\xc5\xab\xf6\xe1\x8b\xaf\x66\x3f\xf0\xa1\xdd\x27\x2e\x6b\x57\xb1\xc8\xc3\xa6\x23\x84\x25\xa4\x2b\x9c\x0b\x1e\x6b\x4e\x9b\xad\x08\xde\xd0\x3c\x20\x5e\x31\xe9\x64\xa5\x30\x86\x19\xaf\x64\xbf\x87\x0e\x65\xa6\x17\x5d\x47\xfe\x5a\xdb\x49\xfe\xda\x21\xcd\x0b\xee\x2c\x16\xd2\xaf\x2e\x42\x97\x8d\x9f\xd2\x27\xbc\xc3\x71\x6e\x38\x76\x65\x87\x91\xa9\xb6\x49\x1b\xae\xd2\xb3\x60\x57\x6c\xe1\x68\x08\xc6\xcc\x70\xca\xde\xf9\x81\x53\x86\x6d\xf0\x87\xe3\xb3\x28\xc4\xb8\x73\x43\xcc\x9a\xd2\x23\xd1\x1e\x99\x71\xd6\xbd\x49\xdc\x4c\xbd\xca\x87\x16\xd4\xe3\x1c\xfc\xb2\xeb\x15\xd3\xc2\x87\x0d\xb3\x65\x66\x99\xf7\x84\xbf\x0f\x61\xe6\x4e\xe7\xd4\xe5\x74\x1e\xe5\x7e\xfa\xbe\x3f\x68\xc4\x6d\xfb\xf1\xd0\x5b\xfa\xfb\xd1\x61\xc1\xe9\x61\x40\xcf\x9b\x96\xee\x1b\x63\x11\x73\xdb\x6f\x1e\xe3\x32\xaf\x75\x3b\x18\xdf\x6e\xb4\x83\x77\x6c\xed\xb3\xe8\x10\xf2\x06\x1c\xd8\xb1\xc7\x94\x9a\xa5\x56\x48\xcb\x07\xda\xdd\x5b\xe2\xbd\x60\x53\xf6\xf8\x26\xed\x7e\x57\x68\x59\x4f\x06\x29\x76\xa6\x7c\x51\x72\xd1\x9b\xce\x1b\x0f\x60\xd6\xd1\x1b\x92\x87\x3a\x8c\xf8\x18\x4c\x67\xdc\x47\x33\xd7\x38\x27\x70\x54\x58\xab\x9c\x10\xfd\x58\x4c\x5b\x18\x06\x54\x06\xa8\x38\x2e\xfd\x44\xf7\x3c\xd2\xa3\xd9\xfe\xf8\xb3\xfc\x67\x3e\xf4\x28\x38\x2e\x87\xce\xdd\x3d\x31\x09\x41\x28\xe5\xa1\xe7\xce\x37\x61\x38\x19\xde\xc8\x22\x6e\xc4\x46\xe5\x7e\xb7\x70\x6f\x09\x33\x93\x69\x14\xf7\xb5\x98\xf3\xe6\xc1\xd0\x5b\x9b\x45\x96\x0f\x78\xe7\x61\x90\x1d\x18\x19\x94\x74\x34\x6b\x45\xb7\xe6\x9e\xb1\x7b\xe1\x7c\x3d\x2d\xa0\x9f\xe7\xbf\x56\x58\x82\x8f\x2f\x1a\xfc\x83\xc7\x75\x5a\xaa\xb2\x2c\x58\x0b\xc4\x72\xb1\x7f\xb8\x1d\xe3\xb9\x77\x49\xae\x41\xa6\x65\xc5\x89\xb2\x83\xf6\x66\xf4\xc5\xb0\xd8\xc2\x4f\x3a\xf2\xcc\x80\xdf\x3c\x18\xd2\x01\xb3\xbd\x30\x4f\xe3\x65\xd7\xc7\x04\x4b\xbf\x97\xa1\x39\xd4\x1b\x82\x0f\xae\xc7\x3e\x31\x00\xdb\x68\xd8\xde\x57\x5c\xec\x76\x99\x26\x91\x19\x81\x7b\x1c\xfc\x87\xca\x87\x5d\x0b\xee\x1a\x32\x0b\x2d\x34\x7c\x54\x97\xf9\x02\x48\x04\x07\x5e\x85\x89\x3b\x63\xf7\x83\x2e\x95\x0f\xf1\xb5\xd9\xf8\xe0\xbc\x95\x7a\xf2\xb2\x8c\x0c\x30\x6c\x7d\xf8\xdc\x63\xc1\x8e\x26\xd9\x5f\xbb\x0a\xc8\xac\xaa\x1f\x2b\x5e\xaa\xbb\x36\x6e\xe5\x9d\xee\xb1\x69\xff\x9d\x05\xbf\x7f\x39\x15\x63\x8d\x8a\xac\x76\x3e\xbc\xa5\xae\x13\x6f\x24\xdc\x3a\x43\xe5\xa5\xea\x34\x3c\x18\x94\xba\xeb\x62\x56\xc0\xa4\x25\xe7\x19\x87\xbf\x2c\x0a\xb1\xdc\xbe\x33\x68\x0c\xb3\x78\xae\x3a\xcf\x69\xc3\x77\xcc\x99\x7e\x12\x9e\xa7\xdb\x22\x2f\xf0\x8f\xc2\x12\xd2\xc6\xa6\x3b\xd7\x4a\xee\x17\xbb\xb9\xc9\xe1\x86\x6d\xf2\x08\x90\xff\xd9\xd2\x42\xee\xe0\x58\x69\x3a\x5f\x5c\xf8\x5d\xe6\xc9\xec\xbd\x3c\x59\x3f\xd1\x82\xd9\x12\x31\xe1\xe2\x4f\xdc\xf3\x84\x9f\x2f\xbf\x58\x36\xbf\x20\xb8\x2d\x1b\x73\xe6\xd4\xed\x75\x32\xcb\x40\xd7\x5f\xdf\x4c\x33\xd2\xa0\x8b\x52\xb4\x18\x0b\x03\xc3\x4c\x83\xc4\x10\x01\xbb\xb9\xe6\xbe\xe0\x7a\x75\x7c\xf9\x89\x19\xb3\x9d\xf9\x3f\xbc\x88\x71\xc1\x26\x5c\x29\xdb\xc5\xe9\x46\xbf\xa1\x7b\xc2\x87\xb6\x35\xd2\x3d\x54\xc8\x73\x4f\xe7\x44\x97\x4f\x7b\xa3\x98\xbf\xf2\x98\x76\xc8\x0d\x66\x5b\x9a\x71\xd7\x51\xe3\xc3\xc0\xec\x4c\x8c\x1f\x7e\x72\xe4\x50\x4f\x5e\x9b\xcd\x8c\xe1\x8c\x4c\x51\x5b\x6f\x46\x54\x59\xe8\x11\x27\x30\xe1\x29\x2c\x24\xd8\x0b\x4d\x81\x6d\xf7\x2e\x44\x60\xa5\x77\x33\x93\xa6\x6c\xb9\x02\xe3\xf0\x93\x8d\x6f\xb5\xdf\x4f\xc8\xa6\x1e\x3a\x33\x8f\xb6\xcb\xf6\xa8\x1b\xc2\x81\x76\xf5\xe0\x5e\xd3\x43\x7e\x72\x2a\x7f\x71\x77\xcc\xd6\xdb\x93\x30\xee\x5c\x26\xc6\x07\x7b\xfe\xe5\x26\x20\x4b\x34\x33\xc8\x2c\xc6\x9e\x01\xbe\x95\x87\x71\xf7\xb4\x63\xe0\x8d\x3d\x94\x71\x9b\xe1\xd4\x69\x61\x6e\xb4\x0c\xfc\x16\x7a\x4e\x19\x34\x33\xfd\xda\xfe\xfc\x6b\x57\x17\x89\xa7\xbb\x38\x3d\x78\x36\x2f\x54\x98\xea\xee\xe5\x81\xc5\xaf\x70\x2d\x5b\x36\x8f\x6b\xf6\x7a\x1f\xcb\xaa\x93\x89\xdf\x92\x10\x05\x4f\xf1\xf3\x63\xa5\x0d\xf3\x18\x41\xe9\xfd\xfd\xd4\x03\xbe\x2d\xf1\x80\xeb\x3e\x69\x64\xe2\xde\x7a\x24\x80\xc7\xf3\x18\x08\x9b\x58\x19\x99\x3c\x19\x99\x98\x33\x85\xa5\x09\x97\xe1\xff\x56\xbb\x97\xdb\x15\xa6\x1a\x55\x8e\x68\xe5\xeb\x78\xdc\x17\xc7\x6b\xce\xf1\x18\x9e\xdd\xb9\x13\xdb\x0f\xf3\xbe\xbc\xaa\x3d\x03\xcb\x3b\xad\x8b\x3b\x59\xd8\x00\x9e\xe9\x45\x9e\x75\xe3\xa5\x90\x5b\x44\xb0\xe0\xa9\x2b\x13\x7b\x8b\x27\x68\x4e\x13\xa3\xc4\x49\x9f\x3c\x6c\x48\x72\x7b\x0b\x59\x2b\x8d\x02\xf6\xb8\x2f\x07\xa3\xb0\x0c\x70\xc3\x1c\xe6\x41\x8f\x73\x78\xf2\x81\x98\x78\xe2\xee\xed\xe7\xb6\x6e\x74\xa6\x05\x37\xd8\x7c\x85\xa7\x8d\x8c\xdc\x56\xfa\x57\x8f\xac\xf4\xeb\xe1\x59\x7f\xfb\xbc\x02\x5a\x43\xe8\xf0\xf9\x23\x78\x70\x50\xb0\x78\x28\xd8\xb1\xeb\xbc\xf9\x3d\x86\x15\xcd\xba\xd3\xda\x72\x4b\x31\xe5\x95\x3b\x1c\x4d\x26\xf0\x8c\xe2\xcb\xac\x0c\x63\x8c\x5c\x92\xc1\x8e\xad\x02\x63\x60\x5b\xe9\x32\x10\x71\x98\xd3\x5f\xc1\x28\x58\x08\x07\x51\x16\x9e\x39\xbe\xf0\x16\xc9\x6a\x59\x5e\x75\xa2\x95\xb3\x57\x84\x75\x58\x4b\xee\x15\x33\x63\x4d\x91\x74\x0d\xf6\x94\xbc\x09\x34\x47\x0a\xd7\xea\xab\xf0\x68\x21\xb3\xe8\x15\x20\x59\x88\xb3\x30\x6d\xd5\x9d\x32\xdf\x6e\x3f\x46\x17\x08\xd7\x78\x17\x8e\xe9\x3f\x20\x30\x80\x6b\x37\x98\x75\x97\xad\xaa\x8c\xbf\xf1\x3e\x85\x19\xec\x82\x75\x67\x7c\x9d\x26\x3d\x00\xdf\x93\xa9\x4e\x1a\x66\x04\x0b\x4a\xef\x70\xf3\x4f\xd9\x9d\x91\x0f\x99\x5f\xc8\x73\x86\x6c\xce\xa6\xe8\x2e\xfa\xe9\x22\xb8\x6b\x89\xc3\x1c\x5b\xe0\x71\x35\x8e\x66\x46\x1c\x6f\x3e\xe6\xc9\x84\x7d\x67\x6e\xe2\x3e\x8c\x40\x42\x9d\x26\x66\xc1\x47\xe1\x9d\x77\x48\x4b\xa9\xe3\xc9\x7c\x19\xbe\x5f\x5e\x84\xdf\xb2\xf8\x37\xdf\x10\x7f\xe1\xb0\x4e\xa7\x27\xa6\x8b\xa5\x7a\x3c\x81\x48\x95\x78\x9f\xfc\xb4\x96\x39\x3d\xe8\xf2\xef\x5c\x8e\x3e\xc9\xe5\x75\x93\x12\xe9\x63\x63\x86\x60\xe7\x48\xbf\xea\x9e\x5e\x58\xb2\xe4\x91\xb0\xc2\x13\x47\x1e\x70\xe8\xb3\x99\x44\x9a\x5d\xf7\x66\x48\x19\xec\x04\x2c\xba\x58\xb8\x8b\x5b\xda\x4b\x66\x9a\x38\xa5\x5f\xbc\xbc\x5d\x6e\xac\x4e\xea\xfb\xb0\x9d\x6f\x1a\x68\x5b\x74\x3a\xb0\x99\xd7\xc4\x02\x98\x9d\x26\xd7\x97\x4c\x0f\x64\x89\x59\x15\x1a\x97\x3d\xd4\x96\x75\xe5\x73\x2c\xdd\xbe\xe2\xec\x0b\x11\x9e\x2b\xd3\x3b\xbb\x30\x8f\x85\xde\x70\x36\x1f\x87\xef\x6d\xe9\xcc\x96\x19\xad\xec\xa3\x50\x3a\xde\xee\x8d\x3e\x86\x0e\x9a\x01\x4e\x12\x62\x40\x9b\x70\x30\x5e\xb9\xdb\xe6\xe1\x9e\x9a\x95\xc6\x99\xf5\x00\x52\x21\xd1\xc6\x50\xc7\x31\xb3\x95\x9b\xa6\xe0\x63\x13\x74\xbb\xdd\x14\xae\x5e\x6f\x47\x7b\xf5\x93\x98\x4d\xdb\x0f\x5c\x60\x97\x47\xae\xd3\xb9\xf0\x8e\xb8\x7f\x2c\xf8\x98\x2c\xab\xf5\xb0\xed\x33\x2f\xc4\x14\xfa\xa0\x0f\x1e\xeb\xca\x9f\xb7\x2c\x2f\x77\x11\x8a\xef\x8c\x68\xed\x15\xb1\xbc\x6b\x5a\xe9\xb6\x1b\x7e\xb6\x0a\x06\x38\x72\x5c\xc7\x1b\x5c\x49\xc3\x49\x6c\xaf\x4e\x38\xab\x07\x51\x91\xae\x98\x11\x21\x2e\xb0\x0b\x8f\x85\x9d\x25\x26\x51\x22\xf8\xb6\x35\x26\xa0\xec\xd1\x3f\x4e\x37\x0d\xef\x9d\x07\x8f\xae\x20\x62\x8d\xbe\xec\xb2\x65\xa7\x45\x5d\x82\x93\x96\xac\x40\x8f\x89\xe7\x4b\x0e\xcb\xac\x91\xac\x1b\x20\x37\xfe\x5e\x47\x1f\x75\x8e\xf0\x81\x16\xcd\xbe\x08\x18\xfb\xc9\xc3\xcf\xf5\xc4\x6e\xcc\xa4\xef\xfb\xd7\xa9\xd2\xdd\x33\xfb\xee\xbb\x60\x21\x2b\x43\x47\x07\x28\xe4\xec\xb6\x2a\xd4\x21\x7c\x6f\xc7\x48\x15\x86\xbe\x30\xfe\x5a\x64\x08\x2c\x85\x72\x84\xb5\x3d\x37\xd3\x25\x22\x72\xcb\x95\xbf\x21\x29\xb9\x23\xf4\xdb\x60\xd7\xf1\x79\x2b\xef\x88\xbb\x13\xde\x1b\xdf\xd9\x66\x61\x62\x5d\xdc\x69\x32\xeb\xe0\x99\x92\xff\x41\x9a\x8a\x7f\x71\x50\x57\xf0\x67\xb9\x33\x2c\x54\x36\xb2\x9e\x71\xdb\xcd\x78\xc2\xb3\x73\x21\x2b\x2a\x49\xa7\x2e\x5e\x2c\xf3\xa4\x4f\x59\xdc\xd0\xc1\x64\x9e\x42\x1b\xde\x9f\xdc\x4c\xc5\xad\xc5\x22\x37\xa6\x18\x3b\xce\xf4\xef\x8d\xf0\x5b\x3b\x46\xf7\x89\xae\xd0\xbc\x7c\xa0\x9f\x0d\xc4\x46\xdc\xe5\x21\x16\x17\xc0\x7d\xe7\x88\x53\xf8\x8b\xad\x20\x54\xfe\x73\xf2\x08\x5b\x74\x6f\xbf\x0d\x36\x74\xa7\x35\xb1\x74\x0a\x05\x34\x45\x87\x8c\x34\x88\xa0\xfb\xc1\x0e\x23\xa4\x57\x37\x6b\x44\x07\xd2\x4d\x2d\xcc\x20\x5e\xe1\x29\x06\x83\xaf\xc5\x7e\xe5\x1e\x3f\xe9\x2f\x85\x5f\x63\xbe\xf2\x86\x22\x8f\x9d\x1c\x5e\x80\x89\x31\x9e\x9d\x9a\x9e\x01\xae\xbc\xc4\x7e\x30\x72\xda\xf2\xca\xec\x22\x92\x60\x62\x41\x45\xf0\x3a\x2e\xc8\x2e\x6f\xd3\x25\x9c\xad\xc8\x4e\x86\x7a\x76\xc7\x2d\x70\x75\x41\x4c\x0d\xed\xee\xeb\xca\x83\x4e\xfc\xde\x5f\x60\x53\xf6\x76\xde\xef\x78\x84\xa9\x1d\x83\x7e\x9c\x2a\x7e\x2f\x53\x9c\x7d\x1c\xf1\x68\x3d\xb1\x8a\x89\x7f\xcc\xca\x60\x7e\xaa\x42\x33\xfc\xab\xd9\x1e\x16\xdc\x6c\x67\xcc\x4b\x32\xd8\x2f\x17\xe4\xb5\x0c\x58\xc3\x2d\x07\x48\x14\xa1\xed\xc3\x2e\xf2\xc1\x25\x7a\xea\x3e\xd8\x7b\x45\x0e\xee\x09\x34\xf3\x08\xcb\x2b\x26\xfc\xd6\x27\xfd\x95\x39\x21\x5a\x52\x33\x7e\x93\x5c\xc5\xac\xe3\xbd\x9e\xdd\x54\xfa\x1b\xc1\x4e\xc6\x24\xfb\x44\xfb\xa6\xec\x15\x8b\xdf\xf3\xba\x4d\xb4\xcc\x1e\x5a\xe9\xda\xba\x57\xc6\x51\x18\x5e\x3c\xe3\x1e\x75\x12\x15\x5e\x89\xf3\x58\x4e\x2c\x1b\x7a\xc2\xe6\xf8\x25\x60\xc0\xdb\xde\xf9\xdc\x03\xdb\x77\x0b\x4f\x97\xd7\xd5\x9d\x89\xb3\xb9\xdd\xe5\x2a\x96\x32\x87\x5e\x6a\xcf\x63\x3d\x54\x7f\xf6\xed\xa4\xd7\xee\x11\x6e\xc1\x8d\xaa\xf8\x51\x88\x40\xd9\x65\xc6\x59\x6a\xf5\x08\xa4\x4f\xb2\x89\x40\x1e\x36\x9e\x21\x5f\x42\xee\x39\x22\x00\x9c\x33\x54\x7b\x16\x02\x95\x5d\xc5\x96\xa4\xb5\x4e\xf5\xc1\x34\x66\x57\x8e\x6d\xd6\x91\x3f\x99\xfa\x8d\xcf\xbe\x57\x1d\x95\xb4\xc9\x51\x98\x69\x93\x2f\x88\x2a\x2d\x8e\xe9\x48\x67\x39\x64\x0f\x88\x4b\xd4\x43\xe2\xb5\x17\xd5\x9e\xce\x07\xe3\x20\x7b\x72\x05\xed\x63\x6d\x31\x04\x3d\x7d\x7a\xd3\x19\xaf\x0e\x04\x32\xef\xf0\x10\x3e\x60\xf4\xe5\xa1\x9d\xb0\xab\xc5\xa0\x93\xdb\xea\xa0\x02\xde\x8a\x39\x33\x76\x62\x08\xfc\xbe\x1e\xdc\x58\xbb\xc1\x0f\x0b\x5c\x4f\x65\x42\x78\xb1\x92\x61\xea\x16\x65\x79\x9e\xa3\xda\x9f\xaf\xb2\x07\xd6\x16\xbe\xa4\xff\x33\xd7\x45\x3b\xc0\xa0\x0d\x11\xad\xee\x24\x33\xca\x44\xcf\x48\x57\x62\xbe\xfc\xcd\xeb\x72\x27\xb4\xec\xa5\x06\x3e\xf3\xcc\x87\x76\xa8\x81\xff\xb0\x66\x25\xda\x33\xdd\xa4\xb2\x42\x6c\x81\xec\x11\xf0\x6b\x25\x86\x8c\x33\x6c\x0b\x36\xe2\xbd\xf6\xb0\xf2\x07\x2d\x5c\xd8\xea\x5f\x1c\x50\x8b\x8f\x33\x2b\xaf\x7f\x92\x58\x06\x04\xb8\xb9\x44\xe7\x16\xa7\x89\xb8\x37\x51\x2a\xbe\xb1\xf2\x5c\xa6\x26\x16\x20\x14\x19\xaa\x27\xcd\x1a\x6e\x9b\x3f\x90\xad\x69\x87\xb5\xf3\x7f\x20\x22\x51\xf6\xfe\xdc\x77\x9d\x5f\x45\xf6\xb8\xed\x77\x1e\x66\xf3\x6e\xb6\x01\xda\xf8\x7b\x52\x81\x47\xae\xcc\xce\x70\x65\xdd\x7c\xc5\x29\x1e\xcc\x57\xb3\x90\xff\xd0\x95\x31\x5b\xbb\xb1\xbe\x61\x06\x95\x60\x73\x52\x4e\x4a\x78\x68\xb7\xcb\x45\x4c\x90\xaf\x95\xb6\x99\x86\x51\x7b\x88\x25\x9d\xca\x8b\xd9\x47\x5f\x01\x69\x31\x05\x5d\xf9\x52\xb6\x31\xc5\x7c\x2a\xee\x6a\x6f\xf1\x5f\xe0\x0b\x85\x19\xca\xb0\x9d\x04\x64\x0e\xb3\xd7\xac\xe4\x38\xe6\x2f\x52\x07\x9e\x45\x15\xd0\x87\x80\xa8\x21\x7f\x85\xd0\x0b\x23\xf3\xfd\xf9\x09\x28\x1d\x3f\x69\xb6\x19\x7e\xd2\x16\x9e\x17\xd1\x7e\x0d\xf3\xe0\x4a\x78\xd2\x83\xd5\x9d\xb7\x83\xf9\x66\xfe\xb5\x57\xc7\x2f\x27\x3e\xae\x00\x81\xab\xf1\x88\x9a\xed\x5b\x15\x56\x8b\x86\x51\xf8\x71\xa8\x8e\xfe\x97\xe5\x27\x00\x65\x9e\xcc\xfa\x27\x7d\x56\x6d\x4a\xec\xe6\xa3\xc2\xea\x55\x58\x93\x73\x61\x0e\xec\x88\x77\x43\x5d\x3a\x95\x08\xde\x76\xa9\x85\x8b\x1c\xc2\x3f\x12\x4f\xf8\xcf\x39\xfb\x66\x9a\xa1\xd1\xfd\xdd\x6a\x65\xb1\x8b\x88\x06\x0e\x3a\x1d\xb0\xbf\x23\x03\x89\x4d\x50\xba\x1b\x0c\x12\x6d\x84\xf1\xd2\x99\xdb\xa6\xde\x98\xdd\xd2\x54\xbe\x05\xbf\x46\xca\xf1\xa0\xcf\x1a\xe2\x77\xee\xb4\x11\x9b\x17\x20\x0f\x78\x0c\x5f\x5e\x5a\xdd\xf9\xee\xf8\xbd\xce\x63\xe1\x45\x43\xe5\x82\xa1\x5a\xa1\xb7\x7e\xe9\xf2\xc0\xa4\x63\x3d\x3d\xe8\xe4\xfe\x02\x26\x87\x0d\x3e\x99\x72\x4e\x0d\xf3\xde\x67\x96\xdf\xa6\x14\x15\x59\x1a\xdc\x47\x1d\xfe\x10\xb2\x27\x72\xee\x3c\x0a\xd5\xd2\xf1\xef\xb8\x50\x6f\xa2\x08\xf9\xb7\x2f\x82\x7e\x99\x19\x98\xc5\x0d\xa7\xaf\x98\x86\x05\x5b\xbf\xc8\xa8\x2a\xc3\xea\xf1\xe9\x95\x30\xfe\xba\x0f\xe4\x01\x74\xa8\x10\xe1\x85\xdf\x7f\x6d\x09\x5c\x8f\x39\xd1\x03\x85\xd8\x85\xc7\x81\xd7\xcf\xff\x43\x72\x04\x06\xff\xe9\x1e\x30\x09\x13\x5c\x41\x0f\x4a\x60\x70\x75\x1d\xbb\x25\xea\xa4\xaa\x74\x47\x32\x06\x1d\x89\x98\x49\xaa\xa7\xf9\x72\xeb\x09\xbc\x82\xce\xeb\x9c\x59\x15\x21\x32\x6a\x66\x4e\xe4\x8d\x24\x6c\x38\xc2\x74\xbc\xb7\x2a\xc3\x85\xfe\xd7\xb1\x3b\xe2\x1a\x87\x2a\x75\x66\x14\x56\x7c\xfa\xc9\xbd\xf6\xaa\x27\x39\x3c\x99\xb5\xab\xad\xe8\xa2\xbf\xb4\xc4\x5b\xc5\x6f\xd9\xcc\x22\x55\xbc\x05\x3f\x68\xcc\x48\xbc\x2c\xff\xe3\x96\xcc\xd9\x5e\x66\xe9\x09\x09\x45\x86\x07\x63\x81\x6a\x11\x21\x2e\xfc\x13\x42\x9e\xaa\xd3\x34\x05\xe6\x40\xc3\xfd\x22\x18\xce\xd2\x8c\x67\x53\x74\x22\x27\xd3\xb8\x3a\xb0\x08\xe8\xd6\x3f\xac\xfc\xe3\x94\x5f\x31\xeb\x87\xb3\xf6\x20\x34\xd6\x47\xe0\x0b\x00\x6c\x48\x3c\x5d\xc0\x37\xf1\x14\x69\xe5\xc3\x44\xbe\x22\x0c\x9d\x05\x32\xb7\x4e\x34\x32\xb6\x1e\x3d\xeb\x41\xb6\x41\x74\xc1\x15\xc1\x21\x2f\x1c\x52\x25\xbe\x2a\x68\x5d\x16\xed\x30\xc2\x64\x21\x8e\x16\x60\xc9\x2a\x44\xa8\xbc\x1a\x54\x27\x12\xbe\xc4\x5c\xd8\x12\xcf\xb6\x65\x47\x3b\x2f\x3e\x16\xca\xcd\x16\xf8\x62\x66\xcc\x19\xe4\x03\xfe\x0e\x5a\x8f\x25\x95\x83\x8c\x82\xfe\xed\xae\xeb\x25\xbb\xcb\x60\x03\xf7\x31\x92\xf0\x70\x72\x55\xe5\x1b\xfd\xfd\x38\x09\x9c\xdb\x6b\x92\x15\x13\x95\x17\xb3\x10\x5c\xbb\x33\x2a\xcf\x53\x7e\x60\x15\x5f\xe5\x59\xb0\x78\x83\x2e\x03\xbc\x3a\x49\x3b\xcf\x3a\x25\xbe\x88\x9d\x8c\xc4\x07\x9b\x6e\x51\x58\x55\x4c\x70\xb0\x92\xf7\x20\xf2\xb3\x90\xc9\x40\x0b\x77\x43\x34\x68\x0e\x05\x26\x5e\xd5\xf3\xc9\xd6\x20\x90\x2a\x2c\xf4\x23\xd3\xa3\xc1\xe2\xdf\xeb\x04\xcb\x4b\xc3\xe2\x67\xbf\x2c\x38\x39\xf7\xda\x9f\xbc\x67\xe4\x22\x58\x80\x89\x73\x9a\x11\x46\x7a\x2e\xa3\xa2\x7f\x3f\x29\xa2\x73\x7e\xc3\x9b\x57\x15\x11\xdd\xb9\x1d\xaa\x19\xc4\xfd\x4c\x02\x3a\xcc\xe1\xb3\x20\x86\x0a\x18\xbe\xc9\xc3\x54\xde\x6f\x40\x4b\xf8\x4e\x5d\x25\x3e\xda\x40\x63\x6c\x21\x0f\x5d\x8a\x6d\xec\x22\x67\x18\xb9\x4d\x9e\x57\x46\x07\xf2\x5a\x24\x4d\xbe\x69\x40\x7c\x99\x71\x43\xde\x34\x0a\x4e\x1c\xd0\x2d\xa2\xb3\xf3\x6a\x47\x20\x66\x01\x94\x09\xec\xde\xcf\xee\x87\xc9\xb4\x33\x7f\x80\x08\xd4\x99\xd9\x25\xf6\x74\x16\xec\x48\x87\xc3\x88\x2c\x91\xdc\x61\x0b\x75\x17\x93\xc0\xae\xc2\x43\xd4\x1a\xa0\xa0\xad\x22\xd2\xe3\x52\x9e\x0e\xfd\x99\x7b\x8c\x64\xcf\x8c\x7b\xd4\xd1\x11\x1e\xad\x49\xb7\xc6\x2d\x2c\xbd\x66\xfe\x54\xb9\xe7\x1c\xd4\xbc\x95\xa1\xa2\x83\x36\x11\xd1\x4d\x42\xfe\x19\xba\x00\x06\x64\x90\xa0\x5c\xdd\x0c\x0e\xfe\xe1\xde\x60\x73\xaf\x07\x64\x56\x1f\x7a\x87\xd0\x18\x2d\xda\xba\xf1\x08\xa4\xa5\xd7\x42\x65\x77\x52\xbe\xf5\xf6\xda\xca\x3e\x68\x42\x3d\xe9\xbf\x29\x84\xc7\x27\x0d\xf8\x8c\x44\x52\xe0\xf1\x76\xa7\xe7\xbf\xdc\xa2\x00\x5a\x66\x95\x3e\x68\x8e\xea\x9d\xd8\x93\x87\x7b\xac\x8f\xdb\x21\xca\x58\xe2\x45\x8e\xa1\xd8\x95\x83\x61\x71\x6c\x15\x36\x01\xc4\x16\xd4\xef\x70\x63\x76\x4b\x04\xf9\x48\x03\xd7\x0a\x9c\xb7\x56\x04\xb1\xd8\x8c\x1b\x75\xce\x64\x6c\x59\x0e\xb3\xf1\x37\xd4\xa8\x18\xe4\xbd\x27\x8e\x85\xdb\xb6\x47\x6d\x3e\x9d\x1b\x91\x40\xcf\x05\x04\xfd\x21\x7d\xf3\xef\x64\xbe\x9a\x86\xc0\x83\x9c\xcd\xc2\x83\x6b\x16\x2c\x18\x5e\x7b\xcf\x9b\x02\xa8\xa2\xd5\x27\x36\x82\x1d\x76\xe7\xf9\x44\x66\xca\xe9\xe4\xeb\x20\x4f\xa7\x52\x14\xa3\xc1\xc3\xdc\x38\x5d\xa4\x62\xe1\x32\x31\xb2\xda\xcf\x80\x7e\x7a\x0f\x2d\x89\x3c\x6f\x28\xdc\x9e\x73\x77\x13\xee\x7a\x47\x00\x73\xb7\xa3\xce\x9c\xf7\x41\x96\xeb\x08\x4a\xa7\xb8\x5b\x48\x27\x68\x34\xea\x9f\x5e\xe6\x91\x70\x25\x0f\x80\xdd\x6c\x9e\x13\x54\x57\x69\xf1\xbc\x4c\x71\x63\x14\xa3\xdc\x64\x62\x6a\x55\x36\x65\x93\x5d\x80\x9a\x79\xe9\x68\xe6\xeb\xc4\xe8\x79\x2a\x81\x90\xbe\x5b\x98\xa7\x9b\xe7\xc8\x81\x40\x38\x0b\xe2\x88\x2b\x3a\xc7\xb4\xc5\x4f\xab\x87\x78\x0a\xcb\xd2\xcc\x64\xd0\x56\xe6\xc9\xca\x91\x79\x24\x86\x19\xa2\xeb\xcd\x69\xc3\x81\x49\xf7\x3b\x81\x8a\x97\xc2\x95\x1c\x0c\x58\x62\x64\x3c\xbc\xa7\xd0\x4c\xde\x0a\xcf\xb5\x6f\x0a\xef\x02\xfc\x27\x4a\xb9\xa9\x50\x1c\xb9\x14\xc3\x40\x82\x7e\xfe\xe2\x13\xb6\xdd\xae\xb8\x1d\x21\x40\x5f\x53\x9f\xfe\xe2\x95\xcd\xf0\xcd\x6b\x7a\x2c\x72\xd5\x8b\xdb\x07\x92\x23\x3c\x51\x25\x0d\xca\x92\xd3\xe0\x10\x79\x95\x00\x56\xe6\x15\xe0\x6e\xe0\xdb\xa3\xce\x75\xd4\x28\xf8\xd6\x67\x1c\x60\xf3\xc9\xab\x2a\x87\x00\x45\x6f\xf0\x4c\xbe\x05\x24\xa7\x82\x8c\x88\x75\xae\xef\xa5\x21\x62\x7c\x88\x1b\x6a\xeb\x84\xcb\x65\x72\x27\x85\x32\x76\x60\x08\x50\x25\x50\xa8\x76\xf8\x96\xe1\x3c\x14\x50\xc1\x57\x10\x8e\xd8\x62\x6b\x87\x7c\x57\x9d\xf9\xd9\xea\x19\xf9\x41\xf4\xc0\x31\x24\xb9\x4d\xa2\xc4\xeb\xe6\x40\x1b\x2f\x8f\xaf\xde\x20\xa2\x75\xc7\xd3\x69\x81\x45\x23\x14\xe3\x01\xcd\xc8\x47\x85\xa8\xd8\x8f\x72\xbf\x3c\x3c\x90\xc3\x8f\x7a\x65\x37\xd1\x3b\x9c\x0f\x3e\xbf\x45\x7a\xeb\xb5\x8e\xbb\xee\x6d\x64\xf7\xbb\xc2\xd6\x4e\xd0\x7e\x4f\x0c\xc3\x9f\x97\x18\x26\x00\x6f\x06\xf3\x01\xd4\x5b\xc8\x9c\x3b\x9d\x57\xfb\x39\x33\xb1\x49\x25\x8b\x25\x90\xc3\x81\x39\x3e\x9d\x07\xaf\x01\xd2\x38\x73\xc0\x07\x2b\xd7\x0e\xf5\x90\x13\xef\x96\x43\xbb\x17\x41\x08\x31\x98\xa3\x06\x13\x17\xee\x90\xa5\xae\x53\xf5\x11\x07\x05\xb9\x52\x1e\x6c\xc8\x53\x6c\xf5\x6e\x87\xa9\xd4\xb0\x98\x49\xf6\x03\x48\x3c\x76\xe3\x17\xc7\xda\x32\xbc\xe2\x9f\x84\x47\x7d\xd9\x63\xf3\x6e\xc1\x89\x37\xce\xe9\x9e\xe6\x82\xd5\xc2\x91\xaa\xc1\xbd\xc5\x37\x01\xdf\xec\xb2\x80\xa0\xe5\xd1\xd6\x95\xbb\x68\xdf\x83\x0f\x57\x46\x27\xe6\x95\xd6\x9b\x1f\x93\x10\x3e\xce\xd7\x06\xae\x1e\x33\x89\x78\xb5\xb1\x68\xcc\x5f\xd5\x18\xcd\x2a\xd9\xb7\x4a\x21\x7d\x6e\xab\x8d\x35\x2a\xad\xd3\x4d\x09\x57\x38\x19\x75\xbf\x29\x53\x8a\xd4\xc8\xd6\x4a\xdc\x24\xcb\xc1\x68\x9d\xba\x0a\x2b\xaa\x56\x07\xf3\xd6\xf9\x15\x75\x06\xcb\x34\xcc\xcb\xf2\xd0\x4f\x55\x5c\xbb\x17\xed\xce\x98\x07\xda\x0d\x42\xa4\x8c\xf3\x56\xa5\x8c\x3a\xdf\x7a\x26\xbb\x2d\xd3\xd9\xb2\x33\x3b\x17\xb4\x80\x93\x02\xb3\xad\x15\x67\xca\xec\x30\x43\x44\x0c\x66\x1f\x9c\xb9\x17\x24\xa0\x2a\xaa\x06\xcc\x0d\x43\x1e\xd4\x2f\x08\xab\x04\x85\xdc\x19\x1c\xcc\x2e\x16\x7e\x0a\x3c\x2a\x2d\xf7\xc8\xb2\x9e\x19\x7e\x7c\xd0\x4f\x92\x15\x18\xc9\x79\x11\x8c\xd2\xf8\x08\x7c\xf4\x97\x57\x3f\x1e\x0d\x1f\xef\x58\x92\x63\x6e\x74\x53\xf5\x2b\x36\x91\x4c\x4a\x3b\x85\xac\x72\x6c\x65\x96\xff\x7e\x34\x33\x01\x9a\x24\x0c\x74\xb1\x15\x9a\xaf\x83\x5b\x49\x9d\x6a\x81\xe2\xfd\x34\x5f\xc7\x17\xae\x57\xaa\x10\xd0\x8c\xae\x7b\x0b\xc7\xbd\x54\xb9\x3c\x78\xce\x09\x55\x5a\x74\x4c\x72\x6f\xc2\xc9\xdb\x05\x6b\x34\xfe\x1c\x2d\x80\xff\x15\xbf\xc4\xa1\xdc\x96\x1e\x1c\x39\x5c\xfc\xf5\x9d\x23\xdd\xa5\x7f\x5f\x8b\x96\x18\xe2\x56\x3b\x1c\x34\x08\x20\xf2\x2b\xa2\xb4\x54\x66\xd3\x69\xb0\x3d\xb7\x7d\x1c\x2b\xe2\x1a\xb7\x39\xb3\x38\xe6\x9b\x18\x08\x7f\x93\x18\x0f\x9e\x0f\xdb\xc9\x21\x5c\x9c\x45\xce\xb6\xb3\xca\xbc\xd1\x2e\x21\xec\xa2\x65\x6e\xfb\x78\x0b\xda\x28\xdf\x23\x62\x72\x3f\x8d\x8f\x85\x36\x84\xf1\x1c\xa1\x41\xad\xd8\x3d\xab\x56\xfc\x48\x8f\xf0\x2b\x02\x9e\xdd\xbf\xd1\x6c\x97\x25\xb2\xee\x70\x3e\xe7\xa6\xda\xf1\x73\x21\x7f\x15\x14\x3c\x22\x52\x89\xbc\x2b\xb2\xc5\x89\x0c\x30\x3d\x1f\x59\x8e\x76\x16\x07\xd3\xac\x6d\x68\xd5\x3b\x9c\xd5\xec\x2c\x66\xec\x3b\x92\x33\x9a\x51\x78\xd6\x87\xd3\x6d\xf9\xd2\x76\x4f\x11\xd7\x9e\xdb\x4b\xcc\x0d\x07\x5d\x64\x95\xb6\x38\x97\xa8\x1f\xea\xd5\x18\x57\x10\x60\x12\xa3\x30\x18\xfc\x7a\xbf\x7c\xda\x0e\xab\xfb\x48\xd6\x8a\x5d\x05\x8d\xf1\xa3\xe0\x6d\x73\xdb\x42\xa4\x7b\xfc\xec\x02\x00\xd3\xcb\x42\xb5\x76\xd1\xab\x19\x2a\x1e\xe3\xcc\x12\xa6\xb3\xf8\x79\x64\x56\x6e\xb3\x19\x03\xc4\xd9\x65\x77\xa6\x83\xbc\x75\x12\x65\x09\x2e\xa6\x5d\x71\xd2\xf4\x6e\xc8\x5e\x0e\x2e\xa8\x67\xd0\x2c\x67\x20\x27\x94\x1b\x75\x87\x2d\x74\xf4\x50\x79\xee\x60\x6e\x73\x30\xdb\xb7\x23\xc6\xcb\x6d\x1e\x9c\x39\x98\x08\x7d\x43\x5e\xb5\x44\xb3\xaa\x71\x64\xad\xf0\xd3\x7e\x4e\x5c\xfb\x05\xeb\x8a\xb7\x35\x67\xc7\xda\xa9\x20\x7f\xb7\x1a\x7f\x5a\x69\x54\xb7\xcc\xe2\xf4\x87\x70\xd2\xb3\xd9\x1b\x10\x92\x96\x56\x1f\xdb\x6a\x2f\xf2\x46\x89\x38\xab\x4b\x4a\xa5\x8e\x0f\x57\xd3\x99\x22\x00\x0f\x26\x46\x73\xbb\x5f\xdc\x24\x9f\xb7\x05\x3d\x22\x91\xf4\xce\x20\xcd\x89\x89\x2c\xee\x9f\x0b\xb3\x02\x6d\x8d\xf7\x0a\x71\x31\x97\x70\xde\x66\x01\xe1\x46\x82\x69\x4b\x54\x2d\x3d\x87\x14\x11\x05\x83\xe6\xbc\xc9\xa9\x46\x81\xd8\x41\xc5\x30\x72\x85\x79\x38\x00\xe1\xe0\x4f\xf4\x07\xe1\x4e\xe1\x45\x8e\xd6\xe2\xa2\x96\xad\x3f\x67\x7f\x03\x5d\x53\xf9\x5a\x1e\x05\xff\xa4\x20\x12\xa0\x89\xcb\x19\xd2\x3a\xa1\xbd\x62\x29\xda\xbe\x1b\x13\xbe\xc0\x5a\x0f\xdd\xff\xab\xb3\x44\x46\x70\x22\xf1\x03\xf9\x25\xa8\x78\x3c\x6a\xa2\x53\x88\x21\x3f\xc6\x39\x99\x89\x62\xd9\x6f\x67\x80\x4b\x27\x22\x4f\x3f\x7f\xdc\x62\x7e\x6e\xaa\x26\xd1\xf5\x58\x12\x73\x4e\x64\xf9\x17\x2e\xd0\x2b\x33\xd1\xd0\xa3\xf0\xec\x81\x2e\x97\xc4\x0b\x22\x40\x9a\xf6\xe6\x0d\xf7\xc0\xcc\xef\xe6\xe1\x19\xc5\x23\xfb\x13\xc4\x9a\x88\x21\xdd\xe3\x26\x58\xc8\xf3\x09\x2b\x22\xd7\x9f\x64\x32\x08\xef\x34\xb6\x43\xda\x3a\x2e\xef\x7b\x24\x24\x74\xf0\x3b\xd5\x50\x32\xa0\x9d\x68\x6f\x4c\xfc\xbd\x95\xce\x2c\x66\xcc\x17\xb3\x2e\xc2\xb0\xf8\xca\xbe\x29\xf0\x30\xaf\xa5\x25\x02\x50\x41\x62\xe2\xcd\x4d\xaf\xca\x6e\xb4\x80\xc2\xee\x41\x61\x06\xf7\x4d\x2e\x95\x95\x5c\x36\x95\x45\x5d\x84\x26\xe1\xa6\xde\x0e\x1c\x6b\x95\x0d\xa2\xa2\x35\x12\x66\xdb\xf0\xbb\xc8\x2e\x02\xb0\xf0\x05\xac\x37\x9b\xb5\xab\x9a\xb8\x7b\x4e\xab\x2e\xa2\x06\x48\xbe\x74\xc6\x19\x6f\x02\xed\x6b\x1e\x89\x2e\x8e\xe9\xb1\x45\x3a\x79\x4a\x45\xf7\x93\xbb\xa1\xa8\x53\x20\xde\xb2\xd0\xc2\xdd\xed\x1c\x46\x5a\xa3\xf6\x1e\xc7\x22\xbd\xb5\x4b\x19\xd5\x1e\xf1\x35\x37\x86\xe9\x9b\x1d\x4d\xe2\xe6\x2a\x1f\x32\x82\xc9\x2c\x75\x99\xa7\x7a\x28\x6a\xe8\x82\x48\x08\x5a\x17\x17\xa3\x55\x85\xdc\xea\x91\xf2\x51\xc9\xbf\xda\xc4\x14\x35\x73\x37\x85\x6b\x2b\x44\x3e\x09\xdf\xfa\x15\x72\xdf\x0e\xdb\x64\x51\x5e\x3a\x18\x73\x6c\x39\xff\xe5\x5d\x0b\x68\x9d\x34\x91\xbd\x8f\x0a\xd7\x4a\x0b\x9a\xf5\x16\x29\xf8\x20\x7b\x12\xb1\x21\x2b\x4c\x5c\x71\xc6\xce\xe5\xdf\x02\xc2\x9a\xb9\x32\x8b\x6c\xc0\x76\xc1\x94\x30\x76\xec\x98\x7d\xe7\x08\xbe\x1d\x14\x51\xf9\x31\xd0\xf4\x63\x6b\xc4\x37\x70\x9f\x18\x8c\x6d\x9b\x60\x7b\xe4\x61\xb0\xb2\x28\xc2\x04\x74\x60\x67\x6a\x5e\x55\x91\x51\x37\x86\x6d\x6d\xe6\xae\x32\x64\x71\x58\x9f\x89\x04\xd2\xc5\x62\xe6\x9e\x15\xc7\xcd\xdd\x2b\x3e\x65\xc9\x1e\xfe\xa9\x1d\xa2\x8b\x6a\x32\xa2\xee\x1b\x7b\x03\x58\x62\x73\x16\x24\xdf\xec\x37\xe2\x19\x33\x21\x20\xd6\x3b\x50\xbf\xc9\xaf\x01\x6a\xcf\xc1\x91\x42\xd9\x99\xf4\xf9\x87\xda\xca\x96\xfc\x99\x59\x9b\x7e\x93\x95\xcc\x02\x87\x5d\xc0\x67\x14\x70\xbf\xfd\x56\x25\xca\xf2\xfb\x15\xd7\xcb\x96\x78\x1c\xc3\x33\x6f\xb9\x38\xd9\xaf\x73\x62\xe7\x31\x0e\x0e\x4a\x24\x44\x21\x97\x86\xbc\xa3\x7e\xd0\xd8\xaf\x3c\xff\xf9\xf8\xaa\x0a\xdd\xd4\x44\x24\x72\xc3\x08\xd4\x77\xad\x8a\xa5\x67\x5b\x56\xb4\xee\x4e\x66\x52\x2e\x58\x59\xa7\x9c\xe5\x54\x92\x12\x1e\x8b\x1a\x5d\x9c\x3e\x07\xa4\xca\x2d\x99\x6d\xd4\x48\x2b\x7a\xef\xd0\x55\x9e\x54\xa1\x39\x48\x22\x31\x2b\x17\x3e\x24\xb7\x12\x66\x04\x3c\xbc\x2c\xa8\xf1\xaa\x0a\x5a\x96\x20\x9a\x33\xc3\x55\x5d\x74\xae\x03\x40\x64\x52\x24\xc2\x7c\x0c\x30\x44\x0f\x82\x59\x76\xa6\x93\x90\xae\x3b\x49\x53\x9e\xe1\x92\xe6\xe1\x79\xca\xad\x01\x1b\xa2\x3e\xa8\x48\xc6\xb4\x75\x7f\x06\xab\x83\x16\x4b\x09\xf3\x29\xee\xfd\x78\x8a\x6a\xd1\x8a\x8a\x40\x55\xdc\x6d\xa8\x60\x88\x55\x15\xe1\x0f\xc7\x8d\x9f\xeb\x2e\xf0\xc6\xd8\x63\x51\x75\x05\xc7\x08\xb9\x0d\xac\xac\x2a\x0b\xd8\x8a\x45\xa9\xad\x02\x4e\x7a\xba\x5d\xe7\xb2\xc5\x30\xdb\x29\x96\x2d\x0d\x91\x99\xc5\x53\x4e\xfa\x90\x11\x75\xd4\xb7\xf1\x72\x10\x16\x47\xc4\x36\x56\xb9\xb7\x16\xc3\x79\x6a\x2f\xab\xa1\xb2\xc6\xc3\x39\xc0\x3c\x92\xa9\x2b\xc4\x86\xdd\x7d\xb2\x6d\xaa\xbe\x85\x84\x6d\x16\x98\x25\xa6\x0e\x76\x57\xd9\xa5\x43\xe0\xfb\xf0\x10\x8c\xc0\x4d\x8a\x02\x42\x1c\xfc\x3a\x5c\xf1\xfc\x1c\xc0\xbd\xc5\xc5\x2b\xd9\xb2\x51\xcd\xb5\x53\xd2\x22\xba\x8d\x86\x68\x4e\x0f\x27\xf5\x22\xa6\x33\x0b\x78\xbb\x18\x76\xcc\xe7\x4f\x72\x86\xd8\x33\xf4\x47\x59\x66\xb8\x35\xcf\x46\xf3\xf1\x69\xab\xcc\x28\x8e\x71\x86\x9d\x3e\xf6\xdd\x31\x37\xf5\x92\xb4\x3d\x1a\xc9\x30\xe0\xa8\x32\x51\x47\x77\x0b\xbf\xc1\xdb\x11\x78\xfb\x80\xbc\x04\x58\xcf\x32\xd0\xb3\x0c\x4b\x52\x31\x6d\xff\xef\x64\x4c\x6d\x3e\xe8\x4f\x00\x33\x4b\x03\xf7\x71\x50\x57\x25\x63\x65\x5e\x5b\x65\x0a\x0c\x0b\x5d\x09\x7d\xd4\xcc\x98\xef\x60\xf3\x41\x12\xd1\x19\xc5\xfa\x88\x05\x36\x99\xb3\x74\x20\x9c\xe1\x13\x5a\x18\x7c\x72\x77\x19\xf3\x89\x3f\x6f\xe6\xeb\xe4\x69\xb3\x44\xc3\x0c\x73\xa0\xfb\x04\x20\xe1\x8e\xec\xea\xf1\x3b\x26\xd2\x88\xec\xc1\xed\x21\x60\x7c\x1b\xbf\xd6\x0e\x9d\xcc\x73\x77\x06\x35\x8d\x98\x5d\x9a\xa2\xbe\x8d\x05\x58\x68\x14\x17\x05\xa8\x8d\x94\xc0\x4a\x38\x8b\x40\x03\x8b\x30\xf6\x11\xc8\x85\x98\x04\x63\xd9\x40\x88\x55\x78\x43\xd6\x2e\x6e\x29\x02\x44\xb1\x96\xf6\xa2\xea\xc0\xbc\x88\xf1\xd5\xe1\x5c\x9c\x9e\x69\xb5\x87\x7d\x9c\xcd\x17\x1e\x0d\x6b\x33\xdb\xa2\xf0\x70\x8b\xa2\xb4\x53\xa4\xe0\x9c\xf3\xa0\x84\xdb\x63\x1f\xe1\x63\x9d\x02\x34\xb4\x83\x82\x6a\x44\x5c\x56\x6c\x53\x44\xa5\xda\x3b\x6c\x79\x02\x6e\x60\xf1\x64\xb9\x7b\x27\x68\xe2\xc5\xc0\x2b\xe7\x07\x62\x9a\x7c\x57\xeb\x97\x39\x81\x9e\xe2\x12\x8c\x6d\x5b\xe1\x8f\x1c\xaf\xe2\x7d\x1d\xc3\x79\x5d\xf2\x70\xad\x6d\x13\x23\x51\xc1\xc7\xea\x48\xa9\xea\xca\xa7\xf2\xce\xc3\x3f\xba\xbf\xe7\xc5\x23\x04\xe7\x82\xe1\xf7\xcc\xb2\xaa\x53\xcc\x26\x85\x10\x62\x31\xd2\x04\xe1\xf7\x9d\x1b\x2b\x7f\x3d\xab\x5c\x5c\x66\x1d\xb7\xb8\xd7\xe0\xf5\x71\x89\xde\xb0\xa2\xde\x0e\xc1\xb6\xfe\x7b\x14\xcd\x7a\xcb\x2a\xfa\x8b\xcd\xea\x06\x0c\x39\x2b\xe8\x8c\x5c\x56\x1c\xd8\x55\x98\xe7\x5e\x59\xba\xf1\x16\x6a\x6f\xef\x21\x43\x52\x6d\x64\x6b\x11\xa5\x91\x17\x6a\x8a\xa2\xe7\xc3\x92\x04\x11\x09\xc9\x11\x97\x05\xc7\x79\x37\x3f\xcd\xef\xaf\xe7\x41\xa2\xc4\xac\xf6\x48\x96\x34\x57\x11\x96\xe7\xf4\x89\xf8\x2b\x3d\x15\x93\x3e\x1e\x0d\xc5\xa0\xa5\xcb\xcb\x4f\x0d\x6c\x17\x3e\x03\xed\xe2\xc1\x04\x8d\x04\x5b\x25\x30\x4b\xdc\x32\x4b\xff\x8f\x45\x67\x6c\x6b\x11\x02\xf0\xe9\x41\xff\x95\x05\x86\xb2\x10\x72\xfc\x7c\xf3\x36\x36\xda\x60\x0b\xd2\x76\x6e\xde\x29\xa3\x2a\x32\x86\x97\x63\x2c\x1f\xe2\xdb\xdf\x27\x46\x80\xad\x9b\xbd\x3b\x8f\xa3\x8a\xca\xad\x7a\x49\xf9\x3d\x18\x1a\x1e\x2d\x8d\xa0\x33\xb0\xdf\x50\xb8\x70\x4c\xc4\x18\xa0\x7d\x5a\x82\x32\xa9\xe0\x90\xa2\x5d\x9b\xed\xa6\x7e\x4e\xdb\x06\xd7\xeb\x36\xde\xc5\xf8\x2d\x2a\x96\xdc\x65\x2f\x10\xef\xd1\x00\x2d\x00\x12\x82\xa6\x85\xfc\x07\xbf\x57\x38\xe6\x9d\xdd\xc8\x4e\xda\x73\xd3\xa7\x80\x7b\x9a\xc8\xfa\x71\x3c\x76\x4d\x37\x61\x1e\x0c\x47\x1d\xec\x2a\x77\xbe\x57\xdc\x15\x0f\xc0\x0e\x06\x91\x6c\x1f\x42\x7e\x08\xc4\xf7\xf1\xc1\xc5\xdd\xce\xcc\xce\x70\x26\x20\x5d\x55\x2c\xe3\xe7\x3c\xce\x97\xf3\x48\x93\x12\x5f\x98\x85\x46\x4a\x46\xdc\x87\xd5\x47\xf5\x16\x5f\x94\x8d\x0f\x09\x5e\x1a\xb1\xa5\x25\xf3\xf0\xdd\xc5\x21\xf1\x36\xe5\x1d\xab\x0a\x6b\x16\xd1\xd2\x61\xd9\x83\x1a\xd0\xbd\x70\xca\xe7\xde\x17\x66\xe4\x33\xb8\xd7\xf7\xb2\x51\x3d\x00\xd8\x24\xb9\xa1\xce\xcb\x98\x1b\x11\xfb\x95\x98\x63\xa9\x5a\xe0\x3c\x47\x50\x83\xf9\x61\x73\x1c\x0e\xb2\x5f\x70\xf6\x40\x3c\xe8\x1b\xc0\x76\xd8\x5a\xe0\x36\xbd\x83\x9a\xd4\x3b\x58\xa2\x3e\x84\xe8\xc3\x66\x88\x7d\xbb\x50\x50\xb9\xe2\xa9\x10\x0e\x6b\x2c\x46\x24\x3a\x57\x40\x42\x8c\x8d\xdc\x03\x17\x93\xa0\xe7\xdc\x48\x5e\x4d\xb3\x85\xf4\x8a\x73\xde\xde\x61\x4f\x6a\xd3\x7e\x61\xe5\x01\x00\xb0\xb2\x0b\xb7\xa3\x56\x26\x10\x61\x5a\x3e\x45\xd1\x95\x55\xf7\x6d\x4a\xde\xb0\xa6\x74\x75\xa6\x2d\x0b\xfa\x88\x97\xde\xf0\xba\xcf\xc2\xe6\x9d\x22\x1b\x15\x4d\xfa\xaa\xc7\xf8\x92\x07\xfe\x56\x57\xe5\xde\x20\xc3\x36\x07\xe4\xbc\xc2\x20\xd5\x17\x9e\x6f\x47\x9d\xc0\x1f\xf8\x6d\x3d\xe6\x5d\x36\xe7\xf1\x11\xc3\x09\x1d\xdf\x47\x03\xa1\x14\x8c\xf1\x7a\x12\x26\xc4\x39\x11\x8d\xc3\x02\x72\xc5\x0b\x8b\x7e\xd1\x5e\xd1\x78\x81\xf6\x28\x96\xc7\xd4\xc1\xca\x56\x42\x56\x73\x82\x37\x90\x17\xa5\x99\x13\xfb\x03\x50\xf5\xc3\x07\x9b\xd5\x51\xca\x03\xde\x49\xd0\x34\x67\xed\x05\xf0\xb2\x41\x74\x9b\x9e\xed\x34\x7b\xb3\x66\xf6\x55\xdb\x68\xae\xac\x59\xb5\xd8\xf1\xb3\x88\x89\x1a\xc7\xcd\x8e\x95\x1f\x9b\x86\x14\x74\xe9\x90\xa5\xf1\x07\xb3\xe5\x12\x8c\x67\x4b\xcb\xe0\xc6\x16\x6e\x8f\x34\x3b\x1d\xb4\xb6\x95\x3d\x21\xfe\x3b\x49\xf7\x50\x0d\x1e\x01\xcc\x39\xb3\x3c\x62\xdf\x04\xbb\x68\xa1\xd8\xc8\x2b\x1e\x2e\xd7\xfb\x54\x75\x32\x1c\x68\x46\x76\xe8\x40\xdb\x9e\x08\x96\x26\x51\xe2\xbc\x6b\x00\xb0\x44\x65\x43\xbf\xd9\x22\x82\x4f\x53\x40\xeb\xde\x67\xcc\x20\x05\x05\x7d\xf8\xd8\x73\xb8\x72\x75\x61\xbe\xa0\x2d\xd1\xc3\xee\x4c\xe8\x41\xca\x8a\xd4\x8e\x9c\x42\xd2\x3a\x83\x2d\x6b\x1f\xcc\x6a\xd3\x44\x26\x98\xa7\x00\xf6\x29\x64\x09\xda\xe3\xb3\x9c\xeb\xd5\xa6\xab\x79\x85\xec\x90\x65\x78\x53\xbe\xc4\xcf\x80\x32\x51\xca\xb6\x74\x8d\xe3\xd8\xa0\x9e\xb7\x87\x16\x0b\x8d\x93\xcb\xab\xfc\xa1\x95\x0f\xf7\x6b\x21\x3d\xfe\xc1\xf1\xa6\xa9\x65\x1c\x41\x77\x62\x4e\xc6\x02\x70\x60\xfa\x02\x2b\xdf\xea\x38\x29\x4a\x19\xd1\x0a\x48\x62\x40\x3f\x7d\x7f\x93\x3a\xb0\xfe\x3b\xa3\x88\xcc\x7a\xc1\xac\x7e\x27\xd5\x16\xc5\x52\x8c\xc7\xca\xd1\xfe\x73\x8a\x8a\xe2\xaf\xaf\x37\x73\xc2\x54\x00\xc8\xc3\x43\xe7\x10\x4c\x87\x68\xa0\x24\x57\x12\x68\x4c\xf6\xa6\x7e\x98\x81\x73\x8b\x46\x88\x20\xba\xd2\x9b\x22\x10\xe3\xee\xa3\xa2\x83\xe6\x86\x20\x7b\x90\x4d\x09\xaa\x11\x0b\x49\xe7\xb4\xb4\x52\x4b\xa7\x06\xc1\xe1\x02\x23\x9c\x97\x25\x3c\xc0\x8d\xcd\x5f\x72\x27\xcc\x02\x7b\x32\x82\x93\xb5\x46\xc1\x7a\xe1\x0b\x3e\x05\xc1\x1d\x42\x0e\x9f\x4b\x0e\x44\x41\xa2\x39\x9b\x36\xad\xf3\x0c\x1b\x9b\x15\xc4\x3f\x5b\x93\x17\xd9\x78\x43\x56\x2b\xd4\xb9\x04\x9d\xc4\xc5\x3f\xf0\x73\x3f\x35\x6a\x22\x0a\x12\xf1\xbc\x22\xd1\x6d\x8c\x46\x5f\xe1\xd8\x5d\x38\x20\x3a\xb2\xa8\x9b\x83\xff\xce\x84\xf8\x21\x78\xde\x42\xa7\x5b\x04\x3c\x3c\xdf\x71\x64\x40\x8c\xf3\x5f\xea\xb9\x53\xc8\x49\xfc\x0a\xa7\xb6\x5f\xcf\xb6\x2b\x88\x1a\xd0\xd1\xdb\xdd\xe5\x81\x7c\x8a\xaf\x7e\x54\xb2\x2d\x2d\x4a\x62\x89\x77\x53\xdc\x65\x9e\x07\x2f\x6d\x29\x9a\x5e\xab\x35\x9e\x98\x7b\x3d\x4a\x6b\x77\x8a\x04\x98\xcc\x3a\x44\xa1\x70\x6a\x21\xd8\x50\xff\x32\xb4\x51\xc6\xac\x27\x75\x00\x82\x66\x0c\x3d\x82\x84\x3b\xec\x93\x36\x5e\xc8\x88\x93\xc8\x9d\xb9\xa1\xe1\x5d\x70\xce\xf6\xd2\x51\x9b\x5a\xa8\xd6\xb7\xae\x8d\x97\xa5\x43\x65\x13\x1f\xb5\x45\x47\xce\x82\x52\xf7\x21\x71\x99\x57\x62\x81\x56\x1f\x6e\x16\x57\xce\x2b\x51\xae\x43\x95\x0e\x2c\x5f\x11\x74\xa0\x05\xf3\x03\x7e\xa3\xbf\x0e\x25\x32\xe1\xf9\x43\xa8\x21\x2d\x17\xba\xd8\x49\xd7\x81\x67\x3a\x48\x04\x0d\xaa\x54\x33\x26\x2a\xae\x61\xa9\x1e\x1b\xfb\x14\x9c\x49\x1c\xac\x37\x12\x2b\x0f\x09\x35\x74\x96\x6c\xdc\x5a\xa3\x23\x8f\xa6\xad\xd8\xe7\x4d\x70\x89\xdd\x63\xea\x5b\x40\xb6\x86\xd2\xfd\x29\x2c\xe2\x55\x36\x46\xf7\xa3\x84\x06\x2c\x54\xb6\xd5\x10\xa4\xec\x80\x69\xec\xb3\x73\x61\xb0\x68\x1b\xa9\x3f\xa2\x8d\xf2\xf6\x9a\x57\x9a\xeb\x8d\x34\x40\x54\xfe\x0a\x3f\x7e\x8a\x7b\xf0\x56\xc7\x6a\xee\xc7\xa5\x15\x08\x98\x1c\x71\x69\x26\xc9\xbe\x2c\xbf\xb1\x8d\x3c\xee\xf0\xd8\xd1\xf2\x56\x24\x97\x02\x96\x86\x02\x88\x7d\x54\xd7\x2b\xca\x86\x03\x6f\x6d\x94\xa0\xdd\x4d\x73\x91\x08\xb0\xa0\x19\xfe\xca\xfa\xed\xcf\x0f\xd0\x0f\x0b\x39\xb0\x6b\x1e\x2d\xca\xbc\x55\xf5\x29\x6d\xdc\x95\x8e\xa4\x4f\x75\x0a\x39\x1d\xdd\xdb\xe0\x14\x9b\xf7\x16\x73\xca\x54\xba\x49\xe6\x3f\xae\xa4\x82\x2e\x76\x02\x74\x26\xee\x28\xa6\xca\xc0\x39\x4f\x27\xb4\x6e\x2c\x6a\xb2\x45\x61\x60\x38\x15\xe1\x16\x43\x11\x99\xb4\x6b\xb4\x2d\x08\x4c\xa9\x9e\x1d\xd1\xd0\x77\x7f\xff\x17\x8a\xa2\xd3\x05\xe9\x31\x1e\x54\xdc\xbb\xc2\x1e\xe6\xad\xfe\x7e\x64\x95\x54\x6a\xb1\xdc\xb8\x35\x90\x4f\x61\x51\xdf\x4c\xc4\x6b\xb7\xb7\x72\xc7\x46\x2e\xfd\xe1\x95\x09\x55\x39\xc8\x57\x62\x58\xe5\x94\x03\x7d\x4c\xbe\x0b\x44\x85\x4c\xc5\x9f\x88\x57\x1b\x62\xbc\x65\x31\x1a\x9c\xfb\x13\x4a\x64\xe2\x80\x14\x42\xd3\x54\x7d\x68\xd0\x61\xb0\x1a\x8b\xf8\xde\xe7\x12\x3c\x25\x05\x0c\x68\x40\x65\xf6\xb5\xd1\xee\xce\x6a\xe4\xbc\x23\xc0\xbc\x85\xe1\xc4\x07\xa0\x94\xa5\xde\x5e\xaf\xed\x32\xaf\x18\x53\x84\x74\x0c\x7b\xe2\xd6\x45\x51\x48\x00\x4a\xe3\x20\xab\x8d\x78\x52\xbd\xae\x17\xd6\x14\xdd\xe9\x8e\x6c\x36\x53\x89\xab\xce\x78\x1a\x66\x9f\xc4\x8b\xab\xab\xd3\xad\x85\x3b\x6b\x55\x11\x3b\x69\x82\xa4\x1e\xb4\x3f\xc1\x66\x82\x85\xd5\xfb\x85\x87\xf6\xdc\x59\x26\xa4\x57\x73\x0a\xd8\x05\x30\x36\x08\x46\xf0\x71\x30\xe9\x1f\x5a\x2e\xb6\xe8\xc9\x42\x4b\x87\x6a\x39\x45\xd8\x13\x78\x0b\xbd\xaf\x3f\x2d\xfd\x53\xe9\x03\x0f\x4c\xbc\x73\x0b\x6d\xbf\x57\xa9\x71\xee\x47\x02\xff\xcc\xc2\x1b\xac\xe6\x14\x5f\x2c\xb9\x6a\xd4\xdb\x45\xeb\x74\xe7\x72\xa8\xe2\x3e\xd5\x0f\xfe\x74\xa5\x03\x25\xcb\xde\x06\x45\x6b\x31\xf1\xf2\xb3\xff\x74\x62\x17\xd0\x5f\x87\x33\xd3\xd4\xd7\xb1\x32\xb3\x60\x0c\x1e\x5d\xb0\x08\x68\xf7\x8f\x6d\x46\x3a\xb6\x12\x44\x3a\x7e\x58\x11\x7c\x83\xb0\xc9\x65\xba\x06\x3c\x60\x11\x45\x4f\x64\x4b\x65\x5e\x04\x12\x24\x8b\x64\x31\x3a\xfe\xf9\x2f\x9f\x30\x20\xa7\x9b\x3a\x0f\xb4\xf1\x27\x65\x34\xa3\x6e\x61\x31\x38\x44\x9b\x16\xcb\x0d\x05\xe8\xcb\xc1\xf5\x66\xae\x5b\xbc\x2f\x50\x87\x31\x63\x99\xc2\x13\x1d\x65\xd7\xb3\xb0\x9b\xff\x52\x1a\x90\x92\x84\xd7\xcb\x3c\x47\xbb\x85\x84\x59\x63\x42\x9d\xb6\x59\xe4\x34\x79\xfd\x38\x73\x95\xc4\xab\x40\x23\x02\x76\xcd\x23\x62\x4a\x16\xfc\x77\x96\x55\x81\x5d\x97\x88\x62\xb9\x34\x13\x3b\xce\xd1\x1f\xa7\x68\x85\x6c\x48\xdd\x87\x70\xec\x7e\xc8\x61\x9a\xc4\x2e\xa3\x15\x9d\x52\x27\x35\x01\x4f\x2f\xb6\x12\x38\x9f\x7a\xa9\xb6\x59\xc5\x2d\x36\xa8\xd3\x61\xf7\x59\xf6\x7c\x38\x17\x88\xe3\x7a\xbf\x0b\xe9\xfa\x7e\x9c\xaa\xea\x57\x0e\xbb\x34\x2d\x2e\x80\x76\x38\xcb\x7f\xa9\x02\xf2\x6c\xd9\xdf\x0f\x7f\xd7\x28\xb7\x9a\x3a\x4a\x23\x9d\x8b\x74\x6c\xaf\x1a\xbb\x36\xc7\x2e\x1d\xda\xe6\xc9\x93\xdf\x69\x9f\x10\xdb\x04\xe6\xa8\x56\x96\xa8\xf8\x6f\xaf\xa8\x32\x7b\xc0\xde\x5f\xdc\xcf\x49\xac\x10\xa4\xb0\x8a\x64\x5a\xe8\xa2\x7e\x63\xa6\xa2\x57\x2b\xdc\x02\x25\xb9\x47\x5c\x2a\xb6\xfa\xa4\xd3\x96\x68\x0b\xb6\xb0\x7d\x40\x99\xa6\x56\xb9\x78\x6b\xf9\xf3\xa6\x22\xbe\x87\x16\x1b\xa3\x2c\xea\xaf\x28\x8b\xa0\x2b\x74\x3e\x0f\xe1\xfc\x8e\x54\x9c\x1a\x5c\x79\xef\x22\x26\x2f\x0d\x68\xf2\xbb\x21\xe9\xe8\xf2\x62\xbd\x9d\x06\xc0\x73\x25\x9a\x33\xa7\x84\xe1\x7d\x2b\xbf\x15\xc7\x1d\xb6\xe9\x3a\xda\x1e\x9f\x0b\x61\x9c\xbd\x66\x4a\xbb\x6c\xe1\xd1\x12\x11\x2c\xea\x70\x24\xbb\xb3\xa1\xd9\x09\xc5\x2a\x80\x86\x14\x4e\xf2\xf8\xb5\x06\xe4\x36\xe8\x2a\x21\xb2\x91\xd5\x0e\xf5\x2f\xfd\x50\x54\x1f\x3c\x72\x1f\xc4\x68\xa4\xb0\xef\x18\x19\x92\xb7\x0b\xf3\x9c\xda\x6d\xd8\x5a\x74\x52\xd7\x20\xc9\x7a\xb7\x53\x73\x19\x8b\x5a\x36\xc0\x4f\xa2\x33\xde\x5e\x82\xbf\xf6\x74\x46\x52\x3f\x97\xc0\xa1\x42\xe8\x07\x04\x06\xf8\x09\xb6\xe2\x82\x6a\x26\x13\x3c\x31\xce\x93\xb6\x8f\x52\xa0\x53\xec\x51\xa7\x97\x20\x7e\x26\x97\x4e\xf5\x8d\x65\xbf\x2b\xbf\x03\x91\x5c\xe9\xfc\xc2\x1e\x27\x18\x11\xa9\xd6\x84\xe2\x1a\xdd\xa6\xed\x2a\x43\x3e\x54\x8e\xbc\x43\xf7\x08\xb3\xbe\x05\xcc\x76\x46\x57\x2f\xdc\x49\x57\xd0\x32\x4c\x13\xbd\x5a\x42\x8d\x02\x81\xca\x17\x1e\xfa\xe2\x98\x14\xe1\x87\x4e\x8e\xd9\x5a\x5b\x40\x24\x58\x53\x6e\x6a\x83\x11\xe0\x38\x8d\x41\x98\x41\xbf\xa9\x13\x23\x88\x72\xf0\xdf\xfc\x34\xca\x35\x8e\x39\x6a\x32\x51\x53\x7f\xa8\x4f\xd6\x3e\x98\xc4\xac\xb4\x3f\xc3\x72\x04\x36\xc5\xa8\xa7\xaa\x3b\xbe\x48\xea\xcd\xcc\x89\x50\x18\x34\x96\xe2\x01\xfd\x32\x6c\x4c\x66\x13\x5b\x43\xf0\x06\xe9\x62\xe7\x7b\xcf\x17\x93\xf9\x9f\xd3\xad\xe1\xc5\x8d\xfa\x22\x51\x3d\x0a\xd9\xc9\xcc\xd9\xc0\x86\xe1\x66\xb5\x1e\x2e\x8b\xf9\xa8\xd9\x1b\xb8\xf1\x76\x52\x56\x54\x8a\x52\x7f\x68\x36\x24\xf9\xe7\x4c\xe2\x99\xc6\x01\x20\xe2\x29\xd9\xe0\x6d\x3e\x71\x96\x59\x1e\xc4\x5a\x2f\x49\xd2\x71\xbd\x52\xfd\x59\x28\x49\x5a\xaa\x84\xb3\xd3\x4d\xd8\x55\xf0\x6b\x8e\xd0\xeb\xb0\x3b\x5e\x42\xbe\x35\xd4\x5e\xd0\xb2\x87\xeb\x0e\xf9\x86\x9d\x09\x02\xef\xba\x88\x8b\x01\x19\x95\xb0\x4a\xad\xce\x2a\x92\x88\x5a\x23\x64\x3e\xb6\x1c\x5a\xb2\xfb\xc8\xf8\xd3\xcb\x96\x6c\xcc\x35\xc7\xaf\x4f\x40\x17\x44\x95\x24\x04\xb7\x07\xd8\xb6\x64\x5c\x9c\x38\x7b\x0b\xcd\x52\x46\x90\x5b\x3c\x88\xa7\x92\x8b\x40\x89\xb3\x45\x5e\xde\x5c\xb2\xc8\x28\x0e\x59\xa0\x96\xed\xaf\xb4\xcb\x8e\x10\x36\x89\xf6\x30\x77\xda\xa4\xc2\x81\xc9\xe9\x2c\x0f\xcf\xe2\x98\x97\xa0\xd6\x4e\xa0\xd0\x7e\x3f\x9c\x3c\x9a\x90\x59\x52\x20\x0a\xc9\xad\x20\xb3\x4a\x3f\x76\x2e\x21\x4a\x7b\x48\x7b\x95\xe5\x7b\x5e\x84\xd5\xd2\x7e\x75\xec\x47\x66\xe9\xf9\x3f\x3e\x4b\x64\x81\x1b\x91\x45\x72\x03\x4e\x95\xbc\xa6\x41\x1c\x02\x67\xdb\xea\x2e\x29\xab\x5d\xcb\xb7\x9a\x18\xe3\xbf\x70\x16\x2e\x74\xde\x7a\x84\x0f\xd2\x68\x67\xa8\xdb\x82\xcd\xea\x4f\xf9\x02\x1d\xa1\x88\x3a\x77\xa8\x5d\x7e\x37\x57\x42\x0e\xcd\x54\xbb\x8e\x30\xc8\xc8\x4b\xf3\x87\xc2\xdd\x0f\x56\x98\xf3\xaf\xbb\x21\xb2\x6c\xa0\xbc\x69\xee\x66\xa6\xf4\x2c\x09\x45\x92\x9e\xba\x27\xb5\x24\x75\x11\xc8\x74\xd4\x26\x17\x67\xc9\xc3\x81\xee\xdc\x70\x5a\x91\x3c\x31\x88\xff\x43\x35\xfe\xee\x8c\x3c\x41\x41\x1b\xf8\x7e\x83\x58\x98\x51\x63\x82\x85\x62\xa2\x30\x47\x0f\x05\xf5\x66\xb2\x8a\xee\xc8\x89\xa2\x94\x39\x52\x8e\xc5\x99\x5f\x2c\x27\x29\xe7\xf3\xb8\x8b\x26\xf0\xa7\x9e\x6a\xfd\xbe\x13\x0f\x90\x6f\xa7\x4f\x3a\xd7\x55\x75\xef\x2d\x51\x49\x6e\x5a\x89\xef\xa3\x56\xc8\x2d\x37\x2b\x3e\x07\x33\xd9\xfb\x97\xa2\xbd\x21\x93\x6d\x76\x15\xb4\xcd\x46\x4e\x2d\x3c\x69\x7b\xb6\xb2\x2d\x48\x35\x7b\x5a\x07\x95\xb1\xb0\x40\x2f\xf6\xcc\xd1\x85\x25\x42\x5f\xc7\xd7\x61\xc2\x43\xd3\xed\xf7\xe1\x1e\xb7\x38\xbd\x66\x1f\xcf\x49\x46\x40\x57\xcc\xfe\x08\x91\xbb\xff\xce\x44\x8f\x75\x09\xb4\xac\x28\xad\xc2\x32\x56\xdd\x0d\x08\x4f\x04\xe1\x21\x0d\x20\xee\x6f\x0c\x15\xf6\x88\xc3\xc1\xea\x21\x1c\x87\xc0\x1a\xfc\x18\x6e\x70\x34\x5f\x28\xf9\x32\x6b\x5b\x61\x1a\x48\x27\x9c\x12\x63\x28\x08\xa2\x30\xf5\x60\xd9\x54\x04\x65\x5e\x11\x6c\x62\x12\x6e\xee\x5c\x9f\x3f\xa8\x89\x91\x39\x19\x9f\x2f\xc5\xb4\x49\x94\x29\xc7\xd1\xe9\x7b\xbd\xf6\x4c\xa8\x07\xc8\x66\x14\x7e\xd5\x08\x06\x5f\x86\x15\x76\xb8\x4e\xa5\x59\x51\x2f\xf0\x53\x9f\x55\x67\xc5\x42\xd6\x4e\xca\x1b\x7b\xd0\xc4\x42\x6f\x8d\xd5\xcd\xd8\xd2\x84\x9a\xdb\x04\xd3\x61\x61\x4d\xb4\x50\xf4\xe7\x26\x9c\xbb\xa3\xb1\xc9\x51\x9e\x38\xd8\x5a\xcd\x0a\xb2\x62\x49\x69\x32\xbb\xa0\x16\x5d\x38\xfa\x2d\x43\x28\xdc\xfc\x57\x94\x18\x7b\xc1\x05\x5d\xc6\xc5\x8e\xb2\xd4\xc9\x03\xdd\xd5\x5f\x85\x33\x13\x53\x42\x33\x96\x83\x50\x71\x66\x2b\xf8\x26\x25\x87\x9e\x91\x0e\x44\x0e\xed\x41\x24\x6d\x6f\x31\x49\x89\xfe\x94\x60\xff\x87\x18\xf5\x43\xb9\xff\xbb\xac\x82\x87\x1f\x59\x4d\x8e\x96\x97\x32\xed\x3b\xb2\xc2\x84\xc5\x1c\x3c\xdb\xaf\x88\x7a\x4f\x82\x9a\x54\x1d\x85\xd1\x34\x4b\x45\x3b\x00\xdf\x41\xe3\xad\x35\x24\x85\xb4\xb0\x81\xae\xb0\x47\x4c\xa8\xba\x28\xef\x2e\xcc\xa4\xe3\xee\x5a\xf9\xcc\x82\x9c\x26\x2e\x72\xb7\xc7\x24\x96\x7c\xb1\x41\xa6\xc7\x7e\x20\xe3\x22\xc2\x70\xf7\xd6\x84\xf0\xcb\x66\x60\xc9\x0e\x3b\xde\xa2\x16\xda\x77\x37\x7e\xae\xfd\x45\x2a\xd3\xa8\xf9\x88\x01\x8c\xc2\x98\xe2\x4f\x8a\x96\xf2\xac\x45\xfb\xe9\x22\x55\xbd\x47\x48\x37\xee\x35\x91\xe5\xf1\xb8\x3a\x44\x1a\xcf\x18\xa6\x20\xbd\x49\x83\x5c\x3c\x5e\x64\xaa\x5a\xd9\xcf\xbe\xd3\xe5\xad\x22\x5b\xb1\xc3\xef\x2e\x3a\x31\x53\xc5\x9b\xc4\x86\x64\x55\x14\x4b\x7b\xc9\x2e\x88\x70\x59\x2b\x33\xa6\xab\xde\x89\x72\x9a\xae\xeb\x98\x24\x25\x3b\x4d\x6f\x69\x30\x4f\x77\x7e\x45\x1e\x1a\x33\xaf\x5d\x3d\x98\xae\xe5\x7c\xb2\xf9\x7a\x40\x20\xf7\x08\x7e\xa4\x3a\xf0\xf0\x24\x70\xfa\x6c\xb0\xde\xb9\xd4\xfd\x53\x8a\x08\xfb\x67\x5e\x0f\x62\xff\x22\x57\xa0\x0d\x4d\x8d\x2d\x54\xbf\x1b\xe2\xe3\x28\x35\x51\x1e\xc9\xb5\xe1\x79\x18\xa0\x6f\xc1\x43\xc3\xce\x49\xdc\x5c\x0f\xc5\xab\xae\xda\x07\x0f\xff\xc6\x22\xda\x71\x3f\xe1\xca\x24\x76\x39\x65\x2a\x7c\xdb\x41\x08\xe8\x52\x1d\x23\x20\x0b\xb7\x45\x83\x3c\xb8\x58\x2a\x95\x92\xa4\x10\x72\x69\x35\x23\x11\x77\xfd\x32\x88\x73\x36\x4a\xe6\xfb\xff\xe4\x7f\xcf\x2e\x26\x26\x31\x1a\xdb\x6c\xe6\x30\xe4\xf8\x8f\x04\x69\xdc\x10\x2b\xef\xc5\x92\x22\x2e\xbb\xb3\x61\x95\x3d\xd8\x55\x6d\x28\xab\x52\x8c\x4b\x50\xd1\xf2\xc1\x18\x6c\xb1\xb9\xcf\xf3\x0f\x87\x4a\x3a\xcf\xa5\x27\x1b\xd7\xc5\xc1\xb5\x5b\x8e\x88\xeb\x46\xcd\x88\x80\x7b\x26\xb3\x90\x81\x11\x96\xaa\xf2\x8d\x9c\xb6\x3c\x91\x52\xea\x81\x1e\x0b\x2c\x14\xe4\xa0\x78\xe5\x8d\x14\x11\xe5\x7b\x54\xbe\xa5\x75\x28\x7d\xf0\x64\xf3\x9d\x4e\x61\xaf\x8c\xbd\x00\xb2\xc2\x57\x31\x73\x5c\x1a\x42\xf7\x41\x88\x82\x24\x4d\xa7\xf5\x1d\xfa\x39\x13\xd1\x0f\x74\x84\x32\x0d\x20\xff\x42\x3d\x20\x6a\xea\xb2\xdf\x7b\xb6\x38\xdb\x35\x7d\x18\xa8\x4c\x74\xb2\x66\xd5\xbb\x16\xfa\x8a\xcf\x5c\x24\x15\x94\x86\x1a\x05\xab\xcf\x9f\x10\x19\x8c\x8a\xb1\x4a\x7b\x61\xf8\xb4\x5d\xd9\xd2\x03\x1c\x5c\xf3\x6f\xa1\xc2\x87\xec\x46\x38\xc5\x1a\xa4\x7a\x04\xe5\x28\x5c\x06\x9e\x63\x7e\x65\x52\x23\x22\x5a\xb3\x14\x68\x65\x32\x62\x9d\x5a\x48\xe8\xf0\xa0\x36\x26\x59\x60\x52\x12\x9e\x97\x12\xf5\x8a\x70\x53\x68\x6a\xc0\xe5\x3f\xaf\xec\x85\x74\xf4\xa0\xb7\x22\x70\x3c\x59\x35\x87\xbe\x80\x07\x3b\x8a\x14\xee\x8d\x17\xab\xa4\x96\xbf\x28\x84\x36\xba\x4e\x5d\x07\x80\x1d\xc2\x11\x6b\x00\x92\x97\x64\x9a\xb3\xb4\x45\xa4\xa0\xb6\xc7\x07\x12\x5f\x60\x7b\xbe\x4a\xa5\x48\xa0\xc8\x9f\x0d\x48\x45\x4a\xb5\xf3\x55\x08\xdb\x43\x88\xd7\xc1\x2c\x44\x83\xca\xad\xb0\x5f\x7f\x5d\x02\x00\x07\x3d\x8a\x07\x2b\xf1\x22\x36\x26\xba\xe0\x86\x48\xcb\x93\xb4\x66\x83\xc2\x60\xbf\x96\x81\xbb\xfb\x1d\x26\x41\xaf\xdc\xdb\x5d\xa2\xc1\x75\x58\x82\xa2\x06\xe6\x84\x35\xce\xc5\x4e\x10\x6f\x0e\x3b\xda\x1b\xd8\xe6\x18\x12\x03\xa6\x43\x39\x89\x77\x1f\x52\xa0\x22\xe4\xe4\xf9\x18\x20\x40\x85\xe6\x42\xf0\xa3\xd9\xc0\x52\x33\x05\x54\x49\xad\xc1\x67\x58\xc6\x7d\xc4\xc3\xec\x3c\x43\x3d\x19\x14\x5e\xf0\xbc\x05\xcb\x36\x6c\x64\x3b\xee\x30\x0b\x64\xc2\x67\x6f\x65\x67\x60\xfd\x0a\xaa\xcf\x21\xc9\xa5\x83\x89\xe1\xde\x34\x8a\xc8\xb4\x24\x35\xaf\xd9\x43\x21\xca\x34\x56\xce\x2f\xfe\xa3\x72\x07\x7b\x48\xcf\x46\x60\x8e\x56\x0b\xbb\x09\x5c\xa5\x7b\x13\x5b\xcb\xbf\x3a\xa4\x87\xfa\x6b\xfa\xea\xbd\xe9\xaa\x56\xaf\xd1\x69\xe5\x11\x38\xbd\x28\x6c\x2a\xe3\xb4\x2d\x04\xd8\x1a\xd9\x97\xd1\x34\xe3\x77\xd1\x98\x7c\x3f\x1a\x95\xda\xb3\x77\x3a\xe5\x70\xe0\x5f\xea\x84\x04\xad\xf7\x5b\xab\x62\x33\x98\x60\x40\x63\xa7\x4a\xdc\xd7\x14\x42\xa6\x76\xf0\xe1\xc0\x68\x20\x3b\x17\x2f\x54\xc7\x04\x13\xab\x95\x15\x67\x4f\x42\xe5\xfa\x08\xc5\x90\xd0\x72\x93\xf4\xd0\xff\x01\x6b\xdd\xd4\x8a\xc4\x0e\x63\x8a\x97\x32\x13\xbe\x9b\x93\x02\x0e\x37\x21\x4f\x0a\x0a\xd0\xd2\x9a\xa1\xec\x52\xad\x5f\x12\xaa\xd8\x0b\x73\xa3\x89\x6d\x84\xf1\x34\x99\x9b\x8f\x36\x23\x24\xe3\x0c\xcf\xa7\xe0\x3e\xd8\xcd\xbe\x78\x92\x60\x75\x6b\xa0\x88\xad\x63\xfd\x50\xcb\xc7\x1c\x54\x54\x4a\xf0\xea\x5e\x23\x21\xf9\xc8\x23\xab\xbe\x50\x8a\x63\x25\xb8\xff\xa3\xd8\xc2\xcb\x04\x22\x94\xf7\x81\xc0\x0c\x9b\xbf\x8b\xa3\x93\xa1\x12\xc5\x23\x6f\x7e\xe8\x3f\x16\x70\xb7\x56\xcf\x6a\xcc\x03\x65\xd8\x99\xb8\x06\x42\x38\x4f\x9a\x50\x99\x4b\xd4\xce\x5f\x52\xf8\xfe\xe5\xbc\xa9\xad\x99\xa7\x42\x2c\x05\x4a\x43\x08\x7b\x2d\x82\xfc\xc8\x7e\xa4\x2d\xdb\x43\xc8\x80\x12\x61\xd1\xcf\xf4\x4a\x60\x52\x88\x0b\x81\x6b\x18\x91\xbb\xd4\x49\x78\x43\xd9\x36\x4c\x93\x7b\x94\xbf\x92\x4e\x9f\xd4\x8d\xd0\x69\xb2\xc5\x46\xce\x53\x28\x4a\x01\xfa\xfa\xcd\xfd\x79\x04\xa1\x7a\x11\x7f\xed\xa8\xe1\x2c\x85\xa5\x25\xb5\x3e\x8e\x69\xeb\xc2\xed\x3b\x5e\x43\xc7\x8b\xd4\x87\x6d\x23\xba\xa3\xa4\x6c\x49\x6e\x5b\x78\x2c\x79\x72\xfe\x3e\x27\xc3\x80\xb9\x86\xe2\xd7\x6c\x29\x52\xe0\x6d\x35\x93\x8a\x18\x85\x21\x28\x2f\xe3\xab\x4f\x28\x02\x89\xab\x12\x6d\xdc\x94\x98\xe7\xdb\x04\xe7\xcd\x35\x90\x83\xdb\x63\x0e\x41\xb7\x1f\x6a\x2d\x2a\x27\x7c\x1a\xd4\x5e\xf6\x56\xe7\x52\x55\x4f\x35\x7a\x2f\x35\x47\xcf\xc9\x40\x4b\x62\x77\xa5\x92\x15\xc6\x29\x7c\x45\x24\x68\x50\x1e\x35\x02\x45\x52\xd1\x5e\x62\x50\x67\x4b\x76\xde\xfb\xa6\x25\x39\x32\x3e\xd0\x36\xc3\xd5\xa9\xfe\x34\x23\x03\xcf\xb2\x89\x80\xba\x30\x82\xe4\xc0\x0e\x42\x2f\xfd\x33\xb2\xe1\x43\xd1\x9d\x46\xf1\x49\x9d\x91\x74\x31\xe6\x1e\x6b\xd9\x29\x7e\x02\x0d\x73\xe1\x2f\x0b\xe9\x20\x76\xb0\x37\xbe\xe0\x7a\x95\x96\x78\xe9\xd8\x00\xca\x68\x5d\x34\x59\x33\x06\x21\xa5\xb4\x65\xd7\x08\x14\x18\xb0\x49\xdd\xd3\x23\xc1\x18\x4c\xb4\x9c\x31\x9a\x60\xca\x6c\xfb\xf0\xaa\x43\x50\x4c\xfb\xcb\x3b\x10\x87\xeb\x32\xb3\x71\x0c\xe5\xc2\x99\xfe\x85\x90\xc0\x28\x29\x67\x1e\x5e\x8b\xa6\x49\x05\x2b\x33\x9f\x5a\x45\x1a\x9a\x8b\x22\xc6\xbc\x8b\xe5\xf3\x58\x17\xa6\xeb\x24\x5e\x5c\x45\x10\xb6\x82\xc4\xaf\x76\xb0\x47\xb0\x4b\xa8\x10\xc3\x09\xf1\x96\x68\xda\x90\x4a\xac\x38\xff\x27\x41\x27\x08\xb5\xed\xd8\x6f\x46\x11\x1e\x7f\x45\x8b\xbd\x1d\x33\xd5\x2e\xe2\x25\x59\x62\x9c\x14\x5f\x76\x1e\x4a\x44\xed\xfa\x14\xca\x2e\xc9\x16\xe1\x38\xd3\x57\x39\x15\xb9\x9d\xb3\xa8\x19\x43\x4e\x93\x04\x40\xc6\x68\x52\xdc\xa2\x72\x94\x3e\xe4\x39\x8c\x41\x02\x83\x05\x46\x25\x31\x34\x96\xa8\x91\xac\x92\xd8\x2d\x4a\x9a\x6e\x0e\x2e\x70\xc2\x4f\x1d\x7e\x2b\x3a\x1b\x2e\x8e\x96\x7c\x59\x08\xf6\x65\x8d\x20\x09\x11\x6e\x3d\xe0\x3b\x82\x65\x92\x9a\xcd\x85\x3a\x72\xc9\xda\x08\xa6\x7b\x6c\x22\xfe\x59\xca\xe9\xec\x1b\x8d\x46\x58\xc4\x00\x71\x82\xba\xc2\xbe\x31\x54\xb1\x9b\xe0\x0b\xa3\xad\xad\x15\x79\x0f\xc5\x34\x2e\x36\xad\x54\xd7\x6b\xad\x8c\xba\xc0\x26\x50\x09\xe3\xc8\xdc\xa4\x05\xe3\x6e\x1e\x31\xf9\xe7\x47\xc5\x98\x3b\xed\xa2\xf9\x20\x09\x7e\xf5\xad\x6e\x1d\x43\x2f\x58\x7d\x20\x3e\xa5\xb1\x77\x22\xa5\x47\x91\xee\xa6\x3a\xbf\xaf\xc9\x7f\x67\x55\x75\xca\xcc\x44\xff\x91\xfa\x08\x55\x50\xbe\x98\x7d\xac\xad\xbd\x5a\x14\x11\x55\x24\x35\x49\x0a\xb6\x1b\x94\x36\x23\xc4\x93\x1b\x82\x32\xb1\x48\xd6\x85\x71\x00\x4a\x6c\x98\x50\x72\x34\xfe\xa4\x39\x1e\x75\xda\x51\x7b\x62\x68\xef\xa0\x1b\xbf\xb4\xd0\xda\xc9\x42\x4d\x4e\x93\x1a\xe2\xa1\x34\x93\x25\x62\xe3\x8d\x81\xbf\xb7\x86\x7e\xde\x22\x09\x67\x08\x57\xa5\x03\x65\x1b\x10\x4a\xdd\xa9\x17\x11\x16\xbf\xeb\xc7\xfd\x7b\x9f\x54\xed\x78\x95\xd6\x4a\x4b\x68\x45\xba\xef\xfe\xe1\x6d\x8a\x50\x6f\x07\x50\x64\x2a\xb3\x98\x78\x43\x9a\xd3\x80\x2b\x1c\xba\x10\xf5\xbd\xe5\xb4\x3f\xa9\x0b\x79\xf7\xa2\x2a\xe1\xe0\xdf\x46\xd7\x9f\x53\x93\x07\xe6\x83\x80\x6b\x0c\xa0\xaf\x0e\xb2\x26\x94\x9d\x56\x5c\x84\xfb\xa5\xb8\x23\x92\x7d\xe2\x06\xed\xdf\xbb\x4b\x91\xde\x89\x87\x0c\xa6\x2d\x76\xd4\xec\x2c\xbd\x20\x24\x0f\x9b\x16\x5c\x62\x92\x83\xa9\x6e\xcc\x03\x34\x70\x68\x43\x1f\x5c\x9a\x54\x0e\x92\x0d\x54\xc7\x09\x74\xb9\xb0\xe0\xb5\x69\x20\x79\x67\x1e\x4b\x1f\x16\xbd\xb0\x3f\xa2\x78\x1d\xb8\x55\xbe\xdc\xbe\xa6\xa6\x0a\xe2\xfd\x06\x3a\x15\x3e\xee\x4c\x79\x4e\x7a\x6d\x95\xb0\x07\x05\x24\xd4\x10\xdb\x9a\xc0\x54\x79\x6e\x3a\x27\x4d\x4c\x10\x89\xf2\xa8\xe2\xc5\xb2\x07\x93\xfa\x20\x28\xb8\x06\x8d\xaf\xfe\x7e\x1e\x70\x6d\x3e\xaa\x90\xe3\x75\x5c\xe8\x8c\xdd\x05\x85\x65\x64\x86\x8a\x44\xdb\xda\x89\x13\xbb\x62\x59\x2c\x76\xee\x23\x56\x05\x79\x80\xe0\xf3\x97\x68\x9a\xbf\x08\x51\x4f\x06\xbf\x78\x80\x09\x3d\x20\x76\xa0\xd3\x62\xb9\x59\xb4\xc0\x69\x9a\x4d\x65\xfd\xb5\xfe\x59\x32\x7f\xf9\x7c\x8a\xe6\xe4\xb1\xdb\x19\x59\x33\xe2\xa1\xa0\x82\xc3\xa1\x7c\xcc\xa6\x92\x2f\x4b\x0f\x71\x91\xc0\xef\x32\x1d\x90\x55\xfd\x42\x8f\xba\x14\xf2\xc2\x39\x45\x70\x9b\x3a\x62\x1d\xe6\xd0\x65\x2d\xdf\x0d\xe0\x15\x5d\xe3\xce\xc5\xda\x72\x50\x68\x57\x4e\xb7\xec\x4e\xea\x90\x27\x94\xe2\x30\xc0\x91\x1a\x36\xd4\xd9\x8d\xb3\x1b\x11\xdd\x7c\xb5\x00\xf7\xb2\x65\x29\xc4\x7f\x49\xe0\x29\xad\xaf\xdd\xc5\x1e\xa4\x97\xfe\xab\xba\x75\xb6\xeb\x6a\xee\xb7\x9d\xa0\x41\xed\x17\xd0\x1f\x90\xb5\x71\x2a\x0d\x0f\xbc\x57\x9b\x95\xa5\x77\xb5\x52\x1f\xfa\xcd\xda\xee\x2e\x48\xb7\x77\x4d\x50\xa5\x9c\xf6\xbc\x93\xfa\x5c\x24\x3a\x96\x96\xd1\x2b\x1c\xe2\x7e\x5d\x38\x6c\x28\xe7\x42\x36\x19\x27\x04\xcd\x4a\xda\x19\x8e\x50\x76\x98\xbd\x0a\x6f\x15\x8b\x75\xf7\x36\x96\x9d\xda\xe4\x8d\x55\xf3\xa0\x6f\xc1\xc4\xc5\x38\x16\x98\x36\xc4\xd2\xb3\x9c\xab\x8b\x0f\xd3\x47\xec\x4f\xce\x40\xb9\xd4\x4e\x07\x56\x8a\x86\x96\xe5\x31\x2b\x38\x97\x2f\xa1\xa1\xdd\x2b\x77\x33\xb1\x56\x4a\xf8\x2d\xbd\x98\x2c\xb3\x07\x7e\x79\x52\x95\x76\xdb\x55\x90\xf0\xcb\xa9\x03\x04\x0e\x33\x0f\x0a\xe1\xae\x63\x83\x4e\xb4\x3c\x51\x1b\x63\x18\xdd\xf8\x2e\x72\x7e\x4a\xe5\x5c\x75\x4c\xc4\x7d\x61\x56\x4f\xdd\x7b\x81\x37\xd3\xf9\x54\x5f\x47\x52\x71\xa6\x8b\xf9\x48\x80\x09\x23\xea\x01\xfe\xce\xb7\x99\x6a\x12\x6a\x43\x08\x9f\xda\xc2\x64\x08\xdc\x69\x5e\x21\x08\x14\xdc\x94\xf5\x94\xd1\x9d\x4a\xf7\xe5\xc1\xcd\x6a\xac\x2e\xca\x85\xbf\x4c\x6d\x0a\xae\x84\xab\xd4\xc2\x62\x01\x1c\xbb\x37\x82\x2a\x2f\xd9\x62\x75\xcc\x2c\x12\xbf\x93\xba\x97\x9c\x8a\xfd\xfa\x00\xe0\x43\x41\x60\xd8\x24\x1c\x0b\x89\x09\xde\xc5\xdc\xc6\x6a\xf9\x99\x25\x32\xe9\x1d\xde\x61\x0c\x43\x0d\x7f\x6f\x83\x69\xd4\x04\x5d\x64\xce\x9c\x9d\x12\xe5\xc7\x36\xd9\x66\x0b\xef\xd6\x9f\x7f\x79\x1e\x74\xe3\x2d\x48\x4e\xca\xc9\xfb\x88\x5d\x64\x91\xd4\x28\xd2\xab\x64\xa8\x59\x38\xbc\x89\x76\xb7\xd8\x0d\xc3\xe6\x27\xf0\x6c\x82\x8b\xa5\x1a\xa7\x37\xef\xb7\xb4\x19\xb0\xbd\xea\x7f\x54\xbf\x77\x1d\x59\x78\x84\x81\x87\xd7\x7b\x9c\x68\xf2\x04\xdb\xbb\x78\xba\x54\xaa\x38\x7e\xe6\xb1\x91\xae\x70\x8f\x30\xce\x1c\x26\x60\x85\x83\x4d\x6d\x0e\x70\x6f\x34\x65\xd0\xd7\xc0\x53\x48\x6d\xfa\xa3\x85\x69\xb0\x1d\xef\x50\x7f\x46\xb3\x9f\x25\xa7\x7a\x54\x7b\x4b\xa7\xa4\x08\x6f\xb0\xbc\x68\x2b\x9c\xaa\x88\x38\xbd\xe9\xbf\xaa\x48\x16\xb7\x12\x2a\x46\x41\xba\x5d\xf3\xd5\x01\x74\xa3\x2e\xe3\xd5\xbc\xfe\x93\xa2\xdd\x17\xc3\x6f\x14\x59\x46\x93\xcb\xe8\x24\xef\x2a\xbc\xfa\x1e\x53\x28\xcc\xc8\xb7\x36\xe2\x4d\xe0\x70\xba\x8b\xf0\xec\xe2\x80\x38\x30\x2d\x74\xf2\xb2\x58\xd5\x98\x93\x98\xb8\xe0\x7f\x32\x10\x75\x90\xb8\x69\xc4\xaf\xa4\x8d\xb8\xed\x3f\x4a\x0c\xad\x6c\x3a\x51\xef\x00\x8f\x2c\x10\xfc\xef\xa4\xa1\xda\x3f\x73\x57\xc5\xc6\x96\x6a\xc2\x9a\x34\x50\xcc\x2d\x31\xa5\x1b\x65\xc2\x52\x04\x61\x54\x78\x9e\xa3\x94\xf5\xe1\x08\x82\xa3\x29\xba\xef\x92\xf1\xd9\x13\xb5\x4b\x37\xa9\x77\x78\xf5\x97\xa6\xc4\x7c\x6c\x63\x90\xb2\xa9\x60\x0c\x4e\x9d\xe7\x80\x9e\x01\xd2\xb6\x02\x29\x9d\xce\xfe\xa3\x94\x21\x4d\x02\x9b\xae\xb8\xa4\xf3\xbc\x43\x7c\xc1\x16\xbd\xde\x38\xaa\x47\xb8\xc0\xf9\x78\x68\x90\x5a\x15\x75\x7d\x17\xfd\xeb\x6b\x05\x6f\x68\xd6\xc7\x8f\x7c\x82\x6c\x2e\x09\x0a\x68\x05\xf3\x79\x38\xd5\x95\x91\x05\xe5\x07\x1a\x1f\x76\xd7\x5f\x1e\xa2\x96\xbc\x23\x8a\x06\x83\x86\x3f\xbe\x5f\x26\x1b\x71\x1a\x3e\xe8\xbf\xd3\x1b\x86\x8b\x1a\x1f\x1e\xb7\x7f\xc4\xcd\xe4\x2f\xff\x25\x22\x36\x39\xb6\x9b\xc2\xe4\xa5\xb4\xb4\x9d\x17\x16\x5e\xcd\xf9\xc9\xaa\xd9\xc5\x0c\xa0\x89\x24\x01\xfc\x50\x73\xd5\x76\xfc\xd0\xcc\x74\x0b\xf5\x15\x95\xc4\xef\xed\x61\xfb\xb4\xdd\x79\x4c\x9c\x24\xc1\x66\xa0\xee\x32\x09\x6c\xb5\xd7\x89\x98\x04\x2f\x4d\x0d\x8d\xf9\x49\x72\x01\x16\x06\x37\xec\x1c\x18\xc6\xd7\xe4\x4f\x94\xaf\xd4\x5d\x97\x1d\xfe\x56\x3c\x33\xf5\xac\x10\x99\xf9\xde\x35\x7e\xd1\xce\x7f\xc8\x6e\x86\x4c\x1f\x46\x6b\x84\xb6\x48\x21\x14\x19\xa0\x1e\x8f\x8e\x86\xe8\xf5\x6c\x23\xdb\x62\xa5\xbe\xa9\x32\xe9\x0d\xc9\x06\x0d\xe3\xa7\x4b\xa4\xe4\x22\x23\x99\xfd\xa4\x82\x67\x6b\xdd\x38\x54\x64\xa2\x04\x94\xe6\x25\xad\xda\x40\x59\x2d\xbb\xf8\x1d\x23\xcf\xe8\xf9\xe5\xf3\x38\xdd\x58\xc8\x04\xa3\xb0\x08\x3e\xf1\x08\x90\xeb\xe4\x1d\x70\x25\x09\x5d\x2c\x3b\xfe\x3b\x9b\x4f\x51\x8f\x60\xce\x4e\x5d\x22\x5b\x62\xf5\xca\x59\x48\x94\x42\xfb\x7e\x91\x6c\x96\xf7\x45\x4b\xb2\xb4\xf6\xd1\xb6\xed\x6a\x44\xbc\x04\x2f\x26\x89\xce\xea\x7b\xe8\xd5\x2e\xbd\x16\x1e\x2d\xd2\xf4\xfd\xa3\xc8\x70\x44\xfe\x12\x2c\x48\xc1\x38\x7e\xe2\xa3\xe7\xde\x52\x27\xc1\x2a\x28\x95\xee\xd1\x2c\xc7\x2a\x1c\x31\x46\xa7\xd8\xe8\xa9\xca\xde\x86\x8d\x85\x3a\x1f\x41\x0a\x5f\x47\xc6\x54\x0f\xc9\x07\x6f\x6a\xad\x53\x2f\xce\x57\xc2\x8c\x75\x98\xc9\x47\xb0\x2b\xb9\xcb\x3e\x69\xbe\x41\x5a\xaa\xcf\xf0\xe5\x4e\x0f\xaa\x70\xdb\xa1\x55\x61\xd2\xe7\x96\x70\x35\x1e\xad\xc8\x69\x17\x97\xb8\x01\x05\x29\xf8\x35\xe5\x5b\x60\x97\x02\x07\xfc\x02\xe1\xd1\xd9\xa3\x9b\xe9\x7c\x27\x31\x0e\x42\x33\xc9\x05\x68\x39\xac\xb8\xbc\xfc\x47\x53\xcc\x55\xab\x6a\xb2\xe2\x8c\x1b\x8b\xbb\x73\x3a\x6f\x82\xbd\x63\x7a\xad\x48\x79\x89\x48\x8e\xd3\x2c\x06\xe1\x7c\x14\xd6\xb2\x5f\xa2\x64\xda\x22\x5f\xcc\x28\xaf\x95\xa7\x31\xc2\x6d\x22\x00\xde\x24\x1f\x36\xcf\xac\x7b\x58\x19\x0b\xbf\x81\x29\xc5\xee\xea\x7e\xcc\xdd\x45\xdf\x76\xf5\xd8\x4e\x83\x7a\x91\x42\xbc\x52\xcc\xc1\xd9\xb2\x1c\x49\x2b\xcd\x98\xb5\x4d\xaa\xb9\x38\x1f\xee\x86\x6a\xef\xe1\xb2\x74\x2b\xca\xb0\xe9\xd3\xb5\x78\xe7\x1f\x99\x2e\x9f\xee\x09\x75\xe0\x4b\xf0\x26\x99\x09\xa2\x71\x70\x10\x86\xfe\xd5\x11\xd4\xab\x47\xd2\x17\xa1\x0b\x40\x2b\x6d\xcf\x28\x0a\xba\xb2\x89\x4a\x17\x49\xfd\x40\xfb\x11\x4a\x5b\xe5\x57\x43\xb5\x55\x47\xf5\x01\x2e\x53\xd6\x04\x19\x6a\x96\x2a\x4a\x90\x9e\xa5\xd9\x4f\x4d\x67\xf0\x0b\x91\x85\xd5\x5a\x66\xd3\xe9\xec\xd6\xab\x7d\x02\x83\x99\xed\x53\x6a\x8c\x40\xd4\x18\x3c\x68\x90\xf3\xa8\x99\x23\xde\x22\xc2\x3a\x02\xe1\x84\xe9\xde\x9a\x96\xe4\xcc\x9c\x11\x24\x2e\x6c\xfd\x03\xe1\xa4\x22\x5e\x0e\x38\x9f\xce\x6e\xd7\x19\x46\x85\x20\xc4\xc3\x97\x50\x97\x04\xae\xad\x25\x79\x5c\x0c\x0f\xc6\xf2\xfe\x09\xb6\x8d\xea\xef\x83\xfd\xe6\x82\xb9\x89\x52\x3b\xa1\x25\x39\x83\xb8\xcd\xec\x8e\x08\xe4\x8a\x36\x04\x44\x23\xd9\xd3\xfb\xc4\xce\x54\xb3\xdd\xf0\x23\x7d\xd0\x6b\x45\x85\xbe\x11\x9f\x9f\xb9\xf0\x48\xcf\x98\x91\x0d\x27\x8b\x8c\x13\x23\x72\x8c\x7b\x0c\x1a\x97\x93\x09\x9a\x1e\x0d\x75\xba\xf6\x7f\x4e\x94\xdc\x2f\x2d\x01\xd1\xd8\x1f\xcd\xc3\x53\x96\x1d\x55\x1f\x8b\xc4\x34\xb4\x84\x3b\xd7\x5a\xb6\xfd\x2f\xb7\xab\x46\x7d\x63\xc4\xf1\x6f\x54\xc9\xb8\x60\x78\x52\xbc\x53\x53\x2c\xbf\x36\x13\x1b\x86\x68\xfb\x1a\x0b\x14\x3d\x5f\x20\xba\xb4\xfe\xb4\x90\x2a\x88\x49\xbd\x5a\xe8\x92\xef\x1a\x5c\xee\x6c\x23\x86\x44\xf6\x40\x0c\x60\x88\x49\x6f\x6a\xb1\xdc\xc2\xc7\xac\xe5\xc1\xa8\x9a\xd8\xa7\x6d\x40\x08\xcb\x33\xbd\x63\x45\x07\xcd\x13\xb7\xff\x49\xb5\x1a\xd9\x2c\x14\xde\x15\x14\x7a\xab\x12\xad\xd5\x67\x55\xbd\x74\x85\x71\xde\x38\xe5\xc6\xf3\x34\xea\xfb\x34\x4e\xc7\x2c\x2b\x13\x44\xc3\x62\x51\x05\xd6\xcd\x91\x78\x16\x7e\x9a\x5e\x09\x6f\xb1\xd4\xcb\x43\x8b\x3e\xcd\x51\x14\x4f\xd3\x81\x4d\x47\x73\x23\xd7\x53\x7a\xa1\x4c\x5d\xca\xa2\x19\x6d\xde\xbc\xcb\x2d\x91\xf4\x50\x6f\x81\x25\x83\x9f\x43\xc2\x80\xec\xad\xc3\x6f\xda\x9f\x92\x9a\x51\xa1\x3e\xda\x0b\xe9\xe2\x28\xc4\x2e\x5c\x6e\x54\x05\x13\x43\xbc\x98\xd5\x06\x0f\xfb\xef\xdf\x8f\x36\x8a\x23\x15\x38\xf7\xb4\x0b\x3e\xb2\x0f\xe4\xda\x55\xd0\x03\xc9\x3d\xd8\x6d\x9b\x86\x87\x6d\x79\x84\x85\xa6\x38\xdf\x75\x66\x89\x4d\xf8\xe8\x1f\x66\xa3\x53\xe6\x0b\x10\xb0\x53\xe2\xf7\x25\xd5\x8f\x4a\x7c\x50\x14\x2c\x98\x68\x87\xcf\x5c\xe9\x9d\x3c\x21\xd4\xe3\x84\x2d\x34\x6f\xf0\x64\xa5\x83\x60\x99\xc3\x42\x1c\x35\x89\x34\x31\xba\x7f\x42\x44\xd4\x8b\x01\x73\x54\x30\x1c\x8a\x1b\xb8\x67\xa3\xba\x14\x58\xc3\x13\x76\x90\x34\x35\x3d\xa2\x0a\x9d\xf2\x45\x23\xc2\xa6\x13\x73\x05\x3a\x75\xa6\x1c\xe4\x5c\xa0\xa2\x26\xba\x1e\x29\x77\xa7\xa4\xf1\x49\x29\xf6\x82\xcb\x57\xf1\x51\x6a\xaa\x78\xcc\x91\x75\xe1\xbb\xf3\x7c\x02\x43\x76\x7e\x61\x2f\x3f\x1c\xcd\xac\x1e\xf2\xf3\xd4\xb7\xc1\x75\x7c\x22\x11\x33\x16\xf1\x3f\xbd\x6b\x1b\x12\xa6\x81\x56\xd9\xb2\x23\x6e\xa1\x4c\x4e\x6b\x22\x0f\x72\xa3\x10\x41\x9c\xb1\x72\xe8\x9e\x5e\xd6\xc8\x5f\x00\x86\xa1\x47\x90\x66\x1e\x4e\x2b\x09\x84\x5e\x97\x06\xc7\xd9\xe7\xfa\x30\xf5\x29\x40\x29\xa2\xd6\x1f\xbd\xbc\x64\x81\xe9\xa5\xcd\xee\xd1\x22\xf7\x13\x67\x29\x7c\x38\x44\x49\x1d\x62\xef\x36\x6d\xe6\x38\x3b\x26\x88\x2d\x32\xda\x29\x52\xbb\x12\xb7\x5f\xe9\xe6\x16\x0d\x61\x1b\x13\x87\x9f\x4f\x4d\xb1\xad\xf5\xe8\xe2\xc6\x4b\xbd\x26\xdd\xd1\xed\x79\x8b\xde\x47\xa6\x14\x73\x89\x8a\xe9\x9b\x0a\x7a\x39\x08\x36\x97\xac\xbc\xff\x0d\x23\x29\x89\xbc\x9d\xd2\x81\xf1\xb1\x59\xbc\x69\xc1\x9b\xdf\x92\x04\x5e\x96\x4f\x6b\xc1\x13\x47\xdd\xa5\x38\xb1\x23\xb3\x9d\xaa\xc2\x1e\x02\x34\x4c\x30\x42\xab\x0a\x14\xb6\x43\x63\x2d\x29\x04\xe4\xc5\xec\xd0\xb8\x8f\x59\xe7\x5d\xdb\x51\xef\xc0\xe0\x9c\xa9\x50\xea\x25\xc6\xb3\x50\xd8\x57\xba\x41\x16\x08\x94\x86\xed\xfb\xfc\x4f\x5f\x05\xc2\xd6\xbf\x57\x8b\xe4\xb9\x5c\x31\x88\xcf\x9a\xc3\x33\x9f\xd0\xb8\x37\xc3\x57\x1f\x12\x89\x0d\x9c\xde\x25\x35\x74\xf8\x99\x20\x91\x76\x29\x3a\x6b\xfa\x48\xdd\xb7\x27\x31\x43\x8a\x1c\xab\x57\x6c\x14\xd3\x8f\x27\x04\xc2\xa3\x61\xc1\xce\xab\x78\xae\x96\x9f\x57\xce\x17\xdc\x17\xc6\x55\xdb\xd5\xe7\x71\x69\xba\x36\xca\x30\x1a\x0e\xc2\x3f\xf6\x4d\xf7\x73\x9d\x44\x47\x27\xf9\xc1\x21\x20\x11\x30\x50\x41\x82\x43\xca\x98\xbe\xee\xff\x7a\x2e\x40\x0c\x55\x6c\x73\xaf\x4e\x7b\x87\x9e\x8b\xe1\xeb\x71\x83\x55\xf0\xcd\xd5\xa9\x6b\xb9\x26\x52\xb1\x7a\x49\xfd\x31\x14\x8d\x61\x59\x3d\xea\xa3\xe4\x7e\x21\x76\x87\x31\x2d\x54\x44\xdf\xa5\x5f\x0c\x8e\xeb\x4d\x7e\xe8\x86\x21\xc6\xb0\x4e\xff\xd1\x70\x0d\xae\x40\xd9\xbc\xee\xa1\x5a\x33\x14\x77\x77\xa8\x1e\xfb\x03\x17\x01\xf2\x4e\xcd\x67\xcf\xde\xd3\x4c\x02\x63\x9b\x31\x10\x9b\xf1\x6b\xd5\x5b\xdb\x55\x16\xb4\x85\xc6\x31\xbe\xa5\x2a\xb0\xd1\x00\xb3\xcb\x70\x88\x6a\xed\x7a\xce\x81\x44\xda\x97\xc2\x21\x6b\x0c\xdc\x8c\x40\x0a\x8d\x4e\x39\x8a\x19\xcf\x80\x01\x89\x31\xce\xe4\x2f\x5b\xda\x3d\x7d\xc8\x0d\xf8\x48\x35\xce\xf5\x36\xf1\x6b\x44\x03\xd8\xdb\x99\x93\x4b\x6a\xca\x73\x13\xdb\x04\x5c\xae\xe0\x2b\x7e\x89\x68\x1d\x97\x3c\x09\x3e\x7f\x4a\xb0\xa4\x4d\x4d\xc4\x81\x80\x68\x0e\xe1\xcd\x12\x38\xd8\xbb\x70\xa2\xe6\x51\x67\x30\x34\x18\x50\xc4\x10\x15\xc0\x6e\xec\x24\x8b\x11\x3d\xff\x4c\x15\x09\x2a\xf1\x4a\x31\x87\xfc\x13\x4b\xda\x1a\x65\x34\xfe\x3e\x06\xb3\x0a\x15\x1a\x04\xf8\x42\x06\x53\x5b\x9d\x43\x80\xa0\xab\xbc\xd6\x16\x2e\x0c\x0c\x4c\x11\x4d\xb8\xce\x36\x16\xe0\x27\x11\x12\xfd\xd6\xda\xa4\x65\xc2\x12\x17\x16\x9d\xca\x2a\x08\x29\x84\x06\x35\xf8\xb6\xd1\x75\xa2\x9f\xcf\x1b\xa8\xff\xe9\x2c\xe2\x35\xf0\x99\x37\x62\x50\xf4\xca\xec\xa1\xc4\x79\x6b\x92\x50\x58\x3e\x33\xf5\x96\xda\xd3\x59\x8a\x40\xe1\x45\x45\xe7\x9f\x70\x04\x11\xd9\x87\xe4\xff\x9c\x31\x93\x66\xa8\x12\x33\xd8\xc2\xce\xe1\xc3\xc0\xbe\xe3\xc7\x72\xcb\x90\x65\xa1\x35\x3a\x12\x12\x2d\xf8\x03\xf4\x5c\x3e\xbf\x65\x02\x7a\xd9\x9f\x33\x44\xb4\x1c\x9e\x0b\xbc\xd5\x8b\x31\x41\x25\xba\x73\x0c\x43\x5e\xfe\x8a\xe2\xfe\xfa\xea\x0d\x0f\xdb\xc8\x84\x36\x40\xe5\xd0\x2c\x94\x50\x2c\x59\x2c\xe6\xc2\x48\x80\x74\x31\x41\xec\xbd\x5b\x14\x05\xfb\x4d\x53\xcc\x9b\xda\x35\x70\xae\x9b\x2e\xe9\x7f\xc7\xc2\x18\x88\x96\x67\x54\x69\xcf\x2d\x09\x32\x44\x4e\x1b\x85\x2a\xfe\x8d\x87\x46\x63\xd9\x86\xf4\x2a\x41\x2a\x0d\xf9\xe0\xaf\xf9\x9b\xe4\x3a\x2c\xde\x4a\xc7\xa9\x20\xef\x72\xfc\xcd\x5b\x9b\xdb\xfa\x22\x47\x59\xf2\xa5\xeb\xf9\xf7\x2f\x33\xc9\x33\x6f\xf0\x01\xde\x9a\x18\x8a\xc7\xba\x5e\xe0\x85\x66\xea\x70\x47\x35\x0b\x93\xcd\x99\x51\xad\x71\x07\x50\xdf\xb5\x4b\xe9\x28\xbf\x6b\xca\xdd\x30\x33\x28\x0a\xdb\x55\xb2\x70\xde\x48\xfd\x05\x85\xf4\xce\xea\x96\x66\x94\x8f\x24\xc2\xbf\xa1\x1d\x93\x31\xb2\x25\xaa\xbd\xc8\x67\x6a\x33\xb4\xdc\x7b\xf9\x0c\x29\x8e\x77\xd3\x45\xea\x85\x32\xbb\x5a\xe8\xd9\x58\x1c\x95\x80\x4d\xaf\x69\x59\xe8\x3b\xa1\x11\x70\x88\xbc\xf9\x52\x28\x10\x69\xff\x22\x04\xb2\x74\x99\xb4\x16\x07\xfd\x90\xaf\xa4\x46\xae\xc7\x88\x3b\x42\x5b\x79\x79\x91\x3d\xc7\x74\x33\xc6\x87\xff\xd1\xf3\x1f\xe4\xe2\x45\xc5\x77\xaf\x77\x46\x5c\xa5\x41\x3e\xc8\xa5\x71\xa7\x31\x5e\x97\x26\xfc\x31\x2a\x18\x1e\x68\x69\x35\x56\x96\x5d\x0c\x79\xba\xd3\x0f\x78\xff\x41\x0d\x4d\xd1\xac\x29\xcd\x07\xc5\x8b\x24\x71\xea\x20\x32\x7f\xf1\x9c\xdf\xd4\x44\xdc\x3e\x7a\x3c\x0d\x22\xdd\x63\xb1\x6e\x0c\xd9\x71\x6d\x30\x4f\x3b\x72\x1d\xb6\xc6\xbc\xa5\xc2\x13\x64\x79\xe5\xe7\x67\xa8\xcf\x1c\xd1\x27\x88\xce\x5f\x62\x07\xae\xbf\x26\x53\x1e\xc2\x04\xe9\x57\x39\x12\x0d\x86\x77\x1d\x65\xa6\x83\xa9\x0d\x54\xb9\xa7\x72\x8c\x74\x35\x9d\x3c\xab\x68\xab\x7f\x0b\xbb\x61\xc5\x00\x7f\xa7\x6b\xb0\x39\xa1\x30\xdd\x7b\x52\x16\xa1\x97\xc1\xb0\x35\xbb\xec\x4b\x20\x0a\x99\xb2\x15\x21\x57\xbe\xc5\xd0\x0a\x94\xc3\x9a\x20\xce\x91\xd4\xa6\xe3\xaa\xa7\x02\xe0\x0e\x0e\x66\xc6\x3a\xd2\xf2\x39\x25\xf8\xa6\x6e\x7f\xbd\x99\xc8\xb0\x31\x37\x3e\xa6\x7d\xee\x78\xf6\x47\x9a\xbb\x4b\x71\x87\x0a\x81\xb8\x09\x1d\x18\xac\x75\xf7\xe1\x05\xa4\xbe\xaa\x66\x21\x2e\x11\x4f\x3f\x94\x17\x02\xb6\x94\x6e\x9a\x8f\x11\x0a\xac\x86\x8d\x34\xed\x8d\xbc\x27\x65\x66\x29\x68\x6d\xde\x66\xcb\xae\x95\xe2\xb1\x64\xe5\xa6\x5c\xaa\xbc\x54\x83\x94\x04\x41\xcc\xd8\x60\xb8\xf9\x83\x26\x31\x97\x5b\x8e\xec\x46\x0d\x63\xf5\x21\x73\xe1\x26\x7c\x8f\xcb\x10\x08\x93\x10\xfc\xef\x29\x13\x9d\x32\x6c\xbf\x84\xaa\x8b\x38\x6a\xb0\xc6\x4e\xee\x75\x75\x10\xa1\x0d\x23\x13\xd2\x0b\x3a\x87\x59\x66\xa2\xe9\x57\xd5\x01\x01\x2f\xe9\xfb\x80\xe5\x19\xdf\x37\x6d\x88\x5e\x38\x03\x0a\x65\xff\x44\x56\x01\x19\x36\x60\x8e\xab\x8e\x60\xb8\xe7\xd8\xf0\xb1\x11\xa7\x6b\x78\x52\xc4\xc1\xf5\x8c\xac\xbf\xcd\xb8\x65\x6a\xd4\xa4\x85\x34\x40\xe6\x21\x90\x43\xe2\x34\xaa\x44\xfa\x93\x33\xe5\x77\x95\xe5\x5e\xf1\x17\xd5\xbb\x60\x70\xa3\xe3\xc3\xfb\xc9\xaf\xbc\xae\x91\xab\x59\xed\x88\xb2\x21\x06\x19\xcf\x1f\xcd\x72\x75\xbe\x3a\x41\xdb\xca\x62\xaf\x03\xde\xfd\x29\x6a\x9f\x32\x68\x87\x4f\x88\x12\xd8\x7f\x9c\x35\x6f\x44\x42\xab\x31\xc2\x9a\x29\x64\xa7\x42\x62\x30\xf1\xc0\x93\x5b\x19\x98\x60\xb8\x91\xf8\xb5\x30\x5c\x49\x4a\xc4\x80\x9f\xa2\x4f\x8c\x41\xb4\xfe\x76\x57\x0a\x6e\x67\x8e\x5d\x3c\x03\xf7\x0b\xd0\xf1\x8d\x55\x2c\x78\x96\x56\xf3\xa0\x0c\x29\xcd\x74\x14\xc2\x2c\xda\x91\x09\x9b\xcb\x35\xb2\x65\x0a\x6a\xd0\x52\x08\xc3\x63\x0c\x3e\xcd\xa8\x1c\x00\x24\xe0\x42\xde\x91\x53\x1d\x89\xf5\x2c\x7d\x5c\xf2\x5e\x54\x29\x47\x82\x58\x4e\x1d\x54\x1a\xdc\x17\x35\x3e\xc4\xa0\xd6\xe8\xd6\x96\x35\x25\x77\xa3\x31\xa0\x96\xca\x11\x93\x4d\x78\x0c\xf7\x28\x31\x40\x92\x9b\xf1\xcf\x66\x25\x00\xa0\xcd\xc3\x4e\x6f\x68\xa2\x16\x7f\x26\x9e\x01\x7b\xc5\xa1\xcd\xca\x92\x68\x80\x52\x37\x8f\x6e\xa6\x12\xcd\xea\xaf\x88\x4a\x91\xfa\x37\xb0\xd9\x1c\xe1\xe4\x6c\x0a\x8e\xac\x48\x31\xf3\x20\x06\xa9\x3a\x53\x57\xfe\xa6\xbc\xda\x9c\x9e\x73\x1a\xc8\xe3\xd9\xcd\x05\xd3\xb0\x1d\x81\x8d\xba\xae\x6b\x12\xeb\xf3\x64\x5f\xab\x4f\x37\x60\x8d\x27\x75\x59\xf0\x9a\x03\x0c\x11\x05\x4f\x64\xae\x02\xab\x6f\xea\x31\xa0\x62\x6c\x5f\x43\x1c\xbe\x26\x35\x39\xee\x81\x38\xcd\x0c\xae\xa0\xb2\x2e\x2b\x91\xa3\xae\x97\x1a\x90\x62\xe3\xde\x31\xf6\x0d\x82\x61\xec\x73\x84\xb4\x4b\x0b\xe0\xa4\xd5\x27\xa3\x42\x59\x58\x90\xb3\xfc\x8b\x05\x30\xd9\x12\x63\x0f\x42\xa3\x84\x5f\x0f\xcd\x18\xb9\x50\x17\x22\x5c\x56\x4d\xd0\x7a\x5b\x42\xaf\x54\xfa\x74\xd2\xb8\x29\xca\x92\xf6\x26\xb9\x6a\xa1\x2c\x7b\xaa\xa3\x47\xc5\xfe\xee\x41\x1e\x77\x9c\xb3\xbd\xef\xd1\x36\x81\x49\x70\x41\x56\xb2\x48\xc2\x8e\x81\x50\xa0\x35\xab\x64\x13\x92\xb4\x6c\x48\x25\x34\x1f\x83\xf1\x26\x1f\x63\xcb\xda\xaf\x67\x2b\xea\xf5\x68\x2c\x94\xab\xb3\x00\x81\xf0\xb6\x7f\x5f\x0c\xd8\xb4\xf4\xa5\x9b\x84\x1a\xa2\xce\x08\x74\xb2\x18\xd7\x61\xdc\x7e\x2f\x6a\x46\xac\xc9\xd7\xc8\xb1\xc8\x03\x9d\x1d\x8d\xe4\x81\x52\x12\x5f\xf3\x7b\x1e\x8f\x4b\x55\x06\xbd\xe2\xc4\x1d\x26\xb6\x5b\x64\x2f\x42\xe8\x3c\xf8\x2c\xfa\xb6\x90\x6a\x4c\x8f\x44\x6e\x49\x9a\xcb\x80\xb1\xae\x38\xd3\xd2\x56\x22\x97\x11\x07\xef\x52\x77\x1a\xce\x28\x7e\xb9\x51\xc6\x0e\xa7\x4f\x5c\xea\x21\x80\x03\xf5\x06\x07\x3d\x87\xfd\xb0\xac\x0b\x3a\xb9\x51\x04\x7f\x41\xe1\xe9\x0c\x45\x8d\x70\x32\x2f\x8a\x53\x84\x0c\x37\x0c\x28\xf8\x58\x5b\x24\xc8\x98\x42\x41\x33\x10\x8f\xaf\x5e\x4a\x0c\x00\x6d\x69\x7c\xd4\x05\x24\x3d\x0b\xe5\x2f\x6e\xd4\xb6\xd2\x4b\x08\x85\xde\x6b\x97\x23\xcc\x8a\xc4\xd7\x89\xa3\xf5\x6b\xbc\x93\xf0\x14\x4b\x58\xa8\x51\x8a\x81\x44\xf4\x5f\xad\x82\x0e\x7e\x88\xea\xd3\xa8\x32\xe7\xa6\xaf\x09\xe0\x60\x6b\xd5\x6b\xfd\x2d\x49\x8a\xfc\x2b\x59\xea\x95\xde\x39\x39\x50\xd3\x0c\xde\x42\x0e\xbd\xa9\xbc\xd9\xa6\x13\x93\x70\xe3\x18\xcf\xa5\x0d\x6c\xf4\x20\x21\x24\x30\x29\x21\xc8\x08\x5c\x27\xf8\x8f\xb7\xe9\x4c\x95\xfb\xb4\xff\x13\xbe\xc9\x8c\x4f\x5e\x10\x42\xba\xb2\x9d\xd4\xc3\xf1\x30\x3c\x32\xd7\x60\x9e\xbf\xd3\x43\x83\x66\xbf\x64\x30\x70\xa1\xe2\xce\x5e\x7d\x29\xce\x22\xb8\x08\x18\x3e\x23\x6f\xf9\x03\x4f\x2b\xb5\x96\x87\xe0\x8c\xbb\xc4\x06\x07\x47\xa1\x5b\xcd\xf8\x1f\x9a\x63\xdc\x40\x41\x2b\xda\xdb\x3d\x02\x5b\xb3\x3c\xbb\x36\x4c\x73\x5c\xc1\x6a\x99\x88\x28\xfb\xc8\xf1\x00\x9c\x73\xda\xa2\x15\x05\xd8\x42\xf4\x91\xa3\x75\x8b\x7d\x12\xd3\x94\x56\xae\xd0\xb9\xca\x8f\xec\xd7\x2c\x80\x99\xc9\xa0\x5d\x6a\xb5\xc2\x50\xfb\x0c\x66\x9e\x12\x69\x50\x83\x69\x05\xe3\xb3\x0d\x47\xec\xc3\x47\xf8\x84\x19\x75\xe9\xd1\xdf\x3a\x02\x41\x5c\x27\x8a\xbe\x2b\x47\x98\x00\x4d\x07\x21\xf8\xd6\xd2\x20\x4a\xab\x22\x1b\x61\xff\x1c\x71\xa3\x35\x46\x7f\xbb\x85\x66\x55\x3f\xbf\x6e\x01\x55\xd4\x96\x50\x83\x6b\x7e\x9c\x97\xc2\x97\x47\x23\xc8\xf3\xcd\xd2\x6b\xda\xf0\x17\xf0\x89\x8b\xe3\xb3\xc6\x83\x0e\x50\x8b\xd8\x7d\xd0\x33\x55\x16\x19\x32\xc7\xf6\xbb\x79\x4d\xfc\x42\xac\x91\x62\xbb\xf0\x62\x0c\xdb\x62\xbb\xad\x0e\x6d\x5d\x58\xa0\xf4\xc8\x7e\x69\x8a\xe9\xb0\x2c\x4c\x67\x7a\xdf\xd1\xa6\xd3\xe2\xa9\x0f\x8d\x88\xb7\xa1\xf1\x88\x2a\xfa\x52\xd0\x37\xfc\x50\xe9\x12\xba\x90\xf4\x72\x55\x74\x88\x26\xf4\x23\xde\xa7\xf4\x15\x10\x84\x20\xf7\xfd\x52\x15\x62\x2b\x18\x89\xa4\x6e\xdd\xf3\xc9\x1b\xff\x13\xbe\xeb\x1e\x33\xf2\x4a\xf8\xde\x7b\xd0\xd2\xfa\xd1\x73\x5a\x75\x33\x45\xa0\x78\xe3\x38\x30\x06\x9a\xcf\xca\xa9\xd9\xa2\xe7\x95\xaf\xca\x8b\x96\xa0\xb4\xc9\x3b\x88\x00\xcb\x15\x9a\x37\x71\x2a\x0e\x74\x9c\xbe\x1b\x05\x61\x3f\xda\x7c\x77\xbb\xda\xeb\x28\x7d\xa7\xe3\x6c\x45\xab\x33\xf4\x9f\x36\x44\x6d\x5e\x54\xd6\xcd\xf5\x58\xa2\xb5\x4d\xd8\x82\x8f\x84\x7f\x3c\x53\xbe\x51\xa9\x47\xb1\xb0\x6f\x0f\x38\xb4\x4d\x9f\xb2\x67\x9b\x73\x3f\x4e\x55\x78\xf2\x54\x30\x47\x26\x75\xa1\xa9\xe9\xf9\x24\xaa\x18\xf5\xf9\x41\xe3\xfa\x18\x42\xfe\x4e\xe0\x0a\xd2\x1c\x87\x5e\xf9\x43\x29\xe8\x20\x77\x6e\x3e\x67\xe0\xc4\x33\x5f\xf2\xa7\xe6\xcf\x37\x52\x22\xb3\x37\x86\x40\x16\x5b\xa0\xbf\x39\xdd\xf7\x29\x17\x0b\xeb\x18\xb9\xdf\x9b\x63\x34\x53\xa8\xc2\xa3\xe4\x06\xe2\x18\xb5\x16\xe3\x77\x51\xe3\x97\x65\x2b\x2c\x60\x35\xd5\x50\xac\xe1\x40\x3c\x68\x5d\x5b\x56\xeb\xbf\x34\x0c\x20\x06\xde\xa8\x06\x97\x21\x14\x51\xb6\x86\x89\x4e\xac\x3c\x08\xf0\x97\x14\xf4\x07\xe3\xd4\x29\xe8\xe8\x5f\x41\xbf\xe6\xee\xbc\x2d\xa6\x1f\x1c\x65\xd5\xf4\x06\xae\x76\xfd\xdc\x07\x0e\xef\x79\x3b\x35\x96\x62\x68\x80\xaa\x0e\x97\xb6\xef\x16\xaa\x62\x71\xf0\xf1\x97\x36\x26\xc2\x15\xfb\xb9\x01\x98\x91\xbf\x91\x10\x77\xf2\xb2\xfc\xc8\xec\x5d\x09\x25\x75\xde\x49\xe0\xd5\xa0\x1d\x33\xe4\x6d\xd4\xc7\x68\x5e\x6f\x61\xf4\x3b\xb6\xa9\x69\xa2\xc6\x13\x1d\x22\xe6\xa8\x5c\x2f\x75\x5b\x78\x80\x68\xee\x3a\x41\xf1\xe9\x1a\x4f\xbc\x3b\x91\xc8\xbf\xa9\x04\x35\xe5\xac\xea\x2f\x9a\x52\x60\x8f\xc6\x32\xd5\x5d\xe7\xdf\xb9\x8e\xa4\x95\x7a\x1f\x26\x53\xa3\x81\x4c\x98\x21\xf7\x93\xf8\x59\xa7\x63\x73\xd4\x55\xd8\xb8\xf6\x87\x2a\xc8\xfb\xd9\xd1\x62\xc2\x11\x78\x76\x11\x46\x82\xa4\x3b\xaa\x79\x4c\xe4\xb8\x4e\x49\x8c\xcc\x91\x7a\x4b\x3c\x27\xee\xe8\x0e\x4a\x13\x0d\xad\xbb\xfd\x9e\xaf\x0e\xcd\x50\x51\x09\x89\x4b\xcc\xda\xa0\x5f\x96\x1c\x86\xff\x9a\x06\x79\xff\x2b\xd3\xe0\xdf\xf6\xc9\xa0\x45\x56\xa8\x0b\xb8\x81\x9d\xa3\xac\x0c\x7e\x3d\x0d\x9e\x73\xf4\xe1\x1d\xf3\xc3\x42\x1c\x75\x7e\x38\xe4\xbd\x2c\xc4\x58\xe7\xf4\x13\xda\x59\x93\x8b\x8e\xb0\x6c\xad\x09\xa7\x25\x84\xb4\x25\xe0\xc4\x44\xd4\xe7\x4e\x36\x37\x1c\xda\x7e\x24\xbb\x9c\xd0\x62\xd1\x3c\xcd\xcc\x55\x7b\x16\xcb\x84\x9e\x85\x07\xc8\x3d\x81\x62\xb5\x93\x47\x2f\xa3\xdf\xff\xe2\x90\x59\x50\xc6\x36\x75\xea\x53\xea\x01\x60\x12\x99\xea\xad\x4d\x84\x4c\xba\x6f\x9b\xb8\x9c\x21\x67\x80\xbf\x41\xd5\x88\x0f\xc5\xb6\xd2\x18\xf7\x86\x15\xf2\xd3\xbe\x28\xaf\xf4\xf3\x19\xed\x35\x52\x26\x3c\x17\xb6\xea\xb3\x82\x1a\xe6\xd7\x0f\xe7\x5f\x42\x50\x10\x36\x69\x14\x2a\x4e\x52\xe5\x81\x8d\xd9\x58\x7e\xec\x71\xa2\xce\x98\x91\xd5\x48\x36\xbb\xea\x5d\x5e\x20\x27\x6b\x9b\xb2\xc0\x37\x58\xe4\x5d\x6b\xb9\x72\x7a\xca\x58\x73\x97\x15\x0b\x1f\x9a\x23\x29\xb9\xdf\xe8\x60\xad\x11\x69\xcf\x62\xb7\xb8\xa0\x89\x68\xe1\xe5\xe2\x14\x8c\x1e\x80\xf3\xfa\x9d\x64\x30\xd7\x98\x12\x09\x36\x59\x1c\xb5\x87\x34\x17\x2e\x66\x57\x6a\x9d\xf4\x3e\xc7\x4c\x78\x14\x04\x72\xa2\xd9\xd9\xd1\xa2\x45\xfb\xee\xb7\x73\x55\x5c\xdd\x5d\x43\x39\x81\x1b\xb7\xbf\x52\x31\x4b\x49\x33\xdb\xa0\x69\x4e\x78\x7b\xee\x12\x83\x53\x0f\x5c\x23\x5d\xe1\xc9\xd2\xa6\x9c\xc6\x5d\x66\x0a\x06\xc2\x91\x62\x66\xe2\x1e\xf2\x6d\x53\xe8\x45\x5a\x64\x99\x7a\xb9\x0f\xf7\xa8\x72\x1a\xe8\x2e\xa5\x91\xda\x6a\x61\x17\xec\x4b\x7f\x0a\x3e\x88\x9c\x28\x9c\xc7\x14\x22\x15\xfc\xca\xa5\xc1\xb4\xf3\xf5\x73\x95\xb0\xba\x48\x91\xbb\x14\x60\x5c\xbc\x82\x7c\x4c\x1b\x98\xfb\x6e\x4d\xc5\x9e\x61\x4a\xe1\x0d\xfd\x1a\xac\x1e\xb8\x23\x57\x08\x9c\xdb\xa8\x84\x77\xce\x51\x68\xbe\xf6\x97\xe0\xe9\x3e\xa6\xb7\xc0\x6b\xc8\x51\x81\x8c\x2c\xdf\xe4\x40\xfa\x4a\xf5\xb7\x15\xc9\xa6\xbb\x87\xb7\x19\xeb\xd8\x88\xe9\x69\x41\x3d\xdb\x13\xe7\x90\xa4\x1e\x85\x8b\x4d\x92\x1b\x81\xc6\xba\x80\xb1\x2d\xba\x3b\x7d\x22\xa6\x2a\x34\x48\x3a\xf8\xd5\x9c\xfe\x8a\x6e\x9c\x19\x9e\x36\x60\x96\x14\x55\x39\x7c\x9d\x8d\x88\x49\xbc\x8e\x49\xaf\x4d\x35\xf3\x28\x8e\xc1\xb1\x7c\x2c\x7b\x57\xaf\x4a\xab\x44\xdf\xd0\x0b\x96\x03\x14\x12\x14\xc6\x8e\xa6\x60\x8a\x0c\x7f\x3e\xbc\xb9\x67\x24\x86\xd0\x72\xdd\x2f\x8b\x82\xed\x9a\xcc\xcd\x44\x5b\x4e\x44\x0c\x0e\xa9\xe0\x8f\x41\x53\xe9\x24\xf7\x0b\x97\xf5\xca\x8f\x7c\x34\x78\x3f\x91\xad\x24\x17\x8c\x4d\x59\xb7\x6b\x90\xe4\xea\x06\xa6\x34\x13\x10\xb0\x69\x95\x88\x61\x54\x72\x97\xaa\x11\x89\x7f\xb9\xa2\x3f\xa2\x01\xab\x71\xdb\x25\xd9\x5f\xd1\x8d\xa4\x52\xe9\x3d\x68\x44\x13\xb8\xb6\xea\x5e\xdc\xa3\x31\x07\xaf\x1d\xe5\x1a\x47\xc2\x71\xc9\x28\x60\xc0\x2b\x05\x27\xf2\x91\xc0\x97\x47\x3b\x2c\x0f\xb4\xa1\xc1\xcc\x9d\x97\x7a\xf7\x8b\xd1\x87\x9e\x4d\x12\xcc\x9f\x62\xae\x1c\x68\xdb\xe2\xca\x58\xc4\xf1\xf9\x2b\xd3\x0b\x77\xe9\xaa\x19\x37\xce\x02\xf0\x6f\x6f\x03\x3c\x91\x89\x60\x2c\x15\x7e\x72\x50\xe4\xe7\xa2\x76\x16\x91\x07\x1a\x6a\x8b\x1a\x9c\x12\x86\x95\xa1\xbd\xd1\x92\x69\x85\xd5\xa0\xdc\x69\xeb\x26\x86\x0d\xa4\x92\x09\x83\x3a\x66\x8b\x0a\x46\x96\x03\xde\xe8\x18\xf3\x97\x3e\x11\x58\x38\x91\x32\x9a\x1e\xf0\x7a\x3c\xb5\x77\xb1\x49\xa3\x54\xe0\xdc\x6c\xf5\x89\x78\x97\xd1\x16\x4d\xa9\xae\xdd\x89\x57\x63\x24\xd7\x3a\x5d\xf2\xd4\x16\x71\x50\xa3\x5f\xcf\x26\x0a\xb3\xe1\x9b\x02\x24\x54\xd0\xe5\xe5\xfb\xef\x19\x5e\x28\xa6\xca\x1c\xfc\x92\x10\xf2\x4c\xad\x50\x61\x57\x80\xc7\xef\xbf\xb3\x48\x24\xc6\xac\xb9\xc4\x2c\x2d\xae\x03\xd2\xd8\x2e\xba\x70\x57\xf3\x8e\x1d\x71\xaf\xe8\xe0\x13\x14\x49\xb5\xdf\x74\x0d\x24\xbb\x27\xae\x76\x5e\xa2\x70\xe4\x83\x7d\xde\x5a\xbf\x41\x64\x03\x79\x44\x5f\x6a\xa6\x10\x5d\x0c\xf8\xf1\x15\xee\xd1\x6d\x48\xa5\x63\x36\xc8\x40\x44\x40\xca\xf0\x63\x1b\xb8\x24\x51\x8b\x2b\x7a\x0d\xde\x36\x98\x8e\x76\x56\xd9\xa8\xf0\xf2\x26\x33\xce\x87\x44\x6c\xc5\xa5\x9e\x1a\x6c\xaf\xf4\x63\x60\x6e\x30\x94\xf4\x58\xaa\x06\x60\xe9\x9e\xa3\xca\x19\x81\xa5\xda\x03\xca\xa6\xa3\x96\x94\x05\xf9\xbc\xb5\x8e\x03\xeb\x5f\x29\x30\x67\x78\xf1\x48\x5d\x38\x0e\x7b\x2b\xec\x58\xd8\x44\x24\x5e\x5d\x8f\xa3\x25\x76\x2e\x46\xd3\x5e\xa2\xc9\xd8\xc7\xf0\x02\xe2\xcd\x73\xb1\x0c\x5a\x12\x01\x3e\x48\x27\x22\x42\xef\x54\x68\xc2\x6c\x8b\xb8\x01\xc7\xce\x31\x73\x75\x13\x62\xbf\x6b\x78\xda\xa6\xa9\x67\x4d\x6e\xdc\x4f\xca\xcc\xa9\x85\xda\x3a\xf4\x09\xde\xa0\xc9\x45\x93\xcf\xd9\xa0\x88\x09\x4a\x48\xa7\x78\xf7\xa6\xf4\x82\x7f\xc7\x42\x1d\xd8\xfc\x82\x77\x66\x3b\xef\x19\x73\xc5\x5c\xf7\x9e\xba\xea\x57\xfb\xb5\xce\x76\x12\xfc\xa5\xa9\x02\xe6\xb0\x9e\xf2\x8d\x27\xa7\x7b\x1f\x63\xe6\xac\xdf\xb3\x25\x82\x51\xd5\xb7\x6b\xef\x53\xfa\x69\x52\xa0\xf6\xd5\x8a\x72\xea\x38\x64\x1b\x63\x24\x6c\x18\xa7\xcb\xb8\xa7\x69\x88\xb1\xae\x89\x57\x94\xec\xf6\x36\x4b\x32\x71\x04\x53\x7f\x24\x55\x11\x48\x6c\x30\x76\x79\xa2\xee\xa1\xfe\xf6\x88\x37\x6e\x21\xea\x4d\x6c\xc8\x20\x15\x00\xcc\xdb\xf5\xfe\xd2\x51\xf4\x4c\x25\x3a\xb4\xb6\x69\xd0\x84\xa9\x7d\x6e\x7d\x82\xf9\xf7\x8c\x01\xd5\x19\x83\x4e\x65\xcf\xf6\x4c\xe5\x0f\x14\xea\x79\x48\x30\xb4\x98\xf0\xad\xe3\x4d\x02\x42\x9f\x39\x28\xbb\x0d\x71\x19\xb0\xa9\xe1\x26\xb6\x45\x96\xa9\xb7\x67\x81\x53\xdc\xc4\x46\xc8\xdb\xa6\x0a\x7a\xeb\x57\x6f\x6c\xe9\x36\x11\xc0\x41\xfd\x9b\x2c\x2a\x83\x97\x4e\x23\xd9\xd3\xfb\x1f\x81\x28\x19\xab\xb9\x83\x3c\x23\x1e\x1e\xed\x6d\x38\xa6\x6c\x61\x88\x11\xf0\x18\x2b\x11\xb7\x3c\x8a\x96\x67\xd7\x35\x2b\x76\x11\x84\x6e\x5f\x72\x39\x5f\xc6\xe0\xc9\x2f\x52\xa8\xb5\x84\xe0\x3c\xd1\xc4\x8a\x52\x59\x9e\x3b\x4d\x40\x70\xd1\x1c\x71\x65\x5a\x81\x12\x13\x89\xa2\x7e\x4a\x7a\xc4\xb3\x41\x44\x79\x57\x37\x1e\x55\x2e\xe2\xca\x62\x79\x23\x66\xc5\x5d\xc5\xdc\x50\xc2\x44\x01\x20\xcf\x16\xe9\xe8\xf6\x7a\xef\x2d\x80\x38\x07\x7c\xb0\x0d\x16\x5a\x06\xaf\x63\x3b\x94\xe9\xd9\xb7\x55\x96\x80\x04\xc8\x12\x4a\xc9\x79\x6b\x23\xab\xcc\x80\xee\xd0\x08\x71\xa9\x0f\x8e\x9d\xa0\xee\xdc\xb9\x5c\x63\x48\xdb\x92\xaa\x58\xe6\xd8\x2c\x9f\xe4\x7b\xb0\x8d\xe0\xba\x80\x0e\x77\x61\x5c\x47\x7e\xc0\x1d\x9f\xbf\xa7\xd2\x7d\x89\x9f\x3f\x3f\x9a\x1a\x6e\xde\xa4\xb4\x12\xc1\x0d\x11\xd7\x4d\x79\x04\xaf\x4e\xf4\x4d\x3d\x8a\x6a\xa7\x8f\x58\x39\xf3\x98\x30\xff\x3c\x70\xd8\x1a\x0b\xc7\x28\xfe\xa3\x46\x3e\x50\x64\x70\x98\x3a\xaf\xbb\xab\x95\x3a\x6c\x22\xc6\x74\x97\xe8\xf8\xa3\x6f\xd9\x9f\x21\xce\x39\x6a\x74\x90\xb7\xb5\x47\xe0\x08\xcd\x3c\x4e\x09\x60\x2f\xfb\x21\xae\x65\x48\x60\xad\xca\x8e\xe8\xba\xe6\xab\x67\x7a\x72\x8d\x55\xfc\x20\x9a\xe5\x70\xcf\x2c\xe8\xda\x6f\x5f\xba\x85\x32\x8e\x9f\x2c\xd1\x7d\x5e\xa1\xf1\xdc\x4b\xda\x5b\xf1\x44\x72\xe9\xe6\x72\xd6\x50\xc5\x4d\x85\x82\x5d\x3e\xbf\x83\x49\x39\x9b\xcb\x14\xbe\x8f\x12\x85\xdb\xa3\x21\x05\x43\x2b\x03\xeb\xff\x51\xda\xb5\x86\x5c\xbd\xeb\xdd\x53\x05\xe5\x6f\xc1\x56\x4c\x32\x45\x13\x27\xaa\x31\x9e\x8d\x8c\xa2\x6b\x2d\x9c\x4e\x21\xd3\xe0\x0d\x52\x30\xd9\xbb\xac\xa9\x6d\x40\x8b\xb7\x78\x3c\x2f\xee\x6a\xc1\x80\x59\xa2\xe5\x98\x18\x02\x59\x8a\x6e\xb1\xc8\x7e\x66\x4b\x44\x3b\xf9\x58\x4b\x6a\x7d\x30\xee\xc2\xb8\x97\x4b\x3f\xc1\xb5\xed\xba\x8e\xf7\x42\x43\xc7\x70\x43\x3d\xa0\xa7\xc1\xac\x00\x79\xc6\x4a\xfa\xf3\xab\x3c\x79\xfe\x5e\x89\x93\x07\x7d\x1c\x94\xba\xf2\x3a\x80\x8d\xab\xba\xb4\x95\x4f\x8a\x43\xdc\x2d\x35\xa6\xf8\xcc\x4a\x1a\x5d\xf6\x87\xe5\x55\x8f\x5c\x10\xfb\x3c\xa4\x9b\x78\x57\x55\xdf\xcb\xdb\xec\x53\x19\xed\x79\x58\xf8\x82\x49\x0b\x64\xad\x6b\xe4\x02\xce\x4c\xa0\x09\x21\x9c\x0d\xa5\x79\xec\xa3\xa2\x6f\x8b\x07\x7a\xe9\x90\x36\x3d\x8e\x19\xd9\xc5\xf7\xb1\x0a\x50\x1c\x40\x51\x59\x82\xe3\x36\xab\x55\xd7\xf6\xb5\x46\xc4\xd2\xf6\x92\x8b\x4a\x42\xc2\x69\x8e\xab\xc4\x70\x4b\xf3\xcb\x8c\xda\x3b\x16\x3c\x8e\xab\xcd\x4c\x09\xe4\x26\xeb\xe8\x93\x22\xe5\x8c\x2e\xc6\x06\x2d\xf0\x94\x2e\xa2\x77\x70\xe0\x2e\x78\x66\xdd\x94\x61\xa8\xbc\x78\x64\x46\x99\xb8\x9e\xf6\x00\x5f\x1a\xa1\xd5\x6c\x93\x3e\xc9\x82\x59\x80\xe0\x7e\x7b\xd1\x3d\x58\xa4\x6e\xa0\x86\x03\x80\x2e\x51\xfd\x69\x60\xf7\x40\xa0\x5b\x73\x83\xb6\xfe\x6c\x03\x08\xd9\x08\x38\x50\x85\xb4\x05\x8c\x6f\x4a\xb4\xb8\xf6\x3b\x03\xea\x6b\xf2\x22\x67\xa9\x7c\xae\x3c\x1a\x11\x88\xa7\x32\xa3\x86\x02\x7e\xb0\x1a\x6f\xcd\x2f\xc6\x84\xce\x2f\x97\x14\x4e\xe8\xfe\x35\x4c\x02\xd4\xb0\xc0\x56\x3f\x04\x68\x96\x65\xff\x4c\x96\x36\x80\x6d\xe0\x31\xde\x14\xf7\x25\xb0\x1a\xc7\x2e\x10\x81\x59\x54\xb8\x0f\x0d\x44\x32\x07\xbd\x97\x28\xf3\xbb\xf8\xad\x60\xaf\xab\x88\xd5\x6f\x67\x1f\xaa\x5e\x6c\x35\xd2\xd4\x52\xf3\x1a\x48\xc7\x91\xcd\x25\x5e\x9b\xbd\x84\xc4\xe7\x7a\x71\x9a\x40\x78\x6b\x5c\x40\x76\xd7\xef\x3d\x3b\x0a\xfd\x5e\xea\xb5\x76\x0d\x7a\xde\x28\xf9\xb8\xd4\xab\x6c\xc4\xa0\xbb\x78\xa9\xe8\xaa\x62\x73\x01\xd9\xbf\x82\xaf\x1a\x90\x3e\xa0\xac\x1f\x75\xc7\xef\x12\x14\x30\x04\x69\x60\x75\xac\x37\x36\x40\x5b\x44\xd2\xf5\x62\xb8\x47\x1b\x78\x2f\x1a\x54\xcb\x64\xdf\x31\xcb\x09\xa2\x5f\x3c\xcf\x12\xa3\xed\xbd\xca\x79\x8b\xfa\xf8\x4d\xb2\x03\xba\x2a\x8e\x0b\x21\x6c\x38\x1f\x8d\x20\xec\xa3\xc6\x64\xbc\xf7\x5e\xa3\x78\x3d\xd6\x7b\x7e\xe2\x8b\xb8\x85\xa1\x61\x5f\x87\x0f\xc6\x98\xf9\x13\x2e\xbf\x1a\x52\xae\xfe\x62\x26\xc6\x6e\x60\xf8\xa0\xa3\xb8\x99\x4d\xc0\x80\xe9\x5c\xd8\xdd\x1b\xe5\x43\xf7\x5b\xc8\x88\xd2\x4f\x94\xa5\xe9\x1b\x37\x49\x09\x0a\xdf\xc5\x80\x90\xa3\xf6\x55\xda\xf1\x2f\x89\x62\x3d\xd2\x46\x68\xc2\x4f\x0f\xe7\xb1\xf9\x65\xc2\x4a\x33\x76\x53\x5b\x58\x72\x20\xec\x86\x4e\xad\xfa\xc8\x8a\x79\x35\x7f\x88\x30\x94\x27\xad\x43\xf0\xb8\xec\xf8\x9c\x5b\x64\xc4\xb2\xba\x5b\xbd\x7f\xc9\x48\x44\x34\xe2\x50\xbc\xf9\x98\xc9\xfe\xa4\x4c\x31\x32\x6c\x56\x86\x81\xb8\x9e\x22\xf5\x6e\xf2\x82\x3e\x3c\x15\xfb\x91\x33\xe9\xe4\x9c\xae\x4b\x1f\x8b\x29\x27\xca\x0c\x1a\x43\x01\x11\x85\x1d\xaa\x4a\xa4\x40\xe4\xaa\xa1\xb6\xc6\x56\x4c\x0c\x2f\x91\x00\x46\xc4\xce\x7e\xc0\xa0\x35\x05\xb7\x0d\xf3\x03\xf1\x64\x9d\x77\xaf\xb5\xab\xd5\x95\x98\xb2\x1b\x86\xd5\x85\xe4\xdd\x8f\x47\xcd\x08\xcb\xe4\x12\x56\x21\x70\x69\xc7\x6d\x23\x6b\xab\xc1\x5a\x7b\x18\x0b\x95\xb9\xa1\x43\x1e\x88\x8f\x08\xec\xde\xcb\xa9\x00\x92\xfc\x20\x4b\xb6\xb9\x67\xa3\xbd\x2f\xc6\xfa\xfb\xd7\x19\x8c\x25\x1e\x57\xdb\x01\x51\x47\x9a\x30\x36\x1a\x24\x9a\x54\xca\x45\x20\x68\xd0\xa4\x28\xb7\x5d\xb0\x2b\xb5\x90\x2e\xbd\x22\x5e\x7f\x54\xbc\xdd\xbf\x0d\x51\xfc\xde\x02\x6b\xf4\x3a\x8d\x7c\xd4\x36\x7e\x8e\x91\x04\x14\x74\x38\x04\xe3\x33\xaf\x2d\xc6\x5e\x4f\xea\x05\xef\x24\xf1\xa6\x0f\x54\x8e\x6f\x5f\x8d\x87\x42\x1d\xfb\x11\x70\x17\x22\x5f\x45\x7f\x9e\x2c\x26\xcd\x73\xf9\x39\x5d\x8e\x91\x04\xf6\x3a\x6a\xec\xc9\x2c\xe4\xf6\xe1\x42\xe6\x94\x3b\x71\xc6\xb1\x46\xac\xed\x31\x75\x20\x12\x20\x0c\x36\xe3\x9d\x76\x30\x5b\x89\xbe\x26\x9e\x63\x8f\x43\x12\xde\x9c\xc2\xc3\x52\x43\x85\x1d\xad\xb7\xfd\x5c\x48\xf8\x15\x0c\xd3\xf9\x3d\xc7\x8a\x21\x78\xfb\x2c\x83\x14\xb0\xb6\x16\x93\xaf\x9a\x16\x00\x09\x25\x29\xcd\x60\x53\x98\x6e\x53\xb2\x47\x1b\xc7\x46\x37\x1c\xe1\x12\x92\x76\x7d\xfd\x27\xb2\xf3\xaf\x4b\xaa\x38\xa4\x90\xee\xce\x93\x39\xaf\xbf\x95\x73\x50\x26\x45\xec\xf6\xa1\x9e\xf8\xb0\x3f\xde\x3b\xbb\x43\x2a\x84\x2c\x04\xc0\x36\xa9\x93\xf1\x7f\x27\x35\x13\x14\xbe\x06\xfc\x06\x6f\x3e\x9b\xef\x8f\x36\x2a\x87\x53\xe3\x8e\xc0\xd3\x2d\x0b\xc1\xff\x53\x89\x65\x3b\xa7\x56\x4f\xde\x63\xca\x93\x97\x11\xff\x8f\x2c\x95\x77\xac\xf8\x0c\x26\xe2\x0b\x1a\x06\xca\xb3\x9d\x5b\x3a\x3e\x24\x3a\x3f\x0c\xc4\x08\x52\x85\x25\xe5\xda\xc8\x81\x4a\xeb\x5e\xa0\x80\xdc\x40\xe8\x3b\xd8\x72\xb3\x69\xa9\xc9\xbd\x1c\x68\xb1\x8e\xa1\xf6\xa3\x5c\xef\x25\xf7\xe2\xf5\x3c\x29\xa7\xee\x54\x64\x85\x0e\xe4\xce\xd3\x78\x69\xae\x09\x79\x71\x35\x43\xee\xe3\x10\x33\xe6\x8e\x28\x35\xf4\xae\xca\xcd\x9a\x45\x6a\x35\x4b\xe9\xb1\xa2\x66\xf7\x7b\x95\xe7\xbe\x48\x7c\xb4\xbf\x73\x84\x5f\xae\x45\x90\x35\x76\x52\xb8\x32\x3c\xc1\x49\x62\x48\xda\xa8\x84\x18\xc0\xf9\xeb\x1a\x75\xdc\xf8\x0b\x0c\x44\xb6\x8b\xfc\xba\x4a\x53\xcb\xb5\xff\x20\xfa\x55\x45\xca\x38\x5c\x90\x3c\xb2\x9c\xe2\xc5\x41\x6e\x50\xa8\x3f\xf8\x03\xb0\x12\x47\xe1\x8d\xd6\x73\xc1\x70\xa4\x35\xdf\x31\xef\x09\x63\x4a\x39\x69\x66\x1f\x02\xd2\x5e\x59\x90\x8f\x03\x56\x4d\x7e\x19\x7f\x06\xc5\xe6\x48\x61\x78\x42\xe5\x85\x2c\x18\x6a\x68\x2d\xb5\x46\xa2\x3b\x0a\x2d\xdf\x33\x98\xb5\x90\x4c\xf8\xfb\x92\xc4\x85\xc7\x59\x0f\xbd\xb4\xc3\x80\x0f\x69\x91\x37\xe1\xf1\x9f\x5c\x57\x17\x83\xf8\x4b\x10\x6c\x51\xef\xa7\x26\xce\x6f\x7a\x70\x2a\x7c\xf0\x3d\x19\xa1\xa6\x7f\x7b\x60\xd4\xbb\x79\x86\x64\x51\x1f\x05\x16\xff\x31\x99\x56\x8f\xc6\x2e\x6a\x01\xbe\x38\xd1\x84\xa2\xd6\xe0\x73\x61\xdb\x63\xd4\x0e\x4e\xb5\xa1\xd6\x17\x55\x7f\xf7\x31\x96\x24\xb3\x9d\x76\x97\x62\xd1\x0e\x0e\x27\x53\x45\x6a\x83\xfd\xa4\x39\x71\x87\x4f\x5e\x12\xe7\x20\x10\x2c\x32\xb7\xce\xee\x6a\x0d\xf2\x2b\xdb\x57\x0f\xe1\x60\xbf\x9e\x90\x56\xb4\xed\x79\x70\xad\x7a\x7e\x57\xe7\x4e\x39\xa4\x9d\xb1\x18\x30\xe9\x84\xdf\xfd\xf8\x2a\x45\x37\x61\xb4\x97\x43\x9b\x88\x3e\x2d\x84\x67\x2c\x04\xc5\x27\xbe\x15\x95\x9d\x25\x59\xb2\xb3\x96\x03\x48\x8c\x7b\xc8\xe4\xd6\x81\xd3\x56\x75\xff\xd2\xf5\xc5\x2b\x15\x1c\x25\x9f\x8f\xca\x03\xfb\x42\x12\xca\xc6\x2c\x01\xd8\x51\x18\xc7\x76\x12\xc5\xfb\xee\x19\x92\x25\xf1\xf0\x28\xf6\xf2\x62\x85\x58\xd4\xd5\xc9\x3d\x86\x50\x9b\xc5\x49\xee\x8a\xdc\x7e\x0c\x73\x1b\xd8\x0b\xdb\x43\x7a\x1e\x99\x7a\x4d\x27\xf8\x0c\xf1\x13\x4c\xe1\xa4\xfd\x01\xef\xfc\xcd\x49\x48\x80\x9f\x3e\xdc\xda\xfb\x3f\x28\x57\x8e\x5a\x5c\x68\xeb\x71\x0c\x9c\xac\xa4\x6b\x0c\x33\xa1\x19\xa3\x66\xe6\x72\x5b\x18\xdb\x31\x9d\x08\x18\x5a\xad\x4b\x6f\xb3\x69\xd4\x93\x7d\xa1\x80\x07\x0d\xbc\xbd\xc6\x36\x51\x59\xbe\xe7\x14\x79\xae\x51\x7a\x53\x2b\x07\xca\xe5\x28\x60\x6b\xb6\x20\x03\x04\x17\x41\x8e\x0b\x1a\x0d\x7f\xa2\xee\x86\x1f\xb7\xe5\x6f\x7a\x37\x0a\x7d\x44\xb7\x15\xe8\xee\x6d\x9d\x6b\x11\xb5\x72\x66\x72\x4e\x84\x11\xc6\x35\x75\x20\xbe\x90\x63\x42\x4a\x89\x6f\x23\x2e\xcb\x03\x2a\x78\x8f\x44\x64\x29\x9c\x92\x37\x54\xc4\x40\x1c\x46\x8c\x1a\xf8\x14\x12\x05\x4d\xce\x70\xbf\x86\x90\xba\xf2\x43\x9b\xe4\x6f\x61\x9b\xa0\xe3\x6e\x93\xe1\x49\xcb\xe7\x52\x59\x77\xd8\x9a\x91\x91\x8f\x53\x51\xfa\x28\x40\xf7\xcd\x49\x1e\x66\x9b\xa9\x53\xba\xdb\xca\x5d\x85\x8c\xa3\x49\x92\x44\x23\x93\xa2\x68\x49\xaa\xde\xa2\x1b\x07\xf7\x78\x5b\xa5\xb1\x54\x29\xdb\x6f\x49\x97\x62\x87\x10\x5a\xe2\xe9\x6e\xac\xa7\xca\x52\x23\xc6\x48\x46\x0c\x21\xc9\xfe\xfc\xeb\x6a\x60\x25\x4a\x80\xea\x4b\xb8\x7d\x71\xc6\x14\x57\xa8\x82\x95\x36\xf6\xfa\xbe\x6a\x9b\xfc\x6e\x21\x84\x5a\x0f\xf7\x13\x1b\xde\x82\x42\x9c\xe7\xa9\x11\x23\x7d\x24\xab\xc8\xf0\x2d\x74\x1c\x2f\x5c\x6d\x3b\x9b\xde\x87\x39\x2b\x05\x8e\xf9\x5e\x94\x99\x79\x5a\x22\xa0\xfb\xa3\x74\x6d\x39\xc1\xac\x99\x6b\x93\x96\x74\x1e\xfd\xcf\x99\x20\xa9\x6c\x91\x04\xac\xd0\x8f\xc5\x8f\xdf\x6c\x30\xa1\x28\x3c\xd6\x0d\xd8\xbe\x81\xf9\x79\x8c\x16\x15\x23\x10\x1d\xb6\x82\x6b\xe7\x13\xd0\x75\xae\x06\x6f\x7e\x38\x32\x87\xcf\x40\xae\xf3\x12\xc6\x61\xc2\xd6\x41\x0f\x90\xb8\xed\xc5\xb9\xe2\x41\xe1\x71\x87\x11\x50\x84\x76\x04\x17\x05\x5c\x3e\x75\x02\x53\x45\xd8\xd6\xf1\x12\x0a\xa4\x58\x9b\xc7\x7c\x02\x55\xbe\xee\x86\xb2\x02\xf9\x05\x4f\xbf\x43\xd2\x41\xb5\x5e\x6f\x3d\x85\x7f\x3e\x17\x73\x87\x82\xbd\x55\x93\xc7\x7c\xf3\x2b\x8e\x8c\x3a\xc5\x5d\x64\x4a\x4c\x8e\xe5\x35\x18\x43\x94\xdd\xbe\x82\xa4\x40\x6f\xaf\x77\xf6\xf6\xbb\x10\x63\x6e\x6a\x65\xad\xa7\x65\x3e\xc8\x65\xe7\x53\x8d\x7a\xc3\x05\x5b\x38\x52\x87\x98\xc1\x42\xc9\x39\x9c\xdc\xc4\x86\x3c\x10\xe8\x02\x0a\x60\x97\x01\xb5\xf1\x34\x4c\x98\x21\xcc\x94\x7e\xa3\x60\xb3\xd0\xd8\xad\x27\x53\x42\x33\xf4\x23\x53\xf7\xab\x3d\x58\xfc\x6a\x07\x8c\x9b\xc8\xaa\x0f\xe8\x89\x40\xc4\xa5\x86\xdb\x78\x6d\x57\x71\x16\x1e\x9a\x1f\x74\x15\x24\x97\x80\x30\x19\x05\x62\x5e\x1a\x0d\x4e\x62\xd8\x7c\x29\x32\xf2\x5d\xc9\xb6\x62\x63\x8b\x37\xdf\x84\x44\x95\x72\x5f\xa2\xca\x51\x8f\xa2\xff\x5d\xe2\x13\x66\xd2\x05\x19\x60\x4d\x3c\xa5\x0f\x89\x35\xcc\x64\x8f\xdc\xd8\x07\x17\x25\xe4\x8d\xc0\xb9\x8f\xdb\xd7\x15\x9f\x75\x68\x67\x1a\xb3\xfe\x8b\xc6\xc6\xa8\x8b\xe3\x7b\xe5\xc8\xce\xab\x85\x4c\xbc\x34\x07\x7f\x57\x0d\x66\xf6\x8f\xe7\x77\x02\x75\x55\x85\x44\xbd\xe6\x4d\xd6\x43\x4d\xac\x50\xe1\x7e\x39\x8d\xe0\x7b\xe3\x08\x00\x0c\x0d\xaa\x59\xc1\x56\xd0\x8c\x2c\x0b\x41\x04\x13\x85\x2f\x50\xfe\x73\x43\x34\x22\x45\xe3\xa7\x8f\xd6\x50\x3c\x62\x8e\x45\x3c\x02\xf7\xdb\x37\x51\x1f\xf1\x67\x78\x40\x28\xb8\x28\x19\xbf\xfb\x95\x96\xdc\xf5\xd0\x2c\x7f\x0b\x3a\xa1\x3c\x01\x33\xe8\x80\xda\x2e\xf3\x2f\x21\x4f\xca\xfa\xf7\xed\xe0\xc4\xbc\xf6\x26\x9e\x17\x3a\x5f\x18\xd6\xfd\x50\x2d\x13\xe7\xd2\x0e\x48\xd9\xda\x6a\x86\x2c\xbd\x47\x9b\x08\x8b\x06\xf5\xd6\xbe\x32\x83\xed\xe3\xcd\xa6\xb6\x03\xf1\x3c\x63\xf8\xed\xd1\x46\xb2\x61\x80\x46\xcc\x11\x3a\xf6\x28\x71\x95\x16\x07\xad\x41\xbe\x0e\xd9\x6d\x0d\x88\x40\x52\x12\x53\xab\xda\xd8\x3e\x20\x72\x52\x93\xb0\x17\x99\xae\xd2\xf8\x22\xba\x65\x93\xee\xa3\x68\x9d\x5a\xbe\xb2\xa6\x89\x6b\xe6\x26\x63\xc0\x28\xfe\xf6\x82\x49\xed\x98\x5e\xcc\xd8\x1d\x9d\x2f\x6c\x06\xb8\xc6\xc9\x39\x1d\x29\xa4\x69\xd2\xf4\xe2\xda\xf8\x84\x02\xb5\x5a\xb4\x49\x39\x8d\x48\xb5\x36\x1e\x31\x68\x2f\xad\x44\x0e\x28\x86\xad\x03\x28\x79\x20\x74\xad\x6f\x67\x93\xdf\xd0\xbf\x7e\x93\x40\x77\x19\x5a\x79\x57\x3c\xf2\x6b\x5a\xd2\x4a\xb3\xe1\xe5\x28\x8a\x04\xf9\x85\x8e\x48\xb0\x5e\xe0\xa4\x8f\xc8\xeb\x34\x11\xae\x8f\x41\x59\x43\x8a\xc9\x38\x30\x57\x1d\xb4\x7f\xfd\x8b\x1a\x0d\xcb\xb8\x47\xd2\xd9\xc6\x02\x89\x3d\xc3\x81\x9a\x51\x6a\x04\x9b\x43\xf6\x5e\x13\x09\x28\xc1\xec\xad\x57\xaa\xc6\xba\x5a\x16\x6e\x93\x07\x24\x1a\xb2\x71\x5d\x87\x95\xd5\x10\x1f\xe9\xa2\xa4\x2e\xc6\x80\x53\xf3\x71\xaa\x7b\x0c\xf8\x65\xfd\x8d\xa1\xd3\xed\x5b\x10\x4e\x37\x26\x4b\xa9\xe0\xba\x2b\x89\xed\x28\xde\xc7\x70\x32\xcb\x12\x31\x9a\xf9\x0c\xca\x36\x61\x48\x6d\xab\x38\xde\x1f\xd7\xe1\x55\xd8\x31\x52\x39\x12\xfa\xa8\x4f\x4d\x1e\x8f\x5a\x12\x47\x63\xb3\xaf\x0a\x16\x64\x6f\x9b\x8a\xbf\x6a\x6e\x37\xfe\xca\xc1\x3d\x29\x7a\xeb\xb6\x1c\x62\x5f\x8a\x0e\x1a\x55\x3f\x5c\xe3\xfe\xd5\x62\x84\x71\xfd\x34\xb2\xde\x2b\x1a\x72\x28\x4e\xa4\xe5\xbe\x47\xb7\xf8\x33\x85\x1c\x17\x6e\xf6\x74\xfe\x70\x68\x68\xe2\xe8\xbb\x2f\x31\x96\xec\xc1\xbf\xfa\xee\x62\x0e\x4e\x5f\x39\x38\x27\x54\x1b\x83\x2a\x9e\x24\x24\x7b\x25\x71\xe7\xc2\x91\xfd\xf6\xd7\x4b\xb6\x8a\xc6\x73\x0e\x2d\xe4\x39\x37\x10\x5e\x2b\xbc\x7b\x2b\x93\xc6\x40\x2f\x90\x6e\x56\x41\x1a\xa4\xc6\x4e\xb1\xa2\xd7\xfd\xb9\x44\x8f\xef\xa2\x87\xa7\x49\x31\x67\x3e\x72\x5e\x04\x92\x1b\x0b\x9a\x17\x57\xd4\xd7\x61\x74\x06\x21\x74\x08\xd5\x8c\xa6\x4e\xdc\x53\x64\x5e\x8f\x27\x11\x5a\xc0\xa4\x9b\x9d\x51\xac\x76\xb7\xcc\x70\x8c\xee\x2f\x07\x9b\x34\xbd\xad\x3a\x57\x1c\xd7\x62\xaa\x75\x10\x85\x8e\x3d\x3b\xcc\x1d\xdf\x12\xfc\xb7\x3c\x34\xb2\xab\x98\xc8\x29\xae\xc8\xdb\x57\x1f\xff\xed\x94\x5a\xf5\x09\x69\xd2\xfd\xad\x0f\x71\xe6\x00\x43\xcc\xe6\xb5\x39\xc3\x33\x45\xae\x81\xbd\x27\x35\x68\xb2\x93\x2b\xc7\x5b\x1c\x5b\xc7\xf5\xf8\x6c\xec\x1f\xbe\xdc\x3e\x47\xaa\x45\x34\xed\xd5\xf8\xa0\x6d\xa3\x4a\xdf\x94\x31\x12\x8d\x46\xaf\x81\x3c\x9c\x60\x50\x76\x45\x88\x5e\x7b\xa3\xb1\x70\xef\x11\xa2\xd8\x9b\x79\xc6\xfe\xc6\xfa\x54\xe4\x19\x58\x5f\x52\xb3\x4f\xa7\x93\xe3\xab\x20\xdc\xb3\xbf\x6b\x0f\xd5\x43\xaf\xf7\x2b\x4c\x34\x8f\xf7\x72\xae\x36\xef\x88\xea\x51\xfb\x05\xfa\x6c\xd7\x14\x77\xcb\x21\xb4\x04\xab\x33\x3c\x17\xa2\xca\x2a\xc9\xba\xec\x25\x0a\x70\x80\x27\x6e\x08\xa0\x71\x98\xc6\x98\xe5\x36\x51\x55\x4d\xaa\x09\xc8\x25\x62\xa8\x52\x70\x5f\x02\x82\x77\x90\x99\x11\x26\x24\x3e\x6f\x52\x2d\x8c\x82\x55\x04\x95\x1b\xa8\x10\x11\x94\xec\x9c\x4a\xd9\xff\x51\xf1\x1d\xfa\x83\xa7\xc6\x31\x09\x97\x0e\x12\x9d\xc3\xed\x5d\xa9\x6a\xf1\xbf\x64\x28\xfc\x2f\x9d\x3b\xc3\xc8\x4f\xfb\xb1\x97\x4c\x9a\xc5\xa1\x4d\x63\xd8\xeb\x9d\xcc\x5a\x7d\x2c\x33\x56\x72\xbd\xee\x9c\x34\xde\x31\x4e\x90\xf9\x08\xf8\x14\xba\x62\x0d\x18\xf4\x22\x7c\x73\xc0\x07\x09\xa0\x18\x8c\x10\xec\x2d\xb7\xe0\x7c\xc0\x25\x6b\x75\x29\xdf\xa2\x58\x3d\x06\x17\xcf\x1a\x0a\xee\x3a\xbd\x43\x0a\xe4\x8d\xf5\xd2\x28\x05\x23\x34\x24\x08\x1a\x9a\xec\x1e\xf5\x61\x46\x80\xd7\x82\x7b\x69\x9e\x7b\x41\x27\xed\x57\xcc\x17\xf2\xd6\x63\x0d\x24\xce\x65\x5d\x74\x0a\x03\x9b\xea\x4e\x89\x15\x76\x27\xa5\xf5\xcf\xb9\xe9\x7b\x80\xca\xc2\x9c\x0f\x19\x3e\x96\x2f\x7d\x26\x29\x66\xec\xa3\x5a\x88\xa4\x36\x63\x67\x70\x90\x35\xc2\x3c\xa0\x5b\xe4\xb0\xca\xeb\x2e\x5d\x36\xe4\x49\x1c\x6e\xe2\xf6\xff\xe4\xa1\xd0\xb4\x6d\x2c\x0b\x4b\x51\x17\x34\xcc\x1c\xc0\x0c\xf6\x9d\x32\x29\xde\x2f\xe8\x27\xd3\x9c\x8b\x34\x5c\xbc\x41\x49\x89\x9e\xdf\x51\xe2\x20\x41\x21\xc5\x75\x9d\xa8\xa4\x60\x71\x23\xc7\x18\xfd\x8a\x30\xeb\x4e\x25\x04\xab\xca\xfe\x50\x0d\x3c\xa4\x25\x5a\xc5\x28\x7f\x51\xca\xc0\x85\x6a\x23\xde\x2c\x07\x24\xce\x7e\x4a\xf4\xd6\x69\x81\xc1\x17\xea\x38\x66\x36\x7d\x09\x1e\xbd\xa2\xe7\xc4\xc2\x41\x0e\x21\x31\x63\xde\x18\x95\x9c\xac\x83\x05\x35\x67\xf6\x66\xf6\x05\xb1\xa2\x4e\x52\x33\x97\xb2\x48\x45\xbd\x89\xf1\xf4\xea\x61\x8f\x8a\x48\x61\xd6\x61\xea\x29\xdc\xcc\xef\x07\x1d\xde\x93\xc6\x3b\x5b\x03\xb6\x45\x17\x1e\xc0\x27\x92\x67\x1f\xd3\x84\x73\x77\x55\xb6\xbd\x60\x17\x0c\xc7\xa1\xb4\xc1\x34\x0c\x16\x75\xb3\xf7\x50\xbb\x39\xb7\x6b\xde\xd7\xf0\x1d\x2f\x7f\x67\x20\xec\x21\xd0\x34\xc8\x4f\x62\xf5\xa1\xb8\xa2\x5c\xb4\x48\x43\x7a\x4e\x22\x2d\x0b\x52\x4a\x02\xdf\x5c\xe1\xa3\x72\x60\xae\x1d\x72\xba\xd2\x2e\xb8\x30\xfb\x21\xac\x60\x07\xdc\x82\xdb\xcc\x11\xf6\x5b\x06\x1f\xe2\x06\xf5\x9e\x51\x84\x4a\x8a\xc7\xec\xba\xb5\xee\xfd\x6f\x54\x63\x4d\xfc\x82\xfc\xc6\xfa\xc7\x59\xc3\x20\x13\xf2\x9a\xcc\xe9\x57\xdc\x6b\x33\x0f\x77\x99\x16\x8e\x86\xe9\x19\x66\x7a\x9f\x6d\xf8\xa0\xbb\xa6\x0a\x48\xf3\x1a\x0b\x56\x2f\x1a\x36\x7b\x7e\x55\xc8\xd8\x25\x04\xa4\x9b\xad\xde\xd7\xdc\xda\x8e\x29\x65\x2d\xac\xca\xee\xea\xd6\xcb\x3a\x74\x2e\x4b\x23\x24\x82\x01\x7f\x44\xe5\xce\x32\x44\x1a\xfb\x32\x33\x4e\x20\x42\xf4\x50\xfa\x1c\x3d\x9d\x07\xbc\x58\x4c\x10\x31\x74\x02\x65\x70\x7c\xc6\x13\x2b\xe9\x4d\x22\x20\x13\x26\xc7\x58\xc5\x7e\x93\xb8\x17\xaa\x6c\xcd\x32\x82\xe7\x2a\x56\xd9\xce\x7d\x5d\x59\xd8\xba\xb1\x0c\x6c\xbe\x5b\xdd\xe7\x2b\x3b\xac\x66\x08\xd2\x31\xc4\xf1\x77\x43\x8f\x21\x19\x69\x9c\x85\xc2\x30\xd3\xc2\x09\x8e\x91\x2d\xcb\xef\x4d\xfd\x19\xd0\xae\xf7\xba\x67\x76\x15\x5c\x31\xac\x01\x7d\x79\x14\x5b\x9a\x22\x54\x09\x4e\xd4\xc6\x0e\xc5\x89\xc5\x5c\x4c\xec\x68\x1c\xf0\x10\x84\x55\x76\x43\x41\x31\x5f\xbd\xa0\x66\x7e\x36\xea\x5c\xfb\x9c\x45\x49\x58\x65\x4e\x3c\xbe\x7c\xef\xdc\xc5\x40\xfb\x2f\x1d\x55\x12\x81\x23\xb7\x69\xb5\xae\xb5\x12\xd8\xfd\x2b\xc9\x24\x71\x2d\xa5\x02\xcc\x92\x02\x44\x7d\x19\xa6\xda\x1d\xd3\xa0\x26\xb5\x4e\x20\x04\x63\xdb\xe8\xa6\x29\x75\x9e\xaf\x9f\x57\x65\x62\x4d\xa1\x76\x35\x35\xda\xa8\x6d\x33\x2b\xd7\xd0\x12\x93\x6b\xc0\x3c\xfc\xf4\x6e\xbc\xf3\xde\x5c\x7a\xb8\xb6\xb7\x43\xc7\x81\xe4\x90\xe7\x68\x29\x1d\x37\xd9\x67\x64\xee\x6d\x21\x6e\xad\x21\x99\xa1\xb9\x0f\xe8\xd1\x11\x70\x59\x2f\xf9\xc1\x0f\x2a\x0c\xb3\x6d\x67\x84\x8f\x97\x4e\xbe\xeb\x61\xf0\xdb\x9e\x69\x5f\x2a\x18\x63\x1c\xa8\x27\x28\xa4\xf1\xe1\x95\xd0\x70\x4a\x51\xfb\x57\x0d\x48\xa6\x73\x92\x38\x3c\xb5\x8f\xf9\xe0\x21\x15\x19\x94\x6f\x82\x60\x1d\x8b\x9f\x88\x40\x24\x3f\x78\x43\x00\xab\xff\xec\x24\x19\x59\x59\x8f\x44\x86\xaa\xc9\x0b\xe8\x66\xb8\x89\xa6\x1f\x22\x33\x03\x47\xf1\xb3\x10\x70\x70\xd1\xea\xed\xd2\x80\x6a\x63\x15\x8e\xb3\x51\xf8\xcf\x5e\x3d\xba\xb4\x62\x67\xf7\x2d\x59\xbf\xfb\x7e\x89\x64\xe6\x42\xf1\xf4\xbb\xac\x9f\x39\x61\x26\xf8\x6c\x5b\x73\x22\x9b\xf3\x6f\x2d\x12\xe5\x8d\xf4\xc0\x01\x4e\x01\x3a\x06\x37\x28\x5d\xfb\x1f\xcf\x45\xeb\x24\x4d\xa9\x8d\x31\xb4\x5c\x8e\xac\x99\x12\x6a\xa7\x6f\xab\x55\x15\xb2\xbf\x4c\x8d\x08\x28\x50\x8d\x41\x78\xe2\x9d\x0a\xdc\x1e\x12\xc6\x31\xb4\xe0\x1d\x38\x50\x7f\x29\x8e\xb7\xce\x55\x86\x1d\xd1\x47\xe4\xb6\xf8\xa1\x14\x60\x7a\xc6\xb8\xe7\x65\xbf\xa2\xe6\xc3\x3c\xf8\x0d\x81\xf0\xa6\x04\x5a\x4d\x75\xb6\x20\xa8\xb2\xb2\x29\xbe\x8f\xdc\xb1\x8b\x49\xf6\xce\x09\x18\x44\x4c\x74\x01\xb4\x08\xda\x38\x55\xa2\x9e\x87\x08\x18\x9e\x2d\x60\x35\x5c\xce\x90\xef\x7e\x15\xa0\xa2\x55\x3b\xb5\xb4\xc0\x57\x9c\x5f\x0f\x4a\x26\xa5\xd6\xe0\x7a\x24\xe0\xd7\x4a\xfa\x5d\x72\x41\x21\xa2\x4b\xf3\xe1\xbc\x22\x61\x7b\x43\x99\x4e\x73\xe0\xb7\xa8\x20\xdf\x64\xf5\xf7\x5b\x33\xff\x3c\xbe\x12\x19\x21\x76\x5b\x66\x69\x92\xa7\x46\x1c\xe0\x4c\xd0\x1b\x7a\xe2\x5d\x10\xea\xe6\x83\xd6\x41\xc9\x7b\xa5\xfe\x44\xd9\xd0\xa1\x15\x16\x18\x03\x0f\x3d\x6c\x23\x19\x29\x27\x8e\x2c\xf4\x5c\x48\x0c\xb1\xd2\x1c\x83\xf7\x5e\x30\xf8\x63\xd1\x39\x37\x19\x64\x8d\xfb\xad\x14\xfa\x0e\xe6\xae\x0f\xfe\xe6\x7f\x26\x8c\xba\xaa\x60\x3f\x73\x66\x3e\x3a\x4a\x75\xfe\xec\x9d\x1e\x18\x66\xa8\x13\xa6\x6c\x6b\x92\x80\x43\x62\xca\xec\xeb\x35\xea\xe4\x0f\x28\xe1\x9e\xbf\x5a\x95\x73\x0e\x52\x59\x53\x1c\xe1\x19\x6d\x9c\x00\xff\x7a\xae\x96\x40\xfa\x2f\x7f\x95\xe7\x21\x72\xba\x19\xe9\x59\xef\xde\x2b\xc1\xb8\xe6\x8c\x66\x25\x0b\xe1\x70\xcd\x53\x3f\x46\x6f\x03\xc3\x7a\x94\x90\xc3\x3f\xa4\xe1\xea\xa3\x84\xc3\xe2\x69\x31\xc8\x6a\x5c\x27\xc9\xbe\xfa\x17\x14\x67\xe7\xf9\x7b\x2a\x8e\xf0\x48\x64\xa9\x20\x47\x2d\x3b\x0b\x1b\x65\x11\x3f\x90\x40\xd5\x4f\x8d\x01\x1b\xd7\x24\x48\xf3\xcc\x15\x72\xa8\xbf\xe9\xf1\xb8\x24\x94\x33\x66\x55\x37\xa9\x0b\xbb\xe5\xae\x73\x1d\xd5\x4e\x37\x6f\x0b\x2d\x9e\x4f\xf5\xda\xa2\xe9\xd8\x87\xd8\xb2\x8c\x7d\x8a\xdd\xa3\xb9\x23\xe1\x4d\x3c\xa0\xea\x2c\xb1\xc3\x1f\x2d\x28\xc0\x44\x79\xde\xe3\xe5\x13\xb5\xb7\x84\x4b\xe9\x48\x88\xb7\x6d\xf8\xa3\xfe\x05\xb2\x42\xb6\xc9\x1e\x17\x7b\x8a\xbe\xd1\xd6\x63\x67\x6b\x1d\x73\x04\xf7\x89\x51\xee\xaa\x86\x22\xa2\x5d\x5f\xad\x8b\x94\x5e\xc6\x89\x3a\x1b\xcf\xdb\x8b\x43\x84\xb2\xa6\x73\x0b\xad\xc8\x1a\xb2\xe1\xcd\xb7\xb6\x01\xf4\x9c\x28\x49\x2d\x66\xde\xca\x11\xd2\x6c\x0f\xd7\xdc\xc5\x8c\xc7\xed\x1a\x07\xfb\x48\x9a\x11\xed\x29\x49\x50\xa5\x21\x46\x86\xdf\xe8\xf2\xaa\xaa\x79\x7d\xcd\x39\xe3\x7f\xf2\xc1\x9b\x4c\x3d\x26\x8e\xb7\xe5\xac\x6f\x86\xcf\x5d\x92\xb0\xc3\x40\x91\xd4\x8f\xfe\xc6\x83\xbc\xc7\xcd\xdf\x8f\x10\x79\xa2\x38\x09\x6c\x00\xa7\x25\xf6\x3e\xb5\xe0\xc6\x22\xd5\x1a\x28\x1d\x21\x6b\xba\xb6\x32\x24\xa6\x29\x4a\xce\x9c\xf9\xa7\xb1\xf6\xea\xdd\xfe\xb6\x1f\xc2\xa1\x5c\xff\x75\x0e\xba\x29\x1f\xff\x03\xe9\x2a\x29\xd3\x1c\x9c\x2d\xce\xe4\x0a\xf3\xf3\x1e\xe5\xd5\x90\x2f\xbb\xd4\xe8\x77\xb9\xa9\x47\x0a\x77\x0c\x60\x92\x24\x0e\x79\xbb\xcc\x4c\xb9\x92\x2c\x0e\x42\x9e\xee\x31\x0d\xc0\x09\xb7\x3d\x75\x42\x97\xb7\xc4\x62\xf7\xc0\x61\xe4\xd6\xe6\x16\x76\xb6\xc2\x0b\x11\x8f\x67\x66\xae\x43\x63\x3e\xe7\x23\xad\xa3\xf8\xe9\x42\x48\x5d\xa5\x45\xd3\x0e\xa0\xea\xcb\xe6\xe8\x2f\xb9\x02\x0d\xd2\x48\x1e\xee\x91\xdb\x1a\x55\xcf\x7b\xeb\x08\xd4\x58\x5c\x5e\x25\x8f\xd7\xbb\xd4\x0c\x75\x93\x94\xc0\x1c\x9f\xe5\xd6\xaa\x32\xb2\xd8\x20\xba\x5a\x08\x10\xdd\xcc\x1e\x3a\x8a\xb4\x84\xc6\x13\x62\x62\xb3\xfc\x09\x35\x4d\xe6\x26\x6e\xe8\x08\x23\x9f\xd0\xcb\x0a\x9a\x97\xba\xcd\x9c\x9c\x69\x21\x4c\x12\x25\xa6\x81\xa7\x5e\xb3\x8c\x6a\x2b\xb5\x9d\xcc\x3b\xe6\xbe\x8f\xde\x90\x2c\x0b\xc6\x21\xdb\x20\xbe\x88\xb5\x15\xb3\x7e\x5c\x19\x4b\x60\xb2\x43\x03\xea\x1d\x78\x84\x82\x99\xf7\x8e\x7b\xe1\x94\x8b\x31\x67\x22\x65\xfd\x27\x54\x32\xbc\xe7\xc2\x73\xd2\xab\xdf\x59\x03\x5a\x5e\xf5\xc3\xb4\xba\x31\x61\x99\x27\x6f\x5d\x22\x2b\xe6\xdf\xf2\xa7\x8f\xfb\x17\x86\x0e\x9e\x32\xc6\xb5\x33\x71\x09\x6e\xec\x3e\x4a\x43\x95\xb3\xc0\x2c\xaa\x7d\x08\x40\x7d\x9c\xd3\xd7\x34\x87\x47\x00\xa6\x2e\xf6\x44\x4f\x35\x9d\x21\xb0\xe0\xf0\x90\x33\x28\x6e\x98\xed\x4c\x8d\x64\xef\xbe\x8a\x1e\x4f\x1e\xb1\x87\xaa\xa2\xee\x8d\xde\x1c\x6d\x82\x76\x43\xe1\xd1\x31\x6c\x85\xa3\x75\x99\xe3\x79\x2c\xac\xa9\x11\x70\x84\x90\xce\xe2\x1d\x47\x7e\x61\x17\xd7\xa7\x69\x9e\x84\x17\xbc\x67\x92\xcd\xc6\xa1\x77\xef\x31\x8d\xea\xbf\xef\xdc\xa9\xac\xef\xb2\xf0\x7b\x5c\xb4\x4b\x26\x6a\x6d\x22\xdd\xaa\x30\x91\xb5\xe9\x93\x5c\x88\xe7\x4c\xd1\xf6\xb7\xe7\x8b\xc8\xce\x60\x0a\x67\x04\x6d\x5f\x2e\xc1\x16\x7c\x58\x4f\xe6\x74\x80\x2e\x85\x00\x7f\x25\xcd\xfe\xb1\x50\x45\xf4\x0d\x80\xf5\xdf\x73\xa4\xa8\x32\xe8\x2b\x75\x8c\x91\x18\x2c\x1d\x5a\x12\x81\x93\x35\xe4\x1e\xf1\xb2\x97\x06\x6b\xdc\xca\xef\x3a\xdd\xc3\xfc\xc2\xaa\x60\x93\x33\x21\xef\xa5\xd3\x7c\xa9\x48\x3e\x2d\x9b\xf5\xff\x5f\x62\x3c\x07\x14\xf3\x04\x65\xac\xfc\x16\x8e\xc8\x60\x7c\x55\x59\xee\x3f\x2f\xa5\x0a\xf6\xf3\x47\x9c\x55\x63\xaa\xa1\x8c\x47\x27\x62\xe8\xac\x0a\xc7\xfb\x94\xc6\xdb\x74\x67\x6d\xf6\xed\xcd\x35\x38\xbc\x4a\x42\xc4\x99\xe1\x46\x1f\x55\xfd\xf8\xee\x67\xbf\x9a\x10\x30\xbe\x47\xa9\x66\xa1\x40\xa0\xd3\xa4\x46\x26\xbe\x76\xb9\xc0\xb5\x38\x00\x47\xd3\x74\x4a\x01\xcd\xc2\x60\x4a\x21\x7a\xf3\x10\xfe\x44\x45\x09\xa7\x7c\xff\xef\xc4\x25\x40\xb9\x00\x57\x9c\x1c\xdc\x31\xc6\xee\x7b\x52\x1e\x39\xf9\x49\x8b\xbe\xa8\x15\x6d\x66\x1d\x4d\x89\x1b\xb3\x87\x39\x7d\x04\x06\x16\x4b\x7a\x6e\x51\x5e\x6b\x94\xab\x73\xd2\x4e\x43\x3e\xe8\x19\xa3\xf1\x1f\x90\xf7\x86\xef\x0c\x95\x87\x7b\x65\xa3\x2e\x2e\x5a\x4c\x61\x24\x85\x5b\xda\x2f\x2f\xa1\x49\x31\x22\x36\x48\x94\xba\xe7\x6f\x0d\x8f\x3c\xc6\x53\xdd\x0c\x5b\x70\xfe\x87\xa0\x2e\x3a\x22\x21\xbb\xe7\x47\x40\xc8\x38\xe0\xeb\xe6\x3c\xe0\x4a\xf8\x5f\x1c\x81\x27\x37\x99\x97\x6d\xb1\x77\x1c\xd8\xcb\xb1\xe4\xf7\x2c\x11\xe0\xb9\x4d\x8a\xb2\xcc\x39\x58\x27\x49\x81\x94\x7b\x33\x76\x74\xea\x2f\xfe\x07\x0b\x16\xee\x20\x19\x0b\xdf\xaf\xe6\xc7\x3b\x07\x27\xdd\x1b\x4a\x32\xa8\x34\xe7\xca\x4a\x92\x39\x96\xbc\x04\x5d\xb0\x23\xd5\x58\x86\xe5\x9f\xe9\x15\x8d\x3c\xea\xb7\xb1\xfd\x45\x7f\x50\xfa\x54\xc5\xaa\xa8\xdf\xbf\x8a\x3c\xb5\xc7\x64\xb5\x49\x12\xd7\x4b\x61\xcd\xcd\x1c\xad\x87\x74\x44\xf6\x0a\xea\xb5\x1a\x2a\x72\x6e\x4a\xd2\x1b\x5a\xcc\x68\x65\xa1\x52\x02\x51\xa1\x55\x0d\xc8\x5e\xbe\x8e\xb4\x40\x54\x63\x69\xdb\x62\x93\xcc\x40\x7c\x0d\x0d\xb0\xc3\x87\x43\x98\x5d\x3a\x86\x91\x1c\x7a\x70\xa6\x90\xd3\x23\x22\x80\xaf\x52\x14\xf1\xa4\x8e\xfb\x50\xdb\xe7\x7d\x6a\xb3\x4c\xcb\x74\x50\xfe\xad\x4d\xad\xa2\x00\x9f\x1a\xaa\xf2\x10\xe3\xf8\x1d\x49\xa7\x8d\x18\xe8\xae\x9d\x1d\xac\xd5\xbf\x5f\xa3\x9b\x5d\x29\x89\x72\x71\xb9\x29\xe5\x11\xaf\xa2\x22\x59\x1c\xd2\xa6\xcb\x74\x7c\x75\x88\x73\x5a\x77\x6c\x44\xee\xca\xee\xa9\xc4\x5b\x8d\xda\xec\x5e\x51\x06\x4c\x00\xe8\x95\x22\x0f\x5e\x5b\xd8\x8c\xde\xbf\x36\x13\x2b\xaf\xad\x3d\x99\x62\x0b\xea\x04\x51\x61\x94\xc9\x88\x4e\x8a\x44\xd5\xc5\xb2\xdf\xf6\x10\xf7\xf9\x2d\x57\x72\xb1\x45\x3d\x85\x23\x6a\x82\x60\x44\x56\x51\x33\x66\x43\xb1\x2f\xaf\xd9\x6e\x3e\x9f\x1f\x35\xd1\x4d\x02\x1f\x88\x80\x62\xd2\x5c\xef\xd3\x8c\xb8\x94\x0e\x2a\x06\x2a\xac\xdb\xda\x9d\x0b\x8b\x08\x41\x1f\x65\xc4\xd3\x84\xff\x10\x0e\x54\xc2\x0c\x20\xe2\xd1\x1a\x26\x49\xc2\x7b\xca\x10\xc0\x47\xbd\xda\x87\xd1\x98\xe5\x5f\xb1\x1e\xc4\x09\x8c\x58\x99\x10\xe4\x71\x9d\x7f\x02\x0f\x2b\x75\x83\xfc\xd2\xab\xd0\xae\xd4\x7b\x81\xae\xf1\x92\x1f\x2d\x70\x9b\xff\x3c\x13\x5b\x63\x17\xef\x4c\x51\x13\x3d\x86\xd2\x42\xbf\x75\xb1\xf5\x13\xbf\x87\xda\x9e\x38\x9e\x76\xa1\xcf\x17\xb2\x09\x1f\xf4\xc2\x53\xe5\xfd\x45\x1a\xf9\x03\x0a\xad\x26\x6f\x6e\x30\x01\x5b\x1b\x03\xa4\xd6\x14\x9d\xaa\x2c\xe5\x84\x34\xe9\xe4\xa7\x61\x68\x2a\x21\x0e\xdb\x85\x5a\xa4\xe6\xd6\x9c\x18\xab\xb0\xd1\xa8\xed\x8e\xca\x60\xc5\x2e\x5a\xe2\x2a\x9f\xb4\x4f\x2a\xe9\x6c\xe3\x47\xda\xd7\x93\x88\xe7\x12\x2f\x26\xb2\x14\xf6\x51\xbd\x8c\x51\x83\x57\x1f\x8f\xd9\xcf\x10\x4e\x59\x05\xae\x79\xbd\x62\x00\xe0\x08\x89\x44\xe5\x33\x0b\x42\x25\x55\xe9\x1b\xbd\xe3\xe1\xcd\x45\xdb\x9d\x72\x6f\x1e\x70\x86\x9a\x7c\x54\x69\x39\xa2\x70\x55\xb4\x7e\x7c\x0f\xa0\xc7\x64\x1d\x40\xa6\xe8\xb9\xc5\xb2\x57\x96\x96\xee\x2e\xf2\x47\x57\x91\x3f\xb9\x13\x59\x6e\x10\x71\xd8\x51\x85\xdb\xff\xbe\xa4\x74\x95\x27\x07\x13\xa2\x44\x90\xd0\x37\xce\xd0\x16\x28\x19\xf4\x0e\x7e\xc9\xfd\x06\x56\xd1\x6b\x3a\x61\x9f\x84\x31\xf5\x0e\x27\x23\x14\xee\xec\x96\x1e\xa8\x4a\xa4\x97\xa5\xca\xd8\xc5\x4d\x79\xa9\x86\x5a\x7b\x08\xcf\x06\x53\x37\x55\x92\x21\xd1\x74\x44\xd5\x84\xb9\xab\x4e\x30\x8d\xb6\x8b\xfb\x9d\xa1\xdc\x5a\x86\x18\x08\xc4\x6c\x75\xcb\x8a\x8b\xb6\xc8\xd5\xd7\x73\x1f\xd5\x26\x16\x89\xc1\x8a\x7a\x12\xfe\x51\x52\x40\xfe\xaf\x75\x64\xe5\xdd\x75\x67\x10\x8c\x91\xb6\x3f\x17\x4d\x60\x6c\x23\x3d\x91\x32\xad\x59\x89\xe9\xd8\x46\x40\xb0\x09\x47\x32\x89\x1b\x11\x4c\x76\xd6\xee\x02\x17\x2c\x26\x5b\xb5\xcc\xf4\x7a\x96\xa2\x35\x19\x85\x26\x3d\xc9\x53\x1f\x03\x6e\xc1\xa5\xb8\x6b\x31\xf9\x07\x4d\x76\x0a\x64\xda\x8c\x02\x9a\x64\xde\xb2\x97\xef\x82\x3a\x2f\x13\xa4\x5c\x62\xca\xd2\xab\x16\xe0\x18\x47\xb1\x1c\x72\x94\x5d\xe1\xb5\xdc\xdf\x57\x69\xf8\xad\xb1\x00\x5e\x6b\xa0\x66\x81\x06\x88\x30\x45\x77\xaf\xb7\xf2\x86\x38\x1a\x88\xbd\x51\x97\x7d\x17\xfa\xa0\x3e\x9b\x19\x21\x6e\xf3\x8f\xa1\xe1\xc2\xd1\x1b\x25\x50\x46\x3b\x69\xb4\xc0\x54\xa3\x0a\x03\x5c\x64\x7f\xa3\x49\x80\x0c\x6d\x9e\x6a\xb1\xfd\x1c\x5e\x0c\x7d\xb4\xbe\x6e\x5f\x92\xc4\x93\x26\xff\x39\x01\x57\x4b\x79\x32\x95\xf1\xcc\x33\x6d\x8c\x23\xb2\x5b\x9b\x59\xab\x1a\x7e\x6a\x27\xfe\x6a\x81\x11\x9a\x9a\xbc\x17\x41\x8b\x72\x76\x6b\xcd\x20\xdf\xee\x9c\x41\x2b\xe7\x1f\x86\x17\xf2\x6f\x4c\xd2\x35\x6a\x91\x68\x0d\x79\x8d\x33\x59\xc4\xcf\x1c\xd6\xb2\x3c\x64\xdb\x30\x33\x8a\x63\xfc\xbd\x9d\x11\xde\x5c\xeb\x9b\x97\x6b\xd2\xec\x00\xa3\xef\xef\x4c\xfe\x56\x09\xdf\x85\x1e\x69\xce\x2d\xc1\x71\x2a\x9b\x1a\x1d\x7d\x42\x0b\x4f\x55\xa7\x0c\xde\x3c\x36\x3b\xb1\x3a\xe8\x80\xce\xec\x6b\x75\x22\x57\xb4\x6a\xf4\xde\xf0\xcd\x72\xd0\xba\x46\x9d\x20\xb9\x16\x40\x4c\xa6\xa4\xc7\x52\xa1\x44\xb9\xf8\x07\x7d\x58\xef\x2d\xc7\x5e\xc3\xfe\xd2\xea\xe1\x6f\x5f\x65\x29\xe1\xcb\x3b\xeb\xb3\xfb\xec\x3d\x83\x21\x01\xd2\x24\xb1\x38\x89\x9a\xfe\x0b\x94\x4a\x84\xfb\x17\x15\x70\x6a\x4a\x52\x6e\xd2\x77\x67\x8f\x22\xde\xca\xdb\x89\x35\xff\xb0\x84\x82\xfc\xac\x2f\x2b\x97\x26\x06\x86\xfb\x97\xeb\x06\xde\xd3\x42\x5d\xca\xd9\xd5\x6f\x61\x71\x2b\x63\x75\xfb\x13\x7a\x86\x0a\xb7\x44\xb3\x25\xa2\xe7\x8d\x17\xac\x7b\x7a\xdb\x50\x53\x6e\x85\x7e\x0c\xbd\xe8\x18\x39\xfc\x88\x0e\x8a\x1b\xb3\x00\x6c\xac\xfb\xc0\x98\x61\x82\x3a\x56\xb9\x1a\x87\xb6\x36\xa1\x45\x9d\x14\xbd\x05\x80\xd2\x17\xf3\xe6\x56\x39\x55\x17\xe9\x52\x8f\xa6\x0b\xd5\x68\x8a\xa5\x03\x93\x8a\x1f\xa0\xe5\x8a\x8d\x7b\x85\x30\x33\xc0\x7b\x5c\xe4\xc3\x12\xfd\xa6\x36\x26\x8d\x2a\x1a\xcd\xef\x4e\x05\x4d\x28\xbc\x98\x55\x1a\xc0\xcb\xb6\xb6\xe8\x31\xda\x34\x82\x97\xb0\x09\xde\xb8\x2e\xd1\xb8\x31\x47\xde\x7e\x89\xee\x7b\xdc\x40\xe0\x29\x6d\xad\x1b\x7e\xbf\x7d\x75\x60\x05\x27\xa9\x69\x15\x78\x7f\xf7\x50\x14\xce\x8d\xe7\xcc\x8b\xfd\xd8\x58\xe4\x7d\xb8\xc9\x60\x45\x86\x57\xff\x6b\x00\x90\x84\xa6\x88\x6d\xe6\xc1\x0c\xab\x46\xe1\x6c\x51\x2f\xb1\x5c\x29\x75\x8c\x17\xd4\xfb\x2d\x56\x93\xb6\x84\xa9\x2c\x1a\x9d\xf3\x15\xef\xf2\x1e\xa1\xda\xda\xf1\x29\xd2\x6f\x40\x59\xba\x37\x58\x8e\x1b\x78\xf1\xa1\x7e\x73\x8c\x96\xb4\xe1\xea\xa0\x01\xfa\xd6\x26\x8d\x45\x77\x25\xe6\x96\x2b\xfd\xa0\x84\x29\x01\x43\xf2\xe6\xb8\x75\x79\xe9\xb2\xd4\xc0\xf7\x35\x0a\x15\x6b\x3d\xa2\x9e\xb8\x8b\xa9\x2f\xf2\x5c\x14\xaf\xc9\xa4\x8b\x5c\x30\xa2\x70\x12\x0c\x6f\xa8\x9a\xe1\xff\x7b\x8d\x98\xd9\xea\x4b\xa9\x72\x59\x03\xa5\x0f\x36\x90\x3b\x4d\x42\x1b\x67\xc1\x35\x22\x72\xc1\x3a\xb5\xf7\x5a\xb0\x3b\x01\x32\xbc\xa4\x59\xe9\x0d\x7f\xd0\x7d\x03\xa5\x72\xfe\x49\x41\x1f\xdf\xd4\x4b\x98\x75\xac\xca\x04\xef\xf4\x56\x16\x0c\x08\xc7\xe0\x31\x71\x6a\x31\x99\xbb\x30\x85\x54\xb3\x12\x27\xa3\x63\x49\x97\xb3\x5e\x19\xb8\xa4\xf7\x74\x85\xe4\x57\xf7\xbd\xd9\xcb\x25\x90\xe2\x66\x17\x11\x64\x7b\x21\x94\xa5\x19\x8b\x2e\xb1\x71\xee\x39\xdd\x40\xbc\xdb\x0c\x77\x4a\xb8\x9c\x07\xcc\x07\xe5\x09\xb5\x6b\xf5\xf9\x07\x8a\xed\xfb\xd5\x2b\xea\x66\x2c\xbe\xac\xd2\xd6\x80\xd0\x4e\xe0\x75\x97\x7e\x63\xef\xc5\x4b\x5d\xcc\x74\x1c\x52\x59\xab\x77\x95\x4c\x5c\x3e\x9c\x2d\x8b\x11\x12\xce\x8b\x5a\x6a\xaf\x21\x3b\x37\x10\x09\xf0\x2a\x66\xc0\xae\x4b\xc7\x5f\x3c\x95\x19\xbc\x21\xff\xe4\x67\xea\xe9\x87\x5e\x0d\x73\x6d\x77\x90\x2e\xf8\xd4\x5c\xd6\x98\x42\x89\x2f\x6b\xe8\x25\x51\xec\x45\xd7\x88\xf3\x26\xed\x5e\xbd\x85\x35\x65\x47\xc6\x53\xa3\x79\x90\xdc\x21\xd3\x66\x5e\x52\xa9\xa5\xd7\x45\xbf\xc6\x06\xcc\x59\xb1\x83\xb3\xf9\x99\xb1\x78\x17\x2b\xf7\xf2\xd2\x03\xd2\x5f\xd3\xaa\xb4\xca\x7b\xd8\x82\x6f\xa8\x09\x6c\x9d\x0b\x9f\x47\x36\x1a\xba\x8c\xa9\x3b\x79\x54\x3e\xf5\xc1\x09\x93\x39\x56\xf2\x1d\x03\xca\xee\x77\x4d\x8c\x2d\xfe\x53\xb4\x9c\x3e\xd3\xc4\xff\xcd\xe2\x32\x97\x10\xc5\x47\x9c\xcb\xd7\xcc\x21\xe2\xfd\x89\x07\x97\x3c\x84\x7c\xfb\x5f\xd3\x45\xe1\x31\x48\xd2\x2b\xdd\x31\x00\x9e\xf7\xaf\xae\xba\x93\xd0\xf5\x0a\xa6\x6b\xcb\x5d\x31\x4a\x23\xb8\xe2\x31\xe0\x35\x22\x0c\x0b\x59\x7b\x9a\x59\x8c\x8a\x65\x69\xc9\x45\x82\x2e\x5d\x51\x73\xd9\x55\x97\xf6\x8f\x45\xc4\xd4\x7a\xcd\x6f\xfd\x29\x66\x88\x39\xbe\x55\x60\xd2\x14\x74\x70\xcc\xbf\x6c\xc1\xd4\x14\x00\xae\x67\x82\xa1\x70\xc3\x76\x7f\x8e\x89\xc6\xed\xf6\x76\x60\x81\xf4\x3f\x28\x23\x89\x4d\xe9\x87\x0a\xe0\x3f\x51\x21\xd4\xf0\x24\xb9\x5f\x6c\x11\x63\x14\xab\x34\x6d\x27\x21\xcb\x0b\x49\x72\x0f\xcb\x29\x9c\xbb\x13\x8e\xf3\x6a\x70\xb6\xc8\xfa\x04\x92\x96\x82\xb2\x4d\xb6\x72\xeb\x91\xae\x94\x16\x76\xa8\xe6\x12\x56\x6f\x43\x8e\xd9\x31\xd2\x8e\x5e\x6b\xa0\xb9\x02\x7a\x8f\xc4\xeb\x42\x69\x52\x1c\x2d\x7b\xec\x2a\x0c\x8e\x99\x8b\xd0\x0d\x18\x8b\xfd\x33\x21\x38\x4b\x8c\x42\x3c\x72\x8a\x59\x9f\xca\x27\x3e\xc8\x73\x43\xdf\xf8\x1d\x6a\x86\x8a\x0d\xbd\xa3\x9e\x9d\x93\xcd\x34\x40\x3b\x21\xc0\xac\xc3\x91\xc3\x98\xb5\x99\x37\xa7\x00\xe1\x54\x95\x2d\x62\xd3\xb5\x68\x74\x7a\xdd\x42\xc2\xd8\xdb\x82\x17\x8a\xc0\xba\xe6\xa8\x78\x3b\xab\x3a\x9a\xbd\x5b\x8e\x36\x66\xc9\xa7\x37\xe9\x40\xa6\x45\x5c\xd8\xfa\x0e\xa1\xc4\x8d\x41\x9f\x67\x43\x22\xaf\xc0\xe6\xfc\xa8\x05\x6d\xff\xca\x88\x1a\xad\xc1\x67\xb7\x48\xc1\x81\xaa\xc2\x96\xd0\x9d\x1a\xfb\x11\xed\x0a\xb7\x0b\x72\x61\xdb\xb1\xab\x87\x90\xc7\xb8\x29\xfb\x76\x91\x6c\x1c\x02\x4e\xce\x6a\x3a\xd9\x2c\xee\x92\x96\xcb\x96\x06\x8c\x71\x0a\x1e\x8c\x93\xc4\x98\x1b\x65\x3d\x86\x87\xcc\x9d\x90\x45\x8b\x63\x24\x82\x9a\xa5\x17\x45\xd1\x44\xfa\x0d\x2c\x61\x8f\x86\x7e\xd4\x24\x43\xcf\xce\xd9\x59\x64\x0e\x79\x19\x47\x43\xaa\xfc\x22\xf7\xa2\xa3\x25\x97\x9c\xae\x21\xa5\x3d\x42\xbc\x17\xe7\xc1\xeb\xe9\xcb\xdc\xa2\x81\x73\x0a\xe6\x47\x30\x42\xd0\x5f\x14\xb3\xda\x5c\xb2\xec\x86\x12\x10\xed\x1f\x3b\xdf\x37\x56\xd1\xbc\xfe\xc3\xc3\x70\x86\x4e\x4a\xd3\x65\x3a\xbc\xcc\x4a\x3f\xee\xca\x8b\xd1\x8c\x72\x88\x50\xe9\x75\xfc\x99\xda\x5a\xab\x72\xa7\xbd\xf5\x0a\xee\x44\x55\xd5\x96\xa6\x7f\x4b\x12\x93\x54\x56\x13\x59\x34\xd5\x8f\xa4\xab\xb9\xeb\x8c\x88\x04\x71\x21\x9a\x49\x62\x56\xe0\x5e\x32\xcf\x5b\xec\xf1\x80\x28\x79\x86\x57\xc3\x62\xf8\x7f\xf9\x29\xd2\xb6\x08\x09\xf5\x8b\x8a\xdf\xf4\x08\x6f\x6d\x18\xac\x70\xa3\x36\xe3\x7d\x8a\xd1\x65\x68\xff\x45\x76\xe8\xbd\x20\xbe\xfb\xbb\xc5\xc9\x81\x68\x44\x5a\x82\x54\x49\x49\x13\x32\x46\xd1\x0c\x8b\x67\x09\x28\xfc\xb8\x1b\x66\x24\xb8\x2d\x92\x0f\xb9\x6c\x7a\x34\x0f\x2b\xa3\x04\xed\xb7\xab\x4d\x99\xdc\x75\xc0\x29\x96\x62\x8e\x88\x96\xc6\xb1\x6a\xa5\x61\x1f\x0d\xcc\x7e\x87\xba\x98\x1d\x39\x0b\x45\xe5\xdf\x25\x5a\x4e\xd5\xd9\xd1\xee\x28\xf1\xaa\x36\x4b\x6e\xd1\xf4\xb6\x9e\x75\x35\x9f\xc5\x4f\x74\xdf\x32\x58\xc1\xfc\xc7\xd6\x70\xab\xa9\xe9\x23\x7b\x80\x7c\xf5\x14\x09\xf9\x71\x58\xda\xb1\x9c\x20\x28\xb7\xce\xbe\xc5\xb5\x67\x79\x76\x43\x25\x5d\xc5\xd0\x9c\x07\x4e\x2f\xc1\x0c\xcd\x1b\x1b\xfb\x14\x39\xcc\x7c\xdf\x14\x23\xe2\xbd\xae\x34\xb2\x87\x71\xce\x4e\x6b\x54\x25\x74\xfa\x0c\x59\x84\x1e\x2f\x65\xdd\x98\xf4\x53\xa5\x57\x01\x20\xc0\x02\x95\x5a\x7b\xc2\x47\x0f\xa7\xdf\xb0\xda\x45\xfc\xea\x2e\x09\xf6\xfc\xf8\x60\x61\x21\x12\x15\xb1\xc6\x57\x2b\x87\x33\xf0\xef\xb8\xe1\xef\x98\xfc\x23\x89\x1b\xc6\xf7\x8e\x4d\x52\xe5\xac\x2b\xa1\x7e\x3f\x62\x22\x25\x0b\xb2\xd1\xb8\xe3\x5a\x20\xbc\x50\x48\xf6\x26\x91\xef\xce\x45\x8d\x84\xde\xe6\x99\x18\x16\xa0\xda\x96\x44\xda\xb5\xef\x93\x8c\x51\x14\x3f\xa4\xcb\xce\x60\xde\xc2\xa5\xce\x9b\x77\xb1\xcf\x35\x44\xc8\x96\x90\x14\xee\x47\x22\x38\xc4\x66\x40\x22\xd1\x5e\x2a\x32\x7c\x45\x9b\x96\x6d\x60\x00\xdf\xfe\x5f\xff\x28\x37\xdb\xcf\x14\x7a\xd1\x9f\x3d\xc4\xc4\x67\xea\xf2\xb3\x88\xb3\x71\x1f\xe7\x60\x48\xce\x31\xfb\x79\x76\xc9\xd4\x99\xd5\x37\x9f\x41\x25\xfa\x3e\x0b\x55\x48\x36\x62\x26\x89\x2b\xee\x06\x71\xe3\xf9\xf0\x10\xff\x87\x70\xe1\x78\x4d\x97\x01\x51\xb5\x04\x7f\x24\x3a\xee\x1a\x63\x51\x5f\xa7\xe5\x9a\xf8\x5e\xcc\x4c\x69\x3a\x40\x3e\xc2\xad\xf4\xa7\x3a\xf4\xce\xb5\x44\x24\x5f\xa7\x6b\xfc\xf9\x1c\x4d\xbc\x50\xe0\x54\xa1\xaa\x3b\x27\xb0\x77\xec\x86\x1f\xc1\x09\xf5\xe4\x2d\x82\x42\x17\x7c\xa1\x0b\xdf\x53\xc8\xf1\x7b\x33\x2a\x08\xf7\xc9\x3f\x3f\xf4\x24\x49\x44\xe0\x37\x74\x9c\x85\xf1\xa1\xf4\x93\xcb\x70\xdd\xa8\x59\xce\x9c\xdb\x15\x6c\x59\x04\x1d\xda\xc4\xc6\x60\x81\xfa\xc2\xde\xfe\x47\x79\x35\xc5\x86\xb1\xe3\x47\x0a\x29\xf7\xd6\xc9\x0e\xa9\x50\x81\x9b\xcf\x8f\x42\x48\x0e\x70\x24\x64\x22\x12\x60\x3e\x14\x3b\xef\x5e\x46\x54\x7b\x4c\x93\x83\xdc\x30\x09\x67\xc3\x52\xde\xc4\x09\xcc\xa1\x95\xc7\x19\x8e\x5f\x3d\x54\x57\xdb\xec\x5a\x9d\x65\xb6\xf6\x2b\x0b\x82\x4b\xbe\xca\xd7\xce\x22\x69\x67\x25\x07\xb8\x30\x27\xde\xed\xa4\xbe\xa0\x91\x69\x9b\x39\x98\x67\x6b\x57\xc0\xa9\xc0\xbf\x22\x85\x7e\xa4\x05\x33\x3e\x08\x24\xdc\xf3\x14\xc3\xa2\xee\x12\xc2\xf2\x3e\x3d\x19\xc1\x26\x79\x15\xfd\x37\x29\xe2\x9f\xc1\x02\xdc\x81\x53\x3a\x37\xf2\x81\x06\x62\x35\x43\x5d\x4e\xda\x88\x87\x50\x33\xfe\x7f\x2f\xf1\x28\xca\xfd\x07\x5f\x9a\x20\xa2\xb2\x7f\x28\x2e\x07\xe4\x62\x87\x3a\xa8\xe3\x9d\x8c\xa8\x65\x19\x39\x2e\x70\xeb\x75\x23\xaf\xa8\x7f\xde\x55\x8e\x88\xaf\xfd\xd4\xb8\x2a\xc4\x8d\x4c\x5a\x42\x52\x17\xbf\x45\xa7\xb1\xbf\x7a\xf7\xa4\xe3\xf2\x72\x8a\xec\x8d\x6d\x14\x33\x29\xc7\xaf\xc2\x4c\xf0\xdc\xd8\x7b\xda\xb7\x16\xff\x73\x9e\xe1\x3e\x18\x20\xd0\xf4\x1c\x47\xad\x02\x12\xb6\x2f\x45\x6f\x9f\xc1\xc2\x6e\x3c\xb3\xc4\x3c\x49\x50\x46\xc6\x57\x5d\x1b\x48\xc3\xe0\x55\x82\xb0\xc2\x8c\xda\xf4\x02\xf9\x9a\xa5\x9d\x32\x32\xa1\x15\x25\xdc\xfe\xc7\x51\x4c\xcc\x57\xb2\x05\x58\x6c\x96\xf4\xc3\x26\xee\xc6\x4a\x39\x98\x43\xca\xc5\xf5\x26\x19\x8c\x1c\xe6\xa6\xc3\x01\x74\x8a\x5a\x04\xfe\x1e\x5b\x76\x85\x4c\x2e\x2a\xcc\xf2\x76\x3c\x17\x29\xa9\x3f\x43\xe0\x8c\xa3\xdc\x5a\x37\xb5\xb4\xd4\x34\xc9\x00\x62\xd5\x83\x97\xec\x24\x92\x15\xa3\xc8\x74\x46\xe4\xe8\x55\xf0\x5b\xaa\x19\x07\x65\xb6\x18\x59\xcd\x33\x97\xf6\x51\xcc\x97\x7e\x0b\xfb\xdd\x18\x1b\x6d\x10\xdc\x11\x05\x69\x9f\xa0\x06\x04\x81\xed\x42\xef\xb4\xad\x4a\x26\xbf\x06\x57\x93\x33\x76\xe1\xe3\x87\xf8\x14\x52\xdc\x14\xd9\xc4\xde\x5b\xb1\x2d\x74\xa7\xb4\x5b\x87\x4a\xf7\x6e\x3f\xc2\x26\xbb\x1a\x60\x69\x3d\x0c\x1a\x7d\x94\x09\x54\x51\xa0\x2c\xcb\x5a\x78\x55\x11\x5b\x15\x4d\x52\xeb\xd5\xc2\x1b\x49\x83\x45\x0d\xac\x15\xb0\x99\xe6\x41\xa7\xe1\x2a\x94\xbb\x27\x2e\xb4\x06\x66\x24\xde\xd1\xef\xc5\x14\x30\x26\xe5\x68\x7d\x4b\xc0\x9b\x4e\x2b\x9e\x38\x74\xd4\x1b\x8b\xba\x26\xe9\x70\xf6\x57\x48\xc0\xe9\xa7\x51\xc2\xd2\xc8\x34\x33\x0a\x92\xd2\x5d\x7e\xea\x27\xae\xb4\xc7\x20\xe2\x17\x7b\xb6\x76\xf2\x82\xef\x5f\xb3\x64\x3d\xea\x17\x46\xe1\xb5\x41\x0d\xc9\x5e\xa5\xfc\x13\xe3\x9f\xbf\x66\x74\xf9\x5c\xba\x20\x3f\xf4\x89\x39\x96\x43\xc1\x16\x94\x90\x0e\x3a\xa9\x1c\xf3\xe0\xf0\x4f\x91\x08\x5b\x93\xde\x39\x34\x25\x84\x36\xb8\x83\x20\x2d\x4c\xc2\x4c\x8f\x64\x07\xfc\x68\xf6\xe0\x85\x21\x91\x0c\x15\xcb\x31\x0e\x54\x1a\x79\xdb\x95\x22\xde\xf0\x66\xe8\xf4\xca\x63\x88\xc6\x52\x9b\xed\xc6\xa6\x5b\xbb\x5e\x41\x67\x58\x34\x53\xb0\xd1\x7c\xc9\xb9\x23\x1a\xcf\xaf\x1a\xf3\x69\x8a\xfa\xbd\x1b\x82\xb4\x8a\x96\x98\x04\xc4\x59\xb8\x69\xd9\x8b\x54\x4b\xbe\x7a\x4f\x27\x19\x01\x99\xc9\xf5\x54\x1b\x92\xb8\xc1\xf8\xd9\x4a\x25\x4e\x57\x26\x6f\x10\xc4\x9b\x11\xdc\xe2\xf5\x05\x89\xd3\xd6\xc2\xc3\xe4\x43\xc5\x05\x1b\x4f\x3c\x9a\x96\x31\x4a\xee\x7b\xe5\xb5\xd7\x0b\x3e\x31\x3d\x5b\x4f\xe5\xf9\x44\x23\x9d\x46\x85\x34\xd0\x64\x10\x6a\xd4\xab\x39\x86\x42\x17\x05\xf2\x1e\xe2\xbd\xab\x56\x07\x0a\x05\x72\x1c\x0d\xcb\x4a\x3b\xce\x62\xd0\x27\xd6\x51\xc4\x12\x33\x12\x13\xa7\x08\x8b\x10\x70\x23\xc4\xa0\x8e\x27\x65\x17\x38\x57\x9a\xe1\x10\x1a\xe9\x51\xa4\x12\x93\xdf\x5b\x8a\x62\x6c\xca\x21\x7e\x53\x17\x78\x50\x97\x46\x09\x5a\x9d\x4b\x7a\x99\x45\x8c\xbd\x7d\xbb\xd9\x65\x74\xe9\x79\x31\x00\x66\xe2\xfc\x64\x17\x97\x4b\xef\xb6\xcd\x44\x01\x94\x1c\xb5\x2c\x0b\x49\xf5\xcf\x87\xc7\x53\xb2\x16\x4f\xa9\x4c\xe7\x98\x0e\x00\x0d\x83\xd6\xe6\xe3\x73\xeb\xb9\xdf\x77\x85\x99\x2e\xb5\x96\x8f\x08\x1d\xee\x79\x53\xbf\xf7\xaa\xdc\xc2\x22\x00\x8e\xce\x61\x3f\x6e\xfe\x92\xdc\x5a\x4e\x16\x5a\x1d\x1a\xe7\x49\xc1\x71\x00\x13\x1c\x2d\x52\x38\x16\xa7\xc6\xd0\xd1\xdb\x79\xd8\xc1\xc3\xc1\xbc\x62\x9f\x65\x67\x98\x4a\xba\x8f\x91\xf1\x1f\x85\x83\xba\xee\x5a\x09\x95\x74\xca\xea\x99\xd1\x13\x7d\xe1\x51\xe9\x55\xf2\x6f\x2f\x70\x30\x4b\xd6\x6e\x38\xe7\xce\xfd\x11\x84\x72\x22\xb7\x98\x4a\x6b\x0c\x4c\xf3\x35\x07\xa7\x2b\xfd\xd4\xf0\xa3\x98\x27\x59\x67\x76\x26\x4d\x51\x07\xb4\x2f\x73\xf4\xa8\x8a\x56\x07\x11\xc8\xa0\x3e\xb2\x38\xa1\x79\xb1\xaa\xa0\x6b\x92\x2f\x0f\x87\x6d\x08\x45\x62\x6b\x53\xe7\x1a\x44\xe4\xf3\xa6\x97\x77\x89\x31\xf2\xe3\x4d\xec\xff\xda\xb1\xe2\x90\x5c\x7a\x48\x88\xc4\xa4\xb6\xd8\xd4\xed\x8e\x8a\x30\x9c\x95\x1e\x24\x88\xdd\x31\x14\xdc\xf5\x6c\x62\x2e\xc8\x30\xa0\x6a\xaf\x20\x24\x8e\x59\x2b\x73\x5c\x73\xc6\xd5\xeb\xbf\x40\xa6\x53\xf2\x3f\x2d\x48\xb3\x0b\x83\xef\xd6\xfd\x06\x14\x2a\xf6\x4a\xa2\x38\x06\x85\x11\xd5\xdc\xcd\x68\xde\xcb\xca\x9b\x4a\xf7\x68\xb1\x63\x7b\xc1\x56\xdb\x20\x8b\xb5\x8d\x56\x3f\x48\x3f\xd5\x01\x84\x52\xdb\x8d\xa9\x50\x63\x90\xaf\x8e\xe4\xac\xd7\xe4\xa5\x1e\x3a\x79\xf8\x71\x61\xa8\xd0\xfe\xb2\xcf\x16\x4c\xfa\x18\x3b\x3b\x7b\x23\xfd\xfc\xd2\x12\x07\xc7\x25\xa5\x6f\x33\xe5\x18\xb6\x04\x51\x17\x79\x3e\x9f\x5b\x5c\x32\x55\x5f\xbc\x08\xb9\x14\x21\x62\x1d\xe7\xd9\x50\xed\xe2\x47\xad\x95\x0e\xe4\x35\xc0\xdc\x87\x52\xaa\x2e\x31\x92\x00\x36\xd6\x4f\xc4\xcc\xfe\x74\x8f\x74\xe2\x91\xef\x16\xfc\x35\x65\x0b\x4b\x96\x21\xc3\xc9\x0e\xdf\xb8\x64\x50\x20\xbd\x45\x0b\x26\x4d\x13\x8c\x66\x73\x88\x64\x56\x80\x8a\xbf\xdf\x82\x75\xd3\x66\x2a\x07\x46\xaf\x98\x78\xfe\x9e\x01\x36\xd5\x4d\x63\x2a\x39\x7f\xb7\xd7\x68\x73\x73\xd2\xfd\x18\x73\xc9\xbc\x5d\x82\x35\xbb\xce\x96\x81\xf4\xbd\xed\xd1\xba\xcb\xd3\x1b\x07\x14\x82\xf0\xd4\x61\xcf\x53\xe3\xa2\x63\x70\x18\xbf\xf4\xde\x7f\xc6\x70\x2f\xb6\x3b\x46\xc5\x2c\xca\x2c\xe5\xd9\xa2\x20\x5a\x8e\x9d\x04\x8e\x7d\xe6\xa4\xed\x9d\x41\x38\x64\xba\x14\x3a\x21\x55\x52\x3f\x63\x6b\x10\xe5\x2c\x16\x02\x2a\x7e\x2d\x94\x6a\x5c\x33\x32\x55\x23\xfb\xff\xb9\xba\xb2\x34\xc5\x75\x25\xbd\x17\x5e\xea\xe5\x6e\x4a\x1e\xc0\x4e\x6c\xcb\xc7\x03\x14\xb9\xfa\xd6\x3f\x84\x4c\xf5\xed\xfe\x0e\x82\x24\x29\x12\xac\x50\x0c\xff\xf0\xc5\x01\x1a\x7d\x65\x85\x4c\x00\xe9\xcd\xaf\x80\x00\x0d\xfa\xf7\x65\xb9\xc6\x05\x30\x5b\xf2\xf6\xad\x3d\x96\xb8\x96\xe2\x6c\xe2\x3c\xda\x4e\x74\xfa\xc4\x07\x7e\xc4\x93\x68\x04\xcf\xd1\x3d\xf9\x1f\xc0\xb5\xdc\xdb\x10\xa1\x15\xa2\x90\x0a\x7b\x53\xb4\x54\xb0\xa9\x25\xfb\x45\x53\xe0\x80\xf2\xb7\x17\xb0\x94\x99\xf2\x54\x4d\x7a\x5f\x29\x6a\xf4\x0e\x26\x17\xee\x97\xad\x55\x75\x14\xe2\x60\x5c\x5a\x7d\x9d\x61\xe7\xb3\x0a\x88\x48\xcb\x21\x7e\x94\x4d\x4e\xb5\x4f\xd0\xd4\x19\x70\x6a\x95\xdb\xa4\xb6\x1d\xab\x7f\x11\x0e\x00\xc9\x8b\xdd\x84\x21\x26\x71\x70\xaa\x34\x15\xc6\x1b\x7c\xe2\x2e\xa2\xb9\x99\x80\x7e\x55\x62\x73\xcd\x59\xc6\x2d\xac\x3e\xfb\x52\x40\x5a\xe1\x00\x5f\x2e\x23\xcf\xc2\x92\x73\x9f\xd1\x74\x55\x83\x2d\x2a\x1d\xe0\x88\x79\x7d\xb8\xb7\xb4\xc5\xa4\x79\x1b\x0d\x74\x51\x65\xa2\x1a\xa8\x24\xa8\x86\xa4\x0a\x59\xaf\xc6\xc4\x7a\x5a\x13\xc0\xb8\x7a\x5d\x27\x6d\x78\x4d\x80\xdc\xef\xd6\xfc\xaa\x4b\x34\x82\x91\x9a\x34\xe3\x86\x61\x46\xf8\x05\xe2\x0a\xd0\x59\xcf\x02\x5b\xbb\x99\x89\x71\x17\x56\xea\xc1\x32\xc7\xb0\xf5\xd4\x04\xd6\xfd\xe8\x69\x6c\xb6\x68\x1b\xff\xf8\xb8\x00\x5a\xb9\x02\xdd\xa1\xa1\x27\xe2\x08\x7f\x34\xcf\x76\xff\x85\xa7\x98\xb4\x29\x1d\x46\xd9\x97\x37\xb2\xa9\x7c\x20\xb3\x7a\x73\x49\x1d\x79\xb5\x9f\x19\x7d\xfa\x40\xe6\x44\xea\x7a\x4f\x7f\x75\xa0\xfe\x3d\x2a\x00\xb6\x64\xed\x15\xb2\x57\xc9\x02\xf2\xd1\xc9\xef\x25\x38\xb8\xdd\x68\xb4\xbe\xfd\xba\xb6\x00\x9f\x43\x79\x3c\x0a\x6e\x34\x09\xe2\x34\xdd\x04\xb5\x4c\xfb\x99\x02\xb4\xd6\x7c\x1e\x39\x1a\x40\xbf\xbf\xd1\xaf\xdd\x02\xa2\xea\x4e\xac\x9c\x5b\xa2\x0d\xaf\x73\xd3\xcd\xe8\x77\xaf\xc0\x70\x61\x12\x38\x19\xb5\x5d\x31\xa9\x99\x1e\x55\x1f\xd1\x65\x86\x5c\xab\xcc\x0c\x21\x02\x15\x13\xde\xa3\x5f\x65\x6e\xae\xd8\xf4\xa5\x3f\xaf\xcb\xad\x3e\x02\x2d\xe2\xcd\x6c\xea\x52\x63\xc6\x20\x38\x5a\x7c\x67\x24\x5c\x59\x57\x0e\xda\x42\x65\xfb\xde\x42\xfa\x47\x5c\x71\x68\xe7\xc9\x01\x7a\xac\xf9\x46\x49\xb8\xfd\xca\x73\xbf\x05\x16\x09\x76\x32\xea\x90\xcc\xb0\x70\x9b\x54\x22\x94\xf4\x15\xcd\xdb\x53\x47\x93\xc3\x0a\xb5\x11\x74\x1a\x95\x5c\x2a\xc4\x83\xfa\xc5\x6d\xc1\xa1\xfe\x09\x8f\xbe\x67\x09\x4e\xb0\xb7\xa6\x73\xc6\x76\xf9\x8b\xf7\x88\xa6\x14\xfd\x1e\xcc\x6c\x2a\xd1\x14\x9a\x41\x24\xba\xa9\xc4\xbe\x49\xe0\x23\xb2\x55\x1e\x42\x02\x1e\x4f\x7d\x53\xfd\xb5\x49\xfe\xd4\x35\x92\x6c\xdb\x17\xa2\xe5\xfe\xea\x3b\xdb\x0d\x96\xf4\xc7\x85\x16\x34\x3d\x2f\x67\xe7\xb4\x3c\x5d\x41\x55\x46\xc7\xf1\xa9\x03\xb8\xb1\x01\xbe\x66\x64\xa4\xa9\x02\x0d\x80\x92\x3a\xc4\xb0\xa9\x51\xe1\xc8\x4b\x50\xb1\x4b\xb0\x35\x2f\xa7\xff\x1b\xce\xd5\x25\x32\x18\x49\xb1\xb7\x97\x26\x64\xa9\xa9\x30\x18\xf5\x64\xee\x6d\x2f\xbf\x12\x52\x50\x3d\x05\x71\x47\xa7\x1e\x29\xb5\xbe\x00\xda\xfa\x51\x02\xb5\xcf\xc4\x7a\x43\x5d\x72\x23\x9f\x84\xfb\xb8\xd4\x51\x75\xc0\x52\xd6\x5f\xf6\x45\x8c\x2c\xc2\x40\x19\x07\xed\x41\x70\xa9\x87\x3d\xb4\x6b\x43\x8c\x71\xea\x3d\x01\x0e\xde\xc1\x94\xaa\x23\xcb\x94\x42\x77\xb2\x1c\x50\x25\x4a\x58\xb9\xf4\x0c\xb6\xd5\x0f\xf7\x87\xcb\xfd\x64\x60\x30\x44\xfe\xcf\xf5\x8a\x41\xd6\x57\xc5\xa1\xf4\x70\x24\xa0\x08\x42\x1b\xa0\x89\xc7\xe4\xe6\xe8\x03\x2f\xa7\x3c\xc7\x20\x62\xbb\x1b\xc4\xdc\xd7\xad\x1a\x1c\xac\x67\xc4\x91\x7d\x0d\xdb\xb3\x1d\xe3\x08\x2b\xe0\x3d\x94\xc0\x0f\x51\x2b\x74\x1a\x66\x97\x3a\xad\xb7\xfa\x57\x49\x0b\xce\x2a\x22\x08\x5b\x38\xf5\xce\x61\xbc\x11\xd8\xe4\x50\x02\xe3\xc5\x57\xb2\xa4\x29\x62\x0c\xfe\xea\xfb\xe4\x28\xd4\x3b\x48\x2b\x2f\xdf\x28\x43\x78\xa3\x7e\xe4\x1e\x3d\x4c\x52\xbf\xaf\x0b\x72\xd2\xcc\x23\x8a\x8b\x5f\x0c\x97\xd4\x0a\xe0\x25\xc8\x93\xa2\x54\xf9\xda\xcf\x07\x1b\xf8\xd0\xd2\xbd\x5a\x40\x21\x93\x0d\x62\x9b\x35\xb5\xd6\xb2\x0d\x2b\xd2\x68\xaf\x72\x0b\xbb\x58\x35\xe5\x3b\xbe\xd2\xc5\x4b\x47\xfb\xd2\x79\xd8\x6b\x7f\x6f\x8e\x5e\x12\xca\xca\x9c\x62\xe4\x17\xec\x9e\xb0\xbf\xf5\xb9\x55\x51\x90\x4c\x92\xca\x21\x90\xef\x12\xd4\x5c\x95\x10\xbd\xbf\x21\x45\xf2\x96\x73\xbe\x44\x58\xc3\xa6\x16\x72\xee\xd4\x04\x80\xcb\x8f\x0a\x42\x31\x5e\xf7\xdb\xb7\xb7\xfb\x35\x4f\x8e\x91\xf9\x38\x7f\xd1\x2c\x70\xa7\x0d\x81\xbb\xb1\xc5\x7c\xb7\x24\xa8\x36\x59\x1f\xac\x33\xd1\x73\xc6\x02\x3c\x49\xc8\x4d\xc8\xa5\xd9\xc1\x6d\x0b\xf0\xc9\x23\x84\x2e\xa0\xcb\x8f\xf9\x4c\x5c\x7a\x8f\x73\x0f\xd9\x0d\x57\x89\xbd\x26\xdc\xb7\x6f\x8c\xe6\x78\x79\x99\xc7\xa9\xf6\x3b\x86\x33\xe5\x12\xd4\x4c\x39\xbf\xfb\x84\x53\x11\x40\x77\x93\xbe\xea\x64\x96\x38\xa2\x7a\x8f\xa6\x08\xce\xbb\x11\xa8\x5c\xab\xe0\xa4\x1c\xa3\x3a\x9c\x6c\x30\x72\xf1\x5a\x79\x95\x49\xbf\x6f\x59\x4c\x6d\x00\x7e\x46\x07\x23\x87\xd2\xbc\x54\x3b\x28\xf0\x79\x77\x8b\x95\xb9\xc5\xca\x9f\x67\x00\xf1\x95\xd4\xa9\x83\x7d\xfb\x9f\x9d\x4a\xa4\xef\x25\x48\x11\x28\xe7\x25\xf6\x24\x23\xde\x26\x5f\xcc\xe5\x63\x5d\xdd\x54\x39\xc2\x6f\x1c\xc4\xc5\xf0\x05\x01\x2f\x62\xab\x1d\x2c\x5e\xe5\x5b\xb6\x32\xfa\x91\xb3\xfa\xa1\x25\x1a\x59\xa7\x49\x43\x70\xf2\x7a\x14\x6f\xcf\x29\x5c\x92\x09\x5b\xc6\x6d\x8c\x94\x30\x12\xd9\x2a\xf2\xa6\xe4\x37\xad\xc1\xc6\x22\x8d\xb9\x97\x61\xa5\x17\x5e\xe9\x52\x09\x88\x51\x5b\x77\xfb\x9e\x98\xf0\x27\xc0\xd1\x8b\xfa\x37\x7d\xb5\x3c\x17\xe4\x36\xed\x44\x10\x3c\x91\x5c\x92\x4f\x80\xf3\xd8\x10\xc4\xaa\xc0\x6d\x00\x2e\xe9\x90\x4c\x8c\x9d\x99\xe5\xe3\x9e\x00\x62\x70\x7f\x83\x1a\xc8\x2e\x17\x47\xda\x5f\x9d\x84\x83\x0d\xa7\x8d\x9c\x6c\xec\x7d\x1f\x0d\x5d\xb8\x13\x61\xcf\xab\x32\x6b\xda\x61\xae\xb0\xc8\x66\x1e\x8e\x87\xad\xe8\x1c\x96\x17\xba\xc2\xcb\xe5\xac\x76\xf6\x76\x5e\x80\x55\x2b\x32\x34\xb5\xf7\x31\x55\x8c\x1d\xa2\x61\x04\xca\x68\x8c\x0f\x94\xfe\xad\x40\xae\xf8\x71\xdf\x3e\x6d\x2c\x59\x12\xb8\xc1\x92\x68\x38\xcf\x55\x42\x4c\x9a\xc4\x69\xbe\xa2\x4b\x2f\x34\x9c\x61\xa9\x1b\x2d\x87\x34\x29\x6c\x9a\x05\xa9\x0f\xe9\x93\x34\x9d\x33\x86\x0c\xee\x9b\x0a\xa0\xc7\x39\xd6\x06\x99\xf7\xba\xcc\x9c\xb5\xaf\x8f\x5c\x2e\x0f\x8f\x4f\xda\x18\x9c\x96\x65\x76\x3f\x63\xdc\xcc\x53\xdb\x57\xf9\x5d\xd1\xc1\x53\xb1\x16\xfa\x72\x92\x2f\x8c\x6c\x40\xd3\x35\x37\x35\xca\xb7\x13\x57\x1b\x8d\xdc\x74\x05\xf1\x50\xf5\xe1\x7e\x84\xcd\x99\x98\xa5\x96\xf2\xc3\xdb\x5a\x4a\xb9\xeb\x77\xb8\x94\xc3\x3c\x6d\x82\x03\x62\xcb\xdf\xcf\x90\x49\x9a\x47\x7b\x71\xcd\xde\x67\xcf\xcf\x92\x76\x35\xe8\x9e\x8b\xf6\x4f\x39\xcc\xd5\x08\x86\xd1\x69\xb5\x7f\x8e\x6a\x31\x8e\xf5\x52\xd7\x4c\x1e\x7b\x97\xb2\x91\x87\x71\xee\x6a\x2a\x7b\x87\x54\x9c\x4e\x54\x28\xaa\xda\xe4\x55\xbd\xb6\x9b\x9c\x87\x97\x36\xde\xff\x7d\x0c\xb3\xd5\x3b\x00\xcf\x46\xea\x1a\x31\xd7\x7d\xf6\x28\x46\x93\x06\x78\xda\xd3\xd2\xde\x7a\xd4\x1a\x9f\xb2\x50\x56\x2b\xbb\xf7\x15\xb9\x71\x86\x03\x4d\x6b\xfa\x91\xc1\x1c\xbf\xba\x2a\xbf\xf2\x8d\xe8\xbf\xe6\x0a\x3f\xd4\xe1\xd0\x5a\x6e\x99\xbe\x5a\x35\x9f\x23\xc7\x4d\xc7\xfb\x64\x36\x49\xb3\x55\xbc\x0d\x26\x64\xee\xd0\x8e\xdb\x31\x98\x28\xd9\x90\x75\xdd\x04\xa0\xa5\x41\x8b\x42\x90\x60\x36\xf5\x0c\x86\xbf\xe6\x7f\x37\x07\x5f\x5e\xb9\x54\xc7\x0d\x6d\xfd\x81\x43\xe2\x72\x53\x2e\x8c\x97\x9d\xd7\xf0\xd6\x8c\x42\x60\x1f\xa5\x6a\xc3\x97\x4f\xcf\xa9\xbe\x79\xcf\x5a\x52\x83\x22\xcc\x0a\x76\xa8\xfb\xf0\x0a\xc5\xeb\x45\x8b\x2d\x94\xd8\xff\x9f\x23\xf9\x7f\x92\x92\xd3\xe0\x9a\xaa\x9a\xda\x96\x40\xdd\x87\xbe\xe6\x16\xa0\x01\x78\x6a\x54\xb1\x23\x66\x52\xca\x46\xaf\x95\x12\x4f\xaa\xf0\xb4\x82\x08\x95\xd0\x28\xb8\x09\x8b\x96\x85\xd1\x5e\xa5\x4a\xed\x87\xe0\x5e\xda\xda\x90\x3e\x54\xe5\x0e\xcd\xb7\xb2\x35\xb3\x12\xd9\xae\x9b\x62\x04\x0d\x5d\xb2\x5d\xb0\xd7\xfc\x34\xfe\x55\x7d\x36\x95\x75\xd7\x0c\xca\xd0\x43\xd2\x2f\xbc\xe6\x00\x56\x66\xbf\x20\xe0\x5a\x30\x62\x48\x9f\xda\xfc\x78\xc0\x12\x51\xfd\x29\x5a\xc2\xba\x90\x99\x5e\xa6\x4d\xee\xe5\x80\x69\xbc\x37\x41\xa7\xc2\x09\xe5\x0c\x60\x8d\x0a\xb3\xe3\x97\xeb\xe6\xf0\xb6\xd5\x52\x1c\xc8\x73\x3f\x3a\x35\x51\xd3\xf6\xbd\x5b\x6b\xa4\xad\xa8\xad\x82\x84\xc9\x69\x65\x15\xe4\x6b\xd2\x6e\x69\x48\x9b\xdd\xa8\xca\x39\x04\x46\xd4\x64\x03\x9c\x76\xee\x0c\xb6\xd3\xf0\xf3\x73\xdd\x15\xdf\xce\xe5\xd2\xf0\x38\x46\xe6\xa6\xfb\x1b\x2d\x6b\x56\x34\x6f\x6e\x51\x5e\x4c\x6f\x9d\x9b\x1c\x15\xb8\x73\x12\x79\xe3\x8d\x35\xcd\xb4\xb2\xb9\xbe\x55\x84\xc1\x91\x4b\x25\xe5\x66\xc8\x1a\x67\x26\xdc\x54\x9d\x0e\xc2\x23\x56\x07\xa6\x3b\xd3\x20\x58\xf2\x1a\xe2\x80\x4f\xa3\x02\xd1\xe9\x1b\x8b\xf3\x39\xfd\x1b\x82\xb4\x33\x9f\xd3\x5b\xda\xff\xc6\x22\x5d\x57\xc3\x97\x55\xe9\xe4\x73\x7a\xd2\x1e\x9d\xaa\x25\xcd\x53\xf8\xf9\x67\x8f\xff\xfe\x28\xa2\xcb\x31\xd6\xc5\x34\xcd\x26\x16\x22\xd2\x3c\xae\x9c\x23\xd3\x44\x45\xaa\xe8\x51\x2e\x8c\x6e\x18\x6f\x55\x21\xd6\x60\xb4\x90\x80\x05\x7a\xa1\x9a\xc0\x7d\x9b\xd4\x54\x49\x1f\x27\x8f\x54\x23\xaf\x26\x0d\xf6\xf9\x8e\xc1\xe3\xf6\x31\x91\x87\xc4\x5c\x23\x99\x60\xea\xea\x0b\xc7\x72\xf9\x21\xf2\x55\x63\x58\xe7\x32\xb9\x4e\x43\x1d\xc2\xf8\x0d\x36\x3d\x1c\x51\x5e\x42\xac\x05\x6b\x4f\x2d\x11\x5b\xb6\x71\x6c\xa0\x39\xa5\xba\x63\x36\x86\xe6\xe1\x5a\x5e\x91\x20\x98\xf7\x07\x80\x7a\x5b\x88\x2b\x74\xbf\x72\xc9\xb5\xd1\xed\x62\x07\xa5\x65\x97\xe4\x9c\xa8\xee\x53\x52\xc9\xeb\x60\xd5\x25\x75\x97\x16\xfe\x24\x2a\x3b\xf9\xe3\x01\x60\x5d\x46\x33\x1f\xfa\x47\x35\xd5\x7a\xf5\xd3\x97\xee\x5c\x39\x7a\x0d\xc7\x2a\x5f\xf9\xea\xcb\xed\x16\x44\xbf\x68\x9e\xb0\x64\x8e\x6c\x2d\xd4\x99\xd7\x3c\x7d\x38\x9a\xba\xb1\x13\xc7\xdf\xea\x17\xef\x31\x81\x3f\x0c\x00\x83\x8e\x6c\x95\xc3\x84\xae\xae\xd0\x8d\xbd\x10\x07\xec\x9d\x85\xa3\xe1\xf1\x09\xae\x97\x82\xfd\x34\xda\x61\x6e\xea\xef\x47\xb6\x16\xc3\x4f\xb6\xf3\xc4\xcf\x38\x7b\x02\x3c\x7e\x95\xca\x8c\x4a\x73\x15\xb0\x18\xaa\x82\x51\x09\x4f\x4c\xd9\x06\xff\xfa\x00\xb4\x4c\x5e\x83\xf4\xd9\x7b\xac\x99\x2a\x8b\x79\x3b\x9a\xcd\x9a\xd4\xe5\x38\x47\x77\x85\xd3\xaf\x20\xdf\x6a\x88\x30\x85\xed\xde\x1d\xa8\xc3\x41\x73\xf5\xfb\x18\x0e\x1a\x6b\xed\xf8\x83\xe9\xec\x5e\xf0\x3d\x3c\xba\x5a\x20\x96\x63\xe4\x85\xe6\x4b\x5c\x9c\x55\x2d\x13\x50\x8a\xda\xc8\x09\x3d\x03\x55\x30\x53\xf8\x90\x0c\x62\x61\x35\x25\x3d\x72\xda\x97\x3a\xcf\x12\x42\x46\xa1\x01\xe9\x89\xe3\xbe\xb4\x92\x4a\xba\x94\xf8\x64\xbf\x96\x98\x4c\xa7\x80\xb0\x38\xbd\x7e\x4b\xba\xe9\x1d\x22\x0d\xef\x5e\xe4\xb7\x12\xd8\x9e\xb5\x4b\x54\xc5\x57\xa2\xcd\x97\xab\x06\xab\xfc\x1b\x7c\xc6\xfe\x63\xfc\x74\x78\xa6\x7b\x94\x78\x26\x76\x36\x2a\x04\x71\x45\x89\xb4\x71\x4d\xba\x9f\x0d\x74\x99\x16\xaf\x47\x0f\x2b\x92\x89\xdc\xa1\x50\x42\x61\x8b\x9b\x81\xba\x77\x6b\x71\x2d\x34\x7a\xd9\xab\xc4\xdf\xee\x1e\x77\xab\x0e\x3f\x28\xdf\xfa\xe2\xb9\xa7\x5d\xb7\x8c\x1c\x2e\xdc\xe8\x80\x8f\x67\xff\x77\xff\x3b\xff\x48\xcc\x65\xb5\xff\x1b\xe6\x65\x51\xa2\x57\x60\xec\xca\x3a\xa1\xd3\x1e\x68\x05\x74\xa2\x48\xe8\x47\x43\xb6\x45\x06\x76\x33\x4e\xf3\x08\xb3\xcf\x3e\xbf\x4c\x58\x46\x02\xab\x68\x9b\x03\x9b\x53\x2a\xa5\xcf\xe2\x2a\x12\x34\x31\xb3\x80\x5a\xf4\x63\x71\x81\xef\x41\x0f\x90\x36\xe0\xcd\x0a\xcc\xba\x74\x2d\x43\x7d\x13\x83\xce\xff\xcc\xc3\x46\x3f\x48\xe2\x6c\x86\x60\x7f\x0d\x20\xac\x84\x6f\x06\x5a\xc2\x0d\x17\x57\xe4\x2e\x63\xb6\xa0\xff\xa4\x98\x58\xf9\xca\x03\xfa\xac\x8d\xb6\x49\xd9\x2e\xa9\xfb\x72\x2d\xdb\xd8\x23\x69\x28\x37\xe2\x87\x92\xcd\x10\x9c\xb1\x09\xd1\x33\xf9\x54\x14\xd3\x56\xe8\xd0\x7f\x04\xa5\xa0\x65\xad\xbc\x6c\xea\xc3\x05\x61\xfc\xeb\x46\xe6\x3e\xa8\xca\xd9\xad\x36\x40\xf7\xf3\xc4\xaf\x73\x37\x45\xe4\x20\x7a\xba\x7c\xa9\x2a\x0e\xca\x39\x6c\xa7\x8d\x89\xd9\x6e\xf2\x3c\xc1\x8c\x3b\xe4\x64\x91\xf9\xad\xf1\x85\xe5\xf3\x90\x6b\x49\x89\x22\x5e\x34\x55\x33\xbb\x7c\x3a\xaa\x39\xdd\x1e\xd4\x89\xf9\x8e\x17\xf9\x21\xfd\xbd\xf6\x5c\x10\x45\x53\xa5\x9f\x1f\x1a\x63\xdc\xbe\xd9\x7a\x0c\x35\x25\x63\xe1\x5c\xe2\x31\x29\xd5\xba\xc6\x7e\x3e\x2c\x7d\x67\xea\xd5\x4e\xc1\x48\xdf\xdf\xd7\x4b\x29\x93\x28\x1b\xfa\x02\xaf\xba\xb3\xbc\xe9\xe8\xec\xb8\x57\x17\x33\xf7\x4b\xdd\x1a\x87\x6b\x05\xc2\x03\xc5\x63\x23\x90\x4c\x11\xd5\x8b\xfe\xaa\x6f\xdd\x69\x09\xf4\x8b\xe3\x6b\x3e\x86\x8b\x1c\xcc\x41\xfb\x8d\x70\xd1\xad\x37\x76\x20\xc9\x2b\x90\x23\xad\xdd\x22\xa0\x89\x3b\xdf\x7a\x98\x72\xca\xe4\x53\x4b\x26\x31\x31\x72\x97\xeb\xf6\x29\xc6\x8c\x54\xa6\x83\x3a\xb6\x55\x22\xa8\x6d\xb3\xae\xcd\x55\x76\x11\x0f\x4a\xfb\x8f\x84\xf8\x85\x40\x38\xae\x48\xa7\xe7\x37\xf0\xab\xb6\xfd\xda\x3e\x44\xc1\x4b\x14\x61\x30\x79\x3a\xa7\xda\x47\x9f\xab\x61\x1d\x81\x19\xba\xae\xb4\xf0\xc1\xb3\xe8\x7e\x34\xfc\x9c\xec\xd3\x7f\x40\x41\x64\x8e\x31\xf1\x8a\x0b\x26\x52\x3c\xb4\x97\x4e\xa7\x76\x5b\xff\x73\xda\xa3\x05\xea\x49\x39\x86\xee\x9c\x9d\x74\x8e\x30\x71\x04\xcf\xda\x03\xf3\x39\x9b\x98\xa4\x6a\x48\x45\xad\xf0\x3f\x63\x9d\x58\xcd\x3e\x01\xe7\x74\xd9\xff\x1f\x76\x2d\xdf\xcc\x66\x72\xee\x0e\x6c\xb6\x22\x92\xd0\x82\x37\x9a\x44\xf4\x31\xf9\xc5\x77\x58\x52\x4d\x09\xe0\x9d\xc6\x89\x80\x9c\xa8\x19\x23\xa5\x40\x70\xe9\x9e\x71\x5e\xe0\x57\x55\x02\x4f\xca\x65\xee\xd1\xcc\x80\x3f\xde\x7e\x0b\x9f\xbc\xa8\x11\xc6\xdf\x54\x25\xff\x89\x58\xd7\x58\x0e\x00\x93\xea\xc9\x32\xbc\x93\x69\x15\x12\x10\xf3\x29\xcb\x7c\x39\xc0\x27\xb5\x5c\xad\xa6\xf7\x3e\x7b\x79\xe5\xc7\x66\x78\x8d\x17\xc0\xc8\xde\xc8\x51\x58\x5b\x22\x32\x76\x4a\x95\x2b\xc2\x1d\x7c\x9b\x7b\x1d\x93\x3d\x9c\xba\x35\xa7\xf4\xb7\x44\x77\x6e\x00\xa2\x7c\x07\xd6\xa6\xb1\x16\x6f\x09\xac\xd2\x1f\x98\x68\xd1\x93\xee\x76\x8e\x7a\xa9\x35\x08\x2e\x97\x61\xe0\x09\xa0\x19\x95\xb7\x62\xcd\xdf\xe4\xb7\x59\x9b\x87\xe7\x22\xd6\xd5\xcd\xec\xa7\x8a\x67\x2a\x1f\xb9\x91\x6c\x30\x4d\xb4\xd5\x86\x6b\xa5\xc0\xb5\x6a\x53\x98\xa4\xb9\x97\x4b\x4f\xe7\x69\x0d\x32\x72\x90\x68\xed\x53\x1e\x03\x8d\x2b\xc1\x17\x1e\x0e\x2a\xef\xda\x18\x9e\xf5\xa9\x5c\xd6\xb9\x9b\x36\x6b\xd1\x56\xfd\x3d\x16\x3e\xb8\x2d\x5f\xb8\xde\x4d\x9a\xfa\xa0\x63\x58\x87\xda\x12\x09\x15\xaa\x2f\x8b\x16\xd7\x3e\x57\xdb\x90\x9a\xd1\x71\x6f\x4a\xd6\x64\x80\xac\xa4\x7f\x13\xa3\x70\x95\xd7\xa0\x65\x79\xdb\x06\xdb\xe6\x66\x77\x2c\x27\xa6\x3a\x83\xe7\x5e\x1a\x9c\xd0\xe1\xeb\x05\xc2\x9b\xdb\xf9\xdc\x04\xc6\xa2\x1a\xb3\x3b\x8e\x5f\xae\x1f\x73\x00\x77\xca\x77\xd5\x9f\x3e\xdf\x25\xe1\x09\x85\x21\x6e\xfe\x72\x30\x7c\x42\x06\x7c\x03\xb4\xfc\x2a\xaf\xa3\x97\xce\xb0\xbf\x89\xfa\x9e\x77\x15\x87\x0f\x0d\xa7\x09\x36\x08\xaf\x6f\xc0\x9d\xa6\x00\x7c\xb7\x97\x6c\x3c\xf8\x5d\x9e\xfd\xf7\xa8\x39\x25\x8c\x75\x59\x17\xf6\x2d\x87\xa9\x6d\x2c\xe5\xf8\x75\x4e\xee\x68\xe6\xcd\x1f\x1b\x27\x42\x97\x34\x74\x07\xd5\x6a\xe1\x5e\x1a\x19\x00\xd6\xce\x57\x7b\xf9\x37\xa2\x51\x1b\xc0\x85\x56\x4e\x35\xed\x64\x7c\xb1\x8c\x21\x3d\x10\x22\x40\x4b\x7b\xe6\x2b\x65\x08\x51\xa2\x26\x06\x23\x65\xaf\x94\x42\xdb\xed\xfa\x3a\x69\x4c\xe4\xb3\xd9\xbd\x3e\xea\x2e\x1d\x1d\x98\x7d\xd8\xd9\x9d\x26\x84\xdc\x68\x9d\x21\xd8\x12\x41\xe4\x43\xc4\x70\xdd\xa8\x70\xab\x9d\x75\x12\x53\x77\xae\x4e\x45\x4b\x12\xe2\x1d\x51\xbe\x6b\xde\xe4\x92\x31\xec\x9c\x19\x96\xf3\xad\x6e\x8e\x63\x10\x8f\x20\x5c\x00\xd8\x05\x85\x79\x0d\x37\x58\xf5\x39\xa4\x64\x8e\x6a\xe3\x92\x9d\xaa\xa5\xbe\x60\xcc\x84\x05\xe8\xfe\x15\x37\x1e\x29\x6f\x2f\x42\x74\x9b\xfd\xd7\xef\x61\x63\x9a\xe4\x6b\x65\xb2\x95\xb4\x24\x6e\xff\xbb\x6c\x2f\xab\x40\x21\x55\x1c\x32\x58\x01\x6e\x3c\x51\xbf\x8a\xff\x24\xa2\xb4\x39\x65\x6a\x85\x6e\x4a\xb0\x67\xa8\x1b\xbb\x83\x2e\x71\x26\x00\x23\x2a\x9f\x15\xf3\x4d\x7e\xcc\xcf\xde\x34\xeb\x9f\xfc\xc9\xb6\x53\x7a\xc1\x3a\xb6\xb9\x5c\x61\xb1\x61\x6f\xd6\xd8\x39\xeb\xe4\x59\x92\x3b\x5a\x41\x79\x48\x6a\x10\xf7\x34\xfb\x65\x18\x5d\xf5\xcc\xe9\x62\x9d\x96\x2f\xc5\x43\x4d\x0f\xd1\x4b\x26\xfb\x98\x2f\xa3\x55\x69\x21\xe9\xa0\x00\x39\x86\x7d\xac\x90\x85\xe3\x89\xb0\x19\xac\x6a\xe5\xcd\x9e\x95\xb3\xab\x31\xf7\xe0\xcc\x80\x52\x27\x34\x09\x8f\xd2\xae\x1e\x2f\xad\xee\x38\x95\x5c\x34\xec\x5a\xf3\xf2\x63\x8f\x2b\x1c\x0f\x4e\x92\x39\x66\x8f\x16\x6b\xda\xba\x90\x74\x68\x2a\x91\xa3\x99\x84\xe9\x9a\xc2\x12\x4a\xc2\xf2\x80\x23\xc9\xf3\x3b\x91\xd5\xa0\xb2\xcc\x06\x51\xae\x9b\x4b\x46\x02\xbe\xf4\xe6\x6b\x99\x3e\xb9\xd5\x52\xe5\x8d\xfa\x81\x68\xd6\x1b\x31\xcf\xea\x54\x22\xc1\xb6\xef\x55\x89\x63\xfc\x46\x5e\xc0\x0f\xf1\x22\xc3\x40\x4c\xc7\xc7\xe5\xa6\x54\x2a\xb7\x53\xa3\xf1\x63\xb3\x11\x6c\xb8\x92\x2a\x3b\x3a\x34\x68\xc2\xc6\x2c\xf1\x8e\xd7\x7b\xcd\xfa\x39\x50\x55\x66\x65\x8e\x96\xd3\xf4\xa3\xd4\x8d\xce\xb8\x94\xcb\x3f\x45\x00\xa2\xda\x68\xb4\xfb\xc9\x38\x7e\x79\xdc\xd4\xbf\xa5\xc0\x78\x13\xdc\x11\x6e\x97\x3c\x1c\x72\x18\x4c\x46\xed\x66\x0c\x7e\x00\x80\x25\xda\xe5\x4b\xfe\x5c\x43\x47\x9a\xa4\xaf\x98\x14\xf0\x44\xf3\x5a\x4a\xeb\x90\xe9\xb8\xac\x46\xdf\x3e\xb8\x78\xb6\xf0\x36\x1b\xa7\x54\xb1\x61\x6b\x8f\xba\x25\x49\xbf\x72\x72\x53\xad\xeb\xd4\x52\xdb\x62\x1a\x35\x86\x6e\x3f\x99\x7d\xc1\x40\xa4\x1b\x83\x76\x9b\xba\xff\xe2\x87\x07\x84\xf1\xa7\xb7\xaf\x4b\x10\xfc\x58\xe1\x7d\x1e\xa5\x38\xf0\xc4\x61\x85\x5c\x71\x0c\x5a\xd7\xfe\xbe\x9d\xa3\xc0\x45\xbf\x7d\x23\xcb\x25\x34\x63\x2c\x18\x66\x6c\x10\x1b\x6b\x3e\x01\xca\xc6\xc3\xc5\x60\x6d\x61\xff\x23\xec\x59\x70\x10\x65\xba\x4f\xd6\xa6\x48\x6d\x30\x00\xcf\x2a\x2c\x28\x9c\x63\x72\x6e\x44\x85\x88\x90\x1c\xbc\xb9\x9a\xb8\x7a\x9c\x25\xee\x73\x08\x4b\xfc\x1d\x9c\xbf\x04\x15\xb0\x76\x58\x9b\x20\xfa\xaf\xa9\x7c\x09\xc5\x2f\x49\xc0\xa6\xa9\xfd\x92\x5d\x85\x88\xa6\x60\x71\x99\x23\xba\x06\x6e\xb1\x1b\x79\xd7\xc9\xdf\xea\x2f\x72\x4b\x5e\xef\x0b\xca\x0f\xaa\x84\x18\x54\xf9\x06\x97\x58\xa1\x42\x7f\xb5\xfb\x70\x90\x5b\x8f\xe6\x16\x67\xa9\xaa\x54\x78\xd9\xc7\x75\x75\x80\x6b\xe6\x2c\x06\x0a\xab\xbe\xb8\x73\x40\xe5\x92\x65\xde\x25\x28\x17\x3a\xc4\x10\xe9\xae\x56\x41\x7c\x62\xae\x13\x1d\x8c\xfe\xa2\x13\x88\xa4\x49\xd6\x65\xb2\xc1\xb1\x81\x7e\xd9\x6e\x76\x15\xaa\x82\x80\xeb\xd9\x84\xe4\x16\x81\xf0\x36\xc8\xe9\x75\x20\xa1\x18\x68\x07\xbd\x93\x0c\x05\xc4\x87\x57\x74\x26\xbd\xd5\x9e\x70\xa7\xa5\xf4\xf9\x10\x1b\xe3\x7b\x9f\xf3\x05\xa4\x0c\xa7\xe7\x98\xac\x4d\x01\xd7\xaa\x42\x6a\x8c\xce\x95\xe1\x52\x3e\xf0\x3a\x14\xc4\x68\x07\x45\x62\x95\x41\xc0\x5a\xd1\x64\x38\xe7\x48\x57\xe8\x2e\x68\x6c\x00\x84\xfc\x8d\xc2\xdd\xe6\x40\x94\x57\xe5\x57\xb4\x7d\x55\x65\xab\x87\xa4\xeb\xf5\xe1\x63\x26\xe4\x67\x19\xf6\xa7\x50\x8e\xed\xb6\x52\x8b\xd8\x55\xa7\xcb\xbb\x3e\x0b\x58\xd8\x8a\x4b\x2c\x37\x9a\x48\x71\xaa\xc2\x79\xbf\x45\x77\xa2\xe4\x37\x15\xb5\x5b\x22\x21\x87\x21\x2d\x2d\x38\x3c\x37\xc3\xec\x34\x8e\x00\xe3\xf2\x03\xe3\x8b\x73\xd5\x75\x33\x46\x62\xf3\x17\xf1\xa8\x7c\x5c\xf3\xd2\xeb\x2a\xc6\xee\x54\x4a\x33\x55\x01\xe2\x66\x84\x66\x85\x2d\xcf\xa7\xc7\x68\x55\x04\x8d\x95\xed\x1b\xc1\xb8\x0f\xfc\x40\xe0\x41\xa9\xdd\x77\xfb\x5f\xb8\x30\x45\x4b\x65\xb2\x96\xf1\x05\xa6\x43\xab\x6e\xb6\x40\x87\x8a\x54\xc8\x1a\x31\x9c\xa3\x80\xae\xf5\x42\x8a\xd9\x4a\xc9\x2d\x59\xfd\x42\x62\x2a\x9a\x68\xa8\xbb\x44\x7c\x4b\x9f\x60\x56\x8e\x9e\x99\x8d\x92\x97\x41\x8e\x63\x34\x01\x60\xab\x8a\xeb\x90\x2e\x30\xdc\x1d\x9b\xc0\x54\x18\x61\xae\xb7\xb1\xeb\xaa\xfb\xc9\x3b\x20\x05\xc8\x6a\x34\xdf\x0d\xd8\x67\x25\x5e\xde\x54\x0a\xfc\x4a\xed\x2b\x76\x83\xa2\x75\x74\x74\x74\xc7\x9c\xb9\x52\x00\x3d\x2f\xb8\x4c\xe2\xb0\x82\x46\xb9\xd7\xb0\xcc\x35\x09\x02\xf6\x9c\x94\xec\x3f\xcb\x76\x56\x79\x86\xb4\x1e\xc8\x5b\x2e\xb7\x34\xb8\x34\x7e\x39\x72\x5b\x9a\xa6\x7e\x24\xe3\x9e\xa7\xaf\x06\xcf\x76\xfa\x4d\x13\x55\x03\xc5\xd4\x80\xaa\x4b\xf3\xca\xc3\xb3\x2c\x00\x8d\xbd\x5c\x19\xd9\xdf\x35\xd5\xf1\x65\x01\xb5\x6c\xba\x87\xf1\xce\xa4\xb6\x22\x94\x60\x79\x9f\x5c\xaf\xc8\xb2\xee\xc1\xed\xbd\xf7\x25\x19\xe6\xb6\x81\x95\x83\xd5\x9d\x08\x66\x5c\x9c\x16\x76\x23\x8a\x6c\x67\x45\x55\xeb\x27\x94\x67\x6e\xb5\x7e\xd6\xb5\x5f\x2f\x28\x61\x6f\x2c\xf9\xbf\xad\x6e\x69\xe7\x50\x30\xcc\x48\x06\xbb\xca\x30\x26\x34\xc8\xb3\xf4\x52\x14\xf3\x22\x87\x5d\xa5\xbe\xc4\xa6\x3a\x20\x43\xb5\x8f\xb8\x59\x6d\x8e\xe4\x1e\x24\xe5\x01\xc2\xf2\xa9\x41\x02\xcc\x8d\x54\x2e\x5c\x37\x84\xd3\x0a\xfc\xee\x47\x12\xcf\x04\xde\xe8\x1f\xfe\x15\xbd\xfe\x66\x83\x40\xb7\x96\xe1\xaa\xb9\x5a\x05\xe7\x35\x56\xce\x97\x1b\xad\x25\xb3\x09\x4c\x0d\x32\x43\x35\x31\x6c\x3d\x6f\x2f\x23\x38\x95\x5a\xf8\xcf\xc2\x11\x9a\xf1\x91\xad\xa0\x95\x12\x2b\xc8\x2f\xb6\x01\x5f\xcc\x1d\xbf\x29\xc0\x1d\x8d\x78\x28\x9f\x66\xb4\xaa\x78\x39\x70\xb7\xf4\xf6\x91\xbb\xf0\xb3\x5b\x0f\x9b\xa6\x0a\xbb\xf1\x61\x4b\x20\x84\xb0\x49\x5b\xcc\xb3\xe5\x64\x1e\xbf\x05\x90\xf4\x59\x4b\x63\x52\xce\xe2\x47\xc4\x8b\x42\xa9\x0c\x1d\xeb\xf1\x9a\x0a\xe9\x81\xfe\x56\x65\xcc\x76\x0f\xb2\x5f\x31\x9e\xec\x6b\xad\x87\x5a\xfb\xb8\x76\x16\xcd\x8b\xb0\x66\xe1\x91\xd5\x54\xce\x7f\x16\x99\x97\x2d\x25\xfc\x78\xb2\xbb\x64\x41\x27\x90\xf2\x5f\x70\x1e\xb2\x22\x5d\x7a\x94\x2d\xeb\xb4\xc9\x6d\xc6\x99\xa3\xe8\x09\x1a\xe4\xfd\x18\xd0\xc9\x6e\x12\x26\xf0\x1b\x79\x7d\xd3\xd0\xc7\xd3\x9f\x12\xf1\x46\x51\xea\x9d\x40\x97\x13\xed\x3a\x98\x20\x35\xa7\x07\x3d\x51\xf3\xd8\xa7\x27\xf8\x65\x48\xd5\xd6\xee\x61\x3e\xf5\x7d\xb3\x35\xdc\x08\x64\x0f\xb7\xe2\x8d\xf5\xb6\x5d\xa0\x4a\xe9\x61\xee\x72\xff\x77\x48\x95\x9b\x5c\x0e\xb4\x21\x0e\x17\x1c\x6e\xeb\x45\x31\x01\x9e\xd0\xc6\x6c\x64\x68\x57\xb7\x1b\x5a\xae\xdb\xd8\xbd\x4b\xf1\x9c\x7a\xde\x44\xcf\xaa\x56\x7c\x49\xad\xf9\x0a\x0d\x7a\x6d\x76\x97\x4c\x04\x3b\x73\x80\x79\xf6\x4b\x8e\x43\xa7\x8b\x43\x47\xe2\xdd\x4d\xaf\x4e\x1f\xc4\x1c\x6b\x1b\xb7\x7b\x54\x83\x98\xc0\x5d\x98\x9a\xd9\x61\x4c\xc9\xad\xf4\x4b\xf5\x61\x1d\x36\xd8\x61\x1c\xa2\xde\x38\x27\x3f\xea\xf4\x0b\x72\xfc\x97\xdb\x02\x1f\x50\x54\x3f\x97\x81\x32\x41\xc1\xf8\x4f\xae\xb7\xe7\x6c\xc3\xbb\x33\x94\xa2\x0e\x9c\x43\x2b\xe2\x01\xee\xf0\xd8\xbe\xd1\x9f\x0c\x88\x55\xa7\x5d\x65\xd3\xa5\x23\x7d\xac\x23\xd6\x5f\x2e\xba\xd4\x77\x7c\x68\x68\xba\x9e\x3a\xa6\x20\x87\x2c\xb5\x74\xd0\x3e\x7c\x9a\x81\xf9\x16\xd2\xa8\x83\x2e\xae\xfd\xab\x40\x04\xf8\x4d\xf9\x94\x8e\xaa\xd8\x4c\x77\x71\x8a\x4a\x2a\xce\x43\x4b\xf2\x88\xfa\x87\x30\x53\x4d\x06\x83\xe4\xcb\xe9\x1d\xca\x01\x74\x94\xab\xdd\x2c\x8b\xba\x52\xa6\x39\x26\x4c\xc1\x33\xc4\xdf\xcd\x9f\x06\x29\xc6\x9b\xee\xb1\x09\x13\x42\x91\x22\x6e\x2c\xbb\x2f\x1a\x0c\x62\x12\xc4\xf1\xd2\x06\x7b\x84\x12\x39\xa0\x73\xa6\x84\x47\x57\x77\xb4\x38\x46\x39\x4d\x1e\xea\xbc\xff\xe4\x20\x6c\xfd\x08\x57\x80\x8c\x4f\xd5\xfa\x3e\x2e\xe7\xc5\xb8\xda\x9d\x81\x83\x92\xdc\x7a\x02\x3b\x8f\x8f\x8a\xd7\x8c\x7a\xc5\xb9\x5f\xde\x66\x5d\x8f\x50\xa7\x49\x81\x83\xdf\xc2\x24\x62\xe9\xd6\xe4\x63\x4f\xac\xd2\x98\xb8\x1e\x43\x25\x37\xdd\x4d\xd1\xbf\x83\x60\xa8\x9e\x17\x07\x06\x87\x8e\xb7\x25\x58\x8b\xe2\xe3\x68\xdf\x75\x31\x71\xe8\xa4\x3d\x13\xfe\x84\x15\x52\x90\xac\x20\xd7\x8d\x8d\xce\x42\x44\xd7\x8f\x97\xab\xa7\x49\xf2\x2f\xec\x6e\x41\x67\x0f\xd1\x36\x00\x76\x03\xf4\xd7\x06\x4b\x9a\xd4\x68\xd7\x84\x80\xff\x99\x17\xd6\x9d\x15\x48\x45\xc9\xda\x3d\x1c\xb3\x19\x76\xae\xbc\xd1\xb2\x49\x16\x95\x83\x34\x47\xb9\x5c\xa4\x92\x60\x06\xf5\x58\x27\xbd\x56\x59\x64\x03\x72\x0f\x78\xf4\x76\x30\x77\x95\x18\x69\xa7\x55\x8a\xfa\x35\x91\x31\xa5\xee\xd8\xd7\x74\x20\x68\xd3\x49\xd4\xa2\x10\x44\x7f\xe5\xc0\xa1\xa2\x62\x55\x1a\xf9\x18\x11\xff\xd5\x58\x40\xec\x95\xa4\x42\xa7\x2f\xf7\xd8\x3c\x30\xa6\x51\x99\x91\xb9\x28\xcc\xdc\x37\x3a\x44\xc7\x3b\x06\xc9\x15\x97\xd4\x80\xbb\x41\xbf\xcb\x6d\x76\xd3\xa1\x7b\x64\x69\x7e\xd8\xb8\xe3\x0c\xb4\x60\x59\xb4\x29\x78\x92\x79\xd6\xf9\x3b\x5a\x22\x67\xff\x22\x94\xac\x75\x30\xb5\x2f\x55\x4f\x17\xd2\xa9\xba\x9a\xc5\x46\x51\x4c\x48\x73\xec\xf4\xaa\xa2\xea\x3b\xfd\xe5\x92\x8e\x29\x96\x4c\x0c\x27\x3b\xcc\x3c\x2e\x08\xf8\xfd\x74\xe3\xba\xd4\xbc\xe3\x1c\x31\x41\xa5\x5c\xd6\x98\x59\x93\x8f\xf5\xfc\xfd\x9d\xdc\xa3\xd8\x00\x25\x34\x0d\x2a\x40\xb2\xf6\x44\x64\xac\x98\x9c\x0b\xc3\x5c\xc8\x53\x0b\x69\x66\x5f\x4c\x06\x31\xc7\x1b\x05\x0b\x89\x44\xb0\xec\xbb\xdf\xf7\xd5\x4f\x5b\x3e\xbc\x20\xad\x62\x13\xb0\x54\x4a\x12\xad\xe6\x8a\x2f\x16\x24\x2f\x19\x2f\x34\x27\x16\x67\xbf\xad\xf0\x92\x93\x38\xe4\x4f\x98\xd6\x6e\x26\x8e\x3f\x7b\xe9\x4c\x7c\xf3\x13\xb8\xa3\x73\xc2\xc3\x0f\xa8\xb3\x6d\xc2\xfa\x70\x2b\xdd\x61\xa5\x24\x04\x78\x1c\x84\xdc\xa8\x0b\xed\x61\xd4\x81\x68\xa4\x53\xd0\x9d\xe2\x9b\xb0\x7a\x43\x97\x63\xaf\xbb\xae\xd2\x31\xa5\xa1\x6e\x35\x92\xc9\xdc\x17\x56\x89\x2d\xf1\xc2\x44\xff\x48\x99\xa0\x1c\xdd\xe6\x2a\x8c\xc6\xc5\xa1\xa9\x47\x41\x67\xcb\x73\xc7\x6a\x39\xbe\xc6\x3e\x10\xbc\xbc\x19\xa3\x5b\x9b\x83\x12\x05\xe6\x0a\x8a\x59\x7a\xee\x64\x01\xb8\xb6\x52\xd5\xaa\x9a\x8e\x4a\xbd\x4f\x1f\x69\xaf\xc7\x40\x18\xa4\x06\xda\x31\xa0\x9a\x69\x0b\x68\x21\x6c\x22\xa4\x79\x62\x21\x6b\xf2\x8f\x55\xe1\x65\x92\x96\xb8\x0d\x21\x9a\xc4\x8d\x07\xf5\x70\x95\x71\xda\x2a\x98\x03\xed\x92\x86\x11\x05\xf0\x6b\x76\x50\x9b\xd5\x3c\x6f\x71\xd1\xbb\x33\x75\xb0\xea\x69\x2b\x8c\xe8\xd3\x05\x30\x0e\x52\x99\x89\xe7\xa5\x54\x70\xb9\xda\xbe\xe4\x38\x4f\xbb\x07\x49\x11\xc7\x33\x9e\x61\x3e\x85\x3b\x2f\xaf\x48\x2d\x7b\x41\x2f\x6e\x91\xc8\xde\xfe\x67\xc3\x64\x67\xaf\xe8\xce\xd4\x2d\x68\x25\x11\xad\xc7\x50\x7c\x64\x33\xc7\xe7\x6d\xb4\x4b\x46\xfe\xe5\x9c\xb0\x8e\xd0\x5f\x0a\x2d\x69\x2a\x96\xcb\xb5\x15\x7d\x70\x03\x1d\xd6\xe9\xd4\x0b\x94\x45\x9d\xfa\x47\x64\x10\xa5\x42\x3c\x8a\x3b\x3d\x72\x9b\x5a\x14\x95\x93\x36\x1b\xd6\x95\xff\x90\x09\xc9\x3e\x0a\xcb\x62\x41\x01\xb8\x14\x75\xcc\xe8\x3a\x1b\x57\x76\x26\xe3\xcb\x08\x00\x38\xf5\xaa\x06\xb4\x9c\xea\xb7\x4c\x53\x6a\x74\x28\xeb\x1c\x9b\xa0\xe4\xcd\x1a\x33\x7d\x14\xcb\x9e\xc2\xb5\x3c\x47\x8b\x75\x3e\x91\x09\xa8\x03\x04\xf2\xe6\xc3\x5c\x6a\x40\xa1\xa6\x51\x60\x10\x1d\xcd\xc6\x13\x68\x29\x35\xb4\xbb\xcd\xbf\x28\xa4\x6c\xd8\x7b\x1c\xaf\xbd\x09\x43\x50\xfc\xf3\xf1\xb9\x6a\x5e\x54\x72\x54\x43\x32\x6d\x8a\xdd\x8d\xd2\x06\x7c\xc0\x4b\x43\x1b\x90\x22\xb9\x3a\x01\xc3\x46\xbe\x3d\x89\x5d\xd6\x96\xda\x73\xc8\xe0\xb7\xa1\xf9\x80\x48\x6e\x81\xa9\x72\xd0\x10\xbc\x59\xa2\xea\xb2\x5c\xfc\x1f\x03\x47\x74\x11\x00\xf9\x5b\xfd\x8c\x12\x19\x79\x7f\xe2\x24\xf3\x74\x67\xd3\x57\x98\x1a\x2b\x6f\x03\x88\x10\x94\xdd\xb2\x7d\x9e\x90\xfb\xe5\x12\xe9\x6b\x34\xfb\xde\x3a\x82\x4b\x6a\x67\x07\x73\xcc\x58\xff\xb0\x61\xf0\x4e\x3a\xfe\xb2\xfd\x7d\x80\x46\x10\x0e\xa7\x5a\x01\x9a\xd2\x08\xc1\x32\x1f\x51\x7b\xa8\x52\x9d\x15\x1a\x5b\x4e\x26\x4d\x04\xf7\x6a\xb2\x34\x5d\x33\x51\x3a\xea\x0a\x73\x9c\xd7\xcb\xd7\x74\x1f\xfc\x87\xcb\x70\x49\xbf\x56\x5b\x11\x68\x9a\x6f\x81\x35\xb0\x7b\xe4\x7f\xe7\xf8\x3b\x87\x7f\x06\xad\x64\x0d\x97\xb7\x7f\x2e\xf2\xf1\x0a\xf1\x10\x23\x3b\x76\xc9\x45\x60\x5d\x87\x52\x30\x94\xeb\xd3\xcc\xec\x29\xc2\x7e\x9e\xca\xb9\x1c\xae\xe5\x7d\x5c\xc8\x9c\x20\xd8\xad\xfc\x3c\x8e\x5b\x00\xec\xcd\xa9\x91\x56\x5a\xc0\x02\x99\x1f\x5a\x3b\x75\xfc\xfd\x1d\x43\xf4\x72\x12\xf2\xf8\x2e\xe5\xf0\xbe\x9c\x2f\x33\xbb\xbc\x01\x01\xe4\x6e\x50\x6f\xeb\xc9\x56\x04\x2e\xf7\x8e\xc8\x49\x58\x89\x2b\x99\x9c\xa6\x41\x97\xd8\xf0\x87\x4a\x12\x8f\x72\xf1\xf3\xd2\x47\x03\x5c\xfb\x81\x5d\x47\x5c\xea\x67\x25\xdd\x6e\x63\x24\x83\x40\xe0\x4b\xbf\xd7\x82\x0f\xae\xf0\x8c\x44\xc5\x51\x57\x43\xc2\x65\x0b\xc3\x27\x22\x5f\x72\x46\x5a\xd2\x2f\x7d\x3f\xdd\xfc\xba\x59\x34\x47\x9e\x05\xcb\x68\x27\xad\xf6\xb4\x05\xef\x65\x86\x44\x8c\x4e\xf5\x6e\x25\x9a\x59\x47\x89\x4c\x88\x13\x91\x88\x00\x25\x13\x86\x0a\x9f\x6a\x6e\x90\x7e\x11\x8a\xa6\x49\x17\x92\xb9\x0e\x39\xd0\x95\x00\x2b\x49\x8d\x12\x2b\x2b\xd0\x9f\xd6\x8d\xfd\xf4\x08\xb4\xc3\xed\x7f\x5f\xae\x71\xda\x49\xa7\x5b\xb1\x32\xcd\x77\x33\x65\x74\xd8\x7f\x0f\xf5\x04\x00\xb1\xc3\x6d\xf5\xf2\x2f\xa7\x67\xb5\xf4\xa3\x26\xae\x9b\xec\x21\x54\xa9\x83\x07\x33\xb9\xa4\x42\xaf\x1c\x50\xc0\x64\xa8\xed\x32\x90\xe1\xb5\x68\x57\xfd\x3d\x4c\x72\x51\x5f\xe6\x76\xe1\x79\xfa\x58\xa3\x0a\x0e\xe3\x5b\x70\x43\x04\xdb\x74\x0d\xd8\x07\xbe\xc1\xe7\x58\xd9\xaf\x97\x55\x3c\x34\xa0\xdc\xba\x91\x8c\x82\x9a\x36\xe5\x0b\x2a\x71\xdc\xed\x7b\x3b\xc6\x4c\xee\xb9\x97\x83\xda\xe0\xf5\x30\x30\x52\x69\x78\xd2\x3b\xb7\x94\x11\x39\xc4\xa4\xb6\xfc\xf7\x13\x3b\x74\x0b\x18\x81\x18\x03\x7b\x9c\x77\x57\xe7\xe5\xa7\x76\xa5\xcb\xe6\x85\x6d\xde\x2d\xd8\xf0\x4e\xf3\xb2\xf1\xb5\x6b\xdf\xbb\x9f\xb9\x32\x87\x5e\x53\xe6\xb6\x71\xe3\xdf\x07\x15\xd0\x69\xe4\x0a\xfe\xe1\x31\xca\x20\x36\x07\x04\x60\xce\x29\x0c\xba\xd2\x89\x78\x7c\x4a\x0c\x66\x72\xc3\xdf\xc8\xcd\x67\x2e\x07\x00\xed\xf3\xa7\xf3\x00\xd8\x6f\xdc\xd2\x7f\xb7\x6f\xf2\x60\x9d\x00\x94\x20\xea\x33\x10\x77\x42\x5e\x96\x16\x15\xda\xa4\x70\x43\xaa\xce\xc0\x56\x0b\x56\xef\xf3\xa3\x46\x1c\x75\xac\x7c\x65\x0c\xe4\x50\x99\xd4\xea\x37\x03\x71\x23\xb7\x63\xa0\x6d\x2c\x2d\xfb\x5e\x5e\x05\x8f\xfe\x49\xd9\x83\xfb\xa6\x54\x39\x70\x8e\x5c\x03\xd9\xa2\xc9\xc0\xdd\xde\x16\xc8\x49\xbd\xb5\xef\x81\xd5\x45\xba\x1d\x1e\xd0\x04\x21\x89\x22\x2b\x57\x54\x0d\x1b\x4c\x36\xe8\x4a\x54\xf2\x84\x6c\x97\x6c\x74\xcd\x46\xc3\x30\xee\xf2\x26\xd8\x3e\xbb\x4d\xfc\x49\xc6\xdf\x72\x30\x66\xcb\x53\x2a\x5f\xf1\xdc\x6c\xb3\xed\x23\x91\xcb\xbb\x85\x01\xa0\x9f\x47\x87\xa3\x1b\x1b\x3c\xc6\xd1\xb7\x43\xe8\xa4\xb7\xc9\x9a\x7a\x17\xc1\xac\x29\xa5\x46\x79\xe7\x9e\x3b\xcf\x01\xd0\xb3\xde\x56\xef\x33\x55\xb3\x5d\x82\x83\xc3\xb9\x13\x91\x2c\x31\xd5\xa0\x5a\x66\x85\xe3\x39\x0a\x93\x70\x3b\xc6\xa3\xa3\x4f\xad\x12\x22\x64\xf0\x8a\xc3\xf6\x3a\x61\xc3\xd6\x15\x15\xe5\x50\xd9\x4d\x6f\x83\xc2\x44\xbc\xd5\xe2\x19\x53\xba\x38\xef\x4f\xe1\xdd\xb3\xf8\xf8\x07\x9a\x76\x3e\x61\xa1\xd0\xbc\xab\xe3\x7a\xbf\xe7\xf6\xda\xc6\x96\x2e\x0c\x17\xde\x7b\x8e\x31\x39\x90\x6b\xd6\x88\xec\xd3\x5c\x41\xc3\x31\x96\x47\xf3\xe2\xad\xda\x84\xd0\x0b\x0d\xa9\xd1\x1d\x6a\x55\x3e\x06\x91\x80\x22\xf3\xdc\xd4\xd1\x94\x2e\xab\x90\x23\x2f\x71\x4c\x70\x0d\x23\xff\xea\x54\xba\xbf\xb0\x62\xee\xa7\xfe\x3a\x8d\x65\x4f\x9d\xa7\x73\x64\xad\x1e\x73\xbc\xcc\xfa\x5b\x7b\xf4\x7c\x31\x3d\xd2\x4f\x7a\x27\xaa\xaa\xf1\x30\x36\x9a\xac\xc7\x96\xa5\x8a\xb7\xc8\x61\xb1\x7c\x88\xb9\x44\xa5\x27\x71\x1d\x27\x34\x0a\x6f\x6a\xf9\x3c\xca\x09\x1c\x7a\xa4\xe3\xf1\xfb\x52\x39\x88\x5c\x32\xdc\xbe\xe7\x51\x04\x78\x71\xff\xc9\x71\x9f\xab\xd1\xb6\x1c\xa1\xb4\x6a\x4d\x5f\x2f\x81\x99\x19\xab\x8d\x65\x9f\x27\xc8\x86\xe4\xc9\x2d\x1c\x48\xff\xf4\x74\x2e\x20\xc4\xa9\xb2\x8b\x43\xd6\xfc\x56\xb9\x98\xfc\x65\x70\xda\x6d\x01\x52\xde\xa8\x95\xa2\x6b\xdf\x34\xb8\xed\x5c\x32\xdc\x11\xda\xbc\xd8\xd1\xe5\x91\xd3\x9f\x53\x67\xe1\x63\x54\xc7\xe5\x61\x16\x1f\x10\x70\xe7\xee\x33\x9e\x5d\x03\xcd\x4d\x2a\x8e\xa0\x44\x05\x62\xa3\xc7\xda\x37\xa2\x3a\x87\x68\x79\xf4\xb2\x44\xf3\x28\xdb\xc2\xbb\xdb\x38\xb1\xc3\x2a\xe7\xcd\x9d\xa4\xf6\xf2\x61\x28\x27\xb3\x82\x4c\x17\xca\x72\x6d\x68\x9b\x70\xd3\x7b\x4f\x87\x42\xe6\x4d\xe5\x24\x67\x8c\x25\x8c\x2f\x96\x6f\xb7\xed\x6b\xb6\xfd\x99\x1d\x00\x30\x74\x60\xc1\x9a\xca\xd3\x42\x3c\x86\x98\x22\x3a\xc7\x31\x14\x86\x6c\x5e\x85\xd7\x6a\x6b\xcf\x16\xe9\x4a\x30\xf5\x37\x7f\x6e\x7a\x00\xaa\xc2\x55\xff\x77\xe4\x96\xae\x42\x33\x43\x6c\x64\xa5\xc1\x52\xc8\x7b\x07\xc6\x18\x4a\x0f\x91\x25\x1e\x24\x9f\x1c\x25\x5f\x75\x17\x36\x2f\xee\x20\x42\xb9\xc9\x90\xc3\xc1\xd0\xbe\xfd\x53\xfe\x56\x99\xa9\x9c\x84\xe5\xa9\xef\xca\x92\x7d\xcf\xf7\x68\xc4\xf4\x53\xa9\xf8\x9f\x82\x41\x41\x6c\xd3\xb9\xef\x64\x7e\x28\xf7\xc0\x76\xea\xee\x36\xfa\x60\x55\x41\xbc\x95\x7c\xf5\x1d\xe5\x24\x38\x8e\x95\x82\x0f\x5a\x73\xa4\xc9\x6f\x95\x6e\xc8\x97\xd5\xce\xa2\x64\xb2\x07\x1c\xfb\x5e\x21\xb9\x82\x4b\x5b\xd1\x75\x2b\x61\x65\x22\x6c\x8a\x6c\x14\xe3\x2a\xec\x8c\xe3\x96\x6c\xe3\xaa\x56\x27\xb0\x3b\x2f\xe5\x15\x25\xcd\x06\x2c\xbc\xe6\xed\xe3\x52\xe1\xb8\x9d\x25\xdc\xca\x45\xcf\x1d\x09\x70\x88\x9a\xde\xa4\x0c\x18\x51\xf8\x18\xab\x4d\x11\x2a\x37\x8f\x04\x61\xae\x73\xba\xe6\xbb\xdc\x74\x42\x2a\x3e\x4e\x67\xe2\x4a\x8d\xb4\x12\xc4\x29\xce\xe1\x50\xdc\xbc\x99\xd1\xaa\x82\x61\x88\xb2\x78\xc8\x4b\xae\xfe\x22\x08\xe1\xdc\x7e\xae\x29\x73\x57\xa2\xec\x9e\x94\x6c\xdd\x3d\x5d\x26\x35\x66\x73\xcb\xb6\x9f\xb3\xd8\x31\x39\x4f\x65\xa3\x73\x2e\x04\xa2\xab\x90\x29\x58\xf0\x80\x96\x89\xa5\xd8\xae\xa8\x18\x0f\x1b\x5f\x8a\x08\xeb\x8e\x6f\xb9\x36\x6c\x6a\x46\x7c\x23\xdb\x17\xc2\x38\x02\xef\xa5\xb7\xd4\xb7\x94\x3b\x91\xb3\xc6\x56\x47\x99\xb9\x73\x23\x3b\x9c\xf4\x63\xc2\xf2\x08\x4f\x1a\x18\xc3\x97\x28\x10\x21\xaa\x3d\xb7\xcd\xde\x63\x44\x81\xfb\x6c\xb6\xdf\x64\xcc\x5e\x5a\x08\x62\x6a\xd8\x39\x87\x7d\x26\xb7\xeb\x19\x27\xf4\xb2\xe6\x67\x16\x2a\x17\xc6\x43\x56\xd7\x82\xb6\xfa\x91\x05\x82\x14\xca\x45\xe7\xf3\x19\x86\xb1\x9d\x6a\xa4\x7a\x1c\xab\xf9\x13\xa2\xd2\xa9\x95\x0b\x78\x05\x34\xee\xcc\x42\x94\xac\x77\xc4\x74\xe0\xb5\x25\xcf\xfa\x5b\x76\xb2\x86\x33\x5b\x30\x97\xdf\x8c\xe8\x37\x14\xb3\x2f\xfe\xb7\xad\x76\x1d\xfd\x72\x1a\x27\xa6\x72\x11\x6d\x04\x66\x86\x80\xcd\x6c\x2e\xd2\xce\xf5\x61\xb5\xe8\x73\xad\x1d\x79\x38\x30\x9d\x4a\xf7\x5b\xd7\x69\xc7\x9b\xd3\xff\xa3\xd4\x05\x77\x59\x4c\x6f\xb0\xab\x0e\xd4\x3e\x9b\x53\x0a\x13\x94\xf5\x62\x58\x81\x47\x98\xd8\x19\x18\x78\xa9\x39\x05\xc8\xbb\x9e\xd7\x07\x24\xa7\x0e\xe6\x0e\x90\x6d\x8d\xc9\x4c\x2a\xbf\x27\x77\x80\xcf\xf2\x31\x35\x2e\x09\x4a\x65\xaa\x24\x1d\xe4\x32\x2e\xa6\x88\x74\xbb\x0f\xe4\x5d\x21\x5f\x78\x05\xeb\xfd\x4b\xf5\x55\x87\x7f\x0a\x71\xac\xf4\x7a\x09\x85\x79\xca\xce\x0c\x6c\x2b\xb1\x3a\x53\xbb\x91\xa9\xac\x10\x73\x36\x8d\xc2\xff\x16\x82\x09\x63\x58\x13\x6e\x6e\x96\x63\xc4\x1b\xa9\x81\x11\x5c\x80\xb1\xe9\xd9\x16\x16\x99\x22\x2b\x40\xf1\xd3\xba\x26\xb8\xf3\x3b\x8f\x18\x75\x8c\x61\x99\xb9\xf2\x14\x87\x7e\xbc\xa6\xb6\xfd\x26\x74\x50\xaf\xde\x03\x5d\x15\x35\x7a\x55\xd0\x62\x26\x05\x08\x28\x07\xb4\xf0\xbb\x52\xb0\xb1\xe3\xdf\x1c\xa4\xbb\x59\xb4\x29\x8c\x09\x4e\xc7\x2c\x7c\x2f\x0a\x56\x0a\x44\x73\xd9\x3f\x65\xcb\x85\xb9\x67\x89\x5c\x31\xc0\x7d\x2c\x66\xa9\x52\x67\x38\x1a\x59\xd5\x4c\xf2\x67\x54\x8c\x7a\x05\x15\x40\xd8\xd1\x2c\x4a\x69\xd9\x2b\x25\x30\x07\xdb\x6b\xd4\x39\x3a\xc0\xb5\xc9\x50\xb8\xcd\x4e\xbd\x40\xe1\x86\x95\xd3\x90\xce\x2a\xe0\x36\x3a\x3f\x38\x17\xca\x4b\xdc\xe4\xbe\xbd\xbc\x55\xd7\x3c\x4c\xba\x85\x92\x36\xfd\x74\xb7\xda\x03\xa3\xac\x9b\xab\x06\x8c\xe4\x95\x29\x30\x01\xb9\x13\x63\x3e\x29\x44\xf1\xbf\x66\x93\xdd\x53\x30\x57\xab\xf2\x0b\x9a\x9b\x12\x13\x2c\x39\x50\x27\x5c\x5a\x77\xb9\x05\x42\x24\x8e\xca\x4d\xf9\x4b\xc2\xbd\x3f\xaa\x7e\x32\x0d\x64\x24\x9a\x9a\x34\x32\x2a\x1f\xcd\xb7\x5b\x5f\x09\x4a\x50\xb6\xa8\x84\x68\x54\xf5\x5e\x0f\x6a\x7c\xa7\x29\xc2\x43\x28\x3c\xe9\xf2\x6e\x4e\x4c\xa5\x9d\xdd\x0a\x7a\x7d\xa4\x0a\x51\xd5\x0c\xbc\x99\xa2\xfa\x6a\xc2\x68\xb8\x49\xd4\x70\x61\xf0\xd1\xf4\x07\xdd\x83\x14\x73\xb6\x74\x01\x4b\x4a\x5d\x70\x93\xd0\xbb\x9a\xd6\xf2\xb9\xf3\x7c\x49\x5d\x84\x87\x18\x93\xef\x21\x33\xc3\x78\x4b\x81\x04\xc3\x65\x4d\x89\xcd\x03\xc0\x54\xe9\x6c\x42\x6e\xb9\x6c\xbc\x43\xfd\x18\x29\x52\xbc\xad\x73\x04\x79\xf8\xde\x27\x58\x89\x29\x55\x92\x62\x84\x95\xbf\x31\x1e\xe9\xef\x5a\xa1\x4b\x47\x3d\x21\x76\x41\x02\x6a\x71\x10\x7d\xb9\xda\xdc\xa6\x6c\xbc\x5b\xe2\x9c\x3f\x44\x5c\xb8\xc2\x48\x13\x5d\xcf\x52\x84\x19\xb0\x3d\x60\xcf\xe2\x6f\xd4\xbd\x6a\x48\xba\xf7\x36\x26\xc0\x57\xe7\x3d\x07\x1f\x51\xc5\x95\x99\xe4\x2b\xc6\x87\x73\x51\x74\x78\x5c\x0d\x72\xe8\x98\x54\x80\x77\x6b\xc5\x3d\x4c\x1f\x35\x3c\x0e\x5e\x27\x00\xab\x61\xce\x1f\xe6\x40\x31\x3d\xcf\x9f\xf0\x8d\x25\x6a\xe3\x54\x78\xca\x13\x0d\x1f\xa4\xb6\xc2\xcb\xbc\xec\x5b\x76\x4a\xb9\x24\x24\x4f\xa8\xd6\xbc\x83\x4b\x27\x33\x9b\x09\x3e\x35\xf6\xb0\x01\x7f\x72\xb2\x9a\xc2\x4c\xe4\xaf\xf8\xbc\x40\x4f\x0d\xe5\x70\x3b\x5c\x3c\x2c\xa7\x5a\x3d\xbe\x73\xaf\x94\xc4\x72\xcf\xcd\xc2\xe9\x94\xfb\x8e\x88\xcd\xc0\x23\x0b\x63\x95\x93\x3e\x87\x52\xfb\x10\xc9\x30\x5e\x3e\x7b\xc3\xb9\x4d\xde\xfb\x2e\x18\x3c\x2c\x41\xd7\x0f\x90\x38\x6e\xef\x9e\x68\x69\xef\xef\xe8\x76\x2f\xb6\x9f\xa1\xcf\x28\x7f\x98\x42\xf8\x65\x9c\xfc\x4d\x2b\xcb\xf0\x9e\x06\x87\xc4\xa4\x0a\x9a\xa9\x6d\x1e\xdb\x75\x17\x28\xb2\xfb\x93\x00\x30\x10\x63\xa2\x35\x8f\x9f\x06\x29\x4e\x19\x16\xf2\xb8\x83\x3e\x31\x8d\x15\x2b\x9b\x2d\x30\xd0\x4e\x6c\x2d\x4c\xce\x25\xec\x10\x5b\x4e\x62\x37\x04\x77\x55\x02\x9c\xf9\x79\x74\x6d\x79\xd0\x18\x24\xa5\x50\x92\xe1\xf0\xd2\x08\x72\x68\x79\xa1\xa0\x66\xde\x3f\x87\x47\xe5\x51\x91\x1e\x40\x98\x2f\x76\x04\x34\xaa\x30\xc4\x8a\x9a\x3e\x82\xb6\xb3\x09\x26\x16\x79\xea\xd5\x34\x7f\x45\x8f\xef\x50\x22\x60\x7b\xc1\xf2\x55\xbe\xd5\x4d\x3f\xef\xb4\x05\xd5\x61\x72\x64\x95\x69\xd1\xe7\xa3\xda\xbe\x8e\x7c\xeb\xf9\xee\xef\xe0\xfa\xc6\x36\x0d\x35\x2e\xd5\x0c\x93\x7d\x1c\x26\xc3\xff\x08\x41\xd4\x69\x3d\x80\x5b\x7c\x88\x3f\x11\x81\x4b\xb2\x94\x3c\x7f\xf3\xc3\xdb\x84\xde\xcf\xb6\x7a\x1f\x75\x68\x6e\xe2\x53\x83\x14\xdb\xa9\x84\xef\xfa\x79\xad\xea\x1e\xbd\x41\x79\x74\x80\xaf\x30\x55\xaa\x7b\xf8\x4a\xb1\x9d\xb1\x9e\x35\xe0\x42\xcd\xab\x7d\x7f\x52\xeb\xde\x6c\x5e\x91\xa1\xf3\xf8\x95\xa2\xc7\x8d\xfd\x73\x7f\x47\xf3\xc9\x7d\xc6\x97\x74\x97\x4e\x2f\xdf\x69\x3f\x3d\x63\xd1\xea\x58\x4e\xa0\x78\x58\xfc\xb2\x02\x86\xcb\xa6\x61\xe3\x7c\xbc\x53\x49\x0d\x9b\x26\x9b\x28\xf7\xcc\x3f\x23\x37\x51\xe7\x76\xf8\xcf\x29\x64\x9a\xa0\x8b\x6a\xdc\x99\x99\xea\x4a\xc1\x14\x0e\x95\x10\x63\x55\xd7\x41\x57\xcf\x54\x23\xe3\xfd\x8e\xf8\x09\xf9\xd2\xc3\x29\x9c\x95\xe5\xc3\xe9\x60\x61\x44\x41\xd5\x2a\xc7\x6c\x4a\xe2\xd2\x95\x53\xf3\x98\x6c\x08\xfe\xa0\xf0\xd1\xc3\x14\x28\x55\x05\x98\x43\x56\xb5\xf2\xfb\x24\x34\xc7\x1d\x04\x2b\x15\x0d\xae\x24\xca\xc9\x6f\xbc\xa0\x7d\xad\x2a\x16\x0b\x41\x4a\xc9\x3d\x20\xff\x01\x15\xd9\x04\x1d\xd9\xf2\x14\x30\x90\x1d\x7b\xd1\x1e\x8a\xbd\x80\x90\x91\xe6\x5b\xfc\x4e\x7b\xf2\xdc\x02\x76\x75\xae\xd1\x56\x32\x94\xeb\xde\x8f\x1a\x2b\x7f\x19\x73\x77\xb4\x45\xa9\x4a\xc0\xe8\xf8\x05\x9b\xb0\x36\x5e\x41\xef\xd7\x01\x8f\x49\x06\x91\x11\x82\x10\x0b\x48\x5f\x89\x84\x1b\x13\x79\x88\x06\x97\x93\x7f\xe4\xd2\x1e\xc7\x25\x83\xaf\x50\x51\xe2\xbd\xee\xa2\x35\x35\x34\xe9\x69\xea\x47\xdd\x20\x4e\x88\x9e\x55\x36\x8a\xba\x8c\x09\x22\x36\xc6\x1f\x13\x31\xe2\xce\x01\xb0\x66\xf6\xb1\x25\xf7\x82\xd5\x88\xf3\xf4\x8f\x8e\xf4\xbf\x5f\x70\xb0\x8f\xdb\xf5\x6f\x50\x78\x2b\x20\x19\x12\xc5\xfd\x35\x4b\x73\x22\x73\xae\x21\x61\x7a\x62\x3e\x18\xa1\x04\x90\xc5\x0a\xcf\x94\x21\xca\x51\x4d\x7d\xd5\x4b\x10\xaa\x0b\x7a\x2b\xe5\xe0\xe5\x10\xbf\x7c\x5c\xe3\x52\x12\x9a\xf0\x66\x46\xdf\x8f\x81\x62\x35\x2f\x6d\x27\x64\x01\x5e\xac\xe1\xfb\x35\x55\x44\x66\xae\x4c\xf3\xe8\x67\x94\xed\x36\x59\xa6\x1d\xfd\x55\x93\x50\xa6\x20\x97\x83\x85\x66\xed\xc9\x6f\x7b\x0f\xfd\x74\x1d\xb6\xe4\xa8\xb2\x86\xb6\x04\x68\x9d\x25\x91\xae\x98\xe7\xae\xef\x2b\x50\xc4\x54\x96\x5a\x26\x95\x83\x76\x92\x22\x01\xea\x0f\xb5\x27\x3e\x81\x81\xc6\xe9\xdd\x44\xd3\x62\xac\xb8\xb2\xfd\xcb\xdb\x88\x8e\x88\xed\xc7\x77\x28\x21\xa3\xb5\x7b\xc7\x6b\x55\x65\x33\x89\xd2\xd1\x0c\xc8\x17\xb5\x93\x6a\x04\x33\xb8\x72\x55\xb1\x23\x8f\xa4\xce\x8d\x4a\xb6\xc1\x20\xd6\x82\xd9\x7b\xeb\x06\xa5\xc5\x2c\x43\xa2\x50\x49\xc6\x09\xd0\x8e\x40\xa2\xd4\x5c\xed\x18\x3b\x96\x8c\xf6\x9a\xc1\xa1\xf8\x7e\x1f\xea\xfe\xcd\x9f\x83\xc2\xd1\x02\xaa\xa8\x4b\x66\xbd\x1a\x85\xc0\xf2\x4f\xe6\x40\x66\x57\x02\xd8\x9c\x00\x5e\x1e\xd9\x2f\xba\x99\xc8\x60\xfc\x24\xa2\x21\x00\xbd\x66\x32\x8f\x97\xdc\x3f\x36\x9c\x71\xdc\x73\xa3\xce\x0a\x63\xa6\x36\x4a\xf4\x2d\xb7\xaa\x9d\xb8\xec\x11\x0d\x69\xbd\xed\xd2\x85\xd3\x2d\x0f\x00\x87\xcb\x32\x46\xfa\x6d\xc8\x8e\xca\x11\xc4\x5a\xf8\x21\x42\xf7\xc3\xf8\xbb\xc7\x20\x70\xd0\x43\x55\x95\x0c\xff\x9d\x9e\x94\xeb\xe5\x57\xfd\x94\x8f\xfb\x26\xb9\x33\xd1\x0d\xd0\x7d\x2d\x80\x64\xe3\xaa\x9c\x7c\x55\x32\xe7\x6f\x82\x38\x94\xa7\x17\xf8\x1a\x2a\x4d\xab\x7a\x63\x7b\x96\x5f\xc3\x01\xf2\xec\xc9\xb0\xf0\xc7\x68\xb7\x06\xb7\x39\xba\xfe\x95\x0d\xb5\xb9\x57\x94\x78\x5b\x22\x9c\x9a\x55\xdd\x9f\xdc\x9f\x2f\x7b\x8e\x12\x0a\xd0\xe6\x52\x6a\x54\x63\x10\xea\xdf\xa7\x2a\x6c\xb2\x07\x54\x96\x22\x27\x0e\x86\x53\xcc\xb8\xe0\xd2\x54\x62\x99\x9a\x24\xe8\xf3\x72\x51\x12\x97\x2e\x1e\x8c\xe6\x5a\x73\x56\x9b\xf2\xec\x4a\x1b\x04\x3b\x5b\x0b\x25\xab\x10\xb0\xc8\x6a\x52\xf3\xd9\x47\x4f\x37\x46\x52\x33\x18\xf7\x10\x8f\x63\xf8\x19\x26\xde\xa7\x7d\x87\x56\x8e\x5e\xac\xec\x68\xe4\x7a\x59\x94\xbc\x5e\xdc\x53\xfc\x4f\x75\x8d\x1d\x37\x68\x51\x4c\x56\xdc\x7b\x18\xad\xe0\x38\xee\xcf\xbc\xe2\x1d\xbc\xd3\xa4\xc1\xde\xeb\xf2\xda\x7d\xb1\xab\x8b\x17\x03\x15\xf5\x0a\x88\x15\x49\xbb\x40\x5f\xd1\x21\xd1\x32\x66\x62\x25\xd5\xd9\x07\xe8\xa3\x31\xe6\x6c\x9f\x94\x1a\x56\x89\x03\x4d\x94\xa0\x1d\x2d\x3a\x3f\x19\xda\xf8\x3e\x0c\x2d\xd8\x4e\x13\xf1\x36\x75\xaa\x76\x4b\x11\x93\x99\x57\x55\xaa\x7a\x28\xfa\x64\xf7\x42\x66\x25\x4c\x5d\xd7\xbb\x8d\x91\x27\xf7\x31\xe0\x76\xe3\x28\xf7\x38\xbf\x86\x9b\xe8\xbd\x56\x49\xc8\x10\x92\xfb\xef\xcc\xc7\x77\xa7\x55\xd1\xc4\xa0\x03\x45\x1b\x50\x56\x2b\xe3\x0e\xcd\x1e\x96\xe5\x8c\x24\x46\xf8\xe7\x79\x7c\xb0\x66\xc8\x92\x68\x59\x50\x12\xe7\x35\x22\xc9\x5d\x7c\x8f\x25\xa9\x81\x81\x3c\x9b\x83\x91\x9e\x56\x76\x9e\x62\x70\x7f\xa3\xa5\x20\x29\xf0\xb1\x69\x42\x9e\xf7\x25\xe0\x5b\x0c\xd6\x26\xe8\x48\xee\x8a\x0b\xb9\x5a\x16\x3c\xc3\xa1\x56\x2e\xb7\x5e\x85\x71\x8f\x07\xa1\x4b\x6e\xeb\x00\x04\x49\x0a\xe5\x5c\x91\x34\xed\x55\xd2\x57\xce\x68\xe3\xfc\x8f\xce\xf2\x70\x06\x3a\xa4\xb6\x38\xf8\x70\x32\x7a\x13\xed\x0c\x7e\x5f\x0f\x9b\x37\x3e\x90\x0a\x39\x8f\xea\x89\xe8\x0b\xc2\xec\x22\x3e\x4b\xc9\x99\x0e\xdd\xaa\xfd\x1a\x8a\x12\xf0\x91\xf5\x7c\xe2\x3e\x32\x43\xbc\xf7\xce\xb2\x4a\xd6\xcb\x7c\x09\x2a\x80\x6b\x38\x88\x75\xdc\x4a\xdd\xc7\xc3\x90\x77\x58\xf9\x71\x1e\x32\xdf\xf5\xd7\x40\x94\x61\xb9\xbc\x63\x8f\x1c\x6d\x5b\xc9\xbb\xf9\x70\xef\x7a\xd9\xc1\x80\x01\xca\x05\xd1\x83\x4a\x6f\x49\xae\xdd\xdb\x2b\x72\x70\x44\xea\xee\x47\x39\xf5\x3c\x42\xa9\x1f\x9a\xee\xce\xf9\x6b\x5d\xd1\x14\xe5\x92\x94\x5c\x66\x49\x8e\x77\xed\x60\x69\x9f\x4b\xa2\x33\x59\xba\x97\x72\x0d\xea\x76\x94\x04\x83\x88\x5b\x32\x46\xa4\xf9\xba\xcd\x56\x4c\x7a\xb3\x46\x85\xf9\x5e\x66\x82\x21\x92\x56\x4c\x50\xf8\x26\xba\xfa\x3d\x7e\xce\x27\xdf\xcf\xc7\x49\xc8\x3b\x84\x95\x06\x05\x27\xb5\x65\xdd\x4d\x2d\xdf\x95\xf2\x2f\xea\x13\xaa\xb3\xa9\x4d\x74\xfb\xd6\x75\x60\x3e\x34\x6c\xee\x83\x00\x00\x23\x24\x12\x2d\x78\x88\xab\x40\x19\x7e\x44\xff\xe7\xc0\x71\xa9\x96\x28\xfd\x6c\x0c\x9e\xfd\xd8\x72\xcc\xde\xdb\xe1\x97\xbe\x29\xd4\x48\x0d\xd9\xc1\xa2\xac\x93\x3c\xb5\xd6\xab\x79\x52\x72\x21\x62\x24\xf7\x3a\x2b\x90\xe5\x75\xd9\x34\x5f\x00\xa6\xa3\x96\x98\xe5\x8e\x84\x56\x77\x87\x67\x8c\x56\xdf\xbc\xc0\xb6\x5c\xc9\x19\x20\xbe\x45\x74\x79\x3a\xa4\x94\x74\xe6\x54\x9c\xd1\x25\x0f\x58\xa0\x73\x2f\x99\x3c\x56\x3e\x0a\x42\x4b\x64\x41\xa6\x74\x85\xf0\xac\x03\x0e\xe6\x20\x61\x50\x41\xa7\x01\x77\x55\x26\x09\x99\xac\x56\x0b\x1a\x6b\xdf\x70\x05\x88\xc3\xf8\x04\x18\x61\x1e\x6e\xb1\x22\xb2\x29\x54\xc9\xe4\xc2\x79\x52\x39\x62\x42\x4f\x92\x1c\x05\x56\xa3\x8b\xb8\x95\x4b\x15\xc3\x5c\xd2\x6b\x34\x29\x69\x29\x51\x06\x56\x1d\x5a\xcf\xbd\xe1\xb9\x7b\xaf\x43\x87\x52\x69\xbd\x82\xd8\x3b\x9d\x4f\xee\x13\x24\x40\xf5\x13\x9b\x71\x3e\xb2\x01\xab\x2c\x68\x0b\x12\x79\xf9\xfb\x0f\x51\xf9\x83\x01\x30\xa5\x4a\xe9\x5c\x57\x5e\xe0\x50\x29\x1a\x23\x8a\x49\xe1\xf1\xe6\x4c\xa7\xc2\x61\x81\xe6\xb8\xdf\xab\x6e\xad\x70\x1c\xc6\x43\x96\xa3\xbd\x1a\xa7\x61\xaa\x0b\x6c\x91\xfa\x30\x8c\xa9\xa5\x10\x14\x09\xb4\xd4\x01\x2f\x77\x6e\x61\xd4\x1b\xf9\x51\x12\xb7\x15\x15\x62\x85\xad\x95\x6b\x86\xb2\xbc\x49\x77\x7c\x71\x63\x10\x6c\x40\x10\x84\xc4\x0f\xed\xae\x07\xd9\x68\x37\x26\x56\x02\x84\x60\x0e\xf5\xc7\x05\x23\x82\xa0\x96\xed\x33\x82\x61\x05\x7b\xb9\xc5\xa5\x69\x93\x39\x73\x01\x1b\x2a\xd5\xe2\x76\xb6\xd5\xc9\x95\x8e\x69\xfe\xeb\xfb\x65\x88\x3e\xa8\x97\xb7\x4b\xd6\x1a\x4b\x18\x85\x8d\xce\xbe\xbb\x60\x4e\x76\x91\xbe\x83\x75\x87\xe2\x25\x09\x3e\x49\xae\x81\x9e\x01\x86\x41\x0d\x8b\x77\x29\x0a\x2a\x78\x36\x9b\x1c\x18\x3d\xc4\x68\xa9\xdf\xca\xc0\x76\xb6\xf1\x0f\xb4\x67\xa3\x51\x73\x39\x0c\x20\x08\x70\x53\xee\xd5\xef\x36\xdd\x08\xed\x61\xc5\x4f\x58\x59\x0c\x42\xc0\x40\xb8\xe3\x8f\xfb\x4e\x81\x2c\x81\x5e\xc7\x1c\x5a\xdb\xa4\x55\x6d\x4e\xce\x6c\x36\x6c\x02\x37\x1c\xb6\xf5\xbb\xe5\x80\xee\x75\xdb\x4d\x7d\xf4\xe3\x09\x53\x8b\xd3\xb6\xd9\xce\xe8\x11\x68\xa9\x6b\x86\x85\x73\x74\x9a\x07\xdb\x12\x41\x13\x21\xd4\x0e\x42\x11\x8c\xeb\x6e\xab\x72\x9d\xa1\xcd\xdd\x1b\x94\x0c\x82\xb2\xbe\xed\x92\x8a\xc4\x0e\x4c\xa5\x80\x6e\xac\xf6\x49\x0b\xe5\x12\x81\x42\x57\xe3\xcd\x12\x3b\xcf\x4e\xd9\x58\xf5\xbc\xfa\xa0\x26\xbe\x38\x6a\xc4\x02\x42\x34\xd6\xd5\x41\x39\xa4\x88\x5a\xa2\xa0\x54\xb7\xbf\x7c\x16\x8f\x1c\x7e\xa5\xe3\x31\x79\x10\x5e\x22\x8f\x43\xb0\xd8\x98\xa8\x49\x15\xab\x71\xb5\x2b\x81\xa6\xb1\x18\x6f\xc3\xcb\xf4\x34\x07\x9f\x91\x59\x8b\x10\xd5\x83\x39\xc6\xd0\x57\xd3\xd3\x71\x6b\x55\x68\xca\x63\x41\xc9\x5f\xb9\xa2\x85\x7c\x61\x97\x60\x47\xe9\xe1\x51\x33\xd7\x7d\xf2\x3a\xc7\xce\x17\xaf\x57\xcb\xf1\xab\xf9\x6d\x14\x2f\x2e\x1c\x34\xde\xfd\x0e\xfa\x49\xa6\x5a\x25\x7c\x9f\xd5\x74\x15\x32\xe1\x5e\xc2\xa1\x41\x9f\x98\x98\x9e\xa6\xb4\xeb\xf8\x13\x0e\x5c\x9f\xe2\x26\xfc\xca\x36\x76\x06\x84\x7f\xcb\xce\x6c\x3d\x8d\xef\xa3\x76\xbe\x6f\x81\x1a\x6f\xf9\xdf\x54\x65\x6f\x36\x29\x63\x73\x49\x74\x84\x45\x51\x8e\xcb\x83\x7b\xcb\x3f\x01\xaa\x00\xe5\x82\x91\xbc\x24\x43\xd9\x87\x6d\xa9\x7b\xff\x63\xd8\x5b\xc7\x29\xb9\x8f\x6e\xb4\x2e\x25\xa5\x9d\x85\x4a\x9e\xf7\x4f\x79\x63\x93\x79\xf4\x59\x7e\x49\x33\xca\xd8\xf6\x63\x67\xc1\x4b\x5e\x3a\x7a\x78\x7c\x25\xb4\xf2\x42\xf1\x92\xbc\xac\x24\x81\xa6\x29\x78\x02\x93\x54\xbf\xa6\x51\xae\x45\xa1\x16\x59\xea\x52\xe5\xa2\xe5\x0f\xc6\xe2\xe7\xd2\x8c\xf9\x29\x05\xb8\x57\xa5\xc6\xba\x82\xb8\x32\xcc\xfe\x45\xa0\xef\x77\x60\xf6\xb9\x37\x7c\xd6\x30\x02\x1b\x02\xa3\x82\xb8\xdc\x63\xdc\xa2\x12\xb6\xb1\x85\x02\xb4\xbc\xd4\xcf\x67\xac\xbe\xf7\x93\x06\x6d\xdb\x64\x4c\xc0\xb8\x49\x4b\x81\xd5\xec\x46\xf2\x05\x9a\x2b\x82\x9c\x03\x45\x00\xde\xda\x2d\x4a\x5b\x05\xe3\xb0\xe2\x08\x2d\x97\x9b\x66\x6d\x15\x96\x03\x94\x06\x53\x5a\x62\xd4\x95\xa3\xf6\xc7\xa9\x92\xd7\x6d\x33\x29\x06\x9c\x6e\x12\xf4\xff\x55\x05\xd4\x1e\x1e\xa6\xa1\x2a\xcc\xfa\xd8\x02\x47\xfb\x85\xd1\xc2\xfd\x3e\x2a\x4e\x44\xcc\x86\x3b\x05\x2e\x4b\x87\x6e\x1f\x02\xf1\xa9\xcb\xde\x66\x04\x23\x9b\x93\xa2\xbf\x17\x32\x30\xa8\xc3\x8f\xba\x6c\xbf\x44\xb3\xb1\x77\x0c\x24\x90\x35\x66\x2d\x79\x8d\xcd\xb5\x25\xd4\xd5\x1d\xb4\xa0\x76\xa9\x66\x8c\x16\x60\x2b\xd0\x3f\xa7\x8d\x81\x01\x4c\xf6\xae\x35\xd3\x84\xe8\x02\xc7\x60\x9b\xe6\xfd\xb1\x56\x2d\x4c\xa5\xdc\x2e\x0c\x42\x71\x03\xb6\x8d\x7e\x9a\x77\x3b\xe3\xd9\xa1\x77\x2c\x85\x0a\x78\x04\xaa\x9b\x31\xd2\xc9\x9b\x89\x75\x28\x39\x1c\x75\x79\x09\x8a\x6d\x76\x53\xcc\x05\x88\x90\xe9\x30\x1d\xa0\xdd\x31\xec\x8d\x71\x7f\xe7\xcc\x1e\x46\x60\x01\x6f\xe6\x96\xa9\x11\x78\x4e\x8f\x24\x2a\xb6\x8a\xfb\xf3\x30\x6e\xe4\x5c\xce\x9a\x9c\x9f\x0b\x7a\xec\x83\x1b\x83\xe5\x45\xcc\x1f\xe5\x90\x4e\x6f\x83\x1a\x1e\x1a\x1a\x18\x86\xe0\x67\x57\xed\x54\xbe\x3c\xc4\x95\x69\x18\xb3\xf9\x0e\x0b\xeb\xb7\x49\x23\x34\x20\x52\x8e\x6c\x94\x71\x17\x77\x4a\x3a\xdf\x2b\x50\x37\xa7\x98\xc3\x65\xb5\x02\xb3\xe0\x90\x8c\x04\xd7\xc1\x6f\xf9\x54\xd7\x9a\x85\x65\xcc\xfe\x04\xdd\x49\xe7\x3d\xb5\x04\x2b\x02\x11\x69\xb2\x23\x2a\x04\x70\x8c\x36\x84\x03\xf5\x6e\x37\xf3\x9c\xa7\xc7\xc8\xf1\xd6\x96\x67\x72\x71\xfd\xa1\x6c\x71\x1c\x20\x4b\x1e\x45\xab\xa1\xd9\x92\xf3\x65\x4b\xfc\xaa\xec\x86\xf0\xc7\x4d\x7c\xb5\xaa\x08\x7c\x9f\x7c\x1d\x6e\xb5\xa7\x03\x49\x7d\xb7\x3f\x56\x7e\xcd\xab\x69\x79\xa6\xd3\x38\x7f\xd6\xd1\xb2\xe6\x5c\xc5\x34\xfd\xe5\xac\xca\x71\x65\x60\x1c\x7d\x64\x80\x19\xdb\xa0\xad\x94\x03\x9a\x66\x11\x9e\x4a\x6e\x47\x08\x33\x2f\xe7\x56\x59\x6d\x9a\x87\x9b\xaf\xba\xf5\x7f\x18\x3b\xf3\xc2\xe4\x90\xe1\x73\x1e\x08\xee\x27\x5a\xd1\x93\xc5\xed\x69\x33\x41\xe2\xd7\xf4\xbc\x29\xdb\xcb\x87\x93\x10\xe5\x4b\x3f\xb9\xea\xde\xfe\xc8\x0b\x0e\xd0\x92\x7b\xe8\xaa\xde\xc7\x29\xa0\x56\x32\xda\x61\x40\x25\xf6\xf5\x08\xfc\xed\x70\x6a\xe8\x4c\x04\x82\x0d\xc4\x61\xec\x44\x3f\x89\x5e\x02\x64\x8f\xd0\xa7\xda\x82\xa1\x77\xdf\x20\xf9\xc5\xc7\x72\x0c\x07\xee\x79\xa2\xf3\x81\x03\x9d\xdc\x39\xca\x82\x5f\xe7\x9d\x82\x68\x0a\x7d\xb0\x53\xe5\xeb\xf6\x32\x35\x53\xe8\xe3\x57\xd4\xaf\x23\xd4\xe2\x15\xf7\xa8\xd6\xc8\xbc\x74\xa2\xa6\xd1\x70\x33\x4d\xe1\xc6\xac\xb4\x6f\xab\x51\x64\x27\x85\x9f\x71\x2f\x11\x7b\x39\xae\xb9\x87\x65\x87\x2e\xb5\x6d\x59\x87\xab\xe3\x37\x41\xb7\xab\xba\x7e\x8f\x9e\x6d\x95\x2c\xb5\x82\x9f\xc9\xbc\x3b\x1b\x87\xd5\x52\xa2\x84\xcf\xc5\x7a\x0d\x3d\x2a\xdd\xa0\x5d\x34\xf6\x94\xe1\x31\x9d\xfb\x95\x6e\x96\xec\xc0\x57\x14\x54\xb8\x77\x66\x5d\xca\x2d\xd1\x75\x17\xca\xa7\x39\xa7\xa7\xc2\x99\x52\xcb\x14\x9a\x35\x40\x3d\x03\x46\x48\x2a\x11\x6c\x06\x62\xbc\xd0\x48\x10\x22\x59\x36\xe5\xcd\xb9\x4a\x9a\xc5\xaa\x4c\xd3\x39\xd3\xb4\x2a\xe9\x63\xf2\x14\x94\x86\x2d\x41\x7d\x67\xe2\x88\x87\x7f\xfb\xa0\x2f\xc3\x1d\x43\x9b\x9c\x14\x78\xfd\x91\xaf\x72\xa9\x45\x58\xeb\x0f\x14\x74\xbb\xc6\xa2\xac\xd3\x2b\x39\x62\xef\x7b\xf1\x66\xe5\x25\xef\x80\x05\xb6\x73\xee\x38\xa6\x60\x50\x1b\xc2\x53\x04\xb1\x2c\x57\xc6\x44\x15\x03\x65\x1e\xaa\x4c\xb3\x52\x58\x0f\x7b\xdf\xb0\x1b\x90\x63\x4a\x5f\xee\x21\x9e\x5f\xc9\xea\x75\xff\xa6\xf4\x34\xaa\xe2\xa3\xc2\x1f\x8e\x64\x38\xe0\x91\x58\xd7\x7f\x16\xa9\x2d\x68\x5d\x35\xd3\xf6\xb7\x54\xe1\x61\x69\x3a\xb9\xcd\x40\x09\x3e\x33\x72\x6b\x5a\xea\xfc\x31\xe3\x83\xe1\x43\x39\x08\x15\x14\xc2\xeb\x15\xf4\xa0\xf8\x15\x49\x65\x32\x98\x60\x4f\xe0\xf3\xdd\x94\x15\xf2\x7c\x0f\xc8\x9e\x21\x54\xc6\x4e\x2d\x96\x71\x76\x95\xbb\xc2\xdf\x22\xf2\xc1\x9f\x6a\x1f\x00\x55\x8b\x4a\x84\x5d\xf3\xbb\xab\xaa\x5f\x46\x60\x67\x69\x2c\x2b\x9a\xb5\x21\x31\x8f\xce\xab\x46\x21\x4b\x1f\x71\x62\xbd\xe0\x59\x98\x81\x64\xeb\xf2\xa7\xca\xab\x2e\xd7\x3e\x03\xe1\x62\x63\xb5\x92\x78\x95\xe7\x99\xac\xaf\x22\xa3\xe3\xfa\xdc\xbe\xba\x08\xc2\x6f\x2b\x06\xbe\x6f\x41\xa2\x12\x59\x03\xa1\x5f\x91\x10\x4a\x96\x86\x60\x04\xab\x83\xed\x8d\x50\x56\x07\x48\x42\x83\xbb\x19\x26\xac\x4e\x33\xf3\xa9\x54\x66\xaa\x58\x25\x21\xca\x45\xae\xe2\x95\xfb\x63\x6a\x1b\xd5\xfc\x07\x37\x2f\xbb\xe0\x04\x8e\x5f\x94\x58\x48\x70\x88\x59\xcb\xf7\x5d\x2e\xbd\x24\x91\xa9\x21\x4f\x71\x3c\x4b\xea\xc1\x59\x64\x9a\x67\x7f\xda\x43\x9a\x68\x9a\x73\x23\x4a\xcb\x0b\x08\xdb\xf2\x23\x7c\x4c\x52\x38\x29\x05\x7d\xf5\x42\x2e\xdb\xea\x13\x12\x01\xbb\x84\x0c\xd0\xdd\x6c\x1d\x57\x01\x7d\xd5\xf6\xe2\x74\x38\x30\xa6\x6f\x27\x90\xf8\x90\x84\x4a\x4d\x27\x36\x58\xff\xa6\x6d\x2d\x28\xb0\xce\x56\xca\xd2\x7c\x3b\x4e\xfe\x63\x8c\x4c\xd5\x9c\x9b\xf4\xa5\x2a\xa0\x54\x49\x4f\x97\x5b\x33\x42\x36\x16\x18\xa6\x24\x97\x22\x24\xf4\x68\xcb\xa5\x46\x86\x8a\xa5\x02\xb8\xc2\xf4\xcb\x55\xf9\xa6\x32\x03\x2a\x01\x06\x80\x97\xa3\x1d\x40\x50\xad\xe1\x13\x18\xb2\x69\xc8\x31\x85\x3f\x4e\xe2\x28\xd3\x58\x56\xb9\xe4\x94\x2b\x8d\xcc\x28\x5b\x70\x0e\xb8\x6b\xdb\xaa\xc7\xce\x02\xdf\x95\x52\x3b\xc8\x08\x3c\xec\xb2\x34\xae\x2e\x79\xbd\x41\xbe\x94\x95\xf6\x4b\xaa\xea\xaf\xb2\xd0\x34\x10\x8c\x8a\x9e\xd5\xba\xbd\x6b\xf5\x58\x49\x3a\x23\x26\xe3\x26\x47\x4b\x45\xf6\x2f\xfa\xc5\x31\xb4\x6c\x9b\x74\xfa\xc2\x6b\x00\x2a\x13\xce\x8c\xf0\x31\x96\xf3\x81\x4d\xe9\x90\xdf\xff\xe3\x90\xa5\x76\x5c\x6a\xac\xed\x45\x00\xac\x80\xaf\xf6\xb0\x7c\xab\x34\x7b\x5b\xca\xff\x5d\x95\x4f\x5e\xa3\x9c\xe0\x97\xfe\xd7\xf4\x95\x13\x68\x2d\xcb\x50\x9e\x93\xe2\xcc\x61\x9a\xeb\x81\xd9\x72\x00\x90\x21\xf4\xff\xfc\x12\x88\xd3\x44\x26\x86\x06\xfb\xdb\x02\x9e\xef\xb2\x73\x85\xea\xdc\xdf\xc6\x80\x9d\xa8\xf8\xf6\xe3\x32\x74\xe4\x70\x3a\x96\x01\x0e\xaa\x5a\xd4\x37\xd6\xf3\x23\x67\x82\x3b\xa2\xd2\xae\xed\x51\x52\xca\xac\x9f\x0e\xe7\xfd\xae\x80\x09\xf9\x5d\x9b\x43\xf7\x1a\x26\x02\xbf\xea\x07\xd2\x5d\xb8\x2a\x33\xd6\x04\x34\x7b\x49\x63\x21\x75\xe1\x1f\xbc\x05\xfe\x1b\x00\x55\xdc\x94\x28\x0f\x29\xf9\x64\x7b\xbb\x29\x86\x39\x93\x36\x10\x27\x39\xa1\xbb\x6b\xc5\x82\x5a\x69\x97\xc3\x3a\x74\x47\x59\x73\x3a\x6d\x44\xc3\x5e\x51\xb4\x64\xf0\x81\xd6\x5b\x7b\x73\xa4\x34\x56\xae\x5e\xc0\xa8\x49\x55\x6c\x4f\xf6\x14\x5d\xce\x43\x57\x4c\xb5\x97\xe6\xfa\xb1\x65\x3e\x11\x46\xef\x8a\x9b\xbc\x4a\x60\x17\xa6\xc0\x28\x16\x7a\xf9\xa4\xcb\x55\x91\x0f\x4d\x80\x10\x2b\x2d\x55\x3d\x53\x1a\xf5\x16\x63\x64\xe3\x6b\xb6\x30\x86\x82\x0a\x5b\x28\x13\x05\x5e\x4d\x78\xb4\xc3\xb1\x34\x3c\xa4\x26\x94\x4a\xf6\xbf\x9f\x42\x52\x5e\xd6\x8f\x31\x41\x5a\xac\xae\x02\x25\x84\xe9\x0a\xa9\x3e\x5c\x0c\xd0\x77\x5f\x14\x05\x7a\xb0\xb3\xa8\xaa\xfb\xac\xfa\x5b\x43\x49\xe7\x71\xd2\x2b\xca\xce\xab\x5a\xa5\x13\x6d\x6e\xeb\xd0\x41\xce\x7b\x37\xba\xb5\x97\x60\x62\x1d\x5e\xd4\x12\x0c\x9a\x25\xdd\x66\x72\x20\xf4\x1b\x74\x1d\xa2\xda\xc6\xa7\x45\xff\x8a\x3d\x48\xaf\x04\xc8\x2b\x28\x2e\x8f\x54\xe3\xdf\x9b\xed\x44\x2e\xed\xe8\x03\x56\x8c\x78\xea\x55\x62\xe5\xe5\x32\x7c\xf7\x9c\xf0\x4a\x29\x75\x87\x63\x56\xff\x04\x28\x33\x01\xf8\x89\xb6\xa9\x49\xe7\x2b\xba\x45\x50\x78\xd8\xea\x10\x89\x7c\x44\xd6\xee\x16\x9a\x70\xf2\xea\x89\x8e\xb4\x29\x03\x99\x9f\xe7\x1a\xd7\x38\x30\x12\x23\x59\x4f\x9c\x4b\x32\x55\xf1\xff\x83\x88\xb9\x43\xb4\xc9\x01\xbc\x71\x26\xd0\xc6\x06\x02\x0a\xc7\xe6\x83\x78\x9f\x9e\x4a\x8f\xe5\x9a\xd4\xaa\x1b\x2f\xcf\xeb\x92\xa7\xda\xd7\x8a\x0d\x74\xc5\x45\xa2\x9e\x9a\xfc\xb6\x04\x5a\x36\x0d\x20\x87\x39\x61\x39\x8d\xab\x78\x2c\xe0\xa5\xda\x87\xf0\xc2\x84\x67\x2d\x47\x9c\xe9\x0d\xfa\x45\x80\xfc\x3e\x1a\x49\x97\xc8\xce\x58\xd8\xe9\xa4\x53\x55\xde\x2a\x1b\xea\x62\x5d\x3d\x59\xac\xb3\x7c\xcd\xab\xf0\x21\xfe\x02\x65\x8a\xc5\x27\x1c\xed\x2d\x8a\x45\xac\xad\x92\x5e\x24\xd2\x6e\x62\xbe\x07\x9a\x4b\x71\x99\x36\x49\xcc\x2e\x1d\xc2\x84\xc8\x03\x6a\x03\x41\x3d\x54\xc1\x75\x0d\xdb\x8a\x93\xb3\xda\xb5\x66\xc3\x24\xc4\x3a\xd1\xc5\x21\x51\xd2\x16\x75\x5c\x79\x25\xdd\x9c\xf6\xa2\xab\x1b\x34\x82\xe0\x0d\xfb\x0e\x00\x33\x6e\x44\x20\x27\x16\x95\x60\x83\xb2\x7a\xb4\xe1\x8e\xfc\x57\x8d\x15\x4c\x0e\x2a\xd7\x20\xba\xd3\xd8\x0f\xe5\xec\x3f\x6d\x25\x40\x2d\xcb\x52\xe4\xeb\xdf\xf0\x2c\xfc\x6c\x6a\xde\xcd\x2e\x6c\x0a\x31\xc7\x1d\xba\xcf\xea\x10\x40\xd0\xc9\x61\x9d\xe2\xe9\xba\x5c\xf7\x92\x1c\x9e\x3c\x6b\xf6\x3c\x50\x20\x1a\x94\x27\xfe\xa4\xec\xf3\xc3\x68\xc6\xda\x43\x18\xaa\x0e\x2d\xec\x70\x2f\xef\xa8\x93\x17\x02\xf2\x95\xe8\xb4\x5a\x07\x08\x8c\x44\xdc\x8c\x73\x23\xc1\x9f\x4d\x1a\x34\x14\xab\x52\x96\x2c\xd4\xb3\x96\xe3\x34\x46\x1f\xc0\x0a\x40\xb7\xaf\x7e\x2b\xd7\x83\xca\x32\x70\x17\xa7\xa9\x26\xce\x5b\x72\x5b\xb0\x7c\xdc\x4b\xe0\x21\x89\x7d\xaa\xc8\x23\xb0\x81\x83\xaf\x50\x8a\x2d\xb1\x99\xf3\xba\x8f\x52\x5c\x87\x22\xd1\xee\xba\x90\xb4\xbf\xca\xb2\x02\x6e\xb7\x5c\x93\xe7\x51\x01\x47\x86\x15\xdd\xfe\x57\x15\xac\xa3\x13\x7b\xf8\x28\x41\x73\xf6\x4b\x9e\xcc\xba\xa7\x58\x91\x0e\x8e\xbf\x00\x1e\xaa\x93\x1c\x89\xd9\xae\xe5\x63\x34\xf3\xd0\xf0\x4d\xc7\x89\xdb\x10\xfd\xc3\xe5\x32\x1a\xe8\x59\xe9\xf7\xcb\x5f\xf2\x3c\xfe\xad\x92\xbe\x78\xf5\x24\xca\x24\xfb\xbf\xed\x03\xfd\x38\x9f\x14\xdb\x8e\x06\xb1\xd9\x5b\x81\x6f\xf6\xfe\x9a\x65\x56\x32\x31\x1f\x28\x19\xee\x6a\xc1\x02\x60\xb5\x6d\xa8\x60\x69\x1b\xa3\x93\x60\xcc\x6b\x2d\x90\xc0\x90\x3e\x7b\x31\x51\x7e\xe4\xd2\x86\x41\xef\x65\xd1\x66\x9f\x26\x61\x35\x2b\x2d\x8c\x77\xfc\x14\xad\xb9\x2c\x69\x72\xef\x51\xd6\x48\x9f\x83\x98\xe3\x41\xc0\xb3\x5f\x42\xdf\x1b\xdf\x40\x49\xad\x79\xe1\x5a\x72\x6f\x13\x2f\xd8\xd4\x6d\x4a\xe8\x29\xd8\x97\x1f\x65\xa5\x41\xe5\x68\x3e\x35\x62\x84\xa6\x7d\x30\xb8\xb7\x14\x76\xa1\xa2\x71\x56\x50\x25\xd0\xda\xbb\xb9\xae\xf0\x32\x77\x3e\xf9\xe0\x1f\x79\xdf\x2e\x2b\xb9\x03\x4d\xfe\x6a\x0e\x36\x2a\xbc\x86\xa3\x31\xd7\xec\x5d\xf2\xc7\x62\x16\xdf\x78\xd6\x18\xa8\xbd\x7f\x09\x23\x02\x2e\x56\x01\xd8\x04\x37\x8d\x71\x66\xa5\xb7\x30\x13\x5d\x7a\x99\xf3\x1d\x58\x8f\xce\xc5\x7a\xe7\x91\x6a\x97\xe6\x5d\x87\xc0\xb9\x55\x53\xa7\xed\xf8\x04\x1e\xd4\x52\x7d\x71\xfa\x34\xe7\xfe\xc5\xd9\xe8\x2f\x5a\x19\xc8\x1c\x96\x61\xe2\x9d\x87\x1f\xbe\x39\x19\xbf\xfd\x4f\x52\x60\xba\x6e\xcb\x39\x93\xad\x25\x91\xb6\x58\x58\x3a\xd9\xf0\xa8\x79\x8d\x9e\xef\x68\x6e\x22\x3d\x5b\x74\xe8\x94\x77\x07\x2c\xd0\xcd\x79\xf9\x1e\x0b\x5b\x49\x99\x5f\xd0\xa0\x2d\xe5\x43\x09\x99\x8e\x5f\x10\x03\x24\xe5\xec\x10\xf5\xba\xfb\xa8\x28\x19\xfc\x13\xe9\x38\xbb\xde\x54\x35\xb7\x04\x4b\xc9\xb5\x1f\x01\xaa\xe2\xd4\xd1\x24\x92\x08\x9f\x49\x8e\x95\x58\xdd\x1f\x88\xaa\xbb\x68\x10\xe5\x25\x96\x72\x4a\xf6\xee\xe3\x51\x91\x82\x6f\x00\xaa\x38\x96\x07\xfc\xf4\x6a\x1b\x81\x6d\x12\xb8\x8a\xb2\xbd\x85\xf4\x7b\x63\x50\xc6\x53\x8c\x0a\x85\x42\x04\xbd\xf2\x1c\xd4\xd0\x97\xae\x54\xbe\x3f\xbd\xdc\x59\x9d\x15\xce\x65\xad\xbc\x8d\x13\x32\xf5\x50\xcb\x94\x49\x51\x17\x63\xbe\xd0\x43\x22\x56\x49\x27\x8e\x9c\x77\xb5\x73\x8e\xcc\x91\xe3\x31\x5e\xfd\x14\xb0\xe5\x66\xad\xdc\x0c\x39\xe1\xde\xa1\x43\x44\x62\x85\x7d\xdc\x89\xc1\x5f\x2d\x0e\x82\x7f\xcc\xb2\x5d\x3f\x0c\x0f\x8e\xc3\x62\xb4\xac\x1a\x36\x4d\x30\x29\x00\x66\xb0\x7e\xf8\xae\xf7\xb7\x0a\x0e\x8b\xb6\x77\x3d\x53\xf7\xe7\x68\x11\x57\x68\x67\x66\xdf\xea\x94\x1a\x48\x9a\xe6\x4a\xb2\x19\x35\x43\xda\xfb\x5e\xc2\x8b\xed\x00\x8d\x68\xbe\xe4\x9f\x18\xb2\x6d\x62\x90\xd3\x6c\xc4\x0f\x2c\xc4\x2f\x54\xdb\xf6\x57\xb4\x80\xfe\x19\xce\x84\xb1\x30\x97\xab\xd1\x63\x4b\xb4\x69\x60\xf6\x9e\x89\x2e\xb0\xed\xbb\x99\x77\x7d\x38\x8a\x97\x53\xeb\x99\x2b\x71\xc6\x43\xe8\x1b\xfb\x43\x5d\x28\x47\xcd\x1a\x64\x3b\x12\x58\x3b\xfe\x7a\x60\x3d\xcb\x75\xf0\x6b\x15\x1d\x11\x16\xae\x16\x52\x9c\x7b\x6c\xd0\x63\x2d\xf0\x70\xb9\x41\xdf\xc7\x23\xc5\x72\xb0\x3e\xad\x3a\x95\x30\x69\xe4\x39\xd6\x07\x56\x75\x25\x52\x47\x87\x6c\x59\x4b\xab\x82\xeb\xb4\x6b\xb3\xf3\x30\xe3\xf5\x59\x56\x34\xcb\xc0\x92\x96\x13\x10\x7e\xf4\x51\x74\x06\x98\x71\xae\xbd\x89\x12\xd3\xf0\x65\xeb\x00\x1a\x21\xff\x75\x88\x4f\x04\xa7\xe2\xcd\x13\x41\x74\x36\xcb\x93\xaa\x1a\x9c\x1c\x10\x82\x9a\x0c\xde\xa0\xcf\xaf\x07\x59\x49\xae\x81\x56\x3b\xf5\x4e\x30\x1a\xaa\x06\xf7\xf9\xc2\xd3\x65\xdd\xd4\x1e\xd4\x04\x71\x74\x8f\x31\x0f\x1b\x5c\x4c\x4e\x0b\x27\xc3\xcf\x9f\xe5\x92\xc0\xa7\xf8\x93\x87\x65\xb1\xe5\x59\x1f\x2b\x1c\x52\x63\x7b\xd1\x94\x45\x39\x68\xc5\xfc\x51\xef\x89\x64\x93\x41\xc6\x99\x30\xe5\x65\xcb\x89\xf0\x16\x35\x9f\x00\xa2\x97\x45\x22\xef\x7e\xe1\x5f\x4b\xa5\x7a\x36\xa1\x44\x89\xe5\x4d\xcd\x2a\x77\xaa\x1a\x1c\xac\x37\x76\xa7\x96\x60\x2c\x04\xef\x15\x4b\xdd\x8c\xee\x5b\xe9\x10\xe3\x11\x5e\xce\x32\xb2\xcc\xd9\xc3\x52\x97\xea\x13\x13\x4f\x78\x04\x86\x86\xdb\xbd\x5c\xcf\x54\x2f\x91\xea\x29\xe6\x10\xfd\x66\x9a\xd2\x08\xa1\xd0\xb7\x6d\xfb\x35\x0c\x05\xd0\x08\xd7\x56\x68\xcc\xd6\x23\x90\xa7\xde\x8a\x14\x07\x9b\xc4\xf5\x7d\x3f\xb0\xff\xff\x78\x2c\x99\x27\x20\x1a\x1a\x46\xfd\xa6\x7b\x30\xa1\x8d\xd1\x4b\x9a\x88\x52\x93\x57\x75\x17\x30\x2c\xec\xf4\xff\x49\x9b\xf9\xd0\x59\x83\x8f\x36\x33\x25\x51\xb3\x69\x0b\xd3\xfb\x96\x2e\x17\x37\xb7\xa9\x30\xc5\xaf\x78\xdf\x12\xe1\x42\xef\x00\x6a\x7f\x31\xfd\x6c\xcd\x6f\x74\x3f\x27\x87\x83\x68\x6b\x3e\x51\x39\xec\x64\x7a\x8f\x1a\xaa\x3f\x82\x46\x6e\x2c\x4c\x43\xe8\xb2\xc3\x1f\x95\x7b\x7d\xc2\x69\x4b\x35\x17\xe4\xb9\x51\x01\x93\x90\xbb\x72\x78\x09\xb0\x9e\x0a\xa5\xe9\x2c\xdf\xa6\xe8\x0e\x93\x9c\x7e\x21\x8e\xf4\x70\xd2\x5e\xb2\xd7\xc3\xc3\x83\xd4\xbd\x82\x47\x52\x96\xe8\x87\x59\x6f\x1a\x83\x5d\xc9\x2b\xd5\xa2\xcb\xa5\x96\xa1\xc3\xcd\x1e\x1a\xc1\x29\xf1\x0b\x79\x97\x8f\x4c\xe7\x99\xa4\x36\x65\xa5\x68\xdb\x4f\x24\xd2\x15\x3c\x7b\xae\x8d\x6c\x41\xce\xe5\x7b\xe4\x5b\x0e\x1b\x15\x3d\x55\xe1\x1a\xa9\xae\x35\x2f\x8e\xa8\x73\x0f\x93\x26\x34\x33\xc0\x9f\xe1\xae\x3f\xaa\x0c\x23\x52\x22\x29\xb3\xf6\x9f\x60\x91\x47\x30\xa5\x41\x85\x4f\x9a\x7a\xce\x21\x00\x86\x0e\xd6\xf2\x90\x7e\x0c\xc2\x75\xdc\xe2\x38\x51\x5f\x6a\x4d\xd2\xde\x54\x33\x73\x27\xf2\x4c\x8b\xe4\x5e\x23\x1a\x56\x84\xa5\x0c\x15\x30\x12\x56\x5f\x7b\x15\x58\xea\x7b\x9a\x72\xb3\x30\x62\x94\x7d\x4b\x72\x83\x1b\x50\xc7\x02\x15\xf0\xaf\x29\x40\x77\x86\x05\xab\x37\x55\x39\x04\xce\x2f\x8d\x7e\x54\x32\x00\x84\x5e\xc0\xcc\xcd\x56\x38\xb8\x30\xf0\x7d\x00\x40\xc3\xaa\x62\xef\xcf\x4e\xd6\x20\x99\x72\xc7\x26\x47\x6c\xd1\x38\xc7\xb9\x8a\xaa\x63\x8a\x02\xe8\x08\xac\xc6\x0a\x8e\x87\xbd\x41\xca\xd7\x23\x1d\xfa\x21\x1f\x6a\x61\x7b\xa2\x70\xdd\x17\xec\xf9\xbb\xee\xe1\x13\xa2\x27\xb5\x86\xa0\x37\x32\x65\x7c\x00\xa2\x52\x6c\xe3\x63\x74\x07\xa9\x7c\x6b\xd9\x96\xd3\x4b\xff\xde\xd5\x84\xba\x7d\x35\xc9\x74\x32\xc0\x5e\xd1\x34\xb1\xab\xd3\x5f\x96\xbd\x92\xcc\xb9\x47\x82\x19\xe8\xc1\x0f\xb4\x48\x74\x7d\x93\xc2\x19\x3a\x14\x5b\xb6\x35\x70\x5b\x75\xa8\x27\xb8\x3a\xdf\x28\xdf\x76\x23\x62\xc5\x17\x54\x65\x58\xf0\x59\x4f\x5e\x12\x3f\xa7\x80\xcf\x6a\x0b\x5f\x42\x52\xc1\x33\x93\xc4\x82\xeb\x95\x9f\xb3\x0a\xf4\x8e\xf3\x5a\x8d\x61\x87\x88\xbe\x97\x5e\xb7\x43\xb5\xa1\xb9\x83\x8f\x94\xc7\xe4\xce\xf8\xc3\x5a\x3b\x40\x0f\xfd\xb2\x92\xb0\xa8\x4d\x39\x55\x56\xf7\xbc\x4e\x8b\x79\x9b\x1f\x46\x38\xdf\xae\x79\xaf\x86\x02\x2b\x22\xe4\x43\x30\xbf\x07\x7d\x77\xf8\x37\x58\x01\x2e\xd4\x5a\x7b\xe0\x56\x07\x87\xec\xae\x6a\x80\x77\x15\x07\xd4\x6d\x31\xef\xef\x72\x4c\xa1\xbb\xcb\x16\x40\x98\xaa\xea\xbd\xa5\xa6\x18\xf9\x23\x5d\xfa\x20\x7a\xb3\x33\xf5\x51\x65\x53\x8e\x7f\x9b\xa8\x6c\x67\x28\x91\xb5\x61\xfe\x2c\xb8\x8a\x56\xaf\xd0\x4e\xb3\xd6\x69\x44\xe5\x8a\xb4\x8a\x10\xec\x8c\xcd\x00\x6e\x67\x09\x6d\xd6\x63\xed\x73\xf5\x80\xc0\x1e\xae\x2d\x7d\x47\x93\x1e\x2b\xf9\x15\x47\xad\xb7\xff\xd9\x41\xf2\x5f\xd6\xf9\x3b\xeb\xf3\x6a\x36\xf5\xa2\x81\x46\x51\xd0\x6c\xe4\x18\x51\x82\xb5\x41\x8a\x30\xfd\x53\xf5\xb0\x45\xad\x11\x23\x48\x75\xbc\xb4\xdc\x77\x8b\x8e\x04\xfc\x4f\x8f\x36\x54\x13\xbe\x51\xf7\xee\xa3\x1b\x87\x8d\x72\x86\xdd\x48\x5b\x1f\xb2\xf3\x8a\xf4\x94\x87\xcc\xb6\x46\x63\x16\x8a\x1a\x53\x35\x4b\xb1\xd2\xaa\x52\xef\xf7\xa5\x48\xf9\x1e\x3e\x7f\x36\x23\x06\x27\xdb\x97\xc2\xa7\x92\x2f\xfa\x42\x45\xf7\x69\x5c\x67\x8c\xe8\xd7\x28\x2c\x52\x07\xbd\x92\xfb\x8d\x68\xe1\x0a\x5e\xd7\x6d\x10\xdc\x8f\x37\x0e\x00\xa9\xc1\x94\x02\x78\xc1\xc4\xf4\xc6\xa0\x1e\xf6\x97\xcb\x1e\x7d\xb2\xc3\x73\x0e\x68\xe6\xf5\x6e\x61\x45\xba\xae\x66\x96\x13\x7c\x2a\x22\x13\xdc\xb8\x0b\x50\x5c\x6a\x6b\xfa\x5a\x96\x58\x3e\xee\xe9\x72\x01\x74\x84\x07\x7f\x5c\xa3\xb7\x72\x9a\x95\x0f\x2c\x14\x62\xa1\xd8\xef\x22\x63\xcd\x55\x9b\xa7\x5c\x17\x81\x62\xb4\x4f\x37\x1f\x5e\xc2\xf5\x69\xb9\xb8\xf4\xec\x65\xc4\x01\xb9\x57\x64\xd7\x8e\x71\xa2\x7b\x5c\xe3\xf4\xa2\xcd\x95\x06\x1b\xa3\x85\x65\xab\x5a\x28\x00\x87\xeb\x14\x12\x7c\x67\xe3\x85\x2b\x25\x50\x26\x93\x08\xbf\x6b\x34\xea\xfd\xa4\x2d\xc7\x28\x09\x36\xfe\xb1\xba\x57\x4d\xcd\xaa\x83\x89\x39\x05\xfb\x7d\x31\xe8\x10\x23\xbe\x54\x11\xf2\x29\x92\x6e\x90\x16\x98\x43\xeb\x7d\x6f\xc9\x54\xe2\xd4\x59\x92\x80\x40\xc4\xf0\xd8\xde\x07\x2b\xa3\xac\x12\xc1\x58\xa7\x6b\xd8\xe0\xf0\x3f\xee\x81\x34\x0f\x4d\xbe\x95\x3a\x7e\x21\xe7\xb1\x72\xe0\xac\xd7\xbb\x82\x72\x79\x4f\x31\xb4\xc7\xc4\x3a\x96\xb0\x38\xe1\xcc\x64\x84\x02\x87\xe7\x23\xf1\x35\x2c\x29\xec\xba\x31\xf1\xb2\x1d\xc3\x26\xd5\x4e\xd2\x49\xb9\xca\x96\xff\xb8\x1a\xe5\x73\xee\x02\x04\x3f\xd7\x5e\x70\xa9\x28\xdc\xaf\x4d\x55\x43\x8b\xde\xcd\x29\x7a\x61\x6d\xed\x8a\x39\xb5\xac\x4e\xf3\x59\x80\x9d\xe9\x7e\xc5\xfa\x49\x0c\xf1\x69\x0c\x26\x5e\x25\x9e\x4e\x69\xd5\x40\x45\xdd\xaa\xe7\xf8\x4a\x42\xb1\x1b\x5f\x23\x21\x42\xe9\xce\xc1\xc6\x77\xab\xd0\x6d\x40\x1f\x6d\x40\x60\xf4\x3a\x62\x5d\x8c\x52\xa6\x4e\x28\xf5\x51\xdd\xa6\xc1\xa6\x11\x32\x8b\x70\x8d\x60\x43\x63\xcb\xef\xab\x58\x48\x1d\xc4\x56\xf4\x3b\x9c\x68\xd7\xaa\xa0\x7c\x1e\x0e\x3a\x0f\x42\x50\x05\x2c\xa5\xf6\x48\xd8\x23\x62\x38\x13\xe8\xb6\x47\xf8\x1d\x82\xb2\x63\x04\xff\x23\x9d\x8c\x1a\x0f\x8c\x17\x38\xc4\x61\x6b\xdf\xee\x30\x1e\x80\x8f\x25\xd8\xe8\x4c\x07\xb6\x68\x72\x26\x8c\xb5\x2b\x0d\x9f\xfe\x16\xc4\xf3\x83\xfd\xa9\x59\xf8\xb6\x25\x0b\x97\x9c\x93\x8d\x24\xcb\x17\xbd\x47\x87\x55\xba\xa7\x25\x03\x1c\x5b\x4b\x0b\xbb\xe6\xb8\x71\x34\x9e\x14\xa5\xc1\x13\x8b\x81\x37\xdc\x23\x3d\xa5\x21\xd5\x47\x83\xee\x35\xc4\xbd\xe1\x76\x1f\xca\x93\x5d\x4f\xa5\x6c\xaf\xc1\x0c\x5f\xfc\x9b\x08\xc9\x30\x2d\xf6\xd9\x58\xea\x63\xb2\x09\xcf\x70\x02\x6d\x31\xf4\x14\x66\xb8\x75\x6b\x41\x06\x7d\x5e\x95\x53\xed\xe3\xa6\x53\x2b\xf7\x26\x61\x2f\xbf\xe8\x41\x38\xe7\x2c\xc1\xbf\xfa\x88\xe3\x81\x17\x03\x72\xf3\xb1\xe9\x33\x89\xee\x6c\x23\x16\xe3\xd0\xdf\xdd\x63\x2b\x6f\x25\x6b\xb5\xe5\x0a\xdd\x85\x4a\xeb\xe9\xf1\x78\x08\x3d\x94\xb3\x45\xfe\xec\x7b\x93\x05\x7a\x37\x16\x13\xb4\x46\x75\xd9\x44\x09\x6d\xc6\x0b\xe1\x80\x09\x8f\x58\xb5\xf6\xbf\x54\x9b\x6d\xb7\x00\x1f\x99\xda\x8a\xf1\x89\x51\x64\xd4\xb9\xf6\x30\x4c\xa6\xc2\x97\x3c\xcd\xe1\xa1\xfd\x9b\x7c\x8c\x7d\xb2\x95\x68\x3f\x89\xc1\xac\x5c\xa7\xb3\xfb\xcf\x14\x63\x14\xda\x3d\xa8\x87\xec\x10\xf1\xf5\xcb\x3d\xf8\x2e\x73\x25\xb6\x9a\x8d\x33\x17\x8a\x7e\x1d\x55\x64\xe5\xad\x36\xe3\xf1\xd2\x79\x24\x73\x62\x1c\x64\x8a\x7b\xc0\xc7\xe0\xc6\x9c\xeb\x23\xdf\x31\x31\x0b\xa1\x57\xd5\x24\xa6\x2d\x25\x15\x1e\x70\xd1\x51\x97\x8c\x78\x22\x2f\xfb\xad\x91\x72\x00\xa5\xc9\x3f\x3e\xd3\xa2\x1f\x75\xc8\x4c\x4a\x14\xee\xa3\x5f\x77\x9b\x3f\x33\x42\x61\xb5\xb3\x0e\xbb\xca\x16\x9d\x63\xc9\x06\x66\x7b\x3e\x21\x0e\x60\x79\xba\x76\xcc\xab\xd8\x28\x7b\x08\x54\xed\x93\xcf\x43\xd3\xc3\x55\xd3\x8c\x55\x07\x90\x23\x1b\x75\xc6\xca\xde\xd7\x3c\x1e\xc7\xa5\x88\x4f\x13\x8a\x7c\x03\x4b\x78\x74\x99\xd2\x42\x7c\xe7\x28\xff\x72\x62\x3c\xba\x68\x93\xed\xba\x4d\x82\x50\x22\x87\xe4\x4d\xd3\x84\xb9\x4f\x08\x6f\x40\x4f\x7d\x33\xe4\x73\x4a\x7f\x2f\x0e\xe6\x45\xe7\xe4\xb7\xfa\x5b\x7f\x72\x79\xbe\x28\x5d\xb8\xb1\x08\x12\x16\x14\x61\x91\x0a\x95\x06\x8a\x5b\x91\xf6\x6a\x7e\x9d\x62\xf3\x93\x53\xee\xb9\x4c\xde\x03\x3f\x9a\x5d\x0f\x4d\x95\x22\x5d\x5e\xdf\x8f\x55\x67\xbb\x5a\x08\xa9\x37\x76\xbf\x07\xc1\xfc\x72\x40\xe8\x6d\xe5\x65\x9d\xd4\xf2\x2d\x1d\x9f\x41\x4a\x56\x40\x09\xa8\x20\x3a\x43\x15\xca\x8a\x7c\xb5\xc2\xab\x9e\x39\xbc\x93\x07\xf5\xce\xca\x99\x62\x4c\x01\xd0\x76\x26\x43\x2c\x71\x66\x01\x88\xc5\xab\xcf\x56\x2a\x3a\xa7\x96\x46\x3a\x7e\x9a\xd5\x95\xdb\x21\x2c\x55\xe0\x1c\xa6\x24\x0f\x62\xb3\xbc\x59\xca\x35\xa3\x48\x5f\xd6\xcb\x38\x24\x01\x0c\xb6\x6b\x42\x54\xaa\x8b\xf9\xa3\x75\xe0\x07\xf2\x07\x3a\x0b\x96\xe1\x8d\x41\x80\xf3\xa2\x29\x7d\x34\x8d\x40\x59\x83\x2d\x04\xa1\xe6\xb0\xba\xfc\xc9\xfb\x10\xc8\x7f\x16\x2d\x16\xe8\xc0\x6b\xd8\x4e\xf2\x80\x4a\x7b\x54\x5a\x8e\xc2\x23\x53\x4f\xb4\xa3\xc2\xba\x65\xcd\x47\x08\x02\x22\x23\x48\x95\xd4\x55\x4d\xcb\xc7\x40\xbe\x6e\xb6\x2c\xb6\x0c\xe8\x45\x3c\x46\x7b\x21\x78\x03\xae\xd0\x7c\xd4\x96\x77\x8e\xf0\xad\x3e\xda\x67\xdd\xad\xc7\x7d\xa6\x12\x31\x15\x83\x1e\x80\x02\x48\x10\x04\x9c\xae\x89\xf3\xd2\x47\x06\x30\x50\x07\x64\xd9\xc3\xab\x4c\x2e\x65\x0a\x19\x99\x43\x52\xf3\x6c\x9a\x67\xd7\x83\x3c\xdf\x1e\x89\x7a\x2e\xf7\xbe\x37\x6f\xeb\xd3\x87\x72\x23\x35\x7d\x62\x08\xa4\x8f\x61\xae\x33\xcc\x7e\xf9\xcd\x9e\x29\x75\xc0\xf8\x06\xeb\x75\xf9\x82\x44\xf5\x32\xdf\x17\x1d\xbf\x3b\xeb\xb8\x8e\x6a\x55\xe6\x17\x40\xdd\xdc\x1b\xbd\x14\x75\x40\x6f\x4f\x01\x81\x18\x4b\x30\x73\xdf\x8c\xfe\x33\x31\x73\x90\x00\x58\xb6\xb5\xcc\xa5\x23\x59\x0e\xd2\x2c\xd8\xed\xbd\x0e\x8c\x88\x86\xd0\xad\xaf\x7e\x30\xd0\x82\xcd\x4f\xfd\xc4\x1b\xcb\x43\xcf\x28\x5a\x02\xdf\x19\x61\x00\x2b\xd3\xe6\xa5\x2e\x51\xf4\xf2\x72\x4c\xaf\x28\x70\x78\xf3\x71\xb9\x54\x08\x05\xb9\x8f\x7a\x73\xc4\x94\x39\xcd\xc1\x61\x2e\x72\x1d\x1d\x6c\x46\x03\x29\x36\x48\x5d\x3c\xfb\x7f\xee\x70\x9d\x23\x5c\xb4\x09\x66\x1a\x3a\xe1\x18\xbd\x5b\x06\x1d\x96\x89\x2e\xfe\x72\xb8\x88\x80\xd9\x7f\xe8\x16\x97\x01\xdb\x82\xa0\x3b\x1b\x59\x56\x0e\x45\x08\xe0\xd8\x13\x07\x79\xf9\xa0\xc2\xa6\xa1\x74\x40\x2c\x78\xbb\xc1\xc9\x80\xab\xe5\x27\xeb\x56\xc3\x27\xfa\x5e\xe9\xbc\x6d\x4c\x29\x7b\x8b\xe5\x45\xa3\xe9\xb0\x67\x07\x18\x2e\x85\xbe\x7a\x0e\x75\xd5\xf2\xe3\x26\x44\xe6\x89\x26\x33\x67\x2c\xfa\x82\x91\xbd\xff\x6b\xde\x8b\x67\x7f\x92\x8d\x06\x34\xad\x51\xf1\x89\xa4\x7a\xb2\x46\xda\x68\x1d\x16\x80\x2d\x24\xb8\x34\x1d\xce\xd3\xc2\x0a\x3e\xc6\x59\x2c\x42\xc5\x5a\x1b\xb9\x7d\xc2\xac\xe7\xc6\x76\xe2\x45\x53\x00\xfe\x78\x32\xee\x1d\x0a\x79\xab\xd3\x3c\xe0\x30\x21\xe0\xa5\x32\xd5\x84\x26\x34\xfd\x0c\xc7\x48\xe2\x51\x09\xff\x86\xb3\x7f\x0c\xe4\xef\x66\xd5\x0b\x9f\xc6\x3a\x73\xb7\xb1\x02\xdb\xb6\xe6\x6c\xc3\x08\x18\x38\x1d\xad\xa6\x90\x2f\xa8\xe6\xf2\x47\x12\x78\xc2\xb4\x94\x7d\x39\x55\xbb\x2e\xa5\x36\x90\x9c\x81\x8e\x46\x89\x36\xc7\x91\x0b\x06\xb2\x64\x9f\xbe\x2d\xa7\xc5\xab\x48\x61\x45\x8c\x5e\x89\x94\x19\x80\x42\x82\x07\x2c\x4f\xe7\xf0\xda\x2f\x0b\x69\x74\xef\x3e\xe9\x37\xc8\xcf\x51\x8f\x64\xcb\xbf\x96\x8d\xca\x6c\x66\x5b\x38\x2a\x60\x6a\x98\x5d\x65\xb7\x00\x01\xaf\x08\xce\xe5\x57\x93\xf2\xa6\x53\x79\xb5\x28\x0c\x8c\xc3\xfc\x74\xb7\x25\xe3\x1c\xde\x57\x98\x27\x4b\x0e\x26\xa4\x5d\x60\x5b\x7c\xd9\x61\x82\x5e\x35\xab\x23\x89\x53\xd8\xad\x1a\xc1\xc8\xd3\x97\x39\xbe\x67\x52\x9e\x46\x29\xf2\xe1\x40\xb6\x78\xcb\x18\x20\xb6\xd5\x73\xf3\x92\x10\xa5\x4a\x79\xf3\x57\x8f\x03\xb7\x1a\x90\x21\x93\xd3\x89\x8b\x0c\x65\xea\x09\xbe\x89\x1a\x54\xe7\x6d\x2d\xad\x16\xf3\xe8\x97\xbb\xcf\x52\x88\x5d\xf1\x63\x88\x35\xeb\x95\xa5\xca\x56\xcd\xe7\x11\x35\xd1\x7c\xb6\x83\xca\xd0\xd3\xbb\x77\xa6\x06\xab\x5b\x98\x18\x39\x08\x89\x35\xc3\x04\xe5\x46\x14\xdf\xe1\xa3\xf5\xe8\xc3\xc5\x3c\xa8\x71\x17\x74\xaf\xde\x4f\x8f\xaa\x18\x33\x85\x8f\x28\xef\x8d\x44\x8d\xc5\x58\xeb\x6d\xab\xb4\xb1\x62\xfb\xa7\x1c\xc8\x3e\x9c\x73\xf1\x20\x3e\x5b\x0d\xc0\x38\x8b\xbc\x99\x66\x8d\x47\x9e\x06\x52\x3f\x93\xb8\xe8\x3e\xb8\xab\x60\xc1\xcf\xb9\x31\x2c\x7c\x35\x3c\x7f\xce\xc9\x73\xf1\x1f\xb9\x90\x61\x2e\x16\x86\x0d\x3f\x08\x06\x77\x09\x9f\xfe\x44\x3f\x26\x20\x20\x37\xfb\x8e\x86\xb0\xc4\xf2\x8d\x5e\x1a\x69\xcb\x5c\x19\xdc\xf7\xb0\x9a\xfe\xc2\xd6\x52\x94\x7b\x5e\x0f\x64\xe5\x21\x67\x3a\xcc\xf3\x2c\x0d\x9b\xfb\xe1\x7a\xb5\xec\x00\x16\xa5\xd4\x98\xe0\x2f\x3e\x3a\x22\xb6\x59\xa6\xdc\x58\x9c\x72\xc6\xc6\x02\xf3\x12\x53\x2c\xa1\x7c\x3f\xdc\x47\x41\x58\x57\x21\x4b\x15\xd0\x3b\xe0\xfd\x3a\x99\x43\xba\x46\xad\xd7\xa3\x9a\xf3\xf6\xcb\xcb\x1a\x06\x9a\xe0\x05\xbf\x25\x48\x26\xd8\xa9\xa6\x0c\x77\x25\xef\x13\xcb\xa5\xdf\x4d\x64\xc1\x75\x79\xd1\x5a\xca\xbd\x20\x5a\x97\xe3\x37\x2a\x6b\xe1\x11\xa3\x91\xa2\x47\x5c\x39\x75\xe3\x3c\x56\xa7\xa6\x0e\xe2\x83\x6e\x85\x74\x63\xaa\xe8\xc4\x35\x57\xd4\xe2\x37\x03\x9c\x4a\x39\x5c\x60\xb0\xe8\x21\x17\xea\x5e\x4f\x77\x50\xde\xba\x6d\xfb\xea\x55\xa5\x32\x3a\xfb\xa4\x45\xdb\xb6\xd2\x08\xed\x05\x09\xa1\x4d\x41\xd2\xdb\xe9\x6a\xff\x0a\xd1\x6d\xf9\xb0\x4e\x12\xa0\x7b\x23\x33\xba\x04\x02\x6d\xaf\x02\x75\x72\xdf\xa0\x4d\x83\xa5\xb5\xda\xa4\xc9\x1a\x91\x3d\x66\x68\x8f\xf1\xba\x74\xab\xe2\x82\xc8\xc3\x46\xaa\x07\xe8\xd4\x4a\x20\xa3\x97\x8a\x5d\x93\x02\x77\x80\xfe\x27\xd3\x15\x09\xfe\xa7\xf3\x7b\xdc\xc1\xa3\x34\x98\xed\x12\x1e\x0b\xd7\x3a\xd4\x91\xac\x94\x13\xfc\x62\xc7\x90\x5e\x49\x10\xe5\xaf\xf0\x11\x72\xf2\xf5\xba\x38\x72\x83\x70\x91\x90\xb6\x7f\x88\x3a\xa4\x90\xa1\x8d\xef\x81\xff\xeb\xe0\x3b\x5e\xd6\xbf\x27\x31\x0d\xbf\xdf\x66\x40\x95\xc5\xe3\xdb\xae\x93\x8b\xa4\xca\xe1\xbe\x42\x47\x66\x03\x8a\x5e\x69\xc7\xf9\x37\x0b\x20\xc2\xfa\xb4\xad\x88\xc4\xd1\x03\xa1\xe3\x32\xef\x3e\xb2\x50\x7f\x07\xbc\x20\x1f\x5a\x2d\x2e\x82\xc3\x4d\xa0\x7a\xf8\x90\xf0\xd5\x88\x24\x4e\xbf\x03\xbb\xee\x13\xf8\xe0\x4c\xd2\x82\xa7\xf5\x1f\xd8\x3f\x30\x8f\x12\x10\xfc\x6d\xb5\xf8\x70\x48\x70\xb9\x2c\x13\xee\xfd\x6c\x70\x05\xb5\x95\xf6\x82\x23\xf9\x55\x3d\x6b\x03\xb2\x58\x62\xac\x5e\x03\xdc\xca\xd0\x41\x43\xbe\x2f\x93\x85\xa5\xdc\x1e\x72\x1b\xd8\xe7\x91\xe9\x1f\x55\x18\x55\xdc\x96\xb3\xbc\xab\xbd\xde\xa5\xb3\xbd\xed\x3c\x7f\xf9\xdc\x26\xad\x66\xb9\xe5\x95\x22\x40\xc4\x77\x40\xde\x46\x1d\xdf\x9c\x81\xfa\xf4\x36\x68\x0e\x22\x44\xe1\x7d\x84\xdc\xc9\xd8\x47\xd3\xca\xf3\x5b\x72\x8d\x39\x5c\x11\xb6\xdc\xc5\x81\x1b\xc2\xd6\x5b\xff\x45\xcf\xc5\xa9\xb9\x6d\xfd\xd7\x5d\x6c\xe8\xe8\x0e\x87\xbf\x29\x2c\xc9\x52\x1c\xe9\xa5\xe2\x48\xf6\xf9\x03\xbc\xb1\x3b\x85\xae\xf4\x80\x51\x4f\x67\xe3\x58\x6a\x48\x15\x8b\x44\xce\x7c\x89\x55\xfe\x86\xa1\xa2\xb2\xfb\x14\xff\x0b\x73\x1c\xaf\x5f\xf9\x59\xe1\xf3\x25\xfe\x86\xf4\x73\x73\x55\x06\x6b\x28\xe6\x73\xf6\x18\xb3\x46\x39\xb1\x78\x3a\xd9\xbb\x1e\x2f\x01\xf6\xea\x27\xad\x68\xcb\x4d\x6a\xcb\xac\xd6\xae\x5b\xc3\xd9\xa6\x7c\xc7\x6e\xca\xae\xe3\xc3\xa9\x40\x0c\x51\x57\xbe\xf3\xb2\x80\xa6\xbe\xdd\x9f\xca\xa5\x11\x0a\x12\x65\xbd\x8a\xaa\x9b\x37\x2b\x00\xe0\xf0\x07\xd2\x44\x7d\x04\x60\x2e\x33\x40\x8e\xd2\xc3\xaf\x79\xc9\x72\x86\x70\xf3\x92\xeb\x5f\x57\xc9\x4f\x2a\xc5\x23\xc1\x5a\xca\x4b\x34\x52\xba\x3c\xf7\x68\x44\xce\x00\x6c\xbb\x7f\x3d\x85\xb3\xcc\x0c\x72\x37\x1b\x17\xb1\x53\x29\x90\x82\x32\x70\xe9\x93\xd9\xf7\xb7\x40\xf9\x9b\x72\x35\x43\xcc\x39\x20\xff\x3a\xf9\x7d\x07\x3e\x42\x97\x35\x55\x53\xcf\xa3\xf2\xef\xf9\xcf\x98\x3c\x73\xc1\xf4\xb0\x43\xef\x46\x65\xfa\xd2\x91\x41\xc4\xb5\x95\xde\xa8\x1c\xc5\xdf\xfe\xc9\x53\x94\xe3\xa5\x06\x99\xb9\x64\x00\xd1\xaa\xbc\xd3\x90\xd6\xdc\x52\x38\xea\xdc\xd3\x71\x5e\x30\xce\xee\x9c\x1e\x17\x5b\x60\x47\x72\x1b\x3f\x0a\x79\x8f\x48\x03\xa4\xc9\xc9\xb6\xc0\x5c\xb5\xb9\x86\x72\xdd\xf3\x3c\x18\xce\x05\xb8\x1e\x7e\x32\x43\xc9\x73\xa2\x1d\x8e\x1d\xca\xbd\x3c\x60\xe4\xc0\x3a\xbe\x7c\x62\x84\xc5\xc0\x5c\x72\x37\x6f\x6b\x39\x9f\x4f\xbe\x0e\xb5\x3c\x59\x9c\xb3\x76\xbf\xa0\x31\x65\xbb\x50\xc1\x37\xd8\x5b\xa2\x74\x25\xb7\xb5\x1d\x1b\x1e\x25\xe1\x46\xee\x45\x01\xee\xd3\x0a\x67\x25\x79\x70\x4f\xef\x6e\x06\xe1\x7d\xfc\x6b\x6d\x2a\x26\xfe\x77\x97\xf8\x7d\x67\xf6\x2d\xab\xf9\xb1\x5a\x2e\x67\x68\x7e\x0a\x26\xa3\x57\xec\x4b\xd4\xd6\x26\xc1\x98\x7e\x0e\x15\x17\x16\xf7\x37\x53\xbd\x0c\x8c\x31\xd9\x84\xd3\x56\x65\x10\x12\xb7\xf2\xd4\xd6\x40\xc4\x2e\xb7\x21\x44\x88\x64\x02\xda\x19\x5e\xe7\xa6\xaf\xeb\xa5\xff\xb8\x82\xb3\xc7\x2c\x57\xfd\x23\x9b\x18\x36\x7c\xba\xad\xfa\x59\x3a\x1d\x93\xc0\xbf\x11\x35\xbb\xec\x2b\xe9\x6c\xff\x1b\x45\xba\x74\x06\xea\x14\xb7\x87\x77\x4a\x55\x13\x5e\xf6\xf0\x94\x45\x0d\xbf\x56\x78\x4d\x8f\xdc\x4f\xa9\x03\xd0\x86\xee\x7b\x4f\x9e\x10\xc0\xb2\x5d\xb7\xe5\xd7\x4e\xff\x92\xad\x87\x7a\x57\xfb\x4e\x7b\x5b\x5c\x58\x0b\x46\xd6\x37\x0e\x83\xb7\x2b\xf7\x00\xc2\x2d\x24\x8b\xa7\x6a\x47\x2d\x13\xea\x1b\x49\x64\xfd\x5c\x45\xfe\x12\xdb\x99\x29\xa4\x63\x84\x6d\x2d\xe7\x44\xf2\xa4\xf8\x9c\xa4\x6e\x5c\x0e\xaf\x98\xe4\x03\xbb\x3a\x56\x0d\x83\xa4\x5b\x4c\x6c\xd5\x40\x80\x7b\xa0\x16\x41\xc7\x6a\x66\x4a\xa4\x42\x0f\xd5\x42\x4e\x4d\xb2\x0f\x7d\x68\xfa\x97\x4c\x85\x19\xc3\xd9\x59\x1c\x10\xc0\x0b\x4b\x7a\x6d\x82\x83\x55\x85\x83\xdd\x77\xca\xc6\x43\x9b\x98\x78\x64\x15\xfb\x24\x8b\xaa\x09\x90\x2c\x47\x51\x5e\x37\xeb\x6d\x43\x3b\xb0\x84\xfd\x4d\x63\x20\xf1\xd5\xf8\xf9\x7f\x94\xd4\x7c\xbe\xa6\x47\xef\x51\x86\x45\x6f\x28\x11\x2a\x35\xa1\x75\xbe\x97\xe3\xd6\x39\x0b\x78\xa3\xd3\x63\x13\xfb\xe6\xaa\xf9\x5e\xbc\xa8\x6f\xae\xe2\x9f\x2e\xe2\xed\x99\xa8\x5c\xe2\x5d\xf6\xf5\x8d\x15\xfd\x8e\x39\xa2\x97\xbc\xa1\x30\x84\xab\x7c\x51\x2d\xf4\x2b\xb4\x10\x8d\x9a\x42\xd2\xe9\x6c\xf6\xe3\x13\x1f\xb5\xb2\x27\x20\x34\x6a\x6e\x4c\x68\x42\x56\xe7\x18\x36\xb6\xf8\x61\x64\xb3\x55\xaa\xf1\x66\x26\x82\xf3\xa7\x40\x16\x25\x55\x0d\x57\x1f\xa0\x56\x58\xfb\xea\x52\x18\x92\x5b\x4c\x26\xb2\x7a\xf7\xfe\x71\xc9\x55\x35\xb0\x1e\x65\xa9\xb9\x03\xc8\x6a\x63\x6f\x68\xaa\x3a\x9d\xd8\x64\x96\xcd\xb6\xbb\xe7\xc9\x9e\xe1\xed\x54\x3c\x16\x2b\x6e\x13\xc0\xac\x6c\x59\xd0\xaf\x1f\x92\x4e\xc8\x36\xfa\x1e\x1f\x32\xfa\x1e\xbb\xf1\x0b\x3d\xe9\xbb\x46\xb4\x5a\x85\x68\xab\xd0\x24\xce\x99\x2f\x14\x12\x7d\xf6\xf9\x2a\xb5\x93\x90\xac\xf7\x03\xf5\xb2\xc4\xdb\xf1\xaf\x24\x37\xd7\x13\x04\x20\x8f\x87\x4d\xad\x5f\xad\x0f\x4f\x76\xf3\x4d\x19\xc4\xd8\x99\xf0\x5c\x32\x4d\x04\x58\xeb\x37\x4c\x01\x36\x0b\xf0\x6a\xd0\x34\xa0\x51\xe8\xbc\x01\xc4\x29\x37\xed\x8f\x35\xb2\xe3\x75\x12\x73\x4e\xb3\x67\x61\x27\x57\x5a\x72\x28\x4f\xd8\x46\x43\x57\x57\x3e\x6a\x7e\xb4\x4f\xba\xe8\x20\x68\x09\xb6\x90\x27\xd3\xf4\xa1\xb8\x11\xc3\x14\x29\x5d\xbe\x4c\xf1\x11\x7c\x4c\xdd\x5f\xf2\xc1\xed\xb1\xd4\x91\x03\x78\xd3\x69\x92\x97\xfb\x92\xbf\x64\x0a\x60\xea\x27\x8d\x08\x52\x04\x85\x80\x5d\x9e\x7d\x18\x5e\x95\x1d\x94\xc5\x01\xd4\xfd\x29\xc6\xb0\xb3\xcd\x18\x4b\xaa\x20\x09\x9c\x39\x7d\x80\x99\xb2\xfb\xb1\x9a\xf4\x37\x4e\xa5\x35\x9c\x2e\xb9\x88\x82\x03\xc6\x84\xd3\x18\x92\xf5\xa3\xe4\x1e\xf5\xa4\x52\x31\x9a\x04\x38\xa2\x82\xd8\x9d\x24\x84\x87\xca\x13\x1c\x58\x7e\x99\x4f\xa1\x1c\x9e\x18\xd9\x61\xf1\x63\x8e\x1e\x34\x7d\x94\x2e\xf4\xe5\xab\xdc\xba\xb8\xc8\x7f\xd2\xef\xaf\x93\x82\x57\x15\x36\x82\x30\x5b\xa4\x0a\xdf\xdc\xae\x71\x19\x92\x0b\x7d\xe8\x05\x06\x91\xe3\x3e\xa5\xaf\x84\x81\x39\x30\xd6\x0f\x16\x1d\x63\x17\x6a\xdd\xd9\x07\x2f\x74\x27\x6d\x91\x46\x2d\x8a\xf1\x88\xe4\x60\x9a\x15\x76\x87\x12\x94\xcc\xd3\x2e\x4b\x13\x46\x06\xdb\x0d\x00\xd9\x60\x29\xf7\x01\x78\x24\x55\xbe\xa0\xd0\xb2\x91\xc0\x96\xaf\x72\x87\x33\xe2\x45\x49\x1d\xdc\x2c\xb8\xd8\x21\x7c\x4a\xce\xf7\x78\xbc\xd3\x40\xef\x31\x25\xfb\x4b\x6f\x21\x21\x74\xe9\xee\x1a\xf3\xcc\xac\x81\xba\x64\x77\xb6\xe2\xb5\x7a\x9c\x1a\x0a\x89\x0a\x49\xbf\x02\x2c\xb8\x65\x68\x31\xa4\xab\x11\x66\x80\x06\x9b\x94\x0c\xa2\xad\x69\x58\x29\x7c\x05\xe6\xd6\xf7\x18\xca\x6f\xd7\x98\x60\x32\x94\xaa\x9c\xcd\xe5\xa3\x90\x72\x9b\xb3\x82\x33\xd2\x8c\x2e\x30\x5f\xbf\xce\x28\x64\xd8\x02\x1b\x5b\x2a\x89\x74\xa3\x8d\xa9\x41\x9e\x04\xf8\xf3\x4b\x93\x63\x0b\x01\x4e\x73\xce\x4d\x40\x4f\xd1\xfb\xb7\xde\xb3\xb2\x0c\x5d\x54\x31\x38\xe7\x7a\xb3\x82\x09\xd9\xe5\x32\x1a\x33\x84\x06\xd7\xc4\xb9\x46\x76\xb1\xe5\x25\x7d\x29\x1a\xf5\x98\xfc\x06\xd8\x17\xbd\x88\xf5\xfa\xa1\x52\xcf\xc0\x8c\x59\x5c\x2e\xc4\xcd\x4b\x5a\x61\x87\x83\xbe\x1c\xdc\x8f\xc8\x11\xd4\x8c\xa0\x5b\x84\xd2\x00\x28\x99\x39\x21\xb0\x84\x4b\xf3\xe1\xd8\xd6\xbc\xc9\x73\x8f\x86\xc4\x19\x60\x5c\x12\x5a\x2e\xe5\xce\xa8\x4d\xe1\x78\xa8\x03\x7e\x5c\xa2\x39\x61\x6e\x25\x55\xcf\x4f\x7e\xd7\x65\x9d\xbd\x43\x1b\x9a\xa2\xfa\x44\x97\x1a\x5e\xc2\x48\x59\x0d\xff\x52\x62\x26\xe5\x04\x80\x10\x93\x99\x32\x4b\x6c\x59\x27\x7c\x0f\xf1\xf3\xcd\x4e\xc4\x77\x69\x83\x76\xa8\x63\x4f\xb7\x2c\x53\x97\xa3\x36\x4c\x1d\x38\xbf\x7b\x5d\xf9\x51\xba\x39\xb9\x93\xf5\x41\x1b\xe2\xc6\xc6\x7f\xb4\xfd\xde\xa3\xc1\x67\xb0\xf4\x90\x86\xa4\x72\x82\x19\xc8\xb9\x8f\x26\xf8\xa2\xec\xbc\xfb\x6e\xd2\x39\x0c\x61\x51\x6d\xd3\x37\xcd\x91\x04\x51\x3b\x27\xb4\xed\x6a\xe9\xf5\x32\xd6\x8b\x89\x04\xaf\x60\xc2\x9b\x75\x54\xbf\xbc\xfd\xce\x93\x16\x2e\xe7\x46\xf6\xc1\xe9\xa6\x18\xba\x54\x75\x80\x7c\x2e\x99\xba\x87\x49\x30\x81\x6a\xc2\x41\x78\x50\x40\xae\x6c\x1b\xae\xd5\xdd\xd4\x99\x00\xb9\x1e\x54\x3d\xc1\x37\x58\x47\x71\x25\x02\xe7\x63\xf8\x18\xdd\x86\x6d\xa3\x15\x14\xd5\xed\x10\x99\x8c\x71\xb3\x54\x74\x29\xe2\xde\x02\x1c\x7f\x20\x60\xae\x93\xfc\xe4\xf1\xee\x4f\x97\x70\x74\xf5\x2b\xce\xb0\x60\x81\xc5\xcc\x5f\x02\xd0\x8e\x00\x14\xed\x6b\xb8\xbe\x66\xcb\x97\xcc\x15\xfe\x36\x55\x65\xde\x7d\xfc\x5b\x3b\x91\x7b\x78\x48\xb2\xd1\x11\x08\xb6\x4b\x07\x75\x0e\x9c\xdc\x70\x09\xe9\x6d\x8f\x9e\xde\xb1\xbd\xcd\xea\xf7\x5e\xde\x13\xe1\xba\x60\x54\x74\x8a\x3c\x5b\x8d\xd5\x72\x51\x2d\x61\x95\x3e\xe7\x70\x97\xb5\x98\x2b\xfa\x16\xaf\xaa\x31\x5f\x2e\xb0\xbb\x10\x01\x54\x49\xd1\xef\xb4\xe3\x1a\xfc\xcf\xf4\xaa\x7d\x36\x9a\xcf\x5a\xe4\xfd\x5c\x25\x74\x42\xe1\xa7\xaf\xa1\x3f\x49\xfc\x22\x77\xc6\xb0\x78\xcd\x59\x82\x50\x95\xa7\xb5\x0e\xb9\x6f\x9c\x25\x54\xc8\xe9\x1a\xb8\x24\xd0\x3a\x4d\x5e\x81\x2f\x0d\x88\x38\xb7\x2a\x98\x12\xd3\xeb\xfc\x6b\xe6\x8b\x35\xe4\xdd\x61\x38\x8f\x2f\xcb\x75\x8c\xfd\x75\xb2\x67\x18\xe5\x10\x5d\x0c\xef\x54\xc7\x8b\x52\xa3\x0a\xf9\x86\xc2\x54\x5d\x06\xc7\xe5\x25\x2c\x0c\x96\x51\x3d\xed\x59\xca\xaf\x33\x00\x44\xd1\x5a\x28\x1b\xd3\x8c\xcd\x1c\x76\x7d\xbb\x0c\xaa\xb6\x3e\x7a\x0e\xce\x31\xe1\xdb\xd7\x7b\x9c\x2b\x7f\x0a\xfb\xe5\x98\x35\xb3\x41\x02\xd1\x26\x1d\xde\x3a\x73\x12\x5f\x6c\x3a\x57\x7b\xc0\xcf\x4d\x0a\x62\xcd\x2e\x10\x1a\x52\xb7\x0a\x7f\x93\xd2\x8b\xfa\x11\xcf\xaf\xdc\xc3\xaa\xbc\x6c\x43\xd4\x79\x44\x52\x7c\xff\x51\x50\xff\x71\x48\x42\x78\x34\x29\xdf\x7d\x06\x2a\xb1\x47\x66\x50\xc5\x5d\x90\x25\x60\xc8\x55\x9b\x0e\x06\x03\xc2\x93\xab\xfc\xa1\x15\x48\x30\x27\xfb\xfd\x0d\x1c\xa5\x75\xd2\x6c\x55\xbf\x73\x00\xaf\x18\x80\x77\xe5\x01\x4b\x57\xc2\x4f\x89\xf9\xfd\xdd\x77\xc5\xf8\xfc\x2c\x60\x17\x47\xdb\xe7\x01\x9e\x7a\x39\x0c\x7a\xf8\x54\x08\x48\x37\x64\xf5\x13\x2a\x68\x41\xc8\x39\xed\x5a\x10\x46\x9b\x8f\xa1\x01\xc4\x21\x69\x56\x87\xc1\x1a\x0f\x74\xd0\x46\xa4\xf7\x72\xc8\x31\x04\x42\xba\x37\x8b\x0a\x46\xef\xe0\xd3\x4f\xe1\xcd\xe9\xf5\xcd\x22\x83\x76\xf4\x92\x53\xc8\x9f\xaf\x34\xc0\xe3\x08\x8e\xf6\x08\x8d\x93\xa5\xbf\x54\xb9\x16\x1b\x80\xf0\xf9\xd5\xe0\x03\x1d\x00\x9e\x4c\x98\xf0\xef\x9a\x06\x94\x7f\xa1\x0e\xeb\x1f\x61\x13\x2a\x7d\x64\x80\xfa\x83\xdc\xd1\xc2\x6a\xd1\x5c\xd0\x15\x82\xb3\x0f\x0f\x09\x96\x9f\xf3\x91\x34\xa6\x87\xc5\x72\xa5\xf1\x44\x4d\x63\x7d\x98\x2a\x81\x60\xc3\xfd\x6c\x53\xe2\x01\xb5\xb5\xce\x62\xcc\x0d\xd0\x19\x53\x19\x10\xca\x30\xae\xce\xa9\x3c\xd8\x40\xa1\x54\xc7\x34\x52\x39\xc0\xd7\xf9\x3e\x5d\xd4\xeb\xdf\xd5\x3c\x10\x28\xfa\xac\xdb\x70\x30\xdf\x82\xf4\x06\x70\x5c\xa8\x35\x94\x12\xd9\x67\xf8\x49\xcc\x97\xea\x7d\x56\xa7\xcd\xf9\x78\xe8\x4c\x3f\x17\x65\xe6\xcd\x96\xcb\xd7\xf7\xda\x9f\xb2\x3a\xa9\x4e\x20\x8d\xfa\xd2\x4d\x06\xc3\xc1\x63\x5c\xd0\x58\x6d\x5d\x36\x55\x06\xd0\x19\x98\x74\xe8\xcd\x68\x71\x54\xae\xce\x31\x40\xcb\x58\x87\xfe\x5e\x45\x91\x58\xc3\x04\x67\x32\x79\xa2\x61\x13\x55\xfe\xda\xd4\x3f\x01\x9f\xe6\x71\x3f\xe0\x7f\x58\x00\xe8\x59\x2d\xd4\x1f\x25\xe8\xcf\x8b\xd5\x16\xe4\xa8\xa4\x9f\xfc\xb2\x5f\x58\xc2\xbb\xfc\x02\x40\x09\xd2\xe1\x20\x79\x42\x9d\xf9\x1b\xa2\x05\x69\xac\x25\x3b\x4c\x83\x1d\x4f\xde\x59\x72\x0c\x25\x47\x6a\x12\xf9\x76\xc0\x05\xac\xfe\x5b\xde\x66\xef\xbc\xc6\xe7\x73\xd4\x81\xdf\x57\xf1\x6a\xda\x0c\xe0\x1f\x3c\xd7\xae\xaa\x2d\xbc\x01\x82\x32\xe1\x35\x54\x5a\x6a\xe7\x60\x0f\x1d\x02\x42\x00\x6e\xd1\x0d\xc8\x3e\xdc\xeb\xbd\x9b\x99\x47\xb3\x94\xd2\x0f\xd5\xae\x00\x82\x2e\x5a\x5c\xc0\x7a\x68\xfc\xbe\x95\x03\x0c\x74\x61\xf2\xec\x03\x56\xca\x75\x69\x36\xed\x90\xe5\xbb\xc1\xc9\x08\xd9\x5f\x5c\x49\x48\xfa\x1f\x2f\x50\x0e\x49\xc2\x7f\xae\x94\x29\xa2\x48\x25\x17\xda\xa5\x0a\x21\xe2\xfd\xc4\x44\xb4\xff\xc7\x23\xde\x90\xc1\xf2\xf2\x87\x18\x84\x94\x29\xd3\xb9\x9b\x75\x19\xee\xf5\x5d\xee\xa1\x84\x52\x2e\x44\xdf\xa8\xed\xf0\x1b\x33\x18\x9b\x49\xaa\xf5\x10\x80\x87\xa1\x7c\x93\x8b\x91\x80\x2f\x43\x03\x17\x8b\xac\x5f\x84\xd2\x72\xcc\x57\x65\xc8\xea\x88\x0f\xad\x07\x73\x72\xed\x5e\xb2\xe5\xbf\xc8\x8f\xd5\x37\xe8\x6b\x3f\x73\x33\x18\x29\x8c\xe2\x4e\xf5\x15\xaa\xb4\xe3\x11\xb3\x06\xcc\x3e\x27\x1f\xe7\x8b\x50\x7e\x9e\x8d\xc6\xf8\xe0\x38\x61\xe3\xab\x43\x3e\x9c\xad\xaa\x8c\x4d\x49\x0c\x4a\x3c\x9e\x7d\xbc\x1f\x81\x0c\x5b\xab\x3c\xcd\x5a\xf6\x38\xf6\x13\x97\xf6\x21\xca\xaf\x8b\x97\x0e\x32\xab\x35\x45\xf2\x1a\xd0\xec\x5b\x60\x07\xb4\x0d\x81\x60\x67\xaf\x7c\x29\xa5\xca\x16\x88\xd7\x85\x1e\x32\xea\x0a\xcc\xee\x42\x2d\xfd\x5b\x98\x82\xf7\xce\x52\x41\x6b\x56\x82\x5c\xae\x49\xf6\xf7\xce\xb8\xec\x5f\x19\xe7\xb2\x4d\xae\x6f\xff\xe8\xfb\x08\x96\x4e\x8c\x80\x9e\xf7\x83\xbe\x98\xe1\x02\x00\x3b\xf5\xa2\x41\xed\x61\xbd\x35\x55\xb5\x0e\x08\x3a\xf0\x11\x9b\x38\xa1\xf0\x47\xbe\xa4\xd2\x7f\x3b\x3b\x05\x30\xb0\xda\x83\xdd\xf6\xec\x3f\xad\xbe\xf4\x27\x15\x1f\x03\x51\xfc\x73\x2e\xcf\xf0\xe8\x22\xd3\x91\xcf\xf9\x29\x67\x86\x73\xec\x9f\x4c\x0c\x19\x56\xfa\x50\x84\x02\x88\xf9\x3e\xed\xeb\xe3\x8e\xc4\xa8\xca\x97\x91\xff\x5e\x1a\x43\xc1\xb9\xd2\xb2\xec\x50\x0f\x16\xca\xe1\x77\xee\xf5\x57\x21\xfc\xc9\x05\xe8\xb1\x66\xdf\x22\x9b\x39\xc2\xb6\x07\x6d\xec\xac\x33\x69\x40\x45\xe0\x2f\x6b\x20\xc7\x84\xad\x16\x5c\x4d\x07\xef\x10\xb9\x3d\xe4\xd9\x74\x5c\x35\x1b\xe6\xa0\x9b\x94\x08\x37\xe9\x73\x1e\xf0\xef\xde\xd8\x75\x10\x26\x16\xe5\xc4\x85\x23\x7c\xc8\x5c\xac\x7c\x77\xd1\x9d\xf8\x96\x3f\xba\x91\xb0\xbb\x0f\xd9\x6e\x63\xb3\x6e\xc6\x45\xee\xd1\x96\xa5\xf0\x52\x3b\xfc\x91\x2d\x0a\xfb\x20\xac\xa3\xf1\x2c\xe9\x31\x56\xa5\xe5\x92\x61\xcc\xbd\x90\x30\xe5\x6f\x95\x6c\x52\x70\xda\xe9\xd7\x92\x64\x33\x38\x06\x09\xfb\x5e\xd3\xe1\x7b\x2f\x60\xf1\x5d\xe3\xfe\x3b\x45\x51\x9c\x6f\x98\x2a\x84\xae\x43\xb4\x2e\xca\xc7\x3f\x54\xff\xbe\x0a\x87\x70\xeb\xa1\x44\x2a\x8f\xf9\x4a\xe9\x80\xd8\x2f\xd1\xcf\xdb\x97\xb1\xcf\xd5\x87\xf8\xb4\x08\x57\x1d\x3f\xc0\x52\x9e\x3e\xd4\x26\xd8\x6b\x85\x8f\xd9\x45\x2f\xef\xbb\xb2\x24\x00\xf5\x66\x89\x26\xaa\x14\xdf\x84\x7b\x70\x43\xa2\xb7\x80\x06\x8a\xb3\xdd\xba\xf4\xd3\xa0\x1f\x4d\xa9\xdd\x32\xdb\xe2\x5d\xff\x05\x0b\xe9\xe2\xcd\x76\x7d\xcb\x7c\x21\x88\x6c\x81\xe6\x2f\xa5\x87\xb1\xfb\x50\xa1\x56\xe6\x53\xaa\xed\x26\x74\xf4\xd8\x76\x58\x42\xcf\x6e\x79\x20\xcf\xbf\x9a\x0e\xcc\x59\xf7\xdb\x77\x02\xe4\xbc\x67\x85\xad\x79\x45\xfc\x4f\xfd\x17\xfc\x5f\xa3\x10\x65\x42\x40\xf9\xf1\xa5\xd1\xb1\x71\x45\xc5\xe9\x85\x7e\x3e\xf4\x40\x15\xda\xd2\x39\x55\xaf\x22\x81\xfe\xec\xe2\x2c\x97\xa1\x0f\x8c\xb9\xb1\x38\x15\x84\x9b\xf2\x6a\xf7\x30\xbb\x69\x68\xc3\x17\x6c\xb6\x69\x7a\x48\x37\xae\x49\x31\xb2\xa2\x54\x06\x64\xe4\x02\xef\xb0\x23\x0d\x51\x6f\xc1\x60\x43\x2e\x3d\xf6\x34\x46\xe5\x26\x3e\x1b\x02\x7a\x0c\x1d\xae\xbb\xa3\xf9\xcd\xbf\x43\x3f\x06\x77\x17\xdd\x80\x87\x89\x66\xe8\x59\xe8\xc1\x71\x63\x73\xfd\x66\x62\xf3\x9e\xcc\x66\xce\x13\x3d\xe5\x5b\xe1\x99\x92\xbc\xb6\xdc\x85\xa7\x11\xf5\x3f\x9c\x39\xbd\x9d\x46\x14\x5c\xfd\x0b\x0d\xd5\x05\x55\x2c\xa6\x06\x99\xcb\x2f\x8d\x2b\x7f\xa1\x06\x86\xcd\xfd\x5b\x76\x32\xb3\x20\x6e\xfe\x4f\x85\x09\xbd\x09\x33\xa1\xde\xd4\x87\x8b\xa5\x66\x44\xe3\x64\xf6\xe6\x7b\xb0\xd1\x52\x0a\xc0\x46\xb2\x8c\xcc\x9b\x96\x96\x5e\x72\x46\xf9\x1a\x37\xbf\x5b\x60\x22\xd1\xa8\xc1\xb2\x77\x6a\x00\xab\xd9\xa9\xf6\x30\x28\x65\xae\xd5\xf8\x1a\xbb\xab\x83\x61\x42\xa8\x9f\x37\xf1\x8e\x22\xcb\xf1\x96\x40\x33\x62\xe9\xd3\x46\x38\x32\xbc\x76\x7b\x23\x04\xa8\x6d\x11\x10\x30\xb4\xb2\x6a\x07\x25\x47\x95\xaa\x8e\x9b\x40\x8e\x8c\x53\xb0\xb4\xd5\xe1\x80\xc2\x94\xa9\x73\xa0\x6d\x49\x9f\xaa\x9a\x39\x1d\xf6\x72\x72\x56\xc3\xd4\x61\xcd\xc6\x62\xef\xab\x13\x2a\xa8\x4e\xd9\x13\x6a\x0c\xbf\x97\x69\x54\x2b\xa2\x53\xdb\x84\xf9\x91\x33\x0f\xdb\x12\x80\x78\x2f\x63\xa5\x8d\xf5\x18\x7d\xf7\x85\x50\x44\x13\x47\x7d\x89\x44\x54\x10\xf5\x3c\xea\xa8\x03\x9c\x79\xe1\x30\xf6\x50\x26\xde\xfa\x9f\x4b\x77\xda\xa6\xac\x41\xe0\x96\xbc\x5b\x9d\x93\x9c\x5b\xa5\xec\x41\xe5\x5c\x2d\x03\x30\x21\x85\x8d\x2c\x75\xe9\x2c\xa0\x04\xa6\x90\x29\xf8\xd7\xf9\x4b\x6d\x87\xd9\xce\xf6\x25\x54\x08\xdb\xdc\x20\x2d\x44\x6f\x2b\xe8\xdb\x5a\xf2\x80\x8d\xa7\xb4\xf2\x87\x02\x6b\x2f\x08\x0e\x36\x4d\x59\xcb\x47\xa2\xc4\xc8\x02\xc2\xab\xbf\xae\x2a\x5a\x35\x1a\x4a\x89\xf5\xd3\xdc\x85\xcb\xd3\x6e\x4d\x9d\x3b\x20\xad\x99\x3d\xab\x69\x60\x79\x7b\xd9\xbe\x0e\xfe\xa0\x01\x79\xcb\x0d\x87\x37\x56\x02\x5d\x6a\x72\xcf\x56\x86\xeb\xb6\x12\x76\x5f\x79\x17\x4d\xe1\x75\x4d\x24\x60\x88\x27\x76\x9f\xa6\x24\xe3\x62\x6e\x9f\xec\xba\x7b\x64\x04\x16\xfd\x38\x37\xe3\x20\xfb\xc9\xba\xda\x27\xff\xeb\x3b\xe5\xc2\x0a\x80\xbd\xd1\x95\x7a\x5c\x98\xa5\xe9\x7c\x64\x9a\xbf\x4d\xe3\x5a\xde\x20\x16\xf0\x45\x6c\xe1\x57\x75\xc3\xe0\x43\x98\xfd\x67\xba\x93\x79\x4b\x42\x4b\x0a\x57\xbd\x7f\xfa\x4c\xe3\x22\xe7\x86\x3e\xee\x6c\x2f\x0d\xee\xd4\xb1\x48\xdf\xb6\x34\x74\xfa\x3a\x7d\x87\x00\xd8\x48\x5c\xbe\xa4\x5a\xc8\xd4\x9c\xfd\x2b\xd4\xbc\x32\x9f\x1c\xe8\x47\x76\xa8\x1c\xb4\x9c\xd9\x04\xf3\xcf\x34\x03\xe4\xf1\xa9\x11\x5c\x77\x20\xa7\x40\x7d\x3d\x2e\x2c\x70\x3b\xc3\xe7\x20\x60\x54\x03\xfb\xfb\x58\xa4\x5f\x4d\x3f\x3e\x24\xcf\xde\x94\xa9\x98\xfe\x34\xe0\x00\xe0\x2d\x79\x0e\xdb\x69\xf4\xf9\x03\x1a\x02\x81\xaa\x48\x0b\x1a\xb5\x76\x2c\x5f\xba\xe7\xd8\xf9\xf1\xff\xa7\xa7\x25\x2e\x61\xee\x76\x95\x69\x0f\x9e\x6d\x78\xea\xfd\x43\x3f\xaf\xb3\x3a\xd3\xde\x6d\x32\x52\x76\x9f\xb0\x9a\xfc\x92\xe1\xc4\x10\xbe\xd9\xc4\x5d\xf0\x29\xa3\x52\xe5\x3b\xd2\xff\x89\x28\xc4\x7b\xa3\x0b\xef\xee\x3a\xb3\xe4\x30\x25\x52\x73\xb6\xc2\xbb\x7f\xbf\xbc\xbd\x68\x86\x5e\x3f\x6b\xa0\xa6\x36\xcf\x45\x9a\x80\x36\xf7\x54\xa0\xea\x9f\x6c\x83\x9c\x9d\x05\xb6\xca\x7b\xc1\xe9\x2e\x00\x86\xde\x42\x97\xff\x11\x26\xdf\x2a\x0a\x5d\x62\x91\x37\x69\x79\x2d\xd7\x97\x87\xa4\x24\x1c\x77\xfa\xeb\xf3\xea\xbe\xc8\x50\x1d\x4d\x2c\x94\x16\x41\x7c\xd6\xa4\x43\x77\x4f\x40\xb4\x57\x3a\x41\x34\xe6\xa4\x41\x09\xa6\xe2\x72\x28\x13\x75\xbd\xcd\x19\xdc\xca\x98\xa3\x10\x9e\xe1\x06\x07\x00\xe1\x8b\x6c\xf3\xff\x45\xde\xb1\x75\x53\xe5\x7a\x29\x89\x72\x7e\x81\x38\xa0\x77\x50\x1b\x38\xff\xe8\x54\xa6\x00\x67\xb5\xd9\xc4\x0a\x7c\xba\xd5\x8d\xae\x6d\xdd\x64\x39\x5b\xe3\x3b\x91\xc6\x97\x2f\x95\xc3\x8e\xf3\x7e\x67\x0e\xd6\x40\xcd\x48\x59\xca\xe6\xd6\x6d\x93\x09\x8a\x6f\xb2\x35\xb8\x9b\x29\x9c\x26\x9b\xcb\xd7\xba\x01\x89\x81\x7c\x89\xf1\x87\xe7\x77\xd3\xf3\x8c\x56\xa7\xa5\x6c\xd0\x57\x94\x10\x8d\x35\xe8\x9a\x8b\x30\x4b\xc4\x05\x13\x89\x4d\xdc\xc5\xcb\x51\x16\x19\xde\x22\x4f\x6a\x6b\x80\xcd\x49\x9c\xbc\x34\x95\x5a\x65\x4b\x68\x07\x7e\x29\x57\xf2\x27\xcd\xf7\xe5\xf0\xce\x5b\x58\x30\x42\x43\xce\x28\x04\x38\x4e\x44\x49\xe8\x0e\x89\x32\x87\x98\xae\xa4\x8f\xe1\xc2\x65\xe5\xa2\xeb\x5d\x71\x95\xaf\x71\xf9\x70\x02\x02\x94\x94\xb7\xd2\x2b\x5d\xa0\xd4\x73\xdd\xdb\x64\xed\x4a\x9e\xe4\x97\xae\xfb\x6a\xc5\x61\xba\x4f\x50\x19\xac\xfe\x2c\xbd\x72\x95\xa8\xa6\x99\x7d\x68\xa1\x01\x36\x17\x13\x92\xc3\x79\xc3\xb2\x73\xce\xeb\x4e\xca\x29\x6b\x49\x28\x56\x0a\x34\x3a\xc7\x04\xa4\x9f\x9d\x28\x08\x33\xea\xd7\x09\x86\xcf\x91\xca\x49\x8f\x10\x60\x98\xc5\x5b\x07\x35\x11\x90\x55\x50\x0b\xf4\x4a\x9a\xb8\x7c\xdf\xb9\x31\xad\xa8\xe2\x63\x97\x1d\xa3\x68\x1d\x5c\x94\x3d\x68\xfe\x22\x47\x6f\xf1\xf3\x0c\x1f\x06\xbd\x40\x0e\xd7\x22\x19\xed\x6b\xf0\x02\x10\xe3\xc3\xc7\x16\xd2\x94\xf2\x35\xf5\x36\xd9\x97\xb4\x80\x7e\xc7\x56\x6c\xc0\xa2\x2a\x7b\x19\x05\x61\x26\x2d\xd3\x27\xe9\x9e\xcd\xfe\x9f\x2d\xfa\x40\xa9\x32\xf1\x4d\x77\x39\x88\xed\x52\x08\x53\x8f\x85\x1b\x66\xb1\xb0\x00\xf7\xad\x3e\x97\x96\xe6\xbb\x82\x87\xd4\xf3\x9e\xf8\x90\x1b\x89\x20\x4b\x60\x4b\x99\x0b\x29\x63\x09\x65\x1f\x8a\x6b\x8e\xf5\xb8\xf9\x76\xdf\x85\x7a\x59\xd2\x02\x18\x43\xab\x75\xd2\x88\xe3\x66\x68\xc8\xdf\xe0\x81\x7c\xda\x20\x63\xb6\xb3\x4c\xed\xde\x9d\x79\x9a\x86\x5f\xa1\xe5\xcc\x7e\xff\x7f\x27\xf1\x47\x14\xa9\x21\x47\xf3\x5b\x73\x0b\x53\x9b\x51\xad\x61\x78\xe0\xf1\x49\x44\x00\x71\xe1\x46\x50\x09\x64\x61\x1d\x40\x92\x26\x78\x1e\x56\x6d\x9e\x42\xa9\x67\x75\xfb\x66\x1d\x34\xc1\x89\x61\xd6\x8a\x81\x87\x61\xa7\xd4\xaa\x51\x02\x03\x19\xe1\xa3\xc2\x43\xc3\x77\xa1\x2c\x4b\x79\xad\xd6\x0f\xf4\x45\x99\x52\x72\x56\x18\xb0\xd2\x3f\xa8\x37\xc3\x0e\xb8\x6e\x5b\xd3\x48\x72\x1a\x9c\xe9\x98\x93\xb5\xf4\xef\x59\x79\xc3\xd2\x97\x7f\x25\x14\x36\xe6\x93\xca\x49\x66\x8b\x5c\xec\xc5\x72\x28\x9c\xd5\x34\x3c\x24\x9a\x94\xff\x54\x3f\x08\x65\x3f\x4b\x55\x3f\x6b\xa1\xca\x32\x75\x6e\xf9\x7c\xee\x93\x45\x5d\xe6\x04\x36\xff\x96\xac\xa8\xbf\xc8\x9e\x18\xb5\x91\xa6\x76\x13\xf6\xb4\x66\xc8\xd3\xc9\x63\x15\xe3\x9c\xcd\xda\x68\x2f\x6f\xfc\x29\x9f\x55\x89\xbf\x36\x63\xc0\xca\x95\x64\xcb\x34\x06\x23\x6f\x2a\xdf\xca\x63\x91\xf7\x53\xc9\xc4\xd5\x2e\x02\xf4\x0b\xb7\x7d\xef\x80\xf6\x73\xbe\xec\xe3\xd7\x99\x0c\x92\x2b\xc3\xf3\x38\xc7\x6a\x43\xca\x24\x37\x06\x3f\x4a\xa6\xa9\xf7\x3a\x7d\x63\x42\xb6\x80\x3c\x63\xd8\x73\x69\xb3\xca\xde\xb8\x9a\xf6\x7d\xf6\x60\x12\x56\x9d\xea\x1b\xa5\xff\xd7\x9a\xff\xbc\x3e\xb4\xf9\x61\xdb\x87\xa8\xb9\xd1\x7d\x19\x0f\x74\x98\x7b\x40\x34\x2d\xe0\x1e\x10\xb0\x77\x9b\xba\x94\x40\x74\x91\xaa\x5d\x90\xc7\x9f\xc5\xaf\x75\x3f\x8d\x30\xba\x67\xf7\x99\xa8\xf4\x1f\x2d\x97\x71\x16\x2f\x94\x9a\x3e\x41\x3a\xf9\x9b\xc2\xe5\xf4\xf8\xc5\x48\x5c\xd5\xee\x7d\xfc\xa2\x8e\x56\xa1\xf9\x3b\xfd\xaf\xd5\x7a\xf9\xf4\x76\x59\xef\xff\xe6\xe5\xa2\xa4\x1c\xea\x19\xc7\x84\x07\x12\x40\x91\xed\x93\x30\xbc\xc7\xf0\x1c\x04\x58\x79\x14\x40\x0c\xc8\xf8\x0f\xa1\x32\xb2\x73\x70\x14\x99\x55\x8b\x54\x83\x07\x0b\x61\x1a\x57\xea\x1f\x40\xa4\x37\xa9\x39\x03\xea\x89\xa9\xa2\x17\x3c\xa3\x24\x41\x53\xbe\xb2\xa1\x4a\x5f\xe9\xa9\xc6\x8f\x55\xfa\xfd\xad\xd4\xd0\x77\xe8\x96\x2e\x7f\xf8\x9a\x69\x5e\x7a\x83\x92\x3a\xc8\x9b\x84\xae\xd0\x1e\xb2\x42\x67\xab\x7f\xb3\xc5\x98\x65\xb2\x3a\xc3\x65\x47\xf0\x89\x7b\xa9\xd1\x71\x7b\xf9\x0e\xfa\x89\xec\x90\xd5\xfc\x66\x3e\x97\x4b\x00\xb5\x44\xef\xf8\x41\x75\x29\xc8\xae\x98\x68\x8b\x1f\x0b\x59\xc0\x80\x61\x2a\x1c\x38\x96\xd1\xa8\xb1\xdd\x21\x30\xca\x2d\x2e\xcd\x40\x72\xb4\xb4\x4f\x99\x42\xac\x1b\x7a\x3c\x76\xcd\xda\x9a\xb2\x05\x9c\xb4\xa5\x20\x0e\x34\xc1\x3f\x4d\x46\x9c\xf6\x68\xc9\x72\x99\x95\x44\xd1\x16\xcd\x9a\x45\xc8\x35\xbe\x9c\x0d\x76\xb7\x0b\x4a\xc6\x15\x9d\x9c\x26\x48\xbe\x30\x6b\xff\x44\x62\xd2\x54\x53\xe1\x86\xff\xb2\xb8\x90\x58\xab\x23\xf3\x1a\x89\x6e\x85\xa0\x3d\x5d\x6d\x6e\x6c\x03\x85\x08\x7a\x82\x10\x42\xf8\x55\xa2\xe3\x43\x85\xa8\xb4\x94\x23\x57\x7d\x97\xe5\xc1\xf1\x1b\x1a\x3b\x38\xa7\xb1\x7c\x5c\xd2\xc9\xa9\xa3\xfe\x3c\x56\xf8\xb2\xaa\x23\xdc\x6f\xf2\x67\xfe\xc9\xa7\x6e\x2f\xed\xdc\x8f\xcc\x5a\xdf\x5b\xf4\x76\x61\x2f\xe9\x86\x0c\x53\xff\x8a\x5e\xb5\xae\xdd\xe0\xb6\xcf\x5b\x13\xc1\x92\x66\xed\xe9\xad\xc5\xaa\x9b\x41\x0d\xd6\x37\xde\x1a\x53\xab\x72\xd9\x55\x48\xca\xb9\x4b\x74\xc2\x51\x8a\x57\xcb\xce\x05\x48\xe5\x6a\xc9\xc8\x4f\x49\x4b\xd9\x8a\x9d\x4b\xc3\x0f\x4c\x3d\x9b\xc7\x64\xd9\x6c\xb0\x06\x4b\xdc\x8d\xc2\x55\x93\x28\xd9\xdc\x64\xc0\xfe\xf8\xe0\xb8\x1e\xd9\x70\xd5\xfe\x82\xae\x42\xfe\xcf\x12\x4b\xd0\xca\xdf\x25\x06\x09\xb3\x06\x66\x50\x1f\x10\xd7\x85\xf3\x78\x57\xb2\x54\x59\x2a\x35\x3a\xb7\xeb\x40\x0e\x43\x31\x27\x15\x67\x73\x4c\xbd\x72\x95\xe3\x8c\xf6\x4d\x75\xfe\x87\x3a\x93\x52\x27\xb9\x7b\x7b\x6d\xd2\x2b\xf9\x70\xf5\x99\xe5\xad\x28\x7b\x59\x37\xb5\xe9\xe1\xce\xfb\x31\x52\xd6\xfc\x8d\x7d\xa9\xd6\x3a\xf3\x65\x17\xfe\x3c\xdd\x11\x92\x97\xcb\x18\xa9\xd3\xfb\xf2\xea\xf5\x44\x53\xe2\x15\x58\xb4\x84\xaa\xc8\x09\xa8\x64\xe0\x95\x35\xb4\x9d\xb3\x20\x79\xdb\x05\xc0\x83\xf3\xc3\x71\x50\x5d\x6f\xcc\x6e\xf0\xe0\xc2\xb6\xb8\xeb\x6a\x74\xb4\xed\xbf\xb5\x74\x56\x75\x81\x4e\x74\xb7\x5c\xc9\x42\x54\x22\x85\xb2\xba\x52\x8f\x2b\xc1\x12\xb3\x7d\xff\xa5\x4f\xde\x77\xe3\x4d\x28\xdb\x47\xbd\xe6\x37\xab\x36\x20\x8d\x8a\x47\xba\x9a\x40\x6e\xa8\x2d\xfa\xc3\x9d\xf8\xad\x6a\xfe\x96\x5c\xcb\xce\x49\x04\xc6\x58\x28\x6b\xfd\x00\xb0\x22\x9f\xb3\x73\x9a\x43\xfd\x72\x25\x3e\x4a\x58\xdd\x2a\x68\xbe\x49\xa4\x84\xe8\xdc\xfd\x6a\x42\xcd\xdc\x14\xe2\xeb\x54\x95\xa1\x95\x7f\xdc\xb9\xf5\xce\xe0\xc8\xdf\x57\xcb\x09\xb4\x78\x4d\xb6\xd7\x48\x70\x56\x78\xf5\x95\xc2\x8c\xa9\x9d\x93\x31\x83\x6c\x6c\x60\x14\x90\x56\x40\x6c\x02\x6c\x13\x21\x98\x6a\x82\x71\x3a\x33\x82\xf7\x81\xb5\xd9\xd8\xab\xa9\xf9\x2f\x72\xb7\x4d\xa8\x0a\xd0\x78\x76\xa5\x6b\x18\xff\x1b\xa5\xfb\x41\x92\x43\x4a\x0f\xc7\x6d\x18\x25\xbf\xe9\xed\xb1\xe8\xee\x6c\x4d\x8d\x1c\xc4\xb0\x85\x1d\xfc\xe8\x63\xe9\x8e\xf2\xaf\x73\x17\x53\x4a\x77\x1e\xf2\xd2\x15\x24\xc7\x98\x5e\x78\x6c\x3a\xf7\x72\x52\x77\x23\xf8\x66\x1b\x6d\x77\x14\xa2\x5f\x90\x2d\x2c\x79\xaf\xf3\x37\xe7\x6c\x7e\x95\xc4\xfe\x9a\x99\xc4\x69\x2b\x25\x6b\x95\xaa\x7a\xa8\xcc\xa0\x0e\x8b\xb5\x10\x99\x86\x95\xbc\x46\x30\x60\x11\x31\x27\xc3\x87\x45\x01\xe6\x62\x0a\xdd\x8e\x66\x24\xbc\x79\x4a\x6f\x35\xa5\x9e\xa7\x9c\xd6\x9e\x4b\xa0\x2d\x9e\x0c\x15\x3a\x81\x9f\x90\xf8\x71\x31\xfe\x73\x1a\x6f\xf6\x73\x76\x8f\x38\xc0\x21\xed\x71\xda\xae\x4e\x7a\x4d\x3f\x8a\xc5\x3f\xa0\x13\xfb\x71\xa6\x7a\x11\x7f\x30\xe3\x9b\xbe\x8c\x9a\x39\x24\xdf\x2b\x21\x58\x9a\x20\x95\x10\xcc\x56\xe9\xd5\x24\xe3\x36\x32\x54\x58\xa1\x1b\x5c\xb3\x25\xbe\xa2\x0b\x00\x54\x95\x19\xb7\x2c\x84\xc2\xf8\x8f\x0b\x3b\xa0\x41\x2c\xcf\x95\x7a\x3a\x0d\x44\xd7\x5a\x5d\x31\x78\x44\x01\x4b\x6c\xfe\x11\x3f\x9a\x20\xbd\x0f\x39\x64\x39\x4b\x51\x13\x7e\xd0\xfd\xb8\x55\x27\xa9\x0d\x5a\xc8\x6a\xae\x7d\x42\x77\x6f\xa0\x48\x1b\x64\x7a\xd9\x4a\x3b\xf9\xe2\x02\x15\x61\xb6\xa8\xac\x12\x4a\x00\xc2\x1d\x5d\x6e\xe1\x68\x9f\xd5\xbe\x4c\x89\x8d\x04\x14\xa3\x1b\x08\x5f\x2a\xb7\xcb\xa6\x7b\xa9\x14\x02\x62\x7c\x3e\xc6\xf8\x38\x98\xd4\x70\x41\x75\x6b\x26\xa3\xc0\xea\x3c\x2b\x04\xf9\x11\xcf\xc4\x18\xbd\xef\xab\x37\x15\x04\x7a\x77\xad\x36\x33\x9b\xaa\x5a\xcf\x7d\xac\x8e\xa8\xa3\x2f\x19\x0c\x0e\xa3\x5f\xa4\xb5\xf2\x59\x2b\x76\xf1\x29\x6c\x9e\xf8\xe1\xd1\x6a\xaa\x77\x77\x11\xfb\xbf\xeb\x65\x63\x07\x68\x53\xaa\xe8\x2e\xc9\x6f\x63\x71\xb2\xb7\x53\xbe\x5c\x9f\x52\x06\x2f\xf3\xd5\x89\x28\x8c\x4a\xb9\x1f\xef\x77\x4e\xbf\xc0\x6a\xe4\x4f\xd3\x66\xc5\x93\xd3\x64\xe9\xd3\xee\x07\x55\xcb\x52\x42\x25\x40\xe2\x6f\x75\xf4\xe8\x7f\x87\xf8\x66\xcf\x1a\x35\x8e\xd4\x73\x23\xd4\x95\x8c\xd7\x60\xe7\x3b\xa9\x97\xee\x26\x76\x63\x29\x8d\xf2\x1e\x86\x31\x07\x90\x94\x76\x26\xdc\xd9\x09\xe4\xd0\x53\xf9\x6f\xe4\xbd\x25\x05\xe6\x54\x12\x0a\x5d\x4c\xfc\x3e\x53\x54\xe4\x6d\xed\xc7\x95\x70\x27\x24\x1e\x84\xa5\x57\xe5\x66\x2d\x04\x93\x3f\x5a\xb4\x4f\x49\xb1\x50\xe3\x3f\x32\xd7\x60\x93\x2a\xdd\xdd\xba\x30\xe8\x5a\x3f\xb5\xcb\xb7\x9f\x97\xd5\xeb\x17\xd9\x3f\xc6\x98\x9e\x48\x56\xe4\x74\xcc\x2b\x25\x76\x6b\xa7\x00\xa5\xc2\x7d\x12\x6c\xa3\xc4\xff\xb2\xfd\xb6\x18\x33\xb6\x84\xdc\xc6\x6a\xd4\x9b\x1c\xa0\x76\x92\x6c\x21\xb0\x9a\x07\xda\xa2\x09\xdd\x3b\x78\xb5\xb5\x47\xd9\x45\xf7\x70\xea\x4c\xd9\x4a\x47\x15\x2e\x6f\xd3\x2a\xcc\x70\x10\xb8\xa6\x0a\x8d\x82\x3c\xb3\x0a\x37\xd0\xb5\x4c\xc7\xb2\x3a\xf3\x61\x32\x79\x5f\x65\x58\xf2\x2e\x43\x25\xd8\xde\x0c\x5a\xcc\x4d\x74\x09\x01\x7f\x31\x18\xa0\xe4\xd7\x6f\x75\x71\x9a\x28\xbf\xcb\xe1\xba\xde\x9c\x6d\x07\x6e\x7b\x4a\xbf\x91\x6b\x97\xb3\xa7\x4b\xee\x6c\x8e\xff\x34\x44\x60\xa2\xa3\x34\x7e\x4c\xbb\xfb\x95\x3b\x84\xc9\x6f\xec\x4c\x96\xff\xe7\xdf\xd8\x04\x30\xb1\xe4\x02\x5b\xfa\xb9\x99\x18\x96\xed\x64\x5a\xee\x24\x27\x4a\x82\x89\x69\x16\x0a\x07\xa3\x75\x1b\x2b\x09\x8b\x09\x7a\x1b\x04\xf7\x25\xfc\x49\x94\x7d\x4f\x6d\x26\x8e\x8b\x3f\x1b\x23\x0d\x06\xa4\xaf\x23\x38\x21\x51\x02\x0b\x9a\x31\x47\x68\x82\xa6\x2e\xd9\xe1\x2c\x04\x36\x79\x47\xbc\x58\xff\xf1\x25\x69\x17\x99\x0c\x7a\x05\xcc\xbc\x47\x18\x33\xec\xbd\x06\xa8\xc7\x30\xd8\xcc\x47\xa3\xce\x60\x91\x95\x7b\x46\x9d\x41\xc3\x90\xcf\xed\x61\xce\x6d\xbe\x59\x32\x1a\xf8\x1d\x00\xc9\x57\xf9\x8c\x4f\x1d\x10\xaf\x91\xdd\x5e\xbe\x43\x0c\x4a\x4b\x36\xb8\xfa\x39\xc9\xf6\xe9\xca\xce\xd7\xe9\x74\xf3\x4a\x86\x0a\x5e\x02\x05\x61\x23\x5f\xf5\x3f\x4b\x41\x16\xe2\xbb\x5f\xc9\x70\xc9\xde\xb3\xfb\x1c\xc7\x76\x39\xf9\x00\x54\x33\x84\x34\xcd\x2c\xd7\xea\xc9\xd4\x35\x8e\xcf\xba\xba\x8e\x5f\x4e\x21\x5d\x84\x2c\xc2\xbf\x5b\xb6\x97\xb1\xe5\xa3\xc9\xf9\xc3\x67\xcb\xea\xaf\xf6\x61\xf6\xa2\xc1\x6b\x0a\x3f\x92\xa3\xf7\x25\x74\xa4\x77\x67\x1d\x1c\x95\x05\x76\x4a\xf8\x50\x1e\x71\xbc\xaa\x01\x03\xd0\x62\x74\x4d\xcd\x3a\xc3\xce\x25\x90\x80\x4c\xff\xf0\x2d\x10\x48\xdc\xaf\xe0\xfd\x55\x73\xa1\xf7\xa8\xe7\xf5\x6b\x97\xd4\x19\x0d\x3f\x67\xb0\xf8\x08\x41\xcb\x5f\x1a\xdc\x98\x18\xe9\xcd\x3c\x8d\x20\x1f\xe7\xaa\xb8\xc9\x91\x99\xde\xd4\x50\x29\x38\xd4\xe4\xd6\x63\x39\x40\x6b\x38\x90\xf5\xdb\x0f\x41\xd3\xe7\xca\x79\x64\x8b\xd4\x7d\xd3\x61\xfc\xcd\x6b\xf9\x75\xc5\x89\xdd\xc3\xc4\x9d\x4c\x0f\xad\x8e\x71\x17\x18\x82\xe9\xf6\x27\xfd\xa1\xe5\x5c\x39\xac\x79\xbf\xc4\x0c\x61\xd5\x80\x3f\xb1\xb7\x71\xea\x9a\xb0\x2c\xdb\xe4\xcb\xbf\xd1\xb8\xb9\x0e\x96\xf3\x53\xed\x53\x22\x16\x54\x53\xac\xc1\xf9\x5f\xf2\xeb\x92\xbe\x9b\xae\x81\x32\x4b\x86\xa0\xe6\x3d\xfc\x5b\x1e\x3a\x1b\x2c\x9f\x5f\x55\x05\x16\xdc\xd8\x78\x94\x7a\xd8\xfb\x85\xa9\xef\x7d\xae\xd3\x52\xcf\x4c\xbe\x92\x8f\xb1\xf2\x50\x35\x71\x93\x43\x12\x7f\x01\xe5\x03\xab\xf8\x15\xc4\x09\xa4\xb8\x5c\x07\xe3\x3f\x34\xd1\xa4\xf2\xd3\x5e\x62\xe3\x3f\x21\x4e\x0b\x25\x80\x92\x90\x48\x91\x5c\xfa\x08\x66\xf1\x41\xa6\x9b\x55\x05\x26\x10\x37\x31\xf8\xa2\x6c\xd8\x8f\xd6\x1d\xc5\x15\x7b\x48\xd8\x3e\x9b\x5a\xaf\x06\x3f\x50\xc3\xf4\xa3\x85\xc4\xf1\x6d\x45\x11\x0d\x86\x15\xa5\x53\x4c\xaf\x2b\x04\xf0\x72\x5d\x8a\xfb\xa0\x40\x08\x91\x0e\xca\x9a\x94\x7f\x08\xe8\x63\x61\x91\x1d\xa6\x2c\xe9\x94\x87\x99\xff\x75\x81\xb9\x7c\x28\xed\x0a\x64\x7f\xf4\x7c\xc1\xae\x93\x14\x80\xcc\x52\xb5\xea\x05\xe2\xe7\xe4\x47\x28\xc0\x51\x5a\xe7\x49\x71\x08\xdd\x7c\xde\xb0\x90\x84\xe2\xad\x86\xe1\xd5\x18\x77\x3e\x9d\x02\xcc\x2c\xd7\xd0\x26\x3e\x43\xdc\x76\xf3\x41\x07\xab\x6f\xd1\x60\x4b\x0c\xfe\xe5\x8d\xa0\xd5\x7a\xde\x38\x8f\xa6\x15\x76\x6f\x49\x8c\x04\xfa\xdf\xc4\x81\xb6\x9d\x92\x09\x84\x7f\xc3\x38\xaa\x04\x8f\xa7\xd4\x07\x48\x52\x98\xa9\xe4\x3d\x53\xba\xeb\x46\x24\xe1\x70\x53\x99\xc1\x22\xe2\x6c\x47\x63\x09\x77\x4b\x90\x70\x19\x5a\x44\x06\x16\xbe\x97\x39\xbc\x38\xa2\x5d\x5f\xf2\xba\x2c\x7f\xf6\xe7\x96\xfb\x41\xdf\xc2\x73\xe3\x10\xd6\x35\x86\x3b\x01\x3f\x31\x6a\xfd\xf1\xeb\xfd\x8c\xcb\x5f\xbc\xfe\x0f\x86\x40\x38\x64\x7f\x04\xab\x29\x75\x86\xd3\x96\x9f\x74\x11\x27\x7f\x6a\x91\xcc\x66\x73\x1c\xb3\xd4\x1e\xb2\x3e\xc4\xb8\x30\xcb\xbf\x5d\x75\x45\x14\x19\x14\x34\x30\xd3\xc0\x66\x5d\xb2\x9b\xda\xbf\xcb\x8a\x57\x05\x51\xa3\xb4\x50\x9b\x05\xab\x64\x70\xf2\xa8\x93\xba\x54\x0b\xb3\x9b\xb8\xe5\x0a\xf6\xe0\x0d\x08\x2e\x78\xe8\x89\xaa\x08\x11\xf0\x0b\x3d\x58\x0e\x5c\x33\x12\x21\x3c\xeb\xa2\x22\x9d\xe6\x2b\xc6\x76\x1e\xd0\x44\x55\x20\x2b\xcb\xe8\x6a\x27\x02\xe1\x20\x67\xd0\xbf\xc2\xe2\x0a\x02\x33\x9c\xe2\x3f\xf8\xe5\x3d\x04\x3f\x94\x4b\x4b\x49\x50\x45\x6a\x74\xc7\x3a\xda\x49\x28\x07\xc6\x87\x07\x4a\xf7\x6c\x1b\xa7\xfb\x24\x27\xd8\x92\x0e\x6e\xd1\xb0\x46\x8e\x06\x85\x2c\xdc\xe9\xa4\xc2\x8b\x0f\xe3\xca\xe5\x65\x31\x17\xf7\xca\x1f\x9e\x2a\x82\xa6\xa7\x12\x54\x90\x15\x7e\xf2\x27\x80\x81\x60\x9a\x70\xea\x8e\xf1\xb7\xdb\xbe\xa7\x53\xe2\x4e\x82\xa5\xdd\xd9\xb8\x10\x84\x46\x1a\x1f\x61\x50\xe0\x73\x73\xd5\xb3\x1f\x77\xdb\xe6\x44\x4e\x4f\xfc\x44\x20\x89\xcb\x7d\x0a\x4a\x68\x59\x39\xf7\x1a\xde\x07\x2d\xa2\x95\x50\x53\xb5\x7b\xe9\x40\xe8\x8f\x01\xbe\x1f\xa1\xbe\x21\xf3\x63\xa8\x23\x44\x72\xbd\xc1\x5a\x53\x49\xf9\x18\xfa\x49\xa7\x08\x3a\xea\x1f\x99\x7c\xb8\xb9\xdd\x14\x34\x08\xc3\xa9\x91\xa6\x3b\x5d\xe7\x7f\x9d\xd4\x87\x2e\x7e\xa4\xea\x16\x58\x08\x30\x62\x0a\xce\x0f\x58\xdc\xa7\x47\xfe\x38\x0f\xc2\x1c\x17\x19\xfb\x5e\x3f\x02\x41\x0c\x5d\x30\x94\x0f\xea\xae\x0c\x3e\xa9\x5b\x3d\x86\xa6\x30\x75\xdb\x97\x00\x1d\x96\xfa\xa3\x65\xb7\x99\x00\x44\xe5\xc0\x25\x94\xb3\xad\x58\xd2\xf0\x3f\x4a\xcd\xe7\x35\x68\x93\x53\xab\xfc\xb4\x39\x75\x01\x41\x4b\xd1\x87\xa7\x52\x73\x25\xe4\xd9\x6d\x7f\xb0\x27\xd4\x45\x21\x65\xd2\x8f\xa5\x51\xd9\xf9\x5f\x67\xe9\xa7\xc6\x97\x50\x4f\x68\xc8\x90\x55\xb6\x7d\x22\x3d\x74\xc2\xcd\x06\xf8\x61\x5f\x82\xa6\xbc\x28\x33\xc8\x86\x17\x50\x83\xf1\x94\x12\xed\x0a\xc9\x81\x3d\x98\x3a\xdc\xd4\xe7\x65\xe2\x1b\xd2\x50\x7c\xf8\xe0\x3c\xf5\x6b\x19\x78\x48\x18\xf8\xf0\xfd\x95\x5c\x5d\x22\x8a\x1b\xf1\xfc\x14\x84\x5a\x2c\xde\x16\x32\x07\x4a\xbb\xbb\xb0\x16\x9b\xc9\x4f\xc1\x6a\xaa\x51\xa0\xfc\xb1\xae\xee\xd3\x20\xc1\x29\x9e\x48\xbf\x8c\x57\x6f\x22\xe8\xb0\x18\x15\x90\xdf\x63\x67\xd0\x21\x16\xf6\x15\x2b\xd9\xeb\x7b\x0c\x6c\x01\xf1\x7f\x6f\xd6\x38\x81\x3c\x14\x6a\xa5\xdc\xfa\x3e\x3b\xff\xaf\x91\xb6\x6e\x9b\xf2\x64\xbc\xe9\x17\xe7\x13\x49\x89\x30\x30\x89\x01\x44\xcc\xfc\x6f\x97\xe3\x7e\x03\x99\x40\xdf\x69\x25\x29\x05\x1b\xd9\xcd\x40\x77\x5e\xb5\x8a\x83\xe5\x13\xe5\x8c\x2a\x04\xa3\xd8\x45\x88\x55\x5f\xb9\x12\x4a\x72\x4b\xf1\xa7\x14\x56\x1e\x18\x3b\x26\x7b\xf6\x01\x78\xf7\x78\x99\x6a\x06\x03\xc6\xbf\xc0\xb8\x7a\x26\xe4\xa4\x66\x96\x29\x4e\x61\xe9\x0b\x63\x6a\x05\xe7\xff\x4e\x5e\x2b\x46\x84\x53\xdd\x80\xae\x96\x3b\x77\x4b\xee\xc3\x32\x33\x94\xa6\x4a\xe9\x64\x53\xb2\x2c\xb9\xce\x1d\xbd\x46\xfe\xc2\x4c\x71\x32\xbd\x12\xf7\x4b\xf4\xa9\xf3\xdb\x22\x8d\x65\x79\x46\x66\xdb\x83\x7c\xd6\x39\x91\x9d\x6a\x96\x2b\xeb\xd5\xbd\x27\x78\x3d\x54\x98\xa5\x9b\x68\x8d\x08\x81\x20\x87\x10\x43\xd5\x52\xb2\x64\x25\xb7\xe5\x3b\xb1\xca\x56\x02\x64\xa0\x7c\x1a\x34\x4a\xfb\x33\x9b\x2a\xb1\x39\xd7\xa2\x7e\xda\xf8\x2f\x4d\x43\xeb\xb9\xda\x60\x97\x34\x14\xc3\x2c\x2d\xc1\x50\xdf\xa2\x4d\xdd\x87\xe1\xd8\x3d\x70\x85\xa0\x15\x05\x87\x98\xda\x0c\x4e\xe0\x7a\xc8\x32\x2f\x4e\xd6\xcc\x58\xda\x7c\xaf\xcb\x97\x5c\xe3\xba\x19\xd7\x88\x3b\x4d\x1d\x78\x62\x50\x1f\x3d\x5f\x93\x85\x73\xc8\xe8\xc9\xa9\xb4\x64\x6b\xe3\x23\xab\xbd\x1b\xda\x8e\x79\x7b\xf7\x0f\x75\xef\x96\x6a\x2d\xb4\x8c\x7e\x53\x50\x5c\x2a\x7f\xe1\x31\x24\x71\x2f\xe0\x49\x77\x64\xf3\x2a\x69\x25\xee\x29\xfd\x18\xbd\xe9\x39\xf3\x93\x9d\x85\x8a\x98\xc7\xe9\x29\x2e\xe5\x2e\xaf\x05\xfa\xd3\xdc\x02\x75\xb8\xdb\xaf\x19\x3a\xd9\x65\x3f\x29\xc3\x2a\x57\x09\x12\x6e\xad\xc1\x05\xeb\xd5\x12\x1e\x63\x8a\x6f\xa3\x54\x4e\xeb\x53\xe7\xc1\xfd\x78\x4d\xe7\xf3\x53\x02\xcb\x19\x87\x0c\x1f\x2a\x67\x96\x25\x1d\xee\x3d\x40\x23\x7c\xb0\xb7\xd3\x59\x5a\x3c\x98\x7f\x12\x02\xff\x44\x55\x7f\x43\x3e\x65\xee\x10\x08\x18\xe6\xfe\x8d\x0c\xd5\x21\xc9\x8e\x7b\x31\x24\x81\xb2\x32\x9b\x91\xfc\x0d\x86\x08\x65\x97\x30\x33\xdb\x3a\xdb\xc5\xd3\x63\x93\x59\x49\x16\x77\x7a\xc8\x73\x23\x62\x65\x7e\x54\xc4\xa1\x92\x15\x96\x38\x82\x1c\x6a\x26\x5f\xce\x0d\xdd\x45\xe4\x8c\x3c\x66\x94\x08\xc7\x90\xee\x96\x76\x8a\x13\xfd\x61\x6c\xe0\xe3\x84\xf0\x44\x0a\x27\xe9\x1d\xa6\xc3\x4a\x10\xe8\x2b\x7d\x21\x0c\xb1\x28\x7f\x57\x24\x86\xf0\x1c\xa8\x7c\xe8\x92\xd9\xec\x9e\xaa\xdc\xcb\xe7\x4b\x24\x24\x66\xf0\xe0\x33\x18\x5c\x71\xaf\x4d\xcb\x92\x14\xbc\x55\x40\xdc\xe1\x6d\xe4\xae\x66\x1f\xdf\xcf\xbd\x8f\x79\xc8\xbd\x37\x2e\xef\x5e\x4a\x39\x4b\x38\xf0\x3c\xb5\x0a\x94\xf2\x9d\x73\x25\x03\x95\x2a\x50\xc0\x67\x6d\x61\xdf\x43\x24\x85\x90\x87\xec\x61\xa2\xa3\x25\xfe\xc4\x04\x0e\xb1\xcc\x7f\xa6\x98\x86\x9f\x34\xee\x87\xf8\x0b\x5b\xd8\x65\xf5\x54\x8a\xd9\x59\x6f\x1f\xbc\x57\x79\x59\xa3\x02\x64\xba\x92\xcb\x45\xab\x9f\x59\x03\xbd\x24\x3f\xd1\x33\x00\xe1\x3f\x0c\xac\xc7\x92\x10\x0d\x72\x3c\x50\x2f\x93\x2f\x03\xb3\x21\x3f\x17\xa2\x73\x7a\xec\x2e\x55\x36\xa5\x43\x7f\x4a\x96\xaf\xcc\x03\x47\xba\xd3\x0c\x34\x49\xea\x54\x7e\x5c\xce\x2f\x17\xec\xaa\x15\x62\x79\xa8\xe8\xda\x10\x9f\xb8\xbd\x02\xaa\x08\xbd\xca\xe8\xfe\x0b\xa0\x58\x5b\x92\x53\xff\xcf\xec\xfe\xff\xe5\x39\xf1\xef\x4e\x8e\x3b\xed\x3f\xb2\x51\xca\x6f\xc0\x76\x33\xd7\xd4\xb3\x38\x74\x26\x83\x7f\x59\xd6\x73\x9e\x43\x10\x22\xe0\x00\xec\x30\x9e\xfb\xed\x6a\x36\x8a\x4d\xb1\xb1\xb5\x75\x53\x57\x31\xe0\x87\xf9\xd3\x96\xd2\xe7\xf6\x3f\xe9\x44\xeb\x31\x34\x04\xa3\x37\xf8\x04\xf0\xe7\xa6\x1c\x24\xf8\x9f\x53\x9d\xb1\x41\x6f\xb2\x4e\x2e\x41\xbf\x38\xa7\xca\x01\x2d\x47\x19\x6f\x9b\xf1\xa8\x79\x77\x9d\xc1\xdf\xd8\xe1\xe3\x11\x9a\x66\xe9\x3a\x9a\x21\x1a\xfd\xbe\xd1\x78\x9a\x80\x19\x81\x58\xd1\x43\xcf\xd0\x94\x8b\x2a\x0e\x5d\xd5\x21\x2e\x39\xe7\x84\x03\xc4\xa4\xc8\xbf\x25\xce\x03\x77\x4a\xaa\x28\x53\x8a\xbc\x05\xdb\x80\xb4\x08\x86\x23\xd9\x71\x7b\x1c\xdf\x63\x4b\xd9\x4f\x8d\xb8\x17\xc2\xb4\x5f\xe8\x95\x6b\x67\x9f\x8a\xae\x22\x83\xf2\x81\xe5\xdd\x4f\xad\x8a\x16\x8c\xdf\x29\x4a\x61\x5f\xd4\x05\x96\x6c\xee\xd8\xad\xd2\x76\xe3\xd4\x63\x0e\xb9\x5c\x8c\xdc\x23\xe7\xf8\x94\x7f\x81\xdd\x9d\xe3\xec\xf7\x2e\xcc\x8b\x50\x64\x88\xcb\x40\xda\x68\xf5\x89\xfe\x92\x66\x3c\x0c\xf8\x38\x7a\xc1\x1e\x01\x01\x32\x91\xa2\x0e\x6f\xdd\x4b\x8b\x61\x7a\xb9\xf2\x71\x08\xba\xa3\x76\x97\xf2\xaa\x59\x0e\xc7\xa9\x14\xa0\x64\x27\x34\x2d\x0d\xe7\x09\x2c\x74\x13\x90\xa5\xb2\x2f\xee\x77\xfd\x4e\xf2\xa1\x54\x56\xe3\xa6\x62\x71\xdf\x77\x59\x46\x84\x70\xd5\x45\x09\x30\x60\xd1\x77\x96\x53\x37\x7d\x1f\xd2\x54\x73\x9f\xc2\xf0\x88\x14\x8a\xdd\xfe\x25\xfb\x24\x13\xbc\xa7\xe8\x17\x68\xd0\x01\x05\x59\xd5\x39\xd5\xb1\xb3\xf1\xb8\x52\x18\xa7\x36\x76\x3a\xdc\x7b\xff\x2d\xfd\x5b\xc1\xad\x44\x99\xa3\x64\xdf\x4c\x51\x5a\xf6\x23\xbc\x9c\x67\xa7\x32\x22\xc1\x26\x0c\x1f\x90\x15\x6b\xb3\xef\x69\x1e\x65\x9a\xe4\x2e\xef\x16\x0d\x5b\x68\x81\x3a\xa7\x99\x2d\xe6\xb8\x5d\x5c\x95\xad\x1e\xfc\x50\x21\x54\xee\xb9\x41\x14\xb6\x6a\x5f\xf6\xb0\x5e\xf1\x8c\x7e\x0f\x56\xf1\xd6\x97\x7c\x43\x19\x0f\xfb\xe4\x5c\x2d\xfe\x5b\x28\x67\x21\x88\x64\x39\xb9\x63\x56\x6f\x60\xcd\x66\x6f\x37\x61\x1f\x0f\x53\x3f\x2c\x58\x01\x55\xec\xba\x71\x80\x7a\x4c\x9e\x0a\xaf\x46\x63\x4a\x4c\x6b\xeb\x07\x4e\xa1\x64\x38\x51\x72\xaa\x96\x66\xa4\x6a\x7d\x49\xfe\x2a\xd4\xba\x69\x73\x22\xa2\x6c\x56\x27\x69\x35\xe6\x7b\x2d\xb1\x2e\x1a\xf1\x65\xcd\xd6\xce\x1a\x98\x79\xa0\xb6\xb4\x65\xd6\xaa\x5a\x00\x8f\xa7\x94\xed\xf4\xfa\xe2\xcd\x62\x57\xb6\xb5\x9f\x5e\x76\x38\xf7\x08\x9f\xde\xe6\x5e\xee\xec\xf9\xa5\x90\xd0\x20\xc2\xb2\xf3\xd3\x97\xde\x66\x81\x95\x17\x44\xba\xad\xdf\x45\x8a\x81\x3b\x3e\xcf\x52\xfc\x2b\xf5\x2b\x11\x31\x77\x8c\x23\x76\xca\x50\xa3\x6e\xe9\xa5\x40\x9f\xcb\xe9\xf4\x1a\x45\x38\x81\x87\xd4\xc5\xb4\xc8\xe9\xd9\xa5\x29\x74\x3b\xf9\x0c\x9b\x8e\x20\xeb\x43\x8b\x8d\x0f\x61\x8a\x08\xe4\x4b\xcf\xcf\x66\x49\xa1\x1b\x8b\x3a\x81\x37\xbb\xb2\x6a\x2e\x92\x57\x1a\xde\x02\x8e\x69\x01\x07\xe4\x7f\x9e\xd6\x8f\xe5\x90\x83\xff\x98\xb9\x2a\x87\x45\xd7\x6e\xd2\xf7\x84\xf9\xab\x5a\x75\xb8\xf4\x2d\xa9\x51\xd6\x00\x0e\x45\xfb\x68\xae\x96\xbf\x33\x2a\xc0\x51\x79\x64\x3b\x28\xc0\x4c\x9f\x8e\xa0\x26\x25\x75\x20\x12\xe1\x36\xa3\x6f\xac\x4c\x0c\xb3\xa6\xe4\x94\xef\x63\x69\xef\x97\x20\x7a\x93\x69\xbb\x4b\xb6\x64\xcc\x73\x28\x7b\xa8\xbc\x32\xbe\xe1\x67\xf9\x76\xb2\x9b\x6e\x36\xcb\xf8\x21\x3e\x92\x8b\x87\x31\x6c\xc4\x62\x55\x27\xe6\x1f\x9d\xeb\x3f\x65\x33\x08\x97\xf4\x93\x1a\x6a\x10\xea\x6b\xed\xaf\xc1\xfd\xd1\x73\x1e\x78\x5e\x8d\x37\x50\x1c\xcc\x82\x01\xa4\x73\x0e\x32\x2f\x10\xc3\xa3\xa7\xf7\x50\x0f\x0d\x64\x28\x32\x1c\x1a\x2e\x56\x9e\x6f\xdf\x84\xae\x87\x46\xf9\xbe\x53\x85\xc5\x29\x6a\x53\x93\xd3\xea\x54\x6a\x44\x68\x39\xf3\xf8\xb3\x73\x0b\xa7\xdb\xb2\x94\x49\x2f\x40\xe9\x41\x90\x05\x90\x4a\x4d\x50\xe8\xbc\xe9\x73\x1c\xfa\xf2\x7f\x37\x75\xe4\xec\xe6\x08\x2c\x6c\x68\x89\x59\xb8\x69\x00\x5d\x7b\x72\x2e\x1b\xd9\x0e\xe0\x7d\x6a\x90\x60\xd5\x24\x8d\xf4\x4b\x8a\x82\x82\x00\x6b\x73\x80\x27\x36\x48\x1e\x96\xe3\x7c\x4c\xd1\xde\xc6\x80\x3e\x29\xc4\x97\xa2\x99\x53\xd5\x07\x0a\x2a\x26\x9f\x27\xcc\x61\xa4\x1f\x72\x56\xeb\xae\xfb\x56\x5b\xec\xf0\xa4\x2f\x27\xb4\x1f\x76\x97\x4e\x90\x1f\x7b\x6e\x45\xdf\x2f\x1c\xef\x35\xf9\xd7\xa3\xe5\x3d\x3c\x75\x3b\xcf\x17\x30\xe0\xa9\x24\x19\x7d\xbf\xfe\x4a\x86\x75\x79\xdc\x53\x55\xe7\xc6\xb8\x7f\xd1\xdc\xff\xa1\x1f\xb5\x98\xcd\xea\x9b\xea\xff\xf6\x82\x18\xc1\xd1\x72\xfd\xe2\x1e\x22\x38\x4b\xb7\x6c\xd7\x91\x8c\x92\x89\xfb\x07\xbd\x42\x90\xb5\xb0\x81\x6f\xa6\xea\x54\x18\x40\x65\xb7\xa3\x15\x56\x22\x89\x80\xaf\x73\xd3\xa3\x99\x1e\x4d\x45\x05\xa3\xee\xa4\x1c\x7f\x77\x1a\x22\x80\xc2\xfc\x9e\xdc\x40\x3c\xc2\xfb\x92\xd5\x41\xa7\x11\x0e\x21\x02\xc1\x3c\xb0\x80\xaa\x56\x40\x0d\xa7\x2d\xbe\x29\x3c\xd0\xbd\x80\x78\x50\xba\x3d\x4a\x44\x2e\x74\xd9\xb9\x4c\xeb\x50\xf2\x7c\xa9\xac\x9c\x61\x46\xc6\xb7\xec\x7e\x62\xf5\x15\x7b\x8d\x5d\x28\x6b\x85\xc9\x19\xaf\x90\xf6\xdc\xaa\x22\x5a\x6f\xad\x75\xe4\x93\x91\x16\x5f\xbd\xc4\xd6\x79\x33\xb0\x45\x91\x28\xa3\xc3\xab\xe7\x61\x24\xa0\x07\x23\x43\x2d\xb9\xb0\xc7\xf7\x69\xfb\xd6\xff\x6f\x47\xf3\x8b\x4f\x8b\xb3\xa1\x17\xa8\x99\xff\x10\xc4\xc1\xca\x6e\x0c\x39\x55\x67\xc8\x90\x4b\xd5\x70\x3e\xea\x0b\x48\xad\x18\x85\x90\x56\x76\xab\xa1\x46\x2c\x90\xeb\xb2\xc4\x4f\x40\xb8\xf7\x1f\x9f\x9c\x1f\xb6\xe9\xe1\x09\xfe\x7e\xb8\x89\x58\xae\x41\x4f\xf7\x83\xbb\x2c\xf7\x10\xad\xf8\xa3\x9c\xe7\x01\x7a\x2a\x37\x0d\xe9\xf5\x33\x44\x4c\x40\x32\x2b\x18\xf6\x46\xee\x10\xf2\x73\x8a\xb7\x8c\xdb\x17\x47\x3a\xc4\x0c\x1a\xa8\x0c\x6f\x75\xfa\x3e\x51\x53\x97\xaf\x5b\xd3\x3e\xf4\x0a\xc3\x92\x15\xee\x6c\xf2\x3b\xdb\x4b\xac\xaf\x68\x58\x04\x5f\x93\x8c\x12\x1a\xec\x7c\x6a\xf9\xb3\x3f\x56\xda\x46\x97\x40\xda\xad\x63\x45\xc0\xa0\x55\xc8\x1b\xa0\x88\x75\x71\xa5\xe8\x17\x71\xeb\x95\x24\xd0\xf4\xe9\x06\x5c\x07\x26\xb8\x54\x79\xf1\xae\xe5\x65\xd9\xc6\x46\x28\xf9\xfd\x16\xd9\x3b\xaf\xa6\xde\x6c\xe8\x4e\x4a\x0b\x25\x23\xbf\xe3\xdf\x7b\x8f\xd2\x4b\xa2\xaa\xab\x50\xb3\x9c\x3e\x88\xa3\x94\xf6\xc1\x30\x08\x63\x65\xd9\x31\xcc\x93\xaf\xfe\x17\x61\x59\x4b\x70\x9a\x01\xeb\xd0\xb2\xa5\x75\x1a\x93\x7a\xe0\x61\xd8\xc2\x3d\xd7\x77\x80\x66\xc3\xa8\xd1\x42\x7d\x20\x28\x7d\x07\xfb\x73\x90\xca\x9b\xe7\x72\xc7\xfb\x22\x7f\x81\xcd\xc1\x9b\x1e\x25\xcb\x24\xbe\x73\x49\xe2\x53\x9d\xec\x1c\xd9\xd2\x56\xc7\x78\xbf\xa7\x25\x34\xdb\xfa\xba\x00\x82\xf6\x76\xa9\xb6\x38\xdf\xef\x09\x12\x94\x72\x9b\xbe\xd2\x23\xd4\x90\xca\x89\xf1\x8c\xba\x68\x7f\x4b\x3e\xa9\xd2\x96\x22\xfb\x67\x7b\x37\x60\xb5\xf8\xe3\xda\x0a\x98\xf5\x6c\x7d\x14\x97\x75\x57\xfb\x53\x4b\x25\x36\xe2\x22\xfd\x67\xc4\x3d\x66\x19\xe1\x48\x0a\x14\x6d\xa4\xf7\x4a\xd3\xd7\x6a\x48\x0b\x35\x7c\x8f\x26\xf6\xea\x2a\xba\xdb\xe1\x6e\x5f\x64\xa5\xc9\x0a\xc0\x69\xbf\xf9\x49\x4f\xeb\x5e\xee\xb1\x8b\x4a\x5a\x2a\x58\xee\x00\x60\x35\x17\xe5\x97\xa3\x29\x89\xb5\x3d\x8c\xa2\x9b\xf9\xc7\x3d\xcc\x4d\x5b\x9a\x92\x72\x4a\xec\xcf\x69\x0d\x7c\x02\x06\xf0\xf1\x89\x24\x82\x1a\x4a\xe0\xb4\x99\x69\x49\x76\x04\x72\x2d\x95\x9f\x3c\xe7\x4e\x3a\x46\x73\xd9\x29\xe1\xd9\x80\x1b\xbe\x23\xbf\x10\x53\xe9\x35\x06\xcc\x36\x3c\x77\x91\x72\xe7\x4a\xcd\xde\xbf\xb0\x65\x5b\x3f\x06\x7a\xa4\xec\x0f\xfe\x0b\x64\x35\xc5\x1c\xfd\xf4\x84\xde\x5d\x7e\xa8\x5d\x8d\xb6\xa0\x31\xd5\x1c\xb7\xc9\x48\x01\xf3\xba\x23\xa5\xa7\xc4\xad\x49\x4c\x1b\xc1\xd8\x5a\x52\x0e\xbf\xba\x6f\xa3\xce\xf0\xc6\x2c\x35\xda\x24\xc5\x8e\x12\xb2\x3f\x87\x0e\xe8\x72\x1c\xf8\x1c\x42\x88\x79\x07\x49\x09\x80\x5a\xdd\x3e\x0e\x9b\xff\xac\x63\xb2\x94\xfd\x4a\x41\xeb\x95\x03\x18\x8a\x0a\x42\xa9\x20\xd8\xde\xdd\x54\x87\xe0\x6e\x19\xe7\xf7\x1b\x97\x8c\x60\x26\x95\x8f\x9a\xb7\x46\xb7\x16\xdf\x90\x52\x1d\x53\xed\x3f\x28\x0f\x6e\xd2\xba\x6d\x23\xac\x5c\x12\xb7\xcc\xac\xcb\x85\xed\x2c\xf6\xb3\x1d\x4e\xc4\xe7\xf2\x35\x8a\xf2\x39\xcb\x91\x10\x52\x75\xd3\x28\xb2\xb7\xdf\x21\xf2\x84\xfb\x28\xf4\x4f\xc9\x9f\xcb\x11\x69\xf6\x77\xa9\xb4\x46\xaf\x34\x6d\x9a\xa1\x55\xe3\x41\xf1\xac\x6b\x28\xd2\xe6\x12\x4b\x55\xad\x80\xc2\x76\xdf\xa4\x5f\x01\x8c\xa7\x0a\xb2\xb2\x72\xa2\x45\x7d\x1c\x65\x26\x53\x39\xc9\x79\x93\xa2\x0b\x33\xd5\xca\x70\xea\x75\x05\x97\x1a\x20\xe4\x72\x2e\xca\x93\xb6\xe0\x94\x9c\x8b\x03\x71\xca\x56\x02\xbd\x93\x94\x88\x77\x1f\x6b\xc9\x12\x48\xa7\x6a\xfd\x67\x54\xfd\xfe\x13\xd3\xf0\x9f\xf4\x64\xc9\x3a\x2e\x46\x8b\xfc\xab\xde\xc7\x7b\xcb\x95\x40\x27\x3f\x07\xa8\xca\xd1\x39\x31\xe9\x50\xa3\x85\x7a\xc0\x15\x67\xcf\xab\xba\xc8\xd6\xec\x07\x16\x17\x52\x10\x18\x94\xff\x95\x0f\xb9\xda\x26\x0f\x99\xc2\x55\x43\x9e\x15\xbc\x5d\x80\x2a\x95\xae\x6c\xa3\x01\xea\xbb\x31\x99\xa6\xf9\x6c\x34\x76\xa7\xa9\xd1\xbf\x52\x3e\x98\x4e\x3f\x8f\x89\xce\x90\x6a\x6e\x3c\x87\xaf\x35\xba\xbb\x16\x42\x7b\xc0\xd8\xeb\x6d\xa9\x7d\x08\xf5\x87\xd1\xea\x03\x13\x78\x94\x43\x37\x72\xb1\x56\x8f\xb2\x2f\x86\x57\x6d\x4a\x4b\x85\x57\x21\xe9\x91\xb5\x47\x1f\x19\x20\xb1\x49\xf9\xf3\x23\x93\x6d\x12\xa2\x2f\x4c\xaf\x7b\x5b\xcb\x9e\xbf\xc0\x4f\xdc\x43\x33\xfb\x5e\x12\x25\xf6\x9d\xb9\xf0\x68\xc4\xd0\xd8\x1b\xfd\xfb\x8e\xa0\x9d\x4f\x0a\x6c\x77\x08\x4c\x19\x02\x4b\xf8\x94\xbe\xf5\x7b\x4f\xa7\x01\x63\x5c\xf7\x2f\xdd\x9f\xfe\xaf\x14\x0e\x7d\x87\xb3\x5b\x46\x80\xb2\x6e\x4f\x11\x50\x71\x8f\xa1\x84\x79\xeb\xd1\xb2\x1f\x76\xbb\x2c\xdf\x99\xdd\x42\x76\x4b\xfc\xf6\x68\x35\xe0\xd4\x89\x68\x4f\x91\xbf\xcd\xf8\x26\xb2\x0f\xac\x2c\x58\x75\x49\xcb\x53\xd1\x24\x63\xb6\x19\x62\xe3\x5f\x68\x58\x67\xb4\x50\xe2\xa9\xa3\x74\xe6\x14\xfa\xc1\xec\xdc\xf5\x95\x22\xcc\x75\xfd\xa1\xce\x13\x5c\x86\xf6\xd1\xec\xae\x10\xee\xd2\x3d\x1c\xe4\x76\x1c\x0a\xe6\x58\xda\x9e\x56\x8b\xe5\xbd\x90\xf4\xfb\x2c\xa3\x2d\x12\xda\x4f\xb2\x9d\x5a\x5b\xb1\x60\xa5\xe4\x5e\xa2\x0d\xfc\xca\xd1\x46\x1e\x97\xb3\x36\x87\xd9\x61\xfe\x27\x05\xae\x1d\xe6\x7b\xb4\x6d\x38\x17\x5f\x6a\xf8\x13\xad\xbd\x32\xd3\x78\x77\xb9\x04\x7b\x60\x2e\x7d\x98\xe6\xde\xc4\x0b\xdc\x75\x5a\x91\x15\xcb\x9f\x51\x56\x4b\xb9\xb1\x25\x0b\x9d\x16\xf7\xb5\x93\x5c\x8e\x9d\x26\xf4\x0f\x01\xd8\xd8\x91\xe8\x09\xc0\xda\x24\x29\x1e\x60\x3e\xae\x06\xf2\x59\x52\xaf\xc5\x79\x6f\xd7\x0d\x8a\xf6\xcd\x76\xf6\xa6\x37\x80\x20\x3f\x33\x71\xb8\x29\xfd\xbd\x79\x68\xee\xa6\xf3\xaf\x44\x0b\xd1\x64\x6f\x45\x89\x9f\xca\x11\x67\x0b\x83\xc9\x2c\xf6\xb2\xa8\x00\xa4\x06\x2c\x4f\x91\xe8\x2b\xe2\x01\x72\x6d\x36\x08\xee\xd3\x09\x3b\xe3\x9b\xf8\xf2\xfe\x31\x84\xfc\x7b\x3d\xc6\x11\x53\xa3\x7d\xdb\x88\xe9\xc6\xcb\x2e\xfd\x65\x73\x5b\x0e\xf9\x37\xf6\xb3\xb7\x64\x9c\x6a\x0a\xfb\xbf\xb4\x4b\x26\x5d\xa2\x07\x32\x42\x70\x3f\x84\xa5\x16\x3f\x58\x94\x50\x19\x40\x8e\x24\x53\x25\x8d\xd4\xab\x9e\x21\xdc\xed\x23\x17\xf6\x54\x1d\xb0\x4a\x35\x3a\x90\x0b\x56\xe4\x5d\x6a\x79\x48\x7c\xca\xdf\xcd\x8c\x76\xb3\x10\x35\x86\x3c\xeb\xc5\x23\x83\x77\x0a\xaf\x2a\x0c\xd3\xf3\xdb\xa4\x32\xf1\x2d\xd0\xd6\x5e\x63\xe0\xce\xd1\xbb\xc6\xed\x7d\x5f\x3b\xdc\xbd\x9e\x58\xfe\x7e\x3d\x90\x94\xf4\xbd\xca\xc1\xaf\x53\xa1\x42\x53\xf1\xab\x50\x42\x8c\xe4\xa0\x6c\xad\x20\x12\x92\xe2\x7f\x54\x8e\x99\x74\x79\x94\x30\x4f\x81\xf2\x05\xcb\x2c\xe4\xbe\xce\xc5\x41\x8b\x59\xeb\x5b\x7f\xfc\x41\xf6\xdb\x8d\x6d\xee\xfb\x3d\x6c\x13\xc7\xc7\xe3\xc2\x9f\x06\xd1\x11\x22\x6c\xfc\xd5\x72\xa9\x13\xe5\x89\x35\xa5\x4f\xf9\xcc\xb1\xe3\x77\x7a\x5c\x74\x5a\xc8\x20\x3a\x8b\x1e\xb7\x50\x40\xde\xc4\xa5\xe0\x78\xa7\xad\x52\x41\x01\x59\x5d\x2c\x8a\x58\x4e\xda\xb0\x29\x2f\xd7\x28\x74\xcb\x3d\xd5\x3b\xe8\x3a\xcf\xc5\x24\xcb\xa9\xd4\xda\x7c\x52\x20\x80\x74\x5c\xf4\xb5\x37\x8f\x14\x25\xd9\x63\x6b\xc7\x17\x18\x4b\x55\xf9\x80\xa6\xfc\x01\x41\x55\x2b\xbb\x4a\x8d\xf4\xad\xba\x54\x90\xfa\x58\x76\x93\x21\xb2\xc7\x55\x58\x40\xd0\x6c\x0b\x78\x80\xa4\x74\x58\xa2\x70\x17\x80\xb9\xc3\x0f\x83\x82\x01\x4f\xbf\x96\xf5\x02\x6a\xa7\xbc\xfc\x96\x6d\x2f\x20\xdd\x58\xd3\xf6\xf0\x9f\xc2\x09\x06\xb8\x15\xd6\x8b\xc9\x79\x0b\xcf\x91\x7d\x09\x5e\xfd\xae\xf2\x1f\x72\x8e\x55\xd8\x99\x1e\x6f\x6d\x40\xd8\x4b\xb2\x7e\xa1\x0c\xde\x2e\xce\xb0\xb4\x22\x21\x2d\xfe\x27\x67\xee\xc7\xe3\xb4\x2b\x74\x86\x34\x9a\x3e\x97\xa1\x7c\x42\x9a\xd7\x94\xe5\xdd\x7c\xbb\xb2\xf7\x6d\xc2\xa9\xbc\x7e\xb7\x6c\x41\xf9\xb7\xf8\x84\x5e\xff\x64\x5f\x9d\x2e\x40\xf0\x52\x11\xd3\x02\xfb\xa1\xc6\x3f\x8a\xfc\x47\x36\x38\xe1\x83\xca\x46\x79\xff\x61\x94\x4b\xa9\x00\x3a\x3b\x4e\x9c\xc1\xd8\x9b\x2b\x7b\xaf\xfc\x2d\x6a\x4f\x81\x9a\x76\x63\x13\x3f\x42\x1c\x7b\xe7\xf2\x7e\x90\x95\x65\x64\xfd\xff\x60\xac\x00\xb9\x3d\x03\x1c\x5b\xca\xf5\x00\x3d\x54\x99\x50\x62\x68\x29\x11\x1f\x77\x87\x64\x69\xa9\x70\x19\x0f\xe8\x2f\x88\x79\x7c\x12\xa5\x0e\xf6\x9b\x0c\xa9\xcd\xd8\x5c\x99\xee\xf1\xed\x88\x6a\xf7\xe7\x2b\xeb\x0f\xe2\x5c\x79\x57\x51\x33\xd8\xdf\xa6\x1c\x93\x7b\x2d\x11\x72\xae\x30\xc6\x15\x2a\xf1\x50\xe0\x56\x96\x4f\xc2\xa4\xd5\x2c\xca\xe1\xad\x13\x7d\x75\xdf\x86\x1a\x09\x21\xa1\x43\x22\x85\xfe\xbd\x29\x3d\x4e\x43\x6a\x03\x28\x3b\xc6\x24\x74\x1d\xdb\x45\x78\x69\x7c\xb1\x6a\xe5\xbf\xa3\x5a\xd8\x21\xea\xab\x84\x8f\xb8\x8d\xda\xe1\xbf\xa1\x82\x70\xef\x9e\xbc\x79\x66\x11\xd8\xc4\x3d\x25\xd9\xb2\xe0\x27\x20\xc0\xf1\x24\x09\x5f\x0c\x55\x10\x2d\x61\x41\x04\xcc\x8e\x28\xe0\xb9\xb0\x6e\xc2\x5f\xf5\xed\x4d\xf5\x09\x7b\x6b\x35\xe4\x4f\x01\x64\xcd\xc9\x28\xd9\xa4\xfc\x37\x4b\x6e\x23\x5b\x93\x79\xfc\x2b\xfc\x04\xe6\x0f\x51\x5b\xf4\xd0\xca\x61\x5d\xd0\x36\xda\xa8\x94\x48\xeb\x55\x1e\xa0\x92\xf3\xca\xee\x9a\x65\xdb\x79\xa8\xe5\x22\x63\x38\x5d\x56\x98\x8c\xc2\x9a\xc2\x11\x0a\x90\x8d\xaa\x93\x90\xee\x21\x7e\x7d\xbc\x84\xa5\x62\x5e\x33\x84\x99\x29\x30\x1a\x04\x2d\xdc\x84\x8d\x55\x9d\x70\x3e\x10\x65\x82\x77\xfd\xcc\x1d\x55\x47\x9f\x1a\xc0\xb1\xcd\x6e\x89\x62\xc0\x5e\xc3\x73\xb3\xbc\x3c\xfe\xf6\x51\x73\xea\x71\x19\xc6\x66\xb4\xee\x25\xe4\xd4\xaa\x48\x76\x95\x3b\x21\x7a\x75\xf9\xc7\x58\x63\xcd\x97\x0f\xd7\x3f\xf8\x40\x98\x6c\x5f\x26\x1d\x01\x0c\x61\xe3\x7e\x6e\xfa\xd6\x85\x07\xd4\x64\x88\x85\x18\xce\xd8\xb8\xbc\x66\xbf\x70\xac\x6a\xaa\x33\xe1\x2f\x85\x62\xc4\x64\x60\x60\x6f\xb5\xc4\x88\x4d\x35\x8c\x18\xe6\xf0\xe7\x25\x44\xa1\x0a\xbb\xa9\xeb\x7e\x33\x62\xc4\x48\x11\x87\x01\x08\x3c\x3b\x2d\x7a\x9c\x41\x55\xe7\x4a\x75\x42\x34\x1b\x1f\xb9\xeb\xd2\xcc\x4b\xec\x21\x7b\x02\x90\xb2\xd9\x5b\x37\x17\x2e\xa4\x30\x33\xcc\xd4\xb4\xe8\x4e\x75\xba\xd9\xc0\x73\x27\x5c\x31\x09\xfe\x14\x2c\xf9\xfe\x8f\xaa\x2b\xcb\x52\x5d\x47\xb6\x73\xe1\xe7\xfc\xbc\x49\xc9\x0d\xc6\x89\x6d\xb9\xdc\x40\x92\xa3\x7f\xda\x4d\xc8\xdc\x5b\xb5\x16\x32\x09\x1c\x1a\x5b\x52\xc4\xee\xa0\x87\x0a\x6f\x07\xfe\x60\xf7\x51\x0b\x66\x30\x43\xd4\x18\x17\x05\xe6\x8e\xf5\xef\xc5\x13\x5b\xd5\x82\x31\xad\x52\x5c\x83\x91\xe5\x1a\x21\x08\xb5\xb5\x50\xed\x7f\x99\xf7\x2f\xde\x48\xae\x86\x95\xe8\x98\xf7\xe1\xfb\x3d\xb2\x61\x07\x1f\x83\x66\xaa\xbe\x3f\xec\x57\xc5\xd2\xd3\x2f\x6c\xee\xf3\xe1\xa5\x58\xfc\xb8\xb4\xef\xe7\xce\x36\xe2\x34\xba\x8a\x46\x7a\xa9\xff\xbb\xa0\x9e\x8c\x8e\xde\x2d\x5b\x99\x6f\x5f\xab\xcf\x82\x8e\x2e\xb7\xee\xa7\x15\x8f\x65\x25\xdc\x6c\x1a\xf1\xb6\x36\x2e\xa3\x65\x26\x2a\x2e\x9e\xbc\x58\x3c\x47\x0b\x1a\x57\x16\x12\x5d\x54\x5e\x2e\x33\x4f\xe2\x40\xe9\xe3\xf5\x28\x70\x8a\x6e\x6c\x1a\x3d\x1b\x4e\x60\xf6\x2a\xaf\x7e\x48\x1d\x49\x0b\xea\xa3\xf3\x14\x0e\xf7\xad\x7b\xe0\xff\x61\xdf\x77\x85\x93\x5f\xee\x14\xe9\x78\x34\x6e\xc2\x27\x8b\x13\x25\xc7\xe3\x7d\xae\x4a\x4e\x7b\xaa\xb5\xee\x64\x81\xdf\x12\xc5\x04\xe4\x1d\xbc\x75\x93\xb0\xdd\x02\xd5\x6e\xcb\xf4\x67\x3e\xcb\x3e\xc3\xfc\xb2\x6c\xf1\xa4\x9d\xdb\x0e\xe0\x3d\x87\xe9\x29\xeb\x47\xec\xbd\x6a\xd8\xe5\x67\x2f\x90\x7c\x5c\x21\x27\x58\x80\xda\xa0\x02\xd7\x28\xe0\x36\xdb\x2b\x37\x9e\x84\x54\x51\xf3\x89\xcb\x69\x34\x2f\x5f\x35\xcf\x78\x15\x3c\x67\xf5\x3d\x07\x71\x26\x02\xd8\xd2\x21\xae\x4f\x9b\x2f\x95\x69\x9b\x1f\x14\x37\xde\x54\xee\xd8\xbd\xe2\x8a\xce\xa5\xef\xc5\x7c\x51\x26\xda\xc7\xb9\xae\x4a\x76\x75\x38\x6a\xb9\x7d\x96\xb9\xa4\x63\x63\x8f\x9d\xa7\x88\x72\x2b\xdb\x00\xb8\x37\x39\x83\xaf\xec\x15\x68\xbd\xb7\x8b\x56\x8c\x6c\xc0\xa1\x3a\x9b\x36\x6a\x24\x97\x52\x27\xc9\x7f\xb9\x81\x88\x7f\x8e\xea\x25\x47\x00\xac\x28\x99\x94\xeb\x55\x33\x0c\xcc\x4c\x15\x23\x2e\x77\x3c\x5d\xfd\x64\x01\x00\x76\x04\xdb\x80\x9c\x6b\xa4\xd7\xe8\x1f\xe9\x35\xba\x7c\x6e\xca\xee\x21\x99\x9d\xb3\xb9\xfa\x59\x9e\x30\x9e\xd2\x50\x15\x47\xd9\x0e\xb3\xdc\xb0\x4d\xaa\xfd\xd9\xb7\xdd\x0a\x24\x9a\xa6\x57\x17\x52\x34\x07\x1d\xbc\xfe\x14\x1e\x29\xab\x76\x1a\x8d\xdd\x27\x6d\x9a\x52\x57\x66\x7d\xf7\xef\x5b\xc1\x51\x2a\x68\xa8\xe5\x74\xff\x07\x56\xa7\x2e\x83\x1a\x7d\xc8\xbf\x48\x07\x2e\x53\x0e\xdf\xd2\x5f\xf0\x50\xfe\xcc\xa9\xf8\x9c\xf6\x8b\xfc\x60\xaf\x16\xce\x43\x9f\xbc\x79\x13\x07\x4d\x13\x6e\x40\x60\xd7\x40\x22\xba\xb7\x3b\x76\xef\xc7\x67\xf9\xc7\x3f\x00\x26\xe0\xbf\x51\xaa\xa0\xa5\x72\x6a\x4c\x28\xd6\xb0\x14\x58\xb0\xe9\xbf\x5d\xa6\x65\x37\x74\xff\x69\xf4\x7f\x63\x65\x03\xd7\xbd\xcb\xa7\xcc\xa6\x14\xae\x69\xc2\x04\x6a\x09\x03\xd4\x55\x94\x70\x40\x9f\x59\xcf\xb7\x8b\xdd\x52\x5f\xa2\x8d\xf8\xf6\xb2\xe9\x10\x6d\xe7\x9c\x73\xd4\x3b\x3c\x75\x3d\x5e\xf6\x0a\x15\x1f\xe8\x9b\x38\x27\x1f\x78\xbf\x12\xe4\xc6\x59\x38\xc9\x31\x72\x71\x2a\xc5\xcf\x36\x88\x0e\xc8\xee\xe1\x2e\x7e\x02\xc6\xaa\x6f\xca\x35\x7e\xaa\xa8\x71\x50\xee\x4d\x42\xbd\xa3\xee\x2e\x60\x80\x06\x8e\xd4\x8d\x88\x42\xb8\xab\x95\xf3\xdd\x7f\x96\x73\xd7\x7e\x2d\xa9\x65\x77\x77\x8f\x94\xb9\x93\x51\xa6\x2e\x56\xce\x80\xa0\x1d\x46\xbd\xd5\x83\xf1\xf8\x89\x94\x54\xc0\x66\xbe\xfd\x26\xee\x54\xe6\x3a\x31\x87\xaf\x8d\x2e\xe0\xae\xe3\xf2\xf1\xd8\x02\x8b\xa8\xb1\xb9\x6b\xdf\x5e\xa6\x80\x7b\xd9\xc9\xb6\x61\x4a\x3f\x4d\xf9\xef\x8f\xa4\xe3\x0c\x20\x4e\x95\x44\x96\xd3\xd9\x02\xd1\x26\xff\xbd\x19\x3e\x5a\xa0\xbe\xf3\x7d\xb8\x17\x55\x7e\x06\x93\x8e\xf8\x5e\xcb\x43\x93\x7d\x22\xb0\x2d\x88\xbc\x5e\xa8\x48\x6a\x82\xbe\xb9\xb8\xc4\x23\x44\x41\x77\x35\xb3\x56\x1b\xb5\x47\x5f\x9e\xa1\x37\xd7\xbf\x22\xa7\x1e\x96\x89\xe6\x29\x4d\x55\xef\x01\x8a\x52\x74\xaf\x41\x8a\x34\x3f\x19\xc1\xfc\x4d\x13\xc3\x9c\x5d\xd5\x6c\xfd\x5b\x65\x20\xf3\xfa\x54\xf4\x80\x8d\xed\xef\xa4\x4d\x76\x0e\xd9\xc1\xd8\xf2\x15\xb1\x13\x45\x53\xac\xff\xd2\xe1\x7a\x70\x05\x54\x0e\x48\x7c\xd9\xcb\x14\xb5\xcf\x0e\xf5\x0b\x4a\x3d\x09\x4e\xad\xd1\x0d\x48\xe2\xa3\xce\x79\x29\xc1\x44\x54\xa6\x5a\xfc\x84\x37\x2f\xeb\xa0\x64\x47\x92\x52\xa2\xf6\x2e\x87\x18\xac\x15\xd4\x19\x64\x8a\x6e\xd5\xca\x0a\x05\x8f\xe6\x23\x44\xef\xc8\x5c\xce\x8f\xd5\x59\x0c\x45\x11\x7f\x11\x44\x01\xaa\x28\x08\xa1\x8b\x9c\xde\x9a\x64\xe2\x2d\x73\x83\xbf\xdd\x46\xd8\xa2\xa8\xd9\xc1\x53\x1f\xad\x2f\x6c\x20\x22\x08\xde\x05\xd3\xbd\x5a\x44\x48\x44\xc8\x7f\x27\x5f\xdb\x9c\xb5\x02\xd7\xab\xfc\xf1\x95\xee\xe3\xe2\xa7\x4c\xff\xb6\x3d\x99\xbc\x7e\x21\x48\x66\x62\x7b\xca\x99\x3f\xaa\x7a\x7c\x32\xda\x84\x84\xf7\xa5\x1a\x04\xb8\x7b\x2b\xc7\x50\xc0\xca\x01\xc8\xe7\xd1\x8d\x31\xa8\xd8\xc9\x18\x0e\x6e\x5a\xbc\xb5\x08\xe6\x8d\x1b\x16\xe8\x0c\x17\x9f\x8b\xa0\x2d\x6d\xb1\x48\x2e\x68\xaf\x8a\xc2\xe5\xc0\x00\x0e\xcb\xa0\x72\x94\x61\xd3\x1d\x46\xf6\x70\x90\x5b\x24\x06\x3c\x8f\x47\x99\xb7\x55\xb5\x94\x5f\x41\xbc\xa2\x1c\x8b\x31\x60\x16\xc3\x2e\xb0\x24\x17\xc9\xbd\x7e\x27\x73\x88\xf6\x09\x16\x88\xbe\x2e\xdc\xa5\x5e\xfc\xb3\x58\x60\x33\xf3\x13\x6e\x02\x63\x54\x50\x85\x9e\x00\x29\xc6\xa4\x14\x6b\x4c\x74\xda\x4f\x4d\xfb\x74\x55\x5f\xf6\xe2\x35\xe1\x16\x0a\x2d\xbd\x1d\xc4\xa1\xbf\x22\xbf\x40\x63\xbf\xf7\xb2\xa3\x73\xf7\x02\x2c\xa8\x48\x1b\x98\x82\xef\xc1\x8e\x97\xcc\xda\xe0\x8e\x67\x0e\xd4\x3d\x1a\x98\x93\x03\xbb\xc3\x98\x6b\x42\x6a\xd8\x56\xdd\x4f\xfa\x90\xb8\x4d\xe5\x2a\xe2\x6b\xf4\x83\x27\x61\xf0\x5d\xc4\x98\xb7\x4a\xe0\x59\x7e\x8f\x56\xf8\xcf\xb3\x2c\xa4\x24\x9e\x3c\x47\xd4\x7c\x18\xa4\x95\x78\xea\x0f\xf8\x08\xf7\x58\xcc\x7e\x4a\x99\xc1\x09\xac\x7c\xb3\xa7\x8b\xaf\x32\xa5\x89\x04\x31\x06\xbb\xd9\xe3\xae\x5a\x99\x2c\x27\x1a\x44\x1a\x3a\x08\xa1\x14\x58\x63\xf8\x93\x8d\xf2\xfa\xbe\xc8\x54\x1d\x10\xf1\x10\x26\xf6\x6d\x60\x3c\xf4\x34\x71\x19\x37\xd1\x33\xe9\x06\xe6\xd3\x2c\x0f\x93\xe8\x90\x51\xf6\x28\xdc\x67\xd7\x4e\xeb\xcf\x05\x1c\x52\xfe\x1f\x7a\x92\x0c\x24\x1f\x59\x6f\xcb\xee\xc1\x5a\x28\xd0\x12\x52\x82\x52\x99\x28\x1e\x26\x71\x3e\xd2\xe7\x3d\x3a\x4b\x69\x8e\x6d\xc4\xa3\xbc\x76\x63\xf2\xd3\xb8\x31\x1e\xef\x26\x32\xbf\x63\x15\x4f\xee\xe2\x91\x77\xa0\xf9\x63\xd8\x46\x1b\x9d\x40\x54\x6d\xe9\x17\xdd\x67\xcb\x76\x9e\xdf\xd5\x30\x41\x3b\x46\xe6\xd4\x14\xb9\xed\xc3\x48\xcd\x17\x5f\x7c\x40\xb4\xa3\x5e\xa2\xff\x0a\x6e\xa2\x61\xca\x76\x33\x0c\x54\xed\x54\x84\x09\x69\x43\x30\xf4\xbd\x52\x1f\x85\x49\xdf\x4f\x43\x44\x0f\xe5\x6d\x7c\x19\xc4\xdd\x41\x6c\x1e\xe9\x83\x70\xe7\x64\x7f\x63\x8d\x88\x96\xab\x7f\x0a\xa4\x58\xee\xba\x8d\xb2\xd0\xb6\x5f\x40\x8e\xe6\x6a\xc0\x82\x0e\x81\x0b\x40\x07\x48\x33\x2f\x78\x57\x01\x18\x66\x7b\xbd\x75\x95\xdb\x95\x20\x00\x5d\x25\xe1\x9c\x90\x2e\x81\x91\xb9\x49\xfc\xc7\xa3\xf2\x29\x6a\x53\x3c\xf2\x1f\x2b\x5f\xca\x85\x5b\x3f\xf0\x9a\x86\xdf\x70\x50\xfe\x43\xb5\xe3\x96\x1a\x2f\xf0\x6b\x4b\xc0\x78\x69\x0b\x26\x3a\x2b\xcc\x15\x03\x19\xb5\xda\x0e\x3a\xb7\xc7\x53\x4d\xf8\x57\x24\xe4\x9a\x44\xf7\x60\x7c\x83\x2f\xfd\x4e\x9d\x8e\xae\x5c\x8c\xbc\xbc\x48\xfa\x0b\x06\x17\x02\x1b\x09\x89\x97\x82\x2e\xd2\x91\x3a\x7e\x2a\x05\x46\xf4\xed\x18\xe1\x55\x09\x11\x25\x1a\xf1\x77\x21\x80\x84\xdb\xed\x72\x6a\x68\x33\x68\x26\xa3\x41\xa1\xb7\xab\x9a\x57\x1f\xa2\xcb\x37\x13\x16\x75\xf0\xe4\xda\xce\x71\x7e\xba\xe3\x86\x42\xea\x4a\xa1\x91\xf5\x71\x77\x85\x3d\xd4\x28\x2b\xbd\xc4\x74\xce\x86\x8e\x22\xe9\x3c\xc9\x71\xa5\x79\x2b\x7a\xae\x9d\xb2\x03\xbc\x18\x5e\xed\xf7\x38\x55\x0b\x89\x52\x5b\xed\x34\x51\x19\xe1\x5e\xb9\x18\x59\x6c\x71\x65\x06\x07\xbd\xfc\xf6\xd2\x6b\x3e\x1c\x8e\xf9\x9f\x7c\x96\x16\x57\x82\xb9\x53\xb1\x6a\xb6\xd0\x91\xf1\x76\xd2\xb5\x83\xfd\x47\x59\x93\x09\xee\x9c\xd3\xd4\xe5\xa1\x4a\x30\x1f\x61\x8d\x92\xfe\xfa\x8a\x2b\xbd\x2f\x6b\xc0\x0d\x28\x37\x06\xd1\x0c\x84\x61\x8a\x65\x98\xe5\x1b\x73\xdb\xb9\xf1\xf7\x25\x31\xe6\x19\x9f\xae\x99\xaa\xc6\xa8\x0c\x53\xf0\x8a\x3c\xe6\x13\xfa\xc9\x02\xae\xb2\xef\x5a\x3d\x88\x56\x80\xdc\x9a\x07\x13\xb0\xb0\x9f\xd2\x45\x9c\xde\xa2\x36\x24\xa5\x01\x90\x7c\x65\xe6\xd5\x5e\xab\xc8\x04\xae\x4c\x1a\x94\x7b\x59\x76\x19\xbc\x5d\xe5\x6b\x23\x42\x56\xdf\x76\xca\x87\x82\x7f\x1e\x7f\x37\x32\xae\x2e\x07\x15\xed\x24\xd2\x44\x12\x33\x46\xc3\x80\xc8\xef\x80\x96\xee\x12\xeb\xc2\x69\x81\xb1\xfd\x41\xff\x6a\x05\x24\x56\xf1\x85\xb3\x29\xf8\x4f\x7d\xd2\xd3\xdf\x0d\xa1\x28\x41\xf1\x65\x69\xc2\x0f\x1f\xb9\x13\xe5\xdf\xeb\xe5\x1c\x5d\x2e\x48\x07\x70\x5a\x3e\xfb\x1e\x87\xf0\x36\xcc\x79\x77\x46\xf7\xfe\x34\x71\x0b\x36\x23\x50\x3f\xf2\xe0\xb8\x92\xb8\x60\x04\xa2\x91\x14\x52\xac\xd3\xf2\xe4\x80\x2e\xb9\x69\xc3\x48\xc5\xa8\xf3\x6b\x34\x0d\xbe\xd4\x72\x46\xa6\x94\xe1\xc3\x82\x6c\xd7\x6f\x78\x46\x57\xed\x24\x2d\xe5\xa6\x04\x8b\x5d\x05\x59\xad\xa3\x4a\x79\x07\xaa\xa9\x86\x22\x2d\xfa\x62\x2e\x85\xdd\xb9\x84\xec\xea\x5c\xa0\x9a\x8a\x6e\x3f\x2b\xbc\x97\x7c\x70\xf9\xb3\x1c\xa7\xe2\xe8\xbe\xbc\x9f\xc1\x00\xdb\x1d\x92\x14\x32\x0e\x95\x72\xbf\x63\x1b\x96\x7a\x47\x2e\x97\xa3\x0a\xc3\x52\x35\x64\xbd\x3b\x07\x7b\xfa\xee\x7c\x3c\x92\xe3\x2f\xa2\xc0\xae\x91\x73\xc8\x5d\x1e\x47\x71\xd0\xca\x9e\x42\xfd\x1c\x94\x84\x55\x4a\x82\x9e\x07\xfd\x75\x51\xff\x41\x4f\xa8\x8a\xaf\x1a\xb5\xfc\xfb\x3a\xae\xe6\xbf\x40\xc3\xd0\xd9\xd2\xdf\x3a\x3f\xa6\x7d\x2c\x5c\xc9\xc2\xdc\xc5\x15\x41\x19\x4d\xff\x84\x2f\x80\x87\xa6\x2a\x35\x79\x65\x25\x88\xa8\xba\xe2\x33\x37\xa3\x4e\xe6\xdd\x39\x20\xd0\xa0\x64\xe7\xac\x81\x93\xd6\xff\xef\xfc\xd2\xa3\xac\xce\xe9\xde\xa3\x42\xe6\x38\x3a\x95\x65\x69\x6f\x03\xe6\x22\x51\x0f\xf1\xcf\x81\x8e\xc1\x89\xdb\xf8\xd8\xb8\x54\xc1\xac\x48\x99\xc2\xbc\x22\x20\x95\x16\xe4\xbb\x9a\xcb\x3c\x74\x34\x2c\x9c\x2d\x2d\x68\x59\xf2\x1b\xdd\x55\xbe\xde\x04\x1c\xd5\x56\x44\x3b\xf7\xf9\x8f\xe4\xc5\x7f\x37\x78\x8c\x5d\x96\xca\xc1\x43\x39\xc8\xe6\xa2\xe5\xf7\xe0\x4f\x4d\xfc\xcb\x6f\xe4\x51\x76\xc8\xab\xaa\xc6\xb4\x3d\x11\x74\xa3\xb1\x7a\x19\x3b\x14\xb0\x29\x40\xac\x74\x19\x5f\x7e\x59\xc9\x24\x1d\xab\x84\x71\xe5\x57\x56\xd2\xf8\xd6\xdb\x70\x9b\x91\x8f\xdc\x47\x43\xc4\xcf\xf1\xf3\x26\x27\x76\xef\xe0\xcf\x87\x1d\xef\x66\x44\x67\x33\x0b\xed\x94\xe3\xd1\x96\x8f\xb0\x7f\xf9\x3c\x7f\x4a\x4d\x26\xda\x9a\xd3\x97\xe1\xf1\x8d\xb2\xce\x60\xd8\x75\x19\x61\x37\xa2\x77\xa4\x3f\x7d\x87\x6f\x5f\x16\x34\x2a\x12\xe7\x64\xb7\x9a\x49\x21\xdd\xaa\x17\x7f\xf2\x68\xc8\xec\x21\x67\xad\x8b\x45\x17\xf5\xa3\x0e\x9e\xc1\x70\x44\x0e\x8a\x19\x74\xcd\x39\x4e\x1e\x01\x2b\xe4\xa8\x72\x61\xe3\x28\x28\xb0\x1b\x8b\xee\x7d\xf1\xdb\x08\x9f\x73\xb4\xa6\x49\x02\x29\x95\x26\x2d\x69\xb6\xfc\xd6\x59\x85\xf2\xf1\x26\x19\x8d\xea\xb7\xcd\x3e\x0d\x2b\xfc\x35\xbf\xf2\x60\x53\x35\x15\x2f\xe5\x89\x46\x8a\x1e\x58\x83\x93\xba\x56\x67\xc2\x15\xa0\x84\x98\x75\xa8\xfd\x84\xb9\x31\x5c\x3e\x38\x22\x6b\xaf\x69\x67\xed\x9f\x9c\xfe\xd6\x8a\xf4\xaf\x0c\x6b\xbc\xa9\x92\x74\x58\x3d\xdc\xce\x76\x87\xac\x84\x1e\xa0\x8c\xd2\xbf\x28\x33\x05\xad\x89\xf5\x57\x36\x7e\xe1\x00\xab\x72\x53\xbf\x62\x76\xec\x2e\xe4\x93\xd4\x2f\xa0\x4c\x74\xe2\xca\xfd\x4e\x28\xae\x81\x48\x52\x5f\xfb\x92\xd5\x8c\xe2\x90\xff\x71\xb4\x44\xce\xc5\x4d\x46\x97\xfc\x2c\x0b\xca\x47\x3e\xb2\x17\x32\xd7\x0f\x53\x8d\xdf\x5f\xd2\x89\x4e\x88\x2b\xb2\xd8\x72\x97\xc1\x85\xc6\xa9\xab\x34\x9f\x4b\xf0\xd4\xe7\x6b\xab\x35\xc7\x96\x80\x85\xaa\x40\x9b\x19\x16\x31\xab\xc8\xa7\x40\xef\xca\x94\x76\xaa\x7c\x9d\xed\xc1\x39\xbb\x80\x04\x50\x70\x0a\xb5\xeb\x7b\xd7\x9f\xe9\x77\x9c\x6d\xa3\x5e\xce\x9b\xde\xf1\xf8\xf0\xaf\xae\xe6\x98\x60\x7a\xf1\xbd\xd1\x3b\x71\xbc\xa9\x94\x74\x01\xaa\x30\x9b\x29\xbf\x51\x2a\xb2\xfe\x83\x01\xc5\xac\xe0\x12\xa4\xd8\x08\xa3\x7b\x29\x39\x6f\x54\xb5\x5b\x36\x63\x60\xcd\xd5\xd2\xb1\x5a\xa1\x97\x22\x83\x95\x62\xd4\xa1\xe5\xd6\x5c\xe6\xa9\xaf\x19\xb7\xb0\x27\xc6\x87\x20\xca\x17\xce\xea\x61\x54\x26\xe7\x74\xdd\xf5\x65\x58\xf9\x04\x09\x93\x83\xa4\x45\xe5\x59\x96\x29\x2a\x72\xf2\x16\x8e\x10\x3f\xb0\x34\xa8\xa0\x60\x60\x82\xb3\xb3\xb7\xc6\x8d\x86\xfe\xb5\x8d\x0a\x8b\xf5\x26\xa0\xbe\x2f\x6f\x61\xe5\xef\x6f\x75\x24\xcc\xb0\x7a\x18\xfe\xe7\xa8\x0d\x60\x50\x56\x0e\x84\x08\x43\x89\x03\x38\x83\x65\x1f\x7e\x7d\x62\x79\x19\x1b\x7f\xfd\x7e\x90\x3d\x6a\x76\x7c\xc0\xcd\xf5\x46\xc6\xdf\x93\x37\x50\x84\x1e\xc1\x02\x2c\xbb\xfe\x80\xbc\x87\x2f\x8b\x5e\x8d\x99\xc5\x58\xef\xc8\xb3\x8b\xc2\x71\x75\x71\x68\xd9\xf1\x00\x59\x73\x8d\xe6\x4f\x72\x7d\xa0\xc1\x8d\xaa\xbb\x49\x5c\x9a\x3b\xed\x5f\x54\x74\x9d\x9e\x67\xee\xdb\x49\xf5\x57\xa9\xf1\x9a\xa8\xb7\xee\x5b\x7f\x76\xda\x7f\xde\x69\xe6\xa6\x99\x9b\x05\xdf\xfe\x70\x0f\xba\x2c\x50\xde\x75\xdd\xc7\x70\x63\xbb\xf7\xb3\xd4\x39\xc0\xe9\xf8\x4a\x97\xa4\x06\xa3\x90\xd2\x94\x0a\x31\xeb\x76\xd4\x85\x20\xf5\x8c\x4d\xaa\xee\xb4\x4a\x74\x6d\x68\x17\x4d\xdd\x3f\x5a\x50\x48\x23\xf8\x18\xb6\x95\xb0\x89\x88\x60\x41\x19\xa5\x80\xc4\x9e\x74\xd0\xef\xcd\x23\x6c\x46\x98\x04\x91\xa6\xb8\x4b\xed\x2a\x4b\x11\xb1\xd7\x72\xdb\xa0\x47\x7a\x88\xcb\x42\x83\x07\x14\xdd\x84\x02\x5d\x68\xa2\x79\x8c\x0b\x6c\xcc\x49\x9d\xfb\x2f\x66\xa8\x82\x93\xde\x9c\x7c\x52\x17\x16\x77\xa5\x72\xb8\x5f\x16\x93\x9c\xec\x54\x6f\x46\x86\x02\x81\x43\x90\x5b\x6e\x36\xe0\x74\x1d\xb9\x56\x07\x24\x98\xce\x27\xc7\x01\xa2\x7f\xa9\xd2\x12\x29\x18\x9e\x7f\x83\x9d\x18\x10\x1f\x20\xc9\xab\x25\x20\x36\xa2\xc5\x0f\x5d\x4f\xd5\x14\x47\xcd\x89\xb6\x8b\x5e\xa0\x94\x16\x61\xc8\x29\x16\x54\x87\x2f\x9d\x58\xde\x29\xfb\x40\x10\xdb\x65\xc0\x09\x0b\x7a\xc1\x99\x48\x5b\x58\x3d\x02\xd9\x45\x65\xe0\xb9\x1d\x51\xc3\x29\xaf\x27\xd4\xf0\x8e\x8e\x12\x6b\xb1\xd6\x8f\x08\x92\x6a\x2f\x42\x23\xb5\xa3\xef\x3c\xa7\xb0\xe4\x1c\xab\x0c\x94\xd9\x82\xbc\x4a\xf7\x38\xea\xfa\x2b\x9e\xb0\xcd\xdf\xde\x9d\xe5\x6b\x0d\x2b\x22\xf4\x01\x96\xce\x90\xdf\x17\xe8\x6f\xff\x7b\xb1\x2f\x31\x39\xf3\x76\x12\x89\xd4\xc5\x6d\xef\x3e\x3d\x44\x43\x21\x1f\x1a\x2f\x9f\xad\xf6\x41\x95\xb1\x6d\x83\xdc\x53\xa2\x59\x50\xd8\x7b\x66\x73\x1e\xcb\xa7\x02\xe1\xe5\xc6\x22\xd5\xd6\x9c\x2d\xce\xb1\x2b\xf4\xa1\xbc\xa8\xb3\xd6\x9b\x0d\xff\x1a\xa1\x36\x78\xe6\x6e\xc9\x65\x67\xd7\xb3\x65\xa3\x12\x93\x83\x84\x68\x6f\xb9\xfd\x4c\xe1\x1b\xdf\x8c\xd2\xc1\x37\xea\x39\x34\xb2\xed\x6b\x30\xc7\x23\xe0\xc7\x32\x1f\x86\x34\x0b\xff\x4b\x16\x1a\xf5\x76\xa9\xa3\x11\x67\x1d\x6c\x66\x81\x20\x1b\x71\xad\xfe\x14\xf0\xe3\x8c\x9f\x02\xa4\x99\x5d\x57\x04\x9c\x14\x3e\xc7\x63\x16\x3e\xe8\xb3\x95\x31\x8d\x7e\x9a\xd5\xfb\xc2\x01\xcb\x16\xec\xf6\xed\xdb\x69\x85\x0e\xa4\x65\xf0\xc9\x67\x61\x5a\x3d\xd6\xc9\x70\x79\xf4\xfa\x3e\x59\xa6\xd6\x8e\x7b\xc2\x02\xa6\x7f\x7f\xe0\x09\xa4\x97\x67\x8a\xa2\xf5\x46\x5d\x5e\x6b\x31\xca\xef\x58\x90\x62\x58\x07\xa0\xa3\xc0\x66\x5f\x4a\x49\x90\xe4\xfb\x9a\x8d\xd1\x37\x25\xfc\x81\xc1\x18\xa2\x7f\x69\x5f\x6e\x12\x12\x99\x2e\x69\xb3\x47\x82\x86\x7e\x6e\xf5\xeb\x78\x83\x23\x3e\xc7\x40\x36\x2a\xef\xf4\xeb\x32\xb3\xa9\x8b\x2e\x6d\x01\x38\x55\xf1\x1a\x30\x28\xce\xaa\xb4\xfa\x0d\x96\x0b\x9e\xbb\xc0\x52\x96\x66\x97\xa7\x63\xe7\x40\x69\xbb\x6a\x94\xa2\x54\xae\xcd\x52\x1e\x55\xb7\x10\x06\xeb\x6b\xb0\xb7\xe1\x05\x8b\x22\xf5\xae\x9a\xb4\x1a\x66\x23\x07\x09\xf3\x68\x64\x94\x92\x6c\x39\x44\x34\x34\xd6\x2e\x3b\x15\xb4\xec\x7c\x82\x76\xe9\x98\xdc\xa3\x76\x3f\xb0\x24\xdf\x2a\x13\x53\x23\x9f\xa5\x48\x44\x98\xc2\x84\xa0\x9c\x82\x29\x52\x1a\x55\xd5\xb2\x36\x45\x55\x2b\x5a\x0b\x86\xe5\x6c\x71\x2c\x01\xd0\xca\x52\x4a\x65\xb1\x14\x71\xb5\x66\xde\xce\x8a\x57\x2a\x2b\xa6\xab\x58\x85\x83\xb2\x16\x37\x5e\x49\x52\xb4\x2a\x57\x86\x0a\x70\x5f\x74\xc8\xe7\xd7\x75\xe7\xea\xc4\x6a\xa5\xac\x62\x92\xdc\x9c\x2f\x19\x76\xc5\xa8\x43\x45\xc7\x0c\x8b\xff\xf7\x55\x42\x6a\x6b\x85\x40\x48\xde\x98\xb1\x54\xea\xcf\xea\x22\xb9\x1f\x1f\xa3\xfe\xca\x72\x0a\x62\x66\x28\x98\x8e\xf1\x12\x47\xd5\x0c\x13\x56\xa1\x99\x97\xb2\x1c\x9b\xf8\x4a\xa4\xe4\xb9\xb4\x34\x31\xf3\x2a\x46\xc1\xe8\x74\xd5\xd9\x22\x6a\x49\x7f\x01\x13\x5d\x40\xa5\x89\xfb\xa8\x40\x5d\x89\xaa\xc9\x50\xea\x93\x9a\xc7\x3d\xd3\xfe\x49\xc3\x70\xb3\x66\x99\x2a\x44\xf1\xb1\xc9\x66\x01\x98\x64\x50\x26\x73\x6f\x7c\xcf\xe8\x1f\x62\xeb\x1f\x1e\xf0\x26\x85\x6a\x62\x87\xd9\xbf\x4d\x4e\xfb\xae\x1a\xd0\x33\xf9\xb2\xd2\x52\x5b\xca\x77\x84\x48\x42\x36\xc8\x51\x3a\x3e\x7c\x4f\x29\x7c\x63\xf7\xf4\x60\x54\x4d\x59\xde\x10\x7d\xfe\xb1\x82\xca\xc0\xdd\xa6\xf9\xb2\xda\x99\x62\x8c\x7e\x6e\x23\xe9\x2f\x63\x34\xf9\x80\x72\x7a\xb4\xb5\x92\x04\x97\xd1\x7c\xcc\xb2\xce\x4d\x53\xd8\x9a\x46\x97\x08\xe1\x51\xbb\x74\x4d\xb0\x31\x75\xcb\x6e\xeb\xef\xa7\x04\x9b\x2e\x1f\x3d\xac\x0b\x20\x8a\xc7\x29\xfe\x0d\x50\xe0\x93\xc1\x49\x68\x2d\x38\x71\x96\x33\xfd\x4f\x94\xf5\xff\x9d\x32\x63\x5c\x1c\x65\xf7\x3f\x40\xe0\x4a\xf4\x3e\xbd\x81\x5b\xad\xbc\x11\x40\x69\xbe\x16\x66\xd4\x73\xda\x2b\x20\x69\xcb\xd2\x8c\xfc\x5b\x8d\x1c\xd3\x0b\xfe\xc9\xcc\x7b\xbc\xf1\x42\xfc\xc1\x18\x19\x9c\x5d\x80\x06\xdf\xe1\x9d\xa6\x27\x04\xeb\x72\xe9\x2d\x1c\x1b\x07\xb9\x75\xae\x8f\xcf\x0e\x55\x43\x08\xb6\xf4\x57\xac\x3c\x6e\x95\xac\xcc\xb8\xd9\x22\x97\xf3\xc3\x05\x53\xb5\xe2\x51\x1d\x43\xe0\xbe\x60\xfe\x24\xba\x98\x5d\x94\x9f\x7c\x35\x54\x8e\x29\xa0\xec\xfc\x0a\xdc\x0b\xa1\x38\xdb\x14\xe3\x64\x32\x76\xd9\x4c\x70\xb2\xcd\xb6\x5a\x95\xde\xcb\xf5\xdf\x29\x94\x6b\xe9\xe1\x0a\xc5\x7f\x6d\xc1\x0e\xbe\xc9\x92\x77\x23\x7c\x99\xdb\xe9\x52\x28\xc6\x95\xb8\x24\x9b\x10\xcd\xce\x18\x97\xd8\x4b\x71\xf3\x3c\x6c\xc6\x88\xc2\x52\xcd\x60\x93\x05\xff\x79\x9c\x9e\xb0\x0e\xd1\x1f\xca\xef\x65\x35\x59\x7f\x6c\x5f\xa4\xa9\xb9\xf7\x42\x0d\x43\x05\x15\x7e\x9f\xe4\x0a\x51\x95\x29\xd4\x08\xc7\xea\x0c\xa5\x99\x04\x6f\xdd\x3f\x9c\xac\xd9\xce\x45\x1a\x14\x38\x94\xc9\x06\xa9\x6c\x35\x16\x74\x36\x0d\x25\x22\xd3\x2e\x9b\xc1\x79\x54\x52\xa7\x73\x14\xda\xec\x04\xd2\x52\x10\xea\x1f\x9e\x70\xb6\x4f\x61\xc9\x52\x76\x1e\x7e\x4a\x99\xa3\x9b\x93\x17\xc1\xb3\x9c\x3a\x42\x89\x9e\xe8\x0a\xf2\x6c\x79\xe6\xcc\xa9\x52\x41\xeb\x18\xa8\x5d\x82\x50\xf5\x8f\x93\xd4\xc7\xf0\x42\xd5\x0c\xf2\x53\x26\xf6\xab\xdd\xf6\x23\x5d\xbd\x1c\xef\x82\xe6\xf9\x9c\x62\xf4\x48\x5f\xa1\x59\x0c\x14\x6d\xed\xb1\x70\x9f\xaa\xb9\xa9\xa4\xfd\x26\xca\xd9\x05\xd5\xcf\x6f\x2d\x17\x1b\x97\xe6\xaa\xfa\x78\x6e\xe9\xc7\xa6\x49\x18\x1a\x23\xae\x32\x25\x6d\x83\x44\x4c\x6c\x69\x1c\xfc\xd3\xde\xf1\xf1\x59\x69\x83\x21\xfe\xe7\x69\x44\x99\xf5\xa2\x71\x47\x53\x56\xaf\xd8\x75\x2d\x67\xcc\x8c\x13\xd1\xef\x91\x9f\xbd\xee\x52\xf7\xe6\x81\xa6\xcd\x23\xb8\xf4\x17\x3c\xa9\x52\x33\x75\x0f\xfa\x6c\xe2\x20\xed\x76\xf4\x78\xd8\x28\x10\xe4\x51\x6f\x58\x6e\x02\x26\xdb\xd3\x7f\x40\x86\x0a\x76\xb5\xa5\x1e\x43\x64\x87\xd4\x67\x3d\x1a\x78\xd2\x92\xa5\x3f\x25\xb2\x71\x2c\xa8\x65\xd0\x1f\x96\x3f\x07\x37\xd8\xa5\x1c\x09\xda\xd8\x82\x3a\x86\xdd\x05\xde\x29\x9c\x9e\xe2\x0c\xe7\x32\xe4\xe3\xdd\xab\x2e\xcd\xda\x3a\x43\x98\xae\xd2\xb2\xff\xbd\x02\x87\xf0\xa3\x1d\xa6\xbc\xde\xd1\x44\xe0\x75\xc5\xc7\x45\x82\x43\xb9\x8a\x59\x0b\x62\x8f\xe5\xba\xf1\xa2\x81\x22\xbd\xfd\xac\x05\x19\x2d\x5a\x4d\x2d\x05\x9d\xf4\x46\x12\x69\x64\xe4\xf7\x8b\xc2\x60\x02\x57\xb4\xda\xb4\x94\x1b\x61\x4c\x66\x67\x05\x31\x45\x33\xbb\xc7\x37\xc2\x89\x0a\x26\xb9\xd1\xae\xd5\xfd\x88\x4e\x06\x47\xe0\xe2\xf3\x16\x7e\x2b\x1f\x0d\xc4\xd1\x56\x96\xea\x3f\x0f\xef\x7a\x54\x56\x8c\x22\x62\xc8\x04\xd3\x23\xd1\xc5\xfe\xab\x91\xc2\xd5\x8d\xbf\xf1\xbc\xd0\xad\x45\x61\xc8\x09\xcf\x7f\x01\x84\x1a\x06\x0d\x8c\x51\xe7\x70\x90\xc2\xb9\xa3\x97\x81\x5e\xa4\x3f\x52\xfb\x98\x6b\x46\x43\x1f\xe1\x09\x1d\x88\x33\xaf\x18\xcf\xb2\x03\x75\xaa\xc3\x74\xc5\xbd\x97\x1a\xb2\xa6\xb9\x76\x97\x6f\x09\x79\xa6\xa7\xc8\xaa\xf1\xc6\xd3\xa7\xfe\x7c\x65\xcc\xfe\x06\x87\xfb\x83\x84\x45\x8e\x41\x28\xe1\x60\xbe\xc8\xb7\xff\x00\xe3\x4e\xd9\x64\xd4\x2a\xec\x95\xd1\x6c\x8c\xc7\x48\x38\x28\xc5\xe7\x5f\x24\xa5\xa1\x0c\xbd\xa9\xf2\x6c\xc7\x29\xaa\xc8\x32\x5f\xbb\x32\x34\xe3\xb4\xb2\x4c\x91\x33\x2e\xbf\x09\x32\x4e\xaf\xca\x8f\xd3\x8d\x46\x94\x4b\xa4\xe3\x2b\xd3\x3e\x58\xa3\x90\xec\x57\x24\x45\x87\x55\x8c\xf7\x48\x49\xa7\x59\x3b\x9d\x55\x63\xd3\x4e\x61\x97\x50\x46\x51\x4e\xce\x86\x49\xed\xb9\x42\x96\xa0\xdd\x26\xb0\x70\x3b\x04\xab\x2c\x92\xff\x3b\x43\x64\x87\xe8\x0b\xb1\xdc\x60\xe3\xa6\x3b\xb1\x37\x8a\x2f\x2a\xb2\x03\x5b\x06\x5d\x9b\xc3\x8a\x3e\xb4\x5d\xdc\xb6\x70\xf3\x03\x4e\xba\x33\xbc\xb2\x4d\xa6\x50\x82\x96\xba\xeb\x43\xa0\x12\x9b\x90\x77\x7a\xab\xc5\x6a\xc0\xab\xb0\x6a\x52\xe5\x8d\xab\x0f\xfd\x21\x1f\x34\x59\x7b\x18\x00\xae\x56\x5f\x20\xe0\x2d\x9d\x48\xec\x10\xce\x5a\x4e\x83\x7b\xda\x9d\x4e\x51\xf3\x25\xcb\xf0\xdf\xc1\x8b\x0a\xa8\xaa\xb9\xab\x27\xce\x49\x45\xd9\x96\x4d\x67\x37\x56\x3d\x9f\xff\x9e\x4c\x56\x6b\x46\x4d\xa8\x1c\x4a\x52\x38\x1a\xe1\x05\x80\x60\x66\x66\x35\xba\x50\x14\x1c\x5b\xd9\xa1\xed\x8b\x02\xd5\x70\x43\x7a\xa9\x5f\x0d\xaf\x8b\x66\xd4\xb5\xc0\x42\xd2\x32\xb1\xb4\x79\xe3\x99\xca\x46\x41\x02\x3e\xd7\xc2\xe5\xb7\x3e\xfa\x1a\x1e\xc0\xe2\x56\x33\x17\x0a\x8b\xf2\xd3\x39\xd6\x5f\xac\x49\xb4\x70\xf7\xde\xbd\xef\x54\xb6\x3b\x9f\x58\x78\x10\x05\xa8\xfd\x54\x9a\xd6\x47\x6a\xfa\xfa\x07\x88\xc0\xc3\xe3\x62\xaa\xe6\x1a\x53\x3f\x3e\x4f\xa5\x63\x74\x2f\xcc\x0c\x9f\x6b\xb8\xc7\xf0\xf2\xc6\x38\xa7\xb0\x89\x67\xa0\xef\xe5\x94\x11\xec\xaf\x3f\xc8\x3f\xcd\xae\x2d\x5b\x17\x56\xb0\x98\xce\x35\x1d\xbe\xe1\x39\x29\x69\xe0\xf1\xb0\x2f\x36\xf5\x80\x86\x66\xcb\x57\x2b\xdb\xf2\xf7\x65\x69\xf9\x06\x9e\x25\x3c\x36\x6c\x57\xdf\xa5\x90\xd2\x45\xaa\xa9\x58\xdf\x0d\xc3\x2d\x8c\xc3\x52\xba\xfa\x4f\xd5\xef\xa0\xb5\xe7\x45\xfa\x0f\x4b\xd4\x5d\xa7\x1d\xd2\x86\x66\x17\xa9\x63\xb9\x4a\x0c\xbc\xfe\x87\x28\x04\xcd\xe0\x32\x5e\x84\xd9\x20\x39\xb8\x93\x83\x99\x25\xc4\x09\xe7\xd2\x6c\xa3\xd5\x1e\x65\xd9\xea\xff\x8c\x35\xbe\xe6\xf2\x16\xf6\x48\x05\x8e\x3c\xde\x03\xa1\x24\xeb\xc3\x49\x76\x5b\xd5\xad\x61\xa6\xee\xa3\xbc\xed\x2a\xe5\x96\x04\x5c\xdf\xef\x9a\x36\x5e\x3f\xc0\x04\x67\xe6\x1e\x65\x5b\x69\x1f\xae\xe3\xa1\x76\xf2\x21\xfe\x43\x29\x96\x89\x78\xec\x67\x18\xe4\x39\x28\x38\xf8\xb3\x6d\xcb\x8b\x45\x07\xcd\x15\x3b\x45\x35\xaa\x6a\xcb\x72\x1a\xbf\xc5\x70\x29\xe3\xe1\x2b\xd5\xe2\x0c\x95\x32\xed\xab\x5c\x88\x2a\xd2\x0e\xbe\xae\xac\xf1\xd6\xc0\xd0\x11\x8d\x59\xad\x3a\xfa\xf0\xc3\xab\x29\x4c\x70\xe8\x18\xeb\x48\xe5\x20\x74\x1a\x9b\xef\x83\x7b\xea\x26\x02\xed\xd4\xcf\x8b\xeb\xd2\x7b\xec\x00\x1c\xa5\xb1\xdb\xcf\x43\x61\x7c\xcb\xb8\xae\xae\x52\xf5\xd9\x59\xa2\xfa\xc3\xc2\xba\x9f\xb7\x65\x5e\x36\x81\x67\x87\x4d\x98\x95\x84\xf2\xff\x00\xdd\x48\x4d\xf2\x7d\xac\xd1\x29\x28\x59\x34\x00\x98\x1f\xb6\x1e\x11\x47\x0d\xf8\xb4\x7f\xc0\x4b\x27\xec\x8b\xcb\x12\x67\x15\x62\xd9\x41\xd6\xd5\x61\xef\xcb\xf6\xdb\xdf\x5a\x1b\xfe\x5b\x20\xd5\xc2\x31\xd8\x2e\x7f\x28\x0a\x67\x7d\x51\x65\x56\x34\x62\x7a\xd8\xa2\x54\xc3\x60\xca\x5e\x41\xc6\xf8\x4a\xd9\x83\xda\xea\x6a\x56\x4a\x5d\x5d\x2f\x5b\x6e\x18\xee\xff\x7b\x53\x89\xbb\x4b\x47\x5e\x76\x76\xae\x2d\x80\x9d\x2a\xd2\xe2\x26\x06\x2d\x53\x92\xa2\xca\x3d\xf2\x97\x6d\x48\x3c\xb7\xec\x0b\x52\xd4\xdd\x40\x58\xe5\xb0\x1d\x72\xc3\xde\x63\x25\x24\x19\xc4\xec\x45\xd5\xfa\x76\x85\x81\x8b\x60\x17\xab\x12\x50\xd7\xa1\x42\xb1\xb1\xb0\x56\x40\x75\x2c\x2f\x6d\xb0\x5e\x69\x1e\x7c\xb3\x65\x41\x49\x53\x18\xa2\x90\x31\x99\xaa\x07\x61\x2b\x6c\x19\x6e\x31\xe4\xbb\x82\x94\x6b\x95\xdf\x9e\xec\x45\x28\x80\x0b\x2f\xfd\x95\xb5\x65\x52\xae\x35\x8b\xb9\xf9\x67\xaa\x2e\x73\x5f\x55\xfa\x02\x43\x3a\xf5\x1a\x60\xfe\x05\x1a\xdb\x9b\xc9\x7a\xfb\x46\x60\x75\xd0\xf6\x9d\x75\x8d\xa7\x73\x9d\x8f\x10\x9d\x40\xf9\xeb\xfa\x95\xb1\xcc\x16\x07\xac\xbd\xce\xe4\x15\xbd\xbe\x87\x06\xc1\xf5\x85\x52\x4f\xb5\xaf\x76\x8f\xa8\x78\xa7\xf8\xec\x04\x4e\x73\x55\x26\x56\x6a\x5f\x39\x3f\x5d\xfc\x36\xbd\x1b\x9f\xcb\x67\x96\xa7\xfb\x12\x7d\x9c\x32\xe8\xb1\xc2\xea\x4e\x32\xbe\x96\xf1\x99\xa7\x84\xef\x70\xa9\xce\x0a\x18\x09\x53\x3c\x2b\xb6\x80\x76\x39\xd2\x46\xcc\xb3\xc5\x56\xda\xff\x4c\xc4\x39\xab\x94\x1d\x27\xfb\x3a\x8f\xbd\xca\x5c\xb8\xe6\xec\xa6\xd3\x96\x12\x26\x2a\xde\x09\xf2\x28\x8f\xbb\x6a\x7e\x34\xc3\x5f\x4e\x95\x08\xf6\xd9\x62\x3d\xcf\xb0\x8f\x77\x91\x04\xef\x93\x6a\x77\x3f\x97\x22\xc8\x90\xda\xfc\xcf\xff\xee\x74\xfe\x9e\xc1\x25\x9e\x62\x37\x55\x06\x69\xb7\x88\xf1\x10\xac\x69\x6e\xc4\x45\x4b\x9b\xca\xea\x31\x3a\xfb\xf9\x5e\xbe\x25\x9e\x45\x53\xef\xd9\x53\xf0\xa7\xee\x4a\xdb\xe2\xc8\x0f\xf0\xa5\x26\x8e\xf6\xbf\x49\x91\x83\xdb\xcb\xd1\x1f\x3c\x6b\xa0\x72\xc4\x2d\x92\x3d\x5c\x90\xbe\x32\xec\x09\x92\xeb\x51\xf4\x75\x4d\x72\x45\xeb\x77\xbe\x29\x18\xba\xf9\xcf\x66\xb5\x94\xba\x17\x60\x39\x54\x51\x23\x0a\xa6\x74\x39\x07\xae\xb2\x85\x37\x7d\xb6\xec\x35\xc2\xeb\x7a\x11\x15\x76\xac\x62\x63\x54\xab\xc3\xf4\x69\x7b\xf5\xea\x1f\x4c\x77\xe4\x00\x09\x2c\x2a\x3e\x4f\xd0\xaa\x3d\x2e\x9b\x05\x49\xb3\x91\x24\xe1\x76\x53\x19\x46\x79\x09\xd1\xb9\x9d\x00\x55\xa4\xda\x62\xa5\x9f\xec\x94\xad\x13\xcb\xc6\x28\xa0\x0d\xdd\x1c\xf3\x11\xf5\xe9\x32\x24\xdd\x37\xdd\x0d\x6c\xb1\xa2\xe1\xed\x50\xb6\xd2\x8f\x7e\x14\x89\x76\x93\xfb\xb5\x43\x4d\x01\x8c\x56\x0b\x39\x1e\xcc\x22\x6b\x0f\x99\xa5\x2d\xef\xce\x11\x30\x02\x8e\x4c\x10\x68\xf3\xa9\x6a\xb7\x5c\x90\x0f\xf5\x26\x08\x8e\xa9\xf6\x2c\x1b\x00\x27\x98\xd9\x41\x50\xb5\xea\x69\xf6\xc3\xbd\x6c\x8b\xcd\xc4\xc5\xde\x77\x15\xe7\x02\x60\x95\x8a\x5b\x1a\xcb\xeb\xe9\x7d\xfd\x8c\xf7\xe0\x4e\xdc\x23\x07\x1b\x01\x81\xf7\xd3\x05\x71\xb5\xde\xbd\xa7\xb2\xff\xe0\x3c\x56\x2a\xd8\x0b\xaf\xc2\xc1\xad\xba\x6b\xeb\xcf\xda\xac\x22\x49\xf0\xe4\xbc\x4d\xad\x64\x04\x0a\xf6\x1b\x3c\x1e\x84\x54\xc2\x03\x5d\x77\xef\xab\x6e\x20\xcb\x73\x9d\x2c\x08\x54\x70\x27\xf2\x84\xac\xaf\xb4\xdc\xab\x7c\xf5\x5f\xb6\x6a\x20\x70\xbf\x5d\x32\x13\x0d\x0d\x92\x2d\xca\xe6\x00\x42\xcb\xa4\x14\x05\x26\x7e\x04\xd7\xbc\x12\x4a\xbe\x97\xc0\x2d\xcb\x10\x53\x9a\x8b\xc9\x2c\xe1\x12\x34\x95\x6f\x9b\xa6\x64\xda\xb9\x08\xa3\x1c\x5f\xe7\x64\xc3\xc1\x9d\xfb\x82\x1a\x5c\xb2\x47\x01\x0c\x51\x95\xf3\x0f\x41\xbd\x85\xfa\xb5\x9a\xba\x6c\x87\x3c\x29\x19\x50\x38\xe6\x8a\xb6\x5c\xc7\x2a\x62\xb1\x02\x04\x03\x57\x5b\x2a\xab\x28\x97\xc8\x42\x59\x46\x15\xb9\xf7\xfe\x7a\x8d\xb2\xc0\xff\x69\x00\x87\x5c\x43\xad\x76\xe1\x10\x9c\xfa\xe9\x30\x5f\xb1\xe4\xfa\x53\xa8\xe1\xb9\x4d\xaa\x6f\xa7\x55\xda\xb3\xd6\xe5\xdd\xf6\x69\x64\x10\x5d\x5e\x15\x24\x69\xfe\x0d\x32\xa0\xff\xb1\xbb\x02\xfd\xc8\x5a\x2b\x62\xf3\x46\x4a\x71\xb5\x5c\xe9\x20\x6d\xc0\xa9\xe7\xea\x5c\xee\x0c\x7d\x19\x07\x51\xe5\xe5\xe5\x65\x91\xaa\x94\x97\x31\xc4\x67\xaa\x78\xeb\xe1\xfe\x8d\xbc\xc7\x2b\x0e\x4b\x46\x70\x8c\xe6\x5c\x31\x58\x18\xc6\x7c\x15\xca\xa5\xc6\x0b\x25\x78\x3b\x55\xaf\xc4\x71\xf3\xe7\x78\x9c\x11\x6b\xdd\x3e\xd4\x87\x2c\x17\xca\x2b\x4d\x9b\x90\xd5\x5e\x31\x13\x69\xd5\x61\xa9\xb3\xb0\xa0\xfe\x8b\x62\x17\xc5\x68\x8e\x22\x16\x65\xea\xe0\xaf\x0f\x29\x43\x0f\xbb\x60\x32\xac\xc5\x58\xeb\x96\x7d\x97\x56\x2a\x0e\x81\xad\xaa\xfe\xe3\x85\xad\x52\x32\xaa\x55\x15\x65\x4d\xd9\x78\xc9\xab\x66\xfa\x49\x8b\x00\x98\xe6\x6c\x82\x01\x24\x2b\x0d\x95\xb2\x58\x9e\x45\x20\x1e\xe7\xb0\x13\x21\x99\xb8\xaa\x36\xcb\xa2\x91\x35\x30\x7d\x38\x08\xc5\x9d\x63\x1b\x49\x73\x35\x8a\xdb\x2a\x86\xb9\xe9\xc7\x1f\x3f\x4c\xc4\xc0\x26\x75\xa4\x1b\xf9\xce\xa4\x2b\xbc\x14\xae\xac\x21\x4b\xbd\xba\x96\x35\x93\x55\xde\x11\x7e\xde\xbb\x8e\x84\x21\x94\xdd\xc2\xac\x3b\x1e\x36\x5c\x48\x7b\x2b\x52\xfd\x4d\x60\xae\xcc\x20\x05\xc6\x96\x1d\x09\xb8\x22\xa2\x19\xc3\x88\x19\xb7\x8a\x63\x81\x64\xd5\xc7\xdc\x46\xc0\x0c\x5c\x05\xab\x53\x28\x19\x6e\xd9\xe8\x2e\xf9\x7e\xa4\xa9\x7c\x1c\xfe\x93\xa3\xbe\xed\x34\xba\x20\x45\xfe\x55\x2d\x42\x63\x1a\x2e\xd7\x81\x5c\x1e\x9b\xdd\xe9\xa8\xa5\xf2\x71\x95\x96\x52\x22\xd3\x26\xf1\x3f\x8c\x90\xbd\xc8\xef\xe2\x93\x5d\x7f\x7c\x42\xfa\x86\x0c\x75\xd5\xab\x9f\xa5\x7b\x70\xe3\x40\xff\xf6\xd8\x45\x61\xa2\xdc\xcb\x4b\xe3\xd7\x79\x8f\xb1\x1d\x78\x3f\x04\xfb\x22\xf7\xc6\x8e\xb5\x6f\x4a\xc8\xb8\xe7\x29\xe5\xd3\xf1\xe7\x82\x76\xb2\xc4\x97\xee\xee\xc6\xa2\x5f\x60\x5b\x39\x96\xb1\xa9\x5b\x6c\x86\x3c\xbb\x9e\x1d\x9c\x3c\x63\xd7\x9b\x5b\x05\x72\x75\x50\xca\x5a\x50\xd7\xf6\x60\xad\x9c\x4b\xdd\x01\x62\x23\x56\xce\xa6\xfd\x76\x99\x49\x46\xed\xaa\x99\x29\x68\xc4\x30\x6a\xc2\x08\x95\x96\x57\xc3\xe3\xc3\x4d\xd9\x71\x79\xc9\x94\x2a\x72\x25\xb6\xdc\xeb\x60\xb1\xf5\xf7\x81\x98\x3c\xac\x7e\xba\xdf\x49\xd0\x44\x6e\x86\x6a\xac\x93\x6c\xb6\xd3\xd7\xec\x09\x9e\x75\xb8\xcd\xa3\xe0\xd7\xae\x11\x88\x3b\x86\xb1\x4d\xa9\x67\x75\x63\xa3\x2d\xb2\xa2\x20\x11\x27\x1a\x8b\x33\x5b\x34\x5f\x39\x54\xea\x4c\x04\x89\xd8\x24\xf5\xa3\xef\xe3\xf4\x3f\xc0\x92\xe3\x7d\xe4\x06\xb3\x6e\xfa\x48\x37\xe4\x92\xf7\x03\xbf\x7d\xe3\x8d\x6f\xb3\x51\xe9\xa7\x19\x3d\xc8\xfd\x0d\xa1\x1c\x47\x27\xc8\x28\x35\x85\x58\x51\x3b\x39\x64\x94\x32\xe1\x0f\x34\xb7\xb2\x89\x97\xfe\x3f\x77\xf8\xa0\x45\xf5\x7f\x63\xc5\x5d\x56\x66\x95\xd9\x65\xaa\x08\x84\x17\x06\x01\xc6\x4b\x0f\xe4\x08\x06\xe7\x18\xdd\x01\x39\x4d\x1e\xfd\x3d\x3c\x63\xca\x46\x71\x7f\x86\x54\x55\x85\x23\x84\xb4\x49\xfe\x96\xe8\xde\x84\x70\x96\x2e\x3d\x1e\x67\x27\x98\x97\x2b\x67\x44\x9b\xf5\x88\xe2\x5a\xb5\x3e\xb6\xfe\x82\xb5\x4b\x45\x7d\x11\x86\xdd\xcb\xd9\xe7\x51\x69\x1a\xe0\x1e\x4d\xab\xf0\xdc\x49\x7e\xc1\xbb\x9c\x64\x11\x5c\x1f\x9f\x67\x0c\xf4\x09\x9a\x55\x31\x7f\x47\xee\x85\x19\x71\xb9\xf7\x7d\x3c\x0e\x70\x81\x40\xe0\xd3\x31\x30\x0e\x34\x71\x55\x2d\xdc\x18\xb3\xb6\xe0\x65\x34\x35\x55\x64\xcf\x07\x0d\x63\x77\x46\x86\x8b\xbc\x8c\x1e\x4e\x18\x73\x52\xc2\x1a\x6a\x56\xf5\x60\x09\x23\x2f\xab\x32\x9d\xca\x7e\x40\x81\x43\xb8\x6c\x6e\xc2\x92\x3b\x15\x19\x28\xb9\xcb\x59\x9c\x5d\x74\xdf\xfb\x27\xe1\x6d\xbe\xe1\x90\xc8\x6d\x88\xcc\xbe\x85\x5d\x0f\x47\x39\x7c\x4a\xca\xc8\xa4\x39\xca\x58\xed\xd3\x1f\xd1\x1b\xe5\x07\xeb\xa2\x06\x4f\x2e\x9c\x0f\x47\x50\xa0\x14\x2f\xa5\x75\xa5\x3d\x53\xc9\xfc\xe5\xf7\x53\x33\x96\x15\xce\xaf\x90\x45\xda\xf6\xf3\x76\x3d\x8f\x2f\x6e\xf3\xd3\xb1\xf9\xa0\x33\xeb\xef\xf7\xf2\xb4\x68\xf4\xe3\xab\x28\x57\x65\x3d\x42\x27\x5a\xa5\x36\x64\x0f\xca\xcb\x8c\x28\xcd\xc5\x9f\x19\xf3\xfb\xe2\x2a\x9c\xe9\x00\x29\x44\x18\x5b\xaa\x99\x99\x9e\xcd\x24\x65\x08\x25\x2b\xba\x69\x66\x5c\xac\xa7\x95\xa7\xb0\x0d\x5d\xda\xa8\x9d\xb3\xce\x68\x85\xf0\xc7\x03\xea\xf5\x85\x70\xcd\xb1\x7f\xbb\xe6\x5e\xdd\x5b\x5d\xd1\xfa\xc0\x8f\xb3\xf3\x14\x5e\x29\x03\xd5\x1f\x10\x03\xa0\x57\x99\xe8\x1f\xc0\x20\x80\xb2\x33\xe4\xbf\xd1\x1f\xe7\x14\x1e\xff\x07\xa9\xf8\x86\xa4\x37\xaa\xa4\x83\x3a\x4d\x63\xf7\x9a\x26\xe0\xe8\x01\x61\xdd\x7a\x78\xa4\x39\xc9\xd4\x66\x85\x07\xb1\x8d\xff\x71\x41\x5b\x54\xbb\xd9\xbf\x92\x11\x01\xf6\x59\x5d\x6d\x38\xbb\xc6\x36\x1b\xf3\xeb\x5f\x9f\x6c\xa0\x8f\xa3\x32\x15\xb2\xce\x0d\xc1\x58\x46\xb6\x86\x56\xf6\xf2\x55\x71\xc7\x98\x61\xdf\xb8\x54\x21\x6e\xd9\x2c\xc9\xb4\x74\x8d\xce\x30\x62\x64\x28\xe9\x05\xc0\xbd\xbb\x11\x60\x73\x79\xf5\x0a\xc8\x41\xc1\xd5\xfe\xe1\x11\x24\x04\x5b\xed\x18\x74\x2e\x6e\x3d\x94\x70\xb7\xfc\x68\x1e\x70\xc6\x35\x1f\x74\x21\x89\x4b\xc0\xb9\x6c\xe1\x16\x6d\xb3\xe6\x37\x57\xe2\xf9\x74\x70\xe7\x69\x44\xbc\xfa\xa5\x03\x2b\x0f\x98\x9c\xbd\x5a\x33\xa2\x29\xb7\x95\xf8\x37\x37\xc1\x8e\x4e\x35\x7c\x00\xe3\x7e\x31\x6d\xba\xac\xb5\xbd\x74\xe3\x73\x99\x65\xd4\x71\x68\xcb\xd9\x23\xd6\xe1\x1c\xf6\x4c\x88\x03\x0d\xca\xc1\x0c\x23\xc1\xa4\xd7\x4f\x7f\x56\xe6\x9e\xbb\x49\xd3\xd0\x44\x37\xd5\x22\x69\x7f\x98\x69\xbd\x9c\xa8\xc9\x20\xb1\xd1\xf1\x23\x0f\x49\x06\xa8\x9f\x5d\x51\x31\xec\x22\x70\xcf\xb6\x84\xb5\xeb\x34\x3e\x83\x03\x8d\xb9\xef\xdd\xdb\xd7\xd6\xc4\x6a\xfe\xa1\x7f\xb9\x51\x3e\xf5\x87\xbb\x88\x53\x6f\x1f\xd6\x52\x3c\xb9\x89\xf0\x59\x7e\x35\xe8\x92\x14\xbf\x98\x1b\xf8\xcf\x07\x19\xb7\x4c\xc4\x7c\xab\x4f\xe6\x24\x70\x20\x32\xf5\xd8\x2d\x97\xeb\xc3\xb3\x17\x49\xe9\x09\x83\x05\xec\x11\x7f\x54\xd3\x00\x77\x17\xbb\xba\x6f\xcc\xa9\xde\x53\x63\xbe\xe6\x18\x1d\x86\x2d\xfd\x0f\xb3\xc3\x98\xf9\x61\xc7\xb2\x53\x55\x23\x61\x29\xf5\xd8\x52\xb5\xeb\x68\x62\xec\xb5\x89\x01\x57\x63\x05\x6e\x21\xc4\xb1\xad\xac\xec\xb2\x38\x74\xe9\x2b\x3a\x61\x53\x22\x92\xbb\x15\x7b\xe8\x2b\x31\x9c\xbf\x3b\x1f\x58\xe2\xf4\x12\xb5\x9d\xf1\xf3\x85\xe1\x53\x42\x1c\x50\x3f\x1d\x79\xe2\x5f\x57\x80\xae\xb5\xc5\xe1\x06\x55\xdd\xa1\xa6\xaf\x7f\x63\x5e\xcf\x48\x36\x4d\x9a\xea\xc7\x59\xc1\x44\x1c\x4f\x64\x46\xf8\x1f\xff\xc7\xd9\x70\xfc\x37\xd2\xbd\xa9\xd4\x71\x6a\x86\x9c\xfa\x87\x1e\x20\xef\x4a\x14\x43\xd5\x8c\x62\x8b\xd0\x08\x71\x7b\x64\xf2\x72\x4f\x37\xf1\x63\xcb\xee\x7f\xc0\x38\x56\x29\x2c\x0f\xa5\x82\x3e\xd8\xcb\x60\x59\x8f\xe1\x68\xf9\xf6\xf0\x99\x97\x52\xcc\x9f\x56\x14\xbf\xa7\xa0\x82\xc3\x1f\xd6\x12\x5f\x8e\x39\xd8\xa4\xf5\x55\x9f\x6f\x18\x37\x79\x4c\x0c\x68\x4a\x08\xf5\x47\x08\xf6\x43\x7b\xf2\x21\x12\xdc\xcb\xc0\x66\xd4\x64\x35\xf1\x76\x52\x8e\xdb\x1d\x9b\x52\x26\x28\x6c\x16\x6e\xdd\xc1\x47\x37\xde\x4f\xce\xb8\xe1\xfd\x9a\x0c\x0f\x8b\xa9\xe8\x80\x94\x13\x95\x75\x28\x52\xc6\xe4\x23\x7e\xef\xcb\x95\xeb\x5e\xdd\x5d\xc1\x8d\xee\x8d\x1c\x91\xd5\x80\x74\x28\xab\x86\x9f\xf5\xf6\x4b\x2b\x2c\x21\x55\x39\xd0\x59\x02\x87\xd9\x9b\xfa\x1f\xff\x4a\x65\xc5\xbf\x71\x7f\xcc\x36\xc5\xbe\x6b\x55\xd5\xc1\xd3\x0a\x88\xb2\x77\xab\x4b\x69\xef\x1b\x71\x7a\x22\xdd\x10\x12\xea\xc1\xec\x53\x74\x3e\xd0\xe3\xa4\x59\xed\x3c\x8f\xbc\x41\x2f\x53\x0e\xb7\x73\x93\xcd\xaa\xa2\xc9\x97\x5c\x81\x20\x27\xe3\xb2\xd5\x29\x32\x9d\xcd\x04\x20\xd7\xb8\x75\x52\x61\x57\x1b\x91\x5d\x6e\x4f\xca\xe5\x02\x12\xcf\xbe\xd0\x28\x43\x36\xb6\xbf\x87\x3c\x01\x22\xe4\xf1\x19\xe0\x3f\x6d\x26\x0f\x2b\x90\xa5\x90\xbe\xb9\x25\x02\xab\xdc\xe8\x88\xac\x53\xb6\x77\x95\x86\x36\xac\x7d\x8d\x29\x98\x01\x6d\xa4\x53\x4a\xa0\xec\xe1\x7a\xc5\xc2\xf2\x93\x77\x97\xbb\x60\x19\x4e\x02\x19\xe8\x46\xe5\x36\xca\x5d\x5e\x59\xfd\xbd\x0d\x0f\x2a\x37\x46\xc4\x1c\x17\x28\xd3\x6e\x17\x69\xde\xe9\xb1\x1a\x22\x71\x2f\xee\xde\x9c\x1f\x63\xaf\xa8\x4b\xfe\x46\x57\xa8\xa0\x52\xfb\x0e\x12\x81\xb5\x4c\xe0\x88\x18\x77\x45\xec\xdd\x77\xc8\x13\x7a\x16\xc9\x30\x7d\x13\x7e\xb7\x53\xd6\xcd\x68\xe8\xb1\x9d\xc2\x2d\x90\x90\xbc\xae\xbd\x72\x0a\xcc\xc6\xe3\xc9\xfe\x76\x67\x42\xbb\x96\x72\x6b\x56\x35\x8c\xd3\xd5\x1e\xe9\x81\x86\x98\xdc\x81\xee\x45\x30\x11\x5b\x85\x8d\xea\x6e\x03\xef\xaf\xc0\xd9\x6b\x32\x5b\x59\x6c\xd0\x60\x51\x0b\x03\x58\x86\x43\x25\xca\x9b\x66\x9f\xa1\x6c\xc4\x84\xa8\xa3\x9d\xe8\xd6\xc0\xa5\x42\xde\xce\x49\x19\x12\xdb\x68\xdc\x7d\xdc\x65\xa5\x0b\x78\x53\xf7\x80\x5f\xea\x10\xda\x1a\xdf\x5a\x46\x9d\xb6\x9d\x7c\xb7\x4d\xd0\x17\x1a\xf7\xb4\x9b\x9e\x20\x87\xe8\xe3\xd3\x29\x7a\x7a\x1f\xf5\x7f\xd3\x3f\xca\xab\x8a\x64\xfe\xf0\xf6\x12\xde\x6b\xd1\xb9\x00\xf5\x51\xe7\x37\x74\xce\x63\xc4\xc1\xa1\xa0\x35\xff\x7c\x12\xb7\x9d\x72\xcf\x58\x61\xa3\xff\x71\x13\x27\xdd\x01\x11\xa5\x88\x8a\x78\x8a\x43\x56\x52\xf0\xc3\x0f\xd6\x39\x4e\xf5\xda\x4c\x2a\x13\xcf\xaa\x26\xc4\x06\xeb\x75\xb6\x15\x96\x0f\xf6\x37\x1c\xe5\x1a\x1e\xab\xc4\x8a\x28\x07\xe1\x5d\xc4\xd3\xce\x5b\xa6\xb2\x7d\x5b\xfe\x6c\xb8\x7b\xc7\xf9\x8a\x8f\xc8\x83\x3b\x98\xe5\xce\xa4\xb8\xc3\x44\x2f\x78\xea\xdd\x26\x3b\x85\xff\xf8\x97\xa7\xb2\xdb\x82\x82\x96\x97\x85\x1b\x32\xc0\xe4\x4d\x0c\xfd\x94\x5f\x11\xff\x3c\x5a\x18\xa4\x9b\x63\xc5\x30\xf6\x4e\x6f\xc8\xf7\x63\x74\x5f\x99\x01\xb8\x96\x19\xbc\x41\x97\xe3\x59\xcf\x38\x8b\x8e\xa7\xf4\x1b\x65\xa3\x50\x69\x40\xef\x01\xc2\x8b\x73\xf6\xca\xb3\x97\xd1\x17\x04\x91\xb3\x2a\x41\xb0\x64\x6f\x8c\xc7\x65\xd3\x02\x0a\xaa\xaf\x70\x8b\x57\x6a\xed\x76\x70\x35\xd0\x4e\x2d\x74\x88\xb0\x53\x13\x82\x9a\xcc\xe8\x48\xc8\x5a\xdf\x63\xd8\x5e\x99\x4e\xfe\x14\xc2\x78\x2e\x3f\x92\x54\x95\x7a\xa2\xce\x2b\x84\xeb\xcb\x92\x11\x47\xa4\x2f\x54\x97\x73\x10\x1d\x35\x65\xf0\x68\x98\x84\x38\x1f\x9f\x40\x24\x8e\xf7\x88\x9d\x14\x1b\x1b\xec\xdf\x1d\x04\x51\x6f\x96\x53\xf7\x12\x56\xa7\xd9\xcd\x52\x0c\xfb\x08\xd6\x68\x05\x3d\x1e\xd2\xf3\x1d\x59\xb2\x5e\x7a\xec\xf2\xb1\x65\x97\x70\x3e\x0f\x0a\xa0\x1f\xef\x20\x10\x70\x33\xdf\xc8\x1d\xf3\x78\x28\x5e\xe3\x11\xb6\x4e\x65\x34\x47\x90\x1e\x26\x2d\x07\xf5\x21\x60\x07\x75\x0a\xc7\xc1\x6a\x2e\xa3\xe4\x87\x3e\xfb\x28\x0d\xf6\x0f\x55\x2c\xf2\xc9\xfd\xcc\x20\x8e\x8a\x8c\x6e\xfb\x5a\x58\x66\x55\x26\x80\xed\xb3\xf8\x3c\x5b\xe1\x9e\xe1\x7b\x75\x29\x1c\xe8\xa7\xe5\x80\xbe\x74\x9c\x66\x4a\xa2\xdd\x30\x79\xfb\x8a\xf1\xf0\x08\x5e\x80\x12\x01\xd0\x85\xe0\xfa\x05\x63\x46\x3e\x19\xfd\x87\xd9\x6f\x63\xcd\x4f\x61\x4e\xe0\x08\xd4\x93\x83\x17\x65\x8d\xcb\x2a\x47\x4a\xc9\x5b\x83\x42\x40\xc0\x5f\xad\x8a\x35\xc5\xbe\x80\x84\x02\xfc\x18\xa4\xd4\xcf\x95\x51\xb2\x4f\x0e\x01\x9c\x92\x0f\xeb\x5f\x9e\x61\xd3\x52\x96\x78\xa7\x7e\xf4\xb2\x07\x7b\x26\x9b\xf2\x62\xab\x57\xce\x45\xb6\x29\x1e\x5b\x9d\x96\x20\xa5\x36\xb9\x1d\x46\x5b\xa7\x9d\xb5\x44\xfb\x80\xf5\xe6\x54\x1f\x58\x4a\xd1\x60\x07\xc8\x58\x5c\x1f\xaa\x9c\x99\x77\xed\x92\xb9\xd7\x90\xec\x3d\xbc\xb8\x5a\xf7\x2e\x36\xba\x14\x55\xff\x2d\x39\x9b\x3b\xfb\xf3\x7e\x99\x93\xc1\x6d\x28\x14\xda\x8f\xde\x52\x70\xf5\x2e\x22\x34\x50\x96\x5b\xee\x5e\x38\x62\x25\x89\x54\x4f\xe9\x9c\xfb\x17\xda\xba\x6c\xb2\x1f\x2b\x53\x58\x57\x6a\xc4\xf6\xb1\xf4\x96\xc1\x6f\xf6\xf0\xdd\x1e\x9f\xb0\xe2\x7a\xf4\x91\xcf\x47\x2b\x2e\x35\x0e\xa8\x47\x31\x66\xff\x32\xe0\x6f\xe6\x9c\xc6\xc6\xca\x30\x9a\xc6\x2f\x62\x81\x48\x07\x1c\xcf\xc2\x6c\x18\xc0\x0c\x17\xcc\xe0\x0a\x84\x11\x68\x29\x66\x4a\xcd\x5a\x05\xd4\x34\x58\xb9\x38\x04\x7e\xc8\x28\x01\x29\x48\xf8\xd1\x02\x19\x2c\x75\x06\x05\xdf\x6f\x8d\x3d\x10\x07\xa8\x44\xb3\xb7\x8c\xaa\x5d\x6d\x19\xf7\x7d\xf5\x46\x46\x42\x8a\x86\x72\xd4\xf0\x98\xae\x61\xee\x89\xac\x96\xf6\xfe\xef\x9c\x53\x68\xb5\x43\x1b\x0d\xba\x41\xb5\x6c\xd0\x91\xd9\xf8\xec\xdf\xc4\xa3\xfa\x9f\x13\xf6\x2c\xee\x6e\xb4\xd5\xf6\x6a\xcd\xef\xb7\x2c\xbe\xf2\x45\xa1\x58\x61\xca\xaa\x57\xe1\x48\x4d\x0e\xb5\x25\x5e\xce\x72\x45\x8f\x4b\x1d\x33\x8c\x3c\xf1\xac\xa0\xb6\x3a\x83\x50\x8c\x7c\x4d\xe1\xeb\x63\xea\x19\xcd\xb5\xf6\xdb\x3d\x68\x20\xf0\xac\xc1\x87\xe6\xf0\x89\x72\x9b\xcb\x76\xfe\x15\x1d\x04\x14\x7b\xb6\x0c\xce\x43\x6e\x50\x65\x50\x77\x1c\x59\xdc\x23\xb5\x25\xd6\xa4\xfa\x31\xe7\x2c\x1d\x55\x06\x9c\xcc\xb2\x26\x5b\xb4\x92\xff\x1d\x59\x78\xe9\x72\x6e\x26\x30\x2d\xe8\x23\xcd\xf2\x39\x44\x00\x2f\xd9\x7e\x18\x57\xee\xeb\x52\x36\xd0\x6a\x5d\xce\x5c\x6a\xdc\x19\x20\x23\x54\x96\x5b\x75\xb7\x33\xe7\x41\x4a\xec\xb2\xa1\xdc\x47\xf5\x07\x76\x18\xea\x24\x99\xb1\xcf\xf4\x5a\xdd\x9c\x7d\x3d\xb2\xcc\x9e\xc5\x78\xe6\xae\x82\x51\xd0\x35\xb5\xa5\xb3\xb4\xba\x47\x08\x90\xd8\x0c\xe0\x5f\x79\x87\x8f\x26\xc3\xc3\x25\xa6\x1d\x99\x93\xba\x0b\xdb\x80\x94\x83\x68\x25\x40\x8d\x7d\xf1\x28\x50\x1f\x02\x3f\x3e\x74\xd0\xf5\x53\x93\x4e\xb1\x19\x96\xb2\x5d\xf7\xde\x61\x06\x9b\x92\xb7\x53\x88\x48\x4d\x90\xd0\x87\x82\xb0\xda\xeb\x00\xc6\xc8\xd2\x32\xe7\xa1\xec\xda\x62\x8b\x04\xc5\x87\x9a\x05\x7c\x0b\x9f\xc9\x32\x6f\x25\x98\xd0\xe0\xf7\x90\xa0\x7b\xa5\x1b\xb8\x16\x09\xb9\xa8\x90\xb8\x5f\xb6\x4e\xb4\x61\x7e\xe6\x9f\xd1\xdd\x06\x19\xa8\x3e\x7b\x97\x82\xcf\xb2\xb7\xd2\xfc\x23\x93\x30\x6f\x3f\x7f\xfa\x32\xeb\x94\xe5\x8b\x7c\x86\x7d\x4b\xbd\x5c\x87\xa0\x85\xb8\x49\xbf\xcd\xb9\xe4\x6a\x20\x2c\xb5\xa2\xb7\x6d\xa6\xfa\x02\x07\x64\xff\xd3\x1e\xe3\x52\x8a\x92\x9e\x7f\x53\xc4\xe2\x76\x56\x5b\x11\x26\x2e\x56\x2a\x39\x9c\xc7\xc0\x05\xd7\xab\x5f\x1c\x47\xe2\x9b\x67\x3c\x06\x30\xf1\x74\xb5\x2b\x08\xb7\xd8\x65\x0c\x1d\xcb\xdb\x77\x68\xf8\xe5\x15\x7d\x11\xa8\x6b\x70\x38\xc6\xdd\x3f\x36\x02\x10\xc1\x78\x23\x7d\x02\xd9\xe1\xe5\x45\x9f\x3a\x22\x7b\xe2\x54\x90\xa4\x5c\xa4\x55\xd1\x3f\xf2\x1c\xf0\x12\xd8\xba\x9e\xa9\x1f\xf6\x3d\x78\x84\xaa\xf0\xe1\x7e\xe6\xc3\x04\xb8\xc7\xf8\x13\xed\x69\xe8\xcf\xdd\x53\x58\x0d\x11\xc0\xbd\x4c\xbe\x08\x28\x45\xa2\xe1\xb0\x1d\x72\x26\xdb\xf7\xc8\xad\x59\xba\xf6\xe4\xa6\x08\x0a\x01\x9e\x1f\x1c\x77\x2c\x6e\xd5\x6b\xb0\xf1\xc7\x70\x7e\xec\xfe\x39\x9c\x4e\x6e\x2a\xd7\xd9\xaa\x1b\x51\x29\xce\xb0\xa1\x1d\x36\xbb\x76\x0f\x30\xed\xb0\xa5\x19\x7a\xcd\xc7\x65\xc7\x38\x6c\xf2\xb0\x82\xa0\x3d\xd9\xe1\x2c\x67\x87\xe4\x4c\xc1\x12\x1a\xa4\x2d\x18\xe4\xe3\x3c\x84\x2b\xcc\x90\x42\x56\x81\xf3\xe1\x57\x53\xc0\x90\xba\x41\x7d\xc8\x72\xbd\x74\xf6\x9b\xe1\x21\xd6\xbf\x8b\xc3\x7d\xdf\xf2\xe5\x3f\x75\xdf\x54\x86\xdd\xc1\x54\x60\xeb\x62\x83\xb6\x45\xbd\x0d\x34\x87\x75\xb5\x7d\x25\x4d\x40\xcd\x30\xe5\xec\x9c\x75\x1b\x3d\x52\x7b\x22\x4f\xb4\x71\xab\x57\xba\xac\xb4\x2d\x67\xb8\x5c\xd0\xa4\x72\xc0\x08\x53\x11\x9b\x1c\x23\x92\x0a\xf5\x4a\x50\x6c\x3b\x20\xf1\x0e\x1b\xaa\xea\xf3\x0a\xfb\xec\xa0\x92\x5c\x91\x98\xd5\x37\xf5\x5e\x36\xe3\x62\x81\x40\x06\x61\x6d\x3c\x7a\x04\xea\x95\xa0\x1d\xaa\x59\xba\x7f\x05\xeb\x02\x76\x94\x5c\x72\x7a\xd1\x6a\xfa\xe5\xef\xa3\xaa\x96\xfd\x0e\x4b\xed\xb1\x51\x7a\x48\xd1\x04\x23\xed\x8f\x5a\x26\xa4\x7a\x07\x2b\xa4\x9c\x00\x4d\xbf\x89\xfd\x51\x16\x15\x14\x5c\x65\x76\x72\xbb\xa4\xcc\x96\x6c\x95\xa4\x2d\x4c\xf4\xcb\x06\x1e\xde\xf5\xb4\x37\xab\x74\xc8\x6e\x4b\xef\xd0\x03\x76\x9b\xd7\xf2\x2e\x7f\xec\x35\xd3\xe5\x33\x50\xf7\x2e\x07\xf5\x02\x3f\x83\xff\x6a\xc9\x43\xce\x94\xe8\xc8\x91\x3b\x94\x12\xaf\x08\xc3\x51\xff\x64\x8c\xf6\x08\x1a\xbf\x6e\x9b\x48\x3c\xe6\xfb\xd1\x4e\x71\x67\x65\x38\x77\x87\xfc\xbc\xe4\x0b\xd8\x95\x6d\xd1\xef\x4d\x1d\x92\x2f\x2f\xcf\xb2\x9f\xd2\x3f\x29\x87\xb9\x5e\x04\xb9\x8b\x23\x52\x97\x1f\x10\x22\xb7\x0a\x32\x42\x37\xd1\x89\x62\x52\xd6\x00\xc8\x2e\x79\x2f\x12\x7a\x3c\x83\x77\xff\x18\x58\x5c\x7e\xa8\x31\x26\xa7\x96\x96\xa5\x6a\x19\x54\xbc\xa6\xcd\xef\x6a\x67\x6c\x01\x84\x02\x34\x35\xfe\xea\x9c\x0c\x57\x6a\xa6\x4d\xa6\xa2\x89\x42\xfb\x14\xd6\x73\x3e\xd2\x88\x32\xc4\xe8\xab\x4c\x94\xa4\x87\xec\xfe\x7e\xee\x55\x8f\x8f\x93\xb9\xde\xef\x05\x94\x3a\xfd\xbd\x3e\xa6\x3b\x47\x73\x48\xc2\x9d\x8f\x01\xf6\xe5\x72\x30\xb5\x43\xfe\x72\xa1\xa8\x68\x3c\x28\xab\x58\x35\x12\x88\xce\x11\x56\xb9\x68\xd8\x98\x91\x40\x73\xee\xea\xd5\x8b\x23\x8a\xfa\x6d\x67\x0f\x1e\xd6\xa2\xef\x17\x7e\x64\xcd\x16\x92\x30\x13\x48\xd4\x5b\x21\x14\xee\x6f\x31\x59\x81\x58\x06\xf6\xd5\x6d\x53\xcd\xf7\x93\x7f\xb7\x94\xfb\xeb\xb5\xee\x80\x60\xa2\x3b\xfd\x05\xa4\x11\xf6\xc2\x7e\x76\x17\x74\x94\x2e\xbd\x4c\x42\x09\x07\x2b\x30\x4d\x3e\xd1\xc2\xe9\xf2\x9f\x7d\xeb\x22\xb8\xa6\x39\x23\x0a\xb0\xd9\xce\x45\xd3\x3d\xb5\x14\x41\x3f\x81\x6a\xcb\x46\x72\x5b\x7c\x85\xa4\x9f\xb0\x85\x52\x1d\x76\xc9\xfd\x3c\x82\x81\x02\x2b\x81\x46\xe6\x68\xcd\x34\xd6\xee\x0e\x13\xa8\xde\xaa\x98\x9a\xf1\x72\x93\x00\x41\xc5\xad\x9d\xe3\xb8\x52\x93\x44\x0f\x69\x2a\x6e\x8a\xfc\xa4\x43\xb7\x4c\x41\x7e\x6a\x2c\xfb\xbd\x04\x40\xdc\x7a\xd6\x06\x25\x73\xa8\x01\x1a\xec\x99\xec\x7b\x0e\x1e\x85\x9a\x3d\xed\x53\xf6\x28\xee\xf2\x04\xfb\xe3\x55\x7e\x33\x77\x69\xca\x95\x42\x0d\x9a\x44\x14\xfb\x6e\x05\xc7\xe5\x4a\xce\x27\x6c\x73\x99\xf4\x26\xa2\xd2\x14\x69\xa8\x57\x83\xbd\x2b\xc9\x64\x6a\x14\xad\x97\x09\x6f\xa2\x95\xa6\xda\x40\xe2\x88\xdd\xa8\xc5\x70\xeb\x87\x51\x72\x8c\xbf\xaf\xae\x77\x68\x25\xa8\x17\x9d\x06\x26\xd9\x7a\x73\x0b\x21\x90\xed\x11\x20\x83\xe7\x6a\x53\x3e\xd6\x52\x0a\x87\xbe\x8b\xa6\x15\xb6\xb1\xaf\x2b\xdf\x49\x86\xe7\x0e\x70\xb2\x7b\x9e\xde\x01\x82\x0c\xca\xd9\xd3\xb0\x88\x4d\x44\xf4\x6e\x70\x40\x5f\x5a\xde\x4c\x3c\xd5\x3f\xca\x0a\xf9\x18\x27\xfb\x2d\xdb\x4a\x4c\x59\x6f\xf6\x9e\x4d\x6e\x81\x36\x99\x4e\x07\xf9\x9c\x3a\x76\x96\x46\x2f\xeb\x6f\x24\xd4\xa9\xc3\xa4\x44\xc2\x37\x6c\xde\x82\xde\x01\xe3\x3d\xf7\x9d\xf8\x65\xbc\xcb\xdc\x40\x9b\x7b\xf5\xa0\xfa\x66\xb7\x06\xf2\x0d\x2d\xfd\xb2\x89\x2b\xb3\xf3\x5f\x28\xcb\xb1\xd0\xb5\x17\xb3\x9d\xf8\xf5\xbe\xc6\x21\x18\xa7\xaf\x91\x67\x1c\x49\x8c\xb3\x05\xa0\xe5\x20\x4b\xf8\x73\x92\x8f\xe6\x9e\x0f\x68\x0d\x6d\xed\x2a\x95\xbd\xd2\xc5\x59\x82\x53\x41\x7b\x86\x9d\xfa\xbd\xbf\x3a\x53\xcb\xbd\x1a\x59\x55\xc3\xbd\x2a\x09\xe9\xa5\xdc\x0f\x3e\x8d\xab\x15\x1e\xe2\x1c\x67\x97\xe8\x64\xe7\xcb\x8e\x7c\x3d\x26\x1b\x57\x18\xc7\xf6\xd9\x25\x00\xc9\x3e\x56\xcf\xc9\x16\x06\x97\xe5\x3a\x9d\x84\x44\xb4\x41\xa2\x56\x28\x3e\xe0\xb4\x85\xc1\xb8\x69\x09\x87\xe1\xac\x0b\x46\xd4\x1d\xbc\xc5\x76\xa6\x06\x4c\xdd\x27\xc7\xb6\xd2\x3b\x58\x96\x06\xf8\x28\xaa\xff\xdf\x94\xa1\x68\x74\xb7\xc0\xa1\x9c\x9a\x7f\x49\xa6\x04\xd4\x02\x5c\x2d\xa2\x68\x18\x73\x3c\x46\xb7\x08\xdb\xde\xa3\xa6\xda\xf1\x98\x96\xba\x37\x31\x5c\x70\x03\x5b\xc2\xbc\x2d\x91\x94\x4a\xa8\x39\xd2\x4f\x49\xd0\x8e\x98\x57\x18\x9f\xf9\xa9\xa1\x3c\x89\xce\x93\x5c\xda\xc5\x95\x19\xef\xf7\x68\x42\x55\x67\xbb\xe3\x6a\xea\xd0\xb2\x4d\xbd\x21\x73\x40\x60\xe3\xa3\x1e\x13\x31\x9f\xb2\x4d\x2f\x55\x15\xbb\x3b\x33\x14\x5a\x37\xb2\x56\xd8\x91\xdf\xa7\x20\xb6\x72\x91\xdb\x2c\xfa\x28\xfb\x1e\x1b\xa6\x43\xff\x61\xee\xca\x63\x93\x9f\x23\x60\x2b\x35\xa6\x90\x13\xe5\x5e\xcd\x72\x31\x82\xfa\xe8\xf2\xf4\x41\xc0\xe9\x3b\xb5\x13\x61\x2a\x56\x4e\x1a\xfd\x18\xad\x3c\x5f\xcb\x2d\xfb\xd7\xb2\x4e\xb7\xf8\x59\x95\xa8\xc9\x26\x6a\x9c\xa5\xed\x19\xcd\x9c\xf2\xf6\x48\xcd\x28\x5b\x90\x10\x51\xe4\x5f\xab\xad\xcb\x0c\x23\xa8\x6d\xeb\x7f\x7d\x63\xb1\x87\x3b\x5f\xa5\xbe\x0a\xbb\x3c\x59\xe7\xa9\x0b\xa2\xdf\xde\xd6\x79\xa0\x90\x54\xf9\xc6\x39\x45\xc0\xec\x6a\xd1\x39\xb4\x1c\x97\x97\x1e\xb5\x1c\xb7\xda\x91\x89\x3e\x8c\x5b\x2e\x41\x37\x8f\x47\x0f\xb6\xf1\xbd\x85\xda\x43\x44\x04\xdf\x81\x0d\xa8\xce\x9a\x30\x5d\x17\x1b\xc5\x3d\x1f\x35\xd4\x39\x2a\xb3\xa0\x1d\x11\x39\xb6\x12\x24\xc4\x9f\x32\x44\xd0\xaf\x49\x33\x8c\x73\x35\x05\x65\x6e\x12\x59\x20\x54\xbe\x78\x7e\x81\x2d\x42\xac\xa2\xd2\x84\x8c\x32\x3f\xc8\x4d\x34\x67\x88\x4c\xe9\xb1\x4e\x82\xda\xe0\x05\xda\xd5\xe6\x0d\xaa\xfc\xba\xbf\x2f\xbb\xeb\x23\x0c\xbb\x31\x0e\xcf\xfd\x55\xd6\xa4\xce\xaa\x0a\x5a\x0c\x5c\x1d\x94\xf3\xb7\xaa\x49\x8a\xc4\xde\xe5\xa1\x3b\xb4\x83\x29\x9b\x8f\x72\x9d\xd8\x40\x69\x35\xc5\xfa\x66\x47\x3e\xbb\xce\x96\x8f\x20\x36\x2f\x28\x28\x63\xd9\x0a\xcb\xc1\x41\x5e\x6d\x30\xde\xfb\x68\x00\x73\x55\x13\x3f\xb0\x6e\x9e\x84\x0f\x3c\x0c\x16\x0a\x34\x5f\x6b\x15\x95\xb4\x52\x3c\x94\x21\x7f\xd4\x72\x91\xe1\x3a\x72\xc3\xc7\xbc\x93\x60\x89\x6c\x5d\x70\x95\xd8\xeb\xc1\xed\xd2\x5e\x3b\x85\x7c\xa9\xce\xac\xf8\x2e\x73\xb4\xd9\x5a\xb9\xd3\x15\x21\x8f\x78\xeb\x4d\x3e\x65\xff\xc2\xcb\x6f\xc9\xa0\xb9\x69\xf2\x5f\x32\x10\x5c\x55\x9d\x0b\x2d\x16\xfa\x18\x01\xb0\x53\x63\xe8\x8d\x9d\x0a\x75\x2c\xe2\x13\x60\x94\xd4\x9b\xd4\xf9\xf8\x56\x17\x6b\x09\xb5\xe8\x22\xbe\xe8\x5c\xa6\x6c\x93\xaa\x67\xc5\xe5\xcf\x26\x3e\xce\xe0\xc6\xb7\x7a\x3b\xe8\x5f\x49\x5e\x92\xb9\x06\xbb\xe1\x42\xc4\xd1\x7a\x97\x5c\x7d\xa8\xe6\xcc\xc9\x0a\xd1\xea\x3c\x6a\xc2\x22\x7c\x26\x23\xdd\xd1\xe3\x98\x2d\xc2\x41\x70\xfc\x32\x80\x78\x18\x55\x93\x4d\x3d\x7a\x76\x49\x16\x10\x00\xad\x07\x2f\x62\x94\xa7\xeb\xb6\xd3\x6d\x97\x42\xad\x4f\x94\x6b\xae\x46\x9b\xb3\x33\x7a\xe6\x4a\x8e\xc3\xa8\x7d\x44\xe3\x69\x3b\xf2\x79\xf7\xa8\x66\x7d\xd1\x7b\x48\x31\xc4\x8b\xfc\x9b\xe6\xb0\x5d\x81\x08\xc7\x2f\xfc\x63\x83\x0c\x94\x79\xb5\xe3\x33\x13\x8e\x33\xbb\x26\x98\x24\xd3\x87\x6c\x7f\xf8\xda\xb3\x0d\x75\x56\xb1\x0d\xd2\x6b\x06\x79\x4b\x20\x9b\xd8\x42\x67\xb8\x54\x94\x6d\x35\x49\x30\xe3\xfe\x27\xee\x0c\x7f\x57\x35\xae\xca\x6a\x1a\x62\x1d\x30\x6a\x64\x52\x01\x5d\xda\x2e\x6e\x4c\xf9\xab\x4c\x0d\xb9\x6d\x73\xfe\xd8\xac\x5a\x79\x42\x7a\x99\xa9\x0d\xd0\x0a\xf9\x77\x7a\x6e\xda\xae\x3e\x45\x93\x78\x0a\x23\x7d\x8e\x41\xb3\xff\xc9\x9f\x4d\xa7\x10\x8c\xa1\x37\x31\x4d\x98\xf7\x68\x2e\xcc\x92\xdb\x1e\xdc\xb6\x5b\x8d\x29\xf3\xaa\x89\xcc\x67\x34\x59\x25\x4d\x86\xd3\x60\x05\xed\xcb\x7c\x79\x5e\xf4\x99\xb6\xcc\x57\xa1\xee\xa9\xb1\x65\x7e\x18\xab\x34\x32\xb2\x74\x87\x42\xf3\xcd\x56\xd9\x10\x43\x51\x73\x90\x55\x4a\xc2\x9e\x42\x1d\x9f\x0f\x35\xc7\xda\xa2\x3c\x3e\x91\xde\xf7\xb8\xd6\x13\x0e\xcd\x5f\x29\x05\x2e\x1f\x97\xdf\xff\x24\xf4\xa1\x4f\x7e\x66\x43\x28\x67\xfb\x52\xc8\x49\xe7\x91\x91\x83\x70\x63\x6e\xb2\xb3\x94\x7f\xd4\x76\xa6\x15\x22\x27\x24\x04\xcd\xcb\x64\xbf\x1f\xe7\xb2\xfa\xaa\xf3\x84\xa4\x90\x48\x54\x4e\xf3\xb9\x94\x7a\x6a\x13\xe9\xa5\xfc\x20\xca\x43\x4b\xe3\xf3\xe4\xad\x7d\x41\x1e\x89\x33\xf9\x70\xca\xd7\x6c\xd8\xce\xe8\x14\x0e\x50\x48\xc4\x50\x1c\x16\x20\xac\x6a\x21\x61\xcd\x8b\xbd\xf9\xb0\x39\x53\x0b\xd1\xbe\xaf\x8f\x07\x6e\x62\xd5\xb0\x6d\x69\x89\x8e\x2a\x49\x1f\x72\x07\xee\xa1\x03\x98\xbd\x91\x18\x22\x98\x61\xd0\x81\x1b\x56\xd8\x70\xf1\x0b\x28\x9b\xfd\xdc\x8e\x66\xcd\xac\xd1\x63\x42\x55\x21\xfb\x8b\x52\x87\x4c\x91\xe9\x82\xa6\x12\x14\xdc\xfe\x4b\x0f\x2b\xf3\x9b\x1a\x4c\xa1\x7b\xbf\x57\xd1\xe9\x3d\x8b\xaf\x75\x77\x8e\xfd\xdd\x2d\xb6\xfb\xe8\x66\x0f\x1d\x19\x35\x48\x9b\xb9\x33\xfd\x3f\x5d\x0d\xb0\x64\xb4\xd3\x7f\x29\x55\xa9\x23\xfa\x98\x95\xdb\xff\x1a\xdd\x84\xd9\xfe\x36\x7e\xd3\x4e\x70\x4f\x27\xe4\xcb\x22\x21\x3f\xc5\x50\x0e\xea\xbd\x7e\x7d\x6c\xba\x0e\x98\xd0\x3c\xb9\x7b\x74\x8c\xf6\x4f\xc4\x3e\xc5\x7a\x21\x9f\xa8\xbd\x97\x06\x75\x91\xe0\x05\xa8\x87\x86\x57\x44\x2f\xe4\x40\x7e\xfd\xfe\x07\x3b\xff\x44\x6c\x61\x96\x85\x5e\x6c\x17\x1e\x05\x79\xa2\x2f\x75\x96\x1b\x38\xe7\x12\xd0\x48\x77\x0e\xda\x2a\xb2\xa1\x14\x4d\xa3\x13\xf2\xcf\xde\x82\xa4\xe8\x29\x8d\xf4\x69\x0e\x6a\x0d\x84\xad\xf5\xfe\x14\xd6\xb9\xf5\x60\xbb\x99\x52\x33\x7d\xa5\xab\x95\xad\x27\xe5\xfe\x49\x1a\xa4\x25\xbc\x39\x08\xef\x77\x63\x67\x65\x50\xa9\x6e\xbc\xc7\xe8\xc6\xf4\xd7\xaf\x8e\x78\x23\xdf\xc6\x50\x42\xf9\xc9\x73\x8d\xdf\x77\xce\x9b\x29\x36\x97\xa5\x46\x7f\x0f\xa5\x52\xeb\xb6\x29\x7a\x48\x7e\x65\x10\xc1\xf1\x33\x97\x57\x94\xf7\x34\x52\xdd\x1e\x9b\x16\x78\xc5\x05\x58\x6e\x74\x8a\x87\xe3\xee\x92\xee\x23\x71\xcd\x4b\x5d\x4b\xb7\x92\x6b\x57\xc2\x63\xf7\x65\x4a\xe5\xf8\x4f\xbe\x89\x44\xf7\xa2\xb5\x8b\xe2\x75\x8a\xf6\x8e\x75\x37\x35\xd2\xad\x9a\x6f\xa0\xba\x88\x2c\xb6\xda\xc3\x5a\x0c\x9d\x52\xbf\x95\x6a\xa4\x81\x8c\x1b\xfb\x5b\x90\x78\x5a\x7f\x4e\x9b\x38\x5a\x52\x84\x34\x82\xe0\xf3\x94\x95\x38\x95\x05\x6b\xd4\x1f\x52\x2c\xc4\xb6\xe0\xd0\x30\x23\x50\xc3\xdd\xa4\xea\x3e\x8f\x61\x68\x03\x4a\xb9\xb5\x45\xe2\x75\xb9\x30\xfe\x92\x86\x08\xbf\x66\xf3\x86\x61\x70\xed\x18\xb1\x75\x65\x82\x37\xbf\xa7\xac\xb1\x5c\x07\x21\x5c\x62\x3e\x74\x15\x2e\x9d\x4f\xa5\xc5\x49\x71\x93\xe4\x23\xc9\x96\x53\x04\xdd\x80\x1c\xe4\x09\x1e\x6a\x26\x30\x66\x9d\x11\x07\xd5\x93\xdb\x47\x66\x21\x35\xe7\xdf\x9f\x65\x4b\xbb\x23\x4a\x9a\x13\xc1\x24\xea\x9e\x9c\x8a\xd0\x6c\xe0\x46\x53\x05\x4b\xea\xf6\x50\xae\xa4\x76\x52\x9f\xec\xb7\xb1\xb9\x29\x45\x2f\x24\xbb\x64\x94\x59\x27\xb4\x4e\x39\x18\x52\xcd\x04\x34\x97\xff\xc2\xb8\x3d\xbd\x3d\x6f\x7a\x2c\x35\x9d\x28\x40\xce\xa5\xeb\x11\x93\xa1\x0e\xbe\x68\x41\xea\x18\x95\x79\x5b\xf2\x82\xa6\x6f\x9f\xef\x2c\x54\xa2\xe9\x9d\xe6\xd6\x98\x2e\x0d\xe5\xb7\x8b\x84\x26\x0d\xab\x13\xd9\xca\x70\xd0\x5f\x9b\xb2\x43\x8a\xa8\xf4\x74\x85\x07\xa6\xf3\x17\x95\x9c\x0c\x30\x0e\x1b\xe6\xa8\x51\x14\x1a\x27\x14\xa1\xe1\xbc\x0f\xef\x54\xde\xec\x55\x59\x04\x92\xc2\x95\x81\xb0\x2d\xd9\x4c\xec\xb2\x16\x68\x5d\x85\x57\xca\xe1\x2e\x47\x19\x27\xed\x79\xd2\x5a\xca\xa2\xe9\x13\x6e\x1e\x91\xb2\x6e\x2a\x91\x92\x79\xd9\xc2\x01\x53\x49\xba\x29\x01\xe1\x69\x6e\xce\xe9\xab\x8d\x94\x75\x03\x2e\x9e\xd2\x19\xca\x56\x47\xb9\xe2\xd3\xe0\x02\xa2\xcc\xc5\xfb\x53\x29\xe2\xe3\xe6\xa6\xd3\xfd\x8e\xcf\xed\xcf\x50\x13\xc9\xbb\xd7\x05\x9f\xc3\x1e\x1a\x96\x6f\x22\x23\xcd\x96\x21\xa4\x0e\x5b\x04\xf5\xc3\x2e\x7a\x38\x43\x1c\xd6\xb4\x78\x6f\xf7\xd7\xf3\x6b\xfa\xe4\x0f\xf3\xd5\x3f\x99\x2c\xf7\x4f\x6a\x35\x19\xd1\x2e\x53\xcd\xa3\xed\x72\xfc\xb0\x33\x77\xb9\xf5\x1d\xee\xad\xbd\x91\xff\xa3\x1f\x1b\x71\xe3\x1e\x4c\x65\x82\xe1\xa9\x02\xa7\x10\x5e\xb7\x6f\x98\x07\x6b\xe2\x7f\x33\x0b\xd5\x43\xef\x20\x21\x5d\xe8\x9d\xe1\xb0\xc8\x17\xfd\x25\x72\x52\xb4\x93\x2e\xbf\xe0\xf2\xa9\x5a\xc5\x3c\x44\x70\x4e\x99\xa6\x45\x49\x7b\xb1\x73\x27\xd2\xd2\x8a\xc0\x9b\xe8\x10\xd1\x9e\x9b\xa7\xa7\xda\x4a\xd8\x7a\x0e\x95\x75\x64\x24\x21\x6c\x30\xd1\x3e\x3a\xc2\x3a\xb3\xbb\xdc\x38\xd8\x40\xa2\xb3\xd2\xd4\xdb\x9a\x73\x51\xde\xfd\x8d\xba\xac\x71\xf2\x6e\xfd\x78\x2b\xbb\xf5\x70\xdf\x15\x8e\x59\xd5\x47\x73\xfb\xdf\x19\xe9\x0d\x78\x53\x96\x4d\x6d\x67\xf0\xdf\x68\x3c\x62\xfa\x12\xb3\xce\xa3\xe1\xa4\xcc\x11\x53\x9c\x62\x8a\x3b\xa8\x5e\x9e\x39\x72\x6f\xfe\xa0\xa2\xc0\x7f\xcd\x48\xdd\x12\x7d\x29\x93\xd3\x77\x60\x02\xfd\xc4\x80\x8f\x1f\x93\xe8\xa3\x87\xcd\x6f\x39\x14\xc3\xa9\x5c\xf0\x9c\x29\x0f\x68\x4e\xfc\x5b\x7c\x65\x40\xf0\x08\x67\xb7\x4e\x86\x32\xee\x92\x6c\x35\x95\x9e\x7f\x58\x14\xb8\xbf\xdd\x86\x79\x07\x99\x72\x3f\xf7\x2b\x0a\x74\x87\xd5\x69\x50\x68\x38\xb6\xfe\x4b\xf6\x27\x1a\x36\x6e\x7e\x95\x01\x5a\x3d\x4b\x1f\xfd\x2b\xf4\x4d\xfd\xd4\xa6\xb3\x59\x0f\x7a\x56\x0c\xf8\x2f\xf3\xc3\x4a\xda\x9c\xc6\xed\x53\xd6\x1f\x3c\x2a\xef\xe9\x9d\xc2\x21\xa5\x37\x70\x89\x4d\xe3\x10\xfd\xaa\x20\xd6\xa9\x5f\xa5\x06\x52\x59\xa0\x7a\xb9\x42\xa2\x67\x15\x00\x83\xfa\x57\xa2\x3e\x4d\x4a\x0d\x5f\xc7\xff\x50\xa1\x9c\x39\xb1\xa6\x3f\xdd\x40\x41\x87\x11\x42\x44\xe9\x0d\x1a\x32\xb7\xb2\x91\x46\xde\x39\x5f\x75\x96\xe7\xde\x6e\xfb\xc1\x9d\x35\x97\x9a\x4b\xd3\x58\x19\xd6\xfb\xd3\xa8\x04\xa9\x51\x7e\x43\x65\xe3\x0a\x66\xa0\x3b\x62\x76\x0a\x7d\x98\x35\x84\x01\x56\x4c\xdf\x39\xf6\xd1\x98\xa3\xfc\x5f\x3d\x40\xc0\xd5\x62\x77\xec\xbd\x63\x64\x77\x06\xd1\xa9\x7b\xa6\xda\x75\x97\xda\x50\xf2\xab\x9e\xc1\xeb\xa6\x4e\x0d\x35\xcb\xb0\x4d\x01\x88\xee\xe9\xdd\x89\x14\xa8\x94\x89\xf8\xc8\xe5\x2b\xd7\x64\x48\xa7\x14\xf1\xe1\x12\xf8\xfe\xf6\xca\xdf\xd3\xe3\xe7\xe1\x1c\x8a\xb6\x9e\x7a\xd0\x38\xb0\x13\xc6\xca\x87\x83\xd5\x0d\x91\x4d\xee\x31\x54\x2a\xa9\xd9\x16\xbe\xc5\x1b\x6c\xb8\xf2\x76\xbf\xd9\x76\x25\xfa\x50\xb9\xf3\xdb\x2d\x65\x98\xde\xe2\x36\x9a\x60\x55\x83\xde\x69\x88\xac\x1e\xd9\xab\x9f\xbe\x14\x5b\x4c\x9e\xd4\x88\x71\x16\x8d\xdb\x79\xeb\x77\xe7\x4c\xfc\x3d\x77\xf6\xd6\xca\x7e\x5a\xd3\x15\x01\xbf\x84\x30\x0c\x1d\x0a\xbd\x04\x9d\x44\xbf\x7a\x75\xf1\x6a\xa1\xdf\xea\x47\x05\x26\x57\x3d\x18\x01\xf3\xe8\x04\x76\x63\xa5\x6a\xd1\x6c\xec\x26\x75\xd8\xf2\x96\x63\xd4\x15\x93\xe8\x77\x50\xea\x38\x75\xe5\xe6\x3d\x1c\x67\x48\xa1\x54\x2b\x4f\xe2\x00\xec\xfd\x78\x0a\x96\x8b\xa2\x66\xe0\xad\x9f\x9f\xf2\x83\xb1\x95\x75\x12\xa6\x52\xb0\xa2\xda\x6f\x67\xf9\x12\x92\xed\x5a\x22\x5e\xd1\x4d\xbc\xb3\x8b\x16\xde\x41\xd9\xc9\x7e\x1d\xf4\x71\xc0\x32\x3c\x94\x65\x3c\xd0\xf0\xab\x2f\x09\x33\x9b\xae\x8a\xcf\xbe\x4c\xd3\xa3\x37\xe8\xbf\x8d\x33\xc0\x98\x24\x56\x97\x33\xa9\x38\xb0\x6f\x8c\x7c\x52\x3d\x86\x0f\x8c\x15\x63\xa8\xfa\xa2\x6f\x98\x86\x1a\x02\x89\xbe\xff\x95\x7c\xbf\x57\x70\x09\x63\x91\xf5\xf1\xa3\xfb\x6b\xc8\x0c\x6a\xd7\x1b\x51\x6e\x04\xad\xdf\xd4\x4f\x7c\x65\x31\x5f\x56\xc0\x5c\x6c\xfa\x29\xd0\xa3\xaf\x92\x36\x72\x68\x37\x77\x16\x0f\xfa\xea\x29\x1b\x52\x1d\xc9\xbe\x75\x1f\xf1\xd1\x5f\xf1\x67\xb0\x08\x56\x07\x71\x4b\x66\x4d\x52\xd1\x62\x0d\xdb\xd2\xe5\x2d\xb2\x3d\x66\xb0\xc9\xf4\x61\x43\xd1\x6d\x35\x5b\x30\xc5\xa3\x87\xa8\xbf\x21\xc3\x98\xbf\x29\x3f\x20\x8a\x4b\x86\x7e\x2c\x6d\xa0\x93\x79\x8c\x5e\xa1\x1b\x79\xe7\x01\xeb\x03\xad\x21\xe5\x20\xbe\xb7\x45\xfe\x1b\x3e\x7f\xcb\x66\xe2\xf8\xdb\x95\x62\xb4\x8c\x55\x9c\xbf\xf4\xef\xe9\x23\x16\x72\x19\xb6\xd9\xdf\xc4\xd2\x5b\xba\x42\x53\xd7\x49\x2f\x9d\xc0\x8e\x30\xe2\x3d\x7f\x1c\xbe\x0f\x52\xb8\x5b\x69\x78\xe4\x97\x0f\x4e\x67\x2e\xd8\x19\x54\xdd\xb9\x3a\x41\xce\x11\xb7\x30\xdb\x28\xa3\x9c\x3d\xd6\xe3\xa0\xaf\xd8\xcf\x1e\x98\x29\x37\x67\xed\x6b\xe9\xb5\x32\x45\xcf\x71\x4a\x5e\x97\xe7\xdc\x91\x0f\x1a\xff\xf4\xb8\x57\xcf\x57\x94\x9f\xac\x7e\xbe\xfe\x2a\x85\xd8\xcc\x14\x1b\x25\xfa\x8f\x1d\x98\x5f\x37\x6a\xe0\x76\xdd\x44\x12\x3a\xcd\x1b\xe2\x2a\x96\x93\x03\xb6\x23\x8a\xba\x44\x62\xba\x3e\x23\x90\xd4\x21\x3a\x7c\x7b\x90\xec\x98\x4c\x3b\xeb\x01\x35\x8f\xb3\x94\x37\x91\xac\x49\xfe\x07\xff\xc1\x64\xff\x1d\x98\xf2\x38\x93\xe4\xed\x9b\x1a\x22\x92\xdf\x21\x84\x43\x3e\x73\xdc\x59\x66\xf2\x8d\x55\x2c\x58\x6c\xfe\xd7\x4a\x75\x96\xf7\x8a\x24\x94\x09\xed\xc4\x36\xc3\xdb\xec\x69\xec\xca\x4c\xa1\x0a\x72\x42\x5c\x22\xdf\xc1\xd4\xbf\xd9\x7a\xec\x5f\xa1\xb5\x85\xb1\xbf\x37\xa0\x53\xef\x24\xa6\xa9\xaf\x3e\xca\x53\x2a\x03\x47\x6e\x26\x50\x0c\xed\xf5\x83\x1d\xbc\xbc\x15\x70\x4d\x3a\xf5\x64\xeb\x95\xaa\x39\xb8\xed\x08\x4b\x5f\x8c\x9e\x80\x20\x3e\x72\x02\x2a\x45\x41\xa9\x38\x44\x9b\xc3\x4a\xad\x5e\x59\x79\xa0\xd7\xca\xa7\xda\x0d\x8a\x9f\x41\x26\x0a\x18\xa7\x27\x1b\x63\x65\x97\x8f\x3b\x7f\x4e\x00\x4f\x66\xd9\x79\xd3\xf0\xa3\x65\xf9\x27\x7f\xb4\xef\xfc\x19\x1f\xac\xc4\x7e\xb0\x4c\xc6\x83\xcd\xee\x1f\x37\x30\xdd\x92\x3a\x88\x2f\x27\x1e\x71\x23\x02\xe7\xf6\x3e\x7a\x9a\x9b\x8d\x64\x38\x46\xb3\x74\xbf\xc9\x8d\x28\xea\x7b\x1e\xfe\x58\x2c\x57\xfe\x99\x8a\x9d\xc3\x57\xd7\x74\x09\xf4\x39\xf5\xa3\xc3\x07\xa7\xef\x4c\xb5\x3b\x25\x0f\xa4\xa6\x67\xa8\xbc\x3f\xba\x4c\xd6\x7e\xe9\x1c\x7d\x2f\xd0\xec\x2a\xbd\x88\x09\x98\x7b\xf0\xef\x70\x22\x6b\x67\x50\xf6\x62\x22\x76\xf1\xa5\x9e\xfa\x41\xc7\x41\x12\x4a\x9b\x2f\xd0\xab\x57\x89\x2d\x1f\xcc\x49\x88\x77\x98\x75\xc8\x42\x9c\x33\x8a\xba\xa5\xe1\x1f\xf1\xa0\x81\x9d\xf8\x78\x59\x7d\xcb\x5c\x2e\xac\x9a\x36\xfb\xa0\x69\xbb\x9b\x98\xe2\x8d\x3c\x20\xf3\x36\x57\xfe\x51\x6e\x77\xdf\xea\xf1\xe5\x4b\x92\x8b\x52\x99\x7d\x7f\x79\x2b\x8b\xf7\x07\xa5\x97\x18\x40\x1d\x23\x5f\x0a\x90\xf3\xac\xfc\x2f\xc3\x1e\x04\x1b\x8d\xa1\x1f\x88\xc6\xe9\x32\x44\xf2\xe8\xf3\x5c\xdc\x1c\x0d\x8b\xa3\x73\xb7\x31\x52\x15\x34\xc1\x33\x49\x2d\xd1\x7e\x88\x46\xe7\x9f\x7b\x9f\xe9\xf8\x9e\x5e\xd8\x01\xed\x4f\x71\xf1\x36\xa2\xc5\x43\xee\x10\xba\xc3\xe6\xea\x12\x3a\xa8\x61\x8a\xa0\xcf\x32\x2a\x3f\x76\xcd\x16\x5d\xae\xf4\x20\x10\xf3\x74\x3e\x0e\x49\xc6\xa3\x77\x38\xbe\x78\x47\x5c\x36\x1c\x30\xce\x12\xcb\xed\x62\xeb\x99\x81\x57\x56\xc2\x46\x97\xcb\xdd\x16\x11\xf7\xf2\x96\xed\xc5\x5b\x86\xe7\xd4\xdb\xb1\x89\x36\xe1\x31\x87\x95\xd5\xee\x38\x11\x2a\x6c\x8c\x4f\xdd\xd6\xae\x7f\x7c\x3a\x91\xf5\xc0\xd7\xa0\xa7\x07\x9a\xa9\xee\x97\xdc\xa7\x53\xfd\x86\x3b\xd9\xb0\xfe\x8e\xe9\x3e\x1c\x6c\x34\xa7\xde\x68\x08\x5b\xf7\xaa\x3b\x0a\x9a\xd3\x3d\xc8\x83\xa3\x5d\x32\xee\xfd\x61\x66\xd4\x1d\xc2\x34\x7d\x4e\x10\xfd\x6b\x2c\xce\x15\x63\xe3\x30\xd3\xdf\x03\x8c\x78\x17\x94\x0c\xad\xe9\xbc\x83\x91\xb6\x51\x77\x47\x8f\xd6\x7f\x18\xab\xd9\x31\xf7\x38\xfb\x35\xf4\x03\xfc\xb4\x72\xf5\x85\x03\xd4\xaf\xdd\x21\x65\x99\xfc\x4a\x6b\x38\xf8\xf4\xd8\x0a\xdf\xa8\x86\x1c\x91\x27\xac\x16\x53\xbf\x96\xca\xd5\x4d\x0d\x34\x7b\x93\x8c\xf3\x7a\xf4\xf3\x6c\x99\x8c\xc6\x6f\xe5\x0a\x46\xdf\x10\x08\xf0\xe0\x95\xbb\x1f\x06\xc4\x01\xe8\xd1\xe1\xb5\xda\x9d\xef\x24\xfb\x0c\x9a\x24\xeb\x56\xa1\xab\x5b\xff\xf1\x79\xdf\x6d\x69\xff\x4e\x66\x7d\xf5\xba\x3d\x1b\xdf\x91\xff\x74\xbb\x78\xda\xed\xb2\xc2\x5e\x82\x00\x78\x13\xd1\xcf\x49\x5b\xd5\x42\xb9\x36\x77\x8f\xab\x54\xef\xb0\x5d\x3b\xfa\xa1\x7a\x4e\xd1\x42\xe2\x08\x52\x60\x02\x52\x10\xf5\x49\xa7\x58\x15\x18\x2b\x8b\x7f\x58\xeb\x59\x5a\x4a\xcd\x55\xfe\xc8\xb6\x6e\x90\x00\x85\x2f\x87\x91\x32\x5d\x95\xc5\xfd\x9b\x94\xf4\x8a\x98\x8e\xeb\xef\x6a\x2c\xfa\xe5\x45\x37\x8b\x2e\xb0\x9b\x38\x5d\xef\x26\x5e\x17\x36\x9c\xa5\x94\x7e\x3a\x56\xba\xb3\x6f\x02\xa2\xe5\xdd\x29\x8e\xc4\x72\x2a\x1d\x70\x4f\x7b\x8a\x51\xa1\xb0\x6e\x75\x7f\xcf\xb5\x75\x7f\x1d\xd4\x60\xcb\x34\xf3\xb9\x4a\x57\x55\x86\x9c\x17\x68\x49\xd5\xba\x40\x45\x2e\x7c\x18\x4b\x9d\x21\x10\x81\xd5\x06\x10\xe6\xec\x86\xee\xfa\xd9\x3c\x43\xa2\x29\xdc\x57\xa7\xe5\x71\x39\xab\x07\x73\xaa\x3f\x1a\x8e\x74\xb3\xc3\x74\x23\x3a\xce\xe4\x11\x7c\x8f\x5b\x3f\xaa\xcb\x7e\x3d\x04\x01\xd5\x84\x9f\x2b\x05\xa1\xf2\x0c\xf7\x38\x60\x39\xa2\x04\xdb\x60\x3a\x4e\xc0\x56\xfc\x08\xf0\x65\xfd\x4c\xff\x7b\x68\x15\xb2\xa9\xcb\x66\xb0\x68\x92\x60\xb2\xbd\xf2\xc7\xbc\x4c\xf3\x0f\xf9\xfe\x1f\x59\x4a\x18\x73\xa3\xb4\xb6\xb3\x9e\x8a\x9e\x33\x4c\xad\x9c\x7f\x86\x68\xdb\x3e\xac\xc2\xd1\xdc\x1e\xbe\x52\xca\x5b\x6e\x08\xda\x30\xb2\x12\x38\x8a\xc4\xee\x73\xfa\x62\x22\x3a\x73\xa0\x75\x9a\x67\x73\x12\xa7\x30\xb5\x70\xeb\xa4\xb3\x04\x53\xfb\x51\xf9\x48\x8d\x3d\xd5\x9a\x30\x49\x6c\x36\x07\x9f\x96\x01\xdc\x79\xc4\x26\x8c\x1b\x84\xe4\xb8\x1f\x0b\xb1\xc8\x71\x51\x0c\x51\x84\x55\x7e\x61\x5c\x4e\xb0\xb9\x4a\x22\xfd\x37\xe5\xb7\xb2\x8e\x34\x37\x2c\x2e\x9a\x2c\xac\xab\xec\xd5\x59\x74\x97\xf3\xf2\xd4\x4d\xef\x43\xc7\x8a\x31\xd8\x28\x4b\x86\xd5\x8c\xbb\x3a\xfd\x0d\xeb\x57\xed\xe2\xc1\x49\x64\xbf\x9e\x07\x58\x0d\xdc\x46\x46\x88\x48\x7c\x01\x32\x6b\xe3\x30\x7d\xe0\x94\xa6\x16\xb2\x2f\x1a\xd0\x10\x27\x8b\x35\x9a\xb4\xf2\x8d\x40\x7c\x91\xbd\xe2\x80\x8e\x68\x9d\xea\x54\xd5\xab\xcf\x29\xd1\xe7\xb1\x21\xab\x2f\xc8\x8a\x77\x4f\xd4\x4d\x6a\x78\x99\xa4\xf7\x13\xad\x4b\xf7\xb1\x6b\x3f\xba\xd3\x81\x56\x20\x34\xa6\xa5\x28\xe0\x63\xca\xce\xbf\x26\x0c\x62\x33\x70\x4e\xbe\x7f\x7d\xa4\x49\xba\x55\x64\xb0\xba\x25\x5d\x7e\xa6\x72\x21\x6a\xcc\xd4\x08\x36\x77\x95\xb3\xa4\x1e\xf8\xca\xc2\x56\x32\xdf\xb4\x94\x2d\x27\xfb\xcb\x0b\xb8\x0f\xd1\x2d\x9e\x5a\x67\x81\x81\xab\xd8\xda\xd9\x1a\x8e\xd1\x21\x63\x45\x96\xd2\xf1\x6d\x20\x8d\x6e\xa7\xd3\x67\x53\xc3\x7a\x48\x49\x4a\x8e\x4f\x62\x8e\xd2\x0d\xde\xd1\x50\x0b\xde\x68\xce\xb5\xf3\xc6\xec\xa6\x4f\x29\x38\x6f\x72\xe8\x2a\xd5\x80\xe7\x08\x68\x5c\xc3\x9b\xf4\x53\xb6\x36\xec\x22\xbe\xcf\xae\x93\x97\xf4\x95\xb0\xfa\xce\xf6\x2c\x66\x54\x98\x9d\xac\xdf\xb5\x0b\xf5\xbe\x1e\x08\x7f\x74\x3e\xb9\x8f\x93\x1e\xd1\x9a\xf4\x12\x82\x44\xf6\xe3\x8e\x72\xdc\x02\x86\xd9\x44\xee\x84\xed\x97\x02\x9e\x94\x05\x7d\x5c\x9d\x68\xc9\x65\x39\xc9\xbe\x10\xd9\x61\xf3\xae\x8c\xaf\x91\xeb\xe4\x2b\x97\x42\xdb\xce\xd6\x57\xff\xa5\x7c\x9f\x51\x1e\xd1\x75\xc7\xd3\xce\xcb\x41\xf7\xa6\x3b\x0e\x63\xd8\x4e\xc0\x03\x27\x8c\xde\x99\x44\x5c\x59\xe3\x2f\x63\x51\xb0\x75\x8c\x66\xf6\xd8\x89\x7b\xf4\x4a\x6d\x99\x4f\xdd\x7c\x66\xb4\x11\x97\x5d\xb4\xb6\x69\x22\x7d\x2e\xaf\x7e\x54\x9b\x7a\xca\x2f\x77\xa4\x2f\x23\x46\xe4\x3e\x5d\xfb\x87\xb2\xbb\xe4\xc9\xa9\x83\xe7\xe6\xda\xea\xf8\xd0\x8b\x92\x2d\x6a\x35\x71\xdf\xf2\x16\xc3\x0e\x4f\x1e\xd5\x30\x04\x62\x29\x79\xec\xad\xb4\xb6\x50\xc0\x3a\xf0\xa9\x5c\x03\x7a\x9d\xe0\x47\x46\x17\x5b\xfe\xd8\x59\x3e\x63\xc9\x0d\xca\x23\x0c\x47\x0f\x9a\x1f\x93\xf7\x18\x0a\x80\x23\xaf\xf6\x2c\x86\xf1\x9d\x3b\xe9\x39\xd2\xda\x0e\x6b\x65\x8e\xb1\xb3\xd1\x58\x5f\xa3\x91\xcb\x24\xa0\x5d\xab\xa2\x8b\x75\x1f\x6b\x11\x42\x21\x57\x20\x71\x4c\xc3\x47\xe2\xf6\x55\xa3\xc1\xd3\x05\xf6\xac\xba\x8a\x11\x20\xe1\xb8\x89\x23\x0d\xd4\x3e\x96\xe1\xfe\xb7\x46\x10\x01\x59\x99\x6e\x84\xbe\x8d\x71\xed\x67\xd8\x48\x95\x12\x2b\x5c\xc7\x44\x61\xdb\xcb\xb6\xd4\x59\x52\x73\xb5\x2e\xde\x4f\x37\xb6\x1d\x31\x07\x26\xe6\x41\x03\xab\xaa\xea\x3d\x6b\x19\x1b\xad\x6b\x76\x46\x8f\x7e\x9d\x79\xc6\x52\xa5\x1b\x9d\x5b\x06\x45\x5d\x59\x1a\x08\xa9\x53\xf3\x97\xc6\xde\xb3\xbc\x2b\x60\x68\xa2\x9f\x79\xcf\x91\xe4\xb5\x33\xaa\xc6\x1a\x5b\x71\x71\xeb\x7b\x84\x64\xd5\xfa\xe4\xd9\x05\x14\x7a\xd2\xfe\xe8\x33\xa5\xe8\x6c\x4a\xeb\x35\x05\xc3\xfa\x0d\x3d\x3f\x55\x72\xfc\x2c\x2b\x83\x58\x9a\x47\x4c\x54\x90\x74\xd9\x28\x1b\x74\x17\xfd\x6a\x74\xf1\x76\x1b\x7d\x44\xb0\xa1\x58\x3f\x65\x6c\x75\xee\x19\x2e\x3b\x68\x5a\x2f\x8e\x1c\xdf\x1f\x59\x1a\xb8\xfd\xc1\xff\x38\xaa\x09\x07\x1c\x9a\xfb\x59\xb6\x51\xfd\x5d\x23\x74\x9c\x35\x0a\xda\x16\x32\x5a\x75\xbb\xbd\x2a\xc3\x14\x4e\xbd\xe2\xf1\xc2\x52\x2a\x3e\x5a\x5b\xbf\xbb\x16\xfb\x5c\x3e\xab\x75\xa4\x97\x75\xbe\xa6\x54\x2b\xe9\x4a\x5f\x57\x3a\xfb\x2d\x08\x4a\xb0\xbc\xd8\x8d\xfa\xef\xd8\x39\x38\x7b\xd9\x8f\xdc\x3a\xef\x3a\xcb\xb0\x6c\xb7\x1e\xce\x7e\xa7\xc1\x19\xf7\x0c\xf0\xd8\x1b\x83\x5c\x4a\x1a\x0c\xfb\x74\xdd\xcd\x0e\x67\x7a\x53\xa5\x70\x8c\xfc\xac\xb7\x3d\x90\xcb\xf6\xef\xf0\x6b\x6f\x41\x05\x64\x5e\x73\xb4\xc7\xa7\xbb\x0c\xbd\x18\x15\x13\xfe\xe3\xc1\xf4\xa2\xd2\xaf\x52\x51\xfb\x4a\x1d\x25\x15\xf5\x52\x4e\x94\x3b\xf2\x52\x55\xbf\x5f\x8b\x20\x2d\xc0\xbe\x1a\xe7\x79\xed\xc3\x25\x8d\x5c\x62\x8f\x86\x7c\x8c\x61\xa5\x26\x65\xb1\xc6\x12\x13\x1f\xee\xae\x43\xb1\x2f\x9a\x07\xca\x93\x39\x44\xc4\x15\x56\x42\x83\x80\xe7\x2e\x58\xab\x74\x3a\xdd\x7d\x30\x94\x3a\xb3\xf6\xc8\x23\x38\x6b\xeb\x6b\x10\xd5\x96\xde\x0f\x7f\x74\x80\xc2\x68\xe2\xba\x19\x8e\xa6\x47\x92\x6a\x38\x82\x3f\xd7\x33\xca\x59\x78\xa8\x9d\xaa\xdc\xca\x10\xf4\xb0\xb0\x04\x5e\x25\xc6\x5c\xcf\x46\x8d\x63\x36\xc7\x2f\x1f\x0b\x70\xde\xec\x58\xa6\x76\x2c\x16\xae\x3a\x88\xc6\x33\x93\xbe\xdc\x0c\x82\xaf\x9a\x04\x3f\x3a\xa0\x4d\x61\x65\xb6\x4e\x22\xc3\xda\x71\x38\x48\xad\x9b\x1a\xd2\xe3\xee\xee\x7b\x4e\x81\x13\x82\xcf\xea\x46\xb0\xc8\x0c\xbe\x5b\x72\xc9\xc0\xae\x7c\xe8\x4f\x5d\xf6\xb8\xd6\x14\xbb\x39\xad\xa7\x2f\x47\xae\x94\x1d\x07\x2e\x45\x12\xf5\x30\x7c\xdc\x6c\xfe\xc0\x47\xbd\xd7\x30\x8b\x29\x0e\x8c\x9d\x96\xe4\x21\x63\xf6\xee\x02\x2a\xc8\x40\x0f\x12\x35\x8a\xe5\xa6\x47\x9e\x82\x67\x7f\x74\xa9\x1f\x89\x5d\x33\x0c\xef\x53\x84\x2f\xe4\x6d\x80\x43\xac\x89\xad\x33\x43\x4f\xf3\x0f\xcd\xd1\x15\x1c\x66\x7f\xb6\xae\xd3\xac\x6f\x4f\x35\x3d\xf7\xdf\x43\x5e\x99\xf9\x5f\xd9\x0f\x8d\x62\xa0\xe6\xe0\x0e\x2d\xd9\x61\x3c\x26\xb5\xb2\x2d\x3d\xd6\x38\x22\x92\x5a\x49\x3e\xbb\x39\xb4\x5a\x3d\x6a\xf4\xdd\xad\x80\x3e\xcb\xd7\x12\x5f\x2b\xbc\x33\xca\x6e\x20\x0c\xd9\xfa\x8d\x73\x19\x5a\xdb\xd5\x88\x60\x49\xaf\x71\xb8\xf4\x96\x0b\x74\xec\x3e\x55\x17\x6d\xca\x96\x04\xce\x34\xdb\x60\x30\x0c\xd3\x93\x16\xe4\x37\xb2\xeb\xbf\x40\x64\xc9\x6e\x70\xa9\xdc\xd8\xc9\x99\xcb\x2c\x91\x1d\x1c\x3a\x9f\x53\x6c\xa4\x69\x74\x87\xad\x81\xd9\xb3\x4a\xd2\x92\xed\xdb\x3d\x96\xaa\x99\x61\x10\x1c\x2c\x4c\x3a\x8b\xc6\x73\x56\x50\x20\xf3\xb0\x63\x72\x28\x07\xdb\x57\x64\xda\x2e\x03\x19\x8e\xe1\x46\x28\xc9\x36\x5d\xe0\xf5\xd4\xa5\xd4\xd5\x76\x84\x9b\xc6\xf0\x89\x8f\xa4\xb5\x5d\x07\x7d\x6c\x33\x67\x82\x73\xd5\x9a\x6d\x06\x43\x6d\x52\xe6\xd0\x4d\xec\xdb\xf2\x5e\xcb\xc9\x66\xf1\xb8\xe2\x0b\xa9\xee\xe6\x31\x3e\xcf\x52\x09\xb5\x07\x1b\x08\xbd\x0f\xca\x4f\x9d\x44\xb9\xa5\xc3\x28\xf9\xa4\x33\x1c\x69\xc4\xa8\xdd\x3e\x7a\x5c\x99\x9e\xfd\xf4\x32\x39\xb5\xca\xf0\xfe\xf1\xe6\x01\x16\xed\xca\xe4\xc2\xa8\x0d\x12\x6d\x79\x3f\xb3\x5c\xeb\xdf\x4e\x5e\xcb\xfa\xcd\x85\x5a\xe9\xbd\xa1\x97\xb4\xc4\x40\xeb\xdc\x84\x1e\xec\x32\xf7\x1f\x27\xbb\xcd\xfd\xf4\x65\x49\x47\xe7\xfa\x3e\x60\x74\xd0\xd5\xd5\x00\xef\xd3\xaa\xee\xf6\x6f\x9c\x32\x53\x3a\xa2\x0d\xae\xa0\x07\x88\xee\xd6\x6c\x5e\x2d\xa5\xbf\xdc\xee\x4d\xa9\xf9\xa0\x87\x8b\xef\x0c\xa6\x2e\x9e\xc3\x63\xbd\x7c\xf6\x83\x6f\xd4\x27\x7b\x26\x88\x82\xb8\x76\xfc\x04\x3e\xf0\x73\x76\xf8\x21\x7e\xb2\x4e\x9c\x9f\xbe\x6c\x11\xed\xe8\x8b\xd6\xb6\x33\x39\xca\xec\xc3\xfe\xae\xa4\xe5\x37\xf7\xac\x97\xe8\x46\xef\xe7\x57\x32\x9c\xa8\x66\xe3\xd7\xb4\x34\x2e\x5c\x7d\x3c\x0e\x5d\x2a\x05\x82\xb3\x3e\x14\xda\xdc\x7a\xf6\x1d\x04\xeb\x6a\xb2\x8f\x8e\xb3\xdb\x5a\x38\x9a\x42\x4d\x39\xc2\x3f\xa9\xdf\xcd\x02\x86\xbc\x35\x34\x5b\x0c\x12\xdf\xaf\x94\x33\x1c\xcb\x70\x1b\x1e\x24\xc4\x80\xd1\xc9\xae\xad\x8f\xb1\x7c\x9b\x0b\xf7\xd3\x8f\xcf\xba\x38\x42\xb8\x0c\xcd\xd3\xe5\x0f\xcc\xb6\xb5\x5a\xd4\xe0\x24\x44\xff\xad\x1c\xa1\x17\xa0\x37\xfb\x70\xa8\x08\x8c\x4c\x6a\xeb\x7a\xae\xf9\xfb\x60\x10\x84\xcc\x5a\x63\xcd\x98\x8f\x71\x2b\xfb\x91\x72\x79\x4f\x7e\xd8\xa0\x18\x36\xfd\x73\x65\xf6\x16\xa3\x12\x96\x76\xee\x42\xc3\xc9\x8e\x33\x86\x4f\x83\xa0\x0a\x96\x43\xd6\x09\xf8\x3c\x65\x66\x4b\x73\x6d\x4c\x9b\x82\xfb\x79\x78\xae\x40\x47\x3a\x9a\xd5\x69\x91\x5e\x98\xcd\x68\x34\xaf\xf8\x60\x80\x41\xce\x44\xcf\xea\x48\x0c\x48\xf1\xe0\xbf\x3a\x31\xb9\xff\xa3\x61\x2b\xba\xfe\x30\x65\x39\x1d\x0d\x63\xde\xb8\xfb\xc1\x65\x35\xba\xb5\x3e\xf4\xf6\x4c\x02\x6d\xe4\xa0\x63\xd2\x90\x6c\x62\x31\x04\x97\x63\x08\x06\xf2\x7d\xe3\x5c\x11\x81\xe9\x6e\xda\xc3\x02\x0f\xaa\xc3\x67\x68\xc5\xab\xf8\xe9\x9e\x7f\x0d\xec\xdc\xc9\xa4\xab\xc2\xf3\xec\x70\x51\x90\x7d\x0f\xc9\x81\x80\xc3\x1b\xfa\xbf\xe7\x89\x56\x8e\x37\x3a\xe5\xe5\xad\x76\x35\xee\x91\xf8\x7c\x9f\x42\xfe\x7a\x07\x61\xd1\x3d\xe8\x89\xe4\x5e\x8d\xb4\x4f\xbf\x43\xcb\xef\x86\xf4\xd6\xdf\x0d\xfb\xdf\xd5\xf7\xe5\xb0\x0a\xcb\x3f\x3a\x6a\xb5\x9d\xb9\x63\x91\x18\x4e\x09\xcb\xa7\xc9\x5e\x22\xf7\xcb\x46\xbc\x0c\xc3\x3d\xef\xd7\xfe\xcc\xea\x1d\xff\xd6\x8e\x33\x01\x68\x11\x8a\xed\x1a\xe7\x8e\x74\x74\xaa\x5b\x53\xe7\xb0\x2d\xa4\xef\xd6\x20\x85\x07\x36\x27\xbc\xe2\xfb\x52\xce\xc6\x96\xbf\x17\x06\xab\x66\x35\xe2\x06\x82\x6a\xbc\xc9\xb8\xa2\xcc\x77\xa7\xee\xea\x67\x19\xf2\xad\xd2\x35\x4a\xaa\x8e\x01\x30\x2d\xbe\x94\x43\xfc\xf4\x5a\xda\x6d\x44\x86\xbb\xde\x90\xd5\x94\x7d\x6d\xbc\x77\x7e\xd1\xb2\xf1\x0a\xc6\xb1\xd4\xde\xe7\x1c\xea\x00\x24\xc8\xcd\x31\xcc\xd5\x76\x13\xe6\x7e\x7d\xcd\xfb\x83\x87\x56\x97\x5d\x52\x60\x60\xd1\x7a\x7b\x98\x3c\x8d\x4e\x34\x5a\x6a\x35\xc0\x60\xfd\xea\x51\xaf\xe7\x51\xe9\xc7\x92\x14\xf9\x29\x5d\x72\xbc\x5f\xf9\xfd\xd6\x29\x38\xc5\x65\x81\xed\xa2\x29\x8d\x30\x06\x0d\x19\x8a\x6f\x6f\xbf\xa3\x82\x79\x04\x47\xb6\xaf\x70\xbf\xd1\x1d\xe6\x7b\x64\xd9\x81\x5e\x3c\x57\x4b\x29\x51\x8c\xd5\x69\x7e\x2f\xb5\xe5\xec\x10\x3f\x5c\x11\x2f\x36\x17\xca\x3b\xf3\x59\xd7\x4a\x19\xd9\x02\x97\xea\x4c\xce\xdd\x2c\xaa\x77\x9c\xfc\x2f\x87\xa5\x46\x73\xe3\x78\x8b\x56\x73\xbf\x8a\xae\x5c\x7f\x10\x84\xfd\xf5\xba\x7d\x9b\x57\xfc\xea\x2b\x1b\x79\x9d\x42\x45\x6e\x49\x2b\x79\xc9\x60\xd7\x74\xb5\x25\xbd\xd5\xed\x5a\x39\x78\xce\x29\xc2\x00\x68\x43\x1d\x1e\x73\x6d\xce\x47\x64\x29\xe4\x35\x5a\xd5\xca\xda\x89\xe6\xf3\x95\xdd\x2c\x6e\xf3\xfa\xc5\x6c\x3e\xe7\x10\xbc\x73\xe5\xf9\x4f\xda\xfd\xe6\xee\xf6\xfe\xe5\x43\xc8\x83\x78\xe1\x72\x8e\x46\x6f\x7c\x60\x0c\xac\x85\xe5\xe8\x66\x83\x2c\xe2\x96\xbb\x0e\x3d\x82\x29\xe3\x1e\x63\x8b\xa8\x2f\x76\x80\x7d\x00\x70\x98\xa6\x5b\xf4\xc2\xe3\x31\x7d\xa5\xfe\x58\x68\xaf\x3f\x4c\xd3\xe8\xd4\x7c\x58\x5d\xee\x75\x74\x23\x73\x9a\x53\x44\xb9\xcd\x62\x1c\xb4\x20\x2c\x04\x69\x19\xe3\x11\x27\xd2\xae\x23\x65\x85\xb2\x55\xee\xdf\x07\x6c\x48\x7f\xaa\x11\x89\xa6\xda\x69\xa1\xb0\x50\x0e\x44\xa9\xdf\x6a\xf3\x3b\x18\xd4\x6e\x6f\x97\xeb\x5d\x1f\x27\x1d\xfb\xd3\xe1\x22\xad\xae\x78\xda\x25\xae\xd8\x3c\xf9\x01\x69\xf2\xb9\x97\x82\x81\xd6\x3a\x1d\x15\x3a\xff\xc8\xe3\xdf\xe8\xdd\xe5\x9d\x34\x0e\xaf\x70\xc4\x6e\x54\xab\x7d\xb3\xf1\xe2\x0a\x8b\x3e\xcb\xfc\x57\x5a\x74\x87\x2b\x40\x52\x83\xa9\x81\xa0\x92\x8e\x87\x27\xac\xd3\xd5\xfc\x3e\x1d\x85\x5d\x0a\xcf\x10\xc8\x9f\x6e\xaa\x93\x08\xaa\x07\xd9\x51\x91\x49\x74\xb7\x2f\x17\x00\xde\x0b\x02\x77\xaf\x41\xfb\x84\x29\xb3\x38\xdc\x8a\x5a\x84\x89\xe3\xc7\x03\x75\xc1\xc1\xc6\x05\xdb\xff\x14\x12\x0d\x62\x77\xea\xc4\x04\x4f\xd1\xf4\x6c\xa4\xa2\xbc\xd1\x12\x60\xd0\x64\xda\xe4\xa9\xbc\xd7\xd7\x48\xc1\xfe\x54\x36\x2d\x8a\x8a\x80\x4d\xc0\x5c\xf9\x09\x71\xe4\x61\xb7\x47\xea\x34\x3d\x22\xd5\xf7\x68\x62\x93\xc9\xf6\x3d\xb3\xc3\x6f\xff\x67\xbb\x48\xbf\x0a\x8a\x3c\x6d\x4a\x1b\xb8\x4b\x54\x77\x03\x24\x45\x0f\x5e\xa6\xcb\x06\x75\x3c\x44\xd3\x83\xbb\x00\xef\x4a\xe1\xb7\xd5\xf8\xb7\xb4\x89\x40\xbd\xd3\x91\x90\x69\x79\x46\x2f\x19\xcb\x98\x9b\xfb\x8d\x6f\xd4\xc8\x4b\x60\x14\x89\x40\x5e\x46\x4a\xbf\x51\xe8\x22\xd2\x98\x35\x33\x27\x9a\xf4\xe6\x39\xf2\x17\x69\x30\x60\xba\x34\xb8\x79\xe6\x59\x6f\x65\xb9\x11\xc6\x08\xab\x81\xa1\xef\x84\xb8\xa0\x10\x3d\xb2\x3e\x02\xe3\xbd\xf8\x8f\x2d\x9f\xf2\xee\xc8\xe3\x2e\x95\xc4\x27\x7a\xe7\x4b\x3f\x3b\x08\x52\x1e\x01\x4b\x1a\x44\x05\x57\xcf\x26\x4d\x83\xc5\xd9\xe2\x7c\xd7\x91\xf3\x25\x47\x43\x02\xe3\x5c\x4b\x40\x03\xb4\xe9\xc1\x05\xc8\x66\x94\x6a\xf9\x77\x61\x24\x0b\xfa\xb7\x7c\x0a\x20\xc7\x94\x0f\x6c\x4a\xb0\xfb\xd3\x80\xfb\xb3\x3f\x55\xbb\x9f\x3c\x20\xd9\xf8\xc6\x56\x3d\xef\x71\xa0\x86\x3a\xe3\xdb\x18\x28\x0b\x86\x61\x34\x90\x25\xac\x87\x3b\x89\xe7\x99\x52\x6b\x07\x45\x7c\x34\xd3\x02\x1a\x4d\x3e\xea\x91\xf3\x1a\xbd\xfb\xb1\xfa\x5a\xca\x68\x0f\xdd\xfc\x2b\x56\x92\xd4\x72\xb3\xc8\xd3\x9f\x98\xe6\x69\x57\x62\xc7\xa8\xc6\xf6\x4b\x8c\x97\xd7\xb8\x29\x15\xf4\xa5\x3e\xd8\xcb\x65\xd5\x8b\xe9\x3f\x11\x3b\x69\x8f\x13\x0a\xd4\x1a\x19\x28\xf0\x3b\xe2\x2b\xa0\x29\x11\x9e\x97\xe5\xaa\xd2\xe9\xf9\x4a\xe4\x33\x68\xd8\x56\x9f\xe2\xb3\xac\x87\x6c\xb0\xaf\x91\x1c\x75\xa2\x25\x23\x5b\x4b\x27\x88\xb8\xbb\x0e\xd2\x5a\xe7\x4d\xe1\xb9\xa0\xcd\x55\x2e\x83\x38\xec\xd0\x56\x79\x7e\xd1\xc8\x01\x0f\xdf\xc4\x10\x97\x91\x73\xd9\x70\x96\x53\x6b\x11\x47\x93\x2e\xe6\x6c\x8e\x33\x1c\x37\x48\xdf\xb0\xee\x4b\x37\x37\xd7\x3f\x13\xde\x73\x3d\x5c\x23\x29\xe5\xc8\x1f\x77\xd8\xdf\x4b\xcd\xf1\x40\xbf\x84\xb7\xee\xa5\xcb\x71\xc0\xf6\x9a\x8f\x8f\x7d\xd6\x11\x4e\x49\xcb\x84\x4c\x43\xe7\xe3\xa1\xa8\xca\x87\xaa\xaa\x5b\xf5\xbe\xdc\x39\x2c\x05\xfe\xe6\x56\x7c\x7a\x9b\xff\x5d\x79\xe3\x65\x45\xe3\x9f\x80\x8c\x23\x71\xf5\xe6\x36\x3c\x2e\xbd\xa8\x70\x8e\x74\xfe\x63\x13\xf6\x28\x53\xf8\xad\x76\xe5\xdd\x77\x37\x33\xf1\x80\x45\xfa\x16\x1d\xfa\xfb\x5d\xe2\x85\x43\xab\xd7\x11\xb6\x59\x7b\x59\x1d\xd0\xba\xe6\x90\xae\xcd\x5c\x62\x14\x08\xa2\x41\x99\x73\x0e\x77\x10\xf6\x77\xa2\xe1\x71\xb9\x95\xfb\x01\x6c\x14\xa2\x1f\x54\xb6\x64\xf7\x2f\xe3\x84\x77\x0e\xa3\x04\x78\xf2\xeb\xee\x59\x91\x9d\x80\x00\x4c\x65\x03\x53\xfd\x9c\x22\x34\x44\xd9\xab\x7a\x6c\xb3\xe6\x5e\x15\xe0\x7e\xd0\x46\x8c\x23\x89\xca\x77\x70\x28\xcb\x1a\x21\x98\xb7\x6c\x5f\xde\x6e\xf6\xf7\xeb\xea\x74\x90\x1e\x0d\xb1\xf0\xe8\x3c\x22\xd4\x11\x7c\xe3\xca\x3e\xa0\xc3\x85\x5a\xc1\xe8\x01\x71\xb0\x8e\xad\xb2\x20\x30\xe2\x4d\xa4\x01\xee\x19\xd5\xa0\x1a\xdd\x65\xa8\xe7\x41\xbf\xab\xcf\x96\x43\x8e\xbf\x2f\x24\x0a\x95\xc5\xd4\x35\xe6\xbe\x5c\x19\x6f\xbb\x1a\x42\x3e\x80\x2b\x38\x6f\xe3\xab\x9a\x52\xd8\x84\x5f\xb2\x1e\x74\xf9\x6b\xb0\xc7\xc8\x6d\x8e\xde\xfd\x48\xd9\xb1\x47\xa6\x11\xed\xe6\x5d\x95\x8f\x6b\x87\xcf\x0e\xfa\xd5\x37\x87\xa1\x51\xd8\x1f\xe7\x12\xa6\x0e\x5b\x45\x58\xca\xa3\x9a\xf1\x4f\x23\x13\x19\xca\x28\xc7\x6c\x56\xde\x18\x7e\xb6\x80\x06\x70\x42\x20\x0e\xa2\x66\x83\x46\xa3\x7b\x67\x7b\xb5\xef\xd5\xfd\x60\x07\x3b\xc2\x48\x7a\x65\xa3\xef\x7d\xe5\x77\xec\x2d\x5b\xc0\x88\x9e\xd2\xd1\xdc\x28\xeb\x9e\x5d\xd9\x26\x90\x82\xde\x6e\xa4\xb0\x71\xea\x36\x73\xe6\xcb\x8e\xa4\xec\xfd\xfd\x90\xa4\xcc\xd3\xd6\xa7\x65\x3a\xdb\x80\x0e\xbe\x4c\x03\xe9\x05\x6a\x3a\x7d\xd7\x45\xff\xbc\xec\x07\xbd\x90\x60\xb8\xb9\x18\xdf\x90\x01\xe8\x07\x88\x83\xe7\xa0\xd1\xd3\x41\x01\xdb\xfe\x12\x51\xde\xdc\xf7\xd9\xcb\xf5\x86\x22\xc4\xd8\xc1\xa3\xe7\x4c\x8d\x24\x8f\xb0\xa1\xd8\xc3\x85\x0b\xdd\xfd\xe5\xb8\xc6\x5c\x18\xc5\x61\x47\x2b\x39\x87\x81\xc5\xa3\x9e\x12\x18\xb3\x7f\x52\xc1\x83\x01\x42\xee\xda\x8e\x1f\xc6\x6a\x03\x18\xa6\x9f\x7a\x58\x6f\x72\xdf\x76\x31\xe2\x5b\x9c\xb8\x6d\xfd\xe7\x9b\x51\xfa\x33\x52\xdc\xb3\x99\xec\x6b\x50\xdb\xa7\xf5\x11\x4d\x7c\x86\x8f\x6a\x1c\x1a\xa1\xcd\x57\x61\xb9\x84\x42\x30\xb7\x7e\x26\xfa\x9a\xad\x60\x2e\xab\xbf\x0f\x9a\xe4\x4b\x4d\xff\xe0\x35\xab\x97\x4f\x5f\x35\xb6\xf6\xcb\xd7\x6f\xd7\x89\x1c\xa1\x6b\x1e\xda\xff\xc1\xbd\xfe\xca\x75\x47\x07\xe9\xcb\x6a\x74\xa8\x16\x9c\x20\xb5\xeb\xc6\x91\x16\x80\xf8\xdc\x4c\x06\x95\x3d\xee\x54\x7a\x69\xb0\xd3\x3f\xa3\x20\x01\x14\xfa\x3c\x67\x4c\x48\xdf\x2b\x39\x6a\xcd\x33\x26\x65\x97\xfb\x6b\x9e\x06\xd9\x04\xac\x13\xa6\xb4\x78\xa5\xa9\x02\x57\x18\xd6\x3b\x11\xfe\xe0\x8e\x3d\x7a\x85\xfa\xa8\xe5\x2a\xff\xe7\x01\x39\x48\xeb\x23\x1f\x4a\xda\xae\xb9\xa9\xe3\x14\xc1\x08\x38\x44\x8c\x2d\x3f\xaf\x04\x25\x91\xd4\x22\xb8\x61\xd7\x78\x25\x76\xe0\xaf\xa9\xdf\x6c\x74\x3a\xe2\x35\x93\x9f\x8b\x10\x0b\xbd\x1e\x0d\x50\xb3\x86\x91\xbc\xda\xdb\x63\xa3\xb7\x1f\x47\x37\x0e\xea\x39\xac\x65\x95\xb5\x6d\x47\xd9\x4d\x23\x7f\x92\x4c\xfa\xb2\x07\x5c\x8c\x6e\x01\x63\x90\xb9\xc0\x9a\x7e\x94\x99\xb3\x26\x77\xbf\xe1\x66\x7c\xd7\xd2\x59\x96\x5a\x4c\x35\xd5\x7e\xc3\xe0\xc1\x79\xc0\x8f\xd8\xee\x1a\x2b\x7c\x71\xf0\xe6\xf3\x53\x2f\x44\x2b\x09\x2c\xec\x36\xc9\x38\x8f\x3d\xf3\x36\x45\x52\xcb\x69\xf3\x0c\x73\xdf\x49\x7d\xe4\x66\x4e\x43\x61\x08\xf4\x5c\x00\x4e\xa6\x0b\x67\x81\xbb\x27\x6f\xa1\x88\xd6\x2b\x97\x75\xfb\xa3\x5b\xc1\x16\xa3\x94\x75\xf0\xd9\x20\x29\x92\xe3\x17\xda\xa4\xb2\x6e\x05\x01\x7b\x33\x26\x11\x19\xb3\x08\x7c\x7d\x1b\xb5\x18\x4a\x29\xd0\xeb\x91\xed\xe6\x4a\x6f\xe9\x1b\x79\x5d\x07\x46\xa1\xf7\x5c\x49\xf8\xa3\xd0\x89\x52\x45\x2b\x4d\x67\xfe\x4c\xf6\x7e\x75\xa7\x9d\xd7\x94\x3a\x52\xf0\xdc\x7d\x5d\x30\x87\xb3\x64\x38\xa2\xc1\xdf\xf8\x67\x54\x22\x62\xfc\x71\x30\xaf\x72\x7a\xdd\x15\x12\x12\x98\x03\x55\xc7\xeb\xc5\xa6\x5f\xc6\xe8\x08\xcc\xe3\xf3\xa9\xac\x99\xf2\x21\x71\x02\xe9\x1f\x83\x65\x6a\xd9\x7e\xcc\xfa\x4b\xc3\xcc\xaf\x99\x4a\x74\x0c\x40\x35\xe2\x5f\xb0\x08\xce\x35\xce\x26\xed\x42\x4d\xd2\xc6\x52\xee\x76\x39\xc4\xda\xee\x35\x3d\x93\x30\x81\x2e\x0d\x09\x93\x3d\x0e\xfe\x11\xd4\x98\xce\x3f\x19\xd5\x83\xf9\x6c\x9e\x3c\xbc\x23\x36\xfb\x2f\x94\xca\xfc\xc5\xdf\x05\xe9\xb6\x68\x42\xee\x1c\xc7\xb5\xf8\x9f\x4c\x0b\x39\x68\xf0\xca\x29\x8f\xa3\xd7\xec\xd4\xc3\x7d\xc5\x10\xc0\x5d\x7f\x49\x91\x65\x3a\xa5\x4f\xcc\xf4\xe0\xc2\x77\x86\x03\x66\xb5\x64\x9e\xa7\xc0\xa2\xe7\x52\x4d\xb6\x9e\x4a\x01\x7b\x8e\x8d\xb6\x2e\x65\x5b\xbc\xf2\xa6\x5c\xf1\xa6\xb2\x97\xf5\x5d\x96\x80\x3f\xd9\x1e\xb2\xe5\x2b\xe1\xcd\x24\x33\xb0\x9f\x6c\xa4\x00\xf1\x8b\x2f\x8f\xca\xf7\x96\xca\x42\xc7\xab\x1c\x4e\xb2\xd8\x38\x47\x83\x1e\x7e\xb1\xfd\xf2\xdd\xe4\xd7\x6c\x00\xd0\xe6\x75\x41\x02\xf4\xec\x88\xa4\x5c\x39\xe5\xe3\x5c\x60\x6a\x50\x12\x8b\x1d\x0e\x61\x63\x7b\xc5\xeb\xca\x16\xe0\xeb\xb8\xbd\xa2\x66\x08\x0f\xf3\xf7\x03\x87\xbd\x1f\xc2\x77\x2e\x7a\xff\x93\x1b\xff\x9a\x73\x38\x2e\xbb\xb8\x20\x0b\xc2\xd5\xa4\x12\xe9\xa7\x69\x89\x9d\x20\x48\x3f\xce\xe2\x5d\x5c\x3b\xc2\x48\x36\xe2\x79\x83\xf2\x23\x37\xd9\xf1\xe5\x6e\xff\x39\xdf\xe5\xe8\x40\xb4\x38\x5d\x28\x81\xff\x9e\xe3\x81\x79\x9d\x64\x46\x5b\xbe\xec\x21\x19\x57\x98\xed\x02\x22\xe9\x3c\x5c\x67\xb5\xcf\x2f\x7b\xa0\x72\x66\x7e\x84\x4b\x8c\x6c\xca\x43\xfa\x29\xe1\x53\x59\xed\x3f\xba\xdd\x43\x79\x02\xb6\x84\x91\x02\x46\xf4\xda\x83\x05\x07\xa6\xf3\x3d\xd2\xe8\x9a\x0a\xe6\xb3\xc1\x5f\x7f\xa3\x01\xc0\x0e\x3e\xf6\x47\x06\x05\xce\x91\x73\x0e\xef\x2e\x6b\xe5\x10\x46\x20\x83\xee\x01\xdd\x42\xa1\xbf\xa7\x2c\x65\xb7\xc8\xb2\x18\x2a\xb1\x49\x5e\x1d\xbc\x6f\x8a\x7d\xed\x50\xe9\x40\x43\xcf\x6b\x78\xb0\x71\xd0\x40\x32\x9d\x8c\x3f\xc8\xab\x20\x80\x90\x2a\xee\x07\x8c\x00\x9c\x03\x0e\x49\xe1\x18\x90\xda\x8b\x26\x46\xa5\xb4\x5f\xf2\xaf\xfb\x56\xce\x71\x3b\x72\xc0\x40\xa9\x73\x46\xc1\x7d\x63\x68\x60\xc4\xdb\x6c\xbd\xe5\x9d\x77\x5a\xf3\x2b\x5e\x38\x93\xe1\xa7\x66\x0a\x60\x03\xc7\xe6\x94\xcd\x29\x92\xbc\x3d\x34\xdb\x3d\x87\xbf\xac\x7a\xbe\x77\x18\xdf\x2c\x74\xb8\xbf\x8f\xbf\x7a\xcc\xb8\xa9\x56\xff\xe2\xb1\xf3\xc8\x27\xaf\xf8\xeb\xc2\x10\xfa\xbf\xbf\x51\xdd\x7f\xc0\x0b\xee\xd9\xdf\xd1\x30\xd5\xd5\x75\x4f\x1b\xd3\x8d\x7d\x50\x3e\x46\x04\xf6\xcc\x14\xe0\xab\x9a\xba\x9b\x24\x74\x47\x2f\x22\xdd\x35\x04\xb5\xd4\xa9\x43\x4a\x3b\xbe\x1c\x47\x50\xb1\x96\x59\x4f\xfc\x36\x1e\xb6\x95\x04\x5f\xc9\xbc\x0c\x41\xae\xfe\x9d\x8e\x44\xfe\x72\x2d\x99\xd2\x72\xfd\x91\x06\xcf\xce\x44\xce\x93\x60\x40\xfd\x09\x5e\xa8\x93\x3b\x77\xd8\xba\x0b\x18\x38\x97\x93\xb5\x13\x36\x5f\xfc\xcb\xae\xfe\x1e\x86\xf4\x06\xe6\x9d\x4b\x64\xbe\xf5\x94\x52\x1a\xdb\x80\x38\x6e\xaf\x24\x71\x5a\x9e\xf8\x2f\xf3\x7a\x7c\xea\xb0\xdf\xcc\xc8\x40\x89\x40\x45\x58\x19\x94\x39\x2c\x36\x5b\x65\x8f\x8a\xe2\x54\x7f\x11\x5a\xd6\x37\x54\x29\x75\xa5\x26\x25\x98\x50\x3e\x87\xb1\x02\x43\x11\x78\x39\xc6\x2d\xab\x29\x8f\x4d\xaa\xa9\xf2\x83\xc1\x86\xc9\x86\x27\x53\x54\xf8\x9d\xd5\x64\x9d\xc6\xf4\x65\x09\xcc\x81\x71\xca\xfe\x03\x1a\xf1\xb5\xbb\xd1\x01\x8d\x2f\x27\xb0\xe8\xef\x62\xc5\xd7\x67\xf1\x48\xcf\x1a\xd0\x47\xb1\x31\x4a\x67\xdc\xe1\x55\x63\x84\x5e\x63\xe5\xb2\xd7\x44\x66\x43\x10\x61\x9c\x90\xa6\x7a\x18\xd8\x03\x1c\xf5\xf5\xa4\x32\x4f\x67\xfd\x7d\x22\x89\x68\x0a\xa8\x42\x37\xe9\x13\x4f\x81\xe7\xaa\xff\x75\xf1\xa4\x3a\x2d\x57\xa5\x0e\x8b\xf0\x8d\xee\x5f\x9a\x3c\x73\xd8\xb5\xb3\xf3\x90\x1b\x0b\x63\x12\x1f\x5e\x20\x80\x2e\x7c\xc6\xc0\x45\x25\x02\x96\x65\xa8\xa2\x61\x76\x82\x34\x18\xf2\x61\x35\xb2\x79\x3b\x44\x97\x7d\x03\x18\x2f\x77\xec\xff\x3e\x15\x8f\x38\xec\x03\x0e\x03\x95\x73\xcb\x6a\xfb\xe7\xa7\x41\x0d\xe2\x0a\x15\x1a\x28\xdf\x58\x95\x86\xc2\x37\x65\x1a\x2f\x60\x63\xb9\x8f\x9d\x19\xbd\xa0\xc6\x43\x30\xe5\x87\xb5\x7d\xf5\xde\x09\x13\xde\x40\x07\x42\x77\xbc\xff\xf7\xd0\x47\xf4\x5c\x89\xd7\xc7\xe7\xfe\xbd\x60\x09\xf8\x4a\xdc\xbe\x01\x07\xff\x6b\xf0\xb4\xe6\xa0\xc2\x2f\xd7\x4b\x24\x75\x1f\xdb\x29\xbf\x6d\x8e\x8b\xee\xf1\x7b\xf4\xbd\xbd\x99\x3c\x02\x13\x04\xb3\xe0\xcb\xa9\xae\x5b\xed\x43\xf1\xa5\xb8\xd5\xae\xb4\x7d\xb0\xd7\x5a\xcb\x07\x30\xf0\x7b\x15\x14\x02\x12\xb2\x54\x57\x8e\x99\x76\x48\x76\xd9\x4d\xad\x99\xbd\x44\x84\x7a\xf5\x66\xe3\x8f\x8f\x33\x95\xff\x73\xdc\xf7\x12\x21\x02\x89\xa8\xcc\x7d\xd7\x71\x6d\xb9\x12\x1a\xf5\x4c\x5b\x3b\x23\xb4\x11\xf8\x84\xe2\xf5\x82\x12\xfc\x9d\x94\x97\xf8\xd8\x1f\x18\xb5\x8a\x5f\x45\xad\x2c\x84\x54\x1f\xa3\x1e\x56\xd6\xc0\x26\x45\x62\x75\x67\xc4\x43\x69\x56\x4e\xfd\x53\x66\x75\xd9\xb2\xca\xa7\xa0\x39\x23\x00\xca\x5f\x17\x00\x04\xe8\x32\x38\x34\xf5\xa8\x39\x6b\xfa\xd2\x86\xde\xb8\x1a\x43\x65\xdc\xed\xf4\xde\x6a\xf8\x0d\xbe\x8d\x0f\x8c\x7a\x20\xda\x28\xc8\x66\x08\xd4\x80\xbf\x87\x9e\x97\x60\x88\xb6\x3f\x62\x3c\x26\x46\x66\x67\xd0\x72\xd4\xb4\x2f\x3f\x38\xa8\xc5\x37\x11\xfd\x59\x48\x34\x75\xf5\x25\x36\x10\x0e\x2f\xe3\x9a\x85\xdb\x94\x11\xae\xf8\x5d\x56\xc6\xf6\x03\x1e\xe7\x26\x6b\x00\x0b\x78\x7b\x11\xf7\xdc\x6e\x37\xd1\x55\x10\xa2\xa0\x2f\x0d\x90\x02\x3b\x3f\x0d\x71\x05\x6c\x85\x05\x3a\xf4\xec\x1a\x35\x7d\xb7\x26\x3b\x0d\x03\x5f\x30\x5f\x01\x4e\xc8\x10\xcf\x18\x2b\xc0\x6c\x28\x80\xa4\xca\x5e\x1b\x88\x97\x78\xbb\xfd\x89\x06\x55\x46\x8b\xcd\x3c\x1b\x2c\x88\x1e\x34\xc9\x6c\x0a\xe4\x59\x8d\x7a\x91\xea\xf1\xc2\x40\x2b\xff\x23\xed\xf3\x94\xa7\xf0\x8b\xbf\x7c\x52\x32\x51\x3a\x03\xf1\xac\x92\x01\x8d\xc7\xe3\xec\xec\x66\xa3\x6e\xbf\x63\x17\x89\x63\x66\x45\x82\xca\xcb\x26\xa8\xfa\x11\x97\x6f\x3b\x9b\x1d\x3c\x3d\xe1\x1a\xe5\x0d\xb1\xa6\x40\xe3\x67\x0f\x80\x62\x04\x36\xcc\x47\xfe\x8f\xe7\x7f\x02\x1d\xd9\xc5\x05\xbd\x6e\xac\x65\x94\x80\x20\xba\xb2\xc4\x31\x34\x18\x7a\xcb\xdd\x52\x29\x19\x79\x53\xae\xbc\x57\x3c\xac\x0d\xbc\x65\x21\x38\xc7\x21\x54\x3a\xfc\xe7\xa7\xf5\x91\x9a\x2f\x25\x7a\x9a\xb2\xee\x9f\xec\xa4\x8c\x0d\xcd\xc8\x9d\x5e\x1a\x1d\x61\x50\xb6\x17\x51\xa3\xa5\x07\xa9\x6c\x69\x18\x9c\xdc\xaf\x17\x19\x90\x3c\x60\x27\x1d\x98\xc3\xcd\x42\x0b\xc3\x2f\xc7\xae\x41\xe5\x84\x79\xd8\xb0\xbe\xaa\x1d\x0c\x94\x60\xe9\x93\x1a\xa3\x13\x20\x8d\xba\xcc\x88\x89\x66\x46\xbd\x13\x76\x70\xfd\x48\x2c\x3b\xb3\x48\x59\x0e\x2a\xff\x73\x27\xee\x2f\xbb\x45\x86\x04\xd8\x9b\xac\x74\x78\xfb\xcf\x1e\xad\xef\x4f\xd5\x33\x53\xf2\xa0\x3b\xc7\xe3\x1d\x83\x47\x99\x6e\xdf\x75\x18\x9a\xcc\x38\xd2\x05\x00\x60\xc5\x5e\x85\x6f\x06\x4e\x09\x8e\x7a\x8f\x36\x76\x9e\xa6\x60\x99\xc2\xdc\xf9\x2e\xa1\x43\xd9\xe2\x87\xe9\x24\xc6\x6b\xb4\x3c\xdf\x35\xf4\x48\x56\xa8\x1c\x5c\x59\x8d\x65\x3c\xc1\xb0\x58\x80\x10\x5a\xbf\x2e\x30\xdf\xd8\x45\xeb\xde\xb4\xa8\x73\xfb\x4e\x23\x36\x0e\x65\x23\x96\xac\x6b\x78\x09\x91\x79\x09\x9f\x41\x14\x3d\xdf\x40\xa8\x22\x42\x3a\xf1\x14\xa9\x2f\xdc\xa2\x2d\x83\xd8\xbe\xd5\xab\x8a\x54\xc7\xa7\x07\xe7\x5a\xbf\x38\x90\x17\x4e\x2b\xe7\xea\x89\xe8\x5c\xde\x5c\x98\x17\x8f\x39\x43\x9e\x65\x6d\x35\xce\x72\x51\xea\x2b\x48\xb3\x96\xcf\x64\xaa\x0c\x20\x9b\xed\x2c\x27\xac\x96\x8f\x73\xc1\x3a\x5e\x3d\xa5\xff\x77\x6a\x4f\x8e\x51\x9a\x46\x93\x29\xce\xa5\x7c\xd7\xf7\xd8\x99\xa1\x70\x3e\xae\x3d\x0b\xeb\xe8\xc9\x12\x6c\x26\x9d\x7d\x91\xd5\x6e\xa1\xc0\xf8\xf2\xa9\xae\x9e\xe5\x7a\xc6\x3c\x33\x58\xe4\x9c\xdc\xf5\x45\x84\xc7\x92\x65\x28\xd4\x27\xe1\x42\x0a\x28\x83\x36\x63\xd1\x40\x6b\x2b\x89\x9e\xce\x48\x3b\xcb\xcf\x29\x58\x28\xaf\x6c\x4f\x1d\x9b\xa9\xcf\x9c\xcc\x6d\x6a\x8d\x6b\xa6\xb5\x26\x63\x93\x14\xeb\xb8\x28\x2f\x07\x3b\xe6\x1a\x74\x36\xaa\xe6\x08\x03\xfd\xce\xc7\x78\xc9\x98\x21\x62\xda\x23\xba\x0a\x45\xce\xcb\xc0\x10\x74\x83\xbe\xb3\xdf\xd7\xd1\xa3\xb2\x73\xb2\xb5\xa3\x50\x24\x5d\x5c\xe5\x5d\xe3\x6f\x87\xdd\xb0\x7f\x25\x30\xc1\x2e\xa1\xd5\xbf\xdb\x6f\x81\x2d\xf9\xfb\xe9\x13\xe5\x84\x1c\xa7\xdf\xd5\x18\xf4\xc1\x44\x05\xbf\x0c\x5c\xba\x35\x40\x6a\xa7\x5a\xfb\xdc\x8e\xdb\xc2\x23\x22\xe6\x8d\x22\x01\xa7\x75\x7b\xff\x5d\x65\x03\x65\x9f\xbe\x84\x46\xe0\xac\xae\xd8\xa0\xdb\x07\xc7\x1d\x98\x51\x6a\x7d\x3f\xdd\xb6\x53\x04\xb5\xdd\x2b\xcb\xb3\x6c\xf9\x92\x1c\x32\xf7\xd3\x74\x37\xbb\x17\xe9\x8a\xa1\x07\xb7\x16\x49\x68\x3f\x42\xe4\x04\x66\xac\x24\x0f\xf4\xe1\xd6\x9f\xf3\x3b\xc9\xea\xa0\x0c\xf5\x39\x44\x98\xf4\xa8\xcf\xc7\x67\xb5\x79\x37\xb8\xb7\x16\x94\xd8\x66\xdf\xc6\x46\x31\x46\x33\xfe\xaf\x8a\x48\x92\x07\xd9\xac\x3a\x3a\xa8\xc5\x37\x87\x94\xee\xb8\xbb\x37\xf3\xa9\x8c\xca\x8c\x34\xf7\xf5\xfe\x36\x2e\x16\x5e\x6c\x65\x93\xcc\x7f\x1c\x84\x6e\x0b\x4f\x64\x25\xb6\x97\x8d\x2f\x2e\x5f\x3d\x2d\xbb\x9c\x20\xde\xa4\xcf\x31\xcb\xe0\xc8\x60\xcf\xdc\x2b\x5f\x6e\xb6\x90\x7b\x47\x27\x4c\x6f\x60\xc2\x4a\x7b\x5c\x4e\x2c\x48\xde\x17\x30\x15\x8f\x7d\x6a\x35\xdd\x9f\xfd\x05\x61\x3d\xcb\x8f\x5e\x69\x79\xfb\x58\x1b\x14\xfb\xf8\x6b\x59\xca\xa6\x6e\xb1\xf4\x29\xee\x64\xee\x8a\x7d\xac\x7c\x91\xfd\x91\x23\x57\x2e\x4c\xe7\x60\xb4\x6a\x63\x0f\x04\xcb\x09\x46\x7b\xa4\x77\x40\x4c\xfe\x17\x1f\x74\x80\xe2\x13\x7a\xa6\x72\x84\x99\x13\xe4\x66\x34\x77\x87\x6d\xa6\xde\x4a\x7f\x15\xbe\xca\xc7\xe7\x7c\xb2\xe3\x74\x38\x1c\xbe\x51\x0e\x1a\xc5\x7e\x95\x59\xed\xa3\x9b\xd1\x81\xec\xd8\x59\xca\x5e\x09\xcc\xa7\x3d\x06\xfe\xdb\x63\xa4\x54\x26\x4e\x88\x96\x01\x9c\xfa\x55\x90\x48\x77\x99\x34\xd9\x45\x2b\x4d\x91\x9b\x89\x26\x80\xb3\x23\xf6\x7f\xa1\x30\xfa\x47\xd2\xd8\x76\x02\x99\x92\x2d\x78\x2e\x27\xe9\xeb\x66\x74\x69\x74\xbe\xfe\x5c\x97\xe2\x2d\xb3\x5f\x59\x6e\x02\xe7\x2d\x9b\xf4\x1f\x22\x4e\xe3\x5d\xe7\x42\xf9\xf7\x56\xa3\x4a\xaf\xd1\x8a\x0f\xb8\x68\x58\x45\xb2\x9e\xc8\xcc\x92\xcd\xd1\x77\x75\x83\xa3\xd4\xd6\x1a\x9e\x5e\x4b\xc2\x92\x96\xfe\x1d\x0f\xb1\x3f\x4a\x28\x4c\x9c\x92\x37\xa5\x5f\xfb\x2b\x91\xf9\x6c\x68\x2a\x9a\x7c\x17\x66\x25\x25\xca\x40\x23\xfa\x78\x45\x7b\x27\xe8\x81\x70\xde\xb0\xa4\xa9\x9c\x4e\x52\xe5\xe0\x87\xad\x12\x95\x2f\xed\x33\x16\x83\xfa\xd6\x53\x0d\xad\x5b\x81\x50\x6a\xa8\x15\x1b\x1e\xfc\x81\x5a\xe9\x32\xdf\x92\x5d\x7c\x39\xd0\x57\x95\x6c\x23\x57\x55\xbd\xb7\x0b\xfb\xd2\xb3\x61\x65\x26\x78\xe5\x5c\x7e\xcb\xd4\x06\x1a\xa0\xd5\x2a\x41\x86\x58\xf7\xdd\x3e\x4a\x67\x67\xa5\xca\x69\xbd\x04\x51\xad\xf6\xc2\xb1\xaa\x6b\x01\x94\x2a\xe3\x95\xa4\x07\xab\xec\xe0\x5a\xc1\x8e\x89\x36\x00\x4b\xaa\x88\x55\x6e\xbf\x6d\x9c\xaa\x06\x67\xdd\x64\xa9\x48\xa4\x2b\x42\xf9\x33\x11\xf3\x9b\x1c\x96\xaa\x07\xcf\x0a\x56\xa3\xf4\x27\x59\x5e\xa9\xab\x2d\xf6\xd6\x71\x0d\x85\x4b\xec\xce\x57\xe5\x45\x71\x08\x67\xee\x68\x1b\x02\xa2\x82\xe3\x18\xd8\x42\xfa\x7c\x0f\xe4\x00\x29\x01\xac\x8c\xd3\x1e\xfe\xed\xec\xfb\x8e\xe1\xe5\xb9\xd2\x87\x5a\x56\x4c\x19\xb4\xc5\x49\xe0\xd4\x22\xe2\xfa\xcd\x70\x93\x05\x35\x8a\x73\x5c\xa5\x80\x80\xeb\x7b\xb6\xa4\xb0\xea\x5f\xf4\x8f\x80\x3e\xd2\x0f\xbc\xcc\x31\x66\xe9\xab\x67\xe2\xf0\xef\x4f\x80\xd5\xf2\xcc\x7a\xf4\xb5\xc1\x5b\x43\x6a\x19\xa0\x94\x87\xf4\xaa\xe2\x38\x2e\xe8\x32\x71\x51\x38\xa1\xe1\x64\x0e\x07\x2c\x17\xfd\x02\x6b\x1f\x79\x10\x79\x5e\x4a\x51\x67\x2e\x70\x2e\x6f\x0c\x37\x4f\xae\x65\xf9\xc9\x0e\x6f\xee\xaa\xb3\xd3\x1b\x00\xea\xad\x66\x02\x12\x4e\x42\xc3\xda\x20\xd2\x7b\xb7\xa9\x81\x30\xa6\xc9\x71\xa5\x02\x9a\x34\xea\xe5\x73\x2b\x09\x4c\xc8\x66\x41\x8d\x99\xbc\xc8\x96\x45\x82\x2d\x9c\xc5\x60\x11\xee\x9b\x6b\xbe\xce\x4c\x75\x9e\xf5\x2b\xbb\x55\x2d\x9b\x8d\xcf\xf3\x2e\x5f\xa5\x1c\x36\x4e\xb3\x10\xa2\xf2\x69\x75\xbf\xbd\x9b\xf8\x42\x79\xea\x74\xa7\x6c\xe1\xa7\x38\x98\xaa\xe7\x3b\x6d\x26\xb6\xb2\x8d\x93\xfc\xa4\x7c\x61\x10\x69\x3b\xaa\x70\xa9\xe8\xd3\xd8\x08\xf9\xc1\xce\x71\xb1\xef\xfc\xd8\xf2\x3a\x51\xf6\xa0\xe3\xcd\xc0\xe0\x14\x65\x7e\x8e\xc8\x6e\xa8\x3c\xe0\x23\x63\x8b\xf8\xd0\xaa\xd8\x1d\xde\x2e\x53\x89\xf9\x57\x71\x4d\xd1\xe7\xa9\x0d\x0d\xca\xee\x54\xa0\x72\x15\x45\x8e\x2e\xe6\x61\xb9\x91\xc5\xd1\x5d\x14\xf6\x59\x12\xab\x39\x1c\xd3\x10\x1d\xdc\xe4\x5f\x3f\x8c\x39\x60\x7b\x4d\x29\xc4\xed\x3f\x68\x57\x38\x78\x98\x3f\x4a\x81\x0b\x6e\xdd\xd2\x9f\x4e\x5e\x10\xd3\x49\x96\xdc\x64\x77\xa7\x8c\xad\xb6\x50\xa7\x1c\x19\x6d\x53\xbe\xe8\x82\xf6\x3f\x87\xe5\x9d\x6a\x1b\xc5\xf6\xb7\x1a\x1a\x98\xa6\x34\x86\xaf\x01\x6f\xf6\xcd\x0e\x51\xbd\xb2\x51\x90\xc8\xe3\x87\x81\xa7\xc5\xce\xeb\x04\x2b\x80\x6d\x78\xa8\xde\x9f\x10\xfe\x23\x34\xab\x6c\xdd\x09\xba\x3e\x73\xd9\x09\xa9\x81\xf2\x5c\xc0\xcf\x24\x20\xf0\x64\x37\x95\x83\xcc\x74\x81\xe7\x03\xc5\x77\x3a\xad\x83\x01\x0d\x45\x46\x51\xf4\xfb\xe5\x23\xcb\x97\x4d\xc0\xac\x5c\xc6\x63\x97\xcb\x7a\xbb\xe2\xf3\xfc\x84\xa3\xd8\x0f\xcf\xd6\x45\x62\xd0\x9f\xf2\x15\x98\x9c\xf0\x03\x0e\x3b\x25\x34\x7d\x48\x09\x7f\xca\x87\xe3\x3d\xe9\x03\x43\x47\xfd\xc4\x3f\xf8\x61\xe4\x79\x3f\xca\x4c\x1d\xdb\x15\x2c\x50\x5b\x14\xf2\x0e\x62\x34\xaa\x75\x70\x22\xf6\x1f\x7c\xca\xf6\xb2\x71\x72\x9e\x47\xa8\x6d\x8e\x1a\xe9\x32\x2a\x2e\x8c\x23\x90\x36\x34\xa2\x3c\x22\xb0\x37\xb9\xd2\x69\x98\xb6\xeb\x7e\xf8\xa6\x5b\x4c\x23\xe7\x0e\x97\xf0\xa3\x9b\x91\x7a\x7d\xaa\x67\xea\xd8\xe1\x8c\x01\xb6\xc1\xef\x14\xa3\x32\xb3\xb4\x72\x79\x2a\x8f\x68\x24\xc6\x20\xd3\x1d\xb7\xe7\x26\xa3\xc4\x47\x39\xdb\x04\x05\x30\xac\x91\x40\xd9\x59\xfe\x87\x5b\xff\x6b\xf0\xd4\x5c\xb3\xc0\xb4\xad\x7c\xe1\x9e\x10\x61\xee\x11\x20\x5a\x37\xa9\x13\x59\xce\xe5\xa7\x50\xb1\xb2\xe7\x79\x8c\x21\xb2\x51\xb0\x23\x65\x33\xaa\x5a\x1f\x88\xf5\x90\xf0\xb4\x2c\x10\xf6\x9a\x44\x49\xf3\x50\x16\xdf\x43\xa5\xb5\x74\x39\x18\xb7\x93\xcc\x66\x1e\xac\xb3\x5b\x69\x0c\x01\xec\x0d\x3a\x91\x31\x0c\xc7\xea\x47\xe8\x68\xca\xde\xf1\x19\xa3\xad\x97\xb3\xd4\xd2\x85\xbd\xd6\x23\xcc\x6f\x19\xfb\xb8\xea\xeb\x18\x4a\xd5\x09\x1f\x18\x94\x7f\x74\xc5\xb7\x91\x7e\xb8\xe2\xdf\x98\xd0\xb8\xf7\xcd\xa9\xb0\x12\xc4\x35\x1a\x64\x8b\x09\x08\x16\x51\xba\x91\x30\x67\x0c\xf5\xe3\x60\x36\xf9\x20\x7e\xc5\x00\x93\x65\x41\x70\x69\xf7\x3d\xdb\x36\x06\xd7\x4b\x09\x8d\x1c\x00\x7d\xd1\xa0\x37\x55\xe9\x0e\xde\x30\x31\xa7\x72\x1e\x2c\x17\x34\xa6\xde\x98\xc6\x43\x1f\x78\x5b\xd9\x60\xde\xf9\x7d\xf2\xa9\x39\xf8\x49\xf7\xa8\x1d\x94\x15\xa5\xbb\x22\x5d\xf2\x3e\x55\x13\x93\xfb\x94\x62\x57\x72\x1f\x8f\xbf\x01\xdd\x09\x49\x71\xc6\x2b\x12\xeb\x3e\x06\x0f\x10\x53\xf3\x9c\xaa\x39\xd4\xbd\x5c\x55\x9c\x46\xef\x94\x1c\xca\x18\x6a\x9a\xd8\xa6\xba\x3b\x64\xe7\x9e\x42\xf7\x50\xae\x85\xff\x9d\x29\x19\x5b\x73\xad\x46\x60\xcd\x00\x18\x0d\xa2\x76\x9b\x3c\xe1\x20\x3c\xa1\xaa\x04\xb1\xff\x05\x16\xb5\x4b\x7d\xf3\x10\x43\x0c\x86\x4f\x92\xd7\x50\x55\x13\xce\xfb\x38\xdd\x38\x90\xb3\xbf\xfe\x09\x7a\x3d\xed\xa1\xb5\x11\x9f\xb9\x5f\xb6\x24\xa9\x7e\x99\xb3\xce\xf1\x16\xe1\x90\x7f\xbe\xaf\xcb\xef\x88\x81\x04\x7b\xe2\x41\xae\x26\x5f\x79\x5e\xab\x2d\x54\xd3\xd7\x5a\xa9\xec\x67\x35\x89\xd0\x11\x5c\x30\x18\x56\x38\x8f\xc6\xdf\x51\x7f\x64\x8e\xe4\xf4\xb1\x34\x67\xaa\x25\x6f\xd9\x66\xbb\xae\xc2\x64\xcd\xf7\xd0\x0a\xde\x6b\xf9\x20\xfe\x25\x0d\x11\x1b\x09\x55\x08\xf3\x1a\xb7\x8f\x0d\xf9\xb7\xfe\xd7\x2e\x53\x11\xbf\x16\xd1\x93\x37\x03\x67\xbe\xb7\x9c\x8d\x32\x7b\xca\xad\x6e\x9a\x51\x66\x16\xdd\xf8\x82\x7d\xaa\x30\xb4\xaf\x70\x00\x3c\x11\xa6\xbf\x15\x0f\x3b\xa2\xe5\xdb\x41\xd0\x7a\x49\x0e\x81\xbc\x6d\xf9\x65\x10\xae\x14\x31\x9f\xfa\x94\x72\xd0\x8d\x9e\x06\xe9\x48\x85\x8d\xa3\x36\x78\x80\xe2\xfc\x62\xd0\xbd\x6c\x01\xc8\xad\xbe\x01\x97\x52\x43\x21\xe4\xe4\x2e\x09\xe2\x02\x61\xf2\x48\xf5\x19\x04\xe7\xfc\xcf\xf7\x55\x68\x84\x60\x82\xbc\xb9\x19\xae\xc3\x80\xd1\x5e\xe1\xc1\xd1\x45\x31\xd5\x21\x5e\xc3\xdf\x31\x68\x99\xc1\xba\xb2\xba\xc8\xcf\xb3\xa5\x66\x87\x04\xec\xc3\x21\x05\xd0\x01\x4b\xc1\x04\xcb\x23\xdd\xfa\xcd\xf4\x32\xc8\xf2\x81\x0c\xb2\xf4\xa2\x77\xb7\xa5\x31\x4a\x1e\x91\xab\xe3\xc7\x9a\x1d\x18\xff\x6e\xb9\xe4\xdf\x54\xdf\x76\x6e\x94\x77\x40\x5e\x2c\xbb\x12\xaf\xbe\x4b\xf7\x7b\xd9\x81\x0a\x64\x29\xdb\xce\xdd\x46\x58\xbb\x53\x21\xcf\x95\xea\xef\xf6\x54\x94\x5a\xe0\x81\xc4\x76\xce\x1f\x22\x42\x56\xe6\x03\xf3\x7b\x3a\x9e\x80\xd9\x09\x86\xcd\x20\x87\x72\xd4\x26\x62\x3a\x03\xfa\x7a\xc1\x68\x8d\xa3\x73\xab\xda\xa5\x45\xad\x33\x8c\xf6\xba\x55\x84\x85\x16\xcc\x87\x38\x5c\xd8\x95\x0e\x84\x0f\xfb\x6a\x5f\x76\x3e\xaa\xf2\x23\xbb\x68\x5d\x72\x24\xcc\x8d\x61\xb1\xc5\xbe\x81\x89\x2f\x12\x1e\xed\x4a\xa7\xe1\x01\xec\x04\x5e\xc6\xf2\xae\x58\x6f\x0a\xc0\x9c\xc1\x28\x31\xd8\x11\xa3\xa5\x6a\x9b\x66\x99\x34\xd4\x67\x57\x4a\x8e\x34\x46\xf5\x9d\x4f\x86\xbe\xa1\x30\xea\xdb\x2b\x7d\x14\x96\x8a\x4a\x05\x68\xb3\xb7\x02\x61\x08\xd8\x4e\x67\x7f\x48\x70\x84\x1e\xb9\xef\x63\x0c\x43\x17\xc3\x29\x02\xc5\x5a\xf1\x2f\xdb\x29\x55\xb5\xd1\x31\x86\x14\x0f\xa4\x4b\x46\xc5\x95\x01\x69\xb3\x30\xde\xe8\x37\x01\x7d\x96\x4d\x3d\xc4\xce\xc6\x55\xfd\x96\x0b\x3a\x86\xbb\xb5\x5e\x65\xb1\x5d\xb5\xbd\x69\x1f\xe9\x08\x54\xef\x2c\x4b\xf4\xe4\xbd\x01\xd4\x48\x69\xb3\xa4\xc9\x56\x5e\xe1\xeb\xd5\x3e\x02\xfc\xab\x72\xa3\x6e\x1c\x22\x45\x94\x2e\x5e\xdc\x2a\xb7\x69\xc9\xab\x50\x45\x6e\x99\xdb\x34\xb7\x4c\xa8\xe5\x78\xca\x52\xd2\xb7\x57\x7f\xb2\x4d\x8d\xd9\x1f\xcd\x87\x8b\x75\xa4\x86\x42\x19\x2b\x50\xea\x2b\x37\xbd\x89\x04\xe7\x26\x34\xd7\x0d\x1c\xd4\x25\x52\x9a\xa6\xd5\xe2\xa4\x72\x7d\x08\x36\xdb\xb2\x76\xee\xcd\x96\x0c\xf6\xd9\xbc\xa5\x29\x45\xa0\x96\x91\x26\xe7\x70\x04\xcb\xd0\x6f\x09\xfc\xca\x43\xff\x99\x3d\x14\xba\x37\x9d\x71\x12\x63\xd8\xf0\xd6\xa6\x8c\x54\x13\x85\x22\x18\x71\xa4\xbb\xd6\x70\x32\x74\xc1\x96\xe3\x38\x9b\xda\xde\x8c\x03\xf7\x65\x80\xfa\x9c\x7c\x51\xd6\xa5\xbb\x61\x33\xa4\xef\xc5\x00\x04\x44\x4b\x1f\x9b\x68\x40\x36\x7d\x40\xa2\x65\x7b\xc0\x0b\xac\x29\x3b\x93\x37\x9d\x05\x9a\xbe\xda\x86\x85\xf9\x02\x0c\xc4\x96\xd1\x39\xa6\x21\x7e\x4a\x7f\x49\x9f\x29\xed\x0f\xbf\x53\x6c\x62\x9c\xc2\xdc\x54\x2a\x6c\x53\xfd\x3a\x9b\xf4\x23\xcb\xb0\x61\x10\xd3\xbe\x49\xd5\x1a\xec\x2d\xb7\xae\xb7\x92\x15\xca\x1e\x1f\xa2\xa3\x8f\x87\x73\x59\x7a\x8c\x77\x1d\xc0\xc7\x6e\x46\xfe\x46\x67\x57\x5c\xc0\xd3\xfe\xd8\x0c\xea\x69\x42\x2b\xb7\x7a\x6f\xa4\x77\xf3\x76\x5e\x55\x23\xd4\xe4\x68\x6c\xff\x1f\x73\xa0\x5f\xcb\x32\xa2\xab\x21\xc0\x6c\xd1\x64\x8f\xcc\x8a\x6c\x5f\x85\x04\x1e\xba\x11\xbe\xff\xc0\x66\x73\xe4\x78\x96\x82\x69\x1c\xce\x6b\x1c\x02\x27\xfc\x12\xb1\x4c\x60\xf2\xdd\x3a\x43\x6c\x17\xfd\x03\xb1\x14\xc7\x11\x4f\xe8\xe8\xe3\x52\x4f\xdb\xd4\x89\x0c\x9b\xca\x84\x80\x9b\xe6\x23\xd7\xbf\xd4\x94\x29\x2e\x68\x9b\x7f\x11\x26\xf3\x07\x9c\x9f\x33\x3d\x90\x36\xeb\x98\xd2\x9f\xe2\x2b\xca\xce\xdf\xbb\x10\x58\x92\x09\xd2\x2a\xb3\xf8\x50\x51\x31\x6a\x99\x38\x48\x21\xb4\x7e\xe7\xb2\x84\xbc\x25\xd8\x7f\xbb\x27\xfa\xa6\x82\x06\xa7\x90\x8e\xca\xc9\x1e\xd1\xa9\xe5\x5d\x2c\xe1\x47\x06\x5c\xd5\x49\xaa\x79\x95\x73\x19\xc9\x99\xda\xa1\x71\xcc\x78\xf6\xbe\x33\x26\x37\x5a\xf5\x51\x46\xed\x43\xdd\xa1\x37\x1a\xdb\x06\xea\xfa\x7e\x6a\xb9\x75\xbf\x49\x15\xf5\x4f\xb2\xa8\xf2\x6b\x08\x37\xec\x45\x22\xd4\x10\xce\xd7\x1c\x26\x7a\xfe\x40\x81\x54\xa3\x34\x2e\x31\xd2\x3b\x85\x4a\xe7\x8d\x32\x83\x3f\x35\x82\x3a\xb3\x14\x55\x01\x00\xa6\x2e\x24\x57\x56\xd1\xbc\x8c\x7d\xbc\xc6\x0d\xb9\x26\xc2\xee\xf8\x86\x5f\x0e\xe7\x00\x57\x58\x59\xd6\x18\xca\x7c\x8c\x31\xd4\x9b\x06\x8d\x1f\xd5\x84\x39\x1a\xc9\x55\xbb\xee\xb5\xa9\xc8\xab\x6f\xcb\x77\x98\x2d\xbb\x9a\x81\x2f\xdc\xe8\x6f\xc6\x50\x0f\x28\x2c\xf9\xd6\x31\x8b\x79\x71\x2b\x2b\x6a\x36\x02\x5a\x96\xd4\x47\x7a\x56\x04\x0d\xc9\x04\x81\xc5\x6d\xa7\x1f\xbc\x69\x0e\x39\x97\x1a\x77\x07\x57\x34\x41\x01\xe7\x72\x41\x79\x43\xee\xfc\x8c\xee\xac\xf8\xdd\x5c\xf1\x3b\xa8\xb4\xf2\xb7\x64\x8b\x6f\x6f\x09\xf1\xb0\x96\x47\xc2\x7c\xd4\x0f\x57\x54\x11\x13\x8c\xdf\xe0\xf1\xc6\x96\x92\xea\xad\x73\xa1\x06\x8a\xf5\x3f\x51\x2a\x65\x1e\xc2\x02\x33\xe2\x66\x81\x0a\x39\x3a\xef\x80\xeb\x96\x3a\x7e\x07\xa4\x18\xa3\xe3\xb8\x41\x20\x68\x7a\xc9\xc1\x22\x90\xc6\xce\x6b\x95\xf0\x83\x0c\x30\x83\x54\x65\x58\x6a\xe1\x1c\x63\xce\xf8\x65\x32\x1a\x92\x90\x8d\x03\xe2\x61\xdc\x7e\x53\x89\x2d\x02\x6b\xc4\x31\x8b\x23\xb5\x1a\x00\xe8\xa1\x2a\xe5\x93\xcb\xfa\x27\x33\xb5\x87\x35\x59\x0f\x9b\x4c\x13\xb3\xb3\xb7\x15\xa5\xea\xbc\xed\x17\x97\x1e\xff\xb1\x63\xe3\x71\x64\x9c\x21\x36\x44\xef\xa1\x54\x66\x72\x8e\x2b\xbf\x75\xd9\xc4\x72\x24\xf4\x21\xd4\x5d\xfb\x75\xc0\x65\x76\xff\xe0\x27\x90\x4b\x56\x5c\xd1\xbb\xdc\x03\x39\xea\x25\x9c\x3a\x03\x81\xa3\xe2\xcb\x88\x0f\x7d\xda\x22\x54\x02\x2e\x0f\x01\xf6\x21\xde\x45\xe2\xaf\x96\xb1\x7e\x04\x4c\xce\x86\xe1\x68\x1e\x1b\xe2\xf5\x0b\x35\x10\xc6\xa8\x0f\xc1\x34\x12\xeb\xb9\xbe\xd6\xeb\x72\xb0\x66\x89\xc0\x5c\x7b\xa3\xfd\x32\x47\xf8\xc8\x66\x7b\x3b\x79\x61\x0f\x96\xb1\x1d\x34\x11\x9f\x2e\xc5\x57\x45\x6f\x0e\xf5\xf1\xe2\x7e\x57\x0b\x65\x30\x70\x7a\x85\xa6\x2c\x19\x55\x61\x16\x6f\xc0\x58\x08\xac\x38\x57\x8f\x0c\x46\x1e\xc9\x1c\x38\xf9\xca\xed\x1a\xd5\xe6\xc3\xbe\x96\x42\x7b\x5f\xc5\x47\x66\xde\x49\x45\x05\xb9\xdd\xc0\x37\x1a\x7a\x25\xa1\x80\x57\xd2\xc3\xbe\x86\xc5\x40\x19\x89\x63\x0f\x2b\xba\xd1\xd1\xb9\x5a\x5f\xf6\x7c\x3f\xdc\xa9\xd8\x73\xb0\x9b\xf6\x9c\xd6\x86\x29\xfd\xfb\x62\x3a\xd3\x3e\x33\xc3\xc5\x7f\x07\x4c\xd8\xc0\x5a\xed\x46\x50\xd0\xe4\xe7\x5d\x0e\xd0\x1c\xc1\x1b\x94\xa3\x27\xec\x52\xa5\x55\x7b\xd2\x07\xd9\xa7\x8e\x83\x8b\x3b\x8d\x47\xf6\xd0\xa4\x48\x9b\x5e\x84\x13\x24\x52\x33\xe8\x45\x99\x5a\x60\x85\x51\x60\x52\x96\xa6\x64\x13\xc7\x0f\xf3\xb1\x0f\xb4\xa2\xfd\x08\xc2\xe2\x0a\x23\x86\x67\xcc\xc1\xd9\x18\x9b\xf6\xcb\x4e\x66\xef\x4d\xc5\xdf\x61\x7b\xe6\xf3\x48\xf5\xb2\x55\x69\x43\x80\x0d\x7b\x8d\x68\xa7\x31\x9d\xf3\x55\x60\xfe\x1b\x11\xd0\xed\x76\x2a\x2d\x1f\x26\x75\x8a\x8f\x01\x79\xf1\x34\x00\x08\xaa\xf8\xa1\x4c\x21\x1d\x8f\xd0\x74\x3b\x6f\xa5\xdc\xbb\x3c\xad\xe6\x0b\x56\xca\x8e\x06\x17\x6f\xcd\xdb\xdb\x95\x5e\x58\x6e\x46\x83\xb4\x69\x7a\x45\xbe\x40\x19\xcf\x70\x20\x98\x14\xeb\x72\xef\x69\x28\xc3\x71\xbb\x31\x40\xe9\x46\x79\x9a\x74\xa2\x5b\x18\xea\x6d\x27\x99\x60\x72\xa9\x13\x3a\x78\x0e\xa1\x1c\xcb\x47\xf8\xd5\xed\x8f\x2a\x54\x2b\xab\xb6\x76\x7d\xc0\xb5\x0c\x1f\xc6\xc9\xc3\x88\x8f\x07\xfb\x58\x10\x77\x13\x33\xd8\x10\x05\x1d\xfe\x51\xf4\xb3\x0b\x27\x6f\x5a\xaa\x9d\x86\xfd\x0e\x05\x7b\x61\x2d\x01\x5e\xa1\x3b\x77\x5f\x9d\x5b\x4f\xef\x3c\x8e\x10\x0d\x34\x7a\xbc\xba\x16\x08\x18\xd2\xf7\xf6\xc7\x77\xf4\xf2\xcb\x2f\xe1\x00\x99\x50\x44\x13\x37\x14\x0a\x38\x80\x27\xc2\xd1\x7d\xfa\x8a\x78\xee\x00\x81\xe8\xa1\x5d\x0d\xaa\xa6\x0b\xbe\x34\x7d\x3d\x93\xe6\x05\x6d\x6d\x84\x89\x8d\xff\x7d\x7c\x5b\x4e\x3f\x7e\x51\xb6\x96\xa9\xc0\x60\xc8\xe2\x96\x2b\x23\x66\x0c\x79\xdc\x9d\xb1\xd5\xb1\x43\x80\xa1\xc5\xe7\x26\x95\x5c\x75\x0a\x2f\x3f\xe1\xc3\xa2\xb3\x7c\x54\xe6\x01\x94\x6d\xa5\x22\x11\xa7\xad\x1c\x80\xf0\xeb\xfb\x21\xbc\xe9\xcf\x7a\x60\x83\xc5\x32\x26\x19\x62\xf2\x41\xf9\x3a\x0c\x19\xde\x7b\x23\x81\xf9\x4a\x6f\xce\xad\x88\x64\x80\x07\x7b\xab\x70\xf1\xf5\x87\x5f\x6a\x19\xaf\xf6\xd6\x2b\x5f\x1c\xda\x91\x7e\x04\x7a\x0d\x66\xca\xae\x71\x42\xa1\x0c\x2e\x73\xec\x79\x05\xbb\xac\x6b\x20\x8e\xf9\x2b\xe1\x25\xab\xe2\x20\xbf\x31\x4b\x12\x08\x23\x14\x6c\x71\x88\xc3\x4d\xa7\xa3\x55\x26\x07\x86\x60\x42\xf5\x05\xb1\x4e\xe9\x63\xe4\x0b\xc3\xfa\xa2\x93\x57\x1b\x68\xeb\xf4\x22\xc9\x67\xce\x8a\xcd\x43\xd9\x5a\x3f\x39\xde\x03\x7f\x1c\x17\xf7\xb7\x80\x64\x56\xb9\x5e\x55\xdc\xc5\x71\x79\x87\x5c\xef\x29\xa3\x7b\x6a\x90\xac\x9b\x53\x77\xc0\x90\xe4\x06\xe1\x93\x53\x66\x96\xc5\x6f\x06\x6d\x3c\x81\xb9\x7d\xff\x0a\x39\x5d\x08\x3b\x90\x4b\x6d\x17\xc0\xe4\x8e\x2b\xf4\x8f\x6e\xea\x62\xf8\x15\xc0\xe3\xa6\xcd\x0a\x46\xa2\xd7\xd8\xb5\xcc\x18\xbc\x81\xb7\xaa\x4c\xd3\xb2\x3c\x60\xd0\x50\x79\xf3\x92\x3f\xe2\xe8\xd1\x4f\x4c\x59\xfe\xf8\x0e\xd9\x34\x0a\xc1\x2c\x87\xdf\xec\x2c\x5a\x01\x86\xef\x1c\xe0\x4d\xcd\x38\x40\x37\x2d\x81\x2b\xc3\x20\xf7\x52\xc1\x5c\xea\x80\x49\x9b\xc0\x8c\x24\x8b\x25\x1c\x5a\xec\x1d\xc8\xcb\x1e\x26\x06\x63\x05\x26\x2a\x1f\x8a\x8b\x15\x4e\x3c\x1e\xa0\xaf\x47\x1c\x14\xce\x0b\x7a\x60\x23\x98\xbb\xd7\xb8\x87\x60\x5b\x17\x6a\xfe\x27\x69\x9d\x03\x71\x8c\x23\xd7\x43\x8e\xe7\x26\xfc\x00\xcf\x66\xb4\xc0\xef\x3f\xf9\x0e\xcc\xd6\x96\x26\x50\xff\x71\xd8\xd9\x9f\xb0\xc9\xf6\x89\x5f\xfa\x35\x62\xc5\x17\x80\xbd\x0d\x4e\xe7\x6c\xc4\x95\xbd\x85\x52\x1f\x18\x3f\x25\x61\xd0\xc3\xc7\xc9\xdb\x6d\x7d\x44\x28\xce\x84\xcf\x2a\x63\xb8\xf9\x6c\x79\xf5\x7e\xab\xc0\x31\x6e\x5c\x3b\xc1\x16\x70\xa8\xfc\x83\x72\x24\x92\xda\x8c\x32\xe9\xa8\xc8\x69\xd9\x4a\x48\x11\x88\x61\x90\xad\xa4\xdc\xab\xce\xf0\x38\xc4\x1a\xb2\xf4\xda\x22\xe0\x38\x4d\x6d\x5d\xae\x51\x54\xce\xc2\x6c\xe6\x71\x71\x98\x4e\xd9\x1c\xbc\x39\x28\x67\x11\xdf\x2e\x3b\xf6\x5a\xcd\x80\xb4\x36\x46\x24\x6a\x1a\x37\x9f\xce\x0d\xa0\x75\x81\x53\x5c\xbf\x8e\x88\xef\x3d\x34\x60\x33\xa7\x4f\x56\x34\xf6\xef\x48\x81\x8c\x30\x58\x9b\x3f\x28\x65\xc7\x43\xe8\x35\x35\xbd\xcd\xe8\x0f\xf1\xd6\xa2\xa8\x19\x38\x79\x20\xb0\x88\xe3\xd6\xa8\xcc\x07\x72\x9e\x93\xca\x50\x77\xfe\xe4\x00\x6e\x47\x49\x07\xcb\x2f\x37\x24\xcb\xfb\x18\x72\x26\x90\x54\xd2\x87\x72\x33\xee\x61\xc2\x39\x55\xc2\xc6\x84\xd0\x26\xde\x86\x05\xd4\x14\xbe\x98\x97\x0f\x0c\xf2\x79\x76\xde\x76\x35\xbc\x87\x66\x88\x37\x62\xb0\x87\x2d\x92\xa7\xf1\xda\xd2\xe2\xe2\x6a\x42\x7f\x84\x88\xa2\x69\xe4\x0f\x3b\x8d\xff\x64\x4a\x38\x5c\x9e\x0f\x13\xe2\x3d\x3f\xdf\xc2\x43\x7e\x51\x53\x5a\x3b\x9a\x09\x03\xe1\xbf\x0c\x62\x9f\x79\x85\xa5\xa0\xe1\x58\x16\x4c\xcf\x65\xf4\xa4\x8d\xdd\x5c\xf4\x19\x9f\x63\xb7\x68\x37\x52\xde\x45\xde\x25\xe7\x7a\xda\x62\xe4\x89\xd2\x18\x7f\xfb\x29\x35\xdf\x64\x5f\x42\xbe\xc3\x1f\x95\x46\x3f\x39\x92\x7e\x7e\xca\xfb\x71\x0c\xd4\x4f\x4f\x85\xd3\x4f\x39\xf7\x46\x56\xa6\x3f\xa9\xfd\x1f\x43\xaa\x6d\x5a\x58\x2e\x1c\x76\x6f\x46\x84\xe0\x54\x35\x22\x3c\xef\x08\xf1\x39\x9b\x67\xd7\x10\x5c\xd7\x2b\x5f\x47\x89\xe3\x69\xf2\xc1\x56\x49\x2f\x11\x5a\x51\xdd\x0e\xf3\x54\x3d\x09\x77\x9c\xe0\x4e\xeb\xd9\xb1\xea\xaf\x11\x53\x5e\xd6\x2d\xc7\x97\x3f\x52\x85\x6e\x99\x7d\xa1\x7f\xfd\x0e\xca\x8d\xdd\xa4\x75\x47\xbf\x1f\xd7\x3f\x72\x77\x58\x30\x68\xba\xaf\xb1\x3b\x63\x12\x64\xf8\xcf\x52\xf9\x0c\xe3\x12\x79\x18\x56\x3a\x2e\xb0\x16\x73\x16\x12\xc3\xcd\xf7\xea\x17\x87\x43\x74\x9d\x1f\xdc\xde\x5a\x65\x99\xce\xc1\xf1\x8c\x23\x96\xfc\x32\x73\xb7\x01\x09\x6b\xab\xe0\xa3\x6c\x78\x61\x84\x6b\xe6\x72\x25\x0a\x85\xb1\xa2\x3f\x21\x60\x10\x61\xc5\x43\xbc\x09\xe5\xc9\x8e\xff\xc8\x3f\x51\x48\x90\xb8\xa5\x88\x4f\x67\x71\x1f\xfe\x8b\x1b\xb1\x71\xb7\xc6\x78\x07\xfd\xd5\xf9\x8d\xf0\xb0\xfe\x24\x0f\x58\x28\x54\x04\xb9\x73\x48\x50\xa4\x08\xc5\x1f\xb4\xd5\x7a\x64\xcd\xe5\x8f\x4c\xa5\x21\xff\x34\x56\xca\xe1\x63\x5c\xc2\x79\xd1\xad\xcb\x0b\x5a\xfe\x51\x04\x3b\x66\x2c\x36\x55\x68\xd5\x68\x6a\xcc\xa3\x6c\x1a\xe1\x81\x38\x0a\x67\x26\xaf\x00\xa6\xd6\xf4\x9d\x7d\xf4\xe3\xe2\xe0\xa1\x25\x2b\x74\x9d\xef\x70\x90\x29\xc7\x70\x02\xa3\x29\x33\x28\xef\xdb\xb2\x2c\x28\xca\x80\x80\x2d\x5a\x33\xd6\x48\x20\xe2\x25\x2c\x24\xcb\xa9\xb3\xab\xbe\x24\x62\xac\xe4\xf4\x5b\xb5\x71\x14\xdb\x92\x0f\x2c\x2b\xb5\x1e\x97\xa1\x8e\xe3\x5d\x53\xcf\x7e\x53\x55\xe3\x0d\x68\x8a\x6b\x17\x08\xa7\x75\xe2\xd7\xcc\xbe\x05\xef\x97\x63\x33\xdd\x86\x52\x69\xea\x46\x47\x47\xff\xec\x4d\xfb\x1b\xd2\x36\xe4\xcf\x14\xe8\x72\x07\x2f\x35\x8f\x85\x17\x0e\x48\x1b\xe0\xed\x14\xe1\xee\xc9\x19\xc4\x65\x60\x13\x6c\x8c\x0c\xcf\x9e\xa2\x07\xa3\x45\x28\x48\x1a\xdf\x7c\xc8\x3a\x61\x39\xb1\x54\x87\xc8\x4e\x9b\xff\xbb\x8d\x71\x35\x2e\xc5\xf3\x78\x68\x49\x02\x03\xe2\xd4\xf7\xcb\x20\x46\xe9\x35\xb3\xbb\xea\x77\xd8\x0b\x4b\xd2\x99\xd8\x02\xbe\x4f\x39\x3c\x46\xee\x98\x01\x75\x6b\x9d\xe6\x68\xc6\xe2\xee\x83\xfb\x58\xbf\xea\xbb\xff\xe9\x71\x3a\xaa\xaa\x13\xb8\xa1\xa4\xa5\xb1\xb5\xbf\xd7\x24\x0a\x8e\x2a\x1a\x7d\x58\xcb\xca\xaf\x87\x03\x62\x60\xd6\x81\x4a\xb6\x59\x91\xe9\xc4\x32\xc2\x62\x4f\x43\xd2\xd3\xe7\x1a\x1b\xbb\xa5\x70\xd3\x12\xca\x97\x45\x95\x48\x2c\xa8\x49\xef\x67\x3b\x71\x8f\x5c\x76\xfb\x49\x3c\x76\x06\xb7\x0a\x5e\x7e\x19\x09\x87\x47\x9a\xef\x4a\xe1\x55\x82\x5c\x3b\xde\x05\x25\xe5\x33\xa0\x66\x21\x4c\x82\x96\x07\x4a\xbe\x75\x02\xf5\xaa\x13\xba\x53\x2c\x29\x02\x93\xe7\xf2\x76\xa6\x7e\x77\x86\xab\x7f\xb7\x89\xaf\x03\x6b\xc7\x48\x92\x0f\xd8\x19\x5a\x4f\xce\xa6\x1d\xd2\x4f\x22\xad\x5d\x46\x4f\xe5\x66\x5b\x74\x55\x76\x5e\x1c\xbb\xf8\x79\xbb\xb2\x4a\xea\xa1\x7a\xe9\xf8\x47\xcb\xcf\x52\xf6\x40\x01\x9b\x51\x77\x39\x7e\xcd\x5d\x44\x7d\x19\x97\xa3\x3f\xfb\x55\x9d\x3c\x85\x40\xa2\x50\x75\xf6\x8e\x28\x6a\x8f\x2b\x9b\x1e\x72\x1b\xce\xc8\x97\xe0\xd2\x78\xae\x9f\x2f\x5f\xe0\xe8\x7f\x7b\x96\xf6\x2c\x5a\xca\x9f\x2d\xbc\x81\xcb\x78\xaa\x51\xfa\x7d\x82\x96\x59\xdf\x54\xd9\x59\x2a\xbd\x09\x00\xc1\xc9\xe5\xac\xfd\x2c\xc7\xc3\x59\x70\xad\xe6\x16\x04\xce\x93\x1f\xd7\x6e\x70\xe3\x94\xbf\x63\x86\x44\x30\x02\xe9\x47\x51\xc0\xf0\xe1\x95\x37\xdf\x77\x52\x5e\xa2\xf5\x33\x69\x74\xe1\x5e\xf9\x93\xc3\xfa\x10\x18\x6e\x78\x16\x9e\x6b\x7d\xc0\x89\xc5\x12\xe6\xdd\xdb\x75\x78\xef\xc7\xcb\x05\x12\xb1\x57\xd7\x41\xad\x9d\xdb\xbc\x5e\xde\x90\x15\x77\x8d\xac\x10\xe2\xb1\x9f\x1c\xfe\x8f\xe7\xa5\x9c\xf4\x81\xc6\xca\x12\x8f\x87\xd1\x3c\xdb\x2f\xb4\x20\x71\x5f\x59\x6b\xe5\xe8\xa7\x8f\x85\x16\xea\x4d\xb7\x6b\x84\xb5\xc6\xdd\x33\x5b\x02\x55\xad\xd9\x87\x93\x63\x05\xfb\x80\xad\x86\x78\x55\xe0\xea\x05\xb5\x0a\xa7\x46\x0b\xcc\xd8\xad\x20\x56\x0e\xbb\xce\x38\x6d\xfb\xdc\x6b\xa2\x74\x9b\x89\x85\x41\xb2\x79\xd8\x46\xae\x9d\xbc\x62\x91\x90\x64\x79\x66\xbf\xb9\x23\xdb\x96\x89\x09\x6d\x8f\x52\x54\x36\xa3\x11\xd8\x7d\x8f\x36\x08\x6c\x20\x63\x45\x84\xfd\x23\x17\xd8\xf6\xa1\x4e\x69\xb9\x1d\x06\x61\xb0\x28\xf9\x77\xe3\x15\x12\x74\x5a\x6d\xde\xd2\x99\x29\x94\x9d\x63\x38\x29\xb6\x0f\x2b\xf2\xbe\x7d\x22\xf5\xf8\x1a\x49\x55\xf6\x37\xcf\x9a\xe8\xaf\xf2\xcb\x3f\x2c\x0d\x2d\xf8\x8a\x8c\x40\xf5\x9d\xe5\x37\x33\x22\xbb\xfb\x22\x83\x7e\xb3\xac\xfb\x3a\x2f\xd3\x36\x85\x9d\x32\xe0\x5b\x0f\x10\x08\x2b\xa4\x16\x65\x09\x7f\x3d\x88\xe2\x26\xc3\xc0\x1c\x6a\x14\xb2\xce\xb2\x89\x2e\x9b\x10\x8f\xcb\x5a\xad\x3f\x83\x59\xde\xb3\x5b\xea\x04\xa7\xfd\x1a\x1a\xb2\xdd\x1b\x69\xed\xe0\x22\x99\xce\x72\x35\x58\xf8\xb9\x94\x85\x4c\xa2\xc7\xb3\x94\x33\x82\x54\xcf\xee\xdd\x8f\xbb\x05\xa1\xa1\x1d\x68\x4e\x39\x95\xc0\x56\x72\x89\xae\x16\xd3\xff\x27\xf9\x48\x52\x65\x20\x43\xc8\x13\x17\x29\x5f\x3f\x1f\xec\xa8\x22\x16\xc9\x00\x28\x21\x5f\xbd\xc1\xdc\xb1\xe1\xde\x4c\x67\x85\x9e\xa7\xb0\x08\x91\x2f\xa4\x92\xa6\xa6\x60\xa8\x52\xfc\x59\x93\x98\xb0\xdf\x11\xd0\x0a\xac\x37\x22\x4e\x1b\x90\xf8\x0e\x8d\x42\x80\x19\x31\x8f\x52\x7b\x6a\x04\x69\x8b\xc1\xde\xc0\xa0\x7b\x4c\x46\x22\x3d\x34\x80\xd6\xaa\x46\x74\xa0\xc7\x77\xc5\x80\x05\xe0\xf6\x83\x2c\x9d\x01\xee\x5a\xc1\xa9\x9c\xfb\x26\x31\xf1\x5b\x78\x2e\x59\x9c\x65\x71\x41\x27\xfd\x3f\x68\xef\xae\x03\x9f\x14\xb4\xa0\x6c\xcf\xfe\x7b\xdc\x79\xec\x07\x40\x9b\x37\xe4\x4b\x1e\xaa\x7b\xcb\x32\x5b\x47\x72\x9a\x72\xa2\x54\xe0\xcd\x50\x0f\x13\xff\x2c\x45\x42\x4d\x5c\xa2\xf0\x82\x30\xea\xc9\x30\x1c\xa1\xc4\x74\x29\x57\x16\x14\xa8\x25\x01\x1d\xdb\xaf\x2a\x1d\x0e\x68\xa9\xea\x50\xe3\xc0\xc7\x58\xae\x33\x01\xd0\x5b\x39\x39\xec\x1e\x82\xcf\xf9\xd2\x69\x9b\xb6\x6c\xa9\xe8\x9c\x1d\x2f\x05\x4c\xc4\x7a\x48\xb4\xc4\x30\x03\xd4\x03\x63\xd6\xe8\xee\xf0\xc1\x65\x37\xd4\x4a\xe7\x0a\x96\x0b\x6f\x05\xfb\x2e\x8b\x40\xea\x00\x9f\x8d\x06\x03\x6a\x7e\x1b\x6b\xee\x48\xf5\x0c\xe0\x19\xe6\x0c\x5e\x59\x52\xd8\x02\x25\x93\x38\xd3\x5c\x6d\x5b\xe0\x80\xd1\xd5\x68\x2d\x5c\x5a\xfc\xa0\x50\x94\xfa\x33\xe3\x5b\x8f\x18\xac\x3b\xfe\xcf\x51\x9b\x1f\x01\x12\x19\x66\xad\x3c\x40\xb4\x37\x17\xdb\x84\xd2\x45\x33\x68\x55\x80\xab\xbd\xb7\x29\xcb\x22\x2d\x7c\x52\x77\x49\xb5\xca\x2e\x67\x3d\x97\x98\xe6\x53\x2b\x32\x79\x6a\xe4\xcf\xe4\x17\x64\x70\x96\xa2\xb3\x6a\x75\xfd\x37\x96\xf5\x87\x7f\xe6\x48\xf7\x95\x25\x8d\x6f\xfa\x73\x4e\xfd\xa1\x99\xfc\x53\xd6\xc2\xee\xe3\x24\xad\x05\x4c\x4b\x0d\x9d\xc9\xf5\x2b\x55\x02\x34\xa5\x4f\x63\xdc\xd1\xa1\x7d\xe7\xa8\x3c\xde\x57\x40\x3c\x5c\x3a\x77\xdd\x76\xb3\x9d\x76\xdf\x63\x67\x3c\xe5\xfd\xa8\xab\x22\xe0\x6b\xbd\x60\x6f\xd5\x0b\x24\x02\xc6\xc9\xfb\xb2\x21\xb7\x1d\x35\xe3\xb5\x60\x03\x5a\x0f\xee\xe2\x81\x73\xdc\x18\x85\x46\xfb\x92\xe7\xc2\x3b\x2d\x11\xc0\x55\x5e\xde\xaf\x30\xea\x2f\xb1\x1b\x7e\xa7\xa4\x3b\x12\xdb\x96\x2f\xc3\x18\x2f\x5b\xa2\x44\x3b\x03\xcc\xa9\xbe\x4c\x6b\x1e\x03\x8c\xf0\xfd\x4b\xa0\x9e\x02\x9d\x25\x1a\x7c\xd5\xa4\x27\x85\x69\x09\xdb\x95\x32\xfb\xfc\x72\xdb\x2f\xfb\x06\xf9\x53\x9d\x6b\x17\xd7\x10\x90\x64\xd8\x33\x06\xd8\xcc\xf4\xf2\xa7\xd1\x61\xb0\x37\xbf\x80\xe8\xa7\xb0\x5f\x7b\xc2\xf8\x20\x4f\xdd\x85\x1f\xef\xe3\xf6\xad\x13\x8d\x7f\x0e\x63\xcb\x92\xca\x19\xa5\xbd\x16\x8d\x83\x3d\x15\x50\x25\xda\xa7\xaa\x4b\x4d\x4d\x9e\x15\x7b\x7f\xde\xd9\xad\x3a\x3e\x46\x5d\x11\xaa\xc2\xd7\x81\xa9\x68\xc8\x42\x7f\x7b\xf1\x2a\x0e\xf4\xe8\x09\xc4\x82\x16\x7c\x68\x20\x51\xe8\x39\x2f\xf2\xea\x14\xe5\x16\x68\xa4\xb1\x15\x62\xd2\xa9\x93\x23\x3d\x6d\x74\x5b\x0e\x46\x4b\x18\x14\xf2\xe1\xbc\xaf\x3e\x59\x63\x9a\x64\x8d\xdd\xc5\x81\x8d\xd0\x38\xfe\x8a\x6c\x47\x14\xd8\x92\xe2\x7a\x3e\xa2\xe7\x5b\x06\xed\x03\x21\x4f\xba\x57\x02\x9f\x23\x4f\x65\xa6\x16\xd8\x8c\x7f\x48\x23\x55\x44\xb4\x27\x0d\x4f\x52\x45\x97\xa1\xe4\x6d\x4c\x1a\x85\x35\xc8\xeb\x4a\xdf\x04\xf8\xac\x5b\x75\x4f\x0f\xcc\xa4\x83\x92\xb2\x0f\xb0\x6f\x78\x6d\x1c\x69\xfb\x13\x5b\xeb\x28\x7b\x00\x3d\xb1\xb2\xfe\x40\x65\x4b\xc8\xf6\x15\x86\x8e\x1f\xb5\x45\xc0\x35\x1e\xb5\x7f\xca\x24\xf8\x99\x8d\x67\x7e\x16\xec\x82\x16\x83\xb8\x9f\x79\x85\x7a\x29\x74\xa7\xb0\xda\x8b\x0d\xd7\xfe\x61\xc8\x93\x00\x68\x64\x8b\x45\x43\x6f\x87\x38\x1b\x4e\x96\x18\x97\x5f\x2e\xa8\x7b\x10\x9c\xc6\x3e\x88\x8a\xd3\xf5\x52\x99\x2e\x46\x19\xaa\xf8\x54\x63\x2e\xdd\x1c\x96\xeb\x19\x56\x7f\x1c\x77\x36\x37\x25\x70\x6d\xe4\xf9\x5c\x1d\xb8\x4c\x64\x7a\x35\x38\x8c\xfc\x54\xf9\x97\x05\x36\xdd\x5e\x49\x65\x40\x8e\x25\x43\x44\xd6\x9b\x04\x91\x47\xb5\xff\xe5\x2a\xab\xfb\x46\x2b\x73\x20\xc1\xd5\x3d\x64\xc2\x5b\x9f\x3a\x09\x74\x46\x1a\x59\xb5\x73\xa7\xbd\xa9\x46\xbb\xc3\xbd\x90\x76\x18\x88\x28\xc7\x81\x3a\x67\x6b\x73\x57\x8b\x45\x99\x4a\x85\x6e\xb1\x03\xd9\xd6\xc8\xf2\x81\xf5\xa9\xa6\xa6\x3d\x97\xe9\x8a\x0f\xce\xe1\x25\x5b\x96\xd1\x2a\x6b\xc4\x92\x6a\x03\xcf\x05\x5b\xad\xce\x23\xde\x54\xf1\xc2\xbe\x8c\xc0\x2f\xf9\x8c\x25\x29\xcd\xa4\x0c\x9e\xbd\xa3\x8f\x77\x88\x93\xfc\xc1\x67\x60\x0b\x65\xdf\xa7\xdf\x8e\xa9\x6a\x7e\x91\xa9\x9a\x8a\x97\xa1\xfa\x9a\xfb\x94\xe5\x60\xb4\xd3\x17\xe8\xc1\x82\x14\xd8\x76\x40\xdb\xc2\x66\x10\xb0\x36\xc7\x48\x7f\x22\xd7\xca\x71\x8a\x3b\x14\x9e\x81\x4e\x77\x6c\x61\x6a\xa8\xf8\xc9\xdb\xff\x39\x4e\xcd\x0a\xd5\x71\x7d\x6f\xc2\x01\xe9\x96\xca\x0f\xf3\x60\x04\x8a\x1c\x56\xfb\xc6\xfa\xda\x07\x8c\x4f\x96\x80\xb7\xcb\x9d\x8f\x64\xe5\xef\x23\x88\xf3\x40\xb4\x23\x18\xed\xdc\x5e\x02\xa9\x21\xd2\x53\x05\x0b\x47\x3c\xa5\x8a\xa3\xaf\x6f\x41\x2a\x75\x46\x02\xb9\xd3\x6f\x8e\xa8\xa8\x3d\xbd\x4b\x71\xc1\x77\x95\x5e\xa3\xe6\xa4\x1d\x2d\x45\xbe\x8e\x94\xaa\x7a\x81\xc4\x93\xc2\x62\xd5\xa5\x6b\x92\xf1\xe8\xc8\x3d\xdb\xff\xad\xda\xf9\x6c\xf9\x93\xa2\x0b\xe2\x5c\x34\x09\x3a\x19\xf5\xd1\xa8\x49\x40\xf9\xea\xe2\x81\x70\xe2\xb2\x09\x08\x74\x7a\xac\xf7\x71\x49\xd9\xc6\x7b\x4d\x3a\x7b\x55\x8f\x2b\xa5\xa6\xd5\xdc\x32\x04\x45\x6d\x6a\x98\x10\x5e\x1e\xdb\x8a\x0e\xef\x6e\x42\x21\x40\x6d\x7a\xc5\x2b\xed\x55\xc0\xba\xb7\xe1\xb2\x8d\x40\x85\x80\x1e\xca\x18\x51\x5f\x01\x03\x0b\xbc\xfa\xd3\xeb\x2f\x56\x96\x55\xba\x50\x19\xe4\xd7\xa5\x90\x55\x17\x1a\x02\x04\x5f\xff\x5b\x4f\xa5\x95\xb1\x6b\x89\x88\x3c\x9c\x2d\x43\x85\xd9\xa0\x1e\x0a\xd3\xc4\x4d\x6f\xa7\x3d\x2d\xcc\x15\xbb\x75\xaf\xe3\x7f\x31\x5c\xda\xb1\x7e\x39\xce\x60\x0b\xd9\x2d\x0f\x77\x7f\x30\xc4\x0b\x5c\xe8\xf6\xe5\x06\x86\x83\x3e\x1c\x68\x9b\x78\x87\xe8\xca\xa7\xe8\xac\x7e\x65\xcb\xc1\x6d\x51\x9f\x3c\xad\x26\x2a\x42\xfd\x3a\x09\xbe\x2e\x4f\x80\x9a\x80\x5f\x6b\x79\xfe\x83\xfd\xd0\xf5\x33\xcc\x01\x69\x57\x8d\x83\x36\x7a\xb1\xab\x93\xdb\xab\x2c\x4f\x78\x06\xaf\x20\x3a\xdc\x88\x48\x5f\xfc\x49\xba\xba\xee\x15\xee\xf6\x2d\xa0\x91\xda\xdb\x0f\xc1\x6c\x3d\x52\xd9\x42\x55\x8f\x45\xb9\x9b\x30\x09\x2a\xb5\x7e\xa5\xb8\x05\xf7\x5e\xd6\x22\xc4\xb7\xfd\x94\x24\xc0\x1b\x2d\x6b\x03\xd5\xfb\x51\xe7\x4f\xb4\xd3\x83\x02\xb0\xa2\x97\xb0\xc4\x40\xf7\xa4\xa8\x4c\x6d\xff\xea\x51\x13\x77\x1a\xc7\xc6\x76\x9e\xcf\x1c\xc3\xfc\xac\x8c\x82\x2c\xb9\x8e\xff\x53\x61\x04\xa3\xfd\xd6\xfc\xbb\x75\x0c\xa3\x43\x06\x39\x0c\x82\xb4\x07\x14\x22\x7e\xac\x6e\x20\xc2\x95\x01\xc5\x8a\xcd\xc1\x1c\x1c\xa5\xc0\xa9\xf5\x97\xed\xc7\x78\x3f\xf0\x6a\xdf\xb2\x85\x6f\xe0\xfa\x40\xaa\x90\x95\xb7\x0a\xa1\xc2\xd4\xe4\xdf\xa0\xaf\xfa\x5b\x29\xff\xa0\x2d\xab\xa4\x81\xaa\xa6\x2d\x5f\x98\x3e\xcd\x65\x5a\xb4\x42\xc6\xc7\xa9\x06\xfe\x05\x92\xf1\x84\xb5\xbb\x1e\x0a\x8b\xf0\x88\x1f\x93\x0e\x97\x83\x69\xd7\x43\xa3\x9b\x0b\x59\x6e\xc5\xa8\x89\x69\x7b\x8c\x64\x58\x0f\xfd\x65\x96\xab\xd3\xf5\x1e\x18\xd9\x89\x1e\xec\xb0\x94\xcd\x51\xe7\x80\x81\x69\xf6\x40\x19\xea\x8b\xcd\xe7\x48\x3e\x72\x46\x5c\x30\xbf\x87\xec\x20\x50\xe4\xeb\xf1\x57\x65\xdf\x4c\x77\xb5\xa5\x7e\xf1\xaf\x08\x98\x1a\xd0\x50\x60\xd6\x97\x71\x58\x0e\x6f\x0a\x1d\xf4\xf5\x09\x2a\x46\xf2\x3f\xd0\x78\x84\x67\x2f\xf2\xbf\xc9\xff\x1e\x4c\x8a\xc4\x13\x96\xcf\x14\x38\x75\xbe\xd2\x6e\x17\x68\xce\x26\x67\x5b\xb0\x5a\xd2\xb6\x0c\xbd\xd2\xee\x76\x81\xd9\x42\xb3\xf5\x3f\x0d\xd1\xfa\xd1\x06\x69\x61\x1c\xbc\x12\xf9\xf8\x0b\x32\x7a\x4f\xe2\x63\x87\xc4\x2e\xfd\x79\xf9\xd3\x3e\x1f\x79\x73\xcc\x06\x7d\x6b\x19\x00\xa1\xf7\x96\xaa\x30\xdd\xf9\x79\x1c\xe9\x9f\x4c\x3c\x53\x96\x7f\x3a\x99\xe7\x4f\x39\x2b\x9f\x31\x30\xdf\x20\x90\x67\x13\xf9\x88\x91\x2f\x5f\xfe\xb5\xa7\xdb\x71\xc2\xc9\x2d\xc6\x99\x4d\xdd\x9b\xf3\x72\xce\x97\x30\x82\x98\x79\xf2\xce\x11\xb1\x3f\xa5\x60\xb8\x49\x82\x6c\xa4\xdb\x2a\xdc\x71\xcf\xc3\x67\x89\x8b\xe4\x5b\x81\x1c\xc8\x3a\x50\x1a\x95\xd3\x08\x5b\xf3\xb6\x6f\x1e\x67\x3f\xa1\x3b\x14\xa1\x4a\x01\x32\x57\x57\x3e\xb4\xd2\x21\xe7\x7e\x48\xb1\xe8\xce\x6e\xae\x0b\xfc\x8e\x7f\xa1\x4f\x91\xb2\xc6\xa1\xc0\xec\xe8\x80\x96\x45\xe2\xd4\x4d\xd9\x05\x4c\x46\xad\x4b\xa1\x58\x7e\xa3\xd9\xe3\x49\xee\x28\x90\xf5\x23\x82\x52\x43\x20\x55\xa3\x6c\x1a\xc3\x43\xd7\xff\x1c\x66\x77\x23\x2f\xd0\x23\xfb\x25\xd1\x24\xfc\x49\x52\x1a\x93\x22\x33\x9d\x93\x1a\xfc\xd3\xf9\x04\xeb\x91\x40\xb9\x74\xc6\x86\xbf\x5f\xbd\xf7\x72\x10\x2d\xfb\xe7\x98\x72\xf8\x2c\x4f\x65\x3d\xda\xd8\x9f\x9e\xca\x7c\x64\x28\x82\xd9\x5c\x1a\x04\x53\x20\xdc\xcf\x70\x1b\x1d\xb7\xf2\x6f\x9c\xb4\x83\xb1\x06\x79\x16\x0f\x7d\xea\xc7\x3d\xb8\x79\x53\x3a\x59\x2e\xdd\x1c\xc0\xa7\x5b\x7b\x6e\xfa\x1b\x99\x52\x14\xe2\x53\xd2\xa9\xf3\x2c\x2b\x0f\x31\xec\xb2\x87\x98\xe0\xa6\xb3\xbf\xa5\xe6\x7e\xe6\xfd\x23\x6e\xeb\xf3\x01\x87\xd1\x1b\x85\xc8\xfa\xee\x9f\x96\x55\x3d\xfd\xd0\xb2\x23\x9f\x38\xa1\xfc\xd0\x69\x58\xf0\xf6\x89\x08\x35\xae\xdd\x65\x38\x3a\x03\xf9\x87\x42\x79\x41\xe1\x79\x72\xec\xd3\x8f\x34\xab\x3f\xc0\xeb\xc7\x56\xa0\xf8\xa6\x9e\x17\xdc\xc4\xb4\xca\xfe\x54\xd5\x0a\x80\x6f\xed\xa4\x81\x7b\x7f\x87\xe5\x05\xd4\x6d\x84\x5a\xd4\x59\x3f\x72\x1f\xd7\x51\x23\x6d\x4f\x0c\x87\xd3\xf8\x54\xf7\x0b\x6b\xb6\xcd\xef\x9d\xc0\x47\xbc\x6e\xff\x0b\xff\x83\x2b\xbd\x0f\x8e\xa8\x61\x08\xdc\x7d\xd1\x50\x05\x4b\x97\xc3\x80\xa4\x9d\xed\xe7\x7f\x21\x8e\x6e\x55\xc1\xac\xa9\x14\xc0\xfb\x12\xbc\xde\x72\x90\x84\x9b\x37\x5b\x48\x95\x19\x9a\x1c\xfa\xe6\x2f\x03\x92\x4b\xd4\x1c\xe9\x81\x61\x81\x3a\xfa\x0a\x85\x9c\x80\xec\x82\x51\xfa\x86\x87\xe2\xb8\xa1\x6b\x2e\x2f\xb3\xd8\x27\x58\xdd\x1b\x38\xff\xfe\xf3\x60\xd5\x0f\x01\x25\x73\x40\xd0\xb9\x33\x06\x1d\x66\x45\x0f\x1a\xf5\xda\x35\xb8\x9c\xc7\x65\x4f\x72\x24\x3b\x0e\x33\xfd\xf0\x26\x04\x5a\x30\xf2\x21\xd3\x05\xf6\xce\x85\x30\xef\xce\x5d\x05\x88\x8f\x42\x52\x43\x8b\x5f\x01\x40\xc7\x35\xfd\xe8\xcd\x58\x63\x7c\xa0\x2f\x89\x47\x2a\x2b\xc0\x5d\x0a\x65\xed\x44\x1e\xc9\xb6\xc1\x5b\xac\x4d\x65\x88\x56\xb6\x86\x4b\x37\x38\x10\x11\x3d\xbd\x36\x68\x06\x38\x1a\xdf\x21\xf6\x79\x80\x19\x4e\x80\xbc\x36\xf1\x10\xda\x50\x87\xdd\x4f\xb9\x29\xf3\x63\xea\xdb\x8b\x83\x36\x20\x90\x81\x80\x16\x48\xd4\x44\xbe\xd1\x56\x17\xb4\x7c\x26\xea\x26\x6c\x7c\x3a\xa8\xc4\xbe\x90\x67\x1e\x1b\x15\x1f\x97\xfa\xe9\xca\xc1\x9c\x47\x3d\x62\x84\x7c\xb2\xf5\xbd\x9e\xf2\x07\x10\xf5\x47\x81\xe6\xfd\xe7\x7a\x56\xd9\x0e\x4c\x55\x7f\x1d\x26\xc6\x59\xca\xe2\x01\x5a\x65\xaa\xb7\x27\x41\xe8\xe5\xc5\x3e\xec\xfd\x53\x09\xd1\x87\x20\x65\xd0\xde\x63\x20\x83\x54\xe8\xf7\x9f\x5d\x1a\x87\xca\xd6\x1e\xd2\x19\x77\x1d\x01\x84\xbb\xa5\x74\x77\xde\xe4\xfd\x7c\xda\xad\x38\xcf\xb4\x47\xb8\x6f\x97\x9e\xfd\x5e\xbe\x15\x4e\xfd\xf7\x0c\x1d\x25\x17\xda\x7b\x39\xdb\xb4\xe4\x43\x8b\x1d\x6b\xf7\x1d\x7b\x0e\x09\xa9\xcb\x5c\xfa\x16\x5f\x11\xc3\x47\xc4\x22\x2e\x7f\xbc\x19\xf5\x18\x25\x2e\x32\xfe\x90\xc0\xf8\x34\x2e\x15\x10\x1f\xc3\x29\xe5\x3e\x56\x20\xbb\xfc\x86\xf7\x90\x86\x8f\xd8\xf8\x6b\x9b\x04\x24\xbc\xee\xa6\xef\xf2\x30\xd2\xfd\x5d\x24\x95\x72\x0d\x71\xb7\x1b\xfe\x10\x30\xba\xaa\xcf\x00\xd7\x51\x9c\xb0\x7b\x0f\xe7\x09\xa3\xf9\x1c\xeb\x6b\xe9\x0d\xc4\xa7\x17\x66\x9a\x48\x55\xb4\xdf\xdc\x3d\xc1\xf0\xa0\xd7\x28\x39\xb4\x15\x26\x60\x7a\x4d\x44\x2a\x2e\xb1\x93\xea\x7f\x1d\xee\xfc\x75\x20\x50\xfb\xb7\x54\x4d\x75\xd8\xaf\x81\xc1\x43\x97\xe6\xbd\x5a\xff\xab\x1b\x2b\xbe\x8d\xac\xb3\xd8\x44\xec\x7d\x10\xe3\xfa\xe5\xef\xc3\xdf\xa8\x2f\xb3\xaf\x45\xdf\x6f\x6f\x39\xd1\x0e\x0d\xf1\x72\x79\x53\xb4\x8e\xd5\xfd\xd0\xad\x54\xc1\xf7\x80\x13\x53\xff\xd8\x12\x24\xa8\x7e\x1e\x05\xc4\x43\xe3\xa3\x3b\x90\xc6\x15\xcf\x99\x43\xf2\x5d\xe5\xfe\xd6\x7a\xeb\x93\x96\x45\x8c\xf4\xf9\xfe\xb1\xfd\x3f\x57\xdf\xb6\xe5\xaa\xce\x33\xfb\x2e\xb9\xe9\x9b\xfd\x52\x06\x1c\xa0\x03\x98\x8f\x43\x32\xe9\xa7\xdf\x2a\x55\xc9\x64\xfd\x73\xad\x31\x90\x09\x49\x68\x02\xb6\x25\xd7\xc1\x7e\xd9\x41\x57\xc6\x13\x13\x3d\x04\xdd\x35\xe9\x2e\xea\x5c\x6f\x8d\xb4\xe3\x33\x64\xf8\xba\x28\xb9\x74\xee\xa3\xa2\x9d\x10\x3d\xc2\xb6\x50\xfd\xd7\x66\x33\x10\xb7\xa0\xe9\x54\x17\x66\xaa\x5d\x89\xed\x66\xf3\x4d\xbe\xb4\xfa\x75\xf5\x70\x76\x5d\xb9\x58\x38\x97\x88\x0d\x96\xf5\x4b\xf5\x70\x74\x0f\xa6\x4a\xf9\x3e\xc8\x7b\x08\xdf\x46\xbe\xcf\xfe\xec\x0f\xd7\xe4\x77\x37\x4e\x7e\x88\xe7\x0d\x54\x64\x65\x87\x27\x99\x12\x20\x5c\x9d\x2a\xae\x8f\xa4\x0d\x4a\x65\x7e\x43\x0e\xc4\xa3\xf0\xd5\xee\xf4\xfb\x75\x23\x68\x8f\xfa\x74\x5f\x9e\x74\xce\xf3\x98\x62\xf1\x13\x90\x00\x4a\xd1\x8b\xbe\xad\xd5\x7d\x0d\xb0\x8c\xc7\x5e\x1d\x6a\x57\x61\xea\x50\x61\x9e\x58\x1d\x47\x48\xf8\x30\x69\xe9\xd9\x2b\x14\xfc\x98\xa7\x8d\x6e\x21\xbc\xdc\x96\xd8\xdb\xa4\x5b\xab\x39\xb1\x57\xe8\x30\xe7\xf3\xed\xca\xde\xb3\x4b\xb3\x2a\xaa\x16\x05\xd0\x20\x8d\xfb\x25\xf2\x76\x47\x3a\x5c\xf7\x53\xb2\xbc\x0e\x5a\xa7\xca\x08\x65\xb0\xe9\x86\x80\xf1\x3e\x5f\xe4\xdd\xd0\xd2\x0d\x14\xaa\xcc\xb7\xb9\xe0\x66\x23\x19\x83\xbc\x0a\x7e\x60\x93\x13\x2d\x7b\x39\x56\x60\xbb\xd8\xb5\x79\x43\xab\xe9\x5b\xe0\xf0\xd9\x5a\x6e\xdb\xc8\xb5\x9a\x45\x5a\xfa\x5a\x0e\x45\x42\x11\x10\x21\x53\xa1\x06\xa5\x42\x01\x9c\x0c\xc7\x90\x62\xaf\x15\x2f\x00\xf4\x40\x1b\x4e\x94\x0e\x1f\xe8\x6e\xc9\x67\xfb\x75\x26\x31\xe9\x49\xde\xfe\x72\xa7\xb4\xce\xef\x56\x61\x83\x06\xf4\xd9\x86\x07\x65\x17\x00\x34\x97\x86\x9e\xbf\x98\xe2\x33\x7d\x35\xf4\x75\xf3\x2c\x1f\x18\xb7\x8b\xac\x3b\x6f\xa7\xca\xb0\xc4\xb3\xa8\x39\x83\x12\x1e\x4e\x91\x32\x7f\x2c\xc2\x0b\x30\x57\x6f\x03\xb7\xde\x86\x72\x14\x70\x01\x5a\xa6\x1f\x1d\xd3\xcd\x45\x7f\x9b\x43\x48\x5e\xda\xa6\x28\xbb\x82\xb9\xae\xf9\x8f\xcc\x9d\x2c\x00\xb9\x9a\xcb\xff\x23\x96\x8b\x3c\x42\xb7\xc7\x40\x3f\xd8\x90\x33\xb9\xde\x39\xf4\xbc\x3c\x8c\x17\x63\x39\x02\x58\x02\x51\xc6\x87\x2a\xd8\xec\x02\xcf\x12\x74\x46\x77\xac\x9c\x94\x0d\xb1\x6d\x5c\xf2\x79\x92\x9b\x24\xca\x0a\xda\xbb\x55\xb8\x47\x72\x7f\x8e\xda\x50\xca\x82\x3a\x66\x3f\xbe\x05\x3b\x80\xdb\xa4\x64\xc5\xe0\x38\xe9\x9b\xf5\x88\xfc\xbd\xf5\xf9\x06\x61\x09\x98\x4e\xa1\x27\x7a\xed\x6a\x06\xbf\xdc\xa2\x2e\xd4\xa8\x7d\x89\xd4\x23\xac\xb9\x27\xd9\x5f\xda\x44\xde\x7f\xa8\x84\xc5\x7b\x5f\xd6\x86\x24\xa5\xd6\xc3\xb1\x56\xc0\xed\x22\xb9\x68\xae\x51\x9f\xb1\x8a\xd1\x54\xab\x5b\xd0\xc4\xb1\x40\xc8\xa5\x71\x14\x9e\xb9\x74\xed\xac\x34\x5f\x1c\x0f\xe4\x47\x03\x8a\x4d\xe0\xe7\x9b\x2d\x5c\x7f\x6c\x1e\xfc\xd1\x56\x7c\x6e\x24\x3a\xa4\x84\x40\x64\x5a\x48\x06\xdc\xfe\x02\x1b\x9c\x01\x43\x38\xb5\x30\xdb\x94\x9d\x5e\x76\xf6\xb7\x08\xd3\xd6\x4c\x67\x96\x2f\x82\xb3\xc9\xb5\xc0\xd0\xd8\x7d\x47\x90\x83\x3d\xb7\x49\x35\x55\x98\x73\xb1\x0b\x07\x51\xd1\xf7\x10\x02\xdc\xe4\xac\x85\x6b\xeb\x39\x9a\xb3\x67\xd4\x9e\x54\x6e\x6f\xc4\xa7\x69\x00\x41\x14\xab\xfb\xaf\x94\x17\x89\xdd\xd7\x47\x45\xe4\x26\xbd\x6f\x09\xe8\x5d\x03\xbc\xac\x2a\xab\xf8\xf3\xe6\x00\x17\x72\xc8\xb7\x99\x0b\x7a\x16\xf5\x81\x1d\x08\xdc\x40\x22\x74\xbe\x49\xac\x11\x34\x20\x55\x7b\xc1\xa1\x41\x29\xda\x45\xb7\xd3\x8b\x78\x85\x97\xde\x0b\xea\xb4\x9c\x36\x53\x5b\x91\x09\xed\x6b\x95\xbc\x25\xad\x2f\x43\xc3\x13\x69\xe6\x34\x92\xb0\x7d\x48\x4c\x82\x8d\xad\xb4\x9a\xe5\x20\xbf\x22\xa2\x00\xec\x60\x5f\xc3\xde\x03\xe2\x01\x32\x3a\x79\xfb\x96\xd2\xd7\xa5\x75\x74\x5f\xa3\x64\xa7\xd7\xe1\xfa\x77\xab\x2d\xef\x43\xa0\x37\xec\x09\x22\x04\xc7\xeb\x67\x7c\x72\xd2\x26\x54\x00\x5d\x52\x7d\x00\xfc\x17\xd6\x55\xae\x7f\x3b\x54\xdc\x2d\x9a\x36\x38\xf8\x75\x81\x56\x35\x94\xb3\xf9\xed\xcb\x15\x3a\xd4\xb4\x24\x96\x62\xb5\x5e\xc4\x9a\xb9\x0f\x69\x4a\xbf\x5d\xc1\x3a\x56\xd0\x20\x49\x2d\x04\xbf\x5d\xe0\xed\x8c\xc2\x49\x02\x56\x80\x00\x01\xd7\x26\xd1\x29\x58\x2f\xbc\xdc\x0d\xc7\xa9\x2a\x4c\xfc\x88\x2a\xdc\x91\xc6\x0d\xa5\x55\x9e\xd7\x28\xfa\xbb\x4d\xfb\xe9\x3b\xc0\x3f\x02\x2a\xb7\xa8\xd5\x71\xf6\x9a\x9e\x36\xd3\x5e\x14\x8d\x5e\x9f\x48\x36\x54\x0a\xb1\xf0\x55\x64\xb6\x5f\x19\x89\x3a\x25\xa7\x15\x7b\xd8\x9e\x73\x48\x50\x42\xb0\x1a\x88\xd4\x9a\x5d\xa7\xe6\x82\x4f\xad\x47\xee\x41\x8c\xa3\xfe\x46\x97\x14\xbe\x38\xe7\xb8\x4a\x19\xbc\xb4\x76\xcd\x0e\x70\xba\xc2\xa9\xf5\xb2\x5b\x6e\x1f\x2c\xef\xb6\xf8\x73\x72\xfd\xea\xb3\x8d\xf2\x4c\x07\x59\x9e\x03\x1f\x26\xf7\xb3\x2c\x40\xad\x7b\xe3\x93\xe0\x4c\x79\x59\x33\x01\x60\xb0\x8e\x3e\x3d\x73\x3f\xd0\x7f\x0a\xb8\x06\x03\xad\x6a\xad\xfe\xfb\x7c\xfd\x21\xb3\xd0\xc0\x1e\x8c\xa1\xcd\xee\xf2\xd5\x01\x43\x60\xe6\xf6\x51\x25\x0a\x5b\xbd\x94\x34\xb7\x70\xcc\x01\xe9\xf0\x07\x1d\x77\x3f\xb7\xff\xf6\x27\x91\x3f\x00\x71\x7b\x5f\xa6\xf5\x38\x7c\x1b\x81\x36\x70\x9e\xba\xa5\xb7\xce\x65\xc7\x72\x9b\xff\x1e\xef\x32\xbd\xf6\x4f\xea\xfd\xaf\x7d\x8f\x7f\x0b\xf5\x43\xde\x23\x34\x56\x76\x46\x63\xa0\xf2\xdc\x7d\x54\x13\x59\xa2\x0f\xe0\x4f\xce\xe4\x13\x56\x74\x2a\xeb\xbd\x69\x2a\xa2\x08\x6c\x4b\xc6\xc4\xe4\xbd\xf3\x30\xfa\x5a\x25\xe2\x74\x0d\xa7\xf0\x0b\x17\x37\x1c\x18\xde\xf1\x2d\xc9\x2e\x7a\x61\xd4\x8d\x4c\xea\xcf\xd3\x97\x47\x4f\x18\x5d\xf6\xc4\x32\x08\x6c\x72\x42\xbf\x92\x43\xa9\xa5\xd8\x81\x36\x40\x65\x30\x60\x05\xa3\x63\x29\x26\x21\x17\xc6\x50\xa1\xa9\x7b\x64\x5d\xce\x37\x52\x17\xa8\x36\xdc\xcc\xf4\x94\x48\x37\x99\xf2\x4b\xc4\xad\x9e\x8c\x73\x69\xc3\x2b\xc0\x19\xf2\x9b\xe8\xf2\x96\x2f\xee\x0f\x42\x16\x1c\x14\x70\xee\xac\xae\x40\xd9\x5a\x65\x8c\x03\x00\x7c\xe1\x11\x2e\xae\xc9\x1d\xee\xd9\xc6\xd5\x78\x87\x25\xf0\x55\x16\xf7\x6d\xeb\x43\x9b\xf6\xb5\x5a\x11\xc5\x02\xb6\x3e\x25\x2b\x6f\x26\x68\x41\xb9\xb9\xf5\x62\x76\x87\xc8\x75\xd5\x0d\x55\x29\x28\x48\x0c\x83\xb4\xf9\xbd\x81\x62\x50\xc5\x34\x70\xfa\x72\x58\xa7\x26\xbf\x61\x54\x57\x77\xf8\xff\x3f\x82\x8a\xcf\x1f\xff\xc0\x53\xe4\xa0\x08\xa4\xc6\xab\x86\xfc\xc3\x26\x5c\xdc\x42\xbb\x46\xaa\x01\x70\x0c\xf5\x7e\x0e\xd6\xf8\x1a\xf7\x8e\x71\xb5\xfd\xfa\x9b\x85\x7c\x70\x05\xee\x86\xd3\x95\x83\x86\xdb\x07\xcc\xa8\xfc\x34\x98\x11\x57\x07\xd8\xb1\xbb\xe2\xcd\xc4\x74\x1e\xc3\x39\x0b\x0e\x7f\x0c\xdb\x19\xf0\x3f\x8b\xab\x55\xe3\x81\x89\x5a\x64\x76\xe0\x00\x49\xdc\x94\xa2\xdc\xba\x55\x49\x09\x89\xe9\x0e\x50\x9b\xd6\x9b\xf8\xef\x60\x37\xbe\x74\xba\x97\x14\x17\xa7\x26\x79\xc0\x65\x00\x01\xc1\xbd\xc2\x6d\x84\xe5\xeb\xb6\x09\x53\x07\x15\x1d\x3a\xe1\xee\x2e\xa5\xd0\x88\x4c\xe5\x72\x3e\x5c\xe8\x46\xde\xb8\x3f\x2a\x54\x62\xe4\xaf\xb6\x7b\x5f\x90\xef\x90\x41\x38\x82\x9e\x7f\x90\x86\x10\xcb\x7f\x0b\xca\xf2\xb9\x62\x1d\x94\x50\x01\xf4\xad\x84\x46\xcc\xeb\x0f\x83\x9e\xca\x01\x2e\x05\xf0\xa8\xa0\x09\x82\x3b\xce\x46\x29\x81\xb7\x28\xf3\xb0\x33\xa4\x5b\xa2\x5b\x4f\xf7\x2a\x89\xec\x94\x5a\xf7\x48\x42\x9c\x1e\xe7\x8f\x54\xd4\x80\x95\x0d\x03\x45\x36\xd3\x8c\x64\xdd\x63\x22\x40\x8e\x10\x24\x75\xf8\x9c\x76\xc9\x60\x6d\x77\x17\xcb\x10\x94\x06\x7e\x5a\x9c\x7d\x94\x31\x85\xed\xb0\xf1\xb5\x4a\x7c\x83\x22\x7f\xd5\x48\x57\x03\xe0\x09\x99\xf0\x52\xed\x8c\xc4\xfc\x6d\x0b\x68\xc4\x06\x3a\x12\x57\xf9\x89\x94\x47\x99\xe8\x13\x2a\x10\x7b\xe0\x94\xb0\x92\x2d\x6d\x05\x00\xa2\x42\x67\x9a\xd5\xb3\x7d\x71\x64\x04\x61\x15\xe5\x43\x71\x1c\x35\x50\xe9\xe1\xb1\x80\x57\xe8\x98\x24\xd0\xa8\x45\xfe\x84\x07\xb4\x42\xb1\xf0\xfc\xfb\x3c\x06\x71\x60\x9f\x73\xf5\xbe\x8d\x1a\xd1\x3e\x65\x62\x3e\x6c\xbb\x16\x19\xca\xa3\xe1\xf0\x82\x29\x05\x72\xda\x86\x0e\xbb\xb9\xa9\x18\x30\x86\x1a\x38\xd6\x46\xf4\x79\xa3\x2a\x6a\xa2\x66\x09\x61\xe1\x86\xb6\x71\x44\x57\xa5\xe3\xdd\xb8\x56\xf0\x08\xa7\xbb\x33\x74\x55\x00\xc5\x70\x08\x4b\x5a\xe0\xb7\xdf\xe1\x60\x37\x65\x11\x4f\x21\x90\x19\xf1\xba\x34\x06\x30\xd5\xf1\x53\xb3\xe4\x08\x93\x3c\x22\x37\xd2\x07\x90\x0c\xc5\xf3\xc9\xed\x0f\x35\xba\xb1\xec\x28\xb8\x17\x44\xc4\xf4\x41\x19\x65\x75\x55\x66\xf7\x2c\xde\x2e\xf4\xc6\x5b\x16\x5c\x76\x32\x7b\x76\x7b\xf2\x57\x76\x87\xd4\x18\xe7\xc2\xec\xde\xd2\x6b\xd5\xdf\xd4\x06\x7a\xdd\xa2\x2d\x57\xa4\x92\x35\x2a\xda\xa5\xf5\x7a\xbd\x1f\x1d\x5e\xcf\xbb\x93\x8d\xe4\x91\xec\x5a\x02\x02\x74\x4c\x55\x61\xc3\x42\xed\x4a\x73\xb0\x3d\xb6\xb3\x17\x70\x9a\x32\x02\x77\xe4\x90\x80\xb3\x2b\xd5\xfa\x15\xac\xfd\xed\x21\x55\x81\x4a\xa7\x47\x43\xbb\xc1\x74\x11\xd8\x63\x17\x2e\xc4\xce\x5a\x6f\xa6\x58\x1a\xb2\x21\xa2\x44\x22\x8b\x05\x89\x3d\x8e\x69\xb8\xb1\x41\x99\xb0\x10\x69\xec\x6c\x55\x35\x12\x33\xca\x25\x09\x14\x11\x2e\x66\x81\xd6\x20\x52\x8d\xaf\x79\x02\x2f\x14\x84\xd0\x82\x08\x82\xb0\xb1\xe5\xea\x2e\xa1\x96\xcd\xfc\x53\x05\x79\xec\x1a\xbe\xa0\x8e\x1e\x46\xbb\x2e\xa5\x7d\xe3\x47\xa6\x00\x7c\xf8\x8a\x0b\x3f\x7f\x8e\x35\xac\xcd\xe6\x4f\x21\x61\xbe\x41\x75\xab\xda\xf5\x82\xf0\xc4\x23\x74\xdf\x5a\xf0\xd4\x8e\x00\x7b\x74\x00\xd0\x84\xcd\xd8\xe6\xaa\x87\xbd\x34\x16\xda\xf0\xf6\x05\x30\x5d\xc4\x22\x6b\xe4\x6a\x28\x0c\xb3\x9e\x7e\x99\x03\x76\x92\xaa\xae\x7a\x5a\x03\x56\x92\x26\x9d\x01\xc0\x89\x7e\x58\xc5\x88\xd4\xc3\x2d\xb1\x8a\xc7\x1d\x55\x77\xb8\xcf\x51\xda\xc0\x26\xce\xbc\xc4\xff\x3b\x9d\x30\x07\x52\xe7\xe4\x5b\x5f\x09\x50\xd1\xcd\x5a\x1c\x60\xd6\x73\xdb\x4f\x51\xef\xcf\x4d\x7b\xfa\x8a\x0d\x09\xb0\x86\x3d\x13\xa4\xef\x9f\x90\x3b\x0b\x48\x05\x1a\xf7\xf2\x13\xc1\x23\x5c\x96\xa8\xed\x5a\xc1\x42\x69\x70\xd4\x23\x01\x99\xf5\x2a\xb2\x5e\x5a\xa2\xe7\x56\x01\xb6\x57\xc7\x65\x87\xd4\x3a\x16\xe9\xc9\xb0\xc7\x14\xf1\x10\xe4\xcb\x46\xb2\x77\x92\x2e\x2a\x46\x35\x2f\x54\xd0\x61\x18\x8e\x96\xf1\xd3\xb8\x79\xf0\xbe\x96\x30\x1c\xce\xff\x29\x86\xac\x31\x4a\x01\x2e\x72\x86\x5b\xf0\x44\x81\x75\xfb\x89\x5d\x55\x40\x92\xb9\xd0\x31\x38\x42\x7c\x00\x03\x5a\x42\x97\xb3\x8e\xff\xc6\xe0\x6a\xaf\xe3\x9b\x6a\xe5\x63\xcc\xdd\x50\x12\x5b\x88\xd9\x5c\xc7\xdc\xea\xa8\x4e\x04\x7b\x4c\x91\xf4\x07\xc4\x60\x4f\x95\x83\x2c\x13\x61\x2c\x83\x0d\x21\x54\xb6\x0e\x52\x9f\x5d\x9f\xcf\x27\x75\xd9\x8f\x1c\x62\x06\xba\xdc\xd9\x9d\x33\x43\xeb\x40\x58\x13\xc6\x85\x07\x6c\xe7\x9b\x09\x1f\x6e\x35\xe7\xfb\x54\x6b\x62\x99\x08\xdb\x0d\xd2\x12\xd0\x66\x53\x09\x79\x15\x63\xa5\xcb\xcb\x8c\x2b\xa9\xdf\x55\x08\x01\xde\x95\x8c\xec\xc7\x79\xd1\x45\xd8\x45\x8c\x09\x0e\x59\x38\x71\x85\x21\x5f\x72\x4f\xf9\x35\xcd\x12\x4b\x98\x32\x2c\xfb\xbf\x54\x14\x46\x97\x5d\xd4\xab\x10\xd7\xf1\xfd\xe5\xef\x8f\xf2\xeb\x81\x2a\xd9\x1f\xa1\xfc\x1e\xd5\x49\x6f\xc5\xf2\x96\x2b\xc1\x73\xfe\x8f\x70\x4a\x21\x0f\xff\x64\x91\x06\x61\xc7\x97\xcf\xc3\x09\xfa\xc2\xa1\x4c\x5c\x90\xa5\x50\xbc\x7f\x09\x12\xdb\x0e\x24\x36\x9e\x08\x6b\x77\x65\x93\x6d\x0f\xfc\xda\xb8\xed\x64\xf5\x1a\xf3\x23\xdf\xeb\xff\x06\x45\x44\x75\x5a\x1f\xea\x9e\xcb\xfe\x3a\xcc\x69\xc6\xd0\x4e\x38\x84\x75\x91\xbd\x40\x49\xaf\x0f\x6f\xf2\x45\x52\xe3\x55\x3a\xc1\xef\xf0\xc5\x86\x9e\x60\x07\x2c\x05\xc6\xec\x1e\xbc\x0b\x4a\x66\x8c\x8f\x6a\x9a\x5c\xca\x7f\xe5\x13\x1e\x04\x91\xf0\x6a\x2d\x82\x8b\x2d\x70\x0c\xf6\xad\x25\xf2\x5e\xad\xf3\x46\x0b\x61\x7e\x77\xd6\x72\xbc\x89\x66\xc0\x8b\x25\xa5\x9a\x32\x2f\x2e\x7a\xfa\xa0\x5e\x7d\xe8\x39\xa4\x2a\x8a\xef\xbc\x0c\x7e\x01\x78\xac\x61\x95\x2c\xe7\x64\x97\x6c\x00\xf9\x3a\xc7\xa7\x25\x0d\x1b\x8b\x0d\xe7\x84\xaf\xbc\x92\xe5\x0f\x8e\x9f\xb0\x74\xc9\x71\x1a\x96\xbe\x26\x3a\x41\xb8\x50\x9b\x2c\xdd\xe6\x72\xfc\x25\x05\xd6\x35\x3d\x6f\xb7\x20\x78\x28\x50\x9a\x1e\x9a\xd8\x74\x5d\xfe\x52\x6f\xb6\x06\xed\x95\xcb\x16\x0a\x6a\x20\x69\xea\x27\x75\xf0\xea\x83\xd8\x15\xad\x59\xcc\x76\x19\xb4\x4f\xb4\xcb\xb9\xa2\xe0\xe7\x32\x38\xe7\x65\x2e\x9d\x50\x2e\x9d\x65\x11\x0e\x0a\x81\xd4\xba\x66\xc1\x3e\x05\x64\xb6\x20\x51\xb3\xc8\x7d\xad\x09\xb7\xc8\xa4\xb4\xe2\x4b\x0b\xa2\xea\xec\x97\xaa\x7e\x0e\xd1\x07\x45\x59\x44\xd1\x39\x7b\x61\x8e\xfb\x30\x4c\x9c\x84\xb8\xd8\x05\xaf\x23\xd1\x4c\x39\x94\x2e\xfc\x5e\x35\x0c\x49\x07\x22\xf6\xfd\x50\xf0\xe1\x82\x7b\x31\xc1\x66\x92\x82\xa8\x5a\x10\xa8\x12\xa9\x52\xee\xba\xfb\x0a\xfc\x78\x01\x5e\xa0\xe8\x12\xf0\x98\x90\xdb\x03\x87\x2d\xcc\xb0\x51\x37\x2f\x4d\x52\x98\xda\x38\x20\x9f\xef\x1c\xda\xfe\x04\xe1\x24\x57\xa7\x6a\xd5\xb3\xcd\xa9\xab\x35\x95\xe9\x0a\x88\xb9\xf5\xdf\x3e\xc7\x70\x59\x7e\x87\x9c\x08\x1a\xe3\xa1\x80\x33\x85\x1c\x2e\x08\x44\xd4\x4f\x28\xd6\x09\x10\xe2\xf2\x0e\x9d\xfe\xd1\x0b\x45\x94\x80\x10\x38\x66\x72\x57\x0e\x79\x52\x6b\x1f\x62\x46\x2d\x6a\x7c\xfc\xb8\x0c\x89\x37\x56\x33\xfd\x71\x0f\x0d\x09\x8a\x44\x08\x28\x13\xc0\x41\xcb\x30\xdf\x89\x48\x19\x51\x47\xb1\x6e\xa8\x51\xdd\x3d\xf8\x26\x81\x4e\x26\x8d\xd6\x96\x1f\x5e\x55\x52\x29\xc0\x77\xaf\x73\xfb\xf3\x6f\xb4\xe0\xf8\xfb\x50\xb6\xf0\x45\xdb\x99\x97\x25\x1a\x6e\x15\xa0\x2e\xc1\xb2\x06\x21\x83\x60\xfc\xf2\xf3\xe6\xbe\x99\x38\x34\xeb\x0e\x7f\x5d\x8c\xc2\x3a\x18\x01\x6d\x16\xdf\xa6\xbf\x93\x6a\xff\x57\x58\x83\xff\xc2\x9f\xc6\xef\xd3\x5f\x20\xac\xb4\x93\xc3\xc4\xef\x28\x45\xd3\xdf\xb1\x42\x17\x7e\xb3\x25\xb2\x9c\x35\x58\x88\x2c\xc8\x81\x36\xf9\xf9\xdc\x34\x8c\xfd\xa6\xb9\x46\xed\xff\x96\xe2\x13\x61\xac\x45\xec\xbc\x61\x7e\x93\xcf\x3d\xa1\x67\x2d\x03\x80\x9d\x5a\x0c\xdb\x76\x63\x68\x6d\x48\xfb\x9f\xd4\x1c\x3c\x17\xf7\xaa\x23\xdb\x96\x08\xcf\x2c\x29\x0a\x1c\x73\x4b\x5e\xcb\x15\x20\xc8\x1a\x6e\xb9\x2d\x51\x50\x8b\x2b\x58\xc2\x62\x2a\x52\x3c\x27\xf7\x42\x16\xce\x07\xfa\x12\x59\xd8\x99\xee\x9c\x7a\xa1\x6d\xba\x8c\xf4\xa1\xa9\x5f\x27\xc6\xae\x60\x3b\x6d\x19\x42\xe9\x75\x5c\xbe\xf4\x31\x50\x04\x0d\x8c\x8e\x0b\x47\x48\x44\xd8\xa1\x36\x6f\xd5\xb7\xbd\x81\x99\x1c\xdf\x3f\xdf\x9e\x2d\x7c\xd5\xa6\x11\xbe\x8c\x04\x29\x7f\x75\xdb\x8e\xf6\x09\x8d\xb7\x91\x26\x46\xc3\x35\x13\x90\x22\x93\xeb\x73\xd3\xd4\x64\x38\x41\x39\x71\x30\xcb\x09\x37\x60\x0f\xe8\xd2\x30\x58\xe6\x43\x6f\x00\x40\x73\x78\x34\xba\xd6\x2d\x75\xcc\xe2\x06\x0e\x36\xe0\x87\xd3\xf5\x7c\xc0\x92\x1e\x05\x4a\xc0\xbe\x12\xff\x71\x28\xbd\x3a\xef\xa1\x04\x85\x73\xa8\xae\xbe\x00\x0d\xcd\x36\x1c\x9e\x1e\xdb\x87\x6f\x94\x99\x1c\xc6\x4e\x2a\x11\xb7\xc7\x9a\x4d\x0b\x56\x88\xce\x20\x74\xed\x06\x3f\xd0\xc9\x7e\x7a\x92\x86\x58\x3d\x09\x7b\x6f\xfe\x01\x01\xbc\xe1\x21\x2f\x96\x7b\x86\x44\x8c\x31\xb0\x3a\x3e\x1c\x32\x96\x97\x36\x13\xa8\x88\xfc\x0f\xe9\x37\x5a\x5f\xf4\x30\xfa\x11\x60\x86\xef\xda\xea\x40\xeb\x16\x05\x0e\xca\x7d\x54\x95\x89\x00\xdd\x24\x9a\x26\xf7\x50\x4a\xb6\x4e\xce\x7f\xdf\x7e\xfc\xfb\x63\x4a\xd9\x43\xad\xcf\x75\x75\xfa\xb1\x1a\x75\xf6\x10\x47\x93\x2e\xc4\x5e\x3d\x09\xc4\x03\x73\x89\x88\xea\x58\x30\x25\xc9\xcc\xf7\x69\xdc\x3e\x17\xdf\x23\x8c\xe1\xd3\xd7\xa2\x85\x11\x21\x59\xcc\xb1\x2f\xe7\x0c\xbd\x17\x42\x68\x60\x07\xae\x0a\x9d\xb8\x5f\xd1\xc8\x45\x30\x1a\x77\x66\x0b\xad\x05\x00\x31\xb8\xad\xb7\xe3\x53\xfe\x2a\xc0\xd4\xa8\x72\xca\xd0\x03\x1b\x51\x7a\x02\x66\xce\x7f\xbe\x29\x42\x26\x3e\xbd\x83\xa5\xa4\x44\x66\xf9\xe6\x69\xf3\xb9\x5f\x2d\x0a\x3d\xe1\x68\xc6\x03\x39\xdf\xe6\x4e\x64\x26\x15\xb8\xe3\x7a\x57\x02\xd9\xb4\x82\xbf\xdc\x12\xbd\x4f\xa8\x35\x00\x92\xca\x83\x73\x77\x83\xd7\x9f\xe9\xb8\x25\x7d\x9e\x69\x6b\x74\x91\x68\x17\x2e\xe7\x70\x7e\x39\xd7\x35\x1e\x5f\x32\x13\x16\xe7\xab\x1f\xaa\x49\x78\xdd\xf9\x8f\xac\xb7\xdd\xe3\xa4\x2e\x12\x29\xb2\x88\x10\x90\xe7\x13\x3f\xc2\x26\xec\x36\xe1\x27\xf7\x23\x3b\xe9\x9f\x1f\xb7\x30\x81\x7e\x10\xf4\x42\x3c\x8c\xa3\x63\x63\x3c\x07\xa4\xcf\x9f\x6d\x88\xa5\x6f\xb1\x0f\xa5\xb5\x88\x29\x3c\x9a\x6d\x66\x99\x6e\x74\x01\x6e\xa8\xc0\xbc\x34\x2e\x27\xb4\xdf\x5e\x06\x90\x23\x64\xd5\x25\xd0\x2f\xf7\xfb\xb8\x43\xbe\xe4\x4f\x21\x29\xf8\x92\x3d\xa9\x90\xea\x76\x24\x4f\x6b\xfd\xab\x2f\xf6\x0a\xb6\xc6\x31\xdb\x57\x38\x1e\xc0\xc6\xd8\x38\x48\x98\x48\xe8\x24\x76\x9b\xa5\x5d\xb1\x6e\xdc\x6d\x51\x15\x73\xe2\x9c\xfb\x04\xaa\x21\x7c\xcb\x34\x3d\x93\x6c\x08\xde\xf2\x15\x70\x44\x4b\x48\x4a\x40\x08\xeb\x88\xa8\xfd\xde\x7d\xbb\x1c\xf8\x65\x0e\x9f\x83\xb5\xdc\xfe\xe2\x6e\x50\x55\x5b\x18\x7d\x96\x2f\xb5\x8a\x3d\x34\x8d\xe2\x73\x7c\xdd\x4a\xe7\x50\x75\xab\xa9\x70\x21\x68\xc9\xbb\xdc\x66\x05\xe3\xed\x26\x7e\x10\x8e\xce\x3f\x14\xcb\x7d\x22\x32\xf9\xea\x5f\x7b\x1b\x06\xb8\xa1\x7c\x40\x53\x26\x99\x0a\xf0\xd9\xed\xc2\x9c\x2d\xbc\x06\xf8\x8b\x84\x1f\x3a\x8c\xd9\x02\xe7\x32\x47\x56\x0c\xc1\x40\x00\x7e\xf4\xbd\x4d\x33\xc6\x29\xa4\x63\x90\xc2\x46\x22\x40\xa5\x73\x86\xb6\x60\x2e\xcb\x8b\x0b\x6a\xed\x5f\xb6\x19\xf9\x6e\xf3\x2d\x9b\x1b\xf8\x8e\x0b\x0b\x51\xf4\x4b\x68\x2f\x10\x2d\x56\xfe\x38\xed\x79\x34\x7a\x7c\xed\x71\x74\x9c\xc3\x39\xad\xa1\xbd\xef\x68\x72\xc1\x5f\xd6\x70\x30\x07\x3d\x6f\x67\x28\xb2\x03\x23\x79\x95\x9f\x39\xd0\x31\x62\x54\x5a\x70\x46\x09\xae\x75\x8b\x68\x06\x94\xe7\x18\xbf\x2a\xf9\x2e\xd2\x41\xab\x01\x48\xb9\x05\xce\xe4\x13\xdd\x03\x4a\x7c\x92\xa2\xa8\xb4\xf4\x56\x00\x8f\xb2\xbd\x42\x5a\x03\xe6\x3a\x2e\x16\xe2\xd8\x98\xfd\x46\xc7\x3b\xce\xe5\x16\xc5\xb3\x26\x84\x40\xf4\x2e\x80\x5c\x42\xba\x63\x71\xf3\x43\x09\x1a\x84\x76\xc6\x97\xb9\x39\xe0\xbc\xd1\x37\xb7\x45\x32\x1c\x13\x3d\x60\x5b\xa8\x9f\x09\xa6\x52\x97\x8c\xdc\x64\x40\xe2\x19\xee\x49\xee\x03\x37\xe0\x2b\x0d\xcb\x6c\x50\xb5\x08\xa8\xa0\xbf\x57\x60\xae\x76\x54\x3d\x1e\x40\xe1\x60\x72\xb6\x03\x46\x26\x19\x99\xd7\x11\x0d\xd7\x58\x62\x29\x80\xb8\xa4\xe5\x2f\xf3\x08\xd5\x22\x1c\xb5\xe2\xd6\x66\x6a\x25\x2a\xf5\x43\x0a\x7c\xd9\x99\x62\xb7\xde\x47\x65\x45\xd5\xcd\x03\x86\x86\x47\x38\x86\xd8\x0c\x18\x6c\x68\xe9\xa6\xe4\x0c\xf8\x6b\x9b\xde\x15\xfa\x63\x1d\xf5\x7a\x4e\xc4\x89\xec\x7b\xe4\xd7\x10\xc1\xa8\x16\x0d\x09\x9e\xca\x7d\x4f\x63\xf4\xa4\x4a\x2a\xf0\x2a\x5f\x96\xf9\x29\x94\x7d\xa1\x75\x21\x8a\x3e\xc2\x2a\xc2\x6f\x1d\x16\x12\x9a\x50\xdb\x98\xc6\x86\x27\x8e\x04\xed\x08\xf0\x8a\x0d\x0f\xfe\x2b\xc1\xb3\x40\x30\x95\x63\x0a\x59\x8c\xfd\x6a\x0a\xa1\x1b\x67\xcc\x72\xa8\x8a\xa1\x23\x65\xa6\x66\x41\x27\x21\xff\x73\x12\xa7\xc1\xa2\x3e\x51\x40\x1f\xf8\x15\xbd\x79\x3b\xb5\x2d\x1f\x48\x72\x33\xb4\x2c\x41\xf2\x15\x88\x17\x29\xb5\x7b\x3b\x4b\x0a\x17\xe8\x95\x57\x30\x90\xed\xda\x9e\x42\x5c\xa0\x8a\xd8\xc4\x55\x6b\xca\xa5\x4a\x5b\x53\x8e\xb4\xa8\xc3\x6e\xca\xa2\x8b\xd3\xc4\x1a\x01\x2c\x11\xc4\x91\x03\x03\xd7\x37\x63\xd5\xda\x70\xe5\x8c\x12\x2f\xa3\x41\xa1\x6d\xd7\xce\xd8\x19\x28\x8d\x75\x93\x04\x49\x6c\x50\xe7\xac\x19\xed\xa3\x6e\x57\xfc\x06\xc2\x40\xd8\x0e\x69\xf6\x3c\xbb\xc9\xd6\x3f\xe5\x21\x53\x39\x43\x57\xbc\x8a\x76\xe4\x29\x48\x88\x0d\xca\x14\x0f\x2a\x65\x84\x4b\xfa\x87\xe0\x94\x2f\x9f\x09\x79\xe1\x37\x60\x57\x8e\x3a\xde\xd2\x45\xd9\x7e\x3a\x00\xc6\x13\xbb\x1b\x0f\xd3\x0a\x41\x08\x3d\x8d\x80\x2a\xc2\x09\xbf\xba\xb2\x8b\x83\xe6\x22\x19\xb4\x7d\x48\xe1\xf9\x60\x6f\x5d\x90\xa8\xe9\x4d\xed\x6b\x20\x60\x34\xfd\x1d\x6e\xfa\x91\xfe\x51\x13\xe2\xdc\xdb\xe1\x33\x1e\x00\x18\x27\x0a\x56\x5c\xbb\x80\x13\x58\xa7\xdd\x5b\x41\x39\xb6\x9e\x64\x9b\x10\x70\xb0\xb6\x56\xa0\x6d\xf6\xc2\xfb\x09\x12\x62\x5b\x3e\x28\xa6\x61\x5d\x5e\x22\xe8\xc2\x45\x31\xb0\xb8\xeb\x69\x93\xfb\xa6\x07\x6b\xcf\x2e\xbc\x8d\xed\xa3\xec\x15\xfe\x55\x44\x19\xb4\x31\xfa\x52\x39\x3a\x69\x29\x50\x85\xa0\xb0\x44\x2c\x3b\xda\x4c\xa7\x50\x01\x64\xc9\x6d\x27\xe1\xa3\xb4\xe8\xaf\xb4\x34\xa7\xb8\x4d\x0a\x60\x93\x25\x4c\x19\x72\x9d\x47\x02\x35\x94\xc3\x8a\xa1\x30\xed\x02\x06\xd4\xad\xdd\xa7\x6a\xa4\x4a\xf5\x74\x7f\x73\x48\x8f\xd8\xdd\xaf\x29\x6a\x7a\x3a\x44\x2c\xcc\xd3\xa5\x7b\x21\xbf\x74\x49\x5f\x14\x17\x97\x49\x1d\x88\x23\x21\xc3\x61\x43\x48\xe3\xbf\xbf\x7b\xa6\xcf\xa5\xab\x78\x99\x16\xbd\x51\x95\x39\x74\x2b\x87\x26\x62\x61\xbe\x2c\xd8\x2a\x22\xa9\xea\x65\xe8\x8f\x4a\x1f\xfb\xf7\xa0\x74\x86\xdd\x40\xf8\xd7\xf7\xbd\x34\x34\xce\x17\x27\xa2\x7f\x45\xb4\x82\x3f\xfc\x2e\xd8\xc2\xd4\xcf\x57\xfe\xaf\x33\x64\x7b\x2f\x98\x34\x62\xfb\x33\xd0\x58\xed\x73\xf9\xb5\xf9\x6c\xb1\x10\xf1\x01\xc8\x49\x68\x13\x76\xad\xb7\x35\x44\x14\xc7\x2c\x7c\xfa\xc6\xbe\xc0\xd9\x58\x1f\x17\xc0\x64\x30\xb8\x37\x8b\x3e\x61\x74\xc8\x66\x2b\x91\x0d\x94\x81\xe6\x1d\x93\x3b\x36\x03\x25\xf6\x41\xba\x7f\x45\x10\x6f\xcd\x14\xce\x18\x28\xae\xc9\x4c\xef\xc3\xf3\x79\xd0\x12\x82\x32\x96\x88\x76\xbb\x2d\xb5\x6a\x8b\xa6\x8d\x16\x33\x0a\x43\x93\x2f\x3d\x7c\x20\x4a\xe0\x7c\x01\x8b\xba\xf0\x91\xa8\x65\x18\x78\x88\xc7\x97\xa6\x7f\xc4\xcb\x84\x05\x8f\xa5\x9a\xf4\xc0\x48\xdb\x50\x08\x9b\xd9\x9e\x69\x93\x66\xc7\x8a\x7b\xd9\x23\xeb\xfc\xc3\x4c\x42\x1a\x1f\x1d\x51\x88\x1f\xbb\x61\x1f\x40\xcd\x6c\x4c\x5a\xdf\xa5\x0f\xb3\xc9\xb7\x65\x22\x44\x66\xd8\xe4\x9c\x88\x17\xeb\xdd\xce\x56\x6e\xf0\xdb\xe8\x2a\x93\x88\x33\x9d\xe3\xf3\x41\x3d\x14\xbf\x15\xdb\xea\x24\xb1\x05\x88\x40\xfa\x1e\x01\x95\x09\x21\x47\x7f\x8b\x9d\x73\xcb\x55\x92\x77\x68\x03\xbe\x41\x87\x9b\xa4\x25\x45\xc3\x89\x1c\x18\x9a\x12\xdb\x78\xcf\xa4\x57\x5a\xf2\x4f\xf8\x16\xae\xe0\x08\xbd\x22\x59\x22\xf7\xa5\x77\x40\x4d\xdc\x38\xe7\xfa\x22\x38\x95\xe2\x73\x01\x40\xf3\x3c\x39\x3c\x25\xf6\x9c\xc2\xae\xc2\x29\xb5\x8a\x87\xb1\xaa\x7d\xa8\x9f\x3b\x17\x58\xdd\x59\xbf\x11\x92\x21\x58\xa6\x7d\x57\x37\xcc\x13\xc6\x97\xc7\xa0\xf7\xf8\x88\x75\xbb\xca\x2f\xe3\x1c\x3d\x91\xb5\x3a\x98\x7c\x49\x92\x44\x58\xaa\xe3\x42\xff\xb2\xe1\x5c\x0f\xbb\x75\x89\xcc\x38\x99\x85\x1e\x27\xfc\x91\x3c\xc0\x93\xec\x01\xd7\x5b\x8e\x33\xe0\x22\x7b\xa2\x03\xfc\x76\x2a\xc7\x97\x79\x45\xb5\xcb\x73\x43\x0c\x17\xad\x80\x7b\x85\x50\x37\x40\xab\x10\x34\x33\x06\x58\x04\x72\xe8\x21\x1f\xf2\x62\x09\xc2\x11\x36\x7b\xfe\xc7\xa4\x91\xe0\x9b\x3a\x67\xf4\xe6\xb3\x0a\xb4\x61\x4d\x4f\xd4\x6e\x07\xd5\xd8\x90\x2f\xdb\xe2\x70\x4a\x3a\xa8\x80\x74\xb8\x30\x1a\x0f\x1c\x8f\x50\x37\xa1\x8f\xcb\x11\xdc\xf1\x63\xa4\x15\xac\x6b\x3a\x13\xf1\x7d\x7c\xd5\x33\xe5\x84\x51\x91\x31\x1b\x0d\x63\xdd\x12\xa3\xe5\x05\x1a\xc6\xfd\x87\x87\xe6\x10\x1e\x43\xb9\x3d\xc1\x50\x38\x30\x34\x85\x0e\x8e\x87\x3d\xa1\x1d\x51\x9a\x87\x25\xbb\x7e\x68\x5e\x54\x53\x03\xf8\x4a\x2a\x25\x4b\xf8\x52\x00\x2f\x73\x0c\xf2\xc6\x9f\x32\x68\xe5\xd2\xb4\x73\x3f\x8d\xd1\xdd\xb8\x1e\xc4\xd2\xac\x45\xc7\xd1\x1f\x9f\x61\xeb\x3d\xc3\x81\x0c\x85\x7f\x4f\x52\x5f\x76\xb8\x56\xa9\x50\x46\x36\xf0\xbd\xa4\x7b\xe2\x4c\x5a\xdb\x8e\xa5\x0d\x25\x94\x0f\x5d\xa4\x31\xe1\x71\x20\x9d\xbb\x53\x71\xcf\xa4\x9f\x04\x13\x3e\xee\xa1\xdb\x7f\x58\xb0\xdf\x5a\x28\xbe\x7e\xff\x09\x2f\x04\xeb\x0a\x7d\x93\x02\x31\xf1\x49\x2a\x26\xc1\x96\xe3\x96\x8b\xb9\x4d\x3a\xf4\xda\x6d\x69\xbc\x9f\x21\x7e\x61\x41\xda\x02\x91\x33\xbb\x14\x99\x87\xd3\x21\x4b\x8e\xe9\x49\xdd\x08\x4a\x7a\xed\x67\xe3\xf2\xff\x6f\x41\x78\xce\x8d\xd0\x28\xb7\xf5\x48\x4b\xf5\xe5\xbf\xb6\x02\xf9\x4e\xc6\x15\x43\x02\x8f\x7e\x05\x45\x10\xa4\x63\xe3\x80\xe9\x29\xb8\xb4\x4c\xa8\x95\x42\x68\xc8\x51\x6c\xd2\x2f\x80\x8b\x3b\x73\x74\xe1\xf6\xe8\x65\x97\xe8\xa4\x6a\x83\x71\x9a\x04\x15\x82\xdb\x0f\x5f\xb7\x07\x2d\x7c\xe7\x0f\x2f\x29\xd3\xa8\x43\x01\xef\x04\x44\x8d\xb4\x4b\x56\x57\x8a\x12\x1c\x08\xc8\x00\x2c\x34\x30\x9d\xf0\x55\x3e\xff\x24\x40\x7c\x0f\xca\x69\xb8\x70\x8a\x1e\x2d\x37\xf3\xa8\x3a\x19\x6e\xe4\x1f\x78\x1b\x28\xc3\x6e\xa3\x97\x9d\xf7\x12\x36\x11\x65\xbb\x57\x61\x30\x03\xb0\xe9\x89\x9f\x43\x01\xcc\xa0\xfe\x26\xc5\x39\x93\x1e\x3d\xe9\x7d\x61\x5b\xdd\x85\x34\x02\x89\x8f\xc3\x97\x4b\x46\xc5\xc1\x42\xda\xbf\xa4\xaa\xa9\x67\xf1\x76\xef\xe6\x4a\x98\x05\x6d\x45\x00\x5d\xf6\xe0\xf1\x9e\x02\x18\xc8\x83\x29\x6c\x62\x9d\xda\xb8\x4b\x57\xe5\xd6\x33\x77\x68\x50\x05\x06\xa5\xbf\x2c\x19\x91\x49\x52\x0a\x16\x50\x07\x57\x87\xbf\x2e\x4e\x9d\xf7\xd7\xd8\x09\xc0\xf3\xaa\x9e\x22\x6f\x97\x4d\x73\x8c\x75\xa2\xf3\xd6\x3e\x56\x9e\x8b\x85\x2d\xf1\xf5\x3b\x32\x28\x5e\x37\xe8\xaf\xfa\x76\xaa\x6e\x78\x3b\xd7\xae\x19\x76\x59\x5a\x3c\x63\xdb\xea\x4b\xf8\xb9\xc3\x15\x3a\x3f\x83\x16\x2a\xf7\x61\x3b\x25\x57\x0a\xb4\x51\xd6\xbe\x2c\x61\x5a\xe0\x7e\xf9\xa1\x43\x39\xa7\xee\x27\x3d\x84\x44\xca\x4b\x44\x2d\xd3\x62\xaf\x72\xc5\xb0\x06\xa4\x5d\x5c\x5f\x70\x41\x05\x72\xb2\x21\x29\x8c\x5b\x86\x14\x9f\x8b\xc5\x4f\x7e\x95\x73\x2a\x22\x5e\x85\x5f\x1b\x50\xa9\xf6\xd3\xcb\xff\x42\x46\xc8\xad\x0d\xc3\x60\x26\xaf\x9c\x95\xc3\x15\x45\xf2\x49\x79\x42\xd5\x73\x8f\x4b\x93\x89\xcd\xab\x76\xf4\x36\xce\x36\xee\x1d\xb8\x4b\x52\xcb\xad\x4f\x44\x02\x45\x1c\x48\xac\xb6\x6a\x14\xb5\x5a\xcc\x84\x3c\x4d\xfc\x09\x40\x6b\x84\x76\x10\x3a\xd9\xe3\x8f\x9d\x96\xdd\x78\xea\x71\x6c\x40\x0e\xbc\xd2\x15\x1d\x03\xb3\xf7\x1d\x53\xef\x99\x2a\x36\x0b\xef\xf0\xb4\xbc\x12\xed\x87\xa2\xfe\xb0\x27\xe7\x06\xb3\xce\x62\x93\xbb\x30\xe0\xb1\x19\x89\xcc\x57\xa6\x3f\xcd\x23\x21\x60\xf3\x11\x67\x12\x9a\x23\xfc\x9c\x09\x4e\xa4\x1b\xa9\xbb\x7b\x7a\x9d\x53\xe1\x77\x3f\xab\xa3\xed\x9e\x42\xad\x25\x8c\xd9\xad\xdf\x12\x1c\xea\x5c\x04\x96\xfa\xc2\xca\x28\xf6\x70\xfc\x7d\x67\xa2\xa1\xfe\xa9\xe8\x75\xd3\x61\x5d\xdc\x95\x1f\x0c\xea\x0e\x47\x2e\xd7\x51\xfe\xaf\xcb\x8a\xef\xce\xef\xb1\xaa\xd9\x1c\x20\xcc\x56\x0c\x53\xd9\x02\x57\xb4\xe4\x3e\xf6\x7e\x7b\xac\x83\xcd\x50\x75\x62\x26\x27\xc2\x56\xd4\x10\x5d\x45\xf9\xf6\xe9\x16\x73\x80\x56\x8d\x6b\x31\xf3\x15\x00\xf2\xf4\x51\x3d\xa0\x3b\x47\x80\x9d\xfa\xea\x23\x00\xa9\xe5\x49\x3a\x39\x4f\xac\x3b\xb5\xf1\x8e\x90\x0e\x01\xa6\xa9\x0d\x38\xd3\x96\xeb\xfb\x54\x9c\x7a\xdc\x88\xa6\x25\x3c\x60\xda\x54\x55\x69\x54\xd6\x46\xf5\x5f\x7d\xd6\x86\x59\xbb\x5e\xa5\xbc\x95\xdc\xcd\x5d\x9b\xc6\xbb\x12\x40\x90\xf8\xe5\x90\x4a\xf7\xe1\x04\x56\xda\x01\x10\xaa\xa5\x6e\xe2\x81\x76\xc9\xa9\x60\xb9\x05\x73\x26\x41\x8a\x96\x73\x69\xc7\x2f\xd1\x19\xfa\x32\xc8\x93\x05\x4c\xe0\xc0\x1e\xd9\xd5\x12\x6d\x01\x62\x34\x98\xcc\x3d\x28\x47\xd3\x8e\xab\x70\x2e\x9b\xc0\xdc\x36\x2c\x7f\xfb\xde\xac\x71\xcd\x02\x52\x64\x1f\x15\xc7\x25\xc1\xe9\x57\x71\x44\x28\x4d\x43\x4b\x13\x48\x5c\xb6\xc2\xfa\x54\x5b\x0d\x00\x8c\xae\xc4\x8c\x76\x2d\xd5\x64\xca\xc3\x4a\x39\x06\x2a\xa2\xf5\x1c\x34\xac\x58\xf6\x88\xf5\x87\x6b\x4c\x5b\x0b\x68\x8f\x04\x6f\x15\x4b\x07\x08\xf3\x81\xd2\x97\x16\x12\x56\x14\x0a\x03\xb5\x74\xf6\x35\xcc\x39\x27\xf9\xb3\x20\xf0\xeb\x35\x55\xa5\xb1\x15\xe3\x1b\x91\x49\x21\x55\x05\x6a\x60\xab\x67\x68\x1d\xa0\x58\xba\xf3\x54\x87\x52\x7c\xa2\xe8\xb0\x51\xc9\xd1\xdc\x8b\x2c\xd0\x2d\x08\x73\xf8\x15\x17\x51\xc2\xc8\x2e\x6f\xb3\x56\xe0\x18\x4a\x17\xf2\x6c\x84\xb6\x99\xef\x4b\xc7\x3d\x9f\x82\x4e\xcd\xe8\x62\x7a\x42\x6e\x61\x98\xa9\xc2\x35\x69\xba\x7c\x2e\xb1\x12\xb0\x12\x07\xb4\xc3\x29\x4b\x1e\xbb\x2d\x1d\x14\xef\xb0\xaa\xa4\x1f\x22\xc9\xbc\x69\x4d\x76\xe7\xd3\xa4\xe5\x1f\xca\x3d\xb4\x5e\xf9\xc8\xa3\x88\x88\x22\xbf\xe3\x11\x42\x62\x7e\x51\xdc\x71\x31\x0b\x21\xea\xcf\xbc\x27\xbc\x85\x22\xee\xb2\x7f\x23\x94\xda\x50\xc8\x84\xec\xa8\xcd\xa7\xf9\x67\x01\x7d\x92\xa4\x9b\x43\x47\x96\x7c\x87\x71\x53\x7f\x01\xaf\x5d\xfd\x46\x9f\x03\xb1\xbd\x1c\xce\x3c\xc5\xee\x3f\xf6\x79\x6e\xde\xc7\xc2\x41\x59\xda\x28\x76\xab\x6c\x55\x66\xaf\xd0\xc1\x93\xc8\x9b\x2f\x0d\xf6\x96\x8f\xe2\x21\x78\x48\x3a\x47\x10\xc9\xd2\xec\xb7\xd9\x4b\x71\x9c\xcf\xe9\x37\xf9\x72\xda\x3d\x21\x8f\x17\xfb\x0d\x13\x51\x49\xcb\x90\xdd\xbc\x03\x58\x19\xc9\xd5\xa0\x84\xee\xe9\x32\x88\x6e\xab\x14\x70\x8e\xdb\xe2\xc5\xfe\x32\xc7\x04\x41\xe0\xc6\x86\xdd\x36\x33\x23\x5f\xc6\xd7\x48\x24\x10\xba\xdb\x39\xdc\x71\xbd\x05\x91\x29\x8f\x31\xf5\x73\xb9\x1c\xd7\xc2\xf1\x9f\x54\x0e\x30\xe7\x26\x18\xd1\xfb\x52\xf0\x45\xf5\x58\x00\x61\x3b\x1f\xd4\xc1\xd9\xa1\xda\x45\xac\x92\xd4\x0c\x30\x95\x22\x98\xe6\xb4\xdf\x57\xc4\xcb\x19\x80\x8d\x97\x14\x5a\x20\x82\xb3\x4e\x21\x90\x03\xd7\x18\xcc\x61\x08\xd0\x39\x27\x30\xd6\x09\x54\x9a\x08\x13\x3a\x5b\x49\xde\x00\xb9\xe4\x01\xc6\x9a\x87\xf0\x4b\x02\x21\x51\x7a\x9f\x8e\x69\x73\x68\x20\x02\x93\xe4\x97\xc3\xd2\x36\x70\x47\xc9\x3d\x9b\xdd\x99\x41\x68\x10\x6f\x34\x42\xc9\x80\x22\xeb\xdb\x99\x2c\x86\xb9\xd0\x10\x6c\x1e\xff\x79\x6a\x34\xbb\xfd\xb7\xea\xd9\xf3\xb8\xf7\x3e\x64\xa9\x11\xa6\x25\x4e\xcc\x97\x55\x0b\xe4\x20\xfc\x12\xdb\x5f\x58\xf4\x2a\x64\x8a\x24\x53\x67\x59\xa4\xf5\x91\xf2\x8e\xd9\xe7\x2a\x67\x3d\xc7\x9a\x32\xee\x32\x87\xf7\xd8\x28\x26\xb8\x15\x0c\x76\x14\x25\x42\xa0\x9a\xcf\x49\x44\x11\xba\x8c\xa4\xa4\xa0\xb6\x42\x05\xc8\x39\xf5\x57\x8d\xe6\x50\x89\x63\xb3\x65\x81\x19\xb9\x51\xf9\x0f\xe2\x88\x90\xa7\xb4\x9e\x03\x3f\x75\x39\x89\xe8\xe6\x31\x61\x06\x35\xa7\xc9\x9e\x50\x9e\x85\x25\x50\x4b\x7b\x57\x43\x20\xc3\x73\xcc\x49\x11\x01\x4a\x0e\x7f\xf7\xa8\x5d\xd2\xcc\x09\xcf\x9c\x5c\x5b\x45\xbf\x7d\xf2\xd5\x91\xa3\x02\x9d\x40\x9e\x5d\x74\x18\x8c\x61\x3d\x09\x9b\xae\xbd\x10\xb8\xf4\x2f\xcf\xb8\x69\x1d\x26\x74\x52\x72\x16\xb3\x77\xef\xdd\xdc\x12\x84\x77\xd0\x44\xeb\x38\xc7\x35\x51\x90\x77\xc2\x08\xd3\x09\xed\xd4\x4a\x84\x65\x2a\x4d\xa3\x5c\xd3\xe6\xfb\xb2\xd2\x82\xe1\xb8\xd3\xcb\x30\xdb\x26\xb8\x09\x35\x14\x09\x06\xa2\x21\xe4\xd3\xac\x1d\xd5\x97\xc1\xee\xf4\x16\x35\x02\xbb\xce\x94\xfc\x19\x73\x03\xe4\x90\x87\x1d\x8f\x68\xbc\x14\x07\x1d\x52\x02\x9c\xb2\x9d\x61\x95\x41\x23\x0a\x4a\x3c\xf5\x29\x57\x0a\x2f\x2c\x65\xb9\x88\x32\xc9\x5b\x7d\x8a\x84\xc4\xa6\x3d\xba\x76\x53\x7e\x1e\xb1\xcd\x1a\xe8\x6c\xc0\xda\x42\x3d\x62\x72\xb7\xce\x9d\xe1\x95\x28\x60\xe6\x99\x0b\x05\x81\xa6\xb4\x63\xb1\x4b\x17\xd0\xc6\x0e\x1b\x0c\x59\xe8\x9e\xa0\x9a\xb7\x2a\x62\x95\x67\x4a\x85\xed\xa5\x73\x3f\x76\x04\x4f\xfa\xc3\x4e\xf4\x29\xd7\x61\x94\x62\x98\x80\x43\x93\xac\x51\x13\xfe\x4e\xaf\xab\xf8\x43\x07\x24\x96\x1f\x05\x18\x16\xe1\x58\x12\x3a\x5a\x5c\xdb\x5c\xd7\x03\xe8\xac\xac\xe0\xb6\xfd\xf1\x3f\x0d\xfd\x8d\xbf\x61\x9c\xfc\x73\x46\xac\xa4\xc8\x3f\xf4\x05\xda\xa9\x90\x79\x98\x72\x1f\xbe\x6d\xf9\x68\xff\x9e\x28\xe7\x73\x9c\xb4\x38\x11\x6a\xe9\xca\x47\xf7\x13\x05\xf5\xa3\xe4\xdb\x97\x90\x5a\x33\x27\xd9\xbf\x18\xef\x6b\xc8\x0f\xcc\x5c\x08\xfd\x85\x55\x9a\xef\x48\x81\xd3\xe2\xc9\xff\x02\x5f\xc3\x1d\xc0\xf4\x6d\x11\xb6\x59\x87\x2d\x3d\x0d\x86\xb0\xe6\x40\xa1\x26\xcb\xe1\xbd\xfe\xf2\x9b\xc6\xc9\xcb\x7b\x0f\x62\xbd\x84\x10\x83\xec\x92\x2a\x07\xbf\x3f\x9e\x29\xda\xaf\x48\xb4\xd5\x3b\x51\x59\xc0\x1b\xce\x4b\xab\xfa\x46\xb8\x65\x81\xfa\x4a\x5b\x34\xff\xd3\xf5\xfb\x1e\x9f\x75\x08\xb8\xe5\xcd\x4e\x9f\xc4\x35\xfc\x07\xc1\x60\x50\x8c\xe3\xdf\xe1\xbe\x44\xe7\x97\xc2\x92\xf3\x5f\x08\x03\x63\xa7\x06\x38\xd8\x78\xab\x3e\x49\xb7\x45\xa7\x44\x59\x16\x7e\x6c\x7e\x3e\xf3\x0d\xf4\xd2\xb2\x97\x07\x0f\x82\xb8\x8e\xf3\x0b\xde\x35\x06\x76\x05\xcb\xab\xbc\xb9\x20\x82\xba\xed\x3c\x3a\xba\x48\x6f\x34\xb9\x95\x27\xc5\x38\xfb\x24\x8a\xd6\x42\xdc\xd3\x61\xb2\xd6\x7a\x54\xa2\x02\x63\x3f\x0d\x4d\x47\xc7\x1f\x61\x00\x21\xcc\xd4\x02\xaa\x05\xcd\x32\xb6\x07\xbf\x81\x87\xab\xdb\x60\x1a\xef\x3b\xed\xae\x0e\x29\x22\x28\x38\x11\xc9\x85\xd1\x51\xfd\xcc\x40\xb0\xbc\x6d\x46\xbe\x44\x34\x3d\x4c\x13\x88\xd5\x3a\xc3\xac\x66\x70\xc7\x63\x85\xf8\xd5\x1e\x04\x92\xe9\x3a\x0e\xd0\x02\x23\x4e\x2c\xf0\x64\x73\xa0\xcd\xe6\x2c\x57\x01\x17\xf3\x06\x56\xfa\x27\x5a\xc8\x00\x39\x89\x1a\x0a\x3b\xa3\x61\xfc\x95\x38\xf8\x90\xbd\x9b\x42\x26\x71\x68\x39\x68\x80\xdd\x9e\xd4\xa0\x36\x20\x63\x3c\x97\xb6\xe4\x77\x7d\x10\x57\x56\x73\xb1\x21\xe7\x8b\x5b\x68\x9b\x11\x82\xa6\xf5\x03\x3c\xca\x0d\xab\xda\x96\xff\xbf\xb9\x01\x82\x46\x95\x4d\x14\x05\x74\xea\x90\xa2\x0f\x25\x9e\x01\xf5\xfb\x73\xd3\x11\x0d\xef\xb6\x01\x99\x01\x67\x05\x43\x9a\xa1\x9d\xca\xab\x91\x6e\x2d\xaa\x14\xff\x79\x03\x33\x7d\x89\x66\x25\xc1\xcf\xce\x85\x14\xe6\x9e\x95\x81\xfe\x2b\xe3\x85\xaa\x53\xe0\x9c\x2d\x7e\x4a\xbf\x29\x0b\xaf\x66\x7f\x84\xa4\xfc\xa2\x29\x40\xdb\x97\x2d\x52\xa0\xd6\x02\x10\x97\xd8\x41\xf7\x98\xe4\x6a\xd0\xec\x31\xaf\xcb\xea\x9e\xfa\x52\xaf\x6b\x5f\xc0\x0e\xd6\xde\xae\x96\x06\xfb\xe9\x1e\x94\x7b\xeb\x6e\x23\x09\xea\xf3\xc5\xc4\xa4\xb7\x3f\xf1\x8a\xe5\xa6\x3e\x7f\x01\x88\xa4\x1b\x95\xe3\x0d\x12\x4c\xec\x51\x04\xe6\xec\xd0\x42\x5f\x74\xef\xd3\x1e\x7e\x4c\xee\xaf\xa4\xbf\x51\x31\xdf\x8e\x7e\x7f\xf2\x13\x4d\x53\x48\x4a\xd9\x13\x4c\xd7\x24\xad\x7b\x3f\xcf\xd7\x68\xef\xf0\x5b\xec\x0b\x66\xfe\xb4\xc9\x8f\xb3\xca\xdd\x5d\x69\xa9\x18\x39\x38\x2d\x09\x6d\xb6\xe5\xc6\x37\x49\x6c\xf9\xa7\x93\x71\x62\xc1\xe3\xb9\x55\xb5\xa9\x7f\x4d\x29\x84\xb8\x61\x29\x91\xd2\x59\x70\xc9\x24\xde\xac\xb8\x21\x4c\xc4\x4d\xb5\x82\x85\x20\x95\xf6\x8e\xe2\x66\x3e\x27\xa8\x61\x28\x24\x6e\xc4\xb6\xb9\x25\xdc\x2e\x1d\x8d\x70\x76\x36\x7f\x64\xa9\x14\xa4\x0b\x41\xea\xe4\xcd\xe4\x31\xea\x20\x4e\xd0\x60\x4b\x47\xd8\xb0\x7f\x4a\x11\xe2\xe9\x05\x0c\x59\x30\x0d\x53\x08\x0a\x03\x60\xc7\x5b\xeb\x89\xe4\x59\x68\xa6\x67\x9e\x79\x2a\xee\x42\xc8\xf7\x58\xf7\xda\x9f\x01\xb6\x9b\xa3\xb2\xf3\xb4\xf9\x1a\x13\x33\x20\x6c\xd3\xfe\x75\xb5\x08\xc4\xa3\x71\x94\x8d\xab\xcf\x2c\x04\xde\x39\xc5\xca\x50\xbe\x50\x7b\x21\xee\xee\xb8\x55\xf9\xa0\x5b\x45\x8b\x37\xc1\xe8\xfe\xad\x10\x06\x26\xf4\xed\x9f\x97\x85\x17\x02\xd5\xfe\xa9\x47\xa5\x9e\x15\x41\x73\xff\xda\x29\x34\x1b\xb2\xd6\x72\x41\x69\x6b\x2b\x7b\xcc\x21\x7c\x5c\xda\x81\x57\xd4\xc3\x5d\xa2\x2c\x3d\x5d\x59\x77\xb6\x1f\x73\x09\x1e\x75\x76\x07\x58\xa9\x5b\xfd\xef\xcc\xd5\x05\x03\xc6\x71\xfa\xbe\x75\x8c\x9a\x45\x5e\x36\x4a\x7c\x02\xdf\x00\xc1\x2e\x7f\x1b\xcd\xa5\xfc\x8f\x9c\x1b\x94\x09\x84\x57\x77\x10\x5f\xd2\xe2\x55\x34\x14\x4e\x4a\x44\xf3\x2c\xaf\x9c\x3c\x91\x29\x99\xa7\x7d\xe5\xdd\x26\x54\x9f\xb4\x69\xd9\x0a\x4d\x50\x4b\xb1\x78\xcc\x90\x7d\xd3\xf7\x5e\x1e\x45\xc8\x1e\x32\xfb\xe4\xb7\xf5\x59\x66\x16\x67\x29\x7b\x17\xe8\x37\x5e\x86\xe2\xac\x4f\x64\x81\xfa\x73\x5e\x5d\x07\x7d\xd1\x23\xb4\xb1\xe6\x06\xcc\x50\x85\x31\x09\xe8\x4e\x62\x4b\xba\x73\xdc\x45\x7d\xe9\xb6\x58\x16\xe9\x7c\xe9\x8d\x6f\xc7\x82\x8a\x43\xd6\x60\xf7\x4b\x24\x4c\xb7\xb9\x44\xba\xf0\x83\xdb\x4c\x1b\xac\x29\x96\xba\xbb\x32\xca\x95\xea\xfd\xd6\xb6\x6a\x60\x74\x44\x5e\x00\x28\x78\x26\x69\x56\xed\x5b\xf6\xe5\x83\x1b\x1e\x08\x18\xfe\x5c\xf1\x85\xe1\x08\xe3\x50\x41\x0a\x55\x0b\x18\x38\x43\xce\x25\x1a\xbd\x4b\x55\xf6\xfa\xea\xea\x9f\xa5\x77\xb6\x94\x4f\xaf\x92\x5a\xf1\x65\x0b\x47\xab\x6e\x9c\x3f\xbc\x46\x94\xce\xd2\x17\xa2\xf4\x17\x16\x5b\xdd\x2f\xc5\xb6\xe8\x60\xd5\x8d\xac\xdd\x31\xac\x30\xc4\x40\x88\x5a\x1c\xd8\xb4\x2e\xcb\x89\x1e\xf2\x5a\x98\x06\xc5\x11\xa8\xc3\x26\xe7\x28\x74\x10\xef\x4e\xff\xd1\xdd\x0a\x08\xe3\x26\x63\x86\x2e\xdf\xe8\xc2\xd5\xe5\x04\x5a\x02\x09\x9d\x4f\xa5\x43\x66\x37\x42\xd5\x50\x0c\xe6\x8b\x80\xd3\x50\x70\x57\xc9\x58\x3a\x5d\x1e\xd9\x03\xf5\x62\x60\x49\x8a\xff\x71\x0e\x67\xac\xbe\x5f\xa8\x5f\x7a\xd0\xd8\xc4\xe4\xa9\x2f\xb7\xa1\x59\x62\xa1\x5d\xfa\xe3\xe6\x88\x9e\xa8\xb3\x59\x74\x17\x8e\x60\xf3\x12\x90\xca\x34\xd5\x82\xac\x4d\x26\x2c\xc5\xdd\xd0\x05\x75\x3f\xa9\x2f\x92\x29\x3a\xdf\xea\xec\xda\x0a\xe5\xaa\xa0\xfd\x76\xbb\xfc\x32\x63\x48\x13\x5e\x31\x4b\xcf\xc0\x6b\x50\xa7\x8a\x19\x60\x13\xb3\xb2\xee\xc0\x8a\xec\xaa\x4b\x0f\x21\x10\x7d\x5b\x45\xd8\x1d\x89\x18\x62\x5d\xce\xc8\x14\x71\xc8\x77\x1c\xfb\x27\x24\xac\x6c\xce\x04\x2b\x18\x07\xba\x15\xf7\x3d\x05\x2a\x31\x38\x97\x44\x28\x1e\x31\x3a\xfc\x17\xb0\x38\x4a\x14\x4b\xaa\x5e\x55\xc6\x4b\x9e\x60\xd1\xac\x8e\x00\x94\xf8\x22\x6a\x30\x80\x8e\xb7\x93\x58\xda\x14\xb9\x20\x8c\xde\xfc\x74\xeb\x39\x61\x21\x9f\x72\x1a\x57\xb8\xa0\x8a\x34\xc5\x6b\x0e\xc5\x6e\xd5\x6a\x39\x9f\x23\x30\x52\xb7\xba\xcb\x7c\x55\x6d\x2f\x5d\x8d\xb8\x42\xb3\x97\x33\xf4\x6b\xb8\x0a\x58\x1b\xe7\x3c\xcf\xb1\x13\x63\xbd\x0e\x7f\x86\x1f\xa7\xc5\xf9\x5c\xd7\x54\xbf\xa3\x49\xd5\x5f\x6d\x4e\xc1\xd9\x41\x4d\x0d\x5a\xc0\x33\xe3\xea\x92\x66\x93\xcf\xa6\x7c\xe9\x98\xd1\x24\xab\xd8\x38\xa2\x4b\x9b\xfe\x05\x3c\x73\x7c\x3e\xc3\xfd\x0d\xac\xd2\x70\xe8\x9a\xc2\x6c\xba\x0d\x1f\xba\xe1\xbc\xb8\xd1\x0f\x32\x9c\x22\xc7\x57\xe9\x31\x1d\xa7\x72\xb0\x77\xbd\x2c\xbe\x58\x38\x75\x32\xaa\xf5\x38\x6c\x91\xc1\xc8\x7d\xc5\xac\xc4\xe9\xb9\x4e\xfd\x81\x23\x7e\xf9\x70\xd9\x1b\x95\x2a\x4a\x2e\x40\x5d\xac\x9a\x75\x38\x7c\x3d\x1c\xcc\xe6\x55\xe6\xee\x3a\x0c\xec\x46\xfe\xe5\x24\x46\x5a\x56\x46\xac\x4e\x6b\x73\xe2\xb1\x7a\x93\xb9\x2a\x91\x10\x95\xeb\x5d\x67\xb1\xc6\xce\xd2\x8f\x45\x2b\xc4\x51\x89\xd6\x5c\x47\xba\x40\xb9\x2b\xd9\xa2\xf5\x2d\x34\x46\x8b\x19\x76\x13\x98\x45\x6c\xd0\xbf\x2d\xdd\x98\xcd\x2f\xf6\x1c\x16\xf9\x3e\xc9\x65\x4b\x5a\x1b\x18\xfc\x0f\x4a\xd6\x91\x48\x8c\x0f\x70\x05\x07\xfa\x9d\xff\xe4\x27\x76\x4f\x9b\x6d\x5a\xf1\xe2\x2e\xe2\x30\x89\xd3\xec\x25\x28\x86\xd4\x46\x10\x4b\xe0\x45\xa8\x28\x76\x2e\x81\x45\x85\xce\x98\x33\x3c\x6c\x80\x3e\x7c\xd6\x6e\x01\x5f\xb0\x9b\xdb\x7d\xba\xec\xb7\x24\x74\x04\xf0\x4b\xeb\xf1\xe8\x6f\x12\x2a\x63\xbd\xe0\x99\x96\x24\x93\x0c\xee\xf6\x67\x8e\xec\x64\x43\x25\xa0\xc6\x89\x5e\x0c\xb4\x95\xba\x4e\xe3\x8e\x05\xfa\x5b\x6c\x72\x59\x09\x4d\xcd\x14\x53\x38\x8b\x42\x94\x8c\x5f\x47\x80\x08\x95\xc9\x46\x09\x92\xd9\x73\x16\xa6\x8b\xcd\x94\x54\xed\x6a\x46\x96\x2b\x1b\x96\x41\x61\xab\x59\x9b\x02\x7e\xf2\x5e\x6f\x46\x00\xc3\xf5\xa2\x08\xcf\x70\x55\x1b\x77\x79\x2b\x59\x23\x7b\x4a\xd2\xdc\x20\xbb\x26\x9e\x64\x00\x3b\x2f\x6e\xf5\x20\x7a\xcd\xe5\x7d\xf2\x45\xf1\x77\x11\x64\xe9\x5d\x34\x39\x56\xbf\x9a\x3c\xbe\x0a\x45\xc7\x32\x2b\xdf\x36\xf5\xdd\xb1\x7a\xc3\x57\x3b\x41\x47\x53\x88\x9d\x7d\xf8\x55\xc0\x23\x04\x92\x17\x71\xdc\x0e\xb8\x73\xff\x88\x0a\x5d\x2e\x8a\xa9\x4d\xf6\xd3\xfe\x25\x21\x40\xe7\xc2\x49\x5b\x93\x5e\x3b\xbd\xe6\x34\xd5\x6a\x52\x57\x6f\x16\xac\x78\xb9\xe9\x8c\x1a\xb0\xed\xb4\x30\x7d\x5e\x48\x8c\x89\xb3\x7c\x6b\xe5\x27\x01\x19\xe5\x63\x6f\x12\x93\x2a\x1d\xc7\xc9\x99\xb8\x8b\xa0\xf1\x28\x4b\xdd\xc4\xbc\x4f\xee\x31\xe3\x70\x46\x88\x9c\x09\x1f\x95\x02\x36\x09\x93\x34\x74\xb2\x3e\xb9\x86\x9c\x5b\xb5\x1d\xdb\x84\xb2\x4f\x5b\x7f\x4d\x81\x24\x9d\xc3\x5b\x03\x7a\x6f\xae\x20\xf0\x20\x70\xf4\xf0\x49\x08\x21\xa4\x58\x9b\x76\xdd\x08\xfa\x39\xf1\xdc\x56\x24\x6b\x39\x60\xa2\xc7\x38\xc0\x55\x4a\x22\xa5\x68\x93\x5e\xec\xab\xc5\xc8\xcb\x6f\x42\x78\x9a\x4f\xb9\x57\xa4\xc9\x52\x48\x2c\x1a\x7a\x0c\x2c\x51\xc0\x0d\xb5\x90\x93\x26\x5a\x4b\x58\x1e\xb0\x89\xf0\x9e\x46\x25\x2f\xa9\xaf\xf2\x61\x2e\xe9\x4b\xd5\x27\x9e\x5b\x57\x89\x24\x76\x69\xed\xa3\xda\xb8\x06\xf0\x46\x0b\xf0\x6c\xf7\xe5\x11\x80\x2e\xa2\xda\xba\x61\x6f\x5c\x6c\x39\x74\x78\xa8\x1f\xac\x09\x8d\xb9\xc6\xd5\xfc\x05\x2d\x6d\x42\x8e\xd4\xa2\x8e\x7b\x9e\x7e\x69\xf8\x8f\x5e\x6a\x3e\xbb\xfd\x2b\x13\xf5\x79\xfe\x0a\x1f\xc8\xbf\xcc\x2e\xfe\x2f\x39\x5e\xcd\xe5\xcd\xd2\x4c\x41\x33\x4e\x79\x3f\x5b\x8b\x84\x04\x06\x69\xc4\x2e\x96\x12\x5b\x9b\x16\x53\x64\x6c\x84\xc2\x86\x23\x28\xed\xa9\x2d\x9f\x7d\xd4\xee\xc5\xa6\x8b\x5a\x36\x45\xe3\x29\x4d\x32\x9b\x88\x8b\x92\x89\x30\x55\xdc\x28\x94\xcc\x04\xd2\x1c\x67\xee\xb1\x07\x36\x50\x9c\x9d\x90\x99\xe8\x5a\xfc\x69\xb3\xfe\x59\xa7\x94\x47\xdd\xda\xd0\xc3\x62\x6a\xfa\xc9\x4d\xad\x09\x7f\x12\x45\x66\xc1\x0c\x64\x5f\x07\x67\xb5\xc2\x2d\x1f\xbe\xf7\x78\x04\x91\xd6\x86\x95\x7c\x25\xba\x7c\xbd\x51\x81\x9b\x35\xc5\x7d\x43\x14\x8b\x40\xc7\xbc\x75\x49\x58\x4b\xa1\x03\xde\x58\x8d\xf0\x2d\x7d\xd7\x1c\x3d\xe9\x3d\x19\x54\xae\xcb\xf9\x8e\xdd\x36\xe8\x5f\xed\x48\x84\xe5\x34\x06\x7e\xb2\xaa\x9a\xbe\x13\x52\x56\x9c\xa3\x8d\xda\xd6\x2d\x2a\xe9\x3f\x57\xb9\x18\x9d\x37\x29\xeb\x5c\x31\x8b\x55\xbc\xfc\x8d\x02\x51\xa6\x3d\x00\x8e\x30\x95\xaa\x10\xca\x73\x3c\x2a\xd6\x71\x3f\x4e\x1f\x22\x60\xce\xe6\x2b\xd5\x81\xae\xd4\x9d\x9c\x34\x99\x3b\x17\x20\x98\x43\xdd\x8c\x0f\x2b\x0d\xda\x18\xe5\x79\x9d\xca\x75\x83\x2d\x6d\xae\x9c\xaa\xc0\xd9\x19\x1a\x68\xd6\x21\xf8\x45\x3f\x17\xcc\x3e\xab\x9c\x19\x66\x74\xae\xac\x18\x7f\xe2\xbd\x47\xef\x6c\x32\x0a\xd9\x0b\xaf\xc6\x92\xbc\xce\xc9\x4f\x6f\x30\x81\x96\x93\xf4\x71\x01\x1e\x94\x65\xc6\x16\xc0\xc6\x73\x5b\xe0\xdc\xca\x50\xd8\x9e\x43\xda\xde\x87\x5d\xe1\x4e\xc5\x66\x8a\xa3\x31\x8a\x95\x33\xe0\x32\x57\xa9\x9f\xe1\xda\x1c\x04\x03\x6e\x79\x7d\x51\x76\xcd\x01\x98\x0c\x72\x1f\x32\x69\xe9\xa8\x1d\xda\xe1\x4e\xa2\x93\x5e\x41\x9c\x43\x8a\x2d\xad\xf9\x4f\x80\x4d\x9b\xe4\x28\xea\x32\xb5\x31\x50\x51\x70\x80\xa0\x74\x21\x0e\x00\xc5\x37\x97\x98\x38\xbc\x0c\xe9\x81\x34\xc1\x9c\x1f\xe3\x48\xd3\xe0\x45\xbb\x36\x99\x5b\xe1\x78\x63\x2b\x29\xf0\x93\x5a\x55\x3f\x28\xf5\xaa\x38\x2d\x91\xbc\xc1\xfa\x8d\x95\x02\xea\x94\x2d\xa1\xbe\x84\xb2\x37\xbd\xc7\x1d\x3d\x29\x13\x4b\x17\x21\x4b\xdb\x2b\x32\x09\xb4\x5f\xa8\x0b\x13\xbb\x88\x7a\x3e\xd1\x93\x59\x45\x81\xa3\xe5\xa7\x05\x12\x0f\xae\x70\xc2\x95\x26\x5f\xa4\x62\xd7\x7d\xa4\x00\xaa\x78\x83\x72\x68\xe9\x65\xbd\xed\x03\x08\xc7\x22\x0b\x10\x6a\x9a\x59\xca\x5a\xd8\xd8\x6e\xcf\xb7\x58\x63\xb6\xc1\x69\x8d\x42\x05\x94\xca\x42\x0c\xc2\x01\x90\x3c\x75\x36\x91\x2a\x12\xec\x8a\x07\x44\x28\x28\xcc\xbd\xf6\x80\x31\x9e\xee\x96\xee\x77\x12\x44\xcc\xbe\x90\x95\x8d\x04\x4b\x2c\x82\x93\xe3\xd9\x0b\x0f\xe9\x3a\x51\x92\xee\x3a\x9b\xb9\xea\xb6\xec\x00\xfb\xd6\x86\xf5\xb7\x4b\x45\x85\x41\x55\x4a\xf7\x0e\x15\xcf\x58\x46\xc7\x4f\xb2\x1e\x82\x54\x20\xa9\xb5\xfe\x03\x2c\x25\x22\xae\x70\xe3\x04\x7e\x0f\x56\x71\x23\x8f\x92\xb7\xb6\xa3\x26\x19\x8c\x36\xea\x8d\x8c\xfa\x39\x79\xb2\x49\x4b\x39\x0f\x30\xaa\xca\x31\x0e\x4a\x6a\x94\xb7\xb2\x9f\x4a\xbe\x66\xc0\xb9\xd2\x18\x0f\x3f\xcf\x1c\x9a\x6b\xa9\xce\x4f\xf7\xff\x9d\xd9\xee\xe9\x9d\x61\x55\x47\x83\x2e\x90\x90\x6a\xab\x0b\x48\x09\x45\xe9\xcb\x56\x04\x4d\xf2\x0b\xd6\x71\x09\x6d\xb5\x7c\x97\x69\xad\x21\x0f\x46\x07\x52\x3e\xaf\x88\xb0\x98\xab\x3f\x1a\xfc\x3f\x62\x20\xa9\x69\xbc\x63\x74\x9c\xb4\x67\x9a\x55\x02\x00\x33\x1b\x13\xde\x9f\x68\x80\x30\xc5\xb5\x6c\xc1\x29\x03\x32\x69\x77\x1f\xad\x20\xf7\xd2\x54\x84\xa2\xf5\x40\xcf\x49\xa2\xb2\x21\xaf\xa6\x58\x8a\x6d\x22\xcd\xed\xd3\x18\x7c\xbf\xdd\x4d\x7e\xfd\x32\xbc\x2e\x57\xf8\x0a\x61\xb4\xd3\x33\x85\xfd\x35\xbe\xdf\x82\x2c\xbe\x6c\xb0\x94\xa7\x9e\x65\x12\x71\x4d\x3d\xf4\x20\xb4\x99\xf7\xfa\x67\x23\x45\x0b\x2b\xba\xdc\x04\x9e\x91\x5d\xd3\x3e\x9c\x55\x89\x6e\xe0\xa8\xb7\x87\xb7\xf4\x1e\x96\x70\x96\xcd\xff\xbc\xb9\x67\x7c\x73\x23\xd2\xbb\x43\x0d\x03\x5e\xe8\xa0\xc3\x4e\x71\x86\x06\xdf\x0d\x41\xfc\xcf\x5b\xba\x0a\x62\x45\xec\x5f\x81\x47\x40\x08\xcb\x3c\x91\x20\xbe\x7b\xc5\x8f\x69\xa4\x0d\x6d\xf2\x1a\xcc\xd2\xf8\x85\x4a\x1a\xa1\x93\xe0\x5a\x06\xb8\xc8\xa5\x0e\x22\x5f\xda\x41\xee\x11\x60\xb2\xbd\x5d\x12\x5b\x68\xfc\x4c\x53\x4c\xed\xf7\x76\x98\xab\x41\x33\x20\x87\x0b\xaa\xaf\x32\xcb\xcb\xa1\x5e\xd8\x7e\x71\xb4\x76\x50\xf2\x46\x06\xc0\xdf\xfb\x01\xa1\xe3\x66\xd3\xce\x41\xb9\xc7\x4e\xa8\xc4\x8e\xd5\xc8\x54\xc1\x87\xa1\x3b\x97\x96\x20\x00\x03\x46\xc8\x03\x5b\xe7\xde\xb3\x57\xdd\xec\x11\x0f\x9b\x3c\x09\xa2\xed\xb9\xa1\x25\xbc\x85\x09\x17\x99\xa0\xc1\xa5\xe3\xb4\x0a\x72\x68\x51\xb4\x76\xf3\x3c\xe2\xde\x46\x39\xe7\xb5\x05\xfa\xde\x0f\x82\x06\x21\x12\xe0\x37\xc0\x96\x3f\x5b\x11\x50\xef\x4d\x78\x19\xe3\xe4\xab\x4f\x98\xa8\x81\xb6\x14\xa6\x77\xbb\x6c\x9a\xab\xca\x19\x63\x87\x17\x0a\x2d\x48\x67\x16\x59\xc1\x65\xaf\x43\x6a\xc4\x87\x64\x3c\xff\xb6\x5c\xaa\xa3\x21\x74\xd1\x3e\xd4\x56\xd3\xf2\xbf\x5c\xf2\xf8\xd1\x73\x83\x19\x13\x35\xca\xec\x77\x05\x1c\x6e\xb8\x11\x8b\x37\xc2\xf1\xb7\x8c\x15\x4c\x08\xef\x98\x6d\xa9\xd8\xc1\x71\x6e\xce\x6d\xaf\x00\xc4\x8a\xf5\x77\x3c\xdd\xa6\x13\x92\xf3\x03\x4f\x53\xba\x6a\xfc\x7b\x28\xd4\x64\x5b\x7f\xef\xa3\x22\x13\xe3\xdb\xe0\x4c\x1f\x13\x0d\x80\xf2\xf6\x6a\x47\xd8\x7c\xa1\x2b\x29\xb7\xc6\x30\xdc\xc8\xa0\xb5\xb6\xc6\x0d\x8d\x34\x90\x25\xe0\x4d\xd2\xdb\xd6\x7d\x07\x5a\x14\xd4\x51\xee\x3a\x76\xc7\x7d\xda\x30\x48\x84\x08\xf1\xa0\xa8\x5a\xe9\x9b\x52\xf7\x95\xbf\x80\xcd\xe2\x4f\x9d\x05\xac\xd9\xa2\xf3\x7d\x3e\x28\xc3\xf6\xe2\x96\x72\x56\xeb\x85\xfb\xc0\x39\x0e\xd1\x7c\xb8\x08\xdb\xc8\x0c\x60\x95\xfb\x2e\xb0\x91\xf1\xc7\x57\x15\x36\x62\xf0\x5c\x77\x6d\xaf\xe6\xab\x15\x3c\x99\x04\x77\xb4\x53\x69\x18\x1d\x61\x3b\x0e\x1c\xe5\x36\xe6\xc0\xd3\x41\x6e\x63\x0f\xcd\x13\x20\x27\x43\xd5\x7e\x75\xb1\xa4\xf8\x22\x9a\x12\x31\xf9\x85\x7f\x9f\xce\x26\x54\xd6\x6e\xbb\x3f\xfb\x71\x42\x8c\x7b\x75\x10\x69\xf7\x05\x9e\x8c\x77\x81\xa1\x51\xe3\xe5\x55\x0d\xfd\xe4\x66\xb6\x56\x46\x33\x50\x95\x70\xad\xf3\x27\x59\x86\x7f\x8a\xe2\xcc\x5c\x7d\x96\x1e\x7c\x2e\xe6\x16\x6f\x74\xe4\x81\x4d\x7e\x3f\x81\x7c\xac\x97\x10\x9a\xea\x5c\xa8\x02\x7f\x05\x98\x9d\xc2\x78\x97\x11\xe0\x82\x3b\xcc\x3f\x71\x04\x97\xb9\x65\x8d\x86\x0c\xcc\x50\xb8\xf3\x86\xe0\xa3\xae\x1a\xab\xba\x26\xa4\xd6\x76\x81\x1e\xc3\xdc\x8b\x40\xe6\x58\x48\x91\x73\x92\x10\x4f\x98\xed\xdc\xba\x71\x74\x03\xd4\x51\xa3\xd2\x04\x84\x01\x27\x95\xde\x4b\x1c\xdd\x3a\x7e\x52\x2f\xad\x97\xb6\x6b\x76\xe2\x8b\x37\xec\x69\xf6\x2b\x96\x6f\x60\xa6\x1c\xfe\x6c\xf0\xb6\x8e\x93\x36\x83\xb0\x9d\x15\x38\xf2\x18\x0a\xb5\xa1\x31\x3d\xa3\xf3\xc4\x0a\x41\x2f\x61\x33\x37\xa0\x33\x8b\x46\xcb\xaf\xa6\x5a\xe0\x91\xe3\x6f\x4b\x8f\x0a\xd0\xd4\xd7\x06\x29\x6c\x4d\x37\xdb\x68\x4d\x22\xb0\x58\x10\x72\x00\x58\x70\xc4\x88\xab\x8f\xec\xe3\x9b\xda\xe1\xb2\xf7\xcd\x8c\x2b\xe2\x12\xb9\x69\xc0\x32\xed\xb7\xbc\x14\xe2\x17\x99\xd5\x1d\xf9\x43\x40\xb8\x9a\x4d\x72\xb8\x7c\x82\x84\xe2\x25\x45\x5d\x8b\x7b\xce\xe0\x2d\x6a\xa8\x11\xb7\x8d\x72\xfb\xb3\x9c\x7a\x51\x5d\xb8\xd0\x96\xa5\x14\x8e\x3f\xa5\x50\xa3\xed\x96\x79\xf3\xa9\xbe\x2b\xc1\xfa\xd6\xcb\x35\xa5\xeb\x54\xbc\x2c\x0d\x2d\x2e\xf7\x47\x00\x2c\xf9\x9c\x95\x66\xba\x7d\x49\xd1\xa0\xb8\x96\x4c\x0a\x4b\x94\x10\xd8\xe6\x1f\xc4\xf5\xcf\xf2\xf3\xb2\x8e\xc5\x31\x91\x57\xef\x05\x81\xe5\x22\x30\x12\xb9\x2c\xa1\x8e\xf5\x41\xb2\x28\x26\x58\x4b\x51\x1d\x6d\x59\x68\x08\x68\xb7\x9f\x03\x24\x6f\xec\x97\x85\xbd\x9e\xaf\x45\x85\xd8\x25\x7f\x76\x27\x86\xee\x6c\x3c\x7d\x26\xc7\xe1\xc8\x9a\x4d\x61\xc6\x4f\x50\x26\xe6\xf3\xfe\xbb\x2e\xd9\x7d\x93\x74\x0e\xe8\x9c\x85\xe8\x24\xa6\x4c\xb8\xcd\x2d\x5e\xef\x27\xbb\xee\x52\xb0\x73\x47\x43\x04\x28\x8e\xeb\xa7\x84\x5f\x84\x4c\xef\x16\x28\x57\x14\xc1\x3c\xa1\x37\xa7\xcf\x00\x02\x83\x8b\xa8\xae\x3d\x67\x29\xd1\x4e\xf4\xe7\x4a\x0f\xc4\x89\x9b\x11\xbe\xa4\x0f\xa0\x33\xc9\xb1\xf4\x70\x6f\x27\xa1\x3b\x37\x2e\x55\xdb\xac\xdc\x67\x61\x0e\xf7\x94\xae\xac\x70\xa0\xae\x00\x3f\x9f\x31\xdc\xa0\x6a\xb5\xfb\xf6\x45\xb7\xc5\xb9\xea\xb4\xce\xa7\x27\x9a\x42\x7c\x22\x71\x14\x5c\xb2\xd8\x0c\xff\x41\xa5\xba\x5e\x0f\x31\x3c\x94\x4f\x45\x05\x72\xe2\xf4\x61\xa4\x85\xe2\xc5\xb0\x63\x4e\x33\xa3\xb7\xdb\x5f\x8f\x50\xa4\x13\x2e\x14\x61\xd5\x8d\x2b\x61\x48\x58\x3a\x4c\x73\x6e\x64\x22\x68\x08\x3a\x09\xa1\x4b\xc7\x9d\xdd\x96\x05\x91\x9f\xce\x58\xb9\x0c\x23\xbf\x19\xc4\x7d\xdf\xda\x5d\xf3\x61\xd0\x71\x56\x3c\x8f\x73\x21\xff\x15\x88\xd8\x00\x8f\xcc\xe3\x6b\xa0\x22\xcd\x9c\x31\x6d\x1b\xe5\xbb\xb8\xb9\x63\xd4\x83\x28\x51\xcb\xe8\x13\x0f\xd1\x9a\xed\xec\xe0\x00\x5d\x53\xf7\x66\x1c\x3b\x85\xfa\x59\x2d\xd4\x0a\xbb\x45\xc0\xd6\x13\xfa\x31\xb7\x7d\x0a\x05\x67\x3c\xf9\xc2\x8c\x56\x7d\x0d\xc4\xa9\xe5\x34\x71\x16\x95\xca\x66\x53\xf1\x06\xfa\x32\x7e\xc7\x82\x99\xda\xfd\x7f\xc6\xbb\x26\x68\xf6\x48\x37\xcf\x6e\xa4\x6b\x0f\x51\xbc\xdf\xb8\x85\xe7\xd4\x71\x8e\x0c\x28\x28\xa1\xa7\x2d\xbd\xa8\xf5\x3d\x30\x5c\x11\xc2\xf1\xd2\x24\x72\xba\x5a\x87\x92\x4e\xa7\x33\x09\x3d\x93\xf3\x58\x58\x4e\xeb\x76\xc4\xb2\x98\x2c\x9f\x59\xfe\x84\xd8\x8c\x5c\x1b\x3a\x76\xda\xc3\x0a\xfd\x24\xde\x19\xf1\xa0\x74\x88\xb4\xf1\xb9\x0f\x30\x24\x0a\x33\xc2\xd1\x4d\x50\x45\xe1\x8a\x16\xee\x63\x02\x46\x01\x1e\x5f\x02\x15\x5a\x45\xa0\x3c\x8e\x1b\x6b\x1a\x25\x81\xed\xfa\x78\x7c\xb9\x4f\xd2\x4b\x9e\x2c\xef\x60\xb1\x04\x90\xed\xa6\xa4\xb0\x8e\x9c\xc7\x8f\x10\x59\x53\xee\x7d\x78\x76\x44\x27\xd1\xa5\x28\xa2\xf3\xed\xe9\x73\x85\xfa\x1e\x70\x49\x49\xc0\xd8\xa4\x39\x24\xd4\x4c\x5a\x1a\xc7\x43\xe3\x8a\xfc\xe6\x17\xae\x3f\x65\xee\x96\xa2\x25\x86\xd7\xc2\x04\xc6\xfa\xf9\x57\x05\x56\xfa\x26\x23\xa5\xb2\xa1\x4d\x2e\x2c\x36\x82\x5c\xaa\x3e\x58\x58\x76\x5f\xab\x79\x65\xdc\xd4\x8e\x57\x78\x25\xf7\xd1\x75\x0d\x3c\xdf\x52\x72\x8f\x45\xd8\x5f\x15\x61\x7f\x35\x59\xfb\x2d\x57\xa0\x1f\x69\x39\xa9\x98\xee\x2d\xbf\xfc\xf1\x7e\xc7\x70\x2b\xfa\x0d\x7b\x42\x60\x2d\x5d\x8b\xf3\x37\x2b\xbf\xfe\x4d\x4b\xe0\x30\x21\xc7\x98\xf6\xe4\x7d\xd2\x6f\xa8\xdf\xfe\x12\x6e\x00\xb5\x45\xff\x09\x6c\xba\x76\x94\x55\x02\x79\x00\xa6\x3a\x56\x11\x65\xa3\x15\x3e\x4c\xb7\x5b\xe5\xa6\x42\xf8\xb8\x78\xe5\x6b\x09\xbd\x3b\x61\x2a\xa5\xa7\xc7\xe5\x66\x37\x5a\x79\x50\x45\xef\x79\xfb\x65\x05\x38\x52\x9f\xe3\x86\xcf\x01\x9b\x1c\x62\x39\xdf\xc3\x50\x85\x02\x98\x88\xa8\x46\x0b\x96\x93\x50\xc8\x50\x5c\x96\xb0\xde\x5f\x88\xec\xe5\x7f\xd5\xc8\xd2\x7d\x32\x3d\x02\xca\x38\x7d\x79\x6e\xe6\xff\x9c\x8f\x75\x10\xf1\x16\xe0\x01\xe6\xd8\xdf\x55\x9e\x8c\x3b\x66\x1e\xb7\xd4\x1f\xea\x39\x9a\x6c\xa1\xf1\x04\xb9\xe8\x96\xec\x73\x6b\x84\x2a\xa0\x24\x7f\xcd\xed\x4b\xd3\xcf\x8d\xa8\xb4\x38\xa3\x91\xd5\x75\xfb\xde\x51\xfc\xb5\x16\xc6\x48\x7e\xc1\x74\x63\xd7\xec\x84\xca\x26\xbb\x4a\x10\xe8\x75\xf9\xb1\x9c\x39\xba\x88\x3e\x80\x97\x85\xea\x3b\xad\x9a\x72\x8c\xb4\xac\x5b\x0a\xa5\x03\xbc\x23\xf4\x68\x02\x74\x39\x8d\xb5\x73\xb7\x66\x52\x95\x64\xa0\x71\xc6\x70\xea\xda\x0f\x67\x17\xeb\x18\x83\x13\x59\x36\x59\x5a\x96\xb7\x70\x98\x8b\x1c\x29\x86\x92\x7a\x2a\xe7\xcd\x9c\xe6\x0c\x63\x70\x84\x06\x54\xb7\x06\x2e\x30\x0f\x2a\x11\x0d\x7e\x39\x85\xd4\x1b\x60\xa3\x5e\x4d\xc4\xa0\xcb\x36\xea\x6b\x32\x6b\xf6\x83\xbb\x31\xca\x82\xd3\xae\x8c\x80\x9e\x79\xdc\x26\x19\x32\xc1\xd5\x43\x03\xbd\xaf\x77\xee\x64\x7c\xba\x0d\x27\xab\xec\x08\x3b\xd9\xbd\x0d\xd5\x12\x01\x4e\x9c\xa3\x44\xfe\xec\x5d\x6e\x7a\x26\x90\xe4\x97\xf8\x2b\x1b\x71\xb6\x96\x0d\x36\xb5\x0c\x0f\x45\x9b\x58\xdc\x1e\xd2\x1a\x57\xd8\x1e\x45\xca\x0c\x52\x46\x90\x7a\x81\x18\xa9\xf8\xaa\xdd\xfd\x1c\xc7\x06\xb0\x33\xb1\xaf\x3f\x0f\x61\x31\x59\xd7\xed\xcf\xd9\xc7\x6f\xf8\x73\x8a\x42\x63\x61\x97\xb1\x2a\x8b\xd8\x06\x6d\x5f\xae\xe8\x37\x69\x88\xf5\x5b\xa0\x38\xc7\x9d\xed\xb0\x88\x87\x17\x27\xf7\xa8\x73\x71\x91\xc1\xf7\x28\x57\xcc\x8d\xe5\xc3\x7e\xab\x34\x07\x70\x48\xec\x21\xf0\xef\x29\x42\xe7\x58\xf0\x54\xa0\x3a\x4a\xbf\x88\x10\xda\x87\x52\xa3\xcd\xc6\x1c\x05\x65\xdb\x79\x0d\xc8\x66\x0a\x50\x45\x3f\x62\xb9\x93\x7b\xb1\xe4\x1b\x54\x8f\xde\x06\x45\x4c\xf4\x10\x66\x4a\x6d\xf9\xee\xec\x12\xca\x81\xd7\xf4\xc5\x1c\x3f\xcf\x74\x75\x5e\x20\xeb\xb9\xac\xdd\xfb\x64\x2e\x11\xba\x09\x90\xa6\x8e\x5a\xfa\xa6\x5a\x79\xf4\x90\x40\xff\x0e\x85\xd9\x94\x7f\xe6\x49\xe8\xd3\x13\x22\x62\x0c\xca\xa7\x82\x31\x0b\x0b\xe4\x16\xfc\x1c\x7e\x49\x9e\x5b\xe0\x09\x37\xfa\xd4\x3d\xc1\x20\xbe\x84\xee\x04\x39\x4d\x30\x1a\x9f\xf1\xf2\x5b\xad\xdf\xea\xb3\x4c\x0c\x80\xbf\xdc\x69\xfd\x09\x50\x88\x12\xb5\x67\x11\xfc\x12\xa8\x9e\x8b\xd1\x5a\xf1\x8d\xd0\x3a\xfc\xd1\xeb\xb2\x6c\x79\x4e\x4a\x47\x9e\xd5\xef\xd3\xe6\xa5\x4f\xfa\x4f\x54\x58\xa6\x50\x97\x0e\xcc\xdc\xc6\x90\x64\xfb\xda\x21\x8c\x26\xda\xf5\xb5\x34\x09\xb8\x49\x79\x22\x30\x1b\x32\x3f\x55\x57\xce\x61\x9c\x0f\x47\x68\x6a\x01\xfb\xe9\x75\x14\x47\x60\x52\x1e\x91\x9f\xeb\xb1\xfe\xc0\xf4\x47\xa8\xe6\x47\x5e\xab\xe9\xa8\x18\xcd\x3d\xb2\x64\x0f\x43\x1b\xfb\x99\xb6\x80\x6b\x12\xc4\x29\xd5\x49\xfc\x82\x0c\xa6\x3d\x72\xe4\x67\xf2\x34\x2d\xa4\x15\xf5\xa7\xc4\xa2\x17\x80\x9d\x59\x2b\xbe\x37\xae\x53\xd0\x48\xfa\x93\x6a\xd6\x17\xc8\x4e\x1e\xd9\xda\xe5\xff\x63\xb4\xc5\x08\x01\x7b\x52\x08\x53\xeb\x83\xdb\xf4\xbe\x11\xa2\x69\xfe\x62\xf3\x64\x09\xa8\xdb\xe4\xd3\xf1\x8f\xc2\x76\xf9\x02\xb6\x1c\x4d\x77\xa6\x6e\xd2\x70\x64\xe1\xcd\xe5\x4d\xb0\x6a\x42\x70\xe9\xff\x54\xf1\x42\x30\xc9\x5b\x0a\x0f\xaf\x75\xc4\x5f\x9e\xe9\xae\xf1\xc8\x33\x42\xfd\x4d\x7a\x8f\x70\x73\xe0\x17\xa1\xf8\x9a\x15\x02\x5a\x4d\x80\x26\x00\xa2\x5b\x75\x30\x0d\xf3\x95\x0c\x21\xb9\x41\x4b\xf1\x20\x1c\x89\x7f\xe0\x30\x50\xbe\xb1\xef\x65\xc1\x92\x3b\x69\xbb\xa1\x00\x52\xe2\x0a\x57\x32\x61\xd8\x83\xe2\x6b\xe4\xfe\x12\xb5\xb4\xee\xda\x31\x6a\x13\xaa\x29\x8f\xcc\x93\x6e\xa6\xd0\x65\x16\x54\x0f\x66\x49\x42\x1b\x5a\x96\x03\x1e\xdc\xc3\xf1\x9c\x0b\x67\x6c\x44\x76\x0a\xcf\x09\xce\x2a\x51\x9c\xd6\xd3\x07\xfa\xa4\x83\x7c\x95\x0c\xc4\x2c\xee\x29\x4d\x80\x28\xa0\x7d\xe5\xe3\x8f\x1b\x64\xce\xa0\xdc\xaf\x50\x1f\x8a\x1a\x56\x61\xe4\x3f\xed\x36\xfe\xf3\x46\xbc\xac\x4a\x8f\x05\xac\x8b\x38\x24\x54\x32\x7a\x10\x96\x04\x9c\x78\x7f\xdc\xa2\x91\xa1\x04\x89\x25\xd6\xe9\xd0\x51\x3e\x73\x8a\x04\x02\x90\x4e\x64\x8b\x0a\x87\xb4\xdd\x82\x92\x09\x1d\x77\x80\x0f\xc7\x4d\xc3\x42\x67\x87\xa3\xa0\xc7\xef\x59\xfa\x81\x1f\x1b\x95\x38\x22\x40\xe3\xc3\xc1\x29\x5c\x3c\xc9\xb2\x78\xe6\x91\x51\xda\xeb\x46\x27\x83\x22\x71\xda\x46\x02\x6f\x69\xa7\xca\x8f\x71\xda\x6d\x84\x36\xeb\x8d\xab\x6a\x39\x0e\xe0\x5d\x1b\x21\x95\x75\x36\x43\xc5\x4a\xee\x84\x11\x55\xf8\xa6\xee\x79\xbb\x41\xa0\x2b\x37\x04\x70\xae\x3c\xe0\xdb\xc0\x0e\xad\xf4\x0e\xc5\x4a\xe1\x43\xf9\x99\x76\x77\x2f\x81\x4f\xb5\x3e\xbf\xce\xf3\xc2\xca\x55\x2f\x79\x41\x3a\xc7\xa7\x3d\x75\x07\xfb\xec\xad\xd3\x3e\xbf\x43\x74\x46\x79\x6d\x8b\xfe\x12\x87\x8c\x4a\x1c\x13\xd5\xe4\x5d\x21\x14\xb8\xf7\x1a\xa6\x1b\x56\xda\xd6\x0a\x52\xc4\x1e\x36\x02\xb1\xa6\xae\x29\x13\x21\xa4\x76\x1f\x9f\x1a\x7e\xbb\xe4\xcb\x71\xbc\x59\x6d\x40\x15\xfa\x98\x49\x76\xa0\x4a\x19\xf7\x2a\x6d\x75\x96\x2a\x7a\xb5\xa6\xfb\xf1\x9e\xa5\xbd\x00\xd6\xc6\x2b\xd6\x5f\x41\x06\x9f\xe5\x02\x4b\x43\xdf\x11\x20\x95\x23\x72\xd1\x95\x9b\xb9\x77\x1d\x25\x08\x79\x92\x47\xdd\x9e\x30\x5f\x58\x7c\x61\xa9\xdd\x4e\x55\xd4\x2c\x12\x2a\x74\x13\x08\xbf\x85\xa2\x71\x00\xe4\x10\x6b\x8a\xd9\x6e\xe1\x9d\x89\xb4\x19\xde\x60\x94\xd4\x8c\x15\x46\x88\x4d\x54\x20\xeb\xd3\x95\x57\x10\x17\xfa\x3a\x0b\xb0\x9a\xda\x43\x8d\x3d\x07\x6a\xf4\xac\x80\xca\x4d\xb2\x7c\x00\xb0\xe6\xa4\xa0\xd9\xc2\xda\x76\xeb\x12\xb1\xa0\xb0\x10\x96\x90\xaf\xa3\x57\xaf\xc0\x9f\x1e\x55\xb2\xce\x1b\x15\xed\x8f\x56\x3c\x82\x1e\xcf\x6b\x78\xe3\x63\x6a\x7f\x02\x63\x13\xf0\xd4\x6f\xb4\xb3\x37\xc7\xf5\xf6\xa8\xb5\x9b\x6d\x0b\xa7\xdb\x98\x1b\x5b\xf8\x5b\x34\x5f\xb4\x58\xb3\x99\x87\xb0\xae\x31\xe5\x77\xe7\x5a\xbf\x6c\x6c\xb4\x50\x99\xd2\x09\xb4\x45\x97\x65\x69\x25\x21\x6a\x83\x10\x15\x4b\xdd\xc3\x3a\x00\xae\xeb\xd7\xa7\xfd\x87\x59\xce\x6c\x64\xdc\xab\x58\xe8\xfc\x1f\x18\xec\x71\xe8\xf9\x14\x0c\x36\x7f\x35\x51\x9f\x51\x7e\xdd\x86\x22\x76\x7b\xff\x39\x3d\xa4\xf8\x84\x7d\xa5\xcd\x61\x5b\xaa\x3e\xab\x75\x90\xc1\x0e\x69\xa7\xb3\xaa\xe4\x43\x94\xd4\x93\xdf\xd6\xa6\x3b\xcb\x93\x48\x27\x8b\x93\x30\xab\xf0\xc8\xe6\x2f\x3e\x39\x88\x8f\x3b\x09\xf9\x73\xcd\x52\x62\x4b\x5d\xbd\x54\x97\xd8\x85\x4a\x39\xda\xb4\xe3\xd6\x9e\x73\x5b\x5b\x18\x22\x28\x37\x3b\xda\x6c\xf4\xd8\x08\x62\x3d\x8f\xbf\x95\x8f\x8f\x85\x04\x28\x3a\x6a\x36\xe0\xae\xa7\xaa\x02\x14\x6b\xd2\x2c\xad\x1d\xc6\x7a\x5b\x02\x1d\x9b\x14\xa4\xbe\x08\x5f\xfb\xb5\x08\xe9\x86\xbb\x77\x98\x60\x1c\x16\xac\xca\x36\xd4\xc3\x11\xe8\x4f\xc0\x02\xeb\x3f\x06\x59\xcf\x73\xba\x32\x35\x83\x5a\x14\x3b\x88\x44\xdd\xc8\xbf\xe7\xfa\x59\xe8\xb2\x26\x9f\xf6\x48\x23\xd5\x81\xb1\x40\xc6\xf2\xa5\x90\x09\xa5\xa9\x6e\xc7\xa8\x8d\x0b\x67\xd9\x32\x11\xb4\xa8\x0e\x4a\xce\x14\x20\x6f\xf0\x91\x5a\x36\x3b\x0a\x5b\x9e\x7f\x7f\x7b\x72\x03\xdb\x93\x2a\xdb\xf0\xd4\x0d\xd1\xd2\x45\x3f\x79\x73\x4a\xd3\xd2\xe9\x2f\x32\x6b\x05\xa3\x7d\x49\x92\x11\x0d\xae\x3c\x6c\x73\x8b\xf6\xd5\x65\x76\x38\xe7\x6a\xce\x4c\x2d\x37\xce\xec\x1d\xbb\xca\x9d\xc9\xbe\x48\xb2\xa7\xe5\x6a\x6b\xbd\xba\xf1\xe1\x80\x6f\xc4\xce\x56\x29\x45\x53\xa8\x64\xe4\x61\xd9\x8f\xff\x62\x5b\x6b\xab\xa7\xe5\x6e\x38\x79\x5a\x44\x9d\x20\xc0\x5c\x5d\x9c\x36\xb0\xae\xa5\x3b\x6c\xac\xa3\x52\x1c\x56\xb1\x0f\xc2\x24\xdc\x77\x57\x70\x57\x47\xea\x8e\xb0\xe4\x61\x7e\x60\x8f\x31\xbc\x0f\xf9\x55\x28\x78\xb2\x5f\x69\xc6\xbe\x29\xb2\xf5\xcd\xd4\x46\x14\x06\x95\x6e\x98\x9e\x13\x6f\x81\x38\xb5\x7e\x25\xf9\xec\xa7\xb1\xac\x97\xe0\xde\x3c\x94\x22\x2c\x6b\xe5\x50\x37\x90\x8e\x89\x1f\x45\xb1\x87\xd4\x64\xf7\x90\x40\xd2\xdc\xad\x74\xf1\x6a\x72\x17\xea\xa4\xba\xae\x09\xeb\xda\x15\x9e\x6b\x37\x71\xc5\xb8\x86\x4c\xe9\x26\x9d\x49\x44\x99\x93\xd8\x26\x20\xdf\x80\xb8\xca\xd9\x77\x9c\x84\x43\x4e\x82\x26\x3b\x94\x35\x35\x4d\x88\x99\xb6\xa2\x24\xa7\xc8\xb7\xec\xf7\x16\x5c\x1f\x85\x26\x56\xb6\x13\xf2\x38\x07\x75\x9e\x9c\xe1\xc1\x0e\xf7\x46\x67\xde\xcc\x0e\xd7\x3d\xd5\xd4\xd3\x71\xe9\x47\xb8\x80\xa1\x96\x8b\xd5\xba\x74\x1f\xfa\xe5\x69\xe4\x93\xe0\x31\x1c\x7b\x21\x05\xdd\xea\xb4\x36\xa4\xdf\x4e\x4c\x85\xaf\x00\xef\x45\x44\x29\x7f\x01\x50\x37\x7b\x9c\x08\x80\xb5\x59\x08\x95\x52\xb1\x94\x4f\xc4\xe7\xea\x6b\xed\x84\x7c\xae\x7c\x93\xfe\x52\x38\x8b\x2e\x84\xe8\x2e\xa8\x27\x72\x67\x40\x70\xec\x59\xdd\x24\xa8\x02\x42\x41\x91\x52\x02\x63\x1e\x31\xa3\x6c\xe6\xa9\x70\x28\x9c\x58\xfe\xd1\x09\x14\x3b\xf2\x10\xac\x04\x52\x53\x12\xe5\xd0\x40\x97\x3a\x5d\x2a\xc9\x81\xf5\x6e\xf1\x52\xcd\x96\xa8\xa9\xfb\x47\x82\xbc\x8e\x12\x57\x05\x96\xde\x0f\x18\xa1\x36\x41\x87\xe4\x11\xda\x98\x99\x91\xd4\x25\xd2\x10\xff\xbe\x1b\x5f\xf1\xc3\xc1\xb6\x87\xaa\xf3\xee\xcd\xb0\x94\x00\xcb\x3e\xfb\x81\x7f\xa7\xfb\x02\xd7\x1f\x28\x94\x59\x11\x67\x4b\x94\x7c\x67\x07\xad\x04\xb7\xf9\x6d\xc3\x7e\x16\xa8\xda\x42\xcc\x5a\xa2\x0f\x04\x3c\x80\xfc\xf7\x73\x9c\xd7\x97\x39\x74\xdb\x3a\x01\x4f\x16\xc2\xf6\xf8\xcc\x95\x34\x98\x1a\xf5\x84\x09\xa6\xdd\x55\xa3\x15\xaa\x63\x84\xe2\x76\x4e\xfa\x7e\x10\x8e\x1b\xaa\xac\x7f\x98\x92\xfd\x31\xff\xb6\x3c\x4d\x4e\xf8\x7f\x79\xe2\xb5\xb2\xc0\xab\x0c\x17\x47\x8a\x2b\xbf\x7b\xfa\xf8\x5e\xd9\xd9\x0f\x57\xde\x5f\x61\x45\xcc\x32\xd1\x95\x29\x18\x7e\xe5\xe4\x5f\x71\xa5\xf9\x74\x86\xd1\x45\x45\xbd\xcf\x95\x84\x39\xff\xec\xab\x63\x6c\xb7\xb1\x5a\x63\x7d\x90\x51\x4c\x21\xe4\x7a\x4e\x50\x27\x25\x7f\xdb\xad\x8b\xab\xe8\x1d\x30\xbf\x9a\x89\x7d\xc6\x65\x91\x15\xf1\xc2\x81\x18\xbd\x92\xa0\x9c\x40\x91\x55\x20\xfc\x67\x88\xf5\x0b\x07\xfe\xca\x9e\xe3\x03\xa5\x2b\x87\xec\xda\xd8\x41\x7f\x45\x8b\xb2\xfc\x90\x2d\x9a\xf4\x3d\x08\x1b\x2f\xdb\x78\x2b\x85\x16\xab\x2f\x4a\x85\x58\x2c\xf5\xe9\xf9\xb7\xe4\xfc\xd2\x22\x96\x85\xa1\x34\x9b\x93\x90\x25\xae\x05\x66\x13\x13\xfe\x4e\xb4\x3b\x0d\x94\xf0\x3e\x84\xa8\xf4\xc7\x9e\x72\x29\xbc\xb2\xa8\x68\x33\x58\x75\xde\x88\x74\xfc\xf4\xe2\x43\xfe\x91\xe3\xe2\xc7\xee\x4f\xc1\x89\xed\x22\x7a\x31\x00\x4e\x85\x6b\x10\xf0\xdf\xa3\x4c\x73\x09\xa3\x20\x94\x18\x7d\xbc\xa2\xde\xa7\x1c\x99\x8d\x2e\x97\x23\xad\x81\x4e\xbe\x61\xb1\xc0\x55\xf9\x11\xd9\x26\x96\x44\x1e\xdb\xdf\x43\x74\xb1\x3d\xc0\x61\xa1\xf9\xbe\xeb\xcf\xef\xe4\xc8\xe9\x77\xd2\xd4\xfd\x2d\xfa\xa4\x6d\x6d\x36\x2f\xe1\x0a\xb7\x4a\x3e\xc2\x2d\x79\x2d\x44\x2b\x0b\x2c\x0f\xd0\x31\xa7\xed\xe7\x3a\x94\x69\x8f\xa9\x99\xb7\x2a\x02\xd9\x75\x71\xa3\x71\xee\x01\x42\xa6\x77\xab\x4d\xd1\xaf\xef\x5a\xc1\xb9\x6c\x60\x3f\xd5\x46\xf6\xc9\xe1\x5f\xc5\x12\x3b\xf8\xa3\xfd\x2a\xc9\x9f\xcb\x9c\x76\x82\x96\xa1\x2d\x35\xc4\x17\x7d\x99\x2e\xb3\x8d\xca\xc4\x56\x05\x5f\x7b\x1b\x93\xf9\xfd\x55\x0a\xf6\x21\x54\xb2\xc8\x52\x1e\x6f\xe9\xcb\x98\x59\x75\x31\xf7\x53\x12\x33\xea\x5c\xa0\xbe\xee\xfd\x8b\x85\xa3\xc4\x66\x9b\x31\xc5\x9f\x49\x90\xea\x19\x9d\x16\xf0\xc7\xe1\x90\x7a\x54\x81\x2c\x09\xbe\x0a\x0a\x3c\xa6\x8e\x81\x3d\x2b\xc1\x48\x45\x65\x66\xa0\x0c\x0b\x96\x4f\x46\x96\x5b\x0f\xb2\xfa\x78\x00\x4c\x96\x27\x25\x18\x54\x76\x2d\x61\x07\x81\xe6\x12\x7a\xb0\x61\xb3\x49\x14\x78\xbc\xb9\xab\x91\xfd\x71\x45\xdc\x8a\x03\x8b\x49\x80\x06\x38\x70\xd8\xfe\xfa\x4b\xdb\x21\xc0\xb8\xf6\x5b\x6d\x01\x44\x4e\xd5\xf4\x58\xb0\x5d\x14\x9d\xf9\x55\x72\x44\xf6\xd0\xfd\xdb\x6f\x04\x3b\x14\x5f\x17\x39\xd0\x49\xde\x95\x7f\x31\x70\xc8\x52\x0d\x0a\x60\xb2\xb0\xc7\xdb\x36\x2a\xa2\xd2\x87\x6d\x9f\xbc\x9b\x80\x4b\x06\x1c\xf5\x21\x60\xf2\x40\x79\x14\xc5\x52\x9e\xad\x28\x65\xe9\xbd\x46\xdd\xf5\x08\x89\x05\x92\xbf\x15\xe4\xa8\x02\x1d\x29\xfc\xd4\x0f\x49\x98\x1d\x72\x65\x39\xbc\x28\xef\xc1\x2b\x4b\xc9\xd5\x8b\xd3\x9e\xb3\x1c\xa9\x83\xc0\x9a\x7f\x03\x60\x3f\x0d\x87\xd2\xfd\x72\xc9\x3f\xec\x76\x88\xb2\x20\xcc\x58\xb7\x25\x6c\xb9\xba\x0f\x9f\x9a\xb5\x3b\xc0\x61\x67\xf0\xfc\x82\x2d\x63\x59\xbd\xb6\x06\xfb\x56\xf6\x3e\xbb\x3d\x6c\x2b\xb7\x42\xb5\x52\xcf\x55\x1f\x31\x87\x19\xbf\xe5\xa5\x27\x37\xeb\x20\x39\xd7\x09\x9e\x64\x81\x8c\x9e\x9e\x14\x71\xa5\x29\x32\x60\xcf\xa1\x2a\xe9\x6b\x73\xc2\x52\x37\xb4\x4f\xad\x2d\xe1\x85\xcf\xc6\xbe\xa7\x8f\xbd\xdd\x49\x90\xf0\x55\xe1\xc9\x28\x01\xf2\x55\x17\x9f\x20\x2e\xd9\x86\xe4\x1e\xa9\xc3\xae\x56\xae\x08\xe8\xe4\xe5\x68\xa9\xbf\xaa\xa5\xc3\xca\x76\x1d\x81\xad\x47\x2b\x3b\x19\x94\x0d\x51\x5f\x43\x30\x36\xbe\x1c\xf8\xe7\xa4\x63\xaa\x25\xf2\x91\x89\xca\x73\x3a\x09\xb1\x9c\xe8\xd6\xec\xde\x5f\xb5\x94\x66\xed\x95\x6a\x3c\x6a\x38\xd5\x2e\x5a\x42\xe5\x5a\xb0\x06\x90\x9a\xf2\x44\xda\x9d\x5e\x55\x4a\xd2\xa6\x2f\x67\x18\x54\x83\x7b\xa7\xc8\x72\x00\xe8\xf1\x6d\xc0\xc4\xbe\x6c\x7a\x77\xcd\x82\x61\x2f\x1d\x9c\x1c\x69\x5e\x6c\xf7\xdc\x87\x6b\x17\xee\x25\xa6\xf9\x85\xfb\xde\xf0\x13\x51\xf3\x39\x2a\x10\x5b\x0a\x5e\x40\x5f\xcb\x91\x78\x3d\x79\x46\xd6\x85\xfb\x7a\x0b\x02\xa2\xa7\x37\xda\x15\xec\xab\x9d\x67\x52\xb4\x45\xa5\xc5\x12\x92\x71\x09\xf7\x6a\xaf\xa5\x85\xaa\xad\x53\x37\xfd\x84\xd6\xdb\x0a\xdb\x7b\x07\x1e\xe0\x52\xf1\x7e\x3e\x28\xc1\x06\x40\x5b\x28\xdf\xb2\x9c\xdf\x6a\xb6\x40\x66\x0b\x7c\xdd\xd6\xe1\x67\x5f\xce\xea\x5b\x5d\x3e\x22\x0d\x39\xf4\xba\xb8\xe6\x32\x61\xd9\xa3\x0c\xc2\x97\xf4\xf4\xdb\x7a\x06\x59\xd5\x25\x4a\xbd\x35\x4a\xfd\x77\x3a\x43\xfd\xd7\xa2\x95\x5e\xd4\xf2\x5e\xdd\x27\xda\x0e\xbb\x66\x2d\x46\x73\xfe\x2d\x76\xf2\xdc\x2b\x74\x3f\x14\xa0\x08\xed\x7f\x5d\x5d\xe8\x71\x82\x59\xa9\x5a\x83\x43\xb4\xbf\x4f\xed\x95\x88\x43\xd8\xc7\x7f\x3c\x80\x54\x6f\x58\x61\xb3\x59\xbb\x28\x86\x1e\x2c\x7d\xd5\xb5\x75\x99\x1e\x41\xbd\x5d\xbb\x96\x08\xef\xfe\x29\x65\x9c\x7d\xa4\xec\x17\x9e\xbd\xb4\x51\x16\xb7\x93\x65\xea\xee\xc6\xfd\x1e\x34\xf5\xc1\x07\xd1\xf7\x22\xf2\xfb\xa4\x8c\xad\xc3\x87\xaa\xbf\xb4\xf5\xda\xc8\xb2\x74\xf5\x07\x1b\xa4\xc2\x4b\xbb\x7c\xbe\x14\x8f\x07\xac\x36\xf1\x1c\x87\xff\x4c\x12\x5d\xed\x16\xa3\x3f\xe3\x75\xa2\x04\x8c\x85\xa5\xaa\xf5\x0e\x63\xa2\xef\x1a\xe0\xa5\xf1\xdb\x0d\x49\x46\xdb\x54\x7b\xd9\xb1\xa0\xdf\x8d\x2b\x07\x7c\x6f\xc9\xe1\xda\xa5\xeb\x73\x84\x82\xcc\xed\x30\x7a\x09\xd6\xd6\x0e\xfa\x7e\x40\xe5\x73\x0e\x4f\xdd\x3d\x77\x51\xc3\xdb\x73\x68\xdf\xc3\x75\x20\x47\x72\xb7\xdf\x3e\xe7\xf0\x5c\xb1\xcb\x72\xba\x85\x04\xfd\xba\x3d\x28\x9f\x1b\x81\x7e\xd6\x83\x0b\xa4\x4a\x65\xd0\x6d\x5d\xf1\xf6\x07\x29\x56\x75\xe5\xc8\x23\x42\xed\xb9\x1d\xe6\x53\x6a\xde\x50\x89\x8a\xbd\x49\xfa\xb8\x69\x5a\x63\x47\x85\xa3\x3f\x9f\xb7\x98\x6e\x3a\xab\xdd\xb7\x4b\xde\x32\x5e\xa4\x33\xec\xda\xb7\xd2\xb6\xbd\x8d\x67\x76\xff\x2c\xed\xb7\x87\x55\x9e\x2b\x16\xab\x53\xb0\x1b\x9a\x3a\xba\xf0\xbc\xc4\x9e\xed\xea\xd3\x44\x8f\xcd\xed\x8c\xc2\x07\xcc\xb2\x34\x4d\xdd\xce\x5b\xdc\x04\xf6\x48\x42\x8a\x9f\x5d\xb2\x4c\x8e\xea\xb8\x5a\x3e\xb3\x7e\xc0\x65\x59\xcb\x71\x54\x27\x92\x4d\xea\x8c\x7c\xbd\xc8\x2e\x30\x26\x80\x8c\xd1\xa5\x37\x53\xf0\xd9\xac\xdd\x11\x2c\xcf\x8a\x38\xb0\xf0\xb8\x01\x11\x12\x1c\xb0\x81\xec\x4b\xcf\x6d\xd5\x5e\xb7\x21\x3b\xc6\x83\x7e\xe0\x15\xcf\xed\x0d\x41\xb2\x81\xe9\x54\x08\xff\xb1\xb5\x0a\x67\x6d\xd9\x67\x91\x8a\x31\xf0\x26\x01\xe7\x7d\x8c\xd9\x19\xae\xa3\x00\xe5\xfb\x6d\x83\x41\x31\xde\x3b\xa6\x33\xb9\xde\xa0\x95\x4a\xb8\x89\x4f\xbb\x20\xf3\x2e\xce\xae\xc3\xd7\xd0\x6f\x77\x1d\x5f\x9d\x99\x3a\x1e\x0f\x02\xf2\x4e\x61\xde\x47\x95\xdf\xf5\xf9\xf9\xe6\x0a\xe9\xe1\xee\xfd\x94\xc0\xa3\x45\xd3\xed\xda\xe8\x18\xea\x56\x45\x77\x80\xde\xdb\x72\x7b\x92\xc3\xf4\xea\xa8\xe8\xf9\xbb\x5a\x1d\xc2\xbc\xb1\x23\x0e\x67\xf5\xb7\xb6\xdc\x08\x53\xf1\x28\x77\xf2\xf1\x06\xce\xaf\x71\x96\x08\x53\x1b\x46\xe6\x79\x7c\x57\x43\x72\xcc\x7a\x15\x2e\x63\xcd\xe0\x51\xd1\x0c\xc2\x01\x94\xf8\xbc\x27\x27\x66\xde\x3f\x1b\xc7\xed\x11\x38\xd6\xf9\xf6\x31\x3f\x62\x91\x17\x48\x05\x9b\xd7\x6a\xe5\x04\xfe\x1a\x3e\xc8\x5b\xd0\xfe\x25\x5a\x9a\x6f\x12\x10\x0e\xf7\x29\xe9\x0c\xeb\xb3\xe3\xc9\xc2\xf4\x99\xf7\xa0\x4d\xf6\x38\xe5\x82\xa7\x91\xdb\x53\x3e\xdc\x0e\xfd\x10\x4e\xc8\x86\xe2\x3f\x55\x0c\x2c\xf4\xc7\xda\x15\x78\x22\xd7\x03\x46\x3f\x52\x27\x5f\xa1\x7d\xde\x88\x28\x98\xa4\x07\x08\x7f\x9e\x83\x13\xbe\x9e\x14\x92\xa3\x23\x7a\xa8\xd6\x02\x97\x9f\xb1\x5a\x25\x54\xfe\xbf\x91\x36\xd8\xc0\xe1\x0b\x13\x8e\x90\xb0\x75\xdd\xe6\x81\xc0\xf7\x95\xb0\x40\xc7\x7b\x8b\x91\x25\xc4\x7d\xdd\x8d\xc5\x3b\x21\xf3\xcb\x0d\x83\x82\xda\xb1\x13\x25\x42\x14\x19\xde\x5f\xb7\x4b\xfb\x46\xa0\xfb\x37\xa1\xd4\xa5\x8f\xf5\x62\xfd\xd2\xbc\x37\xd7\x11\x63\x93\x35\xa9\x0d\x7b\x43\xfc\x09\xad\x97\x38\xb2\x64\x60\x95\x0d\xf2\xa3\x90\x2a\x3e\x02\xe8\x4f\x68\x7e\xac\xee\xad\xe5\x00\x82\x67\x67\x68\xfb\x37\x1f\x7a\x39\xaf\xd1\x8a\xb0\x35\x58\x84\x74\x9f\xf6\x2c\x9c\xff\xac\x8d\x83\x4a\x78\x6a\xd6\x00\x3e\x43\x00\x03\x9b\xdb\x5f\xa0\x38\xea\xb5\xe9\x92\x1c\xb4\x63\x36\x1d\x90\x1e\x94\x0d\x78\xbb\x67\x6d\x9b\x20\x12\x4c\xe7\xc8\x7d\x48\x8b\x3c\xc8\xbb\xe3\x4c\xb1\x8e\x2c\x67\x74\x8b\x82\xb4\xe6\x19\x5e\xe8\x27\x2f\x15\xea\x3f\xb9\xa1\xf9\x93\x59\x81\xf5\x46\x20\xf5\x12\xe2\x3e\xda\x98\x50\xb4\x1b\x59\x4a\x2b\x1d\x66\xf7\x85\x7f\xfc\x3f\x99\xc1\xfb\xeb\x03\x91\xfc\x83\x5b\xe4\xaf\xa2\x0d\x0c\xe3\x54\x79\x65\xeb\x33\x63\x9a\xac\x33\xcf\x55\x4a\x24\x2c\xe4\x2a\xd1\xe0\x8c\xee\x1a\xb6\x12\x39\x0a\x64\xd1\x90\x3f\xbf\xfd\xd4\x70\xac\xfe\x6a\x4e\x62\x70\x60\xc9\xc9\x7a\x11\xa2\xf9\x3f\x01\xe0\x3f\xf7\x80\xef\x9f\x81\xfc\xc7\x34\x33\x5e\xfe\x52\x71\xe6\xb4\x0c\xb9\xb3\xfa\x37\x90\x39\x2a\x59\x24\x49\x7f\x05\x22\xcf\x5e\x8b\x41\x10\x2a\xce\x40\x6b\xc6\x5f\x95\x90\x15\x33\xb2\x2f\x44\xc5\x4b\xfb\x75\xc6\xd5\x04\xaa\xbc\x6f\xdd\x8f\xa0\x07\x3c\x6e\xe3\xf8\x88\xd7\xdb\xed\xaf\x36\x2b\x57\xa0\x2a\xd3\xa8\x8d\xc5\x05\xbd\x08\xb3\x08\x4a\x3f\x9f\x7f\xe5\x41\x3e\x01\x20\xec\x3b\x63\x01\x77\x2c\x7a\x0a\x17\x67\x21\xb7\xc7\x21\xd7\xf8\xb0\x93\x07\xc1\x20\xb4\x9d\xdd\xe3\xda\x23\x9b\x99\x9f\x24\xff\x94\x15\x0c\x86\x49\x91\x8f\xc0\xf6\x30\xd8\x53\x72\x56\xfb\xad\x52\x5c\x88\x0c\x7c\x04\x27\x12\x94\xff\xb8\xcf\xab\xcc\x51\x96\xeb\x9f\x6f\xe4\xeb\xf0\x70\x8a\xc2\xee\x66\xe4\xfe\x9d\x31\xe5\x2a\x6d\x00\x4f\x6d\xce\xed\x63\x0a\x43\x30\xf2\xfc\x2a\x97\x9f\x0e\xc8\x5c\x8f\xa0\xb4\x24\x36\xc1\x79\xfc\x96\xc6\x83\xc5\x73\xd6\x05\xb0\xf6\x2b\x58\x07\xc8\x0d\xc9\x11\x28\x8b\x97\x47\x6d\xfb\x4c\x64\x29\x34\x32\x52\xb7\x71\x45\x98\xff\x91\x58\x22\x70\x0e\xa8\xf0\xfc\xd9\x3f\x45\x69\xb8\xa8\x04\xa2\x0f\xec\x12\xd4\x42\xe9\x62\x14\x5f\x00\xa1\x12\x14\xb8\x08\xed\xd5\x20\x6a\xc9\x3f\x14\xad\x06\xc8\x98\x65\x01\x90\x74\x29\x10\x40\x4e\x01\x5f\xde\xc3\x87\x7e\x73\xd3\xa7\x05\x0b\x98\x2a\x8e\xcc\xca\xa8\x67\xeb\xfb\x63\x00\x13\x15\xe0\x0a\x0a\x40\x47\xe4\xff\xf1\x16\xd6\x1f\x5e\xbe\xd2\x1a\x9f\x1d\x5b\xfb\x08\x06\x80\xa0\xe6\xc5\xad\x08\x09\x6b\x2f\xd5\x87\x17\x52\x8c\x09\x1a\x83\x3c\x1e\xd9\xa7\xe4\xa0\x49\x14\xe8\x14\x87\xcc\x71\xb1\x7e\x9e\xea\xaa\x01\xc8\x03\x79\x00\xf5\x37\x47\xa0\x97\xb0\x33\x98\xa5\x28\xe1\x6c\x00\xbe\xf3\x56\x60\xa0\x3b\xfd\xdf\x4d\x1d\x68\x1a\xe1\xfe\x0f\x40\xbb\xf5\x27\x62\x0d\x86\x2c\x80\x9d\xf3\xa4\x2c\xc8\x99\xed\x18\x5e\xe2\x0f\x3c\xfd\x2e\xe5\x89\x8c\x7b\x37\x6e\xd5\x78\x15\x54\xb3\x61\x84\xfe\x18\x5f\xb4\x94\x54\x86\xef\xe0\xa6\x23\xc9\x78\x04\x9d\xe0\x41\x36\x81\xce\xdc\x79\x05\xc4\xf4\x8f\x03\xb5\xad\x3b\x82\x03\xe6\x11\x40\x06\x39\x72\x58\x43\xc2\xdd\xf9\xb0\xc9\x7e\x93\x68\xc2\x9f\x0f\x5d\x16\x7b\xb8\x7d\xb3\x1c\x15\xb0\x8f\x51\x2b\xc0\x54\x73\x8b\x69\x18\x99\x01\x57\x58\xd8\x9f\xda\xee\xce\x20\xa7\x12\xb4\xe5\xc2\xc3\x2d\x51\x0d\xe4\x0e\x03\x74\xd0\xfc\x43\xbd\xaa\xa5\x77\x6e\xe3\x6f\xfa\x24\xe9\x40\x6f\x1a\xcf\x66\xd7\x13\x0a\xf6\xc1\x25\x37\x7c\x79\x96\x63\xd6\x0d\x9b\x1f\x86\xa1\xaf\xee\x6e\xf9\xdc\xf2\xfb\xe6\x51\xef\x9f\xf0\x75\x3c\x6f\x77\xcc\x0f\x7f\xfe\x9e\x1d\x87\x07\xf7\xb7\x01\xf5\xcb\xcf\xe9\x9c\xc3\x3e\xa7\x5b\xde\xc4\x25\xac\x79\x1b\xff\xcc\xfe\xa5\x3f\x83\x36\x84\x13\xb9\xf1\xfe\x83\xea\xd5\xbe\xa9\xf0\x37\x48\x0a\x39\xef\xe0\xc4\x9a\x68\x18\xf0\xbf\x73\xf5\x79\x99\x4a\xcc\x44\xc0\x59\x70\xca\x03\x20\x0e\xfe\x69\x25\x75\x22\x14\x1c\xbe\x68\xd0\x3f\xc4\x5a\x08\x71\x6b\x38\xd8\x3c\xc8\x5e\x00\x2e\x5a\xec\x85\x9d\x9b\xfe\x1c\x03\xbf\x34\x49\x95\x08\x8a\xd6\x9b\x6c\x84\xbd\xfe\xd7\x9c\x13\xba\x29\xa0\xac\x59\xc8\x9d\x32\x6b\x1c\xd0\x11\xf5\x73\x00\xbf\x2a\x24\xaa\xb1\x5c\xe9\x5d\x0f\x5b\xd5\xe4\x5f\x85\x79\xcc\x08\xde\xf2\xe5\xbf\xd9\x0a\xd5\xf3\xd5\xba\xda\x8d\x95\x40\x79\xfe\x4b\x2d\x9a\x0c\x22\x1b\xa1\x84\x25\x44\x21\xbc\xaa\x58\xef\xb2\x96\x9d\x92\x8d\x77\x51\xf7\x45\x1a\x37\x15\x2d\x1b\xbb\xd0\x98\xce\x84\xb7\xe7\xeb\x9c\x81\x28\xf4\x28\x51\x7f\x7a\xe3\x54\xe5\x65\x9d\x8c\xa3\x5f\x5f\x5b\x26\x43\x22\x51\x44\xe3\xc5\x1f\xff\x4b\x8e\xda\xf7\x3a\xfb\x4b\x59\xe8\x6b\x7c\x53\x80\xfa\xd8\xb9\xea\xf6\xaa\x26\x82\x2f\xb9\x9e\xbd\x46\xe8\x4e\x7e\x3c\x7a\x91\x44\x71\x51\xe7\x1f\xeb\xf0\x7b\xd2\xbe\x26\x35\xbe\x4d\x7a\xc2\x5e\xd6\x03\xbf\xdc\x60\xd0\x1b\xdb\xc4\x93\x85\x86\x89\x16\x4d\xc0\xa3\xf0\xcc\xf7\xf7\x1c\x59\x57\xf9\x3d\x55\x15\xb6\xa0\xcf\x44\x49\xa2\xb5\xfb\x5a\x34\x90\x38\xec\x82\x7e\x8b\x8f\xbe\xbf\xd9\x66\xf8\xf9\x21\x41\x6b\xbf\x58\xbf\xf9\x75\x79\x89\xea\xd7\x72\x82\xb7\x64\x76\x7f\xb3\x26\x69\xbf\x99\x7a\x1f\xb6\xe5\x74\xc4\x82\xfd\xd4\x2b\x5e\x7e\x02\x13\x83\xcf\xdc\xaf\x3d\x6a\x36\x29\xa2\xa8\x35\xa5\x9d\x5c\xc8\x9a\x70\xd5\xdf\x24\x98\xc1\xaf\x5b\x34\x29\x18\x42\x60\xc7\x65\xae\xd9\x29\x8c\xff\x16\xef\xbd\x50\xdc\x0d\xd6\x2b\xb4\x26\x79\x95\xc4\xe4\xf0\x08\x37\x00\x77\x6e\x5b\x95\x2f\x66\xfc\xc5\xe8\xb0\xbc\xb9\xb4\x41\x4e\xd8\x90\x69\x1e\xb5\x35\x27\xbd\xff\x25\xae\xc3\xbb\xa8\x7a\x3e\xba\xdd\x60\xaa\x1c\x07\xf4\x70\x92\x64\xe7\x9a\x4d\xec\x7e\x90\x00\xd2\x7c\x39\x52\x8c\xff\xc9\x44\xd1\x42\x31\xb2\xb6\xd6\x5c\x17\x71\xc7\x65\xaf\xba\x9a\x16\x43\x2f\x40\x27\x42\xa7\x95\x78\x0f\x67\x7e\xe3\x62\x77\x00\xdf\xe6\xac\x12\x1d\xfa\xf4\x12\x7d\x65\x75\x60\x41\x25\xd5\xac\xcd\xd5\xb6\x7d\x0b\x09\xc8\xca\x4a\x01\xf5\x23\xc8\x22\x80\xf0\xed\xf1\x4d\x2d\x14\x3a\xf9\xc6\x16\xe0\x3b\x8f\x6c\x76\x74\x6e\x37\xfb\x05\xbe\xa6\xb1\xc0\x0e\x5e\x47\x88\x16\x7b\xdc\xc7\x45\x50\xa3\x1e\x36\x15\x51\xd1\xa5\xd8\xed\x27\xf2\x72\x68\x9b\x44\xb8\xfd\x33\xba\x6f\x2d\x63\xd4\x08\x27\x6a\xb5\xdb\x1d\xbf\x8a\xe9\x70\xad\x40\xaa\x43\xda\x95\x2f\x61\x87\x3b\x65\xcc\x41\x0a\xe1\xbd\x02\xe0\x93\x6f\x6c\x28\x1e\x3d\x98\xa9\xed\x32\x9c\x0e\xc2\x91\xef\x2e\x28\x20\xe4\x45\xc0\x6d\x5b\xcc\x0c\x54\xbf\x29\x09\x27\xce\xc7\x12\x2f\x34\x36\x3b\x6b\xbe\x1b\x08\x00\x80\x85\x70\x9f\xf7\xb3\xdf\x82\x5e\xc3\xb8\x95\x61\xf4\xee\x07\xf6\x9e\x0e\xb7\xe0\x59\xda\x85\x57\x4a\xbd\xab\x49\xee\xc4\xe8\xfc\x39\x32\x40\xc6\x17\xfd\x0a\x07\xcd\xfe\xb0\x6e\x72\x04\x36\x79\x00\x89\xde\xfe\x6e\xcb\x7e\xf8\xb5\xa1\xc6\xed\xaa\x75\x40\xe4\x1c\xe5\x49\x88\xa7\x35\x9a\xd0\xb3\x8c\x31\x69\xc8\xcb\x76\x91\x39\x62\xf9\xe7\x53\x1d\xfa\x90\x59\xf4\xb6\x14\x7d\x1b\x25\x11\x0e\xba\x88\x2f\x7c\xa8\xd9\x61\xae\x13\xfc\x92\x0c\x19\x17\x4e\x9e\x07\x77\xac\x3f\x2a\x59\xa4\x42\x75\x06\xaa\xa1\x3d\xc8\x12\xd1\xc4\x85\x61\x93\xd4\xe8\xc7\x43\xf2\xdd\x8d\xcf\x0a\x7b\xfb\x81\xc3\x24\xa7\x3f\x2f\x9a\x2c\x5a\xa0\xad\x33\x6e\x96\x91\x2f\x83\xcd\xe0\xdb\x60\x67\x80\xdd\x3f\x55\x7d\xef\x22\xb3\x33\x8b\xfc\xb2\x3a\x29\x24\x4c\xd7\xfb\x4d\x5a\xa8\x3d\x08\x5f\xdd\xa8\x22\x68\x5f\xd5\xf6\x7a\xe8\x04\x0f\x25\x7a\x79\x58\x2f\xaf\xf5\xa3\x93\x13\x80\x7a\x37\x7b\xba\x65\xc0\xbb\x91\xd4\x3b\xca\x85\xef\x54\x14\x57\x51\xa2\xdf\x94\x0e\xbb\x4c\xb8\x4e\x37\x75\xe4\xc8\x58\xd4\xd8\x65\xd0\x27\x15\x67\xf2\xf5\x48\x5c\x3a\x05\xda\xf2\xcc\x4b\xb7\x4b\xda\xa5\x2f\xba\xd2\x3d\x98\x51\xec\xd4\xfa\x29\x81\xb2\xe0\x4c\xbc\x1e\x02\x1c\x7e\xa6\x40\x4d\xbb\xbe\x5b\x0f\x85\xf9\x2f\xde\x88\x1b\x94\xf8\x49\x83\x8d\xe2\x1c\x93\x3c\x92\xef\xd7\xa7\x3f\x4f\xe9\x6c\x8b\xb5\x2b\x3f\x3c\x6d\xe4\x14\x5a\xd0\xf0\x76\xec\xd3\xd4\xdf\x96\x18\x3d\x46\x03\xa8\xc3\x7a\xfc\x74\x2e\x76\xff\xc3\x79\xe9\xf3\xb2\xd1\x0d\x5b\xac\xdb\xfa\x42\xd1\xf3\x54\x81\xdc\x66\x91\x61\xca\xf5\x0c\xfb\x7a\x0f\x48\x7d\xd8\x80\xd9\xac\xea\xe2\xbe\xae\x36\x4a\x85\x08\xc2\xe2\x9e\x99\x58\x90\x35\xc5\x7a\xba\x23\x23\x0b\xaf\x1e\xdb\xb7\x85\xb2\xf8\xd9\x9d\xe2\xab\x8a\xc9\xe2\xa1\x3d\x2e\x9f\xa4\x6c\x1d\x8d\x76\xe2\x2f\x89\x38\x91\x90\x07\x61\x46\xf2\x12\x9f\x31\xf9\x78\xc6\x93\xef\x34\x17\x91\x5c\x7a\xad\x84\x3f\x65\x93\xf7\x9c\xc2\xa8\xd4\xa2\xe7\x33\x76\x56\x81\x03\x90\x5b\x8e\x5d\x18\x8b\x27\x38\xa1\x64\xb4\xd8\x44\x28\x54\xc2\xc1\xef\x2c\x97\x4e\xd5\x66\x3c\x2e\xa1\x89\xb5\x36\xc8\x5c\x7a\xb8\x89\x5c\x72\xaf\xc8\x80\xe4\x02\xaa\x1e\xd9\x31\x64\xcf\x40\x14\xa2\xf2\x63\x5a\x2f\x3a\xf8\xa0\xfe\x0c\x99\xc8\xa7\x94\xd1\xa5\x55\xf7\x84\x14\x16\xfb\xda\x27\x3d\xc2\x9e\xb7\xc1\xda\x33\x34\x5c\xa5\x58\xde\x31\x1c\x58\x94\x42\x94\x63\x2d\xf6\x29\x3c\xf9\xf3\x3e\x23\x54\xa8\xd4\xd9\x3f\xd3\x28\xf1\x72\x8c\x8f\x64\x53\x5c\x36\x45\x56\xd0\x4f\x01\x33\xb0\x06\x99\x18\xff\x7c\xec\x29\x0c\xed\xc2\xdd\x8a\xb9\xd6\xb6\x39\x2c\x07\x35\x12\x5d\x46\xf2\x56\x80\xf1\x1e\x53\x55\x99\xce\x6f\x09\xed\x6e\x6c\xd9\x45\x8b\xc5\x17\x18\xb6\x5c\x1c\x44\x41\xdc\x3f\x64\x72\x9c\x01\x1b\x21\xc8\x36\x9f\x7d\x48\xf2\xe4\x93\x7a\x8b\x58\xba\x29\xb2\x81\x8d\xf8\xe1\x4c\x18\xef\x22\x82\x81\x82\x75\x46\x97\x92\xca\xe0\x4a\xf0\x4f\xb5\x67\x41\x9f\xb5\x4d\x92\x35\xe7\xd5\xb2\x71\xef\x20\x91\x1b\x11\x7b\x9c\x2f\x5e\xcc\xfe\xf8\x3f\x34\x19\x65\xd0\x58\x75\x72\x59\x43\x18\xcb\x9e\xfb\xf8\xad\x15\x8f\xd4\xd4\x25\x38\xb2\x34\xd3\x8f\xba\xee\x69\x83\x81\xee\x79\x8b\x82\xd4\x32\x7f\x55\x85\xb2\x9b\x29\xef\x8c\x86\x6b\xe7\x0d\x91\x67\x39\x0e\xba\xb2\xba\x57\x41\xed\x85\x9d\x5a\xb3\x7c\x1f\x52\x68\xd8\xd3\xf3\xe2\x00\xeb\x10\x98\x45\xf7\xab\xf6\x4a\x51\xee\x2f\x98\x67\x91\x3e\xf4\xb4\xfb\xd5\xcf\x96\xab\x60\xbe\xaf\x1d\x84\x36\xb3\xc7\x11\x9c\x98\x47\xe5\xd7\xb8\xfa\xf5\xb9\xba\x26\x16\x6f\x67\xb6\x82\xa8\x60\x63\x04\x59\x13\xd0\xb0\xcd\x9d\xb8\x0f\xe7\x53\x87\x56\xac\x6d\x27\x8e\x5c\x77\x2a\x61\xee\x4e\x97\xf6\x7d\x04\x1d\x67\x51\x5a\x82\xaf\xe7\x3a\x6d\x17\x5d\x55\xb7\x91\x5c\xea\xea\xeb\x24\xe5\x8c\x5c\x1d\xec\xb6\xf4\x69\x42\x8d\xc5\xa9\x3a\x73\x65\xe5\x04\x13\xba\x2b\x95\xd8\xe3\x44\x00\xba\x8f\x76\xb0\x0e\xb8\xc2\x3a\xa2\x2b\x35\x37\xee\x28\x43\xcb\x63\x96\x9f\x83\xb3\xb5\xae\x78\x39\xdd\x59\x3c\x55\xd8\xa4\x2b\x1a\xbd\xbb\xd2\xb7\x44\x8d\x79\xa3\x75\x19\xd3\x38\xa6\xad\xa9\x3f\x63\x7f\x2a\x9d\xf9\x43\x32\xc6\xf8\x56\x41\x1c\x12\xf0\x62\xf4\xec\xb0\xfa\x4a\x9b\x1a\xff\x91\x80\x87\xf1\x5c\x66\x3c\x8d\xaf\xba\x3f\x6c\x65\xea\x8e\x01\xce\xe2\x49\x31\x58\xb6\xc1\x0e\x1a\xea\x21\x79\x89\xe2\x8e\xcb\xc2\xfb\xf2\x67\x30\x79\x76\xad\x63\x82\x35\xf4\xd6\x04\x40\x85\x95\xb7\xce\x96\xb6\xc6\x36\x2a\x6b\x38\x04\x21\x28\x58\x42\xe8\xd8\xea\x17\x85\x82\xfb\xf8\x2b\xfa\x92\xab\xc7\x93\x94\x62\x33\x83\xa2\xaf\x6c\xe3\x78\x67\x07\x55\x12\x10\x11\xc0\x08\xf8\xe7\xa0\x07\x29\x6b\xcd\xca\x3a\xe5\x50\x98\x11\x8c\xe2\x9f\x4a\x36\x3e\x38\x39\xce\x89\x48\xa2\x0f\xb9\x1e\x2d\xa3\xfc\x96\x11\x7e\x97\xa1\x59\x59\x19\x46\x2e\xc2\xc7\xfd\xf0\x10\x64\x04\xd9\xdf\x2d\xc4\xda\xb1\xce\x52\xd1\x77\xde\x8a\x9c\xa6\x23\xec\xb0\x4a\xcd\xf7\x89\x5b\x5f\x7f\x2b\x3c\xd1\xa7\xb8\x5e\xe1\xf5\xf8\x08\x3e\x91\xee\x08\xd7\x97\xe7\x39\xda\xaf\xb2\x52\x7e\x1f\x61\xec\x2c\x5d\x5c\x9d\x76\x74\x90\xb8\xef\x4f\x92\xff\x4f\x9f\x4e\xcc\xa0\x73\x1d\xaa\xfe\x7c\xde\xc9\x4d\xf3\x2e\xc9\xbf\x26\x81\xe0\xc1\x20\xe6\x53\xe4\xff\x04\xb2\x1f\x2b\x25\x51\xac\x6d\xcf\xf6\x8c\xce\x08\x3c\x9f\x4d\x69\x4c\xbb\x5d\x50\xef\xa9\x7d\x60\x8b\x95\xe0\x89\xaf\x94\x4f\x17\x7c\x1f\x02\x4e\x3d\x20\x81\x00\x48\xd3\xd0\x5b\xdf\xfc\x2f\x6c\x51\x3f\x10\xbb\x07\xc8\x7a\x9d\x11\x62\x7d\x0a\x7a\xac\x08\x25\xc0\x6d\xcf\x7f\x9d\x2f\xb8\xba\xbd\xe8\x43\x91\x0e\xfb\x2a\xe7\x21\xca\xc9\x3b\xfe\x30\x30\x85\xae\x6f\xd2\x10\x9e\x9e\xe9\xf6\x37\x68\xcb\x66\xd3\xe4\x20\xa5\x6c\x6b\x65\x1a\x6d\xdd\x2d\x1e\xbf\xee\x84\x56\x81\x1f\x74\x4e\x81\xf2\x45\x0b\xeb\xbd\xc1\xc8\x81\x26\x7e\x0c\x8b\xd2\xc1\xbf\x09\x43\x10\xf2\xaa\xab\xb2\x6d\x30\xa7\xca\xf2\xb4\xd1\x34\xb8\x47\x0e\x65\x4a\x15\xcc\x88\x3d\x5e\xe2\x00\xdb\xa7\x4c\xf5\x84\x97\x6e\xfc\x3e\x86\xad\x20\x0f\x75\x63\x0c\x69\x4e\xf1\xd9\x6f\x4a\x4f\x58\x47\x23\x1e\xa7\x4a\xfc\x19\x45\x5c\xb2\xc8\xb2\x4d\xc5\x28\x48\x4b\xbc\x7e\x2e\x9d\xce\x2f\x24\xf1\xd5\xd2\x83\xd3\x3a\x8a\x87\x41\x33\x86\xf2\xba\xcb\xd9\xeb\x7d\x20\x8b\x54\xfd\xfa\x29\x6d\x95\xee\x53\xa9\x56\x36\xb2\x6a\x86\xd6\x42\x58\x84\x5f\x3d\xc1\xca\x81\xe2\xf2\x53\xda\x83\xe3\x03\x66\xef\xb0\x55\x11\x5d\xdf\xa1\x8a\xb9\xed\xf9\x9f\x6f\xb0\x98\x4e\xb6\x0d\x96\x38\xef\x64\x98\xfa\xf6\x36\xa8\x5e\xdf\x0d\xb5\x6c\xde\x8f\x64\xcf\x05\xf8\x91\x68\xfa\x30\x42\xbd\x7b\x8e\x56\xa0\x19\xe9\xb7\x1e\x9c\x20\x2c\x41\x18\x6b\x61\x8d\x2b\xc2\x56\xba\xf7\x76\x7f\x4a\xa3\x7f\x48\x7f\xdc\x9c\x6f\xf4\x95\xda\x47\xbe\x50\x12\xea\xb1\xfd\xca\xeb\x30\x58\x96\x10\xca\xc7\x83\x38\x53\xa7\xc6\x5a\x2f\xea\x74\xb7\x44\xce\x58\x5f\xb7\xab\xb3\x27\x0b\x4b\x21\x54\x0c\x07\xe6\x22\xd6\x40\x67\xc9\x3f\xdf\xe2\x66\xfb\xe2\x01\xbd\xb3\x57\xf7\x5a\xcc\x35\x71\x77\xf8\xfc\xb4\x05\xd7\xba\xf4\xa7\x7e\x48\xe2\xd3\x04\xf8\x00\xa1\x48\xe4\x26\x9b\xe3\x8b\x62\x24\x0e\x19\xbc\x53\xb3\x98\x48\x6b\x98\x3b\xa4\xb5\xea\xe4\x73\x08\xb1\x6d\xb0\x8a\xde\xa9\xda\x5c\x48\x7a\x3f\x4e\x60\x49\x5d\xa8\xf9\x7b\x99\x5e\xf1\x34\xc9\x0f\x0c\x58\x99\x26\x60\x0c\xd6\x88\x99\x80\x85\x3a\xb4\xc1\x8f\xd0\x5c\x55\x04\x16\x7c\x24\xb2\x90\x0e\x67\x74\x3b\x1f\x91\x0d\xce\xf4\xf7\x07\xa9\x4a\x3a\x1a\xf3\x6d\x51\x55\x40\x2e\x24\x31\x89\xa4\x9c\x13\x62\x35\xce\x00\x3a\x5f\x09\x42\x90\x1e\x8e\x00\xec\x78\xd4\x89\x0c\xe4\x3a\xfc\x22\x2f\x49\x79\xbf\x34\x9c\x96\x36\x5b\xc0\x73\x1a\x49\xdf\x36\x40\x3e\x51\xb1\xa7\x01\x2e\x2f\x08\x4e\x89\xea\x59\x4e\x2d\xe0\xf6\x55\x5f\x12\x67\xad\xd9\xbe\xec\xba\xd0\xe0\xde\x72\x31\x31\x74\xc9\x70\xdd\xc1\x4d\x61\x51\xba\x81\xf1\x74\xcf\xa8\xe8\xa8\x22\x4f\xa7\xa6\x2c\x8d\x98\x56\xbc\x07\xa1\x29\xce\xad\x5d\x01\xbf\x6c\xd3\x29\xd9\x95\x06\x0f\x79\x58\xd0\x36\x53\x55\x6e\x43\x38\xdf\x61\xb7\xc7\x02\xb6\xb7\x86\xb0\x22\x85\x36\xd9\x1f\xaf\xed\x34\x8a\xa5\x6d\x13\x4b\x9e\xa2\x3d\xf2\x07\x0f\xb2\x81\x98\x77\x43\xe3\xe5\x7b\x7e\xf3\x28\x83\x81\x91\x76\xb5\x2d\x63\x24\x0c\x2d\x0f\xe5\x2f\x3c\xfe\x92\xa2\x35\xf6\xf2\xb1\x6a\x50\x05\x7b\x38\x71\xca\xd1\x9c\xbe\x2f\x6f\x3d\xdc\xc4\xc4\x9e\xda\x50\x9f\xe7\x7e\x12\xa9\xd4\x70\x6a\x4f\xf3\x25\x21\x65\x71\xe8\x28\x35\xd4\x47\xf5\xef\x12\x7d\x4a\xef\x0a\x2b\xe7\x26\x7d\xfc\x8c\x1c\xb4\xc0\x1d\x47\x5d\x27\x45\xac\x39\x69\x63\x19\x43\x58\x23\x58\xd8\x84\xed\x44\x83\x65\xc3\x2e\x58\x56\xbc\x46\x69\x6b\x94\xf1\x38\xb7\xaa\xd5\x33\x0b\xdb\x38\x79\x41\xdb\xdb\x65\x3a\x30\x56\x26\x5c\xea\x07\x2e\x4e\xe2\x69\x0a\x6f\x74\xc4\x00\x85\xbf\x14\x77\x1b\xd7\xcb\xd2\xe5\xb5\xb0\xf4\xf1\xdb\x05\x65\x4c\x4c\xbd\xe8\x19\xd0\xde\xbc\xaa\xc3\x21\xcf\x24\xcb\x78\x4c\x4a\xcc\x01\x8f\xed\x4b\x91\x1c\xaa\x2c\x19\xcf\xdc\x0e\x48\x30\x5b\x1e\x18\xcc\x9b\xfd\x9a\xf9\x83\x7a\x8f\x65\xf7\xc0\x10\xf2\x93\x58\xe6\xd7\xb6\xda\x11\x60\xb2\xa7\x6f\x0d\x32\x2c\x16\xcc\xda\xea\x50\x9e\xb6\xcd\xa9\x37\xdb\x4c\x5d\x65\x12\x7f\xb6\xd9\x99\x94\x0f\x39\x13\x90\xd6\x05\x3c\x7c\xf0\xc1\xa2\x11\xa7\x81\x19\xd0\x22\x0d\xfe\x95\xf7\x3e\x6a\x58\xd9\xd1\x79\x8f\x70\x2d\xf8\xab\x64\xad\x11\x78\x56\xbe\x15\x12\x8a\x30\x9c\x8e\xd7\xac\xbf\x66\xa6\x05\x62\x2a\x19\x5b\xa1\x5c\xe2\xe2\x66\x62\xdd\x26\x2c\x13\x0f\x22\x8d\x2d\xe1\x62\x6d\xd3\xb8\xb3\xea\x64\xa5\x19\x4b\x3f\xa2\x5e\xe5\xe9\xe4\xa7\x4e\x10\x64\xb1\xab\xe6\x1f\x32\x35\x80\xc0\x93\xc7\xf5\x9b\xc4\xc2\x92\x1a\x3a\x59\x58\x1e\xf0\xe0\x2a\x74\x6f\xf7\x4a\x75\x6e\x90\x95\x42\x5f\x3d\xb3\x53\x75\x82\x4f\x3d\x0a\x7e\x91\x86\x90\x84\xa5\x18\x20\x2a\xcf\xce\x3d\x9a\xe9\xff\x82\x18\x68\x16\x92\xa8\x2a\xb3\xea\x9c\xef\x5f\xab\xe5\x3c\x25\xd2\x09\xb4\x27\x81\x33\x2c\xf6\x42\x03\x2f\x3e\x39\x58\x7e\x6a\x8d\xd8\xea\xa9\xf1\x6e\x86\x91\xdf\x4b\xcd\x82\x42\x7e\xd0\xb4\x9c\xe4\xa1\x2b\x87\x27\x44\xd7\x39\x39\xcc\x81\x46\x09\xce\xcd\x9a\xca\xe1\x00\x99\xbf\xcc\x15\xc7\xbf\xbc\xfd\x9d\xae\xa1\xf6\x97\x56\xa8\xf8\x3a\x41\x8b\xbe\xb7\x7f\xf0\x11\x60\x81\xe2\x3a\xfb\xb2\x4f\xa0\x6c\xa0\x51\xce\xe2\x9b\x0d\x90\xd7\x8b\x45\xd6\x2b\x7b\x19\xcd\x39\x5b\xdc\xda\x38\xc3\x15\x5d\xb0\xb7\xf0\x9d\x17\xdd\x1a\xae\x1f\x08\xdf\xbb\xfb\xc1\xcf\xbc\x03\x23\x68\x3b\xbd\xfd\xa0\x31\x83\x3c\x0e\xb6\x4a\x78\x76\xd6\xd6\x8f\x1b\x24\xd8\x7c\x56\x6f\x80\xfe\x15\xf9\x54\x45\x2a\x48\x1f\xef\xe6\x49\xec\x9a\x9e\xbc\xeb\x2c\xb2\x0f\x79\x79\xc4\x8f\xf5\xeb\xcf\x20\xf7\xf4\xe6\xfe\x60\x0d\x46\x93\xcc\x8f\x32\xf3\x4f\xac\x6c\xc3\xdb\xc1\x09\xb8\x72\x7a\xe8\x7b\xbe\x1c\x7e\x88\x16\xe1\xc6\xce\x74\xb8\xfc\x0c\xae\xdd\xfc\x20\x1f\x4c\x9d\xe1\x67\x08\x32\xd8\xc1\xcd\x96\x55\x78\xff\x78\x4d\xdc\x5f\x94\x85\xfb\x87\xca\x6b\xb0\xe7\x89\x62\xdf\x27\xf3\x8f\x72\x40\x45\x48\xfb\x5b\xab\x17\x65\xeb\xad\xbc\xc9\xf9\x5e\xa3\xbc\x20\x0e\xeb\x5c\xe5\x90\x53\x4d\x43\x3f\xc9\x87\xb8\x8f\xbc\x65\x91\x57\xe7\x4a\xf7\x9a\x14\x50\x14\xf4\x93\xc4\x89\x02\x0b\xd5\x57\x70\xf8\x0d\x2d\xb4\x79\x67\x0f\xe5\xfe\xfd\xde\xae\x97\xdd\xc7\xbe\x28\x0d\x66\x18\xb7\x07\x2f\xde\x9b\x3a\x0f\xb6\xe9\xb9\x7f\x82\x75\x12\x79\x58\x60\x2b\x79\x50\x1d\xd8\xde\xa3\x43\x9e\xff\x82\x17\xb6\xb7\x41\x2d\x63\xc5\x08\x5b\xdf\x94\x38\x6f\x71\xc7\x54\x71\x79\xe7\x8f\x7f\x8c\xfb\xae\x71\xc7\x76\x04\x9f\x8c\xda\x56\x6f\xcb\x6a\x8f\x14\xc6\xe0\x6f\x8d\x0f\xef\x7b\x58\x72\xaa\x58\xf7\x10\x4f\x8c\x42\xb3\x6f\x8c\x37\x2d\x91\xd3\x6f\x5c\x34\xbd\x19\x05\x62\x79\x66\xa4\xea\x0d\xe1\x49\x98\x53\xaf\xe8\x7c\x66\x37\x34\xcb\x29\x27\x8b\xa5\xc0\x58\x47\xb7\x72\xa2\x17\x74\xda\x55\xa0\x34\x2d\xd1\xcd\xa2\x94\x7d\x6a\xe9\x17\x66\x17\xb9\x72\xb8\x58\x8b\x53\x38\x6b\xa7\x74\xbb\x49\x0b\xa3\x29\x03\x5f\x28\xa1\x73\x0e\xf0\x93\x8b\x12\x80\x55\x66\x3f\xc4\x3b\xf6\x4a\x73\xe5\x9b\x72\x36\xdd\x62\xa2\xe7\x42\x5f\xdc\xb0\xf5\x02\x34\x78\xf7\x12\x20\xdf\xee\x32\x26\xef\x78\x73\xe7\x82\x42\xb2\xd7\xb0\x46\x4f\x55\x1d\xb6\xa9\xd5\x10\x67\xd3\xc0\x9a\xc0\xff\xf6\x17\x96\x3c\x58\x13\x3d\xae\x2d\xc8\x5f\xd7\xca\xf1\xe1\xb8\xb8\x86\x71\x5c\xa0\x53\x23\xf8\x14\x09\x57\x42\x91\xd6\x5f\x3a\x49\x0f\x06\x2f\xad\xa3\x3e\xf7\x81\x6c\x5f\x9d\xe8\x71\x36\x90\xce\x84\x34\x0c\x5a\xbb\x8d\x08\x83\xbe\x0e\x4a\x61\xc9\xcb\x32\x16\xca\xd1\xe2\x64\x81\xe5\xd8\x48\x29\x3f\x20\x86\xbe\xb2\x23\x82\x63\x81\xf6\xf5\x50\xf9\xc9\x94\xe0\x85\xd3\xe3\x14\x07\x40\x64\x98\xb4\x36\x7a\x37\x29\x7c\x45\xd4\x08\x66\xe7\x27\x8e\xc5\xe7\x30\xcf\x40\x42\x78\x44\x24\x64\xaf\xff\xee\xa2\x92\x61\xe6\x1c\xa6\x1b\x80\xa4\x85\x19\x08\x5a\xad\x34\x5c\xac\x01\x3a\x13\xfb\xaa\x03\x55\x42\x59\x6d\x2c\xc2\x13\x1e\xf0\x6e\x03\x7a\x9f\x24\x38\x2e\xa5\x1c\xf8\x25\x3c\xf0\x89\x2a\xff\x12\xac\x14\x3b\xee\xf9\x40\xf5\x75\xe3\x4a\xdb\x31\xd6\x75\xf8\x63\x20\x49\x0c\x4b\xa1\xbc\x98\x43\xb1\x99\x44\x65\xdd\xd9\x24\x49\x14\x38\x4c\x24\xb6\x53\xb1\x4f\x3c\x74\x7c\x16\xf3\x6c\x48\x9f\xa0\xd8\x61\x7e\xc5\x80\xb4\xb6\x7f\x87\x2c\x45\x0f\xd7\x25\x2e\x32\xc0\x39\x5c\xb8\xdc\x03\x39\x93\xf2\xfd\x79\x76\x60\xf2\x91\xfe\x8d\x7e\x2b\xf2\x0e\x12\x10\xe6\x70\x64\xa4\x07\x50\x1e\xe1\x4b\xad\xac\xa6\x31\xad\xbb\x90\xef\xf1\x96\xf9\x49\x2f\x12\x4b\xf7\x6b\x71\x9b\x25\xef\x08\x6c\xfe\x06\x3b\xa2\x28\x11\xed\xd6\x4b\xb7\xf4\xe9\xc8\xf9\x70\xf1\x95\x9d\xad\x4e\x94\xb8\x54\x1d\x31\xd0\x25\x8f\xde\x49\x5a\xc8\xb3\xdc\x4f\x7e\x28\x90\xa0\x4b\xa1\x67\x01\x62\x77\xc8\x13\x31\xcb\x9e\x93\x54\xe9\x1e\xa4\xbe\xf1\xab\xed\xc6\x2d\x15\x5f\xbd\x9f\xf6\xbc\x93\x33\xe1\x72\x17\xad\xec\x39\x8e\x91\x18\x62\x71\xd9\x3a\x86\x5e\xe8\x90\xff\x07\xa5\x92\xf5\xf1\xb1\x6e\x6d\x51\x82\x7a\x0e\x26\xa4\xfb\x71\x62\x6d\x96\x1d\x31\x7c\x3d\x44\xc7\xb2\x87\xaa\x11\x35\xec\x14\xde\x0d\x8b\xc0\xef\xca\x89\xb3\x2b\x72\xd3\x8e\xdc\xb2\xb2\xaf\x26\x0f\xce\xda\xfc\x8a\xb1\x6a\x2d\xbe\x1f\x60\x40\xea\x8a\x2d\x96\xb3\x47\x08\x65\x40\x60\xa6\xce\xa7\x48\x7d\xd3\x79\x39\xa4\x97\x51\xfb\x22\x63\xb0\x92\xea\x72\x9a\xc9\xc0\x50\xab\x93\xf7\x9d\xc7\xcf\x24\x22\x9e\x18\x3e\xa0\xb3\xc9\x5a\x03\x33\x41\x89\xca\x02\x76\xa3\x7d\xad\x32\x0d\xeb\xd6\x09\x13\xdd\xbf\x64\xfe\x11\x47\xc1\xdc\x19\x6b\x22\x8b\xb9\x49\x88\x76\xc3\x8b\x60\x65\xe0\x9a\x8c\xb2\x92\x26\x65\x4d\x87\x97\xc3\x17\xcd\xb9\xbf\x04\xb8\xc0\x42\x71\x4e\x5c\xb3\x81\x7c\xc9\xd5\x95\x2d\x44\x87\xcb\xb9\x6b\x64\xe7\xe2\xea\x6d\x12\x6b\x01\xb1\xcd\x7e\x89\x35\x3c\x32\xd6\x24\x62\xdb\x32\x8a\x02\x0e\xbb\x11\x7d\x89\x8b\x80\x8f\xfd\x72\x88\xdc\x76\x0c\x36\xdc\x2c\x8c\x49\xf9\x43\x8a\xbb\x82\xea\xe2\x0d\x4b\x34\xf7\x44\x74\xeb\x1e\xea\x05\x3b\x16\x62\x15\x90\xae\xc4\x86\xdd\xd7\x72\x3b\x91\x12\x37\x8c\x46\x8e\xa0\xc3\x6d\xaf\xa0\x06\xec\xcb\x18\xba\x94\x58\xc5\xaf\x3b\x03\x6f\x01\x86\x9c\xd8\x79\xe0\xca\x91\x0d\xb7\x78\xc7\x17\xc7\x66\xbd\xcc\xb5\x64\x70\xe6\xfc\x01\x43\x2e\xae\x43\xa6\x4c\xcc\xfc\x3e\x55\xdf\xa0\xbd\xde\x5c\x0e\x51\x8f\xc8\x1e\x46\x3d\x00\x53\x02\x34\x04\x51\xf5\x3e\xf1\x86\x7e\xd2\xd7\x38\xb1\xe4\x60\x53\xaf\x29\xb3\xae\xbf\xbf\x12\xe9\x6e\x47\xa6\xff\x0a\x92\x94\xb1\x12\xe3\x7c\x5b\x25\xe7\xdc\x1a\x56\x77\x81\xdd\x01\xc1\x94\xeb\xf2\x4b\x80\xbc\xdd\x9d\x28\x11\x80\xd8\xb6\x47\xe0\xdb\xf2\xf9\xa2\x89\x0e\xe5\x08\x3a\x9b\xdd\xb5\xaf\x80\x4a\x81\xce\x16\x73\x1d\x87\x2d\xf0\x4c\x44\x6c\x8b\xb7\xae\xf1\xd6\x1c\x01\xff\x14\x4a\x99\x32\xda\xe2\xf3\xad\x5b\x86\x3a\x8d\xc7\xc0\x7c\x6f\xfa\x70\x51\x0d\xad\x77\x0f\xa6\xdb\x60\x19\x55\x97\x46\x86\xdb\x2a\x0e\x9d\x5e\x0a\xad\xf3\x7d\x08\xc8\x1b\x28\x74\xd9\x49\x99\x59\x5c\xbf\x40\x89\xc1\x8b\xa5\xe3\x63\x0e\xb3\xd0\x99\x81\x38\x74\xc0\x2c\x88\x56\x96\x81\x06\x24\xc5\x66\x47\xbd\x63\x69\x2b\xcf\x2e\x4c\x8c\xc0\xb3\xd3\x8f\x8b\x65\x6c\xfe\x9d\xf9\x8b\x64\xb4\x67\xfb\x02\xf6\x85\xa0\xe6\xab\xef\xc8\x29\xb2\xbd\x3d\x57\x72\x5b\x4e\x03\xd0\x8f\x0c\x1d\x30\x82\x90\xcc\xbb\x8e\xe1\xa4\xb1\x17\xc4\x3b\x6e\xf8\x94\xb7\x65\xd3\xb2\x1b\x43\x0f\xec\x37\x24\x20\xcf\xc2\xa5\xfc\x31\x98\xa5\xa6\x6f\xe1\xe4\xd5\x1e\x00\x83\x1d\x80\x81\xc0\xeb\xac\xbc\x7a\x61\xce\xe7\x34\xbc\x4a\xbf\x9b\xe4\x33\xd5\xba\x1d\x8c\xa2\xca\xc7\xbb\x58\xed\xb6\xc0\xe6\x67\xf2\x8e\x4a\x5c\x34\xc3\xf2\x59\x3c\x5d\x29\x5c\x12\xf6\xaa\xa9\x84\x08\xbd\x77\x18\xc7\xa4\xe9\x13\xc4\xbc\xb9\x24\x6d\x7d\x33\x9d\x37\x61\xce\x5a\xc1\xe5\xa5\x25\xd6\x0e\xa9\x1c\xfd\x01\xa9\x17\x5d\xf7\xc7\x6e\x30\xa7\x26\x05\x9e\x71\xdb\xdf\xab\x23\x7d\x36\xc8\x07\xe6\x87\x8c\x67\xc8\x8d\xb2\x9b\x8a\xa4\x2a\xeb\xa1\xfc\x60\x08\x80\x91\xa9\x07\x79\xdf\x37\xf7\xe1\x87\x68\x49\xf7\x67\xfb\x39\xf2\x73\x62\x3d\xb3\xca\x33\xa1\xb2\xb9\xa8\x72\xb1\x69\x69\x73\x73\xd9\xda\x00\x32\xe3\xb2\x7c\xa8\x15\xba\x0d\x17\x67\x35\xdb\x90\x6d\x2f\x19\xfd\xf0\xad\x19\x0f\x11\xed\xea\xdc\xdb\xc3\x93\x6b\x95\x63\x7d\xf1\x75\x53\xfb\x64\x93\x44\x66\x1f\x5f\x3f\xc0\x59\x22\x2d\xcd\xae\xb5\x82\x91\xe2\x39\x95\xda\xc7\x0f\xaf\xba\x3e\x7a\x4d\x7c\x40\x19\xdf\x38\x97\x2f\x33\xe4\xd5\xca\xd6\xa5\x37\x61\x2a\x03\xba\xce\x17\x8f\xaf\xd2\xe8\xc2\xd3\x7e\x73\x75\xcd\x5d\x21\xd9\x58\x5b\x5d\xf8\x03\xb7\x75\xe6\x2e\x87\x73\xf3\x84\x26\x18\xd6\xea\x33\x5f\x63\xc8\x64\x6d\xf9\xf7\xb4\x67\xe6\xb6\xa8\x51\xb3\x92\x03\x5d\x94\x5f\xaf\xb1\x75\x7b\xe2\x58\x6f\xc9\xef\xf3\x05\xc8\x8e\xd4\x67\x50\xff\xc6\x6f\xfd\x51\x67\xee\x71\xb8\xb4\xb0\xca\x5e\x90\xbb\x17\xab\x4b\x20\xbc\xae\xa1\x2a\xb2\xe5\xa6\x54\xc6\x21\xca\xec\x73\x98\x02\xa5\x60\xf7\xe9\x57\xce\x52\xaf\xc4\x58\xae\x07\xcf\xc2\xdb\xdd\x72\x03\x56\xaf\x3a\xe4\xd0\x10\x29\xf9\x5c\x6f\xf3\x85\x09\xbe\x62\xc3\x2f\x39\x86\x58\xde\xe4\xdb\xd6\xa0\x57\x2a\x21\xda\xa0\x48\xc8\xa3\xa1\x37\xec\x41\x37\xd6\x4b\x83\x98\x9f\x80\x19\x7a\x96\x8f\x4e\xa9\xf5\x34\x58\x0a\xf2\xb1\xf0\x88\xbf\x93\xcf\x56\x90\xdc\x07\x15\x0d\x3b\xc4\xbd\x87\x7c\x1f\x84\xdc\x19\xda\xd3\xf2\xaa\x91\x07\xc9\x46\xad\xd2\xd1\xa5\xc7\x61\x8a\x81\x98\x53\x93\x34\xa3\xcb\x9f\xb9\x91\x64\x30\xeb\x07\x61\x5b\xea\x64\x0e\x79\xf5\xa8\x06\xb9\x9e\xd2\x57\xb0\x80\xbc\xa6\x93\xd8\xeb\x15\x69\xeb\x10\x39\xe4\x7a\xc6\xc4\x9d\x3c\xc2\x07\x49\x84\xf4\xfe\x91\x93\x0d\x6b\x96\xb4\xf7\x91\x14\x87\x5f\x51\xee\xe1\x59\xc1\x9d\xaa\x85\x9b\x62\x10\xf0\xca\xde\x8e\x90\x40\x61\x23\x5c\x79\x2a\x65\x70\xcd\x41\xa7\x10\xad\x50\x61\x5f\xb1\xad\x20\x0c\x86\xfd\x0c\x98\x84\x98\xed\x2f\xdf\x6c\xc2\xaf\x03\x9b\x74\xe3\x13\x7c\x32\x18\xdf\x33\x56\x82\x1c\xfa\x83\x43\xe7\x9a\xa1\x76\x13\xe9\x37\x9a\x42\x4f\x03\xdc\xa4\x49\xbd\xd3\x49\xb6\x77\xde\xef\x38\x05\xbc\x01\x64\x43\x17\xd3\x5b\x9d\x20\xeb\xd2\x4f\xda\x2f\x61\xa8\xd5\xd1\x00\x1b\xa3\xec\x57\x45\x7f\x20\xb2\xa3\x36\x48\xe8\x6b\xf9\xe8\xf1\xb6\xe9\xe9\xa9\x2d\xcf\x11\x10\x94\x95\xc1\x58\xbf\xb7\xec\xe2\x10\x6e\x36\x8f\xa7\x61\xb6\xc7\xaf\x34\x15\x1e\x50\x26\x29\x6c\xac\x65\x3a\xa0\xb0\x11\x0e\x41\xae\x26\x2b\xce\x23\x4d\x23\xd7\xe9\x14\x00\x16\xc4\xc3\x39\x5e\x9d\xaa\x4c\xe1\xca\xc1\x6c\x85\xe0\xb6\x1c\x8a\x6c\x02\x86\x94\xf4\x41\xf2\x61\x9d\x85\xae\xce\x3b\xf8\x89\xb0\x29\x97\x42\xfb\xc9\xc4\x9d\x04\x13\xb1\x9d\x70\xfb\xf8\x4b\x61\xca\x34\x2e\x6b\x85\xcc\x5b\xe3\x15\x7b\x5f\xdc\x4e\x3d\x7e\x41\xde\x85\x63\xbf\xbf\x64\x89\xf4\x7c\x06\x47\xf1\xeb\x67\x1f\xdb\x96\xea\x37\xc1\x54\xbc\x18\x43\x74\xe7\x41\xfe\x21\x8d\x80\x64\x5c\x2f\x83\x1f\x94\xb1\xf4\x3a\xb4\xf0\x17\x86\xcf\x93\x93\xed\x35\x6b\x4f\xf8\x05\x65\x7a\x25\x31\xe6\xf2\x80\x8d\x02\xaf\xd8\x8a\x74\xf8\x0e\x4a\x22\x54\x7b\x38\xf5\x80\x8c\xe7\x12\x64\xc4\xa8\x4b\x63\xbd\xb1\x3a\x0d\x61\x21\x62\x0c\x47\x4a\x60\x79\xf0\xcb\xb7\x11\xa7\xd0\x27\x41\x8b\x7a\xfd\x1e\x01\x76\xaf\x2b\x00\x8d\xb8\x32\xd5\xb7\xc4\xe7\xae\xa3\x78\x8d\x2b\x7b\x14\x8f\xed\xa2\xc3\x28\x9c\x67\xa6\x5b\x35\xa5\x91\x3d\x6c\xf9\x47\x1b\xa3\x8f\x68\x75\x0e\x94\x90\xf1\x88\xc7\xf6\xc3\xbf\x1e\xb7\xcf\x51\x65\x2b\x6e\x27\x69\x7c\x16\x4e\x95\x26\xfd\x6d\x81\xf4\x08\x56\x63\xb0\x18\xcf\x03\xc9\x00\x7b\x71\xf7\x3e\xca\xf2\x3e\xea\x8a\x3d\x54\x57\xc4\xdc\x86\x9d\x71\xf1\x4c\x74\xa4\x52\x77\xb0\x17\xf5\x65\x9b\x2f\xbb\x87\x83\xd1\xa6\xba\x82\xcd\xca\x05\x9f\x06\x6f\x31\xae\x39\xe2\x25\x8c\x34\xb1\x18\x79\xa3\xf8\x9d\xbb\x48\xf2\xe2\x7c\xae\x9f\x44\x53\xa5\x60\xb3\xdb\xd9\x5f\x5d\x21\xcb\xc9\x9e\xbe\x44\xab\xa7\x21\xd1\x67\xbb\x20\x73\x0e\xfa\xe5\x93\x7e\xa8\xa5\xf3\xc9\x15\xc8\xcb\xdb\x16\x93\x66\x52\x99\x17\x71\x1b\xd1\xc5\x84\xbd\x12\x66\x9a\x41\x1f\x84\x0d\x53\x1f\x64\x9e\x92\xa8\xd7\x51\x7e\xb0\x52\xa1\xc4\xb9\xfc\xf4\x3e\x7c\x2d\x97\xe8\x24\xcb\x79\xd3\xdc\x96\x33\x9c\x96\xce\x5e\x5c\x47\xb7\x02\xd5\x4d\x84\x6c\x91\xb3\x64\x8b\x5a\x4f\xcd\x97\x52\xfc\x96\x5d\x00\x51\x09\x8f\x19\x6b\x60\x62\xaf\xd1\x65\x29\x5f\x35\x22\x6b\x00\xac\xe2\x51\x66\xd1\x7b\xe1\xec\x72\x01\x55\xa7\x7b\x90\x55\x29\xb7\xa3\xb1\x97\x62\x2a\x22\x1d\x8d\x62\x5e\xe2\xe9\xe4\x8f\x8d\x66\x64\x62\xda\x05\x09\x1c\x15\x44\xfc\x79\x68\x1e\x7c\x8d\x64\x71\xbc\x84\x8f\xde\x4b\x46\xdd\x84\xf3\x5a\x30\x29\xfb\x6a\xb9\xb4\x77\xe9\x7f\x1e\x6c\x10\x82\xf3\xc8\xfa\x39\xcf\x1d\x97\x9f\xe5\xc7\xf9\x7d\x97\x5d\xe9\x94\x3d\x4a\xcb\xec\x97\x71\x3e\xc9\xf8\x9f\xcf\xd3\xfe\xf7\x00\xce\xf5\xc1\x4d\x24\x9a\xd1\x23\x9b\x76\x0e\x34\xaf\x16\xfb\xf2\x26\xe8\x87\x33\x13\xdf\xe2\x8a\x5e\x0c\xed\xe6\xf0\x2f\x2e\x7f\x61\x84\xee\x4c\x73\x71\x2d\xcb\xd6\x90\xc2\x24\x3a\x66\xf5\x48\xf2\x96\xf8\x94\x47\x6a\x82\x8d\x19\x96\x4a\x5b\x27\xee\x22\xfd\xc0\x66\xfc\x84\x32\x61\x02\x91\x55\x91\x8b\x8e\x01\x25\x53\xb4\xd5\xd2\x07\x9c\x9a\x78\x02\xb4\x6a\x06\x9c\xc4\x1e\x78\x96\xe8\xe6\xa2\xc5\xcf\x59\x0e\xb1\xf3\xfc\x12\xdb\xd1\x0e\x12\x01\x93\xba\x88\x02\xfc\xfc\x28\xee\x32\x13\x56\xbb\x57\x4e\x24\x6a\x99\x31\x79\xa5\x12\xf9\xb5\x2d\xb0\x28\x89\x64\xcb\xe9\xa8\xef\x9e\xb4\x67\x02\xe6\x8e\x0c\xcc\x97\x78\x95\x3d\x2f\x65\x68\x33\xcd\x63\x7e\x89\xc7\x38\x76\x32\xfc\x7e\x38\xd3\x12\xfe\xa2\x72\x7a\x02\x8c\x17\x2e\x79\x7e\x98\xf3\x74\x69\xaa\x95\x43\x03\xdd\x05\xa9\x78\x35\xf3\x52\xc0\x2b\x4f\xb7\x19\xd4\x46\x52\x25\x97\x8d\x66\xd4\x0b\x94\x80\xcf\xad\xfb\x4d\xb4\x82\xb0\xce\xe9\xa2\xcb\x82\xbf\x96\xfe\x8d\xa4\x20\xcc\x18\x08\xf0\x4b\xf0\x23\xed\x67\xdd\xe9\x6f\x85\xb5\x6a\xbf\xd5\xa8\xad\x27\x86\x10\x5a\x45\xfe\x4f\x7b\x22\xf1\x72\xfb\xc3\xd8\xc0\x90\x55\xcf\x19\x8e\x20\xca\x08\xed\xee\xff\xd3\x3c\x12\xc4\x4d\x00\xba\xab\x51\x14\x34\x53\xca\x16\x44\xcf\xc5\x85\xed\x16\x35\x34\x5d\x46\xe4\x78\x22\xc6\x76\xa3\x31\xb2\x7c\xb6\xba\x58\x4d\x4f\x3a\x4e\xea\xad\xe3\x12\x26\x5a\x58\xf3\xd5\x31\xdd\xa7\xcc\x3a\x49\x57\x47\x8f\x2f\xb5\x2c\xda\x1d\xae\xc9\xd9\x5c\x78\xb3\x59\x50\x6d\xa5\xae\x58\x98\x9c\x4e\x50\xde\xfd\x66\x9a\xce\x5f\x8e\x56\xd3\xe9\xc6\x0b\x34\x5c\x2a\xd2\xa5\x9d\x4a\x65\x6f\xce\xdc\x3c\xbd\x93\x86\x30\x45\x96\xaa\xbb\xc5\x96\x9c\x91\x4e\xf3\xa0\x27\xd5\xb8\xf2\x01\x99\x8a\xcf\x99\xa7\x89\xf8\xd4\xf0\xa1\x0a\x47\x29\x9b\x53\xc7\x9f\xe2\x1c\x4e\x75\xb4\x88\x81\xfe\xf0\x2f\xc2\xc8\x3b\x68\xb7\x18\x90\xf0\x98\x22\xbb\x12\x22\xd3\x7c\xb7\x1d\x7f\xc4\xbb\x7d\x26\x32\xb9\x4b\x84\x07\x24\x47\xb9\x63\x78\x70\x3d\x77\xe2\x0b\xa6\xbc\x2e\x3a\xa8\x54\xa5\x5e\x47\xb8\xf9\x1f\x96\xb9\x66\x3a\xe5\xf4\x8c\xad\xb4\x17\x27\x64\x4d\x64\x8a\xa6\xbf\xcc\x45\x02\xf7\xb3\xf2\x6f\x22\x24\xd2\x23\xe7\xa9\xc6\xf5\xb7\xd6\xf3\x26\x76\xda\x1f\x3c\x8d\x62\x87\x92\xf1\xc9\xfd\x7d\x71\x32\xee\x94\x3a\x5d\x1a\x15\x1a\x5e\xe7\x87\x9c\xc3\x97\x4f\x29\x9d\xae\x09\xb0\x1c\x5f\xac\xca\xed\x2f\x24\x94\xac\xb6\xbe\x90\x68\x7a\xb6\xf1\x2a\x9f\x22\x25\xa1\x57\xd9\xcb\xdb\x69\xa3\xb0\xcd\xd2\xb2\xd3\x0b\x06\x68\x9d\x07\xb9\x6e\x5b\x87\xd9\xbf\xc6\x4e\x38\xcb\x57\x7e\x13\x8a\x8a\x07\xd3\x1f\xd5\x57\xd6\x7a\xdd\x2b\x41\x36\x95\xfb\xd2\xf9\x0c\xd8\xcc\x2b\x01\x4a\x34\x17\x56\x59\x5f\x18\x2a\x82\x05\xaa\xd7\x37\xf9\x6b\xd9\x24\x5d\xa7\x07\x36\x0b\x95\x13\x7e\xcf\x59\xeb\xa1\xbf\xe7\x44\xe6\xd8\xef\x89\xf5\x42\xe7\x62\x16\x08\x11\x93\x09\xf0\xeb\xba\x02\x7e\xa0\xf5\x5a\x3e\x94\xfd\x66\x58\x87\x23\x48\x34\x5c\xfe\x4d\x21\xe5\xf2\xeb\xea\xc5\x22\x27\xee\x96\x39\x4c\xe3\x4d\xb1\xec\xc5\xf2\xab\xf4\x4a\x91\x2d\x85\xff\x54\x33\x96\x73\xf4\x9c\x8e\x36\x82\x53\x94\xdc\x22\xea\x5e\x72\x37\xd6\xdb\xce\x60\x5a\x56\x6f\x01\x5f\xb9\x44\x95\x44\x4c\x46\xb4\xc2\xa8\xd7\x5b\x0e\x40\xcc\xd5\x78\xea\xb8\x0d\xb5\xa4\xaa\x59\x3f\x86\x90\xd9\x78\x75\xaf\x6b\x0c\x4e\xce\x3c\xce\x0a\x48\xf5\xf6\x54\xa3\x18\xbc\xa3\x51\xdf\xe3\x75\xb9\x71\x09\xd9\x09\x7e\xff\x72\x62\x21\x45\x7f\x86\x5b\x7d\xc5\xb9\x3e\xa7\x60\x86\x3e\x6d\x24\xf9\xa2\x52\x3e\xe5\x39\x61\x11\x4d\x0c\xdd\xa2\x2b\xde\x76\x83\xdd\xf7\xaf\x76\x3e\xd4\x28\x8f\x9b\xca\x19\x3c\x55\xc0\x74\x1f\x37\xab\x53\x5f\xd3\x86\x8e\x1c\xc2\xe6\xfe\x7a\x68\x24\x59\xaa\x72\x86\xcd\x99\xcd\x92\xdd\x02\xd7\xce\x96\x97\x6a\x46\x7e\x7e\x44\x28\xe5\x0f\x7a\x79\x05\xe5\xb3\x1c\x82\xf6\x8e\xb3\xe8\x16\x7a\x01\x73\xa8\xb1\xd2\x3f\xe5\xce\x2a\x06\x28\x24\x73\xea\xdb\xe6\x9b\x91\x3b\x4b\x6b\xc1\x1b\x40\xde\x7e\x5d\x2c\x6b\xce\x77\xce\x3d\xda\xdf\x2f\xc2\xb0\x93\x44\x99\x05\x89\x30\xea\x67\xd9\xba\xd0\x97\xcf\x04\xc7\x34\x37\xe2\x86\x62\x3c\xae\x0b\x7c\xc3\x85\x07\x67\xa5\x5a\xd6\x70\xf5\x76\x4e\x22\x49\xc2\x58\xcc\x86\x40\x12\x2b\xe9\x32\x86\xcf\x1f\xce\xbf\xbf\x44\xdf\xb0\x9d\xec\x48\x87\x9e\x47\x41\x1b\xa6\xe5\x11\x68\x08\x19\x42\x0e\x70\xc0\xb8\xc1\xd7\x9a\xc6\x0b\xfa\xee\x33\xd6\x0a\xaa\x06\x5c\x61\x4f\xd6\xa7\x5d\x51\x3e\xf6\x83\x56\xe1\x2d\xcb\x25\x17\x92\x3b\x89\x45\x1d\x50\xb5\xb0\xa7\x59\xd8\x08\xf0\xd3\xab\x9a\x31\x68\x14\x67\xe4\x5c\xce\xa9\xd0\x13\x8a\x05\xa2\x6b\x3f\xb5\x5a\x3d\x94\x39\x57\x07\x18\x34\xfa\x71\xa3\xd7\xd9\x14\x0e\x63\x98\x7a\xe9\x23\x5d\x5c\x42\x15\x16\x87\x18\xfb\x7d\x01\x88\x31\xdd\xd0\xc6\x57\x50\x59\x83\x97\xea\x2d\x1b\x5f\xfc\x07\x03\x2a\x66\x64\x60\xd7\xb5\xac\x47\xe5\xa1\xc6\xd9\x88\x88\xe9\x23\x64\x93\xe5\xbd\x65\x2d\x65\x6e\x03\x4a\x71\xc3\x18\xd6\x40\x4e\x44\x4d\xfb\xfd\x31\xa9\x73\xfe\x1b\xe2\xf4\x61\x65\x77\xb0\x09\x78\x65\x89\x0f\xd0\xf0\xf3\x2f\x02\xb9\x5e\x84\x55\xbb\x66\x9b\x38\xaa\x8b\x24\x88\x06\x22\xf6\x87\xf4\x35\x01\xb4\x09\x3b\x94\x47\x48\xe9\x4d\xae\x8a\xcf\xc9\xf4\xa0\x62\xcd\x50\x59\xb9\x29\xf5\x32\x44\xc3\xbf\x07\x98\xac\x5e\x1b\x01\x67\x55\xb4\xd1\xd3\xaf\x72\x7f\xce\x58\x80\x61\x34\xbb\x29\xd8\x39\xf1\x05\x94\x01\xc8\x82\x3d\x0e\xf7\x26\xdb\x2a\x25\xc0\xc2\x73\xad\xcc\xd6\x1b\x1d\xeb\xe4\xd6\xd8\x3f\xee\x87\x1c\xcf\x44\xa6\xec\x61\xe3\x0d\x3e\x28\xf7\x0a\x36\x6e\xc1\x70\xd3\x52\xb1\x3a\x8c\x08\x5f\xb5\x54\xd6\x4a\x5f\x84\xdb\xec\x4b\x2f\xca\x27\x68\x47\x9e\x15\xf4\x94\xa4\xd0\xb7\x4e\x4c\xd7\x7b\xac\x01\x6a\x4f\x4e\x73\x84\xf1\x95\xf2\x4a\xed\x3d\x05\x7b\x54\xaf\x34\x9e\xc4\xd8\x84\xd8\x86\xc3\x53\xc8\xcb\xcd\x34\x3f\xcb\x37\x56\xd6\x62\xa7\xde\x2a\xfd\x03\x8f\x25\x09\xfc\xd8\xd7\x4a\x5e\x7f\x5b\xcb\xf6\x2e\xcd\x5d\xa3\x87\xd3\x56\xb1\x6e\xc5\xa8\x87\xa4\x08\x99\xc1\x69\x7b\x82\xe2\x35\x31\xee\x62\xe1\xd5\xe2\x36\x68\xb5\xc9\x6d\xc3\xe1\xba\x16\x56\x6c\x96\xb8\xc8\x50\xbf\xb7\x34\xd6\x4f\x16\x25\xb0\x41\x4c\x59\xea\xd4\xc6\x6f\x8f\x3c\x59\xab\x01\xbd\x4d\x5b\x43\xb7\xb7\xe7\xe4\xb2\x07\x54\xd3\xe7\x0e\x4f\x67\x1d\x4c\x14\x62\x43\x83\xf3\xd5\x27\x1d\x6e\xc8\x62\x75\xb2\xac\x07\x3d\x12\xc3\xe7\x66\x39\xb5\xb7\x29\x54\x40\x24\x2f\x04\x30\xfd\xcc\x9f\x40\xa9\x88\xaa\x89\x52\xa1\x26\xee\x16\x7b\xf2\xca\xfd\x89\x82\xab\x4f\x74\x78\x1b\xc7\x44\xf8\xb6\x00\x9b\x38\x50\x11\xdd\x99\xe2\x1f\x82\x22\x61\xf6\x56\x1e\xd5\xf4\x4d\x1d\x0e\xb0\x6f\xbb\x38\xe1\x1e\xfb\x85\x86\x2e\x35\x5c\x45\xfd\xe3\x2d\xd9\x8b\xaf\x2c\xb1\x50\xc0\xc8\x83\xe9\xe5\x37\xcb\x93\x46\x2a\xc1\x8f\x3d\x39\x71\x72\xfa\x6c\xec\xa3\xf1\x5c\x6d\x6d\x32\x8c\x2b\xae\xbe\x26\xd6\xac\xdd\x72\xa9\x52\x5c\x41\x15\xd4\xd1\xae\xcc\x15\x24\xdb\xea\x09\xf7\xf7\xe7\x9b\x7f\xd5\x5a\x6d\x7c\x87\x15\xdc\x3e\x2c\x72\x87\x23\x51\x75\xa4\xc0\xa2\xf3\x62\x6d\x30\xa5\x7b\x9e\xcd\x64\xb6\x1c\xd7\x6a\x7c\x92\xd7\xf8\xc4\x2f\x21\xae\x33\x14\x1f\x34\xc4\x3d\x73\x98\x92\x3d\x2b\x16\x18\xfe\x72\x89\x6f\xca\x59\x34\xb1\x27\xe6\x8f\x62\xe6\x86\x69\x88\xbb\xca\x85\x4f\x9c\xbc\xe4\x3c\xb6\x1f\xab\x39\xa5\x52\xf6\x74\xe3\x38\x1e\x83\xe5\x40\x22\x73\x60\x21\x37\x54\x4e\xee\xa8\xa4\x0a\x91\x48\xb9\xf2\x69\x79\xa6\x51\x3a\x6e\x4f\x16\xfc\xb8\xb3\xf5\x89\x25\x16\xa2\xe4\x64\xd7\xe6\xb8\xbc\xf9\xca\x6b\x22\x4c\x3f\xff\xfb\x27\xaf\x38\xaf\x7f\xc1\x6c\x15\xf5\x47\xef\x8e\x7c\x5f\x47\x3d\x4a\x8f\x6f\x06\x97\x5e\x1e\x99\x10\x78\xc3\x57\x05\x3a\x86\x85\xc9\x13\x38\xbd\xa0\x0e\xd1\x06\x06\xad\xa0\xfb\xe7\x7f\x28\x5a\x54\x5f\xbb\xb1\x0f\x2f\xbb\x61\x74\x0f\x2b\x7d\x50\xb5\xe6\x62\xa8\xb7\xba\x17\x92\x76\xdb\x29\x05\x5d\xc8\x1a\x61\xd6\x0f\x4f\xbc\xfd\xcb\x43\x4f\x0e\x79\x8a\x59\x60\x60\x54\x59\xc4\x5b\x53\x3a\xb2\x8b\x81\x38\x8c\x33\x38\x31\x9c\xa4\x5d\x44\x62\xca\x36\x62\xbb\x66\xb1\x5f\xc1\x6b\xec\xcb\xa1\x90\xe2\xbf\x96\xcd\xec\xc1\x09\xf6\x44\xa2\x55\xe3\xc0\xa0\xaa\x6b\xbb\x0e\xe4\xc5\xde\xbc\xdf\xc7\x4d\xf1\xbd\x19\xc3\x80\xfb\x8a\xf1\xeb\xa1\x47\x3d\x4c\xae\xb4\xd7\xa6\x52\x6f\x9a\x6d\x50\xed\x63\xaf\x91\xbf\x4e\x4e\x70\xf5\xd4\x03\x2f\x31\xcc\xfe\xe6\x75\x48\x61\xaa\x07\x35\x7b\x5e\x15\xa8\xe2\x84\xad\xde\xec\x54\x0f\xed\xa6\xd3\xdf\x0c\x72\x42\xb8\x99\xa1\x80\xd6\x56\xb3\x29\x61\x8e\xed\x4f\x94\x0a\x99\x3d\x0d\x51\x7f\xca\x96\x96\x57\x3f\x3f\x79\x13\xe5\xa7\x33\xd6\xb5\x93\x7e\x7d\x31\xe5\xcb\xee\x86\x01\x45\x47\xcd\x99\x73\xda\xaf\xfe\x26\x15\xcb\x43\xb5\x3b\xe9\xd8\x76\xb2\xf8\xdf\x49\xb4\xab\xb3\xee\x3a\xe8\xbf\x27\x7b\x64\x6c\x49\x67\x84\xe2\xac\x2a\x28\xdd\x16\x38\x0d\x67\x00\xab\x2e\xd2\x6d\xd9\x1f\xa1\x0e\x5d\x2e\xb7\x60\xf4\x7b\xb5\x09\x46\x7d\x74\x95\x41\xaa\xb9\x07\x94\xaa\xa3\x73\x4d\x07\x4f\x52\x72\x76\x97\xf2\xa1\x16\xb6\x53\x7c\x99\x6e\xd0\xb3\x4f\x04\x4d\x61\x3a\x64\xd0\x27\xcb\xb6\x51\x22\x34\x5f\xcd\x40\x2a\x74\xee\xe6\xdb\x05\xbd\x76\x2f\xd3\xbb\x12\x6f\x77\xff\x0d\x18\x7b\x06\xc8\x90\xfa\x9f\x7a\x73\xa8\x33\x90\xca\xfb\xc5\xda\x6d\x4f\xad\x89\xb9\x88\xeb\x22\xbb\xe4\x6f\x78\xa9\x2c\x00\x03\x2b\x86\x26\x78\xf0\xd1\xb0\x74\x04\xeb\x31\xfc\x88\x25\x08\xc0\xc1\x59\xb4\xc4\xe7\xb6\x12\x6c\x2b\xc1\x38\x35\x5c\x7e\xea\xf2\xe9\x0e\x86\xd9\xe6\x70\x95\x6d\x9c\xeb\xb2\x1d\x0f\xb1\xec\xa7\xf2\x77\x01\xcd\x09\x27\x41\xf7\xee\x63\x04\x34\x4d\x4b\x62\x2b\xe5\x06\x48\x8d\x5d\x8b\x5c\xf2\x56\x2e\xd3\x77\xd5\x79\x6f\x76\xe1\xd9\xaf\x2f\xf1\xaa\xcb\x57\xfb\x29\x7b\x89\xae\x6a\xdd\x7e\x35\x82\x2e\xbb\x5d\xd5\x44\xd1\xee\xe0\x6b\x57\x70\xae\x22\x55\x43\xcf\x36\x56\x11\x90\xeb\x35\x99\x1c\x63\x70\x0b\x82\xa9\x9b\xa6\xfa\xf7\xa4\x67\x64\xce\xb0\xe7\x13\x89\xa2\xab\x66\x44\x9d\x80\xd2\x1d\x56\xf3\xf5\x73\xda\x9c\x47\x24\x65\xb1\xdf\x3a\x1a\xdc\x6a\xdf\xac\x99\x5a\x87\x07\x2b\x3e\xa5\xe7\x19\xff\xe4\x83\xdc\xbc\x3f\x10\xf6\xf7\xa9\xbc\xd3\x4b\x8b\x8e\xb0\xb8\x0f\x8b\xb1\xb3\x4a\x7c\x59\x67\x9b\xda\xe4\xdc\xc3\x73\x75\x69\x6f\xee\x75\xdc\x94\xe8\xad\x36\xa6\x1d\x87\xde\x38\x7d\x65\x82\xb5\x45\x36\xde\x4e\xc4\x36\xd4\x81\x09\x7c\x70\xe3\xbe\x41\xe2\x12\xd6\x58\x2e\xed\x75\x77\x32\x22\x09\xa6\x2a\x92\x86\x1d\x44\x23\x51\x2e\x56\x3d\xbd\x13\x79\xf5\x0d\xb7\xe6\x6e\xeb\x4e\xc2\x08\x44\x3c\x17\x4b\xd7\x3e\x61\x57\xc5\xb3\x2d\xdb\x4e\x79\xc3\x16\xb3\x13\x25\x8a\x28\x81\x06\xaf\xb7\xc8\x7d\x0d\x9c\xdb\xea\x9c\x17\x8c\xdb\xca\xc0\x1d\x97\x93\x83\x3d\x7d\xf8\xa2\x66\x31\xdd\xbb\xaa\x0c\x2d\x9a\xbc\x29\x3d\x9a\xc2\xd2\x3e\x9c\xbb\xf5\x15\x0b\xef\x3d\x9d\xc5\xf2\xbc\xd9\xaf\x14\xf9\x94\x17\xa2\xb5\xe2\xae\xf7\xb8\xab\x9c\x71\xb7\xf1\x73\xe3\xbd\xf8\x5a\x0c\x93\xf5\x43\xa0\x95\xfc\x9f\x86\x72\x50\x6f\xa5\xe9\xf6\xdd\x83\xbc\x74\xbd\xce\xa0\xd0\x24\xa9\x26\xb3\xd1\xde\x07\xc6\xaa\xa3\x5b\xfe\x91\xad\x49\xb3\xf1\xd8\x6b\x37\xa5\xbf\x23\x5a\x5d\x44\x5f\x4b\x01\x6a\x72\x99\xd2\x1b\xf5\xdd\xc0\x8a\x6d\x71\xb1\xa6\x73\x5e\xb4\x60\x0d\x42\xf0\xe2\x29\xf8\x15\xad\xfb\x95\x49\x09\x9f\x87\x4d\xb9\xdf\x0f\xbb\xbc\xf0\x35\xac\xca\x52\x76\x89\x1c\x4a\x68\x5b\xc1\x6a\xdd\x19\x30\x5e\xb4\x5e\x45\xcc\x71\x94\x8b\x19\xc0\x7e\x5e\xa7\x8e\xae\xb2\x8d\xf0\xf9\xf4\xfa\x17\xe9\xc6\x20\x96\x7d\x29\x32\xb7\x28\xa2\x62\x3b\x1e\xac\xba\xda\x2c\x85\x54\x61\x58\x06\x8e\xc4\xb5\x57\x86\xf1\xcd\x28\x2e\xab\x6b\x09\x82\xd0\xb6\x07\x9f\x37\x6e\x50\xb7\x5d\xe7\x15\x45\xfe\x9f\x3f\xf2\x04\x14\xeb\x7d\xb0\x13\xe2\x77\x0f\x22\x1f\x21\x48\x0e\x4d\x65\x63\x5b\x4a\x73\x91\xca\x1c\x1e\x93\x48\xbb\xab\xcd\x60\x9a\x57\xf8\xd6\xea\xe3\x12\xad\x98\xc1\x16\xf6\x2f\x42\x2d\x90\x09\x1f\x38\xc2\x81\x75\x45\x1c\xb0\x0a\x70\x82\x37\xb1\x83\x8f\xb0\xed\x4c\x87\x9b\x13\xb6\x8c\xab\x61\x52\x8b\xc5\xee\xc5\x46\xdd\x68\x65\x08\x2d\x3e\xc8\x12\x76\x7d\x14\xbd\xb0\x95\x90\x81\x01\x6b\x78\x7c\x17\x41\x45\xad\xf5\x1b\x84\x5e\x9b\xe2\xa9\x48\xc4\x57\x56\x12\x93\xd7\xf1\x96\x63\x11\x65\x98\x11\x88\x3f\x54\x14\x48\x4b\x15\x41\x6f\x7d\xcd\x23\x66\x10\x6c\x4d\xe4\xbc\xa7\x8a\x20\x6b\xd3\xcc\x9f\x0e\x74\x65\x9d\xd5\xf4\x17\xb7\x0a\x12\x02\xa7\xf4\xb6\x62\x4e\xb6\xa9\x91\xfe\x77\x13\xa8\x6b\xf2\x86\x1b\x1a\x53\x40\x00\x8a\x0b\xf2\xcd\x69\xbd\xd6\xce\x03\xb0\x5c\xce\x00\xf6\xc4\xa2\x65\x5a\x7f\x96\x4e\xb9\xc5\x35\x40\xa7\x8b\x67\x7b\x66\xa2\xd3\x9a\xed\x0a\x12\x28\x90\x85\xf1\x6d\x76\x87\xfd\x05\xa5\x58\xb3\x3f\x8b\xbc\x72\xdf\xc8\xbf\xdd\xb6\x58\x1f\x64\x94\x48\x2c\x06\x73\x35\xdc\x03\xb7\xcc\xa3\xa9\x2c\x0f\x36\xf1\x3e\x4a\x1b\x07\x44\xe2\x49\x47\x25\xd2\x06\xe1\x9b\xd8\x55\xe7\x45\x1b\x39\xf3\x02\xf6\x9c\xf3\x48\xdd\x11\x42\x2f\x7c\xe2\x0c\x81\xdc\xfe\xdf\x29\x96\x70\xf8\x29\xea\x20\x12\xcf\x9a\x12\x85\x6c\x30\x8d\x55\x97\x70\xd2\x71\xd0\x8f\xfb\x5c\xed\x14\x11\x7b\x30\x37\xfa\x90\x89\x9e\xb7\x0d\x45\x18\x6d\xc3\xeb\x25\xd3\x8d\x30\x5a\x69\xa6\xf3\x14\x79\xf8\x2b\xa7\x6d\x26\xb9\x49\xc3\x9e\x91\x14\x63\x0d\x35\x0d\x86\xc3\xa2\x80\xb9\xa7\x18\xcd\xf1\x32\x15\x98\x9c\xb5\x0c\x79\xe0\x88\x47\xbd\x3e\xd2\x2e\x92\xdf\x22\x90\x4b\x33\xa5\xef\xbd\x09\xce\x8e\x33\xef\x77\x6b\xc5\x24\xab\x19\x29\x80\x05\x01\xbd\x88\x98\x1c\x36\x61\x60\x85\xf8\x49\x6b\xbe\x46\x10\x7c\x68\x72\xe4\x4d\x44\x69\x0b\xdc\x49\xd9\xdf\x94\x5d\x68\xde\xa3\xe5\x17\xc3\x2c\xf7\x2e\xc0\x4f\x6a\x32\xd3\x54\xb2\x60\x03\xf0\x20\xef\x92\x3c\xd9\x4d\xf2\x27\x34\x29\xd2\x87\xab\xfa\x5c\x59\x0b\x7d\xb1\x22\x1d\x30\x84\x12\x1c\x8c\x20\xfd\x82\xd9\x2d\xfd\x5b\x6c\xbc\xe1\xce\x90\x64\x6f\xd2\xbf\x10\x38\x05\xe3\x59\x84\xe7\x3d\x07\x11\x3d\x8a\x05\x16\x3c\x6b\xd4\xd0\x25\x72\x91\xa4\x99\x45\xaf\xea\x1b\x64\x8d\x4c\x6e\xf2\x34\xed\x97\x02\x9f\xdb\x32\x7e\xc9\x31\x34\x4d\x6d\xbd\xd3\x92\xca\xa9\x0d\x6a\x74\x64\x43\x3f\x9f\x41\xad\x0f\x63\x1f\x04\x7c\x4d\x9b\xf6\x08\xf6\x75\xfb\xea\x13\xc6\x43\x6f\xa4\x97\x73\x4a\xff\x8e\x0d\x0b\x78\x33\xe3\x4c\xf6\x32\x6f\x27\xcb\xf5\x9c\x5c\x7a\x1e\xa5\x19\xff\x53\x5e\xb3\x5d\x81\x83\x85\x9d\x33\x08\xba\x89\x74\x6a\xac\x1d\x28\xf1\x27\xb7\xfa\x87\x61\x17\x2b\x1f\x08\x65\xc4\x48\xbe\x75\x25\x59\xdb\x04\x46\x2a\x8d\x22\x57\x8f\xe2\x5c\x83\x56\xad\x17\x9c\xf4\x5c\x28\x83\x46\xb3\x05\x9e\x29\x96\xa3\x1f\xff\xef\xcb\xbf\x92\xe7\xb6\xd1\x08\x72\xd3\x4a\x92\xd3\x9e\x8f\x22\xde\xb3\x38\xd0\x08\x2d\x79\x91\xc3\x24\xa1\x80\x8a\x48\xa8\x5d\xd7\x4d\xca\x04\x08\x41\xfa\x14\x95\xc6\xc6\x31\xa4\x13\x69\xb9\x64\xfa\x93\xdc\x71\x83\x13\x15\x5f\xd5\xf6\xf1\x93\x0d\x2c\xc8\xfb\x9b\x48\x98\x6e\x19\xf2\xe7\xb6\x3b\xc4\xd3\x73\xdc\x29\xc3\x58\xc9\xc3\xa0\xe1\xb1\x43\xd7\x5a\xa8\x76\xf7\x63\x71\xe8\xda\x15\xad\x87\x13\xa9\x49\x0b\x9e\xf1\x03\x4c\x14\xa1\x4a\x20\xb1\x51\x77\xd2\x3f\x65\x16\xd1\x5d\xc6\x98\xfc\xe8\xb9\x19\x7b\xcd\x23\x11\xcb\xfb\xd2\x59\x47\xf4\xfe\x9c\xae\x5d\x39\x76\x9a\xbc\x02\x28\xf7\xc7\xa9\xe5\x42\x77\x82\x8a\x05\xcb\xc8\x90\x56\x9e\x75\x68\x6a\x02\x68\xed\x9e\x99\x12\x36\x4c\xc3\x41\xfe\xf5\x66\xaf\xfb\x2d\xf3\xb4\x99\x25\x5c\xce\xfd\x5d\x1d\x56\x0e\xdd\xfb\xdf\x42\x29\x0f\x5b\x84\x6e\x82\x7f\x5e\x07\x90\x42\x5c\x09\x35\x3c\x8c\xbc\x26\x85\xfd\xb2\x5b\xc1\x74\xbc\xae\x2d\xe8\xc7\x53\xee\xaa\xdc\x1a\x68\xda\x62\x59\x8b\xa2\xcd\xd0\x9e\x7b\xbe\x01\xd2\x22\x5f\xf4\x6a\x2f\xe1\x26\x18\xfd\xca\xcd\xb4\xb1\x59\x61\xa7\xab\xd6\xec\x01\xef\x4e\x80\xac\x89\xab\x0d\x10\x31\x0f\x05\x50\x8e\x57\xaa\xa1\x11\x1f\x3d\x34\xab\xb5\x66\x57\x0d\xb5\x53\xd3\xc8\x39\x55\x38\x38\xdb\x36\x3e\xa7\x4a\xd4\x2b\xa1\xe3\xa6\xd3\xba\x55\xd8\xfc\x83\x1d\x8e\xf7\x7d\x7f\x58\x31\x84\xe8\x86\xc7\x33\xde\x99\x3d\xac\x2e\x5b\x7f\x79\x1d\x2e\xef\x41\xfe\xd0\x5f\xb6\x8c\x08\x0e\xbc\xca\xe9\x50\xa2\x0b\x58\x1f\xee\x78\x71\x3e\x7d\x51\xc0\xe2\x42\x06\xa6\x99\xc8\x15\x22\xbd\xd7\x0f\x9d\x07\x0f\x9e\xde\xe7\x5a\x00\x15\x40\xb4\x51\x5d\xe4\xe3\xc2\x1c\x4e\x49\xf6\x01\x1c\x1f\xf8\xd1\x70\x15\xce\x9c\x62\x79\xa3\x2a\xad\xfd\xc1\xbb\x47\x14\xbb\x5e\x54\x8a\xfc\x10\x1e\xf1\x29\x85\x89\xce\x87\x12\xfe\xee\xe4\x79\x45\x10\x1c\xf2\xd2\xb9\x95\xb5\xc7\xbf\xa9\x3b\xad\x07\x8d\xc5\xf2\xcf\xd7\x58\xf7\x01\xf3\x28\x42\x30\x3e\xfc\x1b\x6c\x28\x3a\x12\xbf\xec\xe6\x5b\x7d\x22\x25\xfa\xe0\xf1\x68\xc8\x0b\x87\x9e\xbc\xf6\x0e\xa7\x00\x65\x64\x85\x2b\xf0\xe9\xfd\x07\x58\x96\x3d\x4d\x72\x04\x1d\x6b\xa6\xeb\xd6\xa1\xdc\x89\xd9\xa8\x73\x10\xc9\x12\xe7\xab\xfe\x9c\x7c\xb2\x03\x11\x7d\x8f\x8d\x8c\x1f\xf9\x7a\xe6\xe5\xe4\x2e\x1b\x77\xc5\x76\xcf\x3a\xa8\xe1\x26\xbd\xab\x91\xa8\x0c\x62\x3e\xb9\x9e\x6e\x3a\x4e\xd7\x61\x71\xf6\xb8\x1f\x94\x5c\x4e\xe1\x47\xf1\x73\xcc\x53\x10\xc9\x57\xba\x1e\x03\x49\x11\x29\xbf\xc5\xfb\xd1\xe8\xb7\x4f\xfc\x99\xed\x7e\xf2\x0e\xf4\x4d\x2a\xaa\xb3\xb7\xcb\xe1\xdd\xc3\xbb\x60\x09\xe0\x87\xaf\xca\x81\xef\x3d\xbe\x99\x0b\x5b\x90\x23\xe0\x43\x86\x20\x06\x93\xf7\xc8\x7c\x53\x4e\x48\x8c\x58\xf7\x00\x45\x7c\x64\x3f\x09\x34\x20\xa7\x0a\x96\x66\x2e\xe4\x97\x2f\xad\xf8\xda\x58\x3f\x63\xd0\xeb\xa3\xba\x5c\xf4\x52\xcb\xfa\xe8\xdb\x55\x78\xf8\x6a\xd6\x28\x8f\xce\xc7\x67\x94\x3b\x1b\x4b\x18\x9d\x86\x43\xf3\xdb\x8b\x87\x53\x01\x39\x62\x66\x5b\x93\xa1\xb7\xab\xa9\x71\xb4\x7b\x5b\xa6\x40\xe4\xcc\xdb\xb9\xe8\x47\x8d\x5a\xbe\x4c\xea\x79\xc7\x78\xe4\x76\x71\x1e\x24\xc3\x4e\xd4\xf9\xca\x39\x78\x43\x41\xa2\x96\x3c\xec\xe9\x75\xa8\xdb\x59\x57\x12\xce\xbd\xde\xe0\xe7\xde\x91\x97\x1e\x76\xa4\xdb\x49\x7a\xfa\x6d\xe4\x2c\x8e\x3a\x3f\x0b\x31\x89\xe5\xab\x3d\xda\x5e\x37\x38\xc1\xfe\x0b\x3e\x7a\xf0\x4c\xd5\x5a\x63\x1a\x0f\x69\x21\xcf\x06\x3c\xb0\x8b\xa0\xfc\xde\x9b\xf4\x29\x45\x6d\x60\x0f\xc7\x8b\x13\xcf\x95\x38\xe6\xd3\xf8\xaa\x66\xa9\x53\xc8\x04\x5b\x1e\xef\x25\x4b\x01\x94\xd4\xcc\xd1\x40\x6e\x5e\x39\xed\x20\xbf\x44\xc3\x2d\x44\x65\xb3\x5a\x39\xd9\xe7\x32\x04\xac\xd7\x3a\x27\xbf\x58\xcb\xf3\xe4\x7d\x62\xd1\x96\xf3\x5f\x9c\x96\x56\x82\x6a\xd3\x86\x30\x3d\xac\xe7\x22\x8d\x51\x7d\x4e\x5d\xa4\x41\x48\x99\xb9\x78\x25\x71\xbe\x48\xfa\x7c\x79\xd7\x17\x6a\x89\xb3\xf2\xe9\xdd\x79\x65\x89\x86\x04\xdf\x19\x83\x74\x17\x8d\x58\x6f\x89\x46\x8e\x98\x98\x5d\x1e\xe7\x95\xa2\x98\x65\xc2\x1b\xe9\x3d\x06\x14\x02\x08\x84\xff\x63\xc5\x0f\x09\xcc\x8c\x65\x01\xc4\xbd\x94\x6a\x4f\xfa\x17\x1f\xb2\x63\x39\xdc\xe9\x3e\xc2\x46\x26\xa9\xf8\xed\x26\xed\xa4\xd9\xc4\xe1\x66\xa9\x99\x91\x58\xd9\x1b\x8c\x39\x6e\x32\x38\xf8\x8b\x5c\x64\x85\x75\xac\xdc\x48\x37\xa9\x31\xba\xa0\x74\x70\xe6\x63\x5e\xeb\x44\xfa\xf0\x60\xc5\xe3\xd2\x4b\xd4\xaf\xda\xcc\x8a\x12\x1f\xad\x07\x9d\x66\x33\xdd\xac\x2c\x3c\xe7\xc4\x23\xec\x27\x95\x4c\xab\x2b\xb7\x06\xc5\x7e\xd9\x9d\xd3\x51\xf9\xf9\x09\x34\xa7\xe9\x21\xcf\xd9\x7a\x1a\x90\x46\x8d\xb7\xa8\x0a\x7a\xac\x3f\x64\xb3\x97\x7f\x3e\x23\x9b\xe5\xbe\x7d\x00\xb8\xe1\xdf\x0e\x27\x35\x75\x3b\x16\xeb\x37\xb2\xc8\xc6\x88\xa2\xb7\xd2\x8e\x06\x24\x4e\xfe\xe9\x65\x5d\xa4\x6a\x75\x88\x93\x79\xa0\x48\x47\x5a\x3e\xaa\x8c\xdc\x17\xa7\x0b\xac\xcc\xc0\x60\x84\xba\x2c\xaf\xf3\x38\xe9\x27\x41\x87\x5b\x83\x70\xae\xbd\xed\x47\x8f\xb1\x6b\x24\xa8\x30\x56\x02\xc6\x01\x3e\x9b\x6f\x37\x55\x11\x2c\x82\xaa\xa1\xb3\xef\xab\x0f\x2e\xcd\x65\x21\x69\x3c\x04\x50\x18\x2d\x2e\x95\x43\xec\x77\xe6\xf1\x18\x2c\x26\xee\xfb\xd6\x20\xc2\xfa\x14\x37\xd4\x14\xc8\x54\x45\x85\x1e\x00\x5d\x18\xbf\x8d\x74\xfd\x95\x7c\x0c\xb5\x4a\xe1\xda\x00\xaf\xf2\xf6\x70\xdb\xd2\x97\x67\xb0\xcb\x03\xf0\x32\x64\x76\xa4\x58\xcb\x28\x8b\x8c\xa1\xad\xd1\x10\x92\x09\x43\xdd\x7f\xda\xaa\x64\xef\x21\xd8\xf7\xee\xa2\x8b\xc5\xd6\x26\x56\x6d\x20\x30\xd0\xba\x7a\xa1\x45\xbc\x4e\x92\x91\xe0\xa2\x71\xa7\x30\xf5\x82\x51\x1e\xe0\x33\x68\xf7\x22\x98\xc2\x81\xda\x96\xd7\xbe\xf0\xc4\x87\x70\x05\x00\x23\xab\x64\x0a\x5a\xbe\x95\xca\x86\xbe\x7c\x5e\x03\xa7\xa7\x58\x63\x07\x62\x49\xf4\xd4\x8b\x37\xf4\x7e\x85\xf1\xa6\xb4\x0b\x76\x8f\x6d\x3e\x5f\xf8\x9c\xef\x1f\x17\xa9\xa1\x2e\xc1\xf8\xf7\x47\x1e\xff\x67\xbc\xf7\xc5\x9a\xfb\xfe\x19\x63\xe1\x74\xff\x54\x9d\x0f\xb7\xfa\x05\x4b\xd8\x3f\xf8\x93\xae\xbf\x24\x7e\xfe\x27\xd5\x42\xe6\xfe\xf9\x36\x70\xd8\x6d\x08\x7d\xd1\xb1\x62\x3f\xff\x24\x09\x65\x1d\xf6\x9a\xe4\xc2\xbb\xc6\xc2\xa2\x4b\x20\x50\xc2\xcb\x43\x1d\x39\x57\xa3\xf1\x9d\x1a\x33\xc0\x25\xea\xb5\x9e\xe3\x93\x07\x75\x97\x93\x49\x4f\x79\x0e\x37\x6f\xa2\x44\x2c\x3a\x1d\x9f\xe1\x5e\xbf\x48\xcb\x44\xbb\x76\x81\x04\x1d\x0b\x71\x37\xa5\xa5\x3b\xac\xe9\xe6\x74\x2b\x24\xfc\x82\x96\x20\xd1\x85\xc3\xed\xa1\x6c\x33\x8f\xa1\x89\xb0\x1c\x62\xac\x5a\xfa\xda\x85\x28\xc2\x85\xd4\x52\x8a\x06\x9b\x2b\xdd\x52\xc2\x01\x16\xc1\xf1\x37\xb9\x5e\xc2\xcd\xf9\x47\x9f\x04\xad\xce\x68\xa0\x2b\x1c\xc8\x25\x95\x54\xb4\x1e\x5f\x27\x47\x74\xb7\x13\x71\x92\x23\x9a\xcd\x15\x3e\x90\x54\xe0\x31\xea\x43\x7c\x02\xe1\xba\x2b\xb2\xf7\xad\x1d\x2b\x10\x8b\xc2\xda\x22\xec\x82\x93\x0b\x22\xa1\xfc\x61\xf1\x00\xf8\x75\x3f\xdc\x97\x85\xd1\x71\xea\xd2\x1f\x10\xe2\xd2\xb9\xa7\xe5\x4f\x07\x2e\xc1\xf9\xb0\xb8\x5f\xc2\xa5\xd8\x3d\xa1\xeb\x55\x70\x1d\x05\x04\x96\x77\x3b\x23\x7a\x3d\xf9\x53\xf9\xb2\x3e\xaf\xf4\xea\x62\xee\x3c\x7e\x55\x9d\x8f\x7e\xbe\x98\xc7\xb2\x01\xb1\x51\xfa\xfc\x4e\xc1\x74\xf4\x70\x7f\xab\x02\x88\x29\x01\x59\xbb\x54\x36\xb0\xbb\x5d\xdb\xee\x5b\x3f\x41\xfa\x1a\x6b\x6e\xef\xb5\x25\xb4\x46\x94\x6a\xd9\x48\x62\x4b\x62\x90\xd1\x13\xb5\x26\x7e\x40\x92\x4b\xd9\x5e\xae\x46\xa4\xf5\x72\xbe\x27\x71\x9b\x91\x4e\x91\xcf\x8d\x28\x05\x53\x0d\x0e\xc2\xeb\xc9\xdf\xb3\x9c\xab\x74\x17\xc4\xc1\x77\x1e\xea\xa1\x1f\xa1\xac\x43\x3c\x3b\x25\xe8\x69\xa8\xe8\x01\x42\xe0\x94\x9d\xdd\xa5\x2e\xa5\x5c\x50\x9e\x61\x33\x5d\x6c\xea\x5c\xbb\x32\xca\xb7\x69\x1a\xa0\x06\x29\xf4\xcb\x15\x4e\xc8\x96\x22\x53\xbf\x2f\x5a\xe8\x6a\xa5\xd3\x90\xaa\x34\xc3\x7c\xf6\x71\x1f\xce\x3c\x1f\xff\xb6\x39\x06\x54\xb7\x25\xd6\xd6\x37\x45\xd9\xd8\x3e\x65\x01\x80\xf6\xd7\xe5\x94\x6b\xc6\x7a\x90\x5e\x59\x94\x73\x3b\x49\xcd\x03\xf7\x11\x90\x0e\x5a\xe3\x8e\x6b\xb1\x3c\xcb\xe9\xf0\xb8\x8d\x42\x24\x61\xfe\x52\xd6\x09\x49\x05\xc5\xc0\x76\xf0\x77\x1d\x2d\x3b\xdf\xee\x28\x34\xb6\x20\x3a\x76\xd0\x77\x38\x63\xdd\xd4\xa3\x2e\x7f\xc2\x76\x63\x1f\xae\xf8\x4b\x87\xf3\x9d\x88\xf9\x87\xe2\x82\xfa\x34\x98\x04\xdf\xae\x69\xe8\x1b\xe9\x0e\xc2\x46\xb8\xde\x43\x3f\xa1\x1a\x67\x63\x32\x17\x26\xe4\x96\xed\xda\x54\x68\xd5\xfe\x10\x36\xb6\xf0\x29\x57\x61\x36\xdd\x84\xe1\x47\xf1\x24\x4b\xe2\x3c\x35\x57\xbd\xc7\x07\x58\x08\xbd\xa4\xe9\x40\x21\x90\xc1\x17\x2c\xf8\xa6\xf4\xbf\xb3\x1e\xe9\x6c\x23\x88\x2d\xd8\x5f\xa4\x68\x0c\x47\x62\xf5\xac\xec\xf1\x15\xae\x23\xb5\x6e\x9c\x91\xc1\x3f\xd3\x79\x6d\x60\x16\x84\x7d\xb1\x5c\x5a\xf6\x2c\x50\x97\x05\x14\x69\xf0\xb5\x40\xbe\x07\xa5\xa0\xd0\x28\x0f\x45\x05\x8f\x7d\xe1\x54\xe2\x04\x36\xdb\x6a\xa6\x2a\x87\xb0\xc6\xaf\x1a\x20\x57\xe8\x21\xa4\xf3\x2f\xfc\x88\xe7\x50\x3f\xf8\xa3\xbe\xfa\xde\x42\x12\x5a\x8e\xd4\x2d\xe5\x37\xdc\x61\x95\xf7\x00\xca\x8e\xfe\x29\x76\xbb\xf0\xa7\x06\x28\x8a\x7b\x96\xfd\x45\x15\x67\xac\xfe\xc0\xb6\x50\xbb\xab\x42\x02\x72\x2f\x0f\xa6\x50\x90\xb0\x2c\xbe\xf2\x2f\x76\x47\x69\xf8\x91\x3f\x2d\x7f\xe8\xad\x02\x3b\x2d\x72\x58\x15\x29\xf8\xe7\xc2\x7b\x67\xc3\xe4\xd9\xc7\x72\x10\x12\x49\x2f\x07\x82\x8d\xbd\xbf\x4d\x92\x29\x0d\x80\x99\x16\x96\xd7\xa4\x4d\x10\x7e\x46\x8c\x3a\x8f\xa0\x47\xc4\x59\xb8\xc5\xe8\xe7\x9c\x66\x5e\xc5\x4f\xb7\x60\xba\x57\x3b\x62\xed\x1e\xae\x95\x76\x03\x5b\x51\x71\x34\x24\x0f\x74\xbc\xd4\x4a\xe1\x53\xac\x8f\x1a\xa3\x90\xb0\x01\xe2\xe9\xfa\x01\x63\xf5\x3d\xf1\x50\xc7\xa9\x38\xb0\x29\xcf\xc6\x16\x0c\x92\xe2\x31\x32\x90\x8e\xa1\x16\x3b\x6f\x4d\x84\x9d\xad\xe9\xff\x73\xf5\x6e\x59\xb2\xea\x3e\x13\xe7\x7b\x0f\xa3\x5e\x6a\x54\xfd\x60\xc0\x09\xae\x04\xcc\x9f\x4b\xe5\xce\x5a\xab\xe7\xde\x0a\x45\xc8\xe4\xf9\xea\x9c\xbd\x90\x49\xee\x17\x63\xcb\xd2\x2f\x5a\x7a\xfe\xaf\xa7\xf8\xab\x40\x30\x96\xa8\x00\x68\x84\x47\x70\x21\x44\x0a\xc3\xcb\x04\x9f\xcd\x5c\x1a\x4a\xc0\x95\x71\x94\xbe\xef\xe8\x11\x5a\xad\x59\x03\x7b\x48\x32\x9c\x92\x19\x0b\xf7\x97\x40\x0c\x3b\xe3\xf6\xf6\x2c\xfd\xa5\x38\xcc\x2d\x58\x0a\xd2\x97\x95\xed\x22\x7f\x1f\x18\x02\x7c\xb2\x74\x02\x76\x81\xe4\xae\x34\xdb\xa5\x47\xa5\x4b\x2c\x1d\xd2\x4b\x8b\xdd\x8a\xe0\x3b\x84\x57\x52\x83\x6d\xa2\xff\x20\x41\x61\xeb\x8b\x68\xab\x18\xd1\x0e\xac\x02\x18\x6e\x11\x0a\xea\x41\x2a\x5c\x44\xa9\x15\x0d\xa8\xf0\x1b\x64\x65\x8f\x4a\xe4\x35\x99\x28\x90\x15\x30\x08\x78\x05\x76\x22\x07\x02\x0a\x1f\x5a\xc6\x8f\x2b\x90\x3d\x3b\xc8\xb0\x63\xde\x83\x4b\x86\xb4\xf3\x35\x7e\xca\x8a\x13\xb4\x57\x72\x0f\x51\x64\xd7\x67\xd6\x5c\x0c\x5c\x87\x59\x90\x2e\x9f\xa8\xb8\x8c\x0a\x21\x85\x56\x72\x88\x26\xbf\x28\x9e\x1d\x1f\x99\x1d\xd0\x6c\xce\x09\x95\xdf\x3d\xfd\x64\xe9\x7d\x27\xb9\x5f\x9c\x28\xac\x0d\xd8\x71\x49\xfc\x78\xb4\x9e\x52\xa6\xa5\x6d\x0d\x6a\x42\xa2\x92\x63\xa3\xcd\x07\x9f\x3c\xc4\xee\x2b\x00\x08\x84\x2b\x38\xe6\x00\xb9\x65\x92\xd9\x7d\x7b\x5d\xb2\xbd\xc7\x25\xcd\xa1\x7b\x7c\xe8\x21\xda\x04\x49\xb3\xc6\x0d\x32\x56\x68\xfd\x57\x22\x79\x61\xab\x7f\xbb\xb4\x83\x0d\x6f\xbe\x82\x1b\x1c\x5e\x50\x90\x97\xd7\xb0\x00\x57\x88\x0f\xd7\x5f\xc4\x1b\x64\xda\xf8\xe0\x47\x52\xb6\x8b\x23\xef\xc1\x34\xd8\x4b\x66\x1a\xbf\x87\x9e\x0d\xb4\x9a\x10\x72\x23\x16\x68\x3b\x9f\x9c\x00\x2f\x44\x06\x8c\x4b\x20\xb3\x1e\xb5\xe7\xfb\x1d\xf8\x81\xdf\x26\x30\xbe\xe1\x7d\x6c\xc2\xc6\x91\xe0\x0f\x16\x1f\xe9\x1c\xe0\x11\x30\x02\x83\x04\x82\x40\x0a\xb4\xfc\x7e\x85\x70\x62\xaa\xa6\x9e\x4c\x6e\x13\xbc\x28\x5e\x93\xba\x7d\x7c\xf0\xad\x01\x28\x74\x06\xb8\x02\x4a\x3e\xaf\xf5\x41\x72\x81\xbd\x2a\xbc\xca\x08\x0c\x29\x54\x4d\x76\x91\xe3\x5b\xb6\xd3\x66\xcc\x55\xbf\x40\xf2\xf1\x4b\xf0\x81\x80\x0e\x08\xdf\x30\x7b\xe8\x4e\x30\x07\x44\x7c\x03\x47\x80\xd1\xf6\x2a\x71\xfc\x2a\x0a\xe8\x8f\x86\x9d\xd3\x25\x74\x41\xd2\x38\x16\x35\x90\xdb\x79\xcc\x29\xe8\xe4\x5b\x39\xe3\xdd\xdf\xca\x1d\x99\x00\xe0\xc0\x3b\xac\x10\x21\xdc\x90\xb9\x63\xed\x05\x9e\x4a\xd1\x00\x10\x0c\xd1\x0a\xc6\xf1\x1d\xe9\xf4\x05\x78\x24\x6d\x20\x87\x72\x35\xd2\x4d\x3f\x3a\xe4\x4c\x3f\x8d\xcf\xb4\xf5\x27\x0f\xc4\x6c\xfa\xa1\x20\x87\x98\x18\x44\xd7\x55\xde\x8e\x30\x3b\x32\x0c\x24\x0a\xb3\xc1\xbb\x54\xdd\xc7\x6f\x55\xda\x7b\xe7\x94\x12\xcb\x2c\x1c\xd3\x59\xa8\x87\x6d\xad\x05\x56\x9a\x9e\x6e\x73\x4b\x73\x6c\x2e\xe2\x85\xd6\xe1\x9b\xa5\x2d\x47\xb2\x3c\x39\x79\xf1\x0d\xd8\xa0\xc7\xee\xd3\x35\x7c\x37\x4e\x41\xe0\x94\xc8\xa6\x2d\x2f\x08\xf3\x24\x21\x21\x0b\x82\x30\x04\xbb\xc9\xea\x99\x3e\x2f\xa2\xbc\x42\xb0\x19\x6d\x38\x37\xe3\xeb\xbd\x39\xaf\x85\x57\x48\x3c\x04\x80\x9d\x2f\x1f\x2e\xda\xf4\x89\xf4\x1e\x41\x96\xc5\xf8\x32\x28\x33\xeb\x55\x42\xe3\xe1\x5b\x56\x62\x48\xc3\x96\xe6\x93\x6a\x90\x1b\x50\xef\x52\x77\x8e\x08\x3c\xb3\x44\x3c\xda\xee\x6e\x9e\x83\x0c\x66\xb6\xac\x60\x4f\xed\x53\x88\xd2\xa0\xd8\x49\x4f\x1e\xb2\x7b\xe0\x1d\x07\x2f\x10\xc9\xe3\xba\xcc\x33\x9d\x0d\xd6\x0b\x39\xbc\xe5\x6d\x06\xaa\xc0\xf8\x5c\x50\x86\x59\xf4\x00\xe8\x3c\xd0\x6b\x0e\xb2\xd7\x1e\x14\x83\xe4\x29\x29\xf8\x24\x89\x8e\x05\xd3\x27\xd1\x9d\xfa\xcc\x7e\xab\xb5\x52\x70\xf9\x3f\x4a\xcb\x21\xb4\x6c\xaf\xa2\x42\xcf\xeb\x4c\x79\x27\xb2\x0a\xdc\x0f\xef\x4b\x71\xb9\x51\x54\x87\xe1\x7d\x1c\xf9\xa2\x59\x43\x3d\xea\x96\x5a\xbf\x4b\xab\x0f\x1f\x06\xa1\x80\x36\xd2\x14\x23\xcc\x7a\x7d\x57\x42\x01\xec\x00\xa6\x9b\x54\xb3\xda\x75\xe1\xcb\xb2\x5e\x3e\xb6\x6e\xf5\xc7\x1f\xc3\x94\xd6\x8a\x51\x49\xbf\xb1\xab\x30\xf3\x2b\x3d\x31\x2b\xc9\x6f\x6b\xdd\x5f\x79\x54\xeb\xcd\x79\x05\x07\xc3\x11\x20\xe3\x4c\xbd\x65\x0c\x54\x32\xd5\x68\xad\x90\x19\xf3\x25\xd1\x79\xc0\x40\x2b\x37\xe2\xfd\x5d\x11\x03\x5c\xfd\x88\x80\x75\xb3\x19\x1d\x62\x6f\xc5\xc5\x89\xbd\x04\x5c\xaa\x7f\xae\x82\x12\x99\x9d\x9b\x9a\xf3\x4b\x9a\x1f\x6b\x76\xce\x05\x15\xa5\xf3\x78\x87\x2e\x22\x53\xd5\xb3\x60\xad\x51\xbf\x73\x46\x04\x72\xac\x11\xe1\x6d\x8d\x6d\x6b\x12\x2d\xb4\xbc\x49\x8c\x88\x23\x96\x57\x6f\x33\xad\x50\xcb\xa7\x3c\xb4\x18\x6d\x2b\x6b\xa6\x15\x03\x9d\x98\x7e\x1f\xef\xd5\x55\x7f\xdf\xf7\x7b\xe4\xc5\xe3\x0c\x75\x86\xe5\x96\x6a\x42\xd2\x9f\xe4\x9d\x01\xd2\x7d\x14\x5a\x07\x87\x21\xcd\x22\x59\x02\x46\xe0\x8e\x96\x6b\x3f\x13\x6f\x89\x18\x08\x92\x9f\x6e\x4f\xa4\x99\x52\x09\xbe\x5a\x36\xf7\x62\x9f\x25\x4f\x63\xbf\x82\x2a\x60\xa7\x1a\xfd\xa9\xa5\x4a\x28\x61\xe1\xcd\x05\xc4\xa0\x49\x74\x2f\xc8\x6a\x59\xc1\xd6\x7f\x84\x4a\x74\x95\x62\x35\x52\x4a\x69\x58\x73\x97\x7d\x92\x05\x8c\x9b\x95\x86\x67\xfd\x8b\x80\xe0\xec\x35\xae\xdd\x3b\xf2\x9e\xf6\x37\x8f\xbd\xfc\x0b\x19\xe7\x63\x67\x35\x66\x56\x04\x3d\x40\x39\x3a\x73\xec\x0f\x66\x0a\xaf\xdd\xe2\x79\xa0\x74\xb7\x2c\x1e\x5b\x2d\xd0\x15\xb7\xb4\x96\x0f\xbc\x01\xc2\x0a\x38\xe8\x03\x7a\x41\x28\x2c\x9b\xa9\x0c\xde\xa5\x8c\x7b\x58\x56\x63\x21\x6c\x30\xcf\x1c\x29\x5b\xb2\xe2\x61\x98\x78\x45\x51\x18\xb6\xe8\x40\x33\xb0\x57\x53\xa1\x83\xc0\xf5\xec\xb1\x4a\xae\xc2\x16\x1c\xd5\x7a\x6b\x12\x95\xae\x3b\xb5\xb1\x33\xb6\xce\x4d\x06\x57\x6e\xf1\x64\x00\x69\x62\xe7\x20\xd5\x21\x06\x37\xe4\xc5\xfb\x35\x6b\xc8\x6f\xe9\x47\x74\x9d\xdc\x4a\xfb\x4a\x87\x99\x3d\x97\x7f\x5e\xdf\x2c\x11\xab\x83\x27\x35\x2f\xe9\xd6\x3b\x43\x80\xe0\x7e\xfb\x44\x22\xc1\x98\xe9\x83\xf8\x48\x0a\x4e\x60\xc5\x5e\x7c\x5b\x48\xab\x24\x06\x57\x42\xd4\x5a\x9c\x81\xfd\x37\x9a\xc3\xd0\xb6\x0e\xd0\xc0\x6e\xcf\x50\xa6\x55\x95\x74\x0c\xb3\x01\x07\xac\x11\x39\x5c\x4f\x2d\x11\x88\x85\xbd\x6f\x72\xd7\xeb\xc7\xad\x05\xbb\x3b\x50\x09\x20\x1f\x84\xe9\x9c\x12\xf2\x1a\x56\x7a\xd8\x17\x97\xdc\xa7\xf1\x21\xf2\x04\x36\x82\xb5\x61\xd4\xb0\xb0\x52\x9a\xd8\x46\xc3\xc7\xef\x9c\x64\xc0\xf5\x70\xca\xae\xbf\x41\x88\x28\x4b\x9c\xdc\x98\xfe\xfe\x03\x4c\x38\xbc\x0b\xbe\x24\xb4\x89\x3d\xd9\xde\xc5\xad\x99\x77\x8f\xf4\xf3\xb8\x6c\xb3\x0f\x8a\x71\x2b\xf3\x65\x3d\x14\xdf\xc4\x7c\xf9\x57\x4a\xe8\x84\xe0\x1a\xb8\x64\xee\x48\x8b\xfc\x03\xeb\xca\xd6\x4b\x74\x84\x4a\x29\x34\x34\x7d\x09\x31\x00\x28\x84\xcd\x15\xe1\x35\xe7\x3a\x04\xc8\xc4\x3e\xa7\xd5\xa9\x24\x5c\x85\x5d\xea\xb9\x86\xfc\xc5\x5c\x02\x64\xa0\xc1\x02\xf7\xc4\x7a\xa2\xa9\x7e\xb7\xcf\x1d\x5b\x9d\x80\x26\xa0\xd3\xc0\x1d\x95\x87\xa4\xb7\x35\xf1\xce\xec\x5c\xa4\xd9\x34\xe7\x97\xf0\x08\x60\x9c\xc7\x69\x91\x4f\x59\xdd\x31\xe6\x04\x05\x3f\x26\xb4\x9f\x29\x7b\x9d\x05\xeb\x98\xf3\x72\x91\xa9\xa0\x8d\x8d\xe5\x50\x22\x8b\xd9\x37\x27\x7d\x46\xc8\x35\x52\x81\x09\x39\x78\x2d\x32\xac\x35\xba\x87\x2c\xf6\x71\x3c\xeb\xf6\x70\xd3\xb3\x16\xbf\x04\x4e\x40\xaf\xe6\x50\xe1\xc1\xc1\x14\x88\x48\x5a\x23\x95\x16\x42\x73\xdc\x0a\xaf\xc6\x0c\x46\x09\xb7\xdf\xd3\xf5\x39\x03\x76\xa7\x2d\x76\xd6\x06\x97\x5e\x37\xb2\xc8\x49\x2b\x78\x05\xc4\x80\x7e\x95\x27\x82\x7d\xac\x07\xe2\x24\x84\xed\x1f\x1e\x8a\xa7\x14\x4b\x9f\x90\xce\xf5\x19\xf8\x9a\xd9\xe7\x8c\xd1\x28\x4f\x7b\x98\x1c\xba\xf8\xb4\x1a\x7a\x25\x0f\xcc\x4c\xfb\xee\x9c\xee\xb9\xb2\x8b\x8d\x10\x7e\x5a\x12\x42\x83\x45\x5d\x21\x90\x06\xbf\xa9\xc9\x8d\x47\x4f\x6a\x9b\x00\xb5\x2e\x12\x5c\x7b\x4e\xfb\x75\x58\xdd\xf6\xcb\x5f\x26\x3a\x6b\x9f\xf9\xdd\x12\x0d\x9e\xf9\x45\x70\x03\xfd\xe8\x78\x3d\xb2\x00\x0e\x5c\x07\x94\x93\x2a\x0b\x31\x5f\xbe\x3f\x7b\x2b\x17\x8e\xa7\x41\x97\xd9\x61\x4b\x66\xf0\xf8\x7e\x1a\x97\xe7\xe7\xfa\xb1\x85\x2e\xb7\x86\x60\x74\xfc\xb0\x97\xf7\x03\xa8\x25\xa7\xd6\xf4\x62\x67\xeb\xa7\x9e\x21\xda\xbd\x22\x08\x96\x47\xf0\xc3\xbc\xc4\x9f\xdb\x1f\xfa\x53\x90\x65\x4a\x13\xe3\x9f\xde\x93\x32\x4b\x81\xc2\x3f\x1e\x0e\x49\x17\x35\xec\x98\x9b\x37\x4e\x11\x7e\xc6\x87\xfc\x27\xfd\xfa\xf9\xfc\xd8\x2b\x80\x61\x85\x35\x6c\xfd\xba\xe0\xae\xe7\x2f\xca\x79\xfb\xbc\x22\x66\xae\xdb\x48\xec\x83\xe0\x71\x68\x6a\x87\x24\x66\x09\xa8\x00\x34\x81\xcb\xf8\x29\x49\x1d\x73\xc4\x2c\xf0\x28\x07\x9a\x88\xb9\x6a\xf0\x87\xbd\x22\x58\x8a\x6d\xc5\xc6\x82\x90\x9a\x35\xc6\x01\xaf\xad\xa9\x70\xef\xdb\x9e\x1b\x6d\x01\x45\xb0\x5b\x45\x22\xf3\x19\xca\xeb\x27\x36\x62\x4f\x62\xdf\x48\x8d\xbb\x01\x16\x58\xd2\x66\x0e\xe5\x90\xf1\x68\xe8\x10\x12\x0d\x42\xcd\x2c\xa4\xef\x4a\xc8\x7a\x45\x62\x6e\x83\x3c\xcc\x9e\x7a\x44\xee\x43\x6c\x0e\x39\x15\xf3\x0d\x6a\xb8\x15\xf5\xca\xea\xd9\x8c\x4d\x82\x7b\xb8\x98\x28\x19\x47\x8c\xde\x79\x6a\xec\x0a\x7d\xe9\x65\xaf\xb1\x7b\x04\xb0\xcb\x00\xe9\xf9\x8c\x43\xe9\xa5\xe0\x7d\x2c\x0c\x2e\x36\xb3\xf7\x64\x1b\x1d\x07\xb1\x5b\x24\x3a\x28\xf0\xd1\xb5\xba\x55\x33\x7b\xff\xf2\xd3\x8c\xfc\xc1\xb2\xd8\x47\xf4\x92\x63\x46\x49\xe6\x68\x53\x85\xac\x00\x24\xbd\x7d\xde\x00\x20\x9c\x67\xbf\x51\x69\xf5\x51\xe2\x49\x19\xbe\xfd\x2c\xfa\x48\x07\x2a\x1d\xc2\x4e\x1e\x5e\xbb\x95\xef\xf2\x4d\x69\xef\x85\x70\x81\xf7\xb0\x5b\xdb\xeb\xa0\x0d\x21\x4d\xac\x31\x21\xd4\x04\x38\xd7\x6f\x95\xd8\xbb\x9b\x14\x8f\x60\x53\xde\x58\x33\xec\x78\xf4\x93\x67\x92\xc9\xee\x42\xee\xdb\x7a\x01\xc0\x46\x0f\x6e\x2b\x0f\x6f\x6a\x69\xc6\xee\xd2\x9f\x44\xa3\xf2\x82\x1d\x72\x6a\x8a\xe0\xcd\xe5\x6f\x66\x2f\x45\x66\x40\x99\x09\x5c\x00\x1f\x43\x59\x42\x28\xf4\x1c\x20\xf2\xfc\x8a\xd1\xfb\x4c\x84\x35\xc4\xc6\x18\x87\xed\x9c\x86\xa5\xd6\x9b\xcd\x50\x1d\x1e\xd8\xb3\x50\x04\x73\x58\xf2\x3d\xea\x33\xd5\x47\xe3\xc9\x4c\xab\xd7\xe1\x13\xbc\x0a\x1f\x5c\x06\x8d\xc0\x4e\xc5\xc9\xe0\xd2\x2a\x9f\xe7\x35\x44\xaf\xa7\xfc\x2f\x51\xf5\xc2\x0b\xaf\x97\x13\x1f\x72\xd3\x4e\x81\x2f\xc7\x3b\xb5\x66\x58\xeb\x8f\x90\x48\x0c\x5a\x48\x32\x1c\xf9\xaa\x5c\xd5\xea\x04\xce\xd2\x89\x03\x84\x33\xb2\xcb\x64\x76\xbb\x5e\xd9\x9a\xc7\x6f\xe9\xa1\x6b\x94\x00\x89\xac\x9b\x3b\x61\xa7\xac\xaf\xef\x94\xbb\xdd\xba\x39\xb4\x42\x7a\x3d\x64\xae\xfc\x23\xae\xf7\xd1\x6c\x6a\x98\xb7\xfe\xb5\xc7\xd8\xc9\x2f\x82\x20\xbb\x60\x17\x99\xbd\x87\x10\xd6\x94\x3c\xdc\x47\xf4\x06\x6f\x93\x68\x99\x6d\x7b\xcb\xa2\xc2\x5b\x14\xc6\x68\x31\xa1\xdd\x56\x34\x6d\x72\x2c\x2c\x8c\xfc\x1d\x7a\x5b\x39\x37\x88\x44\x6c\x62\x7e\xec\xf9\x29\xab\x1d\xde\xc8\x08\xe6\x09\x19\x4f\xb8\x3c\xe3\x9b\x4e\x4b\x97\x3f\x27\xb9\x41\x41\x3a\xe3\xf5\x21\xb6\x34\x5e\x2d\x6b\x79\xbc\x42\xe0\xc0\xda\xc9\x18\xab\x56\x2c\xcd\x28\x94\xb8\xc3\x23\xbe\xc3\xea\xa9\x5d\x5e\x91\x4e\x11\x96\x16\xaf\x74\x2b\xd9\x11\x49\xab\x9c\x6e\xd4\x11\x74\xc3\x4a\xe3\xf1\xd0\x86\xb2\x84\xbe\xbe\xa4\xa1\x7e\x30\xaf\x1b\xdd\x0a\x85\x1a\x33\x9a\x3c\xe6\xae\x94\x24\xdf\xbd\x49\x72\x4e\x4d\x56\x1d\x57\xad\xd3\xe2\x03\xbd\xbb\xe3\x1e\xd4\xfa\x51\xb0\x97\x11\x47\xbb\xd1\xaa\xec\x6e\x9b\xd1\xcd\x61\x68\x6b\xf1\xe2\x58\xef\xcc\x3e\xbe\x6f\x72\x2d\xf8\x34\x49\x36\x9d\xd6\x80\xfe\xa4\xae\xd1\x2a\x1d\xf8\x59\xee\x39\x33\x9c\xf4\x60\xcd\x49\xdd\xfa\x71\x96\x80\xf5\x58\xfe\x48\xce\x1d\x8b\x9e\x04\xab\x32\xfe\xa8\xb4\xbe\xb0\xc6\x82\xe1\x5f\x4d\xd7\x53\x0f\x78\x04\x7c\x56\xbb\xb4\xd4\xad\x9e\x9e\x42\x56\xdd\x2f\x76\x3a\x59\x94\x2a\x7c\x10\x33\x20\xb5\xae\x23\xb2\x6b\x34\x95\x1f\xbf\x32\x69\xc6\x28\x65\xac\xe9\xb9\xbc\xdc\x05\x84\x06\xe7\xc8\x0f\x18\x93\xd5\x95\x8a\xdc\x1a\x13\xf5\x99\xec\x4b\xa5\x86\x32\xac\x16\x36\xf8\x00\x7f\x86\x34\x89\xa5\xb4\x20\x88\xc7\x35\x0c\x3e\xe9\x05\x8b\xb0\x0a\x0a\xd9\x86\x54\xa3\x80\x20\x7b\x27\x7a\xc0\xde\x74\xdb\xa3\xf5\xa4\x20\x3b\x59\xe2\x67\xc3\x44\xa6\x95\x96\xb0\x6a\x77\x56\x94\xd3\x03\x12\x8c\x4a\x54\x79\x20\xaf\x87\x6c\x03\xef\x91\x17\x11\x22\x76\x56\x54\x4e\x95\x60\x0e\x5b\xa8\xb4\x93\x04\x60\xa5\x2e\x0d\xb2\x28\x36\x6f\x75\x6e\x93\xa1\x83\x34\x0a\x5e\x71\xfe\x10\x5a\xb2\x8f\x4a\xe4\x3f\xd4\xdb\x51\x29\x34\x53\xfb\x02\x51\x8f\x60\x8a\xf9\xe2\xe4\x56\xc3\x36\xbb\xb5\xfc\xcd\x8e\xc4\xd0\x07\x12\x6d\xa2\x85\x63\x05\xb9\x4c\x60\xf9\xa4\x08\xce\xfa\x98\x1b\x53\xdb\xcc\x44\x49\x33\x6b\x35\xf0\x2b\xf0\x28\xff\xd4\xbf\x01\x8f\x42\x70\x0d\x6b\x16\x30\x10\x02\xf8\x89\x10\xc0\x23\x8a\x22\xed\x77\x69\x0e\x00\x87\x7f\xee\xba\x24\x96\xc5\x7a\xf7\x2b\x1e\x91\x39\xf0\x80\x97\xd7\xa3\xab\x1e\xec\xe0\xa0\xa9\x22\x14\x04\x95\xdf\xc9\x79\x68\x8c\x05\xb3\x1c\x3c\xe7\x66\x19\x89\x94\xf8\x6d\x90\xa1\x07\x69\x02\x0f\xeb\xa1\x78\x5d\x04\xe3\x4b\xc0\x0a\xfe\x10\x6a\x44\x8f\xb4\x3f\xc5\xa9\xa0\xbb\x04\x7d\x14\xb5\x20\x1c\x52\x61\x67\xba\x06\xa7\xe2\x96\xa7\x36\x5b\xc3\x57\x5c\x87\x2b\x58\xfb\x99\x17\xc6\x89\x12\xe8\x69\x93\x60\x43\xc0\x84\xb0\x11\x01\x96\x10\x06\x22\xe4\x65\x1a\x5e\x42\x78\x05\x07\x4d\x90\x4b\x70\x2b\xcb\x7b\xc9\x9a\x0a\x5a\x18\x96\x1b\xe9\xd8\x9a\xc3\x31\xff\x7a\x0e\xbb\xd0\x03\xbf\xcc\xa3\xe5\x0f\x1e\xe0\xeb\x6c\x09\x08\x7a\x73\x7a\xc7\x1e\xe5\x63\x41\xaa\xf9\x90\x64\x7f\x89\xfb\xa0\x41\x5c\x28\xd1\x89\x4c\x41\xfa\x23\x46\x28\xa3\xd1\x6d\x6d\x7a\x8f\x71\xcb\x5b\xf5\xfe\x16\x0e\x57\x7b\x75\x06\x44\x98\xf6\xac\x91\x97\xb1\x1e\x97\xe6\x4d\x49\x79\xbe\x19\xb1\x96\x0f\xcd\xe5\x47\x81\xc7\xb5\xa2\x52\x0f\xdb\x5a\x51\x50\x6a\xe6\x0a\x89\x84\x6e\x87\x66\x90\x1f\x01\x69\x78\xb9\xfd\xf2\xb2\x78\x8f\x24\x2b\xf5\x96\xe6\x1a\x10\xb6\xbc\x04\x15\xc3\x3a\x6d\x88\x50\x13\x03\x22\xed\x2d\xdc\x96\x25\xca\xac\xc6\x3a\x48\x1b\xe6\x6f\xe2\x43\x68\xcb\x0d\xcf\x11\x14\x10\x07\x44\xc4\x8f\x2e\x68\xad\x5b\x12\x09\x37\xb9\xe8\x3a\xda\x97\x45\xc1\x82\xc0\x46\x44\xf3\x3f\x87\xa0\x58\xce\x3e\x9a\x07\x65\x5c\xbf\xc4\x43\x21\x56\xfc\x60\xc1\xc9\x00\xb9\xff\x93\x0a\xbe\x0b\xaa\xc7\x15\x00\x56\x47\x92\xfe\x88\x0e\x7e\xd3\x08\xef\x44\x96\x6f\x6a\x78\x67\x65\xcf\xbf\xd4\x04\x1a\x7e\xbd\xa1\x39\x5c\xbf\x99\x28\x0a\x6b\xc5\x13\x1d\x70\xcd\xbd\x66\x35\x64\xcf\x10\x28\x36\x47\x4e\x84\x1c\x3d\x1b\xdf\x03\x92\xcc\xd3\xd5\x7f\x09\x35\x21\xd5\xee\xfa\x3a\x82\x0b\x60\xbd\xbd\x5d\x42\x70\xb0\xf1\xe5\x65\xf2\x7f\xc4\x0f\x0e\x9e\x30\xf8\x25\xc4\x44\x89\x03\xf9\x04\xee\x5a\xc1\xb3\x56\xf9\xad\x1f\xaa\x64\x27\x90\xa1\x40\xe0\x43\xd5\xf6\x15\xf0\x31\x94\xdf\x6b\x0e\x98\xc3\x6f\x69\x23\x8f\x0d\x58\xd1\x94\xdd\x4f\x02\x07\xbe\x1a\x97\x22\x68\x12\x47\x43\x83\x40\x68\xbe\x49\x19\xa0\x80\x2e\x91\xe4\xea\xbd\xd0\xc4\xd5\x91\x53\x50\x6e\xb5\xfb\x72\x58\x0b\xdb\xbe\x36\xb3\xb6\x72\x8b\x26\xa1\x80\xfe\x56\x5b\x10\x35\x68\x04\xf2\x01\x72\x91\x43\x7d\xcd\x0a\x8e\xfb\x69\x4b\xf6\xd6\x90\x3f\xf2\x57\x23\x5e\x58\x87\x36\x16\x64\x4b\x90\x85\xb5\x21\x2e\x22\xf9\xdc\x85\xe8\xaf\x33\x0e\xe0\x83\x56\x68\x05\x90\x95\x56\x51\x38\x6e\xb1\x78\x6b\xb4\xeb\x8a\x7b\xf3\x9d\x07\x07\x16\xec\xc1\x91\x16\x6b\x07\x6e\xd3\x9e\xc6\x85\xbf\xb8\x54\x3d\xaf\x1f\x55\xf4\x24\x4f\x2f\x49\xfa\xdf\x24\x19\x06\x09\xc5\xb3\x62\x2c\x8d\x9a\x91\x1a\x96\x0f\x6c\x8c\x5e\x6f\x13\x45\xea\xb9\xd1\xed\x56\xc2\x07\xfd\x95\x46\xbd\xda\x1d\xcc\x41\x69\x0e\x0c\xc6\x5d\x4e\x5a\x1a\x8e\xd8\x2f\x21\x34\x78\x18\x0d\x45\x42\xd5\x44\x0a\xd8\x87\x62\x3d\x78\x1d\x7e\x41\xb3\x13\xcd\xe8\x6a\x1c\xfe\x1b\xc1\x30\x64\x67\x5a\xd1\x8a\x4f\x3a\x84\xed\x3b\x47\xac\xdd\x42\xf7\xd1\xc3\x76\xad\x7b\xe9\xd4\x43\xea\xbe\x8f\xac\xcf\x01\xc3\xda\x71\x34\x83\xbb\x31\x55\x70\xfc\xc2\x7e\xf5\x1f\xbc\x8e\xa5\xe1\x41\xa8\x7b\xdf\x16\x05\xa7\x83\x5b\xf3\x8e\xbc\x86\x68\x86\xfc\xe1\xc0\x07\xc3\x63\xbb\xfd\x89\x43\xee\x2e\xbf\xff\xfc\xad\xb3\xcb\x55\x78\xd0\xd6\xcb\x29\xa2\x76\xbc\x62\xec\x10\xd9\x75\xfe\xbe\x27\x60\x99\x75\xc3\xd3\x8e\x4c\x26\x1f\x81\x19\x90\xc3\x7e\xd2\x20\xd9\xc6\xda\x1a\x99\x53\x6b\x28\x22\xa3\x9d\xf1\x14\x94\xdf\xf7\xcb\xe0\xda\xaa\x4e\x00\x78\x9f\xf5\x1f\xd9\x18\xc8\x26\x1f\x42\x64\xff\xac\x1e\x1b\x6d\x86\x90\x32\xfd\x25\xaa\x87\x07\xbb\x7d\xd3\xde\x7f\xa3\x9b\xd0\x7f\x40\xcc\xcc\x7e\xb0\x73\xd7\x83\xfb\xbf\x77\x84\xaa\xf7\x56\xc3\x55\xba\xd2\xfa\xdd\x61\x8a\x32\xfb\x82\x56\x51\x15\xc2\xe3\x52\x52\xb0\x99\xae\x81\x00\x85\x7e\xc8\x99\xf3\x67\xab\x01\xb8\x56\x8b\x57\xea\x71\xd7\xc9\xf3\x28\x1d\x67\xe4\xd7\x12\xb8\x0f\x88\x7f\x29\xb9\xdf\x43\xe0\x35\x9b\x39\x56\x50\xf5\xcf\x6c\xe4\x63\xf0\xc5\x73\xf4\xa1\xe8\xf5\x0e\x43\x8b\xbb\x8a\x1f\x57\x08\x8d\x6f\x0f\x65\xd9\x69\xf5\xcf\x18\xd2\xef\x2b\x1a\xbb\x62\x7f\x38\x36\x64\x4b\xa2\x76\xe0\xad\x01\xed\x58\x05\x4e\x3c\x7d\xee\x5b\x52\xff\x82\x4f\x30\x18\xf7\x5b\x05\xc7\x04\xaa\x80\x5b\x2e\x8b\x43\xc0\x3d\x52\x12\x8e\xcd\x99\x1d\x5a\x1b\x19\x16\x83\x0e\x60\xbb\xef\x08\x41\x24\x5c\x04\x20\x12\x3d\xa9\x31\xa3\x78\x5d\x18\x8b\x9e\x5e\x3b\xca\x9d\x84\x72\xfa\x84\xb1\x54\xb0\x56\x65\x78\x38\xf6\x5a\x37\x29\xf6\x5b\x25\xb8\xdd\xe4\x90\x70\x46\x9a\xf9\xe4\xc4\x23\xb1\xb5\x28\xfd\x4e\xb4\x95\xfe\xd2\x50\x22\xf5\x83\x92\xd2\x0b\x64\x45\x25\xca\x33\xb6\xa8\xe9\xc2\x84\xde\x46\x28\x41\xbe\x47\x6a\x6c\x11\x07\x8d\xf4\xc1\x20\xb9\x2b\x5a\x67\x8d\x30\x7e\x2b\x60\x35\x4e\x0a\x19\x50\x79\x70\x67\xd6\x26\x89\xf3\x87\x29\xd0\x0d\xc2\x76\xe5\xe1\x36\xbb\x2b\x71\x49\x97\x6f\x6d\x77\x6e\xb2\xc4\xb2\xef\x5d\xba\x40\xa0\x7e\x99\x3f\x74\x7d\x9c\x31\xb2\x77\x42\x5f\x34\xe0\x48\x9c\x51\x03\x90\x68\x55\x35\x6c\xfa\x40\x10\xf4\xd5\xba\xed\x97\x8e\x3a\x46\x35\xfb\xaa\x07\xbc\x0e\x08\x47\x1b\xe2\x4a\xdb\xa1\x37\xf5\x0d\x94\x98\x64\x02\x4b\xef\xd2\x7c\x9d\xf1\xfa\x59\xc7\xe8\x6c\xdc\x12\x8c\x43\xe7\xf4\x60\xe1\x50\x9e\x89\x99\xa5\x8d\x8a\x22\x1c\xac\xad\x1a\x72\x96\x3d\x08\xd4\x9c\xee\xa3\x70\x0a\xf0\xb3\xf1\x61\x05\xa1\x2f\x06\x66\xfb\x39\x02\x49\xfb\x72\x47\xd6\x58\xe5\xbc\x5a\x9d\xb7\xd3\xf4\x58\xd6\x7e\xf2\xc4\x25\x5a\x74\x0a\x7a\x8e\x28\x0d\xcf\x1f\xf7\xc3\x04\xf0\x74\xf5\x71\x1b\xba\x18\x6d\x46\xb1\xab\x4c\x86\x49\xf5\x38\x14\x9e\xfc\x34\xa7\xe5\x4d\x0f\x4b\x8f\xe0\x18\x9e\xf2\x54\x90\x06\xe2\xcf\xed\x94\x33\xbd\x29\x6e\xf1\x3a\x4d\xb9\x9f\xd6\x37\xd7\x49\xd7\xaf\x77\xa8\xc8\x23\x99\x92\x57\xca\x08\xe3\x38\xf7\x7c\x69\xdf\xa8\xa2\x45\x5c\xb1\x0f\x81\x78\x29\x5b\xe0\x3e\x26\x88\x2e\x0e\xb4\x06\x22\x28\x81\x46\xc9\x7f\x82\xa4\x5c\xb3\xf0\x45\x79\x97\xb7\x95\x8b\xcc\x47\x61\xd5\x66\xad\xcc\x6b\xa6\x37\x06\x36\xb7\x95\x1d\xad\xc3\x3d\xc0\x07\x28\x6f\x82\xdb\x3d\x7b\xd4\xbd\xe4\xfc\xf1\x01\x16\xb0\xe4\x04\x76\x53\xf7\x24\x11\x2f\x93\x28\x77\x31\xd0\xa6\x88\xa7\x19\x53\xb8\x26\x61\xab\xbe\xb7\xcf\x52\xf2\x51\x77\xb3\x5c\xcb\x94\x7b\x21\x64\x45\xb6\xdd\xc9\x3a\x66\x31\x5d\x76\xa4\xfe\x7f\x87\xbd\x86\xb9\x5d\x22\xc5\xa4\xbb\x9e\x72\xb3\x1d\xc7\x76\xba\xaf\xb9\x87\x40\x95\xde\xb8\x90\x29\xee\x7d\x9c\x99\xc6\xe0\xa4\x24\x6d\x15\x5f\xfe\x3b\xfc\xac\x4f\xcb\x31\x91\xd4\x8b\xd8\x63\xd6\xf5\x69\xd6\x78\x9d\x5b\x3b\x0d\xd4\x0c\xc1\x8e\x99\x3d\xc7\xa0\xea\x6a\x15\x2e\x61\xef\x5d\xeb\x72\xda\xa5\x4d\xbf\x71\x35\x7b\xf8\x78\x89\x93\x4a\x62\xe2\x76\xef\x8d\xa3\x20\xb0\x5f\x89\xaa\xf8\xd7\x1f\xa3\xb0\xbb\xeb\xcd\x0f\x2f\xa9\x17\x45\x9c\x96\x43\x20\x1b\xe0\x5b\xe6\xe0\xc6\x20\x2d\x46\x53\x6e\xa3\x6a\x5b\x6b\x09\x8e\x0b\xdc\x3f\xf5\x25\x7b\x98\xb5\x5a\x7c\x7a\xbb\x6b\x9e\xa7\xc8\xd4\xec\x02\x4a\x72\xf5\xef\x27\xa7\xd1\x1f\xe9\x38\xd6\x46\x99\xd7\x6e\xaf\xaf\xae\x45\x2f\x81\x0b\x43\x42\xde\xa1\x12\x21\x1c\x7b\x5d\x66\x19\xfc\x88\x76\x08\x3f\x1a\xc4\xa5\xb1\x13\x78\xc8\x0b\x02\xbf\xff\x18\xd9\x5b\xee\x13\x56\xe4\xb3\x78\x31\xf3\xfb\x2f\x07\x3e\xe6\x79\x6d\xf1\xcb\x40\x92\x87\x3d\x96\xaf\x8b\x80\xe0\xce\x47\x80\x64\x44\xa0\x08\x58\x32\x43\x33\xb5\xc3\x80\xf2\x81\x2a\xf3\x16\xc6\xaf\xab\x7f\x7c\xf4\x80\x8b\x09\xdc\x8a\x9b\x6d\x6e\x5c\x8c\x7a\x52\x6a\xbd\xab\xcd\x89\x6e\xe6\xe1\xbb\x46\x20\x15\xa9\x0b\x5d\xc3\xcc\x3c\x11\x2d\xff\xa0\x3d\x16\x32\x3d\xec\xf3\x77\x04\x5c\x66\x46\xef\xa3\xf0\xfa\x59\xa5\xce\xb3\x75\x30\x2f\x67\xa5\x3d\xe6\xe9\x19\xec\x66\xe8\x66\x29\x28\x01\x61\x61\xa7\xc4\x07\x1d\x1f\x23\xa2\x0c\x1d\xaa\xdd\x2c\x91\x61\xe8\x97\x08\x62\x32\x23\x82\xb3\x04\x0d\xc6\xea\xc8\x53\x49\xc4\x5c\x2e\x0d\xed\x37\xb0\xe2\x5d\x3a\xe4\xcb\xf9\x30\x88\x6f\x78\xd2\x54\x1e\x99\x59\x7d\x7a\x13\x4e\x02\x6e\x0c\xf9\xf9\x30\x7b\x26\xbf\x74\xe0\x83\xf4\x34\xe8\x31\xe6\x49\xfd\x97\x46\xd2\x15\x09\x83\x59\x87\xa4\xfe\x73\xe6\x4a\xb0\xec\xbb\xc2\x9b\xe9\x99\xeb\x1d\x52\xba\x79\x09\xac\x5d\x27\x35\x43\x38\xad\x34\xcf\xda\x10\x47\x90\x62\xc8\xb7\xb1\x2e\x86\x7e\x9b\x35\x88\x0c\xab\xfe\x4f\x46\x40\x64\xe6\x86\xb3\x01\x5d\xba\xc1\x67\x46\x51\x81\xf2\xa3\xc9\x7a\x77\x19\x51\x32\xbf\xf2\xfe\x77\x9e\x2f\x22\x6b\xfe\xcb\x64\x80\x9b\x4d\xa7\x4b\x97\xd1\x6d\xd7\x13\x04\x9b\x97\xcf\xac\x02\xb6\x05\x6d\x8f\x91\x77\xb3\x7f\xea\xb5\xc5\xf8\xd7\x19\x07\x9e\xae\x33\x8e\x3c\xde\xd4\x74\x09\xdd\x49\xeb\x8b\x48\x9b\x39\x2b\x68\x8d\x05\xc6\xb6\xb6\x22\x37\x91\x90\x12\xda\x69\x5d\x8c\x6d\x38\xbd\x86\xa5\xc6\x11\x85\x8b\x86\x09\x96\x66\xad\xa9\xd7\x1e\x24\xc4\xdc\x85\x38\x60\x17\x84\x64\x33\xa2\x6e\x48\x91\x06\x43\x8b\x47\xb3\x46\xfa\x56\x97\x16\x39\x2d\x21\x0b\xae\x63\x9d\x67\x8a\x7b\x71\x2d\xff\xb6\x74\x69\xda\x93\x76\x26\x39\x49\x07\xe5\x68\xcb\x2e\x7e\x40\x9d\x4b\x14\xda\xb1\x22\xd4\x29\xee\x5d\xea\xde\x07\xb1\x56\x66\xa1\x21\xa6\xad\x74\x42\x5c\xd9\x6d\xfe\xf5\x49\xfe\xe3\x84\x7d\xfc\x04\xa1\x36\x06\xd2\x3b\x19\xe4\x1a\x97\xc8\x06\xf8\x12\x05\x87\x63\xd7\x32\x65\xd5\x93\x91\xe6\x22\xe2\x30\xb4\x2d\x29\xc9\x02\x29\xa5\x4a\xbe\x81\x19\x52\x95\x18\xc5\x72\x30\x08\x6a\x11\xe9\xe5\x79\xf1\x00\x66\xc2\xcf\x22\x44\x0c\x7d\x6b\xfb\x35\x32\x89\x32\x61\x90\x28\x62\xca\x71\xab\xfc\x0c\x5c\xbe\xa1\xd2\x7a\xf8\x44\x8d\x3e\x24\x45\x24\xe2\x6a\xa0\x04\xf0\xcf\xdd\x93\x3c\x9d\xcd\x47\x88\x09\x2e\x21\x96\x33\x0a\xf0\x6d\x51\xf9\x16\x0d\xfc\x09\x6e\x9b\x06\xa1\x59\x41\x1e\x39\xc9\x7c\x00\x60\xfd\x1d\xee\x46\x28\xee\xcf\x61\xe0\xf5\xd2\x59\xac\xa3\xfc\x6e\x8c\x43\xbb\x9a\xa5\x9f\xed\xb9\x45\xc6\x6b\x44\x9e\x81\xe0\x56\xb5\x6f\x4a\x5a\xcb\xab\x06\x62\x1a\xc2\x96\x08\x58\x59\xc1\xb5\xc9\xb4\x1c\x7a\xc7\xce\xb0\x1d\xa7\x3c\xa8\x69\x21\xdd\xc7\x9a\xe9\x6d\x00\x34\x21\x04\x8c\xb7\x62\xf1\xa7\x96\x80\x9c\x6b\x61\x08\x51\xf0\x71\x74\x19\x54\xca\xed\xa7\x76\xe5\xe6\xea\xcd\x06\x3b\xb0\x80\x23\x62\xb8\x46\x40\x1e\xb0\x9e\xfd\x24\xc3\x5f\xef\x43\x83\x83\x7e\xa4\x64\xa9\x90\x3a\x6e\x71\xa4\xc2\x1e\xbc\x78\x04\xda\xab\x9b\x46\x0a\x9d\x5b\x65\xaa\xbd\x40\xee\x77\x9c\x7d\x8c\x39\x3d\xf6\xf0\xdd\xd9\xcb\xb1\x57\xba\x93\xd2\x43\x9a\x0c\xa1\xf7\x90\xf2\xae\x41\x66\x12\x79\x76\x59\x33\xa7\xf0\x9e\x11\x73\x33\xfc\x26\x17\x4a\x5a\x45\xf2\x81\x20\x28\x6f\xe7\xb0\x40\xb9\xfa\x3b\xec\xd5\x53\x4b\xd4\x04\x4a\xc3\xcf\x25\x32\x73\x1a\xa6\x16\x00\x61\x55\xd5\xff\xae\x76\x08\xc3\xd0\x24\x06\x69\xeb\x25\x1c\xd0\xa4\xe3\x89\xc1\x8c\x1b\xd7\x7b\xc6\x67\xeb\x3a\x21\x6a\xe9\xb7\xdd\x14\xa0\x3f\x49\x00\x12\x44\x08\xb1\x0f\x47\x98\x08\x8a\xbe\xcf\xa1\x3b\x5a\x0e\x9b\xbd\xf9\xbf\xd9\x3f\xa6\x2c\xf8\x0d\xea\x82\x11\xe2\xdc\x1e\x9e\xa0\x7d\xf4\x58\xdf\xa6\x44\x19\x9e\xe4\xcc\x1e\x33\xfe\xae\xbf\xcb\x7f\xf9\xbb\x5e\x85\x42\x55\x7f\x95\xde\xfd\x3f\xc6\x0c\xfd\x95\x6d\x76\x04\xe9\x5f\x7a\x22\xb6\xd6\xfb\x0f\xef\xcb\xd1\xbe\xef\x6b\xc1\xf3\x69\xcd\x3b\xef\x11\xbd\xab\xa3\x0c\xdf\x20\x02\x78\x19\xa0\x96\xc3\x8d\x41\x54\xf1\xb7\xf7\x5e\x06\xe6\x53\xbc\x33\xd5\x03\xde\x39\x11\x87\xe8\x86\x1a\x51\x6e\xfb\x89\xbc\x1b\xfe\xf5\x8d\x2a\xd6\xa7\xd3\xf9\xe7\xa3\x96\x6f\xc0\xb3\xfc\x04\xde\xdf\xe2\xa1\xbe\xbf\x29\xdb\xf3\x4f\x08\x98\xeb\x83\xa9\x83\x06\x17\x16\x06\xe5\xe7\x8b\x80\x1f\xb1\x4c\xcd\xb4\x7e\x56\xf5\x01\x0d\xf8\x3b\x8e\x56\x43\xa2\x54\x8a\x36\x50\xa1\xe8\x7c\x12\x81\xc1\x45\xdd\x89\xfc\x52\x38\x39\xcd\x41\x5b\x5c\x9f\x84\xff\x2c\x77\xb6\xd4\xcb\x6a\x04\x6b\x77\x1f\xfc\x65\x7d\xbe\x7c\xe2\xb5\xfa\xab\x88\x56\x8f\xc9\xb0\x27\x6f\xe2\xbe\xec\xb2\xbd\x35\xe5\x42\xfa\x38\xbb\xe1\xd3\xb5\xb2\xac\x98\x78\xa4\x8a\x3a\x00\x21\xab\x00\x31\x5e\xed\xdc\x7d\x61\x0b\xbf\xcd\xaf\x12\xcd\x31\x5a\x83\x2c\xaf\xdf\x5f\x93\xdf\xa0\xd7\xf4\x62\xf2\xe6\x6b\x72\x9e\xc3\x6b\xe2\xbe\xa6\x50\x42\x30\x6b\xb8\xe8\xa8\x33\x93\x3a\x12\xa0\x08\x45\xc3\xd2\x89\x42\xc7\xca\x71\x6c\x2b\xec\x6d\xbe\x1d\x84\xf7\x69\xcd\x0a\xc2\x89\x9b\x5c\x30\x9d\x91\xb1\x0d\x7b\xf8\x0e\xfc\xd0\x99\xc2\x22\xc8\xc1\x0c\xc5\x38\xbe\xd8\xae\x01\x86\x28\x04\x0f\x31\x4e\xe1\x7e\x3c\x18\xf9\x60\x58\xb5\xd9\x3d\x63\xdb\x88\x27\x0a\x13\x71\xee\x22\x1f\xe5\xcc\x9a\xe4\x95\x87\xb1\x08\x5f\x14\xf1\x1c\xaf\x9c\xe8\x52\x32\x63\x53\x4b\xf9\xc5\xe7\x0e\x59\xee\x8c\x60\x7d\xa5\x7f\xe2\x16\xc1\x03\xbf\x8e\x22\x4c\x79\x20\x92\x1b\xba\xa7\x36\xdd\x45\x3f\x7c\xa1\x6b\xa9\xcd\x39\x2f\xcb\x0f\xc0\xae\x9b\x8b\x8b\x03\x6f\x94\xdc\xf3\xce\xcd\x0f\x03\x2f\x03\x5c\xa7\x7e\x5f\x92\xc6\xcc\xad\x43\xba\x7a\xe6\xc0\x6f\xf5\x5e\x1c\x88\x46\x3c\x70\x64\x0b\x34\x1f\x36\x0a\x8a\xdb\xfa\x2d\xff\xb2\xe0\x44\xc7\xb4\xd6\xe0\x19\xb9\xa7\xcf\x4d\x74\xd4\xc3\x3c\xaf\xea\x20\xb1\x5f\x0a\xf8\xdc\xae\x26\x10\x8d\x84\xba\x74\xf3\x9b\xd6\x2c\xc7\xef\x6f\xf1\x5c\xa7\xdf\x32\xe6\x20\x27\x21\xc2\xc0\x3f\x75\xbf\xc5\xd6\x74\x17\x06\xc3\xed\x38\x80\x09\xa6\x91\x03\xd3\x89\x3d\x0a\xe7\xa1\x57\xed\xea\xcc\xb6\x84\x41\x27\x1a\x65\xad\x36\x73\x32\xe6\x26\x55\xfb\x9b\xe3\xf5\x87\xa5\x35\xc8\x55\xfc\x4d\xce\x7c\x76\x6b\xae\x7c\x29\x5d\xd6\x16\x7d\x52\xb7\x47\x69\x5a\x9b\xa5\x69\x7f\x47\x08\x5e\xd7\xe2\xfc\x20\xe4\x7a\x7a\x77\xd5\xc9\x44\x1c\x32\xba\x36\x74\x6f\xb9\xdf\x6b\xf3\x01\x2b\x5f\x65\x7d\xdd\x58\x66\x2b\xa0\x86\x24\xea\xe7\x24\xb3\x9e\x76\xf8\x8d\x02\x4d\x54\xfe\x53\x6a\x99\x29\xd7\xea\x5a\xf2\x53\x5b\xd1\xc9\x45\x5c\x74\xa1\xb4\xd4\x8d\x2f\xaa\xbf\xcd\x06\x79\x6e\xe5\xe1\x90\x5d\x24\x7b\x7d\x04\xdb\xcc\x0a\xcb\x27\x51\x08\x41\x46\x45\xd8\x24\x8f\xde\xd1\xfc\xfc\x6f\x83\x88\x05\x0b\x43\x0e\x8e\x86\xdb\x63\x0a\xec\xbe\x17\x63\x20\x27\x96\x5d\x4b\x03\x31\xb9\xcf\xd3\x5a\x45\x47\x5c\x97\x1e\x3c\xcd\x49\xa6\xb5\x26\xb4\xd2\x7f\x49\x41\x6a\x42\x5d\x2b\xfd\x0a\x5a\x46\xbd\x42\x95\xfc\xa6\x5d\xcb\xe6\x77\x67\xbe\x7c\x14\xed\x9a\xa6\xc9\x51\x2b\x2f\xd5\x37\x27\xd2\x6c\x3c\x8d\xe8\xbc\x8e\x27\x27\xfe\x86\xda\x14\x60\x5d\xbf\xb7\xf6\xf2\xd2\xd7\x61\xc6\x38\xf9\x1b\x0f\xf0\x50\xbc\x1d\x84\x10\xb1\xf3\x70\x5e\x8f\x07\x57\x57\x9c\xcf\x79\xb8\x73\x1c\x83\x2f\xa4\xe8\x5b\x5b\xff\x1f\x99\x3f\xfe\xd1\xb6\xc9\x86\x76\x0f\x67\x81\xf2\x7a\xee\xb2\x37\xd6\xcc\x50\x42\x5c\x82\x2a\x64\x6f\x8c\x40\x46\xa5\x23\x9e\xac\x91\x86\xb8\x2c\x6b\x49\x27\x0e\x85\xcc\x0c\x99\x43\x67\x7c\x87\x1c\x31\xe4\x2f\xdc\x79\x23\x87\x12\x02\xd4\xe8\xf2\x43\xf9\x5b\x3f\xd8\x17\x26\x36\x31\x10\x08\xb3\xb7\x16\x3f\xe2\x70\x59\x47\x9e\xf5\xda\xb3\x88\x64\x27\x32\x92\x02\xec\x03\x8f\x99\x1f\x4e\x95\xf6\xb9\x1b\x3a\xad\xaa\xe4\x34\x87\x12\x89\x13\x64\xfd\x70\xe6\xbc\x9d\xca\xb2\x47\x67\xa2\x97\x31\x72\xba\xf0\x3e\xd5\xa5\x22\x40\x8e\xf3\x82\xba\x7d\x56\xc1\x47\xce\xea\xbe\x24\x3b\xe9\x3f\xe2\x86\xa0\xfc\xeb\x21\xce\x80\x16\xe9\x04\x0a\x35\x8d\x6c\xda\x11\x30\x35\xbd\x9c\x2a\x8c\x80\x04\xd1\x84\xce\x89\x3f\xec\x17\xfd\x98\xb0\x0e\x81\x81\xf6\xd0\xad\xa4\x39\xc8\xb2\xf3\x6f\xcb\x96\x9e\xab\x5b\x3b\x80\xb1\xca\x88\x84\x7c\x06\xe7\xde\x0a\x7e\x75\x10\x9f\x58\xd7\x0b\x9e\xe4\x5d\xe5\xa4\xb8\x3e\x50\x89\x5e\x42\x0c\xe1\x1b\x18\x5b\xe6\x8f\x08\x16\xe1\xe9\xe6\x7f\x6c\x3a\x23\xe8\x58\x6b\x22\xce\xfa\xd1\x5e\x15\xd0\xfd\x78\xdc\x0e\x1f\xba\xad\x2f\x52\x86\xc0\x35\x10\x65\x88\xf4\xa1\x68\x03\xdd\x08\xa2\xb6\xa5\x19\xda\xf9\xf9\x0c\x28\x51\x03\x93\x9d\xf6\x85\xdc\x6a\x6c\x3c\x2d\x81\x8d\x06\xae\x85\xfb\xb6\x66\xb6\x43\x98\xe0\x1b\x3d\xaf\x39\xb8\x44\x9a\x5a\x55\x4f\x9f\x97\x63\x89\x06\x1a\xc4\xfa\xb8\x34\x88\xf6\xe2\x44\x71\x51\xbf\xac\x59\xaa\xe7\x0e\x61\x39\x5a\xa7\x28\xd9\xd1\x2c\xad\x6c\x6d\x11\x76\x99\xad\x8e\xd6\xac\x5e\x31\x4a\x67\x8a\xd1\x82\x53\x62\xe4\xde\x70\xf7\x13\x89\x82\xe7\x22\x1c\x6f\x66\x08\x1d\xf4\x10\x21\x95\xcc\xfb\x69\x8a\x2a\xf0\x32\xa7\xe8\x06\xf4\x61\xb2\x86\x05\xef\x48\x77\xfd\x70\xbc\xa3\x58\x0d\xaf\xb2\x80\x22\x74\xc8\x5e\x02\x03\x63\x6d\x95\x76\x59\x9d\xa9\x10\xae\x6f\x2b\x64\x61\x68\x5e\x0d\xef\x71\xfd\x22\xb3\xcb\x2d\xb1\x8c\xf0\x71\x73\x63\x5f\x99\x73\x89\xa6\x20\x61\x14\x17\x32\xa1\x09\x35\x35\x3b\x84\xe6\x55\x82\x47\x5e\xcb\x6f\x88\x66\x9f\xe1\x52\x3b\xa2\xdc\xd0\x1f\x28\x3c\xe6\x46\x43\x02\xe8\xc2\xd3\x68\x0f\xa7\xef\xf1\x74\x40\xb2\x1b\xd2\x1c\x9c\xa5\x55\x42\x41\xb0\x74\x5e\x00\xeb\xe9\x78\xd7\x48\xca\x3f\xc8\x9e\x3f\x2e\xe2\x6a\x40\xf1\xf6\x9e\xc5\x71\xc5\x86\xfa\x27\x6f\xc3\x65\xdd\xa3\x93\x8d\x20\xa2\x94\xda\x69\x58\x3f\x69\x2f\x6d\xb0\x1a\x38\x25\xe0\x90\xb3\x0a\x18\xc3\x99\x69\x86\x9b\x08\x25\xc8\xa5\xf9\xf5\x39\xe1\x01\x11\x12\x09\x26\x77\x8b\xfa\xb8\x04\xe2\x28\x94\xf4\x1b\x3f\xa9\xd1\x94\xd2\x12\x1c\xbd\xc3\xab\xcf\x23\xac\x86\x55\xa2\xfb\xdc\xa1\x2f\xaf\x06\xb4\x41\x69\xca\xab\x30\x47\x18\xce\xf3\xfb\x6a\x75\xd5\x8d\x90\x41\x8f\x31\x8e\x40\x68\x19\xae\x5b\x9a\xe0\x0b\x6c\x78\x01\x68\xe7\x97\x72\x47\xcc\xfc\x65\xb4\x33\x64\x54\xaa\xa6\x9c\x2c\x8b\xb6\x92\xf3\xfa\x7a\xbb\x47\xef\x70\xb0\xc7\xa2\x25\xcc\x9e\xe8\x54\x86\x3f\x6e\x6c\x47\x83\xdc\x1d\x09\x51\xc2\x9d\xb2\xb4\xa7\xf5\x4c\xc8\x06\xf2\x6b\xfa\xbf\x2b\x1c\x9f\x32\x33\xcd\x26\xc1\x02\x3b\xd6\xdb\x42\x01\x12\xac\x25\xd6\x17\x07\xf2\xf3\x81\x4f\x25\x9b\x67\x03\x00\xcf\x0d\x77\x0c\x73\x09\xe8\xf9\xd3\xa8\xcf\xd8\x92\xab\x4b\x80\x68\xe3\x25\x38\x8d\x19\x35\x78\x6c\x37\x97\x09\xad\x5b\x66\xc9\x98\xed\xcd\xbf\x06\x5c\xd2\x73\x83\x4c\x8b\x3d\x89\xb2\xc4\xd7\x0b\x9e\x24\x6b\x9b\xf2\x67\xb1\xb1\x5c\x0e\xfe\x22\x44\xe9\x25\x96\xd2\x39\x45\x4f\xc4\x0e\x64\xe7\xa4\x17\xf4\x07\x21\xf3\x42\x22\xf1\x5e\x58\x9f\x7e\xca\x9e\xc9\x8a\x4e\xe8\x07\xa0\x8e\x45\x19\x9b\xa0\x4e\x0b\x5c\xe5\xf1\xbb\x93\x96\x2a\x77\xf0\x20\x3e\xa6\x0e\x4c\x73\x3b\xf8\x05\x3c\xaa\x67\x1c\x85\xc5\x0b\x5c\x53\x33\x88\x7a\x02\x6b\x89\xf7\xdb\x39\x4b\x3e\xc0\x1d\xc8\x25\x5d\xd4\x35\x50\x7a\x07\x1a\x8e\xf7\xec\xd2\x90\xdf\xde\xd9\x0b\xf2\xcf\x7a\x53\x68\x16\xca\xe6\x3b\x9f\x89\xcf\xf5\x82\x41\x12\x5f\x6c\x69\xcd\x09\x37\x45\xa0\x3b\x66\x6b\x5e\x8b\x05\x36\x5f\x6d\x43\x60\xc7\x7b\x2b\xeb\x98\x4b\x40\xdd\xe6\x9b\x78\x84\x7c\x74\x49\x2a\x98\x9d\xfe\x22\x96\xe3\x78\x56\x66\xea\xda\xb1\xed\xde\x40\x3c\x58\xd8\x1a\xdb\xed\x99\xa3\xca\x2e\xe7\x93\x0c\xa6\x13\xb4\x6e\xc1\x9b\x0e\xe2\xc4\x8f\x50\x67\x3f\x4a\xf4\xd3\x0e\xa4\xa2\x40\xbf\xe7\x50\x81\x13\xbd\xe4\xa0\x1e\x73\x07\x65\x7e\x6a\x68\x06\x66\xcc\xe2\x35\x28\x10\x9b\x14\x02\xea\xee\x8b\xa2\x43\x19\x0e\x9e\x63\xba\xdc\x21\xee\xe6\x7e\x5f\x10\xb4\x36\xf8\x86\x4f\xd5\x23\xa6\x0e\x38\xf3\x55\xa7\x4c\x1f\x38\x63\xb4\xaa\x9c\x79\xcd\x4b\x6d\x9f\xc3\x50\x85\xc3\x5b\xf2\x8e\xbd\xa0\x4b\xa2\x95\xcd\xaa\x8d\xf3\x94\x79\x3a\x93\x35\x2a\x57\x1a\xe0\x29\x88\x15\x65\x4f\x0b\x01\x68\x53\xc8\xcf\x1c\x4c\x2a\x38\x64\x6a\xb1\xa1\xfd\xa8\x91\x43\xb3\xac\x6f\x3d\xbf\xc3\xe4\xf3\x8b\x01\x04\xbe\x60\x9e\xdb\x1b\xce\xaf\x23\x6f\xdb\xf5\xf4\xef\xb0\x35\x9f\x02\xa0\x66\xed\x7d\xbe\x98\x66\x80\x0b\xbf\x88\xb4\x8e\x6a\xbd\xe9\x6e\x1e\x79\xfe\x5b\x99\xd3\x8a\xb8\x30\x24\x5d\x09\x9e\x86\xe8\x87\x42\xa2\x14\x4f\x01\xf5\xb7\x2e\x7f\x7f\xb1\xe9\x78\x20\xe8\x47\x86\x5f\x9a\x7e\xbf\xac\x0e\x09\x76\x19\x43\x7f\xf8\x78\xf9\x57\x47\xa2\x3a\x28\x74\xca\xaf\x43\x97\xfa\x0c\xab\x91\xcb\x10\xf2\xa0\x99\x45\xea\x35\x07\x44\x4d\xd6\x86\x94\x2a\x83\x20\x58\xfd\xc4\x40\xff\x03\xf2\x21\xed\x2b\xd0\x27\x81\xde\xfa\x06\xf9\x87\x69\xa7\x58\x5f\x5a\x4f\xbc\x3b\x34\xdd\x1a\xbf\x8a\x41\xee\x36\x65\xa2\xe3\x21\x49\xfb\x23\x12\xed\x61\xa8\x7a\x48\x7b\x5f\xad\xe6\x14\xbe\xd1\xd3\x1f\xb8\x44\x08\x5c\x1d\xf0\x23\xcb\xa0\x97\xef\x48\xf4\x64\x81\x51\x0c\xdd\x30\xae\x39\x82\x23\xb2\x73\x74\xdf\x4a\xe2\x54\x3d\xb2\xf7\x27\x39\xb3\x17\x06\xab\x47\x4f\x4f\xac\x42\xeb\x71\x5b\x93\xc3\x6f\x50\xea\x30\xc7\x9e\x8c\x89\xc1\x9e\x20\xba\x0a\x33\x74\x2d\xae\xee\x0f\x6f\x05\xc6\x27\xdd\xec\xba\xa0\x54\x59\x73\x9c\x83\x77\xbb\x7f\x34\x06\x92\x91\x2a\xf1\x4f\xd5\x85\xe5\x19\x66\xbb\x57\x7b\x1e\xf8\x3a\xed\xa1\x80\x6d\x46\x34\x62\x61\xa2\xe5\x20\x7a\x12\xee\xd3\x3b\x4c\xef\xf2\x61\xaa\x95\xa8\x21\xcf\x60\x44\x94\xb4\xdc\x5c\x07\xf7\xe1\x9b\xf5\x88\x59\x21\xfd\xba\xd7\xe1\xde\x60\x27\x4a\xa6\x33\xb0\x38\xaf\x28\xd1\xdd\x23\x42\x76\x05\x5b\xee\x45\xf1\xb4\x3b\xb8\x9a\xfe\x04\x20\x1d\xa6\x59\xa3\x7e\xf4\x04\x3d\xb7\x02\x64\xb2\xe7\xd7\x8d\xcd\x42\x44\xb8\xd6\xc9\xbf\x37\x4c\x49\x0b\x3a\xe7\xea\xa0\xc9\x0f\x57\x40\xad\x62\xc1\x43\x01\xe7\x9e\xf1\x70\x41\x49\xbf\xfd\x82\x1e\xab\x20\x57\x1e\xe0\x1c\x88\xa9\x23\xc0\x51\x60\x39\x22\x1a\xe3\x22\x7a\xe9\xb8\x65\x9d\x44\xc8\x92\x99\xcf\x7b\x77\x56\x25\x44\xb5\x20\x32\x16\xcd\x3d\x5e\xb3\x06\xc1\x5a\x62\x1d\x68\x26\xb0\x0b\x1a\x36\xcd\xea\xa2\x0d\xb4\x91\x9b\xc0\xa3\x5b\xff\x2a\xa7\xce\x1b\xff\x22\xd6\x6a\xe7\x6f\x4b\xb9\x8f\x64\xc9\x9d\x90\x51\x76\x39\xda\x30\x9b\x95\xd2\xbf\x14\xc7\xf7\x73\xfd\xe6\x35\x30\x56\x3f\x77\x2a\xe7\x9e\x7d\x54\xc5\x1a\xce\x70\x75\xc5\x9a\xe2\x5c\xf1\x9e\x5b\xa9\xae\x71\xd4\xa3\xb5\xcb\x65\x31\x7a\x54\x67\x3a\x2a\x24\x6c\xcf\x8f\xda\x0b\xd9\x85\xf8\xd0\x58\x8f\x0d\x3e\xa4\xb4\xd8\xbe\xb5\x8e\xfc\x31\x6a\xfa\x5a\x8d\xf1\x56\x82\x23\x2a\x8f\xf2\x21\x5c\xb6\x67\xc6\x85\xa5\x58\x70\xbe\x81\x5a\x7d\xba\x19\x5e\x7d\x6b\x27\xe0\x61\x39\x99\x20\x8d\xb4\x2b\x28\xd6\xb5\x1f\x66\x29\x28\x00\xba\xd4\x10\x5d\x89\xc3\x3b\xde\x36\xda\x3b\xaf\x69\xf6\xa6\x98\x62\xd6\xe8\xbd\xb4\x5d\xb9\x74\x3b\x47\x86\x57\xe5\x30\xaa\xf8\x45\x16\x17\x39\x63\x09\x3e\x14\x7d\xfa\x1d\xe7\x27\xe4\xd6\xc6\x36\xa0\x7b\x3b\xfc\x63\xb0\x7b\x42\xe5\xc8\x5f\x7f\xfc\x0b\x0f\x44\x57\x71\xcd\x00\xce\xb5\x4f\x9f\x57\x17\xc9\xa3\xbb\xd7\x30\x83\xfa\x35\xb4\x4e\x31\xec\x80\xa4\xe1\xab\xa6\xa3\xef\xbc\xa6\xfb\xdf\x45\x3c\xcb\xff\x2e\x74\x44\xbe\x48\xf6\xf2\xc7\x03\x2c\xc4\xdb\xe0\x85\x32\x33\x73\xad\xec\xb9\x3c\x68\x22\xef\xfa\xa8\x4b\xd5\x90\x0b\x02\xf3\x85\x7d\x83\x56\xaa\x29\x54\x45\x0f\x9a\x48\x1c\x1d\xdc\x8c\x1c\xc1\xcd\xbe\x54\xe7\x75\xd3\xbe\xec\xbb\x05\x8d\x21\xb7\x47\x6f\x61\x6f\x60\xcd\xc6\x29\x39\xf0\x2b\x04\x3c\x59\xd8\xa4\x98\xc0\x92\x8f\x59\x7a\x1d\xb7\xed\x21\x70\x86\x21\xd8\x74\x94\x27\x4d\xab\x0d\x86\x36\xdf\x53\x5c\xfc\x2c\x50\x10\x21\x09\xb8\xb0\xf6\x4a\x44\x69\xfd\x0a\x74\x58\xcf\xc6\x2d\x0a\x19\x41\xbc\xc2\x4f\xed\x2d\x8b\xc9\xf5\x51\xf6\x26\xa4\x8f\xe2\xf4\x6e\x60\x00\x14\x23\x7e\x0c\xbc\xf8\x47\x58\x4b\x0c\xd4\xd1\xce\xda\xc9\x23\xbc\x9e\x8e\x23\xcb\x37\x8a\x6c\x2e\xbf\x91\x17\x6d\xb5\x07\xf4\x65\xc2\x9b\x86\xbe\x8a\xae\x01\xab\x59\x1d\x61\xa4\x4f\xb9\x27\x95\xcd\x75\x87\xf1\x89\x8b\x96\xbd\x7d\xa0\x0d\x66\x7b\x71\x49\xb3\x42\x75\x31\x00\x7a\xa5\xe5\x1f\xfe\xbd\xd8\xf0\x1a\xba\x3e\x5d\x6c\xb2\xb7\xce\x68\x03\x98\x2d\xf4\xed\x6e\xe2\x57\xed\x69\x56\x67\x77\x43\x6c\x7d\xd2\x80\xe8\x76\x67\x84\xb9\xc9\x4f\x39\x7a\x52\xfe\xd1\x52\x97\x2a\xa8\x33\xe8\xc4\xc7\x7c\xd7\x89\xa0\xa9\xba\x86\xd5\x26\x8d\x40\xb1\xc3\x91\xa0\x79\xfb\xf9\xcc\x6f\x59\xe0\x42\x30\x6a\xd0\x4a\x2b\xe3\x64\x82\xb7\xd6\x0e\xc7\x9e\xd0\x5e\xb4\x29\x90\xe1\xce\x30\xb4\x5c\xdd\xe2\x58\x16\x89\x3e\x6c\x95\xdd\x8c\xad\x16\x31\x1e\xb6\xaa\x9d\x0f\x60\xd4\xf9\xde\x67\xf6\x3b\xac\x99\x40\x5f\xaf\xb3\xd2\xf4\xc2\x23\x48\x43\x8d\x05\xc7\xa0\x89\x1c\xec\x49\xf9\xdf\x11\x09\xe2\x01\xb7\x5d\x3d\xc2\xd4\x6d\xfc\xe1\xf9\x96\x7f\x8c\x93\xdf\x02\x53\xb5\xa1\x9f\x60\x6d\x41\xae\x50\x3c\x84\xca\xba\x99\x29\x7e\xdd\x1b\x6e\xad\xac\xd5\x9a\x74\x99\x26\x08\x83\xba\xc0\x56\xd1\x3e\xf8\x9d\x71\x7e\x9a\x66\xaa\x0b\x0d\x43\x57\xb8\xc4\x76\x1a\x90\x0b\x64\xd4\x95\xd3\xe7\xe6\x30\x5b\x2e\x60\xad\x29\x7c\x65\xfe\xc3\x56\xe3\xd6\x9c\xae\xe6\x86\xbd\x8c\xdc\x5c\xa4\x6f\x83\xa4\x56\x09\xfa\x3d\x3e\x8b\xba\x1f\x48\xc8\x56\x8d\x32\x15\x62\x16\x74\x10\x13\x32\x26\xf2\xda\x76\xe1\x90\x17\x1e\xc9\x94\x8e\x58\x08\xe2\x72\x84\xd1\xe5\x97\x5e\x3d\x7c\xdd\xe5\x1f\x07\x5f\xad\x12\x6e\x1b\xb0\x36\xad\x98\x77\x78\xda\x79\x31\x33\xb5\x0c\xf0\x88\x28\x82\xc2\x4d\xd5\x7e\x4e\x69\xbb\x6e\x32\xdb\xee\x28\x27\x9a\xa0\x14\xe9\x85\xb1\x02\x4e\xea\x2d\xdb\x61\x1c\x5a\xff\xa1\x26\x8d\x33\xde\x98\xd1\xe4\x9d\xc5\x8b\xbf\xe3\xd9\x94\xb4\x9e\x78\x6f\xb1\xa6\x67\x2f\x72\xeb\x73\xdb\xff\x3c\x6b\x0b\xf6\x35\xe4\xe8\x1c\x40\x05\xbd\xba\x0a\x66\x53\x78\x5a\x07\x1f\x3d\xe2\x2d\x2b\x1e\x62\x4b\x0e\xce\xfb\x96\xad\x69\x8c\x8c\x6f\xc0\x61\x1d\xa2\xb6\x9d\xe7\xbb\xe7\x90\xeb\x06\xd5\xaa\x99\xbd\x7a\xda\xaa\x07\xd3\x59\x79\x75\x01\x93\xa3\x21\xc5\xcd\x26\x58\x80\xa6\xd0\xea\x23\xdd\x1b\x17\xd8\xc9\xa1\xc3\xc5\xbb\xcf\xf5\x2e\xb2\xc4\xc8\x62\xda\xf6\x1e\x5c\x0d\x5a\xb7\xf9\x18\xcc\x06\xfe\xbc\xd5\xa4\xdc\x94\x9d\x47\xe2\x56\xaa\x22\x67\xb6\x04\x54\xbc\xce\x03\xd2\xfe\xf2\x24\x6f\x01\x1f\x72\x7b\x89\x5a\x21\xcd\xdb\x47\x64\xf5\x26\x1d\x1b\x10\xec\x42\x56\x7d\x83\x36\xf8\xed\xc1\xd8\x92\xbb\x28\xeb\x8b\x18\x38\x80\xa2\x24\xd0\xe1\xb9\xf2\xa7\x1c\x90\x5e\xc0\x3d\x55\x5b\x15\xe5\x35\xdc\x77\xae\x9a\xf1\x2f\xe8\xd6\x28\xa5\xf5\x9f\xbc\x85\x5e\x42\x57\x90\xc9\x6a\xd6\x16\x7d\x35\x80\xdd\x75\xfe\xd6\x66\xae\x97\x04\xa5\xcd\x9e\x55\xa7\xbb\xb9\x36\x93\xf1\x7b\x6e\x29\xfd\xc1\x79\x78\x6c\x8c\x9a\xc9\x1c\x0b\xb8\xbe\x6c\x81\x20\xe3\xd9\xb3\xfc\x76\x43\xcd\xcd\xea\xbe\xdf\x95\x29\xa6\xcc\x2c\x6b\xe3\xa1\x08\xb1\xcc\xd4\x00\x56\x59\x89\x46\x75\xf3\x2f\x96\xce\x7d\x23\x4c\x95\x3b\x00\xc6\x70\x97\xe5\xb4\xbd\xea\x6e\xb3\x3a\x37\x12\x2f\x7a\xb4\x98\x28\xe6\xb5\x3e\xbd\x3d\x2d\x7a\x9e\x00\x7a\x9f\x76\xb8\xf4\xab\xfb\x90\x32\xad\x8e\x08\x58\x7b\xeb\xd2\x1a\x71\x95\x5f\x4e\xd0\xfb\x90\x35\xaf\x9d\x58\x34\x55\x4d\x92\xfa\x8d\xd1\x13\xbe\x1b\xf5\x7b\xe2\x80\x5a\xfd\x86\xda\x9d\x3f\x52\x34\xd9\xf4\xb1\x1b\xb0\xf9\xd7\x73\x55\xd7\x7e\xbd\xf8\xb1\x5e\x49\xee\x5a\xaf\x88\x01\x73\xec\x45\x38\x2b\x57\x34\x86\xb2\x46\x2e\xad\xd0\x2c\x6b\x33\xf0\x7a\x39\x6b\x2f\x3b\xd2\x60\x65\xb1\x73\x44\x5e\x5d\x04\xb7\xf1\x84\x32\x2e\xb9\x88\x4d\x57\xbd\x73\xba\x16\x6a\x38\xac\xc5\x73\xef\x5d\x77\x8d\xdf\x6d\x3e\x7b\x62\x61\xad\xf9\xb5\xf0\xf2\xac\xe8\xb4\xf9\x74\xe1\xeb\xb3\x22\x90\xa1\xab\x3b\x9c\xb5\x9a\x31\xa2\xc9\xcf\x51\x8e\xd5\xe5\xde\xf9\x84\xd3\x76\xa3\xf7\xbe\x6a\xef\x4f\x18\x98\x7b\x5c\xb1\xf7\x0b\x4e\xb4\x4f\xa4\xe6\xaf\xd6\xbe\xbe\x48\xd9\xdb\xc0\x02\x9c\x09\x80\xb0\x9e\x01\xda\x6c\x53\xd3\x68\xc5\x8c\xfe\xcd\xf6\xb3\xd9\x74\xcf\xac\xc9\xae\x8f\x2c\x12\x05\xd6\xef\x37\x49\x18\xce\xde\x6b\x38\xbb\xf7\x64\x47\xed\xf7\xc8\x6b\x6c\xcd\xbd\x8e\x27\x45\x3d\xcd\x6a\xb3\xf2\xc5\x48\xd4\x05\xa3\x16\x27\xad\x45\x81\xa4\x4b\x08\x9e\x2f\xd7\x48\xfc\x9b\xf5\x11\xbd\xc7\xbf\x5c\xbd\x6d\xeb\x29\x58\x5f\x3f\xe1\x70\x7c\x8d\xdd\xaf\xe6\x12\xd9\x49\x8b\xe3\x8e\x84\xd4\xc3\xa8\x3c\xba\xd5\x64\x94\x01\xb7\xb9\xca\xf0\x7d\x80\x3a\x1f\x04\x48\x16\x1e\x14\xf9\x72\x74\x5f\xa1\x3b\x7e\xf1\xf7\x93\xcb\xcb\x8b\xb8\xd8\x9d\xf2\xe1\x30\xc0\xfa\xe8\xa3\x00\x0d\x06\xdf\x88\x9d\x36\xaf\xd5\x52\x3d\x52\x90\x5b\xb1\x13\x73\x4c\x21\x52\x55\xf0\x6c\xf2\x4c\x6a\x21\xeb\x6f\x8a\x10\x3a\x50\x98\xe3\x95\x5e\x2a\xc3\xd9\x17\x7a\x84\x17\x72\x9a\x16\x0d\xff\x2e\xe5\x63\x40\x03\x29\xa6\x5b\x0e\x6a\x5f\xc3\x16\x45\x9f\x01\xce\x53\x77\x8f\x02\xe9\x97\xa8\x58\xea\xe2\x26\x5a\x19\x2f\xc5\xb5\xcb\x4c\x5c\xc3\xea\x2f\x3f\x33\xeb\x56\x46\xaa\x8e\x63\xfe\x08\x64\x67\x89\x6f\xdf\xe2\x19\xf3\x6c\x2f\x90\xf9\x17\x7b\x85\x56\xcc\xf7\x19\x66\x11\x79\x30\xef\x7f\x2f\xe6\xb4\x2c\x65\x78\x29\x20\xcf\xf6\xe2\x2a\x31\x24\x38\xa2\xd0\xeb\x2b\xe6\x85\x2e\x16\x9a\xb2\x46\xa6\x96\xc9\x03\xd9\x96\xfc\x87\xd1\x47\x7f\xa8\x17\xab\x5b\x22\x5c\x69\xc1\x38\xe7\x35\x37\x74\x9d\xd3\x03\xf9\x54\x2f\xd0\x63\x83\xd8\x24\xc3\xbe\x17\xcf\x8f\x8f\x7e\x01\x46\xec\xa9\x2c\xb4\xe4\x42\x1e\x21\x07\xf0\x96\x8c\xb7\xae\x73\xcb\x73\x34\xb9\xa9\xc1\x15\x64\x6d\x1a\x94\x3d\x5c\xac\x55\x50\xbf\x7e\xcc\x2f\x5e\xce\x7e\xb8\xd6\x80\x7e\x2e\x3d\xfd\x32\xae\x92\x88\x69\x7a\x9f\x4e\x67\x30\x43\x84\xc3\x74\xfe\x25\x71\x07\xa1\x5b\xdb\xcb\x26\xf3\xb0\x21\x08\xd5\xf2\x00\x8b\xc5\x1a\x58\x37\x79\xf0\xc8\x7a\xd2\xd3\xfe\x4f\x80\x46\x6b\x18\xbc\xb5\xe9\xfd\x0c\x28\xab\xdb\x29\xe8\x80\xc0\xef\xc5\xec\xd9\x2a\xa4\x2a\xfb\xe9\x6a\x22\x1c\x94\x21\x65\x94\x8f\x52\xda\x23\xa8\xc6\x87\xe9\x74\x41\x40\x8d\x8d\x99\x88\x98\x77\x6b\x2d\x8f\x7c\xdc\x1f\x7d\xcc\xe8\xa5\xb8\xb5\x78\xe8\x14\x37\xb8\x2c\x81\x3d\x5c\xb8\xad\x59\xf5\xb8\x96\x9c\x89\x37\x9c\xc9\x85\x58\xd2\x4f\x25\xea\x66\x49\xf0\x3e\x71\xcd\xa9\xf9\xf7\x16\xe4\x25\xaf\x32\x30\xa2\x1e\xa9\x7d\x4b\xc2\x17\x54\x20\xca\xa6\x3c\xeb\x2c\x42\x8f\xbe\xe0\x88\xb3\x95\x07\xbb\x61\x7c\x44\xe0\xdd\x2c\x0c\x6c\x36\x9b\x71\x7e\x30\x56\x3e\x29\xdf\x07\x53\x2b\xe6\xf7\xfa\x8f\x13\xd1\x04\xdf\x31\xf2\x3a\xbf\x07\xa5\xe0\xcf\x8a\x43\x98\xd5\x8a\x9c\xaf\x80\xf6\x5d\xf6\x32\x8c\x32\x7b\x3e\xaa\xc2\x1a\xae\x02\x17\x5e\x45\x9a\x65\x73\xa8\x09\xcd\x51\x29\x01\x66\x88\x8f\xd5\x79\xdb\xfc\x7d\xf1\xd0\xf2\xb9\xaa\xd9\x3b\x7b\x1c\xd9\x9f\xd6\xe9\xe9\xe5\x77\x9c\x21\xa6\x73\x7d\xf3\x23\x14\xa4\x5b\x37\xad\x32\x0c\x76\x1a\x0a\xd9\xdd\xa6\xb3\xd4\xb6\xf0\xbe\x5d\x91\x76\x36\x17\xa6\xc2\xcd\xc5\x2f\xa3\x36\x25\xa4\xe1\x87\x74\x14\x8e\x74\xe6\xb4\xb3\x57\x9a\x3f\x87\x46\xdf\x8c\x0c\x6a\x19\x0d\x7d\x38\x25\x8f\x1e\x9c\xf3\xab\xb0\xab\x8e\xe1\xe0\x5d\x91\x5b\x73\xf6\xb7\x41\xf3\xad\x32\xa3\x73\x7a\x06\xc3\xaa\x99\xd4\x68\x85\x91\x22\x88\x70\xce\xee\x69\xa4\xd9\x5c\xba\x40\x8d\x01\x9f\xe1\x5d\x66\xd2\xb8\x60\xa4\x7f\x29\xa2\x87\xe7\xf4\x1b\x4f\xa5\x75\x42\x9f\xe4\x1c\xc6\xb0\xc5\x0c\x18\x14\x71\x88\xab\x46\x68\x66\xbe\xa8\x80\xaf\xbc\xbf\x6e\x7e\x22\x1f\x3c\x94\x22\xaa\x7d\x46\xc3\x4f\x97\xc8\x51\x9a\xec\x55\x02\xba\x53\xb4\x40\xff\xc4\x13\x24\x6a\x62\xdf\x1c\x8a\x24\x28\x36\x0b\x9f\x10\xad\xf1\x9d\x16\x0e\x10\x3c\xdf\xfb\xf8\xfe\x93\x2a\xdc\x73\x8f\x21\x3f\xfb\xae\x12\x91\x58\x7f\x8b\x20\x85\xf8\x88\x42\x15\xcb\x59\x84\x35\x34\xa0\x9f\x10\xaa\xc7\x26\x11\x8b\xf6\x4d\x03\xe6\x97\xa8\x8b\x74\x3c\x3b\x7b\x51\xe6\xc2\xac\xe3\xe7\xac\xc4\xac\x67\x79\x49\xff\xe4\x69\x4d\xec\xc0\x29\x9e\xf2\xd0\x3c\xf5\x65\x7b\x42\x42\x9f\x5d\xbd\x67\xd9\xbb\x58\x6c\x1d\x07\x76\x3f\x9f\x45\xa1\x6a\xa7\xbe\xf4\xcf\x62\x9f\xef\xe0\x34\xea\xf3\xf0\x2c\xb3\x10\x8d\x65\x58\xbd\x17\x67\x06\x83\x37\xcc\xa0\x47\xe0\xa9\xf0\x69\x4c\x23\x9f\x36\x6c\x99\x8c\x8d\x73\xcc\xe3\x04\xce\xa3\x17\xac\xcd\x44\xc9\xb0\x67\x7e\x31\x6c\xfa\x69\x75\x0b\x77\x4b\xb7\xed\x13\x21\x3a\x3e\x9d\x43\x50\xf6\xd9\x0f\xf8\x5e\x3d\x51\xa3\xeb\x8d\x87\x4d\xdc\xe3\x9e\x99\x48\xf2\x4c\x85\x33\x1e\x79\x5e\xa5\x4b\xf6\xb4\xfb\xd9\xf9\xd4\x57\xfa\xb9\xd6\x1f\x1f\xb5\xfe\xd1\xf8\xc9\xcf\x35\x3b\xcf\xfb\x07\xd0\xd3\xec\xc6\xea\x01\x8a\x3f\x75\x66\xf7\xf2\x07\xe9\xab\xb8\xb1\x3f\xf9\x95\xe3\x78\x7e\xb2\x32\x69\x7e\xb2\xd4\x44\x7e\xb2\xe7\xed\xaa\x52\xff\x49\xef\x80\x38\xbe\x94\x15\xfc\x83\x76\x61\xd5\x20\x1c\x0a\xde\xe6\x85\x21\x2e\x63\xc8\x84\x14\x74\x81\x51\x1f\x94\xd5\x55\x32\x1b\xea\xd0\x29\xbf\x34\xe1\x63\x6c\xa6\x7f\x6b\x60\x60\x9c\x2c\xbe\xd9\x0d\xc5\x28\xda\x23\x4a\x75\x4c\x37\x53\xd1\x15\xdb\xfa\xe0\x2d\x06\xaa\x51\xac\x43\xb4\xe5\xe5\x28\xf7\x82\xa7\x4f\x9f\xf9\x3f\xc5\x1b\xe2\x08\x07\x7f\xd8\x0d\xc6\xe0\x25\x04\xdc\xad\x5e\x68\xf0\x7e\x33\x11\x41\xa1\xa3\xf7\xec\xf3\xb4\xe6\x80\x52\xc2\xb1\xd1\xf8\x8b\xd1\x23\x15\xcd\x70\xf5\x51\xc8\xc0\x14\xae\x50\x45\xe1\x4a\xab\xea\x29\x00\x20\x0b\xb7\xfb\x13\x5e\xd4\x02\xc9\xb9\x56\xf7\x00\xdc\xef\x13\x6f\x68\x41\x2b\xe0\xeb\x03\x12\xc9\x25\x1e\x3b\xd9\x8c\x88\x0d\xbd\x43\x88\x01\x8d\x2c\x7d\x43\x3c\x3e\xbc\x4d\xa6\x13\x1a\xae\xfb\x87\x81\xed\xb0\x28\xe0\x2b\xce\xcd\x81\x9b\xc2\xda\x7e\x6a\xa7\xe0\x4d\xa1\x2a\xc6\xe6\x10\x75\xbe\x8f\xb3\x47\x23\x09\xfa\x02\xdd\xbd\xd0\x7f\x47\x2a\x50\x6e\x83\xc5\xc8\xad\x06\x21\xa0\xe4\xb5\xdd\x02\xe4\xf7\x5b\x6f\x39\xf6\xa7\x0f\xa3\xfb\x6c\x43\xd6\xcd\x19\x95\x9a\xee\x9f\x5b\x4e\x7b\x03\x26\x95\xb5\xdb\x73\x03\x4e\x02\x55\x89\x5e\xa9\xb6\xba\x6c\xd7\x10\xb7\x8c\x31\xb4\xa5\x06\x9b\xca\x1d\x7a\x4b\x04\x2e\x03\x55\x19\x29\x1f\x66\x7b\x1a\xf2\xda\x4a\xbd\xd6\x28\xe8\x72\xe3\x6d\x2f\xe1\xe7\x2b\x43\xa9\x88\x34\x83\x86\x33\x6f\x52\x2f\xf2\x97\xb5\x4b\x3c\xa9\x94\xf4\xd1\x1e\x23\x53\xfe\x41\xb2\x26\x1a\x7e\x9e\xde\x00\x97\x3a\x09\xf0\xed\x8e\x5c\x75\xf1\x1d\x5b\xd9\x4f\x73\xdd\xd9\xbd\x99\x28\xdb\x3a\x5d\xfa\x2e\x4d\x17\xf9\x9b\x48\x4e\xe7\x0f\x8b\xb7\x97\xa7\x6b\x56\x83\x67\xba\xba\x3e\x89\x66\xd9\x71\x70\x79\x3a\x4f\xd4\x24\x08\x4a\x48\x9c\x76\x4c\x03\x36\x8b\x55\xa6\x3b\x85\x47\x97\x35\x89\x92\xab\xc2\xad\x5e\x3a\x5f\x4c\xb1\x30\x2b\xc2\xc9\xc0\xb0\x8c\x8c\x41\x28\x5d\xa1\x51\x7e\x5e\x5a\x0a\xaf\xaf\xac\x41\xd3\xa4\x48\x74\xa4\x76\x86\xe3\x64\x82\x08\x07\xa7\xac\xb2\x1a\xc3\x92\x4b\x8a\x60\xc9\x43\x5e\xf2\x6b\xcf\xca\xfb\xb7\x52\xb7\x0b\x9a\x89\xc8\x86\xef\x30\x83\x7d\x09\x4b\x5b\x7c\x02\xfa\xcb\xbd\xb8\x93\x63\xaa\x23\x22\xfc\xb9\x5c\x48\x2c\xda\x6e\xaa\xb6\xd7\x35\xc2\x27\x4c\x1e\x7d\x62\xfa\xde\x54\xf8\x9d\x9f\xca\x22\xbc\x09\x5c\xaf\xbd\x44\x46\xa6\xf2\xd3\x1a\x9d\x93\xbd\x83\x8c\x84\x11\x47\x13\xd2\x03\x6e\x74\xf9\x7e\x92\xa7\xcc\xe4\x04\xeb\xa1\x5e\xdf\x17\xb9\x95\xf6\x81\x4e\x9a\xa7\x87\x7a\xca\xf0\x47\xf3\x13\x37\x65\x51\x1c\x79\xc6\xd0\x76\xe2\x25\xcf\x81\xde\x9e\x32\xd5\x3b\xdd\x6c\xff\xdd\x25\xb7\x86\x31\x36\xdd\x92\xb0\xdd\xe4\xdd\xcc\xe9\xf7\x4d\x00\xc8\xe4\xa2\x8e\x71\xb7\x90\x30\x9d\x05\xe4\xb4\x2b\xe8\xb9\x9e\x2c\x0c\x9b\x38\x3c\xce\xd1\x94\x6e\xcf\x94\xbf\xfd\x94\xd3\x9f\x7d\xf3\xf8\xb4\xa5\x3f\x55\x87\x53\x7a\x2b\x9b\x17\x31\x2c\x7e\x77\x24\x22\x30\x41\x5c\x43\xa7\x02\x87\xa8\x40\xad\x49\x11\x72\xa0\x70\x96\x20\x69\x9a\x39\x24\xcd\x8d\x38\x57\x33\x83\x0e\x38\x79\x92\xa2\xac\x5e\xa2\x97\x13\x58\x18\x8d\x9d\x0a\x30\x27\xe9\xe1\x30\x75\x8d\x81\x4c\xd4\x29\x03\x9c\xc0\xe7\xc8\x1a\xd4\x13\xa7\x9d\x2b\xf0\xfa\x3b\x97\xca\xbe\xe9\x67\x08\x00\x9f\xb2\x3c\x76\x32\x0e\x92\x4d\x91\x89\x49\x21\x53\x62\x62\xce\xf4\xfd\xf6\xf2\xf8\xf6\x96\xcf\x78\x51\x69\x6e\x54\xb0\xfb\x78\x89\xfe\x32\x5e\x37\xc9\xd1\x53\x0a\xf8\x6b\x51\x94\x87\x5b\x7e\xae\xe3\x7e\x65\xe2\x34\xaf\xb8\xb9\xe3\xee\x7f\x5f\x24\x77\xfa\x03\xfc\x01\x69\x23\xba\x93\xab\x22\xf1\x85\x8e\xe9\xb1\x45\x55\x8e\x3b\xc8\xd6\xea\x39\x8e\x08\x27\xdd\xf9\xe9\xb0\xcf\x93\xb0\x91\x4e\xee\x3c\x69\x35\xe0\xe2\x18\x8d\x02\xf7\x14\x6a\xb9\x95\xe2\x9d\x76\xad\x67\x06\x88\x8e\xb5\x7a\x27\x83\x44\xce\x43\x56\xe2\x74\x88\xce\x15\xec\x99\x8b\xcd\x43\x70\x0b\xc7\xea\x4f\xd8\xc1\x05\x86\xf4\xa2\x43\x0d\xe6\xe2\xc7\x47\xaf\x8a\x4d\xb8\x8d\xf9\xdd\xab\x2e\x18\x11\x25\xc3\x79\x8c\xce\x1a\x89\x1d\x03\xae\x13\x83\x1c\x11\xc3\x38\x7a\x6f\x87\x27\x31\xe7\x35\x86\xe0\xc6\x39\x5d\x7d\x25\x89\xb4\xec\xb3\x07\x11\xd1\x46\x52\xa4\xaf\xc8\x78\xb3\xb1\xd8\x33\xf2\xa6\xc1\x63\xf0\x50\x4b\xc9\x39\x8e\x13\x93\x18\xc6\x7c\x34\x8f\xda\x98\x3f\x72\xe4\xad\xd0\xb2\xd7\x79\xf6\x20\xd0\x39\xe7\x33\x3f\xc5\x32\x1f\x33\xbe\xd5\xb4\xf2\x53\xb3\xd2\x1e\x6e\x49\xd8\x9c\x99\x42\xa3\x70\x04\x72\x70\xa0\x31\xdf\x2d\x84\x11\x63\xd9\x27\xf7\x6b\x6f\x86\x1f\x58\xe2\x33\x49\x9e\xc1\x08\xaf\x6a\xff\xc7\x48\xd4\xf1\x7b\xa2\xda\x19\xc8\x9f\xe5\xeb\x06\x7f\xfa\xb6\x1e\x37\x1d\xd9\xee\x49\xe4\x50\x3d\x40\x13\xe0\x3a\xfd\xf3\x95\xc2\x62\xbd\x65\xd6\x44\xd7\xd0\x03\xd2\x5f\x82\x62\xee\xf9\x62\x8f\xed\xb1\xb7\x30\x13\x32\x42\x09\xdf\x44\x16\xa8\xc6\xc2\x1c\x18\x2a\x1a\x26\x94\xc4\x98\x37\x6c\xed\xa4\xbf\x12\x73\xdd\x77\xdc\x27\x6d\x30\x15\xa1\x3c\xff\xc5\x30\xea\xa3\x6a\xbc\xfe\x81\x97\x23\xfa\xd0\xd6\xc4\x12\xf3\x15\x8d\xad\x4b\x89\x4e\x66\x3f\x32\xc3\xc3\x31\x30\xf8\x62\x4c\x64\x00\x45\x63\x45\x26\x40\x01\x27\xaa\x57\x11\x44\x51\xb5\x0f\x3c\x28\x24\x96\xa4\xa3\xea\x81\x8f\xbd\x80\x99\xad\xdf\x0f\x1c\xe8\x8e\x30\xc2\xb0\x23\xf6\xf0\xe1\x20\x1c\x6d\x77\xce\xec\xdd\x3c\x66\x8f\x16\x93\x89\x5c\x97\x93\xe6\xf9\x62\x06\x26\x4c\xe4\xc7\xf4\x51\x88\xd1\x8d\x07\xde\xc8\x21\xb5\x1f\x0a\x8f\xa8\x45\x8b\x3e\x42\x0c\xf8\x21\xe8\xdf\xa3\x90\xbc\xff\xb0\x27\xb0\x91\x39\x1e\x68\x2e\xeb\x67\x84\x6b\x14\x59\xf3\x2c\x2b\x8d\xda\xc8\xfc\x24\x2e\x74\x46\x45\x43\xd3\x71\x78\xbc\x38\xb0\x23\x28\xe9\x51\x1e\x5c\x19\x99\xab\xd2\xe4\x7c\x40\x14\x90\xbb\x49\x91\xdb\xf6\xc8\x0c\x12\x7b\x64\xaf\x43\x11\x6b\x53\x7c\x50\xfa\x91\x97\x08\x77\x7f\x84\x8b\xfd\x61\x5f\xfc\x9d\x8b\x79\xc7\x00\xba\x17\x8d\x2c\x2a\x86\x0c\x11\xc3\x31\xd3\xfa\x26\xd7\xf4\xa4\x29\xe8\xab\x5e\xae\x47\x8a\x18\xfa\x47\xfa\xa1\xb2\x22\x84\xe0\xdf\x8d\x59\x5a\x76\x57\x12\xec\xa3\x74\xeb\x81\x3d\x92\x26\xd6\x15\xf0\x6e\x01\xf4\xcf\x4e\x4d\xd5\x26\x71\x48\x29\x7e\xcb\xef\xcc\x51\xb3\x2f\xe7\x8f\x32\xbc\x82\xfe\xbf\xfc\x8f\x90\x79\x0e\xc2\x90\x41\xca\x03\x47\x36\x18\x82\x91\xe3\x07\xc4\x5c\x47\x2c\x24\x8a\x43\x69\x04\xd3\xc4\x63\xca\xff\xea\xde\x53\xcf\x36\xff\xf3\xbe\xce\xd9\x90\xf2\xf9\x9f\x7d\x9f\x8f\x60\x76\xfe\xcb\x3d\x57\xb0\x36\x1f\x86\x2f\x77\xee\x03\x90\x2b\xc8\xe9\x37\x36\x2a\xdc\x18\x5d\x70\x4d\x31\x42\xac\x43\x43\xba\x60\x13\xdd\x05\xe5\x94\x43\x6a\x19\x5f\x41\xbf\x58\xf9\xa2\x1f\x57\x26\xb2\xc8\xbc\x4e\xca\x37\x0d\xf5\xeb\x86\xa1\xc6\xbc\x44\xc0\xb2\xa3\x07\xe7\x08\x0a\x0a\x32\x1f\xea\x71\xeb\xc6\x72\xfc\x4d\x27\x65\xfd\x52\x28\x32\xae\xf9\x52\xdf\x17\xa7\xcc\xb0\xbe\x0c\x7a\xbf\x3c\x2d\xd0\xa2\x59\x74\xb0\xeb\x28\x59\xc0\xbc\x3e\xe4\xbe\xb3\xf5\xfd\x00\x56\x0d\x3a\x85\x22\x25\x62\x33\x7a\xcf\xb2\x63\x8b\x2e\x53\x8c\x96\x97\x60\xe1\xaa\xe0\xe6\xbf\x25\xd5\x68\x05\x0c\xca\xb3\xfa\x01\xec\xf4\x86\x9a\x96\xa6\x20\x0e\xa0\xe9\xa1\xaa\xc4\x7a\x62\x2e\x58\x99\xfd\x46\x7f\x09\x5b\xba\x83\x8f\xee\xc7\xa1\xe0\xb6\x2f\xc7\x94\xd6\xa6\x2c\x2b\x66\x69\x4b\x18\xcd\xc3\x2f\x6b\x96\x6c\x9d\xc5\xe8\xce\xe5\x01\x83\x20\xaa\xc2\x73\x7f\x25\xc2\xf0\xd1\x75\x65\x5a\x52\xee\xcb\xee\xd3\x74\xe8\xe1\xb3\x36\xd8\x24\x3d\xf8\x0c\xfd\x1a\xc2\x02\x65\xf2\xe0\xad\x6d\xe6\x1b\x1c\xde\x87\xcb\x3f\x62\xbd\xc1\xa5\xc5\x79\x59\xe0\x28\x55\x0e\xb9\xa3\x4d\x89\x2a\xbc\x98\x0d\x3a\x58\xfd\xc6\x24\xd4\xe1\x52\x3a\xfa\x70\xad\x1c\x3b\x37\x43\x2d\x6f\x58\xfa\x6d\x19\x3c\x6a\x64\xb8\x40\x5a\xe2\xac\x61\xa6\xe8\x85\x9d\x29\x2e\xd1\xb0\x5f\x41\x13\x1f\x3c\x8c\xdb\x9f\x0b\x98\x3c\x06\xb4\x91\x6a\x58\xd5\xa3\x2b\xbe\x04\x4b\xe5\x3e\xc0\xb2\x94\xa4\xf6\xb0\xcb\x71\xea\xdc\xd4\x20\x40\x22\x77\xfc\x0c\x96\xe3\x9e\x62\x5a\xd6\x8d\x7a\x79\x66\x8f\x6a\xb9\x0e\x55\x43\x15\x78\xff\xb9\x7f\xfa\xf7\xe0\xae\x56\x93\x78\xa8\x82\x3a\xe2\xeb\x34\xd3\x78\x4a\x3b\x71\xb0\x8f\x04\xe4\x52\xf8\x7b\xf5\xc4\x36\x3f\x9e\x0a\xa0\x99\x2e\xbc\xd9\x88\xae\xe1\x79\x60\x40\x4b\x86\x7e\x25\xd9\x38\xec\x9e\xc9\x6c\x43\xa5\x90\xc9\x80\x84\x05\x29\x90\x0f\x3f\xee\x7e\x1e\x90\xcf\xa7\xa3\x2e\xbf\x94\xba\x02\xa1\x75\x10\x17\x68\x00\x4a\xfd\x4b\x64\xd6\x43\x40\xd2\xe3\xae\x15\x07\x68\x58\x8d\x91\xc3\x1a\x30\x56\xd9\x4b\xd2\xaa\x50\xed\x89\x99\x6e\x7f\x09\xb2\x8a\x6a\xfa\x8c\x42\x73\x8a\x70\x06\x02\xcb\xb5\xa0\x67\x50\xc7\x51\x1e\x7d\xd9\x22\x20\x0b\x90\x55\xa7\x94\x68\xeb\x7b\xc4\x29\x0e\xd0\x8a\xf1\xe9\x12\x48\xd5\x2b\x70\xaa\x57\xaf\xc6\xc4\x50\xc6\x7c\xb4\xed\x0a\xcc\x34\xdc\x31\x40\xc8\xcb\xf6\xf7\x49\x03\x5e\xad\xfc\x45\xba\x6a\x83\xd8\x3a\x68\x95\xe3\x3e\x5f\x4e\x56\xd5\xa7\x7c\x40\xf6\x7b\x51\x1c\xe5\x40\x4d\x5b\x5a\xf5\x9f\x76\x91\xcf\xb6\x2c\x2a\x6c\x3f\x44\x45\xfd\x72\xae\xc8\xab\x03\x0b\x7d\xdc\x17\x7c\x24\x69\x78\xd2\xb0\x2c\x5d\xb1\x6c\xaf\xb8\x56\xdf\xca\xcd\x28\x85\xad\x0d\xad\x11\x61\x20\x60\x2b\x57\x5b\x2e\x6d\x69\x71\x8e\x60\xb0\x49\x05\x83\x18\xb2\x34\x9d\x86\xf6\x34\x66\x05\xa9\xc3\xe8\x3e\x09\xac\x73\xb7\x73\xc8\x16\x63\x48\x52\xa1\x1f\x72\x84\xfc\x0d\xf6\xc8\x5c\x6c\x94\x0f\xf9\xd1\x20\xac\xbc\x36\x8f\x56\x59\x03\xdf\x1a\xd0\x59\x34\x41\x6e\x5a\xeb\xaa\xe1\x16\xd8\x7d\x00\x5d\xe1\x2a\xd3\xe9\xf5\xfb\x7b\x6b\xf6\x0d\xa8\x0c\x56\xeb\xb3\x9d\xbc\xb0\xab\x59\x05\x49\xda\x0e\xea\x05\x73\x21\xe8\x2b\xd0\x40\x9e\xa4\xe6\x2d\x1e\xbc\x41\xd3\x07\xc5\x06\x97\x75\xe4\xc3\x97\x9a\x0f\xc2\x4d\x1e\xc8\x37\x02\xbf\xdd\xc0\x50\x1c\x31\xc9\xdf\x31\xec\x6f\xd6\xb8\xa2\x25\x63\x76\xff\x97\x39\x38\xed\x46\xf5\xb4\xfa\x67\x11\x83\x15\x30\x53\x82\x04\xdf\x40\x63\xbb\x61\x57\x7e\x60\x0e\x25\x42\x3a\x89\x69\x33\x4b\x7e\xac\x5e\x02\x12\xa0\xb1\xde\xb0\x53\xe2\x58\x79\x9d\xc9\x63\xd5\x42\x70\x02\xa9\xdf\xd2\x93\x64\xdc\x5f\x4c\x6c\x80\xb8\x2f\xdf\x6d\x67\xb2\xd2\xb7\xd2\x37\x4d\x8d\x3e\x72\x76\xc1\x68\x55\x38\x6a\xdf\x84\x69\xcd\x92\x2b\xad\xf7\x88\xfb\x2e\xd8\x86\xee\x74\xe4\xe6\xf3\x11\xf0\x54\x8a\xe4\x12\x64\xb9\xc7\xbc\xb4\x68\x8d\x14\x0a\xbc\x50\x17\x67\x9d\x05\x7d\x9f\x17\x33\x88\x7a\xc4\x0d\x11\xd6\x07\xa9\x25\xe6\x9a\x82\xd2\x7c\x06\x20\x42\xe8\x55\xd2\x96\x5a\x79\x55\x1b\x1a\xa5\xa3\x91\xa2\x7a\xeb\x55\xaa\xc5\xd0\xd7\xe3\x86\x0d\x59\x81\xa3\x9d\x66\xf8\x01\x20\x79\x9a\x60\x4e\xf1\x3c\x03\xbd\x7a\xfc\xa7\xc4\x42\x84\x7c\xc1\xe4\x04\xba\x41\x4f\xed\x66\xef\x1a\x59\xb3\x2a\xd4\xb8\xf7\x71\xc5\xad\x9e\xcd\x56\x47\xce\x0a\x68\x79\xf2\x91\xb0\x0f\xc8\x70\x30\x5a\x0e\xfe\xda\x6b\x96\xaf\x80\x4c\xd7\x21\x5e\x7f\x21\x5e\x1b\x2b\x15\x78\xd7\xfb\xb8\x81\x6f\x15\x2c\xd6\xcd\x9b\x87\xe8\xcc\xe3\x54\x02\x25\xbb\xfe\xa8\x39\x6a\xe6\x98\x25\xaf\x64\x36\x24\x13\xe2\x52\xae\x6c\xcd\x8f\x51\x18\xf2\xc7\x15\x5a\x09\x18\xf7\x8f\xbc\x63\x5d\x45\xd2\xf6\xd8\x5c\xc5\x9f\x01\x67\x60\xe7\xc1\x26\xaa\x33\x5b\xad\x6d\x7b\x36\xf4\x2a\x22\xe3\x3e\x48\xa9\xee\xea\x15\x43\x77\x59\xea\xf0\xb1\xe4\x92\xf7\xde\x9b\xc3\xdc\x9b\xd5\x3e\x69\xbc\x02\x40\x3b\xb7\xb1\x39\x2f\x3e\x85\x3d\x2d\x22\x65\xd6\x11\xa4\x56\x31\x52\x1f\x51\xfb\xf5\xb5\x7b\xe5\xce\x0d\x96\xd7\xce\xef\x02\x86\x94\x39\x63\x76\x79\x22\x99\xcb\xc1\xd4\x2c\x33\x1b\x62\x75\x16\xc8\xdd\x8d\x95\x06\xc3\xaf\xdc\xc8\x34\x36\x4e\x06\xcd\xbf\xd7\xd6\x10\xa9\x19\x4b\x17\xfb\xc9\x84\xb0\xe6\xb4\x47\xcc\x15\x08\xb9\x51\x17\xcc\xc0\x91\x09\x1e\x0c\x09\x39\x35\x73\x60\x4f\xb1\xd5\xb4\x3e\x6f\x73\x6c\xe6\x22\xc7\x52\x5f\x7e\x7f\x75\x55\xad\xfa\x78\xd1\xcb\x6d\x66\xfc\xba\x0b\x80\xf9\x8e\x92\x3a\x2a\x6a\x6f\x82\xcf\x2a\xe8\x28\xa9\x5c\x41\x16\x9d\x40\xad\xe0\x12\x95\x0d\x31\x24\x6f\xf1\x27\x68\x6e\xba\x61\xaf\x65\x6d\x60\x0d\xe0\x58\xa3\x89\x0b\x7b\x26\x36\x79\x12\x3f\x55\x83\x88\x88\xa2\x3c\xb5\x1d\xf0\x59\xb9\x26\xe8\x6b\xd6\x25\xff\xc7\xc2\xae\x70\x32\x87\xae\xee\x1a\x38\xe8\xa1\x01\x74\x31\x39\xda\x6c\x57\x9a\x4b\x25\x76\x67\xdd\xc1\xc6\x37\xb5\x82\x3f\x55\x50\xed\x8a\xa7\xdb\xda\xfb\x60\x9c\xf1\xe1\xf6\x9e\xca\x20\xeb\x43\x7e\x92\xc5\x07\x45\x2d\x1d\x3e\xca\x6b\x91\xed\x77\xbf\xac\xd6\x99\xe4\xd9\xa0\x6f\x1b\x97\x38\xfd\x66\x7a\xfb\x1c\xd5\x5a\x82\x25\x7a\x21\xc1\x3d\x50\xa7\x57\xf0\x66\xed\x43\x3b\x44\xcd\xd8\x74\x8f\xcd\x9a\x82\xf6\x7a\x46\xee\x3f\x38\xae\x51\xeb\xf9\xf8\xc9\x96\x49\xbd\x4d\x07\x70\xb0\xfa\x61\x0f\xda\xea\x7e\x02\x32\x34\xcb\x76\x4c\xa7\x7e\xd8\x82\xff\x9b\xe8\x60\xb6\xe9\x7c\x74\x49\xb3\x72\x78\x30\x61\xe3\xf9\xe3\x5b\x91\x90\x59\xd3\x7e\x00\x03\x76\xe1\xce\x11\xfa\xaf\x00\x04\x7e\xad\xe7\xc6\xd2\x05\x2a\xb7\xe1\x4e\x43\xf7\xb0\xf7\xd8\xd6\xef\x30\x8b\x30\xc8\x69\x4d\xfc\x84\x82\xec\x06\x2d\x1a\x22\x7b\x01\x77\x13\x49\x76\x6e\x41\x49\xb0\x8b\xfb\xf0\x54\x7a\x68\x48\x1e\xa1\xc0\xda\x72\x0c\xfc\xf7\x09\x98\x67\xd1\x18\x81\x69\x25\xa9\xf0\x3a\x5b\x98\x7f\xe7\x8c\x74\x2d\x70\xbc\x25\x77\xd3\x5d\x72\xdf\x76\xd7\xbe\x69\x3a\xd6\x25\x17\xf9\x61\xba\xcb\x41\x3e\x5d\xcb\xf3\x37\xeb\x19\xa1\xff\x20\xb7\xf6\xf4\x2d\x75\xd7\xfc\xd4\xb7\xa0\xbb\xca\x3c\xc4\xfe\x03\xaf\x78\x59\x6f\x91\xd8\x46\x58\x5c\xac\x7f\x42\xb5\x94\x5b\x45\xf2\x25\xc1\x9f\xfb\x25\x61\x5c\x20\x5c\x0f\x51\x55\xd1\xc5\x10\x52\x1a\xd0\x56\x61\x29\x11\xfc\xfc\xa6\x21\x49\x57\xb3\x62\xf8\x4d\x94\xd6\xe3\x36\x65\x89\xaa\x9a\x45\xf9\xc0\xe8\x9a\xe6\x24\x74\x22\x57\xed\x52\xc8\x5b\x07\xa3\xf0\xc8\xab\x07\xd8\x75\xde\x0b\xa0\xb7\xb8\x6b\xda\xf2\x1d\xf5\x06\xdc\x3a\xf8\x7d\xb7\xaa\x7c\x54\xe4\x59\xd7\x12\x5b\xba\x5a\x41\xbd\xe4\xef\x35\xe6\x11\xa8\x89\x51\x2b\xf6\x30\xbb\x8a\x7e\xbb\x70\x94\x35\x02\xce\x3b\x84\xe4\x12\x1e\x8b\x6f\xc2\xbe\xa9\x59\xda\x55\x77\xb8\x76\xf6\xc1\xf3\x15\x66\x24\x78\x13\xe2\x89\x67\x89\xb7\x17\xb2\x40\x80\x2c\xe8\xa4\xbd\xd8\x88\x8f\x1d\x24\x4e\x05\xdf\x9c\x19\xaf\x6f\xed\x2a\x26\xa9\x77\xb3\x54\xa2\x88\x61\xd5\x42\xa0\xc9\x53\x38\xda\x6d\xf5\x1d\xdd\xa6\x77\x95\x66\x6c\xde\xed\xb0\xba\xe0\x23\x00\xde\xaa\xcd\x75\x4d\xbb\x15\x5c\xd6\x2e\xc0\x9a\x05\x21\xeb\xd6\xbb\x8a\x00\xb3\xae\x54\xd7\x5c\x18\x34\xe0\x0b\x86\x97\xd5\x89\xf4\xe7\x74\x56\x0f\x2b\x9f\xaf\xf3\x00\x23\x0e\x12\x75\x11\x88\xd8\x95\xf1\xfb\xe2\xa5\x2e\x5e\x19\x7d\xcb\xce\xa4\xaa\xc2\x21\xc2\x59\xf9\x08\x29\xcc\x2e\x1f\xfa\x95\x99\x09\x18\x77\x53\x56\x7f\xe7\x1c\x57\xad\x20\xf2\x2b\xe4\xaf\x35\xc3\xba\x75\x7e\x57\x00\x79\x9d\xf8\xeb\x7c\x92\xf3\x82\x1a\xb9\xab\x6f\x2e\x38\xdf\x6c\x35\x14\x42\xc7\xbd\xcb\x53\x11\x14\x37\x43\xad\x4e\x7b\x1f\xab\x70\xb2\x79\x0e\xb0\xac\x2d\xf8\x4b\x8b\x48\x05\xae\x03\x4c\x6b\x6c\x35\xb1\xd3\x09\xa3\xe1\x68\xad\x96\xe5\xbb\x83\xf1\x6a\xe7\x32\x7a\x81\xfb\x4e\x97\xdf\x59\x38\x30\x59\x26\x23\xb0\x43\xd7\x80\x97\x3a\xe9\xcd\x94\x02\x1b\x97\xda\xa3\x47\x63\x66\xf7\x69\xd2\x51\xd0\xb1\xcf\x0f\x0e\x01\xde\x5c\x1d\x1d\x08\x30\x40\x69\x4d\x2c\x0c\x8a\xd9\x72\x0a\xeb\x17\xd1\xab\x7a\xb7\xd3\x28\x6f\x47\x97\x24\x1b\xd8\x25\x41\x10\xf0\xbc\x53\xe1\xaa\x0b\x7c\x1c\x90\xaa\xdc\x45\xfa\x7b\x2a\x63\x2f\xbd\xad\x49\x00\xf0\x25\x6c\x0e\x9a\xa6\x17\xfe\xdc\x48\xcf\x1c\xd4\x55\x86\x7e\x00\xb8\x2a\xca\x22\xba\x12\x6a\x18\x98\x0d\xaf\x22\x49\xd8\xc9\x83\xad\x9c\xcf\x69\xd5\x82\xaf\x74\x61\x18\x2e\xde\x14\x7c\xeb\x7a\x1a\x3b\x75\xe5\x81\x29\xaf\xae\xb3\xad\x92\xd7\x21\xc3\xd7\xcd\x58\xfd\x22\x53\x75\x0f\xb0\x24\x6d\x9e\xca\x81\x04\x6c\x79\x0c\xad\xb1\xc4\x67\x05\xb1\x99\x1c\xce\x4f\x22\x7f\x25\x0c\xd5\x25\x87\x67\xca\xdb\x8c\x18\xcc\x38\x52\xab\xe1\x05\x01\xdd\x07\xc5\x48\x78\x9a\xc7\x1e\xd6\x50\x6a\x4f\x96\x9b\x73\x59\x73\x83\x9e\xee\x5d\x41\x1e\xab\x40\xa9\x7b\x62\xfc\xb6\x3b\x3f\x36\x0f\x30\x19\x54\x4c\xc1\xf0\xdc\xe0\x3f\x0e\x64\x26\x72\x53\xd4\x4b\x48\xeb\x1b\x3a\x4c\xdf\xbe\xc2\xfa\xaf\x84\xac\xbc\x75\xa0\xe4\x17\xf7\x64\xeb\x19\x81\x76\xb1\x06\x61\xbc\x10\x6e\x0b\x66\x6b\x59\xc8\x77\x1d\xe7\x7a\xc8\xd0\x10\xb7\x80\xad\x81\x0d\x05\xad\xf5\xb0\x16\x34\x53\xa7\xbd\x68\xad\x37\xae\x3c\x54\x0e\x49\xc0\x9a\xe9\xf3\xc7\x73\xc8\x43\x5e\xb9\xb5\x85\x6f\x6e\x5a\xe8\x4f\xb0\x66\xe8\x54\xba\xa2\xdf\x56\x5c\x2e\xe8\xa4\xf8\xd7\xc6\xca\x88\x8f\xf1\x43\xb6\xd6\xbf\x7a\x16\xd0\x40\x42\xa8\xa6\xdf\x00\x7c\xfb\x31\x9d\xb5\xd5\xf9\x97\x8f\x24\xdb\x69\x69\x3e\xd1\xc7\x95\x89\x81\xfe\x0d\x59\x33\x7f\x5c\x65\x9b\x00\x04\x65\xf7\xca\x4a\x89\x84\xdb\x19\x4a\xdd\xbe\xcb\x78\x5d\x40\x7d\x8d\xa9\x9e\xaf\x79\xae\xfd\x0d\x87\x9d\x4b\x43\xe2\xc2\x45\x2a\xaf\x25\xec\x51\x73\x41\x9f\x1a\x18\x7c\x65\x85\x5e\x9b\x4d\xe5\xa9\xc3\xb4\xb7\xca\x0d\xc4\xd5\xf9\x79\x15\xbe\x36\x76\x84\x5c\x16\xb1\x5d\x2d\xf6\x22\x8d\x02\x6f\xd8\xdb\xbb\x7b\x0c\x45\x1a\x91\x8b\xc0\x45\x01\xb1\x08\xdf\x5e\x7a\x60\x60\xa7\xf5\xf8\x12\xd2\xa7\x31\x1d\xea\x76\x43\x59\x7f\x22\xcc\x11\x6d\xa0\xfe\x03\xd6\xea\x59\xfa\x3c\x42\x17\xc5\xfa\x6a\x6c\x56\x92\x90\x69\xf3\x48\xfa\xfd\x4d\x3f\x06\xa0\xac\x50\xe5\x90\xbb\xdf\x8a\x0d\x52\x67\xdf\xa8\x4a\x84\xbd\x5d\xf8\x7d\x17\x45\xb6\xf3\x14\x90\xc4\x14\x2a\x0c\xc7\x7f\x70\x58\xdb\x1f\xca\xdf\xc2\xeb\xfe\x5d\x08\x12\xf6\xa7\xeb\x8f\x1d\x0a\x9b\x3c\x83\xf5\xf4\x67\xdd\x92\x4a\x4a\xd6\x5f\x23\x99\xfd\x41\x6a\xcd\xdb\xb6\x7f\xd9\x1a\x81\x7c\x2d\xfe\xbc\x7d\xfe\x76\xab\x9c\x18\xc1\xf5\xad\xa7\x95\x4f\xe6\x1f\x48\xc2\xbe\x19\x5c\x5d\x9b\xbe\x67\xba\x8b\xdf\x8d\x02\xf2\xce\x87\x4b\xdc\xbe\x31\x88\xe1\xd3\xd1\x17\xc8\x76\x80\x53\x18\x98\xa6\x77\xf5\xc9\x6b\xe3\x84\x44\xd7\xa4\x28\x9b\x77\x9a\x86\xc4\xe5\x18\x95\xf0\xfe\x1e\xdd\x33\xf0\xcf\xaa\x19\xa6\xbd\xbc\x5e\xb5\x7a\xe5\xfa\x82\xb7\xe5\x95\x18\x3f\xfa\xda\x9b\xc2\x0f\xa8\xad\x83\x9f\xc0\xab\xfa\xc0\x8e\x80\x9d\x04\xed\xbf\xe8\xf4\x64\xd5\x47\xb2\x2b\x0d\xcf\xee\xc1\xf4\xe4\x40\x23\xcc\x68\xe7\xda\x2e\x49\xd0\xb4\x16\x8e\x83\x5e\xb5\x36\x3d\xb1\x2f\x24\x32\x72\xb1\xd9\x1d\x34\x5a\xc7\x3e\x61\xa7\xb6\x3e\x07\x5b\xb5\x42\xd5\x8f\x68\xd0\x3b\x9c\xc7\x93\xbf\x78\x27\x5e\xe5\x70\x94\x67\x11\xa5\x35\x08\xaa\x08\x54\xe4\x9c\x75\x1c\x62\x2d\x60\x95\x88\x66\x81\x5d\x5f\x80\xbc\x79\x01\x01\xde\x34\xce\x58\x56\x61\x19\x2f\x77\xb2\x3d\x65\x41\xbc\x56\x47\x63\xed\x6b\x2a\x4a\x1d\x2a\x59\x1f\x8f\xad\x2e\x2b\xb8\xfc\x08\xb0\xaf\x17\x77\x26\x60\x2f\x7a\xc8\xe2\xe2\x4e\xef\xb7\x6f\x66\x6a\xb9\xb8\x4e\x7a\xf5\x69\xf9\x6b\xe8\x56\xe6\x93\x90\xf7\x7a\x86\xf5\xe0\xf7\xe9\x05\xc0\xb5\x6e\xe1\x54\xe2\x67\x4a\xee\x3a\x09\xf6\xda\x48\xda\x85\xdd\x69\x6e\x56\xf7\xf6\x85\x10\xa0\x30\xd3\xdf\x1f\x81\xa8\xd6\x17\xd6\xbf\x24\x40\x2d\xa3\x15\x1c\x17\xdb\x68\xb1\xdf\xcd\xdc\xbf\x04\x8b\xf5\xed\xe4\x7f\xd1\xb9\x79\x65\xf5\x33\x61\x7c\x11\x23\x7b\x91\x67\x9b\x43\xae\x17\x4c\x59\x89\x39\x60\x61\x92\x70\x73\x1b\x34\x7a\x49\xab\xfc\x95\xbb\x8d\x09\x3c\x56\x4f\xb7\x94\xbd\x17\x44\x09\x7d\xea\x6a\xfb\x82\xd2\xbd\xf8\x69\xa6\xe5\x55\xc4\x2b\x35\x97\xfd\x4b\x34\x64\x4c\xb3\xfc\xd0\x66\x77\x12\x84\x79\xa5\x59\x9e\x4a\xa0\xc3\xba\x24\x99\xe8\x57\x2a\xe2\x9e\x83\x16\x8b\x7f\x5f\x00\xbd\xca\xd1\xf9\xeb\xba\x25\x44\xc2\xee\x0a\xd1\xfd\x65\xa7\xce\x26\xf0\x31\xb8\x35\xc3\x8d\xbe\x93\xf6\xfa\xeb\x6d\xe3\xdf\x12\x70\x05\x07\xc4\x5e\x6e\x6c\x2c\xe3\xb3\x57\xc9\x83\x1d\x72\x1d\xd3\xa2\xe5\x82\xeb\xf0\x0b\x6f\xc6\xb7\xac\xe9\x7d\x1c\xb5\x04\xf2\x35\xed\xea\x1e\xff\xaa\x1b\x6a\x3d\xf4\xeb\xb7\x68\xd6\x2e\x70\xeb\x3e\x5e\x92\xb2\xf2\xd1\xdb\x86\x71\x85\xdd\x80\xb0\xf9\xef\x42\xb8\x3d\x0b\x9e\x20\xf4\x9b\x67\x64\x9a\x65\xce\x9b\x39\xa0\x05\xa3\x2f\xf6\x85\x61\xc5\x1e\x88\x58\x7f\xf0\x7e\xad\xa9\x9b\x23\xe4\x06\x12\x73\x81\xb5\xb5\x06\x6b\x0f\x5c\x3b\x4f\x2c\x6d\x3a\x2f\xbf\xb9\x93\xf3\x8b\x7f\xed\x63\xca\xe6\x30\xdc\x1a\x83\x3e\x15\xb0\x43\xa9\x0d\xa0\x76\x85\x31\xfd\xda\x37\xe6\x5a\xb8\x40\xdf\xab\x3a\xb9\xfe\xba\xfc\x2c\x8a\xa4\xbf\x8e\xcb\xbf\x11\xd6\x11\xdb\x57\x7f\x27\x2f\x81\x03\x70\xf6\xc4\x79\x5c\xab\xd7\xce\xbc\x18\x60\xc8\x7a\xeb\x58\x87\x7c\xad\xbf\x60\x68\x37\x00\xea\x19\xc3\x96\x66\x3a\x89\x53\xd9\x71\x48\x67\x8b\x7a\xd5\xe5\xc9\xaf\xa0\xb8\x1e\xfd\x1e\x34\x81\x6b\xdd\xf3\xc7\x06\x80\x0c\xdc\x9f\xe9\xfe\x6d\xbc\xa5\x92\xae\xd5\xb9\x11\x6d\xbf\x88\x9e\x76\x02\xed\xc5\xbd\x55\x40\x06\xf5\xdb\xea\xc1\x6c\x2b\x0b\x0b\x55\x7b\xae\x75\x2e\x4d\x27\x1e\x48\xe9\x60\xd2\x06\x6b\xd7\xfa\x27\x76\xf0\xf2\xcb\x39\x9e\x16\x7d\x91\x76\x30\x4e\x05\xde\xd3\xcc\x42\xef\x1e\xc5\x6b\x7d\x04\x5e\xc9\xcc\xe4\x79\xca\x6d\x85\xc1\x73\xe7\x3a\xfd\x6a\xf7\x13\x2c\x9c\xb8\xa6\x2a\xe6\x28\x34\xe2\x49\x94\x9a\xad\x78\x00\x1d\x2d\x5c\xc5\x9b\xa3\x19\x52\x1c\x28\x9a\x18\x42\x02\xc3\x5b\x7c\x8a\x6a\xcb\x77\x0f\x06\x9a\x82\x67\x5b\x00\x6d\xc0\xa0\xe2\xb2\x8f\x02\x57\xc1\x6e\x6d\x93\xbe\xc4\xc5\x81\xb6\x12\xb8\xd2\x51\x24\xe4\x76\xfd\x94\xd7\xb1\xcf\xc4\x3d\xc6\x78\xad\xd1\x9e\x64\xc1\x03\x92\xbe\x9c\x8b\xab\xb7\xe4\x52\x02\xdc\x35\xbd\xdc\x7d\x74\xa9\x38\x92\xfb\x6d\x53\x9f\x3c\xe8\x7f\x01\xf5\xcb\x2f\x0f\x01\x9b\x8e\xb2\xcc\x1f\xe6\x40\x93\x9d\x2d\x33\xd6\x88\xf7\x74\x5b\xd3\x31\xd6\x68\x43\x97\xb4\x71\xcd\x4f\x50\x3e\xb8\x19\xeb\x8c\xce\xac\x55\xcf\x96\x8c\x09\x2b\x29\x98\x58\xe1\xbf\xa7\xdd\x74\x85\x99\x9f\xd7\x82\x01\x21\xc1\x64\x2f\xe5\xab\x9c\x8c\x13\x83\xb5\x33\x69\x18\xe3\x95\x4f\xcd\xb9\x3a\xe4\xe9\xf1\xe4\x30\x24\x34\xd3\x80\xbb\x2b\x11\xd0\x0b\x5f\x8a\x92\xfa\xad\x20\xdd\x0e\x00\x78\x4b\xa2\x90\x0b\x6c\x4e\x12\x24\x6a\x1b\x39\xd5\xe3\xc6\x1a\xf6\xd7\xb5\x2f\xb8\x77\xf1\x78\xb9\x45\xeb\xec\x02\x3b\x71\xc6\x6f\xeb\x71\x33\x08\xbd\x18\x22\x1d\x2c\x28\xc4\xdd\x0b\x0f\xba\xd7\x68\x5b\xa3\xa1\xfd\x00\xb8\x88\xae\xac\x17\xf3\x1a\x1b\xff\x1f\xa7\xcb\xa6\x2d\x96\xad\x91\x83\xcb\x1a\x88\x5f\xc5\x11\x9a\xf5\x48\xf3\x48\x28\x2d\x72\xdb\xb3\xd8\xc2\x9e\x05\xed\x7b\xf6\xbc\x3a\xef\xce\x3a\xf8\xb7\x70\xe6\x19\xc1\x36\x34\x79\x20\x15\x38\x32\xb6\x6b\x4f\x66\xae\xcb\x2a\x73\x98\x81\x13\x86\x87\xcd\xab\xea\x93\x60\xfd\x53\x8d\xb2\x13\xef\x08\xa8\xbf\x6e\xc3\x37\x42\x77\x87\xf7\xd5\x79\xc1\x2a\xe3\xed\xce\x3a\xb2\x48\x37\xcb\x59\x1f\xd7\xce\x61\x12\x47\x04\xc7\x21\x85\x57\xf4\xac\xdd\x7e\x11\x2b\x0c\xd7\x85\xe6\x25\x34\xc5\xaa\x3f\x10\x95\x19\xf7\x8a\x48\x72\x15\x52\x2e\x24\xb9\x0b\x50\x53\xdf\x9a\x9e\x51\xd1\x9e\x1e\x1a\xed\x8d\x9e\xb3\xc8\x6d\x76\x16\x88\xfd\xf0\x58\x27\x6a\xe4\x9f\x71\xe7\xa6\x6b\x1c\xdd\x8f\x4e\xca\xb0\x0e\x12\x03\x0d\x1d\x9f\x68\x33\x73\x18\xaa\x65\x00\x19\x7e\xf0\x5a\x4f\xd5\x69\x67\x9d\x5e\x1f\x08\x01\x4c\x8a\x3c\x47\x8b\x59\xd4\x49\x12\x88\x69\xd9\x91\xf0\x57\xfb\x02\xcf\x89\x38\x5f\x04\xa8\x70\x03\x5e\xbf\x55\x0d\x94\x9d\x1e\xe6\x74\x49\xdd\xfc\x74\x46\x42\x68\x16\x11\x35\x4c\x23\x1f\xfc\x3a\x03\xb5\x86\xcb\x7c\x0a\x22\xbc\x5d\x7e\xe3\xf3\x7a\xc5\xd6\xed\x2b\xd4\x0b\x5e\x1c\x63\x35\xb0\xf2\xae\x81\x4d\x14\xb4\xa9\x96\xfc\x04\x50\x0b\xf5\x78\xa3\xf4\x20\x44\x13\xa6\x4f\xda\x1d\x8d\x81\xf6\x33\xfd\x83\x56\xb8\xf7\x04\x60\x73\x3b\x9e\x84\x27\xc0\xaf\x55\xc1\xe2\xbe\x9d\x10\x11\xd2\x9e\x12\x02\x98\xce\x30\x13\xc4\xc5\x68\x0f\x9c\x7c\x73\x8a\xc1\x7a\x01\xf3\xe3\xb6\x5a\x25\xf0\xd6\x34\xc0\xc2\x84\x55\xda\xbb\xb0\x5c\x5c\x0d\x09\x6c\xda\x4f\x47\x1d\x1c\x7f\x6a\x4e\x0a\x51\x41\xcb\x36\xe0\xd0\xc9\x23\xf8\x79\xa5\x0e\x8c\xb0\x33\x13\xf8\x78\xab\x61\x71\xbc\x81\xcd\x18\x1a\x94\x18\xb0\x9c\x43\xe6\xca\x70\xef\xe3\xc5\xfc\x0c\x9b\x02\x2b\x00\xcb\xda\x4b\x3f\xea\x25\xc0\x1e\x13\x67\x5f\xbf\xbe\x9c\x80\x9d\xd7\xfe\x0b\xad\x19\xc5\x8a\x5a\x71\x61\x23\x0e\x2c\x61\x0f\x0f\xd5\xec\xfc\x60\xba\x06\xd0\xc2\xb1\x04\x21\xc3\x6d\x55\x72\x86\xe3\x0d\x17\x5c\xf8\x60\x9b\xca\x4b\x87\xa4\x2a\xc9\x19\x26\x66\xf2\x72\xfa\xca\xd6\x4c\x3b\xf6\x20\x0e\xe3\xe1\xa1\xd1\x45\x23\xe5\x70\x71\xd6\x7e\x2e\xde\xc2\xb5\x07\x5a\x3c\x68\x34\xea\x83\x1d\x3c\x06\xf8\xf4\x7a\x3c\x4a\x5f\x84\x33\x3a\x40\x07\xe0\xce\x03\x4d\x79\xb5\xa0\x0b\x07\x0e\x73\x6a\x5f\x62\xd5\xaa\xc7\xd5\xe1\xe9\x88\xb3\xe9\xa8\x1c\x1a\x44\x5e\x2b\x17\x64\x85\xdd\x3f\x07\x49\x14\xed\x24\xc4\x76\x88\x3f\x3c\x5d\xc2\x40\x9f\x04\xc2\xe2\x03\x14\x73\x90\x0d\x33\xc8\x1a\x93\xda\xed\x88\xed\x0a\x5e\x2a\x3e\x2f\x23\x32\x24\x74\x48\x56\xb6\x7e\x8b\x9c\x08\x18\xf9\x7e\xb7\x1f\x92\x52\x24\x82\x44\xfc\xdf\x42\xfc\x66\x5f\x99\xf3\x06\xbb\x9e\x20\x86\xc6\xc6\xaa\x5d\x03\x6f\xab\x59\x95\x80\x54\x3a\x1e\x40\x11\x9c\xdb\xab\xaa\xb0\x96\x4f\x62\xf1\x23\x5e\x5c\xd0\x88\x63\xc3\xf6\x56\x05\x5a\x14\x15\x46\xb5\x36\x45\xfb\x89\x47\x92\xb7\xa5\x0a\xba\x69\xf6\x94\x82\x59\x9c\x85\x5f\x25\xa0\x58\x17\xea\x86\x09\x9f\xde\x91\xe2\x8b\x70\x46\x16\x2e\xe2\x34\xdb\xf6\xd3\xa2\x4e\x15\x86\x34\xf6\x50\x33\x0f\xed\xe8\x46\x90\x86\xd6\x0f\x91\x53\x30\x6f\xc0\xd1\xe1\xfc\xb5\x41\x56\xeb\xea\x7b\x01\x53\x30\xc0\xa2\xc1\xe3\x05\x5d\x15\xc7\x18\xf3\xdc\xac\xbb\xeb\xb5\x83\x1b\x99\x19\x99\x66\x3f\xf3\xe1\x62\x31\xad\xa4\x57\x00\xa1\x63\xd1\xce\x76\x7a\x31\x1f\x4f\x67\x4e\x71\x7b\x92\xd1\x3f\x36\x4a\x56\x1e\x1e\x79\xcb\x75\x19\x72\x8c\xa9\x52\x6d\xcc\x84\x9f\xf6\x52\x5a\x13\xb0\xc6\x82\xb0\x83\x6c\xcc\x37\x77\x4b\x7b\xe3\x28\x27\xb1\x4c\x37\xe7\x60\xf9\x61\xd7\x77\x97\x05\x3e\x46\x8b\xf6\xfc\x40\x1e\x0b\x90\xe1\xb6\x3a\xcd\x6e\xab\x2f\x7d\x54\xc9\xfc\x1f\x08\x15\x50\x3a\xee\x51\x39\xe6\x71\x38\x2a\x8c\x86\xbd\x04\x1c\x35\x23\x34\x59\x3c\x56\x7d\xea\xed\xd1\x19\xef\x06\x28\x70\xc8\xdf\x02\x23\xcf\x18\x66\xe5\x01\xcc\x65\xae\xff\xbb\x78\xbc\xac\xa4\x40\x45\x0e\x64\x6b\xd5\x61\xf6\x45\x59\x10\x5e\xea\xec\xcd\xe2\x91\x44\x42\x35\x00\xc8\x87\xa6\x01\xe8\x85\xe9\xed\xb9\x63\x45\x7b\x37\x16\x6c\x6d\xdf\x63\x6d\x88\x9d\x63\x4d\xd7\xa1\x58\x1c\x00\x0b\x35\x17\x14\x64\x2d\x6b\x66\xe4\x15\x98\x6d\xcd\x7a\x57\x36\x38\x88\x50\xa0\x35\x07\x56\x75\x56\xaa\x8e\x19\x11\xa1\x02\x4a\x32\x9f\x98\xb9\x2a\x4c\xfd\xb0\x76\x97\xdc\xf3\xc7\x1c\x70\xd0\x63\xce\x57\xc4\x42\x03\x92\xfc\x1b\x7a\xe1\xc7\x1c\xe3\xe4\x18\x2f\x5e\x1b\x0c\xb9\x34\x2e\xfb\xd3\xda\x66\xe1\xdb\x82\xbe\x1e\x88\x81\x0e\x4d\x3b\x9e\x69\x8c\xc0\x7b\xe7\x23\xfb\xb4\x5e\xff\x7c\xda\x08\xef\x65\xfd\xe1\x21\x14\x6f\x18\x0b\x44\x6d\xaf\xe8\x4b\x06\xbc\xa7\xda\x2d\x6a\x8e\x3b\xff\xf5\x28\x70\xbb\xcd\x4c\x89\x40\x21\x40\xca\xe3\x45\xde\xb7\x63\x52\x04\xf0\x36\x1b\x0a\x3b\x39\x16\x59\x6f\x6c\x75\xa1\x62\xaf\x3d\x9b\xfc\x6d\x40\x80\xb0\x9b\xd3\x3b\xea\x9b\x29\x6a\xca\xe9\x66\xd3\x4f\x27\x69\xbf\x4d\xa6\xc7\xac\x92\x49\x6e\x9e\x5a\x6c\x83\x9b\x3e\x20\xcc\xc2\xf6\x6c\x12\x8a\xc7\xa4\x21\x00\x17\x96\xe5\x77\xc6\xbd\x66\x27\xad\x33\x44\xb6\x61\x7b\x18\xbe\xec\x2e\x71\xcb\x65\x8b\xce\xa5\xa7\xd9\xc4\x2d\x99\xa0\xb4\x42\x23\xa4\xe7\x61\x86\x68\x92\xd9\x85\x7b\xcd\x03\x85\xd5\x0e\xa4\xda\x71\xf7\x99\x78\x06\x80\x9c\x15\x8b\x73\x30\xb2\x44\xa6\xb5\xe2\xb8\x69\xab\x32\xe9\x7a\x26\xca\xf9\x94\xf9\x88\x0b\x96\xbe\xed\xe1\x26\x68\xf9\x9f\xe4\xd2\x88\x6b\xe6\x96\x72\xd4\x4e\x99\x0f\x08\xe3\x6f\xd5\x67\x38\xe0\x1b\xd7\x97\x32\xef\x1a\x1b\x39\x32\xe4\x6c\x90\x00\xc0\x47\x24\x47\x2b\x06\xc1\xf0\x59\x96\xea\x35\x84\xe7\x73\x6a\x15\x11\xdf\xd9\xbb\x85\x08\x82\x46\x8b\xd2\x38\x3c\x42\xfd\x68\x56\x44\x5e\x1d\xb9\xac\x0f\xf9\x3b\x8f\x1c\x07\xdd\xb6\x40\xa7\xde\xa1\x38\xf9\xc3\x23\x35\xa3\x1a\xca\x14\xfa\xa6\x63\x3d\x4a\x6e\x22\x40\x4c\x2b\xf4\x76\x71\xc4\xb0\x4e\x71\x25\x52\x40\x18\xcc\x9c\xe3\x92\x21\x8c\x4b\x9f\xc2\xfe\x6a\xc3\xbb\x66\x7b\x90\xde\x81\x7c\x87\x78\xd2\xa4\x31\x3f\xd0\x2e\xcb\xc2\xae\x31\xe2\x8e\xf3\xca\x1a\xd1\x8b\x76\xb3\x54\x2b\xf4\xb6\x3f\xce\xb3\x8b\x13\x10\x67\xb2\xa6\x27\xe5\x60\x1c\xfd\xb4\x8b\x61\x0b\xf6\x34\xb8\x63\xe4\x67\xf7\xf7\x43\x8b\x28\x26\x1d\x42\x6a\xd5\x88\x87\xaa\xac\x89\x51\x06\x07\xf4\x86\xb9\x39\x3c\x2d\xfa\x48\x27\x09\x51\x99\x61\x87\xca\xeb\xd5\x46\x22\x8f\xb4\x6b\xa3\x70\x59\xf9\x46\x3c\xfb\x7d\x24\x62\xde\xda\xd4\x55\x46\xc7\x1f\x67\xe1\xab\x9d\x2c\x4e\xa3\x88\x0c\xfd\xc8\x3d\x55\x69\xbc\x34\x70\x40\xcc\x0c\x09\x04\x03\x2d\x5d\xc0\xe2\x50\xc5\x92\x3a\xe5\xeb\x98\xa5\xf7\x01\xc4\x47\x36\x75\x76\x04\xc2\xe4\xc2\xf6\xba\x75\xc2\x0e\x45\x9f\x01\x32\x40\xf6\xb1\xa3\xa5\x71\x32\xf0\x11\x04\x00\xb7\x3a\x53\x7c\x75\xf3\xa0\xaf\x01\xc8\x52\x2e\x76\x04\xff\x59\x42\xbc\x60\x6e\x39\x06\xb6\x81\xa2\x8f\x25\x4a\xcc\x27\xc3\xa8\xf7\xe9\x0d\x5f\xa0\xa2\xf9\x8c\xef\x35\x40\xd1\xf6\x35\xe7\x17\x75\x77\xd0\xa3\x58\xb5\xc1\xf4\x47\x8a\xc0\x1e\xe3\xf4\x76\xa6\x5b\xa5\x6a\xf5\xee\x7d\x56\x35\x43\xec\xf9\xf1\x95\x4a\xb4\x72\xed\xcd\xd7\x68\x46\x53\x61\xdc\x4b\x27\xd9\x5b\x9c\x9a\xce\x61\x7a\x9f\x13\x47\xb7\xed\x19\x22\xe4\xf7\x25\x8a\x1e\x48\xd1\xd5\x07\xcd\xb2\x4a\xec\x39\x82\xa5\xc0\x2d\x13\xa5\xe4\xae\x4d\x40\xa3\x0f\x97\x46\xd7\xba\xd6\x7a\x8f\xa5\x08\x8d\xbe\x4b\x8a\x52\x3d\xa2\x48\x78\x6f\x46\xee\x9c\x02\x37\x01\x56\xdd\xf1\xb8\x69\x99\xe6\x6a\x41\x77\x94\xd8\xec\xcc\xc4\xa5\xc8\xb2\xbf\x09\xd1\x77\xd1\x5e\xf3\xd8\xe9\x07\x03\xcf\x0a\x73\xe9\x03\x80\x0c\x38\xd6\x6d\xcf\x73\xb3\x99\x94\x01\xa3\xdc\x58\xe4\xba\x8f\xe9\x43\x34\x7f\x57\xf0\x3a\xf7\x08\xd2\xd9\xf9\x41\xd1\xb6\x66\xe6\x1f\x8d\x14\x07\xe5\xe2\x94\x7d\x50\x9a\x17\xb2\x88\xb3\xdc\xa6\x80\x4e\x0b\x8a\x8c\x18\x0f\x9c\x9f\xb8\xc4\xd9\x3d\xd0\xb4\x20\xa5\xf8\x75\x33\xa9\xdd\x7c\xde\x19\x30\x7b\x06\x00\x20\xf0\xd4\xe3\x1d\x0a\x49\xe0\x74\x40\xac\x47\xf5\x56\xad\xab\x77\xe5\xb8\xb4\x0f\x7b\x69\xee\xf8\x58\x94\xb3\x37\xc5\x09\x44\xce\x48\x16\x64\x17\x1c\x1d\xc4\x35\xcb\xb8\x41\xd1\xf9\x5f\x5a\x62\x7e\x3e\x34\x1c\x6f\xcf\xd2\x1a\x44\xee\xc1\x9e\xac\x0f\x66\xb5\x2d\xd1\xe9\x66\x0e\x7a\x8c\xf3\xd0\xd7\x80\x93\xf7\x77\x87\x1b\xbc\x5c\x1f\x2c\x72\x70\x2e\x94\xae\x1a\x18\xbc\x2f\xe0\xf9\xa6\x8f\x62\x69\x67\xd9\x07\xfe\x97\x40\x6b\xce\xec\x5a\xd8\x85\xf3\xac\x5b\x38\x20\xb2\x2e\xdf\x9a\x16\x31\x68\xc8\xb8\xbe\xaf\x88\x82\x82\x77\x4a\x54\xbb\xf5\xfd\x64\x57\x7b\x4f\xaf\x39\x20\xe8\x5e\x41\xfa\xfa\xa9\x7d\x43\xf7\xe4\x9f\x80\x9d\x3d\x77\xb8\x96\x31\x04\xc1\x03\xb5\xda\x71\xf7\x78\x80\x0f\xc2\x79\xb2\xa7\x82\x17\xd0\x1e\xc0\x61\xaf\x5a\x6d\x62\xbc\x0c\xa2\xa9\xf9\x6e\x0a\x34\x0e\x5c\x35\x4f\xb0\x75\xd2\x61\x71\x03\x9d\x35\x40\xe1\xfa\x04\xb7\xda\x7b\x07\xce\xab\xbe\x64\xc9\xe1\x6b\xdf\x6b\x4d\xd4\xcf\xa5\x1e\x1d\x8d\xf9\xab\x71\xab\x8f\xdb\xe4\xa1\x5a\xa1\x68\x7c\xc4\xcc\x71\xa1\xef\xc0\x4c\xe4\x2b\x11\xe5\x0a\x89\x63\x4c\xaf\xf3\x5a\x38\xb6\x6c\xe6\xb7\x3f\xfe\x80\x5c\x3f\x84\xfc\xa5\x39\xd0\xcc\x32\x56\x85\xff\x6d\x17\x02\x24\x49\xb5\x16\x2c\xf8\x1a\xbc\xeb\x65\xd3\x86\x01\xf6\xae\x10\x8f\xcb\xec\x9e\x1f\x06\x00\xa1\xeb\x60\x97\xeb\xed\xbc\x5f\x87\x5d\x0f\xb8\xc2\x5e\xca\xd7\x00\xc7\x8a\xdb\x49\x38\x67\xd7\x21\x26\xb3\xb9\x62\x44\x6c\xd7\xec\xf3\x13\x57\x26\xbc\xb5\x7b\xf8\x88\xb7\x66\xc5\x09\x3b\x35\x5e\x75\xfd\xa8\xa5\x36\xc8\xcd\x3f\xe2\xa7\x71\xff\x00\x60\x82\x56\x7d\x7b\x30\xc4\xae\xbe\x77\x34\x94\xf8\xde\x35\x7c\xb5\x96\xeb\x62\xcb\x1d\x89\xf5\x41\xb5\x16\x84\x15\x4a\xa8\x6b\x98\x18\x37\x3a\xc3\xb6\x57\x25\xc0\xbe\xf6\xe2\xfb\x44\xbe\x38\xd9\x29\x54\xd8\x36\xaf\xce\x37\x7d\x09\xb6\x9b\x4e\x40\x02\x76\x18\xeb\xe7\xa5\xc9\x1f\x42\x54\x9b\xc3\xf8\xa3\x26\xda\xf0\xe4\xc0\x69\xb2\xc7\xa1\x5a\x4d\xb0\x9d\x61\x15\xed\x03\x09\x49\x08\x61\xd2\xe9\x91\x98\xbd\x7d\xec\x00\xaf\xfa\x19\x48\x6f\x6b\xdc\xf8\xdb\xe2\x28\xec\x8d\xd8\x4f\xb7\xa3\xb7\x43\x30\xf6\x21\x2b\x48\xd4\xe7\x26\x10\xf5\x41\xc1\x02\xbc\x92\xcd\xd1\xe2\xc9\xb0\x3e\xaa\x0e\x0b\x61\x06\x32\x1f\x76\x17\x49\xda\xad\x7c\x2f\x31\x8d\x75\x88\xaa\xad\x9e\xc9\xbf\x55\xd5\xed\x5b\x9d\xdf\x5a\x72\x7e\x2f\x2d\x4e\x7a\xf3\x3c\xa7\x3e\xac\xc8\xa8\x44\x41\x00\x07\xe4\x97\x08\xa4\x1d\x14\x61\x6f\x24\x3c\x81\xce\xf3\x92\x5d\x73\x7f\x8e\x67\x6b\xf7\xb1\xc9\x02\x16\x36\x52\x85\x37\xda\x2e\xb9\x17\x77\x1a\x45\x3e\x0d\xf3\x4d\x09\x0a\x62\x36\xcd\xa3\x09\x95\xa1\xb0\x38\xdf\x5b\x11\x4e\x36\x43\xd5\xc4\x06\x1c\x91\x8c\x1e\xd4\xc1\x66\x73\xeb\xd6\x31\x4a\x1e\x46\x00\x4c\x36\x1f\xe9\xb2\xe5\x06\x32\x2f\x9b\x16\x5b\x01\x98\xac\x34\x5d\x93\x2b\xc0\xd9\xae\xf7\x2d\xfb\x29\x24\x71\x11\xd9\x74\xf3\x2f\x19\xd7\x9a\x67\x0d\xc9\x99\x49\x85\xd5\xad\x84\xc3\x6a\x2b\xa3\x5a\xf3\xb4\xdc\xc8\x42\x54\x97\x9c\xf9\xe6\x96\xde\xf3\x9a\x19\x7b\xbc\xd9\x25\x0c\x7a\xf6\x7e\x23\xae\xcd\xe4\x4e\x00\xd7\xfe\x01\x06\x2d\x92\x80\x7d\x0e\xb4\xf6\x84\xd6\xb6\x6a\xc0\xfa\x05\x97\x0a\x02\xde\xb2\x90\xbb\x58\xc6\xf7\x44\x22\x6c\x5c\x11\x94\xd0\xbf\x8f\x9f\xdc\x4b\xc5\x23\xb5\xeb\x5f\x17\x3d\x57\x53\x8a\x57\x0f\xfa\x99\x95\xba\x81\xdb\x83\xcf\xfb\xc3\x41\x5d\xeb\x85\xf7\x13\x65\x34\xe0\x7e\x69\xb4\x74\xba\xcd\x5f\x2b\x7d\xfe\xed\x6a\xfb\x55\xb4\xc6\x16\x8b\x3b\x74\xb4\xb2\x4c\x7b\x6e\x9c\xe8\x07\x1b\xe3\xf8\xf1\x03\x72\x60\x78\x35\x9c\xcb\xbd\x7f\x70\xb9\x75\x5b\x1d\x21\xa6\x67\x39\xef\xc8\xd3\x21\x23\x7b\x2f\x75\xa8\xa1\xe8\xed\x54\xee\x35\xf4\x4f\x51\x42\x02\x26\x4d\xe9\x7b\xb9\xbf\x98\x9f\xc1\x0d\xd1\x03\x6c\x1d\x7a\x9b\x6d\x89\xfb\x88\x42\x84\x35\x6e\xf7\x20\xc4\xd6\x88\x48\x01\xf4\xa6\xb9\xbe\x3b\x25\x82\xa1\xd0\xed\x95\x80\x35\x2b\x4c\x4c\xdd\xdc\xb2\x64\x56\x90\x61\x47\x87\x88\x5b\x7b\x3c\x54\x0c\xe2\xb6\x49\x43\x7f\x67\xed\x27\x6f\x51\x49\x78\x4b\x89\x1f\x64\x78\xeb\xb4\xbd\xf4\x7c\x6b\x7a\x73\xf9\xed\x73\xc8\x8f\x5a\xfa\xd7\x7b\x47\x68\x4b\x72\xab\x81\x03\x1e\xd1\xa4\x00\x81\x6b\xe6\x21\x6d\x15\x87\x7b\xfb\xd4\x91\xa8\x69\xa6\x1d\x7d\x09\x77\xfb\x59\x17\x95\x4f\x86\x47\xe8\x72\x43\xfb\xd0\x00\xec\xf6\x04\x6d\xe8\x48\xf5\x51\xf8\x78\xe4\x51\x64\x8d\x80\x94\x94\x58\xb9\x7d\xe2\xec\x2d\x81\x02\x27\xd7\xd4\xb7\x37\xad\xb9\xa1\xb9\x15\x32\xe3\x46\x0b\x85\xdc\xec\xae\xcd\x49\x27\x14\x81\x8d\x66\x09\xcd\x6e\x86\x82\x2f\x37\x6f\x76\xd1\xc7\x0e\x12\x38\x5e\x13\xd5\x6d\x56\x42\x55\x39\x69\xd7\xf6\xaa\x07\xfd\x3d\x31\xf2\x42\x2c\xf4\x31\x47\xe3\xc3\xea\xcf\xa8\x22\xac\x45\xc4\x27\x1a\x06\x5b\x1a\xf5\x4d\xb4\x75\x44\x03\x3b\x47\x1c\xfa\x9f\x6b\x14\xbe\x82\x21\xce\x87\x1e\xf6\x5e\x14\xb2\xa1\x02\x37\xf1\x0b\x4f\xce\xfb\xfe\x01\xc9\xdb\xb1\x15\x04\x19\x66\xc8\xb2\xe6\x7b\x46\x5b\x0b\x19\x40\x3c\x42\x7b\x16\x4e\xe5\xe1\x99\x69\xaf\x69\xbe\x1a\x7d\x7c\x8e\x4d\x3b\x5a\xbc\xd9\x0f\x85\xdc\x79\xb2\x61\x18\x9c\xf8\xbe\x2e\x31\xc6\x1b\x73\x57\xb4\x59\xe5\x77\x55\x07\x35\xa4\x88\xee\xa8\xf0\x99\xf9\xb4\x47\xd5\xaa\x0f\xb8\x7f\xfe\x00\x22\xe0\x96\x3f\x7a\x41\x69\xfe\x3f\x33\xfc\xee\xd6\xdd\xbb\xbd\x15\x51\xc3\x2c\x7f\x0f\x59\x99\x3b\x35\x3c\x20\x95\xdc\xe9\xe5\x76\xda\x12\x4f\x4e\x3a\x38\x4c\x60\x72\x60\x57\x86\x5c\x4b\x98\xdd\x0f\x7e\x55\xb0\xab\x23\xe9\xfc\x3c\x16\xde\x79\xbb\xac\x1a\xe6\xab\x4f\xa4\x79\xee\x0f\xf6\xf3\x91\x54\x37\xf0\x5d\xaf\x0f\x9d\xfa\x83\xdf\xd8\xda\x61\x0c\x63\x67\xb8\x76\x2b\xf0\xcc\x3a\xe6\xfb\xdb\xd4\x7b\xc7\xf5\xdb\xbe\xab\x3b\xb7\xf2\xbd\xe7\x32\x37\x40\x79\x5e\xbd\x1a\x5b\xdf\x50\x7e\x71\x23\xb5\xff\xb1\xe6\x7a\x49\xa9\xd0\x0c\x4f\x69\xb7\xe9\x1e\x5d\x15\xb3\x95\x38\xbe\x5e\x3b\x18\xd6\xc5\xcd\xa5\x3b\x9e\x97\x66\xcf\x68\x38\xe6\xe3\xb6\x5b\x40\xef\xda\xf2\xf9\xd6\x0b\xda\xe6\x30\x4e\xff\xea\x7d\x52\x72\xd7\xea\xa3\x75\xde\x6a\x74\xac\xb9\xea\x09\x20\x89\xad\x8a\x52\xab\xd4\x4a\x8f\x96\xb1\xbd\x2a\x4d\x05\x53\xef\x08\xac\x75\xaa\xa4\x7d\xd7\x8e\x3d\x21\x6b\x9c\xbf\x78\x8b\xcd\x22\x70\x63\x65\x48\xd9\x5a\x3a\x4d\x34\x78\xbe\xe6\x57\x24\xcb\x99\x49\x4d\xc8\xb0\x13\xb5\x48\x3f\x8b\x6d\xc1\x3e\xc9\xad\xbb\xe6\xdf\x36\xfb\x8a\x59\xd6\x78\x40\x6c\xb9\x9f\x95\x0f\x75\xbf\xea\xee\x0f\xfc\x2a\x14\x9d\x35\x1d\x1c\x01\xcf\x8f\xbd\xa3\xd2\xf9\x40\xac\x72\x9e\xae\xd6\x5b\x23\x20\xc2\x7d\xce\xe9\x63\xdc\xc8\x66\x70\x7f\x48\x08\x3b\x42\x98\x62\x0d\x45\xef\x35\x11\xe6\xb9\x92\x74\xb4\xa6\x87\xbb\xcd\x97\xb7\xf5\x47\xf7\x81\x35\xf2\xf2\x9e\x95\x5b\xb2\xbc\x9d\x93\xfa\xe5\x28\xf4\x32\xdf\x30\xf4\x00\x8c\x8b\x61\x7e\x3a\x52\x81\xb8\x74\x61\x91\xaf\x53\xdf\x1e\x5a\x6e\x1c\x02\x68\x5f\xc7\x33\x68\xe9\x7b\x90\xb5\xcc\x24\x99\x75\xb9\xe6\xd7\x3d\x73\xb6\x56\x40\x3a\x02\x6b\x6c\xf5\x42\x0d\x4e\xf3\xf5\x93\x3d\x93\x74\x89\x81\xd3\xe5\x1a\xe0\xf6\x1a\x63\x59\x87\xac\xab\xb0\x7b\x47\x76\x61\x0d\xb9\x20\x8b\x3b\xcb\xc0\x47\x72\xa3\xbd\x8b\x5a\x6e\x06\xc7\x7e\x96\xea\xd1\xd7\xda\x06\x11\xeb\x7c\x02\x85\x58\x77\x0b\x83\xa3\x34\xd8\x81\x72\xca\x7a\xac\x63\xa6\xce\xbe\x42\x5f\x99\x3b\xd8\xef\x7c\xbc\xa5\x2a\xd2\xc8\xc7\x61\xde\x61\xc4\xea\x78\x03\x56\xd6\x72\x28\xec\x49\x8c\xf5\xb5\xa2\xbd\xfd\x97\x55\x18\x29\xbb\x03\x93\x2d\x09\x8c\xe4\x4c\x14\x46\x35\x33\xed\x9a\xea\xd8\x1f\xfe\x91\x04\x9e\x5d\x79\x35\xa0\xb3\x5f\xbc\x0a\x3d\x2f\x94\x8f\x45\xea\x28\xca\xf9\xf7\x9b\x88\x7e\x2f\xcc\xc7\x27\xaf\xbd\x5d\x19\x7b\xce\x4e\xc7\xb6\x2e\x40\x5b\x7c\xf6\xab\x38\xef\xe7\x22\xbf\x62\xf9\xbf\xc8\x0a\x8c\xe5\xef\x11\xa9\x62\x85\x0f\x67\x8b\xe8\xee\x45\x5e\x09\x10\xde\x35\x82\xee\x0e\xa9\x67\xd9\x4f\xd9\xcb\x7d\xa0\xeb\xf0\x42\x2a\x25\xd7\x97\x93\x6b\x29\x33\xc4\xb8\x2a\xe5\x2c\x1c\xfb\xde\x44\x56\x96\x32\x5e\xc8\x69\xaa\xb4\xf7\xfb\x8c\x00\x0b\xe3\xa5\xb1\x2e\xc3\x25\xa1\x4f\xd8\xae\xaf\x4b\x7b\xe7\x28\xff\x82\xf1\x1c\x6d\x7c\x48\xdc\xac\x53\xde\x61\xa1\x39\xeb\x5d\x23\x16\x26\x7b\xe0\x98\xd1\x63\x5f\xd2\x41\x11\xab\x0b\x50\x5d\xa4\xb7\xef\xfd\xa5\x24\x1e\x6b\xfa\x5f\xfe\xa6\xc2\x88\x39\x0a\x6c\x35\x8b\x41\x99\x0b\xc2\x65\xed\xa5\xd5\xef\xcb\x42\x7e\x3b\xc6\x64\x38\x67\x6e\x3c\xdb\x25\x8f\x89\xae\x1e\x58\x7b\x92\x31\xbb\xc3\xd7\xe3\x18\x16\x75\x2e\xac\x65\x73\x31\x1a\x0a\x5c\xd9\x5f\xfd\x16\xc0\xd9\xc5\x19\xd2\xf0\x71\x1d\x6a\x2d\x2f\xfd\x8a\x98\x21\xbe\xd0\x3d\x12\x5b\xa7\x37\xbd\xc9\x4b\x7a\x6f\x6c\x5c\x9a\xc5\xe0\xa5\x25\x5d\x9a\xb6\x78\xda\x25\xb5\x20\x75\x0c\x36\xbd\xc3\xd0\x9c\xbb\x6b\xb7\x24\x75\x30\xc9\x82\xe7\x1e\xa0\x15\xbd\x04\x24\x7d\x77\x61\x4f\x99\x59\xcd\x55\x04\x8d\xea\x09\x43\x93\x32\xc8\xf2\x30\xd5\x0c\x5b\x3c\xa6\x6d\x0f\xd3\xbe\xfa\xf4\x52\x7a\x81\x53\x57\x7f\x89\xc3\x58\xfb\x00\xae\xaf\x4c\xbc\x5c\xd2\x22\xce\xfa\xec\x9f\xc8\x78\xbc\x31\x50\xb0\x24\xb1\xea\x67\x40\xa9\xfb\x49\x6b\xce\x1e\x79\xa9\xdd\xcc\xa9\x68\x47\x4f\xeb\x0f\x6a\x89\x9f\x1c\x51\x60\x0b\x94\x1f\xf4\xea\xdb\x64\x11\x69\x1f\xc7\xc4\x1b\x09\x98\xca\x4c\xe2\x92\x00\xf1\x3a\xc9\xd1\x29\xcf\x4b\xca\x33\x6a\x29\x5e\xb1\xa1\x67\x85\x17\x6a\x3e\x80\xc5\x5f\x9c\x3e\xd2\xee\xe2\x53\x9a\x9d\xf8\x00\x26\x4f\xc0\x58\xbe\x39\xfa\xbe\x7c\xe3\x5b\xc2\x4b\xeb\xcd\x3b\x5f\x1a\x1c\xef\x5d\xc8\x73\xf8\xc1\x56\x37\x14\x65\x39\x5f\x8b\xc0\xee\xae\x3a\x13\x20\xf1\x10\xc8\x98\x2f\x0a\x77\xcf\x8a\x30\x17\x28\x5e\x2c\x70\xa4\xfb\x53\x6e\x64\x8e\xc1\x7b\x33\x14\x75\x3e\x57\x0e\x4c\xcc\x80\x45\xf8\x94\xa4\x33\x9b\x72\x68\x67\x6e\xb0\xc5\x19\x48\xa0\xf0\x21\xcf\x55\x6d\xfa\xb9\x16\xad\x88\x71\x60\x0e\xef\xb3\x6d\xa7\xd6\xd4\x6c\x2d\x2f\x2e\xa8\x64\x6d\x37\x76\x5a\x9d\x42\x71\xe6\x9a\xd8\xdd\x77\x19\x1a\x1e\xa3\xb5\xf7\x2f\x49\xc9\x3b\x68\xfe\xe2\xef\xeb\x93\xe3\x19\x4d\x4c\xdd\xf1\xf2\x52\x79\xd4\x8c\xd1\x61\x9d\x5f\xc2\xcc\x07\x8a\x1d\xba\x03\x49\xa3\xad\x28\x34\xdd\x52\x14\x3c\x47\xf6\x8b\xbc\xf9\x90\xa0\x71\xbe\x8c\xb0\xf7\x09\x2e\x35\xce\xfc\x74\xb9\x59\xb3\x93\x2e\x4d\x7b\x41\x30\x0a\xca\xb7\x6a\xce\x91\x40\x0d\x8b\xdc\xf3\xe0\xe8\xcd\xd9\x23\x84\xf9\xbc\x5b\x47\xec\xef\xab\x41\xe6\xf9\x3d\x9a\x51\xab\x04\x94\x9f\x76\x03\xdf\xbb\xf6\x19\x0c\x40\x51\x8f\x30\xfc\xf3\x39\x5b\xa7\x92\x18\x96\x39\xbd\xde\xf1\xca\x9b\x1d\xae\x40\x33\x3d\xcf\x4d\x05\xeb\x10\x88\x1b\x7f\x59\x67\xdb\xbb\x6a\x33\x2a\x12\xfd\x7c\xee\x8d\x42\x1f\x4d\x12\x8f\xd0\xa6\xa1\xcf\xde\x6c\x8d\x36\xea\x18\x24\x17\x2c\xd5\xba\xb1\xbf\x67\x8e\x21\xac\x99\xe9\x0c\x33\x34\xfc\x7d\x0a\xb4\xd8\x65\x4d\x2d\xd2\xf2\xfb\x69\x7f\xdb\xe7\xdf\xcf\xde\xd1\xf5\x7e\x60\xdf\x9e\x77\xcf\x37\xe1\xdb\x5f\xde\xe7\x2b\xd1\xb9\xfb\xbc\xfe\x20\xff\xe1\x56\x38\xb7\x9e\xfb\xd5\xff\xbd\x35\x98\x6c\x4d\x17\x86\x4c\xd3\x7e\xda\x42\xe4\xd7\x5b\x7b\xd4\x19\xf5\x15\x55\x3c\x81\xef\xf5\x7a\xa4\x7f\x6e\x58\x9d\x27\xcc\xba\x75\x45\x9c\xfa\xbe\xd6\x7f\xd1\x6b\x07\xdd\x3e\xd9\x06\xb4\x83\xb5\x48\x82\xde\x19\xf7\x7e\x00\xb3\x47\x4e\x58\x5d\x29\x60\x83\x7d\x63\xc5\x98\xb7\x35\x39\x63\x05\x81\x93\x74\xfa\x96\xd8\xf8\x04\x9c\xba\x0c\xb2\xe7\x3b\xe0\x12\xb4\xfa\xd4\xf4\xad\x41\xa0\x67\xcf\x9e\x58\x7a\x52\xeb\x27\x5d\x6d\xeb\xe9\x78\x52\x15\xcd\x25\xda\xcf\xcf\xfc\x2b\x26\xfd\xaf\xa2\xeb\x9f\x79\x7d\xf3\x7e\x3e\xf3\xa8\x17\x11\x01\x0f\x87\xba\xa0\x4f\x08\x01\x69\xdd\x44\x72\x3f\x38\x10\x4f\xa2\xe8\xd1\x3d\x1d\x2e\x9a\xb1\xe7\x04\xe1\x4d\x3f\x5e\x5c\x73\x62\xf1\xad\x3e\x9f\xf5\xeb\xe8\x0d\xe5\x9f\xeb\xb7\xf8\x64\x47\x2b\xa5\x6f\xdd\xc8\x9f\xeb\xe7\xed\x18\x4f\xb7\x07\xc7\xfa\xfe\xd4\x48\x37\xfa\xa9\x52\x27\xf9\x71\xbd\x75\x36\x3f\x7f\xc4\x4a\xf9\xa9\x6a\x9c\xff\xc0\x6d\xa8\xc5\xa6\x35\x3e\xd8\x3f\xd6\x26\xf3\xad\xd9\xf7\x8d\xd5\xf9\x8f\x23\x55\x65\x71\x19\x75\x18\x6c\xea\xfd\xb3\x9f\xbc\xfe\xf9\x03\xf7\x83\x54\x06\xb1\xef\xf3\xca\xed\x58\x9d\xad\xd7\xf6\x87\x5a\xf6\x3f\x79\xc0\x67\x9d\x30\x7d\x0c\x20\x69\x7c\xfe\x27\xbd\x85\xe7\x8f\x34\xe1\x9f\xb4\x2f\x59\xa0\x7c\x06\x27\xfe\xa4\x51\xa0\x7d\xeb\xf1\xda\x4b\xe4\x0f\xd5\x8f\xc0\xbf\x98\xba\x02\x29\x0f\x2e\x45\x35\xf9\xe3\x99\xf3\x3f\xae\x33\x02\x67\xab\x53\xea\xaf\xc5\x79\xee\xe0\xa2\x07\xc1\x7d\x87\x04\xf0\x2e\xde\xbd\x28\x40\xe0\x9b\xbf\x55\xe6\xc8\xa8\x78\xe7\xfb\x7f\xd4\x6b\x51\xfc\x18\xa5\x03\xa5\xdf\xaa\xf2\xb1\x09\x88\x59\x33\xf2\xd7\x63\x53\x30\x98\x54\x3e\xf0\xfb\x57\x97\x6e\x9a\x3f\x65\x3f\x1b\x7d\xdf\xf5\x8c\xc3\x1d\xed\x64\x7f\x4e\x5b\xe6\x85\xc7\xc7\x51\x28\xc3\xcd\xe3\xd6\x13\x25\xd9\x3f\xb6\x9c\x15\x27\x4a\x6c\x7f\x59\xdb\x61\x5a\x11\x41\x0b\x7b\x14\x7a\x7b\x86\xee\xed\x01\xab\x32\xc6\x82\x63\x2c\x05\xd2\x4c\xac\x7f\x9c\xef\x66\xed\xd7\xf2\xd1\xfe\x76\xc0\xff\x18\xe0\xf8\x0f\xc0\xbf\xce\xc6\xea\x4e\xb6\xc1\x59\xe2\x31\xff\x38\x0b\x45\xe7\xa6\xbb\xc2\xfc\x17\xce\x1a\x35\x91\xcf\xc9\x1b\x84\xd2\x96\xf7\xd4\x8a\xb6\xef\x9b\x16\x07\xac\xff\xd1\x78\xfd\x21\xa2\x05\xbe\x7f\xeb\xb3\xa9\xc0\x23\xf1\xa1\xdb\x9b\xef\x6f\x7d\x75\xaf\xe4\xcd\x4e\x92\x37\x20\xee\x53\x0a\x68\x56\x84\xce\x95\x80\xf4\xf0\xea\xdd\x17\x67\x40\xe3\xe4\xad\xfb\x0f\x0c\x62\x58\x76\x3e\x6d\x75\x80\xf8\x3e\xe4\x0c\xd8\x15\xa1\x49\xa1\xd4\x7b\x49\x8c\xc0\x0f\x0d\xf3\x3f\xfc\xe7\x62\x13\xbb\xd6\x08\xff\xd7\xde\xce\xd9\x11\x52\x94\xfc\x6b\x3f\xdb\x33\xd2\x82\x8e\x34\xc7\xb5\xfc\x75\x84\x7d\x9d\xfc\x3d\xd0\x8e\x7b\xc2\xfb\xbf\xa4\x1d\x10\x17\xad\x2f\x7e\x08\x33\xd7\x49\xe4\xd2\xc7\x0d\x4f\x83\xed\x20\xf5\xba\x2e\xcb\x86\x20\x12\x6e\x62\xf1\x71\xc2\x36\x52\xec\xe5\x6d\x6f\xb9\xed\x28\x97\xa3\xfd\x54\x6e\xd1\x80\xcf\x21\x40\x2b\xd6\x23\xe4\x10\x16\x0c\x34\x49\x16\x1c\x52\x03\x42\x74\x22\x57\x2a\xf2\xed\xa0\x2c\x20\x9d\x02\x64\xfa\xb5\x96\x02\x8a\x8a\x6e\x81\xd9\x15\x2d\xd4\x5d\xfa\xb9\xc3\x78\x7b\x98\x88\xc2\x76\x49\x8e\xd9\xdb\x9d\xf1\x16\xce\xde\xde\xa0\x59\x3c\x1c\xce\xbe\x40\xee\x72\x80\x64\x81\x3f\x3d\xbd\x88\xe9\x1e\x77\xe7\xdb\x90\x14\xc1\x25\x85\x02\xab\xcd\x56\xcd\xa7\xfb\x0c\x2a\x04\xd0\x2f\xe6\x55\x99\xae\x95\x44\x7d\x6b\x81\xa6\x90\xcb\x84\x2e\x81\x20\x26\x66\xaa\x43\x0f\x91\x82\x30\x3c\x41\x5c\xeb\x5b\x27\x31\x06\x8f\x27\x29\xc3\x79\xce\x05\xd1\xe9\x68\x02\xf3\xd3\x37\x9d\x0b\x45\x0a\x3c\xfe\xd3\x26\xb3\xe0\xfe\x27\x89\xfe\x27\x07\x51\xa7\xaa\x37\xc9\x8c\x50\x02\xb0\xfa\x07\xac\xa5\x2f\x4a\x08\xc4\x4b\x0a\x1b\x14\x83\x30\x19\xd6\x08\x01\x98\x5b\xe0\x70\xaa\x4d\x08\x40\xf9\xaf\x53\x2d\xf1\x06\xbb\x8a\xc0\x4c\xb6\xd6\x54\xa3\x29\x3d\x49\xd9\x0d\xd2\x01\x45\x12\x03\xc2\x55\x4c\xcb\x22\xa1\x86\x22\x70\xcf\x54\x10\x84\x2f\x23\x24\x04\xd0\x8b\x61\xe3\x12\xb6\xcb\x43\x14\x72\xeb\xe0\xc2\x70\x3a\x8a\x56\x6e\xd5\x3c\xb4\x06\xd4\x84\x00\xda\xe0\x60\xa4\xdb\x94\xdf\x83\xc7\x24\x4c\xd6\xda\x26\xf5\xdf\x7a\x84\x0a\x4a\xa4\xcc\x00\x1f\xe2\x09\xae\xbb\x6d\xc2\x10\xb5\x3f\xac\x56\x76\x42\xbd\xb5\x76\xad\x2d\x4d\x90\xff\x12\x03\x7f\x32\x69\x31\xec\x6a\xca\xf3\xf6\xd1\x03\xb6\xe2\x72\xcc\x59\xbf\xcc\x13\xa2\x35\xbe\x3e\xb4\x08\xdc\xd6\xcf\x31\x1d\x06\xee\x51\x9d\x30\x57\x17\xe8\x24\x72\x6f\x85\x4d\xc7\x99\x42\xde\x01\x81\x9a\x27\x9b\xe2\x6e\xe7\x58\x72\x50\x64\x9c\x64\x08\x74\xab\xd2\x2b\x06\x55\xa6\xf4\xeb\xcd\x54\x9b\x46\x04\xd5\x94\x24\x1f\x48\x89\x01\xee\x2a\x1d\x9c\xb3\xff\x66\x31\x19\x5d\x61\x80\xd3\x81\xda\x41\x93\x34\x36\xd2\xaa\x4d\xae\x47\xa5\x28\xc0\x3a\xae\xec\xa0\x7a\x54\xdf\x19\xbb\xc6\xad\x6d\xb3\xd9\x60\x98\x62\x9c\x25\x9a\x7e\x13\xc8\xb1\xa7\xcc\x19\x72\x61\xd0\xa3\x5c\x55\xac\x5c\xf4\x6e\x9d\xb8\xec\xa3\x4f\x27\xc9\x0b\x50\xe9\x02\x39\x2a\x83\x7b\x08\x70\x81\xc7\xb7\x1c\x9e\xe3\xa5\xb3\x19\x2f\x6f\x7a\x8f\xe8\x82\xb2\x3c\x7b\x0b\x7c\xe4\xe0\xf0\x88\x18\x92\x99\x81\xe8\xd6\xb3\xfa\xa5\x34\x81\x3d\x2f\xe8\x9d\xaf\x2c\xec\x71\x36\x66\x5b\x57\xc4\x9a\x8d\xa4\xda\xef\x17\xd2\x5f\x76\x99\xcc\x82\x87\x85\x70\xa2\x10\x13\x88\x0c\xf8\xd1\x75\xc3\xbf\x24\x41\xa0\x95\x2a\xbb\x45\x23\xf9\xa4\x63\x0c\x29\x9b\xc1\x10\x49\x33\xec\x30\x86\xa2\x6d\x95\x47\x50\xfb\x19\x32\x27\x73\x98\xab\x76\x9d\xc9\x2e\x30\xc3\x1a\x52\x6f\x5a\xa9\x89\x20\xa4\x5f\x47\x37\x71\x2d\xbb\x1b\x4f\xcf\x26\x18\x11\xb4\xc3\x65\x15\x08\x3c\xba\xec\xac\xcc\x2b\x14\x16\x5c\x99\x89\x07\x52\x01\x81\xa2\x31\x86\x66\xc1\x43\x47\x56\xe7\x61\x61\x48\x03\xcc\xbc\xee\x95\xdb\x29\xc4\xd2\x8d\x4d\xe5\xc0\x61\x9f\xef\x91\x21\xdd\x2a\xe6\x56\x4c\xdf\x97\xba\xc5\xe3\xac\x1b\x05\x72\x7c\x34\x5f\xa0\x55\x30\x4a\x04\x72\x04\x9c\x4f\xe8\x77\xb3\x17\x7f\x72\xcc\xe8\x45\x7b\x1b\x5d\xc1\xc8\xcf\x01\x4d\x6a\xd6\x5a\x66\x32\x88\x60\x2c\x4a\xd5\x1d\x43\xeb\x7a\x54\x23\x7b\x2c\xe0\xd8\x71\x54\x75\x9c\xa0\xbc\x49\x39\x87\xc9\xe6\x79\x5d\x36\xe2\x91\xe6\xaf\x8c\xab\x1a\x73\x3c\x0e\x7a\xae\xc7\x08\xc1\x71\x1b\xec\x19\x8d\xdc\x8c\x08\x3e\x9e\x65\x45\x20\xc2\x98\x5d\x5e\x07\xa8\x3f\x7e\x34\x47\x04\xf1\x15\xaa\x21\x54\xc5\x5f\x24\x7f\x0e\xf1\xdd\xe2\xd4\xeb\x31\x20\x25\xcf\xf8\xc5\x75\xe4\xa8\x55\x81\xf4\x9a\x7b\xa4\x4b\xc5\x2c\x7b\x40\xe3\xde\xcd\xb9\x63\xff\x60\x4c\x7f\xa8\x74\xad\xbd\xe2\x27\x9a\xde\x92\xbc\x48\xed\x21\x48\x72\x7a\x87\xb0\x02\x4d\x46\x8d\x43\xcc\x4c\x57\xdc\x15\x16\x69\x24\xcd\x90\x3f\xd7\xbe\x1e\x1e\xde\x35\x2a\x51\x0d\xd3\xb9\x19\xac\x3e\x46\xa5\xac\x8d\x2d\x92\x1e\xde\x84\xd9\x9d\x94\x66\x39\x6a\x87\x15\xda\x98\x34\x4a\x34\x26\xd6\xab\x23\xe3\x37\x1e\x97\xeb\x93\xd2\xd5\xfe\x60\x18\xd1\xe3\xda\x83\xba\xfa\x68\xa0\x38\x58\xd2\x2a\xb8\xd6\xe7\x5b\x3d\x35\xb3\x07\xc2\x81\xf4\xcb\x90\x3e\x59\xea\x0f\xab\x41\x76\x6f\x94\x3e\xec\xc2\x2c\xf5\x74\x3f\xf2\xe3\xd2\xcd\x40\x94\x22\x0f\xfb\xd1\xf4\x49\x30\x66\xe2\x8e\x76\x1f\x3c\xf1\x7a\xec\x81\x70\x5f\x1e\xc4\xfe\xd1\x98\x79\xec\xd6\xaf\xb7\x7f\x34\x2b\x35\x20\x10\x87\x10\x12\x0f\x15\xae\x34\x6f\x2b\x9b\x3d\x6a\x03\x88\xed\xd7\xea\x25\x22\x86\xd8\xa6\x96\x65\xf7\x2a\xa2\x8b\x50\x92\xc2\x03\x06\xf5\x86\x50\x5c\x84\xbc\xc4\x5c\x93\x46\x8b\xbd\x94\x42\xc2\x0a\x7a\x13\x22\xbf\x3c\x20\xf4\x94\xfe\x84\xf2\xc7\x61\xef\x1f\x61\xa6\x90\xa0\x78\xda\xa5\x96\x40\xc2\xee\x5b\x90\x2e\x01\x0a\xd6\x22\xd0\x21\x25\xc1\xa5\x1e\xb5\x25\xf3\xd3\xbb\xa2\xa5\xeb\xbe\xde\xe3\x86\xad\xc4\xa3\x91\x4a\xc5\x5d\x6a\xce\x1e\x2f\xac\xb1\x85\x31\xe2\x03\x21\x54\x71\x4e\x3e\xb0\xfc\x25\xb5\x0a\xbf\x00\xd0\xaa\x50\x9a\xed\xe3\x6e\xf0\x50\xb7\xa2\xd9\xcf\xb0\x12\xf5\x22\xa4\xac\xf2\xf0\x6c\x98\x30\x05\x0c\x7c\xcc\x1f\xe3\x98\x2e\x76\x21\x54\x9a\xd9\xbe\x47\xe4\x54\xb9\xc2\x03\x67\xe6\xc2\x70\x77\x2d\x93\x87\x90\xc0\x81\x8d\xd6\xca\xc5\x1f\xd2\x5b\x5b\xf4\x76\x8e\x4d\x5e\x2d\xd1\xe0\x31\xb7\x34\x0a\x17\xb8\xe8\x92\x36\x90\x9a\xbc\x46\xc3\x94\x3e\x66\xbd\x5b\x8f\x72\xa8\x83\x02\x58\x8a\xce\xa2\xec\xf1\xa3\xc7\x24\x3b\x68\x02\x76\x3b\x3e\xb3\xbb\x6b\x0c\xab\x50\xa3\x03\x4f\xd9\xfe\x11\x7a\xfc\xf0\x70\x9a\xac\xdf\x24\x45\x51\x80\x0c\x56\xd8\x27\x0a\xca\xd1\x46\x48\x2e\x5b\x34\x8f\x0f\x97\x27\x9a\xc9\xbd\x1e\xca\x92\x1f\x83\xb7\x35\x1e\xa5\x8b\x44\x82\x07\x1c\x9c\x5e\xed\xb3\x20\x37\x03\xc4\x31\x78\x8b\x20\xab\xe6\xbf\x21\x32\x7b\x97\xc1\xee\xcf\xc3\x83\xa8\xdf\x5c\xcc\xba\x8b\xbc\x06\x94\x9a\xfa\x92\x66\x46\x3f\x79\x3e\xf6\xc3\x73\xd7\xb8\x93\xfc\xa9\x93\x01\xf5\x99\xea\x75\xe7\x23\x11\x8c\x63\xd3\x5e\xe7\x61\xb5\xaa\xea\x31\x33\x73\xa4\xf9\x41\x40\x21\x1d\xef\xf6\xcb\x9a\x5a\xec\xfd\xc3\xf9\x59\xbc\x5e\x56\xe3\xa9\x06\x43\x8a\x20\xef\x75\x62\x67\xe1\x91\xe2\xbd\xcf\xff\x90\xd0\xcf\x95\xa5\x91\xe1\xc7\x45\xdb\x37\x64\x26\xfd\x0c\xed\xa7\xe9\xba\xe5\x23\xfe\x79\x8b\xfa\xa3\x98\xa4\xe7\x9a\xff\x21\x5c\x50\x2a\x16\xff\x10\xe9\xa8\xd7\x2a\xff\xeb\x43\xa6\x19\xe6\x4c\x03\x32\x3b\xfb\xbd\x8b\x14\x81\xf3\xf9\x57\xf9\xa3\x66\xf4\x21\x71\x02\xd7\x8e\xfc\x50\x6e\x36\xb0\x5a\xfe\x4d\x11\x3c\x0a\x7d\x8c\xd1\x45\xf7\x5c\xa1\x22\xc4\x2d\x22\x16\x3c\x1f\xde\x07\x95\xf2\x45\x8d\x9e\x1c\xd2\x31\xbd\x79\x96\xa5\x01\xe5\x49\x3e\xcd\x71\x93\xbd\x99\x35\xca\xf2\x43\xd9\xd7\xe3\x55\x18\x15\x90\x37\x30\xf3\xb7\x24\xc5\xdc\xbc\x79\x63\x9f\xfb\xdf\xfa\xda\xb4\x33\x22\xff\x05\x83\x71\x4b\xa0\xe6\x5a\xa1\x89\x6c\x4c\x7b\x70\x23\xf3\x7a\x5c\xda\xed\xea\xf9\xea\xc9\x4d\x3b\xe4\x90\x06\x59\x55\x0b\xe5\x75\x6e\x55\x0f\x42\xbb\x14\x39\x28\xb3\x9d\xfc\x0a\x21\x84\x58\x0a\xa9\x64\x6e\xf4\x7b\xc4\xd2\xb8\xde\xa0\x6b\x85\xac\x49\x83\xa9\xd4\xdc\xd0\x3a\xe8\x8d\x4b\xf0\x62\x41\x1c\x02\xaf\xdd\x62\xf7\xa1\x68\xe1\x2e\x4b\xff\x06\xca\x1b\xa1\x63\x81\xc1\x2e\x56\x78\xb9\x11\x84\x33\x52\x1c\x35\x30\x60\x76\xf1\xc9\x22\x47\x10\xd2\x78\xb7\x68\xa9\x60\xc0\x68\x95\x0f\x2e\xd3\x8d\xa1\xf9\x90\xef\x68\xf2\xcf\xcc\x90\xe2\x71\x5a\xbd\x25\x31\x10\x55\x5a\xd6\x2a\xe4\x60\x25\xd7\x1c\xbd\x21\x99\x43\xb4\x87\x12\x1f\x5c\xe1\xd1\x64\x2f\x73\xf6\x08\x29\x48\xbf\x1c\x9a\xc6\x51\xc4\x37\xd9\xf5\x3d\x10\x35\xea\x36\xc9\x89\xdc\x03\xc9\x62\x19\x92\x5f\x43\xa3\xb2\x63\xac\xb7\x53\x0f\xcf\x2e\xfe\xcb\xc3\x90\xf3\xb7\x64\x3b\xc2\x93\x36\x5c\x6b\x27\x34\xe0\x70\x2d\xcb\xb3\x6e\x0f\x37\x47\x06\xcd\x0f\x40\xe1\x94\x83\x1c\xfb\x26\x0b\x33\xd8\x3d\x44\x1f\x84\xab\x59\x07\xe2\x29\x0d\x8f\x5d\x03\xe8\x03\x20\xf2\xf7\x02\xd5\xbb\xe2\x36\x65\x58\x2b\xd4\x38\x62\xca\x63\x35\x2b\x42\x59\x86\x5d\xb8\xfa\x41\x34\x61\xda\xe9\x2f\x4b\x88\xe3\xe5\x8d\x7f\x4c\x85\x43\x87\xb9\x85\x1a\xc7\x2b\xd1\xed\x08\x31\x0e\x9f\x44\x56\xa9\x3d\x8c\x35\xc0\xc8\x43\x85\x6a\xdf\x2e\x2b\xcf\x63\xc0\xa1\xac\xa8\x85\xef\xcf\xb2\xe4\x3a\xb8\x53\xff\xc4\x20\xcc\xb2\x89\x73\xd4\xdf\x26\xd0\xb1\xe6\x71\xe2\x62\x4b\xe1\x44\x1b\xfb\x71\xf1\x89\xda\xd3\xdf\xa9\x6f\x30\xa4\x38\x56\x5d\x4f\x37\xfd\x26\x43\xa7\x86\x42\x27\xe5\xf2\x1c\xa0\xe3\xc3\xfe\xa2\x58\x07\xde\x20\x06\x7e\xa0\x44\xc9\x21\x2e\x76\x1c\x45\x5e\x33\x88\x77\x5c\xdb\x79\xdc\xe6\xbd\x90\x47\xce\xfb\x5a\x29\x54\x38\x3c\x7e\x8e\x92\x2f\x05\xa9\xcc\x71\x5c\xc7\x82\xb7\x6c\x5f\xda\x46\x59\xfe\x0a\x59\x0f\xba\x1e\x61\xc3\xc3\x55\xea\x7a\x2f\xe9\x9e\x82\xdc\x4e\xeb\x08\x09\x52\xde\x70\x17\xfe\xb0\xdf\xd9\x71\xf0\xa2\x7d\xb0\x18\x27\xec\xa5\x59\xee\x29\xc8\x80\x1c\x77\x92\x12\x8a\x4d\x80\xa1\xec\x67\x89\xab\x85\x80\x37\xf4\x58\xbe\x28\x10\xc2\xad\xc2\x47\xc9\xb5\x46\xae\xf0\x68\xbe\x5d\xd8\x52\x97\x29\xc4\x9f\x0d\x76\x97\x5f\x59\xcb\x87\x1c\x1a\xac\x18\xd9\x1b\xbc\x3f\xd4\xe5\xb0\x27\x45\x6e\x9b\xdd\xb5\x5b\x95\x5f\xa9\xe9\x83\x28\x4a\x12\xea\x20\xa5\xd5\x24\x90\x05\x69\x42\x2e\xf0\xa0\x9e\xb7\x15\x2f\x65\x3e\x53\x7b\x20\xa8\x2d\xa0\xcb\x2a\xc9\x90\x50\xbb\xc0\x45\x8d\xd4\x01\x24\xde\xc7\xb9\xe5\xbd\xe5\x17\x0c\x79\xbb\x4e\x39\x2f\x07\x8e\x48\x48\xe5\x24\xbb\xd3\x44\x32\x22\xb1\x6c\x91\x8a\x09\x3c\xc7\x49\xfb\x5c\x43\x9b\x0a\x82\x22\x7e\x0f\x63\x0b\x0b\xdf\x3a\x0c\xb5\x7a\x8f\xa0\xcd\xb7\xf7\x42\x9f\x9c\x21\xcf\x3a\x41\x10\x16\xa5\xc6\xe1\x29\x58\x4a\xc7\x80\x8a\x48\xaf\xd7\x97\xa2\x20\x3c\x54\x77\xa5\x87\xfb\x16\xc5\xee\x2b\x44\x41\x62\x09\xf5\xff\x87\x9c\xa5\x51\x63\xd5\xe2\xc7\x51\x74\xd4\x9f\xc9\xe9\x7f\xbc\x2a\x29\x44\x70\x12\xa3\x05\x87\x74\xe7\x4a\x0f\xa8\x21\x15\x07\x3b\xb8\x4c\xe5\x18\xf3\x9f\x1f\x62\xa1\x83\x2b\xe7\xc7\xab\x14\x05\xda\xfd\x7f\x05\x44\x06\x9a\x21\x34\xb2\x78\x74\x58\x8d\x82\x4f\xe6\xdd\x9f\x50\xb7\xc7\xda\xb9\x9b\x68\xa0\x7f\x76\xf8\xb6\x9a\xc8\xc3\x1d\x86\x6f\x04\x1a\xef\x6f\xdf\xcb\xb7\x13\x77\x5c\xc9\xe0\x1d\xa4\xf4\xf7\xca\x47\xcf\xc5\x42\xd6\xd0\x8b\x70\xb5\x10\x1a\xd9\xc7\xdc\xcc\x48\x6c\xa1\x59\x67\xe1\xf4\xb4\x4a\x29\x81\xec\x67\x43\xdf\x63\x18\xc0\x9f\x26\xb3\x16\x54\xe6\x04\xde\x5f\xfb\x20\xbd\x91\x35\x97\x07\x89\x8b\x90\x13\x71\xe6\xe7\xc0\xc2\xc6\xf1\x7a\x6e\xd2\xe5\x76\x7a\x64\x11\x6a\x58\xbe\xbf\x22\x67\xd2\xf5\x5b\x8e\x30\xbc\x57\x66\x16\x3c\x69\x3c\xf0\xdd\x47\x77\x3f\x32\x78\xd1\x77\xed\xe6\x50\x05\xb9\x06\x09\x42\x40\xff\xa9\x87\x5f\x92\x05\x1e\xe8\x0e\x19\x73\xf7\x17\xa3\xba\x11\xcf\x1d\x1f\x17\xb6\x5c\x7a\x64\xde\x30\xb4\x1b\x42\x24\x6a\x00\x20\x2b\xd8\xdf\x05\x08\x91\xb0\xd1\x48\x4b\x3f\x32\xb4\x1c\x32\x24\xcf\x43\x06\x27\x8f\x53\xe8\x09\xb7\xe3\xf4\x52\x67\x1f\x4f\x4a\x2f\x40\xcb\x37\x44\x3e\x7c\x60\x78\xa6\x7d\xd9\x5d\xff\xa6\xb4\x08\xb0\x65\xa2\x1d\xf6\xe8\xef\xd1\x38\x9b\xf6\x41\x3d\x5a\xeb\xcd\xec\xd9\xc7\x24\x6f\xc9\x11\x1e\x62\xdd\xb7\x10\x36\x84\xea\x48\xa0\x4c\x21\x3d\x72\x21\x7d\x42\x22\x26\x6b\x6e\x72\x1d\xd4\xff\xb2\xe9\x10\x82\x08\xb5\x86\xf8\x49\x9d\xa5\xb0\x52\x23\x4f\x1e\x66\x48\x64\xd4\x27\xa8\x06\x9c\x0b\xa5\xa1\x10\x91\xc0\xa0\x91\x52\x2c\x69\xfb\xab\x4e\xb3\xbb\xce\x38\xc3\x10\x2b\x09\xd1\x0f\x0d\x52\xc2\x90\x58\x92\xe2\x8d\xda\x96\x5a\x57\xc7\x0b\xcb\x16\x35\x84\x6b\xff\xdc\x42\x27\x4c\x84\x95\xc8\xc7\xea\xe9\x5f\x4d\xc3\xa1\x7e\x0c\xf5\x41\xaa\x04\xfe\x89\x4f\xe9\x93\x87\x9a\x49\x6e\xee\x92\x2c\x79\x94\x33\x8c\xa3\xf5\xe4\xa5\x7a\x12\x07\x70\x5f\x3d\x28\xf8\x95\x5b\xfa\x65\xf5\x0e\x79\xdb\x81\x8b\x44\x48\xc7\x05\xe1\x7e\xb1\x31\x49\xd6\xf8\x08\x96\x36\xb4\x04\x16\xc8\x4d\x49\xda\xc3\x8e\x61\x13\x57\xf2\x8b\x4b\x10\xd2\x27\xa1\x91\xc2\x01\xd5\xa6\x92\xf2\xd1\xdc\xf0\xe2\x52\xf7\xfb\x4c\x96\xc5\x3d\xdc\xba\x44\x4b\xdb\xba\x1d\x1e\x8f\x14\x24\xad\x18\x03\x54\x49\xbb\x45\x7c\x54\x6d\x56\x88\x8e\x54\xf8\x12\xd8\x30\x81\xbd\xaa\xfb\xdc\x13\x4b\xde\xde\x36\x44\x19\x66\x09\xc3\xcc\x91\xc0\xda\xd7\x1f\xf9\x18\xfa\x5a\xd8\x19\xc6\xa0\x62\xd4\x46\x6e\xea\xfe\x85\xf0\x6d\x6f\x15\x5c\x7b\x40\x07\x08\xa2\xb9\xd5\x5b\x97\x26\x16\x68\xfa\x91\x2e\xdc\x72\x28\x03\xa2\x9f\xaf\xb3\x05\xeb\x49\xc8\x25\x2c\x4e\x97\x23\x52\x6c\x50\xd8\x68\x04\xbd\x9e\xf2\x2d\x87\xc6\x5a\x7a\x97\xfc\xe4\x91\xd3\xe4\xb6\xb2\xfb\xa4\xb5\x0d\x25\x7b\xf6\x33\x05\x8b\x21\xe1\xc2\xf3\x9a\xc1\x87\xd1\xca\xe9\xbd\x08\xdf\xd0\x63\xfc\x48\xd5\x14\xcd\x26\xeb\xa2\xb1\xba\xbe\xb8\xfa\x58\x53\x24\x29\x17\x55\x7c\x89\x40\x94\xeb\x20\xf4\x5a\x72\xfb\xa5\xe8\x75\x81\xf6\xfd\x12\x35\x4c\xe1\xb3\x3f\x21\xb0\x99\x73\x30\xce\xa7\xab\xe3\x3a\x2e\xd1\x33\xb5\x12\x42\x41\x42\xcc\x08\x25\xad\x50\xd9\x72\x33\x63\xd9\x42\xf3\xa5\xf6\xd4\x75\xb1\xbb\x3d\xc7\xd6\xca\x2e\xf5\x97\xe2\xf8\x4e\x74\x2d\x59\x97\xa0\x8f\x99\xfa\x49\xfe\x74\x2b\x0a\x46\xef\x52\x2f\xf4\x7c\xbb\x99\xad\xa9\xff\x2f\x0a\x69\xa0\x92\xca\x24\xfd\x09\xdc\x87\x23\xb4\x58\x71\x27\xae\x8e\xc6\x22\x15\x9f\x29\xc1\xef\x75\xed\xad\xd4\x6b\x27\xe0\xac\x9e\x9a\xb9\x8f\xda\x58\x82\x90\x12\xf2\x09\xe3\xe8\x31\x64\xcc\xf1\xd7\x7e\xe2\xb7\x3f\xce\x35\x2d\x7c\x4f\xa7\x34\x5f\x4e\x1c\x31\x0b\xa3\x22\xbc\xf4\x53\xe2\xa7\x38\x33\x27\x19\x53\xe6\xca\xd0\xba\xdd\x86\x28\xbb\x63\x2a\x6b\x39\x64\xc1\xd3\xca\xdd\x2e\xbd\x19\x98\x9c\x89\x86\x99\x5e\x00\xd4\x98\x6b\xe8\x34\xa1\x2b\x1f\x9a\x34\x40\xec\xb1\xae\x45\x3f\xd7\x1b\xcb\x7d\x6e\xb9\x4f\x56\x17\xa5\x90\x85\xf1\xdc\x61\xd7\x8c\x79\xf9\xb8\xdb\x18\x45\x2a\xb1\x1c\x2a\x8e\xf5\x56\xa2\x39\x83\x6f\x6f\x66\xb2\x77\xec\x90\xca\x0f\x24\x66\x86\x10\xa1\x39\x0a\x13\xa3\x61\x29\xff\xaf\x8f\x8f\x2b\x46\xf1\x42\x66\x86\xc3\xbb\xb1\xbd\x5b\x11\xc7\x1a\x8d\xb3\xe6\xb5\x30\x6b\xd8\xf4\x28\xc0\xd2\x36\x6f\xfd\x03\xb7\xad\xe9\xd1\xe6\xb7\xad\xae\x92\x86\xd9\x25\x8b\xb3\x0f\xa5\x5a\x93\x00\xef\xc9\xde\x66\x28\x4c\xbd\x07\x4c\x78\x95\xba\x52\xda\x85\xd7\xe8\xd3\x76\xc9\x07\x68\x66\x08\x27\xa5\x88\xf6\x72\x6e\xa3\x8e\xd1\x9a\xd0\xd7\x1c\x76\xda\xb2\x8c\xa1\x64\x2d\xba\x6c\xa9\x8c\x7a\x48\x92\x7b\x36\x42\xc7\xc6\x9a\x72\x4d\xd9\x67\x46\xbb\xf6\x3c\x69\xa7\xa5\x9c\xa1\x98\xc3\xa7\xca\xb6\x07\x2f\x1c\x67\xd9\x0d\xe1\x82\x5d\xfe\xe3\xd1\x76\x2e\x84\xe9\xc2\x0e\xef\xbf\x46\x71\x87\x9c\xcd\x93\x81\xf7\x30\x43\xd5\xc3\xcc\x6f\x1a\xef\x26\x6b\x63\x4f\xa4\x4f\x8f\xa6\xa8\x71\xb1\x7a\x74\xec\xb7\x97\x91\x8a\x43\x43\x81\x5f\x9d\xd5\x9a\x4f\x0e\xf8\x75\x1e\x95\x4e\x0b\xce\xd3\x98\x3b\xcf\x4d\x59\x67\x9e\x87\xea\x5d\x79\x33\x3b\x9e\x5c\x27\x99\x4f\x28\xdb\xbc\x3b\x77\x6b\x75\x68\x8f\x4a\x40\xe4\xe2\xf0\x49\x77\x75\x17\x7f\xea\x3a\xbe\x33\x1d\x86\x33\x29\x4a\x23\xe7\x1a\x14\x6f\x56\xe6\x01\x76\x90\x0b\x4e\x13\x25\x68\xea\xaa\xf7\x5a\x42\x38\xfe\xea\x98\x2d\x3f\x1b\x44\x6f\x86\xe8\xbe\x76\x56\xd3\x3d\xa5\x8a\x53\xf2\xa3\x57\x2b\x11\xe1\xbf\x52\x41\x81\xd4\x75\x2c\x9b\xf3\xa4\x4d\x78\x7a\xa2\xcb\x27\xb1\x98\x9e\xa1\x94\xee\x85\xd0\x5b\xd9\x7d\xd0\x9c\xe3\xb1\x1d\x86\x3d\x29\x57\xef\x26\xb7\x6e\x2f\x14\x2f\x07\xc6\x41\xe3\x4c\x51\x05\x95\x30\x9b\x40\x8f\xd5\x1f\xaf\xf4\x1b\x8b\x94\x55\x3d\x64\xb3\xc7\x91\x6d\x71\x33\x07\x8e\x4e\x41\x2f\x85\x62\xdf\x6e\xf1\x71\x80\x35\xd0\xe0\x88\x66\xe7\x9a\x7f\xab\x22\xcf\xed\x66\x9c\x8a\xa8\x6c\x32\xb8\x2e\xcf\xf3\xa6\xa1\x4e\x14\x34\xd7\xa4\xc0\x53\x0f\x49\xfd\x40\x80\xe7\x1f\xad\xa7\x23\x99\xb2\xe6\x3f\x11\xe6\x2e\x93\x95\x3d\x2c\xe9\x61\x76\x68\xf7\x59\xdb\x58\xbb\x5c\xc7\x2a\x23\xd0\x5c\x30\xe3\xc7\x38\x62\x38\x04\xd5\xcc\x52\x41\x07\x4a\x25\xd0\xae\x16\x49\xd1\xba\xc5\xa9\x6a\x89\xae\xe2\x3a\x69\x3b\x5d\x57\x35\xa5\xfe\x09\x06\x77\x4f\x19\x9d\x7c\xe5\xd0\x06\xfa\xa9\x12\xdd\x81\x04\xd0\xc4\xe7\x15\xfa\x3f\xa5\x09\x00\xf5\x4d\xca\x09\xb6\x37\xa6\xa4\x1a\x04\xbc\x15\x1f\xae\x99\x1a\x38\x73\x96\x46\x90\x86\x67\x3b\x26\x8e\x73\x69\x44\x36\x72\xe1\x34\x0c\x6d\x26\x95\x83\x5a\xa1\xcb\xd2\x3c\xfa\xa9\x8e\x34\x71\x95\x62\x9f\x52\x7e\xad\x63\x8e\xbd\x4d\x26\x44\x36\x0f\xb4\x35\x18\xab\x5f\x7a\xd7\x76\x26\x75\xff\x2e\x7a\x01\x15\xc1\xc5\x17\xa6\xcc\x7c\xb8\xcb\xb8\x88\xda\x6c\xe6\x14\x7b\x45\x20\xe8\x11\x01\xb3\x5d\xb1\x56\xf1\x56\xa4\xbf\x73\x1d\xd2\xbb\x02\x58\x15\xc2\x6c\x6e\xdb\x17\x64\xef\xa9\xca\x73\x94\x2c\xd5\x1a\xb4\xa4\x28\x85\x64\xfd\x8d\x68\xd5\x9b\x9d\xa9\x96\xe6\xc7\x04\xd7\xf6\x1a\x31\xc4\x28\xd1\x5f\x6c\xd6\x4f\xc9\x61\x68\xc5\x35\xbb\xb8\xf7\xae\x52\x3f\x31\x26\xc6\x4d\x3d\x33\x70\x73\xf9\xd4\x5a\x3e\xe9\x9e\x8b\xa0\x19\x2a\x7a\xe1\xe3\xcf\xa9\x8b\x0d\xee\x3a\xd2\xf0\x1b\x74\x79\xda\x75\x28\xa3\x23\xde\xc2\x8c\x2d\xe5\x55\xeb\xe7\x07\x97\x07\xad\x94\x2d\xe4\x2e\x87\x62\xd2\xc0\xd1\xab\x0e\x90\x2c\x9f\x42\x3c\x07\xa3\x1f\xac\x77\x73\x0a\xe5\xa9\x9c\xfa\x50\x4d\x8a\x31\x71\xb7\xaf\xa1\x5e\x12\xee\xd1\x13\x4d\x54\x6b\x2b\xec\x31\x86\x0c\x9b\x11\xd1\xfa\x45\x4d\x3a\x58\xaa\x8e\xf0\xd1\x7c\xeb\xd7\x2e\xa6\x3a\x80\x04\x31\x71\xd6\xdc\x69\x3b\x15\x30\xec\xa2\x44\x97\xd4\x5a\x51\x68\xf2\x45\x0b\x77\x69\x7d\x07\xcd\xb0\xd7\x32\x8e\xdf\xe3\x99\xb8\xeb\x67\x8c\x87\x76\xf0\x67\x31\xec\x1e\x01\x6c\xd6\xf8\x1e\xb8\x44\xc7\x31\x99\x2e\x25\xbe\x5b\xdf\x0f\x82\xc3\xa0\x40\xe4\x9a\x32\x52\x80\x76\x21\x22\x37\xd0\x0f\x1f\xc3\x5c\x15\xcf\x96\x7e\xd3\xc9\x26\x8e\x44\x89\x24\xe0\x73\x61\xbc\x44\x0e\x36\x2f\x28\x37\x49\xb6\x54\x88\x20\xb3\xb6\x7c\x35\x11\xa3\x33\xdd\x6b\x4c\x88\x99\x8c\x1c\x91\xcf\xb2\x17\x39\xbc\x0b\x01\xa9\x16\xf4\x90\xae\xce\x5d\x3d\xd0\x38\xe2\x43\x05\x2d\x53\x65\xeb\x26\x64\x69\x4d\x45\xb3\xed\xbe\xe8\xe9\xf7\x8a\x22\x5c\x06\xe9\x78\x1f\x27\xd3\x99\x3c\xfc\xc1\x1a\x89\x0f\xb7\x8f\xb2\x94\xe8\x0e\xdc\xa5\xaf\x26\x86\xd4\x54\xc7\xe5\x70\x95\x76\xd0\x01\x07\x6c\x09\x6d\x23\xdc\xdb\x2c\xab\x0f\xc9\x20\xd8\x53\xd5\x05\x46\x54\x9f\x76\xef\x8d\x34\xce\x44\xea\xee\xac\xd1\x13\x6f\x86\x69\x4d\x45\x65\xb8\x54\x92\x9d\xcf\x3b\xec\x81\x46\x40\x17\x13\x30\xa3\x14\x95\xd9\xfc\x05\x0c\x3d\x24\x9a\xc8\xae\xe0\x2a\x9b\x7b\x2e\x75\x83\xad\xa0\x96\x66\xda\x3c\xd8\x9d\x96\x3d\x6c\xdc\xe8\x7a\x82\x68\x42\x6b\x96\x5c\xd1\x59\x10\x9f\xfb\x96\xbd\x6a\x2a\xd7\xa9\x74\x6a\x6c\x86\x22\x14\x13\x86\xd0\x10\xeb\xe2\x63\x6a\xda\xe8\xd4\xa4\x9d\x10\x6f\x45\x3d\x24\x07\x29\xe8\x31\x51\x14\x3d\x60\xe6\x89\x09\xe3\x50\xa3\x54\x27\x2b\x11\xdf\x9d\xec\x3b\x37\xd3\x90\xe6\x12\x9f\xb5\x55\xfa\x4a\x7d\xe4\x37\xe3\xd3\x5f\xd5\x99\x45\x2b\x73\x7a\xcf\xb7\xb8\x53\x92\xac\x5a\x44\xd4\xa5\xe5\xdc\x13\xb5\x96\xa0\x5f\xe0\xfb\x5b\xb6\x2b\xd0\x62\xc4\x33\xcb\xf4\xbc\x0e\xae\x94\x43\x4c\xcb\x5e\x58\xe8\x34\x70\x24\x0d\xc9\x07\x45\xd2\x4b\x54\x5a\x3a\x19\x65\x01\xc7\x66\x89\x1b\x7b\x6b\x2b\xf1\x27\xbb\x3f\x14\x57\xaa\x57\xe6\x47\xc9\x31\x75\xa1\x66\x85\x48\x3a\xfe\x0e\x68\xcb\xfe\xa1\xac\x94\x57\xd5\x8f\xae\xa6\xa4\x13\x76\xf3\x96\x5c\x2a\xe3\x1a\x3f\x78\xfc\x12\x1f\xb7\x59\x1d\xaf\x34\xdf\x1f\x31\xb3\x33\x33\x7a\xd2\xec\xe2\x98\x5f\x2e\xb5\xf4\x52\x46\x2f\x24\x40\xa9\x72\xa4\x06\x63\x9a\x3c\xbb\xcc\xde\xc4\xa6\x13\x4e\x5b\xc7\xf7\xdf\x88\x8d\xf4\xa0\xb8\xd2\x7f\x6e\x1d\xc0\x82\x1b\x35\xfd\x60\x0f\xef\x15\x94\x07\xff\x69\xf0\x70\x6b\xc9\x8c\x0d\x22\x23\x98\xe1\xcf\x8d\x06\x49\x12\x64\xff\x23\x65\xcf\x0a\x48\x2f\x3d\x3f\xc2\xa5\xac\x1f\x60\x55\xf5\xa0\x2c\x19\x34\x5e\x35\xde\x96\xe0\x0a\x3f\x58\xd3\xa6\xfe\xda\x00\x06\xf1\x70\x23\x96\xf9\x94\xd9\xac\x24\x08\x5d\x13\x76\x3a\x54\x68\x72\x10\xa9\x97\x4f\xd5\x76\xb2\xd6\x17\xc2\x3f\x78\xc8\xfd\x24\x59\xa7\xbe\x41\xcd\x20\x5d\xac\xea\xa5\xef\x2f\x39\xaf\x60\x2e\x37\xf5\x1f\x02\x51\x6a\x99\x41\x1c\xca\xf3\x14\xfe\x53\x80\xdd\x1d\x70\x3f\xbf\x69\x42\x40\x59\x5a\x51\x47\x9d\x7f\x6b\x58\x8a\x71\x31\x3b\xc7\xc3\x60\xcd\xdc\x49\xba\xd2\x48\x76\x2a\xa3\x58\xd2\xc9\xc5\x17\xdd\xc0\x10\xdd\x6a\x4f\xa6\xdf\xfc\xf8\xfb\xaf\xe0\x14\x0a\xdf\xac\xa5\xfe\xdf\xff\xef\xff\xf9\xff\x03\x00\x00\xff\xff\x71\x1d\x08\x34\x38\x36\x05\x00")
+
+func dataEnglishJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataEnglishJson,
+ "data/English.json",
+ )
+}
+
+func dataEnglishJson() (*asset, error) {
+ bytes, err := dataEnglishJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/English.json", size: 341560, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataFemalenamesJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\xbd\x4b\xb2\xab\xbc\xd3\xe5\xdd\x7f\x47\xf1\xc6\xbf\xfd\x8d\xe0\x1b\x43\xcd\xa0\xa2\x1a\x32\xc8\x20\x5b\x80\x0f\x17\xef\x83\x2b\x6a\xee\xa5\x14\xde\xe4\x6f\x71\x2a\xe2\x69\x1c\x1e\x6f\x63\x90\x52\x79\x5d\xb9\xf2\x7f\xff\xd7\x7f\xff\xf7\x7f\xfe\x47\x5a\xd6\xff\xfc\xff\xff\xfd\x3f\xcb\xbf\xcb\xd5\x10\xe6\xfd\x3f\xff\xdf\xf1\xef\x57\x58\xe7\xd4\xa4\xf0\x7b\x9d\xd3\xd8\x9e\x17\xb7\x30\x97\xff\xce\xcb\x98\xd3\x27\xdc\xe2\xda\xff\xfe\x8f\x47\x1c\xc7\x74\x8f\xf3\xef\x75\xb9\xb1\xdf\x69\xd9\x96\x30\xe2\x93\x2e\xcc\x71\xfd\xbd\x6e\xa7\x79\x5a\xfb\xdd\x7f\x75\x39\xbf\x37\x86\xb1\x39\x3f\x78\x96\x2f\x9d\x37\x29\x3f\xbd\x9e\x9f\xf4\x31\xfb\x27\xe5\x97\x5a\x7f\xce\x76\x1a\xc7\xf3\xa2\x09\xf3\x94\x7f\x2f\xe6\xcd\x1f\x7e\xe9\xcb\x27\xfe\x80\xa9\x29\x77\xcc\xf1\x7c\xa2\xb0\xf9\x0d\x97\xb2\x08\xe7\xf7\x9e\x69\xb8\xc5\x39\x9f\x0f\xd2\xc6\xdb\x84\x8f\x1f\x71\x59\x52\xe3\x5f\xed\xd3\x9c\xe3\xf9\xc7\xcd\x3e\xae\xbd\xaf\x51\x18\xbb\x98\xcf\xab\xa1\x2c\xf0\xe2\x0b\x71\x2b\xaf\xee\x7b\x11\x86\xdd\xbf\xe5\xaf\x37\xc7\x5b\x6c\xfc\xe7\xde\x69\xee\xd2\xe8\x3f\xf0\x0c\x6b\x9f\xa3\x2f\xd4\x2b\x0c\xfc\xc1\x30\xaf\x7d\xc0\x8b\xcc\xf8\xb9\x80\x1f\x5f\xd6\xf8\xea\xc3\x98\xa2\xac\xea\x7e\xde\xb6\xe9\xe7\x22\x61\x69\x8c\x94\x84\xf3\xe2\x11\x46\xdf\xf9\xa6\x3c\x51\x9c\xf1\xa7\xf7\xb9\x6c\x78\x5c\xf0\x72\xe7\xf7\xa6\xbd\x39\xff\xac\x4d\xc1\xbf\x13\x72\xf2\x4f\x1e\x5b\xf6\xdf\xea\x63\xbd\xff\xef\xe5\x1a\xe7\xb8\x40\x30\xca\x63\xfe\x5e\x74\x79\x82\xb4\xc6\x77\xc4\xfb\x3c\x62\xc0\xbb\xc5\x79\xcf\x2e\x27\xb9\x9d\x63\xcb\xf5\x95\xb7\x79\x4c\xfe\xcd\xb0\xf4\xd8\xfa\xc7\xd6\x26\x97\xbe\x79\x5a\xb8\x3e\x78\x9d\x67\x11\xc3\xf3\x4b\xe5\x83\x29\xe3\x4d\xdb\xfd\xba\xe4\xb2\xd5\xe7\xa7\xf6\x54\x78\xf1\x5b\x79\x3d\x11\xd9\x31\xf9\xcf\xaf\x61\x70\xd9\x4a\x45\xe8\x64\xe3\xce\x03\x51\x56\xeb\x7c\xf8\x60\x87\x85\x7b\x8d\xb5\xb3\xa3\x18\xe5\xa9\x66\xff\x30\x4f\x1b\x7e\x79\x81\x72\x29\xfb\x8e\xdf\x6d\xfe\x6c\xe5\x30\xf8\xff\xf9\xa1\x34\xde\xca\xf9\x4e\xb2\xfd\x7e\x1c\xb6\x9b\x2b\x95\xc9\x37\x9b\x0b\xf5\xea\xf7\x9c\xfd\xa3\x71\x9a\x07\xff\x2c\x6c\x7e\x3c\x4c\xe4\xf8\x7c\xfe\x9b\x39\x95\x3b\xf8\x46\xc7\x22\x15\xbb\xef\xec\x2d\xf9\x79\x8b\x5d\xe7\x5b\x36\xef\xcb\x1a\xb2\x0b\x60\x68\xf7\xf3\x31\xe6\xb4\xfa\x0f\x87\x1f\x17\x3f\x79\xd9\x7b\xd9\x86\x38\xba\xb0\xac\x65\x2b\xce\xfb\xc7\xd6\x1f\x77\x4d\xf7\x7b\x18\x77\x9c\xd7\xc1\xb5\x40\x11\x3e\xd7\x8f\x45\xe1\x9f\x7f\xd6\x95\xdb\xf9\x9a\x47\x7c\xf2\x4e\xcd\x2a\xe7\x85\xc2\x5c\x54\xa2\xeb\xbb\x38\xbb\x75\x59\xf6\xfc\xf6\xef\x3c\x8a\xcc\xbf\x7a\xec\x6a\x91\xd2\x3c\x40\x55\x96\x35\x76\x8d\x5c\xee\x94\x7c\x2f\xe2\x0a\x89\x33\x45\xed\x8b\x9f\x83\x2a\x9e\xc7\x34\x8b\xa2\xe2\x55\xd1\xf9\x79\x5a\x57\xff\xf3\x69\x84\xb2\x8e\x0b\x75\x87\xc9\x02\xee\x1c\x07\x7f\xd4\xc7\x56\x8e\xec\x0a\xd9\xc0\xc5\xdc\x4f\x90\xd5\x3e\x7c\xfc\xb9\x83\x59\x0e\xd7\x38\xd4\xbc\x37\x7f\xc8\xf0\x2a\xe7\xe9\x94\xb4\xb8\x40\xbb\x35\x19\x27\x26\x6f\x4d\x82\xc5\x7a\x84\x21\x89\x1a\xc2\xa3\xe7\xa2\xcf\xa6\xf3\x97\xdf\x21\x47\x2c\x4a\x6b\x8a\x1d\x37\x1a\x62\x07\x1d\x96\xe9\x1d\x2c\xdb\x87\xf7\x3d\x8c\xe6\x79\xd9\x05\x7f\xee\xf2\xa2\x34\x2d\x65\xd9\xa1\x57\x8a\x32\x92\x75\x7f\x94\xf7\x38\x9f\x75\xf6\xd3\xd3\xc5\x39\xe4\x16\x7b\x60\x56\xd9\x77\xbe\xa1\xc6\xab\x6f\x0c\x65\x35\x53\x2a\x8a\x7a\x82\xaf\x00\xfd\x3a\xc7\x0e\x9a\xa1\xfc\x76\x03\x9d\x59\x5d\x23\x5f\xa6\xc9\xce\xde\x82\x17\xa4\xd6\x0e\x5b\xd1\x7a\xe7\x6d\xf7\xf7\x84\x65\xb2\x25\x83\xcc\x3d\x36\xb5\x93\x2e\xf2\x2d\xf4\x4d\xd1\x14\x0d\x2c\x3e\x0c\xfe\x18\xcf\xaf\xa7\x16\x96\xff\x0d\x8d\x54\x94\x50\xd9\x00\x97\xc2\x09\xef\x7c\x2b\xaa\x66\x85\x6e\x30\x8f\x80\xba\xad\xbc\xe5\xea\x5f\xdd\xa7\x4c\xdd\x6b\x96\x91\x2f\x63\x3b\xe2\xdf\x2d\xda\x1e\x17\x66\xa0\x7c\xb7\xde\xe5\x8b\xf0\x6e\x02\x4f\xfe\x06\x51\x5d\xfc\x0e\xea\x6b\x52\xf2\x8a\x3a\x7a\x26\x9c\x71\x57\x14\x2b\x4e\x88\x19\x59\x3a\xbb\x45\xa1\xc0\x17\x2a\xbe\x81\x9b\xb4\x22\x6a\xeb\xbc\xb5\x11\x87\xcb\x8d\xe9\x34\xee\x70\x82\xb3\xec\x91\x6f\xfa\x4f\xc2\x2b\x51\xac\x9e\x87\xa5\xf6\x37\x59\xf0\x8e\x63\x28\x26\x01\x87\xbf\x1b\x5d\xc6\xca\x39\x09\xa2\xba\x70\x86\x6e\x72\x97\x36\x8a\x70\x9a\x27\x89\x4d\x7b\xc5\xf2\xdd\xf3\x17\xe4\x36\x83\x9d\x28\x1c\xa9\x22\x28\xb8\x0c\x66\x28\x5d\x3e\x8b\xa7\x80\xd5\x2d\xee\x99\xaf\xde\x54\xfc\xce\x00\x9b\x55\x96\x06\x66\xaa\xda\x4b\x6a\xb1\xe2\x0b\xf9\x7d\x42\xd9\x4b\x9e\x08\x28\x1c\x93\x53\x8f\x0c\x22\xef\x32\x24\x1a\xc6\x41\x5f\xab\xd8\x8e\xd6\xf7\x36\xd3\x91\xce\x3b\x7e\xfb\x9d\xa6\x8c\xc7\xde\xe6\x75\xf4\x0d\xad\xe1\x8c\xeb\x8d\x95\x5b\x5f\x1d\x60\x68\x98\xe2\x5a\x62\x61\x44\x4c\xf1\x8c\xeb\xca\xab\xbf\xf8\x7e\x82\x13\x32\x94\x20\x8b\xde\xd5\xe2\x8a\x74\xd8\xe7\x15\x41\x4a\x44\x9c\x53\xfd\x41\xb8\x78\x8c\x12\x4a\x94\xb7\x78\xe4\x54\x5c\x58\x97\x53\xb3\xf2\x93\xb8\xbe\x5c\xd6\x11\xaf\x65\x31\x1c\x3e\x49\x8c\xb1\x16\x8d\xc0\x8a\xbd\xe9\x5d\xf8\xc6\x11\xf1\x9c\x47\x9e\xe5\x79\xcd\x80\x21\xf0\x9b\x86\x24\xeb\x7b\xfe\xd8\x94\x3b\xd7\xcb\x22\x4b\xe6\xa3\x8d\xe2\x0e\xf9\xfe\xe5\x38\x8d\x81\xef\x75\x7e\x72\x8f\x6a\xd6\x26\x84\x4c\x43\x2a\xbb\x3e\xf8\x11\xc4\xa1\x2e\xa1\xd6\xd3\xd5\xe8\x44\xa3\x6d\x82\xe4\x41\xce\xf3\xe2\x9b\x17\x0d\x92\xfc\xfe\xd8\xa6\x21\xb8\x33\xdc\xd3\xf1\x6f\x43\xf2\x1d\x9b\xc3\x80\x37\xa9\x2e\x56\x82\xcd\x7a\xd2\xdb\x9e\xb9\x2f\xc5\x35\x9a\x71\x08\xc7\x76\xc1\xea\xd8\x65\xc0\x11\x1e\xe1\x91\x74\x5b\x68\x43\xde\x5e\x50\x37\xa2\x51\x8e\x78\x1e\x5e\xcf\x22\x51\x52\x03\xb1\xb9\x87\xdd\xb5\x5b\x1b\xa8\xf7\x20\xd8\x4b\xb8\xf1\xc9\xd3\x72\x39\x03\xdd\x56\x5e\xd4\xcd\x4e\x2f\x47\xa9\xaf\x4e\xde\xb9\xfa\x03\xad\x5d\x13\x8b\x90\xa5\x8b\x2e\x3e\xdf\xaa\xc4\x9e\xae\x27\x6e\xc5\xd2\x15\x87\xc6\x1f\x09\xfe\x6f\x31\x25\x17\xef\xca\x9f\x15\x41\x65\xdc\xc4\x29\x18\x71\x60\xca\x61\xff\xb8\x0e\x92\xb5\x6c\x25\xd6\xb1\x10\x1d\x29\x82\x2c\x96\xbc\x6e\x53\x2a\xe1\x9c\xbf\xec\x98\xfe\x6c\x78\x34\x7f\x9f\x07\xcd\x7a\x39\x79\x99\x02\xbf\x43\xff\x8e\x17\xb9\x85\xf7\x5c\x9e\xd3\xdf\xe7\x1e\x2e\x2a\x77\x87\xcf\x35\xbd\x3c\xb4\x09\x62\x36\xf6\x37\x3d\x86\xf2\x76\x93\xaf\x6b\xde\xce\x45\x59\x36\x2c\x71\x51\xae\x88\x1c\x2c\xec\x09\x72\x50\x5c\x8e\x9f\xb3\x1e\x28\x78\xc1\x19\xc1\x5c\x86\xa2\x2f\x76\x75\xc4\xa1\x2e\x7f\xd5\xfb\x96\xad\x53\x12\x0f\xc7\xd6\x40\xb2\x0d\x61\x14\x6f\x48\xfe\xf8\xe5\x9a\xc3\xe2\xf8\x73\x2b\x7e\xfa\x44\xcb\x52\x64\xbd\xed\xa0\x2e\xe8\xc0\x34\xdc\xfd\x1c\xd6\x69\xa7\x1a\xf7\x37\xb5\x65\xf0\x3f\xec\xca\xf6\xd2\x1b\xc0\xcb\x26\x28\x2d\x73\x84\xa9\x71\x5c\x8f\x1c\xc6\x6e\x84\xbc\xcc\xb4\xd0\x16\x8f\xbb\x91\x88\xb0\x56\xf5\xd4\xd0\x40\xc1\x0a\xac\xd4\xb2\xe5\xe9\x65\xcf\xe0\xa6\xfd\x0d\xe2\x2e\x77\xa6\x9e\xf1\xf1\x0d\xd9\x85\xb6\x9c\x74\xfc\xb1\x85\xb2\x74\x9f\x72\xfc\x2b\x96\xe8\x36\x4f\xd3\x53\x1c\x4a\x78\xbe\x4b\x68\xe9\x6c\x16\xa1\x68\xb9\x99\x66\x4d\x12\x0e\x96\x8b\x5c\xe4\x4f\x94\x13\xdf\xc3\x56\x59\x72\x24\x50\x77\xdd\xfc\xb3\xf2\x13\x51\xf3\x64\xe6\x3d\x53\xcf\x35\xdc\xba\x48\x03\xff\xd4\xec\xc1\xb1\x4a\x23\xf4\x29\x03\xa5\xb2\x7b\x6e\x21\xaa\xe7\xa2\x16\x53\x12\x1e\xe2\xcf\xd3\xe0\xc3\xe8\x14\xff\x26\x4a\x02\x21\x4a\x8a\xaf\x8d\x4b\xb1\x34\x91\xa7\x68\xa4\x87\x37\x26\x04\x4e\xf0\x45\xbe\x59\x2c\x24\x03\x23\x14\x63\x9c\x25\xcd\x50\x04\x50\xb6\x07\xd2\xdb\x5c\x0c\x6e\xe4\xc9\x8f\xa9\xeb\xfd\x9e\x5d\x0f\x9f\x6e\x7a\x21\x1b\x1b\x2d\x63\x04\xc9\xd2\x8c\x70\x57\xc2\xa2\xf2\x7f\x46\x18\x16\x1e\xc0\x39\xd8\x11\x39\x2d\x52\x1c\xcd\x22\x21\x45\x90\x77\x04\x3f\x0f\xe8\x10\xf3\xc0\x5c\x9f\x60\x6b\x2e\x89\xf9\x60\x5a\x4b\xf4\x23\x32\x78\xb4\xa4\x89\x39\x97\x58\x2e\x90\x19\xe7\x13\x17\x67\x21\x52\xb3\x24\xc8\x00\xe5\x4e\xbc\xee\xa2\xd6\x1f\xfe\x4c\x48\xd0\x64\xbc\x52\x4b\x7d\x36\x30\xc1\x24\x41\xcb\x40\x03\x5b\x7f\x94\x61\xa0\xa4\x8d\xee\xe9\xa2\x74\x19\x07\xcc\x0c\x50\xdb\xf4\x97\x06\x00\x2b\x68\xd9\x6e\x78\x25\x14\x2c\xe4\xc4\x1f\x53\xcf\xf3\x61\x55\x02\x38\xa5\x03\x33\x2e\x25\x1c\x4a\xf8\xbb\x1f\x88\x1f\x0b\x1a\xf1\x36\x49\xb0\x7d\x3b\x3f\xc1\x59\x33\xc9\x4e\xb8\xf3\x2d\x21\x7d\x32\x71\x07\x7e\xd2\x98\xee\x4c\x41\xeb\x09\xb2\x63\x89\xac\x65\x79\x10\xbf\x4f\x48\x83\x9f\x51\xee\x71\xd1\xda\x23\xd7\x89\xe1\xf4\x40\x83\xaa\x4e\x5b\x79\x31\xb8\x80\x2f\xcd\x97\xcc\x4c\x83\x1d\x3e\x2b\xfc\xc0\x96\x67\xbe\x18\x10\x86\x52\x16\xcb\xba\xbe\xb0\x20\x9b\xdf\x9c\x99\x95\x6d\x68\xc2\xca\xa2\x31\x05\x55\x8e\xa7\xa9\x3e\x17\x9b\x1f\x3f\x9f\x0d\x33\xcf\x2d\x72\x58\x56\x4f\x79\xba\x3b\x60\x02\x44\xe1\x9a\x66\xa4\x9c\xe2\xfd\x8e\x2d\xe3\xb2\x97\xbb\xc0\xb3\xe5\xee\x95\x70\x7b\xa2\x85\x64\x80\x45\x7d\x61\x59\x4a\x38\x6f\xf4\xf8\xcb\x2f\x61\x0f\xc6\xf4\x7c\x5e\x54\x7d\xd0\x95\x5d\x1a\x1e\xa5\xa4\xe6\x4d\xe4\x06\x1a\xca\x0c\x88\x17\xde\x2c\x63\x04\xf7\xc5\xea\x02\xac\x95\x95\xb8\xb9\xf5\xe4\x43\x4d\xd2\x41\x13\x32\x2e\xbf\x17\x1d\x06\xd5\x84\xd0\xbb\xfc\x1c\xcc\x57\x39\xff\xfe\x73\x89\xce\x1a\x97\xa5\x1e\x33\x26\x89\x02\x12\x62\x4d\x39\xe1\xd9\xdf\x21\x8d\x5d\x71\xba\xce\xab\x37\x4c\x45\xf1\xa9\xd3\x25\x8e\x76\xed\x3c\xe5\x96\x8b\x84\x14\x51\x51\xd6\x2c\x7e\x1e\x25\x17\x48\xf1\x88\xcd\xc4\xf1\x7a\x5c\x13\x68\x92\x5e\x6a\xa8\x13\x2d\x8f\x52\x8c\xca\x44\x85\xf3\x84\x5f\xb4\x50\x62\x8e\x3a\xa4\x1c\x0c\x57\xef\x8c\x88\x5a\xd1\xa5\xe5\x50\x64\x57\x8a\xbe\xc5\x5a\xe1\x38\xea\xb5\x11\xea\xca\xbf\x65\x79\x33\x28\xf8\x57\x2c\x52\xf7\xb9\x68\x05\x97\xab\xa3\x7a\x1a\xe1\xc6\x52\xdd\xf6\xe2\xf2\x34\x25\x82\x77\x35\x10\xef\x8c\x67\xcc\xf1\x9b\xd3\xe4\x2a\x52\xbc\x0d\x78\x58\xa2\x3c\x19\xd2\x06\x2a\xe9\x22\xc3\x3c\x09\x08\x3e\x6b\x1d\x9b\x79\x37\x6c\x5e\xfd\x4c\xb4\xbe\x87\x0d\x16\x77\x7a\xf0\x57\xe3\x59\x66\x6e\x16\x96\x06\xa7\x86\xde\xf5\x2b\xa4\x0e\x01\xdd\x78\xa9\xbb\xf1\x2e\x78\xed\x36\xbc\x7a\x56\x48\x5d\x32\x4c\x2b\x78\x55\x23\xae\x2e\x25\x5d\x55\x01\x7e\x8f\x34\x4c\x1d\xeb\x7f\x13\xcf\xee\x33\x52\xef\x64\x66\x5a\x2c\xc3\x06\x8f\xc6\x62\x79\xdc\xf5\x09\x1d\xbd\xcd\x0b\x5d\xb3\xf4\xf9\x40\xcb\xa5\x99\x09\x63\x93\x0c\x51\xd2\x52\xe6\xd9\x19\x9e\xec\x52\x3b\xc4\x52\x76\xa2\xe3\x8a\xf3\x02\xbf\xbd\xd6\xc4\xa4\x18\x0e\x79\x38\xe2\x8a\xb1\xf5\xf3\x64\xe9\x0e\xa6\x84\x13\x94\x92\xc9\xf8\x47\x6e\xe4\x98\x03\xab\xd9\x30\x7e\x8c\x22\x9e\xc5\x30\x46\x16\x19\x3b\x79\xcd\x7b\x59\xc7\x96\xee\x16\x8f\xcd\x06\x93\xfd\x6f\x7e\x55\x43\x58\x45\x01\x1c\x3f\x73\xdd\xaf\x0c\x23\xb5\x6e\x83\x27\x05\xca\xb7\x83\xd6\xb8\xa1\x12\xab\x79\x76\x81\xbc\xe8\x51\x0f\x9f\x36\x89\x7b\x98\x55\xcb\x1b\x6d\x96\xe5\x7a\x04\x28\x52\xfc\x47\x26\x38\x96\xa9\xd8\x8a\x79\xc2\x9f\xd3\xef\xb7\x6f\xe3\xb3\xb7\xbb\x11\x8d\x98\xe1\x9a\xbc\xe3\x86\xad\x1f\x3c\x0f\x4f\x6e\x96\xba\xc3\xe1\x7b\xd2\x57\xa1\x8c\x4a\x79\x21\xb3\x0c\x99\x83\x80\x52\x7e\x92\xbc\xf1\xb8\x41\x0e\xbb\xe0\x3f\xbe\x70\x9d\x5a\x2a\xf1\x65\xbf\xb9\xa7\x13\x6e\x5e\xf5\x4e\x6f\xe4\x80\xe9\x34\x6a\xe6\xa6\x41\x06\x06\x62\xff\x90\x8c\x40\xd7\x06\xaa\xe3\xe9\x4e\xa9\x19\x62\x60\x9d\x70\x6b\x99\x29\x5e\x99\x63\xce\x2c\xe4\x96\xdd\x1b\x79\x9b\x5b\x62\xfa\x60\x29\x1a\x48\x75\xed\x8e\xc0\x1a\xb9\xba\x0a\x74\xa1\x11\xa5\x6e\x32\xdc\x12\x94\x5c\x2d\x4e\x88\x9a\xc6\x66\x47\xa4\xb0\xbe\x69\x19\x3f\x38\x73\x3f\xb1\x94\x0b\x95\x6d\xfa\xc8\xad\x21\xd4\xf0\x91\x46\xe0\x19\xce\x13\x83\x1e\x2c\x85\xc9\xb9\x2b\x9c\x6d\xed\x91\x5d\x8f\x58\xbf\x72\x02\xe2\xfc\xa6\x1a\x70\x39\x58\xc5\xaf\xce\x11\x51\x43\x5f\x7e\x0a\xb5\x2f\x73\x0d\xcf\xcf\xde\x21\x33\x7c\xbf\xcd\x92\x14\xa8\xca\x0f\xd9\x9e\x12\x10\x48\x52\xd0\x2a\x56\x10\xfb\x37\x9e\x34\x88\xda\x83\x43\x99\x53\xcb\x02\xd1\x4c\x85\xf2\x9b\xb5\x91\x0a\x52\x13\x5f\x0d\x6a\xa3\x6b\x92\x98\x0c\xd0\xad\xd9\x73\xe8\xed\xa4\xc5\xdc\x27\x6c\x84\xc7\x6a\x31\x8f\xe2\x29\x5d\x4a\x17\xe5\x43\xec\xc3\x9b\xba\x65\xa7\x9b\x20\x41\x5e\x89\xd8\x02\xd6\x7e\x89\x0c\xaf\xa8\x87\x82\x46\xd3\xf7\x24\x71\x2d\x12\xa0\x2d\xab\xa5\xa3\x84\xbc\xdf\x7c\xf7\x0a\x55\xc3\x6a\xf7\xab\x18\xed\x3c\xbd\x10\x21\xe7\xd0\x95\x3d\x3d\xdf\x7f\x60\x46\xfc\x16\x05\xca\x50\x64\x0b\xa9\xdb\x0a\x61\x42\x58\x0a\xab\x17\x97\xa1\x96\xe7\x35\x64\xf0\x8f\xdf\x78\x1e\x13\xa0\xf3\xf2\x43\xa5\x36\x04\xa9\x2b\x8c\x92\x66\x2a\xfe\x6e\x7c\x22\x90\xda\xb8\x51\xbd\xe9\x50\x97\x6f\xe6\x7d\x8b\xf3\x03\x5f\xf5\xd7\x94\xf3\x00\x31\xbf\x1e\xa4\x60\x32\x53\x2a\x1f\x22\x1a\x66\x9a\x1d\x45\x61\x18\x03\x94\x04\x18\xa1\xb5\xd4\xaf\xe5\xe5\x2f\x49\xbf\xc3\xf1\xa0\xfa\x88\x03\x8d\x51\x43\xa0\xd1\x07\xce\xc1\x78\x71\x22\x27\xaa\xee\x78\x2d\xec\xe6\xf2\x84\x04\x00\xf1\x53\x6e\xf9\x22\x3e\xb7\xed\x31\x54\x69\x31\xfe\x40\xb0\x65\x49\x11\xe7\xf0\xe4\x9f\xc6\xf6\x47\x2d\x71\xf1\x7a\xd4\xae\xc7\x99\x29\xd4\x5d\x2c\x1b\x3d\xfb\xbf\xe2\xe6\x43\x13\x55\x34\x19\x56\x72\xd4\x58\xca\x9c\xb4\x41\x70\x1f\x41\x80\x18\x89\x4b\x50\x33\x1b\xe7\x1a\x6c\x1f\xb9\xd1\x34\x4b\x32\x75\xc7\x4f\x68\x1a\x96\x8a\xb0\x15\x57\xa1\x4a\xd9\xa8\x6b\x07\xa9\xe3\x53\x6e\xb0\x41\xcf\xb0\x48\x05\x7a\x17\x20\xcf\xfb\xea\x21\x1a\x3c\x50\x8b\x2b\x30\x14\x41\x60\x73\x7b\x89\x4e\x71\x7e\xcd\x4a\x61\x77\xda\x2e\x72\x95\xa1\x88\x5e\x52\x68\x38\xc0\x43\x90\x5d\x7a\xa1\xeb\x47\x9c\xaa\xd3\xd0\x99\x05\x96\xf5\xad\x08\x00\xc5\x80\x62\x69\x16\xf1\xc3\x69\xa1\x8b\xc8\x49\x14\x72\x04\x67\xfe\xd7\x02\xaa\x4a\xed\x4c\xd1\x58\x92\x14\x4f\x90\xae\x8e\xcc\x98\x16\xcb\x07\xd0\x4f\x4c\x33\xee\xd2\xe1\xa0\xdc\x24\x11\x15\xac\xf2\xec\xf5\x1e\xcb\xad\x42\x6e\x4d\x05\x61\x1b\xad\xe6\xee\xe9\x1c\xea\x79\xa9\xf5\x95\x25\x7c\x23\x34\x13\x97\x20\x68\x7a\xb9\x6a\x0d\x37\x61\x13\xf4\x94\x1a\xef\x85\xf9\xbb\x5a\x79\x44\xe9\x9f\x4b\x59\x51\xb5\xd8\xb2\x56\xe2\x14\xcb\xf0\x28\xb0\xef\x8e\x0f\xbb\x0d\x19\x94\xe3\x1c\xc0\xbe\xd2\x1b\x0a\xa6\xff\xa1\xe1\xdf\xf6\x08\x28\xc6\x85\x72\xa3\x85\x70\x0d\x98\x8e\x03\x39\x23\x92\x02\xa5\x5a\x2b\x5d\xd7\x23\x8d\x4d\x96\x4a\x43\x16\xb4\x44\x18\x5e\xc1\x23\x0c\x3b\x61\x62\x92\x90\x39\xa4\x28\xfe\x24\xb5\x85\xbe\xae\x25\x7a\x89\x40\xc2\x6f\x74\x94\xd3\x3f\x47\x3b\xa8\xd0\xd0\xfd\x84\x92\x64\x05\xb3\x9c\xea\x96\x82\xc1\xd5\x06\x88\xec\xd8\x51\xdf\xec\xe6\x89\xbd\x2f\xcb\x91\x2e\x25\xe9\xa8\xb0\x4a\xc4\xcd\x0a\xe9\xa5\x24\x34\x61\xb9\x94\xdf\x0e\x8f\xda\x77\xd4\xde\x71\x0d\x14\x39\x82\x39\x2e\xb0\x39\xa9\x31\x19\xb8\x8c\x99\x40\x45\x65\x1b\x22\x7c\x5c\xa9\xc2\x22\x1e\xb2\x16\xbd\x60\x0b\xa9\x62\x4c\xc9\x0a\xa2\x34\x7b\x2c\x5f\xe1\x6d\xe7\x0e\x44\xc0\x50\x3a\x6e\xf7\x0c\x77\xa3\xdc\xee\xcf\x96\x14\x7b\x87\xa4\x2b\x45\xc6\xfc\x1b\x22\xa0\x6d\x6d\x10\xea\x7e\x91\xf1\x48\x9e\x69\x4a\x33\x4f\x5c\x4a\xab\x91\x27\x16\x46\x7f\x22\x15\xe3\x0e\x13\xff\x83\x20\xc4\x6a\xfa\x97\xc4\xee\xa9\x72\x00\x45\xab\x0e\x39\x14\x8e\x29\x2a\x3a\x5c\x37\x6e\x79\x97\x70\xf0\x82\x38\x94\x6f\x56\x05\x5e\x61\xf4\x52\x20\x0b\x23\xc5\x23\x92\x34\xd7\x9a\xe0\xfe\xb7\x1a\xb2\x59\x54\x48\x97\x48\x94\x00\x02\xac\x12\xbc\xc6\x46\x83\x08\xba\x03\xf9\x1f\xb8\x3c\x12\xd0\x47\xf6\xce\xb7\x34\xce\x03\xbb\x2c\x2c\x08\xf3\x23\x20\x87\x78\x05\x6c\x7e\x6a\xd6\x40\x38\x74\x68\x99\x2d\x46\x8e\xa8\x8b\xea\xc6\x7c\x9b\x53\xa0\xca\x98\x8d\x1f\x05\x37\x64\xe8\xcd\x5e\x8d\xa0\x8b\xe6\x34\x22\x7f\x9c\x8b\x29\xe0\x6e\x58\x83\xc2\xf9\x13\xbd\x64\xe0\xc3\xb8\x96\xa3\x29\x8e\x86\x25\x5a\xfc\x58\x5b\x34\x9c\x5a\xfa\x65\xbe\xae\xdc\xae\x28\xf5\xa8\x56\x6c\x41\x4e\x48\x63\x54\x1f\xe4\x5c\x0f\x62\x57\xac\x06\x05\xdf\x71\xa0\xcf\x69\xa5\x4a\xd4\x30\xbe\xb9\x66\xe4\x06\x97\xc1\x8f\x8f\x45\x68\x0c\x4a\x5a\x38\xfa\x5c\x15\x29\x2c\x17\xd3\x86\x47\xae\x91\x14\xfc\xfa\x81\x79\x9d\x40\x7c\xd8\x3c\x35\x9e\xac\xae\xe7\x18\xf1\x75\xbb\xaf\x0e\x3b\xaa\x21\x17\x2a\xd6\x8b\xc8\x93\x39\x40\x58\xc1\x8e\xe5\xaf\x4c\x79\x7e\x99\x69\x0d\x94\xa0\x10\x99\x2c\xde\xa5\x45\x4a\x5d\x15\x9a\xe4\x0d\xee\x41\xf3\x47\x10\xf1\xb5\xf7\x48\xd4\x28\x6b\x31\x15\xaf\x80\x0c\x38\x53\xd5\x52\xdc\xba\x69\x95\x3d\x2d\xb2\x15\xdf\xe0\x89\x41\x18\x9a\xa2\x5a\x05\xad\xb4\x71\x88\xeb\x4c\x55\x01\x7f\xe1\x11\x2e\x4d\x25\xa6\x00\x80\x4f\x4e\x92\x25\x92\x63\x74\x2f\xa6\xc7\x6f\xb4\x4a\xb6\xf5\x0b\xae\x67\x74\x87\x52\x1d\x1c\xd2\xa2\x75\xad\xdf\xe1\x62\xe1\x21\x9e\xe6\x1a\x48\xf0\xb2\x6a\xe2\x98\x41\x1a\x76\x8c\xf6\xd7\x3a\x09\x10\x3d\x6c\x6d\xd2\xd4\x25\x57\x26\x01\xf6\xd4\x28\x70\x50\x15\x43\x5f\xf4\x4d\x1c\x89\xca\xed\xe3\x44\xc0\x6b\xed\xb2\x62\x0b\x84\x65\x57\x89\x6a\x57\x47\x32\x4b\x13\xc8\x4d\xb7\x70\xa4\x5d\x6d\xf9\xc8\x56\x89\x75\xac\x5e\x51\x1d\x2e\x5a\xcc\xac\x32\x22\x79\x43\x56\x0c\xc1\x27\x0e\xb3\xa6\xbc\xac\xb4\x82\xde\x9c\xcd\x0a\xfd\xf3\x20\x82\x37\x41\xb7\x1c\xc5\x65\x0d\xea\xe9\xe4\x49\x10\x93\x27\x56\xac\x8b\x32\x45\x75\xa9\x57\x50\x73\xa8\xf2\x0f\x03\x86\x65\x0e\x9d\xa4\x98\x8a\x5f\xda\x06\x77\xfc\x92\x65\x6b\x7d\x8f\xd2\x5b\x23\x63\x05\xe3\x57\x43\x7f\xae\x52\xa4\x49\x16\x1c\x82\x28\xe8\x35\x0a\x18\x38\xb1\xab\x22\x6f\x4d\x39\x31\x04\x97\x30\x3b\x62\x25\xc7\x1e\x9b\xca\xea\x50\x10\xb3\x7c\xd4\x79\x7c\x03\xb5\xcb\x62\xe9\xf9\xcd\x57\x91\x4b\xe6\xa3\xd1\x78\x64\xb6\x0d\x4d\x54\x2d\xdc\xd7\xd5\xa2\xe2\xf3\x6a\x1a\xf8\x5b\x2d\x9f\x6a\xa4\x71\x00\x76\x92\x69\xe8\x39\xdc\x83\x24\x39\x76\x58\x1f\xba\xcc\xe5\x3b\xbc\xf9\x9b\x87\xcd\x9a\x6a\xfc\x0d\xc5\xd6\xd1\xcd\xe6\xc6\x2c\x45\xbb\x13\x20\x32\x73\xeb\x8f\xf4\x3b\xf4\x88\xb8\xbb\xef\x48\xe8\x9d\x24\xff\xec\x80\x51\x43\xa0\x81\xce\x8a\x71\x90\x12\x4b\xbe\xf9\x87\x35\x15\xe6\x1a\x5b\x92\x6d\xcd\x25\x65\x63\xb9\xf9\x73\x5d\x27\x37\x0f\x87\x8b\x85\x23\xed\x26\x41\x4e\xc4\x01\x16\xe4\x8a\x0f\x1e\x21\x48\x3a\x4a\xce\x55\xf5\x0c\xa4\x13\x14\x10\x13\x39\x38\xe2\xe9\x1d\xf0\xce\xe0\x0f\x0c\xcf\x59\xb2\xf7\x51\x6c\xf4\x26\x2d\x34\xcf\x9d\x4e\xc2\x81\x2f\x38\xdf\xf4\x65\x59\x7a\x28\x87\x99\xf0\x3f\x3e\xf2\xd1\xd1\xe7\xa6\x25\x28\x88\x8f\xbf\x1f\x27\x38\xea\xb3\xe8\xfd\x07\xd7\xeb\x48\x44\xf2\xac\xb1\xac\x5f\x8e\x06\x83\x24\x48\x7d\x2d\xca\x75\x3c\x11\x2b\x7d\x30\x96\x07\x33\xa2\xdd\x9a\xe6\xf7\xe7\x97\xe2\x6b\x9a\x89\x38\xa3\xee\x78\xc7\x71\x3b\x77\xea\x00\xee\xfb\xaf\x35\x02\xfe\x3d\xde\x27\x49\x94\x52\x74\x0d\x01\xd9\xa3\xe2\x16\x8b\xfe\xd0\x76\x21\x6d\x6f\x5b\x80\x54\x64\xff\xab\xc9\xa0\xaf\xbe\xe1\xf4\x20\x33\x4f\xdd\xe0\xc7\x36\x76\xbe\xa3\xfb\x82\x2c\xfe\x8e\x0a\x5d\x90\xda\x4d\xc5\xb9\x68\x59\x13\xe7\x41\xa0\x19\xf7\x94\xa7\x01\xbe\xc1\xa7\xfc\x3b\xb1\x6a\x75\xd4\x0a\xc4\x3f\x81\xdd\x78\x03\x93\xbf\x31\x9f\xc5\xc7\x79\x5d\x4a\x40\x47\x97\x25\xd3\x94\x4c\xf5\x5a\x24\x7a\xbe\xb1\x98\xa1\xa8\xfd\xbf\x52\x46\x6a\x43\x35\x7e\xd4\x1b\x52\x75\xbe\x31\xb5\x39\x86\xa7\x00\xfb\x98\xc1\xae\xe9\x54\x44\x84\x9a\xca\x45\xe1\xa8\x15\xc8\x61\x2b\x5d\x9c\xd6\x7c\x4f\x7f\x6b\x95\xac\xca\xc4\x8c\xed\x37\x2d\x0e\x9d\xc1\x4a\x96\xa9\x4a\xd9\x9f\x5a\x5e\xe6\x59\x65\x31\xaa\x9d\xde\x8c\x19\x06\xc9\xae\x0e\x40\xf6\x7f\x1b\xa4\x4f\x99\x40\x8a\x7a\x25\x44\x73\x60\x11\xde\x92\xa0\x2b\xb3\xa0\x56\xbb\xbf\x68\x56\xff\x62\x43\xcb\x56\x02\x47\x7a\x4f\xd1\x0b\xb1\x97\xb4\x64\xf6\x96\xe6\xc7\xd4\x8f\x92\x33\x84\x73\xc2\x44\x8f\x99\xbc\xc8\x96\xf7\x27\xb2\xc8\xd2\xcd\xdb\x5f\x8c\xcb\x1e\x5a\x58\xd9\x57\x9c\xa5\xb8\xda\xb1\x61\xb9\x42\x92\x05\xbb\xd3\x13\xa0\x3f\x4c\x1f\xe9\x81\x35\xf7\xd0\x7b\x0f\x25\x1d\x51\x34\x41\x7b\xcd\x7e\x8a\xab\x95\x24\xff\xb3\x0a\x9e\x2c\x07\xf9\xf0\xdb\x38\x37\xaa\xa7\xe0\x8f\x18\xd0\x10\x6d\x7d\x5b\xb1\x0b\x33\x8e\x6e\x11\x7b\xaa\x89\x2f\x4d\x03\xce\x65\x27\x29\x49\x07\xa5\xfc\x42\x3e\x60\x5d\xd8\x63\x0a\xaf\x68\xbe\x10\x63\x4c\xcc\xa9\x1c\x72\x78\xee\xaa\xf4\x1d\x04\xeb\xcb\x56\x27\x07\x66\xa8\xc8\x39\x96\x68\x22\xa0\x31\x5e\x52\x91\x33\x0b\x40\x70\x8e\xca\xaf\x11\x16\xbc\xc6\xcb\x42\xc4\x91\xfe\xd2\x4d\xb0\xf2\x45\xb7\xa8\xd7\xdd\x48\x10\x2a\xc9\xad\x56\xe3\x44\x96\x16\x0f\x0e\x11\xc2\x5c\xc5\xb9\xbf\x91\xa3\xa4\xd8\xb1\xb8\xfc\x03\x30\x72\x17\x0e\x39\x86\x38\x4e\x6f\x04\x8e\x4d\x2e\x61\xed\xb8\xa6\x4b\xd7\xc3\x8d\x5e\x1c\xb0\xdc\xf5\xea\x1f\x09\x1b\xa9\x9e\x99\x2e\x6a\x82\xd7\xa6\x25\x77\xbc\x02\x62\x55\x5e\x5a\x8b\x0f\xde\xe7\x62\xea\xef\xfc\x77\x24\xf7\xc9\x9b\xd0\xd4\x37\x0f\x67\xcd\xd5\xfb\xae\x5a\xd5\x2a\x09\x42\x52\x4e\x6a\x09\xcb\x47\xd2\xad\x80\x6d\xa5\x91\x22\xac\x96\x0a\x44\x52\xad\x71\x12\x0e\xeb\x85\xf5\xa6\xb6\xbd\x5e\x0a\x89\x0a\x98\x12\x0f\xba\xb6\x5a\xfb\xda\xfc\x40\x28\xc7\x48\x2c\x41\x10\x9c\x58\x76\xa3\xdd\x4b\xc2\xf9\x5e\xa4\x73\x12\xa7\x33\x88\x97\x62\x41\x51\xa6\xcc\x91\x79\xc5\x9c\xaf\x4c\x35\xed\xdb\xb4\x9d\xaa\x22\x27\xa9\x6f\x66\x62\xf2\x61\x49\x25\xb7\xf4\x88\x02\xe9\x17\xc8\x6f\x5d\x20\x46\xbf\xbd\x04\x94\x41\xc1\x4f\x89\x7e\x37\xdc\x8a\x46\x3d\x25\xb3\x85\xc8\xc7\xa6\x0c\x77\xb7\x93\xfa\x7a\x74\xf0\x96\x94\x1b\xec\xf9\x11\x02\xbb\x16\xb3\x7e\x10\x3c\x46\x0c\x84\x44\xb6\x5b\x6e\x90\xba\x5c\xd3\x9b\x0e\x52\x16\xe8\xd4\x13\x38\x92\xe3\x68\xc1\xb1\x92\xfa\x84\x35\x1e\xb9\x2e\xf4\xd3\x53\xa1\x58\x04\xf0\x2f\xe2\xf4\x1b\x0e\x88\x66\x38\x06\x36\xac\xfc\x62\xb2\xb0\xb6\x8b\x58\x9f\x6f\x26\x16\xd1\xde\x28\xb6\x88\x4a\xb2\x52\x13\x11\x8a\x28\x70\x0b\x83\x49\x45\x26\xf4\xda\x24\x61\xea\xb8\x8a\x9c\x43\x70\x9a\x83\x64\x83\x6f\xac\x8d\x94\x8a\x12\x60\x79\x37\x12\x8b\x26\xcc\x27\x2d\xfb\x2b\x1a\xa9\x50\x97\xcd\x04\xb4\x3b\x6b\x47\xbb\x65\x3a\xfc\xaa\x16\x63\xfc\xd8\xfd\x20\xfb\xd7\x3c\x23\x51\x55\xd4\xd5\x87\x5a\xf7\x1d\xba\xed\x17\xd3\x91\x34\xbf\xd3\x06\xb9\x91\xaf\x70\x45\x61\x78\x35\xac\x7c\x79\x94\x6e\xc5\x0d\xdb\x2a\x94\x11\x06\x35\x07\xd6\x3c\x56\x94\x12\x0e\x95\x36\x29\x70\xcb\x2d\x26\x0a\xa0\xd0\x9a\x15\xed\xb3\x86\x0a\x91\x65\x8c\x86\x8f\x5b\x4d\x92\x7d\x0c\x67\x04\xb0\x8e\x91\x13\xb9\x10\xec\xd2\x5e\x5c\x51\xd8\x7e\x27\x40\x2d\x56\x8a\xbb\x91\xf1\xb8\x5e\x7e\xf5\xdb\xe4\xd1\xd2\x73\x57\xfa\x03\x13\xf5\xf3\x45\x6a\xaf\xee\x79\xcf\x30\x5e\x28\x59\xe6\x89\xe6\x7e\x6c\x04\x97\x20\x39\x57\xe9\x1e\xb2\xe2\x95\x38\x89\xc7\x8d\x45\x5e\x11\xd8\x5f\xfb\xde\x2b\x63\x15\xab\xaa\x45\x34\x5e\x78\x07\x65\xb7\x98\x60\xd6\x4a\x00\x1c\x77\x04\x18\xe5\xa0\x3a\xf2\xe7\xb9\x63\x55\x52\x8e\x17\x7f\x31\x66\xe1\x5d\x13\xe4\xbf\x45\x1b\xd0\xa9\x9a\x52\x3e\x8a\x09\x00\x02\x33\x03\x16\xd9\x1b\x19\x06\x81\xcb\xee\xac\x42\x1a\xc6\xc6\xcf\x97\xa5\x8a\x7d\x9b\x3a\x03\x3f\x9d\xf2\x1e\xdf\xec\x3e\xb9\x9c\xb0\x9d\x09\x14\xba\x03\xcf\x1d\x11\xf4\x97\x7f\x44\xde\x76\x4e\x6a\x1d\x2f\xc2\xe5\xac\x18\x89\x29\xb4\x30\xb2\xc5\xbc\xc8\xfd\xc2\x04\xf7\xe6\xba\x40\x51\x34\xd6\xfb\xcd\xfc\xc1\x5d\xba\x12\x6a\xde\x71\x54\x4c\x1c\x5e\xd3\xba\x02\x8b\xc3\x4c\xa6\x27\x56\x2b\x0e\x22\x1e\x78\x25\xd6\x14\x43\x87\x9a\x57\xb7\x5b\x84\x52\xfd\x1b\xc4\x3b\x8c\x9a\x23\xeb\xc6\x89\x4d\xc5\x89\xaf\xa3\x64\x4a\x33\x7f\x3d\xb0\x5f\x4a\x7c\x60\x92\x8b\x19\xc7\x15\x19\x23\xde\x82\x6d\x4b\x92\x1d\x95\x5a\xcf\x23\xaa\x4f\x21\xf8\xc1\x72\x1f\x84\x9b\x59\x6d\xc6\x1f\x65\x03\xf8\x65\x17\x84\xc2\xfc\x52\x4d\xf9\xca\x4b\xc4\xd9\x24\xa5\xe1\xcb\x37\x29\xd9\xfa\x41\x2c\x9b\x8f\x5a\x63\x3d\x5a\xe2\x53\xc2\x0f\xbe\x92\x23\xb2\x19\xe4\x19\xa3\x97\x68\x2b\xc3\xc6\x79\x40\x2c\xb9\x49\xbf\xca\x60\x0d\xa8\x50\xb1\xff\xd5\xae\x16\x0a\x6c\x7f\xd1\xd4\x34\xe5\xcc\x07\x5a\x6b\x95\xc6\x81\xaa\xa2\x58\x92\x9d\x14\xc6\xe8\x7e\x96\xd4\xfb\xe7\x01\x32\xf4\x81\x15\xf8\x9b\x26\x62\x45\x8a\xd7\x0f\xd9\x30\x0f\x03\x05\xe8\x31\x8a\x8e\xbe\xd4\x97\xd9\xc6\xc9\xac\x48\xd5\x00\x6e\x65\xd2\x40\x8a\x05\xcf\x92\xdd\xc3\x8c\x38\x21\x4a\x30\xda\x68\xfd\xf5\x37\xa9\xb8\x70\x17\x32\xb3\x8a\x8e\x34\xd9\xa7\x3c\x49\x02\x82\x15\xe5\x95\x18\xa9\x97\xd1\x09\x81\x03\xe7\xa5\xc4\x2a\xbb\xa0\xef\x8a\xf3\x31\xa2\x13\x66\x9a\x5f\x44\x69\xcd\xef\x08\xc0\xe1\x47\xa4\xec\xc8\x35\x63\x75\x66\xcd\x97\x5c\xa8\x80\x0e\x5e\x15\xe8\x2f\x42\x17\x2a\xf5\x09\x5c\x4f\xcd\xea\x82\xc5\x05\x42\x62\xd2\x2c\x0f\x60\x45\x70\x28\x3c\x44\x35\xbd\x2f\x62\xb1\x3a\x4f\x6f\xed\x3a\x40\x7c\xb0\xe6\x02\x83\xea\x93\xf0\xc2\x3d\x04\x8f\xd5\x5c\x18\x2b\x8a\xfe\x5d\x01\x5f\xae\xa8\x3c\x74\xed\x08\x9e\xb8\x0f\xb2\x97\xb5\x95\xc4\xd7\xb5\xa1\xd3\xcf\xee\x32\xff\x46\xca\xcc\xe6\xa6\x1c\xaf\x1c\x5b\xc9\x8f\x08\xfc\xee\x1d\x8c\x00\x07\x5f\x1e\xe2\xb7\x56\xf3\x9a\xc0\x0c\x08\x0d\xc5\x53\xf2\xf1\xf1\xe6\x6a\x61\x97\x94\xde\x48\x8d\xca\x74\xe7\x10\x81\x51\xb6\x83\x73\x2b\xc1\x8c\x6b\xa5\xe9\x4d\x0b\xd2\x91\xfc\xee\x5b\x4b\x74\xd3\xb9\xb5\x9e\x0a\xfe\x20\x99\xf9\xbe\x64\xc1\x7c\x83\x6b\x9e\x4a\xba\xa0\x12\x71\x1a\x66\x43\xa1\x27\xaa\xf0\x31\x5b\x83\x93\xf2\x08\x9f\x41\x9a\x3c\xcf\x6f\xf5\x93\xff\x53\x6a\x67\x95\x55\x0e\xa7\x9f\x32\x10\x4b\x28\x21\x49\xac\x56\x4b\x7f\x54\xff\xb4\x56\x86\x03\x51\x48\x59\xe2\x29\xb5\x2e\x52\x31\x45\xe7\xbf\x8d\xd6\x10\xa5\xfc\x31\xb6\xe9\xd2\xdd\xbc\x48\x90\x0d\xcd\x8a\x74\x78\xf5\x51\x20\x61\x40\x16\x95\x33\xbd\x8a\x3b\x82\xa5\x33\x33\x88\x78\x8f\xd1\x3e\x1d\xb0\x46\x94\x84\xe1\x53\x04\xf9\x25\x4c\x7f\xab\xb1\xbc\x31\x99\xc7\xa4\x2a\x0b\xf8\x59\x83\x96\xe2\xc2\x02\xf8\xa6\x64\x00\x07\xaa\xc3\x1f\x8e\x29\x96\x86\x05\x9c\x6f\x6d\x3d\x53\x1b\xa0\x65\x6a\xfb\x30\x0a\x0d\x2c\x27\x4c\x42\xba\xb2\x0b\x32\x14\x6f\x57\x31\x2d\x70\x54\x8f\x52\x0f\xb0\xdb\xda\x04\x20\x04\x61\x82\xeb\x97\xae\xf2\xe6\xd2\x1c\x2f\x48\xd2\x90\x87\x48\x10\x83\xb0\xf1\x65\x85\x56\x58\xf7\x16\x9b\x1f\xcd\xb7\xf0\xda\xcb\x9b\x52\xdf\xec\xd8\x8b\x86\x41\x5f\xc3\xce\xef\x4f\xd2\xc2\x12\xa4\x4f\x48\xda\x70\x5a\xbf\x91\x1a\x3e\x95\xd2\xf4\xe1\xa9\xc1\x61\x16\x44\xa0\xb1\x14\x45\x28\x39\xeb\x5b\x64\xe3\xa1\xd0\x2e\xe1\x79\x12\x21\x16\x49\xea\xb9\x35\xa3\xbe\xf0\x8a\xcc\x74\x15\x3f\x48\xe2\x92\xb4\xb2\x60\x09\x2f\x67\x49\x6c\x20\x3f\x88\x79\x15\x10\xb7\x3b\xf1\x5b\x56\x0e\xa1\xde\x7a\x23\x3a\x55\xa0\xda\x0e\x10\xff\x62\x3d\x67\xa5\xc9\xb0\x56\x20\x24\x5b\xb6\x57\x22\xba\x1a\xa9\xde\x1c\xf0\xa6\x51\xf6\xc8\x4e\xf4\x55\xe2\xce\x2b\x6b\x55\xde\x71\x66\x60\x32\xbf\x4d\x27\xe7\x65\xa7\x70\xb8\x1f\x09\xba\xab\x1a\x97\x33\x86\x9a\x4f\xbf\x51\x07\x3a\xac\x6c\x67\x38\x57\x99\x41\x11\x86\x59\x0d\x9a\x55\x84\x74\xdb\x19\xea\x8d\x23\xdd\x95\x4b\x73\xf4\xc6\xb8\x57\x5a\xbc\x60\x98\x9f\x2a\x6f\x48\x54\x3d\x26\xe2\x5b\xee\x24\x5f\x31\x46\x0f\x5f\x3d\xd1\x55\x86\x76\xf5\x55\xff\x6c\xa4\xb7\x83\xab\x31\xa1\x6c\x55\x13\x27\x81\x44\x28\x82\x1e\x78\x08\x03\xc7\x37\xc0\x16\xe2\x27\x56\xed\x03\x6b\x8f\x54\xe2\xef\x8a\x8f\xe6\x99\x25\xf5\x78\xb5\xc8\x6c\xac\x91\xaa\xe9\x28\x98\xda\x0b\x9a\x9f\xeb\x57\x01\x97\x90\x1e\x85\xfe\x77\x6c\x48\xba\x0b\xc7\x53\xd4\xc6\xf3\x98\x6b\xe7\xb3\x5f\xb7\x91\xdd\x88\xab\xe4\x1a\xc9\xcf\x77\xfe\x73\x92\xb4\x87\x64\x70\x93\x32\x5b\x89\x56\xac\x99\x4b\x3f\x96\xda\x16\x3d\xad\xc2\x24\x67\xdd\xea\x09\xba\xbf\x61\x43\x7f\x2f\x59\x8a\x12\x65\xf3\xea\x4a\x6b\xfb\x08\x1b\x8f\x51\x14\x2e\x1d\xcb\x98\xa3\xad\x1a\x99\xb4\x30\x84\x56\x3c\x95\xc4\x73\x24\x79\x5f\xab\x27\xf8\x21\x9a\x6e\x48\x29\x9b\xf4\xba\x7d\x29\xa7\x1f\x7a\x62\xda\x24\xdd\x07\x52\x9e\x81\xf0\xfb\x83\x82\x4d\x0a\xe2\x92\xe3\x20\xd7\xef\x81\x47\xf1\xf3\xb2\x81\x2c\xbc\xc8\x64\x66\x71\x2d\xb2\xcd\x73\x6a\x55\xdd\xd2\x60\x97\x23\x98\x23\xfa\x5f\x90\x9d\x78\xb2\x8e\x5f\x0d\x0a\x5c\xbf\xa4\xc0\xbc\x39\x2b\xb9\xc3\x47\x42\xd7\xea\x5a\x9c\xd7\x01\x1d\xc6\xf3\x51\x8e\x3f\x9f\x8d\xe9\xba\x21\xcd\x1a\x61\x8c\x9a\x9b\x93\x7e\x3a\x82\x31\xbe\xb0\x02\x17\x0a\xb2\xc1\x1e\x20\xca\xf0\x8f\x45\x91\x02\x8d\x1a\xa8\x86\xce\x09\xbb\x80\xaa\x26\x40\x46\x36\x4c\x4c\xdf\x8c\x77\x1c\x76\x7a\x1e\x0e\xf8\x92\x39\x01\xc4\x28\x2d\xbd\xf4\x13\xbc\x82\x34\x7e\x5e\xd4\xb5\xb0\xcf\x10\x12\xf8\xa5\x90\x87\x96\x96\xb2\x85\xad\x13\xa9\xb5\xc4\xd7\x3f\x26\x54\x20\x73\xde\x6f\x54\xdc\x42\x96\x19\xaa\x73\x85\x3e\xb4\xa8\x48\x5d\x28\xd6\x5a\x4d\x6c\xc4\xf6\x43\x0d\x66\x6e\x44\x6d\x74\xe4\xe1\x17\x4c\x6e\x00\x8e\xdf\xb0\xc1\x6c\x36\x25\xc2\xb6\xa5\x14\x37\xc2\xac\xd0\x10\x29\xff\x91\xda\x8f\x14\x50\xde\xe0\xbc\xa9\xea\x81\xf9\xc2\x90\xaf\xc3\x1b\xa0\xf0\x8d\x44\x4b\x55\x3e\xfa\xdc\xd0\xb9\x57\x55\x3a\xbc\x76\x16\x5e\x02\xe3\x9a\x9f\x9d\x20\xdd\x55\x18\x6e\xed\xd4\x4f\x52\x67\x12\x07\xe3\x22\x5d\x2d\x0f\x21\x01\x8a\x69\x7c\x4a\x37\xbd\x22\x0a\x12\xfa\xb8\xb3\xf4\x16\x6c\x34\xe6\x59\xf8\xff\xc8\xab\x19\x85\xf9\x77\x12\xaa\x73\x4b\xe2\x46\x5e\x8a\x84\xed\xd2\x87\x04\x65\x64\x96\x53\xc8\x43\x77\x49\xf0\x8d\xf6\x12\x91\xd8\xa9\x48\xbb\x60\xed\x4e\xf4\xb9\x07\xe4\x57\xe6\x8d\x38\x09\x63\x8e\x83\x23\xf2\xc1\x01\xad\x72\xbc\x5f\xd8\x40\x83\x74\xdf\xee\x33\x3b\x55\xb5\xf8\xaa\x64\xa1\xc6\x71\x87\x45\x1a\x22\xad\x80\xe1\xd4\x67\xae\x99\x52\xd0\x1f\x45\x35\x7f\xf9\x07\x83\x90\xe9\xa6\x5d\x3c\xc2\x18\x83\xae\xce\x5a\x45\x80\x1a\xd9\x9c\x9a\x93\xc9\x1d\x6b\x84\x93\xb6\x00\xa9\x41\xdd\x95\xca\x4d\xa8\x59\xbf\xc8\x7f\x3f\x97\x3b\x93\xca\x8d\xb2\x7e\x57\x3e\x04\x7a\xd2\xb5\xb7\xb1\x11\x5f\xd1\xb5\xe3\x47\x56\x76\x9f\x7c\x33\xd7\x38\xfe\xdb\x00\xcb\xc3\xc3\x08\xd0\xca\x2a\xf8\xb7\x14\x32\x0c\xe4\xc3\xa4\xfa\x2a\xbc\xd0\x65\x41\x50\xcc\x7b\x46\x88\x93\x55\x40\x3c\xd6\x22\x36\xb7\x13\xc7\xf5\xb7\xeb\x17\x4e\x7f\x47\x4c\x4e\xe5\x8c\x84\x88\x44\x72\x4f\x5a\xf5\xe1\x83\x44\x5e\x25\x94\x64\x32\x11\x11\xa7\xb1\xa9\xc4\x0b\x09\x74\xc4\x51\x60\x04\x3f\x5e\xe0\x4c\xc3\x85\xa1\x9b\xb3\x0f\xf2\x26\x9d\x94\x54\x44\x4f\xa9\xe4\xc5\x56\x75\xf7\x8d\x54\x98\x77\xe4\x23\xd7\x4b\xdf\x04\x49\x0b\xca\xde\xb1\x93\xa9\xc3\x4e\xf4\xf8\xd9\x44\x21\xc6\x01\xda\xf5\xfc\x88\xe9\x3f\x92\x34\xcc\x92\xb6\xfc\x6b\x2b\x62\x25\xb0\xa2\x26\xc2\x0e\x8f\x22\xef\x22\x0b\x38\x21\x5f\x89\xf8\x46\xe0\xd7\x03\x6b\xac\x8c\x76\x84\xe1\xe1\x99\x3e\x9e\x94\xb9\x1b\x65\x01\x90\x2d\x47\xcb\x82\x87\xea\xd3\x0d\x85\xf7\x72\xb6\x1b\xd6\x48\x4b\x40\xe3\x5a\x62\xde\xa4\xf5\xca\x55\x70\x6d\xc5\x4d\xff\x16\x8e\xfc\x79\x6a\xcb\xd8\xf9\xf7\x69\x1e\x88\xb8\x4b\x04\xe2\xf4\x6c\x46\xae\xd1\x36\xca\x4d\x08\xd8\xad\x49\x2c\xd2\x2c\x72\xf8\x4e\x4b\x4a\x8d\x86\xe9\xb9\x1f\xf7\xb0\x84\x98\x8a\xa0\xaa\x97\x39\x94\xa4\xb8\xdc\x50\xa5\x5d\x82\x9f\xd9\xbc\xbd\xd9\xfb\x5f\x37\xc1\x2f\x7c\x7d\x8a\x89\x41\xfa\xa8\x73\xa8\xc4\x31\x77\x86\xdd\x01\x82\x96\x35\x4a\x1a\x97\xa7\x89\x55\x9e\xca\xa0\xb9\xd2\x4c\x43\x96\x9e\x20\xce\x1d\xe3\x44\xf7\xf0\x20\x18\xc7\x56\xb5\x8c\xd4\x2a\x31\x23\xbd\x51\xe0\xaf\x03\x01\x69\x8a\x24\x3b\x60\x8f\x91\xbb\xb6\xcb\x9c\x14\xd1\xe7\xbf\xb8\x3b\x57\x3b\x5f\x4a\x10\x66\xc5\xb6\xf2\x57\xee\x58\x25\x75\xba\x2d\x8b\xce\x3a\x77\xf1\x64\x11\x9b\x88\xba\x7c\x09\x53\x72\x62\xe9\xa8\xb6\xc3\xf2\x04\x42\x65\x3d\x26\xba\xd8\xc5\xed\x27\x97\xa0\x98\xab\x9b\xcc\xd0\x61\x0f\xe5\x01\xce\xf4\x0d\x73\x8e\x1b\x22\x95\x89\x71\x3f\xd8\x68\xa1\x0e\xa3\x72\x86\x48\xba\xdd\xcc\xc0\x18\xf5\xa4\x44\x9c\x14\x3c\x7f\xbc\x94\xb7\x0c\x6a\xc7\x10\xe9\x2d\x4d\xf0\xc6\x3c\x48\x26\xb2\x8a\x7e\x85\xc4\x74\x21\x03\x0b\xdb\x26\x71\xca\xa5\x43\xa3\xc4\x46\x0a\x19\xc2\x87\x47\xb7\xaf\x9f\xd8\x79\x13\xb8\x7f\x1d\xde\x73\x2e\xf9\xb7\x2d\x0c\x7b\xc0\xf6\x64\x2b\x0b\x8d\xe8\x61\xe3\x46\x06\x36\x9b\x7d\x70\x62\x76\xe4\xca\x6a\xfa\x37\xea\xea\x9c\x57\x96\xa2\x5a\x59\x72\x41\x43\xef\x32\x0d\x03\x49\x00\xcd\x42\x40\xdc\x28\xd1\x42\x57\x55\xd5\x3f\x29\x67\x40\x8e\x91\x39\x8f\x2f\x0b\x7d\xde\x2f\x67\x9c\x87\x3d\x8a\xf8\x3c\xa4\x96\x61\x1a\x9b\x7f\x28\x4c\x36\xc9\x43\x0a\x03\xcc\x9c\x1f\x6a\x89\xeb\x7d\xf7\x8a\x59\x6d\x44\xf1\x6d\x92\x8c\xd6\x6d\xde\xa4\xd1\xb0\x36\xad\x9f\x6a\xbe\x96\x38\xce\x8b\x59\x6a\x40\x2b\xbb\xc7\x56\x3f\x2a\x2b\x67\x04\x96\xe7\x47\x91\x67\x89\xc2\x0d\x4b\xa4\x4b\x9d\xec\x80\xbd\x46\xfd\xaa\x0e\x3d\xa0\x06\xac\x2d\x76\x8c\x8b\x2f\xe3\x4a\x8c\x1f\xc1\x17\x54\xb8\x5e\x1a\xc1\xa0\x17\x15\x41\x95\x06\xb7\x9c\x49\x95\xb7\xe0\x1e\x8d\x87\x34\x93\x00\x7c\x50\xf2\x6b\x69\x50\x2f\x51\xce\xf0\xe2\x44\x8d\x86\xe5\xde\x2a\x1b\xac\xe1\x3e\xa6\xcc\x88\xbd\x88\x1f\x4f\x22\xb4\x67\x2f\x64\x9b\x31\x2c\x4c\x6e\x64\xa1\x27\x30\x93\x03\x97\xa6\x67\xfd\x35\x58\x43\x86\xbf\xc9\x62\x7b\xd0\xba\x4e\x26\xc9\xcb\x4c\xd8\xc0\xd8\x4d\x8d\x1b\x2b\xc9\x3f\x5d\xcc\x2b\xb1\x44\x59\x4f\x97\x51\xd5\x09\xad\xb7\xce\x0b\x7b\x08\x0e\x1a\x9d\x10\x11\x43\xfa\x5a\xe9\xa9\x6f\x74\x60\x53\xb8\x68\x81\x5e\xda\xb9\x7b\x99\x35\x38\xb2\xc4\x4f\xc7\x62\x60\x13\x46\x66\xd9\x45\xd0\x67\x06\x77\xda\x58\xbe\x49\xc2\x6a\xba\x33\xc8\xfa\xb3\xe1\xfc\xa7\x6e\x64\xec\xd3\x43\xc7\xf5\x69\x46\xb8\xf3\x4b\xa4\x0e\x1b\x4d\xb6\xcf\x56\xd1\x0d\x6d\xe8\xb3\xb0\xcc\xc9\x68\xa3\x4a\xa6\x8b\x4f\xc7\x22\x96\xa8\x7b\x89\x59\xba\x05\x21\x7a\xb5\x23\xc3\xe8\xe3\xff\xe5\x5d\x73\x91\x7f\x46\xad\x66\x03\x76\xf0\x67\x4b\xd2\xba\x27\x07\x09\xb5\xec\x81\x25\x9a\x21\x5e\xc8\xbd\xe6\x2e\xc1\x69\x15\xeb\x9b\x22\x63\xf2\x5d\x0b\x68\xa8\x75\x3d\x64\x0a\xa4\xfe\x40\x64\xcd\xc1\xca\x69\xa4\x0e\x48\x88\x0c\x9b\x20\xf3\xba\xe8\x6e\x84\x9b\x02\x81\xf0\x87\x75\x16\x18\xd6\x8b\xdc\x1f\x75\xf5\x98\x75\x7e\x32\xc6\x50\x17\xf1\xd2\x21\x07\xde\xd0\xea\x2e\x4a\x33\x3d\xf5\xf6\x33\x09\x6a\x73\x93\x72\xcb\x67\x90\xd4\xfc\x88\xf0\xa0\xaf\x69\x18\x34\xfb\xd7\xd1\x52\x13\xb9\x26\xeb\x18\xb1\xf3\xf2\x38\x8c\xa7\x71\x2a\xf2\x08\xe3\x35\x97\xb8\x91\xdc\xc8\x75\xca\x09\xdc\xbe\x7b\x26\x5d\x48\xa3\xf5\xe4\x2f\x47\x89\x4b\xe1\x78\x21\x96\x7e\x13\x74\xbe\x0a\x1b\x84\xa9\x43\x11\x57\x57\x8d\xe2\x08\x8c\xd2\x88\xa3\xa9\x85\x41\x11\x81\x79\x93\xa7\xcb\xd7\xac\x3b\xc7\xfa\x3d\x38\x0b\xcd\xdd\xa1\xde\x73\x01\x8a\x49\xae\x83\x32\xcf\x45\xa1\x9d\x8d\x64\xde\x8c\xa4\x4a\x2d\x7b\x88\xce\xa4\xd6\x30\x17\xf0\xd8\x84\xf3\x2f\xb2\x1f\xaf\xb1\xe9\x8b\x8d\x94\xf3\x7a\xba\xff\xcc\xf0\xbc\xc9\xc8\x50\xd9\xbf\x59\x13\xff\xa1\xf9\x09\xec\x06\x5f\x64\x8c\xda\x12\xc4\x3a\x1e\xa6\x34\x8a\x7e\x10\x16\xbd\x51\xa0\xcc\x32\x3c\xe4\x42\x40\x00\xd7\xbd\xa3\x71\xd2\x06\x95\x59\x8c\x51\xb8\x14\xf3\x74\x0f\x89\x74\x88\x02\x68\x8c\xc8\xb1\x57\x41\xec\x7d\x5b\x19\x18\x9b\xd0\x4b\x8f\x39\x1e\xd3\x5a\x7b\x26\xf4\xf6\xa4\x7f\xc8\x91\x9e\xb8\x6e\x99\x64\xc9\x48\xf1\xec\xe4\xf4\x78\x07\x24\x5f\x66\x06\x5f\xab\x20\x66\xb6\xa7\xff\x93\x31\xc5\xe4\x28\xb5\x62\xb3\xfc\xff\x5f\xaa\x03\x40\x74\xce\x25\x1e\xe0\x48\xe6\x5a\x2b\x90\xba\x15\x90\x4d\x4c\xd7\xe7\x89\xac\x39\x45\x5e\xe7\x0b\x2e\x02\xa4\x30\x65\x7d\x77\x8e\x43\x05\xd3\x15\x07\x01\x35\x52\x3b\x3e\x68\xfc\x3d\xfc\x48\x34\x22\x41\x13\x18\x61\xd9\x46\xd2\xaf\x5e\xe8\x32\x8a\x3c\xbb\xc8\xbe\x25\x6f\xbd\x4a\xde\x7a\x9d\x04\x2d\x2d\x1f\x69\xc2\xc8\x6a\x47\x82\xa5\x5e\xd8\x36\x72\xcc\x6d\x81\x7c\x0b\x70\x8f\x58\xbd\xc8\x54\x84\x5d\xc1\xe2\x09\x99\xa4\x81\xde\x66\xbf\x60\x27\x69\x27\x5e\x45\x65\x37\x4f\xe8\x41\x2f\x76\x87\x41\x48\x50\x4c\x44\x14\xb5\xa9\x93\xe6\x5a\xe7\x4c\x6a\xcd\x07\xc2\x41\x90\x01\x8d\xd2\x3d\x93\x05\x6b\x33\x0c\x42\x66\x71\x63\x9f\x76\x2d\x99\x4a\x95\x72\xbe\xc8\x25\x1c\x8f\x4d\x7e\x66\xd4\x1e\x1e\xcb\xe6\x91\x2d\x85\x72\xf4\x8c\x17\x8a\xd0\xcf\x46\xef\x5e\x08\x92\xec\x65\x30\x46\x20\x08\xca\xa0\x38\x68\xc4\xe7\x37\x79\x12\xe2\x8a\x6f\xbd\x04\x26\x4f\x5d\xdb\x83\x68\x90\x42\xbb\xb5\x52\x4d\xc6\xa6\xfd\x92\xa7\x9e\x4a\x82\x7a\xa1\xfc\xe1\x65\xac\x0b\x18\xa9\x65\x7e\x45\xe5\xe4\xf3\x73\x1f\x65\x74\xc4\x9f\xa4\x9d\x22\xba\x82\x60\xdc\x8e\x4a\x14\xaa\xb4\x3f\xcf\xdd\x5b\x2b\x4b\xf0\x13\x2f\x73\x94\xae\x9d\x9d\xe0\xc9\x60\x66\x33\xb2\x00\x64\xed\x95\xb0\x85\x3a\x2c\x3f\x74\xc0\x06\x34\x32\x3b\x79\x62\xc8\x77\x80\x11\x31\xc0\x5c\x28\xca\x5e\x13\x8b\x78\xaf\x2b\x19\x6d\xcd\xba\x27\x41\x9f\xaa\xef\xc6\xdf\x3d\xb3\xb2\x50\x8d\xb3\xb8\xad\x28\xd6\x28\x49\xcf\xaf\x4f\xc5\x36\xb6\x27\x53\x37\x8b\xa4\x6e\x8a\xbf\x85\x79\x2e\x2d\x59\x47\x1a\x61\xc5\x3d\xf2\x03\x6a\x8d\x22\x39\x9d\x63\x27\x69\xfd\x08\xa7\x75\xd1\x99\xff\x0b\xfa\x02\x8b\x3a\x7a\x0b\x83\x25\x54\xdc\x2c\xc8\xc3\x39\x48\xcf\x99\x35\x91\x08\x99\x51\x59\x30\xa7\x83\x26\x85\x4c\x11\xa7\x1b\xd1\xec\x4f\x0a\xe9\x01\xb7\x63\x81\x4f\xc8\x76\x39\x33\xfc\x21\x39\xc8\x24\x54\xcf\x83\x92\xa7\xc1\xa7\x6b\x09\xdc\xb4\x7c\xea\x40\x26\x14\xc3\x90\x30\x75\x29\x08\x0b\xab\x6b\x83\x81\x4e\xfb\xd6\x66\x76\xcb\x76\x28\x7c\x1c\xb3\xe3\x7c\x63\xc0\xb7\xf1\x21\xd9\xf6\x2f\xb4\x2c\x8a\x16\x60\x31\x66\xce\xc2\x16\xab\x23\x4b\x00\x7e\x99\xcb\xeb\x17\xc9\xf1\x1e\xb6\x28\xf1\xbe\x65\x6b\x91\xe4\x1e\xd8\xcc\x54\x5c\x03\x7c\x32\x09\xcd\xd0\xc1\x31\xe1\x4a\x42\x67\x6f\x90\x69\xa9\x12\x12\x9f\xdb\x64\xd8\x9b\xcb\xc0\x02\x99\xe8\x5f\xe2\x70\x09\x8c\x92\x80\xf4\xea\x38\xd8\x20\xda\x1b\x1a\xa0\x78\x25\x96\x2b\xd4\x90\x24\x42\xfb\xb2\xbb\xaa\x5a\x7e\x99\x80\x86\x68\xd3\xb8\x96\x94\x6b\x86\x25\xce\x3e\x60\xe4\x8d\xbc\x79\xd9\x09\xa9\x2d\x84\xb7\xe2\x9e\x25\x17\x68\xad\xa6\x38\x40\xcc\x99\x4c\x2d\xa1\x5c\x23\xf5\x76\xd2\xce\x29\xf8\x64\xbb\xe4\x2c\x9f\x44\x9e\x95\xd3\x81\xbb\x9b\xd7\xe9\x47\x45\x52\x9b\x8c\x3c\xfa\x1d\x6a\xcc\xd5\x78\x31\x62\x9e\x0d\x31\x83\x06\xe8\xfd\x2c\x94\x34\xd2\x96\xfa\x25\xbf\x81\x35\x9c\xdf\x29\x5f\xbb\xca\xe1\x32\x13\x4f\x54\xdc\xd9\xc4\xae\x96\x11\xce\xd0\x5b\x1a\x5a\xc5\x0d\x5c\xbd\xfd\xe9\x0b\xfd\xc1\x4e\x25\x19\x91\x88\x9a\xa1\xb5\x63\x42\xec\xc7\xc5\xe0\xe5\xc2\x61\x2d\xe3\x51\x2d\x5a\x03\x3a\x52\xda\xcb\x2a\x60\xc3\x77\x04\x64\xb7\xbf\x23\x2b\x3d\xaf\xb4\xbb\x37\xdb\x09\x66\x3d\x66\x1d\x29\x76\xd4\x1d\xaf\xff\x83\x96\x30\x08\x2c\x3f\xac\xf1\x02\x24\xca\x4c\x90\x14\x2f\x16\x01\xa5\x50\xd5\x88\x5b\x55\xcb\xd8\x5a\x3b\x22\x84\x6f\xdb\x3d\xbb\xb1\xec\x25\xf8\x41\xe9\xc8\x4e\xbc\x13\xa8\xec\x12\x2f\xee\xbe\x47\xf5\x0a\xb2\xcd\xf0\x5d\x48\x54\x31\x9c\x85\x63\x58\xb3\xc0\xb9\x7e\x6b\xa5\x11\xba\x07\x75\xce\x49\x7c\xb5\x72\xfb\x56\xe0\x4c\xca\x03\x1a\x08\x94\xff\x81\x15\xce\xc2\x01\xd4\x68\xb7\x4c\x09\x17\xc7\x1f\xcc\x06\xcd\x32\xe0\x02\x6c\xf3\xab\x90\x74\x6c\x3c\xab\x4b\xf1\x01\xd8\xe1\x37\xc9\xd8\x21\x4b\x4d\x05\xea\x7d\xea\xc3\x2f\xbc\x0d\xd9\x54\xe5\x15\x2e\x97\x6c\xdf\x1b\x2e\x4c\x7f\x34\xe8\xaf\x2c\x65\x2b\x24\xb2\x8c\x3e\xfb\xfc\x77\x89\x0a\x2f\xdc\x41\x44\xb9\x4a\xd3\x67\x05\xd6\x5f\xc6\x47\xc2\x66\x48\x07\xcf\x53\x4c\x6d\xbd\xf2\x73\x04\xb5\x06\x2b\x6f\x60\x11\x70\x18\x9c\xdc\x34\xe2\x8d\xba\x5b\xb6\x89\x3b\xfa\x26\x75\xd1\x3f\x2d\x6a\x42\x67\x0b\x6b\xd9\x4e\x32\x17\xb0\x92\x45\xc3\x8d\x05\xda\xa8\x06\x0a\x32\x87\x59\x80\x55\x39\xfd\x85\x1d\x92\xae\x86\xb9\x15\xc8\xe7\x8f\xa6\xc9\x7e\x44\x32\xc2\x26\x23\x53\xc4\x7a\x6b\x57\xc1\xcc\x87\xfb\x4e\xe3\x50\xab\xe2\xe7\x10\x8a\x25\x4f\xcc\x0e\xa4\x45\xd8\x55\x55\x14\x1f\x02\x20\x7e\xb0\x19\x62\xf1\x25\xeb\xf7\xda\xf2\xe3\xa9\x99\xe8\x01\xb6\x59\x7e\x6d\x4b\x62\x3a\x58\x5b\x59\x26\x99\xdd\x70\x99\x40\xdd\x5e\x22\xde\x4b\x63\x67\x93\xd8\x91\x77\xd3\xee\xfb\x4c\x22\xdc\x63\x58\xaf\x9f\xee\x85\xd0\x5d\x13\x75\x66\x3f\x33\x1f\x70\xdf\x98\x9c\x60\xf1\xae\xfc\x5c\xe7\x4a\xe1\x47\xa9\x1a\x2e\x28\x44\xfc\xda\x68\xcd\x3b\x38\xd9\xa9\xdb\xb4\x25\x59\xc6\x26\xed\x37\xc5\xd4\x65\x0d\x0b\x8f\x51\xe6\xf8\x3f\x2d\x71\x0d\x80\xc8\x9b\xb8\x0b\x39\xc6\x44\x9e\xd9\x9a\x0f\x92\xd1\x08\x9b\xf6\xf6\xcb\x0b\x65\x25\x2a\x7a\x2a\x11\xc0\x93\x59\xfc\x27\xe7\x1c\x3d\x82\x75\xae\xb8\x7f\xa8\x58\xfa\xce\x3c\xc4\xeb\x20\x07\x02\x33\xe2\x2b\x89\x57\xd0\xee\x32\x53\x90\x0c\xa1\x11\x73\x16\x0c\x3b\xca\x51\x8a\x95\xd5\x97\xd0\x52\x99\x12\xa8\x03\x50\x1b\xe1\x4c\xb5\x61\x45\x17\xe3\x8c\x8d\x34\x32\x4a\xf1\x82\xd8\xf3\xba\xce\xe8\xde\x30\x22\x0f\xa0\xa0\x16\x2b\xc4\x77\x0c\x17\xc8\xa6\x7b\x94\x7f\x99\x2d\x24\xac\xe4\x3b\x58\xd8\xf7\xbf\x22\xef\xfe\x89\x7e\x21\x20\x6c\x4d\x23\x2c\x2f\x6b\xdb\x5f\xe6\x48\xb8\xa7\x8c\xf0\x8d\x92\x8d\x67\x6a\x9d\xae\x56\xa7\xd5\x22\x65\x65\x32\x37\x0c\x9c\x23\x61\xdc\x14\xe2\xff\xd4\x0d\x61\xe1\x8d\x5a\xf5\x68\x9b\x42\x4c\x28\xe8\x20\x73\x62\xdd\x4d\xbb\xcd\xf0\xdf\xc2\x67\x6b\x64\x04\xc5\xa8\xc9\x9e\x0e\x59\xf3\xb7\xf8\x25\x6f\xad\x6d\x59\x78\x7e\x99\x97\x4c\xbd\x1e\x6f\xc2\x84\x1c\x08\xec\xe3\xcc\x88\x59\x17\xeb\xc5\xae\x7e\xdb\xee\xde\x2f\x50\xb3\x4a\x73\x64\xae\xa9\x0e\x91\x5a\x92\xfa\x6b\x59\x8e\xb1\x8c\x76\x3a\x7c\x2e\x98\x6a\x76\x61\x04\x65\x3a\xf4\x34\x92\x36\x0d\xd6\x09\xc7\x7e\x15\x0d\x42\xea\xc7\x5d\x9a\x27\x4e\x2f\xda\xc3\xc5\xbc\x59\xbe\x45\x1c\x01\x22\xe3\x7b\xb4\x79\x77\xa2\x2b\x0e\xd5\x80\xe2\x96\x96\xad\xe3\x5f\xe2\x29\x51\xd2\x9d\x59\xd7\xb1\xb6\x07\x3f\xbd\xf1\xcd\x83\xec\x59\xac\xb0\x2c\xdb\xc8\x6c\x81\xa4\x57\xcd\x72\x40\x07\xd8\x85\x3f\x7f\x31\x1d\xf0\x54\x0e\xbc\xcd\x79\xf9\x43\x15\xfa\xe3\x0d\x27\x3f\x21\x17\xcb\xe2\x65\xbf\x37\xb5\x48\x64\xcf\xb9\xc9\x9e\x60\xe3\xd2\xc5\xa3\x14\x58\xdd\x2b\x91\xe1\x59\x3d\x0c\xeb\xeb\x15\x8e\x80\xe4\xec\x41\x45\x4a\x88\xd7\xdd\xa4\x21\xe1\x21\xd9\x7a\x43\x69\x6b\xd0\x94\x04\x0b\x4d\xcd\x74\x0f\x50\x0d\xe0\x06\x8e\x4d\x3f\xf9\x0e\xbd\x29\xfb\x25\x54\xda\xfc\x34\xd3\xcb\xb3\x31\xf0\x4c\xef\x0c\xfc\xf0\x3b\x4d\xc7\x13\x6c\x2f\xc8\xf9\xe1\x50\x70\xfb\xa4\x26\x87\x8a\xe0\x26\x85\x08\xe1\x1c\x30\x0a\x73\x4e\xb9\xe6\x3d\x2c\xe7\x70\x49\xaa\x7b\x53\x63\x94\xb0\x66\x8e\x52\xba\xb3\x69\x9e\xe8\x9e\xba\xb5\x9b\xd4\xf6\xa5\xa5\x5d\x06\x3c\xc4\xae\x0b\x5a\x5a\xe5\x55\xc7\xba\xf6\xdc\x5c\x26\xa1\x4a\xba\xa2\x0d\x32\xc8\xa4\xf8\x57\xec\x65\xfe\x70\x14\x6e\xd0\xb7\xce\x57\x38\x3f\x43\x9b\x72\x44\xf0\x11\x4e\x4f\x1a\xa7\x46\x80\xa1\xdd\x0f\x87\xca\x94\x23\x3f\x09\xc8\x40\xe6\x66\x58\xd8\xec\xee\x40\x1a\x10\x05\x1d\x72\x44\x8b\xc2\x1c\x63\xe5\xb4\xe2\x25\xa9\x49\x28\xec\x87\x59\x10\xb4\x13\x06\xaa\xb5\xe5\x7b\x04\x45\x4b\x62\xec\xef\x64\xf0\x10\x4f\x51\x89\xa9\xad\x10\x57\x99\xcb\x2c\x85\xad\x0b\x42\x1f\xd0\xea\xf3\x34\x54\x9e\xb7\xf3\x82\xf8\x24\xeb\xbd\xf4\x7b\x8f\x97\x6d\x1a\xa4\x57\xbc\x4e\x7b\xd7\xd6\x96\xe7\x24\x92\x33\x73\x4a\x20\x18\x10\xd3\x47\x19\x01\xa3\x96\x74\x12\x27\xe2\xcb\x90\x9e\xca\x30\x82\x91\xe2\x92\x5d\x1c\x47\x4e\x18\x1a\x39\x7a\x43\x5a\xde\x7b\xce\xb9\x8a\x3a\x73\xb1\x55\xc3\xd0\xea\x51\xf9\x92\x24\x9d\x92\x91\x25\xed\x78\xf0\x6e\xb8\xda\x30\xb6\x16\xf4\x91\x68\x2a\x3c\x08\x84\x6c\xc7\xa4\x9f\xdd\xcb\xc1\x3f\x7e\x9c\x7e\x02\xf1\x52\x9b\x2f\x9e\x49\x83\x6b\x0b\xf6\xd9\x2d\x02\xff\x3c\x46\x54\xf9\xa5\x0d\xe5\xe1\x14\xa1\xd0\xa1\x8b\xb0\x92\x57\x35\x02\x0a\x86\x9d\x9d\x72\x22\xc4\x6e\x6a\x15\x45\xb4\xa2\x75\x51\x34\x6b\x09\x5d\xc0\xa5\xc2\x42\xd7\x10\x59\x6e\x2d\x82\xf4\x26\xb6\x80\x13\x71\x77\x51\x81\x96\x59\x90\x79\xe6\x1b\x87\x43\x05\x9d\x56\x6f\x23\x03\xaf\x60\x25\xfa\x8a\x4f\x4c\x74\x7c\x4c\x8b\x54\x0b\x1f\xa4\x2d\x7a\x68\x8b\x34\x91\x4c\x87\x15\x73\xd5\xf5\xae\x3e\x96\xc7\x2c\xe5\x2e\x7e\x0e\x94\x1a\xf5\xdb\x4c\x4d\x61\xdb\x21\x6c\x26\x7b\xf2\xa9\x50\x88\xce\x0c\x48\x2d\x53\x75\xfe\x9b\xa6\x26\xe8\xb8\x8b\x4a\xe3\x44\xf7\xc3\xe3\xd3\x5a\xf8\x8d\x48\xd9\x5a\x5d\xa1\x77\x03\x26\x8d\x24\x2e\x71\x65\x37\xb2\x66\xb0\x66\xf1\x38\xe2\x85\x03\x67\x93\x9e\xa0\x45\x8c\xcb\x2c\x5c\xcc\xca\xf4\x2c\x63\xd5\x6b\xbc\x83\x5d\x5e\x05\xf1\xf8\x67\x53\xd2\x0a\xe6\x6f\xb5\x1d\xe7\x99\x83\x36\x94\x25\x61\x93\x86\xd6\x09\x3a\x1c\xec\x81\x74\x5a\x57\x5c\x73\x19\xa6\xb4\x62\x6a\x7f\x1c\x24\xfa\xae\xad\xfc\x88\x1d\x15\x5f\x5c\x2c\xc0\xd8\x71\x4b\x49\x0a\xc5\xa1\xbf\xb3\xcc\xa4\xb2\x89\xbf\xd3\xe9\x7e\xd7\x89\xc0\x73\x2b\xd8\x2d\x2c\x6b\x2d\xf7\x03\x63\x34\xcb\x6c\xee\x20\x6c\x14\x04\x85\x8b\x4f\x8f\xdc\xf6\x7e\x29\x1a\xaf\xd3\x0d\x43\x03\x16\xd6\x25\x59\x16\xae\xae\x28\x2f\xa2\xd4\xbf\xb2\xa4\x41\x95\x65\xc5\x10\x4c\xf0\x88\xec\xed\x5c\x6b\xcd\xd3\x3b\xb5\xe2\x21\x54\xe4\x81\xb0\xec\xf7\xf4\x91\x08\x6f\xba\x76\xa5\xba\xb6\xb2\x8d\x52\x02\xd2\x5d\x5c\x19\xa6\xa8\x9e\x51\x3b\xf5\x59\xe2\x7a\x46\xba\x7a\xdf\xf9\xa2\x10\x2a\xe4\xe7\xbb\x3a\xd0\x14\xd1\xb2\x72\x7c\x44\x1d\xc9\xc3\xc0\x59\xc7\xb8\x1f\x4a\x85\x52\x45\xb5\xa1\x29\xe5\x9b\x8c\x51\x29\xaa\x15\x76\xf2\x97\x26\x18\x02\x22\x9c\xc5\x32\xed\x94\xd3\xb9\x0e\xd2\x32\xd4\x19\x96\x7e\xe5\xc8\xa2\x70\x1d\x3a\x11\xa5\x12\xba\x2b\xdb\xa2\xf6\xc8\x07\x48\x85\xfb\x3a\x01\x1e\xe3\x48\x26\xe9\xb4\x2e\xc8\xd5\x59\x74\x2c\x21\x8e\x52\xcb\xef\x4a\x6a\x58\xcc\xa5\x00\x3e\x6f\x17\xf6\x0f\xc5\x0f\xc8\x7c\x8c\xf5\x52\x4d\x95\x0e\xe4\xac\x5b\x90\x83\x30\x80\x3e\xa5\x04\x67\x69\x58\x5e\x44\x09\xac\x17\x28\xde\x47\x54\xaf\x49\x7f\xe4\x21\x21\xe9\x23\x08\x8b\x68\x22\xc1\x5e\x44\x8e\x47\x26\xbd\x15\x1f\x64\x25\x4c\xb7\x0e\xce\x47\xc7\xad\x10\xe0\xcd\x34\x49\xb5\x8c\xeb\x17\xff\x20\xc6\x48\x0d\x63\x15\x56\x17\xc0\xa4\xe0\x48\xb6\x7b\x7b\x0c\x58\xc4\x8d\xf9\xd8\x90\x39\x7f\x83\x7d\xe0\x49\xee\x87\xae\x76\xab\xaf\x09\x70\x8f\x16\xcc\xba\x15\x85\xf9\x50\x14\xe3\x22\xda\x5e\x89\x75\xe6\x78\xdf\x3a\xba\x54\x17\x84\xf5\x85\xed\x51\x5c\x39\xeb\x69\xa4\x47\x04\x50\xa3\xb5\xa6\x41\xf0\x24\x1e\xa9\x49\x0f\x08\xe2\xa5\x44\x33\x29\xb4\x5e\x80\xd0\x99\x23\x2f\x9e\x6c\x09\xae\x08\x00\x12\xa6\xda\x75\xa4\xbe\x23\xc3\x77\x46\x7b\x45\x94\x6e\x80\xb4\x4c\x68\x50\x3e\x89\xe3\xfd\x7f\x80\xaf\xf6\xe0\x4c\x44\x76\x22\x8a\xba\x39\x86\x07\x21\xe9\x67\xe3\xdc\x57\xe0\x09\x1b\x69\xf6\xbd\xb4\x2d\x37\x75\x0f\xe7\x4b\xb8\xa7\xed\xbf\x2e\x0f\xcc\xd2\x12\x32\x7a\x40\x72\x91\xb3\x3d\xfa\xc3\x12\x45\x07\x46\x6d\x57\x7c\xb4\x52\xcc\xd2\xf8\xc9\x00\x87\x2a\x6f\xa7\x40\x4d\x0b\xe1\x61\xe3\xd4\x63\xb0\xf7\x08\xef\x61\x98\x38\x5e\x42\x67\xd6\x0c\x4a\x56\x10\xc9\x56\xf4\x6d\xd0\x67\x6e\x40\xac\x67\xd0\x5e\x89\x41\x79\xd8\x8f\xa9\xae\xe4\x1f\x69\x13\x33\xbc\x59\xb0\xc0\x93\xf0\x4a\x66\x75\x6f\xaf\x83\xc0\xb5\xfd\xa5\x02\xda\x5a\x11\xe5\x09\x2d\xbf\xec\xb6\xf5\x76\xe6\x28\x2d\x9c\xab\xd4\xee\x9f\x01\x3c\x0c\x8c\x08\x84\x0a\x74\x67\xeb\x8c\x70\x16\xf5\x5e\x9e\xea\xa5\xf4\x7f\x8c\x58\x65\xca\x3b\x49\x28\x1a\x97\x97\x0c\xf8\x66\xd7\x77\x1b\x85\x88\xae\x36\x8b\x36\x82\xd7\x9f\x50\xe6\xbc\x6d\x28\x10\xfc\xd2\x43\xba\xa2\x75\x4c\xd8\xcd\x48\x29\x11\x74\xdc\xd2\x0d\x1d\x83\x41\x6e\x13\x31\xe8\xc1\x82\x74\x5c\x15\x6f\xe5\x25\xf4\x4f\x33\xca\xfd\x6f\xe1\x90\x5f\xb5\x0e\x36\x0d\x03\x7b\x79\xe1\x3c\xce\x8c\x38\x30\xe5\x30\x0c\x83\x1e\x11\xa2\xdf\x42\xeb\x77\xfb\x92\xdb\x23\x20\x6e\xd0\x92\x5a\x42\x4e\x38\x8e\x40\x25\x8d\x92\x15\x35\x86\x7e\x69\x34\x9f\x95\xd1\xdb\xfa\xfe\x84\xe0\xfb\x8d\xb4\x87\xf6\x6e\x66\x16\x46\x6a\x20\x8b\x2b\x75\x30\xc9\x20\x15\x81\xb4\x4f\x34\x7b\x47\xaf\xeb\x45\x67\x42\xd8\x88\x0b\xfe\x81\x49\xbf\x17\x3d\xe1\x97\x03\x5c\x6f\xc0\x0f\xea\x98\x50\x17\x3e\xa9\x7e\xc7\x20\x90\x4e\x01\x99\x34\xca\xc2\xd3\x28\x92\xbf\x09\x25\x56\xa1\xb2\xb5\xff\x51\x8b\x2b\x1e\xdd\x1c\x01\x8c\x5e\xbb\x6e\x96\xe2\x7d\xb8\xf8\xa4\x6f\x19\xa5\x72\x0c\x8f\x77\xd9\x9a\x29\x44\x2b\xdb\x12\x75\xee\xf7\xa2\x44\x98\x07\xcd\x05\x50\xce\x0c\x61\x37\x94\x90\x8b\x42\x06\x1d\x1d\xfa\x74\x67\xe6\xa6\xfe\x6c\x68\x19\xa8\xd0\xd5\xf3\x4b\x46\x59\x84\xfa\x8f\xf6\x6a\x52\x0a\x47\x49\x6b\x8c\xa4\xcd\x02\xfe\x46\x8a\xca\x43\xd8\x27\x45\xea\xe8\x74\x2c\x63\x8b\xea\x71\xd1\x89\x7b\x72\x49\x8b\x09\x93\xad\xf9\x15\x42\x34\xc5\xce\xfa\x1c\x55\x53\x8b\x5a\x97\x42\x65\x16\x0c\xf8\x33\x89\xcf\x11\xd7\x0d\x79\xfe\xaa\xb0\x93\xb4\x87\x10\x3a\xca\xf4\xe1\x41\x8d\xc6\x72\x04\x5b\xd2\xa4\xdd\xaa\x0e\x2d\x71\x25\x5e\x82\x28\xcc\xe2\x4e\x8e\xeb\xed\x05\x73\xde\xa5\x6d\x89\x2f\x2a\xbf\x7a\x2c\x71\x2a\xef\xc6\xe3\xe0\xc7\xf2\xc0\xf3\xc3\x06\x88\x3e\x34\x3b\x32\xb0\xf2\xe1\xd3\xc1\xdb\x0d\x3c\x4c\x36\xd4\xd6\xd3\x03\x3b\x92\x69\x35\x35\x84\x24\x43\xed\x11\xc7\x01\xea\xae\x24\x03\x6f\x66\x47\xff\xd2\xb4\xfe\x04\x90\x38\x69\x9b\xfa\x2a\xa3\x70\x6a\xd2\x98\x40\x3d\x3c\x4f\xd1\xd7\x37\x41\x2b\x8b\x8b\x24\x2d\x18\x7d\x92\xb8\x7f\x13\xb7\x88\xdc\x4f\xb5\xb1\xf4\xcf\xc6\x4f\xfd\x2e\x51\xa2\xbc\xe2\x92\x87\xbb\x94\x58\x05\x2b\x33\x2d\xaa\x41\x5e\xe5\xe4\xb3\x43\x6b\x12\x7d\x33\x86\x96\xc7\x62\x9b\xd8\xc2\xda\x5f\x41\x1a\x4d\x6c\xe3\x87\x27\xce\x12\x5e\xb8\x6e\xe4\x88\x21\x91\xde\x81\x53\x62\x08\x77\x66\x6d\x73\xd0\xf9\x30\x3b\x61\x15\xd5\x05\xc0\xf5\x40\x98\xc0\x53\x9a\xf2\x6c\xd0\xb4\x5f\xc8\xf7\x2a\x8b\xd9\x05\xc4\xcb\xad\x4f\x32\x96\xe3\x34\x42\xea\xe5\xf4\x9c\x24\x5f\x89\x8c\xe8\xf6\xc0\x91\x8a\x3d\xa0\x61\x51\x20\xbe\x36\x29\x47\xfa\x42\xa3\x40\xf5\x78\x0a\x6b\x5e\x03\x26\x48\x46\xfb\xcd\xd3\x9e\x49\x83\x35\x5c\x10\x1a\x9c\xe0\x68\x1e\x03\x52\x20\x3b\x58\x4d\x24\x23\x64\x58\x6f\x06\xa3\x97\xd1\x1c\x45\x97\x61\xe9\x8f\xd2\xcf\xef\x95\xa8\x99\x7d\xba\xa4\xd6\xa4\x80\xb4\x87\x9e\x6c\x36\x06\x97\x66\x5a\x7a\x4d\x92\x2c\x50\x60\xe8\xaa\x2d\x82\xc6\x2f\x48\x8b\xa6\x33\x9e\xde\x97\xb9\x62\xdb\xc8\xd1\x75\x34\xc7\xd5\xdf\xc2\xb9\x64\x63\xda\xce\x86\x82\x0d\xf6\x0f\x1c\x60\x73\xec\x58\x94\xb3\x06\x44\x8c\x27\x35\x23\x44\x0d\xf4\x0a\x03\x02\xae\x41\x28\xe6\x86\x09\xe5\x9f\xef\xc8\x71\xfa\x65\xc4\x39\x64\xe9\x82\x63\xfa\x25\xe9\xc6\xe5\x28\x6d\x62\x6c\x27\xb2\xf9\x25\x52\xb2\x3c\x02\xe1\xf3\x52\xe7\xe4\x1b\xd7\x10\x69\x40\x49\x52\xf2\x24\x38\xd2\xf2\x83\x8e\xaa\x88\x97\xfe\x09\xcd\x7a\x3c\xb6\x0b\x17\x21\x0d\x1d\x5d\xdd\x47\x00\x23\x52\x6f\xa9\x3a\x87\xde\xa5\x16\x15\xde\xee\x9f\x7e\x49\xe9\x67\xb9\x93\xab\xf9\x98\x4b\xee\x5d\x81\xc5\xf0\xdd\xc8\x4f\xf6\xc1\xbf\x15\x3d\x76\xd0\x8a\x72\x0e\x1c\x9b\xd4\x24\x78\x6a\x93\xc0\x59\x2a\x4f\xd7\xc2\x63\x2f\xa3\x42\xbf\x54\x94\x24\x9f\xe8\x95\xe7\x0e\xec\x6a\xb7\x98\x9f\xa8\xf2\x73\x7f\xcc\x28\xe0\xf4\xa2\xac\x69\x1a\x1f\xa7\x73\xf6\xa3\xf9\x90\xa3\x19\x10\xee\xe0\x71\xb6\x3c\xc3\x75\xa8\xb0\x00\x3f\xa1\x86\x56\xc3\x78\xcc\x28\x97\x7d\xfa\x6c\xf4\x41\x47\x65\x39\x52\x0a\xf6\x5e\xc7\x6c\xd4\x4c\xa9\x5e\xff\xd9\x14\x4e\x5a\x6c\x2b\x9c\xd5\x8f\xc6\x49\xd6\x86\x86\xc4\x15\x19\xba\x74\xc0\xef\x1c\x24\xc6\x7f\xf5\xa8\x28\x59\x6b\x8a\x20\x88\xad\xb8\xdc\xb0\xe9\x6f\x04\x89\xad\x75\xa7\xf8\x61\xa6\xf3\x37\x88\xb3\x5b\x71\xce\x51\x5c\xd5\xf7\xa5\x67\xd9\x52\x26\xd2\xae\xd4\xcb\xd5\x95\x09\xf4\x23\x63\x54\x6e\x37\x16\x9a\x7a\xba\xb2\xa1\xc5\x08\xaf\x67\xba\xb4\x9c\x5f\x5a\x9b\x64\x6e\xde\xf3\x42\x57\x23\xdd\xb5\x86\xa6\xe5\x99\x4e\x0c\xe9\xcc\x81\x5d\x94\xc2\x33\xa0\x62\x90\x06\x29\x7a\x3f\x8f\x39\xad\x7e\xf2\x13\x69\xb9\xac\x7b\xcd\xfd\x5b\xf5\xe8\x0d\x48\xc1\x11\x02\x2c\x5a\x15\x57\x81\x03\x7d\xe2\x70\x29\x38\x00\x5d\xdd\x12\x32\x3d\x29\x16\xf7\x7b\x8d\x93\x1e\x67\x45\x61\x82\x9e\xaf\x02\x4f\x78\xea\x39\x0d\x3f\xd9\x69\x95\xd9\x45\xfd\x45\x01\xc4\x45\x60\x7f\x4a\x0a\x56\xee\xbc\x48\x00\x4a\x7e\x89\x85\x04\x9a\x38\x05\xc6\xe1\xe3\x7e\xc2\x91\x51\x89\x8a\x2c\xf6\xbf\x4d\x98\xfb\x76\x73\xcf\xee\x77\x2a\x2c\xe2\xd7\x4e\x5a\xcb\xa2\x60\x8e\x2f\xc0\x31\x38\x4d\xc5\x11\xc0\x91\x34\xb7\x40\xf0\x87\x0a\x91\x3e\x58\xc1\xe0\xb9\x43\xc2\xd7\x38\xbc\x48\xbb\x33\xc8\xa0\x14\x72\x8d\x2d\xc5\x36\x3f\x51\x85\x9b\x40\xf0\x54\xb4\x93\x30\x6a\xcc\x32\x44\x9f\xb3\x1a\x8f\x29\x28\x50\x34\x69\x12\xad\x03\xc7\x20\x02\x2a\x46\x54\xde\xcc\x2c\xca\x24\x63\x6c\xe2\x65\x48\xbd\xef\xde\x04\x1f\x1e\xd8\xa7\x31\xc8\x0c\xca\x21\x65\x52\x78\xcd\x3a\x40\xca\x82\xe2\x59\xe7\xe9\x69\xf3\xc4\x20\xb3\xb9\xb6\x59\x27\x27\x66\x99\x89\x55\x04\xd4\xa6\x16\x4a\x52\x53\xca\x40\x97\x5a\xb9\x39\x1f\xca\x7a\xb6\x37\xa4\x92\x17\xb6\xab\x1d\x9e\xfd\x25\xfa\x0d\x54\x25\x1c\x56\xce\x44\x55\x57\x01\x50\xe7\x55\x0e\x7b\xeb\x10\x86\xf2\x52\x28\xe4\x76\x88\x29\xcc\x7b\x68\xaf\x3e\x80\x1f\xef\x9b\x30\x4a\x07\x01\xd4\x1e\xec\xc8\xd2\xab\xdd\x12\xed\x50\xdc\x51\xe4\xd6\x9b\x49\x43\x81\x78\xe9\xe4\x56\xeb\x56\x29\x37\x50\xe4\xac\x63\xe9\xe0\x06\x08\xb2\x5f\x1a\xc8\xcd\xef\xc5\x40\xac\xf1\x21\x2c\xf2\xa4\x80\x0c\x59\xa9\x26\x82\x22\x9c\x3e\xc0\xc5\xed\x1b\x2b\x48\x06\xbb\x98\x5a\xfc\xe6\x5b\x60\xac\xd2\x70\xb8\xee\x52\xb1\xc2\xc8\xb2\x75\xd2\x2a\x97\xfc\x1d\xeb\x9a\x2b\xe2\x90\x25\xe9\x7c\xce\x9a\xd9\xe4\xb1\xf5\x6c\xc3\xa2\x53\xde\x17\xa5\x09\xb1\x5c\xd7\x8e\x4e\x62\xe6\xc7\x22\x01\xa6\x45\x4d\xb8\xab\x10\x36\xd6\x21\xc6\xe9\x86\xa0\x7d\xec\xd8\x7f\x66\x54\x8d\x08\xb4\x9f\x9c\x14\x7e\x54\x2c\x60\xde\xff\xa6\xe1\x32\xca\xde\xff\x9d\x60\x49\x2d\xe1\x1f\xe4\x74\x5e\xce\x1e\x4f\x1e\xca\xfb\x39\xa0\x93\xa9\x92\xf2\xe3\x14\xae\xbd\x06\xe0\x72\x60\x67\xed\x76\x4e\xec\xe7\x04\x71\x88\x71\xd7\xdd\x2f\xe1\x38\x82\xb5\x03\x6f\x84\xab\x27\x8d\x46\xbf\xbb\xb5\x27\xb9\xe6\x1c\x3e\xa8\x57\xdc\xb3\x64\x6f\xee\x52\x8a\x89\xd7\x21\xf1\x3f\x3a\x1f\x40\x46\x62\x93\x25\xec\x81\x0f\x5a\x58\x72\x70\x87\x49\xf3\x70\x39\xb7\xa4\xcf\xca\x12\xb4\x97\xa7\x77\x71\x68\xb4\x3f\xa6\x39\xc2\x57\x89\xf7\x8d\x1e\x80\xd7\xb0\xef\xa0\x32\xbb\xf1\xa4\x2b\xad\xd6\x2c\x24\xb5\x96\x65\x01\xfd\x4b\x71\x41\xfd\xa3\x41\x1a\x81\x18\x1d\xbc\x27\xe9\x0a\x72\x80\x9f\xb9\xfd\xfe\x49\x14\x08\xdb\x0e\x81\xfa\x36\x65\x9e\x77\x2c\x37\x6c\x12\x1b\x0d\x34\x07\xc7\x5a\xa4\x8e\x9b\x5f\x13\xf1\xbf\x6b\xd4\x2b\x30\xc9\xae\x51\xb1\xa4\xe4\xb7\x5e\xc9\x6c\x5c\xeb\xc3\x88\xfb\xc3\xba\xcd\xe4\x48\xb6\xe4\x08\xd2\x04\x2f\x2f\x31\xbd\xc2\xe2\xa9\x4a\x26\x67\xc7\xed\x26\xbd\x08\xe9\x3a\x13\xff\xe2\xd7\x5b\x69\x5b\xfe\x47\x2b\xbd\x6c\xd2\x9c\xc2\x7a\xb0\xb9\x51\x3a\x2b\x71\x6c\xdd\xe7\x3b\x2c\xf3\x45\x17\x60\xd0\x62\x44\x22\xe7\xe8\x82\xf2\x2b\x49\x60\x3f\x2f\x8d\xbb\xcf\xbe\x32\x99\x81\x4e\x39\x66\xf6\x3d\x2a\x29\xd8\x28\x94\xd7\xe5\x88\x13\xdb\xa1\x23\x08\x50\xa2\x7d\xc8\x88\xc3\x1e\x88\xdf\x4a\x55\x01\x93\x5e\xcd\xf6\xdb\xd3\x6e\x68\xb4\xad\x4c\xd9\x70\xef\x87\xa0\xd9\xba\x3b\x1b\x51\x24\xde\x6b\x55\xea\xca\x7e\x34\x52\xb1\x0c\xd2\x33\x39\x23\xdc\x6b\xb6\x46\x4e\x3e\x61\x70\x49\x66\x6c\x31\x93\xad\xb3\x05\xad\xb2\xc4\x32\xfe\x92\x58\x3d\xf9\x76\xa8\x53\x11\x44\xfa\x60\x15\x45\xe7\x57\x93\x30\xf0\x9d\x28\x3a\xff\x03\xd8\xae\x5b\xf9\x29\x41\xcd\xb1\x67\xc5\xd2\xac\xae\x1f\x58\x26\xfe\x10\x7f\xf1\x61\x9a\xcb\xd0\xc0\xe8\x03\x09\xd0\x7d\x3f\xd2\xb1\x79\x90\x8f\xbb\x7e\xb0\xc9\x0a\xf4\x02\x70\xae\x67\xc9\x00\xac\x02\x08\x32\xa2\x6b\x39\xf6\x3f\x4c\xde\x6b\x52\x91\x48\x9e\x0a\x6a\x60\xc6\x9e\x44\x97\xc2\x49\x28\x45\xbe\x9a\xcb\x40\x60\xd1\xc7\xcb\x28\xf0\x78\x89\x18\x88\x21\x9d\x85\x21\xd6\xa2\x04\x2a\x1d\xc4\x05\x88\x1d\x18\x8f\xcc\x2c\x8a\x5a\x0a\x22\xef\xb8\x1c\x9b\x4b\x2d\x17\x00\x54\xc2\xc1\xb4\xfb\xe5\x79\xe1\x43\x49\xcd\xbc\x31\xd3\xdf\x44\x45\xf7\x48\x6b\x5b\xde\x6e\xd0\x53\x8a\x1c\x23\x2f\x42\x8e\xcd\xa5\x76\x06\x9f\xa4\xaa\x63\x7c\x4a\xb7\xa3\x0f\x6d\x7a\x68\xb5\x4c\x7b\xb5\x16\xd0\xba\xe7\x7c\x49\x3e\xc8\xe8\xa0\x65\x5b\x92\x5c\xaf\xe2\x99\xb0\x99\xec\x11\xef\x77\x49\x54\xec\xc4\xfa\x04\xe5\x2d\xfc\x82\x7d\xdc\x05\x49\x02\x29\x8f\x6f\xc9\x3f\x60\x4e\x09\x01\x09\xf1\x48\x99\x41\x35\x2d\xac\x64\x0b\x1d\x6f\xcb\xe6\x4f\x38\x2a\x23\xc1\xda\xc7\x50\x80\x05\x97\xc2\x44\xb9\x23\x37\x60\x9e\x0c\x3c\x10\x63\xf7\x14\x57\xe6\x9a\x7e\xc8\x52\xac\xb8\x94\xcc\x6b\x31\xd6\x53\x96\x46\x74\x2c\xad\xc8\x30\x1b\xd6\x97\x1c\xe9\x98\x20\x6b\xd9\x6d\x10\xd9\xd0\x8d\xdb\xe2\xfa\x45\xa8\x1e\x12\x0b\xcb\xef\xd4\xac\x02\x58\x5c\x77\x8d\x1f\x24\xe0\x5e\xa7\xa6\x21\x23\x18\x38\x9a\x0e\x92\x1b\xfe\x2d\xc7\x1b\x2c\x93\x14\xf7\xe2\x25\x7b\x39\xe8\x80\x4e\x0b\xe0\xe4\x12\xdc\xd2\xf1\xb5\x46\x92\x05\x2e\x52\x19\xb4\x0e\x46\xbf\x10\x7a\x16\xae\xc1\xac\xdc\xd6\xb5\x2a\xe1\xd9\x82\x95\xc2\x58\x82\x4d\x18\xcb\x63\x22\x01\x69\x18\x1a\xb2\xca\x33\x4c\x32\x2e\x3e\x5c\x68\xa6\x61\x5d\x3c\x43\x33\x70\x32\xe6\x10\x95\xc1\x6f\xee\x90\x92\xe8\x75\xbc\xa1\xd6\xc4\x8a\x32\xd1\xc9\x07\x64\xf8\x93\xa2\xc6\x34\x8a\x9e\x19\x05\x7b\x42\x2f\x36\xd7\xf9\x7c\x59\xf4\x8e\x0e\xb7\xb3\x7e\x7c\x37\x2c\xd6\x31\x4a\x48\xfd\x41\xc5\xc9\x20\x88\xed\xa4\x62\x84\x1e\x13\xe7\xae\x17\x6f\xc5\x3f\x09\x47\x5b\xe8\xef\x75\xef\x60\x96\x8e\x53\x11\xba\x3e\x2d\x9a\xd4\x3c\xf8\x51\x41\xa6\x57\x24\x65\x49\xa8\x4c\xde\x95\xd0\x4b\xa6\x39\x69\x1d\xd9\x7c\x51\x22\xae\xa1\x45\x84\x6b\xa4\x66\xa1\xa2\x5c\xd3\x78\x14\x8d\xb3\x53\xe1\x48\x42\x94\xcf\xde\xec\x25\xb6\xc4\x48\xf4\x9a\x20\x71\x8d\xb1\x5f\x00\xb5\x6c\x6a\xa6\xdf\x77\xdb\x38\xb1\x6e\xe3\x07\x24\x1c\x2b\xa7\x86\xfc\xb9\xe1\x8d\x54\x40\x90\x35\xfd\xe0\x4c\x15\x6f\xc4\x30\x87\xf8\x1f\x0a\x12\x38\x52\x91\x4f\x5e\x67\x85\x82\x17\x37\xea\x09\x84\x8e\x50\xd0\x10\x84\x1b\xa7\x7b\x62\x03\xe5\x4e\x07\x65\x1b\x39\x42\x9d\xe2\xb9\x86\x67\x60\x42\x13\x4d\xd3\x8b\x10\x5e\x2d\xe9\xaf\x62\x0d\x58\x1e\x8d\xcc\x3e\x9a\xff\xc1\x16\x96\x9b\xf0\x77\xef\x46\xee\xed\x39\x8e\x88\xd9\x19\xdc\x15\x99\x83\xa4\xbc\xb7\xc2\x2e\x50\xab\x9a\x50\x0c\x3a\xf5\x77\x53\xc0\xf0\x8c\x2a\xb7\x5d\x5d\x7c\x94\x46\x58\x00\x68\x7f\x86\xf0\xe4\xac\xb5\xe9\xad\x60\xf6\x6d\x26\x59\xcf\x3c\x0b\x0e\x48\xc0\x70\xc7\x40\xab\x20\xda\x82\x94\xfd\xd2\x5c\x9e\x75\x7a\x52\x33\x4b\x7a\xd3\x62\x29\x34\xea\x18\xf0\x94\x0c\x03\x6f\xfc\x3b\x51\xe1\xcc\x13\x6b\xa2\xf0\x47\x12\xe0\xc4\x8f\x18\xb4\x14\xf1\x08\x2c\x8c\x24\xf0\x94\xa4\x4a\xb7\x0d\x8d\xe2\x7f\x78\x0f\x36\x7f\x03\x3e\x8b\x80\x48\xa3\x82\x7a\x12\xfe\x8d\x25\x52\x48\x6c\x5b\x8c\x36\x70\x3c\x32\x67\xa8\x81\x6b\x6a\x05\x10\x71\x27\x8a\x1f\xd6\x92\xa8\x4b\x2e\x95\x7c\xa3\xb9\xea\x64\xab\x79\x44\xed\x34\xca\x54\x2d\xe2\xa8\x28\x74\x2f\x93\xe7\xff\xa6\x1d\x13\xb5\x44\x12\x47\xa4\x5e\xa8\x7c\x80\xe7\x34\x1a\x4d\xa1\x75\x63\x8f\xc9\x2c\x6e\x61\xe5\xc3\x16\xfa\x3d\x9c\xa9\xc0\xa1\xbc\xa1\x92\xd4\x96\x7f\xff\xaf\xff\xfa\x3f\xff\xf5\x7f\x03\x00\x00\xff\xff\x1c\xf7\x13\x7e\x95\xd2\x00\x00")
+
+func dataFemalenamesJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataFemalenamesJson,
+ "data/FemaleNames.json",
+ )
+}
+
+func dataFemalenamesJson() (*asset, error) {
+ bytes, err := dataFemalenamesJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/FemaleNames.json", size: 53909, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataKeypadJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\x94\xcd\x6a\x85\x30\x14\x84\xf7\x3e\x45\xc8\x52\xeb\xff\x5f\xec\x0b\xf4\x21\x4a\x17\xdd\x75\x21\xa5\x14\xba\x2a\xbe\xfb\xcd\xd5\x8b\x99\x91\xe3\x3d\xea\x46\x26\x42\xe6\x3b\x33\x1c\xf2\x1f\x19\x63\xdf\x7e\x3f\x7f\xbe\xec\xab\xb9\x1f\xfc\xb1\xf0\xf2\x7d\x96\xc6\x7c\xff\x8d\xe3\xcb\x43\xdb\xd2\xae\xb2\x0a\xb2\x0e\x32\x5b\x25\xde\xdb\xea\x59\x7e\x2c\x7f\xbc\xa7\x0c\x23\x70\x13\x10\xad\x38\x43\xb1\x0b\x26\x58\x05\x30\x4c\x23\xfb\x77\x4a\xc6\x0d\x95\x48\x35\x92\x2a\xc5\xfe\x59\x59\x32\x97\x58\xcd\x91\x0a\xfb\x70\xdd\x69\x6d\x96\xfb\xb9\x5a\xcc\x05\xb5\xc9\xf6\x83\x56\x26\x41\x09\xd4\x21\xa8\xd5\xdc\x13\xb5\x4b\xa6\x12\xaa\x3f\xd0\x1f\x59\xe5\x5a\x97\xcd\x7e\x81\x0e\x73\xf5\xe2\xd8\xe8\x1f\x6b\x65\x12\x95\x48\x03\x92\x60\x4e\xd9\x3d\xd5\xca\x64\x28\x91\x62\x24\xe5\xe7\xd6\x5a\xe4\x62\x56\xc7\xac\x04\x59\x83\x12\xe5\xc8\x04\x9b\x8c\x04\x4b\x11\x16\x5f\xb6\x25\x04\xa5\x24\x5a\x86\xb4\x42\x79\x6b\xaf\xcc\x40\xb4\xfc\xe4\xd6\x53\x08\x79\x2d\x1d\xbe\x07\x0b\xcc\x7f\xa7\x68\x8a\x6e\x01\x00\x00\xff\xff\x2d\x9a\xa0\x40\x67\x06\x00\x00")
+
+func dataKeypadJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataKeypadJson,
+ "data/Keypad.json",
+ )
+}
+
+func dataKeypadJson() (*asset, error) {
+ bytes, err := dataKeypadJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/Keypad.json", size: 1639, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataL33tJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xaa\xe6\x52\x50\x50\x4a\x2f\x4a\x2c\xc8\x50\xb2\x52\x00\x71\x80\xdc\x44\x20\x33\x1a\xcc\x04\x72\x4c\x94\x74\x60\x4c\x07\x25\x30\x2b\x16\x22\xa0\x94\x84\xac\xcc\x02\x55\x2e\x19\x59\x4e\x03\x61\x44\x35\x82\x19\x8d\x60\xda\xa0\x6a\x4e\x45\xd6\x6c\x8c\x2a\x97\x8e\x2c\x67\x86\x30\xc2\x12\x55\x59\x26\xb2\x32\x43\x84\x32\x45\x04\xb3\x06\x55\x47\x0e\x0e\x1d\x35\x08\xa6\x39\xaa\x8e\x7c\x64\x1d\x06\xa8\x72\xc5\xc8\x72\x2a\x08\x23\x4c\x51\x95\x95\x20\x2b\xd3\xc6\x69\x53\x05\xb2\x32\x55\x54\xb9\x2a\x64\x39\x23\xa8\x1c\x90\xac\xe5\xaa\xe5\x02\x04\x00\x00\xff\xff\xd5\xd6\x71\x46\xdd\x01\x00\x00")
+
+func dataL33tJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataL33tJson,
+ "data/L33t.json",
+ )
+}
+
+func dataL33tJson() (*asset, error) {
+ bytes, err := dataL33tJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/L33t.json", size: 477, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataMackeypadJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x9c\xd4\xcb\x4a\xc6\x30\x10\x05\xe0\x7d\x9f\x22\x64\xd9\xda\xfb\x35\x42\xd7\x3e\x84\xb8\x70\xe7\xa2\x88\x08\xae\xa4\xef\x6e\x6c\xa5\x39\xa7\x4c\x99\xd4\xcd\xcf\xf4\x87\xcc\x97\x39\x24\xf9\x4e\x8c\xb1\x4f\x9f\xaf\x1f\x6f\xf6\xd1\xfc\x7e\xf8\xcf\xca\x97\xcf\x5b\x69\xcc\xfb\xd7\xb2\x3c\xfc\xd5\xb6\xb6\x47\xd9\x84\xb2\x0d\x65\x71\x94\xb8\xee\x5c\x6f\xe5\xcb\xfe\x8f\xef\x29\x63\x04\x77\x81\xe8\xc5\x3d\x54\x97\x30\x61\x0d\x60\x38\x8d\xdc\x7f\x50\x66\x3c\xa9\x24\xb5\x28\x35\x5a\xfb\x4c\xcd\x8d\x59\xa2\xba\x98\x04\xc7\xb0\x7c\xd2\xc2\xac\xaf\xc7\xea\x71\x2c\x48\x4d\x6e\xef\xb4\x2c\x09\x25\x68\x40\xa8\xd7\xba\xe7\x5a\x94\x8c\x92\x34\x46\xc4\x47\xad\x66\x2d\xca\xee\x3a\xbf\x09\xc7\x1a\xe5\xad\x42\xff\x52\xcb\x92\x54\x92\x1c\x4a\xb0\x4f\xb9\x7b\xaa\x64\xc9\x26\x41\x29\x42\x65\xd4\x03\xa0\x46\x9c\xe3\xdc\xa4\x65\xa8\x0d\xca\x61\xb8\xed\xb6\x8c\xe5\x88\x39\x25\xb8\x28\x80\x12\x25\xab\x40\xab\x52\x1e\xda\xff\x84\x4b\x5a\x89\xda\x7c\x6f\x06\xf9\xac\x38\xbc\x15\x64\xcd\x37\x2f\x18\x61\xf2\x0d\x98\xf0\xe5\xd9\x31\xff\xbb\x26\x6b\xf2\x13\x00\x00\xff\xff\xa3\x67\xe0\x02\xd0\x06\x00\x00")
+
+func dataMackeypadJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataMackeypadJson,
+ "data/MacKeypad.json",
+ )
+}
+
+func dataMackeypadJson() (*asset, error) {
+ bytes, err := dataMackeypadJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/MacKeypad.json", size: 1744, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataMalenamesJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x5c\x5a\x4b\xb6\xeb\x38\x6c\x9c\xf7\x2a\xfa\xbc\x71\x56\x90\x35\x64\x07\x39\x19\x50\x22\x2d\xd1\xa6\x48\x3f\x52\xb2\x5b\x37\x27\x7b\x0f\x28\xb1\x0a\x78\x3d\xd3\xf5\x95\xf8\x01\x0a\x85\x02\xc8\xff\xfd\xf5\x5f\xb1\xed\xbf\xfe\xf3\xbf\xff\xfa\xfb\xef\x5f\x4f\xb7\x85\xf6\xeb\x3f\xae\xc7\xb2\xe6\xfb\xa9\x96\x29\xd4\xfd\x7e\xde\xe2\xbc\xba\x90\xee\x3f\xbe\x31\xa5\xe8\xb6\xfb\x0f\xef\x3e\xd1\x8f\x0f\xfa\x4b\x75\xfc\xd1\x1f\x93\x0e\xda\xc2\x7b\xbd\x9f\xf7\xb5\x6c\xae\xe1\xa5\x2a\x8b\x28\xef\x35\x54\x8c\x96\x23\xa6\x79\xbb\x63\x3c\x6d\xae\xbe\xc6\xff\x4b\x76\x69\xcc\xb0\x84\x52\x97\x70\x3f\xbf\x42\xce\x61\x1f\x33\xb4\x3d\x7c\xc2\xd8\x44\xf0\x5f\x2e\x69\xaa\xd1\x71\x6f\x3a\x8e\xcb\xb2\xa4\x7c\x62\xa0\x4f\x1c\xef\x3c\x5d\x2b\x19\x0b\xd8\xf7\x35\x7c\xc7\xbc\xae\x8e\x97\xf7\xb8\x95\x7d\x3d\x75\x8f\xf7\x53\x72\x15\x6f\x3c\xc3\xe3\x51\xc3\xf8\xe3\x51\x5d\x1e\xfb\x68\x73\xd9\x87\x69\x83\x98\x8d\xeb\x16\x4b\x64\xac\xca\x57\xcc\x58\xdd\xb9\x95\x8c\x6d\xd7\xb0\x94\xaa\x93\xae\x87\xc3\x5c\x9c\xd6\x8b\x39\xe2\xb0\xf1\xd7\xa5\x1d\xe6\x7d\xbb\x5d\x66\x1b\x6b\x78\x07\xfe\x2e\xbe\x2a\x30\x87\x2f\xc7\x92\xe0\x20\x59\x0e\xc6\x9c\xc5\x9f\x63\x69\x75\x5f\x8f\xf1\x65\x3d\xd5\xa4\x0b\x86\x7b\x96\x61\x89\xe7\xe1\x68\x4c\x4c\xeb\x92\xc2\xea\x29\x6e\xd8\x57\xbe\x73\xb4\x1d\xc6\xdf\x75\x33\x32\x2c\x7d\xf5\x0a\x91\x5e\x76\xdb\xf1\x07\x22\x03\x8c\x95\x00\xb5\xe4\xbe\x35\xe4\x79\xfc\x23\x0b\x3c\x0b\x77\x56\xcb\x18\x7e\x0a\x59\xe0\x8f\x79\xa7\x7a\xe0\xfd\x49\xdc\xe5\x81\x00\xe7\x01\xf8\x55\xbd\x2b\xae\xf5\x30\xf2\x99\xf1\x99\xac\xe5\x34\x40\x1c\x4b\x29\x07\x1c\x22\x7e\x0a\xdb\x78\xc3\x89\xe1\x61\x3f\x99\x6d\xfc\x1a\x8e\x25\x60\xb8\x6e\xf6\x82\x35\x1f\xad\x85\x34\xf6\x3c\x95\x69\x1a\xef\x7f\xe2\xbc\x97\x0a\x38\xe5\xd0\x86\x79\xdf\x6b\xb7\xcb\x7b\x58\xb4\x78\x8f\x05\x34\x40\x75\xae\x2e\x2e\xf0\x0b\xfc\xd0\x56\xf7\x1d\x8f\xb3\x60\x59\x2d\xd8\x02\x5e\xe9\x23\x63\xe0\x2b\x88\x95\x3c\x10\x49\x81\x78\x79\xc6\x8d\xfb\xcd\x7b\xc9\xb1\x30\xd8\xf1\xf2\xa4\x38\xda\x19\x8b\x89\x26\xdb\xe2\x0b\x4b\xd8\x5d\x4e\x08\xa8\x14\x04\x3f\x88\x6e\x8b\x24\xef\x52\x40\xe4\x66\xa2\xa4\x16\x9f\xf1\xe9\x7c\xd4\x1d\xa3\xe7\x52\x37\xc7\x48\xaf\x24\x00\x79\x98\x43\x1e\xb6\x5c\x92\xc4\x94\x06\x75\x20\x07\x54\x21\xc0\xa6\xff\x20\xfb\x79\x02\xbf\x4c\x63\xec\x90\x38\xb6\x4b\x0a\x9e\xd7\x89\xd5\x76\x86\x98\x31\x9a\xe0\xcf\x73\xab\xe2\xb3\x83\x31\x59\x35\x82\xfa\x28\x41\x63\x5a\x98\x82\x21\x98\xc8\x80\x98\x94\x68\x0e\xde\x33\x5c\xe4\x5b\x6e\x05\x31\xd1\xb1\xe8\x08\x34\x05\xbc\xcc\xab\x06\x17\x53\xc1\x93\x29\xf0\xd3\xb1\x85\xb9\xf0\xa5\xf9\xa0\x17\xe7\x35\xb8\x31\xaa\xf0\x69\xf1\xa5\x02\x87\x29\x3e\x1e\x85\x23\xc7\x85\x4e\x2b\x4d\x22\x00\xa6\x3c\x09\x28\x60\x65\x43\x94\x58\xd3\x86\x7f\x48\x2f\xf0\xbc\xf0\xa1\x89\xcf\xb1\xea\x54\x4e\xcf\x81\x36\x03\x2a\xb0\x68\x0d\xc8\x3b\x62\x03\x46\x9e\x04\x70\xd9\xe0\x31\x1d\x43\x3e\xc4\x02\xb8\x96\x1d\x2b\xfd\x86\x46\x5f\x7a\x86\x51\xe7\x72\x2c\x95\xb9\xcc\x1b\x1a\x7c\x07\x5f\x0b\x57\xa3\x7e\xf6\x18\xe1\xc7\xf5\x44\x0b\x50\x17\xe6\x1a\x01\x89\xc1\xf4\x21\x5f\x8e\xd1\x3f\xe2\xc2\xf2\x47\x86\x2f\x70\xc1\xe9\x83\x62\x1d\xc3\x28\xb3\x08\x2d\x64\x05\x8d\xc0\xa0\x90\x88\x15\x4a\x30\x45\x63\x6e\x99\x2a\x63\xa8\xba\x0d\x53\xef\x82\xf9\xf1\xc2\x12\x4d\x46\x50\xe2\xeb\xc8\x19\x9f\x85\x25\x6a\xba\xae\xc7\x14\x48\xd6\x01\x59\xd4\xe5\x05\x88\xb9\x89\x80\x32\xa2\xba\x87\xd3\x58\x58\x00\xa6\x2d\xa6\x5d\xa9\x17\x4a\x83\x43\xcf\x61\x8e\x09\xfe\xe0\xbe\xaf\xa4\x3c\x86\x4a\x9b\xee\x10\xc1\xbe\x38\xd1\x18\x4a\x37\x34\xb3\x50\x2b\xe9\x80\x61\xef\xbc\xea\x91\x17\xc9\x72\x66\x6e\x17\xee\x3d\xe0\x11\x09\x71\x83\xc4\x13\x3b\x0d\x58\xe3\x2d\xa4\xa2\x66\xdb\x4f\xc4\xea\x1e\x3d\x66\xb3\xa7\x97\x63\xe6\xbe\xf7\xc0\x50\x56\x79\xb3\x9f\xb2\xf0\x60\x60\x3f\x5e\x4e\x26\x86\x64\x3f\xc0\xd3\x5c\x90\xb5\x9e\x47\x02\x1f\xbc\x0e\xf8\x53\x58\xc4\x69\x2e\x39\x39\xf5\x7a\x2c\x2b\xe6\x1e\xd1\xea\x4d\x12\x15\xce\x5a\x56\x0c\xd1\x91\x8c\xf5\x3f\x42\x8a\xff\x90\x05\x36\x2c\x48\xf2\xac\x62\x41\xad\x4a\xa0\x80\x82\x9f\x2e\x6e\x4c\xac\x0d\xc1\x72\x93\x31\xa3\xd7\x04\x85\xa8\xdb\xf1\x7a\xfc\xd0\xb8\x3d\xc9\x61\xe2\x16\x35\xa7\x4c\x27\x5d\xde\x6d\x81\xf7\x63\x73\x6e\x56\x9a\xa3\x09\xba\x68\x21\x99\x8a\xa5\xe1\xd5\x4f\xac\x0b\xfc\xaa\x9a\xa0\x09\xab\x38\x8f\x58\x7c\x45\x28\xe2\x16\xe4\x6d\x44\x22\x25\xf0\x8b\x31\xd7\x85\x94\x7a\xab\x32\xbc\x82\xc0\x9a\x21\xdc\x5f\xd2\x34\x2f\x9a\x2f\xfe\x3e\x98\x92\x4c\xb2\x68\xbb\x7c\x64\x32\x8f\x46\xbc\xfc\x7c\x54\x5a\x30\x3c\x7b\xa4\x14\xd8\x0b\x06\xca\x4a\x10\xc7\x4e\xcd\xff\x0d\xd9\x5b\x6e\x0d\x5b\x74\x2b\xdc\xea\x8c\x41\x91\x47\xbc\x41\x62\x61\x16\xdf\x6b\xf8\xc0\x3c\xe9\x80\x5e\x90\x62\x83\x3c\x23\x3a\xb2\x1a\x91\x4b\x4b\x41\x6f\xac\x87\xf2\xd0\xc5\x27\x85\xc4\x77\x20\x08\x4e\x15\x16\xa4\x9e\xf4\x28\xb9\x8d\x77\x4b\x4d\x0a\xd6\x8a\x44\xd4\x45\x1c\xfd\x7e\x2b\xb4\xf1\xca\xdb\x4d\x98\x26\x09\x7b\xe7\x1f\x8c\xb3\x81\xa8\x04\x26\x13\xd4\xf6\x94\x9c\x6e\xac\x3a\x7a\xb5\x58\x0d\xf0\x52\xe9\x2c\x74\xe4\x56\x4b\xcf\xf0\x44\xac\xce\x30\x1a\xaa\xb1\xd0\x98\x6a\x05\xe3\x46\x4f\x6d\x2e\xcd\x25\x61\x9c\xc3\x17\x4a\x6c\xaf\x94\xfe\x32\xf2\x46\xde\x19\x33\xbd\x6b\xdf\x2c\x53\xb3\x3e\xd6\x79\x8d\x86\xea\xc7\xbe\xbf\x63\x92\x5e\x9c\x80\x9c\xb3\x99\x6f\x71\xa6\x2e\x28\xa6\xb8\xba\x4b\x09\x8c\xde\x69\xe2\x8d\x84\x1f\x14\x2e\x37\x06\x0a\x42\x00\x60\x10\xf9\x8f\x22\xec\xf2\xc2\xf8\x3d\x98\xc4\x24\xfb\xc7\xe6\x96\x43\x22\x57\xf2\x2b\x86\x71\x46\x72\x4f\x0a\xa7\x5c\x8c\xf0\x2c\x02\x92\xb1\x59\x65\x89\xe0\xb7\x03\x89\xe1\x8a\xef\x5d\x05\xd1\x15\x5c\x58\xd2\x97\xf1\xd1\x15\xc3\x02\x58\x9a\x1c\xef\xb5\x6e\x6d\x67\xfa\x98\xfc\x5b\x8b\x14\xa6\x9f\x90\x40\x8e\xad\x32\x1d\x3e\xfb\x00\x11\x8c\x20\xfa\xab\x72\x1f\x5f\x9b\x94\x53\xd0\x04\xd6\x22\x1d\x1e\xbb\x54\x1e\x8b\x91\x25\xd2\xf5\x0f\x04\xea\xb7\x14\x61\x81\x91\x57\x5e\xff\x2a\xf5\x93\xac\xd8\xb8\xbf\xc1\xb6\xa2\xf0\x3f\x88\x88\x28\x99\x48\x7b\x00\x3b\x1c\x1f\xd3\x1f\xba\x25\x82\xeb\xc4\x89\x5a\xe0\x49\xf6\x34\x9c\x16\xdb\xc6\x6d\x17\x59\x77\x42\x1c\x6b\x95\x1d\x54\xf9\xfb\xf0\xd5\xdc\x40\x83\xa8\x62\xef\x65\x37\x38\x63\x19\xeb\x88\x4b\x76\x33\x98\x58\xf4\x68\x18\x29\x67\xd7\x76\x87\x78\x2c\xa9\x06\xd7\x88\xbd\x1a\x03\xd1\xe6\x5c\x02\x47\x58\x28\x2a\x49\xeb\x7e\x9c\xa4\x63\x70\x85\xbc\x82\x19\xd4\x67\x16\xbb\xa2\xbb\x22\xd8\x78\x2e\x99\x72\x25\x17\x10\xed\x22\xbf\x21\x60\xd7\xa8\x52\x44\xcc\x4f\xda\x4d\x8e\x9c\x74\x2b\x1a\x3a\x00\xba\xfc\x1d\xea\x4c\x8d\xfb\xcf\x6e\xf5\x91\x11\xf7\xa1\x26\xdd\x2a\x45\xfb\x06\x04\x5c\xb9\x08\x70\x97\x5f\xc1\x4e\x51\xdd\xd3\xa8\xd7\x44\x88\x6b\xcd\xd7\x57\x9b\x94\x34\x58\x69\x14\xd5\x09\xbb\x96\xa2\xdd\xce\x5a\xf5\x4b\x0e\xd2\x02\x94\x75\x35\x7e\x72\x13\x3c\x32\xb8\x62\x38\x4e\x52\x15\xdd\x23\x96\x7a\xc2\x9c\x33\x25\xf9\xf5\x3e\x20\xe2\x8e\x89\x7c\x15\xb6\x8d\x82\x65\xeb\x35\x3e\x60\x61\x2b\xd6\xa7\x69\x7d\x08\x59\xb0\x07\xd4\xe7\x25\x52\x55\x35\x95\x7d\x27\x56\x3c\xfc\x29\x33\x76\xf1\x5c\xb8\x53\xf4\x5e\x42\xd3\xcc\x89\x08\x5a\x8f\xcd\x84\x96\xac\xd1\x2c\xe6\x6a\x4f\x39\xaa\xc1\x03\x36\xfd\xc4\x5e\x25\x53\x19\xca\x2a\x77\x72\xb5\xf2\x86\x14\x7f\xcc\xea\x82\xf7\xc8\x02\xc3\x41\xb3\x08\x4b\xb2\x83\xe4\x83\x58\xa7\x12\x7a\x41\x53\x91\x89\xa0\x5a\x58\xba\xbe\x63\x47\x0d\x1d\x81\xbd\x9e\x0c\x17\x11\xbd\x24\x3a\x29\x7b\xa6\xa8\x8d\x43\xad\x74\xa5\x88\x65\xab\x43\x60\x98\xc8\x6e\x4b\x2d\x1f\x2c\x2d\x68\x0e\x9b\x53\x27\x56\x6e\xd1\x9f\xaa\x75\xd7\x43\x4b\xb5\x4d\xdb\x8e\x41\x8b\x97\xde\xc9\x00\x13\x5e\x6d\x0c\x88\x86\xab\xc9\x03\x8e\x60\xed\x2e\xdf\x45\xf8\x45\x8c\x81\x92\xba\xd0\xf2\xa2\x0d\xb8\x43\x91\x18\xd8\xe0\x4c\x29\x2e\x92\x2e\xb3\xb0\x74\x8b\xa9\x32\x9f\x12\xd9\xc4\xd3\x47\x5b\x5e\x9a\xb4\xf6\xb3\x19\xd9\x6a\xd4\xf2\x44\x3d\x28\x95\x8d\x78\x90\x81\x03\x43\xfa\xc0\x4e\x64\xb7\x44\xa0\x88\x76\xbf\x0f\x82\xe0\x02\x0a\xde\x6f\x06\xe7\x49\xc2\x6b\x67\xbc\xd2\x18\x77\x0f\x94\xd5\x86\xa4\xb1\x08\xaa\x2b\x6d\x46\xf7\xb1\x27\xc1\x89\x21\xac\x65\x4f\x2b\xa9\x30\x89\xe5\x52\x2d\x69\x92\x63\x72\x51\x67\x3a\x46\x2d\x77\xd8\x17\xaf\xc5\x0c\xac\x37\x29\xb0\x2b\x4a\x8e\x90\x7a\x1a\x54\xb4\xd9\x22\x5e\x11\xbe\x95\x48\xa6\xeb\x74\x80\x61\x1e\xd1\x07\x76\x4c\x9c\xf7\x01\x1f\x5c\x1d\x13\xbe\x3f\xe3\x25\x07\xf0\x57\xf7\xd6\x8e\xbd\x44\x82\xea\xae\x8d\x80\xed\x92\x83\x2a\xbd\x77\xaa\x49\x8d\x00\x92\x68\xf7\xa6\x8d\xfb\x43\xf5\x46\x0e\xd4\x2d\xca\xae\x02\x5d\xe4\xe8\xab\xd7\x93\x14\xa4\xb4\x1f\x7b\xa7\x6e\x32\x61\xb1\x2c\x0c\x48\x36\x13\xa5\x6e\x62\x21\xb0\x60\xdb\x52\x8f\x61\x04\xed\xbc\x48\x7d\x42\x8a\x35\x5a\x71\xb3\x05\x96\x90\x05\x34\xe6\x22\xa9\xd3\x25\x6d\xab\x68\xf7\x4c\xe4\x4a\xc4\x48\x8b\xca\xe8\xfe\xa3\xa1\xc5\xde\x60\x56\xc5\xcf\xad\xc9\x30\xd8\x44\x2e\xa6\xdb\xa2\xd0\xd2\x24\x6d\xe2\xfd\xee\xce\x00\xcb\xab\x28\x73\x9c\xac\x94\x5c\x98\x81\x26\xd7\x40\xf9\x3d\xfd\xa8\xcc\xe9\x27\x09\xe0\x61\x06\x5d\x47\x27\x32\xb1\x66\x82\x26\xd1\x60\x9a\x04\x8f\xbb\x73\x38\x26\x3e\xd2\xd9\x88\x40\x11\x69\xd1\x56\xc1\x52\x70\x31\xb5\x7a\x55\xb8\x8b\x63\xb8\x08\x5f\xd3\x5a\x52\x72\x01\x54\x4e\x79\xc3\x47\x3e\x39\x92\x96\x30\xe8\xc6\xe4\x33\xa3\x87\x58\x4c\x3d\xd8\xfb\xb1\x6c\x88\x1e\x19\x62\xab\x35\xd4\xd4\xfe\xd0\x2e\x69\x73\x59\x85\x86\x68\xc1\x49\xcf\x2e\x36\x96\x73\x57\xf5\x85\x83\x8f\x22\x0c\x03\x4b\xee\xe1\xe1\xb4\x53\x8a\x4d\x92\xe0\x24\x26\x35\x92\xa7\xe0\x8e\xc1\x87\x26\x23\x2d\x8e\x9d\xb3\xd8\x22\x2b\xe0\xbd\x1e\x46\xa8\xa7\xed\x5f\x55\x16\x79\x29\xd2\xab\x68\xeb\x8e\xb1\x94\xf9\xb6\xde\x05\x4c\xec\xfa\xf4\x33\xb6\xd3\xb2\x40\xcc\x54\xa0\x35\x71\xfa\xa0\x5c\xf5\x32\x8d\xef\xae\x90\xa9\x5f\x64\x0a\x15\xb8\x1f\xe6\x9a\xb9\x5b\x88\x6b\xcf\x1f\x95\xef\xaa\xcd\xc3\xc6\xb0\x7e\xbb\xf6\xfb\xd0\xee\x7b\x91\xea\x73\x73\xa6\x61\xec\xb2\x36\xff\x23\x68\x33\x99\x83\x16\xcf\xce\xc6\x75\xfe\x12\xf4\xfc\x05\xcc\x73\x49\x14\xb2\xa0\x8b\x50\x99\x87\xba\x7e\x31\x95\xd1\x64\x92\xa1\xe4\x2e\xb6\x03\x3a\x62\x09\xce\xde\x46\x25\x80\x9f\x6e\x96\x5c\x09\xe9\x21\x59\x0d\x58\x2c\xed\x60\xf7\xe4\xab\x11\xdc\x33\x22\xa7\xee\x7d\x0d\xed\x2b\x9e\xbd\xc0\xe3\x8e\x59\x59\xee\xbd\x16\xd2\x83\x33\x1e\xe4\x88\xa5\xc5\xde\x9a\x95\x59\xb5\x66\xf2\x74\x99\xa5\x3e\x62\x99\x51\x8c\xe6\x5d\x0f\xc8\x95\x9e\x89\x6d\xda\xd3\x9e\x70\x53\x56\xee\xe4\x3f\x86\x8f\x9d\x67\x72\x04\x86\x2b\x14\xd9\x7c\x56\xa6\x9b\xb3\x46\xed\x6b\x66\x73\xc0\xc5\x9e\xa0\xf6\x01\x64\xac\x5d\x95\xf0\x46\x59\xe2\x8e\x5b\x75\x68\x53\x73\x5e\x89\x64\xff\x25\x0f\xdf\x2d\x0f\xd6\x93\xd0\xa9\xdb\x69\x0e\x94\xb3\xe3\xa9\xc2\x6e\x52\x8d\x29\xe2\x7e\x34\x8b\x89\x25\x09\xb5\x1f\x57\xff\xe4\x71\xd3\x67\xd0\xba\xc3\x3d\x8b\x09\xd2\xc8\x81\xaa\x69\x39\x6b\xab\xd7\x4d\xfe\x60\xb7\x98\x39\x30\x1d\xb3\xe2\xbd\x85\x73\x2b\xe8\xe3\x5c\xc7\xbf\xec\x5d\xf6\xd3\x3e\x78\xf4\x8e\x18\x86\x61\xe7\x13\xd5\x6c\x35\x1f\x54\x64\x7d\xf0\x40\x26\xaf\x3e\x66\xa6\xf5\x9d\x87\x4f\xe1\x87\x7d\x9e\xa4\xfa\x72\x52\x8d\x72\x22\x04\x2f\x2b\x8e\x8f\x1c\x0b\x34\xa9\x7b\x18\xba\xbf\x79\x1a\x97\xf4\xdc\xee\x25\x98\x0e\x1b\xad\x0c\x62\x9b\x8a\xc9\xe2\xda\xcd\x93\x84\xac\xdd\x73\x38\x81\x50\x15\x46\x79\x17\x2e\x73\x74\x74\xa9\x43\x5a\x78\xe0\xd3\xc2\xda\xca\x1e\xe8\x1b\x61\x55\x43\x34\x25\x4f\xb7\x14\x45\x8e\x6a\xd4\xaf\xe9\x4b\xf5\xc8\x20\x86\x24\x25\x1d\x0a\x17\xcd\xe0\x13\x95\xf4\xf3\x20\x10\xd9\xa9\x15\x22\x6d\x3c\x00\x5a\xc9\x79\x39\xf2\x5c\x42\xca\x1e\x3d\xdc\xdf\xbf\x14\xa6\x89\x24\x27\xf6\x93\xe8\x23\xf5\xd6\xf0\x38\xd8\xdb\xf5\x64\xf6\xd2\x3e\x66\x73\x58\x48\x3f\x54\xe2\xe1\xc4\x7d\xa2\x09\xd1\x19\xd9\x16\x8e\x9f\xa2\xe7\x96\xec\xca\xde\x0a\x18\xd9\xd1\x89\x13\x78\x04\xd6\x8f\xba\x50\x80\x3e\x64\x65\x3f\xb0\x76\x0b\xe4\xb5\xcd\xd2\x9f\x64\xe0\x05\x0b\x62\x99\x34\x6e\x79\x80\x79\xaf\x86\x29\x9a\x17\xe9\xdc\xb4\xb1\xae\x58\xe9\xe4\xaf\xad\x28\x3d\xa9\xa1\x5e\xe9\x68\xd3\xa2\xe5\x1b\x11\x95\x93\x4d\x76\xa2\x7a\xd1\x9f\x52\x45\xed\x2e\x0e\xd2\xe6\xc5\xe1\x09\x8f\xc3\x33\x23\x2c\x7c\xe5\x3a\x34\xd2\xd3\x81\x30\x1b\x2e\x60\x07\x31\x2b\xb3\xe7\xe8\xe1\xfd\x1d\x0f\xef\x52\x1f\x91\x05\x4b\xf1\x0c\xa5\x90\xed\x8d\x99\x43\x14\x1c\xfc\x53\xd8\x2f\xd1\x0e\xd8\x4c\x11\xf3\xa2\x23\x6f\x52\x05\x4f\xbf\xf4\xea\xcb\x2a\x72\x82\x53\x4e\x87\xf6\x19\xc7\x22\xea\x87\xc1\xef\xd8\xbb\xef\x67\xf2\x20\xa6\xfb\x6c\x91\x2e\x29\x49\xe1\x1b\x27\x25\x8e\xc4\xe0\x52\xfe\xc9\xe3\x1b\x71\x92\x22\x95\xac\xb1\x17\x55\xd6\xda\x05\xbe\x3a\xda\x5c\xaf\x9e\x58\x5e\x94\x48\x4b\x9b\x73\x37\xaf\xdb\xdb\xa0\x06\x7b\x62\x58\x4d\xb0\xf3\xd4\xb0\x4c\x68\x71\xe8\x25\x1c\x26\xcc\x7a\xbc\xb5\x59\x56\x92\x96\xf4\x2f\x03\xa6\x5e\xbe\x2a\xa4\x23\x23\x99\xa7\x65\x5f\x0d\xcb\x71\x38\x42\x2c\x7b\x5c\x09\x79\xe1\xd6\x84\xb0\x09\xea\xba\x53\x38\x14\x4b\xee\x37\x0b\xd8\x7a\x5c\xb9\xed\xaf\xbd\x54\x62\x45\xae\x76\xab\xb7\x22\x14\x06\x9f\xbc\x48\x3a\xb9\xcc\xab\x46\x06\x65\xd6\x55\xbf\x9a\xfa\x3f\x12\xf8\x8f\xab\x03\x3e\xeb\x25\x0d\x73\xec\xbc\x97\x29\x6a\xde\x85\x93\x57\x27\x6a\x9c\x61\x73\xb4\xf0\x7e\xb3\xf8\xb7\xe7\xff\x22\xf6\x89\xd3\xbe\x69\x9e\xc3\x9f\xba\xae\x57\x90\x88\x40\xa7\xa1\x9f\x94\x54\x60\x2a\x68\x5d\xa6\x76\x16\xb5\x24\x72\x90\x13\xac\x81\x6d\xf8\xba\xb3\x90\xea\xd7\xc7\x78\x79\xe2\xe0\x09\xb9\xa1\x15\x51\x73\xe6\x8e\x04\x92\xce\xae\x9d\x7a\x3d\x45\xba\xaa\x52\x0c\x16\x85\x2b\x49\xd7\x8f\xde\x86\xd0\xfe\x0f\xc5\x98\xff\xe3\x44\xb1\x6b\x11\x84\xc1\x75\x03\x02\x08\x96\xea\x31\x1b\x31\xff\x4f\x44\x86\x6c\x85\x4d\xcd\x14\xe2\xa2\x77\x9b\xfe\xe8\x07\x4f\xdc\x6e\x75\x4d\x05\x80\x14\xe7\xbb\x36\x50\x14\xbe\x24\xc6\x7e\x8d\x8a\x94\x20\x91\x0b\xe7\xfe\x66\x0e\x0c\xe2\xd1\x29\x6a\x29\x08\x7e\x17\x9b\xf0\xd4\xc4\x1b\xc9\x79\x1f\x1d\x8c\xb5\x88\x37\xd9\xb5\x2a\x27\x43\xf0\xd4\x4a\x2a\xfc\x84\x17\x85\x94\x10\x4e\xb3\x30\x54\xa2\x0e\x89\x57\x4c\x46\xd1\x88\x9d\x57\xe6\xcf\x1c\x4c\x63\x3f\x78\xc5\xb4\x0f\xf6\x4e\x93\x53\x49\x2f\x3f\xb3\x7b\x3a\xee\x0d\x38\xaa\xfd\xea\x4d\xc5\x4a\x9a\xbb\x32\xc6\xfd\x48\x02\xed\x47\x31\xba\xa3\xfb\xba\x1e\x9f\x4d\x45\x7a\xe5\x41\x52\xa7\xdb\xa6\xca\x4b\x83\x7b\x64\x6c\xac\x9a\x12\x1f\xa6\xdb\x28\x86\x92\xa8\xd5\xd6\xa0\x6b\x1b\x4f\x0e\x49\xad\x5a\x7f\xbe\x48\x06\x6c\x64\x69\x75\x28\xc9\x0b\xab\xed\xd7\x89\xc0\x65\x22\x20\x78\x3f\x6e\xa5\xd0\x7d\xf2\x1a\xc2\xb8\x1b\x88\x70\x93\x8d\x31\x88\x4b\x33\xf4\x27\xbf\xb6\x6f\x61\x1d\x71\x9f\x68\xf3\x1c\xa3\xf0\xc4\xfc\x36\x39\xdb\x54\x6c\x75\x4d\x21\x8b\xfb\xe6\x9d\xcc\xc6\x14\x01\xf4\xc5\x56\x79\x95\x68\xb9\x54\xf9\x30\x58\xcf\xee\xc8\xd5\x0d\xe2\xb7\xd2\x2c\x3f\xbc\x87\xb8\x15\xaf\xc7\xb0\xd7\xad\xa5\x60\x6e\x2d\x65\x06\xc5\xd3\xa1\x0a\x73\x67\xd2\x0a\xd3\xa9\x7a\x7c\xc8\xde\x6c\xb7\x24\xd8\xc3\xe3\xeb\xe6\x2c\x30\xb9\xc8\x34\x06\xa2\x5f\xed\xf8\x25\xdc\xef\xe8\x0b\xd4\x0b\xa6\xbc\x3f\x99\xf5\x9a\xd6\xfc\xaf\x83\x34\x49\x41\xb1\xe8\xad\x99\x34\xe3\x52\xd4\xab\x98\xd3\xd1\xf6\x0e\x2b\x39\x53\xef\x20\xf4\x3d\x8d\x67\x36\x7e\x57\xb1\xb7\x63\x7c\xa8\xb0\xa3\x2e\xed\x07\xc0\x43\x8d\x57\x7d\x62\x8f\x34\x18\xf1\x7d\x8b\x96\xc4\x33\x24\xd1\xe2\x94\x2a\xd7\x3e\x1e\xe6\x0e\xaa\xe6\x5d\x29\x75\x8a\xa9\x58\x02\xbb\xe6\x29\x98\x9b\x05\x2f\xbd\xbd\xf8\x0c\xff\xbe\xa0\x05\x9a\x37\xb7\x98\xe7\x3f\x6f\x2c\x24\x6d\x0b\x98\x8c\x2a\x30\x4e\x7a\x01\x71\x19\x79\x5e\x84\x00\x55\xf4\x53\x64\x0a\x8d\xb1\xe8\x1a\xae\x63\x3c\x49\x66\xe0\x1f\x53\xfb\xb7\xc8\x4b\x62\xf1\xc1\x45\x3a\x2c\xf2\xbe\x51\x0d\x3f\x5c\xd7\x0e\x7f\x78\xf9\x80\x97\x90\x2f\x24\x8d\x61\x4e\xd3\x8b\xea\x77\x26\x60\xc3\x88\x00\x24\x29\xf6\xb6\x03\xaf\xf2\xfd\x79\x53\xa0\x1f\x22\xb6\xf2\xeb\xaf\xff\xf9\xbf\xbf\xfe\x3f\x00\x00\xff\xff\x45\xf8\xc0\x95\x0f\x2e\x00\x00")
+
+func dataMalenamesJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataMalenamesJson,
+ "data/MaleNames.json",
+ )
+}
+
+func dataMalenamesJson() (*asset, error) {
+ bytes, err := dataMalenamesJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/MaleNames.json", size: 11791, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataPasswordsJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4c\xfd\xeb\x72\xf3\x3a\xd0\x2c\x8c\xdd\x0b\x7f\x24\x55\x7b\xbf\x3b\x65\xc9\xe7\xe4\x16\x72\x07\xf9\x91\x02\x49\x88\x84\x44\x12\x7c\x78\xd0\xe9\xbb\xf9\x6f\xa6\xbb\x21\x2f\xfb\x59\x65\x2d\xd9\x92\x48\x60\x30\xc7\x9e\x9e\xff\xab\xfa\xff\xa6\x75\xab\xfe\xdf\xff\xbf\x6a\x0e\xeb\x7a\xcb\x4b\x5b\xfd\x4f\x75\x38\xbe\x7f\x7c\x7e\xbd\x1e\x7c\xff\xe8\xa1\xfd\xf8\x77\x8b\xcb\xf6\x28\xbf\xb2\x9f\xed\x12\xba\x3c\xd9\x83\x79\x5f\x57\xff\x45\x1d\xd6\x58\x87\x61\xb0\x87\xa7\x9c\x37\x3d\x1c\xe2\x36\xc6\xe4\x7f\x37\xe6\xe9\x12\xfd\x0f\xbf\x7e\xfd\xdb\x1e\x84\xba\xb1\x77\xf3\x5f\xed\xeb\x16\xa6\xce\x1e\xad\x7d\x68\xf3\xcd\x9f\x0a\xeb\x16\x17\xff\x3c\x7c\xd9\x83\xe3\xdb\xdb\x9b\xfd\x38\xdb\xa5\x06\x7f\xbf\x75\x9f\xe3\x32\xe2\x61\x1f\x96\x21\x3e\xfe\xae\xdb\x2f\x61\x6f\x2e\x63\xf4\xdf\xed\x13\xdf\xc8\x9f\x79\xe4\xdd\x1e\x6d\x8b\x7d\xde\x94\xfd\x4d\x17\xfb\x58\xfc\xb6\xde\xf5\x79\x5b\xea\xf8\xcc\x9a\x9b\xe6\xf5\x42\xdc\xdf\xc6\x4f\xdb\xa2\x2d\xdc\xff\x60\xdd\xec\xc7\x25\x0d\x03\xfe\xac\xcf\x0d\xef\xaf\xf1\xcb\x49\xfe\xd9\x43\xbe\x46\x5c\xe9\xb4\xf6\x69\xf2\x87\xf6\x9a\x3e\x0f\x51\xab\xe0\xef\x12\xe7\x19\x2f\x0f\xf6\x69\x78\xc3\xb2\xf6\xfe\xdb\xaf\xcf\x8f\xf7\xe3\x01\xcb\xd1\x75\x78\x4b\x5b\xa8\xe5\x16\x16\xff\xc3\x35\x0d\x57\xbc\xb4\xb5\xa5\x0e\xfe\xcc\x23\xd8\x12\x47\xbd\x09\x97\xf6\x0b\x5f\x7e\x79\x71\x18\xb2\xfd\xcc\xb8\x65\xbf\x9f\xb4\x45\xac\xd0\x69\x89\xb1\xcd\xa3\x5f\x79\x1e\xe7\x9d\xcb\xb0\xc6\xbb\xdf\xcb\x66\xcb\xd7\xe2\x89\x2e\x69\xa5\xfa\x30\x8e\xfc\x93\x5d\x0f\x9a\xbc\x5c\xe3\xb6\x45\xad\x15\x6f\xc7\xd6\x13\xdb\xae\xdd\xb3\xbf\x1c\xf8\xff\x47\xff\xf6\x37\xcc\xc3\x89\x2f\xef\xed\x9a\xfd\xc5\xf3\x92\x26\x2d\x82\x3d\x37\xac\x31\xf8\xcd\xa5\x60\x92\xe3\xd2\xf9\xf0\x3b\xb8\xe1\xca\xbb\x36\x43\x5a\x62\xb3\xc4\x0d\xcb\xda\x9e\xba\xde\x9f\x99\xc3\x72\xc1\x26\xe4\x5b\x9d\xf1\x20\x8c\x61\xc9\x58\xc2\x6d\x49\x77\xbf\xc6\x30\x34\x90\xdc\xe4\xfb\x43\x91\xe8\xf6\x64\x0b\x0b\x69\x5e\x66\xec\xcf\xda\x98\x10\xe3\xfa\xe6\x3e\xc7\x09\xaf\x0c\xf8\xa2\x90\x44\xec\xc1\x9c\x97\xd5\xae\xd5\xdf\x3e\x69\xfb\xc7\x60\xbb\x92\x20\x32\xf6\x16\x17\xec\xda\x14\xd6\x86\x6f\x1f\xc3\xb4\xfb\x15\x1f\xde\xfd\x9b\xc7\x02\x2f\xeb\xf3\x32\xf9\xcf\xd5\xae\x77\xda\xfa\x00\x09\x9b\xb6\x84\xed\x34\xd9\x8c\x03\x3f\x71\x9d\x72\x9e\x71\xde\x72\xe6\xf2\xdf\xfa\xb0\x45\x4a\x42\x6a\x22\x65\x74\x1d\x33\xaf\xa6\xb3\xdf\xdd\xc2\x03\x52\x72\xc9\x5b\x78\x2d\x8d\xbf\x57\x0c\xdd\x10\xb9\xdc\x7e\xf5\x13\x96\x9b\xc2\x3e\x04\xfc\x7c\xde\x9b\x6b\xed\xcf\xdb\x56\x2d\x61\x49\x2e\xf0\x53\xea\xfa\x8d\xa7\xae\xb5\xad\x8f\x12\x9c\xf0\x0f\x0f\x4e\xa7\x18\x79\x75\xf6\x8f\x62\xd6\xf4\x38\x60\xc3\xc0\x5d\xbb\xe3\xcb\x2f\x3c\xda\x46\x40\x04\xe7\x21\x3c\x70\x03\x53\xd3\x1c\xbe\xdf\x5c\x60\x6e\xe9\x19\xa0\x94\x7c\x23\x6a\xbf\x81\xf3\x3e\xa5\x8c\xbb\xf4\x13\x3d\x61\xe3\x5d\x14\x74\xc5\x26\xd7\x2d\x44\x36\x4e\x53\x5a\x71\x0f\xf9\x76\xce\x35\x8e\xee\x64\xdf\x5c\x6c\x1d\xf3\x75\x4e\x94\xeb\x21\x5c\xb8\xb0\x4b\xa8\xed\x5a\x7d\x55\xa4\x30\x6c\x75\x9b\xd8\x62\x7d\x4e\x51\xa7\xe0\x61\xbb\xd3\x4b\x2c\x6b\x9c\xa7\x3a\xaf\x1b\xa4\x09\x32\x81\xfd\x5f\x78\xd6\x7d\x51\x4d\x47\xbe\xb4\xcc\x8a\xed\x98\xec\xb4\x9e\x70\x7f\xfa\x18\xbb\x85\x2d\x6d\xb8\xe0\xb0\x50\x16\x96\xe0\x17\x27\xf9\x9a\xf0\x9b\x96\xd2\xec\xf7\x84\x15\x33\x41\x9f\x20\xe8\xbe\x02\xa1\x6d\xa9\x78\xa2\xee\x6e\xb0\x13\x83\x8b\x1a\x53\x5b\xb6\xab\x1e\x76\x9c\xd0\xe4\xba\xc8\xf7\xe1\x0d\x5f\xd8\xc8\x69\x0a\x38\x3d\x65\x1b\x0e\x87\x97\xda\x35\x45\x60\xff\xfc\xa2\x62\xbb\xe6\x3b\x74\xc2\xfd\x70\x78\xff\xd1\xb1\xe3\x1d\x0f\x75\xc6\x21\x73\x91\xed\xf1\x16\x94\x1c\xd7\x2a\xa6\xad\xe2\x14\xdc\x18\xfc\x0b\xcf\xdb\x7a\xc7\x3e\xe8\xaf\xbe\xf9\xe5\xbb\x1b\x56\x2a\x42\x5b\x98\x89\x1a\x27\x0f\x2d\x64\xb2\xde\x37\xfb\xf3\xe0\xc2\x70\x4d\x17\x5e\x7c\xba\xd9\x27\xf9\xc9\xf5\xa5\x1d\xd6\x97\xf6\xe0\x89\x8f\x0b\xee\xbe\x4b\x0b\x7e\x35\x86\x36\xad\x78\xa6\xc7\xa1\xe6\x91\x0a\xcb\xb6\x44\x1c\xd3\x30\x6f\x81\x36\xca\x56\x12\x32\x6a\x57\x33\x72\x17\xfd\xc3\xb9\x4f\x39\x77\xe5\xba\xfc\xae\x17\xd7\xf7\x1b\xd6\x43\x87\x6e\x48\x76\x0a\x67\x48\xfd\xc9\xf6\x89\xc6\xc3\x0e\x08\xcf\xe6\xb8\x9f\x4e\xf8\x90\x6d\x5f\x36\xaa\x98\x3c\xf7\x50\x0f\xbe\xb4\x76\x5f\x7e\x59\x5b\x7e\xf0\x94\xae\xc9\x4f\x1c\xd7\x43\x12\xd6\x25\xbb\x67\xdc\x6a\x68\x24\xb4\x53\xbc\x3d\xf2\xc2\x9b\xd0\xfa\xd5\x7b\x5d\x07\xec\xe1\xf1\xf8\xfe\x5e\xd1\x0a\xe1\x8f\xc7\x6c\xb6\x90\x37\x6a\x47\x69\x8b\xbe\xa0\xed\x92\x78\x79\xa6\x70\xe7\xb1\xa8\x70\xae\xf1\x5c\xd4\xd7\xe0\xa6\x13\xcb\x73\xb7\x33\xeb\x3b\xf9\xf3\xf5\xfd\xf9\xfe\xe6\x26\xaa\x8e\x81\xc6\xc0\x5e\xb5\x51\xe1\x64\x7c\xda\xe7\xe1\xd3\x85\xeb\x88\x2f\xff\x8b\x3e\x95\x5d\xf4\x8f\x30\x45\x81\x75\xee\xf6\x40\xeb\xb9\x71\xe5\x75\x16\xba\x68\xeb\x9f\xca\xd5\xbf\xb4\x06\xf4\xc6\x4b\x66\x1a\x3b\xd5\x6d\xe0\x72\x2f\x09\x8f\x7e\xf4\x85\x0d\x32\x87\x64\x6f\x71\x92\x37\x33\x91\xa9\xf1\xfb\xcd\xcd\x06\x25\xb2\x2d\x79\xaf\xb9\x0d\x7b\x31\xbd\xeb\xb6\x9b\x5a\xc0\x2e\x8c\x4d\xf0\xbb\x31\x53\xbb\x50\xe9\x98\xe6\xf6\xf3\xe5\x12\x37\xcf\xd4\x9a\x7e\x94\xaa\xe2\x1a\xed\x09\x0b\xd4\xe1\x53\xec\x63\x71\x22\xdb\x3c\xd8\x16\x4f\x54\x2f\x69\xaa\x61\xbe\xba\x5d\x02\xfe\xfb\xf3\x6d\x06\xbe\x82\x05\xe6\xdf\x87\x21\xde\xa9\xbb\x16\xb3\x22\xd0\xcc\x19\xda\xed\x78\x80\xcd\x94\xe9\xb4\x27\x43\x93\x07\xbf\xdf\x7b\xb8\x26\x3a\x01\xfc\xa8\x8a\xfe\x09\x37\xb0\x36\x35\xf0\xf6\xf6\x8d\x15\x18\x6b\xfc\xd9\x35\xe7\x16\x12\xaa\x25\x34\x73\xc3\x93\x11\xe6\x4c\x07\xe1\x94\xa0\xd2\xb7\xa2\x4b\x6c\x83\xaf\xb8\xa6\x6b\x7e\x04\x9e\x00\xd7\x4a\xd0\x6b\xfb\xda\xeb\xca\xea\x48\xb3\x3f\xbf\xac\xe7\x32\x27\xff\x1b\x13\xec\x19\xf6\x6a\x7d\xb4\xd2\x6e\xb1\xa5\x6f\x32\xeb\x8c\xf8\x27\x50\x29\xd3\x06\x9f\x4d\xbc\xe9\x5c\x9d\x86\x07\x45\xd7\xcd\x89\xff\x3c\xbe\xfb\xb7\xab\x17\x7c\xfd\x7d\x12\x6c\x57\x96\x93\x34\xc4\x2e\xc2\x65\xc8\xfb\x0f\xae\x8e\x8e\x51\x05\xbb\xf6\xc4\x47\x2d\x65\x13\xea\xb4\xb4\x49\xfe\x90\x36\xf8\x13\x5f\x10\x83\xd9\x36\xab\xa2\xa2\x93\xb2\xeb\xfd\x62\x27\xa8\x22\x39\x6e\x53\x1a\xc3\x20\x49\xc7\xfb\x74\xd4\xd5\x1f\xf6\x55\x41\x2f\x5d\x03\x9c\xa3\x2e\xb7\x4f\xf3\x16\x03\x54\xc5\x29\xf6\x34\xb1\xb3\xa9\xdf\x0d\xee\xd7\xc2\xbd\x0e\x7b\xb7\xc3\xc3\xb4\xbd\x19\xe9\xcb\x64\x7f\x7f\x33\x92\xb6\xaf\xfb\x88\x15\xba\xe0\x92\x4d\xcd\x35\x19\x17\x75\x09\x5f\x37\x8a\x86\xfc\xc9\x66\x1f\xcd\xd5\xe4\x89\x5c\x4e\x29\x0e\x2d\x74\x89\x5c\xa8\xc6\x34\x81\x7f\xc2\x00\x67\x84\x1e\x39\xfc\x51\x3b\xc4\x5b\x7c\xb9\xd7\x55\xf1\xb7\xb1\xe6\x70\x17\x60\x13\x4c\x59\xc0\x24\xbb\xa6\x35\x23\x57\xc9\x62\x50\x94\x23\x04\xf5\x9d\x8e\xab\x2d\xe9\x15\x66\xca\xcc\xbf\x6b\x80\xd7\x55\xaf\x15\x7d\x1e\x88\xc4\xba\x2f\xf4\x05\xcd\x72\xaf\xd0\xa5\xbf\xf8\xc2\x22\x98\xbe\xc4\x1e\xa4\xa5\xf6\xbf\xf7\x0b\x19\x22\x56\x4d\x5a\xc5\x7f\xd9\x6c\x94\x01\xd3\xf4\x2d\x7c\x61\x9c\xca\x8a\x8e\x96\xbf\xe4\x3e\x9b\x8e\x90\xf4\x9a\x2a\xa0\x81\x5e\x92\xbc\xd4\x36\x36\xe5\x84\xdc\xa8\xde\xd7\x5b\x2c\xda\x5d\xfb\x92\xa7\x81\x26\xc1\x3d\x0e\x69\x32\xbb\x97\x7c\x19\x1e\xfe\x16\x8d\x3b\x7d\x78\xc9\x12\x1a\x29\xd0\x48\x4f\x44\x76\xd6\x9c\x38\xaa\x82\xd8\x9a\x52\xef\xfc\x61\xbb\x44\x3b\x80\x15\xdc\xc7\x3e\x75\x8c\x66\xa2\x6b\x69\x6a\x13\x6e\x37\xf4\x04\xd7\xb3\x2d\x51\x94\x39\xb3\xa6\xc3\xa1\x64\x52\x67\xce\xab\x4b\xc8\x3b\xbe\xfc\x5a\xcc\xb6\xd1\x26\x99\x63\x6b\x82\x5e\x02\x0b\x8b\xb8\xfc\xd6\x66\x73\xf8\xb9\x29\x27\x73\x86\xb3\xb6\xdd\x9f\x99\xd3\x38\x63\x41\xb0\xd7\xfe\xd3\xad\x0f\x03\xb8\x29\x2d\x57\xba\x51\xd7\x60\x7f\x05\x2d\x21\x8d\xec\xfe\x1b\x85\x7e\xde\xc7\xf9\x82\x3f\x37\x47\xf5\xa6\x20\xd0\x75\x09\x8f\xfc\x5a\xe2\x83\xd1\x14\x1d\x44\xd7\x0e\xff\x26\x75\x6a\x3b\x1a\x10\x4a\x36\x71\xd8\xa0\x47\x4d\x7a\x96\x85\x5e\xfc\xba\xe2\x94\xbe\xb4\xfb\x3a\xe9\xfc\xd9\x51\x8f\x6b\xa2\x38\x99\x52\x6f\xb9\xc0\x34\x26\xae\x4f\xcd\xe3\xa2\x8b\x3a\xb8\x5a\x70\x89\x2e\x9a\x0d\x91\xef\x1b\x9c\x4c\x3b\xb4\xd2\xb4\x16\x49\x5d\x63\x07\x11\x5a\x87\x34\x5f\x26\x9c\x21\xad\x6b\x6b\x17\xeb\x2a\xff\xf0\xef\x78\x7b\xc7\xf2\x34\xf6\x37\x08\x5e\xf8\xd4\x07\x54\xf1\x52\x22\x23\xf3\x37\x37\x79\x9e\xfb\x8a\x3b\x52\x00\x61\x1b\x64\x52\x38\xd1\x1d\x37\xc1\xb4\xa8\x17\x22\x64\xef\x9f\x10\x33\x22\x5c\x3b\x40\x69\x64\xca\xe5\xc9\x2d\x1c\x1d\x7f\xfb\x55\x73\xc1\x15\x36\x99\xfb\x66\x1b\xdb\xc6\x53\x45\xeb\xcf\xe5\xec\xc3\x2d\x24\x17\xa3\xd3\x60\xdb\xac\x10\x63\xc5\xaf\x2c\xaa\x1b\xb9\x78\x52\x74\x1e\xc3\x33\xd2\x68\x2d\x7e\x92\xbc\x30\xa8\x3a\xc3\xb9\xb6\x8b\xe0\xef\xdd\xb2\xc1\x01\xb6\x63\xda\x52\xc4\x26\x53\x58\xfd\xc6\x0f\x98\x60\x84\x5d\xc7\xe2\x09\xc5\x9e\xa6\x88\xf8\xff\x08\x76\x0e\xdc\x75\x44\x05\x6e\xdd\xe1\x75\x48\xbc\x57\x93\x3f\xc8\x9d\xf9\x1e\xbd\x5c\x8b\x8f\x0f\x69\x52\xf3\x82\x69\x16\x5a\x58\x38\x7f\x43\xfa\x83\xfe\xdc\x50\xe2\x05\xfb\x13\x5d\x97\x7b\xd8\x13\x16\xd6\x84\xcf\xf4\x81\x3f\xe7\x9f\x57\xff\x39\x14\x7e\xac\xcd\x21\xe0\x33\x83\xef\x2e\x8d\x42\x70\x53\x84\x94\xc8\x9b\x7f\x43\x81\x98\xb7\xc8\x60\x45\x09\x93\x83\x16\x0e\x37\x64\xf1\x92\xf9\x1b\x90\x04\x13\xc3\x31\xa4\x01\x07\xcd\xb4\x03\xf5\xa4\x59\x80\x1d\xd6\xc2\xe4\xeb\x12\x78\x33\x32\xa6\x61\x71\xf7\x14\x31\x64\x58\x1e\xe7\x30\xe9\xfe\x67\x2c\x98\xdd\xd5\x86\x1b\x6d\x63\xc6\xd1\xeb\x28\x36\x16\xc0\x6c\x32\xd5\x7e\x4a\x32\xed\x5b\x93\xf7\x8e\x8b\x76\x7c\xb3\x7f\x65\xd3\xfd\xfa\x2d\x0e\x18\x43\x55\x82\x8b\x0a\x3e\xc6\x13\x97\x59\x7b\xb8\x10\x25\x0d\xc8\xed\xec\xf8\xdf\x76\xc9\x37\x53\xc7\xb3\xf6\x69\x40\x86\xc5\x7c\xf8\x23\x9d\x78\x13\x0a\x6c\xaa\x9d\xc4\x97\x3b\x9a\x8a\x6f\x64\x36\x75\x8d\xfe\xe6\x8b\x44\xd5\xfd\xb9\xe8\xca\xec\x66\x9b\xb7\xa6\x96\x9e\xd7\x73\xbf\x24\x2d\x29\xf5\x77\x5f\x8e\xce\x10\x5a\x4a\x5c\x30\xbf\x26\x48\x75\x60\xfd\x0f\x1f\xdf\xf6\x0f\xca\x6a\xa1\x61\x5d\xa3\x8b\xf3\xc9\xdf\xe9\x6c\x1e\x1c\x4f\xb7\x29\x81\x05\xda\xd3\x4d\xd2\xbe\x52\xb7\xbb\x1f\x40\x4f\x23\x31\x7c\x6a\x77\x73\xf4\x78\x09\x0b\x3d\xaf\x50\x3f\x3c\x6e\xa8\xe0\x79\xb7\xb6\x02\x5c\xec\x25\x31\xe9\xe3\x51\x9b\x42\x49\x1e\xc7\x39\x14\xbf\xa1\x5e\xf6\x6d\xc7\x9f\x8f\xb6\x34\x2e\xde\x66\x00\x5c\x01\x73\x6b\x99\xa2\xf2\x80\x00\xd6\xdd\x0f\xbb\x5f\x1e\xf2\x21\x30\x9d\x26\x1a\x3d\xfe\xf4\x9e\xc6\xfd\x6f\x39\xb1\xfb\x5a\x9e\xd9\xf6\x79\xc4\xa3\xa6\x77\x25\x8c\x87\x2e\x06\x14\x79\xbb\xe0\xc4\xf8\x3f\x9f\x4a\x06\x6e\x36\x03\xcd\x40\xfa\x61\x7a\x8f\x69\x9e\x1a\xb7\x10\xa7\x33\x74\x36\xdc\xfb\x03\x77\x94\x0e\x14\x63\x58\xdc\x4a\x6c\xf6\xa5\xd8\x19\x1e\xe2\xd0\x8e\xb8\x25\x73\x26\x5a\x5b\x3c\x04\x24\x76\x6c\xa1\x3c\xa6\x46\x39\xa2\x85\xf1\x27\xf2\x41\xad\x14\x94\x52\x89\xd4\x55\x08\xe2\xcc\x13\xe0\x85\x9b\xd1\xf5\xac\xc9\xa4\xed\x52\x6e\xcd\xb4\xf2\x82\x57\xaf\xff\xf6\x84\x63\x70\xf6\xb4\x52\xc3\x53\x56\xd7\xb8\x42\x73\xcc\x97\xe1\x8c\xa5\xf4\x88\x7d\x5f\xe8\x78\xdb\x35\xfa\x79\x91\x17\xb1\x78\x02\xc6\x57\xc3\xdc\x05\x7e\xe2\x68\xa6\x7f\xa1\xa2\xab\xf1\x85\xb7\x32\x3f\x8a\x69\x8b\x29\xf0\xba\x4d\xdf\x0d\x0a\xa0\xcd\xeb\x68\xcc\xea\xc2\x82\x9a\xdf\x54\x82\xc8\x4e\x32\x68\xfe\x3d\xa3\x78\x17\x0c\x65\xd8\x3a\x7e\xd6\x33\x8f\x35\xb3\x77\xb7\x34\x8e\xf4\x0d\xda\x1d\x2e\x1c\x83\x87\x03\x05\x2f\x16\x9d\x3e\x04\xb8\xaf\xa6\x16\xe4\x32\xe7\x2c\x9b\x35\x96\x98\x0c\x2a\xe8\x44\xbb\x67\xce\x9c\x1c\x7e\xb3\x29\x97\xc3\x8f\x3b\x82\xc5\x4c\x9a\x7b\xb1\xf3\x77\x1e\x17\x22\xb3\xd2\x33\x69\xe3\x86\x73\xc1\xa2\xf8\x72\x9b\x4f\x0f\x47\x2a\xbc\x92\x5c\xa6\x54\x68\x85\x87\x54\x4b\x9f\x9b\x58\x3c\x33\xd4\x8f\x6f\x62\x85\xf8\x53\x2f\x84\x9f\xcf\x83\x67\xf6\x69\xe3\x01\x77\x11\xa4\x2d\xb2\x18\x00\xd6\x2c\x0c\xca\x18\xc1\xf7\x82\x3a\x08\x54\x14\xc7\x0f\xff\x86\x2c\x8c\x35\x82\xaf\xb6\xa4\x62\x9b\xc1\xf5\x03\x03\x2b\x64\x91\x98\x1a\xc9\x8c\xb5\x43\xd3\x30\x7d\x3d\xe7\xb9\x61\xbe\xc4\x5c\x46\x7a\x49\xb5\xb9\xf9\x34\x3c\x3b\xb4\xa0\x45\x43\x0c\x88\x2c\xcc\x34\xc7\x9d\x77\xc7\xa8\xdd\xaf\x01\xee\x18\x3e\xd2\x83\xf6\x4d\x07\xcd\x1e\x0f\x34\x4a\xeb\xa3\xe9\x21\x1d\x66\x09\xe8\x73\xcc\x66\xe1\x53\x80\xaf\x92\xa7\x09\x91\xa2\x59\x11\xe8\x29\xf3\x32\xa9\xb0\xcc\x15\xd7\xa6\xdb\x41\xd5\xd6\x32\xff\x34\x32\xcd\x67\x52\x95\x19\xf5\x66\x65\x69\xda\x78\x4d\x03\xd5\xa6\x3c\x2d\x58\xe3\x0a\x9e\x43\x9b\x98\x4e\x59\xfb\xd0\x75\xd0\x29\x4b\xe6\x83\x7f\x0c\xa8\x2e\x66\xfa\xd7\x00\xcd\x7a\xc9\xa6\x11\x18\x66\xcc\x90\xf1\xe2\x48\xda\x8d\x68\xbf\x7a\x13\x29\x25\x12\x1f\xf4\x76\x4c\x85\xd7\xd2\x23\x13\x23\x0d\x77\x5d\xab\x57\x7a\xce\x6f\xe0\x1f\xbe\x2a\xf8\xe5\xe6\xfe\x31\x57\x62\x9a\x82\x02\x1b\xae\xb6\xd1\x0c\x23\x3a\xe5\x07\x4c\x36\xb1\x1a\x52\x1b\x38\x94\x8c\xa4\x3c\x37\x7a\x0a\x0d\x3d\x7b\x33\xe3\x35\xbc\x68\xd3\x16\x8c\x8e\xb7\x65\xa7\x09\x71\xcf\x7c\x56\xd0\x14\x97\x2b\xfd\x7b\x53\x10\xf2\xc5\x15\x8c\x30\x5f\x66\x22\x04\x63\x63\xe1\xee\x83\x4b\x75\xa5\x26\x31\xaf\x54\x69\x7c\xcf\xd7\x71\x25\x12\xdf\x7f\x09\x33\x73\x03\x07\xc6\x42\x08\xa3\x97\xc0\xd7\x97\x6c\xf0\x69\x09\x4c\x33\xf9\xd9\x57\x72\xc9\x34\x36\xb6\xd4\x4e\x82\x3f\xf3\xfd\xf3\xcb\x32\x8a\x7b\x33\x16\x5d\xd3\x3d\x31\x25\xc2\x54\xab\x29\x3d\x08\x5e\x1f\xfa\xa0\x3c\xaf\xc5\xbb\x90\x60\x73\xfd\x5b\x26\xa9\xcd\x5e\x5d\xa9\xe8\x56\x4f\x6c\x21\xdb\xed\x1e\xff\x35\xc8\x1e\x61\x5b\x8e\x9f\xfe\x5d\x54\x0d\x34\x13\x8b\x15\xab\xbd\x44\x7e\xd4\x1c\x1f\xd8\xc1\xb0\x6d\x38\x2e\x9b\xb9\xc4\xab\x8e\x12\x23\x9c\xb0\x2f\x34\x5b\xe6\xb5\x64\x85\x40\xcc\x3e\x28\x9d\xe7\x0f\xcf\x61\xa6\x44\x98\xb0\xe2\xb3\xe1\xfa\x70\x23\x71\x98\xe1\x05\x79\xb2\x46\x99\xca\x92\xf0\x77\x85\x0d\x53\x6b\xeb\xd5\x47\xe6\xea\x16\xf7\x37\x83\xb6\xb4\x63\xe9\xc7\x83\x04\x95\x56\x46\x8f\xf9\x98\xca\x33\xdb\x8a\xa8\xfa\xbc\x73\x35\x3c\x4e\x0a\x71\xf0\x0f\x9b\x8a\x7a\x38\x7c\xfe\x7e\x7f\xba\x7b\x0e\x57\xe1\x00\x91\x31\xe5\x20\x4b\x74\xbb\x70\x01\xcc\xae\x04\x9a\xfc\xdc\x96\xec\xbd\x9d\x11\xaf\x3c\xe1\x23\x1b\x95\x68\xe6\xc7\x12\x46\x64\x81\x2c\x0e\x88\xc8\xc5\x5d\x42\xf1\xe2\x4d\x0f\x63\x31\x93\xfc\x88\xc6\xd3\x75\xfe\x4c\x9a\x4e\x25\x1e\x9b\xe3\xbc\x22\x73\xc5\xd2\x17\x75\x3b\x6e\xb1\x77\xfb\x44\xff\xc8\x0c\x56\xc4\x92\xf9\xea\x60\xa7\xf2\x6e\x6a\x1f\xe5\x0d\x73\xbb\x26\x9a\xbf\x61\xb0\xb0\x0a\x96\xa9\xfc\x15\x42\x29\xed\x33\x6f\xc1\x14\x45\x2a\x1e\xc1\xd4\xd1\x45\x6d\x42\x5c\x59\x6f\x30\x85\x23\x67\xce\x1c\x7b\xb9\x5d\x75\xbe\x0d\x14\xa9\xdb\x5e\xea\x6e\xfb\xb4\xb2\x92\x32\x04\x3b\x39\xc8\x70\x97\xd2\xd8\xd3\x4b\x54\xdc\xcb\x19\x5f\x15\x8a\x71\x70\x7f\x65\xcb\xfc\xbd\x99\xbb\xb1\xd3\x60\x7a\x30\x50\x17\x31\xe6\x33\xd9\xcc\x4c\x88\x87\x95\x46\x59\x15\x32\xd4\x85\xf0\x55\x31\xa9\xdf\x31\xe1\xe9\xe9\xf2\x41\xe9\xa4\xc0\xea\xca\xe6\xd1\x78\xd1\x70\x66\x2f\x91\x68\xc9\x75\x38\xc5\x0d\x22\x6c\x2f\x59\xe9\x4d\x31\x3d\xb4\x9a\x12\x56\x92\x15\x5f\xbe\xbe\xe6\x8c\xed\x33\x85\xba\xcd\xf8\x24\x88\xf0\x5a\x54\x0c\x2b\x28\xe6\x41\x21\x67\xbf\x9a\x2a\x80\x4f\x11\xcc\xfc\x79\xa2\xd9\xae\x80\xb1\xe5\x35\x45\x6c\x93\x39\x8a\x6d\x86\x8b\xd5\x4a\xfd\xb6\x69\xa8\xa9\x95\x66\x0f\x21\x71\xa8\xce\x52\xae\x26\xca\xca\x17\x9e\x86\x62\x29\x4f\x25\x69\xda\x46\x93\xd8\xc4\xa3\x64\xd2\x3a\x49\x9b\xee\x4c\x1d\xa2\x98\x53\xc9\x2b\x43\x8a\x2e\x6e\x7c\xab\xfb\x29\x0d\x2a\x10\x95\xf2\xdc\x9c\x9e\x4f\xc6\x17\x35\xb5\x54\x0c\xc3\x46\xb7\x72\xda\x37\xbf\x83\x6e\x37\x07\x05\x7e\xa0\xb9\x3f\xd8\x2a\x53\xd5\x5d\x4f\xcb\x69\x02\x63\x92\x83\xcc\xdd\x38\xd5\xd7\xe6\xee\x39\xb6\x5b\x92\x17\xa7\x42\xad\x6f\x9c\x69\x27\x5b\x21\xbf\x6b\xcf\x00\x2a\x0b\x18\xcc\xb9\x67\x45\xc7\x23\x29\x8a\xc1\xe1\x76\x8c\xef\x8b\x2b\xf2\xde\x42\x5e\xfa\xcc\x97\xa9\xa8\xdc\xd8\x4e\x11\x1a\xcb\x9d\x43\x39\x88\x5d\x7a\x8e\xd8\x02\x3b\x2c\x08\x3a\x58\x6b\x46\xfa\xc3\xed\xa2\x12\xc5\x4b\xb2\x28\x16\xa5\x25\xb3\x99\x9e\xc6\xab\xa0\xa7\x37\xa6\xec\xcc\x97\xbb\x21\x24\x42\x81\x80\x25\x48\x66\x81\x43\x25\xa5\x0d\x8f\x79\x9c\x03\x33\x72\xb6\xea\x38\x46\x76\xfd\x1d\x3c\x1c\x64\x85\x0f\x7e\x41\xa8\x08\xcd\xa8\x7e\x99\x60\x2d\x88\x5c\xd7\x51\x29\x13\xb3\x6b\x4f\x85\x9e\xbb\xdd\x96\x1c\x10\xf9\x8c\x6e\xb5\x75\x57\x76\xbd\xd2\x57\x90\xb6\x0a\x41\xf0\xbe\xb1\xca\x6a\x9a\x97\x7e\xc1\xab\xfa\xfb\x06\x99\x69\x3d\x5f\xd8\xf0\xec\x50\x9e\x4d\xea\xa9\x74\x91\x63\xa6\x2a\xa0\x8f\xe3\x55\x02\x46\x4c\x2b\x8d\xb7\x97\x2e\x2a\x2a\x65\x56\x39\x3d\xa9\xa0\x98\xd1\xd6\x89\x65\x1d\x86\x0c\x2a\x37\x3e\x4b\xf5\x28\x2a\x0b\x66\x97\x6a\xa1\x15\x04\xd3\xd3\x14\x2c\xab\xbd\x4a\xf3\xc7\x57\x31\xd7\xdf\xb5\xc4\x1b\x4b\x6c\x52\xa6\xec\xef\xb2\x42\xc1\x3d\x5a\xa8\x52\x2f\xea\xe0\xdd\x16\xfa\x91\x73\x1e\x14\x78\x6d\x49\x81\xb9\x49\x0e\xf5\x85\xbf\xa1\x2a\xc4\xe5\xc4\xac\x97\x47\x49\xc2\x41\x26\x56\x9e\x3e\x5a\x58\x1d\x61\x8b\xb9\xec\x4f\xe8\x08\xe5\x92\x87\x6b\x18\xe9\x5a\xf0\x1d\x37\x94\x47\x90\x7b\xc4\x3a\x86\x85\xce\xf9\x2d\x6e\x05\xcb\xc0\x45\x91\x80\x52\x50\x4e\xd9\xd4\x0d\x77\xcf\x5c\x09\x7f\xb3\x31\x2f\x73\x1f\x71\xa3\x1e\x06\xd0\x69\xf9\xf0\x6f\xad\xef\xb6\xa3\xc6\x31\xdb\x63\xa4\x3b\x3d\x14\xc6\x8e\xf9\xb9\xff\xff\xdb\xd9\xa6\x3a\x76\x25\xc2\x77\xde\xcd\x76\x42\xc8\xd7\xd4\xb1\x5a\xb5\x6d\xb8\xb4\xe3\x9b\x7f\x57\x25\x54\xf7\x37\xb3\xc3\xf2\x03\xb1\xb5\x13\x09\x49\xbb\x06\x6a\xe0\x2e\x5b\x88\x99\xe8\x5f\x4d\xac\xeb\x87\xba\xf3\x0a\x85\xef\x08\xbe\x20\x4f\x0a\xd5\x78\x3e\x29\xd0\x8c\x50\xe3\x7d\x56\x60\x74\x4d\x4b\x07\xbd\xff\x2c\xeb\x7f\x33\x0d\x74\x61\x12\xd8\xf5\x1f\x7d\x3c\xf3\x7c\xd7\xfd\x95\xf0\xba\x30\xc3\x63\x0e\x4c\x94\x41\x34\xcd\xbc\x2f\xc8\x68\xfe\xfe\xbe\xf2\xba\x48\x93\x33\xa9\x6f\x7b\x12\x37\x25\x9b\xa3\xfd\xab\x0a\xfc\xc3\xdf\xa7\x44\x23\xe6\xaf\x7a\xc9\xe3\xe5\x6e\x6c\xf0\x1f\xec\xaf\x3c\x13\x9c\xb0\x07\xd8\x6b\x3f\x40\x72\x83\x7f\x95\x37\xc5\xd5\xdc\xf7\x80\x4d\xf3\xe0\xda\x5f\xf9\xfd\x57\x7a\xac\x5d\xf9\xc3\x47\xe8\xed\xd8\x16\x07\xdd\x13\x16\x84\x6a\x98\xe3\x30\x97\xb4\x50\xc9\x2d\xed\x1d\x37\xdc\x62\xe7\xc4\xd4\xb5\xf9\xc1\xb6\xf0\x8d\xca\xfd\xb8\xf1\x9b\x99\xb9\x52\xbf\x51\xf6\xb6\xed\x5e\xd1\x0f\x51\x33\xfb\x22\xb8\xc9\x14\x58\x28\x37\x9b\xea\xaf\x90\x57\xe4\x15\xc9\x44\x1c\xcb\xaa\x24\xcb\x9c\x3a\x3a\x6e\x10\xac\xf2\xae\x4c\x25\x79\xd6\x84\xbe\x80\x45\x7b\x8f\xbf\x7b\x63\x10\x36\xf2\x75\x0a\xc0\x7b\xee\x82\x83\x75\xa8\x45\xa8\x9b\xed\x06\x59\x11\xf2\xa3\x2a\x93\x65\x3e\x3c\x4b\xb1\xf6\xba\xa2\x65\xcc\x1f\x2b\x29\x0c\x48\x65\x52\x59\x7a\xa1\x43\xe5\x36\x5e\x77\xe6\x96\x94\x05\x7c\xf3\xf7\x99\x21\xb1\x38\x30\x00\x60\x12\xbd\x7e\xe3\x9f\x8f\x7a\x71\x85\x54\xb2\xce\xa5\x69\x75\x66\x24\xaf\x09\xb9\x36\x05\x1f\x48\x01\xfd\x22\xaf\xe8\x25\x46\x95\x19\x1b\x8f\x38\x58\x09\xeb\xcc\xf9\xa7\xfc\x17\xa9\xcd\xa9\x51\x21\x68\x72\x91\x85\x8e\xb4\x3b\xba\x06\x54\x4e\x6f\x7d\x5a\x15\x2d\x2a\x6d\xef\x1a\x8e\xd9\x5a\x06\x5a\x12\x75\x77\xb4\x87\xcc\x4c\xd2\x62\xf1\x0a\x21\x1d\x76\x8e\x19\xfd\x08\x7d\x43\x53\x33\xd2\x11\xeb\x7d\x31\x07\xfa\x3c\x29\x9e\x90\xe6\x36\x95\x72\x62\x5a\x03\x2e\x69\xc5\xf8\x0d\xe7\x64\x18\xcb\x81\x72\x60\x4b\xd4\xb2\x54\x88\x5f\xc6\x52\x1e\x82\x2e\x4d\x0c\x88\x96\x56\xa9\x92\x25\x8f\x23\xb4\x92\xd2\x95\x76\x84\xdb\xc0\x68\x66\xf4\xe0\xf9\x2a\x77\x9a\x7e\xfe\x38\xe2\x8c\x7a\x0e\x44\x5b\xc4\x3a\x69\x58\xcc\x6e\xe3\x12\x16\x93\x1f\xd6\x15\xb9\x26\x66\x08\xa6\x8b\x72\xaf\xb4\x20\x9e\xdb\xb6\xeb\x1f\x2a\x66\x65\x58\x3b\x2e\xa6\x21\x2d\x14\x9c\x03\x0f\xfb\x39\x7a\xfc\x0e\xd7\xdc\x7c\xf4\x52\x45\x01\xb0\xa7\xd4\x47\xfc\xa2\xd7\x5b\xf1\x62\xec\x7e\x19\x3b\xb8\xc5\x66\xe6\x2b\x6d\x1e\xb1\x54\x2f\xbf\xfa\x88\x1b\xf8\x0f\x6a\x0c\xb1\xdc\x90\xec\xa6\xb1\x38\x84\x22\xd1\xd7\x2e\xe5\x66\xc8\xd4\xe5\x51\xc4\x9d\x81\x9c\xe9\x29\xb3\xf8\x2d\xad\xa2\x39\x1c\x37\x84\x49\x87\x4f\xff\xae\x18\xa2\x08\x54\x63\x07\x82\x22\x26\xf7\xb9\xcb\x6d\x4b\x4d\x69\x7f\xa0\xda\xe8\x5a\x3c\x55\x64\x18\x54\xd7\xf0\x3f\x3e\x15\x88\xcd\x64\xf7\x4f\x4b\x8a\x5c\x7d\x55\x92\xfd\x70\x5c\x93\x85\x0a\xf1\x59\xde\x67\x8e\x54\x72\xb9\x94\xe4\x51\xfe\xf4\x3b\xb7\xbb\x9c\x54\x34\xc8\x9e\xe6\xc6\xb9\x76\x93\x48\xf7\x63\xc9\x67\x9d\x42\x57\x95\x48\x25\x23\x11\x2b\x13\xe1\xf8\x88\x34\x12\xb0\xa1\xc4\x58\xb3\xa4\xb1\x9c\xfb\x4c\xab\x7d\x32\x8d\x14\x8a\x07\x21\x2c\x9b\x17\x0e\xe5\x70\x8e\x28\xeb\x9e\xca\x96\xdd\x4a\x70\x87\xc2\x28\x73\xe2\x2c\xae\x75\x4b\x8c\x52\x2e\xbf\xff\x29\x65\x41\x7b\xcc\x54\x6e\xc9\x74\x99\x5f\xa4\x69\xc1\x97\x6f\x6c\x42\x0e\xa1\x6a\xe9\x2d\xd9\x3d\x8d\x35\x1d\x83\xd0\xee\x03\x7d\x12\x4f\x86\x61\xfd\xf7\x81\x49\x6d\xcf\x2e\xf7\x50\x4a\xf8\xf4\x0c\xe1\x8b\xb8\x7f\xcf\x36\xb0\xe6\x66\x0e\x1b\xc3\xcc\x56\xa5\x0e\xcf\x84\xc1\x83\xbf\x28\x2d\xfc\x6e\x66\xfc\x13\x39\x80\x81\xf0\x22\xa0\x3d\x4a\xc5\x44\x69\x72\x13\xdf\x4e\x01\x21\x4a\x6a\xfe\xde\xf8\xe2\x51\xa3\x9b\x6a\x0e\x3d\x65\xa5\xcf\x88\x6d\xbb\xec\xdf\xd8\x41\xaf\xb4\x22\x01\xe0\x29\x56\x7a\x4c\x44\x9b\x9c\x06\x1e\x4e\x25\x7d\x6d\x2b\xf7\xb0\x28\x8d\x01\x95\xb5\xc5\xa6\xc7\xbd\x0d\xc5\x8c\x0f\x61\xa0\x1f\xeb\xd9\x8c\xde\xed\xa1\x1d\x03\xe2\x92\x96\x74\x4f\xcc\x29\x0d\x70\xc1\xcc\x83\x64\x50\x59\x67\x79\x5c\x17\x99\xce\xdf\x2f\xa4\x0c\xe7\x9d\x8b\x30\xa4\x7f\x3b\x02\xe1\xba\x54\x03\x2d\x40\xa3\xaf\x69\x2a\xfa\x46\xdc\xc9\x05\x5f\x78\xf5\xb7\xa2\x3d\xe6\x90\x6b\x93\x5f\x85\xac\x1e\xc4\x2d\x14\x5a\x13\x56\xe4\xec\xa6\xc0\x2a\x61\x67\x4e\xc2\x5e\x80\x0e\x54\xf7\xb8\x96\x4b\x28\xb9\x7d\xcf\x40\x31\x31\x3f\x75\x97\x7c\xa9\x5e\x48\xce\x23\xc4\xd7\xcc\x2f\x81\x1d\xe1\xb1\xd1\xa5\xb4\x50\xdc\x14\x24\xd7\xeb\xf2\xb8\x85\xe1\xa2\xfc\xac\x4e\xad\xb9\x22\xe6\x4b\xe3\xd3\xaf\xc1\x36\x60\x88\x2c\x3c\x04\xa5\x50\x4d\x5b\x24\x66\x4c\x96\xe7\x2b\xe5\xd1\x4a\x2d\xc5\x62\xd1\x3b\xba\x96\xa6\x10\xb6\x86\xe1\x99\xc9\x64\x1a\x75\xd1\x3d\xdc\x1d\x4f\xdd\x6c\xca\x17\xa0\x1c\xb9\x6c\x4c\x7a\x36\xfc\xbd\xfd\xa0\xbf\x77\x85\x77\x3a\x3f\xa4\x7c\x4d\x43\x9c\xfd\x4e\x1e\xa6\x60\x6f\x9e\x63\x43\x31\xfe\x84\x58\xe8\x85\x0d\xdd\xe8\xe4\x9f\xf9\xd6\xa6\x61\xf7\xb5\x14\xe0\xcd\xeb\x83\xb7\xb1\xbc\xd0\xa5\xe6\x3d\x21\x00\xc8\xc2\xb8\xd9\x8d\xe0\x83\x2c\x22\x1b\xf1\xc4\xf8\xd0\x01\xaf\x93\x85\x5d\x78\xea\x11\x7a\x68\x42\xbb\x99\x95\x90\xa4\x78\xff\x20\xf8\x6c\x54\x50\x3b\xc7\x52\x6d\x9c\x53\x83\x1f\x7d\x62\xc8\xb6\x71\x79\xec\xc6\xa9\x03\x94\x52\xc4\x4e\x87\x86\x4e\x80\xa7\xd2\x2e\xc8\x81\xe0\x0b\x97\x89\xd8\xcd\x64\x00\x2e\x9d\xd9\xd0\x25\x0c\x8a\xeb\x88\x7b\x63\xcd\x87\xfe\x7e\x28\xa0\x0f\xfb\x71\x4f\x58\xca\x3b\x9f\xdc\xc2\x53\x49\xbe\x52\xf0\x31\x0f\xbc\x4f\x35\x23\x10\xf3\xb3\x58\x08\xa3\xa4\xf1\x7c\x9e\x03\xe0\x24\x2e\xbe\xbb\xdf\xc0\x63\xe7\x1b\xe4\x91\xe0\x0c\xdf\x2b\x5c\x74\xb6\x63\x89\xc2\x96\x79\x00\x8b\x47\x50\xd0\x63\x2c\xcc\xc2\x7d\x47\xa9\x57\x65\x0d\x0b\x16\x97\x70\xa2\x3b\x43\x13\xb3\x16\x41\x5b\x79\xaf\xd2\x2f\xe7\xa4\xaa\x84\x97\x11\x33\x5e\xb1\x70\x09\x4f\xd2\x1f\x71\x53\x68\xfd\xcf\x3c\x59\x3a\xd6\x76\xe4\xe0\xbf\xf2\x2f\x6e\xf8\xf2\x4b\xcf\xfe\x6d\x0f\x9e\xbd\x3e\x8a\x7f\xe0\x55\x19\xfa\xfc\xe1\x79\x5f\xfd\x2f\xff\xf1\x53\x1b\x7e\x52\xd3\xf3\x9e\x5b\xfe\xf9\xa4\x03\x91\x63\xd2\x42\xc5\xf9\xa5\x63\x23\xec\x8c\x69\x0c\x56\xf5\x2d\x34\xda\x25\x56\xd8\xf6\x7e\xef\x1c\xe2\x82\xd3\xcf\xe5\x4d\xfc\x8c\x91\xfb\x34\x16\xef\x76\x62\xf2\x9c\x05\x68\x3f\x22\x87\xfa\xd8\x00\xe0\x43\x89\x7d\x96\xe5\xba\xcb\xd4\xbb\xfb\xd9\x64\x56\x57\x1f\x82\x70\xa6\xa0\xcf\xd0\xbb\xc6\xd1\xe4\x10\xa2\x16\xf5\x31\x5d\x6a\x98\x9f\xec\x92\xeb\xce\x72\xb3\x5c\x1c\xf3\x87\x74\x68\x61\x11\xb3\xb0\x82\x9b\x02\xfc\x0b\x57\xc5\x7e\x24\xde\x00\x71\x15\x42\x9e\x8f\xf2\x78\x3a\xfe\xda\x71\xb2\x70\x5f\xbb\xa8\x32\x0f\xfe\x6e\x2e\xf7\x9b\xe8\x47\xff\xe3\xd3\x66\x56\xaf\xf8\xeb\x89\xab\x33\x69\xe5\x4b\x91\xc7\xcd\x41\x56\x2e\x90\x21\xbd\xad\x02\x51\xb5\x81\x1b\xcc\xd7\x3d\xf9\xba\x27\x45\xea\xc1\xa5\x7a\xf2\x77\x77\x7e\xd4\x93\x57\xf0\xf6\xff\xb2\x6f\x3a\x5b\x7c\xde\xb6\x2c\x51\x1a\xf9\xc3\x53\x79\x7c\x50\xa4\x14\x61\x3a\x3f\x60\xe6\x55\xcc\xfc\xf4\x41\x7b\x19\xcb\xce\x8e\xfe\x16\x8b\xe4\x55\xcb\xdb\xf0\xc7\x22\xd1\xd2\x2b\xf9\x7f\xff\x52\x91\x3b\x6a\xc3\x1d\xfe\xcc\xae\x08\xab\x14\xf1\x99\x39\xe5\x0f\x6d\x85\x67\xfb\x68\xf6\xd7\x66\x60\xec\x4e\x0b\xa6\xda\x7c\x45\x57\x6f\xcc\xd8\xc8\x27\xdf\xff\xc9\x5b\xb9\x4b\x4a\x9e\x7d\x7c\xfd\xe4\x0f\xfe\x51\x28\x27\x07\x27\x69\x64\x32\xf4\x49\x85\xfd\xe4\x25\x3e\xa5\x1b\x98\xd0\xc6\x2a\x65\x8a\x3f\x7e\xbd\xe9\x26\xf9\xfe\x97\xfd\x25\x9d\xf0\x2b\xdf\x3f\xbf\x11\xff\x22\x15\xc1\x33\x98\xf1\x83\xdb\xf5\x4f\x97\xe7\xf2\x99\xb0\x00\x5a\x07\xfc\xd5\xa4\xdf\xea\x97\xc7\xe3\x0b\x5e\xf9\xd4\xda\x3c\xf5\xab\xb5\x2f\xfb\xab\xff\x77\x40\x03\x71\x65\xe7\x82\xfe\xf8\xfa\x7a\xb5\x07\x20\x25\x9b\xa1\x84\x91\x62\x85\x2e\x54\xa4\x77\x33\x8d\x6b\xbf\xf4\xcf\x3f\xbe\xbd\x01\x87\x08\x6c\x29\x40\x19\xe6\x13\x4b\xd5\x3a\xc2\x11\xfe\x9f\xbd\x9c\x39\xd4\xe3\xc7\xd7\xcf\x81\x69\x0b\x33\xaa\xc8\x0a\x98\x39\x26\x02\x0d\xe9\x06\xd5\x50\xcd\x39\x24\x74\x83\x70\x1d\xa1\x22\x16\xc4\xa5\xaa\xdc\x9b\xaa\x43\x45\x65\x5f\x4e\x0a\xd2\x6c\xbd\xfe\x83\x39\x44\x68\xb1\xb6\xf6\xcf\x1f\xec\x35\x31\x63\x8e\x6c\x36\xad\x8f\x9e\x14\x77\x3d\x92\xc2\xe4\x89\xbb\x2a\x00\x3a\xd2\x99\x6a\x60\x70\xb1\x11\x5c\x35\x8e\x01\xb2\x75\xf0\xbb\x45\xc2\xd9\x9b\x30\x70\x8b\xdd\x92\x33\x60\x6d\xdd\x90\xf9\xf6\x87\x1f\xff\xe6\x85\xfe\x56\x52\xf7\x2c\xd5\x98\x09\x52\x75\xf6\xa1\x8e\x0b\x7b\x91\xb4\x46\x1b\x6e\x34\x3e\xf6\x57\x6c\x82\xb0\xd7\xbf\xe1\xc7\xd7\x47\xc5\xa2\x68\x85\x2c\x19\x5d\xfd\x86\xfe\x42\x6c\x23\x8b\x21\x8c\x5b\xed\x35\xd8\x95\x6f\xff\xc6\x03\x64\xe7\xdd\x6f\x71\xcf\xf7\x6c\xe1\x06\x9b\x01\xdc\x11\x87\xeb\x1d\x66\x41\xc6\xe6\x02\x6f\xbe\x06\xb9\x38\xd1\xdc\x64\x58\x15\x3b\x64\x7d\xa4\xd7\xe7\xf0\x77\x24\xba\x95\xb6\xed\x53\x4b\x3d\x86\x16\x8a\x1d\x97\xf0\xf3\x06\x99\x6f\x9f\xf0\xb6\x0f\x1f\xdf\xc7\x4f\x5f\x8f\x53\x59\xc6\x7a\xef\x4a\xab\xcd\x49\x69\xfb\x31\x0f\x54\xb5\xca\x6e\xdd\x5e\xc5\x6d\xaf\x79\x6d\xbc\xf4\xc4\x92\xeb\xc1\xfe\xe4\xdd\xff\x88\x60\x7a\x56\x79\x62\x8d\xb3\x6e\xab\x31\x6f\xfd\x92\x99\x17\x35\xb9\x50\x45\x70\xf4\x70\x8e\x81\xee\xc2\x92\xfc\x98\x5b\x06\x29\x76\xbd\x1f\x92\x50\x9e\xdf\x9b\xa2\x0d\x40\x0d\x16\xdc\xad\x29\xbd\x2d\x01\x42\xe2\x18\x4f\xac\x84\x42\xea\x39\xdf\xb8\x5a\xdb\xad\x84\xd0\x5e\xfe\x8d\x0d\x74\xb9\x5d\xcc\x4e\x9c\x22\x32\x91\x15\x4a\xc2\x02\x2a\x2a\x83\xce\xe8\x3d\x2b\x81\xdb\x67\xe6\xac\x57\x7b\xa5\xc3\x93\x2a\xe2\x9f\xa0\x34\xc6\x5a\x48\x5b\x25\x75\xd7\x50\xf3\x3d\xaf\xf9\x41\x48\x91\x4a\x80\xef\x5f\xfe\x5d\x11\xff\xee\x97\xdf\xa1\x3d\x0a\xfb\x9e\x08\x96\x54\xc5\x76\xda\x5b\xba\xa1\x0a\xa7\xd6\xc1\xd6\x8f\xad\x13\x76\xf3\x88\x22\x4e\x9e\xbf\x66\xee\xa4\x76\xa8\xbd\x5f\x79\xb8\x78\xe2\x33\x41\x56\x1c\x34\x93\xe9\xe1\x0c\x6a\x68\xf9\xfd\xf6\x05\x35\xb1\x7f\xd8\x4e\xe3\x32\x26\x39\xe4\x4d\xe3\x95\x2c\x5c\x3b\x73\x43\xde\x7f\x85\x3b\x97\xba\x86\x48\xe6\x61\x1f\x6b\x24\xf5\x2e\x16\xf9\x8c\xdc\x2d\x8f\x18\x06\xa2\xe0\x07\x33\x37\x70\x6b\xed\x68\xb8\x7c\x16\xfc\xef\x25\x28\x87\x31\xee\xaa\x1d\x6e\x7d\x44\x32\xe0\xea\xf9\xe3\x02\xa0\x45\x49\xa3\x0d\x45\x06\xb3\xd0\xbf\x4c\x29\x78\x32\xf8\x05\xfc\x67\xa5\x41\xd0\x1d\xe6\x80\xcd\x25\xe6\x41\x48\x26\xba\xfe\x8e\x3f\xe7\x8f\x47\x7c\xdf\x9f\xb8\x4f\xf3\x74\x18\x76\x03\x93\xe3\xaf\x28\x90\x70\xc4\xb4\x5e\x16\x56\x52\xd1\x6e\x72\x43\xf7\xdc\x1f\x98\xfd\xee\x18\x76\x74\xa5\x05\xd3\x45\xc2\x06\x32\xe5\xde\xe1\x0b\xeb\x76\x62\x4e\xc1\x13\x7c\xc8\x59\xf8\xe9\xc5\x5a\x99\xdf\xbd\xed\x4a\x0b\x3a\x48\x12\xf6\xc7\xbd\x02\xa4\xa5\x1d\x17\xb5\xaa\x0e\xc1\xfc\x82\xd9\xb1\x85\x30\xa4\xfb\x46\x05\x6b\xa2\x4d\xd4\x64\x9f\x37\x96\x6e\xdf\x3f\xfc\xbb\x7a\xb5\x81\x54\x7f\x58\x40\xc8\x95\x62\x5e\xaf\xf5\x0e\x44\x5e\xac\xdb\xab\x91\xee\xe3\xd3\xbf\x2b\xba\x53\xaa\x00\xe7\xac\x8c\xc7\x9a\x9b\xe2\xbe\x17\x00\x04\x6b\x35\x5e\x9b\xc2\xb1\x7c\x7f\x35\x46\xb9\x21\xe0\x3e\x9e\xd2\xb0\xf5\x7e\x61\xb9\x7f\x44\x34\xaa\x84\x93\x60\xc7\xc9\x73\x50\xc4\xec\xb3\x44\xca\xfa\xc7\x2a\xf8\xf8\xa2\x32\xcc\x9c\xb7\x80\xb8\xb3\xc7\x17\x64\x6c\xea\x98\x1c\xbf\xc5\xc8\xb2\x07\xf0\x27\x08\x2a\xbd\x80\x0b\x05\x53\x74\xca\x50\x20\x12\xf3\x4e\x30\xbb\x39\x66\xac\x02\x79\x96\x06\x9e\x08\x52\x48\x28\xb4\x79\xd2\x90\xb5\x95\xe9\x31\xf2\xb7\xed\x2b\x2f\xe0\x69\x6f\x81\x62\x72\xb8\x48\x2c\x32\xbe\x28\x37\xb4\x60\x66\xfd\x59\x34\x6f\x8a\x1d\x54\x3e\x95\xd8\xba\xb5\x51\x57\x44\x5b\x34\x66\xe3\x1d\x3f\x8b\x44\xb9\x94\x85\x16\xc2\x0a\xd7\xd2\x51\x73\xce\xe7\xac\x6b\x55\xda\x70\xf4\x90\x14\xb1\x96\xfd\xbf\x1a\x1d\x4f\xf8\xa2\xae\xb2\x05\xc8\x04\x9c\x9b\xeb\x8a\x15\xff\xcb\xdf\xbc\xba\x30\xf0\x55\xa9\x6e\x87\x9c\x94\x89\x83\xda\x2c\xc6\x87\x3e\xc9\x65\x52\xe5\x18\x53\x15\xc0\x2c\x98\xa9\x55\x23\x80\xa7\x3a\x14\x38\xd8\x19\x40\x1c\xeb\xf0\x3d\x22\xb0\x54\xb3\xf9\xd3\x20\xf4\x58\x5a\x47\x94\xc0\x27\x76\x3c\xec\x5d\x7b\xfa\xf7\x11\xe8\x19\x95\x73\x74\xfc\xf6\xef\x0a\x21\x2c\xa0\x8b\xc4\x7b\x75\x9e\x09\x1a\x1e\x52\x44\xc4\x1c\xc5\x93\x94\xa5\x57\xc9\x99\x1d\xf9\xc3\x37\x8e\x79\x4a\xbc\x2f\xd3\xfb\x14\x9f\x75\x08\x14\x09\xbb\x74\x82\x48\xb7\x95\x4d\x5f\x8e\x2a\x45\xad\x1e\x05\x7d\xec\xd2\x1b\xf2\x5f\x15\x01\xd3\x32\x38\x40\x86\x4c\xb8\x13\x93\xd1\x11\xc9\x8c\x2e\x5f\x5c\x25\x0c\xf8\x82\x5c\x84\xf5\x89\x58\x33\x5b\xec\x4d\x94\xd9\x0a\x5f\x80\xdd\x78\x78\xc6\x44\x67\xd3\x05\x09\xf9\xff\xd7\xd9\x6b\xde\x0f\x4b\x12\xad\x29\xd9\xb2\xf5\x5e\x76\x2a\x49\xab\x0a\x30\x0a\xf3\x4d\x2b\x04\x3e\x43\xa4\x85\x08\x25\x2e\xf3\xa6\x27\x15\xfb\x81\x05\xae\x98\x15\x4c\x84\x70\x2d\xa5\x5e\x88\xdc\x1f\xed\xeb\x17\xf7\x38\xd4\x03\xd1\x9b\x0b\x50\xf5\xaf\xe6\x22\x77\x47\x59\xf7\xeb\x4d\x1c\xb9\x12\xb1\xa3\x51\x31\xbb\x4e\x2b\xbd\x86\x25\xf4\xbe\x84\xa6\x40\x94\x9f\x18\xf2\x3e\xb0\x8b\x97\xc5\x0f\xb8\x96\x4c\x53\xbe\x09\xda\x65\x8a\xb4\x66\x9b\x12\x7b\x78\xfd\x0d\xce\xb1\x45\xf4\x66\x47\x34\x13\x2b\x96\x99\x7a\xf4\x22\x14\xf6\x48\xcb\x07\x24\xbc\x2a\xac\x91\xb9\x8c\x39\x5d\x82\x1d\xc8\xea\xd5\x0e\x4b\xdd\xe0\x0d\x78\xb8\x12\xc2\xd5\xa9\x70\x72\xe9\x1e\x46\xd7\x22\x0e\x83\x59\xec\x9a\xb0\x71\x57\xff\x8b\xa0\x52\xbb\xdc\x66\x34\xbb\xf8\xb5\x96\x86\x16\x4f\x08\x94\xf4\xf2\xdc\x0b\xe2\x6e\xc1\x09\x72\x9a\xee\x91\xab\x51\x75\x11\x48\x74\x2e\x50\x17\xc7\xe2\x09\x37\xb9\x04\xe6\x28\x7a\x22\x9a\xfd\x7a\x59\x3f\xaa\x00\x63\x1c\x99\x2f\xb6\xf0\x68\x64\x8f\x66\x8c\xa7\x86\x40\xaf\xe7\xf3\xaf\xb3\xa6\x57\x00\xec\xe9\x1e\xc8\xa7\x6a\x87\x0e\x0a\xca\x54\x32\xa6\xb7\x6b\xc1\x66\x9b\x0b\xd0\x15\x5d\x5e\xd4\xe3\xe2\xea\x44\xb0\x2e\x73\xf9\x4b\x0a\xcd\x93\x8b\xaa\x64\xd8\x5a\x9c\x94\xbc\xf3\xd4\x24\xde\x6f\x0c\x4f\x02\x47\xed\xa0\x13\xeb\x8d\xe2\x16\x32\xba\x2d\x74\x36\xa3\xa4\x7f\x2f\xfc\x19\x77\x8e\x67\x82\x28\x3a\xc0\xd0\xa1\x02\xdd\xc6\x60\x07\xa5\xbe\xdd\x20\xfa\x7d\xe4\x7e\xf2\xff\x2a\xf8\xa9\x3f\x9f\xc7\xea\xd5\x99\xcd\x2a\x5d\xf7\x82\x18\x48\x0b\x9b\xc7\x52\xfc\xe3\x87\xe9\xb6\x5d\x49\x5f\x13\x01\x75\x63\xc6\x50\xfa\x1a\xec\x46\xe9\xa9\xd9\xbd\xb4\x2c\x0f\xb3\x3f\x1d\xa6\x0c\xbd\xc7\x10\x7b\x40\x14\x51\xbb\xba\xc4\xc9\x7d\x41\x3c\x7a\xd4\x99\x87\x12\x9e\x35\xcd\x88\x29\x33\x3a\xa9\xe1\x89\x75\xb0\x07\x03\x74\x0f\x44\x05\x6e\xb2\xbb\x89\x75\x45\xec\x25\xd3\xe7\xa5\x5b\xdd\x71\xfa\x29\x76\x4c\xba\x74\x93\x72\xad\x16\xb5\x11\x16\xd4\x94\xfe\xba\xd1\x4e\x35\x11\x63\xee\x87\x69\xb5\xee\xd4\xc5\x1b\xd1\x91\x5b\x41\x0c\x12\x1e\xcc\xae\x59\x3f\xaa\x15\xbd\x20\x87\x49\xf0\x38\xd0\x54\xe4\xfb\x89\xda\x27\xaf\x89\x35\x99\xbc\x74\x61\x1d\x25\x05\x44\x14\xb1\x81\x1a\x09\xcd\x3d\xae\xea\x70\x58\xdc\x26\x63\x47\x4b\xc1\xd5\x53\xd4\x61\xc9\xcc\x79\x9b\xc9\x0a\x34\xf4\xe6\xc3\x40\x4f\xd8\x06\xb1\xc7\x41\x9e\x17\x65\x9f\x70\xbc\x73\x69\x58\x3f\x87\x6b\x69\x8c\x84\xa0\xe6\x56\x2a\x58\xdd\xe6\x4a\x9f\x16\x37\xe2\x34\xa8\xa7\xc5\x34\x5e\x8b\xa5\x99\xa2\x9f\x2c\xc2\xf7\x4d\xd6\xa0\x3f\x2e\x05\x76\x70\x8b\xf5\x8b\xb4\xe0\xba\x0f\x04\x22\x1e\x7e\xfd\xbb\xa2\xb1\x53\x1d\xd6\xac\x27\x0d\xe8\x29\x2c\x82\x00\x2c\x7b\x57\x0b\x62\x1d\x65\x38\x01\x45\x20\x45\x80\xb7\xc9\xe1\x08\xdb\x92\xf7\x6c\x16\x37\xcf\x29\xca\x20\x65\x0b\x0e\x59\xbc\x5c\xa4\x52\x3c\x25\xbb\xd2\x76\xba\x72\x3c\x13\x18\x98\x77\x57\x05\x74\xb7\x1c\xce\xc2\xa0\xbd\xb7\xcd\x2e\xd5\x32\xd3\x66\xb0\xbc\xf8\xaa\x4a\x2e\xae\xfd\x80\xc4\xb0\xe1\x2c\xf7\xdc\xda\x38\x5c\x89\xf8\xc3\x27\x40\x49\x78\xb0\x34\x31\x1b\xe2\x29\x7b\xbc\x93\x83\xf5\xd8\x28\xe1\x65\x79\x61\x86\xbd\xe3\x53\x47\xa4\xf1\x9e\x6d\xe1\x2b\x52\xe9\x5a\x74\x38\x28\x0b\xd5\xad\x63\x7d\x2a\x04\xec\x0c\x02\x47\x17\x66\x66\xc0\x00\x5a\x87\xfb\x91\x85\x72\x18\x77\xfb\x2b\x4a\x95\x90\x73\x2c\xf4\xf9\xee\x33\xf7\x20\x67\xf5\x92\xf4\x41\x4c\xce\x9b\xc3\x2f\xfb\xcd\x4c\x95\x93\x57\x28\xb3\x00\x47\x92\xa8\x74\xf9\x44\x27\x47\xb8\x52\x31\xed\xee\xf3\x32\x63\xb8\x32\x98\x76\x0c\xe1\x40\xe1\xf1\x18\x46\xc9\x13\x74\x90\x42\x53\x0f\x8f\xd1\x77\x81\x47\x49\x1d\x4a\x2e\x31\x40\x7c\xf6\x81\xfd\x97\x08\xdf\x36\xa0\x20\xa0\x41\xe9\x94\x45\x7c\xf1\xa2\x7b\x79\xdd\xb6\x9f\xb2\x14\x5e\xda\x52\x60\x63\xdb\x61\xf2\xca\x9c\x7f\xbc\x2e\x44\x30\x6c\x05\xb4\x6a\xfe\x83\xad\x02\x2e\xa1\x77\x48\x34\xd5\xe5\xc8\xb3\xec\x62\x21\xc8\x86\xbf\x2f\x1b\xc1\x1c\xd0\x69\x07\x8e\x10\xbd\x66\xaf\x77\x59\x77\x6e\x3e\x99\x19\x9e\x61\xa6\x55\x35\x93\x31\x64\xf2\x30\x30\x28\x19\x93\x5a\x83\xa0\x1e\xa0\x7b\x5c\x19\xf2\x54\x09\x1d\x0f\xc0\x15\x42\xae\xa5\xf4\xc4\x83\xed\x82\xd5\xe6\x50\xe0\xbd\xe8\xcf\x64\x5a\xc3\xac\x20\xdb\x96\x4c\xe0\x3c\xfb\x53\xd6\x02\xf8\x3c\xb4\x65\xaf\x65\x21\x99\xb2\x5f\xc6\x1d\x26\x29\x9b\xee\x1e\x0a\x78\x55\x96\x61\xb9\x34\xac\x3d\x02\x16\x51\x01\x6d\x3e\x35\x40\x42\x3c\x04\x03\x48\xd3\x29\xb2\xe3\x15\xe2\x2e\xf2\x09\x27\x5d\x60\x45\xfb\x84\xba\x82\x43\xa5\x10\x5a\x0d\x81\x87\x73\x96\x4e\x9a\x97\x0c\xac\x83\xc5\xa3\xbe\xc9\xfe\xc7\xe6\x9b\xb3\x74\x6e\x47\x92\xde\x94\x6d\x20\x53\x14\x0f\x7c\xd9\x03\x74\x1e\x11\x65\x69\xb7\x0c\x25\x6b\xb6\x1b\x7e\x2b\xc3\x42\x0f\x2c\xf7\x8e\x92\x57\x68\x59\xcc\x09\xe0\xfb\x09\x56\x79\x60\xae\x1f\x19\xc2\xbc\xa0\x47\xff\xb6\xa4\x52\xf5\x7f\x21\x24\x9c\xba\xa5\x40\x6a\xe6\x85\x0b\xee\xbd\x04\x0c\x6d\x28\xdd\x8e\xf2\xb3\x1f\x9f\x5f\xfe\x0d\xe9\x9c\x4e\xfb\x5f\xb5\x19\x4b\xfe\xa0\xe5\xe8\xf7\xa5\x40\xb1\xd1\xf2\x05\x99\xb9\x1f\x9f\x97\xee\xc7\x73\x7f\x4f\xa1\xa6\xcc\xd7\xdf\x98\x48\x66\xef\x26\x91\x0d\xbe\xe2\x66\x6e\x19\x1a\x00\xd9\x59\xbd\xfa\x12\x8a\xb8\xe2\x73\xfb\x87\x5d\x3c\x5f\x7a\x89\x57\x21\x6d\x7d\x83\x80\x8f\xfa\x78\xf5\x8d\xad\xee\xd3\x95\x1e\xc3\x85\x2d\xb1\x53\x27\x4c\xee\x69\x27\xac\xcb\xeb\x83\x35\xa3\xbd\x9c\x86\x52\xa0\x2f\x28\x24\xf4\xae\x03\xf6\x90\xc6\xd1\x96\x1d\x0b\x02\x64\x33\x43\xef\x41\xb8\xf9\xfb\xc8\x02\xed\x39\x2e\x82\x1c\x78\x4f\x57\x89\xfe\xfb\x58\x58\x1d\xd6\x15\x79\xa5\xa6\x64\xdf\x46\x8b\x2b\xa1\xf2\x4a\x5b\x07\x0f\x91\x5a\x2b\x04\x18\x87\xde\xa6\x33\xeb\x91\xa9\x84\x9d\x4b\xc7\xf8\xbc\x62\x24\x53\xda\xab\x4d\x66\xfd\xe3\x04\x9c\x29\x66\xeb\x51\x0a\xcd\xb2\x16\xd9\x7c\xa1\x9d\x39\xd6\x2f\x24\x6b\x23\x81\xed\xef\x5f\xc7\x0f\x24\x94\x04\xea\xc1\x96\x25\x35\xec\xd8\x05\x44\xc7\x7a\xe2\x0e\xef\x04\xc0\x0b\xfa\x56\xba\x69\x70\xfe\x14\xbb\xc6\x9b\xa2\x08\x28\xcc\xd3\xae\xca\x36\x9a\x66\x2a\x28\x7a\x0b\x83\x82\xaf\x97\xd9\x33\x05\x8c\xbb\x23\x1e\x29\x4d\x93\x6e\xfc\x66\xfb\x40\xa4\x8e\xfb\x7c\xfe\x8c\x99\xd4\xc7\x5f\x9e\xb5\x42\x1a\x88\x18\x2b\xc7\x51\x9d\x86\xac\x16\x2d\xef\xb0\xc0\x0e\xd9\xdf\xed\x38\x78\xf0\x0a\xfe\xa3\x1e\xa0\x5a\x2c\xde\xe1\x29\x14\xfd\x0b\x62\x0f\x7b\x2d\xa5\x27\xbb\x69\x52\xb2\x2a\x2b\x59\xd5\x2c\xca\xf9\xc4\xbb\xda\x65\x92\x97\x3e\x4a\xc7\x9a\xf2\x1e\x43\x40\xf0\x62\x6a\x5f\x88\x0a\xd7\xc7\x5c\x1c\xf3\xca\xbc\x29\xa4\x52\x45\x11\x6f\xe9\x96\xac\x62\x3f\x85\x44\xc1\x71\x6e\x15\xaa\xbf\x6a\xa4\x35\x0d\x4d\xd4\x67\x2c\x46\xc0\x85\xa1\xa7\xf3\xe8\x19\x13\x75\x2b\x98\x63\xca\x48\xea\xb2\x2f\x6a\x36\x50\xd2\x25\xa3\x39\x95\x65\xa7\x9b\xaa\x75\x38\x5c\x7e\x87\x17\x2f\x96\x2b\xc3\xb7\xa9\x7c\x7f\x43\x3e\x8d\xa5\x71\x46\x93\x66\x1b\x6d\x69\x89\x51\x31\xa1\xe9\x91\x6e\x06\x59\x8d\x9e\xaa\x69\xbd\xe6\x2c\x03\x1e\xdc\xb5\x64\x5b\xeb\xf4\xa4\xb5\xf3\x83\x95\x8a\x33\x40\xdc\x89\x79\x41\x2c\x76\x7b\x3f\x0c\x53\x48\x4d\x66\xc2\xa5\x15\x5d\xc5\xbe\x8e\x0d\x85\x44\x08\x90\x8b\x43\xcb\xe8\x8a\xd8\x71\xbf\x28\x80\xf3\x15\x01\x42\x2d\x35\x0f\x6a\x7e\x73\x72\x96\x91\x91\xfb\xb6\xb7\xc8\x0a\xbe\xbf\xbf\x1a\xa7\xd7\x59\x4d\x78\xe6\x51\x13\x23\xe5\x8a\xb5\x34\xa7\x9a\xad\xe9\x05\x7e\x32\x6d\x31\x6a\xd3\xc0\xd5\x82\xb8\x41\x81\x74\xbc\x37\x05\x34\xee\x72\x8d\xf4\x4a\xf2\x92\x4b\x82\xda\xb0\xcd\x56\xb6\xc3\x8e\xcd\x1d\x77\xb9\xf5\x0a\xfb\x87\x53\xa1\xd0\x0a\x0d\xff\x1a\x75\x0b\xe6\xa5\xc6\xd0\x14\xaa\x17\x77\x73\x85\x2b\xbe\x7a\x57\xda\x7f\x78\x7d\x08\xad\x09\x4f\x5c\xbd\x57\xd2\xe5\x08\x85\x7f\xe6\x77\xa5\xbf\xc2\x3b\x4c\x15\x9d\x1a\xf7\x72\x70\x4e\x08\xee\x9f\xe7\x17\xce\xdf\x4c\x57\x9b\x80\x8c\x99\x8a\x13\x6c\x21\x65\x81\xc9\x5e\x4d\x3f\x21\x42\xb9\xfd\xd5\x38\x92\x52\xee\x6b\xf2\x30\xf3\x85\x09\xe0\x26\x75\x4b\xde\x67\x7a\x01\xf1\x8a\x3f\x2b\xa9\xa3\xee\x95\xec\x6c\xf3\xde\xf5\x72\xbc\x3d\xd4\x82\xbd\x9c\x76\xb5\x2e\x0f\x2c\x81\x0c\x16\xe7\xa4\x19\x66\x7b\xb7\x43\xc5\x93\xe8\x9d\x35\x2c\x93\xe4\x41\x11\xf1\x95\xfc\x20\xb7\x54\x17\xae\x8f\x91\x78\x07\x33\x66\x9f\x90\xb9\x99\x39\xf0\x93\x19\xd2\x27\xfb\x40\xd9\xc3\x4c\xae\x1a\x78\xd1\x9e\xf4\xe3\xf5\x9b\x1a\x61\x53\x98\xe7\x71\xfc\x03\xf0\xe5\x5b\x93\x0b\x8f\x93\xe7\x82\x3b\x1c\x6c\x4f\x89\x88\xb3\x6b\x6f\x21\xce\x26\x8b\x8e\xf7\xb4\x47\x3f\x87\xd3\x7e\xb9\xf8\x9d\x7f\x7f\x1c\x18\x80\x36\x25\x62\xf3\x46\x14\x38\x14\x28\x37\x75\x92\xfe\x8d\xaa\x28\xf2\x50\xda\xfe\xb3\xa1\x19\x3b\x5d\x87\x9a\x7b\x9d\x88\x74\x6f\xbc\x95\x44\x59\xb7\x41\x71\x42\xe9\xe3\x01\x3a\xe1\xc0\xd3\xbc\xc8\x99\x43\xd6\x07\x3c\x44\x08\x87\x5e\x9d\xce\xab\x85\x95\x38\xdc\xab\x30\x86\xa5\x2c\x6d\x87\xb6\xe8\x1c\xd1\x45\x8c\x21\x7a\x30\x56\x09\xc5\xec\x1f\xf0\x42\xfa\x3a\x7d\x0f\xfd\x50\x25\x5f\x1f\x19\x4b\xec\x35\x66\x26\xb1\x7b\x6a\x39\xbb\x46\x75\x86\x21\x27\x46\xb2\xaf\x42\xc9\xd3\x79\x73\x3c\x37\x4b\xa4\x56\x70\xbe\x6a\xfb\x58\xdf\x89\x30\x17\xbe\x12\x3b\x66\x74\x05\x72\x47\x6b\xdf\x27\x19\x12\x6f\x3d\x13\xfe\xdd\xd3\x2e\xca\xf4\x1f\x7e\x7f\xd4\x92\xce\x2c\xa9\xc0\x13\xa8\x94\xbf\x6a\xe5\x82\xb4\xad\x68\x02\xf5\x07\x8e\x00\x56\x01\x73\xd8\x45\x9e\x40\xa2\x30\x44\xcc\x0e\xd0\x62\x4e\x68\x63\x11\x1a\xf0\x33\x04\x45\xe1\xc1\x9e\x32\x3b\xbf\x44\xf2\x1c\xde\x90\xd0\x0c\x43\x4d\xab\x88\x32\x1d\x8e\x4b\x74\x4e\x9f\x85\xa4\x19\xbb\x7b\x7f\x44\x0b\xfa\x77\xe5\x2a\xaf\x94\xb7\x98\xd7\x3d\xfc\xfe\xfe\x60\x23\x2f\xd4\x39\xb7\x9c\x4f\xfe\x5f\x45\xa7\xb2\x62\x9e\x1e\x2a\x3a\x31\x09\xdf\x98\xd2\x5c\xa8\x66\xfe\xd7\xff\x72\x45\x3d\x3d\xce\x74\x9e\x2d\x40\x4f\x6b\x2f\x55\x6b\xce\x2f\x33\x74\x57\xdb\x30\x3a\xb0\x2c\x7c\xb1\x43\xd6\x9b\x47\xd4\xa6\x1c\xd8\xc2\xe3\xbd\xbc\x5b\xa0\xab\x33\x09\x0c\x89\xb7\x1d\x42\x6d\x4b\xe3\xeb\x1f\x27\x66\x90\x18\x33\xd7\xc4\x4d\x8d\xe1\xd1\xa3\x45\x79\x89\xad\x4a\x33\x5d\xbe\xe6\x81\xba\x23\x8e\x34\x06\x9f\x6f\xfe\xed\x4f\x95\x43\xb7\x14\x8a\x23\x81\x4a\x59\x1d\x74\xac\x05\xf1\xce\x93\x99\x78\xdc\x66\x1b\xd7\xcb\x99\xfd\x0c\x7b\xdb\x0e\x6a\xdb\x2e\xfe\xf5\xe8\x5d\x18\xe8\xb2\xef\x05\x2b\x3e\x7b\x89\x1f\xde\xb0\x49\xc9\x91\xa7\x44\xad\x26\x75\x7a\x32\xf9\xb2\xa6\x7b\xb1\xf2\x05\x26\x66\x96\x4f\x1d\x84\xce\xbd\xb2\xaa\x15\x3c\xda\x5a\xab\x6c\x66\xae\x2f\xcd\x8b\xa7\xa1\xde\x0f\x2c\xdb\x99\x0b\x44\x6d\x77\x1a\xe4\x58\x9a\x1d\x07\x3b\x88\x19\x99\x61\xc9\x81\x25\xa4\x15\xc0\xcd\xc6\x42\xf7\x01\x49\xc9\x7a\x79\x6b\xdf\x17\x4a\xf0\x52\xe8\x98\x6e\xb1\x2d\x4e\x64\xb8\x11\x81\x82\x6c\x96\x52\xeb\x70\xa9\x27\x6f\x65\x61\x5d\x38\x33\xb9\xea\xc1\x26\x37\x5d\x05\x09\x27\x5d\x51\xca\xa8\x5e\x82\x10\xb6\x33\x23\xb3\x81\x08\xe5\xb6\x30\x27\x22\x73\x4a\x71\x34\x91\xe1\x03\xef\x06\x60\x0e\xe6\x29\x44\x96\xf2\x21\xc7\x2f\xff\xc6\x95\xa6\xa9\xa8\xb9\x6d\x61\x9a\x01\x80\x57\x62\x03\x4a\xb1\xdf\xdc\xe3\x89\xf2\xe3\x5c\x19\x2c\x66\x38\x31\x0d\xd6\xd0\xae\xa0\x65\xfb\xd4\x68\x3a\xa2\x58\x50\x14\x9e\x09\x48\x50\x4e\xe5\x45\xe9\xd7\xc6\x17\xa3\xdb\xc4\x6e\x46\x74\x47\x33\x89\x38\xc9\x69\xbb\x04\x73\x3c\x55\x7b\x54\x66\xe5\xe3\x20\x96\x0a\x19\x52\xef\xbd\xa0\x6b\x9e\xe2\x22\xd2\x17\xfb\x84\x85\x0c\x53\x76\x8a\xe9\x4c\x0e\x51\x47\xb7\xc0\xbb\x70\xa5\xde\xaf\x87\x17\x2f\xb9\xce\x42\x25\x79\x75\x8c\xa1\x42\x20\xee\x61\xf5\x5a\x92\xf8\x0b\xc1\x30\x51\x11\x3c\xb4\x21\x7e\xd8\x56\xbb\x42\xa0\x6e\xe0\x18\xd0\xf4\xef\xac\xfa\x28\x1d\x0c\x33\xb5\x13\x8b\xe0\x38\x63\x55\xd0\x4c\xe9\xfb\x36\x3c\xc3\xbf\x83\xe8\x1c\xd8\xd8\x89\xcf\x9c\x4b\xe7\xa9\xbb\x16\xf8\xa0\xd5\x62\x74\x14\x27\x91\x30\xaa\x4a\x23\x09\xd2\xc1\x63\xe1\x65\xf4\x9e\x92\x9d\x9e\xdc\x22\xad\xb7\xda\x7e\x51\x49\x06\xc7\x07\x55\x85\x7f\x12\xde\xf4\x65\x08\x3d\x4b\x9e\x03\x81\x29\xad\xf3\xc4\x25\x5d\x70\x55\x7c\x0e\x9e\x51\xd6\x31\x5f\x6d\xb8\xe3\xf8\xea\x1c\xbc\xd9\xa7\xf5\x99\xd8\xcd\x3d\xaa\x81\xfa\x69\xbe\x9a\x1a\x4c\x41\x2c\x40\x28\x69\x3a\xa9\x88\xf1\xd7\x06\x33\x90\x86\xc6\x61\x93\xb1\x68\x92\x0a\xde\xb1\xea\xfa\x8e\xf8\x47\x66\xdb\x24\x63\x0d\x84\x25\x26\xea\x5d\x17\x6e\x99\xa4\x94\xc0\xb5\x62\xcb\xea\x6e\xc5\xe3\x59\x4a\x9b\x66\xd2\x6a\xee\x9a\xa9\x18\xb3\x9e\xb0\x95\x5e\xf0\x90\xf3\x48\x64\x65\x5d\xbf\x38\x08\xfa\x30\xfc\xd2\xe8\x74\xa6\xba\x79\x3a\x95\xf2\xea\x72\x69\xc7\xf0\x42\x1b\x3d\xd2\x91\x6d\x8f\x6b\xb3\xc3\x52\xe7\x69\x78\x40\x53\x6f\xdb\x1f\xa8\xd2\xe2\x7e\x41\xc5\x6d\x9f\xb0\x3f\x83\x77\x3a\x23\xf8\xdb\x59\x8b\x3c\x9b\xe2\x0d\x37\x74\x43\x10\x43\x08\x20\x58\x89\x2f\x28\x15\xeb\xab\x95\x72\x2e\x34\x52\x76\x77\xe6\x23\x40\xb1\xbf\x00\x03\xc3\xe5\xdc\x77\x94\xf0\xc1\xd9\x9c\xa8\xe4\xed\x74\xec\x2b\xd2\xae\x7b\x52\x02\xad\x7b\x8c\x13\x6b\x2e\x8d\x09\x3b\xe9\x01\x72\x18\x14\x28\xb6\xeb\xc8\x56\xef\x81\xd8\x17\x71\x28\x22\x1f\x92\x59\x71\x33\x87\x5e\x90\xf5\xe6\xd5\x52\xd9\xc6\xf8\x54\x2d\xb9\x2f\xe8\x0f\x65\xce\xc0\x14\xc3\xdb\x7e\x64\x6f\xef\x61\xf6\xaf\x30\x54\xac\xf1\xae\xd0\x2a\xde\x95\x78\x4d\xcd\xff\x53\x79\x8a\x51\x4e\xf4\xcb\x5a\xa9\x42\xb3\xc4\xed\x79\xa1\x6b\x67\xd7\xc4\xec\xf5\x69\x49\xac\xcd\x65\x53\xaf\xc8\x49\x51\xe6\xb9\x10\x13\x58\x1a\x2b\xb7\x4a\x71\x69\xd5\x56\x1f\x0f\x1f\xf8\xc4\x3a\x0b\xe6\x78\x21\xa0\x00\xf9\xb0\x26\xef\xa4\x70\x39\x7c\xf9\x37\xa4\xec\xc7\xa5\xec\x99\xd8\x76\x0a\xef\x44\x10\xdd\x4d\x16\x31\xbc\x7a\xa8\xbd\x79\x45\x2d\xd9\x0d\x78\xc0\xb0\xf6\x79\x48\xac\x49\x89\x85\xcc\x03\x47\x95\x65\x2c\xe2\x60\xdd\xca\x3e\x18\xf6\xcd\x7c\x4c\x2e\xb8\xf9\xc4\xf6\xaf\x62\x7d\x57\x3c\xaf\x8d\x08\x8b\xec\x8f\xae\x82\xf3\xd9\x72\x85\x49\xbd\x09\x02\xdd\x7a\xf4\xa5\xa6\x3e\x57\xb4\xa4\x1a\xb3\x55\xe4\xa2\xcc\x11\x70\x85\xeb\x1a\x3b\x38\x86\xe8\x1e\x39\x68\x2b\x0e\x54\x3f\x2c\xc5\xad\xff\x76\x47\x97\xe1\x73\x3c\x6b\x04\xd9\xcd\xa5\xcf\x23\xbf\x0a\xdc\xa1\x50\x0d\x5a\x34\xa7\xd2\x8b\xc7\x1e\x0c\x42\x3d\x0f\xb3\x05\x82\x40\x03\x0a\x42\x88\x38\x51\x43\x16\x41\x27\xc1\x29\xba\x47\x2f\x91\xe0\x8a\xb7\xc7\xa0\xe2\xdf\xc3\x7c\x3d\x1a\xf2\x7d\x6a\x97\x82\xaa\x97\x52\x98\x4a\x8a\xf5\xea\xce\x52\x47\xb0\x8e\xa0\x28\x1e\x14\xbc\x43\xf5\x8a\x9f\x07\xbd\x2f\x28\x4d\x3b\x37\x48\x69\x72\x6c\xb9\xa8\x00\x5a\xe3\xc4\xc5\xbd\x8b\x99\x50\x06\x5b\x2e\xa0\xf3\x2d\x14\x20\xed\xaf\x53\x20\x64\x22\x86\x65\xa7\xbc\xf9\x67\x60\x27\xb2\x39\x64\x33\x1b\x06\x5f\x94\x77\x8e\x29\x20\x89\xcd\x69\xd0\x51\x02\x51\x9e\x1f\x4f\xb3\x2d\x1b\xfd\x78\xdb\xb0\xbd\xf5\x0b\x45\x03\x16\xf2\x48\xf9\x44\xef\xc2\xf3\x62\x10\xfa\x3c\xc6\x91\xb0\xe6\x97\x32\x36\x57\x9e\x27\xd1\xf4\xa8\xb7\x08\x55\x7f\x95\x11\x7f\x98\x48\x2c\x90\xa6\xd5\xf7\x51\xed\x0d\x8f\x33\x99\x74\x2c\x50\xa4\x73\xb1\x95\xca\xa7\x17\xec\x0a\x4d\xcb\x98\x5a\xf6\xdc\x2d\x69\x66\x27\x8d\x93\x3a\x9c\x64\x71\xd8\xbc\x8b\x0c\xa9\xf8\x6a\xba\x3e\x6e\x1b\x55\x47\x67\xae\x0e\x5a\x07\xf6\x75\x0a\x57\x42\x82\x26\x69\x7a\x1a\x4c\x82\xf1\x86\x15\x8e\xb5\xb7\xf1\xaa\xc9\x71\x2f\xbd\xbd\xde\x8b\x19\x55\x21\x9e\x3a\x29\xe2\x31\xad\x27\xfa\x1d\x69\x38\x4d\x68\x0b\x47\xcf\x1f\x5e\x71\x33\xeb\x4b\xc3\x91\x3a\xd1\x29\x23\x3b\xd9\xa3\xcb\xff\x29\x5a\xc4\xad\xd4\xef\x2f\xe6\x47\x9f\x50\xf5\x0f\xcc\x2c\xb9\x14\x0f\x19\x49\xb1\x60\xb1\xcf\x27\x9b\x2e\x3d\x48\xe4\x23\xe7\xb4\xf5\x17\x02\xf7\xe5\x8a\xab\x44\xd0\x60\x94\x82\x34\xdb\x69\x61\x24\x81\x8e\x19\x3c\xb0\xe0\x80\x47\x33\x75\x4c\xf3\x99\x20\xaf\xc4\x45\xc6\xf8\xc8\x6a\xed\xca\x74\xe0\xec\x66\xd0\x8c\x04\x3d\x54\x32\x12\xce\x9b\x13\xd4\x79\x45\xb8\x0e\x04\xd4\x8f\x25\x91\x13\x4e\xa6\xa2\x34\x95\x39\xf4\x54\x8a\x60\x49\x54\xc0\x50\x30\xf9\x1e\xda\x45\x35\xc5\x38\x5f\x10\xa0\x8e\x05\x4c\x42\x36\x38\x51\x40\xa5\x55\xc0\xf4\xd2\xb6\xed\x92\x37\xf3\x68\xc5\x33\x92\x04\x05\x8f\xd6\x67\x13\x6f\xca\xd8\x2a\xe2\x44\x70\x2d\xd4\x99\xde\x27\xf9\xcd\x4b\x06\xe3\xe6\x00\xdf\x8a\xfe\x32\xb9\x48\x7c\x79\xa0\xfd\x66\x6a\xc3\x97\xcd\x43\x2b\x05\xd3\xf1\x53\xc1\x17\xba\x3b\x87\xf4\xab\x59\x51\xd6\x10\x00\x07\x87\x12\x73\x9a\xcf\x20\x94\x2d\x03\xe1\x93\x89\xa6\x1a\x79\x4e\xe6\x3c\xc3\xe1\xb3\x53\xbd\xd0\x34\xac\xa5\xf3\x69\x35\x9d\x05\xab\x89\x12\x17\x83\x5f\x54\x69\x69\x40\xba\xa4\x94\x9a\x7f\x57\xa5\xed\xc4\x57\xee\x51\xfa\x76\xed\x7c\xc2\xc8\x8a\x03\x00\xd4\xc8\x8c\x75\xaf\xfb\x80\x1a\xe8\xd5\xbe\xb0\x32\x4e\xc6\x98\x28\xa3\x0a\x1d\x1e\x3b\x59\x27\xdf\x80\xb8\xf4\xeb\xb1\xe7\x49\x82\x02\xba\x6d\x3a\xc0\x53\x1d\x64\x34\x09\x63\x5b\xed\xc0\x90\xf3\x2c\x9f\x36\x17\x1b\x2c\x54\xd3\xd0\x78\x6f\x7d\x5a\x44\x21\x33\xc4\x3c\xf3\x44\x99\x02\x0b\xac\xb3\xc4\xd1\xe4\x4e\x1c\xc3\xb7\xd2\xa4\xb3\xce\xbb\x18\xc4\xdf\x3f\xbe\x80\xa9\x0d\x53\xe1\xb1\x44\x84\x5c\x07\x02\xa4\xd4\xa4\x76\x7a\xb1\xb7\xad\xa6\x0d\x26\x21\x7d\x3f\x3f\x55\xf5\xf3\x36\xb9\x0c\x95\x43\x64\x8b\xc5\x0e\x66\x3f\xf1\x20\x91\xc2\xcd\x69\x91\x94\xc8\x6d\xe1\xdd\xa7\x54\xbc\x3a\xb2\x5d\xac\x7b\x4d\x2a\x6d\x74\xa9\x31\x9f\x34\xc5\xc2\x1f\xed\x65\x44\x15\xeb\xe6\x52\x17\x28\x39\x33\x11\x20\x02\x20\x49\x44\xcf\x79\x9f\x22\x71\x92\x5e\x31\x10\x74\x60\x60\x3f\xb5\xb7\xc6\xb3\xf0\xe9\x31\xdf\x85\xd8\x49\xf7\x18\x89\x6a\xf0\x5c\x3f\x91\x78\xf5\x8b\x93\x16\xc9\x11\xb8\xff\x5e\x63\x18\x62\x50\x38\x6c\x51\x11\xd3\x28\xf9\xf9\x64\x8b\xca\xfd\x2f\x4d\x62\x8a\x47\xa4\xc8\x16\xaf\xdd\xd2\x89\x79\x54\x76\x73\x91\xfc\x81\xba\xa0\xc1\x3b\x38\x03\x1d\xd2\x45\xc4\x18\x3b\xe3\x8c\x7c\x0d\x94\x01\x57\xae\x13\xb2\x25\x4e\x0c\xc1\xf0\x28\x2e\x60\xad\x13\x24\xd0\x2c\xde\xf1\x83\x30\xac\x76\x2f\x8e\x83\xab\x46\x11\xae\x79\x93\x50\x24\x2a\x06\xf4\xf1\xcc\xbf\x7e\x7c\x02\xfe\xd0\x38\x8c\x86\xdd\xd3\x0e\x99\x54\x1b\x86\x0a\x39\x6c\xbe\x73\xa8\x08\xb2\x9e\x76\x20\x60\x31\xc2\x10\x2e\x85\xe8\xa3\x42\x36\xb3\x16\xab\x6e\x1e\x0a\x79\xa1\xdc\x3f\xd3\xef\x45\x29\x90\xf8\x0a\x48\x54\x2a\x10\x27\x25\x14\xf5\xb2\x03\x0e\x77\xf1\xe7\x99\x06\xc5\xdb\x3e\xbd\xd1\xbd\x87\x36\xc9\x6c\x99\x72\xb5\xc2\x7a\x49\x29\x11\x9b\x32\x62\xfe\x32\x74\x0c\x2a\xc7\x70\x27\x46\xc9\x4b\xe0\xb9\x15\xc0\x7c\xf1\xaa\x80\xa0\xa4\xde\x58\x8c\xb0\x8a\xe4\xec\xc8\x07\x78\x76\x9a\x89\x40\x07\x52\xac\x45\x21\x28\xa3\xbf\x64\x5a\x23\xbb\x91\x07\x8b\x9b\xc5\x0d\x72\xe4\x38\x71\xba\x40\x16\x12\x32\x38\x38\xb1\x95\x98\x22\x92\xfa\x27\xeb\xbd\xbd\xc5\x54\x78\x0c\x85\x23\xb3\x93\x91\x08\xcb\x89\x77\x4f\x63\xc7\xa9\x21\x1d\x88\x93\x11\xe0\x7e\x25\x3c\x87\xdf\x2f\x60\xe7\x37\x95\x42\x9d\x24\xa3\x57\x01\x44\xce\xd4\x0c\x9a\x5d\xd1\xef\x10\x9f\xc6\x75\x99\xd9\xa6\x6a\xaa\x54\xcc\xdb\xde\xfa\xab\xb2\xf5\x5f\x78\x64\x2f\x11\x51\xa7\x05\x4a\x27\x55\x2d\x0a\x27\xa8\x2d\x5a\x23\x72\x4a\x0b\xa4\x73\x57\x78\x2a\x99\x0a\x2f\xe4\x76\x80\x88\x7c\x80\x90\xd5\x8b\x8b\x85\x19\x00\x81\xde\xff\x81\xc1\x4e\xf5\xd7\x5e\xbb\xc6\x31\xb7\xed\x8a\x16\x52\x87\x94\x1d\x8a\x4a\xa8\x54\x7f\x62\x72\xd7\xd9\x37\x68\xe3\xe0\x7c\xb7\x95\x0a\x76\xca\x0f\x2c\x4a\x38\xba\xce\x50\x23\x73\xb3\xed\x5a\x80\x38\x17\xed\x90\xc8\xaa\xb2\x39\xd5\x1a\x73\x0b\x16\x3c\x05\xff\x4f\xe7\x82\xbc\xdd\x43\xda\x44\x49\x20\x7e\xca\xa5\x50\x04\x86\xd7\x89\x71\x66\x49\x9e\x27\xaf\x27\x88\xad\xdc\x3c\xbd\x32\xc9\x61\xc9\x8f\x80\xa0\x0f\x14\x1a\x64\x4e\x4e\x92\x89\xbf\xfe\x99\x31\x38\x4f\x2a\x93\x1b\xe6\x24\x62\x6f\xbc\xc5\x43\xa5\xd1\x29\x5f\x92\xdc\x5e\x76\xbd\xd5\xcb\xe7\x87\x2f\x99\xd3\x76\x8f\xa5\x39\x61\x64\x72\x05\x65\x3b\x92\xc7\x9b\x01\x76\x2d\xa8\x2e\xe6\xf7\x4f\xff\x86\x12\x08\x44\xb3\xa9\x5b\x1e\x39\x55\x16\xe8\x6d\xb9\x58\x79\xdd\x0a\x35\xf1\x50\x33\x66\x31\x03\x05\xba\x18\xd7\xb2\x82\xae\xa2\x19\x19\x6a\xbd\x03\xbc\x51\x65\x07\xd6\x75\xfd\xe6\x70\x69\x39\x90\xbc\x6d\x40\x53\xaf\x20\xae\x83\xc9\x8b\x12\xb4\xaf\x22\xa7\x43\xcb\xc4\x44\x65\xcb\xcb\x3e\x40\x8f\x64\xe0\xa4\x4e\x25\xe6\x04\xc7\x02\xcf\x09\xbd\x92\xff\x53\x09\x69\x8c\x33\x32\x8a\x93\x2b\x99\xfe\xc6\x26\xaa\x54\xef\x20\x13\x01\x4d\xea\x97\xeb\xbf\x15\x27\xfd\xe3\xf3\x8b\x24\x62\x9b\xa3\xda\x52\x91\x93\x48\x0e\x63\xb3\x7f\x64\x9d\x38\xbc\x81\xd7\xc0\xc2\x37\x8d\x62\xb0\xfd\x1e\x90\xb2\x01\x0e\xfb\x43\xfa\x83\xa5\xb6\x6b\x2c\x5c\x26\x4b\x7b\x62\x82\xd3\x1d\x59\xae\x51\x78\x8c\xf4\x80\x2c\x72\x20\xd7\x43\xa1\x0a\x87\x15\x25\x4f\xae\x7b\x18\xf0\xa9\x0b\xfa\x0e\x6e\x24\xe4\xa0\x13\x32\x69\x60\xa7\x50\x2b\x84\xf4\xc5\x5c\xc5\x4b\x00\x9a\xcb\x1d\x62\x86\x06\x29\x6e\x13\xfc\xae\x2b\x05\x9c\xfd\x2f\xb8\x8e\x37\x05\xe1\x45\x31\x00\x5f\xab\x66\x53\x72\xc6\x96\x18\x3c\x29\x0e\x74\xa7\x81\xf0\x39\xb3\x3f\xbe\xb0\xe6\xee\xf9\x09\xe3\xad\x33\x8f\xba\x2b\x39\xb7\x3a\xab\x28\x83\xbb\xc9\x91\xfe\xa4\x59\xa6\xb5\x58\x02\x7b\x2d\xf6\xe9\x32\x31\x4f\x12\x6a\x13\xc7\x9d\xde\x82\x8f\x58\xa1\x97\x20\x63\x59\x21\xff\x73\x2b\x31\x81\x2e\xf2\xf0\xf3\xf1\xfe\xf5\xc9\x76\x1c\xf2\x07\x3c\xef\x8d\xfd\x73\x61\x7f\x7b\x67\x07\x8b\x93\x39\x68\x92\xcc\x62\xd1\x99\xf8\x41\x57\x2f\x9c\x14\x37\x76\x54\xd7\x79\x2c\x58\x80\xc3\xc7\x2f\x50\x8a\x53\x47\xfe\x8c\x5c\x18\x16\x38\x85\x83\xd2\x9f\x17\x46\x43\xce\xae\x41\x37\xd3\xb9\x34\x99\x4a\x30\x83\xdb\xd3\x3b\xb4\xd0\x5f\x9c\xf1\x43\xde\x04\x21\x5d\xa6\xec\x81\x22\xcb\x90\xb6\x10\xab\x00\x2c\x4b\xbb\x0b\x3f\x74\x8d\xe2\xe2\x59\x58\xca\xa6\x53\x59\x89\x1c\x09\x81\xaf\x39\x2a\x6a\xdb\x30\xbf\x40\x0d\xb0\xb1\xf4\xe5\x9b\xf4\xaf\x42\x4e\xb3\x85\x22\x69\x44\x45\x81\xbb\x6c\xe1\x31\xb0\x15\xe4\xe3\xe3\x40\x7a\x57\xd5\x9d\xdd\x9d\x82\x5e\x46\xf2\x71\x22\x31\xa2\x27\xce\x99\xd6\x50\xc5\xc2\x77\x5d\x1c\xbb\x64\xdb\xc5\x93\x60\xb5\x47\x3f\x81\x17\xdf\x54\x3e\xca\x43\x71\x33\x55\x48\x30\x99\x1f\x64\x24\xba\x5e\x54\x91\x73\x68\xe9\x0f\xce\xae\x39\xf9\xe7\x16\x4f\x61\xbb\xcd\x07\x28\x78\x64\x68\xd5\x02\x17\x15\x46\xb4\x19\x0a\x97\x51\x6d\x8b\xcd\x42\x48\x9f\xfd\xbb\x62\x9d\x49\x0d\xf2\xa6\xc5\x37\x32\x9e\xc5\xd2\x91\xce\x1c\x38\x21\x39\x77\x2d\xe2\x39\xde\x62\xb9\x67\xf7\x6c\x61\xf6\x79\xd3\x4b\x4f\x8e\x83\xba\x05\xac\xd2\x53\xdf\x39\xab\x45\x2d\xfd\x87\x7a\x13\x67\xca\x81\x49\x4a\x25\x2e\x79\xdf\x22\x61\xf4\x11\x16\xce\xfe\xff\x12\x34\xd7\xc8\x7c\x1c\x36\xb5\x99\x6f\x41\x90\xf4\x30\xbc\xa0\xe8\xdb\x2d\x15\x42\xd4\x66\x49\x82\xaf\x34\xfb\x2c\xfc\x30\xb0\xf2\xf0\x4d\x3d\xb3\x48\xb4\x80\x00\xf4\x43\x21\x15\x32\x9f\x81\x49\xdd\x34\x79\x97\x9c\xdf\xe2\x3d\x2e\x77\x15\xd3\x12\x51\xf5\x22\x62\x98\xf5\xd3\xe1\xd6\x81\x34\x4a\x63\x2c\x3d\x57\xa6\xb0\x82\x28\x3c\xb6\xc4\x6e\x81\x60\xc6\x41\xa0\x50\x2d\x06\x36\x9c\x86\xe3\xf3\xf3\xb3\x0c\x1f\xb2\xe5\x6b\x79\xc8\xdb\xac\x7c\xe1\x74\xcb\x1f\xa5\x69\xb9\x64\x4e\x47\xe2\x10\xa9\xa5\xdb\xbf\x36\x0e\xa5\x19\x3d\x36\x06\xd9\x8f\xcb\xce\x94\x27\xd6\x9f\x0b\x5d\x18\x79\x97\x95\x7d\x64\xaa\xe0\x97\x26\x72\xb8\x70\x67\xaf\x57\x05\x62\x6a\x1e\x44\x02\x9b\xb9\x3a\x8b\xc7\x48\xdf\xa5\xca\xc0\xf6\x72\x59\xcf\x7b\xd7\x91\xb5\xdd\x25\x1f\x2c\x9f\xe6\x38\x46\xf1\xf8\x7c\xbe\x01\x09\x43\x25\x51\xa0\x3c\x1e\x11\x39\x6b\xe8\x55\xb0\xcb\xbd\x16\x9d\xb7\x39\xae\xc4\x56\x17\x1a\xed\xda\x51\x50\x15\xa2\xc0\x07\xcc\xc8\x7f\xf0\xe0\xdb\x63\x80\xba\x78\x3f\x1e\xc8\xcc\xe9\x05\xdc\x89\x81\xe5\x0a\x42\xce\x0a\x19\xba\x20\xc8\x4a\x50\x0e\x5c\xd3\x8b\x7c\x37\x7b\x8b\xeb\x58\x49\x47\x81\xf4\xdf\x2e\xa7\x58\x4d\x9e\xde\x1b\xeb\xe7\x11\xec\x71\x70\xd4\xeb\xe5\x0b\x31\x85\xa9\x02\xd3\x89\x81\x85\x9d\xd2\x72\xed\x8d\x74\x5b\x81\x9a\x83\x0f\xa2\x5d\x34\x1d\x29\xd7\xe7\xd8\x6c\x2f\x2f\xb3\x2d\x42\x5c\xfd\xe5\x60\x95\xa5\x6a\x5f\x67\xb6\x30\x10\x90\x25\xd2\xc2\x32\x01\xa4\x9c\x6a\x91\x8e\xb0\x73\xae\x21\x71\xe8\x5d\x03\x51\x8c\x9d\xa0\x8f\xe6\x38\x9f\x03\x77\x4e\x6e\x4f\x4d\xf6\xc8\x67\x6a\x89\xf9\xdf\x0a\x27\xaa\xa3\x81\x04\xec\x5b\x89\x12\xf3\x26\x08\x0f\xe1\x2a\x80\xc8\x76\x3a\xf6\x9b\x2a\x5d\x8e\xc7\xa3\xd7\x85\x15\x4d\x15\x55\x98\x1a\x01\x0a\x1a\x4f\x6d\x96\xa7\x5d\x48\x0c\xac\x49\xf5\x82\x56\x54\x40\x37\x2d\x72\xf7\x3a\x11\x2c\xce\x0e\x39\xa2\x2b\x24\x62\x23\x68\xbb\x28\x5b\x3f\xd2\x4e\x6c\x5e\x52\x27\x03\x88\x97\x1f\x05\xd9\x9f\x23\xb9\x19\xa7\xbc\x30\x2c\x36\xdb\xcf\xf3\x82\x26\xc7\x85\x19\x12\x1d\x8e\x73\xe9\xbc\x7b\xbf\x7f\xcf\x77\x08\x0a\xc6\x97\x41\x76\x7c\x52\x40\xd6\x7c\x2c\x55\x49\x59\xf6\x73\x82\x2b\x4a\x88\x47\x86\x22\x52\x9d\xda\x45\x74\x6a\x1e\x1c\xbf\xa0\x4f\xc2\x9a\x1f\xd8\xc3\x72\xf8\x78\xb7\x7f\xbe\x64\x6b\x60\xaf\xb8\xbb\x89\x3c\x5b\x3f\xbf\xfe\x5d\xfd\x4f\x99\xd0\x04\x2c\x36\xe7\x5b\x21\x51\xec\xa9\xd3\xe2\x38\xb6\x27\x97\x45\x3c\x7b\xbb\x48\xea\x96\x2e\x3f\x48\x87\x02\x01\xa4\x43\x56\xb8\x7c\x84\x9d\x36\x4b\x23\x34\x05\xa2\xca\x17\xe4\x6a\x16\xb1\xbb\x17\xe2\x45\xcd\x91\x4a\x25\x32\xde\xc0\xf2\x07\xf1\x5a\x52\x83\x6e\x75\x10\x18\x13\xcd\x70\x27\x18\x2e\x6f\x8b\x02\xd6\x46\x54\x6b\xe6\xff\x08\x65\x3d\x7a\x57\x10\xc6\xe7\xe5\x65\xeb\x5e\x2c\xd4\x1b\xeb\xd4\x3e\x39\x4c\x5d\x8e\xd9\xdb\xc2\x59\x3b\x1d\x84\x45\xc0\xb9\x63\x13\x04\x5c\x26\xd3\x5f\x2c\x00\x85\xd7\x9c\x89\xab\x98\x9b\xfa\xb0\xa8\x6c\xe7\x84\x76\x58\xe5\x4b\x62\x16\x5c\xfc\x35\xcc\x0e\x6f\x35\x7c\xfe\xbe\x60\xe5\xfb\x7c\x03\x7a\xc9\x91\xf9\xfd\x40\x9e\xb3\x8b\x85\x06\xdc\x16\x77\xa5\x8a\x23\xf7\xfb\x43\x75\x68\x8e\x7e\x9d\x14\x6c\x0b\x6e\x61\xc6\x92\xe8\x38\x5a\x4d\xc4\x56\x2c\xff\x30\x87\x1c\x33\x87\xb5\xcd\x05\x61\xe0\xa4\x05\xf9\x55\x8d\x53\xdf\x83\xe3\x0f\xb0\x10\xd3\x39\xeb\x01\xa9\xbb\x5c\xaa\x3c\x53\x8e\xd3\xb6\x60\x31\xc3\xf3\x29\x8b\x1c\xbc\x48\x86\xd0\x29\x45\x41\xed\xda\xbc\x35\x08\x0c\xcc\x73\x0f\x72\xd6\x4c\xae\xc8\xd3\x6b\x7b\x3b\x05\x71\x7a\x79\x3a\x5d\x85\xf3\xfd\xae\x73\x53\x10\xf9\x75\xe9\xa9\x72\x1c\x11\xca\xfb\x63\xa9\x7c\x5e\xbd\x2f\xd6\x7f\xc5\xd1\x37\x64\x54\x35\x33\xc1\x8d\xbc\xbd\x48\x3f\x9e\x3e\xa6\x84\xe9\x8a\x87\x79\x30\x4a\x44\x99\xf7\x4a\x80\xed\x68\x3e\x2b\x81\x2f\x99\x74\xe0\xe1\x36\x3d\x1a\x7a\x43\x4a\x89\x8b\x8d\x18\x98\x83\xff\x6d\x3e\xd7\xff\xfe\xef\x41\x48\xcb\x3a\x48\xa9\x6c\xe4\xd6\xb0\xa7\x4e\x9e\x0a\x20\xf1\x65\x63\x9b\x92\x65\x82\x5f\x63\x24\xc1\x3e\x55\x0f\xb8\xfd\x42\xea\xdd\x3c\x4a\x13\xca\x3e\x67\xd4\x7a\xcd\x88\x35\x61\x2e\xf0\x20\x85\x4d\x1c\x4d\x07\xe9\x1e\x58\xa8\x33\xa7\xbc\xc0\x29\x2d\x88\x74\xf1\x20\xcb\x0b\x41\xcb\xbd\x59\x71\x92\x2d\xba\x6c\x36\x0f\x6d\x76\x26\x33\x45\x4b\x05\xa5\x49\x64\x6c\x5c\x0a\x4d\x99\x56\xb1\x3b\x2c\x06\x75\xe7\x6e\xc9\x84\x87\x99\xc7\x90\x7b\xe6\x67\xbe\x7f\xfc\xbb\x12\x5b\x42\x85\xf2\xc9\x18\xef\x84\x6c\xc9\xcd\x43\x5f\x38\x74\x47\x2a\xcd\xe9\xa7\x9d\x19\x37\x13\x1a\x46\x51\x7f\xfd\x3c\x0e\xc6\x47\x5d\x70\xc7\x97\x3d\xf8\x3d\x1c\x7e\x0f\xac\x37\x80\xdf\x9c\xdd\x1e\xa1\x50\xbe\x4f\x25\x11\xf0\x9f\xa2\xb7\x87\xd4\xac\xcf\x5d\xd3\xb2\x31\x85\x71\x36\xff\x2e\x52\xdb\x82\x4f\xa0\x52\xee\x9b\x05\x26\xb5\x40\x1e\x55\x6a\x1c\x04\x8c\x74\x36\x1c\xa5\xb1\xe6\xfe\xc1\x20\x34\x11\xb8\x8e\xee\x56\x68\x68\x6f\x5b\x98\x89\x2c\x01\x28\x80\xf1\x78\x57\x1a\xf1\xe3\xe5\x22\x78\x86\x66\x0c\x7a\x6d\xee\xf2\x9f\x52\xbb\x80\x02\x9d\xfb\x66\xcc\xe9\xe2\x22\x38\xa3\x84\x99\x3c\x56\x83\x5f\x38\x48\xc1\x44\x11\x0e\xfb\xd5\x7d\x7f\x7f\xff\xbe\x63\x8d\x40\xcc\xc6\x8c\xf9\xe4\x48\xc6\xca\xb9\x7d\xb7\xd2\x0d\x47\xc6\xea\x83\x16\x5c\x29\xf3\x4e\x41\x9f\x99\x6f\x35\x4c\x84\xa5\x10\xca\xfa\xd8\xac\x0a\x8e\x6b\x54\xf7\x5c\xde\x27\x8d\x18\x10\x8e\x85\x33\x3e\x0f\x3a\x9f\x15\x0c\x9c\x39\x39\x89\xeb\xcb\x69\x08\xc7\x37\x24\xcb\x5f\x03\x48\x6f\xb3\x3f\x73\x03\xda\x6a\xaf\x29\x55\x7f\x15\x74\x10\x78\xd3\xdf\x2d\xac\x3a\x4a\xbd\x20\x9a\xe4\x89\x17\x87\xe0\x68\x3a\x8b\xbb\x5f\x78\xff\x2c\xaa\xab\x33\x33\x20\x88\x94\x4c\x9d\x9a\xa9\xa6\xb7\xbf\x2c\x84\x81\x84\x53\xf3\x4b\xc3\xb6\x09\x43\x9c\xed\x06\x61\x42\x73\x7e\x35\x1c\x8f\x25\x3f\x29\xbc\x27\x48\x3c\x88\xfa\x92\x64\xbe\xf9\x77\xa5\xd1\x37\x45\x44\x45\x58\xd8\x17\xfa\x35\x33\x1a\x0f\x11\x1c\xc4\x57\xa7\x8a\x66\xe8\xf9\x6b\xfe\x1f\x2c\xb3\xfa\x8f\xff\x0f\xef\xfe\xd5\x91\xac\xa9\x99\xa8\x52\x13\xba\xd1\x65\x35\xe7\x7f\x7c\xfb\x77\xc5\xa4\xf6\xa5\xf8\x72\xca\xa3\xcf\x41\xcc\x00\xf9\x92\x49\x0b\x36\x9b\x07\x93\x5a\xc1\x33\xfd\xbb\x62\xe3\x5e\xaf\x10\xa5\x76\xa8\x51\x45\xd0\xa6\x2f\xb2\x49\x2a\x1c\xa4\x11\x79\x25\x98\x96\x3e\x6c\x2c\xd9\x15\xbf\x3c\x15\x36\xe0\x57\xc1\x12\x12\xe2\xcd\x1a\x03\xdd\x65\x52\x65\x01\x02\xe3\x77\xfa\x56\x1a\x31\xb0\xc3\x3c\x3b\xfe\xb6\x15\x32\x9f\xbb\x22\xca\xa8\x64\xa8\x89\x2a\x15\x68\x1f\x1e\xa1\xe6\x2e\x8b\xb1\x9c\xe9\xde\xbc\xf0\x74\xfc\x0b\x4f\xc6\x70\xf6\x37\x24\xd3\xb4\x38\x6c\x22\x25\x38\x32\xba\x9a\xf9\xe3\xce\x5b\xab\xbd\xb9\x16\x7f\x81\xbe\xab\x45\xc4\x19\x90\x18\xcf\x25\x73\x52\xdc\x25\x9f\xc1\x3f\x09\x1e\x11\xd6\xfb\xe4\xc4\x1e\xca\x3c\xb0\x9b\x09\x04\x72\xdb\xcf\xc8\xa1\x21\xc5\xde\xbc\x10\xd3\x69\x54\x04\x80\x86\x7e\xfa\x73\xa5\xf1\x05\x05\x5d\xe6\x38\xd9\x39\x5b\x43\x5b\x08\xaa\x44\x3e\x6b\x4e\x41\xb5\x87\x41\xd8\x34\x11\xfc\x9a\x99\x0f\xa4\xf9\x33\xb7\xb9\xe7\xca\xbc\xba\xc5\x1a\x4f\x9d\x2d\xa2\x12\x1d\x63\x53\x38\xd9\x6a\xd1\xa2\x7b\xe2\x83\xca\xb6\xb5\x6b\x51\x9f\x91\x64\x9e\xdc\xad\xaf\xdc\x39\x17\xd8\x29\xb0\x39\x9e\xcf\xdb\x5f\x4a\xe2\xc1\xf3\x22\xac\xaa\x2c\x8f\x75\x28\x3c\x1f\x9b\x88\x6e\xbc\xc6\x7e\x26\xf8\x54\x33\xce\xec\xb6\xa9\xba\xdb\x2e\xf6\xda\x06\x54\x57\xb9\x39\x1a\x7e\xd4\x93\x67\xa7\x8f\x0f\x76\xf3\x21\x55\x26\x22\x42\xdb\x34\xa6\x18\xbc\x86\x26\xd6\xbd\xe4\x03\x5e\xd9\x6a\xbc\xee\x13\x46\x4b\x56\x64\x69\xf0\x67\xe2\x54\x26\x2e\xfa\x3c\x08\x6c\x84\xb0\x57\x79\x22\xba\xca\xbb\xd3\x2e\x05\xd5\xd4\xf4\xca\x25\x2e\xa3\xc6\x48\x78\x4e\xf1\xc4\xac\x13\x0a\xc7\x28\x4f\x1c\x68\x33\x0e\x1f\xc7\xcf\x77\x82\x53\x93\x1d\x51\x98\x4b\x8e\x59\x60\xa6\xb9\x8c\x19\x0b\x02\xff\x76\x9c\x7b\xa3\x92\x85\x0a\x52\xb2\x63\x60\x40\x3c\xe8\x14\xab\xc9\x23\x2f\xb8\x84\xe5\xd8\x1e\x9b\xf7\x99\x75\xe9\x2b\x47\x7f\x99\x3e\x26\xee\xed\x71\x37\xb5\x88\xb2\x5f\xa1\x1a\x74\x6a\xc4\xbc\x2f\x8c\xbb\xd6\x5e\x69\x1d\x51\xf0\xa3\x60\x17\x8e\xf5\xbb\xbf\xcb\xe1\x35\xb7\xfa\x96\x21\x7f\xec\x09\xec\xf3\x99\xcb\x89\x71\xc1\x42\x98\x74\xaa\x95\x98\x5b\xb2\x0b\xb3\x6a\xde\xc5\x4e\x2e\xc9\x49\x8c\x67\x67\x01\x51\x0e\x47\xc8\x6d\xed\x03\x53\xe1\xc1\x79\x6e\x13\x9e\xc3\x7a\x5f\xbe\x45\x49\x2b\x0a\x7a\x8d\x5c\xa5\x57\x30\x0c\x62\xa5\xea\x4a\xab\x60\xcb\xf2\xad\xf7\xac\xd3\x71\x65\x5d\x77\x2e\x14\xc1\x4b\x10\x41\x47\x5d\x66\x23\x79\x58\x44\x4f\xfc\x51\xa8\x86\xa3\x18\x0f\x2f\x79\x7a\x30\x7f\x9f\x34\x99\xea\xf8\xe3\xdf\xf6\xe0\xfe\x90\x0e\xf9\x38\x7e\x79\x34\xed\x8f\xde\xfc\x1b\x52\xe4\x3d\x6e\x03\x79\x34\xa6\x6e\x66\x2b\xe4\x10\x9e\x61\x51\x30\xba\x48\x95\x43\xbf\xc1\xd5\x2f\xa3\x52\x5c\x75\xab\xcf\xdb\xeb\xb2\x7c\xe0\x11\xa0\x2b\x50\x8d\x5b\x69\x9a\xbf\xba\x7e\x47\x78\xfc\x89\x4d\x71\x9d\x53\x16\xb3\x0d\xac\x2d\x95\x29\xd3\x60\x27\x06\x02\x9a\x74\x7a\xd0\x09\x55\xd3\xb6\x0f\xcc\x62\x2e\x60\x63\x31\xad\x19\x70\x7d\xaa\xeb\x4e\x4a\xc7\x5c\xe9\xc0\x99\x78\xb0\xf8\x7f\x31\x9b\x3d\x26\x42\x55\x91\x36\xf1\x28\x29\x15\xe2\x6a\x27\x06\x9a\x84\x7e\x10\x19\xcc\xd5\xaf\x8d\xaf\xa0\xfe\xaf\xe0\x7b\xfa\x1a\x3e\xef\x4d\x99\x68\x37\x0b\x2d\x2f\x24\x04\x4a\xe2\x15\x0b\xe1\x1c\x03\x66\x02\x45\x57\x57\xcb\x3a\x96\xc1\x21\x8b\x2a\x36\x66\x4d\x61\xf9\x9c\xc3\x38\x30\xb8\x09\xbb\xad\x8a\x9f\xef\xcf\xcf\xba\x13\x65\x4a\xf3\xb7\x8a\xde\x5b\xc5\x79\x8b\x9e\x7f\x27\x09\xb4\xc6\x4e\xb6\xd3\x1a\x5a\xb6\xcb\xcf\xb2\xc9\x1c\x31\xd6\x01\x7e\xb9\xbd\x06\x81\x9b\xdb\x11\xca\x2c\x54\xbb\x40\xc2\x4e\x33\xd3\xd1\x4d\xde\x1b\x72\x1b\x38\x12\x57\x74\xf5\xf9\x35\xb6\xa3\x07\xbe\x1b\xe1\x65\x9f\x9e\x29\x30\x1e\xb5\x95\x84\x9b\x57\x06\x8b\x80\x58\xf9\x51\x91\x59\x05\xa7\xcd\xa9\x29\xa9\x90\xc0\x8b\x58\x01\xeb\x34\xc8\xaf\x0c\x65\x78\xf5\x2c\x5c\x1b\x26\xb4\xf8\x0b\x1d\xea\x04\x67\x36\x3e\xd5\x6e\x0e\xcc\x17\x6d\xc8\x13\x4e\x3c\x08\x3e\x8e\xd4\x37\xa5\x69\x6f\x59\x5e\xad\xcc\xad\x5b\x1f\x64\x32\x4b\x73\xfb\x5f\x8f\xcb\x56\x48\x4d\x83\x29\xb9\x07\xf9\x65\x5a\x67\x8c\x42\x55\xd0\x19\x39\x14\xb6\x95\x41\xca\x16\xe3\xaa\xd0\xef\xf7\xcc\x55\x47\xef\x2c\x5e\x71\x71\xa8\x36\xba\x63\x92\xf8\x6f\x3c\xd7\x5c\xf8\x20\x87\x91\x3d\x09\x9e\xdf\xa3\xbb\x83\x91\xa4\x38\x4f\x51\xe7\x29\xe6\xdb\x8e\xa2\x9d\xb3\x73\xd3\x77\x7b\xbc\xba\x42\x3d\x42\xc6\x21\x71\x20\xaf\x1f\xbd\xaa\x38\x1d\x28\x16\x15\x4a\xa7\xc7\xf3\x41\x6c\xa0\x8f\x39\x66\xb2\x3f\x09\x3f\xe0\xa3\xd8\xd9\x79\xe6\x33\x18\x09\xca\xb6\x37\xf8\xfc\x91\x46\x2b\x83\x51\xff\x7a\x24\xeb\x02\xbb\x31\x85\xaf\xc6\x2c\xaf\x8c\xd1\xf9\xf0\x66\x6d\x32\x8f\x9e\x5e\xcc\x31\xad\x73\x9f\x8c\x85\x9f\x53\x52\xe8\x0e\x89\xc0\x0c\x1e\xa8\x92\x66\xd3\x4e\xee\x63\x64\xe5\xaa\x8d\xf0\xad\xcd\x68\xf1\xff\xff\x82\x41\x10\x3a\xa0\xfa\x1e\xc6\x0e\x82\x8a\x14\x2b\x4e\x1d\xa7\x72\xb1\x38\x1d\x5e\x93\xe5\x50\x85\x54\x79\xe7\xa1\x55\x72\x18\xb7\x88\xa8\x38\x83\x88\x3c\x0b\xb3\xb9\x85\x38\x72\xc7\x42\x43\xed\x59\x53\x62\x4a\x9e\xa9\x7b\xc2\xa6\x3e\xfe\x36\x00\x41\x11\x83\x2b\x0b\x62\x18\xc7\xb8\x14\x17\xe8\xde\xed\x65\x6c\x4d\x7c\x45\x24\x59\x66\xfc\x73\x1a\x44\xa5\x49\x35\x75\x99\x5d\xcf\xfa\x10\x5c\x60\x5e\x2a\xc0\x5d\xd4\xa3\x0f\xba\x71\xaa\xce\x40\x0d\x78\xce\x9f\x44\xb8\x1c\x7b\x8c\xc5\xf7\xc9\xc1\xf5\x50\x40\xfc\xaf\xe1\x02\xfb\x82\x5e\x8f\x1d\x83\xbb\xb3\x38\x53\x42\x1b\x46\x0e\x12\x06\x3d\xf4\x58\xba\xa7\x46\x02\x34\xc5\x38\x4f\x7a\x60\x78\x2e\x69\x66\x1d\x80\x49\x6c\x7f\xea\xf8\xeb\xdf\x94\x47\x56\x22\x6f\x7f\xb9\x88\x75\x13\xfb\xbc\x13\xc8\xcd\x3c\xdc\x8b\xf0\xa9\xa2\x95\x9c\x77\x4e\xc1\xd2\x60\xc8\xd9\x01\x45\x43\xe1\x12\xff\x60\x19\xcb\xdb\xe3\xee\x84\x05\xd5\xb1\xa1\xcb\xf1\x27\x63\xee\xe2\x31\xac\xef\x82\xba\x80\xcb\x69\x5f\x0b\x5f\x80\x85\xad\xaa\x15\x8f\xc5\xec\x30\x06\xac\xd0\xc2\xc5\x33\x63\x2e\x1a\xea\xb9\xe3\x43\xa3\xe4\xdd\xf9\xd5\x08\x28\x9f\x0b\x0a\x49\x70\x0b\x1e\xff\xd2\x96\xd0\x78\x0e\x4e\xa4\xf2\x1a\x64\x0a\x7d\x4a\x11\x10\x4d\xf2\xfd\x39\xca\x0f\x7d\xd8\x47\xec\x3b\xc7\x49\x82\x13\x11\xd9\x25\x24\x75\x87\x5d\xb2\xe8\xf3\xbc\xc8\x5b\x6a\xeb\x46\x7e\xa9\x70\xe2\xd4\x7d\x4f\x0a\xe0\x1d\x40\xeb\x4c\x2f\x6a\xa0\x7b\xe7\x2e\x8e\x86\x13\x7b\x79\x56\x0c\xa3\xd7\xd8\x25\xc2\x1f\x39\xdc\x17\xdb\x9e\x39\x8f\x96\xbc\xd9\x30\x92\x9c\x1f\x7e\xd0\xbe\x0b\x28\x0c\x13\x81\x8d\x37\xb7\x20\x32\xb4\xf7\xcf\x90\xa5\x34\xdd\xff\xc4\x4d\x0e\xc3\x8d\x9b\x76\x4d\x6b\xc9\x40\x3c\xd4\x1e\x73\xf8\xfd\x79\xe7\x59\xda\xb7\x04\x5c\xe3\xd3\x47\x91\x81\x8a\xc2\x3b\xe7\x27\xe1\xc8\x5e\x14\xf4\x43\xa1\xe9\x58\xc7\x50\x46\xd4\x83\x7d\x9b\xc1\x85\x99\x4e\xfa\xad\x7e\x95\xa0\x45\xc7\xe4\x24\xaa\xc7\x73\xa6\x06\x37\xaf\x0c\xc9\x9d\x79\x4b\x80\xb9\x01\xa6\x25\x9e\x1f\x87\x2e\x10\x08\xbc\x9b\xed\x62\x1b\x6f\x30\x67\x89\x05\xd3\x8e\x10\xa2\x13\x86\x4c\x12\x43\x84\xa9\xba\x7c\x38\x65\xcf\x9d\x57\xe2\x2f\xf7\x9f\x6f\x47\x6c\x22\x10\xf5\xcc\x66\xd5\xb4\x12\x91\x58\x56\x1f\x4e\x85\xc6\x45\x73\xa0\xc8\x53\x94\xef\x9a\x17\xd0\xc4\x52\x62\xe4\x7c\x8f\xf5\xa5\xc5\xd8\x6c\x22\x94\xab\x2d\xe0\x17\xb5\x12\x9a\xaa\xcd\x58\xc8\x16\x80\x03\xd6\xaf\xeb\x7f\xf9\x17\xd6\xd3\x0c\x39\xd1\x13\x16\x30\xa9\xe4\x92\x97\x91\xb5\x54\xf6\xc0\x7f\x1c\x09\xcd\x32\xc5\x39\xd1\x45\xf3\xfa\xa2\xdc\x61\x4d\x06\x05\xcf\x4f\xe4\x71\x05\x49\x8b\x1d\xfb\x2c\x39\x7f\xf1\x85\x09\x1a\x71\x78\x13\x62\xa9\xb1\xf0\x13\x52\xfc\xdc\x38\xed\xff\x8e\x9e\x5a\x9f\xc0\x86\x68\xab\x0f\x17\xea\x2f\xb3\xe1\xf0\x5d\xc3\x6b\xee\x99\x33\x59\x57\xff\xa3\x79\xfd\xac\xbe\x62\x86\x39\xa5\xbb\x25\x74\xce\x49\x6b\xc8\x93\x7a\x13\x9d\xd6\xfc\xd0\x28\x4c\x30\xc7\x20\xff\xf4\xe2\x31\x98\x32\x55\x42\xed\x04\x04\x5a\x77\xf4\x19\xfb\x64\x0f\x91\xb5\x62\xde\x9d\x5f\x6a\x6c\x05\x06\x70\xe7\x99\x65\xa3\xcb\xe5\xc5\x67\xfe\xf7\x08\x4d\xbc\x39\x31\xf3\x88\xe0\xde\x9c\x40\xb8\xd6\x1f\x5f\x60\xbd\xd4\x1c\x1c\xb8\xc7\xaf\x59\x06\x22\x2a\x86\xa2\x08\x00\x60\xac\x7b\xfd\x64\x4c\x03\x1f\x11\x4b\x7f\xc9\xc3\x05\xcf\x5c\x4a\x03\x06\xa8\x33\x28\xf3\xfb\x36\x25\xd2\xbd\xaf\x9b\x36\xe0\xec\x72\xa5\x2d\x38\x02\xfe\xe2\x35\x38\x92\x64\x61\x18\x9c\xef\xca\x47\xbc\x16\xa0\x37\x3d\x5f\x0d\x49\x87\x53\xb4\x7d\x3d\x04\xa8\x19\x7d\xee\x2c\x95\xc9\x90\xe1\x10\xbb\x5d\x56\x77\x86\x5f\xba\xd0\x29\x8d\x1d\x84\x56\x23\x6f\x26\x8d\x3f\x1a\x1d\x81\x36\x31\x67\x80\xd3\x4a\x91\xfd\x25\x1f\xf5\xc0\x76\xfa\x47\x78\xb0\x0f\x7e\x56\xe4\xef\x4c\x01\x14\xcf\x42\x7f\x25\xce\x4a\x4c\xad\x42\x5d\x30\x9d\x4e\x61\xd2\x48\x5d\x71\x8f\x0d\x25\xa9\x75\xce\x6b\x9c\x7b\xfa\x30\xde\x33\x4a\x74\x77\xb4\xd3\xce\xd2\x4b\x78\x66\x61\x62\x54\xf0\x57\x33\x7b\xf7\x98\x57\x7a\x2d\x65\x18\x74\x18\x0b\x2f\xba\x60\xd8\xa6\xe5\xa9\x5f\xed\x99\x51\xe0\xf8\x14\x59\x5d\xec\x44\xf9\xde\x9a\xbe\xe5\xb4\xf0\xa4\x79\x35\x1c\x42\xa4\xce\x1b\xa7\xc4\x77\x11\x7c\x80\x6e\xf3\x55\x7a\xcc\x4b\xeb\x7b\xe2\xdd\xd7\x50\x9b\xf3\x52\x88\xe5\xec\xd1\xdc\x73\x04\x9f\x53\xfc\xf8\x2b\xf6\xa1\xf4\x72\x37\x65\xc0\x9c\xb9\x57\x0a\xf6\x90\x5c\x85\xde\xda\x91\x03\x9e\x5e\xed\xc7\x28\x0e\x51\x61\x3f\x88\xf7\x34\x2d\x63\xc6\x1b\xad\x24\xde\x96\xc7\x7e\x78\x9f\x0a\x59\x83\xc0\x93\x63\x93\xa1\xf6\x63\xf1\xd4\xd6\x79\x28\xfc\x2b\x28\x15\xa9\x78\x82\xd9\x6f\x34\xfe\xa5\xe0\x34\xfa\x4b\xd2\x0b\x01\x8d\x67\x9c\x9f\x1d\x9f\xec\xad\x9b\xea\x90\x0c\xa4\x1c\x40\xb3\xf7\x4a\x79\xb4\x10\x07\x08\xa4\xa5\xb0\xbf\xa0\xaa\xc4\xbe\x6f\x55\x08\xdb\x32\x17\xb2\x5d\xd2\x49\x24\xa4\x3e\x52\x33\x70\x54\xe9\x6b\xd4\xe0\x1f\x19\x98\xf7\xc3\x7d\xbc\xbf\x7d\x13\xc5\xe3\x6c\x4e\xc0\x3a\xc3\x02\x72\x35\x9d\xb7\x89\xab\xb9\x06\xc4\x73\x6d\x68\xd9\x1a\x3e\x3e\x54\xf3\xaf\xf3\xed\x86\x1b\xf0\x0a\x1b\x07\xa5\xb8\x43\xa9\x8a\x94\x07\x85\x1e\x00\x54\x0c\x15\x39\x68\x60\x18\x0a\x91\x45\x7a\x61\x85\xd5\x49\x05\x6d\xcc\x71\x26\x4c\xcd\x94\x0d\x5d\xcd\xe5\x42\x32\xd4\x74\x00\x7d\x59\xaf\x98\x0f\x8a\x13\x41\x32\x97\x4a\xa3\xd3\x96\x23\x07\xdb\x72\x48\x20\x3d\x0c\x0d\xce\x03\xe5\x17\x1e\xc4\x93\x39\x60\x20\xfe\xd4\x70\x44\x17\xb7\x25\x13\x99\x89\xde\x42\x9c\x09\xfa\x9d\xd3\xc4\x97\xd7\x72\xb7\x00\x0f\xa1\x2b\x58\x02\x05\x80\x4c\xf9\x08\x6c\x65\x0c\x33\xcb\x80\x7d\x1f\xf1\xa2\xd7\x76\x41\xa6\xca\x3b\x84\x54\xfe\x34\x13\xaf\x46\xac\xb4\x6c\x35\xeb\xe0\x19\x23\x56\xa9\xd5\x1b\xb5\x32\xfe\x15\x44\x09\x54\x2d\x18\xaf\xbc\x2a\xa3\xf4\xd7\xbf\x16\x9a\xfd\x3f\xfc\x06\x90\x7f\x53\x43\x10\x90\x10\x39\xac\x65\x8a\xa3\xed\x3b\x8a\x42\xe5\x48\x4c\xf1\xbe\x11\x88\x92\xeb\xf6\x41\x98\x6b\xdc\x97\x78\x21\xc3\xec\x38\x92\xbd\xab\x39\xff\xde\xee\x9f\xc8\x0e\xd8\x76\x2a\x3c\x40\x8f\x3c\x60\xf2\xa6\x9d\xd7\x1b\x22\x80\x1b\xc3\x5d\xc7\x31\x8d\x0a\x22\xa2\x26\x73\x4f\x0a\x85\x93\x26\xad\x01\x28\xba\x11\x6a\xf8\x94\x0d\x7d\x3f\x1c\x58\xbd\xf0\x80\x4c\x82\x84\xee\x1e\x66\x9f\x26\x75\x58\xad\x79\x1f\x34\x43\xc2\x99\x28\x60\x96\x2f\x8b\xda\x6d\xe0\x1a\xb3\x24\x50\x98\x1c\x40\xbf\x06\xbb\xa3\xb8\x62\x07\xcd\xe1\x29\x29\x1f\x1a\x68\x0e\xf1\x0e\xc7\x4a\x59\x02\x6a\x13\xf3\xdb\xf7\xff\x54\x03\xfc\x51\xed\xc8\x30\x65\x02\xbd\x7c\xc3\x99\x40\x3d\x25\xef\x0f\x02\x34\x17\xfe\xf0\x59\x55\xc6\x7d\xe0\xb4\xc9\xab\x85\x3e\x8f\x85\xf9\xc5\x7d\xd6\x54\xdc\x51\x96\xcb\x87\x1a\x99\x2e\x24\x88\x60\x57\xf3\x89\x99\x95\xa0\x6e\x01\x2f\xc0\x30\x26\x9c\xb2\x73\xda\xb2\x5b\x2c\xd7\x1a\x22\x99\x0b\x28\xc0\x3b\x16\x10\x30\x3b\x21\xcf\x8d\xcc\x76\x7d\x34\x95\xca\xa4\x6a\xde\xc9\xc5\x6e\x31\xdc\xa4\x12\x6d\xfc\xab\x49\x38\xfe\x89\x09\x2d\x67\x67\xe4\x2a\x61\x28\x15\x2e\xc1\x3b\x45\x89\x73\xf6\x66\x95\x54\x3a\x46\xc8\xc7\xfd\x41\x76\x6f\x80\x5c\x5f\xec\xe7\x68\x07\x87\x78\x14\xed\xb1\x2a\x6b\x87\xfc\x7f\xd1\xa5\x7a\x34\xec\x1d\xab\x2d\x83\xa7\x0d\x71\x78\xd7\x9a\xa0\xc6\xf3\x4e\xf0\xe1\x18\x5b\x62\xf0\x1c\x97\xc2\xb1\x20\x62\xa4\x83\xfb\x81\x38\x5f\x24\x76\x70\x44\xde\x90\x73\xf2\xf4\x2b\x7b\x4e\x46\xc4\x5d\xdf\x9f\xfe\x6d\x0f\x3e\x7f\xfc\x1b\xc7\x1b\x5e\x4c\x45\x17\x97\x30\xd7\x36\xe5\x1e\x9e\xf4\x3e\x3b\x2b\x0a\xcc\xaf\x1d\x90\x8a\x7e\x80\x8a\xc9\x9a\xbd\xcc\xa8\xc4\xd3\xc7\x3c\x70\xe9\x72\x01\x58\xc2\x01\x44\x74\xb3\x1e\x1b\x13\x21\xf7\x46\xf5\xda\xb4\x68\x0a\x9a\xad\x39\xb1\xe7\x5e\x82\xd6\x9d\xbc\x26\x72\x1d\x5e\xa4\x79\xb5\xf7\x3b\x09\xb1\x50\xcb\xe4\x7a\xbb\x1c\x51\xa9\xc8\x7d\x02\x3e\x85\x91\xc2\x50\x8f\x1e\x54\x16\xa8\x9c\x3a\xac\xcc\xc1\x9d\x34\xab\xa4\x0c\x6d\x9a\x17\x36\xf5\xdb\xaa\x6f\x8f\x99\x55\x42\x1f\x89\x43\x18\x92\xc5\x07\x1c\xba\x32\xb8\xb5\x3a\xe8\x01\x89\x03\x96\x02\xcb\x3d\x90\x9f\xfc\x70\x7c\x11\xb1\x9a\x73\x51\xf0\x97\x66\x3f\x40\x7f\xe4\xee\xb9\x52\xc8\xa7\xcc\xb6\xe9\x36\xb7\xec\xa5\x54\x7b\xba\x27\xe2\x46\x32\x91\x82\xca\x33\xeb\x34\x0b\xa2\x5e\xca\xc1\xce\x2c\x47\x86\x2c\xa9\x40\xb0\x3f\xb0\xb2\x30\x94\xa1\xcd\x73\x3c\x81\xc8\x28\xb6\xbb\x90\x08\x85\x55\xdb\x8c\x7d\xaf\x46\x7c\x73\x4e\x38\xa2\x8d\x93\x12\x28\xf9\x53\x49\x90\xb1\x3f\xbf\x26\x82\x7f\x6a\xc5\xd1\x7a\x7d\xa1\xd2\xae\xa6\x0e\x90\x23\x99\x30\x88\x8b\xf2\x8f\xb2\xc0\xcf\xb7\xfd\xe3\xff\xb3\x5c\x04\xbf\x73\xdd\x57\xfa\x84\x1c\x9f\xc4\xfe\x7e\x2f\xf5\x95\x56\x21\xf6\x04\xf8\x70\x7c\xc6\x19\xe6\xab\x98\xb5\xb9\xe8\x48\x68\x92\xa1\x3f\x0c\xfa\x29\x85\xbf\xe5\x22\x24\xe7\x28\x5f\xd0\x55\xa0\x62\x6c\xf9\xb0\x23\x26\x0e\x2b\x9f\xaa\x0c\x60\x0e\x6d\x19\x56\x89\x14\x17\x1f\x10\x00\xe0\xc3\xbe\x59\xc5\xc0\x4c\xed\x8a\x58\x5a\x69\xa3\xef\x9f\x5f\x92\x73\xfc\x8d\x7b\x6a\x2c\xac\x0c\xfc\x00\x33\xb8\x9d\x46\x26\xaf\x1a\x26\xf3\x97\x6a\xe4\xa6\x5a\xa8\x4d\xb1\xca\x6a\x60\xfe\x63\x2c\x45\x25\x6c\xc3\x6d\xef\xfb\x0b\x03\xf0\xf7\xc8\xdc\x15\xfa\x99\x0e\x0d\x92\xc1\xcb\x52\x97\x6b\x43\xd1\x9c\xcc\xfc\xe3\x0a\xbc\xc6\x83\x49\xec\x41\x49\x21\x87\x63\x31\xa1\xe5\x09\x1c\xf1\x69\x4a\x03\x79\xe8\x83\xfa\xe6\x25\xdd\x84\x5a\x9b\xfe\x66\xa4\xcd\xf4\x14\x50\x3b\xf9\x40\x0c\xff\x0d\x96\x1b\xcf\x87\x31\x21\x6e\x27\xf3\xc5\xc6\xb7\xb4\xa8\xff\x39\xa5\x71\xc5\xa2\x13\x69\xb7\xc0\xfe\x09\xe3\xee\x95\x6d\x01\xf7\x5f\xe8\x1b\xdd\x88\x6d\x63\x24\x01\x46\x28\xed\x6b\x2a\x2f\xf9\x1e\xd0\x42\x15\xf8\x7a\xd8\x6e\xb9\x70\x44\x4e\x6a\x08\x39\x85\x65\x64\xf0\xea\x24\x9a\x82\x8f\xf8\x40\xfb\x95\xde\xe1\xea\xc9\x11\xad\xff\x2a\x59\x38\xc2\x0f\x77\xe3\x75\x49\xa2\x22\xf4\x12\x4b\x05\x7f\xba\xc1\x79\xc5\xe0\xa5\xb5\x3c\xf8\x2b\xfd\xe3\xdc\xbc\x40\x00\x69\x75\x42\x37\x8a\xa3\x5a\x0b\x79\x4a\xe8\x70\xf8\x68\x81\x32\x5e\x80\x1c\x17\x35\x26\xc4\x32\xd9\xeb\x9c\xd7\x78\xea\xf2\x22\x9b\x61\xf0\xbd\x13\x50\xe0\xc9\x52\x55\x53\x00\xe4\x54\x5b\x80\x39\x79\x9c\x28\x65\xb1\x16\x8a\x44\x83\x27\x60\xe9\x53\xed\xec\x99\x07\x4d\xa0\x58\xda\x6a\x21\xfd\xc6\x70\xbf\x59\x34\x86\xe3\xa1\x49\x49\x8e\x95\x53\x5b\xe5\x32\xae\x5b\x69\x60\x34\x4f\x93\x93\x37\x2c\xc0\x23\x0a\xa3\x2e\x94\xee\x41\x3c\x59\xc1\x6b\xbd\x28\xea\x7c\xbe\x33\x00\xfe\x10\x01\x72\x99\xfa\xe4\xad\x97\x87\x9f\x77\x34\x3b\x0e\x8f\x32\xef\x98\x9d\x9c\x08\xa9\xbc\x6f\xa1\x30\x79\xfb\xa8\x73\x6c\x74\x66\x93\x58\xee\xcb\x8c\x84\xd0\xd4\x51\x33\x8b\xdb\xbf\x09\x74\x8f\x92\xec\xd2\x78\x4f\x8b\x50\xa7\xd0\xb1\xa1\x3b\xf3\x14\xfa\xc9\xe1\x64\xb8\xc5\xb5\x09\xb3\x37\xa1\xa0\x60\x27\x0b\x8b\x37\xed\x6e\x4c\x85\x62\xcd\xdd\x12\x02\x8d\xe6\x35\x0d\x62\x13\xf4\x1e\x57\x26\x8a\x27\x5f\x54\xc6\xb9\x20\xf2\x84\x00\xfc\xb9\xfb\xc5\xe7\x83\x29\x63\x77\xbe\xb9\xa4\xf4\x4a\xd7\xd2\x5d\xed\x98\x99\x64\xbe\x11\xb6\xc6\xb7\xb4\x26\x04\xcd\x49\x4a\x61\x80\x89\xf0\xac\x48\xcd\x92\xef\xac\xb3\xa1\x7b\xe0\xa0\xc1\xca\x8b\xcf\x02\xe6\x31\xe9\x3a\xec\x86\x29\xa5\x82\x47\x2a\x45\xf1\x7a\xf9\x7d\x7b\x5b\x08\x48\xaa\x4d\x3d\xd2\x4b\xf7\xc9\xc6\x37\x0e\xf9\x21\xbd\x1d\x8b\x8e\xe4\x28\x00\xa2\x42\x0b\x5c\xfa\x11\x9b\x51\x33\x99\x9c\x2d\xa3\x02\xeb\x4f\x27\x1b\xb3\xf9\x0c\x7a\x5a\x7c\x8b\xa3\x44\xfa\x1d\x42\xe0\x94\x00\x8b\x5a\x03\xb7\xb4\xd1\xdb\xb7\x0e\xa8\x40\x84\xba\xa8\x27\xb2\x2e\xce\x63\x1c\x7c\x0a\x37\xac\xe3\x25\x15\xee\x81\x5b\x7a\x0a\xca\xc8\xa9\x9c\xd8\x37\xcf\xd6\x2b\x0c\x33\x11\xef\x55\x25\x3a\x7e\xfe\xbc\xf9\x7f\x54\x4b\x65\x54\x8d\xf7\x02\x91\x6d\xd1\x2f\x6e\x56\xbe\x71\x09\x37\x56\x7d\x5e\x1d\x18\xb1\x26\xe1\x5f\xba\xcf\x4c\x10\x7b\x77\x09\xcf\x53\xff\x90\xbf\x43\x80\x93\x2f\xff\x46\xee\x1d\xc7\x82\xc8\xd4\x30\xd4\x15\x9a\xbe\x74\xfd\xba\x0a\xc1\x0c\x16\xff\x9b\xaf\x1f\xff\x86\x1e\x63\x63\xb3\xd9\x74\xb5\x69\x64\x44\x50\x07\x3d\x3e\x83\xb9\xd9\x8c\x39\xa9\xea\xd6\x18\x3a\x52\x1f\x65\xce\x24\x1c\x34\x56\xcc\x51\x63\x70\xa8\x6c\x3f\xcc\x83\x46\xf7\xc1\x35\xec\xf7\x9e\x07\x2a\x34\xa9\xd5\xd8\x1b\x93\x25\x10\x70\x3c\x50\x54\x83\x8d\xcb\xf9\xa9\x5e\x25\x07\x68\x36\x1c\x06\x07\xfc\x8c\x63\x74\xd4\x71\x37\x8a\x77\xf0\xc0\xbc\x06\x56\xd6\x8c\x17\xae\xa2\xb6\x33\x51\xef\x82\xa6\x7b\xbc\x06\x61\x74\x80\x26\x51\x68\xe6\xb1\xdd\x4a\x82\x72\xbc\xbd\xc3\x3b\xc5\x8c\xdf\x9a\x3b\x40\x37\xc4\xc7\x56\xac\x65\x34\x1b\x51\xe5\x6e\x0d\xe9\xe8\xfe\x87\x86\xef\x52\xe6\xe8\xed\x1b\xec\x15\xc6\x51\x95\xa1\x7a\xde\x7e\x48\xa0\xc9\xe0\xd8\x9a\x49\x55\xeb\x8b\x5c\x05\x81\x4d\x9d\x4c\x8c\xf8\xcd\xf3\xee\xd4\xd6\x38\x72\x49\x30\xe6\xd1\xd9\x90\xee\x74\x1f\x3c\x67\x88\xc4\xb6\x0f\x29\x45\xf9\x4f\x59\xf4\x8d\x07\xb2\x0e\x8b\xda\x72\xd5\xd4\xe9\x9a\xcb\x8c\x3c\xb0\x8e\x4e\xc6\x8b\x85\x72\xd0\x08\xbd\x89\x56\x31\x3f\xf3\xcc\x42\x65\x71\x8c\x9d\x1b\xb7\xb6\xc4\x66\x76\x05\xd0\x03\x5f\xbf\xc8\xce\x7f\x3b\x41\x05\x10\xfc\xb7\xe5\x98\xbe\x7b\x40\x0e\xdf\x3f\x8f\x1f\x44\x51\x48\xdb\xbb\xf6\xe4\x9f\x9d\x92\x32\xa4\xe6\x20\x6b\xe2\x29\x58\x7e\x57\x54\xd9\x9d\x1a\x16\x8e\xf0\xc9\xce\xe9\xc0\x62\xd2\xc9\x01\x06\xc8\x87\x05\xed\xc1\x49\x70\x99\x35\xf8\x25\xe2\x81\x50\x03\x66\x2c\x80\x04\xe7\x43\x4d\xb5\x6f\xd3\xb5\xac\x19\xc7\xc4\x38\x40\x46\xfd\x45\x0e\xfb\x67\x10\x18\x27\xe0\x61\xcd\x2f\xa0\x6b\xa0\x41\xea\xd5\xff\x14\x9a\x16\x62\x67\xa4\xb3\x4a\x70\x3b\x05\x6f\xf1\x40\x48\xf1\x9f\xbc\xd6\xb2\x13\x80\x53\xef\x6d\x98\xe3\x8b\xa0\x9f\x70\x2d\x53\x0f\x79\xc7\x09\x27\xbd\x1d\xb5\xb4\xa9\x95\xa2\x3f\x0a\xed\x5b\x6f\x2e\x44\xaf\x0c\x98\x1b\x6e\x3c\xeb\x50\xb1\xed\x32\x91\x38\x0d\xf5\x69\xfb\x41\x6b\xdd\x69\x2c\x93\x4b\x3a\x93\x35\xcf\xf0\x8f\x2c\x49\x98\xef\x0d\x17\xf7\xed\xed\x0d\x49\x4f\x0c\x4b\x81\xd0\xc6\x65\xa6\xd0\xac\x23\x3d\x69\x53\xae\xb7\x42\xd5\x9c\xcc\x33\x21\x57\x7b\xee\xe5\xa4\xd6\x59\x63\x03\x4c\xc8\xd8\x29\x83\x70\xde\x4f\xc5\xe1\x8d\x85\x0c\x0b\x59\x70\x6e\x30\xd2\x1d\xea\x33\xc8\x59\x9a\x9e\x41\x2e\xeb\x95\xeb\x82\x90\xcf\xd7\xfb\xf3\x1d\x85\xb9\x53\x20\x2b\x1d\x99\xae\x58\x23\xf4\x34\xe3\x11\xfb\x3e\x09\xdb\xcd\xa8\xb3\x5d\x5e\x2c\xd9\xb6\xdb\x34\xb9\xd9\xe2\x14\x46\x4b\x79\xe5\x87\xce\x4b\x7e\xd2\x32\x2c\xe9\x6a\x07\x94\x51\xe4\x28\x1e\x06\xc5\xf7\x15\xdc\xd6\xc8\x9a\xa2\x89\x86\x2a\x44\x16\x7c\x88\x5e\xaf\x49\x4d\x93\x48\x30\xa2\x16\x41\xfb\x33\x33\xcc\xc0\x89\xb4\x21\xd2\x6d\xab\x5f\xac\x1c\x35\xe8\x78\xfd\x56\xd9\xf4\x1e\xbb\xee\x35\xde\x69\x11\x15\x98\x7b\x61\x88\x2a\x9d\x06\x2e\x4f\x48\x18\xf8\xa8\x5f\xca\xd8\x33\xef\x4f\xf8\x29\xc0\x32\xfe\x62\x79\x31\xc6\x0c\x39\x7a\xf8\x31\x05\x05\x73\x87\xdd\xf6\xae\x65\x66\xe0\x23\x81\xee\x68\xf3\x67\xa2\x6a\x20\xff\xbb\xcf\x18\xea\x59\x1c\x01\x90\x0a\x92\xb9\x3c\x44\xab\x34\x38\x20\x76\xd1\x66\x2b\x3c\x61\xf3\x56\x55\x1c\x30\x6c\xea\x9c\xd4\xb3\xa9\x9a\xbe\xd7\xfd\x74\xce\xe3\xc4\xd4\x8d\xeb\x54\x26\xde\x92\x50\x7b\x7e\x68\xf3\x09\x14\x35\xde\xe7\x4b\xea\xd1\x9c\x47\x91\xe7\xfb\x79\x2c\x6d\x11\x8e\x3d\x8f\xcc\x8a\xfa\xe0\x4f\x46\xf8\x4e\x3f\x8a\xbc\x9a\x7f\xd1\x38\x3c\x38\xee\x2d\x5f\x4c\x5c\x81\x0a\xce\x1a\x33\xb8\x7b\xbe\x90\x66\xbb\x61\x37\x8b\x17\x52\xcc\xcc\xb0\x4c\x38\x31\x16\x8b\xa1\x0c\x84\xb4\xa0\x18\x83\xae\xb1\x3b\x04\x0c\x8f\xa8\xf1\x2d\x44\x44\x28\x3a\x77\x8b\x2e\x3a\x20\x8c\x81\xdf\x68\x61\x82\x48\xe5\x39\x1c\x09\x15\x84\xdc\x25\xf1\x52\xa0\xb0\xe2\xcf\xbd\xfd\xb0\xaf\x72\x1f\x7c\x4f\x3f\x8e\xa5\xe0\xe2\x55\x2c\x22\x49\xa4\x48\xdd\x03\x64\xd7\x34\x28\xa9\xd4\x67\xde\x4d\x00\x9e\x38\x33\xba\x28\x27\xc8\xfc\xb3\x78\x47\x2d\xac\x84\x45\x8a\xfc\xa7\xc7\x95\xfa\x2e\xa9\xde\x95\x46\xb1\xd3\x45\x1d\xe8\x98\xa7\x96\xd5\x85\x1d\xa7\x1f\xa8\x55\x5a\x7c\x53\x08\xda\x58\x04\xfe\x40\xd0\xe7\xfb\xc3\x87\x64\x55\x42\x8d\x93\x3e\xe7\xb4\x6f\x75\x16\xdd\xeb\xaa\xca\x6f\x7a\x30\xc9\x69\x67\x13\x1a\x33\x0b\x98\xe1\x7e\x3c\x75\x74\x49\x32\xec\x2d\xc4\x7b\xda\x37\xf3\x50\x2a\xb4\x29\xd6\x60\x59\xbc\x9a\x36\x8c\x64\xce\xdb\xb2\x9a\x6f\x37\xcf\x04\x54\x6c\x6e\x13\xd6\x07\xf7\xe1\xe4\x2a\x33\x73\x3e\xb5\x23\x9a\xfc\x57\x7d\xde\x0a\x8f\xe8\xe6\x94\xb7\xd8\xec\xf5\xc2\xd1\xd1\x76\x10\x35\x9b\x21\x5f\xe8\xc5\xc5\x45\xb3\x1a\xb6\x45\xf8\xd2\xa5\x55\xf4\x71\xc9\x1a\x0d\x34\xe6\xe2\x6a\x30\x48\xbd\xfe\xa5\x1b\xc4\xc9\xe9\x9b\xfb\x37\xd7\xd0\xab\x18\x17\xc2\x87\xc1\x51\x82\x03\xed\xdc\x1d\xa4\xed\x76\x39\x11\x0e\x4b\xb8\xaf\xf7\x6f\xff\xae\x50\x51\x7e\xbc\x1a\x8c\x38\x89\xcb\x8d\xb4\x5a\x03\x1a\xa6\xfc\x06\x50\x83\x33\x8f\x6e\xb2\x79\xae\x44\xca\x86\xea\xbf\x79\xb5\xbe\x8f\xa5\x8d\xbc\xf7\xe2\x05\xb7\x3c\x10\x88\xdd\x84\xa1\x63\xa7\xad\x9d\xdc\xd2\x9d\x70\x1a\x5e\x61\x9b\x45\xa1\x33\xb3\xe2\xcb\xa6\x2d\x63\x06\xdc\x11\x6e\x1a\x8d\xb2\x5f\x8f\x91\x7a\xd6\xb1\xd7\x75\xbe\xb9\x0d\x22\x6c\x51\x90\xdf\x51\x6a\xc2\x93\xa2\x60\x58\xbe\xd6\x13\x3b\x4e\x1a\x4d\x2a\xf5\xb1\x1f\xd8\x49\x37\x6e\xe4\x7b\x00\x07\x17\xf2\xaa\x51\x33\x85\x1b\x26\xee\xba\x7e\xbb\x69\x6e\x52\x21\x7b\xae\x3d\xf6\xc4\xee\x68\x9f\xfd\x3c\x01\x62\xc3\x62\x92\x4f\x7e\xe5\x91\xba\x58\x80\x47\x0f\x78\xaa\x99\x21\x8a\x37\xb5\x51\x5f\x3d\x65\x88\xd6\x04\xf8\xf0\xac\x96\xfe\xb2\xd1\x7d\xb9\xc4\x42\x7f\x95\x5b\x67\x77\xac\x90\xbd\x23\x21\x82\xab\xb5\x5c\x97\x19\x95\x65\xbc\x0d\xed\xb5\x77\x3d\xb2\x89\x08\x85\x0f\x76\xea\xf4\xda\xe9\x73\x8e\x9a\x7a\x92\xda\x32\x8d\xe4\xc4\x53\x7d\x38\xbe\x7d\x21\x77\xe1\x59\x1f\x9e\xdf\xc8\xe6\x45\xef\x0f\x58\x90\xaf\x73\xba\xf9\xb5\x52\x55\x10\x56\x16\x58\x26\x3e\xf0\xbe\x04\x24\x7e\xbf\x3e\x3f\x35\xae\x1c\x5c\x39\xd8\x6a\xe7\xc1\xd6\x70\x53\xd3\x06\x2c\x43\x3a\xcd\x83\x6c\x1d\xd8\xc4\xb8\x65\x16\x05\xab\xa6\x52\x86\x78\x74\x66\x72\x35\xa2\xc5\x79\xd6\x98\xac\x18\x25\xc3\x8d\xda\x59\xca\x90\x8b\xd9\xe7\x34\x96\x30\x6d\x64\x7f\x2e\xa8\xba\xde\x21\x2e\xca\x0e\xd9\x7e\x0a\x30\xb7\x14\x0d\x6a\xfe\x76\x14\x9f\x86\x3b\x9c\x50\xf7\xed\xc8\xe4\xd5\xef\xd7\xbb\x46\xde\x34\x91\x32\xd8\xa4\x85\x30\x4f\xaf\x95\x90\xca\x15\xac\xf0\xd7\x44\x31\xd9\x56\x72\xc7\x08\xc8\x1b\x07\x33\x4d\xdf\x90\x8b\x42\xe2\xea\x4d\xc7\xb4\x4e\xce\xf9\xa5\x82\xc9\x83\xc6\x15\xad\x2a\xd8\xaf\xc0\x96\x98\x73\xb8\xc4\x33\xdb\x85\x4d\x42\x3e\xf8\x03\xf5\x74\x02\x55\xdd\x74\x9f\x03\x69\xea\xe3\x20\x12\xb1\xd5\x7c\x3e\x06\xb1\xea\x45\x61\xd0\x56\x9a\x27\xdc\x7f\x25\xd1\x4a\x57\xf4\xdd\x18\x54\x51\x77\xe6\x21\x82\xc1\x2d\x0a\x68\xd7\x7d\x6b\x2b\x4e\x85\x2f\x39\xc5\x34\x9e\xd1\x75\xcc\xfa\x32\x6f\xc3\x79\x58\x88\x78\xd8\xcc\x79\x23\x41\x80\x79\x6c\x0d\x16\xf5\xc0\x66\x8f\xc3\x1b\x3a\x6a\x1c\x1c\xac\x83\x1e\x9e\xeb\xbd\x65\x0b\xcb\xc2\x03\x15\xc4\x1f\xe6\x52\xc6\x8a\xa3\x9a\x0f\xbf\x7f\x70\xeb\xde\x75\x12\x58\xac\xb7\x73\x42\xa8\x83\x63\x18\x45\x34\xee\xc5\x4c\xa2\xfc\xcb\x6e\x7b\xee\x31\x11\x56\xec\x98\x44\xa0\xae\x93\x85\x8a\x78\x44\x02\xd7\x40\xb7\xdd\x2d\x2f\xd9\xa2\xc3\x8d\xf3\x60\xb6\xe5\x35\x7f\xab\xb1\xc0\x85\x40\x17\x67\x0e\x25\xf0\xce\xb3\x41\xa3\xb2\xf9\x6a\x43\xce\xb9\x64\xe7\x45\xae\x6e\xce\x48\x1e\x68\x7a\x23\x66\x65\x16\x1c\xb2\xf8\x14\x31\x73\x53\xcd\x69\xde\xe2\x7f\x5b\xe9\x96\x9f\x4e\x1a\xd4\x1b\x06\x71\xe3\x79\xcf\xd8\x46\xb9\xa8\x6b\x65\xd3\x3c\xcf\xc0\x74\xa4\x8f\x9a\x44\x25\xc6\x79\x0e\x68\x67\x92\x0f\x67\xc3\xf8\xb6\xd4\xa9\x49\xca\x45\x05\xbe\x7b\x0d\xa5\xdb\xea\xa9\x77\xa6\xd8\x7c\xdc\x2a\x6b\xdc\x00\xf4\xf9\x1b\x3f\x3c\xc8\x83\x6e\x7e\x0c\xee\x38\x23\xca\xdc\x27\x1d\xd7\x4d\x95\x6b\xf7\x57\xa8\xc2\xdf\xd3\xfc\xfd\x75\x81\xb3\xe8\xa0\x25\x16\x0f\x86\x6e\x81\xbc\x6c\xde\x89\xe8\x32\xb9\x25\x55\x2d\x21\x60\x15\xcc\x4a\x2f\xe8\x78\xd2\xa4\x23\x4f\x58\x9f\xf7\x50\x1e\xd2\x96\x3b\xf9\x93\x90\x75\xed\xc4\x05\xf4\xca\x8f\x05\xa4\xee\xa3\x1c\x0e\xf0\xe4\xed\xb8\x73\x2a\x60\x71\x4c\x2a\x32\x8e\x51\x53\x7a\xc7\x3b\xe1\xab\x40\x17\xe2\xc1\x2c\x7a\xbc\xa5\x2d\xa5\xda\xec\xcc\xd7\xd8\xf8\xef\x6f\xf4\x0d\x7c\xfc\x52\x65\x9a\x67\x32\x15\x5a\x25\x31\x87\xf8\xfc\x1d\xa6\xc4\x4e\xa5\xc1\xff\xe4\x2a\xf2\xc5\x42\x4a\x45\x64\x9a\x6c\x54\xf3\xf5\x48\xc2\x4c\x32\x45\x16\x27\x45\x29\x9b\xf6\xac\x17\x12\xc9\x43\x68\x7b\x1c\xb9\x3a\xbf\xbf\x85\x25\x3c\xd4\x8d\x3a\x7b\x1c\x93\x26\x9e\xc1\x17\xe1\xb8\x85\xa2\x9b\x32\xd9\x37\x91\x7b\x0f\xb9\x9b\x42\xd1\x46\x15\x33\xb5\x67\x08\xed\xc5\xf9\xa8\x58\x7a\x06\x15\xf1\x42\x6d\xc4\xa8\x6f\xb4\x0f\x7f\xaa\xa3\x27\x8f\x54\xb7\x8e\xe3\xd1\x24\x58\x65\x94\x8e\x1c\x06\xc9\x12\xdf\xab\x2e\x0c\x60\x0b\xcc\x28\xa2\x0b\x09\x20\xb1\x1e\x5b\x2c\x8c\xbd\xa7\xb2\xb4\xab\xf7\xe0\x90\x13\xcd\xe4\x81\x7d\xa7\x28\x0b\x12\xf1\x38\xce\x7e\xf4\x20\x3d\xa3\x5a\xf9\x36\xf3\xeb\x09\x53\x8e\x27\x96\x7c\xcd\xd8\xb5\x98\x05\x84\x47\x51\xb4\x07\x9d\xda\xc1\x0a\x35\xaa\xa4\xcf\x14\x94\x48\xb3\x0e\xb8\xf4\x03\x41\x6a\xa6\xa6\x50\xf8\x38\x32\x19\x1d\xea\xd7\xac\xff\xb0\xd4\xa1\xcd\x32\x82\xdc\xcd\xaf\x0f\xff\xae\xe4\xbd\x6a\xa2\x97\xcf\xbe\xa7\x3c\xbc\xba\x2d\xfc\xc4\xf8\x90\xe3\x8a\x60\x8e\x95\xdb\x5f\x7a\x02\xc0\x47\x0b\xed\xa2\x0c\x83\x3b\xad\x1a\xe9\xa3\x99\x6a\xb9\x5e\xcb\xa4\x34\x27\x1c\xc1\xdd\x7b\x64\xcf\x2c\x58\x48\xea\xbe\xf7\xa1\xa8\x13\x1b\xcd\x1b\x1f\x06\x0b\x5f\xb5\x31\x97\x98\xc4\x2c\x8d\x29\x2a\xc0\x5c\xea\x5c\x12\xb5\xbd\xf9\xc3\x24\x40\xf7\x86\x74\xfc\x15\xc6\x55\xa1\xee\x11\x2f\x3e\x59\xa6\xa2\x9d\x62\xcf\x53\x94\x8c\xdf\xc2\xa6\x1e\xf2\x9b\x85\x9e\x2c\x45\x1f\xa8\xab\x0f\xcc\x64\xf8\x98\x62\x8d\x2a\xae\x53\x60\xf0\x5a\x97\xf1\xa1\xde\xa1\xbc\x33\x46\x77\x16\x07\x9e\x3b\xb4\x57\xc2\xf1\x79\x64\x51\x26\x3e\x5c\x51\x45\x70\xe1\xaa\x83\x99\x19\xfe\x7d\x4e\x48\x7c\xae\xae\x21\x99\x2d\xf3\x2c\xd4\x85\xe9\xa2\xd5\x39\xc8\xd8\x4f\x36\x62\x04\x11\x6a\xcd\x0e\x9f\x15\x52\x72\x16\x60\x1d\x54\xa9\xb4\x89\x03\xdb\x2a\x9c\x4c\x93\xce\x94\x7d\x1a\xb3\x99\x79\xdc\x59\x75\x56\x2f\xc0\xd9\xc7\xb1\x31\x2f\x76\x4f\x63\xf9\x89\x27\xbc\x7d\x95\xb0\x1e\xbf\x7e\x22\xae\x0a\xe4\xd7\xa4\xec\xed\x1d\xa2\xf5\xc6\xd9\xd7\x47\xba\xcd\x47\x98\x45\x14\xab\xd9\x9e\xf8\x1a\xd8\xee\x61\x10\xe7\x05\x96\x81\x79\x85\xf3\x8c\x59\x0d\x2f\x06\x21\xa4\xb7\x90\xb8\xcb\x54\x37\x99\x3a\xd6\x7c\x16\xe2\x75\x3f\xbe\x99\x6c\x7e\xcd\x25\x01\x8b\x2b\xb3\xa9\x4b\x21\x0b\x75\x49\x2d\xf5\x07\xb8\x63\x1d\xd9\x16\xb5\x59\x8b\x73\x6b\x91\x3e\xd3\xbc\xaf\x9d\x18\x0a\x0b\xb9\xba\x02\x97\xcb\x24\x73\x6d\x85\x3f\x6d\xc9\x11\xa5\x94\x11\x3a\xec\xc1\x8d\x22\x4c\xe4\x89\x5e\x37\x66\x68\xa3\x90\x3b\x21\x13\x81\x44\xc1\x2e\x4e\xd3\xb1\xb0\xdc\xd5\x3e\x6b\x9a\xf0\xcf\xe1\xd1\x08\x72\xa4\x21\x49\x71\xb2\x7b\x68\x8a\x38\x96\x7e\x25\x73\x8f\x7c\xdf\x8e\xef\x2f\x76\xca\x5a\x73\xa1\x51\x4f\x82\x1e\x32\xc3\x45\xab\xfb\xb4\xd8\xfa\xcc\x73\x05\xc2\x21\x38\x96\x2c\x3b\xe0\x91\x43\x6d\x5a\xa2\xb3\x1d\x01\x4a\x8a\x48\x0d\x30\xc4\x7a\x0c\x65\x50\xb7\x89\xd7\xdf\x00\x48\xe6\xc6\x4d\xe1\x68\x16\xb9\xa9\xf9\x53\x6c\x36\xa6\x5c\x3d\xce\x45\x8f\xb3\xbd\x89\x80\xe7\x18\xa0\xb2\x52\xb6\x54\x36\x31\x07\xd6\xd6\x7a\x62\x88\xcd\xc8\x6a\x5e\x18\x54\x3a\xc7\x35\x24\xf2\xfb\xeb\x9b\x8e\xbb\xa0\x8c\xbe\xc5\x0a\xbf\x1c\xab\x67\x2f\x07\x3e\xc1\xb7\xf1\x20\xb7\xdc\x82\xa2\x6b\xe0\x0c\xc2\x39\x36\x99\xf3\x6f\x54\x9f\x73\xc2\x5a\x21\x0e\x9c\x04\x0c\x92\x61\x87\x74\xdb\x01\x21\xef\x9c\x8a\x06\x1b\x6e\x7e\x73\x26\x92\xc0\xd6\x03\x0b\x82\x24\x2f\x64\xa1\x77\x40\x3f\x9e\xb2\x78\x81\x01\x60\x9b\x56\xf5\xf2\xb9\x7e\x13\x96\xc9\xd4\x14\x9d\xda\x19\xdd\x62\x22\xbe\x1e\x92\x26\x60\x5e\x35\xec\x96\x38\xd6\x32\xdc\xaa\x4c\xfc\x89\x05\x6f\xd2\xdc\xf2\x8e\x7e\xe4\xe0\xc3\x86\x88\xf0\xcc\x85\xe1\x38\xfa\x78\x40\xfe\x9d\x37\xe1\xad\x0c\xff\x62\xeb\x63\x73\x2b\x06\xe2\x0c\xc5\xf3\xa5\xd0\x08\xe4\x55\x84\xbb\x2a\x83\x0b\x23\x46\xa9\x82\x13\xfb\xfb\xfd\xa3\x09\x93\x47\x22\x48\x39\xbd\x39\x15\x08\x7f\x61\x66\xbb\xa4\x9a\x5c\xf0\x0e\xea\xd7\x0c\xb4\x78\xa7\xe1\x9f\x87\xc4\x49\x32\x2f\x22\x6e\x74\x21\xe2\x75\x73\xe9\x28\x01\xcf\x07\x1d\xac\xcd\x1b\x5b\x39\xc9\xd6\xd1\xc5\x5a\x8e\xe8\xe4\x46\x6b\x94\x20\x11\x03\x77\x76\x86\x56\x9a\xbb\x67\x1b\x96\xfb\x37\x74\x51\xa3\x39\xb1\x57\xd0\xbb\x43\x03\x11\x0f\xc3\x89\x69\xa6\x54\xb4\x3f\x6e\xed\xb4\x2d\xde\x9b\x08\xb5\xda\x79\x98\x44\x02\x63\xcf\xa6\xdf\xb0\xe1\xe0\xd6\xf6\x57\xf8\xe4\x07\x52\xce\x04\x60\xc0\x9c\x4c\x34\xd4\x82\xe5\x3b\x88\xc6\x65\xa8\xc5\xd9\xee\xcc\x9d\x61\x2e\xde\xa4\x00\x0b\x81\x94\x8e\x2a\xd0\xe2\x03\xd9\x47\x21\xe3\x2c\xb0\x92\x8f\xdc\x66\x44\x2f\xde\x9a\x2a\x67\xa9\x2d\x90\x3f\xc0\x06\xe0\x41\x16\x38\xa4\xcf\x9e\xce\x1a\x6d\xde\xa5\x06\xae\xad\x3a\x3c\xb7\x1b\x29\x15\xf2\xb5\xb4\xff\x35\x5e\x9c\x8b\xc4\x0e\x5c\x4d\x40\x08\xea\x65\x0b\x97\x8a\xa6\xa5\x03\x14\xc8\xac\x7f\x48\xb8\xfb\xbc\x3b\xe6\x01\xc4\x74\x61\xfe\xd6\x8b\x0f\x72\xbb\x30\x34\xdc\x55\x3a\xe9\x73\x67\xea\x4b\x94\x99\x48\x40\x56\x68\x14\x68\x81\x07\x8a\x5d\x07\xae\xcc\xea\x7f\xca\xa8\xfb\xaf\xaa\x00\x4d\x60\x77\x6f\x61\xc6\xb7\x3f\x8c\x0a\x69\xc8\x8e\x8d\xf2\xff\x35\xd5\x0b\x6b\x3f\xb5\x08\x42\x4c\x62\xb6\xbe\x0d\x0f\x3f\x09\xaf\xbc\x20\xe6\x61\xa9\x87\x60\xaf\x9d\x38\x6d\x92\x64\xd6\x6a\x33\x59\x44\x5c\x80\x01\xc0\x6f\x7a\xce\x9b\xce\xb6\xbf\xa7\xb1\x94\x98\x3d\x0e\xe5\x36\x80\x7f\x00\x2e\x7e\xf4\x11\xb7\x84\x0a\x39\xd4\xb7\x4e\x6c\x94\xdd\xd6\x3d\x4b\x7a\xa7\x2c\x89\x55\xc0\xed\x69\xe0\x8d\xae\xdb\xa8\xc4\x9a\x0b\xb1\x9c\xe0\xf3\xfe\x4a\x5a\xc7\x61\xe1\xfc\x74\x54\x13\xe5\xf1\xd3\xa7\x42\x96\x02\x7a\xc3\x33\xc2\x2f\x12\xc7\xe9\x99\xf9\x9c\xed\xc9\xc4\x47\xdb\x23\x33\x31\x87\x61\x7c\x2e\xf9\x98\xa7\x01\x8d\xe9\x4a\xb5\xd1\x04\x48\x75\x2a\x9b\x6b\xaf\xf9\x78\x26\xb2\x85\xb6\xb5\x2b\x61\xd7\xb2\x4f\xc2\x09\xba\x8a\xe3\x38\x09\xdb\x6d\xaa\x46\xe7\x4b\x11\x67\x4a\x16\x78\x2a\x94\xea\xa0\x9d\xec\xd2\x33\x1b\x7c\x3e\x2e\x74\xa3\x05\xc2\x93\x26\x50\xe6\xf6\xa1\x31\x8b\x18\x72\x36\x88\xa5\x34\x4d\x85\xdf\xc7\xb5\xbe\x10\xfc\x26\x2c\x70\x38\xc4\xa1\xe5\xbd\xd4\xe2\x54\x64\x15\xea\x12\xd8\xab\xee\x6e\xbe\xba\xc8\x46\x76\x33\x11\xc4\x02\x39\x4a\x77\xc8\x3e\x32\x0e\x34\x9d\x30\xc3\xd0\xc0\xd7\xfc\x08\x82\x05\x39\xac\xa6\x62\xbe\xf1\xcc\xea\xaf\x73\xb9\xd2\xc3\x67\xdf\x0d\x9d\x39\x48\xa1\x66\x99\xba\xa5\xfd\x55\x4b\x10\x24\xeb\x61\x1f\x2a\xfa\xfd\x57\x81\xeb\xfd\xdd\xb9\x9e\x2b\xd4\x95\xb7\x07\x1e\xf8\x1c\x05\x56\x9a\x47\x95\x9c\x9d\xa0\x5c\x3e\x9b\x37\xb5\xd4\x64\x9b\xa6\x61\x5b\x7d\x49\xe8\x4c\x0f\x9a\x74\x36\xf7\x09\xdd\x62\xd5\x1f\x9e\xdc\xdf\x18\x88\x79\xda\xe4\xcc\x88\x82\xfd\x30\x6c\xdc\x8d\x3e\x47\x00\x6e\xf6\x10\x6e\xa2\x0d\xcb\x32\x40\x68\x4e\x62\x06\x29\x5b\xe0\x71\xa0\x04\xfa\x46\xc2\x43\xf3\x96\x19\x61\x2e\x9d\x7d\x47\x92\x79\x4d\xc5\x40\x81\x7b\x59\x58\x79\x87\xb2\x92\x94\xad\x7e\xc4\xfa\xa1\x4c\x77\xa1\x28\x6f\xc2\xc8\x5e\x24\x9f\xff\x47\x78\x88\xc5\xbb\x9c\x86\x71\x0a\x57\xef\x23\x8a\xa0\xae\x72\xb4\x1c\x98\x32\x3a\x13\xd7\x86\x3c\x66\xa7\x65\xa7\x8e\xf6\x11\x22\xe6\xaa\xc1\xd8\x7a\xa1\x58\xd3\xdf\x7d\x4a\x18\x51\x85\x6e\x6e\x13\x71\xc6\x3a\x47\x85\xc2\x0e\x9c\xc2\xfb\xc8\x71\x5a\xca\xae\x62\xc9\xec\x22\x68\xa5\x4c\x39\x2f\x91\x31\x85\xc9\x97\xe7\x16\x7e\x3f\x0f\xdf\xe8\xf0\x0d\x4d\xbf\x89\x2a\x87\xa1\x29\x30\x60\xae\x34\x1b\x2a\xdd\x45\x5d\xc2\x1e\x95\xf5\x4c\xfd\x3b\x69\x98\xd8\xdf\x5b\x8e\x23\x9c\xd2\xc8\x6e\xa9\xfa\x95\xae\xeb\xe3\x56\x78\xac\x9d\x6c\x89\xe7\xb2\xff\x8b\x32\xfb\xdd\x0e\x29\x8b\x35\x6e\xdf\xf6\x0d\x99\x9d\x4b\x54\x92\xd4\x84\xbb\x0c\xa9\xbb\x75\x3f\xf1\xfd\x76\x76\xc3\x9b\x5c\xd7\xd6\x00\x04\xa6\xe9\xaa\x5e\x95\x5f\x95\x33\xd5\x36\x8d\xb8\x44\x3d\xd1\xa5\x29\xbf\x8e\xd3\x39\x55\xaf\x9c\x5b\x85\x36\xf1\xa7\xc4\xfa\xa2\x5a\xf5\x16\x12\x7d\x70\x53\xbb\x83\xda\x75\xfb\x50\x68\x0a\xc7\x62\xf0\x87\x7d\xe1\xec\xc4\x7f\x7b\x0c\xc2\x54\xd0\x3c\x00\xca\x57\x40\xee\xf9\xa2\xee\x7a\x35\xd1\x9a\x60\xca\xc4\x33\xb5\xfb\x09\x7d\xe1\x51\xc1\xc0\xb4\xc1\xdd\x3f\xda\x96\xd8\xc3\x55\x6c\xe4\xc6\xb3\x6d\x3b\x47\x5c\x86\x19\x7f\x56\xf5\xde\x89\xd2\x64\x84\x56\x97\x91\x74\x01\x53\xdb\xe0\x02\x2c\x0f\xa1\x3d\x3f\xbf\xd1\x95\x50\x79\x22\xe4\x83\xa0\x5e\x9f\x1d\xb0\xbc\x4a\x6d\xff\xed\x4d\x87\x27\x09\x0b\xca\xc2\xed\x7a\xe3\x2a\xba\x10\xb2\x61\xbd\x0c\x81\x6e\xd9\x77\x66\x72\xa8\x54\xcf\xf4\x18\xe7\x9e\x41\xba\x98\xd6\x90\x83\xa3\xce\x0b\xa3\xb8\x7b\x8b\x17\xe8\x6f\xb3\xa9\x52\xce\x99\x9a\x76\x80\x34\x52\xb4\xd9\xe3\x72\x65\x9e\x4e\x9c\xde\x93\xb7\x37\x20\xf5\x33\xc5\x5d\x40\xae\xda\x19\xc0\x68\xcb\x4f\x18\x4b\xeb\xe3\xd1\x05\xfe\xf3\x05\x75\x0b\xd1\x3f\xe8\xda\xfa\x8c\xe2\x0b\x11\x70\x68\x12\x11\x3a\x74\x8b\x6c\x54\xf3\x3e\x07\xc4\x82\xf6\x27\xfe\xaf\x42\x33\xda\xe1\xc8\x2a\x9c\xe7\xe0\x14\x1c\x99\x0c\x9d\x88\x97\x7f\x04\xf3\x55\x69\x9f\x97\x44\xb1\xd8\x42\x1d\x56\xb5\x3f\xcd\xc0\x18\xbc\xff\xf8\x77\x05\x8a\x5b\xf1\x08\xc6\x29\x36\xa4\x71\xda\xc5\x99\x60\x46\xc4\x27\xc5\xe0\xb4\x86\xad\x3f\x11\x8c\x0e\xa6\x64\x19\x63\x3b\x46\x3d\x61\x54\x1b\x8b\xda\xa3\x58\xc9\x46\x69\xdc\xd1\xbc\x33\x35\x08\xed\xe6\x4c\x70\xd2\x92\xaa\x77\x4e\x33\x12\x45\x1e\x2b\x15\xe7\xd0\x2b\x66\xea\x9c\x72\xbc\xfa\x9f\x32\xe6\x1e\x11\xec\xb0\x65\xce\xc0\xa8\x31\xca\xbd\x02\x55\xda\x2d\xcd\xcc\xa2\xec\x7d\xa0\x8f\x84\x2f\x5a\xe8\x9e\x30\x50\x27\xe4\x21\x89\x9e\x93\x1a\xcd\x22\xc9\x70\x43\x8e\x77\xf9\x71\xe2\x47\x7f\xc1\xd7\x57\xa1\x97\x92\xf7\xf9\xb9\xdc\x1f\x33\x94\x27\xda\xe3\x0a\x97\x46\x71\xe3\x9c\x8f\x63\x79\x41\xea\x58\xb7\x3c\x05\xd5\xad\x4f\xed\xf8\x0d\x0f\xcd\x5c\x88\x70\x42\x77\x4b\xf7\xe2\x4f\x3b\xb9\x85\xc1\x31\x7d\x75\x41\x2d\x4b\x81\x81\x79\x0a\xe7\x46\x50\x5f\x8b\x8c\x03\x0d\x7e\x43\x77\xc7\x53\xfb\x4b\x2a\xf5\x08\x81\x78\xbd\xd5\x9b\x59\x66\x27\x47\xa5\x45\xb2\x28\xf3\x2a\x32\x78\x1f\x9e\xa8\x7c\xf0\x5c\xfc\x5d\x56\xb7\xbe\x71\x06\x12\xa9\x46\xbd\x25\x19\x1e\xbc\xd8\xc3\x38\xd9\x7b\x18\x0a\x53\x79\xf6\xf9\x65\x95\x86\x91\xc0\x4f\x08\x65\xa6\x08\x24\x7d\xa0\xd0\xfb\x54\x0f\x94\x8b\xea\xfd\x72\x09\x9a\xec\xb5\xa8\xa1\xdd\xab\x91\x61\xe7\x6f\x39\x83\xda\xd4\x36\xb3\x8f\x28\x76\x51\xfe\x55\x34\xb8\xca\xfd\x32\xa5\x48\x23\x76\x10\x5e\xfd\x17\x60\x8f\xa3\xb7\x00\xbc\xf3\x1c\xb0\x78\xe0\x07\xa2\x72\xb0\x01\x8b\x60\xf6\x61\x40\x2e\x61\x48\xcf\xa1\x9c\x8d\xcc\x5f\xc9\xa1\x7f\x38\x17\x1b\x0a\xde\x64\x20\x26\xd5\x26\x9d\xda\x45\x0c\x58\x7e\x92\x4e\xca\x52\x17\x06\x82\xad\x4c\x88\x58\x2f\xff\x71\x1b\xa8\xd0\x67\xce\x04\xc0\x3e\x38\x25\x06\x45\x63\x66\x66\xd7\x93\x8e\x9a\x52\xd6\x47\x64\x1a\x2a\xc1\x72\x59\x32\x29\x0c\x72\x43\x50\x0f\xb8\x57\xce\x7d\x11\xf6\x39\x15\xcc\xb8\x60\x25\x76\x5c\xe4\xc7\x1e\xd8\x5a\xea\x4a\x18\xc7\xda\xe1\x9e\xe4\x39\x22\x27\xf9\xbb\x1c\x5a\x02\x1b\x50\x9d\xf5\x85\xf3\xfa\x87\x4f\xb3\xe5\x43\x26\xd8\x5e\xa9\x47\x27\xac\xe3\x14\x9a\x02\xfc\x6e\x3c\xab\xcd\xae\x5d\x2f\x4e\xab\x4c\x82\x01\xe7\xa5\x64\xb2\xaa\xd4\xce\x11\xa9\xc4\xdb\x41\xe2\xdd\x68\xd1\x8a\x9e\xde\xde\xfe\xba\x97\x30\x44\xf2\x58\x89\x42\x68\xaf\x19\xae\x75\xcc\xfc\x78\x6f\x69\x62\x30\xda\xda\x6a\xb7\x54\xf3\x77\x62\xce\xf3\xe9\xb4\xf6\x64\x29\xf0\xe6\xed\x95\x0b\xd3\x84\xa5\x30\x4a\x4f\x1d\x01\x33\xc0\x9b\xad\x92\x7d\xc8\x7b\x36\x5d\x84\xf7\xd0\xb0\x01\x5f\x71\x61\xd8\x7c\x58\xc6\xc4\x19\x2b\xf6\x50\xfe\xc4\xd6\x5f\xc9\xe0\x0f\xde\xbc\x3b\xe3\x35\x07\x36\x94\xfe\x6d\x5a\x87\x3e\xc9\xda\x61\xfa\x1c\x7c\x87\xa1\x71\xba\x5f\xa6\x03\xf2\xc0\x7e\xbd\x0b\xea\xbf\xb8\xdc\x7d\x99\xfb\x12\x7d\x35\xec\x90\x48\xe6\xf6\xe3\xc1\x91\x44\xda\x2e\xe3\x55\xf1\x1b\x16\x25\x39\x99\xe3\x7c\x04\x2f\xaf\x61\x3f\x9e\x25\xe7\x8f\x01\xe3\x40\x68\x90\xcc\xee\xfd\xed\x8d\x1d\x00\xf7\x15\x65\x1b\x5b\xb2\xd7\xb8\xf1\x3b\xbb\x45\x0a\xf5\x27\xc9\x00\x62\x14\x51\xdf\x2c\x97\x56\x2d\x00\x48\x5a\x92\xd9\xc7\xe7\xca\x89\x01\xcb\x42\x95\xba\xa5\xdb\x10\xcb\xa4\x97\x7d\x92\xd9\x31\xeb\x59\x26\xd0\x38\xb9\x09\xf9\xd3\xe2\x76\x24\xf0\x67\xb1\x30\x35\x60\xbb\x3d\x19\x8d\x8c\xf9\xf1\x9d\xe5\xe2\xa3\xf2\x99\x24\x3d\x1a\x3e\x04\x53\xf1\xe2\x1c\x47\xf7\x87\xb5\xe3\xf5\x7e\xfc\xf8\x77\xe5\x7d\xcc\x68\x75\xf7\x39\x2f\x90\xbb\x8d\x55\x7a\xef\xa8\x4b\x6c\xe1\xb2\x98\x6c\x55\x47\x4b\xe3\x24\x34\x65\x8c\xa9\x22\xe5\x13\x28\x2d\xe1\x71\xf8\x64\x37\x56\x85\x5d\xff\x30\xf1\x45\xa5\x5c\xc1\xdf\x30\xe1\x81\x77\x99\xca\xc0\xcb\x2d\x7e\xec\xee\x0c\x10\xb2\x79\x82\x69\xf4\xcc\x3c\x4e\xb6\x73\x84\x11\x0c\xb9\xe4\x59\x94\x39\xf6\x66\xa5\x89\xc0\xa7\x42\x08\xa6\xeb\xbd\x02\x78\x40\xe6\x2e\xf3\x5e\xdb\x13\x87\xca\xa8\x7b\x86\xf8\x3c\x55\x63\xa6\xd2\x6d\x3a\xb0\x8c\xe3\xae\x05\x34\x58\x5c\x31\x83\x86\xde\x05\xfd\x6a\xe7\xda\x19\x33\x7b\xdb\x3f\xba\x1f\x64\x2c\xd2\x60\x31\x08\x40\x48\x18\x97\xab\x7e\x77\x74\x54\x39\x9c\xe7\x28\x1e\x0e\x45\xfe\x2a\xe1\x6d\xc3\xab\xe4\x12\xff\xe3\x81\x30\x9b\x6c\xce\x80\x6a\x1a\x0e\x49\x1d\x30\x10\x17\xcc\x2a\x1c\xe4\x5e\x0a\xd5\x1e\x8e\xdf\x98\x7d\x31\xe1\xf4\xed\xd2\x8c\xfd\x4d\x37\x2e\xd3\x63\xa2\xda\x2a\xab\x77\x1d\x80\x79\x77\xca\xba\xd0\xc8\x37\xb1\xc0\x20\x91\x82\x80\x19\x76\x8b\x88\x92\x62\x7f\x13\xcf\x96\x19\xac\xa1\x64\x54\x07\x8b\xf1\x6e\x24\x6a\xf6\x67\xfd\x1b\x0f\x0b\xdd\xc2\xb9\x54\xb1\xcf\xf9\xc1\x0a\xd6\xe8\x10\xdd\xd2\xe7\x32\x6d\x82\xac\x4e\x2f\xf8\xd8\xb4\x40\xdc\x17\x48\x41\x52\x69\x90\xe3\xf1\x0f\x8e\x18\x27\x74\xc6\x39\xaa\x90\x66\x35\xd5\x0c\x19\x27\x95\x80\xfd\xfe\x8d\xc2\xcd\x6c\x42\x28\x34\x1f\x80\x31\xc3\x18\x7b\xd2\xf2\xa0\xbf\x79\x10\x0e\xe8\x0f\x3b\x02\xbf\x2d\x66\xca\xc4\xf3\x77\x2b\x7b\x46\x3c\x5d\xc1\x0a\x7b\xef\xe3\xc3\x52\x19\x29\xa7\x3c\x15\x18\x34\x7d\x59\x7f\xd2\xa4\x81\x35\x1f\xb7\xdb\x95\xb5\x25\xf3\x24\xd4\x79\x00\x2e\x99\xa4\xe0\xd3\xd4\xf3\x8a\x04\xa4\x77\x75\x2c\xa4\x85\x34\xb3\x82\x23\x48\x96\x06\x14\x65\xc3\x28\xcc\xb4\x12\x92\x5e\x14\x18\x99\xb7\xbd\x87\xcb\x15\x4f\x99\x3d\x3a\x51\x7d\x4b\xfd\x98\xf5\xe5\x3f\x2c\x6b\xcb\x06\x1a\x2f\x1a\xd2\xcd\xfa\x57\x77\xc7\x2f\xf0\x35\xb9\x8e\x56\x6e\xf2\x39\x5f\x31\x8d\xe5\x4a\x2c\x92\x07\x82\xf8\x71\x93\x9f\xe0\xfd\xf2\xae\xae\x70\x78\x6e\x08\xe1\xa7\xed\xb3\x45\x25\xc4\x9c\x92\xe4\x1d\x2b\x78\xe8\xf4\xbd\x48\x43\x9a\xee\x56\xaf\xfd\xf8\xb8\xc8\xbb\x5c\x1e\x65\x76\xb1\x73\x50\xc2\x6b\x4f\xfe\x5d\xa9\x46\xc0\xe4\x74\x02\x53\x12\x6b\x5d\x5b\x99\xc7\xea\x25\x78\x9c\x3b\x4d\xbe\xbc\x84\x7e\x00\x85\xf0\x28\x36\xbe\x31\x3d\x09\x83\xbc\x21\xa3\xc9\x6a\x7c\x6b\x97\xc0\x11\xd9\xb6\x73\x70\x58\x50\x77\x38\x05\xd1\xe4\x0c\xe5\xf4\x89\xdb\xda\xce\x74\xad\x11\x8a\xbb\x2a\x21\x64\xc6\xa1\x25\xf0\x2d\xc4\xc3\xb7\x3f\x37\xee\xed\xfb\xed\x03\x99\xa9\xe7\xbe\x10\xf3\x55\x06\x16\xb2\x20\x91\x06\xcd\x69\x03\x8f\x85\xcb\xc6\xf1\xfb\xf7\x0f\xd2\xa7\xc8\xd3\x55\x0c\x94\xa1\x8f\x04\x24\x5a\x66\x4c\xaa\x88\xe5\xb9\xa7\x39\xb4\xf7\x7c\x08\xfb\xe7\xd8\x26\x32\xb2\xf9\xae\x94\x9e\x5a\xd3\x87\xa7\x21\x3f\x90\xb2\xea\x35\x64\x70\x2e\x33\xca\x7c\x56\x27\x0b\xcf\xde\x16\x78\x52\x57\xa0\xc7\xe2\x10\xf6\xcb\x7a\xab\xdb\x1d\xe7\x95\xa3\x31\xcd\x9e\x2c\x0c\x30\x18\xa6\xf3\xc8\xd1\x8c\xbc\xd1\xa8\xf0\xc0\xe9\x38\x1e\x80\x5b\x74\x02\x85\x40\x0f\xbc\x2e\xc4\x06\xee\x00\xc8\x2d\x41\xfd\x43\xa4\x97\x37\xa7\xd7\x80\xbc\x2f\xaf\x3a\xbe\x88\x46\x9c\x48\x4e\xd4\x36\xa5\x91\xde\xe1\x47\x70\x1a\x00\xfc\xf8\x47\x1f\x5e\x8d\xd7\x6d\x9f\x66\xf4\x8d\x22\x09\x5d\xa8\x3c\xcc\x66\x5c\xa4\x5a\x48\xb0\x35\xfb\x3c\xcb\x38\x48\xf4\x57\x62\x8a\x92\x85\x01\x40\x6c\x84\x2e\xa8\xd5\xa9\x31\x9d\x88\x1c\x43\x0b\x5c\x80\x3f\xb3\x9e\xea\xe5\x13\x04\x49\x0e\x24\x5c\x49\x23\x36\x79\xbb\x2d\xb2\x2f\x53\xd3\x7c\x7f\x90\xa9\xbc\x7e\x0d\x34\xa9\x67\xd9\x63\x13\x77\x31\x55\xd4\x25\x5d\xde\xc7\x07\xe3\x10\xcf\xc3\x96\xca\x6e\x1c\x65\x45\x7b\xb5\x55\x9b\x13\x36\x45\x4d\xfb\xb4\xed\xe6\x4a\xc4\x7b\x23\x36\xc5\xbb\x23\xc5\xcb\x19\x60\x34\x79\x4d\x4b\x97\xa8\xad\x2d\x0a\x69\xd9\xc8\xff\x9f\xba\x9e\x27\x04\xb1\x77\x28\xdd\x56\x18\xe3\x31\xdd\xcf\x23\x7a\x1c\x3c\xb3\xc9\xac\x5c\x3d\xde\xec\x5f\xa5\x09\xba\x2e\x8e\xb7\x7b\x73\xad\xa7\x22\xdd\x13\x8c\xc6\x66\x3e\x3f\xfb\x18\xc2\x65\x97\xe3\xf3\x10\x43\x57\xbc\xa6\x07\x24\x7b\x2c\xb9\x6a\xf7\x7f\x20\x90\xb1\xa0\xbe\x4c\x2e\xb6\x3c\x2a\x39\xfd\x70\xaf\x13\xc2\x29\xa9\xd9\x62\x89\x2d\x41\xa0\xef\x4f\x89\x2b\xd9\x59\xe4\x52\xc9\xa8\x74\x14\x8b\x73\x9c\xce\x1c\x3f\x6b\xb7\xbb\xd0\x4d\x5d\x9d\x02\x8e\x0f\xb7\x2d\x92\x42\xc0\x9c\x46\x64\x39\xd2\xe9\xe4\xc1\x63\x55\xe6\x91\x51\xa0\x59\xe7\x7d\x3b\x0a\x5b\x47\xb7\xdd\x4c\xa8\x8a\x2f\x48\x9c\x59\x18\x4e\x62\x65\x9f\x7f\xca\x71\xdf\xe0\x58\xa6\xc9\xc8\x9b\xcf\x3f\xa8\x10\xd8\xd6\x4b\x6a\x89\xa3\x93\xbb\x2f\xf8\x9e\x39\x05\x51\xca\xd4\x6b\x2c\x2c\xd6\x99\x61\x57\x24\x3d\x64\x8d\x62\x74\xe4\x01\x33\x30\x5d\x49\xd2\x2f\xaf\xea\x25\x78\xcb\xc1\x09\xe7\xd0\x59\xc4\x4b\x3e\x91\x95\xce\x5b\x7e\x28\xae\x98\xc3\x30\x96\x20\x29\x9c\x45\x39\xf9\x79\xbb\xfc\x03\x86\x39\x98\xf5\xd9\x5e\x54\xe7\xdc\xb9\x0d\x11\x37\x09\x02\x43\xe9\xfd\xdf\x57\x82\x7a\xfc\xf7\x8f\xeb\xde\xfd\xf3\xe7\xe6\xad\xcc\x91\xb1\xd8\x00\xd3\xab\x5e\x98\x6b\x90\xb6\xe2\x64\xa2\x3a\x4e\x00\x0e\x87\xa4\xc2\x74\x84\x6b\x38\x33\x0f\x5e\xd7\x81\x02\x96\xcc\xac\x00\x89\xd4\x2f\xa7\x27\xba\x04\xc0\x6b\x80\xaa\xcb\xb4\x10\xde\x49\x16\x6e\x7f\x80\x39\xdd\x6c\x90\xdd\x37\x15\x64\xd2\x73\x87\x2f\xa7\xca\xcc\xb1\xd2\x34\x0e\x9e\x8b\xc8\xb6\xba\x9b\x49\x21\x47\x93\x9a\x49\x18\x44\x22\xed\xb8\x2c\x08\xc0\x2f\xc8\x80\x0f\x9f\xbf\x07\x0c\x31\x3d\x14\x24\x89\xb7\xd8\xc9\x29\x43\x82\xab\x12\xb4\x9b\x8c\xca\x03\x73\xa0\xf7\x7f\x1d\x21\xf0\xce\x5d\xa7\x41\xd4\xcf\x08\x15\xe4\x28\xb9\xcc\x29\x13\xa9\x54\x54\xdf\x7f\x58\x8a\xc4\x90\x7a\x9c\x22\x66\xd7\x56\x4e\xdb\x61\x56\xdd\xc4\x7b\x66\xe9\x96\xb8\x40\xe0\x22\xf2\x44\x87\xd3\x01\x6a\x08\x2d\x2c\x56\x68\x15\x2a\x0f\x05\xed\x37\xbb\x40\xd1\x12\x64\xc2\xf6\xfd\x19\xe6\xe3\x91\xb9\xe4\x19\xf3\xc9\x7d\x15\x8c\x83\x7b\x5e\x78\xce\x09\x3a\xb8\x27\x9e\xbe\x0d\x1a\x66\x58\x86\xb5\xc4\xb9\x8c\xa3\x8d\x35\xc7\x24\x7b\xc6\x9d\x09\xf7\xd8\x32\xb7\x86\xb9\x2d\xc0\x14\x9e\x6f\xdf\x77\x7a\x65\xd0\x84\x3e\xbe\xe0\xeb\xe3\x9b\xe8\xe3\x23\xe9\xac\xba\xdb\x79\x7f\xd7\xb8\xe1\x87\x7a\xee\xbe\xeb\x2e\xfd\xf3\xfb\x11\x39\x39\x06\x69\xf9\x47\x7c\xac\xd3\xf3\x97\x67\x6a\x6a\x1f\xa2\x5e\xc0\x17\x53\xf2\xdb\xa9\x4c\x6f\x21\xe5\xf9\xa9\x10\x70\x9d\x80\xf4\x23\x76\x62\x52\x0f\x9d\x77\x14\x89\x29\xcc\x22\x93\xe7\x48\xf4\xc7\xc3\x14\x0a\x59\x25\x3a\x1a\x6c\x35\xb9\xe7\x38\xb6\x83\x7f\xb4\xed\xc4\xfb\x9d\x0d\x30\x8c\xc5\xbd\x26\x44\xf5\x8a\x74\x10\x9c\xac\xf0\xbc\xad\xf7\xd8\x6a\xe0\x10\x87\xf2\xfb\x74\xf7\x3b\x99\x5a\xa6\x8f\xe3\xbf\x33\xce\x47\xe9\xf6\x02\x03\x35\x73\x64\xd3\xde\xb2\x38\x30\xa5\xb1\x0d\x47\x48\xdb\x9e\xc4\x52\x89\x39\x71\xb5\x93\xc8\x70\x60\x93\x1f\x0e\x92\x35\xe6\x21\x75\xb4\x10\xa6\xc4\x07\xa2\xd8\x2e\x61\x91\x8b\x01\x36\x50\xe5\x40\x85\xec\x30\xb9\x68\x38\x6c\xe2\x56\x26\x04\xb9\x4f\xc4\x15\x49\x93\x83\x6e\x48\x12\x21\x7d\x24\x4e\x3c\x10\x18\xd0\x38\xdf\x1f\xdb\x69\x77\x1d\xf9\xb0\xff\x27\xee\xda\x2d\xc6\x7d\xbd\xf9\x6e\x3f\x1e\x9f\x4b\x7d\x42\xc7\x96\xcf\x98\x84\xd3\xf3\xf6\xf5\x85\xd9\x74\xa1\x57\xc4\x6b\x36\xba\x27\xec\xe0\xfd\x5d\x12\xf1\x9a\x9a\x26\xb6\x5e\xf3\x7f\x25\x17\x9a\x1d\xac\x84\x3c\x07\x79\xad\x2a\x17\xac\xf3\x99\x35\x35\xf5\xa3\x1e\x74\x1c\x3c\xbd\x81\x53\x03\xa6\x04\xd6\xec\x25\xea\xb6\x6f\xac\x6f\xce\x40\xdb\xb0\xd4\x69\xce\xd6\xb2\xc8\x61\xda\xc4\xd4\xb6\xf9\xe8\x43\x74\xea\xa6\x71\x16\xc4\xdf\x3e\xf5\xe3\xed\xfb\x1b\x0f\xed\xd5\xc4\x71\x93\xee\x61\xc6\xa3\x3b\x9d\xf6\x25\x79\x73\x4a\xa5\xce\x18\xa5\x67\x09\x59\x32\x9f\x09\x18\x85\x8f\xef\x9f\xdf\xaf\x77\x1e\x90\x77\x45\x26\x1a\x2c\xeb\x39\x7a\x28\x59\x6f\xe8\xc7\x33\xe6\x97\xf5\x0f\xec\x47\x6d\x16\xae\xb4\x5a\x86\x4d\x29\x59\xcc\x55\x3f\x54\xaa\x64\xf1\xd4\xfa\x73\x2f\x46\x9c\x9f\xd3\x63\xe6\x73\x2d\x3f\xe3\xfb\xfb\xe7\x07\x69\x42\xb7\x1e\x05\x03\x5e\x78\xa3\x4c\x7c\x82\x80\x94\x2d\x41\x10\x8d\xa3\xb6\xc9\x0f\x8e\x51\x95\x54\xf8\xe1\xac\x49\xc5\x05\x52\xb9\x14\x1e\xec\x52\x0b\x3b\xe2\x14\x92\xd6\xf2\xe4\x4c\x45\x64\xde\x3b\xc5\x38\x74\x2c\x23\x77\xa7\xfb\xbf\xfb\x17\x78\xe1\xd6\xb0\x72\x02\x9f\xd9\xb9\x33\x13\x71\xab\x7d\x26\xd1\x29\x43\x2d\xae\xb4\x76\xbf\x44\xff\x0f\x87\xf4\x36\xf5\xac\x30\x39\x77\x52\x4f\x1e\x24\xf3\xa7\x76\x72\xc7\xb9\x67\xa5\x91\x48\xa3\x2d\xaa\xce\x44\x30\x07\x3c\xd1\x02\xda\xe9\xe1\x18\x40\xaf\xa4\xc9\x65\x56\x37\x3d\x24\x64\x17\xc4\x88\xd5\x35\x14\xc9\x30\x52\xed\x50\xbd\x8a\x6f\xfe\x39\xff\x76\x3a\x9d\x6c\x25\xa6\x23\xe3\x53\x7b\x94\xdc\xb3\x0f\x2b\x48\x18\x27\x21\xa1\x7e\x89\x27\x51\x81\xb7\x26\x8f\xa4\xbb\xfd\x75\x3c\x42\x25\xf8\x32\x4d\xe6\xae\xa9\x9d\x93\x77\x6d\x71\x06\xd5\xa5\x04\xde\x35\xe6\xb3\xd0\x44\xe5\x8e\x43\x0a\x6a\x0e\xe4\xe8\xf7\x81\x2e\xe5\xa6\x9b\x8e\x02\x0f\xc5\xfb\x2c\x3e\xfe\x24\xc2\xe0\x4b\x83\xee\x26\x54\x4c\x38\x37\x09\x4a\x83\xbe\x96\x97\x4e\x4a\x69\x5f\xfd\x53\xb7\xf0\xef\xf6\x8e\xa0\x2a\x95\x39\xd2\xb7\xbe\xad\x37\x3c\xd5\x5f\x9e\x0f\x9c\xfc\xcf\x8f\xbd\x8b\xa0\x7e\x3a\x9c\x8a\xe9\x64\x7f\x9e\x29\x92\x85\x3e\x61\x3d\xec\xaa\xd6\xd7\x51\x29\x2b\x07\xc9\x2a\x51\x47\x72\x6b\xb0\x2c\xde\x17\x8d\x59\x56\xb7\xd4\xe6\x0d\x7a\xa4\x81\x58\xf7\xe5\xca\x4a\xb1\x45\xcd\x4c\x72\x6e\x25\x25\xff\x3e\xce\xcf\x0f\x3c\x60\xee\xe5\x5d\xdc\x24\x4e\x5e\x4e\x28\x93\x03\x81\x66\xf6\xb5\xdb\xe9\x42\xb6\xca\x67\xf3\x69\x78\x96\x3b\x14\x42\x95\x81\xeb\x53\x94\xf0\x7e\xa2\xa3\x7a\xb1\x26\xf1\x2f\xce\x85\xbb\x77\x03\xcc\x1d\x4a\x03\xcc\xc7\x88\xa8\x87\x92\xa0\x84\x4f\x4b\xb3\x70\x8e\x6d\xf2\xcc\x65\xa5\x69\x12\xcc\x8b\x3c\xdb\x40\x7a\x85\x11\x68\x0d\x8e\x76\x5a\x3a\x66\xf8\xc1\xa3\x03\xc9\x73\x4b\xab\x60\x4c\x60\xea\x0f\x36\x74\x98\xa3\xcb\xa8\x87\x80\x09\xd8\x9f\xb5\x3d\x75\x3d\x23\xb2\xb4\xbc\x14\x82\x4e\xac\xa3\xbe\x89\x25\xf8\xbe\x8f\x9f\x8b\xbb\x78\x5f\x24\x09\xf1\xa2\xb7\xe0\x4e\x76\xf8\xd9\x06\xe3\x89\xbe\x13\xed\xbf\x0f\x5c\xcf\x04\x9f\xf9\x14\xb3\xa4\x0e\xdd\x11\xc2\xcd\x3c\x1f\x8e\xef\x49\x84\xa6\xe8\x0e\x62\xc7\x6d\xd6\x94\x3c\x33\xa9\x0e\xac\x23\xaa\x02\xfa\x2e\xcf\x89\x41\xed\xe0\x23\xee\x78\xac\xaf\x24\x97\x30\xe9\x1f\x44\x61\x66\x2a\x9d\xdc\xd2\x76\x8f\x23\x46\x12\x1d\x79\x58\xbb\x95\x75\xac\xe5\xf8\xdb\x83\x95\xe4\x8a\x64\xcf\x0d\x8e\x7b\x12\x25\x5c\xa8\x1b\x3b\x7b\x5d\xf1\x53\xa9\xd7\x9b\x42\x43\x3e\xb9\xa4\x91\x54\xc2\x19\x15\xb4\x5c\x26\x89\x8f\xe1\x93\xbf\x36\x93\x81\x11\x69\xf1\xc6\x97\x4e\x7e\xd3\x04\x5f\x38\xdd\x93\xaa\xdc\x60\x1e\x15\xe4\x60\xd7\x69\x76\x5d\xad\x12\x0d\x39\xa4\xed\xcf\xe5\x94\xf4\xcb\xfb\x63\x43\xd6\xd1\x44\x45\xe4\x6d\xbd\x80\xc1\x65\xb2\x10\x4e\xaf\x48\xfa\xa2\x93\xc7\xa9\x91\x29\x8d\x17\xf8\x7e\x97\xa3\xf7\x7f\x57\xe8\x21\x9e\x0a\xb5\x61\xd4\x45\x78\x37\x0b\xef\xdf\x33\x0c\x4c\xee\xef\xa7\xc0\x40\xd2\x01\xe5\x00\xf4\x62\xa6\x29\xce\xf8\x02\xa6\xc1\x8a\xb1\xa3\x0a\x69\xc7\xe3\x37\x11\xc3\xaf\x69\x6c\xe6\x0b\x12\x51\x57\x0f\xaf\xd3\xad\x04\x21\x9c\x85\x82\x44\x71\xa6\x5b\x1e\x78\xfa\x8c\xe2\x31\xba\x39\x11\x30\x40\x9d\x3f\x9f\xdb\xf3\xf9\xcf\xd5\xd1\xf3\xee\xdf\xfe\x60\x1d\xcf\x47\x24\xbb\xf6\x88\xec\xe3\x76\xfc\xea\x26\x94\x56\x0b\xd3\x96\xc7\x00\xf4\x89\x6f\x39\xc3\x1d\xf8\x20\x1e\xfc\xe3\x08\xba\x02\x3b\x13\xbc\xfb\xf7\x9f\xf7\xb9\x3d\x5f\x07\x1e\x79\xb6\xf0\x78\xf6\x45\x65\x11\x73\xe9\x98\x94\x66\xcf\xb5\x0e\xbc\x8a\x66\x3e\xd0\x4c\xa0\x15\x73\x9d\xe8\x40\x88\x18\xce\x3c\x6a\x2a\x9f\xd9\xc7\x90\x32\xff\xbc\xb1\x47\xdb\xb7\xc1\xcc\x2a\xce\xe2\x60\xb6\x8b\x2a\x21\x4d\x3a\xc8\x43\x98\x0a\xd3\xcf\x52\x33\x20\xc1\x94\x08\xba\xb1\x76\xac\xc9\xea\x23\x20\x32\xfe\x2f\x0c\x3e\x2f\x0e\xce\x40\x1e\x56\x95\x81\x2c\x98\xb9\x07\xc6\x97\xde\xbc\xd9\xb0\x1d\xcc\x3d\x49\xb8\x0a\xe6\xba\xc5\xe7\x13\x28\x61\x33\xb6\xea\x40\xe8\x8a\xd6\xfd\xf9\x7a\x0f\x75\xb7\xa2\x81\x82\xdd\x9d\xdf\xbf\xfe\xed\x0b\x08\xc8\x7c\xe5\x44\x0f\xef\x04\xdc\x7f\x3c\xff\x05\x4c\x23\x2a\xc8\x82\xfe\x73\x1a\x19\xf2\x02\x30\x53\x31\xbb\x13\xe5\x40\x94\xac\x13\xca\xbb\x54\x0a\xf6\xd0\x7c\x0f\x25\x45\x69\x95\x98\x28\xc7\xda\xd8\x43\xc9\x3d\xa9\x26\xe1\xcc\xe8\x77\x16\x9a\x28\xc4\xb5\xb8\xdf\xc4\x17\x05\xe7\xf7\xfd\x7c\xe3\x50\xdc\xe9\x0c\x2c\xcc\x7e\x62\x3b\xab\x8f\x47\x29\xf4\xdb\x69\xe5\x92\x38\xda\x4b\x13\x33\x86\xc7\x58\x5a\xc0\x1b\x8a\x51\xf6\x04\x3f\x11\x5d\x2d\xb1\xcb\xee\x41\xac\xe4\x68\x79\x88\x51\xc2\x8e\x03\xe7\x40\x98\xfe\x67\x64\xc5\xfe\x63\x08\xc4\x76\x8a\xef\xf7\x3b\xda\x31\x6f\xf7\xf6\x13\x64\x36\xfb\x22\x70\xbb\x3b\x11\xa1\xcc\xea\x9e\x6d\x3d\xfc\xa3\xf6\xc7\x7d\x42\xca\x6e\x7b\xa8\x97\xda\x14\x54\x81\xf2\x91\x5d\xa0\xb4\x90\xd8\xbf\x8a\xd5\x33\xe8\xe2\x74\x4d\x03\xc9\x1d\x9a\x01\x8c\xfa\x70\x31\x7c\x12\x3c\xb2\x31\x1c\xe7\x88\xe7\x1e\x33\x85\xb9\x0d\xf3\x73\xff\x00\xdf\x13\x06\xc3\xd3\x43\x9d\x72\x99\xaf\x52\xd0\x93\xbd\xc6\xe5\xc5\xc1\xde\xb5\x1e\x58\xf0\x98\x3a\x25\x38\xc7\xbd\xbd\x7a\xfb\x5b\xc5\x18\x82\x4e\xd5\xfc\x93\xbf\x80\x12\xf7\x12\x55\xc7\x69\xe2\x5e\xc8\x0b\x2a\xb9\x7d\xb2\xe4\x46\x38\xf7\x90\x2f\xaa\x66\xb4\x91\xd5\xe3\x91\x68\xfe\x67\xce\x9a\xe3\xf2\xf8\x37\x74\xcb\x17\x53\xac\x3e\xc7\x54\xc3\x66\xbd\x39\x14\xc9\xd8\xdb\xd7\xfa\x38\x57\x04\xf2\x68\x40\x0a\xc6\x91\xe3\x18\xdf\x02\x27\x74\x7f\x7c\x38\x8d\x4c\x05\xf2\x0d\xc6\x56\xef\x3f\x6f\xcf\x81\xee\xce\xea\x1e\x10\x9b\xef\x5e\x4d\xcb\x40\xb6\x4d\x9c\x55\x9a\x1c\x1f\x46\x9b\x5f\x26\x46\x81\xce\xff\x22\xad\xa0\xa9\x34\xb3\x33\x24\x72\x12\x42\xbf\x10\x19\xb4\x95\x26\x05\xb3\x48\x1b\x7b\xa9\x5c\x9b\x43\x03\x98\x55\x61\xaf\x9e\x8f\xe8\xa4\x2e\xf0\xfe\x6d\xfc\x6a\x6a\x85\x86\x19\x5e\x0e\xd5\xe8\x67\x4a\xad\x7a\x4b\xd0\x6c\x76\x33\x75\x8c\x6f\x4c\x90\xdd\x2b\xfa\x1b\x76\x6f\x5a\x8e\x88\x0e\x52\x6c\x05\xb9\x98\x70\x06\xaa\x57\xc4\x00\x21\x7b\x3a\x4a\x01\x60\xec\xf0\x5c\x88\x99\xee\x0b\x64\x02\x23\x45\x35\x65\x73\x38\x75\x1b\xb9\x18\x6e\x1e\xe2\xc1\x46\x1d\xd7\xa1\x51\xab\x30\x4b\x29\x5f\x26\x38\xad\xeb\x26\x8f\x64\x44\x6c\x35\x89\x2c\x27\xac\x24\x44\x08\x4f\x70\x15\x93\xc7\xa7\x62\xcb\xa9\x7e\x33\x3c\xe6\x95\x8f\xe6\x28\x81\x3a\x15\x62\xd6\xd3\x10\xca\x9c\x77\x8c\x73\x26\x0c\xe6\x64\xee\xba\x43\x78\x2a\x40\xde\x35\x36\xf8\xf7\x39\xad\x1f\x55\x81\x83\x54\x2f\xa2\x20\x84\x21\x9e\x91\x62\x66\x3d\x9c\x4e\x9a\x14\x99\xbb\x91\x63\x29\x9d\x2d\x6d\x64\xa4\x83\x6e\x66\x61\xdf\xf2\xce\xde\x1c\x9f\x95\x4b\x9c\x84\xd7\xe4\x84\x1b\x6b\x31\xd8\x9c\x4e\x9f\xe2\xa5\x1c\x2e\xca\xb6\x0d\xfb\x69\xfb\xc0\x91\xdf\x08\xcf\x53\xd6\x70\x5b\x9c\x21\x08\xba\xe2\x6a\x87\xbc\x75\xdf\x04\x4d\x14\x15\x01\xf3\x0f\x98\xab\xed\xd1\xb0\xb6\x14\xfe\x93\x53\xcb\x53\x19\xd0\xeb\x89\x47\xae\x52\xb3\xbc\x12\x32\x0e\xd9\xeb\xd9\xde\xda\x16\x1e\x6b\xb1\xc0\xda\xa5\xaf\x9a\x72\xf8\x1b\xeb\x0b\xa9\x28\x16\xe8\x30\x0b\x38\xbc\xed\x9b\xd5\x76\x99\xab\x7a\x89\x1a\xa6\x50\x3b\x15\x29\xfa\xc9\x7c\x5c\xfe\x0c\xb5\xd2\xef\xa7\xf1\xdf\xad\x7a\xcd\x26\xa8\xc8\x9e\xce\x86\xf3\xe8\xa3\xdc\xc8\xfc\x1f\xb7\xeb\xed\xe6\x4b\x10\x6f\x8f\x1d\xef\xe1\x85\x2e\x7f\x57\x0b\xfc\x18\xfb\x5d\xd2\xca\x91\x9a\x97\x21\x84\x8d\xd3\xaa\x86\x32\x75\xee\x26\x34\xba\xbd\x61\xb3\x1e\xa0\x3e\x12\x49\xb6\x0f\x4e\x56\x26\xfe\x4a\x3b\x47\xc2\x23\xdf\xdf\x3f\xaf\x3f\x1c\x10\xd8\xf9\xeb\x1e\xb7\xeb\x7d\x46\x5e\x6e\xea\x6e\xd9\x55\x85\xb3\x95\xb2\x7c\x83\x46\xa7\x8a\x1c\xe3\x2e\x11\x0e\xa0\xbb\x05\x38\x05\x05\x6b\x6e\x4a\x81\xff\x2a\x64\xdc\x5c\x37\xb3\x59\x24\x2d\x13\x53\xb6\x5e\xe2\x81\x43\xba\xe6\x41\x94\x66\x62\x5e\x9f\x2f\xf7\x88\x9a\xd0\x9c\x86\x2c\xd0\x90\xf9\x50\x44\x1b\xed\x83\xff\x07\xe5\xa0\x29\x2f\xa9\xd9\x40\x3c\x02\xa3\x4f\x7e\xcf\x21\x8a\x8d\xe7\xb2\xd7\x2a\x38\xea\x4e\x51\x6c\xc1\xe3\x95\xa4\x3f\x8f\xf5\xeb\xe6\xb7\x89\x19\x8f\x28\xb8\xbe\xa2\x88\xb3\x68\xda\x1d\xfc\xb5\x91\xfb\x62\x29\x3c\xf1\x07\x72\xbd\xa8\x64\x2a\x3c\x40\x21\xcc\xae\x43\x2b\x6e\xc2\xb0\x6e\x3d\x0e\x5c\xd8\x95\x8b\x06\x8d\xa0\x02\x76\xd1\x7a\x7e\x1d\xbe\x7e\x91\xc9\xf8\xfc\x9e\x66\xf0\xa3\x7d\x7e\xfd\xeb\xef\xa8\x84\x8e\xd3\x35\x92\x27\x6d\x1b\xf6\xeb\x82\xaa\xf4\xe9\xdf\xe5\xf6\x39\x56\xa5\xc9\x57\x44\x2e\x7e\xcc\x99\xa1\xb3\xd3\x36\x11\x4a\x26\xc4\x61\x67\xae\x03\x5b\x81\x6b\x5d\x61\x97\xbb\x32\x18\x0a\x25\x54\xe5\x7b\x0a\x05\xf7\x92\x6f\x65\x24\xba\x1a\x75\x56\x8b\x81\x36\x3d\x20\x22\x1e\xa3\x53\x99\x63\x18\x73\x4f\x2d\xe0\x28\x03\x5c\x62\xab\x86\xe0\xc2\x81\x4d\x44\xe4\x92\x4a\xf7\xd9\xfb\xed\x1f\x92\xb1\xde\xc3\x3e\x90\x24\x29\x4f\xa2\xb2\xf6\x7c\x20\x67\x82\xf8\xe0\xbe\x24\xf7\x61\xea\x34\x66\xd7\x87\xa2\x8b\x60\x76\x5d\x81\xfe\x58\x1c\x02\x2d\x62\xd9\x3b\x7b\x8d\xc8\xa2\xc8\xf8\xca\xdf\x8f\xc3\xaf\x9c\x6f\xa2\x25\x3a\xb3\xd9\xbd\xc5\x6b\x61\x49\x6a\xe0\x14\xee\xf1\xa1\xa9\xac\xd3\xff\xcd\xd4\x95\x6c\xa9\xae\x04\xc7\xbd\xff\xc2\x2c\xbd\x6a\x66\x58\xf9\x4b\xbc\xd0\x50\x12\x42\x13\x68\x44\x9c\xe3\x7f\x77\x46\x44\x16\xd7\xef\xbe\x3e\x57\x07\xba\x6f\x83\xa8\xca\xca\x8c\x8c\x8c\xb0\x7d\xeb\x17\x11\x16\x88\x23\x12\x69\xff\xf3\xf5\xb7\x85\xcc\x6e\x22\x38\x87\x8d\xd2\xfd\x47\xf5\x78\x06\xcb\x06\x79\xe9\x85\x61\x50\x51\x11\x90\xeb\xab\x0a\xb1\xc5\xc7\x9b\x14\x6c\x29\x33\x6e\xdb\x49\x3a\x38\x49\x5c\x62\xb4\xfb\xf8\x7d\xdc\xef\x98\x5e\x57\x2b\x4e\xd0\x3c\x8b\xfa\x00\xb2\x22\x35\x86\xb0\xd3\xc9\xc5\x64\x73\x56\x88\xc6\x1a\x2c\xdd\xe1\xd4\x3a\x04\x30\x99\x4d\xc8\x00\x8b\x1d\x62\x97\xa5\xfb\x4f\x3e\x5f\xbb\xfb\x46\x6a\xb9\x74\x74\x53\xcd\x25\xe3\x18\xdc\x46\x65\xeb\x25\x3f\xb8\x59\xbc\x96\x45\xc7\xe7\x70\xaa\x6a\xbc\xcd\xbf\xcb\x31\xdf\x9e\x1c\x87\xa4\x06\x0b\x85\x7a\xbe\x53\x5b\x64\x6f\x45\x86\x97\xcc\x0d\x27\x28\x40\x72\xfd\x6c\x6d\xbf\xde\x76\xde\xd0\x65\x72\x63\x9f\xeb\x89\x86\x5b\x2e\xbd\x48\xfa\xb0\xb7\x73\xb9\xd2\xba\xc4\x95\xa8\xfa\x62\xf2\x64\x01\xd0\x64\xc8\x75\x22\x91\xed\xee\xba\x61\x40\xdf\x33\x57\x87\xe8\x5c\x6f\x27\xf1\x59\x99\xca\x15\x06\xe6\x27\x1b\xb5\x90\x5a\xe2\xcf\x3f\x31\x57\xa4\x0d\x1f\x19\x59\xb4\x5f\xfa\x8d\x63\x0b\xa5\xea\xed\x54\xcf\x23\x14\xe9\x69\xb4\x85\x86\x35\x3a\xd2\xbd\xe7\x2a\x28\x46\x2c\x80\x45\x1c\xa1\xf4\x16\x98\x5a\xbd\x4c\xc3\x12\x0d\x31\x22\xa9\x60\x64\x68\x5e\xe2\xa0\x27\x76\xf6\x55\xaa\x9f\x68\xf1\xe2\xfa\xa3\x18\xb1\x12\x8d\xa2\x71\xaf\x3a\xc0\x8b\x95\x5a\x41\x57\x3b\x27\x37\xc4\x58\x94\x17\x3b\x21\xfd\x3b\xb9\x60\xee\xe4\x91\xb8\xa3\xaa\x4c\x54\x9c\x28\x96\xfc\xa9\x0a\x05\x5d\x34\xa7\xb4\x96\x89\x73\x4d\x64\x06\xcd\xf8\x60\xeb\xdf\x9b\x99\x65\xf3\x9b\xf3\x8e\x2a\x2a\x1a\x81\xd4\xb0\xa1\xc5\x8c\xde\x69\xd3\x10\xa6\x90\x8f\x2b\xfc\x31\x24\xd5\xd4\x53\x04\xde\xe7\x41\x74\x2a\x42\xf2\xf4\x23\xb4\x37\xb3\xe4\x4f\x95\xdd\xec\xb2\x01\xc0\x2b\xb6\x88\x24\x3a\xb6\x6f\xe7\xb6\xc8\x28\xa4\x86\x7e\x99\x74\xcd\xaf\xae\x68\xa9\x14\x02\x0e\x12\x3f\xef\xc1\x03\xd3\x7d\xb4\xf0\x48\x6a\x7e\xf4\x8c\x4a\xb2\x66\x3c\x90\x9e\x95\x58\xa9\xc1\x5e\x9b\xa5\x4a\x73\xc3\xae\x58\xe2\x81\x39\xeb\x91\xc1\x30\x3f\x80\x1b\x2f\xcb\xaf\xf7\xa1\x7e\xe1\xe7\xf2\x4b\x7f\x7b\x11\xb7\xd9\x40\x87\x91\x77\xa0\x95\xaa\x59\x4c\x18\xdc\x89\x31\xc3\x40\xd7\xe8\x4f\xe2\x8b\x97\xa3\x6c\xb9\xdb\x6f\x78\xb1\xd1\xd7\x6e\x2e\x8b\xd6\x61\x3c\x91\x7b\xaf\x8f\xa2\xb4\x68\x4d\x44\x51\x33\xbd\xae\x74\xea\x9e\x2c\xaa\x88\x68\x44\x6d\x51\xdb\x33\xa1\xa1\x41\x8d\xfd\x46\x4a\x33\x86\xd5\x6e\x25\x71\x48\xd8\xf6\x08\x76\xad\x7b\x32\x39\xea\xee\x67\x02\x09\x66\xd5\x43\x51\x05\x74\xdd\x2e\xf6\xbf\x15\x5d\x62\xaf\xc3\x52\x72\x2d\x3f\x1c\x03\x70\x3d\xe7\xa5\x67\x85\x20\x83\x88\x5d\xbd\x60\x3a\x9a\xb9\x58\x4f\x40\x7b\xa9\x06\x69\x6e\xda\xc7\xfa\x3c\xb2\x79\x0e\x79\x06\x99\x72\xa1\x52\xa5\x50\x43\x03\x11\x73\xc2\x5c\xfb\x38\xdf\x7f\x90\xeb\x8d\x15\xf0\xfe\xf6\x52\x2a\x75\xf8\x30\x70\xe7\xe3\x37\x94\x47\xa5\x0a\xc0\x37\x79\x7f\x46\x04\xf7\xcf\xa0\xb1\x84\x7f\xa2\x50\xb4\xa2\x14\x09\x51\x29\xf8\x04\xe5\x22\x39\x41\x93\x77\x8e\xc7\x5c\x04\xc8\xb5\xd9\x8e\x57\xf2\xfa\x4e\xa7\xe8\x87\x72\xbc\xdc\xc2\xd3\x62\xf9\x4e\xc9\x89\x1a\x88\x9d\x3a\xf3\x5d\xe5\xa0\xa8\x3d\x92\x4c\xb1\x8f\x38\x08\x4f\x73\x9d\x62\x25\x57\xaf\x7a\x6a\x3f\x62\xdd\x5a\x81\xec\x66\x6a\xe1\x23\x8d\x00\x78\x96\x6b\xe5\xdf\x96\xf3\x91\x1a\x36\xfd\xbd\x3e\x3c\xd9\xf9\x81\x7c\xbf\x86\xbc\xed\x8a\xbe\x01\xa2\xd8\xf2\xb9\x79\xa0\xe6\xf6\x2e\x2a\x45\xb8\x31\x75\x1c\x0e\xd8\x9f\xae\x87\xf3\xcd\xf9\x8a\x64\xd9\x08\xd8\xdc\x3b\xbe\xf9\x77\xd7\x30\x36\xc9\x9b\x68\xe1\x8e\x02\xce\xa0\xbc\xa1\xb8\x24\x0f\x0f\x8e\x15\xc5\x51\x1f\x97\xfc\x4f\x13\xe8\x60\x05\x35\x4f\x9a\xb4\xe7\xd2\x8d\xac\x76\x4b\x7a\x92\x54\x59\x43\xd9\xbb\x6e\x26\x62\x96\xe6\x70\xe0\x7c\xe8\xa4\x6f\xb9\xbd\x30\x90\x5c\x2f\x97\xa1\x6c\xde\x24\xbb\x9f\xd9\x56\xbe\x9e\x8f\x6a\x1e\xdf\xf2\xea\x91\xe1\x5d\x5c\xee\x9a\x0c\xda\x91\x44\x79\xbd\x46\xcf\x57\xce\xf2\xd1\xee\xca\x1f\xa8\x7d\x8a\xc8\x0b\x16\x5b\x7a\x3e\xdb\x59\xfc\xe0\x71\x20\x22\xb2\xc8\xef\xf8\x9e\xf8\xf6\x60\x66\x2e\xea\x14\x6d\x99\xf7\x7e\x91\x46\x29\xda\x25\xec\x8f\x13\x45\xc0\x2c\xe1\x70\xc5\x2a\xb2\xd2\x84\x7c\x5b\x78\x9b\x34\xfa\x9a\xd9\x56\x94\xc9\xa6\xd5\x4d\x02\x6d\x5b\xaf\x84\xe0\x41\xe3\x4e\x16\xcc\x88\x98\xf8\xe2\xd2\xfb\xab\xfd\xe0\x53\x23\x30\x11\x71\x28\xb3\x75\xb9\xd4\x77\x77\x39\x1e\xd8\x77\xee\x81\x7a\xf0\x68\xfe\x49\x69\x20\x92\x9c\x1c\xef\xb1\x07\xe7\x4e\x0c\x9d\x25\x34\xfd\x3f\x41\x50\x7c\xc8\x6a\xa5\xcc\xc1\x8d\xe5\xc0\x54\xb3\x33\x81\x39\x6a\x9a\x08\xdb\xa1\x6f\x11\x4b\x4b\xbb\x23\x6a\x60\x11\xd3\xc0\x4b\xbd\xac\xdd\xe0\x64\xd0\x59\x5c\xab\x3c\x3c\x5e\x9b\xc8\xf6\xcb\x36\xca\x80\xa3\x7b\xbe\x33\x16\x2d\x9d\xd5\x57\x3e\x86\x12\x7d\xa0\x49\x2e\xee\x57\x7e\x9b\x25\x7a\x9d\x83\xbe\x78\x54\xd2\x6c\xe9\x1c\x0b\x28\xe0\xbc\x62\xfe\x54\x51\x6a\xce\x1b\xe8\xe0\x0c\xb8\x77\xea\x06\x7e\xc8\x4e\xc3\x51\x3e\x56\x8e\x4b\x09\x1b\x81\xfa\x16\xc8\xb3\x7b\x7c\xbf\xe1\x7e\xb8\x23\xee\xd2\x31\x4e\x5d\x5f\xcb\x39\x1f\xbc\x51\x18\x1a\xd3\x2b\x81\x2d\x2b\xb4\x1d\x70\x79\x7e\x15\xac\xa7\x42\xce\x6e\x49\xb0\xcf\xb5\x69\xbd\xed\xc3\xe9\x8a\x59\xf0\x4e\x28\x74\xf6\x58\x3d\xf6\x95\x65\x04\x38\x70\xb8\x61\x35\xda\xab\x3c\x27\x08\x0a\xab\x61\x3c\x5b\x5c\xdd\x4b\x07\xc9\x93\x6f\x3b\xda\x85\xb4\x23\x06\xa3\x37\xbb\x93\xb0\xba\x0f\xec\xac\x7f\x7f\x13\xcd\xee\x99\xb2\x49\x21\x32\x19\x9e\xb2\x8a\x82\x9c\x27\xf3\xcf\x2e\xdf\x44\x1c\xd8\x4b\x5f\x96\x29\xc7\x85\x64\xf9\xfd\xf5\x6f\x8f\xaf\x1d\x87\x12\xb4\x79\x0e\x17\x26\xa8\xb6\xe4\x1b\x17\xa9\xe8\xa4\x9c\xb6\x55\x93\x62\xd2\x3f\xce\xde\x6f\xe4\x60\x72\x05\xef\x89\xba\xcf\x0c\xe4\x53\xf2\xb5\xff\xf9\x24\x88\xe6\x2a\x0a\x08\xff\x6b\xec\x1b\x24\x9a\x56\x0f\xa2\xb5\xd4\x3b\xa1\x6f\xf0\x31\xc4\xe3\x7b\x79\xb3\x0c\x3a\xaa\xaf\x61\xa1\x4a\xad\x97\xd1\xf2\x34\xc5\xeb\xaa\x7d\xb0\x91\xc2\xae\x11\xcb\xc7\xf1\x35\x7d\x4e\x92\x93\x07\x26\x27\xec\x78\x18\x75\xfa\xbe\xa2\xa4\xf2\xab\x3b\x3f\x97\x55\x3b\xc6\xe1\x53\xfa\xfc\x7b\x8c\xf6\x3d\x87\xb6\x3c\xd3\xdb\x49\x9d\xd9\xe9\xf1\xab\x4f\xd4\x87\xe6\x26\x1d\xa2\x09\xf5\xfe\xe0\x7a\x3b\xba\xbf\xa7\xab\x43\xca\x04\x17\xe1\xb4\x9a\xf0\xf4\x85\xaa\xe2\x20\x82\x13\xe8\x41\x8e\x23\xa5\x0a\x53\xc9\x37\xd1\xfe\x84\xa4\x81\x4e\xba\xcb\xdc\xe4\x0b\xfe\xa9\xdb\x71\xbb\xbc\x00\xd3\xdf\xf4\x1f\x6e\xc9\xd4\x2c\x5c\x80\x18\x3b\x3f\xab\x51\x3c\xd8\x2b\x23\xc0\x03\xf1\xb0\x91\xdf\x26\xd7\x3b\x05\xbd\x21\x38\xda\x8e\x4b\x05\x1f\x5a\xb6\x78\x27\xfb\x97\xdf\xf5\x39\x19\x65\x3b\x22\xc1\xee\x94\x57\x61\x89\x91\xe6\x69\x99\x1e\x4a\x21\x21\x58\x0f\xfd\x68\xb5\xc8\xc9\xd4\x3e\xfe\x8d\xe1\x46\xc4\x74\xef\x4e\x79\x5d\x30\xcc\xb9\xcf\xd6\x22\x42\xaa\xcd\x8d\x41\xb8\x44\xf5\x5f\x52\xfe\x31\x51\x2c\x93\xbb\xcb\x0a\x8e\xb5\x36\x6c\xdf\x35\xce\xa0\xea\xa7\xc8\xbd\x72\x5f\xc7\x36\x29\xaa\x1f\xcb\x4a\xcd\x68\xe8\x3f\x15\x4e\x4e\x74\x75\xb7\xf7\xfb\x71\x3f\x70\x7e\x28\x6b\x8b\x5c\xea\xf0\x83\x1d\x49\x83\x23\xc7\xca\xc1\x5e\x53\x9a\x3f\xb0\x32\xa6\x79\x98\x94\x11\x45\xc1\x7d\xad\x09\xbb\xa5\x05\x3e\xdf\xb9\x0c\xcf\x85\x12\x69\x29\x0f\x9a\xfb\x7e\x3f\x81\x86\x88\x47\x32\xf2\x52\xd0\xfe\xf2\x49\x57\x3b\x91\x1f\xc2\x98\x1a\xc1\x1c\x56\x52\xba\xdf\x6a\x02\x29\x2b\x4a\x36\xf4\x98\x3a\x96\x08\x3f\xb6\x37\x27\x8d\xfa\x21\x49\x45\x46\x4a\x7b\xd7\x6c\x4d\x71\x1a\x69\xf4\x1b\x96\x64\x3e\x4b\xdf\xcb\x7a\xd4\x87\xea\xb1\xe9\x2f\x87\x32\x7d\xef\x9c\xda\xc8\xa0\xf6\xaa\x0f\x6f\xbc\xb0\xf0\x5a\x9e\x29\x5b\x9f\x5d\xba\x48\x00\xd7\x3b\xba\xed\xdc\xf9\xda\x5f\xab\x4c\x3a\xfc\x07\x79\x54\xa6\x96\xc9\x6d\xf2\x64\x4b\xc1\x75\x56\x07\x6a\x74\x3c\xd5\xf6\x50\xa7\x93\x2d\x85\x56\xa6\x46\x42\xed\x84\x97\x7a\xc5\xb6\xd8\x27\x76\xe6\x54\xdc\xd6\xb1\x44\xdf\xc4\xb0\xfc\x36\xdf\x62\xe0\x28\x6a\xdf\x2c\x5c\x27\x56\x1e\x3a\x49\xf4\xbf\xa2\x3f\x1d\xea\xb9\x52\xbd\x4a\xcc\x2b\xea\x4c\xfd\x3c\xde\x9c\x5b\xa7\x34\x89\x84\x1b\x2d\x97\x39\x71\x43\x1e\xeb\xea\x74\x20\xac\x84\xd8\xad\x40\xf1\x88\x5e\x1c\x63\x14\x11\x45\xef\xd8\xfb\xc7\x23\x65\xfa\xc5\xfb\xe5\x70\x02\x7f\x05\xf2\xba\x4a\xbd\x2a\x14\xc0\x6a\x2b\x70\x6c\x89\x17\x56\xe9\xac\x7c\xfa\x15\x29\xc1\x13\x4b\x1e\x1f\x8f\x9a\x7c\xde\x83\x48\xd2\xfe\x57\x27\x12\x23\x6f\x5d\xc3\x08\x91\x43\xf8\x44\x58\xdf\xfc\xab\x8a\x22\x4d\xfb\xbd\x8b\x2e\xc9\x47\x7b\x2f\x26\xb0\x4a\x38\xca\x9e\x54\xaa\x0c\x21\xe3\xa5\x31\x36\x8c\xc8\xab\x32\x8c\x52\x49\xe0\x07\x8b\x5e\x58\xce\x03\x0e\xab\xeb\x21\x3f\x4f\x78\x29\x97\x3f\xfc\x41\xfc\x58\xb3\xf7\xd3\x19\x29\x3e\x4b\x0f\xfd\x49\xfe\x50\xf1\xb3\xe7\x2e\x03\x2b\xea\x32\x7d\x64\x05\x59\x26\x96\xe6\x78\xf2\x53\xcc\xc9\xfb\x4b\x48\x38\x89\x5e\xb6\x80\x8b\xec\xc3\x5c\xf8\x06\xa7\xc4\xc1\xbe\xa8\xa6\x37\x26\xac\x70\x46\xe2\xb5\x52\x26\x0d\x4b\x43\x28\x37\x77\xc7\xc9\x7c\x70\x45\x6f\x28\xfc\xfb\x60\x6c\x98\x33\xe7\xe0\x93\xe1\x87\x28\x90\x4d\xae\x28\x60\xf1\x20\x59\xc5\x31\x19\xa9\x81\xe0\x11\x60\x88\x2e\x51\xe2\x5b\xbf\xef\x73\x4b\x8e\xa0\x65\x41\xee\xd8\x43\x80\x48\x9e\x48\x22\x2a\x63\xd5\xcc\xe1\x56\xbc\x3c\x02\xe8\xb4\xb3\xa2\xf0\x48\x85\x5f\x2b\x74\x40\x4a\xd5\x1c\x4c\xf2\x8d\xc2\xf9\xf3\x54\xb9\x4d\xe4\xaf\x23\x94\x87\x67\xb2\xd0\xdc\x60\xfe\x58\xf8\xc6\x9e\x4e\x97\x2a\x9d\xb8\xb9\x6b\x97\xd4\xac\x35\x19\x83\xe6\x98\x0a\x3a\x8b\x24\xca\x6a\xe2\xa1\xa4\xb2\x4f\x5d\xee\xa6\x59\x5d\xd2\x62\x06\x7b\x69\x2d\xe3\xde\x96\xd8\x2a\x4a\x88\x46\xc3\x23\x74\x7e\x67\xfe\x48\x61\x3d\x6e\xf9\x62\x1b\x38\xb1\xda\x42\xee\x60\x94\x81\x6f\x5f\xae\x8c\x28\xed\xd8\x7d\x38\x1c\xde\xae\xef\xcb\xbb\x61\x17\x01\xec\x66\xde\x7a\xbb\x8f\x9b\xf3\x87\x16\xfb\x4b\x03\xba\x32\x30\x60\x35\x71\xbe\xcb\xcc\x61\x7f\x91\x68\x98\xc5\xc1\x44\xd9\x84\x2c\x8e\x30\xdb\x23\x75\xc1\x34\xe4\x0d\x6b\x16\x7b\x4c\xb8\x02\x70\x31\x7c\xef\xc7\xca\x23\xd2\xf0\xfe\x9b\xff\x61\x7d\xcc\xb6\x51\x79\xb2\xcf\x9d\xd3\x8a\xc6\xb9\x0e\x52\x1b\x5a\x2b\xc9\x9b\x1d\x20\x25\x27\x60\x28\x7c\xb4\xcd\x07\xcd\x4f\x82\xd1\xa6\xc3\x6b\xac\x43\x98\xa2\x8e\x6b\x9c\xb3\x66\x57\xdd\x1b\xd2\x8a\xb8\x56\xca\xd8\xd6\x76\x77\x9f\x46\x6c\x0b\xdb\xec\xb9\xb7\x99\x1e\xb4\x1d\x60\x86\x0c\xfc\x88\xb3\xa7\xed\xf3\xd3\x09\x45\xa1\xa9\xc0\x44\x52\x74\x73\x28\xaf\xf5\x71\xf7\x43\x93\xc5\xe9\x2c\x0a\x7c\xed\x04\x29\xb9\xf3\x4f\x1b\x3b\xea\xa0\x77\x32\xc4\x8a\x93\x82\x05\x5a\xbd\x26\xe5\xab\x54\xf9\x1e\x15\x01\x14\x08\x34\xa3\x7e\x3a\xdc\xce\x1e\x18\xc0\xfb\xdb\xeb\x29\x6a\x22\x0d\x68\xc8\xaa\x5e\x6b\x3a\xef\x72\xa3\xfb\x37\xfb\x3a\x02\xd7\x04\xef\x98\xa6\x4f\xac\x9a\xed\x84\x11\x79\x1e\xe1\x44\x85\xda\x38\xea\xa1\x47\x66\x59\x2a\x33\x63\x34\x60\x3c\x1a\x0c\x89\xc3\x84\x76\x15\x09\xa5\xa8\xe3\x94\x36\xb4\x22\xd4\xdf\x96\xe7\x97\xb7\xf3\x7a\x23\xe7\xd7\xfe\xd2\x59\x78\x9b\xab\xe4\x8b\x73\xd3\xf5\xc6\x4f\xd7\xd3\x33\x5f\x78\x77\xce\xe7\xfd\x98\x29\x49\x3a\xff\xc5\x21\x33\x96\x76\x3c\x3b\x1f\x91\xb9\x8e\xee\xbc\x50\x5f\xe4\x30\xb2\xf3\x42\x35\x37\x49\x34\x81\xd6\xbe\xd5\xcf\xbd\xc2\x92\x0c\x25\x23\x7d\xe9\xbc\x6b\x08\xa7\x88\xd2\x98\x55\x16\x83\x35\xc3\x86\x98\x13\x3d\xa7\xfb\x5c\x27\x7f\x6f\xcb\x54\xa1\x85\xbd\x6c\xee\xa4\x7e\xb0\xbc\x52\x71\xe7\xd1\x6e\xa5\xfb\xcc\x57\xce\x87\x79\x25\x00\x2f\x5c\x3a\xa2\xfb\xc7\x5a\xec\x00\x89\xa8\xbb\xfd\x48\x5c\x98\xa0\x03\x2a\xc4\xd1\xe7\x15\x7f\x70\x51\xce\xcb\xc6\xa1\x93\xcf\xe7\x18\x8a\x49\x20\x57\x54\x7c\x85\x6d\x82\x08\x6f\xf3\x50\xef\x6f\xe4\x5f\xe7\xcd\x67\x26\xc8\x35\x97\x10\x58\xdd\x91\x88\x53\xa9\xe6\x98\xd7\xa1\xb9\xb2\xa1\x0d\xa7\x1a\xcf\x44\xda\xa2\x7b\x71\xb6\x23\x64\x95\x68\x6e\x96\x8f\xa5\x95\x6b\x79\xea\x5c\xcf\x6d\x2f\x24\xd2\xbb\x05\x82\xe1\xd3\xc2\x5d\x35\xba\x3f\x93\x14\x7f\xf8\xef\xc1\x14\x05\x0a\xe6\x7c\xd4\xde\xbc\x4f\x26\x01\x27\x8b\x42\xb0\xa5\x0e\xd9\x2a\xfd\x74\x23\x79\x37\xff\xaa\xac\xbe\x11\xf0\x1a\xf2\x36\x62\xb1\x00\x49\x3b\xde\xb4\x7c\x71\x57\x13\xd8\xed\xe1\x65\xd5\xdd\x2c\x9a\x0e\x51\xee\xc2\x49\x73\xbe\x52\xb1\x20\xb4\x9e\xe5\x2d\xea\xcf\x56\xf2\x7d\x6e\xfb\xa7\xb0\x36\x0a\x14\x38\x05\x61\x70\xc5\x8c\xa5\x4e\x3e\x99\xd0\x29\x3b\x53\x5c\x0a\xa6\x6f\x1c\x90\x59\x8a\xfc\x51\x61\x75\xda\x92\x1a\xa3\x97\xcb\xf2\xfa\x3a\xb0\x9e\xfb\x20\xd2\xca\x09\x6a\x62\x55\xd5\xfb\xfb\x9d\x24\x04\x09\xd5\x16\x37\x85\x16\xc0\x7b\xbf\x9e\xf0\x85\x4b\xa9\x1a\xe1\xea\x7d\x58\x8f\xe1\x34\x9c\xc9\x01\x3e\xb3\xc0\x3e\x1c\xce\x6e\x81\x61\xd5\xec\xaa\xab\xd4\x99\x28\xcc\xac\x32\xaa\x20\x7f\x29\xc2\x8c\x5f\x3f\x65\x09\x01\xf5\xb5\x77\xc6\xcc\x47\xc7\xc2\xe7\xf9\xed\xde\xcc\xbc\x82\x5c\x46\x70\xf9\x58\x3b\x26\x82\x56\xbb\xc9\x22\xfb\x78\xc7\x1f\xfc\xde\xc2\xd6\x2c\x11\x0a\x5b\xfa\x0e\x25\x28\x3d\xe2\xd5\x03\x72\x7e\xea\xc9\x85\xc4\x6b\xea\xb1\xea\x64\x25\x36\x5a\x56\x22\x65\xad\xb1\xad\xaf\x47\xa6\x3a\xb0\x26\xf4\xb6\xcc\xc8\xe1\x5a\xa5\x56\xd4\x4f\xe2\xa5\xd5\xb7\xb2\xf0\xfe\xf5\x59\x5f\x70\x93\x45\x3b\xf1\x95\x57\xe2\x7f\x47\xb1\x4b\x91\x86\x07\xf1\x45\x30\xbe\x22\x44\xbf\x7f\xb1\xc8\x9c\x7a\x1f\xf6\x44\xeb\xf2\xa1\xf3\x53\xfa\xdc\xad\x06\x26\x67\x17\x9f\xb6\xf2\x12\xe6\x3f\xbc\x2c\xbb\xf9\x2e\x85\xa5\x2e\x24\x6c\x90\x62\x14\x94\x24\xa1\xbe\xd4\xa0\xe8\xd0\xb7\x73\xe3\x76\x89\xb9\x65\x8c\x85\xf3\x86\x48\x27\x3e\xb9\x64\x21\xe8\xaf\x8a\xba\xf4\x00\xe4\xa2\x4b\x1a\x4b\xa1\xc4\x83\x4c\x9a\x7b\xc2\xf9\xfe\xa4\x6f\xa2\x85\xbb\x8f\xb6\xbc\xc0\xbf\xe3\xb7\x0f\xa3\x12\x39\xe7\x37\xa6\x69\x2a\x74\x3e\xf9\x44\x94\x1a\x0a\xbb\xdc\x38\xc9\x0a\x2c\xce\xa9\xc7\x79\x11\x9c\x69\xb8\xd6\x22\xf3\x00\xc7\x64\xb5\x05\xcf\x00\x46\xb2\xdb\xf9\xe4\xb2\xcd\xf4\x95\x21\x73\xab\x2b\x2f\x07\xbc\x97\xf3\xf9\x34\x7f\x5f\xfc\xa8\xcf\x27\x9e\x25\xb0\x56\x66\xd4\x3e\x1f\x98\x71\x82\xf7\xdf\xbb\x34\xde\xe0\x59\x62\x85\xbc\x97\xa5\xe0\xaf\xb6\xec\xbf\xc2\x38\x8a\x46\x78\x71\xf1\xf5\x61\x42\xba\x74\xf8\x88\x25\x28\xcf\xca\x00\x55\xfa\x0e\x73\x1c\xb8\x69\x47\xd7\x33\x50\xe3\x1f\x17\x24\xc7\x08\x09\xa3\x36\xa8\x9e\x9d\x20\x63\x87\x9c\x2a\xef\xdf\xcb\xfb\xc8\xa7\x37\x57\xcf\x7e\x89\xd1\xed\xa4\x81\xc4\xf3\xa8\x1e\x8c\x04\x97\x9a\xea\xd0\xf0\x62\x28\xef\x36\xa9\x69\x62\x21\xcc\x61\xa2\x89\xdb\x3b\x2b\x5a\x19\xed\x6e\xc5\x8d\x25\x15\x2c\xdf\xe3\x14\xbe\xa5\x8b\xe2\x33\xb0\xa3\xc8\x5f\x42\x11\x2a\xcd\xf1\x0e\xd5\xa2\xb9\x5e\xcf\xe7\xed\x81\x73\xc2\x0f\x3b\x5f\x74\x9a\xdd\x6f\x04\x57\x93\x72\x5b\xfa\x81\xa1\xb9\x89\x12\xbe\x59\xef\x16\x30\x59\x3f\xfb\x5c\x96\xfc\xf5\xdd\xa2\x6a\x55\x30\xcc\xb6\x6f\xcd\xfa\x94\x52\x16\x1a\xba\xce\x0f\x96\x21\x31\xa8\x27\xf0\x02\xa1\xee\x76\x1e\xae\x2d\x4d\xdd\xbb\xe4\x5b\xce\x12\x8e\xb4\x64\x22\xea\x5c\x7c\x05\x9a\x4d\xfa\x95\x60\x49\x7a\xd9\x43\xa7\x03\x11\x12\x86\xce\x4f\x7c\x2b\x32\x6b\xe5\x2a\xa1\x2b\x81\x3d\xb2\xfb\xd8\xb8\xeb\x44\x4d\xed\x32\x75\x0c\x52\xa5\x5f\xa0\x35\x6b\x58\xcc\x9d\xb5\x2c\xd6\xf9\xe6\x44\x74\x16\xbb\xcb\x12\x34\x69\xe7\xad\x71\xfe\xd9\xee\x89\x3a\xbd\x6b\x22\x9f\x48\x82\x5a\x3a\x62\xab\x2e\x12\x58\x9f\xd1\xb0\x6a\x2f\x9d\x80\xbd\x9d\x55\x1a\x1f\xdf\x8b\xf7\xb2\x1f\xa2\xf5\xd8\xe1\x6f\xff\xb4\xa4\x13\x1f\xa7\xc5\x55\x7e\xf3\x9b\xb1\xc2\xa2\xa9\x33\x8f\x11\x57\x63\x2f\x53\x18\x2f\x4e\x05\x71\xcd\x2d\x4f\xad\x98\x5c\xac\xcb\xf3\xdc\x91\x75\x3d\x9f\x02\xf5\xbf\x25\x60\xc0\xc3\x00\x45\x4a\x13\x48\x9f\x42\x67\x61\xbf\x8b\x22\xad\xc4\xc7\xec\x86\xb8\xa6\xc7\x1f\xdd\xdf\xd9\x4f\xf8\x93\x99\xeb\x2f\xd9\x9d\x9e\x49\x2a\xc0\x0c\xa7\x08\x21\xaf\xa9\xed\x02\xe9\x57\x35\xba\x8a\xdc\x20\x75\x68\xfc\x8a\x26\xb0\x12\x9f\x7e\xf9\xac\xb5\x3d\x96\xb9\x1b\x2c\xfc\x47\x24\x83\xd0\x34\x24\x41\x52\x84\xae\xeb\x45\x48\xa1\x79\x25\xff\x1e\x7d\x6c\xa9\x57\xc6\x16\x29\xc8\x16\x4f\x7d\xfe\xb2\x9e\xcb\xf6\x8a\x25\xd6\x04\x2b\xea\xc8\x76\xc7\x7c\x12\xbe\x76\x1c\x37\x8f\xb5\x18\x04\x60\x5b\xb5\x5d\x9f\xbd\xfe\xf0\xb2\x53\x45\xd8\x56\xf9\x0f\xb1\xde\x0a\xf5\x90\x41\x75\x73\x32\xe6\xb7\xe3\x41\x8b\x6a\xd8\x7d\xbc\x06\x00\x21\xdc\x66\x56\x4b\x7a\x10\x4e\x5c\xdc\x81\xfe\x0a\xd2\x68\xda\x9f\xf6\xde\xd0\xc0\x78\xc7\x8e\x6d\x54\x82\x6d\x03\x72\x45\xf2\x37\x31\xc4\xe4\x60\x85\x6d\x34\xaf\x8f\xb1\x8f\xf1\x24\x7a\x5e\x7a\x5d\xd4\x17\x89\xbd\xd3\xaf\x33\xab\xe7\x8c\xb8\x0c\xb5\x8d\xd9\x5e\x4b\x7e\x5a\x34\xd7\x3a\x0d\x3c\x37\x5c\x6e\xf4\x92\x3e\x17\xaa\xf9\x9c\x9b\x2d\xe4\x54\x88\x92\x71\xea\xf9\x70\x57\xc6\xca\xd9\x74\xc6\xd2\x6b\x33\xac\xac\x0c\xf1\xc2\x46\x3d\x39\xe9\xf0\xf9\x7f\x83\x56\x83\x05\x31\xa1\x63\x45\xf5\xc8\x0b\x44\x3b\xb9\x32\x89\xa3\x5d\xf6\xae\x48\x5e\x26\x41\xe2\x44\xc5\x3a\x26\xb9\x4e\x84\xdc\x0b\xf1\x26\x6f\x49\xe0\x2c\x3e\xc7\x69\x96\xbe\x7b\xaa\x52\xd3\x29\x1d\xfc\x07\xa2\x90\xcb\xf0\x69\xa7\x9a\x19\xe7\xcc\x1d\x03\xab\x6b\x96\x6b\xf9\x1c\x27\x3f\x40\xd7\x26\x61\xbb\xff\x36\x56\x29\xae\x78\xb6\x5f\x8e\xc9\x93\x82\x1a\x7d\xf6\x53\x9a\xac\x93\xcd\xb9\x9c\x59\xb9\x2d\x8e\x98\xda\xb6\x1a\x32\x17\x36\x91\x23\xd0\xf2\x0c\x25\xde\xf7\xfb\x61\xf5\x27\x8f\xfc\x21\x34\xb3\x28\x8b\x13\x10\x70\x86\xd5\x19\x8c\x80\x9d\xfa\xb7\xa3\xab\x60\xcd\x6e\x4a\x25\x94\x4e\xad\x8b\x44\x32\x94\x49\x18\x7a\xec\x81\x1d\xa1\x39\xed\x89\xac\xc1\x98\x85\xc8\x9d\xbf\x59\x91\x58\xaa\xe4\xa1\x01\x61\x84\x71\x76\x7b\xa9\x08\xcc\x21\xc2\xaa\x9c\x78\x91\x54\x4a\x3f\x77\xee\x72\xdb\x85\xcf\x3c\x72\x8e\xac\x77\x2d\x0f\x5b\xc0\x45\xcf\x31\x10\x50\xbb\x26\xc5\x58\x47\xe4\xb0\x92\x25\x16\xc5\xbe\x88\xf3\xd4\x63\xa5\xc5\x57\xb3\x93\x1b\xb1\x5a\x9e\xb6\x9f\x5d\x4c\x06\x4d\x88\x4e\x63\xca\xb3\x76\x1f\x87\xf8\xf3\x20\xcd\x5f\x84\x05\x85\xec\x5e\xd4\x92\xb0\x74\x2d\x32\xcb\xc7\x5c\xf6\xf8\xda\xd1\x94\x50\x59\xf5\x42\x60\x84\xe3\x29\x3f\xfa\x08\x48\xab\xf9\xee\x7f\xfe\xf7\x3f\xfe\x2f\x00\x00\xff\xff\x9c\x84\xb0\xba\xce\x07\x01\x00")
+
+func dataPasswordsJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataPasswordsJson,
+ "data/Passwords.json",
+ )
+}
+
+func dataPasswordsJson() (*asset, error) {
+ bytes, err := dataPasswordsJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/Passwords.json", size: 67534, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataQwertyJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x98\xd7\x52\x23\x3d\x10\x85\xef\x79\x0a\x18\x72\xce\x39\xe7\x9c\x33\x98\x9c\xc1\xe4\x8c\x31\xcf\xfe\x6b\xf8\xb7\x56\xdf\xa9\xb2\xc6\xbe\xd8\xbe\xd9\x6a\x2f\x33\x5f\xb7\x5a\xad\xa3\x63\x67\x8a\x8a\x8b\xa3\xc9\xa7\xa3\x87\xcb\xa8\xa7\x38\xfe\xe0\x3e\x96\xb8\x70\xf7\x37\x74\x1f\x0e\x7f\xa2\xba\x3f\xf1\xdd\x6b\x3a\x9d\x2b\x8e\x5a\x86\xfe\x3e\x13\x3d\x2e\xcb\xf3\xbf\xe1\xde\xff\xff\x13\xa5\x22\x92\x7b\x7b\xfc\x5b\xbb\x19\x1f\xef\x65\xf3\x67\x6c\x1c\x8c\x84\x5c\x4a\x30\xca\x09\x02\xda\xca\x7c\xc2\xb3\x71\x1f\xbf\x6f\x2a\xb8\x8c\xe0\xd6\xd2\xfc\xe0\xf6\x72\x0f\x7b\x5a\x91\x24\x02\x2e\x27\x18\xd5\x04\xc1\x1d\xfb\x1e\xf6\xb2\x26\x49\x04\x5c\x41\x30\x5e\x0a\x82\xbb\x6a\x3c\xec\x75\xdd\xc7\x9f\xdb\x0a\xae\xb4\xda\xbc\x2a\x82\x51\x4d\x10\xd0\x54\xed\x13\xde\x2f\xfa\xf8\x6a\x5a\xc1\xd5\x04\x77\x57\xe5\x07\xd7\x1f\x78\xd8\xc3\x92\x24\x11\x70\x0d\xc1\x9d\x15\xf9\xc1\x48\x1e\x57\xc9\x7e\x0b\xb8\x96\x60\x54\x13\x02\x4b\x12\xf4\x3e\xde\x13\x01\xd7\x11\x7c\x3b\xef\x1f\xbc\x99\xf5\x71\x7a\xce\xc7\x0d\x03\xc1\xe4\x02\xae\x27\x18\x1b\x13\xac\xb2\xbf\x36\xf7\xe4\xb8\x7e\x0b\xb8\x81\xe0\xba\xbe\xdc\x55\x72\x0c\xdd\x58\x15\x54\x71\x23\xc1\x58\xa6\xc0\x2a\x9d\x56\x15\xd2\x7c\x21\x37\x59\xcd\x5b\xb3\x95\x22\xb7\x10\xdc\x5c\x92\x1f\x0c\x09\x8c\xb5\x92\x49\x04\xdc\x6a\x25\xc8\x6d\x56\x82\xdc\x6e\x25\xc8\x1d\x04\xa3\x9a\x20\x18\x82\x12\x8b\x30\x93\x08\xb8\xd3\x4a\xe9\xbb\xac\xe4\xad\xdb\x4a\xe9\x7b\x08\xa6\x40\xf0\x54\x51\x6d\x78\xbe\xa9\x1c\xb1\x20\x08\xb9\xd7\x8c\xdc\x67\x25\xc9\xfd\x56\x97\xc8\x80\x95\x24\x0f\x9a\x49\xf2\x90\x95\xc0\x0d\x03\x2c\x00\xc8\xad\x00\x9e\x57\x7d\xfc\xb5\x13\x96\xe4\x11\x56\xfc\xb6\xe1\x5f\xba\x98\xf4\xf1\xe5\x94\x8f\xef\x16\x0a\x6b\xf2\x28\xc1\x1f\x5b\x1e\x70\x3a\xe6\xe3\xf3\x09\x1f\x23\x79\x22\x78\x8c\x60\x2e\x93\x3a\x4e\xe9\x65\x92\x93\x51\x1f\xbb\xa2\x04\x3c\x4e\x30\x7b\xc9\x4d\xe2\xc5\xc1\x24\x5c\x95\x2b\x4a\xc0\x13\x04\xf3\x41\x02\xa8\xe9\xec\x3d\xf7\xc4\x55\x2f\xe0\x49\x82\xb9\x4c\xc2\xa8\xe9\xdc\xc8\xe3\x11\x49\x22\xe0\x29\x82\x59\x0d\x61\xd4\xf4\xeb\x99\x9c\x13\x12\x27\x11\xf0\x34\xc1\x04\xf0\xb2\xa0\xbe\x53\x86\xa9\x54\x2e\xa1\x80\x67\x08\xe6\x32\x99\x84\x97\x05\x61\x94\x43\x57\xbd\x80\x67\x09\xe6\x32\x09\x63\x95\x54\x27\xaa\x96\x4b\x22\xe0\x39\x82\x59\x0d\x61\x94\x7d\xaa\x13\x55\xcb\x25\x11\xf0\x3c\xc1\xdc\x0c\x56\xcf\x84\xa8\x32\xf1\xe4\x2d\x10\xcc\xf1\x61\xbf\x99\x04\x7d\x4d\x04\x2f\x12\xcc\xbe\x72\x12\x78\x39\xb3\x2d\xec\xb7\x5b\x95\x80\x97\x08\x66\x5f\x09\xa3\x2d\xe6\xd5\xca\x7e\xbb\x24\x02\x5e\x0e\xe9\x31\x44\x5f\x6c\x31\xf5\xe4\x68\x38\xac\xc7\x2b\xac\x98\x8a\x46\xe1\xa1\xc9\xe4\x51\xa7\x04\x38\x9d\x11\xf0\x2a\xc1\xa8\x40\x2a\x63\x42\x0a\x15\xf5\xdb\xdd\x26\x02\x5e\x23\x98\x8a\xc6\x2a\xe9\x5e\xa9\x21\xd4\x16\x57\xbd\x80\xd7\x09\xe6\x4b\x74\xac\xd4\x0d\x4e\x0e\xc7\xd0\x8d\xa7\x80\x37\x08\xe6\x8d\xc0\xfe\xb1\x32\xcc\x7a\xe2\x1c\x6f\x12\xcc\x9b\x99\x93\xc0\xdb\x84\xfd\xe6\x55\xe6\xf6\x47\xc0\x5b\x04\xe3\x3a\x97\x97\xb8\x61\x58\x55\x62\xc5\xdb\x04\x73\x94\xb8\x61\xec\x37\xe5\x94\xc7\xde\xb5\x4b\xc0\x3b\xa1\x03\xc2\xd1\x63\xf5\x18\xb1\xc4\x8a\x77\x59\x31\x75\x80\xc7\x98\xdf\xfa\x69\x31\xc5\x2d\xbb\xf3\x2d\xe4\x54\x8a\xe8\x02\x7e\x5a\x2a\xd8\x16\xee\x11\x4c\x89\x41\x9d\xd2\xa4\x54\xea\x3b\xf7\x1f\xe2\x05\x08\x7a\xdf\xea\xeb\xde\x81\xd5\x2f\x2d\x87\x81\xc9\x08\x82\x13\x7c\xb4\x80\x8f\xac\x3c\xf2\xb1\x95\x47\x3e\xb1\xf2\xc8\xa7\x56\x1e\xf9\xcc\xca\x23\x9f\x5b\x79\xe4\x0b\x2b\x8f\x7c\x69\xe5\x91\xaf\xac\x3c\xf2\xb5\x95\x47\xbe\xb1\xf2\xc8\x69\x2b\x8f\x7c\x6b\xe5\x91\xef\xac\x3c\xf2\xbd\x95\x47\x7e\xb0\xf2\xc8\x8f\x56\x1e\xf9\xc9\xca\x23\x3f\x5b\x79\xe4\x17\x2b\x8f\xfc\x6a\xe5\x91\xdf\xac\x3c\xf2\xbb\x95\x47\xfe\xb0\xf2\xc8\x9f\x56\x1e\xf9\xcb\xca\x23\x67\xcc\x3c\xf2\xb7\x95\x45\xce\xda\x59\xe4\x9f\x7f\x6e\x38\xdd\xbf\xd9\xa2\x6c\xd1\x7f\x01\x00\x00\xff\xff\x4c\xae\x50\xc0\xce\x20\x00\x00")
+
+func dataQwertyJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataQwertyJson,
+ "data/Qwerty.json",
+ )
+}
+
+func dataQwertyJson() (*asset, error) {
+ bytes, err := dataQwertyJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/Qwerty.json", size: 8398, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+var _dataSurnamesJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x54\x7d\x5b\x62\xf3\x3a\xcc\xdc\x5e\xfc\xdc\x15\x74\x0d\xdd\x41\x9f\x28\x89\x96\x18\x51\xa2\x0e\x29\xda\x9f\xd3\xcd\x17\xc0\x0c\xe8\xfc\x4f\x27\x27\x5f\x12\x4b\xbc\xe0\x32\x18\x0c\xfe\xdf\xe3\xff\xa4\x76\x3f\xfe\xf7\xff\x7d\xb4\x23\xdd\xdb\xe3\x7f\x3d\x7e\xca\x76\xb6\x72\xca\x57\xef\x94\x73\x0a\x47\xb3\x6f\x9e\x51\xff\x3b\xd5\xf2\xd6\x7f\x5a\xc2\x2b\xe9\xff\x1f\xf2\x23\xb1\xe2\x67\xf1\x4b\x47\x29\x35\xca\x7f\xef\xf0\xc9\x45\xff\x25\x9c\x4b\xac\xf8\xb7\x9f\x30\xef\xfc\xd3\x5b\xba\xf5\xa7\xb6\x50\x2b\xfe\x50\xa8\x77\xd2\x7f\xb9\xb7\x72\x5c\xf8\xa1\x35\xd4\x39\x85\xf1\x8f\xf1\x57\xbe\xac\x65\x4a\x7c\xbc\x39\x87\xba\xdb\xb7\x96\x9a\xd6\x6e\xff\x9c\xe3\xdb\xfe\x5c\x8e\xfa\xd7\xdf\x21\xef\xf6\x74\x5b\xc8\x59\x1f\x45\x1e\x56\x7f\xf3\x53\xfa\xb9\xea\xb7\x63\x3d\xf5\xf1\xf4\x37\xf7\x64\xdf\x7a\xcb\x9f\xda\x6e\xfd\x0b\xe5\xb2\xef\x6f\xc9\x7e\x75\xad\xd1\x7e\x35\x2c\x58\x90\x29\xe0\x2f\xaf\xe5\xfc\x0d\xd9\x7e\xf2\x8c\x5c\x82\x59\x1e\xd7\xfe\x51\x56\x74\xde\xa2\xfd\xfe\x15\xab\x3f\x7f\xac\xb7\xfe\x85\xbb\xd7\xd3\x7e\xea\xd2\x8f\x48\x57\xb3\xdf\x3c\xae\x89\xbf\x20\x2f\x67\xff\x1c\x5f\xe1\xd4\x7f\x8b\xcb\x3b\xd4\xc5\x7e\xaa\xc8\xcf\xdb\xf7\xda\x1d\xe5\x9b\xfa\xb8\x2d\x9c\xf2\x51\xbf\xb6\x01\x5c\xd2\x5a\x56\x59\x78\xfd\x22\xc6\xc5\x7e\xad\xec\xf8\xf7\x35\xe8\x63\xf2\x83\x8e\x5e\xaf\xed\x63\xaf\x94\x72\xd4\x2f\x6a\x7a\xc5\x1a\xf0\x1b\x97\x3d\x43\x4d\xf3\xa6\x1f\x8e\xd7\x2b\xff\x74\x5d\x8a\x3e\x8e\x2d\xb2\xfd\xe7\x96\x8f\xb5\x23\x72\xc5\xdb\xf7\x7b\xad\xc1\xfe\x5e\x38\x12\xde\xfe\x1d\x6e\xfc\x8b\x9c\xa3\xb2\x37\x3c\xf7\x82\xa7\xbc\xe4\x43\xa2\x3d\xd6\x79\xc6\x5b\xdf\xe9\x5d\xca\x62\xcf\x55\x71\xf8\x6a\x69\xcd\x76\xed\x7b\xa2\x64\x29\xe2\x61\x6f\xf3\x13\xcf\x1d\x8b\x22\x8f\x5c\xf5\x63\xaf\xf2\xc6\x1b\xe6\x62\x5b\x7b\x85\x7b\x3c\xd9\xd6\xd7\xcd\xfe\xe6\x53\x0e\xa9\x7d\xf1\x0e\x6d\x93\x23\x70\xe3\xf1\xfa\x8d\x63\xdd\xd2\x71\x14\xfb\xab\xcf\xd2\xee\xbf\x3b\x8e\xdb\xf0\x09\xe7\x6d\x07\x2b\xfe\xb3\x17\xb1\x97\x4e\xcf\xa7\x1d\xe5\x25\x05\x3b\x41\xe1\x63\x3f\x7d\x7c\xf0\xa2\xcf\x62\x0b\xb6\xc9\xaa\xe4\xdb\xd7\x49\xfe\x4f\x3f\xae\xcb\xce\xbe\xec\x7d\xe4\xec\xe6\x60\x0b\xa2\xcb\xc0\x6d\xb7\xff\x8d\x4d\x3f\x52\x5e\xee\xc4\xe6\x7e\xce\x92\xed\x07\x9e\xa9\x6d\x38\x32\xf2\x57\xda\xb8\x5d\xf8\x88\x34\xf1\x7e\xce\x4b\x39\x43\xb6\x03\x51\xfb\x2f\x6e\x57\xe3\x05\x29\x72\xcf\x7e\xed\x1d\x0f\x9c\xa5\x5e\xb1\x85\x4f\x39\x43\x58\x67\x5d\x53\x5b\xaf\x38\x4d\x58\x20\xde\x56\x59\x9e\x17\x1e\xe9\xee\x33\x8e\xee\x55\x78\x11\xb6\x34\xdb\x6e\xcf\x35\xbc\xf9\xfa\x53\xf9\x2c\xf6\xe1\x6e\x36\x2a\x17\x75\xd7\xfd\x5f\x3e\x38\x59\x35\x62\x21\xff\xd9\x0f\xc9\x41\x2a\x7c\x67\xac\xbf\x5c\xa1\x66\x8f\x5b\x17\x3c\xc3\x16\xde\x76\x36\xf3\x81\x13\x83\x23\xc5\x4b\xc7\x9d\xb7\x1d\x5b\xc2\x99\xa2\xbd\xc8\x15\xe4\x87\x71\x5b\xf1\x66\xa7\x1c\xf6\x62\x5f\xc9\xbe\xd8\x0f\x3f\x63\x5d\xbb\xbf\xa5\x58\x42\x5b\xda\x37\x8f\xdb\xd2\xcf\x13\xa7\x8e\xdf\xd8\x3a\x2f\x4a\xbb\xe2\x39\xe3\x4c\xc8\x1d\xc1\x65\x97\x55\xba\x36\x2c\xd3\x15\x3e\xf6\xa7\xae\x14\x2b\x4f\x3e\x0e\xee\x21\x07\x75\x8b\x6f\xfd\x19\x39\xfa\x25\xe3\x96\xad\xa7\x1b\x5a\x6c\xae\xdc\x25\x7e\x60\xf9\xda\x9d\x5a\x6c\x1f\xe5\x99\x66\xdb\xad\x76\x7e\x16\x5a\x40\x33\x13\xb3\x3c\xac\x9c\x72\x9c\xb6\x1c\xec\xf3\xe5\xe0\x56\x7c\x5a\xed\x09\x07\xb6\xe2\xda\x3f\xed\xa6\x57\x9a\x85\x50\x8f\x76\x57\xdc\xa5\x59\x7f\xe4\xc4\xe6\xbe\x63\x78\xf1\xe4\x8b\x8d\x8c\x3c\x7f\xc5\xae\xb0\x98\x8d\x97\x9d\x24\x39\x27\x5f\xe3\x60\xbb\x9c\xf1\x57\x9f\xb2\xc6\x7b\xb6\xfb\x92\xc3\x1b\x2f\xf2\x94\xad\xb1\x13\xbd\xf6\x5b\x16\x07\xb6\xa3\xcd\xdb\x91\x96\x9b\xef\x29\xff\x79\x85\xf6\x1f\xac\xfe\x1c\xda\x2d\xcb\x52\xf4\x61\xb6\x18\x71\x75\xe5\xa3\x2f\x1c\xd9\x92\x13\x1e\x50\xae\xf2\xad\x47\xbb\xc2\xca\xc1\xa6\x3d\xbe\x8e\x0e\x4e\x4a\xfd\x1f\xcd\x80\x3c\x9a\xdd\x5c\x39\x6f\xfa\xfb\x93\x5c\xb0\x72\xd9\x25\x9a\xcb\xc7\x0e\x1a\x4d\x4c\xc8\xaf\x50\xff\x98\x5f\x1c\x35\x31\xdc\x76\x7e\x9f\x7f\xfc\x8c\x1c\x85\xdf\x80\xb3\x8b\x0f\x39\xd7\xfe\x89\xf4\x8e\x65\xc2\xf1\x4e\xba\xe5\xcf\x4e\xdf\x9a\x3f\x62\xdb\xf1\xab\x15\x96\xb1\xea\x4b\x14\xdc\x46\xfb\x27\x71\x85\x5c\xba\x1a\x7e\x13\x1e\xb6\x8b\x03\xe1\x53\xe0\x8a\x89\xdd\x2c\xf6\xd9\xf2\x8c\xf1\x2c\x76\x09\xdf\x58\xa2\x23\x2e\xe9\x0c\xb6\xe5\x6f\x7c\xe8\x24\x67\x02\x27\xa7\x3c\x9f\xf8\x21\x59\x77\x9e\xb4\x96\xe4\x7d\x6d\x3b\xfd\x73\xe5\xc6\xc8\x71\xb2\xc7\x16\x8b\x0c\x5f\x2a\x26\x19\xef\x2f\x6b\xb3\x06\xbb\xb0\x1f\xbb\xfb\x1a\x3d\x2c\xfe\x7b\x17\x4f\xf1\x61\x86\x66\xd3\xed\x36\xe7\xf3\x0e\x8b\x3e\x7e\x2b\xb7\xbd\x68\xc8\x3c\x39\x67\x0c\xd9\x1e\x26\x2f\xc3\xbe\xbf\x23\x3e\x4e\xcf\x36\xbc\x73\xa5\x0f\x91\x2b\xfc\x32\x53\xf0\x93\xe4\xfd\xe1\xd1\x0b\x57\x5e\xac\x65\xf6\x8d\xf6\x95\x2d\x53\x4d\xf1\xe4\x99\xb2\x25\x6e\xfd\xbe\x69\x39\xe5\x49\x4f\x3b\xb4\xb9\xcf\x81\xe1\x0f\x3d\x93\x84\x20\x7e\x18\xe5\x72\x4d\x78\x54\x59\x14\x0b\x25\xec\x1b\x37\xd6\x46\x23\x82\x8a\xeb\x7b\xe3\x51\xef\x08\x5b\x6d\xd6\xbd\x6e\x65\xa1\x1b\xb5\xfd\x98\xe2\xbc\xdb\x4b\x73\xa3\x36\x35\x1a\xf6\xd1\x33\x4c\x18\x37\xd6\x3e\x7a\xea\x6d\xb3\xe5\x16\xef\x66\x36\x49\x62\x08\x33\x51\x7e\xb1\xc4\xdb\xde\x29\xac\xfa\x5a\xa7\x87\x09\x7a\x09\xf4\x9d\xc4\x32\x45\x7b\x84\xb9\x7f\xfd\xa7\xbd\x86\xdc\xbc\x9e\xef\x5f\xac\x13\xc3\x9e\xfe\x8b\xe7\xb9\xc2\xaa\xbf\x73\xf4\xb3\xe0\x07\x6c\x47\xec\x76\xf3\x12\x9e\x0b\x23\xc4\x38\xf1\xc5\xb3\x3d\x65\xfe\xc0\xb1\x8a\x51\x6f\xb6\xa8\xef\x92\x9f\x11\x1f\x77\xca\x0d\xc0\x8d\xed\x1e\xea\x48\x58\xd0\xdc\xc6\xd7\x0b\x67\x37\x72\xef\xf0\x87\xe7\x7e\x1c\xdc\x7f\xf1\xe4\x70\x10\x7a\x48\x12\x5c\xac\x7a\xe5\x1b\xcb\x93\xb1\x5c\x5b\x9f\x26\x04\x2f\x2d\xe4\xf0\x1b\x2c\xd2\x89\xf1\xc5\x78\xa0\x0e\x8b\xfd\xf2\xcf\x96\x3b\xb5\xc6\xc6\xb8\xe5\x36\x5f\x74\x07\x0b\x64\x67\x06\x27\xab\xff\x9a\x2c\x8f\x1d\x9a\x30\x23\xe8\xb2\x7f\x95\xe0\xb6\x9e\x7e\x9a\x56\x8b\x51\x9f\x62\x56\xed\x17\x96\x98\xd7\xb0\xe8\xd6\x84\xb5\xa7\x6c\x4f\xf3\x8a\xab\x1e\x82\x35\x97\xd7\xf8\xa3\xb8\x5b\x73\xd9\x22\xce\x43\x3d\xe0\x1b\xcb\xe2\xe1\x5e\x99\x26\xac\x99\x9c\x1a\x9e\xef\x1c\x12\xfc\xf0\xba\xe2\x9f\xe4\xaf\x54\x73\x02\xf2\xc2\xcd\x5e\x40\xfe\x34\x3d\x9c\x58\xc6\x9d\x97\xf9\x96\x70\x5f\xee\xf0\x62\xc7\xe1\xf6\x00\xa8\x70\x51\xf5\x52\xf2\xc3\xdf\x30\x35\xc7\x85\x6f\xa8\xe3\xb7\x47\xd7\xa0\x0b\x7f\xf6\xed\x76\x48\x7f\x9f\x56\x47\x76\x42\x82\x11\x7b\xe9\x0f\xef\x81\x1e\x78\x04\x31\xfa\x18\x6e\x24\xe4\xdd\xe0\xcf\x0b\x22\xa1\x13\x8b\x1c\x16\x1a\x0f\x39\x5c\x0c\xcf\xe4\x6f\xba\x87\xd6\xd0\x0d\x16\xc9\x4f\xb2\x18\xd8\xc9\x76\xa3\xd8\x91\xff\xaf\x27\xf8\x6e\x09\x73\xf5\xa1\xdb\x24\xdb\x63\xc7\x79\xd6\x18\xde\xa2\x62\x49\x2c\xd4\x22\xe9\x23\x4a\xe0\x55\x25\xfe\xc7\xee\x2f\xe5\x65\x76\x48\x02\xab\x09\xb1\x02\xb6\x58\x0e\xd9\xaf\x6c\x04\x22\x2c\xf1\x23\xbb\x3d\xf8\x52\x3e\x76\xb7\x5a\xe8\x1e\xef\x4a\xa2\x62\xeb\x5e\x32\x03\xb4\xaf\x23\xc1\x8a\xa8\x3b\xb5\x28\x2a\x2c\xf2\x6f\x30\x89\x6e\x03\x3b\x4c\x99\x5e\x37\x9e\xe0\x79\xd3\x4c\xc0\x3c\xd0\x2c\x36\xcc\x6c\xe7\x56\x3a\x3d\xd9\xbc\xc9\x65\xbf\xdd\x1e\xef\x39\xda\xfe\x5d\x35\x98\xd1\x93\x9f\x5f\x57\x84\x24\x6a\xce\x61\x5e\xb2\x5a\x11\x38\xe6\x5f\x89\x82\x63\xc5\x9e\x49\x24\x08\x6f\x34\x75\xbd\xdc\xc1\x83\x37\x44\xe3\x57\xe4\xc1\xb9\xd2\x7d\xe3\x17\x26\x79\x9d\x0f\xd6\xb4\xd4\x23\xd9\x75\x50\x6f\x21\xf9\x83\x65\x1d\xb5\xd8\xb7\xae\x82\xf0\x36\x17\x66\x27\xa1\x31\x2f\x34\x6b\xb1\xd4\xb0\x23\x18\xa6\x6b\x79\x3e\x3d\x96\xbf\x90\x06\x1e\x6e\xd6\xc3\x34\x21\xf8\x68\x6e\xff\x4e\xff\xa7\xad\x3f\x9f\xf6\x47\x1b\x4c\xce\x53\xf3\xc6\x5a\x2c\xd7\x71\x4f\x36\xf9\x61\xb1\xa8\xb1\xb9\x7f\xc0\x1f\xb8\xf1\xa2\x6a\xd1\x1f\x8c\xaf\x47\xce\x50\x70\xee\x66\x3d\xfb\xe6\x08\x34\x3f\xb5\xd3\x14\xee\xcd\x4c\x6d\x93\x1f\x16\x0f\xe0\xc9\x35\xcf\xee\x1c\x6c\x91\xed\x60\x30\xe5\xd9\xb8\x08\xe2\x72\xe2\x29\xfe\xfc\xc1\xa4\x0f\xe1\x40\x37\xcf\x20\x61\x64\xbe\xb0\x55\x62\x2f\x2c\xe7\xd6\x7d\xc7\x45\xd1\xbf\xee\x0f\x7f\x06\x5b\xc1\xd6\x75\x13\x2d\xa8\xf4\xc0\x51\x7e\x0a\xc9\x9c\xee\x16\x2f\x16\xa2\x32\x59\x76\xba\x33\x8d\xb1\xe1\x1a\xe7\x22\xa7\x08\xfb\xbc\x05\x3b\xbb\xe2\xc7\xe3\xa9\x41\xbe\x3d\xb2\x3d\xf9\xca\x6b\x1c\x3e\x21\xe3\xa6\xbc\x11\x3b\xbd\xc2\x2f\xff\xe2\x92\xe6\xf1\x6c\x76\xb3\xf5\xc7\x67\x49\xaf\x2c\xfe\x90\x60\xe7\xb4\xbb\x76\xa5\x13\xd1\x0a\xe3\x71\xa6\x09\x67\x2d\x11\xbb\x2d\x46\xe7\x01\x24\x81\xb9\x78\x51\xbb\x60\x98\x43\x33\x4f\x0d\x6f\x53\xf1\xe3\x19\xf1\xcd\x9e\xea\xf4\xe1\x49\xc0\xf9\x94\x8b\x77\x00\xb2\x58\x8a\xfa\x0f\x3c\x64\x61\x98\x21\xc7\x19\xe6\xf6\xb0\x5b\xbe\x8b\xd1\x64\x3c\x7d\xce\x38\xb8\xab\xde\xc1\x75\x63\x9c\x4f\xc7\x23\x4e\x4a\x0f\xa8\x7d\x85\xf5\x79\x0f\xd3\xab\xc7\x01\xf1\xb6\x5c\x89\x8c\xcd\x97\xd4\x6d\xc4\x05\x66\x07\xda\x81\xff\x1e\x1e\xa2\x68\xd2\x80\xbd\x99\x60\xd5\x96\x8f\xa7\x9b\xc8\x75\xe4\xe5\x6f\x0d\x9d\x6c\x63\x3f\xbc\xd8\xe1\x1f\xac\x62\x3b\x6d\xb1\xc4\x0d\xe1\x6f\x48\xe8\x23\xe7\xc7\x2c\x87\x86\x8e\x70\x25\x85\x5e\x66\x8a\x81\x3f\x86\x70\x3d\x0e\xc4\x66\x8b\xc1\x92\xb6\xc8\x54\x76\xfd\x26\x98\x92\x3d\x33\x68\x57\x1f\x67\x3b\xff\x42\x6c\x20\x7b\x67\x7f\x41\xde\x50\xf6\xee\x9b\x8e\x30\x9f\x94\x73\x03\x13\x76\x74\x8f\x1a\xf6\x78\xa8\x87\x17\x8f\x18\xfd\x6a\x99\xe7\x16\x67\x12\x19\xfb\x89\x69\xe3\x2d\xb2\x07\x8d\x81\x76\x4e\xb6\x39\xda\x99\x7f\x69\x32\xc4\x3b\x8a\x30\x71\xeb\xc7\xb5\x55\xbc\x97\x3d\xb7\xd9\x95\x8e\x23\xbd\x75\x09\xcc\x1c\x59\xda\xe0\xe3\x97\x52\x61\x26\x26\x89\x42\xb0\xd9\x62\x13\x98\xfa\xc7\xc0\x50\x96\xfb\x23\x21\xad\x1d\x78\x4d\x2b\x1e\xe6\x71\xe7\x9d\xf1\xe9\xa7\x98\x81\xb2\xc4\x02\xff\x74\xca\xb5\x96\x05\xbb\xcc\xa2\xc4\x57\xb2\x60\x5c\x82\x10\x39\xa3\x0e\x03\x15\x60\x22\x3d\xe1\xee\xe9\x21\xdb\x68\x6c\x25\x82\xf8\x04\xbc\xda\x82\xe0\x46\x7d\x94\x05\xf6\x92\xdc\xf3\x43\xe5\x3a\x3d\x99\x6a\xeb\x09\x8d\x6b\x21\x76\xd2\xfe\x9a\x1f\x5f\x5e\x5c\x20\x39\xda\x15\x9f\x07\x13\x41\x57\x8e\xe8\x84\x6e\x79\x2b\xf0\x77\x77\xe0\x0d\xdb\x4f\x98\x90\x20\x07\x78\xb6\xf7\x60\x8a\x0b\xb7\x96\x61\xc7\x6b\xf9\xb1\x57\x6b\xfa\xa4\xf6\xba\x07\x8d\xb3\x62\x03\x38\x0a\x51\xac\x23\x76\xa5\xbd\x35\x93\x44\x54\xca\x8c\x53\xef\x4a\xaf\xb0\x84\x27\x5c\x47\xc5\xa9\x90\xc4\xe1\xc4\x66\x3c\xc7\x5e\x9b\xc7\xc7\x3d\xaf\x06\x97\x9c\x84\x10\xde\x31\x21\x12\xab\xfd\x87\x29\xa3\xa1\x25\x38\xc3\xb9\x00\x4b\xea\x4c\xe6\x24\xcc\xa1\xc7\x15\x7f\x18\xe1\x97\x0a\xed\x99\xfa\x64\xf9\x38\xb3\x12\x1a\x2f\x00\x26\x94\xa4\xd8\x3e\x57\x73\x54\xfe\xfd\xc0\xcb\x22\x3f\x6e\x16\x31\xfe\xbb\xe9\xb7\x2c\xeb\x97\xd8\xda\x9e\x38\xea\xb9\x98\x1f\xc4\x58\x11\xe5\xbd\xc4\x9d\x7a\x92\x2b\x9f\x6f\x27\x4b\xbd\xee\x6a\x7f\x47\x6f\x0b\x36\xd5\xdc\x90\xbe\xa5\x1e\x4f\x5d\x88\x42\x53\x21\xd7\x2c\xc3\x7a\xcb\xde\xce\x88\x2b\xd4\x43\xdb\x33\xca\xd9\x07\x10\xa0\x36\x87\x69\x93\x1d\x03\xd9\x6a\x73\x27\xa1\x13\xfd\x7b\xe1\x83\xd4\x95\x13\x62\xb9\x24\x38\xc0\x03\x02\xd6\x44\xe6\x21\x11\x12\xc3\x9d\x65\xc0\x3a\xe6\x29\xd4\xde\x5c\xc4\x0b\x63\xdc\x79\xc8\xe5\x85\x0a\xee\x92\x27\x61\xf6\x4b\x92\xae\x6b\x1c\xcf\x38\x39\x2d\x8b\xfb\xcc\x66\xf9\x26\x1e\x84\x41\x48\xd6\xdb\x63\x7f\x0e\xf1\xb0\x1c\x52\xbc\x82\xc5\x88\xb8\xf7\xe1\x36\x40\x61\xdc\x18\x5b\xbd\x02\x14\xe5\x29\x61\x9b\xe5\x89\xcc\xe4\xec\xde\xaa\xcf\x7b\x58\x0a\x76\x0e\xf7\xae\x76\x8a\x50\xe7\x33\xb9\x97\x9c\x93\x66\x01\xfa\x20\x7b\xb1\xe7\x91\xcf\x55\x5b\x81\xc5\xb1\x0d\xdd\xf0\x3b\xb2\x86\xc8\x80\x25\x7c\x62\xd0\x14\x7f\x0c\xdc\xde\x81\xc2\x48\x7e\xe3\xd8\xa3\x44\xdf\xf6\xe7\x25\xc0\x94\x6f\xc2\xa0\x1d\x61\x59\x80\xc6\xf4\xd6\x0a\x36\xe9\x24\x54\xad\xbf\x61\x6b\xcd\xc4\x42\x81\x2c\xf8\x69\x79\x39\xf3\x76\x12\xc8\xac\xb6\x2d\x04\xc1\xe4\xca\xe0\x52\xfa\x91\xea\x75\x9c\xad\x07\x6c\x18\x63\xe7\x43\x2c\x7e\x31\x67\xf5\x0c\x3d\xef\xb8\xf2\xe2\x1c\x11\xad\xee\x67\xb8\xd4\x88\xed\x34\xbb\xb2\x08\x16\x4c\x01\xca\x20\x88\x8f\xb4\x5e\xce\x1c\x41\xc0\x8d\x41\xb6\x9e\x09\x2c\xce\x16\x99\x1f\xcb\xad\x59\x22\x6c\xa0\xad\xed\xa7\x12\xc6\xcf\xb4\x3d\x19\x96\x02\x10\xa6\xa3\x5e\xe7\xdd\x71\xd4\x92\x07\xd2\x1a\x3d\xd8\x3d\xe8\x0a\x52\xd9\x7d\x97\xef\x32\x1e\x95\x6f\xb9\x77\xb3\x75\xdb\x61\x68\x24\x5e\xc1\x9a\x78\xc6\xb9\x4a\x90\x67\xb7\x69\x19\x89\x88\x24\xeb\x37\xe3\xf8\x53\x0c\x20\xe2\xc6\x89\x80\xc5\x1c\xeb\x2b\xf0\xe3\x36\x26\x44\xe9\xf4\xc0\xb3\xd2\xf1\x1a\x26\x28\x5f\xfc\x06\x8d\x9a\x1f\x9a\xf8\xd0\xbe\xe9\xa2\xea\x4f\xb8\xf1\x11\xe7\x7b\x5b\x06\x52\xba\x1d\xde\x63\x16\xfb\xc6\xf0\xba\x05\x87\x5d\x65\xc9\xe8\xb5\x81\xd4\xca\xa5\x1a\x00\xaf\x5c\xa1\x6e\xb1\x59\xf4\xe4\x48\xae\x2b\xb1\x02\xcd\x29\x80\x18\x05\x3e\xda\x56\xae\x8b\x51\xcc\x88\xce\x35\xe9\x33\xf4\xa4\x7c\x46\x36\x6c\xab\xac\x39\x6a\xad\xdf\xac\x89\x16\x86\xf1\x03\xa1\x70\xc5\xf6\xcc\x25\x88\x45\xf3\x07\xff\x20\x21\xba\x34\x08\x44\x94\xce\x3b\x2d\x67\xb2\x98\x51\x3a\x73\xb8\xec\xae\x7e\x96\x48\x57\x45\x30\x60\xde\xed\xa1\xe6\x22\xb1\x15\x53\x0a\x31\x70\xe6\xff\xdf\x9e\x16\x17\xbf\x3b\x72\x07\x69\xb0\xe9\xa8\xe6\xc2\x54\x54\x8e\xd1\xc2\x97\x41\xea\xf0\x8c\xee\x37\xf4\x30\xf1\xcb\x67\xa7\x67\xcf\xc5\x5d\xb0\xfc\x16\x2c\x77\xf1\xb4\x6b\xf3\x0a\xc9\xc4\x1b\xa4\x80\x05\x30\x3f\x82\x8c\x6a\xbd\xf4\x8f\xc4\x97\xfe\x7f\x59\x86\x59\x9a\xe8\x6a\x17\x7d\xd2\x88\xd7\xd0\x7b\x0a\x30\x20\xf9\x27\x84\x4c\x43\x28\x7f\xd0\x00\x22\xa6\x6a\x7a\x55\x23\xff\xe4\x61\xeb\xf6\x7c\x22\xa5\xb9\x7f\x25\x4e\xaa\x48\xb4\xcc\x84\xfc\x4a\x60\x85\x32\x1a\x5c\x57\xc8\x0c\x0c\x8e\x59\x83\x40\x9c\x23\x71\x46\xaf\x68\xfe\xc1\xc0\x30\xd6\x7f\x0c\xdb\xa8\x7a\xdb\xb1\xf0\x9e\xdf\xab\xad\xe1\x16\xac\x72\x54\x60\x6c\xc2\xd3\xd6\x29\x47\x96\x4c\xde\x08\xe5\x0d\x68\x27\x54\x93\x90\xac\xde\x81\xf7\xa2\x9d\x04\x7a\xc4\x52\x8d\xa2\x0a\xcd\xda\x1b\xeb\xb3\xc1\x56\xd9\xa6\x99\x71\xd2\xda\x0c\xb2\x86\x81\xc7\xe9\x67\xca\xb5\x86\x5b\xd1\xbf\x1e\x91\xa6\xe7\xc0\xfa\x43\xd8\x08\xdf\x00\x0f\xd3\x2c\x95\x81\xa0\xbd\xa1\x1a\xea\xc0\x3b\x62\xf8\x92\x99\x1d\x89\x78\xdd\x71\xdc\x21\x7b\x62\x34\xa7\xc0\xda\x03\xcb\x6c\xe1\xce\x09\x69\xe5\x3c\xfb\x1d\x5c\xf0\xac\x7b\xe8\x9e\x65\x14\xfb\x91\x19\xb9\xd8\x54\xb2\xa3\x40\x4f\xff\x59\xf3\x64\xe6\x09\x18\x2f\x48\xaa\xe2\x30\xcc\x2e\xc7\x48\x9f\x48\x02\xc9\x01\xc5\xfa\xfa\x4b\x8c\x8c\x93\x98\x35\x49\x79\x20\x8c\x22\x14\x9b\xe0\x25\x9b\x2c\xae\xad\xc2\xf9\x85\xdc\x01\x62\x55\x0d\x58\xb0\x47\x2f\x7a\xee\x37\x51\xb9\x76\x88\xa7\xc1\xb6\x25\x5a\x69\xee\x88\x9c\x1e\x16\x83\xec\x78\xa1\x46\x5b\x68\xbe\x74\x6d\x59\x58\x7a\x79\x08\xb9\xc4\x9f\xd8\xba\xed\xe2\x67\x41\x7c\x52\x27\xfb\xb8\x15\xc8\xfb\xc3\xa0\xfe\xad\x26\xd6\xbb\x6e\x24\x24\x1d\xc0\x9e\x1c\xc8\x6c\xe9\xcb\x44\x14\x45\x5c\x5c\xd8\x86\xb3\x3c\x79\x80\xe4\x46\xe8\x8e\x76\x37\x2c\x9a\xba\x61\xd3\x24\x44\x7d\x67\x26\x49\xc5\x52\x72\x0d\xac\x3c\x1f\xd5\x7d\x76\xa3\x81\xd8\x40\xd2\x1c\xfb\x8b\xbd\xb1\x46\x7d\xfb\xe6\x7f\xfc\x40\x44\x9a\x10\x5d\xca\x04\x20\xee\x84\x3f\xe0\x75\xc8\x7d\x06\x6a\xa4\x51\x8d\x59\xb6\x66\x88\x8a\x1f\x48\x3b\x44\xe5\x1b\xa5\x48\xea\x69\xa9\xeb\x54\x3a\x33\xc1\x50\xf9\xc5\x54\x70\xe5\x97\xf2\xb5\x14\x28\x9b\xda\x32\x9d\x91\x21\xff\x4c\x18\xee\x8d\xd7\x78\xca\x72\x12\x68\x9b\xdc\xfa\xbe\x91\x6e\x2a\xfe\x42\x17\x18\x50\x7b\x92\xe4\x07\xd9\xdb\x27\x54\x09\x40\x11\xc0\xac\x8a\x46\x01\x28\x2a\xf3\x5d\xe0\x41\x10\xbd\x65\xc9\xcd\x11\xc6\xc3\x8b\xc9\x3a\xac\x96\x9b\x4d\xe2\xfa\xed\x68\x58\x10\xd2\xa3\xd5\x09\x24\xf5\x0b\xf1\x39\x2e\xba\x99\x99\x2d\x66\x54\xd2\xcb\xc7\x9e\x60\x05\x7e\xd6\x6e\x3f\x35\x19\x88\x4f\x52\x7b\x64\xc7\x97\x29\x9a\x2d\xf2\x6b\x04\x66\xfa\xd6\x74\x60\xc1\xc1\x75\x45\x5d\x99\xb9\xe1\x06\xbc\x0b\x81\x58\x31\xdd\xbb\x2d\xa5\x5d\x28\x7b\xeb\x8a\x6c\xcf\xbe\x26\x4c\x18\x2c\xff\x7c\x11\x76\x5b\xcc\xf0\xb6\x4b\x83\x6c\xfe\xf9\x8d\xe6\x6f\xf1\x9a\xf9\xa4\x85\x18\xc0\x33\x92\x29\xb2\xda\xb6\x0e\x63\x4d\x74\x43\xe3\x56\x2b\x61\xbd\x03\xad\x99\x64\xe4\xf6\x5b\x77\xb8\xfb\x01\x1b\x02\xe0\x58\x31\x0d\x5b\xe8\x6e\xa0\xde\x55\x3f\xb6\xfe\xa5\x96\xdf\x19\xf1\x5f\xd0\xbc\xe5\x26\x24\x64\x98\xbe\xd6\x55\x08\x3f\x14\xb9\xa1\x48\xd8\xc4\x5e\xca\x83\xd1\xe2\xcb\x59\x69\xe5\x40\x40\x09\xfc\x99\xe5\x0a\xe2\x10\x7a\x50\x68\x99\xd3\x61\xdb\xb3\x96\xe5\x89\xa4\xf9\x29\xff\x16\x56\xda\x7a\x7b\xd8\x59\xeb\xae\xb6\xc1\xb1\x49\xc0\x67\x90\xf5\x32\x92\x97\x26\xd6\x87\xb8\xb3\x46\x24\x5b\x37\x93\x5d\x7b\xe4\x22\xce\xab\x98\xef\x84\xcf\xa8\x84\xc2\x61\x52\xb5\xb6\x4c\x97\x2d\x76\x02\x09\xa9\xc4\x8f\x2c\x08\xdd\xc8\x52\xb4\x7e\xa0\xe7\xb5\x38\xa2\xa0\x27\x67\x25\x20\x26\x46\xd9\x0c\xdf\x25\xa9\x8b\x59\x80\x1a\xc6\x65\xc6\xc2\x8b\xa9\x9e\xc4\xd5\xc3\x8d\xd4\xfd\xeb\x32\xff\x62\x7a\xea\xa2\xfd\x61\x37\xe4\x44\xee\x86\x80\x33\x5b\x7c\x16\x56\x20\xe7\x12\xba\x60\x0d\xae\x82\x18\xef\x4a\xc4\xff\x3e\x8e\x19\x20\xa2\x3b\x34\x4d\xb3\xc7\x4a\x07\x2b\x26\x53\x47\xa0\xa5\xd9\xbd\xfd\xb0\x18\x18\x43\xf3\x70\x6a\x3a\x4c\xcc\x61\x96\x32\x4d\x13\x41\x5a\xe6\xa2\x72\xc9\x79\x03\x22\x53\xa8\x2b\x1b\xda\x67\x7f\x87\xe8\xd6\xec\xd0\x55\x1d\xe5\xf9\xe4\xce\xff\xa9\x9f\x7a\x16\x33\xee\x34\x70\xb5\x4f\xc9\x50\x68\x25\x17\x30\xe8\x8b\xf9\x0b\x1c\xa2\x54\x2e\xbb\x6f\x78\x6e\xe2\x7d\x13\x0f\x85\x27\x91\x2d\x85\xe9\xd9\xc3\xed\xa0\xdf\xc0\x1b\xd4\xb2\x36\x66\x83\x92\x56\x55\xa0\xb2\x33\x00\x3d\x8b\x8b\x08\x5c\x62\x19\x73\xdc\x68\xc6\x46\xe9\xfa\xb7\x4b\xf2\x63\x90\xb8\xd6\xcd\x80\x68\x85\x27\xcf\x8c\x23\x7b\x60\xc7\x18\x4a\x23\xe6\xbe\xc2\x09\x9e\xe9\x9f\xdd\x83\x98\x59\x6a\x0f\xbc\x38\x08\x91\xe4\xfa\x4d\x76\x26\xc4\x28\x30\xe9\x48\xe7\x4e\xe2\x05\x0a\x57\x17\x2f\x81\xae\x0c\x13\xab\xb5\xd0\x2e\x55\xb5\xde\xfa\x85\x1a\x3e\xfd\x8e\x96\x18\xca\xa8\xd8\xc5\x7a\x20\x98\x1c\xf9\x10\xcb\x72\x8a\x7d\x21\x32\xf1\x2c\xd0\x22\x41\xda\x41\x7d\x63\x1e\x64\xb5\x2e\x38\xc7\x8e\x34\x7a\x96\x5b\x1a\x37\x67\xfa\x20\xbf\x0a\x35\x31\xa3\x21\x2c\x3d\xe1\x8a\xc7\x7c\x0f\x18\x57\x22\x7e\x10\x06\xe4\xd6\xc2\xa0\x79\x00\x7d\x77\xa6\x3a\x33\x5f\xe9\x0a\x1f\x8f\x59\x62\xae\x56\xfe\x9e\x15\xbb\xf7\x3a\x6b\x41\x00\xa1\x11\xf9\x20\x51\x2d\x7e\x2e\xf4\xb2\x93\x99\x30\x15\x10\xbe\x64\x07\xf5\x60\xdc\x25\x33\xf9\x5b\xa2\xe4\x34\x08\xe7\x92\xbc\x55\x2d\xc0\x8b\xbc\xc8\x2b\x37\xda\x16\xe2\x95\x56\x0b\x34\xee\x70\x25\x78\x9e\x84\x47\x17\xff\x49\xf8\x5c\x41\xa3\xee\xd9\xab\x91\xd1\x12\xe3\xd6\xbd\x5b\x20\x68\x8c\xab\x40\x1e\xca\x49\x33\x7f\x47\x49\x6a\xcc\x13\x81\xd1\x61\x74\x06\xfe\xc5\x59\xd9\x4d\xf6\x69\x31\xe2\x6a\x17\x5c\x70\x46\x9a\xd7\x96\xae\x0b\x78\x02\x2e\x76\x48\xb0\xeb\x01\xe0\xac\xfc\x49\x46\x97\xca\x62\x00\x20\xa3\xcf\x80\x93\x04\xb0\xdb\x8e\xe7\x54\xde\xb0\x2f\x2f\xa0\xe4\xb6\xe5\x6f\xd4\x63\xab\xd2\xc9\xf0\xd4\xea\x50\x22\xe0\xa5\x2b\x5d\x34\x51\x12\x0a\x32\xf1\xd7\x7a\x21\x50\x40\xb1\x5a\x1b\x0b\xc7\xb7\x6d\xe3\xe2\x89\xb9\x16\x23\x8c\xef\x17\x9f\x1a\x29\x30\xc6\xce\x6a\x43\xe5\x16\xc3\x7c\x2a\x4f\x00\x41\xc6\x11\x0d\x8b\x97\x88\x12\xee\xd3\xc2\x16\x78\x58\xcf\x9d\xee\x72\xe4\xc1\xcd\x1b\xbb\x3a\x25\xfc\xcd\x87\x59\x53\x71\xb2\x76\x7a\x1d\xd5\x6e\xe6\x9c\xbc\x66\x14\xcb\x95\x79\x55\x24\x36\xb3\xcf\x55\x3a\x60\x70\x0a\x13\xf9\x45\x38\x76\x06\xc2\x15\x04\x1d\xca\x0a\x6c\x6e\x83\x71\x4c\x66\x62\x9a\xcd\xcb\x62\x72\x10\x81\xc2\x91\x89\xa3\x20\x87\x07\x63\xd5\x8e\xaf\xee\xc4\xa2\xb8\x87\x43\x4c\x0c\xfb\x42\x1e\x39\xc9\xd1\xc5\xe3\x99\x9b\x98\x4a\x7b\x3b\x81\x8e\xf0\x84\xde\xf5\x1b\x41\xdf\x15\xc4\x74\xdb\x36\x1b\x9d\x09\xa1\x02\x73\xa8\xf3\x2c\x58\xba\x74\xc2\x4e\xd9\xef\x01\x4d\xc8\xfd\x74\xca\x1b\x36\x5a\x63\x90\x08\xf2\x84\x78\x64\x98\x7d\x2e\xd7\xd6\xbd\xa2\x70\x27\xa7\x42\xb4\x3f\x6c\x4b\x45\xad\x89\xac\xeb\xd1\x38\x17\x2e\x90\xb2\x13\x1f\x56\x51\xe3\xc1\x09\x5e\xe0\x5c\x58\xab\x09\x53\x05\xcb\x51\x52\xcf\xd7\xa8\xf9\x9a\x8b\x96\xbc\x00\x56\x96\x94\xa1\x49\xa9\x2d\x86\x7c\x7a\x51\x58\x5e\x90\x7c\x1e\x85\x34\x02\x63\x42\x04\x09\x17\xc9\x2f\x6a\xea\x17\xc6\xb6\xef\x41\x37\x71\x90\x62\x76\x78\xc9\x99\x9d\xf6\xd2\xa4\x7d\x14\x16\x98\xaa\x1b\x40\x35\xd9\xfc\xb8\x99\x69\x6d\x3a\x1d\x2e\x32\x9e\xa1\x9d\x82\x64\xc9\xe9\xd2\x77\xb7\x52\x12\x3c\x99\x7d\x0b\x5f\x47\xab\x51\x63\x75\xdf\x41\x78\xfa\x8b\x5a\xc9\x39\x5e\x40\x86\x8b\x83\x3a\x91\x6a\x1b\x5c\x92\xa7\xbb\x4e\x4d\x3c\x90\xe5\xc8\xad\xc7\xb3\x2d\x08\x6e\x35\x98\xb1\xd4\x2e\x5c\xd9\xf3\xb8\x43\x79\x48\x08\x9d\x73\xb1\x54\x5e\xfd\x61\x72\x00\xd2\x8e\x50\x05\x90\xc1\x24\xa6\xa5\xdf\x48\xa7\xae\x25\x46\x7c\x40\xbf\x10\xcc\x34\x59\x27\x5b\x96\x78\x4b\x84\xf8\x7c\x78\xdc\xec\x95\x0d\x46\x0a\x4f\x87\x7a\xe7\xd0\x3d\x7a\x76\x02\xe5\xda\xb5\x78\xc0\x8b\xac\x0c\x40\x8b\x47\xcd\xf7\xbd\x35\x5b\xc5\xde\x88\x65\x03\xd0\x8d\xfd\x50\x4c\x04\x37\x03\x3c\x0c\x3c\x43\xc3\x69\xd9\xbc\xb2\x83\x83\xf1\xec\x66\x45\xe6\xe2\xa5\xc5\x2b\x48\xd2\x88\xda\xfe\xaa\x55\x10\x4b\x10\x66\x24\x18\x9b\x1a\x7e\xa0\x51\xcd\x03\xf0\x0b\x77\x3c\x9e\x83\x75\xd3\x82\xb3\x27\xd4\xa3\xc5\x3b\xb1\x74\x9e\x9c\xa4\x26\xf6\xd8\x73\xa1\xd2\xc9\xea\xcb\x49\x72\x57\xfb\x90\x5b\x7c\x4f\xf6\x92\x39\x10\x98\xe2\xa9\xd6\xc1\xa2\x97\x46\x95\x6f\x58\x14\x6c\x1d\x2c\xbe\xa1\xbc\xe5\x41\xe8\x18\x64\x0c\xb5\x5a\x4e\xb7\x94\x4f\xed\x04\x0c\xe8\x2b\x2f\x42\xce\x72\xa4\x59\x62\xb9\x87\xb3\x64\x7a\x23\xa7\x82\x06\x0e\xd5\x93\x6e\xe4\x54\xbb\x12\x62\x8f\x19\x75\x6c\x1d\xc1\x4d\x3f\x80\x48\xc4\x33\xa1\xf2\x1c\xaa\x39\x02\x56\x59\x70\x2b\x43\x5f\x12\x71\xa7\xb0\x5a\x09\x3d\x28\x2f\x17\x3e\x44\x62\xf3\x6a\x81\xd0\x9a\xae\x61\xc0\x5f\x08\x17\x98\xc2\xbc\x80\x21\xc9\xb9\x25\x1a\xd6\x5a\xb2\xba\xbe\x98\xfd\x41\xe1\x9a\xb5\x4a\x6d\xa9\xc1\x52\x70\xc0\x17\x86\x67\x9a\x31\x68\x4e\x25\x8e\x3d\x02\xd1\xc8\x8c\xfa\xdd\xf4\x6a\x21\xd3\x7e\x53\xa9\xe5\x8c\x13\x3b\xdd\x89\x12\x15\xdc\x56\xcd\xf8\xfb\x8e\x96\x28\x27\xe3\x76\x16\x4a\x43\xf9\x6c\x2b\x49\x1f\xac\x26\x03\xa7\x73\x5c\xf4\xde\x31\x98\x13\x3b\x4e\x93\x23\xfb\xcf\xf4\x38\x62\x27\x3f\x12\x00\x90\xb7\x8a\x38\xa4\xc9\x53\x7b\x02\x77\xe1\xc3\x3a\xaa\x5f\xea\x3c\x80\xbe\x89\x7d\x74\x6a\x80\x13\x64\x24\x53\x64\x24\xa1\x06\x09\xa6\x75\xea\x9e\x9b\x2a\x55\xd1\xd9\xab\x28\xca\x19\xc1\x97\xc8\x24\xd9\x43\xca\x7e\xe0\x61\xe9\x92\xa0\xb3\x8e\xe1\x11\x5e\xe0\x7f\x7f\x53\x5c\xc9\x53\xbe\xe4\x1a\xb3\xb4\xb1\x85\x85\x31\x78\xe5\xd3\xb6\x7e\x90\x94\xd4\xbd\x28\xf5\x1b\x5e\x2c\xd0\x6f\xb0\x90\x7a\x79\x19\xec\x88\x3d\x6c\x33\x89\xa4\x61\xcb\x38\xcf\xc0\xc4\x2a\x1c\xa4\x3d\xd7\x7d\x06\x64\xac\x7f\xfa\x04\x0e\xc9\x32\xc0\xb8\x3d\x70\xfe\x7e\x0a\x8d\x71\x0b\xe4\x81\x6d\x71\x61\xa6\xb5\x71\xb9\xf5\xbf\x66\x16\x12\x42\x14\x89\x38\x33\x56\x52\x6e\x3e\x3d\xbd\xfc\xb9\xf6\xd7\xbe\xd2\xec\xae\x3d\xa1\x96\x65\x10\x6e\x22\x6a\xc9\x1c\x44\x5d\x2d\x8e\x45\x4b\xf6\x6b\x0e\x0a\x04\x9a\x8c\x78\x82\x2f\x23\x2f\x12\x58\x3f\x1d\xf8\xad\x51\x2f\x4e\x2f\xaa\x9e\x44\x44\x32\xe2\x9f\xe8\x60\x87\x96\xea\xf0\xbe\xf0\xa5\x57\x0c\xa4\x05\xc4\xee\xec\x51\xc9\x6f\x9c\x89\xa4\xdc\x2a\x37\x61\x16\x0d\xb9\xf9\x63\x21\xee\x00\x4b\x36\x0f\x52\x3c\xbe\xad\x3c\x7a\x06\x6d\xb3\xa7\x39\x11\xa1\xe3\x3d\x08\xea\x65\xc3\x3b\xec\x91\xc4\xb0\x83\xc6\x16\x1c\x27\xa3\xa5\x34\xbe\xae\x25\xe5\xa7\xc4\xc6\x01\x95\x93\x16\x09\x70\xa9\x2f\xb2\xc8\xd9\xec\x8c\xfe\xd5\x00\x87\xb9\x77\x44\x51\x24\xde\x3c\x50\x92\x76\x0e\x8f\xbb\xf9\x7e\x27\x00\x1d\x6f\x7c\x68\xe3\xf5\x51\xcf\x4e\xaf\x7a\x79\x31\x2f\x7f\x70\x0d\x32\x41\x61\xcd\x7c\x71\x66\x96\xc1\xad\xde\xfe\xa4\x5a\xce\x26\xfa\x0c\x4a\x4e\x40\x49\x59\x83\x5d\x56\x12\xd6\x8e\x6d\x8c\xf6\xac\xb9\xfc\x85\x02\x9d\x76\xef\x21\xaa\x18\x5f\x52\x10\x36\xef\x45\x90\x9c\x3e\x7b\x0a\x21\xb9\x51\xb2\x9b\x6b\xa8\x9a\x5d\x06\xcb\x35\x4f\x5a\x16\x96\x55\x65\xbd\xf8\x57\x2c\x8e\xc0\xf9\x0d\x6c\x1a\xb1\x3e\x13\xf5\xea\xfa\x17\x3f\x8e\x63\x35\x05\x93\x19\x12\x6b\x7c\x6e\x11\x81\xf6\x68\x30\x7d\xfd\x86\xd6\x62\xf4\xf8\xb7\x2d\xcc\x02\x21\xed\x6d\xf9\x28\x7c\x5a\xc6\xe6\x1c\x86\x5d\x63\xc1\xbe\x09\x59\xe0\x49\x5b\x9d\x31\x8e\xdc\x03\x47\xdf\x2c\xe3\x19\x2e\xb8\x99\x56\xba\xc5\x65\x59\x29\xa5\x88\xf7\x90\xb7\xbc\xa3\x1d\x95\xc2\xb0\x56\x4c\xa9\xd3\xf7\x25\x2e\xd0\x3b\x61\x86\x2c\x4c\x3c\xf4\x12\xa0\xdf\xd8\x82\x26\xa6\x29\x22\xe1\x23\x9f\x4b\x7e\xb7\x59\xd2\x14\x6e\xae\xf1\x1b\x68\xf9\x6b\x30\x2d\x2f\x43\x6c\x2d\x02\x3d\xc3\xc7\xd7\xca\x01\x9c\x27\xb0\xe7\x5e\xf9\x8c\x53\xcc\xfe\x8a\x4a\x1d\x7d\x3e\xc8\xaf\x04\x86\x7e\x9a\x9b\x20\x7b\x09\xc8\xcd\x07\xa1\x52\x7b\x3b\x39\x41\x6c\x2b\xda\x98\x2e\x92\x83\x90\x2a\x2d\xfd\x15\x68\xfd\x40\x16\xfa\x97\xc0\x41\x50\x38\x9f\xd8\xc2\x16\x11\xce\x2b\xd8\xce\xf2\x6d\x49\xb7\xbd\x4d\x46\x85\x50\x31\x13\xbe\x56\x9a\xbd\xb2\xf0\x72\xd0\x98\x55\x21\x09\xf7\x91\x75\xbf\xed\x2c\xd1\x55\xe7\x17\x72\x27\x79\x7b\x22\x21\xd1\x5e\x6f\x8f\x0e\xfb\x2f\x0e\x63\xc9\xfd\xe4\xd5\x95\xf3\x93\x90\x33\x5b\x1d\x42\xcd\x97\x9d\x5e\x65\x9a\x58\xdc\x32\x31\x3e\x13\x4b\xb5\x74\xd4\x35\x79\xac\x25\x21\x25\x58\x78\x97\x89\xcc\xce\xb6\xb1\x0a\xbe\x15\x66\xc5\x8a\xd4\xe0\x80\x0f\x7e\x90\xc4\x12\x2f\xbb\xb1\x5a\x29\x1f\x3c\xa0\x8b\x5b\x16\xd1\x9d\xf1\x53\xb4\xca\xd0\x1c\x75\x4b\x03\x1d\xce\x65\xc2\xf3\x86\x5e\x09\x9d\x9e\x12\x14\x24\xb7\x62\xf0\xa0\xa4\xab\x68\x9e\xd8\xae\x52\xbe\x66\xc4\x36\x4e\x36\xd7\x96\x5d\xb6\x56\xd2\x80\x05\x0f\xc7\x1a\xb7\xc6\xf5\xfa\x0d\x6f\xe7\xc8\xbd\xed\xf8\x6d\x73\x6a\x1a\xda\x5a\x36\x7a\x6f\x2c\x8c\x35\xe7\x39\xab\x8d\xc4\x1d\x94\x70\x9a\xd8\x02\xb9\x26\x4e\xf4\x5a\x71\xce\x02\x69\x68\x4a\x38\x7a\x18\x1a\xee\x0c\x48\x83\x88\xe7\x4e\xb8\x27\xd8\x5a\x2e\x8e\x07\x07\x40\x3b\xb6\xf4\x28\x72\xc6\x76\x8f\x64\xe5\x2e\x3c\x80\x12\x47\xf0\xaf\x1d\x7d\xb0\xf8\xc9\x02\xf4\x0a\x9c\x62\x88\x76\x98\x7e\x98\x56\x6e\xa3\xf4\x5e\x16\x52\xab\xe6\x9e\x5f\x5e\xa6\x84\xf3\x89\xdc\xc1\x33\xae\x95\x01\x9f\x57\x22\xf4\xd3\xcd\x2d\x77\xad\x5d\xd2\xd1\xea\x79\x60\x99\xfc\x26\x8e\x6f\x70\xa1\xa4\x28\x83\x9e\x51\x24\xa0\x35\x67\x7c\xfe\x61\xf8\x1d\x1f\x7a\xfb\x9f\x6e\x90\x3b\xa8\x01\x5e\x0e\xb4\x3f\xbd\xc0\x1f\x69\xca\xc5\x94\x2e\x80\x5b\x3d\x75\xd0\x17\xb4\x4f\x6f\xf1\x96\x8a\x81\xb7\xe7\x70\xe0\xee\xdc\x5f\xaa\x8b\x7e\xf5\x09\xbf\xa0\x4c\x0e\xc3\x7d\x39\xb7\x73\x4d\xce\x89\x9a\xdd\xcf\x83\x19\x9b\xbc\x55\x43\xee\xb1\x36\x27\x90\x3d\x5e\x4f\x22\xf9\x62\x86\x26\x7b\xdf\x83\x39\x8e\x5e\x61\xec\x11\x48\x87\xa8\x64\x00\x3a\xb0\x5d\xc5\x21\x61\x5b\xcf\x4a\x33\x2e\x31\x8a\xbc\x07\x48\xde\xcb\xc2\x1b\x93\xfb\x0f\x49\x0d\x6f\x33\x06\x3f\xf2\xb6\x04\x86\xb6\xfe\x39\x51\x2f\xec\x8e\xfc\x2c\xde\x8e\x50\xb7\x12\xf0\x9c\xc5\x88\x73\xb0\x72\x7b\xf2\x8c\xeb\x0f\x8c\xbd\x81\x04\x89\x04\x85\x5c\x1b\x23\x42\xcb\x1b\xd4\x08\xb4\xd7\x36\x47\xa3\x48\xa6\x24\x2b\x2b\x98\x45\xb2\x0a\x83\x38\x63\x5a\x69\x76\x41\xe9\xb8\xe8\xce\x94\xe0\x95\x1c\x48\x79\x5b\xe8\x23\xf7\x54\xbe\x65\xce\x73\x63\xf3\xc6\x82\x53\x56\x95\x04\x7e\x3c\x10\xd1\xe3\x2a\xc9\x8b\x79\xc5\xc8\x96\x56\x21\x0c\xc0\x96\x28\xce\x5f\xcc\x54\xc3\xc7\xfb\xa3\x0c\x98\x63\x0e\x34\x3b\xd3\x49\x72\x05\xb8\x02\x59\x7c\xa6\xf0\x7b\x60\xf4\x21\x26\x09\xdf\xf2\x03\xba\x8d\x45\x2c\x87\x65\x49\x12\x93\x22\xf6\xc8\xc1\x16\x62\xaf\x28\x17\x48\xc8\x1d\x2d\xe7\xd3\x16\x08\x4b\xad\xb2\x64\xce\x96\x31\x86\x09\x05\xb1\xb2\x0d\xce\x04\x36\xfb\xe8\x0b\xf9\x1b\x1e\x91\x4e\x19\xa4\xb3\x1a\xd9\x8c\xf2\x14\xff\x0f\x4a\xed\x41\xff\x55\x78\x9a\xce\xa0\x68\xd0\xc3\x38\x7d\x2f\x04\x74\x92\x70\x8f\xa6\xab\xca\xbc\x76\xa4\x8a\x56\x51\x7a\x80\xdf\xc2\x9c\x65\x50\x4f\x73\xd2\x95\xde\xcf\x4e\xd6\xcf\xd3\xc1\xe5\xc5\xf9\xda\x9b\x86\x7f\xaf\xb2\xc2\x71\x81\x0b\x5f\xb5\x96\x03\x84\xd2\xd9\xa9\x6a\x83\x12\x13\xd3\x99\xbf\xfb\x1b\x2e\x60\xe7\x1b\xb9\xa6\x9b\xa4\xd0\x8c\x7b\x8c\x2a\x64\x9f\xf3\x82\xe7\xed\x8b\xbc\x7a\xff\x67\x57\x20\xac\xc3\xf4\xd1\x21\xdd\x35\xfe\x60\x49\x07\x27\x44\x0d\x26\xd3\x86\xbc\x00\x1a\xdb\xbc\x19\xcb\xda\x70\x0a\x0f\xe7\xc6\x6e\xa5\xa2\x9d\x19\x40\x96\x77\x76\x07\xae\x23\xad\x7a\x16\x10\x19\xc4\xdd\x36\xe7\x44\x6a\x59\x83\x1d\xcf\x4f\x46\x68\x12\x59\x35\x14\x9a\x1b\xb2\x19\x79\x68\xe7\x61\xcf\x19\x88\xf2\xc6\x44\x20\x36\xd9\xa7\x57\xc4\x96\xb1\xd3\x59\xe1\x1b\x5f\x26\x6f\x6b\xc8\x7d\x79\xdb\xfd\x91\x8d\x72\xc0\xd0\xb8\xa3\xc8\x78\xf8\xf7\xe3\x2f\xfe\x85\xf0\x23\x0c\xf2\x07\x38\x5b\x39\x6d\x0f\x4e\x80\xd2\x46\xae\xb0\xe3\xa1\x89\x1c\xaf\x03\x0e\x85\x42\xeb\x76\x68\x25\x23\xe6\x13\x55\x76\xff\x2d\xa3\x25\x64\x66\x09\x3d\x5c\x5a\xf2\xf1\xfb\x82\x4c\xdc\xe2\x5f\x5c\xbd\xb7\xf7\x67\xe4\x42\x36\xa3\x96\xf0\xf0\x1a\xff\x9c\xef\xce\x97\x00\xaf\x36\x39\xae\x26\xef\x09\xce\x0f\xb9\xf6\xd1\xfa\x21\xec\xe7\x1c\x50\x95\x38\xa7\xfc\x00\xef\x7e\x3a\x85\x43\xdc\x35\x69\xc8\xac\x2d\x69\xf4\x60\xb0\x48\xf9\xd3\xd0\x46\x73\x3c\x95\x77\x63\xbe\x55\xc5\x21\xa1\x84\x93\x10\x89\x99\xf5\x1d\xa6\x0f\x10\x36\xab\x2c\x7d\x06\xc3\x45\xb9\x02\xcc\x66\x99\x33\x3f\xfb\x0a\x26\x88\xa6\xc5\x48\xca\x03\x3a\xd4\x15\x8d\xb2\x87\x6f\x6e\x4b\x01\x96\xbd\x47\xac\xa9\x05\x54\xf0\xb2\x99\xd1\x4c\x85\x5d\x61\xcc\xd1\xe4\x3a\xd8\x9b\xcc\xf4\xef\xb2\xff\x16\x9b\x06\x92\x7d\x64\x39\x16\x42\x5f\x0a\xd8\x9a\xc5\x4c\x60\x11\x4e\x1f\xfe\xcf\xa8\x7c\x19\x0f\x17\xac\xbf\x66\xc1\xd8\x6f\xbc\x50\x83\x30\xd4\x7e\xbc\xb8\x96\xd1\x9d\xd7\x65\x1b\x21\x8f\xcc\xb4\xd8\x5a\x86\x82\x5d\xf9\x0a\x54\xa7\x46\x96\xf7\xcf\xf8\x26\x8b\x44\x33\x30\x84\x9a\x7d\xc2\xb2\x06\xee\x9e\xdc\xe0\xb6\x04\x46\xbd\xba\x49\x91\x75\xa5\x99\x2c\xe4\x0f\xf0\x2d\x6d\x63\x75\xc3\x43\xb6\x84\x2c\x7b\x44\xe6\x8f\xb8\xd7\x9a\x66\x48\x90\x91\xe4\x71\xc3\x46\x5b\x31\x99\x5c\x24\x2d\xfa\xf2\xaf\xd3\x75\x79\x05\x6d\x10\xfa\x9e\x39\x38\x54\xb7\x7c\xbc\xdd\x06\x21\xb8\xd8\x17\x1e\x83\x5b\x23\x30\x64\x8b\x4f\xf2\x06\x4a\x20\x61\xe8\x15\x7e\x0b\xeb\xb3\x4e\x74\x55\x4b\x0b\x06\x76\x20\x51\x5c\x92\x64\xfa\x2b\xd9\x22\x27\x5c\x94\x81\xe4\xb0\xea\xf0\x1e\x40\xa7\x93\xa0\xa6\x18\x6d\xfd\xac\xa9\x0b\xb4\xaa\x4b\xe3\x1c\x42\x3a\x84\x9b\xe7\xd2\x6f\xb0\x9b\xc3\xd7\x8e\x77\x25\xc8\x22\xd8\x8a\xe6\x95\x16\x72\xaf\x27\x60\x6c\x93\x86\xd0\xa0\x7e\xc6\xaa\x7c\x30\x5d\x97\xc8\x9a\xfa\x12\x47\x29\xe6\x76\x4a\x9b\x3a\x8b\x93\xd9\x33\xa9\x31\x5a\xf8\x64\xbf\x1b\x2c\x6f\xe9\x0d\xe4\x17\xb9\x8d\x12\x18\x03\x86\x77\xb6\x43\x42\x62\x6d\x0c\x76\x7b\x91\xff\x3a\xe3\x8e\x51\x7d\x42\x8c\x62\x27\xce\xd8\xcb\x33\xf2\xc6\xd3\x7e\xd1\x10\xa9\x07\xb3\xc7\x37\x57\x5a\x6d\xb7\x7c\xd5\x33\xb3\x8b\xb6\x15\x67\xc0\xea\xee\x23\xe6\x60\xa1\x9b\x2c\xee\xec\xb5\x48\xb9\xfc\xde\x96\x6e\xf1\x04\x8b\x16\x4c\xbc\xfe\xd3\xbe\x18\x8f\x00\x34\xe1\xbd\xd4\x4c\x19\x20\x90\xae\xc6\x83\x3e\x7b\xaf\xff\x1c\x26\x23\x9a\x1a\x3c\x96\x58\x3e\xd7\xbb\x07\x9f\x74\x1b\x95\x9c\xa7\xa9\x54\x4f\xba\xd8\x7f\xa0\xd4\xc9\xd1\x9f\x08\x26\xb0\x15\xf8\x18\x6d\xad\xac\x06\x99\x4a\x82\x61\x13\xc1\x5e\x7f\x4b\x15\xb7\x78\x01\x0f\xeb\x2a\xc9\x5d\xbc\xd2\xbd\x07\x54\x1f\x58\x73\x89\x60\x3d\x07\x64\x23\x77\xf5\xd8\xdf\xe0\xff\x07\x4a\x55\xf2\x33\x50\x84\x20\xa4\x9d\x03\x5b\x7a\x67\x39\xca\x97\x9d\x88\x13\xf5\xdb\xb7\x6c\x27\x5c\x58\x6c\x13\xab\x92\x6c\xfe\xfc\xd1\xc2\xa5\x77\x0a\x28\x55\xe7\x41\x01\x05\xbb\x82\x4e\x6b\x3d\x5c\xcf\x41\x93\x10\x67\x0d\x19\x5b\xdc\x9d\x14\xb0\xa7\x5a\x9e\x78\x7b\xb4\x71\x74\x27\x7d\x9d\xdd\xf9\x67\xf1\x6d\xa6\x2e\x27\xad\x3a\x6b\xa7\x84\x1d\x37\x76\x43\x9c\x4e\x0d\x8c\x23\xf7\x67\x02\xc5\x8e\x2a\x44\x75\xd5\x3a\xd2\x2d\x7d\xbc\x6a\x27\xed\x7d\xde\xf0\x54\x47\x98\xec\x87\x8c\xfd\x8e\xeb\x53\x09\x04\xcb\x76\x8e\x44\x29\xac\xcc\xde\xf9\x0c\x6d\x76\x59\x82\xb2\x79\x73\x8a\x98\x66\x43\xd0\xb7\x32\x84\x4a\x4e\x9c\x10\x74\xa6\xae\x88\xa4\x7e\x63\x22\x9a\x61\xcc\xa1\x4c\x5f\xe1\x7a\x12\x92\xf4\x18\xe5\xc8\x36\xdf\xdb\x57\x36\xea\xaa\xcc\x5f\xcd\x8b\xb7\x73\xcf\x3c\x5c\xda\xdd\x94\xc9\x51\xf9\x0d\xf5\xdb\x6e\x30\x7c\x9e\xd6\xae\xc8\x16\xb8\xd0\xfc\x3c\x1a\x23\x66\xed\x87\xc6\x99\xb4\x45\x68\x17\x43\x3c\x5b\xf8\x81\xb0\x62\xdf\xbc\x63\xc6\xdc\xb1\x5e\x2f\xd6\xc9\x66\x4d\x38\x02\x83\xf7\xc6\x12\xd7\x44\x2c\xa3\x5d\x68\x5b\x94\xc8\x99\x45\x5e\xbd\x86\xd6\x1d\x7c\x21\xf6\xd0\x8e\x31\xc2\xd0\x12\x85\x90\xdb\x5b\x9c\x6e\xab\x46\x8f\xb1\x53\xea\x76\xb4\xfc\x1a\x6d\x1e\xc8\x6e\x0a\x9d\x12\x72\x92\xac\x29\x93\xfb\xcb\x10\x4d\x8c\xcb\xc2\x54\xe2\x62\x4c\x1b\x07\x59\xce\x58\x96\xf6\x5f\xbf\x92\xe2\xd0\xc9\x12\x19\x60\xb3\xda\x39\xef\xe3\x91\xb8\x35\xa7\xd8\x71\xe6\x76\x77\x7c\xef\xb0\x8f\xc5\xd2\xde\x2a\x3a\x29\x03\xce\x11\xf2\xbe\x13\x1d\x24\x35\x08\x56\x32\x17\x25\x79\x59\x11\x2d\x7e\xfb\x2b\x79\xbf\xf4\xc1\xd9\x6b\x15\xdd\xd9\x6a\xd3\x54\x4c\x53\xf4\xac\xdd\x1b\xb3\x9c\x2a\x15\x14\xb2\xb3\xc4\x04\x74\xae\x5e\x27\x24\x3f\x6f\xbc\xba\x3c\xdc\xb2\x56\xf4\xe0\xa8\x4b\x61\x8d\x55\x0c\xab\x73\x80\x8b\x99\x72\x75\xd6\x7a\x48\x11\xdc\xe0\x18\x4b\xf2\x82\x4b\xb1\xb1\x19\xe7\xa3\x84\x1c\x33\x1c\x1a\xc4\xb3\x8a\x4e\x0b\x98\xc5\x9a\x32\x78\xc9\x86\x2a\x6f\x7d\x59\x9d\x48\xdf\x86\x56\x86\x16\x19\x60\xbc\x66\xd2\x52\x08\x33\xbd\x3d\x81\xb9\xd8\xfe\xaa\x26\x61\x08\x62\xac\x9e\x03\x1c\x5e\x9f\x8f\xa0\xc5\xbc\xd5\xb2\xe3\xca\x66\xf2\xc3\x14\x2a\xd5\x15\xff\x41\x58\x94\xe9\xe0\x16\x67\x24\xc9\xee\x1a\xfe\xd3\xc9\x09\xa9\x31\x50\x3e\x84\xa5\x58\x24\x0f\x70\x75\xee\xcf\xf5\xba\xd0\x96\xc3\xbf\x53\xbc\x63\x53\x9e\x15\x7c\x6b\xf4\xa6\xe4\x03\xd8\xa5\x49\x05\x21\x99\x56\x7f\x1f\xf0\x10\x1e\x3a\xc8\x61\x65\x91\xd2\x98\xc7\x56\xaf\x33\x3f\x4c\x1d\xa2\xe8\xe1\x4d\xf3\x60\x5e\x92\x0a\x4a\x3a\x1c\xe8\xff\x32\xc4\x3c\x1b\x00\x27\x97\xe4\xcb\x60\x5b\x3a\xa9\x3e\x8d\xe2\x43\x92\xeb\xb0\x90\x10\x2a\x8e\xff\x93\xf5\x68\x09\x08\x36\x0f\x46\x25\xa0\x95\x4d\xb4\x74\x17\xe5\x50\xbf\x8f\xde\x5e\xba\x39\x6b\xb9\x7a\x77\xbe\xd2\xfa\x3c\x41\xd2\xe5\x9d\x19\xde\xfe\xa1\xa8\x9a\x3d\x12\xc7\x85\x73\x27\xe6\xdb\x70\x01\xe3\x84\x93\x49\x2e\xd9\xaa\x83\xf4\x3b\x0f\xa5\x98\xb8\x9b\xc5\xac\xc8\x26\xcb\x1b\x57\x45\x99\x5c\xe6\x44\x1f\xa8\x40\xb0\x32\x1c\x16\x9a\x83\x77\x71\x4b\xd7\x89\x0d\x9b\x62\x14\xa3\x14\xb9\xa9\xc6\x57\xfb\xe1\xe3\x28\x6a\x30\xfa\x1a\xec\xea\xe9\xc5\x42\x80\xa9\x95\x3d\x3c\xf9\x83\x8d\x55\xcd\xd7\xfc\x64\x7f\xaf\x0a\x03\x10\x14\xa9\x86\xca\x5b\x3d\xb4\x72\x4d\xfe\xeb\xda\x59\x01\x78\x59\x0d\x0b\x5e\x08\xb6\xc8\x5e\xfd\xc7\x41\x27\xd3\x99\xe1\x0e\xa5\x0c\x44\xea\x61\xfe\xbe\x5d\x86\x15\xa5\xdd\x3b\x28\x49\xf3\x30\x3e\x2d\xb3\x7c\xcd\x70\xd0\x20\xf6\x79\xb1\x2d\xd0\xb2\xd7\x85\x95\x92\x77\x20\xfe\x2f\x21\x45\x03\x9f\x4e\xbc\x0c\xab\xb8\x92\xf5\x07\x76\x2b\x51\x90\xe2\xed\xc9\x69\x93\x34\x05\xed\x40\x65\xb4\x32\x6a\xb5\x1d\x2d\xf0\x97\xe7\x81\x9a\x20\x91\x6e\x81\x3e\x24\x25\x13\x06\x14\x67\xad\xbb\x92\x8d\x3d\xbd\x01\xf6\xa2\x4b\x54\x39\x0e\x74\x73\x1e\xe9\xd7\x9e\xea\x43\xbe\x99\x83\x34\x73\xf0\xce\x04\x67\xf2\x24\x09\x57\xf4\xab\xd4\x42\x98\x11\x3e\x29\x05\x66\x2a\x5c\xbc\x8d\xca\x49\xb7\x5b\xdd\x97\xe6\x19\x3b\x59\xa3\x07\x4a\x74\x2d\x01\x05\xde\x7a\x76\x0b\x46\x77\x61\xb4\x72\xe2\x44\x2f\x4d\xf0\xe1\xb1\x09\x15\x49\xb8\x30\xfa\x25\x2d\x1f\xc3\x65\x77\x0a\x43\xd9\x63\x34\xf9\x0a\xf9\xfe\x44\x8c\x98\xc1\xf6\x53\xfd\xb5\x9b\xbd\x49\x97\x9b\x37\x3b\x29\x2a\xeb\xb7\x5c\x8b\xc7\xee\x52\x0c\xc1\xb7\x45\xd8\x8b\xea\x65\xec\xe9\x01\x36\x31\xf0\x50\xf1\x21\x33\x18\x12\x72\x81\x0d\xb2\xad\x68\xf4\x91\x33\x16\x99\x22\x3b\x43\x3e\x7b\xac\x66\x14\x1e\x0b\x32\xbc\x17\x69\xe2\xce\xbf\x3f\x1e\x43\x7b\xc5\x42\xc5\x04\xa6\x07\x61\x2f\x5e\x75\x75\x38\x8d\xa1\x08\x3b\x6b\x00\x49\xdc\x9b\xf8\x17\xd6\xb6\x95\x4f\x6e\x5b\xb0\xba\x83\x90\x5b\x80\x7c\xfe\xea\x95\x3a\x00\xef\xcd\x75\xa1\x0e\x54\xad\x71\xee\x29\x28\xa2\x36\x1f\x5f\x82\xac\xac\x3f\x16\xc9\x86\x82\x10\x1c\xc4\x11\x82\xa6\x18\xce\x2e\x73\x85\xa2\x9b\x7d\xf6\x83\x92\xa0\x4d\xb5\x4d\x5c\xcc\xe7\x31\x78\x56\xa4\xfb\x59\x59\xcc\x1b\x25\x2a\xcb\x4c\xcf\x32\x52\x75\x00\x80\x12\xff\x49\x82\xe2\xa1\xed\xb9\xe2\xb3\x65\x25\xec\xc1\x9e\x5e\x2f\xf0\x0e\x05\x6d\x6a\x65\x29\x57\xcb\x0f\x6b\x00\x75\xf1\x3d\x64\x66\x7c\x87\x15\xa5\x60\x8f\xa7\xd7\x74\x20\xe1\x00\xf9\x2d\x74\x13\x92\x9b\x6f\xe1\x80\xed\x72\xa7\x92\x99\x04\x4b\x08\x1c\x7a\xbd\xe1\x2d\x5b\xcc\x38\x1a\x21\x11\x57\x15\x53\x7a\xb3\xf1\xa9\xe7\x2b\xb2\xb7\x6b\x2e\x23\xea\x50\x9b\xe5\x07\x1a\x00\x1d\x1e\x71\xf7\xd3\x41\xb6\xd1\x1d\x2d\x77\xd2\xe6\xbb\x87\xf5\xfd\xe2\x59\xb1\xf2\x3c\x1a\xb0\x0e\x3b\xda\x6c\x36\x0f\x67\xd7\x70\x50\x9f\xa9\x37\x92\x4a\xeb\x45\xcf\xe4\x2d\x28\xaa\x29\x40\x6f\x02\x6c\x20\x61\x69\xad\x55\xf3\xab\x6b\x15\xce\x5f\x36\xcb\x51\x0c\xaa\x16\x67\xbf\xc9\x9f\x28\x5f\xd6\xf2\xf9\x21\xd0\x7c\xcf\xde\x96\x33\x18\x8a\x47\x71\x77\x4e\x15\x00\x94\x80\x00\x2e\xfd\xbd\x7f\x1f\x8b\xa5\xea\xe8\xbd\xba\xbc\x5a\x70\x8d\xea\xb1\x2e\x0b\x9e\x6d\xfa\x2a\x82\x21\x30\xc9\xdf\xde\x84\xd0\xf4\xb4\xd9\x53\xca\xf9\x67\x00\xdf\x12\xcb\xb6\xc5\xfb\x4a\xac\x8f\x8d\xe5\x9c\xda\x57\x1a\xb9\xc9\x99\xbd\x1d\x60\x4b\x37\x3c\x1c\x34\x4b\x1c\xe7\xd5\x8b\x38\x9d\x72\x33\x46\xfc\x44\x5f\xf1\x33\x7a\x41\x67\xd6\x0d\xa1\x9b\x57\x6a\xd7\x11\x00\xfd\x89\x59\x59\x08\xfd\x6d\x49\x02\x5b\x3b\xdc\x4f\x0f\x93\xf4\xd4\x3c\x40\xd0\x23\x90\x71\x2b\xd1\xa9\x9b\x75\x31\x94\x1a\x50\x9a\x25\xf4\x20\xc7\x4a\xc6\xeb\xe2\x37\x15\xb6\x5d\x2c\x55\x23\x32\xe2\x52\x49\x68\xfc\x63\x30\x04\x2e\xab\x2c\xd1\x2f\xe4\xa8\xda\x9d\xac\x05\x5a\x7b\x3f\x50\x7f\x33\x4a\x3b\x62\x02\x6e\xed\x4a\xf0\x28\x0e\xde\x70\x66\x1f\xeb\x57\x0d\xc5\x3b\x97\xcb\xe4\x12\x69\x49\xc1\xae\xc6\x7b\xcf\x70\x60\xd6\xc6\xc8\xb3\x03\x51\xec\x15\x06\xff\xa2\xef\x1a\x0a\x95\x4e\x08\x8b\xaf\x41\xa4\x77\x24\x6d\x0b\x97\x31\x87\x83\xb3\x5d\x25\x7f\x17\x6f\xf8\xcf\xbb\x2d\xe5\x6e\xda\x17\xb3\x22\x22\x09\xbd\x00\xe2\x4e\xfe\x3d\xd8\x91\x80\x73\xee\x3a\x20\x5b\x01\x06\xf9\x86\xea\x5d\xf3\x36\xb7\x16\x4e\xb6\x58\xee\xee\x6b\x57\xf7\x91\xf2\x7d\x47\x95\xc5\x5a\x64\x04\x43\x13\x0d\x8a\xd3\xdf\xad\x54\x64\x1f\x36\xfa\x30\xd5\x3a\x78\x19\x9d\x21\xd0\x8b\x84\x4a\xe7\x38\x99\x53\x61\x04\x00\xbe\x80\x76\x37\xc3\x88\xcb\x9a\x77\xe3\x74\x6a\xdd\xf2\x6f\xd1\x33\x90\xa3\xbb\xf6\xf0\xc3\x74\x00\x1b\xa9\x6a\x28\x2c\xa8\x42\xd7\xc2\x79\xc9\xb1\xfe\x16\x2b\x30\x29\xa2\x0d\x8d\xcd\xb6\x79\x33\xe1\x9b\x2e\x6a\x04\xd7\x72\xc4\x00\x83\x66\x9c\x0a\xb4\x2e\x3b\xb3\x8d\x45\x86\xa9\xe0\x86\xb8\x5b\x92\x98\x9a\x01\xf0\x9d\xaa\xb3\x04\x4d\x93\x0b\xd5\xf5\x82\xcf\x3d\x8b\xb7\xdb\x9d\x08\x01\xa3\x27\xeb\xba\xcc\x80\x01\x87\x90\x8e\xc7\x04\xef\x33\xb3\x59\x5e\xdc\x3e\x52\x43\x2d\x76\x19\xda\x84\x20\xab\x64\xca\x69\x32\x45\x82\x2f\xef\x1e\x24\x3c\x9f\xd8\x2d\x49\x48\x47\xb5\x75\xd2\xea\xe2\x03\x2d\x60\x5d\xf1\x0d\x3b\x0e\xb0\x33\x92\x05\xb2\x0f\xef\x7a\xc6\xc4\x20\x50\x83\x10\x06\xa8\x91\xa4\x25\x57\x2a\xdd\xa2\x6b\x46\xad\xd6\xfd\x4e\x28\xa8\x1c\x9e\x89\x6c\xaa\x6a\xe7\x09\x68\x26\xea\xf3\xa2\xca\xa4\x3e\xd3\xf4\xb5\x51\x88\x38\xbb\xb9\x57\x5c\x6f\x4b\x07\x8b\x97\x55\x25\xe0\xa2\xfc\xc7\xed\xff\x8d\x66\x08\x24\x1f\xf5\x9f\x69\xb7\xb7\x05\x69\xa7\xa6\x9b\xdc\x62\xa2\x17\x38\x10\x95\xd6\x6c\xf3\x08\xca\x24\x4a\x24\x56\x80\xf6\x1d\xb4\x06\xb4\x01\xca\xfb\x9f\xb6\x04\xf4\x72\xed\x5f\xfa\xb3\x7c\x5a\xfb\xdc\x1b\xc2\xd0\x15\x48\xbc\x1c\x5b\xe7\x67\x68\x7b\x79\x75\x80\x6b\x27\xd7\x65\x80\xd9\xbd\x26\x43\x6d\x6b\xfa\xfd\x85\x5a\x1a\x35\x3c\xbf\x44\xea\x75\x84\x51\x0a\x8d\x90\xf4\xa4\x38\x33\x02\x15\x12\x14\xd6\x4e\xa4\x72\x4d\xf2\xf6\xa8\x31\x5a\x23\xf1\x68\xa0\x5c\x9c\x3e\x4b\x1a\xe9\x25\x77\x0d\xbc\x26\xad\x2f\x11\x25\x27\x0d\x8a\x22\x66\x96\xf8\xd7\xa8\xa5\x8a\x07\x42\x09\x42\x8f\x9e\x5d\x56\x7f\x48\x57\x1e\x04\xe2\x44\xae\x82\xd7\xb8\x0d\x36\xf8\xc0\x2a\xca\x5a\xce\x11\x8c\x1b\x12\x35\x8f\x81\x44\x47\x92\x86\x4c\x06\xce\x42\x5c\xcf\xd5\xad\x62\xc1\x00\x7f\xec\xa4\x92\x71\xb0\xd3\x65\xfc\x8d\x63\x3e\x3b\xf1\xb8\x53\xfe\x08\xbe\xb5\x6a\x8a\x85\x7d\xae\x8b\xcb\xdb\x31\x75\xd5\x36\xca\xea\x0a\x92\x0a\x76\xa0\xf8\x04\xfa\x9d\x69\x84\x51\xe0\x66\x75\x05\x46\x55\xa7\xc4\xe2\x2b\x8b\x08\xf7\x5f\x2c\x42\x7f\x50\x23\xd5\xd2\x8f\xbd\x46\xb3\x6d\x3f\xc4\x7e\xd0\x2b\xc4\xa3\x1c\xc7\x2b\xa8\x75\xa4\xcb\x3d\x59\x5e\x2e\x68\x9b\x6b\x1a\xfa\xd9\xb9\xae\x41\x33\x7f\xd2\x0b\x6e\x87\xc6\x0e\x38\x5f\xb9\xea\x41\x2d\x91\x6a\x21\x46\xb3\x49\xda\xde\x88\x0f\xd5\xf6\x5b\x5b\xd0\x27\x41\xa1\xd9\xf1\x75\x40\xa8\x0c\x39\xa8\x13\x60\x25\x79\xa0\xae\xfd\x9c\xb1\x70\x9a\xab\x77\xa4\x5c\x5f\x79\xbc\xa0\x14\x01\xdb\x3a\x92\x65\x74\x03\x5a\xa9\xd6\xc5\x65\x3a\x7a\xe4\x14\xb0\x02\xf8\x2c\x60\x4f\x68\x76\x05\x57\x32\xef\x5e\x27\x88\x5e\x1d\x38\xe8\xc1\xc4\x91\x02\x8f\xc7\xa7\x69\xce\x27\x11\x00\x68\xcc\xaa\x51\x61\x7f\x51\x92\xa6\x3a\x0a\x74\xe3\xee\xbe\x3f\xd9\x3c\x9f\x84\x75\xd4\x9f\xba\xba\xd7\x3f\xcc\x0b\xd9\xc5\xec\x6e\xa4\x26\x63\xc2\xe1\x6e\x58\x9f\x8f\xea\x5c\x21\x33\x20\xd4\x10\xea\x3f\x7b\x5c\xd8\x25\xed\x34\xe9\xe4\xc7\x33\x20\x9d\xbe\x4d\xf7\x72\xf2\x0f\x0b\xf6\x8d\x6e\xf1\x00\x53\x89\xbe\x1b\x77\xa1\x53\x09\x33\x7a\xc5\xe7\x9d\x66\xe7\x42\x65\x17\x0e\xbd\xb7\x34\x95\x85\xde\xe5\x24\x46\x9c\xc3\xab\x40\x65\x02\x19\xe5\xcc\xb4\xdd\x4a\x1a\x8d\xcd\x42\x48\x79\x02\xc4\x01\xb2\x15\x36\x2c\x43\xda\xe5\xb1\xcd\x70\x1d\x44\xb6\xb7\xea\x61\x96\x24\xdb\xa8\x4b\xbf\x63\x3c\x90\x91\x6f\xe8\xe5\xf1\xb4\xa9\x19\x52\xe9\xb7\x4c\x15\xfc\x6c\x8b\xa1\x27\x17\xeb\x82\xda\x9e\xe2\x61\xbf\x7f\x1f\x5e\x7f\x33\x88\x83\x5e\xd0\xb1\xab\x27\x96\x42\x3a\x31\x79\xeb\x85\x78\x0b\x42\x6e\x3f\x85\xaa\x35\x5a\x59\xb2\xa3\xb8\x7b\x5c\xaf\x64\x5b\x70\x13\xd0\x78\x8f\x9a\x94\x37\xe5\x04\x05\xe4\x58\x4e\xbd\x02\x94\xb1\x23\xfd\xef\x51\x7e\x92\xc5\x0d\x7b\x97\xbc\xdc\x29\x34\xf2\x6f\xe6\x24\xa2\x64\x5b\x87\x37\xdd\xda\x55\xf8\xe0\x12\x3a\x51\x56\x8f\x9f\x27\xd2\x2f\x0d\x59\x1f\x0a\xe3\x0d\xf9\x12\x79\xd3\xf5\x42\xec\x74\x6b\x78\x85\xb8\xbb\x76\x84\x07\x6d\x08\xbb\x0d\x29\xae\xea\x7b\xad\xf8\x15\x14\xbe\xb6\xd1\x6c\x6e\x5d\x18\xa3\x8c\x2c\xf1\xac\x9e\x13\x0b\x24\xdb\x03\xc4\xa9\x88\xd2\x97\x17\x83\xc8\x63\xc9\x65\x6d\x0b\xcb\x54\x1a\x0f\xc2\x92\xa4\x35\xf2\xef\xb2\x6f\x4b\x23\xa7\x27\xc5\xbe\x34\xe4\xfa\xa2\xef\x92\x44\xef\xbc\x64\xde\xd6\xc9\x16\xf3\xf7\x30\xe4\x5f\xd9\x39\x0a\x93\x4f\x09\x6b\x60\x6a\x19\x0f\x00\x5a\xe6\x6d\xe3\xa5\xe4\xaf\x05\xe7\x31\x29\xa1\xc9\x3a\x90\xaf\x5a\xd4\x97\xa0\x13\xed\xf4\x80\xb5\xb5\xc4\xf0\xe1\x04\x43\xe8\x08\x89\x55\x0f\xca\xea\xaa\x2a\x4a\xc1\x06\x9d\x05\x3d\xbd\x53\x60\x8c\xaf\x4d\x0a\x66\xbc\x5d\xdd\x7b\x2e\x68\x7b\x36\x1a\xbc\x9d\x92\xe4\x4a\x43\x33\x41\x10\xc9\xd8\x89\xa9\xdf\xc1\x43\x74\x48\xfd\x3e\x00\x9c\x21\x84\x5d\xbb\xeb\x05\x4b\x44\x16\x67\xe7\xc5\xb4\xa1\xc3\x39\x17\xba\xbc\x29\x7c\x49\xc8\x68\xdd\x79\x4b\xf0\xfb\x1e\x04\x3e\xcd\x4c\x2c\x2b\xb7\x8a\x07\x16\x71\x08\xf6\x06\x23\x03\xa8\xda\x1c\x2a\x44\xfd\xf0\x4d\x11\xdb\xfc\x19\x02\x15\x86\x61\xaa\xa8\xb9\xb7\xab\x7d\x65\x3d\x72\xf4\xe8\x46\x79\x01\xf0\x43\x2b\xe1\x83\xe7\x90\xef\x9c\x3c\x90\x97\x98\xe1\x2f\x24\xf0\xa7\xf3\x8e\x9d\x29\x57\x90\x70\x6b\x22\x20\xae\x9d\xca\xf6\x12\xe7\x6a\xd5\x9b\x0d\x5d\x05\x5e\xe8\x3d\xac\xe2\xfd\x60\x7b\x93\x2d\x46\x64\x7b\x31\x1e\x49\x52\x39\xb6\x9f\xdf\x24\x0c\xbf\x83\xa7\xf1\x97\x07\xfb\xe5\xa6\x14\xe3\xe1\x44\xfa\x83\xfb\x22\x97\xbd\x83\x61\x13\x4f\xa7\x74\xf0\x88\x2e\x29\x80\x31\x7b\x24\x34\xc3\xc8\x46\xf7\x8b\xe8\x6f\x21\x24\xe1\x0a\x36\xb0\x9e\xd6\xed\xe1\x8c\xa8\xb9\x8e\x06\x09\x79\x78\xab\xc4\xb2\x07\x08\x58\xf2\x4d\x37\x7f\x23\x2f\x68\x89\xe0\x1d\xe0\x1a\xcd\xc8\x1a\xff\x4b\x66\xb5\x96\x7a\xb1\x4d\xf3\x68\xf6\x9d\xc3\x33\x02\xb4\xcf\x8d\x3d\x4f\x2a\x1f\xc1\x48\x06\x42\xd5\x6a\x83\x32\x13\x64\x05\x9b\xd7\xd1\xb2\x96\x9c\xc3\x20\xef\xf0\x0d\xd3\x49\xd0\x70\xb2\x7f\xbb\xa1\xc1\x60\x81\x24\x39\x6a\x62\xd9\x9f\x15\xcd\x38\x6d\x28\xd0\xab\x06\x65\xc2\x42\x9c\x8e\x5e\x6a\xc9\x8c\xf6\x90\x50\xfe\xb3\x30\xc5\x75\xbf\xaa\x25\x22\xf2\x99\x6b\xf8\xc2\x37\x64\x3d\x07\x04\x4f\xc1\x45\xf1\xed\x38\x19\xf0\x42\x95\xd2\x76\x80\xb6\xd9\x32\xe5\x10\x54\x6c\x94\xfd\xb8\x38\xbe\x1d\xa2\x64\xdf\x40\x44\x8b\x9b\x16\xb6\x74\xaf\x9f\xb8\xf2\xdb\x97\x3a\x89\xc7\x50\x0a\xd6\xc3\xb2\x2e\x7a\xa6\x50\x71\xdc\x54\x61\x3d\x2d\x83\xfb\x3e\x0e\xf9\xe6\x15\x1b\xf1\x8f\x20\x97\x02\xfa\x38\x25\x20\x62\x59\x21\x7b\xa7\x9b\xe9\x41\xa1\x0e\x21\xa1\x15\x4a\x4e\x12\xc5\x82\x86\xfb\x53\x26\x40\x1e\x15\xac\x31\xb1\xab\x68\x30\x63\x23\x9d\xb5\x44\x23\x6a\xf6\xcc\xea\x2a\x0b\xba\x12\x0d\x19\x46\xa9\xb5\xa3\xb4\x74\x01\x88\x92\x9c\xc8\x23\xca\x2c\x8e\xf2\x54\x1d\x2c\x03\x62\xf7\xa0\xfd\x6d\xf6\xa5\xc4\x2d\xc1\x75\x4c\xbb\x13\xf2\x3c\x38\x0d\xca\x63\xb5\xfd\x4f\x2e\x0e\x96\x31\x78\x42\x25\x52\x8a\x35\xa2\xef\xf2\xaa\x16\x0c\x1a\x61\x93\x6d\x31\xb2\xc7\xcd\x8e\xfd\xf3\xdb\x09\x32\x4b\xda\xe3\x7a\xa1\xa0\x56\x62\xf1\xd0\x27\x0c\xa8\x04\xac\x0c\x89\x4f\xc8\xbc\xbf\x3a\x8a\xc9\x72\x01\xe1\xfe\x67\x6f\x51\x9a\xc3\xc4\x3a\x77\x67\x53\x4c\xa3\xd0\x18\x34\xfb\x87\x2b\xf2\xee\xc0\xf3\x03\x8b\xe0\x3e\x63\x3f\xbb\xf3\xb5\x94\x0f\x83\x27\x5f\xcb\x93\x5b\x2b\x9f\x5d\x2c\x2f\x98\x32\x9a\xed\x40\x94\x26\xe3\xe3\x64\xc2\xde\xa8\x7d\x57\xd1\x5c\xa8\xd4\x1c\x4e\xef\x80\x18\xf8\x6e\x2d\x32\xe8\x04\x29\xf5\x05\x4d\x07\x71\xbb\x24\x01\x3c\x25\xe2\xf5\x52\xba\xdf\xbf\xb9\xe7\xaf\xd6\xbf\xdc\x64\xef\x89\xd7\x49\x01\x10\xc5\x35\x15\x86\xc4\x83\xea\x47\x31\xfc\xf9\x2d\x89\x12\x6c\x47\x4c\x42\x6a\x50\xfa\xc1\x50\x24\x04\x87\x42\xc7\x9d\x7e\xb4\xaa\x13\x78\x72\x1f\xd4\xcb\x74\x6d\x63\x79\x61\x72\x39\x0f\x2a\x56\x30\xee\xdf\x0a\x04\x5a\x96\xa8\x81\x21\x3a\x5e\x92\x37\x07\xb3\x6a\x0c\xd2\x15\x75\xcc\xc9\xbf\x72\xd9\xf2\x3b\xf9\x84\x8c\x26\x41\x17\xca\xf8\x62\x28\x33\x59\x6e\xf4\x2c\x97\x02\xff\xf6\xe1\xe7\x8c\xda\x4b\x4e\x16\x0b\xab\x88\xa7\xb3\x56\x3c\xdf\x9d\xb5\x27\xd2\xd6\x4f\x3b\x4a\x07\xec\xea\xe5\xbd\xa9\x00\x92\x52\xe7\x19\x56\x2f\x6e\xea\x63\xfd\x82\xd2\x66\xa4\xbb\x41\xbf\x8b\xae\xba\x28\xfe\x06\x04\x93\xe6\xd5\x22\xa3\xdc\xc1\xf4\x98\x36\xdb\x03\x64\x30\x6f\x41\x5d\x57\x32\xb9\xa2\xab\x92\x2d\xf1\x05\x57\x66\xbc\x56\x36\x48\x98\xd5\x0d\x33\x84\x70\x5b\x61\xaf\x63\x1b\x7c\x0b\x45\x14\xd9\xeb\xa0\xab\xe1\x05\xf0\xa2\x61\x21\x97\xe7\x27\xc0\x22\x40\xa3\x2c\x7d\x7d\x90\x1f\x7d\x17\x46\x21\x56\xde\x7d\xe2\xcb\x14\x2e\x0d\x30\xec\x5d\x35\x9a\xe1\x6b\x25\x04\x85\xde\x48\x65\xba\xe5\x0f\x30\xb3\x48\xd8\x4f\xa4\x4b\xb3\xba\xa1\x11\x15\x6b\x9c\x69\x5d\x08\x2a\x6b\x23\x0a\x40\x99\x70\xb1\x11\x63\xdc\x45\xc9\x47\x40\x8a\x93\x80\x2e\x11\xc4\x8a\x2c\x4b\xca\x9d\xb7\x8f\xd5\xd2\x1b\xda\x35\x0e\x86\x99\xcc\x37\x7e\x02\x65\x57\x36\x70\x57\xb4\x7e\xf2\xb4\x3b\x64\x47\x53\xe5\x10\x8d\xa1\xc1\xe9\x3d\x26\x29\x7f\x72\x2a\x88\x69\x41\x57\x9e\x64\xb1\x4c\x01\x45\x7d\x58\x10\xeb\x6a\x32\x0f\x69\x14\x64\x58\xa2\x13\x66\xf3\x42\xd7\x9b\xb7\x73\x53\x1c\xd1\x6d\x61\xa9\xd0\xd5\xc8\xda\x93\xf9\x84\x5f\xa2\xc6\x0f\x44\xdc\xb5\xa3\x78\xc0\x02\xe7\xd0\x64\xf5\xf3\x3a\x5b\x7a\x38\x21\xe2\xf9\x4d\xba\x9a\x30\xca\xb7\x23\x33\x77\x95\xe7\x18\x7a\xa8\x97\x8d\x92\x78\x80\x1f\x93\x5d\x06\xf2\xf0\x4c\xf9\x0d\xcd\xbc\x63\xd8\xe1\x68\xde\x7a\xe4\x94\x3e\xdc\xc4\x25\x59\xb5\x8b\x17\x99\x3a\x39\x38\xb2\xf6\x9a\x2e\x96\x3f\x78\x33\x07\x42\xb0\xcd\x2e\x2e\x9c\x73\x81\x7a\xad\xa9\x52\x31\xa1\x12\x0b\xe6\x3d\x8b\x70\xd4\xd6\xb1\x0d\x50\x4e\x83\x46\xe2\x5c\x26\x42\x49\x93\xa5\xc7\xc1\x68\x01\x5a\x64\xa0\xa2\x7f\x82\xe8\x3a\xea\x01\xf6\xd9\x30\xdb\xc9\x73\x64\x53\x1c\xf6\x5b\x9d\x1d\xc6\xd9\xfc\x2e\x64\x73\xed\x04\x78\x47\x8d\x93\xb3\x52\xbc\x4d\xe4\xd6\x35\x96\x74\xcf\x15\x0e\xa6\xc8\x50\x12\x14\xbc\x81\xf2\xb1\xd5\x67\x87\xf1\x63\x4f\x84\x9d\x2a\xd3\x67\x70\x2a\xca\x4c\xcd\xd2\xd9\x65\x33\x8d\x0f\x01\x4e\x45\xc9\x4b\xb7\x7a\x80\x29\x3b\x71\x9e\x94\x83\xb2\x60\x90\x1b\x5d\x41\x76\xd6\xe5\x62\x03\x28\x6a\x2d\x4d\x03\xbd\x7a\xb2\x9b\x6a\x36\x41\x31\x70\xe3\x32\xa9\xc0\xc6\x7b\x71\xbd\xa9\x73\x58\x21\x26\x1d\x8a\xfa\xd8\xa9\x33\x5f\xbd\x44\x86\xaa\x64\xed\xcf\x23\xcb\x19\x03\x58\x9c\xe2\xfd\x1b\x2a\x12\xe0\xf6\xf6\xa1\x3c\x0d\xdd\x5d\x95\x94\xef\xcb\xf2\x6f\xec\xc9\xcb\x19\x5e\xe2\xec\x10\xd8\x3c\x73\x34\x80\x47\xad\x93\x41\x45\x96\x71\x43\x1f\x71\x5d\x47\xa3\x43\xa4\x4f\x1b\x95\x61\x6d\x60\xe5\xc8\x1e\xa8\xe6\x9c\x0f\xb6\xdc\x80\x77\x2d\xb9\xa1\x77\x0c\xb8\x04\xcd\x03\x1e\xa1\xba\x0b\x0f\x43\x39\x0e\x9b\x5f\x51\x3c\x9d\xb4\x8b\x0b\x21\x94\x9c\xcd\x09\x97\xc5\xdc\x66\xe3\xc1\x9c\x9d\xcd\x8f\x62\x41\x2b\x9e\xcd\x39\x6c\x70\x78\x01\x3d\x7f\x35\xda\x24\x0f\x62\x94\xbc\x17\x48\x89\x46\xe6\x64\x5b\xeb\x78\x34\x87\x1a\xeb\x8b\x5f\x2c\x0b\x68\x91\xa4\x9d\xd5\xaf\xcd\x16\x7f\xf3\x4d\xa1\x6e\xbe\x68\xbb\x03\xd9\x60\xc5\x89\xa1\xa1\xd3\x28\xbb\xe8\xa0\xbc\xfd\xac\xc7\xfa\x92\x70\xc5\xbb\xf4\x83\xa7\x74\x34\x3d\x79\x58\x50\xfb\x78\x05\x4d\xcc\x12\x3e\x51\x94\x15\xfb\xf3\xcb\xde\x1e\x6b\x20\x7c\x00\x94\x5b\x0a\x01\xe5\x09\x91\x42\x1d\x29\xed\xe5\x23\xcf\x8e\x32\xa8\x61\x6f\xde\x51\xf5\xdd\xf6\xd0\x6a\xf2\x0d\x75\x22\x9c\x8d\x17\x77\x59\xbd\x17\x69\xf7\x7a\xac\xf9\xb6\xef\xe0\x00\xa5\x4f\x97\xb2\x12\xb6\x57\xb0\xe5\x5c\xd9\xd3\xa6\xca\xfe\xf9\xd5\xc7\x67\x2c\xf1\x3b\x5b\xa2\x82\x56\x30\xbb\x4c\x9c\x5e\xc9\x1c\x9d\x8e\x35\x19\xe5\xce\xbe\xf0\x49\x62\xa4\x83\xbb\x26\xc7\xed\x83\x97\xc2\xc7\xb5\x74\x51\xe6\xa2\xc1\xb4\x30\xb5\xbb\x7e\xc7\xe1\x85\x1f\xf1\x55\x1b\xe2\x3e\x92\xaa\x36\xf6\xcb\x3d\x3b\x67\x34\xcd\x4e\x4e\x99\x46\x27\xea\x6d\xd7\xd5\x6e\xb5\xb2\x0f\x58\xb0\x8a\xab\xdb\xcc\x8b\x83\x7e\x1e\x24\x31\xa0\x52\x5d\x28\xd1\xa5\xd0\x0a\xc2\x6f\x2a\xe7\xaf\x1a\x96\xb0\xc9\x8f\x6f\xf1\x1c\x40\xcc\x42\x39\x94\x59\x36\xdf\xf3\x23\x13\x27\xc7\xdb\x53\x3d\x45\xbc\x4c\x31\x0c\xeb\x95\x6e\x2c\x8c\x45\x90\x48\x50\x29\xda\xd9\x56\x2a\xfd\x7b\xdc\x36\x8d\x72\x82\xa7\x21\x6f\x6f\xb0\xa0\x61\xb5\x08\xf1\xe5\x4a\x06\x2a\x18\xb3\x23\x7f\x91\x8d\x3e\x59\x05\xfa\x3a\x1d\xda\x83\xe2\x8a\x34\x47\xb4\x02\x03\xbd\xa9\xf7\x6b\x61\x55\x57\x9a\xe0\x35\xbb\x18\xe5\x4a\x6c\x37\x51\x8b\x0e\x63\x20\xac\x79\x07\xbe\x9e\x32\x91\xb7\xab\xcf\xb6\x61\x96\x6b\xf9\x70\xe5\xcb\x10\x0e\x3d\x7a\x22\x89\xc4\x25\xe4\xb3\x9b\xff\xfd\x4b\xdf\xd8\xd5\xc9\x60\xdd\x09\x28\xad\x9c\x06\x00\xf6\x1d\x52\x5b\xe0\x05\x1f\x8a\x78\x68\x35\xfb\x03\x9c\x64\xa4\xd6\x2e\x11\xa3\x03\x7f\xa8\x76\x6b\x9d\xa5\x78\xf5\x35\x8d\x2a\x30\x2e\x91\x0d\xc5\x41\xea\x16\xc5\x45\xa3\x67\xa9\xf5\xe3\x1a\x8a\x4d\xb1\x12\x6c\x30\x0b\x65\xe9\x1c\xfc\x88\xfe\xcb\x92\x00\x0f\xc0\x65\xcd\xa0\x0d\x6b\xde\xea\xb5\xc3\x00\x55\x8a\x49\x2e\xbe\x37\x4f\x7f\xe7\x0e\x39\x66\x97\x13\xff\x4d\xcd\x3a\x99\xe9\xb7\x49\x45\xdb\xc9\xee\x2e\x2d\x71\x23\x63\x6a\x8a\xd4\xf9\xa4\x0e\xe5\xc1\x75\x0e\xf4\x5a\xb3\x37\x41\x45\x0c\xe2\x61\x0f\xca\x62\xfa\x8c\xc8\x35\x50\x46\x90\x00\x9e\x9d\x9f\x19\x06\x7b\x1e\xda\x7f\x96\x4c\x79\x4f\xa7\xc4\x34\x88\x5c\x15\x26\x44\x73\xac\xeb\xf6\x19\x98\xc6\x99\x06\x13\xb0\x0c\xee\xea\x8f\x5b\x0e\x08\x2c\x9a\xdd\xda\xe2\x13\xc7\x54\x35\xe1\xd9\xb1\xe4\x7e\x40\x52\x21\x97\x18\x2f\xa3\x47\x31\x07\x52\x5c\x67\x04\x7d\xda\x73\x6b\xee\x7e\x0c\xf4\xba\x71\x41\x9b\x87\xdd\x67\xf8\x41\xa9\xd5\xb4\x4b\x1d\x72\xa2\x7e\xd8\xe5\xb0\x8e\x62\x3d\x60\x41\x8e\x1a\xf5\x52\xd8\x86\xf1\x61\xd7\x31\x7b\x98\xe7\x31\x93\x4c\xb6\x1c\x96\xd3\xa8\xe7\x16\xfd\xcb\xd9\xb4\xff\xca\x4d\x1e\xf1\xe6\x31\xa1\x06\xdf\x6e\x08\x68\xb4\xcb\xab\x6e\x36\x8d\xe4\x70\xf6\xcc\x3b\x3a\x99\xad\x05\x3e\x2a\x08\xfb\xb8\x42\x1c\x33\x15\xc1\x33\x8f\xd6\xc8\xf7\x74\x41\x37\x31\xcb\xa3\x76\xab\x08\xcc\x98\xb3\x32\x66\x4b\x99\xf7\xe6\x56\xf4\x8b\xfd\xdf\xad\xfc\x15\xdb\x6a\x83\xb5\xd3\x38\xd1\xef\xe0\x95\xb2\x66\xb7\xb6\x3b\xf2\x27\x3e\x8a\x00\x6d\xee\xa3\x93\xc4\x78\x26\x74\x8b\xf2\xe5\x8f\xb9\x44\x1d\x5f\x40\xa0\x30\xdc\x89\xf2\x83\xc7\xc4\xea\x12\xf1\xf5\x69\xc8\xb5\x80\xed\x41\xd9\x00\x66\x13\x77\x5f\x51\x5c\xb9\x0b\x86\x6f\xdd\xde\xc3\xa9\x49\xa2\x6d\x1a\x14\x28\x28\x58\x36\xba\x82\x50\x1a\x45\x78\xe6\xcd\x21\x7a\x09\x71\xa4\x28\x36\x75\x7f\x47\x7f\x49\x8e\x40\x45\xba\x76\x39\xd7\xab\x52\x4e\xd1\xe4\x09\x11\xb3\x2b\xe8\x77\xa2\x3f\xe5\x62\x1f\xbc\xb5\x9c\xb1\xf9\x3c\xba\x5e\x59\xbc\x7f\xb3\x43\xe8\xd4\x11\x34\x3c\x13\x71\xcf\x0c\x66\x80\x56\xc4\xbd\xa1\xf9\xf9\x74\x51\xea\x5a\x59\x98\x53\x29\x28\x43\x19\x5e\xf8\x1c\x3f\xae\x57\xfc\x8c\x44\x23\x2e\x6c\x90\x9e\x77\x67\x80\x91\x94\xa7\x93\x54\xc6\xd4\x4d\x6d\x3e\x44\x72\x4b\xb1\xe2\x38\x9f\x54\x67\x65\x0b\x47\x50\xba\x1d\x4c\xb9\xd7\x38\x6f\x30\x33\x6c\x69\xf8\xe0\x31\x7a\x79\xe4\x3b\x2f\x31\x27\x74\x20\xee\x3e\xa2\x61\x27\xa6\x7a\x1b\xdc\x20\x59\xdb\xca\x0e\xd6\x42\x55\x13\x9d\x4b\xc9\x56\x2d\x4d\xc1\xa8\x95\x74\x5a\x51\x07\xeb\x0e\x99\xaf\x07\xe0\x01\xf8\x47\xc6\x0d\xc5\xc5\x91\xeb\xc1\xf1\x2d\xae\x52\x63\x7c\x4b\x78\xb1\xbe\xba\xe4\xc9\x31\x54\x39\xf2\x30\x28\xe9\x1c\x4d\xcf\xfd\x58\x83\xb3\xe2\x54\xbb\x18\xc5\x51\x2d\x08\x80\x55\x76\xeb\xd9\xb2\xf3\xa1\xcd\x57\x08\xe0\xb5\xfe\x6a\x27\x61\xc8\x1a\x90\x48\x6a\xd3\x6c\xf5\x3d\x3b\xe5\xc8\x23\xbb\xc7\xe4\x04\x2e\xcb\x00\xe2\x5f\x3a\xac\x04\xaf\xfc\x21\x01\x6c\x52\x61\x5c\xb4\x19\x4e\x46\x06\x08\x1e\x43\x7f\xe9\xff\x88\xe1\x64\x11\xa6\xee\x58\x19\x09\x92\x65\x94\x6b\x4a\x4b\x5e\xbd\xea\xcc\xa4\xd9\x17\xfb\x9b\x1d\xac\xfc\x29\x63\x0c\xe1\x68\x42\xc1\x8c\x04\x59\x99\xe2\x1a\x92\xe9\x1a\xe4\x2c\x7e\x4a\x22\xc5\xe3\x52\xa7\xf0\x63\x84\x7a\x49\x6d\x21\x3d\x5b\xd0\x72\x60\x8d\x45\x66\x03\x76\x8d\x9a\x11\xb0\xf9\x48\x35\x31\xb2\x44\xce\xe3\xe9\xcd\xfc\xae\xaa\xb4\x71\x3e\x93\x58\x76\x07\x32\x54\x5e\x11\xfc\x0e\x2d\xa6\x74\x10\x27\x15\x24\x28\x00\xc4\xa9\xbf\xb7\x7a\xdf\xc3\x93\xb1\xa8\x26\xe9\x9e\x98\x7e\x7c\xbc\xd1\xe6\xcc\x9e\x77\x32\x08\x47\x7f\xb0\xdf\x43\x80\x7f\x30\xeb\xb5\xff\xd7\x27\x7f\xb0\xa8\x0b\x55\x1e\xd4\xba\x29\x4a\x08\x81\x89\xf2\x67\x36\x6b\x09\x18\x2b\xe5\x94\x86\x57\x20\x43\xa6\x92\x96\x25\x31\xc9\x66\xae\x6a\x3f\xe1\x06\x7e\xe2\xdb\xbb\x4d\x5c\xa4\xd2\x7a\x6a\x6d\x81\x94\xa6\xf4\x80\xf0\x2c\xc0\xb5\xdf\x38\xa6\x2a\x23\x97\xb1\x26\xdd\xe4\xe0\x45\x7f\xba\x94\x72\x3f\x29\x61\xab\xf7\x86\xc9\xe4\x1c\x9e\xcf\x3a\x8c\x37\xf6\xa9\xa2\x31\x58\xe3\x03\xea\x28\x74\xea\x52\x5a\x6b\x86\xae\x67\xf0\x2c\xe0\xc5\xce\x7d\x40\x66\x72\x8f\x00\xe2\x68\x5f\xc2\x48\xb3\xe4\x6b\xdc\x0e\x4c\x41\x81\xe1\xb8\x7d\x44\xc0\x51\x46\x2b\x5e\x1c\xbd\x60\x9c\x38\x79\x0d\x56\xe2\x11\xfa\x45\x38\x64\xc4\xd2\xca\x88\x77\x54\xb9\x35\x2f\x86\xf8\x7e\x6d\xc1\x25\xce\xb5\x42\x87\xc8\xfc\xfe\xfd\x33\xa2\x37\x6c\xd4\x1a\x0b\xe7\x98\x32\x9b\xd9\xed\xe4\xfc\x28\xfd\x4a\xf6\x3a\xa1\x63\xb6\x7c\xc5\xff\x24\x81\x6a\x18\xf1\x43\x7f\xac\xed\xbb\x19\x6c\xb1\x63\x8e\x6f\x8e\x17\x01\xc9\xfb\xd9\xff\xeb\x76\xb6\xe5\xb0\x0c\x7a\xca\x8c\x0c\x7d\x92\x20\x82\xdd\x89\xda\x6a\xd6\x6c\x99\x10\x96\xc8\xf1\x39\xa2\xc7\xef\x13\x29\xd3\x62\x2d\x60\xcb\x9b\x35\xfa\xb0\x38\xfb\x42\x13\xed\xa5\x4d\x6d\x88\x72\x24\xea\xb9\xd8\xe4\xa9\x85\x65\x30\x54\x36\x8a\x7d\x43\xfb\x9a\x47\x0c\x93\x08\xab\xd3\xb9\x75\x78\xef\xe2\x7d\xa6\x94\x96\x51\xce\x1c\xdd\xf0\x27\x70\x1e\x1d\x06\x01\x8a\x33\x76\xc1\xc9\x37\x0a\x0a\x6d\x50\x74\x6d\x24\x1a\x07\x3e\xb2\xa9\x40\xc7\xae\x0d\x91\x50\xb1\x43\x9c\x56\x52\x39\x94\x73\xd7\xb2\x34\x07\x05\xa1\x95\x03\xe4\x7d\x9c\x42\x55\x31\x65\xf7\xe5\x66\xaa\x37\xde\x37\xf8\x27\x05\x6b\x6f\x4c\xc0\x7d\x3a\x05\x70\xf1\x36\x29\xcc\x58\xc2\x6d\x0a\xce\x9f\xc0\xc0\x31\x7c\xf5\x2a\x08\x0a\xa7\xc2\x19\x3e\xae\x7f\xae\xfe\x13\x20\x49\x61\x21\xc9\x47\x56\x64\x96\x22\xc2\x64\x01\xed\x8f\xd8\xb7\x7e\x3d\x7c\x18\xab\x2b\x8e\x93\x6a\x61\xf2\xd0\x27\x59\xf5\x1a\x4f\xe1\x18\x44\x13\x53\xb6\x03\xd1\x41\x44\xd1\x16\xc6\x05\x89\x74\xce\xfe\x51\x6a\x20\x91\x90\x69\xff\x32\xcc\xd5\xc9\xab\x2b\x09\xf4\xe4\x15\x1a\x96\x9d\x9b\x73\xa9\x2a\xdd\x84\xc4\xb8\xae\x9d\x77\x68\x44\x3e\x0a\x86\x26\x8e\xf1\x6d\x0b\x64\x7a\x79\x92\x6f\x8e\xfa\xf8\x80\xea\x75\xf1\x8c\x35\xe7\x35\x19\x85\x71\x9d\x46\x16\x28\xfd\x9b\xae\x8b\x82\x94\x95\x38\xb0\x2a\x3b\x0e\x35\xf4\x53\x32\x02\x53\x58\x4b\xdf\xa4\xce\x5b\xea\x6c\xce\x97\x59\x98\x8c\xfd\x97\x70\x2c\x2c\xa8\x99\x49\xde\x03\x5e\x7b\xf4\xef\x18\x6b\xd0\x9f\xe4\x0a\x2e\x69\x57\x4d\xd2\xc2\x0a\x03\x57\xba\x2b\x98\x25\xec\x04\xb0\xd9\xcf\x48\xf2\xc4\xd3\x17\x16\xa8\x65\xad\x36\xa2\x35\xde\x5f\x9e\x25\xf4\xa4\xe0\x83\x87\x2e\x73\x27\x04\x33\xfb\x34\x73\x9d\x4a\xe4\x1a\x79\x13\x18\x24\xda\xe6\x40\x5e\x14\xe6\xb9\x4e\xce\x85\x08\x1d\xc3\x9e\xc4\x2e\x41\x4c\x4f\x89\x99\xb6\xb2\xec\x77\x96\xc5\x5c\x06\x35\x82\x6c\xbe\xb3\xfb\xf4\x20\xed\xf0\x65\xaf\x80\x3e\x06\x2b\x5f\x3b\x98\x4b\xcf\x38\xbd\x40\xcd\xe6\xc0\x57\x59\x99\xf2\x4e\x2c\x20\x5d\x17\x02\x4a\x33\x88\xa0\x38\x22\x19\x59\xe0\xdb\x39\xab\x0f\x75\x62\x95\x77\x22\x1b\x80\x6d\xae\x0a\x4c\xa9\x79\xfb\x4e\x6e\x07\x1a\xd2\xee\x0a\x69\xce\x46\x19\x26\x68\xce\x96\x11\x12\xb1\x13\x67\x1e\xe4\xfb\x32\x66\x71\xea\xfc\x1d\x4e\x63\x91\x70\xc0\x9e\x33\x21\x57\x07\x4b\x61\x28\x1c\xba\x2d\xa7\x03\xe2\xfc\xd2\x27\x47\x10\x4e\x48\xa0\xc3\x57\xb3\xf4\x9d\x24\x3e\x89\x0c\x67\xc4\x82\xbe\x5d\x90\x5b\x23\xd5\xc3\x6f\x06\xa8\xb1\x6e\xbb\x8f\x82\xb0\xb1\x7f\xe1\xc5\x0e\xd0\xbd\x6c\xc8\x8b\x03\x0b\xc7\xa6\x4d\x45\xe7\xc3\x95\x7e\xda\x7d\x20\xdd\xfe\xc9\xe9\xf9\x0b\x0a\x25\xea\xe2\x1d\xfd\x1d\xd7\x6f\xf2\x36\x68\xa3\xbf\x52\x84\x43\x25\x40\xa1\x16\xe7\xcd\x6f\xed\x00\x80\x07\x11\x45\x3b\xba\xd6\xf7\x87\xd9\x2c\x44\x19\x25\x35\x18\xa4\x91\x1c\xc1\x17\x1c\x57\x9b\x34\x41\x8d\xb6\xec\xfc\x79\x67\x8b\xb6\xe8\x05\x78\x95\xec\xc3\x2f\x35\xdb\x73\xd8\x8b\xc3\xd0\x0e\x8e\xda\x01\x38\xa1\xcb\xa0\x15\x03\x32\x68\x5d\x8c\x3c\x7a\xd3\xc3\xc2\x6e\x13\x0c\xa6\xe5\x9d\x58\x3c\xb9\x5a\x82\x0f\x81\x96\x13\xc0\x1a\xf8\x1c\x48\xa9\x9d\x6a\x77\x76\x52\x58\xa6\x01\x20\x9b\x92\xcd\xc3\x8a\x29\x2c\xcb\xca\xa6\x53\xf0\x52\x76\x49\x99\x22\x07\x4e\xa7\x85\xdc\x61\x72\xdd\x3d\x32\x00\xef\xf8\xc3\xe6\x33\x67\x03\x5d\xb0\x01\x67\xa9\x62\x5e\xd0\xa9\x47\x61\x36\xad\x54\x3d\xd0\x01\x0d\xda\xd2\x1d\xe9\x2a\x54\xed\x7a\x4c\xcb\x8e\xdd\x27\xa5\x9c\x44\x4a\x66\xa0\x3c\xea\x29\xf9\x4e\x81\xf5\xc5\xa9\xc4\x0d\x15\x19\x18\xf0\x4f\xf1\xfe\x3a\xae\xd8\xed\xe4\xc2\xe6\xf1\xb4\xf1\x51\x90\x21\x2e\xae\xd5\x20\x11\x5a\xdb\x47\x45\xec\xcf\x14\x07\xab\x06\x53\x4e\x21\xf8\xbc\x39\x6d\x5f\x27\x09\xec\xa4\xf2\x7b\xa5\x79\x5e\x4d\xcb\xda\x30\xf1\x94\x1d\x12\xa6\x90\x5c\xb3\x1a\x4b\x60\x1a\x6f\x98\xbf\xb8\x85\x5e\xe1\x01\xd8\x51\x6a\xd1\x9b\x1c\x52\xfc\x0f\xa3\xb8\xef\x14\x8d\xa6\x33\x7c\xb3\x53\x0f\x59\xdf\x86\x64\xda\xe9\x10\x30\x06\x2d\x92\x08\xd7\x35\x03\x03\xbc\x07\xaa\xfb\x83\x45\x7d\x84\x79\x87\xa3\x43\x3b\xc7\xd4\xef\xe5\x05\x00\xcc\xe4\x03\xd8\x43\x34\xb4\xac\x35\x86\xdc\xc6\x44\x24\x71\xc0\x7c\xac\x48\x31\xa4\xd3\x39\x41\xda\xd4\x82\x14\xc3\x09\xfc\x93\xea\xdd\xa0\x38\x35\xfa\x32\xdf\x0e\x88\xbc\x51\xab\x95\x68\x03\xad\x67\xa8\x5b\xda\xae\x21\xbf\xd1\x09\x40\x24\x45\xc4\x0f\xe9\x27\xd0\xdd\x45\xcf\x7c\x85\xe4\x13\xa5\xfd\x7f\x71\x0c\x1d\x30\x3b\xc5\x2f\x91\xe0\x93\xbd\x33\x1a\xb9\xad\xe6\x4a\x5c\x93\x48\xc5\xc3\x1c\xa7\xca\x8b\x48\xba\xe2\x3e\xaa\x6e\x9b\x1e\x2b\x80\xa5\x9b\x0f\x40\x5b\xa9\xbf\xd1\x89\x29\x85\xbc\xb2\xb6\x54\x00\xbc\x58\x4b\x00\x60\x6f\x1f\x05\x71\x72\xce\xca\x81\x6e\x3d\x6d\x72\x1c\x42\xdb\x43\x9c\x5c\x7d\xb4\x7d\xbc\xd2\x3a\x98\x21\x7c\xb9\x17\x9d\xc7\x68\x2d\x71\xb2\x34\xef\x99\xa1\x21\x3c\x77\xcf\xec\xe7\x9c\x98\xf0\x7a\x33\xf3\x83\x68\xbd\xdd\x6e\x4b\xbc\x7d\x22\xab\xc2\x5c\x08\x7d\x13\x48\x1b\xd5\x15\xeb\x4e\xa0\x96\xc7\x6c\x8c\x6d\x0c\xa4\xb1\xe9\xb9\x18\x09\x17\xa8\xf7\x89\x60\x7a\x0f\x8d\x89\xb8\x5b\xf0\xa7\xf6\xc2\x5a\xc3\x59\xa1\xf8\x4a\x57\xb1\x28\x2a\xe7\x4c\x75\x94\x2b\x46\x8b\xe1\x5b\x87\xbf\xde\xc4\x60\xd9\xf1\x83\x7e\x46\x5b\xd5\x78\xd1\x84\x36\x1d\x48\xce\xce\xdb\x9e\x7f\x71\x22\x54\x99\xea\x41\x0d\x42\xf3\x85\x53\xfd\x90\xfb\x61\xbe\x4a\xa3\x4c\xc8\xdd\x7b\x37\xbf\x4e\xe7\xc7\x69\x4e\xec\x25\xda\x5c\x22\x7b\xea\x56\x56\xd5\x19\x65\x18\x8b\xe3\x44\xf3\x49\x62\x15\x4f\xbc\x46\x2a\x64\xd2\x9f\x0f\xab\x46\x93\xd9\x7b\x43\x3d\x59\xe2\x8c\xe7\x93\x8a\x25\x15\x65\x67\xea\x32\x98\x1c\xc9\xce\xd9\x25\x3e\x92\x32\x62\xc6\xce\x0e\xa7\xbb\x21\x48\xf4\x29\x69\xb5\x8d\xa9\x22\x4e\x92\xef\x11\xf1\x9f\x0e\x23\x43\x6a\x91\x7e\x7f\x07\x97\x1b\xee\x4a\xbd\x0b\x55\x95\xd2\x93\x71\xb2\xd7\x45\xb5\x14\x15\x7e\x02\x82\xa9\x5f\x57\xe4\x2e\xa9\x31\x2d\x51\x62\x63\xa6\x64\x1c\xb5\x56\x59\x4d\xb4\x5e\x59\xd8\xd4\xa3\x05\x60\x44\x68\xbb\x28\x90\xae\x3e\x0a\x4d\xea\xae\x23\xdc\x71\xbe\xd7\x88\xa9\x2d\x72\xa9\x4c\x48\xdf\xec\x0b\x61\xa3\x5d\x47\xf1\x83\x45\xa9\xfe\x91\x64\xb7\x5a\x30\x8c\x08\x39\xd4\xb3\xc3\x22\xd8\xf0\x0c\x16\xbb\x7d\x10\xfe\x0d\x38\xcc\xa4\x83\xad\x01\x21\x91\x71\x21\x6e\xc1\xac\x0c\x49\xe8\xed\x62\x30\x2e\x67\xc8\x49\x8b\xe7\x87\x6d\x55\x79\x88\x48\x4f\x78\x25\xb6\xa1\xfb\xd9\x97\x97\x29\x6f\x6c\x19\xfb\x03\x33\x5b\xdb\x54\x87\x3b\x8d\xee\xbd\xf3\xdb\x3f\xe1\x56\x51\x7c\xdb\x9f\x11\x23\xfa\x7f\xd1\xb5\xec\x31\x6f\xc2\x6e\x2d\x10\x66\x1d\x7e\x3d\x76\xe8\x98\xdc\xac\xd6\x7d\x8c\xca\x53\xdf\x49\x47\x2e\x3f\xe8\x04\x79\x82\x89\x16\xb5\xd3\xb9\x98\x4c\x08\xa1\x1c\x09\x7f\x6f\xea\x98\xe2\x70\x6a\x25\x76\x1b\x9d\xb5\x1b\x21\xf2\x00\x51\x9f\x8a\xd3\x52\xd1\x0b\xa8\xd6\x95\xbc\xff\xa4\xe1\xce\xb7\x1c\x01\x2e\xac\x8b\xb7\x9d\xe4\xa8\x28\xaa\x0c\xe8\x79\xa4\x0a\x3f\xe2\x17\x3a\x8a\x3d\x30\x85\x6b\xe4\xe5\x73\x3d\xaa\x65\x60\xc5\x8b\x9c\x22\x8a\x4f\x6b\x3c\x0b\x98\xdd\x9b\xfb\x4b\xf8\x8e\x34\xb1\x8e\xe3\x42\x4a\xdb\x42\x56\x94\xf6\xb2\x83\x02\x33\xb9\xc4\xbf\xd9\x6e\xe2\x4c\xd9\xe8\xb6\x96\xbb\x29\xbf\xc7\x3a\xc0\xe4\x93\xe1\x77\xe5\xf5\x9c\x84\x6a\x96\xc4\xab\xc0\xda\x4b\xc9\x17\xf3\xd8\x39\x90\xb6\xba\x8a\x75\xf3\x42\xd8\x53\x4f\x9d\x11\xeb\xac\xd9\x1e\x72\x32\x16\xb6\xa3\x90\xe1\xad\x8a\x3e\x3c\x60\x62\x05\x74\x72\xcd\xe9\xc9\x45\xc0\xb4\x6f\x81\x70\x14\xcf\x95\xf6\x21\xc0\xd1\x70\x14\xe9\xc3\x62\x30\x0e\xd7\xbb\x7c\xba\x55\x0b\x98\xd3\xa9\xc5\xf4\x4a\x94\x27\xbb\x02\x3f\x2d\xba\x26\x8e\x4e\x8c\xbb\x3d\x19\x90\x07\xa7\x2e\xa3\x2a\xa0\x31\xfa\xdb\x3e\x74\xe2\xba\x6b\x56\xfa\x56\x2e\x18\x5e\x10\xb8\xc4\xe2\x0d\x8e\xd6\x39\x4a\x9d\xb0\xd4\xd8\xc8\x11\xfe\xd1\xdf\x6f\x1f\xcf\xc5\x56\x02\xbe\x27\xcb\xb7\xf2\x95\x9c\x56\x1e\xdd\xe4\x76\xdd\xaa\xbc\xac\xf8\x79\x48\x20\xaf\x68\x17\xf3\x52\xca\x87\x61\x05\x97\x58\x06\xa7\xa4\xca\x82\x81\x28\x1d\xce\x5f\x90\x49\x4c\x7b\x91\xb5\x90\x65\xc5\x47\x28\x9b\x43\x91\x69\x33\x2f\x5a\xca\xe5\x05\x78\xc2\xdd\x68\xea\x28\xc1\x4f\x63\x09\xd9\xb6\xed\x23\x56\x45\xfc\x12\x94\xe0\xc0\xaa\x50\xa1\x71\xab\xb8\x6e\x1c\x29\x43\x32\xff\xcd\x45\x46\x01\x58\xf9\xad\x3f\xc4\x68\x31\x0b\x40\xa1\xfb\x05\x0f\x49\x55\x36\x6f\xf0\xb6\xae\x14\x2c\xb5\xc4\xce\x17\x8d\x22\x4b\x89\xaa\xde\x42\xef\xaf\x31\x82\x17\x19\x46\x7d\xd8\x87\xee\xcc\x92\x8a\xa2\xd8\x3d\x69\x1a\xb9\x22\x4e\x76\x4e\xf9\xc4\x34\xcb\xed\x41\x26\xae\x7d\x79\xa0\x76\x05\x4b\x64\xcf\xee\x93\x54\xa8\x5b\xa4\x97\x8d\x21\x92\x6b\x3c\x6f\x63\x24\xa6\xd6\x0f\x57\x3b\x96\x51\x67\x06\x02\xbe\xd3\x59\x10\x1c\x3a\x14\x39\xea\x69\x72\x70\xf3\xfd\xe5\x62\xdf\xce\x62\x36\xe6\x97\x3b\x85\x8b\x65\x40\xa2\xb5\x0a\x02\x61\x8d\xe4\x35\x54\xce\xe3\xe0\xe7\xe3\x41\x46\x07\x60\x0e\xbf\xb8\x64\xb7\x0f\xc6\x57\x46\x10\xd7\xe5\xe4\xee\x2a\x9d\xcc\xba\xfe\xa6\xd3\x2d\x29\x91\xe8\x37\x87\x0a\xd8\xa8\x2e\x42\x80\x56\x97\x6a\xfc\x6a\x51\xbc\x19\x06\x94\x49\xdd\x35\x6a\x33\x62\xc2\x07\x8e\x7d\x45\xbe\x3a\x2a\x57\xd6\x35\x05\x36\xcd\xd9\xef\x6f\xac\xc7\xb0\xf4\xf7\x17\x09\xe7\x7a\xf6\x41\x7c\x22\xf3\x63\x2f\xbf\xd0\x47\x09\xe7\xee\x05\x04\xc9\x3e\x7c\xee\xb1\x44\x04\xce\xd9\xaa\x6f\xd7\xaa\xd6\xe1\xf7\x2c\xaf\x7c\x48\x5b\x60\xb3\x79\x27\xf3\xc9\x5c\x02\x68\xe7\x61\x60\x73\x13\xe4\x9f\x78\x50\x32\x14\x6d\x72\x8a\x43\x31\x49\x51\x6b\xc8\x34\x66\x4b\x04\x01\x78\xa0\x03\x66\x03\xa7\x4c\x62\x4a\x0c\x64\x29\xab\xcf\x81\x1d\x18\xa2\x58\x43\x4e\x46\xd1\xa9\xfe\x9c\x12\xa2\xcd\x84\xe0\x70\xa1\x39\xa3\x01\xf8\xf4\x84\xe7\x95\x58\xea\x56\xdd\x10\x2f\x31\x47\xe7\x8c\xc8\x26\x38\xfc\xb1\x0d\x6c\xf5\x28\xde\x2f\x9f\x93\x8f\x46\xc9\x66\xc0\x73\x78\xb3\x05\x56\x5b\xfa\xf5\x2c\x55\x04\xa5\x62\xe0\xc6\x1c\xda\xac\x58\x1d\x39\x58\x84\xd6\x36\x2d\x99\x5a\xd4\xb2\xca\x49\xa1\xe0\x87\x78\xdf\x21\x93\x01\x1f\x56\x32\xe7\xaa\xf9\xd4\x16\x9b\x23\xeb\xc3\xc7\x27\x96\x84\x13\x02\x5f\x1f\x52\x98\xb2\x37\x82\xbd\x3f\x38\x59\xf2\x92\x2b\x5a\xb9\x6c\xc4\x29\x4e\xdb\x3b\x06\x9b\x53\x80\x13\x29\x87\xca\x22\x30\x09\xe3\x26\xd7\xf4\x48\x43\x0f\xe1\x76\xa6\xe1\x19\x38\x97\x50\x33\x33\x84\xeb\xff\x86\x9e\x09\x00\x2e\x7f\x6b\x74\x3f\x66\x6d\x5b\x28\x48\x4f\xe5\xde\x10\x11\xa8\xc5\xa2\x55\xd6\xea\x16\x57\xe7\x91\x58\xd6\x04\x49\x92\x2b\x94\x7e\xa6\x00\x6d\x42\x09\x6f\x59\x04\x31\x0e\x27\x2a\x32\x56\x0e\x7e\x7c\x8b\x49\x4c\xb6\xf3\xa8\xcf\x7c\x29\x7e\xc8\x64\xb0\xc2\xf8\x4a\x9b\xa4\x6d\x6d\x65\xfd\x9d\xd6\xac\xf2\xa7\xa8\x8b\x0c\x05\xa7\x51\xa1\x98\x86\xda\xba\xcd\x53\x7b\xd8\x70\xe7\x89\x82\xc2\x35\xf6\xdb\x13\x32\x0b\x57\x95\xb6\x73\x70\x4e\x81\xfc\x51\x5e\x9e\x63\x28\xfa\x3a\xfd\x8b\x80\x7a\xf6\x27\xae\x94\x9f\x43\x1f\xfa\x4f\x5f\x7c\x5a\x4f\x52\xcd\x3f\x70\xe3\x15\xac\x82\x6f\x51\x59\x30\xaa\x8f\x8a\x2f\xb6\xa0\xcf\x7a\x6c\x71\x23\x96\x05\x97\x20\x62\xe0\x9e\xfa\x16\x02\x9c\x2a\x22\xc5\x40\xc7\xf2\x7a\xcb\x87\x87\xdc\xa2\x56\xe1\x69\x48\x9b\xc6\x31\x10\x0a\xd7\xb0\x05\x00\x50\x59\xcc\x79\x9c\x5a\xf5\x24\x0f\x49\x2c\x3f\x20\x03\xf3\x48\x4a\xd6\x41\x99\x7c\x4c\xea\x07\xa9\x52\xa7\x73\x11\xaf\x75\x94\x63\x21\xaa\x64\x93\x55\x79\xf8\xbf\x2c\xfd\x27\x78\xcc\xf2\x81\x68\x34\x58\x06\x3d\xed\x0b\x4e\x4e\xfd\xdf\x98\xa9\xce\x51\xaa\x0a\x3e\x9f\xd6\x9a\x3b\x45\x46\x21\x72\xfc\xbb\xf9\x4c\x6b\x5c\x64\xe5\x46\xb3\x26\xfe\xf3\xda\xc1\x30\x0a\xae\x4a\xf9\x21\xe9\x5e\x2c\x5d\xfb\x83\xee\xd2\xb0\x19\xf5\xc2\xbe\x9a\x39\xfb\x7a\x02\x6c\xbf\x11\xb7\xbf\xbc\x00\x50\xd0\xbe\x60\xaa\x0a\xdc\xe4\x85\x4a\x01\x84\xde\x4c\x88\x40\x7f\xe6\x67\x28\x77\x2b\x61\x8d\xda\x74\x36\xb7\x2c\x60\x78\x0e\x3d\xac\x0a\x4a\xa3\x4b\x75\xb6\x6e\x32\xaf\x34\x7a\x93\x4a\x91\xad\xf2\xa5\x88\x75\x34\x03\x9a\xde\x69\x64\x27\xdd\x2f\x9a\xac\x35\xf0\xd8\x5c\x63\xcd\x07\x51\xd8\x20\x98\x07\xab\x04\xf4\x3e\x43\x7a\x40\x23\xfa\xe2\x31\x96\x36\x3f\xa0\xa0\xea\x66\xf1\x4a\x8e\xe0\x5c\x1b\x41\x0a\xf9\xe1\x72\x9f\x78\xf5\x31\xc8\x58\xc3\x6a\x1c\x01\xc8\x55\xad\xde\x79\x25\x57\x79\x76\xe5\x8e\xac\xb2\x1c\x48\x8f\x5f\xa3\x03\xfa\x20\x7b\xc9\xc1\xca\xdb\x59\x48\xe0\xb0\xa0\x09\x14\x62\x2a\xed\xa4\xd6\x3e\xa9\x8b\xd7\x70\x02\x9a\x6e\x78\x38\xae\xb3\xd7\xaa\x43\x8c\x6f\x67\x83\x1e\xe0\x33\x69\x61\xd4\xd5\xac\x95\x22\x8f\xb6\xb6\x3e\xe2\x3e\x2d\x92\xc2\x5a\x49\x30\x25\x3e\x1a\x24\xa8\xf4\x8f\x35\xae\x18\xbc\x59\xfa\xa9\xca\x30\x80\x5a\x3d\xca\x5b\xbc\xfc\xb3\x44\x1b\x22\x62\x5b\x5b\x4f\x74\xa1\xcc\x3e\xae\xc6\xec\xa6\x9c\x3d\xa8\xbb\x97\x8f\xb7\x8a\x68\x59\x00\xf1\x82\x92\x81\x39\x1b\x45\xa3\x27\xd4\x64\x51\x5c\x97\x0b\x4c\xba\x8b\xe6\xcb\x0f\x83\x0b\xa0\x45\x2a\xfe\xb6\x78\x6b\x86\x55\x34\x57\x9f\x98\xa4\x24\x37\xea\x87\x84\xf7\x0c\x94\x21\x42\x5a\x44\x29\x1c\x2b\xee\x80\xd8\xca\x3c\xe2\x73\x72\xc4\x25\xb6\x77\x7a\xa3\x0f\x4c\x99\xc2\x97\x62\x3e\xfd\x99\xc2\xf6\x2a\xa6\xb4\xae\xe9\x80\x73\xb8\xef\x82\x89\x6a\xda\xe2\x44\xf2\x7a\x55\xe3\x03\x71\x13\xc4\xcc\x97\xa4\xbb\x85\xa1\xcd\x0d\xc0\xe8\x27\x1c\xc9\x73\x27\xe5\x77\xfa\x1e\x18\x07\x04\x0f\x2f\x01\x8d\xf7\xfd\xed\xfe\x00\x72\x4d\x09\x6a\x6d\xa6\x40\x39\x7b\x5b\xab\xc2\x38\xd4\x4d\x1b\x62\x77\x9d\x3a\x8f\x3a\x4c\x70\x88\x7b\xfb\x78\x0c\x56\x5b\xb4\x99\x51\xff\x90\xb3\x58\x1b\x67\xf4\x54\xe5\x5d\x42\x91\x3a\x91\x9b\x59\x29\xb6\x70\x25\x8f\xd3\x5c\xc7\xee\xe0\x54\x6c\xe5\xcb\xfa\xc4\x38\x05\x57\x3b\x80\x9c\xc5\xc0\x17\x1d\xbb\x80\x14\xb1\x42\xf5\xf9\x29\x79\x1f\xd4\x86\x9e\x98\x7c\x6c\x83\xb8\x9c\x1f\xc5\x4c\x64\x72\x04\xcb\x00\x61\x9d\xfd\x62\x1b\x60\x1a\xb8\x3e\x0e\x0f\xc9\x99\xb5\xdb\x56\x98\x35\x30\x75\xc4\x9a\x41\x89\xc5\x28\x77\xd9\x73\xbc\x3f\x93\xe5\x73\x14\xb3\xd3\x21\x41\x5d\x49\x18\xd1\x44\x22\xa0\xaf\x17\x0c\x10\xd5\x63\x77\x29\xee\x3c\x86\x47\xa0\x61\x56\xb7\xa4\x3b\x3b\x5f\x45\x83\x5c\x7d\xd9\x27\x94\xc6\x1f\x94\xdf\x39\xe7\xc5\x57\x3f\xe2\xd0\xd8\xf8\x46\x72\xce\x5e\x25\xad\x28\x39\x96\xf7\xe4\xfb\xdd\x8a\xc4\x47\x68\x8f\x67\xa7\x68\x2d\xdb\x82\x33\x25\x77\x26\x50\xe4\x01\x9a\xf6\x64\x97\x9f\x3e\x65\x04\x1d\xce\x18\x1c\xe5\xcd\x5e\xaa\xfc\xb7\x20\xd9\x5a\x86\xea\x82\xb5\x16\x2b\xe7\xac\x43\x89\xd1\x89\x32\xcf\x78\x32\xc7\x43\x20\xb8\x18\x79\x01\x12\x99\x63\xec\xdb\xec\x43\xaa\x59\x8d\x9a\xc3\x2f\xa9\x76\x4a\x2f\x3d\x31\x84\x79\x72\x39\x12\x39\x28\x2e\xd4\x34\xa1\x57\x9c\x97\x8c\x94\x83\x3b\x9c\xcd\xbd\xa5\x09\x70\x1d\x18\x3b\xc8\x5c\xa1\x5a\x1b\x8b\xbe\xab\x98\xf0\x93\x62\x9c\xb3\x4e\x34\xb5\x17\xee\x83\xcd\x7f\x47\x1b\x1f\xf2\x30\xb4\x82\x3a\x1f\xde\xeb\x7c\x70\x3c\x84\x1c\x05\x6b\xe9\x47\x48\x8f\x06\x25\x94\xde\x94\xa8\xfe\x00\xce\x08\x2e\xed\x3d\xda\x11\x5c\x0c\x6e\x95\xc0\xc3\xab\xb7\xae\x17\xe1\x52\xd4\x24\x33\x2d\xb1\xfd\x98\xae\x0d\x91\x01\x90\x0c\x4d\x06\x15\xd5\xe6\x34\xe0\x5f\xb7\x5d\x93\x0b\x1b\x5a\x75\x3c\x43\x57\xec\x8f\xca\x1b\x7a\xa2\xf5\x94\x94\xc6\x21\x84\xd6\xd6\x5b\x99\x76\xdb\x4e\x5c\x60\x95\xa3\x02\xcd\x15\x51\x5e\x30\xa8\x94\x3a\x52\xcc\x9c\x98\x92\x82\x20\xd3\x9f\xc1\xe2\xf6\xe6\x2f\x14\x3b\xe2\x50\xb0\x51\x85\x21\x32\x39\x2a\x1b\x6b\x34\xf0\x78\x80\xea\x64\xa5\x37\xbd\x47\xe6\x07\xe5\x8a\x36\x56\xbf\xc5\x12\x21\x73\x37\x4d\x6e\xfa\xc1\x8e\x99\x68\xb7\x62\x3e\x0f\xeb\x99\x2e\x9c\xa6\xa4\x2b\xec\x99\xa6\x93\x3a\x1a\x4b\x64\x72\xa0\xd9\x58\xd9\xd2\x7a\xb0\x75\x40\xab\x4e\x76\xef\x17\x17\x6e\x8c\x72\xa4\x41\x28\xa7\xae\x4c\xe6\x64\x02\x54\x45\x72\xd8\xc8\x00\x58\xbd\x3a\xf9\xe3\xac\x7c\x65\x1d\x3d\x90\xf7\x24\x1f\xbd\xf5\x1c\x5a\x3f\xde\xb8\xb1\x99\x58\xb1\x43\x5e\x12\x48\xb3\xfc\xc9\x0a\x43\x5c\x0e\x12\xe4\x97\xe0\x73\xd5\xe7\xaf\x8e\xbc\x36\xe3\x0c\x31\xe5\x8b\xad\x83\x43\xfe\x78\xc2\x9c\x93\xb7\x43\xb1\xaa\xf2\x6f\x86\x0f\xf8\x16\x66\x41\x7e\xd5\x38\x39\x6a\xbc\x95\x4c\x1d\x95\x5a\xe2\xd4\x39\x48\xfe\xed\x2c\x4d\x34\x1a\xde\xb0\xc4\x57\xa0\x56\xf6\xca\x01\x8c\x88\xa6\x72\xdf\x59\xf1\x19\x3a\xe5\x3f\x62\xa8\x92\x83\xb6\x04\xd1\x55\x5d\x81\x8f\xba\x48\xe2\x00\x7f\x3c\xbb\xc2\xff\xcc\x2c\x77\x0e\x57\xbf\x01\x7b\xc5\xf7\x57\x09\x22\x2e\xae\x04\x96\x91\x82\x5a\x40\xfb\x66\x59\x43\x92\xf8\x93\x1a\xa9\xc1\x1c\xac\x22\x60\x20\x80\x52\xe3\x05\x50\xdd\x95\x2c\xb0\xbe\xc2\xf7\x54\xef\x43\xac\x35\x4a\xbe\x42\x3c\x61\x0c\x1b\x46\x5b\x9f\x97\x91\x50\x26\xc9\x54\x2a\xcf\xe1\xe5\xc5\xf9\xbd\x86\x08\xf7\xb7\x33\xe9\xdf\x13\x3b\x7e\xb6\x82\x63\x21\xf1\xf0\x1f\x3e\xd0\x40\x0c\x4d\x32\x39\x71\x58\x64\x98\x1c\x98\x30\x45\x1d\xd6\xca\x03\x0b\xda\xcf\xe0\x7d\x4b\x2a\x22\xd3\x60\x1f\x82\x55\x56\xaa\xa7\x11\x06\xd7\x2e\x92\xe1\xea\x22\x28\x1a\xd3\x88\x17\x6a\xe3\x2a\x3d\xe2\x5b\xac\x91\xe9\xc8\xeb\x3a\x69\x85\x86\xf7\xc9\xbe\x71\x47\x9c\xba\x7b\x94\x63\x9a\xac\xe1\x48\x54\x13\x10\x1b\x89\xd3\x39\x87\x8e\x54\x6b\x24\x05\x3a\x83\x02\x02\xfb\xf9\x09\xe8\xc9\xb9\xa2\x87\x85\xa0\x18\xa9\xc8\xc6\x0b\x50\x0a\xed\x72\xbd\x90\x7e\x6e\xe1\x97\x0d\x1a\xf9\xe2\xab\x13\x47\x7e\x62\xd8\xbc\xca\xd4\xe1\xbf\x19\x47\x56\x92\x0b\x40\x9c\x9c\x9f\x81\x80\x1f\xe3\x7c\x27\x09\x62\x3a\x63\x7e\x03\xca\x82\xb6\x95\x60\xde\x43\xf0\xf1\xc8\xaf\x70\x2a\x9e\xfb\x00\x1d\x35\x8c\x40\x6c\x60\x21\x9c\xc0\xdf\xd8\xed\x0e\xa1\xab\x87\xc1\x04\x07\xd1\x53\x0a\x73\x9e\x81\x0d\x31\xc7\xbc\x17\x72\x26\x51\xdf\xd8\x1d\xd8\xd8\x8a\xac\xc2\x9e\xc8\x85\x68\x1c\xda\xef\xfa\x7a\x2b\x07\x0b\x4a\x92\xce\xe9\x14\xd1\xe7\xf8\x1a\x17\x9e\x36\x20\x90\x21\xab\x56\x7d\x05\xee\x69\xfd\x0f\x56\xa7\x99\x81\x16\x7c\xd8\x07\xa1\x27\x60\x54\x88\xbd\x03\x3c\xfc\x1d\x37\x66\x9d\x8c\x05\xdb\x3b\xba\x13\x0c\x7f\xa3\xb5\xc4\x68\x4c\x76\x03\xea\x90\x1f\xc8\xed\xd6\x72\x81\xc3\xa7\xfd\x54\xf6\xfa\xd1\xeb\xf4\x18\x33\x89\x6a\x66\x47\x51\x46\xef\xac\x0e\xfe\xb3\xd5\xe8\x07\x55\x82\xbc\x68\x8d\xba\xf0\xe9\x55\x8f\xdd\xe7\x06\xec\x71\x38\x90\x93\xec\x9c\x6d\x4c\x13\x05\x72\x8b\x12\x5e\x3e\xd8\xe0\xa7\xf7\xca\xac\x88\x7c\x95\x26\x7a\x18\x3b\x31\x6c\xd8\xd4\x88\x82\x65\x54\x57\x0e\x9e\x8a\x4f\x1b\x0f\x1f\xb6\xf9\x05\x42\x93\xc6\x05\x45\xe7\x8a\x77\x36\x6b\x8f\x0a\xc8\x5c\x31\x21\x49\x6b\xbf\xfa\x4f\xb8\xb6\x88\x3e\x3a\x4b\x62\x6b\x79\x8d\x29\xee\xef\xe0\x1d\x5b\x3e\x64\x3d\xd5\x9b\xf8\x2c\xe7\x47\x89\x35\x9d\x19\x68\x88\x51\xfa\xd3\x37\x89\xd2\x8f\xac\x33\xa8\xf6\xbb\x26\x4b\x98\x53\xb5\x67\xa0\x6f\x1a\x04\xb5\x42\x66\x01\x46\x24\xac\xea\x8e\xed\x9d\xe3\xc8\x5d\x3e\xbb\xde\x61\x3b\x59\x2e\xd9\xbc\xc4\xd9\x05\x14\x16\x9f\x2e\xb7\x00\x22\xd3\x45\x1a\xe2\xa3\x86\xf5\xb2\xc4\x5c\x86\xae\xf6\x06\xa6\xd8\x8c\x3e\x40\x33\xc9\x13\x48\x63\x07\xb3\xac\x4f\xf0\x29\x86\x9c\xe6\xf0\x1e\xd3\x27\x22\xdb\x28\x5e\xd6\xb6\x7e\x81\x0d\xad\x2b\x88\xe6\x67\xad\xc1\x90\x0c\x55\x15\xe6\xb4\x2f\xe2\x31\x5c\xc2\xf5\x44\x97\xf7\x15\x3d\x97\x47\xeb\x0c\x86\x64\xd6\x00\xed\x5a\xc8\x2f\x07\xad\xf5\x5c\x38\x74\xa8\x06\xcb\x3f\x38\x52\xa9\x32\xe3\x75\x54\xa1\xc8\x64\xd9\x86\xe9\x5a\x6c\x3c\xd9\x01\xbb\xb3\x71\xc2\x80\x6a\x3e\xbb\xaf\x13\x47\x05\xea\x4c\xf9\x0a\x21\x83\xe0\x3a\x79\x87\x82\x17\x83\x95\x57\x04\xdb\x84\xd2\x41\x22\x2e\x46\x1a\xa8\x42\x7c\x9b\x33\x68\x0d\x12\xec\xd3\x30\xbd\xef\xd3\x2f\x29\x69\x11\xa9\x3a\xe5\x3c\x0f\x5a\x6f\x8a\xf0\x51\x15\x12\x90\xf6\x15\x97\xf9\xfa\x8c\xce\x0e\x98\x29\x05\x65\x69\x0d\x74\x8d\xe2\x6d\x52\x2b\x76\x14\xb4\xa8\x87\x96\x84\x85\xfa\xd7\x1c\x4e\xb2\xf9\xbc\xcd\x8d\x48\x9a\xfc\xf2\xc4\x10\xf7\x3b\xb0\x7a\x0b\x9f\xd1\x02\x78\x24\x3a\x7f\xb2\x2b\x2a\xb9\x70\x98\x21\xab\x8b\x4a\xe5\xa7\x79\x34\xed\xc8\x7a\x3f\x8c\xf9\xb2\x91\x12\x36\x6f\x1b\xf2\xe6\x09\x72\x3b\xde\x63\x43\x56\x5d\x18\x3a\xa1\x81\xfa\xb2\x4a\xf3\xf9\x32\x63\x2e\x8c\x7a\x79\x69\xc7\x1e\x04\xeb\xb4\x55\x9f\x82\x80\xf7\x2f\x6d\xde\x56\x89\x8a\xd7\x0f\x28\x5a\x97\x5a\x7b\xbb\xa9\xaa\xb4\xb1\x7a\x66\x40\x94\x5f\x73\x00\xfc\xf7\x5c\x31\x73\x43\x12\xa2\xc5\xfe\xba\x1e\x21\x92\x61\x02\xa3\x81\xbe\x81\xee\x5d\xbd\x0d\xfb\x38\xfc\x9c\x1d\xcc\xbb\x9f\x5e\x7a\x5e\x0a\x78\x8e\x4b\x1c\x23\x5d\x30\x7a\xca\xa0\x69\x06\xc6\x83\x86\x3e\x51\x68\x6f\x4a\xa6\x15\x6c\xc2\xd1\xca\x2b\xb2\x0b\xa9\xd2\x3d\x00\x4d\xdf\x1f\xf1\x4a\x9c\x5c\x53\x8d\x2e\xe1\xa4\xbe\xa6\x61\x33\xb8\x21\x62\x32\x01\xb5\x49\xa4\x32\x7a\x16\xac\x91\x89\xd4\x2f\x09\x66\x0e\xb0\x2a\x74\x78\x74\x42\x26\x55\xbd\x8d\xac\x86\x99\x3a\x2b\x72\x4c\x2e\x8c\x50\x0c\x2a\xe7\x0e\x84\x3a\xe6\x2d\x9c\xc3\xaa\x79\x63\x7a\x5c\x59\xd9\xcd\x61\x88\x18\xec\x18\xd1\xb5\x57\x06\x55\x3f\xd4\xd7\xdd\xd2\xf0\x95\x1c\x9a\x63\x93\x46\x32\x58\x2e\x36\x2f\xcd\x8e\xd6\x3a\xd4\x73\x5b\xb5\x3e\x12\x44\xd4\xb9\x7e\x38\x36\x66\xf6\xea\xfe\x1c\x06\xc9\x47\x87\x31\x01\x78\x92\x34\x94\x25\xbe\x32\xc4\x1b\x95\x06\x0b\x9b\x02\x1d\xe8\xb7\x8f\x7e\xbc\xad\xb8\x41\x3a\x87\x16\xf3\x9b\xe3\x3a\x96\x8f\xe0\xea\x89\x47\x80\x54\xc5\xa5\x85\x01\xa4\xdf\xdf\xe6\x7c\xad\xd0\x41\xd7\x42\x63\x23\x0a\x48\xc6\x17\xe9\xdb\xa7\xf7\x18\xca\x21\x02\x8f\xa9\xd0\x03\xb2\xed\x62\xd5\x4b\x6a\xff\xa2\xcb\xe5\xfa\x0e\xc8\x5f\xc4\x94\x6b\x6c\xc0\xc9\x6d\xed\x00\xa4\x60\xa0\x0d\x88\x38\x55\xfd\x29\xca\x99\x6e\xd5\x23\x06\xbd\x29\x79\xd5\x9a\xc3\x94\xb7\x42\xc1\x2e\xb9\x66\x54\xeb\xbd\x5b\x81\xc4\x93\xce\x0b\x32\x52\x8f\x1c\x0e\xd4\x52\x34\xd2\xc0\x77\x34\x15\x4d\xa8\x9b\x56\xd8\x83\x5a\x0c\xe5\xab\xdb\x57\xcc\x5d\xdc\x9a\x51\x87\xd5\x74\x72\xa4\xe8\xc1\x89\x48\xdd\x3e\xd9\x6e\x5d\x1d\xe1\xeb\x31\x5b\x1f\x07\x20\x08\xc7\xe0\x72\xa1\x74\xbf\x6a\x2a\xe1\x10\xee\xdd\x4d\xbd\xff\xd0\x8a\x92\xd1\xfa\x2d\xb6\x3a\x59\x70\xf5\x2c\xce\x44\x3f\xa9\x31\x1e\x9d\x4b\xa6\xcd\x89\x38\x41\xa4\xa6\x29\xd3\x18\x23\x62\xd8\xcc\x68\x49\x98\x93\x42\x25\x8a\xf1\x01\x6b\x3a\x36\x8d\x3e\xf3\x43\xb0\x30\xfd\xe3\xd0\x8d\x91\xbb\xc7\xd1\xd0\xa1\xb7\x9c\x3e\x56\x2c\x85\x19\x95\x5f\x7a\x00\xb9\xbf\x5b\xa4\x3d\x23\x00\xfa\x4a\xcc\xaa\xb5\x1f\xf3\xfe\x7d\x5a\xb0\x6b\xec\x88\x05\xfb\xd1\x51\x82\xa5\x70\x56\xed\x93\x77\x01\xc9\xd9\xf7\xd5\x54\xb8\xfd\x2b\x4e\x8f\xa4\x40\x02\x38\x4d\x63\x39\x9c\x75\x00\x1c\xe5\x90\x83\xf4\x30\xe5\x22\xc3\x38\xf4\x9c\x90\x4e\x97\x5d\x72\xd4\xcb\xc8\x7f\x86\xa4\xca\x6a\xc2\xbb\x99\xcf\x25\x6c\x6f\x35\x2c\x56\xdb\xc9\x18\x28\xb8\x17\x16\x56\xb1\x0e\xb3\xa4\xa1\xa7\xa5\x3e\xb8\x7a\xea\x3b\xe8\x63\x12\x9e\x03\xa2\xd4\x56\x51\x28\x10\x2a\xeb\xd5\x87\x12\xce\xd8\x83\x3e\xc8\x94\xa4\xae\x8b\x2b\x42\xab\xda\x87\x90\x1d\x35\x38\x48\xe8\x0b\xd5\xa7\xa1\x18\x4a\xf9\xeb\x58\xe1\xdf\xf0\xd9\xce\xec\x0b\xb0\xa3\x6b\xca\x59\x4c\xa8\xff\xd5\x4e\x46\xb0\x2d\x4d\xea\xe7\x41\xb0\x81\x23\x40\x15\x89\xf2\xc4\xb5\x76\x0e\x4f\x91\x8f\x64\xcd\xcb\xa4\x13\x16\x48\x9d\xe8\xe4\x2a\x1e\x7f\x30\x4d\x4e\x9d\x28\x8a\x73\xfe\xd2\x1a\x9d\x5d\xd0\xdd\x8f\xb1\xce\x75\xf2\xcc\xce\x74\xe0\xb8\x27\x18\x79\xeb\xf0\xe9\xf6\x0d\xe5\x4c\x92\xd6\xfb\x52\x70\xe9\x56\xd4\xe0\x56\x76\xcc\xac\xda\x54\x6b\xd1\xf8\x1a\x07\x51\x53\xb3\x12\x5c\x8c\x4c\x55\xa7\xe8\x6d\x15\xa8\x63\x3c\x20\x28\x12\x79\x69\xec\xa6\xd4\x21\x31\xe7\xba\x65\xbc\x08\x7d\xd4\x1a\x21\x00\x87\xbd\x63\x7d\x7d\x02\x14\x31\xc5\xbf\x78\xba\x09\xb3\xf1\x96\xc0\xdf\x6b\x96\x83\x86\xe5\xe4\x16\x4a\x71\x10\xfb\xcf\xea\xdc\x4c\x38\x91\x5b\x89\xdc\x0f\x4b\x72\xbc\x4b\xf9\x18\xa2\xb2\xea\x43\x01\x5f\xcb\xd3\xb3\xbf\xde\xc6\xe4\xe9\xc1\x2f\x63\xa2\x45\x99\x2a\x9e\xe0\x00\xe6\x72\x30\xe1\xd3\x7e\x31\xe0\xa4\xe2\x1d\x21\x4b\x75\x2e\xce\xf5\xc8\x3a\x0f\xca\xbe\xb2\xf2\xea\x03\xc5\x08\x0b\xe3\x87\x3f\xde\x21\x87\xfa\x13\xd9\x2a\xa6\xa3\xca\xfc\x1e\x95\x0e\x00\xd1\x67\x5e\xaf\xbd\xdd\x54\xaa\xf6\x06\x37\x4a\x53\x89\x37\x39\xc9\x26\x22\xd1\xbb\x9f\x0b\x8a\xc6\xb2\x5f\x99\x3d\x85\xaa\xd7\x06\x8e\xbb\xcf\xd9\x56\x6e\x10\x81\xd7\x8b\xd1\x45\xf7\x32\xb0\xab\x89\x82\xbb\x39\x06\x8f\xa7\x7a\x7c\x49\xa8\xec\xc9\x9b\x02\x88\x45\xbf\xe1\x63\x4f\x21\xd7\xc4\x2c\xd1\xed\xb9\xcf\xed\x0d\xd3\xda\x48\xf0\x00\x0f\x21\xfc\xb2\x2f\xcb\x87\x66\x2a\x8f\x1c\xa5\x37\xa5\x47\x82\xbb\xd0\x06\xc1\x2e\x9e\x88\x38\x0e\xe4\xec\xa7\x57\x64\x21\x43\xe5\x4f\xb4\x33\xe6\xdd\x06\x70\xa6\x58\xb5\xeb\xb9\x47\x62\xd4\x3c\xd7\xe2\x44\xff\x0e\x65\x60\x55\xb1\xbb\xe8\xcf\x64\x58\x91\x1e\x36\x85\xed\x2c\x12\x90\x55\x57\xc1\x9c\x29\x39\xaf\x09\xb3\x2a\x63\x5a\xfc\xc8\x91\x27\xa9\x7c\xec\xfe\x6b\x26\x41\xd5\x8d\xd9\x76\xa8\xef\xba\xb8\x79\xa8\xc5\x27\x04\x87\x09\xfd\x29\xa0\x65\x3b\x47\xfc\x52\x22\x31\x08\x51\x72\x6a\xd0\x48\x3c\xae\xc4\xa9\x90\x79\x72\x8a\xc2\x20\x09\x1e\xb3\x69\x3b\xdb\x57\x4c\x1e\x25\x23\x32\x9b\x61\x89\x65\x25\x0b\xef\xa2\x02\xa6\x3c\x26\xee\xdf\xce\xd1\x23\x03\xb6\x1c\x57\x5e\x07\xb2\x62\x50\x48\x69\x2e\x74\xac\xb6\x2b\x7e\xbf\x7a\x50\xd2\x07\x09\xe0\x13\x3b\x15\xb7\x9a\x51\xd9\x45\x5f\x7f\x41\x0d\x05\x06\x01\xb7\x01\x5a\xbc\x19\xa6\x6c\x0e\xde\x64\xd1\x4f\x12\x64\x26\x4b\xbc\x27\x9d\x44\x3b\x84\x4b\x83\x73\xe1\xc5\xb7\xbc\x50\x6e\xd2\xb9\x31\x9c\x4d\x15\xa8\x20\x26\xef\xfe\xb9\x31\xbd\x53\x1b\x8d\x91\x71\xfd\x9e\x29\x00\x31\x94\xec\xdc\x89\x01\x86\x85\xa3\x98\x0a\xa3\xe0\x13\x6c\x8e\xee\x38\x61\xed\x28\xbd\x68\x08\xee\x33\x84\x64\xa3\x9e\x5f\x7d\x5b\xe3\x6b\xbc\xa9\xf4\x55\x24\x15\xb6\x3c\xa1\x9f\xa8\x26\x14\x9f\x9c\x4c\xb8\x94\x1e\x31\x8f\x59\x09\xbb\x6b\x68\x5b\x0b\x81\x7d\x27\xfd\x92\x1f\xa1\xc1\xa0\x35\x88\xfb\x0c\xbd\x1f\xdd\x6d\xdd\xa1\x3e\x8d\x91\x1a\x6e\xe6\x3b\x55\x8f\x0a\xb1\xd3\xe8\xc1\xec\x22\x09\x6f\xc0\x80\x39\x24\xa2\x73\xaf\xd1\x5b\x8d\x9f\xb4\xca\x63\xfc\x70\xf2\x55\xd0\xaa\x3a\x4b\xea\xa0\x84\x86\x69\xe9\x1a\x2f\xd9\x2a\x56\x56\x7a\x34\x89\xb5\x12\x5b\x1f\x1d\x1f\xd6\x85\x85\xa0\x18\x10\x4f\x63\x67\x4e\x0b\xa0\x09\x48\xde\xd8\xd8\xfd\xe2\xe2\xb1\x98\xea\x02\x87\xd8\xe6\x1e\xf2\x63\x64\x13\xf8\xb2\xee\xae\xc4\x57\x7e\x21\x96\x57\x9a\x0f\xe2\x32\xfa\xad\x9d\xe9\x4d\x5c\x24\x72\x3e\xc2\xb5\xb0\xb7\x24\xa9\xfc\xc8\x09\x29\xc4\x6e\x64\xbd\x80\xbe\xb9\x58\x8d\x0d\xd1\x71\x6d\x7d\xce\x54\x01\x4f\x52\xdf\x8b\x79\x18\x85\x16\xc4\x4c\x8c\x86\x0d\x2f\x71\x28\x98\xee\x24\xf0\x02\x6f\xa6\x8a\xe3\x08\xa4\x2b\xae\x05\x86\xe4\x93\x73\xd9\xa9\x68\xd0\x7e\xc1\x20\x6b\x61\xb4\x47\x9a\xbd\xa9\xfd\xa6\xe9\xaa\x28\x91\x5e\xe4\x8a\x5d\x91\xdc\xc2\x22\xae\xc0\x4c\x83\x4d\xa9\x27\xef\xb0\x71\x02\x14\x67\xc2\x1e\x9e\xf1\xab\x4a\x2b\x75\x07\xda\xe8\x63\x4d\x3e\x7a\x6b\x8f\x23\x6e\x30\x99\xce\xcd\xf2\xb9\x15\xa1\xe7\x5a\x96\x02\x98\xcd\xa7\x50\x8f\x61\x3d\x72\x35\x59\x4d\x91\x5f\xda\x7d\x54\x96\x13\x10\x16\xd2\xd7\x97\x31\x35\xd4\x9a\x8c\x33\xc7\x75\x54\x5c\x1e\x03\xf9\x75\x33\xed\xe6\x7c\x5d\xa0\xde\x29\x12\xe8\x17\xa2\x97\xe4\x02\x24\xe2\x65\x6d\xf3\x5a\x96\xc2\x22\x11\x62\xa1\x95\x64\x0d\x14\x9f\xa3\xb7\x7b\x66\x17\xd7\xa9\x63\xf0\xa0\x4a\x31\xe0\x92\x7e\xd5\x7c\x0e\x3d\x72\xe6\xad\x69\x1b\x0b\xdf\x65\x1f\xca\x73\xaa\xcd\xd8\xb0\x77\x5b\x27\xce\xb5\x75\xcf\x55\x37\x39\x07\x81\x1a\x65\xff\xec\xa0\xbd\x5c\x5c\xf4\xa6\x6f\xb1\x81\x40\xcc\x40\x5c\xb2\x42\x47\x62\x51\xcd\x10\xc5\xc4\xb5\xd0\xa4\x3c\x95\x9f\x82\x23\xf3\xfc\x2a\x5c\x5d\x11\xa9\x89\x9a\x08\xc3\xf8\x20\x62\xa9\x9c\x2e\x5c\x6c\x6d\x66\xea\x0e\x49\xf5\x8a\xee\x6d\x8d\x92\x0d\xb1\xab\x14\xf3\x52\x97\x3c\x06\x4c\xdd\x43\xbe\x52\xce\x95\xcd\x1c\xb2\xd4\x15\x7d\x86\x7a\x3d\x43\xa7\xda\x97\xf6\x05\x1b\x74\x74\x29\xc1\xe2\xc1\x01\x57\xfc\xc2\xbd\xf6\x19\x94\x14\x79\xb3\x78\xd4\x25\xa5\xde\x00\x07\x64\x30\x7d\x76\x88\xc1\x6c\x85\x74\x80\xed\xcf\x84\x87\xcd\x0e\xe6\x49\x9e\x50\x80\xeb\xb2\xc1\x06\x62\x47\x35\xb2\x59\x59\x43\x7b\xf6\x8d\xf6\xea\xe9\x7a\x52\xa6\x2e\xa3\x4b\x32\xc4\x3a\x16\x50\xd2\xd8\xf2\x9c\x6e\x8a\xdf\x01\x9a\x37\xd1\x20\x06\xab\x63\x34\x87\x36\xff\xd0\x33\x35\xd4\xa7\xfa\x0a\x8c\x80\x73\xe0\x19\xb6\x20\xb3\x34\x48\xd3\xc7\xf8\x66\x82\x61\x26\x87\xc1\x93\x2c\xdf\x61\xb7\x4b\x70\x4d\x46\x8d\x8a\xc0\xe8\x71\x16\xed\x6d\xc3\xa1\x40\x76\x39\xfe\x50\x7a\xe5\x6a\xf8\xcc\xf3\x56\x76\xe0\xa6\xd1\x07\xf2\x69\x17\xcf\x98\x69\xc1\xac\x45\xd3\x0f\xf2\x61\x8e\x91\xfd\xd6\x70\x79\x64\xd1\xf3\x3f\x9c\x7f\x67\x7f\xfb\x14\x5d\x53\x4d\x87\xb5\x80\xc2\x92\x49\x6d\x0d\x95\xe7\xcd\xa5\x17\x55\x6f\xc5\x76\x35\x77\xff\x85\x9f\x88\x9a\xed\x26\x0e\xfc\xc3\xc4\xde\x5a\x38\x12\x4e\x75\x3a\x78\xed\x9e\x20\x1f\x98\x4f\xf7\xde\x1a\x37\x21\xe7\x68\x9c\x8c\x99\xae\x6f\x51\xef\xe8\x43\x7f\xad\x26\x07\xc6\xa2\x67\x6f\xb5\x3b\x1b\xc7\x7d\x9a\x95\xc7\xf0\x5f\x07\xdb\x24\xee\x76\x52\x66\xe2\x6c\x12\x71\x6a\x3e\xcb\x57\x05\x64\x08\xf6\x64\xad\xb7\x60\xee\x9b\xea\x54\x44\xff\x8a\x22\xe1\x6f\x47\x91\x55\x71\xee\xe3\xeb\xba\x01\xd5\x71\x85\xdc\xc4\x02\x28\xc7\x26\xa3\xf8\xb5\x47\x97\xd2\x6d\x63\x36\x2c\x6a\x59\x4a\xb3\xf2\x01\x14\x79\xc8\xf9\xe7\xe0\x83\x69\x76\xea\x26\xee\x85\x92\xcd\xc9\xe7\xb2\xfd\xa4\x83\xf4\xce\x4d\x19\x36\x6e\x5a\x2a\x53\xee\xf0\x4b\x18\x67\xb5\xf9\x1e\xc8\xe5\x4e\x56\x1f\xac\x76\x02\x0b\x2e\x36\x89\xf3\xd8\x95\x87\x00\x24\x4d\xa7\xed\xc3\x13\x1e\x18\xaf\xa9\x53\x92\x4e\xd4\xa7\x81\x55\x83\x9e\xc7\x1d\xa0\x56\x8d\x0e\xf3\x46\xfa\xa6\xad\x2c\x5e\x87\xb2\xb7\xb4\x3e\x85\x46\xd1\x77\xa5\xde\xb1\x13\x5b\x47\xb4\x3c\x1f\x44\xba\xc7\xc8\x17\x8c\xfb\x11\x23\x74\x03\x7d\x1c\x7c\xc5\xcb\x37\xe0\x4c\x72\xb4\x61\x6e\xe8\x24\x25\x6e\xa4\x74\x03\xe7\xfb\xb1\xfd\x54\xa2\x2f\xab\x4e\x80\xcc\x20\xcb\x3b\x06\x95\xe5\xfe\x95\x86\xf2\x99\xe3\xb9\xc7\x17\x8f\xb6\x4e\x59\xb4\xff\x26\xe4\x68\xcf\xa7\xce\x59\x7f\x68\xfd\xe5\xc9\x68\x77\x4b\xa7\x03\x49\x18\x43\x2f\x81\xc3\xc3\xe0\x38\x14\xf4\x9a\x1e\x2c\x0e\xeb\xf0\x02\xff\x12\xa8\x9c\x34\xa3\x56\xac\x53\xae\x77\x45\xd3\xc1\xe0\xd1\x5a\x02\x43\x2b\xd5\xa9\xf4\x23\xbb\xa5\xc7\x90\x76\x7e\xa0\x69\x2e\xa1\xba\xeb\x94\x0d\xb1\xf7\xe6\x2d\x6f\x56\x6d\x25\x33\xff\x7c\xcd\x82\x7c\x25\x56\xd9\x15\x7d\x0f\x3a\x22\x6a\xad\x25\xb5\x7f\xf6\xf6\x24\xdf\xaa\x81\xae\x2b\xc5\xed\xb3\x49\x79\x44\x1e\xbd\x46\xe5\x20\xb6\xca\x1b\x06\x01\x8e\x20\xc6\x0b\x79\x4e\x69\x53\x0e\x88\xc3\x89\xd5\xf6\x3e\xdf\xa0\xda\x61\x0f\x6a\x18\xf0\xd3\x74\xd0\x9f\x3d\xa1\xc2\x99\x5e\x93\x12\xa3\x6c\x57\x72\x66\x4a\xa3\x41\xd8\x48\x3d\xd5\x37\x21\xe6\x6a\x9b\xf3\x7d\xa1\x2c\x32\x79\x55\xcb\xc0\x3b\x18\xe2\xb7\xd7\xb7\x5e\xe2\xe7\xb7\x48\x59\xc7\x6e\xd4\xd9\xb6\x55\x50\x06\x6d\x54\xbb\x57\x58\x02\x2c\xaa\x52\xe7\xa9\x4f\x23\x9e\x94\x43\xe2\x7e\x13\x49\xa1\x6d\xd0\x74\xaf\xc4\x9e\x93\x8b\xf3\x5e\x4e\x2f\x65\x9e\xf0\x74\x12\x7f\x5e\x1b\x8f\x9a\x58\x04\x2f\xfb\x8b\x0d\xf8\x33\x43\xd9\xe4\x9b\x01\x65\xb2\x10\xa6\xeb\x4d\x72\x09\xf8\x05\x3a\xa2\xda\x9b\x57\x2c\xb8\x90\xb8\xfa\x85\x03\x26\x5f\x2d\x94\x21\xb0\x59\xfb\x76\xb3\xfb\x8d\x00\xe2\xfe\xf5\x82\xe4\x82\x54\x0f\xcb\xb8\xc4\xc3\xcb\x82\xd4\x92\x9f\xf5\x05\x38\xad\x80\x3a\x1f\x62\xf3\x87\x36\x3f\x27\x5c\xea\x30\xc7\x93\xe4\x5c\x5d\xe3\x2f\xd5\x20\x79\x88\xf3\x56\x48\xcc\xb6\x5f\x6d\x26\x4c\x41\x42\x7c\x76\xab\x50\x01\xff\x26\x3b\x44\x5b\x67\x5c\xd3\x4c\xaf\xc0\x75\xdd\x6e\x6f\x2e\x6e\x91\xd8\x8d\x64\xbd\x3f\x16\xd1\x5c\x9c\xe7\x6d\x5f\xae\x28\x02\xa2\x3e\x24\x77\x9c\x2a\xc6\xc6\xdf\x5f\x88\xf9\x1d\x81\xb1\x7b\xee\x36\x9b\x0b\xe3\x05\x51\x8a\x90\xab\x8e\x76\xdc\x38\x8b\x01\x54\x95\xde\x9d\x5d\xb7\x0a\xd0\x00\xe2\x44\x4f\xb3\x24\x1a\x1e\xe6\x45\x6a\x08\x4a\x22\x71\x39\xdc\x4c\x3b\xb8\x8e\xae\x78\xe0\x58\xcd\xfb\xf2\xb0\x03\x92\x50\xd2\xa6\xbe\x1d\x35\x8b\x43\x81\x40\xe9\x3f\x4e\x39\x95\x1d\x4d\x15\x4c\xfd\x53\x49\xd9\x08\xf0\x00\x2b\xc1\x03\x82\x4a\x93\xaa\x2b\xc3\x1f\x83\x85\x05\x8a\x44\xf6\xe1\xc0\xe1\x4d\x71\x02\x6c\x8a\x31\x71\x41\x93\x8c\x95\x7d\x22\xda\x80\xe6\x3a\xb7\x1b\x6a\x5c\x4d\xeb\xa8\xce\xca\x6d\xf1\xc5\x81\x36\x12\x4b\x42\x5e\x68\x09\x95\xba\x6e\x0b\x95\xb3\x4f\x5c\x13\xad\x4c\xe0\x8b\xf9\x20\xff\x23\x50\x23\xfb\x40\x17\x6c\x0e\x3f\x18\x39\xb4\x17\xdf\xe5\x3d\x0d\x51\xbe\x9d\x14\x91\x8f\xcf\xe3\x55\x55\x49\xa2\x00\x56\x8a\x07\xaf\xe6\xf7\x7f\x98\x18\x08\xf9\x3e\x61\xc8\x11\x40\x80\x04\x5b\xa3\xa7\x23\x72\xcb\x5c\xab\x1d\xe3\xe3\x19\x00\x7e\x58\x8f\x9e\x94\xec\x43\xbe\x85\xab\x85\xd8\x5c\x72\x80\x08\x55\x65\x8d\xed\xab\x9f\x39\x81\x59\x7e\x7e\x25\x8c\x95\x8e\x81\x03\xff\x1d\x9b\xf9\x32\x2d\x20\x8c\x37\xb0\x36\x03\x8b\x4c\xad\x11\x05\x18\xf2\x98\xdc\xaf\xe8\x10\xb1\x88\x3e\x68\xe8\x9d\xf2\xbf\x65\x30\x35\xb8\x41\x99\x92\x6e\x1b\x35\x22\xda\x57\xbd\x94\x3a\x30\x92\x61\xbb\x9d\xa9\x7a\x66\x20\x02\x58\x32\x6b\x77\x0d\x24\x5d\xd5\x6e\x06\xf9\x55\x87\xc3\x93\x1e\x9e\xa9\x81\x20\x51\x21\xc2\xc3\x9c\x89\x78\xb2\x66\x9a\x3d\x9c\xca\xa3\x41\x21\x8b\xdd\x48\xa0\x77\x14\xc0\x19\x11\x9e\x7d\xeb\x3e\x73\x35\x3b\xd8\xc2\x72\x03\x37\xf1\x73\xb2\xb3\xbc\xee\x2e\x1c\xa2\xa2\x05\xe6\x25\x94\x17\x9b\xa2\xe9\x64\x55\x60\x09\x2a\xba\x0f\x36\x94\x38\xf9\xdd\x51\x68\x4f\x2f\xb5\x32\x76\x78\x3f\x7a\xa8\x4e\xb1\xd7\xd4\x17\xc6\xec\x83\x83\x6d\x52\xcb\x1c\x23\x8a\xce\xcf\xe9\x6f\x86\x4e\xaf\x51\xff\x6c\xe3\xb9\x90\xa5\xaf\xb3\xbc\xf2\x77\x7c\xa8\x2a\x4b\x90\x3b\xe3\x53\x3c\xdb\x97\x47\x21\x81\x5d\xc5\x84\x80\x8a\x33\x7b\xe9\x08\x9c\x87\x12\x2d\x19\x23\x9f\x72\xcb\x3d\xe8\x95\x58\x8b\xe3\x5d\x94\x91\xc9\x59\xc9\xc7\x2c\x79\x7f\x42\x40\xb9\xe8\xb0\x3b\x58\xb6\x1a\x38\xa4\x57\x7b\x34\x70\xaf\x4e\x5e\x3e\x55\xdc\x81\xe0\x4e\x56\x02\x26\x65\xb6\x20\x91\xb8\x93\x7d\xeb\xb2\xb4\x12\xae\xb7\x41\xb6\x41\x2b\xc6\x50\xd6\x26\x71\xb3\xfa\x98\xe2\xf4\x13\x60\xa4\x56\x15\x43\xa6\x81\xe3\x96\x46\xde\xbe\xd9\xf1\x87\x79\x04\xe6\xb3\xab\xcb\xcf\xe2\xee\x67\x8e\xc2\xd3\xe4\x74\xd4\xb4\xfb\x9f\x0b\x33\xb1\x2f\x4e\x25\x53\x4f\xfc\xf7\x2b\x36\xab\x24\x28\x0c\xcf\x4d\x36\x18\x0f\xe3\xe5\x7d\xf4\xb1\x46\x40\x50\xfa\xb1\x06\x7b\xce\x83\x90\x7d\xf1\x86\x96\xcd\x95\x7a\x55\x00\x88\xf3\xc2\x4c\x11\xc9\xa2\xcd\x7e\x20\xb6\xc1\x8c\x1b\x33\x6b\x2a\x8a\xe3\x2c\xbc\xcb\xb9\x55\x47\xa1\x4f\x38\x6c\x38\xdb\xe4\x6c\xa9\xbd\x13\xc6\xe3\x87\xac\x15\x85\xea\xd5\xda\xe9\x2c\x43\x95\x90\x1c\xf4\x57\xe4\xe8\xe2\xd5\x9d\x9d\x1f\xb5\x29\xc3\x4b\x5f\x87\x93\x3d\xe3\xf2\xa5\x00\x54\x94\xdf\x95\xaf\xcf\xbe\xb2\xae\x51\x31\xb2\x7a\x54\xa4\xb5\xf6\x45\x35\x6b\x50\xaa\xe4\x40\xee\xae\xb4\x24\xbe\x20\x68\x30\x0c\x40\x2a\x65\x6a\x7d\xbf\x55\x68\x9f\x72\xdb\x4c\x8c\x25\x36\x8a\x63\x92\x95\xb6\x61\xca\x4e\x18\x4d\x80\xed\x3f\x77\x5c\x9c\x22\x18\x9d\x26\xdf\xc4\x51\x25\xe6\xa3\x8c\xc8\x74\x62\xad\xbc\x8c\x41\x06\x5a\x77\x64\x57\xbd\xde\x00\x57\xbc\xf9\x0d\xe0\x03\x2b\x15\xc0\xa2\x55\x95\xfc\xb2\x28\xb6\xb0\x26\x28\x61\xc6\x4c\xfa\x0a\x15\x7b\x21\x9c\x7b\x90\xb2\x92\xdd\x9b\xc0\xf6\xa8\x54\x3e\xce\xf2\xfb\x4f\x91\xf2\xcb\x4c\x76\x99\x4d\xf2\x01\xb6\xb0\x8e\xd2\xd6\xca\x79\xd9\x4a\xb5\xcf\x4e\x2e\xd4\x2b\xcd\xa6\xb9\x43\x9b\xcb\x38\x2a\x27\x0d\x2b\xb3\x84\x0f\x2d\x0c\x5d\xa7\xdc\x9c\xce\x4e\x09\x0c\xf2\xed\x37\x27\x8b\x46\x12\x4a\xef\xcf\xe8\xe0\xb9\xb5\xa3\x8a\x0d\x99\x80\x51\x55\xce\x40\xfd\x87\x7e\xa9\x9e\x19\x3c\xc4\xf2\xd5\xc0\xad\x11\x91\x92\xfc\xd3\xc6\x71\xcd\x92\xc8\x2b\x63\xca\x6c\x37\x18\xae\xb6\x40\x1f\xba\x5b\xbf\x66\x47\xe0\xe4\xbe\xa8\xb2\x1a\x66\xc6\xbf\x0e\x37\x5b\xef\x11\x39\x1a\x38\x19\x3a\xf0\x11\x56\x24\xfe\xc4\xce\x64\xe0\x17\xa9\x91\xcb\x5c\x7b\x05\x58\xf3\x01\x26\xa0\x45\x3e\x9f\x57\x66\x1b\x21\xd2\xea\xa0\xb2\xb6\x8d\xb3\xdb\x1f\x0b\x18\x3b\x26\x20\x9f\xdc\x09\x28\xb6\x3b\x45\x68\xe1\x9a\xca\xc7\xa3\x9c\xbe\x7c\x6b\xbb\xf8\xd6\xfd\x71\x1e\x91\x6a\x44\xa1\x04\xfe\xf6\xa6\x43\x65\x65\x4c\x63\x3e\x86\x18\x9c\xa1\xa8\x9f\xda\x49\xbc\xb1\xf9\xec\xc3\x16\x5c\xf6\x5b\x35\xef\xb5\xf1\xd4\x0e\x2e\xd5\x8f\x90\x40\x17\xb6\x2b\x89\xa5\xfe\xaf\x83\xfd\x0a\x84\xc5\x8e\x26\xa7\xdd\xe9\xf4\xbc\x03\xbb\x94\x7d\x26\x51\xf6\xb6\x8d\x1c\xc9\x2d\x7f\x51\xf4\x16\x34\xff\xad\x70\xf9\x38\xdd\x6a\x53\x66\x80\x2d\x53\xf7\x2d\x8a\xff\xcc\x75\xc5\xd7\x40\xb2\x3a\x57\xdf\xa4\x48\x7c\xe2\x04\xdb\x59\x51\x53\xb5\x07\xb3\x1a\x0a\xa2\x3f\x1d\x46\x4d\xe5\x2d\x9f\x30\xa3\xa9\x84\x1b\x5f\x0d\xe6\x69\x6b\xc5\xf9\x77\x9f\xcd\xe1\x74\xf2\xd6\x8f\xea\x27\xf7\x4b\x38\x6c\xe4\x36\xb5\x21\x2e\x1e\x28\x9f\xa9\x41\x15\x96\x4d\xb1\x11\x24\x46\xa8\x8a\xcc\xab\xb2\x78\x38\x43\x24\x51\x77\x50\x4c\x55\x40\x2b\xc1\xa8\x58\x27\x79\x8d\x2d\x71\x88\xfa\xcb\x55\x34\xcf\xca\xce\x29\x45\xda\xf0\x40\x5a\xa5\x46\x03\x9a\x97\x97\x9f\xe8\x35\x93\x1b\x1f\x51\x0b\xa3\xb0\xb6\xf1\x23\x2d\x56\x28\x95\x63\x4c\x75\x01\x08\x14\xea\x35\x7b\x52\xf2\xa7\xc8\xee\xd9\x28\x05\x93\x40\xf7\xa8\xda\xf3\x4d\xf1\x17\xbe\xe8\x53\x59\x48\x4c\xd0\x84\x90\x9a\x7f\x41\xf3\x0b\x54\xab\x01\x2a\x71\xae\xee\x18\x96\xa7\x14\x04\x42\x23\xcb\xe0\x40\x28\xc4\xed\xfd\x89\x9e\x14\x29\x53\xeb\x4b\xcf\xca\xa5\xb3\xab\x3e\x79\x15\x5e\x75\x59\xfc\x94\xab\x6d\xeb\xac\x2d\xd6\xc3\x3a\x21\x1f\xd0\x7b\x27\x41\x50\x13\x27\xb3\x23\x27\x4d\xb3\xa6\x7e\xc8\xdd\xb5\x8d\xc2\x92\x47\xfd\x54\xa5\x9f\x91\x41\xe8\x74\x19\x33\x34\x0c\xef\x95\x8b\x8d\x3c\xea\x5d\x87\x4c\x44\xf4\x7e\xf7\x77\x66\x52\x4b\xfd\x82\x11\xee\x99\x40\xc4\x8c\x7e\xca\xad\x80\x5d\x2c\x26\xfa\x4f\x70\x6f\x0d\xfc\x34\xd3\xef\xdd\x7b\xe4\xef\xf1\x03\xde\x63\x01\x25\x2a\x09\x6f\xc4\x47\x83\xbb\x30\xa0\xd5\x67\x47\xe0\xff\xe4\x90\x5d\x8b\x19\x2d\xca\x93\xff\xda\x2d\xa9\xbc\x66\xb3\xea\xa7\xbb\x44\xa2\x4b\xc6\x2b\x0b\xbc\x23\x59\x72\x88\x52\x5b\x52\xf8\xa5\x75\xac\xe8\x2f\xfc\x92\x1a\x96\x08\x0e\x8a\xdb\xf4\xb3\x77\x43\xdc\x9d\x44\x63\x09\x44\xfe\x79\x45\xfb\x8a\xbc\x2b\x01\x2a\xd0\x36\xe9\xcc\x35\x53\x19\xca\xeb\x00\x2c\xd6\x21\xcf\xdb\x44\x1c\x51\x1f\xa6\xfa\x91\xfb\xd5\x7f\x66\x9e\xb8\x56\x55\xc7\xc7\x99\x53\xad\xd1\xf5\x56\x7d\x96\xcb\x59\xa8\x9d\xf7\xcf\xd5\x1a\xfd\x92\x9b\x80\x9b\x43\x94\x62\x80\xe8\x31\xbe\x53\x79\x73\x84\x38\x42\x76\x82\x86\x49\x0d\xa1\xd8\x3e\xd2\xb0\xc8\x29\xf3\x26\x61\x5a\x39\xd9\xac\x78\xc3\xeb\xef\x2f\x06\x32\x8c\x2e\xdb\xaf\x6e\xb5\x69\x48\xd9\x46\xe9\x8c\x18\xbb\x9c\x2c\x30\x99\xac\xa0\x43\x41\xec\x85\x96\x2c\x06\x93\xf0\x38\x49\x40\x8b\x1a\xe4\xf3\xa8\xd2\x04\xb7\x8e\xd3\x2e\xcb\xbc\xff\x09\x29\xb3\x03\x6a\xa4\x94\xa4\x3f\x83\x56\xa6\xf4\x37\xfa\xe4\xf4\xb2\x29\x6c\xa0\x07\xca\x36\x4d\xd5\xc3\x46\x87\xc2\x3f\x65\x63\x10\xc5\xbb\x72\x3b\x8b\xe1\x86\x4a\x33\xea\x5a\x5a\x5b\x09\x0f\x0a\xb3\x80\x3c\xde\xef\x6b\x73\x75\x0c\x3a\xfc\xb4\x17\x1c\x0d\x26\xe2\x26\xcb\x35\xc4\xf5\x87\xaf\xb6\xd1\x0e\xe4\x66\x51\x9c\x44\xb6\x7a\x4e\x9c\x01\x2f\x07\x9d\x02\x9c\xce\xef\xcc\xdd\xa8\xbd\x85\xd0\x46\xfa\x65\x75\x96\xca\x08\xa6\x2b\x3a\x5a\xb8\x00\x71\x9a\xbe\x76\x19\xa5\x98\x85\xd8\x72\xbd\xdb\xf7\xf6\x71\xd6\x7b\xa9\x08\x85\x9e\x92\xaa\xd9\x07\x68\x58\xe2\x51\xd3\xd2\xe5\x82\xdf\x63\xee\x24\xac\x69\x2d\x5e\x65\x91\x10\x1e\x49\x80\x91\x9b\x89\xe8\x99\x8a\x45\x44\x2c\x55\x6f\x09\x18\x80\x36\x87\xad\xb0\xed\xdd\xc5\xb9\x8c\xfc\x45\x54\x23\xbe\xb9\x6d\x9a\x24\x0c\x77\xf7\x1d\x7e\xed\x8a\xda\xdf\xd2\x85\xe6\x1d\xa4\x6d\xdc\x2e\x0d\x14\xd1\x0e\xf8\x0a\x33\x65\x8f\x6f\xda\xfd\xd6\x97\xa5\xdf\x23\x05\x77\xb9\x80\xbb\x94\x8b\x14\xc8\xb7\x23\x2c\xf6\xe1\x08\x1e\x4e\x70\x7b\x4c\xaa\x7f\xf0\x05\x26\x40\xad\xd5\x24\xcd\x1e\x9e\x64\xa8\x95\x50\x31\x05\x63\x0e\x98\xe4\x1a\x50\xd8\xa7\x42\xc0\x00\x62\x2d\x7d\x84\xf9\x2c\x20\x07\xb4\xdb\xe5\x13\xb2\xcf\x99\xda\x23\x8b\xd8\xb2\x17\xbc\x5b\x3a\x1c\xed\x2b\x5c\x0b\x5f\xa8\x9a\x67\xe4\x10\x95\x17\xef\xe2\x9d\x7d\xa2\x7e\x1a\xf5\x19\x17\xe6\xe8\x3e\x97\xf9\x99\x03\x7b\x8c\xc5\x2b\x20\x62\x95\x68\x36\x11\xe1\x93\xcb\x9a\xb8\xd0\xca\x47\xf7\xc4\x6b\xe9\x4f\x79\xb3\x93\x08\x4c\x23\xa3\x64\x19\xba\xec\x33\x04\xcd\x8c\x10\xf6\x60\x49\x8d\xc2\x64\x95\x65\x35\xb6\x75\x7d\x4a\xdb\xc0\x91\x33\x9f\x0a\x34\x25\x22\x9c\x35\x9d\xd2\x7e\x33\x35\x9f\x37\xc2\x8a\xd9\xf1\x45\x5e\x25\xd5\xb3\xfc\x78\xcd\x81\x79\x4e\x63\x74\xd2\x36\xa4\xe2\xd5\x26\x36\xd8\x26\x6e\x8c\xac\xa3\x2c\x99\x6d\xce\x89\x64\x84\xa9\x76\x27\xb7\xe3\x14\x47\x12\x4d\x9c\x43\xee\xa9\x9b\xd4\x6b\x63\xbb\x24\x0a\x11\xf6\x65\x34\xaf\x0a\x3b\x3b\x67\x24\x42\x4a\x4d\x29\x64\xe7\xd0\x39\xc6\xf4\x03\xaa\x88\x04\x90\x17\x6e\x6b\x78\xaa\x34\x7a\xa0\x15\x9e\x20\x40\xf1\x13\x9c\x7a\x1f\x03\xef\x65\xf3\x76\x70\x58\xdb\x30\x04\xb3\x13\xaa\x0d\x5a\x14\x45\x89\x22\x0d\x1b\xbb\x7a\xd1\x72\xf9\xa0\xe1\x4a\x2d\x2a\x22\xa2\xbe\x31\xc4\x84\xc3\x9f\xcb\x84\xd1\xc4\x8a\x37\x53\x8e\x69\xfa\x20\xae\x32\x63\xeb\xa2\x0c\x23\x47\x9a\x12\xef\x81\xce\x54\x43\xa5\x74\xed\xde\x79\x73\xe0\x9e\x85\x19\x1f\xff\xe9\x40\xd5\x3c\x6c\x7f\xa7\x95\xa3\x4e\xde\x31\xb2\xf2\xf3\x4a\x4b\x85\x9f\x79\xe9\x38\x76\xd6\x4b\x49\x73\x93\x9b\x68\xfd\x1e\x6d\x4b\xae\xd7\xa4\xca\x57\x0c\x83\x7c\x6b\x54\x80\x5c\x47\x28\x06\x12\xab\xd4\x00\xda\xba\x96\x86\xda\xd6\x99\xc8\xc3\x3b\xc7\xb0\x7f\x4f\x70\xb4\x32\x7a\x8e\xaf\x48\xb1\xd0\x38\x75\xe8\xc2\xcc\x3a\x2b\xe2\x74\xb0\x79\x4c\x39\x52\x84\x86\x15\xf0\xc0\x53\xa5\xa4\x65\x40\x66\x9a\xd8\xd8\x76\x9a\xe5\x57\x3e\x3f\x3d\x6a\xad\xac\x88\x93\x86\x27\xa1\x10\x02\x21\x6b\x00\x5a\xdf\xbc\xc4\x34\xc6\xfa\xd2\xec\xc0\x56\x6d\x3c\x58\xde\xa7\x05\xa0\x0f\x0a\xbb\x47\x0a\xbb\x9b\x2c\x83\xdd\xc3\x72\x96\x67\x25\x1c\xd1\x2c\xc3\xe4\xc4\x07\xaf\x70\xcc\x5e\xa4\x33\x45\x00\x90\x7a\x6d\x13\x41\x06\x52\x9e\xe4\x9c\x10\x08\x1d\x7d\x49\x20\x8c\x8b\x1d\x78\xb1\x54\xda\xc6\x00\x51\xef\xc6\xbe\x7d\x2c\x89\x7a\x44\x90\x33\x39\x89\xa2\x79\x3e\xa4\x60\x33\x89\x71\x2c\x0a\x57\x6c\xad\x24\x15\x07\xb3\x0b\x50\x13\x74\xdf\x98\xc6\x1b\x7f\x03\x88\x4c\x86\xd0\xf0\x21\xee\x7f\x9a\x86\x92\xbb\xe9\x7f\xda\xd7\x14\x52\x97\x2f\x96\x82\x4d\xf9\x14\xa0\x46\x2a\x2a\xe6\x5d\xef\x3a\x40\x16\x8a\x93\x62\x82\x90\xd2\x2d\x85\xb9\xb0\x29\x73\x3e\x4c\xf9\x95\xc8\x9f\x26\xbf\xb6\x50\x3f\xe9\x0f\x7d\x53\xfb\x3f\xbf\x0d\xd1\x53\x60\x3f\xf8\x77\x40\x28\x8a\x3d\x0a\xb0\x2d\x70\xe2\x9c\x76\xf2\x80\x4a\xc5\x37\xbf\x41\x84\x94\x5c\x7a\x3c\xba\x18\xca\x13\xc0\x8e\xca\x43\xa1\xeb\xad\x5f\x95\x1d\xe5\x57\x8a\xa0\xbd\x2e\x3e\x18\x71\xce\x3e\xbf\x4c\x8b\x01\x2e\x2b\xe0\x75\x55\xe5\x40\xc3\x2b\xda\xc9\x75\xba\x33\x1d\xc1\x4b\xbb\x44\x2d\xae\x1d\xfa\xe1\x37\xe9\x2a\xb7\x37\xaf\xdf\x61\x0f\x6a\x85\xcc\x6f\xea\x9f\x21\xbf\x0e\x1b\xd3\x4e\x6a\x5f\x6e\xde\x75\x53\xa8\x40\x65\x38\x86\xdd\x82\xab\x38\xd1\x1b\xda\xec\xd1\xbf\x7a\x18\x15\x0c\x74\x8c\x4b\x7b\xb3\xf8\xc5\x0e\xf0\x83\x1a\xea\x59\x92\x1d\xfb\xd9\xf3\x6f\xa5\xf0\x48\xcb\x4e\xfd\xa4\xe8\x12\xe5\x3a\x20\x1f\x2a\xac\x12\xfe\x5f\xf8\x20\x94\x83\x16\x24\x32\x4e\x99\xc8\xac\x62\xef\x27\x07\xfa\x25\x96\xe5\x3c\x3f\xc1\xff\xaf\xfd\xb2\x2b\xa1\xc2\x0f\x43\x8c\x40\x2e\xe5\x90\x32\xea\xd9\x00\x42\x55\x6b\x86\x7d\xb1\x59\x88\xf8\x8a\xd3\x5d\x6d\x30\x9b\xf7\xc8\x13\xcf\x14\xaf\xf9\xe1\x5d\x05\xd6\x34\x40\x96\x25\x7a\xcb\x91\x76\xd2\xbb\x82\x3f\xca\xa4\x5d\x05\x8b\x51\x29\xb2\x9b\x04\x9e\x25\xda\x16\x4e\x2c\xa2\xa2\xbb\x0c\x9c\xd2\x60\x63\x87\x4a\xa6\x64\xe1\xdb\xab\x64\x22\x44\x73\x6c\xac\xd3\xa8\x40\x90\x66\xd5\xd4\x5c\x8d\xce\x59\x34\x6c\x55\x88\xec\x7f\x5b\xd8\x55\x65\x99\x5c\xab\x00\x63\x71\x41\x4d\xe9\x74\xf9\x2a\xcc\x5c\x60\x47\x64\xce\x2d\x5c\xf6\x95\x37\xad\x81\x60\xaa\xd7\x99\xbc\x56\x67\x16\xf0\x96\xc2\xda\xa2\xa5\x55\xec\x2a\x65\x8a\xa1\xb7\x46\x95\x54\xd5\xd7\xc1\x7f\x41\xe8\x0a\xdd\x1b\xf5\x77\x1c\x4a\xed\x28\xa5\xdd\x45\xde\x68\x7d\x81\xe8\x0a\x58\xb3\x1f\x4a\x31\xad\x63\xcc\xcf\x53\xb5\x1f\xe0\x4d\xd9\xc1\xb1\xa4\x2f\x70\xb0\x04\x17\x8d\xa9\xe2\xbe\xfe\x94\x23\x28\x24\x69\xe3\x7f\x3d\xd4\x1d\xd9\x27\x6a\xfd\x5f\x92\xaf\x62\xb7\x43\xfd\x03\x3c\x6b\x10\xc3\x26\xf8\x7a\x08\x1d\xe9\x4f\xfe\x2a\xb7\x8d\x43\x40\x16\x96\xba\x65\xf3\x86\xec\x1d\x94\x81\x1f\x94\xda\xc5\x2e\x27\x2f\x7e\x1a\x57\xd9\xd2\x89\x5e\xff\xeb\x6c\xd2\xb9\xd1\x68\xae\xb2\x29\x64\x69\xb3\xc6\xf1\x0e\xb6\x0f\xad\x8f\x0d\x66\x41\x4a\x1c\xe5\x49\x14\x2c\xdc\x10\xaa\xf5\x51\x55\xb9\xc0\xdb\x25\x4a\xbd\x67\xe7\x78\xed\xf6\xaa\x66\x0c\xbb\xfb\xe8\x2d\x99\x31\xb6\x89\x9e\x63\x12\x52\xf0\xde\x39\x4a\xf7\xea\x05\xb5\xd6\x9e\x6f\xca\xa1\x81\x27\x9e\x08\x2d\xa9\x0b\x7a\x3e\xb4\xb0\x6d\x5e\xad\x57\xe8\xac\x9c\x4a\x72\xe3\x7c\x70\xd5\x50\xe3\x10\xc4\x1c\xd0\xe0\x13\x5a\x1a\x7a\xcf\x15\xa1\xbf\x7c\x95\x01\xa5\x4a\xa0\x73\x6d\x08\x73\x34\xa9\x01\x9d\x88\x2a\x1d\x71\x10\x4e\xa6\xc8\x82\x92\x82\x43\xd8\x49\x53\xd8\x7d\x18\x24\x44\x01\x3e\xa3\xed\xc1\x16\xe8\x04\xf6\x07\xa7\x50\xa3\x22\xcb\x72\x2c\xeb\x94\x36\x38\x09\xb3\x61\x9b\xa3\x9b\xe6\x21\xb5\xc1\x87\x56\xb6\x16\x26\x29\x3a\xd9\xc6\x54\x54\x1f\x26\x57\xb5\x22\x2c\xbb\xba\x1c\x63\x84\xae\x97\xb6\xff\x1a\x8b\x76\x83\xe1\x3c\xb5\x33\x13\x3a\xbc\x87\x16\xc5\x92\xdf\x45\x70\x2f\xbf\xc3\xff\x24\xb7\x47\xae\xc8\xc5\x27\xa3\xe9\xc7\xa7\x1e\x6c\xa4\x0c\x6d\x92\x5f\xd9\x76\x95\x6f\x0f\x87\x09\xbe\xa3\x5d\x59\xff\xb0\x8b\xa1\x35\x6f\xc3\x3d\x41\x12\x1a\xf5\x6a\xb1\xac\xd0\x48\x48\xa6\xee\xe2\x72\x33\x49\xad\x8f\x5d\xbf\x95\xda\xdd\xd0\x23\x71\x47\xab\x37\x9e\x12\x9a\x9e\x64\x68\x97\x33\xf6\x1f\xa1\xde\x5c\xc3\xd3\xa9\xcf\x63\xf6\x2d\x3f\x55\x4e\xc1\x10\x59\xfb\x16\xce\xbd\x31\x58\xf6\xe0\x43\xf4\xe0\xa4\x4a\x97\xcb\xd5\xaa\x3a\xe7\x97\xae\x67\xf3\xe1\x8d\xc9\x7a\x12\x26\x57\x9b\xfa\xb4\x5b\x07\xda\xb9\xd6\xca\x9c\x0e\xe8\xf3\xf6\x3a\xdd\x2a\xff\x1b\x51\xc0\x11\xaf\xe7\x23\x92\xe4\xe0\xba\xa8\x2b\xe7\xf2\x7d\x67\x00\x8f\x3a\x91\x21\x46\x73\xed\x66\x8c\x63\x82\xf5\xbc\x74\x8a\x0f\xe8\x28\xf4\x90\x54\x0a\x3b\xca\xdb\x8d\x70\xc8\x6c\xa9\x70\x89\xa6\xe4\x92\xd2\xc7\x57\x62\x5c\xfb\xfb\x9c\xbc\xf6\x15\x23\xcc\xe0\x5b\xa7\x3f\x03\xc7\x69\x86\xbd\x71\x2f\xc7\x0b\x7d\x1b\x39\xa8\x04\x91\x59\x65\x49\xda\x2a\x32\x56\x89\xe7\x03\xb2\x58\xba\xa0\xf4\x42\x41\xb8\xc7\xc9\x73\xd9\x65\x65\xc1\x79\x0b\x43\x2c\x42\xc2\x4f\xb3\xc0\xa6\x93\x89\x22\x4d\x67\xbf\xbb\x84\xf3\x34\xcb\x3e\xd0\x6c\x19\xf0\xd3\x32\xba\x6f\x96\xe8\x5b\xa6\x2d\xf0\xec\x23\x92\x6b\xe8\xea\x88\x4e\x7c\x51\x9f\xca\x48\x58\x85\x4c\x31\x8a\xa4\x74\xad\x00\x80\x5c\x08\x61\xa7\x09\xad\x54\x3a\xb5\x79\x1e\xd1\xf0\xa8\x0e\xbe\x03\x86\xb2\xbe\xd0\xd0\x75\x7f\x50\x5d\x23\x74\xe8\x7d\xd6\xed\x3d\xae\x74\xf7\xa1\x39\xe1\x7c\x52\xb5\x53\xb5\x5b\x48\xbc\x6c\xd9\x25\x49\x5b\xba\xd0\xe5\xda\x60\x9a\x95\x48\xc2\x6a\x27\xd4\x12\x15\x45\xfa\x77\x86\x8f\x4b\x5b\xd8\x46\x2b\x77\x03\x85\x0d\xf6\x9b\xf4\xfc\x62\x81\x1a\x44\x8e\x2b\x9e\x3e\xaa\xef\x4c\x2a\x1c\x68\x47\x41\xdb\x8b\x11\x39\x3d\x43\x1d\xc0\x61\x77\xc9\x14\x94\xe8\x02\xd9\x02\x61\xad\xdd\x5d\xc0\xe6\xc8\x30\x78\x46\x39\xf8\xb4\x97\x1f\xf1\x28\x6c\xda\x01\x19\x38\xff\x3a\xe5\x83\x8d\xe6\x09\xa6\xc1\xbb\x6b\xe5\x8f\x02\x07\x5d\x13\x69\xf0\xf2\x28\x6c\x66\x95\x50\x98\x02\x10\x0e\xe6\xca\x17\x63\x06\xc8\x02\x2d\x84\x37\xd2\x1c\x37\xfd\x9a\xa4\xbf\x10\xed\x8b\x7b\x70\x45\xcc\x62\x9a\x30\x8f\x01\x4c\x01\x67\xf4\x0e\x65\x2d\xb4\xb2\xe3\xb3\x57\xf2\xea\x6d\xc6\xe7\x90\xad\x19\xbd\x00\xda\x8e\x49\xaa\x54\xe8\x9e\x9b\xe9\x25\x20\x2e\xe1\xf9\xd8\xad\xcf\x13\x90\x14\x49\xe8\xb1\xa2\xde\x92\x39\x73\xa3\xf5\xe4\x53\x53\x83\x47\xa7\xcd\xb8\x48\xcc\x75\x73\xe7\x64\x96\x4b\x03\x40\x83\xed\x93\x49\x79\xeb\xe3\x88\x95\xa2\x3a\xbb\xa1\x7e\xd6\x31\x60\xb3\x1d\xe0\xb9\x9f\x4f\x44\x46\x47\xbc\x25\x20\x7e\x22\xf0\x8a\xfb\x98\xf6\x11\x07\x8b\xd5\x87\xd8\x9a\xd6\x89\x13\x5a\x55\x10\x17\xed\xb9\x95\xa3\x2f\xb3\x26\x44\x68\xc2\xd0\xa6\x62\x34\x64\xec\x20\x92\xee\xcc\x2e\xe4\xb2\x6b\xec\xf5\xa7\xfd\x73\x2b\xef\x5f\x94\x05\x94\x0f\xe9\x71\xb4\x2a\x0f\xb8\x54\x88\xf6\x2f\x02\x31\xc1\x24\x35\x8b\x6f\xd7\xde\x46\x69\x31\x7a\x2b\xc7\x00\xfc\x57\x5b\xf4\x07\x5a\x7d\x31\xfe\x4a\x32\x28\xc4\x8b\x18\x7e\xab\x5f\x7c\x2b\x60\xca\xcb\x67\x33\x9f\x0e\x72\xa5\x1e\xe7\x41\xe0\x42\xe2\xee\xd0\x90\x58\x4d\x63\x5e\x84\x26\xf1\x0b\xec\xdb\x34\xd2\x1a\x7d\x4e\x16\x0e\xe6\xbd\x71\x02\xb6\xbe\x28\x63\x98\xc9\xe7\x22\x4e\x61\x8c\xc4\x27\x81\x53\x75\x35\x18\xc4\x95\x7a\xbb\x9f\xb8\xc7\x4c\x60\x63\x61\x65\xb9\x96\x96\x2a\xaa\xe9\x28\xb7\xcf\xc9\x5e\x8d\xf8\xd7\xbe\xb3\x82\x8c\x43\x37\xbe\x0e\x07\xdb\x26\xa0\xf3\xd2\xa2\x73\x57\x66\x6b\x2c\x80\x90\x89\xcd\x97\x83\xa9\x40\x27\x71\xb9\x37\xc7\xf4\x34\x7c\xb0\xe5\xbc\x86\xe0\xb9\x29\xbd\x3b\xc2\x12\xcf\xa1\x86\x5d\x09\x5a\x5d\xda\x24\x66\x87\x8f\x1d\xa0\xaa\x60\xe0\x32\xb7\xab\x33\xca\x0b\x59\xd1\x12\xf4\x92\x15\xcd\xb1\xe6\x8a\xa5\xdb\x79\xa9\xb0\x2e\x7a\x2c\x99\x75\x57\x76\x46\xfe\x48\x06\x74\x71\xfa\x61\x3a\xa8\x8a\x60\x11\x24\xc2\x0c\x17\x54\x52\x28\x2c\xb1\x2e\x64\x03\x05\xa0\x33\xeb\xd9\xf0\xb3\x62\x64\xa1\x16\xa6\xb9\x23\x51\xfc\xba\x89\x73\x6b\xf9\x0f\xc4\xe8\x48\xe9\xa5\xa5\x7c\x70\x60\x34\x94\x23\x77\x77\xf6\x3f\x65\xb3\x32\x39\x1b\x42\xfb\x92\x11\xc5\xbb\xbc\xcf\x24\x2e\xc2\x92\x6e\x76\xe1\xbc\x3f\x4d\xcb\x15\x0f\x42\xd1\xc8\xb8\x73\x82\x70\xa1\xd3\x4f\x9a\x41\xf3\xa8\x53\x73\x41\x15\x23\x71\xea\x90\x0e\x72\x61\x21\x88\x38\x95\x32\xbb\xbc\xd5\xe8\x7a\x7a\x9f\x8f\x76\x71\x78\x54\x76\x11\x99\x2b\x7d\x42\x28\x58\x94\x78\x6c\x9c\x23\x9d\xc7\x36\xa8\xab\x0b\x88\x41\x90\x05\x34\xd6\xac\xd6\x8d\x28\xf3\xaa\x50\x8e\x15\x1a\xc4\x88\x9e\xec\x7c\xd8\x29\x80\xab\x85\xad\xdd\xf6\xec\xa0\x32\x6e\xce\xa4\xfa\x99\xd7\x27\x78\xad\x8d\xf7\xd8\x3b\x3a\x02\x00\x24\xc9\x3b\x5f\x37\x94\x53\xd6\x5e\x21\x78\x2a\x1e\x60\x62\x71\x09\xd7\x72\xa5\xed\x5b\x03\x1a\xb5\x56\x27\xc3\xad\x26\xfc\xeb\x02\x8c\xde\xb3\x35\x08\x43\xe2\x1c\x78\x70\xf5\x62\x57\x30\x6d\x0a\xfb\x14\x1d\x39\x36\x65\x7e\x0c\x54\xcb\x71\xa5\x0e\xb6\x76\x31\x72\xbe\xc5\xfc\x9d\xb8\xa7\x7f\x23\x71\x4a\x5e\xb6\xe1\x0e\xd3\x87\x30\xa0\x4e\x6c\x59\xbc\xbc\xa8\x23\xe2\x46\x09\x83\x85\x5d\x89\x22\x0a\x4d\x04\x07\x9c\x6d\xc8\x1d\xb4\x9e\x4f\x99\x13\xea\x1e\xe9\x35\xe6\x48\xb6\x51\x1d\xba\x3d\xd8\xc3\x0c\xc9\x87\x57\x16\xed\x5b\xf3\x98\xba\xd3\x4c\xaa\x07\xb4\x07\x1f\x58\xdd\x42\x00\x45\x67\x89\xe2\xd6\x1e\x06\xc9\x8c\xe6\x9f\x1a\x50\x18\xf6\x79\xf7\x12\xc1\xcd\x1a\xdf\x04\xde\xfc\x31\xa8\x3c\xb7\x5f\x1f\x6c\x26\xa9\x20\x2e\xbc\x8f\xcf\x3d\x53\x6e\xde\x1d\xf4\x22\x3d\xc5\x06\x86\xd9\x59\x93\x5c\x1a\x9d\x10\x07\xa5\x51\x29\x0a\xea\x3a\x6d\x63\x30\xf7\xac\x2c\x18\x4a\x8a\xcc\x1e\x07\x1a\xd4\xfa\xf6\x21\x0c\x1a\x6f\x1c\xc9\x52\x3f\x39\x7b\x83\xa0\xad\x7d\x15\xde\xea\x2a\x16\xca\xc6\x99\x32\x16\xff\x29\x0c\x33\x6a\xfc\xd3\x9d\x15\xc7\x98\xce\x0b\xb0\xbd\xae\x60\x5a\x98\xb7\x3c\x79\xb8\x3a\x25\x6e\xd8\x0d\x1b\xd3\x6d\xca\x98\x2a\x2e\x4f\x93\xab\xcd\x04\x26\xc8\x01\xea\x7f\x19\x3a\x4c\xc9\xcf\x9b\x24\x4d\x6c\x16\xc8\x97\xfd\x67\xed\x94\xa8\xd1\x84\x90\x1a\x08\x3a\xdb\x0f\xbd\x4a\x85\x83\x82\x24\xe8\x22\x17\x75\x0e\x90\xcf\x0b\x8b\xbf\xed\xe4\xba\x96\x56\x52\x21\x3b\xfe\xdf\x04\xd6\x07\xe9\x43\x93\x86\xcd\xde\x72\x10\x07\xab\x26\x54\xd7\xb0\x9c\x02\x41\xcd\x49\x89\x63\xbf\xa8\xac\x05\xd8\xe4\xf0\x61\x2d\x51\x49\x58\x48\xe6\xac\x54\x63\x49\xcf\xc4\xea\xe4\x77\xf6\xf2\xad\x31\x58\x70\x8e\x0e\x53\x2c\xf9\x0a\x33\x38\x4e\xea\x11\xda\x60\x00\x10\x1b\xb6\x94\x99\x00\x4a\x8c\xbb\x60\x68\x51\xe0\xc4\xc2\xa6\x21\x0a\x4e\x32\xa5\x79\x2a\xd4\x76\xea\xa0\x7c\x69\x81\x9c\xa5\xa4\xeb\xe9\xce\x55\x29\x12\xce\x62\x70\x56\xfd\xd9\x4f\x87\x93\xe4\x29\x48\x2f\x39\xbd\x1b\xec\x28\xcb\xb7\x7b\x67\x70\x7c\x7c\x98\xd9\x11\xd4\x69\xf2\xa5\x73\x4c\x93\xf3\xec\x54\xbf\xf6\x17\x13\x9e\xe5\xc1\x58\x60\x2d\x93\x36\xc7\x1b\x38\xba\xf9\xd0\x44\x89\x70\x0f\x6f\xfc\xd9\xc6\x6c\x2f\x2b\xb7\xb2\x59\x62\x4c\xce\x34\x63\x6c\xcf\xf9\x1c\x05\x07\x39\x55\x2e\xe0\x55\x02\x18\x97\x4a\x1d\x87\x65\xd3\xd3\x35\xda\xa1\x74\x9b\xbd\x33\xf5\xa7\x54\x96\x8e\x26\x25\xcd\x62\x30\x2e\xcb\x67\x92\xa6\x7a\xc2\xaa\x2d\x4f\xae\xa8\x44\x05\x93\xfb\xed\xfd\x6a\x3e\x2f\x55\x63\x57\x57\xbf\xf9\xe3\x05\x4d\x58\xf7\x03\xd6\x09\x05\x02\x53\x1c\x04\xe4\xc8\x65\xbe\x18\x53\x03\xac\x45\x76\x9a\xa0\xc0\x7a\x26\x27\x36\x1e\xdd\x85\xd1\x74\x72\x14\xcb\x6a\x26\xd8\x67\x5f\x59\xf9\x73\xec\x51\x3a\x7f\xa1\xce\xee\x23\xcf\x54\x98\xc9\x1f\x2a\xa7\x8b\x9d\x2b\x67\x72\xf2\xda\x19\xb9\xd3\x3b\x45\xaa\x76\xdc\xe4\x1f\xce\xf2\xda\x94\xaf\x5a\xd8\x55\xcd\xa1\x05\x6a\x48\x57\x34\xbe\x52\x8b\x38\xce\x6c\x85\x54\x90\xdc\x02\xc0\x87\xf3\xfe\x01\xde\xca\x7e\x5b\x05\x43\x12\x90\x08\x02\x83\xce\x3a\xfe\x78\x11\x34\x74\x54\x3e\xb4\xeb\xc4\x29\xc9\x1e\xf6\x9b\x9e\xfd\x20\x2a\xe8\xdb\x7a\xbd\x5b\x1c\xed\x50\x1f\x4b\xd6\x90\x35\xa9\x30\x1b\x75\x19\x26\x42\xe1\xa1\x4f\x6c\xd8\x38\xd4\x36\x21\xf5\xd0\xfa\x95\x5d\x54\x26\x90\x2a\xdf\x6b\xb7\xf9\x17\xe3\x92\x6d\xaa\x07\xc6\x23\x71\x2a\xce\x3b\xb0\x0c\x75\x73\xac\xa4\xa9\x91\x3f\xc0\x70\x61\x21\xa7\xde\x8e\x10\x7a\xef\x77\x85\x30\xa3\x05\xbf\xac\x62\xa8\x19\x70\x6d\x3f\x65\x3a\x92\xef\xc0\x22\x5e\x08\xf6\xd0\xd5\x37\xc8\x48\x77\x68\x85\x0e\x3b\xa9\x48\xc3\xe0\x5c\xde\x81\xa4\xc4\x75\x97\x2b\xcd\x61\xe1\x24\x55\x9d\x0f\xc9\xb9\x04\xb7\x8e\x6a\xa4\xce\x6b\x3e\xbd\x74\xb7\x51\xec\x78\x0d\xde\x2b\x42\x42\xb7\x7e\x35\x0a\xeb\xe0\x57\xdf\x37\xba\x75\xb4\xeb\x91\x34\x4f\x09\x7f\x87\x92\x5a\x7a\x21\xa5\x55\xe7\xc3\x17\xd5\xb2\xad\x55\x6d\x0d\xeb\x50\x9a\xc0\xfc\xfb\xd9\x71\xfc\xc6\x84\xe8\xe2\xf8\xcd\x8f\x0a\xc6\xc2\x77\xa6\x05\xd0\x07\xf2\x9d\x4e\x4a\xce\x36\x7a\xb7\xb6\x91\x59\xae\x9d\xac\x96\x55\xdc\x16\xf3\x61\x15\x8e\xd3\xa3\xb6\x4a\xf0\x80\x98\x29\x4e\x84\x74\xd7\x6f\xf6\xf9\x2c\xff\xfc\xec\x28\x6c\x69\x73\x89\x0c\x8f\xc4\x69\x45\xd0\x30\xa7\xc3\x65\x79\x5d\xf5\x5e\xa9\xad\x8e\x8a\xb9\x02\xba\xc3\x21\x9a\xe6\x30\xd8\x9c\x54\x59\x07\x9e\x83\xc7\x26\x7c\x48\x9f\x59\x48\xd8\x79\x7b\x90\xfa\xe2\x74\x00\xed\x3e\x91\x33\x6b\x67\xea\xcd\xca\x52\x43\x37\xdb\x8b\x0a\x8e\xfa\x6e\x1b\x25\x4a\xc5\xdc\xe2\x34\x61\x92\x86\x23\xcd\x98\x3a\x8d\x33\x85\x92\xbe\x86\x3e\xf5\xc9\x2f\x6c\x69\x6d\x42\xff\x7f\x9d\x33\xe2\x47\x2c\x5c\x87\xce\x8a\x7c\x0a\xfd\x84\xb1\x17\xa8\xf7\x8f\x0c\x59\xbb\x0e\x03\xe3\x18\xa6\xc7\x73\xca\x3e\x89\x59\xce\xd2\x86\x43\x35\x53\x36\xd2\x4a\x4d\x93\x9d\x1d\x1b\x32\x1c\x9c\x60\x05\xed\x0a\xb9\x3b\xce\xaa\x0a\xe8\xee\xf9\xb1\x61\xb6\x1d\x7e\xa2\xa1\x11\x61\xeb\xcb\x19\xbc\x6f\xc2\x49\x28\x2a\x8b\x47\xcc\xb4\x82\x7b\xa8\x34\xf3\x38\x06\xa6\x85\x0e\x92\xda\x33\x34\x27\x39\xda\xcd\xd7\x3d\x40\x8d\x62\xcb\x14\xf7\x97\x88\xb7\xa3\x74\xe4\xe0\x38\x5b\x8e\x48\x42\x2f\x59\xbc\x14\x9a\xf7\x8b\xd6\x96\xec\x5f\xb3\xaa\x67\xda\xab\xcd\x81\xc3\x27\x27\xa7\xa3\x4e\x94\xc9\x9a\xca\x1c\x54\x55\xdb\xd0\x91\x21\xa9\xaf\x43\x00\xf5\x24\x5a\xaa\x5b\x43\xc2\xdc\xf8\x93\x17\x37\x64\x58\xac\x5f\x57\xf5\xe1\xd4\xf8\xe8\x82\xa8\x6f\x2f\xcd\xbf\x82\x0f\xf7\x96\x8b\x60\xc5\x10\x33\x4c\x6f\xd8\x25\x67\xb8\x89\x6d\x76\x85\xb6\x4e\x8d\x75\x2d\xd4\x3c\x39\x61\xfb\x9e\x3f\x76\x5e\xb4\x4f\x03\xd1\xb3\x96\x33\xed\xc7\x13\x3a\x85\x08\xa5\x81\x4a\x60\x02\xe3\x66\xaa\x1a\xce\x4f\x74\xf6\xdd\x62\x1a\x5b\xf8\x5a\x4f\xfd\x8d\xaf\x86\x72\xbc\x76\x4c\xe0\x95\x2a\x44\x69\x6b\x08\x13\xcc\xd8\xe2\x72\x04\x56\x2d\x7d\xd8\x18\x68\xd8\xb8\xa3\x7c\xce\xc4\xa1\x2a\x8a\x40\xdc\x5e\xda\x1e\x0c\x04\x39\x72\x7f\xd4\x75\x31\x1c\x31\x74\x97\xdd\xab\xb5\x3f\x71\xce\x7c\xbc\x56\x66\x24\x27\xf6\xc9\x7b\xf0\x51\x69\xdb\x03\xba\x17\x20\x40\x8e\xa3\xb8\x21\xa3\xf8\x09\xca\xfe\xb0\xe3\x37\xe2\x63\x85\x41\x60\x99\x82\xc7\x16\x6b\x92\x13\x58\x68\x7c\xd8\xd8\x5d\x7c\xc4\x89\x31\xc2\xec\xbf\xe6\xf7\xd1\x12\x9b\x38\x6a\xc6\xa8\x4d\x88\x2c\x17\xce\x0c\xc0\x61\x85\xe8\x2f\x96\x1c\x9f\x38\x44\x71\x95\x57\x46\x51\x60\x53\x76\x65\x83\xc9\x4c\x32\xd5\x64\x1c\x33\x78\x47\xf6\x48\x44\x65\x59\x9c\x5e\x40\xb3\xab\xae\x9c\x03\x92\xfc\x64\xab\x2b\xb2\x1f\x6b\xd8\x32\x8b\x13\x66\xf6\x32\x6a\xb2\xe6\x3d\x8e\xfa\x8f\x24\x1b\x9d\x24\x85\x72\x44\xd4\x46\x4a\x7f\x78\x37\xd2\x8a\x8a\x2b\x91\x35\x8d\xb6\x59\xf0\x97\xe0\xce\x85\xa8\x6c\xc8\xc8\x77\x12\xf5\x56\xfc\x94\xd1\xae\x59\xa1\xf0\x64\xbd\x3c\xfa\xdc\x7a\x1d\x4f\x01\x0c\xd7\x73\xb4\x8d\x72\xa9\x61\x54\x9f\xeb\xb7\x41\xa9\x3a\xb1\xeb\xbf\x0e\x0b\xa8\xbd\x48\x3c\x72\xfa\xca\x70\xa6\x92\xe4\x1b\xd1\xc7\x39\xa2\xe5\xcb\xde\x38\xbf\xf3\x7c\xb4\x8d\x15\xc8\xcd\xa1\x41\x0c\xf0\xc1\x0a\x6a\xd6\x81\x32\xab\x0d\xf9\xa3\x4a\x40\x63\x63\x92\x55\x6a\x99\xed\x49\x3e\x04\x24\xb8\xdf\x94\x5c\x5f\xd8\xee\x9c\xcb\x18\x0b\x29\x67\x99\x3d\xd8\x8d\x89\x32\xfc\x26\x68\xe2\x7a\xfc\x69\xb6\xf7\x74\x78\x43\xf2\xf7\x9b\x4a\xb3\x01\x9f\x06\xdd\x97\x54\xf6\x30\x5c\x11\x3d\x21\xac\xab\x6f\xcc\xaf\x56\x1d\x42\x9b\x51\xc2\xc7\x0c\x1a\xf9\xe0\xe6\xa1\x5f\x1a\x8d\xcc\x21\x53\x68\x02\x3d\x15\x94\x5e\x33\x41\x5a\x27\x3e\xd6\x81\x3a\x13\x1d\xa2\x85\x17\x8f\x30\x51\xd8\x71\x76\x62\xa0\x61\xa8\x96\xd5\xb1\x01\x11\x75\x62\xad\xc2\xbd\x87\x34\xea\x54\xd0\x2f\xa5\x8a\x03\x48\x01\xb9\x22\x73\x18\x6d\x55\xa4\x85\x4e\x9f\x2f\x8f\xb5\x33\x06\x9e\x38\xa9\x47\xa9\x1e\x34\x89\xe1\x76\xf4\xc1\xda\xde\x0f\x57\x01\x0d\x8c\xb5\x43\x6e\x06\x94\x4a\x12\x20\x3e\x8b\xd2\xc8\x64\xbe\xbd\x0a\x35\x6a\x94\x50\x14\x59\x2a\xb6\xbb\x7e\x0f\xe9\x88\xf6\x8e\x43\x6a\x4d\x05\x8f\xc8\xeb\x51\xb4\xc7\x35\x9c\x25\x0b\x30\x13\x50\xe3\x81\x73\xf8\x3f\x84\x44\x29\x7b\xf5\x82\x55\xf4\xda\xd5\x85\x5b\x0a\x08\xf1\xc5\x32\x52\x79\x3e\xd9\x46\xa7\xc7\x23\xb9\x87\x55\x55\x00\xce\x74\xde\x49\xbe\xfa\x10\xe3\xee\x1c\x78\x43\xb3\x6a\x1a\x0d\x85\x26\x34\xd4\xa1\x0d\x20\x7f\x07\x7e\xfb\x9f\xab\x5f\xd4\x3f\x67\x98\xf5\x2d\x67\x3d\xca\xf9\xb0\x00\x4a\xcf\x61\x60\x5b\x87\xdc\x0e\x6f\xdd\xe6\x50\x08\xad\xb4\x40\xad\xba\x8f\x3a\x25\x1b\x57\xed\xbb\x35\x70\x1c\xe5\xea\x2d\xfd\x2a\x01\x83\x9e\x6e\x13\x71\x04\x87\xc4\x87\x9f\x12\xd4\xf2\x87\x1a\xa3\xd6\x0c\xd5\xce\x43\x48\x4c\x03\x3a\xd0\x31\x7d\x5c\x8f\xd5\x0a\x4d\x3c\x46\x52\xaa\x8c\xb6\x79\xad\xf5\x31\xa4\x53\x3d\xa4\xc4\xb6\x86\xba\xff\xa1\xf3\x0d\x0d\x38\xf3\xe4\x77\x18\xe2\xb3\xb9\x73\x16\x05\xfd\xbf\x43\xee\x92\x87\x74\x92\x91\xf5\x88\x22\x13\xc9\x24\x49\x58\x07\xb2\x4f\x00\xbe\x1d\xe6\xd6\xa6\x6a\xce\x47\x7b\x59\xb8\x6d\xca\x97\x01\x67\xf8\xd6\x1f\x44\x6e\xc1\x9b\xfd\x60\xea\xc9\x2e\xfd\xc6\xe5\x12\xcb\x0b\x7c\x5b\xb6\x11\xdc\xde\x16\xc6\x7c\xc4\x32\xa4\xa7\x1a\x9e\x84\x58\xc6\x59\x14\xdb\xb2\xfc\xd3\x74\x6b\x1e\x46\x43\xa9\x30\x71\xbb\xd3\x51\x16\x4e\xd9\x10\x7f\x4c\x60\xf6\x88\x3f\x9c\xe9\x3c\x1f\xfd\xdb\x78\x8e\xea\x91\xe6\xa2\x0e\x0c\x1c\x6c\x23\x3e\xa0\x50\xca\x48\x50\xeb\x68\x9c\xb7\xc4\x9c\x43\x72\xbb\x6b\x10\x25\x20\x01\xe2\xa3\xdb\x0c\xfc\xc6\x5f\x96\x2f\x47\xc7\xd5\x14\xd8\x92\x5e\xc9\x06\x75\x2e\x84\x72\x60\xbe\xd3\x74\x9b\x6b\x10\xe7\x81\x74\xe1\x10\xba\xca\xbd\x99\x3d\x62\x5b\x1c\x93\xb6\x06\xce\xd3\x59\x6d\x1a\x36\x07\xbe\xa8\x88\x03\xe8\x86\x09\x75\x6a\xa5\xa2\x6d\x78\xfc\xa8\xf5\x0e\x54\x0b\xac\x7b\xce\xc0\x2d\x37\x79\x4b\x94\x5f\x65\x21\xbe\xfb\xf0\xec\x59\x65\x9d\x0c\x36\x57\xa9\xf3\xe1\xcc\xc5\xe3\x26\xbe\xa2\x9a\xa9\xaf\xf9\xf3\x49\x18\x28\xa4\xfc\x1d\xae\xa7\x33\x31\x50\x87\x09\xd0\x53\x55\x58\x6c\xe4\xcf\x5a\xcb\x27\x4b\x95\x7a\xdd\xf5\x0b\x7c\xfd\xb2\x5c\x07\x40\x67\x82\xab\x1c\x95\xb8\x60\x1a\x44\x0f\x74\x4b\xe9\x0f\xfc\x6a\x03\xa9\x99\xcd\x77\xaf\x3e\x75\x1b\x1d\xe1\x8b\x8b\xc5\x84\xd5\x6f\x89\xca\x2f\xdd\xe8\xfc\x56\x83\xa8\x42\x63\x2c\xfa\x79\x0f\xb1\x0b\x89\xc8\x6f\x40\xb7\xab\x65\x88\x8d\x68\x71\x12\xb1\xe6\xba\x92\x39\x4e\x08\xb5\x46\xcc\x6d\x79\x98\x01\x75\xdf\x76\xa1\xfc\x31\xd4\x2e\x2f\x12\x01\x2f\xa2\x5b\x9a\xf8\x55\xb3\xef\x27\x47\x28\x1f\xca\x39\x02\xee\x1a\x31\x8a\xfb\xf0\x41\x0c\x7a\x54\x69\xfe\x56\xae\x7f\x76\xc2\x5f\x1e\xfd\xea\xec\xd0\x16\xc7\xb0\x23\xda\x9c\x5c\x56\x5c\xcb\x26\xf6\x4b\x9a\x0e\x5b\x65\x20\xb9\xa8\xd3\xae\xcf\x65\x69\x70\xaf\x20\x3d\x6a\x76\xf3\xff\xb9\x7a\xb3\x05\xd5\x75\xdf\x69\xf4\x5d\xb8\xfe\x5e\xca\x49\x4c\xe2\xce\xe0\xfc\x32\xc0\x86\xa7\x3f\x2a\x55\xc9\xac\xff\xb9\xd8\x1b\x77\xaf\x9e\x80\xc4\x96\x4a\x35\xa8\x25\x99\x9a\xd7\xd6\xf4\xc3\xcd\xf0\xa8\x24\xd9\xe9\x27\x78\x1b\xdd\x25\x9b\xc7\xb3\xae\xc9\x9a\x27\x99\x0f\x3e\x7f\x69\xa9\x6e\x5e\xfa\x70\x46\x00\xeb\xf4\xe1\xa0\x13\xc8\x50\x23\x86\x27\x13\x80\x5d\x12\x1b\x24\xbe\xee\x03\xb5\xd7\x3d\x88\xcd\x62\x03\x08\x89\xdd\x04\xe8\xf7\x61\x4b\xea\x61\x66\x72\x95\x76\xca\x6b\x43\x68\x6e\x97\x67\xd1\xa1\xab\x03\xa3\x43\x69\x5a\x0b\x27\x2b\x56\xa3\x7e\x7c\x88\x82\x1b\x99\x71\xaf\xb3\x9c\xd1\x9c\x8b\x28\x1c\x15\x83\x06\xdf\x57\x21\xcd\xa2\xb4\xcc\xbf\x2a\xb9\x1a\xe5\xeb\xd8\xb2\x57\xd9\x9f\xb0\x09\x7b\xd7\xe5\xa9\xa1\x61\x95\xdc\xef\x55\x5b\xe6\xf5\x41\x4f\x0b\x7b\x1f\xfe\x0b\x05\xe5\x41\x5f\x15\x4f\xca\xe4\xc6\xb9\x97\x9f\xc4\x17\xac\x04\x72\x8f\xec\xfc\x1e\x3d\xec\xce\xd5\x2a\x2d\x6b\x38\xb9\x35\x97\x75\x1d\xad\x6a\xe5\x71\x0b\x09\x84\xcc\x13\x4b\xdf\x83\xab\xec\xa4\xce\x7c\x04\xd7\x60\x64\x91\x0f\xee\xf0\x75\x7b\xc3\x5e\x9b\x64\xac\x0e\xb0\x95\xf6\x8b\xd7\x5f\x24\x9c\xd8\x41\xc5\xb6\x4d\x58\x17\xea\x51\xa3\xeb\xb1\xbf\xa8\x57\x5c\x53\x5a\x6e\x47\x11\x30\x9c\x62\xd2\xba\x55\x5a\x8d\xa4\x92\xce\x76\xbc\xcd\x6f\xeb\xf0\x7f\x1f\xd9\xe5\x47\x84\x96\x15\x11\x72\x63\xc3\xe0\xfe\x13\xfb\xe9\xab\xa9\x2b\xe2\x68\x99\x12\xcf\x4d\xdb\x56\x9b\xed\x71\xf6\x8b\xce\x37\x56\xb5\x49\x8e\xc8\x78\xb5\xf8\xb4\x83\x36\xa4\xb2\x4f\xee\x66\x31\xf5\xc8\xc0\x99\x49\x5c\xda\x26\xfa\x82\xd0\x37\x00\x0a\xce\x5f\x22\x5b\xf8\xe0\x77\xe1\xd1\xe1\x6e\x2c\x24\x6d\xea\x2c\x84\xfd\x8a\xb6\x23\x8e\x97\xed\xef\x16\xcb\xf8\x62\xe9\x74\xb5\xfc\xee\xf3\x2d\xc7\xf6\xf3\x65\x1d\xdf\xf0\xcb\x59\xd2\x8c\x09\xfc\x74\xa5\x36\x34\xed\xe3\xd9\x6c\xcf\x4f\x72\x34\x74\xb6\xb4\x00\xb5\x33\x48\x76\x3e\xc1\x54\xf2\xda\x5a\x20\x06\xf0\x2b\xe3\xa3\x22\xca\xae\x15\x62\x56\x47\xab\xd3\xad\xc1\x73\xea\xc0\x7e\x2f\x99\x2a\x27\x70\x8c\xf8\xf3\x37\x5d\x44\x80\x88\xc3\x67\xbe\x0c\x43\x0a\xdc\x6e\x71\xac\xd5\xbe\x8f\xfb\xcf\xc5\x7a\x6f\xbe\xff\xd2\x9b\xc7\x27\xf4\xdc\x7c\xaf\xc1\xc3\xf7\x31\xaf\x9d\x38\x8b\xfa\xed\x09\x51\xe6\x82\xdc\x32\x1d\xb5\xa6\xbc\x47\x9e\xcf\xba\xc5\x62\x0d\xe2\x5a\x33\xb7\x60\xa2\xb9\x37\x68\xa3\x77\x24\xdc\x8a\x10\x87\x54\x42\x98\xca\xe4\x78\x7f\xdf\xfd\xe5\xf5\xad\x2a\xb0\x9b\xb4\xcc\xfc\xf1\x56\x6d\xa8\x51\x1b\x6e\x9e\x79\x3e\x7e\xd6\x41\x9a\xc2\x5a\x11\x4f\x44\xad\xf2\x94\x86\x5f\xa4\x2b\x8c\xf7\x5a\x2f\x40\x34\x99\x2a\x6e\x28\xa8\xe8\x81\x76\x04\x27\xb3\xab\xef\x58\x2c\x83\x34\x38\x3a\x52\x6d\x2f\x57\x2e\xa9\x2d\x8b\x7c\x18\xbe\x31\x59\xee\x9a\xe8\xd2\xd3\x07\xa2\xb2\xa3\x49\x15\xcd\x7c\xf8\xfc\x61\x93\xcb\x0b\x02\xfa\x0d\x9e\x25\x57\x64\x67\x5b\x3b\x55\x3b\xd6\x2e\x9e\x3f\xf0\x1b\x6a\x8e\xc1\x7a\x51\x6f\x87\xfd\xc8\x8f\xc7\x3d\xf7\x24\x33\x9f\xb5\xc5\x41\xae\x59\x58\x8a\x03\x81\x7e\xa5\xf6\xb5\xb9\xe8\x25\xc2\xdb\x87\x33\xaf\xdc\xb4\xac\x8d\x8d\x4e\x5e\x7f\x4b\x98\xa4\x54\x7e\x62\x94\xdf\xab\x58\x3f\xf0\x25\x7b\x38\x94\xe3\x9b\x56\xb4\x58\x8c\x6d\x88\x21\x53\xd8\xbd\xee\x59\x50\x33\x8d\x55\x1e\x9c\x3b\x11\x34\xc4\x36\xd7\x93\xc5\x6b\x4d\xdf\x6f\x32\xaa\x91\xc7\x40\x61\xd8\x1a\xd5\xcf\x8a\x19\x06\xbb\x17\xf7\x05\xa1\xc8\x3c\x2f\xa3\x46\x52\xd0\x67\xd3\xc7\x0f\x54\x2c\x81\x02\xab\xac\x79\x96\x0f\x4f\x29\x1c\xd7\x38\x61\xfd\xa6\xf8\x74\x61\x9c\x9c\x5f\x52\x16\x8d\xcd\xa4\xfa\x99\x22\x7d\xd3\x2e\x9b\x90\xf7\xcb\x76\x6d\xf6\xb3\x71\x06\x67\xf5\x9c\xf1\xe4\xff\x52\xe0\x7a\xb0\xc2\xfc\x39\x60\xfa\xdd\xf4\x16\x06\x33\x31\xe7\xd5\xbf\xaa\x08\x5f\x03\x69\x5e\xcd\x77\x91\x41\x32\xa6\x5c\x34\x91\x18\xb1\x3d\xd0\xf1\xd2\xba\xcc\xb8\x31\xc2\xc5\xed\x19\x3c\x9f\x67\x8a\x30\x5c\x94\x42\x1a\xcd\x87\x64\x26\x93\x60\x34\x88\x1a\xd8\xc6\x31\x40\x48\x02\x26\xc1\x9c\x97\x69\x11\x0c\x0c\xeb\xad\xf2\xde\xa6\xc6\x0c\xf3\x31\x4c\xb3\xa4\xaf\xfe\x7a\x91\x24\xb0\xd4\x0f\x19\x01\xa9\x00\xd6\xe3\xc8\xff\x5e\xfe\x89\xcf\x91\x19\x9d\x1d\x41\x8a\x2a\xe8\x23\x4f\xdf\x09\x00\x72\xe3\xc4\xed\x1c\xa3\x39\xc5\x6f\xd6\x61\x93\x6a\x5f\xdb\x1a\x16\xbd\xdf\x7e\x8b\xec\xec\xa7\xc8\xa4\xb7\xfa\x74\xaa\x92\xc8\xc9\x68\xe0\x1d\x29\x3a\x90\x9a\x57\x9e\x04\x52\x71\xa0\x96\x50\xe4\xe5\x75\xb4\xb1\x5e\x26\xd1\xfd\xb2\x56\x29\x45\x3e\xdf\xf9\x19\xe2\x44\x08\x57\x08\x87\xc2\x25\xad\x5a\xaf\xc2\xad\x1f\x1b\x03\xff\x15\x4b\xd1\xdc\x62\xfd\x60\xff\x2f\x01\x48\x96\x37\xb9\x7b\x53\xd2\xa6\xf5\xd4\x20\xe4\xa0\x17\xd2\x71\x2b\x66\xba\xec\x3b\x41\x02\x69\xd8\x6c\xe1\x35\xed\x01\x2e\x5d\x74\x53\xff\xbb\xa9\xff\x03\xe5\x88\x88\x15\x47\x25\x5b\x24\x90\x6d\x1b\x37\x1e\xe4\x73\xbd\x5b\x83\xcf\xb7\x16\x3a\x82\x81\x7b\x3e\x66\x43\xa1\x1a\xb8\x83\xb3\x76\x29\xac\xdd\xae\xbe\x4d\x63\x89\xf9\x90\x06\x44\xdb\xdd\x9c\x78\x31\xfe\xe5\x3d\x62\x11\xc8\x5a\xb5\x22\x42\x8f\xfc\x58\x41\x39\x1c\x28\xea\x66\x74\x30\x24\x1c\x32\xbf\x55\x59\x89\x73\x18\xc1\xae\x30\xbc\x7d\xb8\xe9\xb6\x2e\x6a\x6b\xd1\xd4\x9f\x8f\xcb\x1d\xb0\x14\x3d\x3b\x1d\x9f\x6a\x81\x53\xa3\xbd\x54\x7e\x47\x3f\x23\xa6\xef\x29\xe0\x30\x7f\xe8\xb7\x71\xb6\xee\x30\xa7\xc8\x5b\xb7\x7b\xac\x84\x2b\xfa\x02\xc9\xbe\x84\x61\x88\xff\x0a\x68\xf5\x12\xfa\xd5\xb7\x88\x7d\xbb\xb6\x9b\xe3\x66\xf8\x23\x20\x5d\xcb\xcb\x51\x14\x2a\x5b\x14\x2a\x57\x0e\x4b\x04\xe9\x0b\x61\x90\xe6\xbf\x5a\xe0\x27\xb3\xfa\xed\x56\xeb\x63\x2b\x7d\x37\xfb\x4d\x51\xa2\x70\x61\xc7\x5f\x6e\x4d\xd6\xcf\x9b\x53\xaa\x0a\xa2\x4e\x2e\x1a\x04\x81\x83\xf2\xc1\xa4\xcd\xe9\x8e\x3e\xf8\xba\x35\xf3\xbd\x1a\xd2\x7f\x95\x65\xd4\xc8\xe7\x8a\x67\x64\xd7\xb0\x48\x96\x84\x64\x4e\xca\x49\x44\xa1\xa1\x07\x5a\xb4\x3f\x07\x19\x24\x47\xe5\xa8\xbb\x93\x67\x1b\xae\x56\x0d\xbd\x77\x58\xc3\x3d\x5c\xa5\x2d\x7d\x13\xfb\xbe\x1a\xec\x2d\x09\xf9\xb6\x4f\x7c\x62\xb3\xd2\x1c\xb9\xf1\x58\xa6\x36\xf6\x05\xbe\x80\x07\xb7\x31\xa4\x5b\x31\xc8\x33\x7a\xd4\xef\x5d\x7f\xcc\x99\xd2\x34\x8b\x7d\x63\x70\x06\x25\x17\x15\x33\x2d\x74\xd6\x34\xff\x0c\x09\xff\x72\x5b\xb6\x69\xd2\x72\xcb\x1a\x53\x30\xb0\x95\xad\xcd\xa3\x01\xcd\x9e\x7f\x4d\x92\x5b\x69\x14\x49\x2e\x51\xe5\xb9\x80\x3b\x51\x86\xb0\x9e\x00\x1c\xe8\x03\x70\x0e\xff\x0a\x79\xfb\xc0\x48\x40\x1c\xef\xa5\x58\xd5\xa2\xf3\x01\xb4\x06\xc9\xe3\xc4\x27\x47\x39\xbd\x0b\xa7\xf8\xb9\x0a\xd8\xee\x46\x24\x0d\x05\x96\x9f\x1d\xc0\x5c\x45\xf3\xa1\xc1\xcf\x15\x57\x3d\x2e\x6e\x04\x8f\xfa\xd1\x50\xd5\x80\xda\x13\xfe\x1d\x0c\x32\x30\xb0\x3f\xfc\x94\x07\x39\x06\x11\x11\x37\x0c\x2f\xcf\xed\x2b\x9e\xd8\xa2\x01\xb1\x9d\x0a\xed\x75\xe9\x3d\x68\xde\x57\x53\x49\xba\x5d\x80\x5e\x2a\x2e\xce\x7a\xc5\xdd\x7a\x6a\xf6\x8a\x2c\xaa\x8e\x3a\x27\x85\xd8\x23\x5a\x4a\x07\x04\xb7\x7c\x64\xca\xa9\x67\x2c\x2d\x3f\xc6\xd3\xf2\x89\xd8\xca\xdc\xc3\x4a\x1c\xa5\xf7\x47\x38\xd2\x37\xfd\xa5\xfe\x21\x09\x42\x15\x42\x21\xd9\x64\xcb\x23\xb0\x97\x2d\x0a\x31\xcc\xdc\xbd\x15\x0c\xc8\xe9\x72\xb7\x66\x3a\x13\xdc\xc1\x41\x8e\xf9\x2f\xaa\x30\x1a\xe9\xd7\xff\x63\x58\x8c\x39\x21\x8b\x7f\xc4\x43\x7b\x6d\x56\xc6\xe8\x22\x43\xb4\xe0\xe7\xac\x08\xea\x6d\xbe\xb6\xd2\xbc\xb4\xb1\x47\x4f\xf0\x7e\x1e\x4d\x44\x9f\x44\xf0\x21\xef\x0f\x16\x37\x85\x1e\x26\x4e\x81\x80\x5f\x57\xe1\x94\x65\x6f\x11\x10\xdb\x27\xac\xa4\x1c\xfa\x70\x2a\xc6\x86\xee\x8d\xfc\x00\x2b\xb7\xaa\x14\x2f\x56\xee\x84\x73\x2f\xd5\x0d\xd4\xf5\x76\x61\xd1\x0d\x0c\x18\x90\xa2\xdf\x0b\x78\xc3\x97\x90\xca\x92\xec\xf1\x64\xb4\x24\x7c\xc8\xe5\xbe\x76\x11\x6a\xb0\xea\xea\x16\x51\x28\xf5\xfc\xd4\x2c\xd4\xc8\xdb\x0f\x62\x7c\x24\xf8\xcc\x29\xc8\x93\x78\x0f\x1f\x60\x48\xab\x0d\x81\x78\x9f\xa6\xe3\xb2\x0c\xb4\xb2\x4a\x06\x94\x42\x42\x56\xa2\x73\x56\x71\x17\x11\x59\x2f\xfb\xbd\x9c\x03\xcb\x93\x02\x6c\x14\x41\xeb\xc3\x1d\xde\x7d\x43\xa5\x66\xaa\x8c\x05\xbe\x00\x9b\x7b\x5c\xe5\x68\xab\x06\x14\x7f\xf4\x1e\x3b\x8a\xbc\x7f\x8f\xdd\x25\x26\xb6\xb0\xa3\x9e\x95\x93\x2c\xcd\x40\xd1\xde\x74\xfc\xf7\x22\x40\xb8\xdb\x5e\xc0\xc7\x41\xe8\xf5\x45\xa3\x0c\x1c\x63\x50\xa1\x3a\xbb\x62\xf8\xb9\x1f\x63\xa1\x0b\x6b\xfc\xce\x67\x1d\x74\x7a\x05\x46\xe2\x67\x4e\xd2\x88\xef\x37\xfe\x4a\x11\xb3\xf0\xbd\x55\x0d\xbe\x9b\xfe\xc3\xb9\x4d\x67\x9c\x0f\x11\xc4\x17\x21\x4b\xf6\xc3\x5d\x15\xe6\xf7\xc2\xbd\xee\xba\xdc\x05\x8b\xe2\x58\x20\xc0\x5c\xe2\x82\x5d\x1a\x8b\xdc\xf1\x0f\x6f\x3a\xec\xee\x20\xea\x71\x51\x87\x73\xaa\x15\x38\x42\x95\x0f\x76\x34\x09\xd0\xa2\x52\x85\xcc\xbc\x92\x62\x88\x58\x60\x4d\x80\x7d\xeb\x70\x23\xe9\x5e\x83\x60\x4d\x54\x56\x98\xf6\x08\x64\xde\xe2\xc2\x4d\xbe\x0d\xb2\xf3\xff\x2d\x7c\x23\xcf\x9c\x54\xec\x52\x2f\x07\x03\x63\xc6\x64\xc7\xc7\xbc\x39\x6d\xe1\x2d\xd4\x86\x9a\x2e\x5d\xce\x82\x8d\xdf\x01\x24\xcb\x16\xa4\x53\x13\x1c\x68\xcf\xf8\xdb\x2b\xc7\x5b\x36\x30\x76\x35\x3f\x5c\xcf\xcc\xc9\x19\xd8\x97\xa4\xb1\xe1\x30\x6f\x38\xf1\x27\xfc\xbf\x97\xaa\x8b\x34\x54\x95\xde\x47\x0f\xcd\x81\xa8\xbf\xb5\x15\xd7\xa8\x4b\xec\x8e\x6e\x04\x7a\xf8\x3c\x96\x2b\xb6\xd7\xd2\xa6\x63\xea\xe9\xbb\x5b\x9b\x69\xb6\xfe\x35\x29\x64\xe4\xc6\x50\x89\x99\x75\x50\x5c\xaa\x62\x21\x1e\x8d\x47\x22\x6f\xb6\xb5\x7d\x71\x45\xbb\xe9\x6a\x96\x86\x63\xa0\x04\x14\x8d\x2f\xef\xc0\xe4\x5d\xf3\xe5\x1a\xc1\x77\xa8\xca\xde\xda\x14\xad\x8d\x71\x3a\x87\x73\xa7\x84\xca\xb9\x43\x8c\x9e\xc9\x25\x12\xf3\xf5\x8f\x70\xfe\x74\xb3\x76\x5f\xa4\xf0\xac\x80\x8b\x99\xae\xbe\x7a\xcf\xcc\x60\x03\x3f\x91\x7d\xaf\x06\x64\xf0\x12\x12\x47\x3c\x38\xdd\x27\x70\x44\x0e\x54\xf0\xea\x49\x4f\xe2\xc8\x1c\xdb\xaf\x23\x7b\x81\xbb\x6b\x98\x82\x9c\x37\x46\xb5\xfd\x93\x9a\x6c\xc5\x88\x04\x0c\xd0\x8c\x75\xec\xa8\xed\xfb\xbf\xff\x0a\x78\x4f\x2d\x25\xb9\xb7\x8a\x92\x3a\x68\x90\xa9\x08\xe8\xac\xa0\x08\x56\x7d\x72\x88\x09\x5b\xbf\x51\xeb\x03\xbd\x67\x11\xfb\xd4\xae\x48\x32\x07\x96\xe6\x6c\x0b\x63\x6e\x31\xf8\xdc\xfe\xd9\xaf\xe2\xc0\x2b\xe7\x72\xf0\x52\xf3\x4c\x25\xd2\x17\xd4\xc1\xfc\xd1\xaf\xc9\xce\x43\x31\x20\x6d\x67\x55\x88\x43\x73\x0a\x4c\xa2\xf8\xda\x5f\x1f\x23\xe2\x3d\x90\xe8\xdc\x54\x8a\x87\x22\xce\x80\xef\x04\xbc\x93\x35\x25\xe1\x56\xf4\x94\xf6\xea\x59\x82\x81\xfb\x94\x92\xfd\x9f\xe1\x31\xae\x78\x3d\x13\x4c\x4a\x24\x62\xcb\xd2\x81\x0e\x08\x36\xe3\x5d\x40\xc8\x62\x28\xe7\x7a\x47\x30\xb2\x4f\x53\x7d\x09\x3b\x02\x96\x22\x83\xb5\xe5\x61\x5d\xb6\x3d\x5b\x0f\x4b\x72\xcf\xa2\x43\xa3\xe7\xec\xaf\x87\x2a\x5a\x2d\xaa\x24\xe8\x7d\xe4\x8a\xf5\xe9\x7d\xc9\xfe\x23\x29\xe7\xc2\xfd\x27\x49\x9e\x58\x6e\xc6\x9f\x3a\xa0\xad\xa0\x98\xe6\x27\xc0\xb0\x6e\xec\x18\x4a\xea\xba\x69\x1b\xb1\x4a\x07\xb9\x3c\xed\x14\x4f\x1a\x4d\xbe\x43\xc0\x85\x4b\x54\x43\x44\x0c\x55\x04\x13\xb9\xcc\xa5\x0b\x31\xec\x41\xec\xd2\x4e\x6b\x3b\xe2\x1d\x9f\xa1\xa7\x8d\x6d\x08\x7a\x0b\xae\x8f\xd7\x4c\xd7\x3b\xb2\x7b\x55\x98\xd3\x26\xc4\x17\x9b\x72\xe8\x81\x6a\x86\xc8\xc6\x37\xa1\x8e\xcd\x24\x7c\x41\x55\x4a\x9d\xe9\x4c\xba\x6f\xf6\xbd\xcd\xd5\x4f\xf7\x81\x9d\xa3\x3d\x9d\x78\x1d\xb0\x53\xc5\x77\xd9\x21\xf6\xc7\xb7\x60\xf7\xf7\x6c\xb7\xd7\xb6\xd1\xe5\x6d\xcf\xd3\xb8\x66\x0a\xbf\x28\x4f\xe1\x63\x19\x0e\xa2\x79\x8e\xb0\x1b\xb5\x49\xf5\x3f\x4c\x1c\xfd\x38\x84\x23\x04\xef\xc7\x7a\x34\xf6\x32\xef\xbe\x83\x36\xb1\xf0\x92\x3c\x64\x81\xdd\x9c\x6a\xfa\x59\xaf\x3d\x49\x69\x4a\x2e\x95\xc8\x06\x3d\x8e\x46\x92\x42\x8b\x97\x9b\x9b\xfd\x22\xe2\x28\xec\x2e\x54\xe7\x37\xd3\x48\x34\x87\xac\x65\x3a\x3f\x03\x1c\x4e\x85\x18\x27\x1c\xe1\xc9\xc8\xc0\x79\xd2\xa5\xfd\xc2\x6d\x8b\x9b\xed\x6b\x45\x50\x61\xe0\x27\x82\x96\xea\x29\xf1\xc6\x84\xd1\xac\x22\xba\x30\xa4\x54\xc7\x6b\xc7\x8a\x4e\x95\xa2\x3d\x0d\x18\x98\x9f\x1d\x20\xb7\xd0\x33\xe1\x54\x4d\x83\x3e\x9d\xa5\x3c\xad\x51\xd1\xb8\xfa\xc7\x0e\x1b\x06\x2a\x03\xce\x9b\x6a\x41\x2b\xeb\x27\x7f\xb5\x78\x99\x2b\x09\xb1\x77\x80\xdb\xf9\x16\x56\x57\x46\x27\x0a\xd5\x41\x34\xc1\x77\xe8\x7b\xee\x16\x44\x11\xd6\x7e\x38\x72\xc8\x47\xd2\x6b\xd9\x05\x4f\xba\x93\x9d\x14\x8c\x72\x26\x1f\xf3\xd4\x31\xfd\x42\xc6\xfe\x99\xa5\x47\x67\x9d\x0e\x1d\xed\xee\xd3\xa0\x09\x7f\x1a\xe6\x00\x63\xbe\xde\x8c\x12\x63\xa5\xb2\xb8\x1e\xff\x68\x8d\x83\xf4\xec\xdd\x31\x1d\x75\xfc\xc9\xc4\x0b\xe1\x74\x54\xef\xb8\x91\x2a\x98\x34\x0c\xca\x9a\x06\xdc\xd9\xe9\xc5\xbe\x4e\xef\x08\x2b\x79\x87\x98\xf9\xaa\x7e\x3f\xf8\xaa\xe3\xf7\xe6\x18\x28\xdb\x2f\x79\xe5\x16\xed\x90\x9c\xc7\x79\xc6\xdf\x70\x4a\xc5\x9a\xc3\x93\x98\xe9\x7b\x4a\xd2\x3a\xa1\x1e\xa4\xd1\xdd\xfd\x9b\xc4\x40\xe9\xb3\x45\x99\x60\xbd\x1c\xe1\x13\x18\xf9\x48\x10\xb1\x43\xc4\x2d\xdc\x96\xce\xb2\x41\x24\xe9\x04\xd4\xec\x59\x25\xd7\xb5\x91\x90\x5c\xff\xa1\x8d\x57\x57\x2b\xf0\x6e\x3a\x7f\xba\x94\x07\xdb\x01\x2e\x64\x45\x81\xb0\xdb\x68\x04\xe0\xf5\x33\x8a\x40\x62\xbd\x19\x8f\x0a\x59\x1e\x46\x00\xe3\x22\xce\x32\x82\x49\xdd\xd5\xd2\xaa\x75\x15\xf6\x5e\x56\xfe\x55\xb9\xfc\x3a\xbf\xce\x27\x9c\x3e\x42\x60\x85\xdf\x6a\x23\x08\x20\x64\x84\x10\x16\x5a\xb8\x4d\xc8\x05\x5e\xa4\x0e\xc8\x0c\x59\xb1\xe7\xc5\x79\x7e\x1d\x48\xe9\xa4\x41\x82\xb7\xcc\xb9\xe8\x26\x1a\x22\x26\x80\x7e\x99\x48\x3e\xe2\xdd\x87\x13\x8a\x6e\x7c\x8d\x93\x88\xbb\x41\xb3\x88\xe6\x77\x6a\xdb\x19\x26\x48\x3d\xcb\x2b\x54\xbf\x2a\xde\x46\xee\xea\x79\x40\xf5\xaa\x31\x56\xba\x56\x49\x14\xdc\x6b\x12\xa6\x43\x4c\xbd\xc0\xd4\x75\x69\x7c\x94\xdf\x11\x66\x2d\x08\xa4\xc1\x5a\x47\x7f\x92\x5b\xa7\x35\xe4\x3f\x96\xc4\x76\x6b\xeb\xa2\xeb\x01\x18\x8a\x50\xb5\x4b\x68\xde\xd7\xf1\x8c\x49\x08\xd4\x5b\x7e\xd3\x16\xbb\xbd\xbd\x4f\x27\x03\x93\xae\xb2\xec\x2f\x50\xa3\x8b\x5d\x0c\x30\xab\x53\x71\x58\x9b\x40\x23\x74\x9c\x6c\x4d\x22\x2f\xbf\x13\x8f\xa9\xcb\x2f\x9d\x84\xd7\xa4\x19\x4b\x96\x69\x83\xd5\x90\x2c\x25\xcf\x5f\xa0\xe5\x42\xa2\x7e\xf8\x60\xe8\x18\x85\xa3\x25\x6d\xb1\x86\x39\x60\xb7\x4f\x4b\xbc\xb1\xc3\xd2\x73\x5e\xc9\xca\x9a\x6e\xd1\xb2\x4a\x98\x37\x67\x45\x4f\xbc\xaa\x10\x8f\x57\xf8\xd2\x7a\x6a\x56\x11\xe8\x15\x5c\xb6\xf3\xa6\x95\xef\x99\x2f\xb5\x36\xbd\xc8\x2b\xe8\xc6\x27\x3e\x1e\xf9\x47\x48\x14\xf6\xb5\xd2\xac\xf0\x50\x92\x5c\x1b\x20\x31\x77\xdc\xc7\x26\xe9\x37\xa4\xdb\xeb\x6e\xc7\x35\x71\x5a\x9f\x7e\x3c\x5c\x79\x9c\x74\x5f\x05\x5e\x80\x9b\xe8\x33\x70\x6a\x31\x82\xfa\x49\xf2\x5f\x95\x55\x6e\x0d\xca\xfb\xd2\x4c\x29\x86\xbb\x7f\xc8\xe7\x85\xf9\xa8\x89\x74\xc1\x35\x3a\xef\x3e\x1c\xa1\x0f\x36\x24\x73\x55\x84\x89\x2c\x20\xff\xd2\x2f\xaf\x6b\x8c\xc9\x04\xfd\xcc\xa6\x50\xbe\x4f\x39\x45\x7e\x37\xf5\xc7\x23\x1b\x42\x90\xb6\x94\xa2\x6a\x77\x1a\x5b\x96\xf1\x97\x39\x39\xfe\xc0\xa9\x71\x89\x59\xf7\x13\xfb\xcc\x49\x46\xb6\x75\xfe\xe2\xc7\xc2\xcf\x8d\x96\xe0\xf0\xc0\xf1\xbb\x67\x39\xb5\xe5\xe6\x85\x42\xc0\x1c\xa5\x51\x16\x7d\x65\x38\xea\x2d\x04\x2b\xec\xdb\xca\x57\x86\x06\xf6\x4f\x1a\x0f\x12\x79\x67\xe0\x0c\xdb\x7d\xb4\x44\xc1\x45\x54\x51\x78\x87\x39\x54\x7d\x2b\x1d\x03\x6c\x6e\xfe\x9d\xe4\x75\xa7\x70\x3e\x19\x58\xf5\x38\x38\xd5\x71\xff\xee\x8e\x08\xf7\xc7\x5e\xab\xf2\x10\x52\xc1\x9e\xdc\x9b\xba\x28\x22\xa9\xab\xcd\xc8\x66\xfb\x51\x14\x73\x1a\x24\x87\xbd\x75\x5b\xd0\x69\xd8\x9b\xab\xef\xed\x6f\x24\xa8\x89\xba\x3b\x0e\xdb\x80\xe1\x55\xce\x3b\xa5\xf0\x78\xec\x35\x35\xfb\xe4\xdd\x4b\xfa\x8f\xcb\x1f\xde\x6d\x03\x84\xa7\xfa\xcf\xdd\x18\x80\xa8\x8a\x4b\xec\x28\x0f\x72\x20\xfc\xfe\xf4\x44\x86\x07\x01\x30\x21\x60\xe9\x08\x73\xb2\xab\x04\x52\x75\xe9\x8e\xd8\xc1\xe7\x0e\xc1\xb4\x7d\x10\x3b\x15\x52\x66\x97\x36\xa8\xe4\xf7\x54\x2f\xd4\xad\x23\x73\x15\x97\x00\xaf\xf2\x7c\x8a\x10\x71\x0f\x81\x0e\x14\x9a\xf0\x82\x21\xe1\x0b\xbc\x5a\x78\x11\x30\xea\x80\x22\xfe\xf6\x89\xe1\x7e\xbb\xb8\x6c\x5f\x1a\x51\x92\xd6\xe9\x76\x83\x89\xd8\xc6\xf8\xc0\xb5\x89\x5b\xad\xd6\xfa\x91\xd0\x72\x52\x61\xb8\x35\xe1\x0b\x62\x90\x78\xa3\x7d\xab\x8f\x36\x31\x13\x09\xef\xef\x2a\x27\x12\xb0\x25\xd8\x73\xb9\xa8\xcd\x21\x2b\xf0\xdf\xfd\x9e\xb2\x6b\x98\x37\x19\x52\x77\x83\x44\x51\xb7\x23\x91\xf3\x23\x98\xf1\x2f\xc2\xfa\xfe\xea\xef\xe4\xf3\x3b\x90\x6c\xdd\x63\x8c\xd1\xbb\xdf\x86\x25\xe8\xde\xd6\x83\x69\xde\x2e\xa7\xce\x49\x54\x77\x18\x04\x47\x49\x04\x5f\xe0\x16\x73\xdc\x35\xbb\xf1\xbb\x44\x6d\xa2\xb9\x4a\x79\xd0\x81\x56\xb7\x2a\xee\x50\xbf\x70\x9f\x07\x0f\xcf\x67\x8d\x2d\xd2\xca\xcb\xfe\xe6\xbc\xd1\xeb\x71\x67\x59\xca\x91\x84\x61\xe1\x6c\x16\xb3\x60\x96\x01\xe9\x48\x0f\x5a\x08\x1c\xe4\x1a\x65\xd8\x92\xd1\x75\x82\xaa\xf2\x87\x33\x39\x48\xb9\x3c\x40\x17\x21\x8c\xcf\x90\xd4\x60\x11\x85\xf3\x5d\xdf\xa6\xf9\x04\xd0\xb4\xb4\x3f\x65\x8b\xbb\xae\x59\x16\xa7\x6f\xcb\x54\x14\x43\x00\xe7\x18\x07\x8a\x2e\x4f\xea\x60\x5d\xfe\x10\xec\x76\xb2\x4c\x42\x30\xf6\xe6\x77\x4c\x97\x36\x99\x16\xc9\x7e\x03\x4d\x2a\x91\x34\x76\xa3\xf0\x49\xd6\x63\x14\x78\x08\x83\x38\x1c\x38\xff\x64\xf6\x62\x6f\x8c\xf6\x38\x7f\x43\xc1\x19\x2d\x9d\x67\x80\x39\x69\xb8\x2e\x73\x98\x5b\x43\xae\xa0\x3d\xc7\x7e\xd5\xa2\x44\x7d\xf2\x97\xce\x4f\x88\x94\xdf\x0d\xed\x3e\xaf\xdb\x76\xf0\x97\xf2\xf1\xec\x36\x9d\x49\x4f\x29\x41\x10\x18\x23\x2a\x68\x14\xb4\x6b\x77\x5c\x0b\x7a\xb5\x9a\x52\xb3\xfc\x66\x9b\x2c\x77\xc1\x12\x36\x74\x6b\x98\x77\xd8\xed\x06\xec\x5b\xe3\x97\xfd\x3e\xca\xd3\x07\x6d\x7b\xb3\x81\xb1\xed\xbd\x51\x91\x77\x7b\xc6\x4a\x7e\xdb\x53\x4b\x96\xa4\x3f\x51\x3d\x23\x3f\x3a\xc4\xb4\xdb\x67\x4c\xdc\x13\xb7\xfc\xee\x65\x40\x64\x77\x2a\x33\x63\x63\x20\x93\xe1\x36\xc8\x46\xce\xeb\x0f\xf1\x93\xc5\x82\x5a\xfb\xf5\x27\xfa\x48\xc1\xd7\xe3\x63\x58\xfc\x8e\xe2\x74\x2f\xb9\x45\x7d\xda\x55\xc7\x56\xed\xe0\x86\xe4\x86\x0a\xfc\xa7\x5a\x95\x43\xf1\x97\xd9\x51\xd9\xbd\x08\x16\x0e\x4b\x51\xa2\x7f\x2e\x45\xe5\x4d\x78\x36\x8f\xe0\x30\x1d\x95\x97\x3d\x44\xef\x07\x41\x85\xf1\x10\xd4\x89\x05\x6f\xff\x71\x49\x43\x54\x50\xf6\x1e\xd5\x67\x5a\x78\xe3\xb5\xb1\x8a\xbd\xd5\x9d\x5f\x65\x79\xf8\xd7\x91\x43\x02\x61\x7c\xea\x66\x39\xf8\x4e\xac\x05\x4f\xc9\xec\xad\x76\xe9\x25\x16\xb1\x3b\x53\x54\xd2\x2b\x2b\x30\xc9\x2e\x52\x87\x11\xfa\xda\xe4\xbe\xfd\x72\x33\x1f\x3b\x9d\xfa\xc6\xb4\xdf\xe1\xfc\xb5\x09\x05\xea\x13\x0c\x57\x65\xf6\x71\xea\x28\x3b\x82\x19\xdb\xd5\xe3\x4f\xca\xa6\xf0\x50\xdc\xf8\xe4\xe4\x74\xca\xfb\xa6\xe7\x2f\xfa\x26\x77\x4a\xd9\x65\xd3\x16\x3e\xa7\x91\x1c\x5d\x42\x71\xee\x37\x06\x1b\xb1\x49\x26\x78\x57\x8e\x3c\x10\x78\x6f\xe8\x50\xf9\x88\x1c\xe7\x59\x07\x7c\xe4\xc9\xe4\xb2\x6b\x9e\x55\x35\x6e\x89\x2b\x0f\x0d\x4f\x94\x31\xa3\xed\xdc\xee\x82\xf1\xf0\x21\x7d\x9c\x59\x82\x57\xc1\x96\xa6\xcb\x50\x84\xc7\xc2\x03\x24\xd2\xf9\xa8\x70\x55\xcb\x7c\xd0\xec\xd6\x9a\x03\xe5\x31\xef\x20\xac\x8a\x89\x7a\x2f\xa5\x72\xc5\x40\xb2\x3d\x32\xb5\x41\x4a\x55\xfb\xef\x36\xac\xb8\x48\xc8\x08\x4c\xda\x9a\x80\x90\x13\xa9\xaa\x34\xcb\x80\x56\x3b\x87\x5b\x55\xec\x32\xec\xd6\x38\xf5\xbc\xb7\x60\x6b\xff\x94\x20\xd0\x4a\xf1\xb4\xeb\xef\xae\xd3\x08\x14\x58\x96\x68\xfb\x87\x8e\xb6\x97\x4c\x20\x31\x91\xba\xc8\x05\x38\xe0\x42\xa5\x62\x72\xd5\x6c\xf3\xd6\xa6\x61\xb7\x10\x3b\x3a\x85\x1b\xce\x59\xd8\x2d\xd2\x1c\x48\x05\xb4\x67\xea\x0e\x38\x53\xd6\x50\x7a\x8a\x50\x84\x29\x8d\x3c\xbb\x06\x3d\x89\x91\xee\x6d\xc8\x3a\x72\xa7\x86\x48\x71\x3e\x5b\x64\xde\xa9\xc1\xa6\xef\x6c\x3c\xcc\x52\x0b\x2b\x7e\x3a\xd0\xf4\x2c\x9c\x27\x3d\x19\xdf\xcb\xdb\x09\xf3\xd4\x80\xd8\x6d\xa3\xdc\x28\x57\xc1\xd6\x27\x02\xc0\x7a\x44\xad\xb9\x84\x87\x05\x68\x11\x9c\x09\x15\x69\x59\x40\xce\xa4\x5c\x20\x0b\x8f\x94\x7d\xf7\xd1\xca\xa9\xbe\x2a\xf5\xbf\xce\x41\x92\x25\x6b\x76\x89\xb4\x0f\x4f\x63\xe2\xf9\x37\x25\x19\x56\x61\xa5\x00\x18\xd1\xd5\x7c\x75\xec\x25\xac\x33\xfc\xd6\x0b\x6b\x40\x0a\xd9\x7f\xce\x19\xf8\x88\x8a\xc2\x23\x3a\xa9\xae\x46\x4c\x4e\x07\x97\x78\x2a\x0a\x69\x16\x82\x0c\x45\x39\xd7\x76\xb0\xe4\xe5\x02\x3f\xf7\xe3\xbe\x59\x10\xbf\x07\x60\xbf\xaa\xd4\x02\x74\x8f\x69\x91\x96\x4c\xa5\x7c\xc7\xfd\x8e\x72\x52\x70\x12\x18\x07\xb4\x95\x78\x15\x1e\x61\x6e\x4b\xed\x37\xca\xbd\xcd\x1b\xed\xfb\x2a\xd1\xaf\x2b\xa9\xde\xba\x30\x2b\x73\xc6\x8c\x1d\x67\xbd\xb4\xad\x8b\xfc\x73\x4f\xf7\x9d\x52\x30\xc0\xba\x87\x91\xc7\xfd\x69\x64\x5b\x44\xaa\x86\x37\xcc\x27\xa8\x09\xdf\xa8\x2a\xd1\x65\xa6\x17\x29\x09\x22\xb8\xe5\x2d\x34\xf8\x2e\x11\x79\x38\x95\x2d\x30\xa1\x43\x41\xbe\xbb\x84\x32\x7b\xdb\xb7\xf7\x2a\xa4\x65\x21\xdc\xbf\xff\x3c\x01\x77\x2b\x0e\xfd\x4b\xe0\x5d\xcf\x13\x07\x76\xe6\x1f\x3f\x68\x9c\xdd\xa0\x62\x10\x0e\x20\x74\x56\x2e\x79\x95\xfa\xca\x8e\x3d\x22\x85\x6b\xa3\x52\xc0\x51\x3b\x29\x55\xa5\xcf\xd4\x60\x64\x99\x63\xe3\xd8\x3b\xb5\xfd\xc1\x91\x21\x4b\xc1\x93\xae\xf3\x16\x2d\x7c\x8d\x3b\x1b\xc0\x26\xe7\x5d\x1e\x31\x44\x5f\x1f\x1f\xd2\x02\x6e\xd2\x18\x21\xbf\x23\x2b\x65\x69\xa2\x34\xb7\x98\xf4\x53\x12\x61\xec\x0f\x2a\x2e\x82\x03\xb7\x0b\x4b\x99\x33\x09\x45\x33\x55\xa0\xb3\x93\x5f\xd8\x55\xe6\xa7\x35\x7a\x3e\xf2\x9a\x3e\x67\x84\x9d\xdd\x67\x06\x50\xcc\xbb\xdf\x6a\x82\x00\x71\x06\x99\x54\xa0\x74\xd5\x00\x2d\x98\x77\xae\x0b\x92\x31\xfb\x92\xbe\x01\x84\xf2\x67\x3c\x8f\xea\x93\xde\xe7\x72\xc7\x5c\xef\x19\xac\xaf\xa7\x70\x9b\xc0\x8a\x20\xf9\xa5\x47\xa2\x95\xce\x32\xc9\x23\xc7\x7e\x80\xea\x86\x75\xa6\xbb\xa5\x52\xe0\x7b\xe6\x9f\x00\x78\xd4\xbd\x2d\x46\x4f\x2f\x8b\x66\xec\x9f\xf6\xb2\x8a\x9f\x6c\x87\xf7\x2d\x4f\x3a\x3b\x2b\x23\x0f\xc5\x27\x49\x9d\xdd\x00\x9a\x10\x2c\x6a\x59\xad\xc3\x3e\x97\x36\x63\x93\x2d\x4a\x07\xdd\x0d\x9d\x0b\xe6\x59\xca\xf1\x60\x3c\x7a\xf0\x3d\xcb\x4d\x8c\x5f\x56\x8a\x31\xac\x05\x1a\xc2\xf0\x54\x3d\x26\xe7\x6d\xbc\x41\x8f\x1c\x34\xa1\x26\x0d\x7d\xc7\x04\x11\x23\x5f\xea\x1f\x5e\xc1\xd8\x45\x51\x99\x5a\x4e\xad\x86\x75\xd5\xee\x3e\xc2\x9d\xaa\xd2\xe0\x20\x5f\x62\x54\x97\x1d\x67\xb7\x73\x15\xdd\x11\x2d\x8f\xe3\x4d\xb4\x13\x98\xc1\x0e\x57\x0c\xe5\xec\x88\x9c\x82\xfa\x06\xf7\x62\x21\xdc\xa0\x12\x78\x9d\x0a\x99\x4f\x58\x67\xc4\x93\x38\x93\xfc\x1c\xe1\x5a\xec\xdd\x20\xf2\x46\x39\x86\x3f\xe4\xbe\xf0\x33\xd5\x3f\xe8\x10\xab\x94\xf9\xa3\xa9\x9f\x8f\xb4\x33\x7f\x05\x93\x67\x19\xa8\xd8\x81\xfb\x24\x6d\xc4\xfe\x0c\xab\x33\xe9\xa4\x4d\xa0\x63\x53\x63\xb6\x95\xb8\xc3\xf5\x79\x14\xfa\x2c\x31\x3f\x93\x22\xa3\xf5\x7a\x5a\x21\xfc\x57\x5e\x62\xa2\x8e\x8b\xbe\xca\x0e\x59\xd9\x10\xad\xe9\xbf\xb8\x25\xfb\x12\x46\xe8\x9b\xd7\x71\x88\x8e\xd1\x30\x9f\x08\x20\x6f\x46\x78\x22\xea\x76\x8c\xf1\xf8\x52\x22\x11\x11\x34\xd6\x34\x2d\xba\x57\x45\xa9\x70\x22\x45\x84\x74\x58\x5d\xfb\x6e\x66\x0b\x1c\x43\xcf\x9b\x68\x2a\x08\x54\xcd\x91\xbe\x35\x67\xb2\x89\x6c\x2b\x79\x09\x98\x95\x3f\xf2\x1f\x36\x66\xd6\xc1\x1f\x3e\x80\x67\xba\x09\x99\x0d\x53\xef\xe5\x27\x38\xc5\x69\x4f\x7b\xef\x85\x79\xd7\xb6\x18\x73\x34\xa6\xa1\xc0\x9f\x42\x28\xe2\x9e\xb6\xfc\x37\x59\x5e\xfd\x54\x4a\x63\x25\x08\x0b\x33\x69\xc4\xbd\x3f\xdc\xba\x61\x54\xde\x51\xba\x11\xf7\x7e\xfb\x92\xd9\x5a\x5e\x09\xc8\xdf\x8c\x5d\xf1\xb3\x7a\xab\xfa\x6c\xee\x02\x3e\x7a\xf4\xaf\x08\xda\xa1\xd5\x00\x14\x5c\xe0\x5d\xd5\xa1\x6e\x7f\xee\xfd\x65\xaf\x6a\x15\x09\x55\xa7\xf7\x15\x0d\x14\xf4\x2f\x9c\xbc\xab\xae\xef\x2b\x77\x07\x58\x7c\xe1\x4a\xd6\x29\x9f\xdf\x41\x0e\xc4\x5c\x47\x83\x91\xab\x9f\xa4\xd6\x73\xd7\x23\x7a\xe1\xdd\x8b\xe0\xd0\x3b\x6f\x47\x0d\x57\x3d\x82\xaf\x8c\x81\x38\x92\x8c\x57\xef\xe5\x4d\xb3\x5a\xec\x28\x64\x71\x75\x25\x9a\xe0\x72\xd0\xae\x08\xe2\xee\x10\x2b\xba\x13\xa3\x6f\x1a\xb7\xb5\x0c\x97\x94\x87\x0b\xaf\x48\xa8\x14\xfc\x33\x9f\x9a\x66\xa2\x44\x65\x81\x5f\x9f\x6f\x0f\x53\xd1\x3d\xf5\x96\x76\x88\x1f\x84\x8e\xf7\x95\x4e\xf1\xda\xa8\x4f\x1c\xc4\x1a\x51\x1c\x1d\xb4\x34\xe2\xd5\x56\xbe\xb5\x57\x1c\xa3\x57\xf1\xf2\x01\x14\x24\xb7\xca\x68\x36\x48\x32\x7a\xdd\x73\xb0\xab\x5c\x00\xad\x3e\x37\xbc\xb1\xad\x72\x27\xd6\x44\x18\xe7\x0c\x9f\xd6\x73\x0b\x67\xa0\x53\x9b\x4d\x78\xec\x63\x90\x76\x35\x4f\x1e\x38\xf0\xe2\x31\xbf\x4a\x10\x04\xc2\xab\xe6\xb4\xf7\xf4\xb5\x45\x01\x71\x45\x05\x51\xcf\x9f\x09\xa3\x27\x3c\x70\x26\x84\x29\xa3\x2c\x0d\x78\x05\x1c\xe1\x59\x77\x20\x5e\x50\x69\x69\xa4\x86\xd8\xe6\x13\x41\x60\x3b\xf9\x24\x56\xda\xfd\x8a\x82\x3d\x38\x6d\xfe\xd4\x59\x63\xef\xc8\xde\xf3\xaf\x04\xe9\x57\x1d\x76\xe2\x1e\x24\x58\x64\xbd\xc9\x07\x5c\x1b\x98\xbd\xc2\x7a\x87\x75\x41\x38\xe7\xdb\x76\xa3\xf7\x09\xb6\x94\x94\x3b\xd8\x13\x73\x2a\xae\xc4\x98\x55\x93\x4f\x2f\x06\xca\xbe\x8b\xda\x38\x6b\x17\x21\x9b\xca\x6a\x37\x2f\x6d\xbd\x0e\xf0\x32\x6e\xce\xad\xea\x87\xe7\x11\xbb\x64\x30\x53\xed\x81\x05\x52\x51\x55\x8d\x6e\x87\xfc\x82\x03\x72\x36\x72\x0c\x28\xf0\x9a\x6a\x9e\x4f\x9a\xd5\x4e\xf9\x56\x5f\xbd\x48\x9c\x3c\xe5\x5f\x7c\x04\xc2\x20\x63\x1f\x21\xdf\x7f\x62\x35\xe3\x15\x02\x6b\x4e\xbb\x97\x7d\x47\xa8\x43\x27\xfb\x4b\xdc\xde\xe4\xd1\xc3\x56\x85\xab\x8e\x5b\x89\x5c\x9a\xc7\xb0\x1d\x1a\x3d\x28\xfb\x11\x9e\xe6\xfe\xe2\xc0\x57\xb9\xd0\xe4\x48\x4c\xca\x24\xad\x6c\x8e\x14\x9e\x2c\x28\x2f\xb7\x14\x65\xa6\x98\x73\xc4\x36\xdc\x3d\x4d\x48\x07\xbd\x8c\x83\x1d\x28\x7c\x51\x3c\x10\xa8\x17\xb1\xac\x05\x62\x82\xc8\xa7\x71\xcd\x7d\x8a\x8e\x70\x34\x8b\x9d\xfe\x28\x1a\x2e\xf5\x07\x3b\xf3\x6a\x07\x95\x3c\x17\x91\xd1\x25\x9b\xb4\x25\xfe\x16\xb4\x51\xca\x01\xee\xe3\x64\xef\x93\x20\xcd\x3e\xb9\x7f\x0d\x3b\x07\x3b\xdd\x7f\xfa\xd0\xf2\x4f\x70\x00\x44\x32\x67\x18\x68\x89\x5b\x4f\x98\x4d\x56\x38\x2d\x8e\x28\x85\xb1\x9f\xed\x53\x21\x53\x61\x5a\x4a\x57\x83\xdb\x8f\x12\x4f\x13\xa2\x2c\x8f\x26\xc9\x67\x7c\x40\x8e\x5d\x89\xc6\x1c\x48\x2a\x0a\x36\xd1\x81\x58\x1d\x02\x84\x80\x11\xa9\x50\x85\x4f\x38\x6f\x9f\x2f\x5a\x36\xa6\x61\xbf\x6d\xab\xd2\xfe\x85\x3e\xa5\xa8\x51\xb1\xba\xad\x70\x4c\x74\x5e\x71\x2b\xdb\xed\x11\x34\x69\x8c\xf9\x14\x8c\x5e\x44\x70\x7b\x01\xbd\x77\xb4\xcb\x56\x4a\xeb\x77\xad\x7d\x63\x30\x79\x4d\x44\x5a\x98\xe0\x6f\xfb\xec\x16\x38\x78\xfc\xc0\x73\x97\x4d\x31\xd8\xc8\xda\x8e\x68\x4f\x9c\x89\x75\x3e\xfe\x9f\x6c\x09\x7d\x91\x0a\x8d\x2c\x6e\x9f\x18\x03\x6c\x38\x78\x4a\x1c\x35\x24\x28\x47\xe1\x18\xd5\x76\x34\x9d\x25\x47\xb4\xac\x18\x39\x04\x17\x3b\x0d\xb4\xbc\x2e\x4a\x1a\xdc\xc3\x6a\x74\xff\xff\x65\xbf\x50\x18\xb8\x67\x6b\x5d\x19\x46\xb3\x63\x97\x20\xf4\xb0\xb9\x76\x0c\xa1\x43\xf4\x23\x73\xb6\x68\x48\xb6\xef\x63\xbc\x0b\xad\xa5\x6a\x78\xdf\xab\x0d\x94\x71\xa1\x32\x7f\xec\x28\x91\x29\xd6\xda\xfb\x8b\xa4\xd9\x71\xf8\x70\xa0\x48\x22\xad\xf4\x66\xc4\xc8\x61\xf5\x11\xa9\xd7\x47\x1f\xf1\x23\xdb\xcf\xa4\x7a\x4d\x1c\xc0\x02\x56\xf5\x9a\xe9\x1e\xb8\x23\x2d\x95\xfa\xdb\x42\x47\x58\x17\xe6\xaa\x3a\x5b\xec\xfe\xd4\xb7\xdb\xd6\xa6\x6c\x7f\xbd\xb6\x0b\x94\x63\x51\x18\xdd\x0b\x03\x2e\x62\xca\x3f\x33\xc8\x4c\x9c\xee\xf3\xfa\xe5\x9a\x7c\x2a\x39\xdb\xcb\x53\xbc\x1b\xf8\x4c\xb2\x67\x51\xd4\xd0\x58\x5b\x1b\x53\x6f\xfb\xfd\xbe\x5d\x2d\x81\x50\x8f\x0a\xcd\xc8\x92\xca\xc2\x1e\x91\xe4\x58\x7b\x73\x7e\x0c\x6e\xb0\x2e\x7c\xf5\x17\xa2\xdf\xe7\xf2\xf1\x3b\x1a\xde\x3d\x92\xcc\x05\x0b\xe2\xc9\x49\x61\x3e\x9b\xeb\x5a\xf6\x9a\xe4\xd0\xc0\xba\x9c\x94\xfe\x4a\x4d\xd7\xfc\x06\xc0\xad\x51\x33\xb4\x84\xfe\xe1\xa5\x46\x76\x48\x41\xef\x8e\xda\x65\x51\x02\x0d\xb9\x54\x42\x35\x5e\x6d\x75\x34\xef\x3d\x37\xf2\x51\x7e\xd9\x19\x29\x80\xae\x0e\x1e\x89\x26\x8a\xc1\x7a\x47\x56\xa7\xbd\x60\x82\x2f\x22\x86\xc7\x97\xd2\x89\x5a\x89\xb3\x09\x8d\x86\x64\xfd\x4c\xb2\x74\x0c\x46\x6b\x67\xad\xe2\x25\x7a\xec\x36\x6b\xa4\x90\xe8\xa5\xe9\xbd\xa9\x26\x68\x18\x2b\x0b\x77\x44\xd5\x47\xac\x23\x66\xab\x88\xbb\xe6\x03\xdf\x4d\xbf\xea\xb6\x7c\x3b\x15\xf6\x85\xa9\x11\x77\x85\x13\xbf\x9e\x5c\xac\x2d\xaa\x9e\x57\x1a\xb6\x44\x4b\xc0\x77\xe4\xcd\xc0\x89\xe9\xe0\x22\x70\x8c\x0b\x73\x7a\x61\x9b\x99\xf4\x8d\x2b\x2d\xbf\x9c\x3e\x50\xcd\xc1\x0c\x24\x7c\xf9\x96\x36\xfe\xdd\xa4\x7f\x17\x1c\x36\x7d\x11\x3e\x0f\x57\xea\x62\xda\x76\xb7\x04\xcc\x88\xd4\x25\xa6\x77\x96\x10\xa1\xc3\xf5\x78\x67\x8d\x54\x9e\x31\x06\x87\xae\x5f\x44\xf3\x60\xb7\x27\xaa\x16\x09\xa3\x70\xf8\x75\x84\x2b\xda\x71\xc7\xeb\x75\x54\x46\x71\x1d\x31\x20\xa3\xdb\x93\x0f\x1b\xf2\x44\x9d\xa0\x02\x7f\xed\x84\xf0\x9f\x86\x82\xe4\x57\x53\xed\xcd\x5e\x6a\x5f\x04\xea\x60\xa6\xa7\x32\x48\x67\x40\xfd\xbf\xbe\x29\xf5\x9f\x64\x12\x2b\x4c\xa8\x4d\x23\x47\x33\x6b\x28\xb0\x05\x5c\x82\xdd\xa9\x85\x53\x55\x34\x78\x8a\xbf\xa9\x03\x8d\xf3\xd7\xf2\x49\x01\x9c\x04\x30\xbb\xe6\x2e\xcc\x15\x41\xc1\x94\x9f\x22\x86\xb1\xdc\xa2\xec\x56\xa2\xfd\xc4\x72\x33\xf6\x6f\xa9\xaf\x48\x82\x6f\xa4\x1a\x05\xc0\x63\x1f\x3a\xc3\x29\x65\x18\xb4\x09\xbd\xb4\x2f\xfd\xb3\x45\xf5\xe1\xf6\xe9\xf6\x13\x41\xf2\xdc\x6b\x51\x72\x39\x50\xde\xd0\x66\x69\x3c\xe7\xa3\xfc\xbb\x2b\x89\xf6\xc2\x48\x3d\xf3\x5d\x2b\x6c\x8e\xe7\xd4\x7f\x23\xbb\x09\x00\x4c\x58\xb1\x48\xaa\x88\x6c\xa8\xb0\xcc\x08\x71\xef\xd8\x58\x35\x57\x88\xae\x50\x62\x4d\x51\x62\x3d\xc3\x93\xe5\xe5\xe6\x42\x4f\x84\x4a\xf9\x23\xcd\x24\xc0\x4a\x73\xfb\x03\x6b\xbd\x65\x5d\xfd\xd4\x3b\xf5\x84\x51\x5f\x6c\x4c\x4f\x7b\xae\xcd\xc2\x93\x43\x6e\x87\x61\xdd\x3a\x63\x95\xa0\x23\x0f\x63\xbb\x2b\x72\xe3\x46\xfe\x42\x7f\x6e\x04\xf8\x90\x09\xfa\xe1\xa0\x71\x79\xe5\xde\xba\x2c\x16\x53\x7e\x3c\x80\xcf\x11\x29\x34\x8d\x0b\x53\xaf\xeb\x88\x41\xff\x99\x5e\x51\x22\xb5\x64\x1a\xdb\xa1\xc2\xc0\x78\x8f\xaa\x69\x0d\x7a\xe8\xf2\x54\x60\x1f\xbd\xea\x90\xbf\x79\xcb\x17\x9f\xd1\xd9\x00\x80\xec\x1d\xf4\xa3\x0b\xf8\xec\xbb\x95\x48\xe9\xd2\x46\x77\xcc\x0d\x0a\xf3\x58\xe2\xc6\xaf\xf9\x63\x5a\x11\xc5\x62\x44\x7e\x76\xdf\xbf\x90\x8c\xe3\xcf\xe3\xa3\xc8\xa0\x8f\x6f\xcc\x4e\xe3\x8f\x17\xd2\xae\x41\xc1\x40\xf6\x94\xac\x5e\xf1\x69\x39\xf3\x74\xdf\xd0\x8c\xcb\xde\x00\x45\xe8\xc6\x6d\x47\x2a\x30\x46\xa6\xf0\xc6\xb0\xdd\xe4\x08\x2a\xff\x1e\x5e\xb4\x4b\x93\xb9\x03\x10\x61\x88\xe7\x14\x57\xd9\x99\xed\x96\x2e\x22\xc4\x9c\xc9\xdb\xee\x63\xfa\xac\x82\x5b\xbd\x9b\xc6\x6c\x90\x33\x90\x85\xc2\x5d\x6b\x6c\x0e\x82\xa6\xe9\x8a\x19\x08\x08\x99\x3a\x60\xf7\x44\x3b\x49\x20\xa6\x21\x0c\x16\x6f\xc6\xae\x2b\x6a\x74\x37\x36\x2d\x6b\x30\xeb\x3c\x88\x2e\x29\xac\xa3\xf7\xa1\xce\xea\x94\x54\x61\xa5\xe1\x4f\x88\xab\x44\xa4\xec\x2e\x07\x25\x5b\x9d\xf2\x2a\x9b\xc5\x55\xa7\xf9\x9a\xac\x6d\x91\xd0\x40\x57\xe5\x72\xef\xd1\x1b\x09\x40\xf1\x27\x2a\x78\x79\xba\xb7\x33\xac\x02\xbc\x3e\x0c\xef\x1f\x40\x26\xdf\x9e\xad\xca\xc4\x6e\x1d\xfc\x57\x5e\x7b\xc8\x35\x8f\x69\x22\xf7\xef\x09\xb6\xfb\x4a\x88\xc9\x63\xf8\x2e\x64\x65\x83\x30\x22\xa6\x0d\xf7\x2f\x8c\xe6\x1d\x06\xb1\xa2\x91\x45\x88\xd5\x50\x72\x05\x07\xe8\xc5\x9b\x6e\x0c\x6b\x1f\xbb\xba\x07\x71\x73\x14\xb1\x37\x36\x44\x62\x94\x73\xe9\xf3\xf8\x24\xc2\xac\xb9\xf5\x77\x4f\x18\x15\xea\xa6\xfe\xef\x3f\x7f\x38\x27\x91\xe5\x90\x3f\xfe\x20\x57\xce\xef\x5d\x18\x2b\x33\x17\xf3\x45\xcc\x28\xab\xb8\xce\xcb\xdc\x6c\x71\x04\x25\x0f\xf7\xa1\xd2\x44\xcc\x64\xfb\x8d\xe7\xcc\x3b\x74\x88\x81\xc4\xe0\x48\xb5\x2f\x14\x54\x31\xe4\x75\xe7\x24\xd4\xfa\x57\x6d\x00\xb6\x47\xf2\x6b\xe8\x95\x30\xb0\xd1\x18\x00\x7f\xbb\x7c\xd9\xe5\xd9\x5d\xe2\xae\x05\x3b\xb2\xb8\xe2\xac\xa7\xda\x22\x09\x47\x7e\xa3\x56\xf5\x08\xfc\x9d\x02\xaf\xc5\x30\x21\x0a\x19\xd6\x34\xdb\x6f\x4d\x56\x9d\x13\x8e\x84\xf2\x6c\x41\x8f\x3d\x22\x44\xbb\xab\xb0\x76\x52\x7b\xb4\xdc\x61\x64\xd9\x2d\xce\x8c\x13\x57\x21\x2b\x11\x32\x7d\xa4\xbb\x00\x51\xfb\xe1\x54\xb9\xfb\x4f\x69\xda\x33\x0f\x8b\xa4\x77\x52\x49\x2f\xdf\xbb\x91\x46\x29\xfa\xe1\x35\xf2\x65\x65\xf8\x3e\x6a\xd7\x98\x29\x60\x05\x34\xb2\xec\x70\xd2\x72\xf5\xed\x6c\xc3\x1f\x5b\x36\x0c\xa9\xce\x6b\xa4\x3b\xee\x5b\xe4\x6a\x40\x41\x8a\x45\x3b\x54\x80\xdb\xdb\x23\x8d\x6a\x2a\xc2\x6f\xaf\x36\xde\x53\x2a\x93\x76\x2a\xab\x5d\xa2\xa1\x97\xd3\x01\x19\x46\xc0\x80\x7d\xe6\xa4\x4a\xc6\x57\x25\x98\x20\xe7\xde\xd4\xa7\x7b\xe2\x9d\x7b\xda\xc9\xed\xe1\x85\xbe\xf6\x5f\xb4\x48\xda\x79\x4e\xc7\xa7\x45\xb2\xc3\xa9\x49\xbf\xcf\x4e\x36\xfd\x3a\x68\x78\xe5\x4c\x08\xc3\xcf\xf3\xd2\xb1\x7c\x04\x60\x73\x4c\x6c\xe4\x31\xb3\x23\x17\xa9\x6c\xf2\x1a\x62\x60\x9f\x1f\x90\x7b\x18\x49\x38\x35\xc2\x6f\xa7\xbd\x31\xdb\x27\x39\xe5\xc2\xa8\xb7\xca\x09\x01\x90\x87\xd7\xc5\x56\x35\x70\x5c\x5c\x23\xcd\x76\x63\x25\x42\x81\xc9\xc3\x85\x79\x8d\xbe\x44\xd6\x8f\xb7\x59\xb4\x55\xb5\x3d\xb7\x4b\xac\x57\x2e\xc1\x5d\xb6\x9a\xd8\x87\xae\xde\xe1\xf2\x73\x8b\x78\x60\x60\xef\xc2\x58\xc6\x83\x00\x6d\x1f\xfc\x64\x1a\xb5\x42\xe7\xa7\xe6\x0a\x83\x12\x6f\x9f\xee\x75\x9f\xa3\xa6\x79\x65\x52\x01\x96\xfa\x94\x35\x11\xe9\x7e\x4b\x89\x7e\xd0\x36\xbf\xbd\x79\x3b\x2e\xf9\x39\xff\xe3\x03\x2e\x89\x6c\xba\x49\xcf\x5b\x22\xc5\x15\x83\xcf\x48\xa7\xbb\x0f\x4f\xb5\xf0\xd2\x87\xcd\x56\xcb\xf4\x0d\x5a\xc4\x8c\x9e\x12\x8b\x3f\xa6\xcc\x72\xb7\x75\x84\x76\x3a\x8b\x4b\xcd\x26\xbd\x0a\xb6\xf1\xea\xd7\x4f\x9c\xc1\x4c\x35\x3f\xb9\xcf\x82\x1e\xf5\x70\x38\x7a\x56\x7a\x68\x0b\x33\x1a\xeb\x02\x98\x77\x21\x78\x64\x87\xb8\x9c\x94\xee\x45\x47\xa3\xb5\x7a\x97\x8c\xbe\x8e\xac\x19\x54\x20\xa2\x4f\x7b\xef\xc9\xc6\xf7\x8b\x65\xe3\x34\xba\x1e\x6d\x90\xf4\xb4\x77\xda\xb7\xbf\xe8\x2d\x7d\x02\xad\x0d\x30\x8b\xf1\x2c\x19\xf1\x70\x6f\x8c\x58\x1b\xea\x96\xc4\x14\x2e\xda\xd0\xca\xbf\xce\xb1\x03\xe0\x4b\xdd\xcf\xbd\xf0\xb6\xde\xaa\x5c\x56\x73\x7d\x8d\x44\x86\xfa\x0f\x93\xa4\x87\x14\xd9\x1f\x1d\xe1\xc0\xbb\xe0\x58\x72\x0f\x4f\xaa\xd8\xc1\x8a\xe6\xd1\xcb\x8f\x0e\xac\x3c\x37\xbc\x5e\x02\x7a\x5a\xe7\x15\x2a\xd9\x8e\x25\x7f\x97\x74\x0b\x76\x1c\xa2\x76\xbf\x3d\x31\xdd\x76\x20\x4e\x9a\x64\x7d\x93\x06\x25\x40\x73\x64\xde\xd4\x71\x17\xf2\x57\x05\x5d\x54\xef\xa3\x61\x41\x37\x3e\x64\x06\x36\x49\xd5\xe2\x47\x50\xd6\xeb\xa8\x21\x96\xd9\x7c\x93\x75\xac\xe6\xcf\x3b\x74\x10\xf9\x03\x16\x71\x6f\x53\xb2\xfb\xc5\x31\x72\x07\xbd\x96\x91\x2c\xa4\x1a\x43\x0e\x6e\x28\x20\x60\xf9\x75\x76\xc2\x0e\x90\xbd\x56\xf0\xdc\x6d\x47\xcc\xf5\x20\xac\x0c\xcd\xb2\x6f\x40\xc7\xef\xfd\x3e\x11\x20\xc9\xef\x69\x1c\x6f\xa4\x52\x65\xec\x84\xbe\x9e\xc3\xed\x1a\x3e\xac\xaf\x98\x67\xdf\xff\x3a\xa1\x1e\xb1\xa8\x6d\xcb\x52\x5f\xe8\xfe\xa2\x04\xa4\xce\xd4\x6a\x3b\x80\x86\x5e\x75\x45\x4a\x6c\x3d\x75\x2e\x21\x0d\xe0\x4a\x02\x41\x8e\x48\xaf\x3c\xf2\x28\x07\x4a\x8d\x60\xa0\x1d\xce\x9b\x26\x99\xb4\x74\x11\x99\x0b\xb9\x4e\xba\xbf\x3d\xf1\x82\x0c\x2f\x28\x9c\x15\xdc\x2d\x39\x4e\x7d\xff\x84\xf4\x5b\xea\xb9\x65\x05\xc3\x7c\x6d\x15\xea\xda\x03\x78\xf1\xc5\xf4\x9b\x96\x41\x52\xb6\x68\x1f\x0a\xc7\x35\xe9\x92\x45\xfb\x45\x13\xa0\xf6\xea\xcb\x71\x36\x3c\x19\x7c\xa3\xa9\x5b\x40\x05\x60\x76\x3c\xe8\x1c\xf8\xe6\xc9\x37\x97\x28\x6a\x67\x64\xc9\x3c\x98\xbc\x04\xfb\x16\xfc\x9d\x1e\xf9\xae\xba\x76\x02\xc9\x89\x44\x2e\x77\x9a\x4f\x6a\xa8\xa7\x7a\xfe\x58\x96\xb5\xa9\xec\x6d\x19\xfc\xcc\xda\xc9\xf0\x6a\x2a\x0b\xcb\xbb\xac\xfe\x6a\x64\x12\xde\x58\x47\xb6\xc0\x90\xc9\x09\xd0\x1b\xd3\xd0\xc9\xed\x05\x9b\x39\x6f\x2d\x1f\x5a\xad\xea\x9a\x7e\x8c\x4e\x34\x4d\xa2\xac\xf8\xae\x96\x8b\x80\x9f\xe1\x43\x8a\xa6\xed\x1b\xba\x25\x90\xf8\x16\x7a\x1f\x58\xfb\xb0\x80\x82\x99\x9e\x3f\xf9\xc1\x36\x1e\xcd\xbb\x72\xa0\x39\xcd\x9a\x99\xd0\xa4\xa7\x30\x93\x02\x3d\x45\x11\xfe\x4b\x1e\x81\x4d\xff\x3f\x36\x2f\x42\x9e\x53\x23\x4a\x87\xce\xdd\x89\xd0\x2d\x02\xb8\xab\x11\x72\x7e\xb4\x68\x8e\xa0\x63\x7a\xb7\x24\x08\x9b\xd9\x81\x3e\xe4\xb6\x3f\xc5\x6d\x51\xbe\x38\x2e\x0e\xca\xf0\xbe\x89\xdb\xe4\x27\xc9\x78\x9a\xb2\x7e\x0e\xc0\x1b\xd5\xe8\x9d\xc3\x23\xcc\xca\xc5\x2b\x52\xd2\x87\x7c\xf3\x7d\xbe\xee\x27\xa7\xd7\xee\xfb\xc6\x05\xf9\x59\x57\x84\xa2\xb9\xdc\x87\xff\x56\xbd\x2a\x01\x34\x63\xbb\xac\xdf\xde\x0d\xe2\x39\xaf\x1c\x42\x35\x0c\xaa\xc2\xa0\xc9\x7e\xbb\xd8\x66\x30\x00\xe2\x2e\x82\x2c\x3d\x3e\x0e\xf9\x9f\x15\x77\x0b\x09\x5b\x3b\xfd\xcb\x56\x79\xc1\x7b\xea\x17\xbf\xa6\x44\xa2\xdd\xc5\x61\x56\x4d\x4c\xfd\x0e\x43\x78\xdb\x3c\x68\x94\x60\xdb\x04\x77\x6b\xaf\x6b\x36\xde\xff\x67\xcc\xab\x16\xe5\xf1\x77\x65\x10\x0f\x14\x09\x69\xdc\x06\x94\x4e\x5b\xfe\x0b\x0a\xe7\x7b\x69\x73\x2a\x5b\xa7\xb0\x72\x72\x5e\xe7\x0b\xdb\x35\x47\xe8\xd9\xdf\xc6\x0a\x87\xb9\x83\xe1\x37\x43\x6b\x3e\xb7\xdb\x07\x0a\x0f\x9a\x78\x28\x72\x91\xdb\x41\x4b\xc8\x05\x4e\xe3\xfb\x43\x58\x75\x94\x05\xc2\xee\x07\xd1\xe4\xe6\xe5\x01\x93\xa7\x1c\x54\xb6\x5f\x18\x89\xcc\x98\x81\x75\xf2\xbb\xf1\xbd\xe2\x82\x36\x52\x4d\x0a\x69\xcb\x9a\xc2\x43\x3c\x61\xef\xcf\x5a\x22\xed\xc0\xd1\x95\xf0\x80\xc5\x60\xbe\x70\x2c\x7f\x37\x16\x5c\x69\x9b\x86\x03\xcc\x82\x9b\x16\xcf\xd0\xe0\xd6\x53\xf7\xaa\xf4\xc7\x74\xde\x02\x74\x5c\xec\xf9\x20\x58\xa3\xfc\x83\x53\x46\x07\x1b\xef\x65\xeb\xd5\x1b\x8c\x85\x24\x6d\xb1\x26\x66\x78\xfb\x71\xb7\x72\x8e\x79\x12\xdf\x76\x8a\x42\xe7\xc6\x50\x99\xdb\x53\xe4\xa9\x84\x3e\xaa\xaa\x3b\xc1\xa2\x71\xc8\xcb\x15\x2b\x9f\x84\x4d\x8d\xb3\x3f\x42\x73\xba\xc9\x94\x2a\x4a\xa3\x65\x10\xfb\xa6\x8a\x49\x64\x57\x77\xf2\x23\x96\x87\x1f\xf7\xad\x4b\x68\x2d\x7c\x50\x45\xb9\x13\xd6\xe7\x76\x93\x21\x9d\xda\xc9\x56\x81\x41\x86\xff\x50\xbb\x52\xc4\x93\xcb\x2e\xe6\x91\xba\x26\x8c\x7a\x90\x14\x46\x8d\xd3\xad\x30\x28\xf8\xa7\x86\x8d\xd5\x1b\xe1\x76\xc4\x7e\x16\xb4\x5f\x25\xa2\xe9\x86\x28\x83\x8e\x86\x73\xf4\xf5\x15\xc0\x8f\x55\xec\xaa\x11\xad\xcb\x2b\xa4\xc3\x4e\x32\xf4\xb9\xe4\x37\x04\xee\x1d\x8e\x71\x61\x41\x5b\x0a\x86\x8f\xb3\x74\x34\xdb\xeb\xbc\xf2\xa3\x6d\x16\x9a\x37\x4d\xe1\xa1\xf8\x5d\x42\x45\xef\x0f\xe1\x63\x95\x0e\x71\x53\x15\x1d\xe5\xbb\xdb\x72\x29\xa7\x0d\x81\x54\x43\x7d\xa9\xb7\x53\x35\x54\x64\xb8\xfb\xc5\xc9\x40\xa2\x0f\x78\xe7\x57\x43\xaf\xe9\x9c\xc5\x31\x3d\xde\x04\x69\xa4\x70\x68\xd3\xe7\xe2\x6d\x1b\x64\x7c\xc1\x3f\x25\xe0\x8b\xe2\xb1\x4b\x89\x37\x90\x08\x87\x52\xe8\xfa\xd1\x69\xf0\x13\x79\x4b\x5c\x22\x44\x83\x66\x1b\x25\xeb\x09\x25\x2e\x91\x20\x3b\x92\x03\xc0\x72\x61\xbe\xe6\x59\xb6\x9d\x7a\x55\x24\xc8\xc0\x8b\x9f\x23\x42\xf8\x30\x02\x26\xf4\x5c\x56\x9a\x0a\xb8\x4b\x96\xec\x86\xa6\xd4\xc0\x25\xbb\xfb\xdd\xdc\xc4\x1d\xb3\xb8\xbb\x25\x58\xe0\x88\x33\xa4\x46\x0d\x42\xdd\x26\x90\xac\xdf\xe0\xe8\xaa\x0a\x9a\xe0\xde\xc7\x46\xee\x9f\xac\x0b\x57\x18\x78\xd1\x13\x4a\x20\x1f\x93\x11\xd9\xdd\xd3\x27\x11\x88\xf2\xdb\xd3\x0a\x42\x96\x1d\xb6\x70\xdb\x85\x87\x3b\x02\xd4\x30\xbd\x81\xcb\x96\xb6\xf0\x2d\xbf\x3b\xee\x00\xb0\xdd\x1e\x69\xb4\xb8\x1e\x49\xc1\xb2\x97\x06\x50\x2b\x72\x4a\x64\x5f\x84\xf9\x74\xf3\xf2\x0c\xc3\x00\x28\x8f\x88\x16\xdf\xde\xbb\xd8\xd6\x73\x25\x46\x7a\xf9\x9f\x84\x49\x96\x88\xbb\xd6\x4d\x2b\x97\x1f\xa4\x34\xa5\x80\x21\x63\x94\xfe\xb3\x1d\xee\xde\x07\xd9\x7c\x78\x5d\xca\xd7\xde\xae\x4c\xd1\x02\x70\x3a\xf2\xf3\xd4\x10\x39\xb5\xe7\xc1\x96\x49\x34\x9d\x4f\x98\xbf\xd9\x2d\x7a\x36\x23\x65\x21\xa8\x58\xb5\x08\x0e\x2f\x76\x94\xfa\x01\xfa\x8c\xf2\xe7\x8e\xa6\xff\x77\x30\x19\x63\xd1\x07\x9d\x8c\xf4\xef\x69\x6b\xb1\x5d\x23\x8a\x68\x59\x48\xfa\x21\xa2\xe0\xe3\x3a\x52\xd3\xe5\x46\x5f\x9a\x31\x8d\x9c\xd6\x3c\x6f\x6d\x3b\xe4\x29\x41\x4a\xab\x7d\x19\x28\x14\xad\x97\x3f\xf4\x5a\x1c\x3e\x49\x0d\x56\xb3\x15\xb0\x43\x5e\x06\x48\x8b\x32\xb3\x7d\x43\x0b\x05\xe5\xa9\x7a\x27\xe8\x51\x7d\xc4\x8c\xf7\x61\x90\x87\xa9\xbd\xea\x9f\xbd\x4d\xde\xfa\x14\x8c\xc9\xee\x73\x28\x15\x33\xba\xa2\x23\x47\x80\x8c\x8f\xea\x1e\x31\x48\x8f\x9a\x48\xd3\x8f\x9f\x83\x8c\xad\x08\x76\x3f\x34\x45\xd7\x3c\x9d\x24\xdb\xae\x6a\x6c\x16\xf6\xcf\x56\xe5\x69\x25\xa7\xa0\xae\x41\x2c\x70\x27\x8f\x9c\xd7\x2e\x97\xd0\x6f\x4a\x35\x43\xd3\xea\x44\x73\xcb\x7e\xd2\x8b\x98\xf4\xf7\xd8\x6e\xa5\x5b\xd9\x7d\x3e\x19\x78\xb6\xc4\xd4\x22\x2d\x14\x09\xa0\x23\x25\xe4\xb4\x28\x4f\xfe\x13\xe5\xdf\x27\xff\xbb\x7d\x2d\x57\xb3\x6b\x2d\x8a\x63\x9f\x8a\x54\xbe\xe0\x4c\xad\x61\x74\x68\x55\x9b\x5d\x80\xa2\x1f\x82\xe0\xa4\x0e\xeb\x4a\xdb\xdc\x52\x4d\x56\xa1\x45\xf0\x4d\x17\x95\xe8\x48\x72\x36\xa0\xb9\xbb\x5d\x75\x94\xa0\x81\x42\xc8\xc6\xa9\x8c\xe2\x1e\x4e\x4a\xbd\x38\x73\x52\x6c\xa0\x15\xc1\xbe\x25\x9c\x50\x8e\x34\xfd\x27\xc9\x66\xf6\x46\x0e\xe4\x03\xad\x85\x93\x7a\x0d\xe5\x29\xec\x13\x17\x51\x47\xe7\x4e\x51\x8a\x15\x05\x2c\x9e\xea\xd4\x02\xd8\x20\x05\xf7\xc3\x05\x24\x37\x15\xd3\xb6\x54\xff\x87\xf7\x99\x07\x78\xb5\x6b\x9e\x4a\x7e\xdb\x7d\x9a\x8d\x53\x0c\x80\xb6\xa2\x6d\xe7\x96\x86\xdc\x95\xf2\x8e\x79\xdf\x11\xd8\x09\x7b\xd8\x32\xf1\x86\x45\x80\x65\x58\xc5\x7a\x2c\x54\x56\xa9\x94\xb7\x01\xc4\x63\x5f\xb6\x3a\xac\xe7\x97\x73\x47\x5a\x5a\xa6\x8a\xec\xd0\x15\xe8\x53\xa2\xc2\x02\x58\xec\xb5\xd1\x9d\x87\x6b\x56\xed\xb4\x9d\x72\xfb\x5a\x60\x7a\x95\x14\xef\x62\xa5\x9a\xc6\xef\xfb\x14\x0a\x83\x67\x8d\x32\xc9\xfd\x35\x2b\xfe\xff\x07\xc0\xc1\xff\x00\x64\xdf\x38\x9f\x3e\xa4\x30\x56\xd9\x8e\xf2\x30\x99\x49\x0a\x98\xee\x90\xe7\xd4\x41\x7c\x14\x28\x77\x02\x52\x4f\x7d\x78\xbf\x9f\x4c\x6f\xb7\x3d\x2b\x2d\xbf\xf8\xf5\x08\xda\xdc\x68\x9b\x8e\x83\x4c\x5f\x16\x74\xa1\x43\x49\x04\xe0\x26\x70\xb1\xae\xb2\x8f\x87\xb3\xed\xd6\xe8\x42\xf4\xb0\xbd\x7b\x89\xe8\x92\x17\x76\xd6\x8b\xb6\xa4\xfe\x71\xe4\xc8\xdd\xda\x11\x27\x04\xdd\x87\x6e\xf0\xe1\xee\x92\xb0\x1f\x0a\xea\xc4\x12\xda\xc1\xb9\x4b\x0a\xea\x46\x30\x6c\xb0\x14\x69\x9b\x80\xec\x4e\xd7\xe5\x0e\x80\xa8\xbd\xdf\xec\x5b\x82\x5a\x5f\xc3\x42\x7e\x09\xcb\x5d\xd8\xb4\xf9\xd5\xdc\xff\x13\xf1\xe3\xaa\x04\x4e\xbc\x60\x68\xa4\x6f\x16\x97\xa3\x47\x09\xc3\xfe\xee\x73\x88\x1d\x74\x8f\x2d\x54\xef\x57\x38\x74\x00\x47\x1d\x04\xe6\x07\xe7\xbf\xde\xf3\x02\x4d\xbb\x5a\xd5\x0a\x6a\xd3\x63\x35\xd7\x2d\x55\x63\x82\x8e\xb7\x46\x47\xd4\xd3\x5d\x2a\xe8\x12\x0e\x98\x8a\x6a\x62\x5f\x52\xc4\x6e\x17\xa1\x5c\x2c\xba\x1f\x49\xc5\x19\x08\x94\xca\x2e\x83\xb6\x2b\xde\xf9\xe0\x3e\x4d\x69\x0d\x75\x79\xe0\xf4\xbe\x29\x71\x47\x92\x79\x68\x26\x1e\x05\x45\x9e\xed\x1f\x7d\x98\x45\xf8\x5f\x78\x8b\xcd\x77\xd1\x52\xf2\xd2\x78\xd8\xf6\x9d\x46\x7e\x3c\x88\x24\x00\xa3\xfe\x05\x83\x5e\x18\x29\x6f\x5c\xf0\xeb\x9a\x87\xfc\x45\x73\xa4\xd3\x7e\x64\xb8\x47\xc4\x76\x01\x4b\x7c\x8f\xc3\x99\x4b\xc7\x3d\x8b\xee\xa3\x53\x46\x6c\x8d\xef\x5d\x65\xa0\xb3\x44\x5f\x03\x4b\xe2\xeb\x70\x7a\x76\xba\x55\x0d\x95\x9b\x97\xa0\xa1\x8d\x37\x08\x7a\x37\x79\x44\x58\x07\x2c\x39\x1f\x7a\xe1\x74\xce\x2d\xdf\x34\xee\x71\xf4\x7e\x3e\x69\xcf\x4d\xca\x20\x2d\xd9\x7a\x6b\x97\x5f\x9d\xcf\xc1\x80\xdc\xaa\xac\x21\xc8\x17\x38\x85\xfb\xd7\xc7\x11\x49\x11\x97\xe4\xb7\xab\xcc\x91\x7a\x0f\x77\x88\x4d\x66\xca\xbf\x5d\x46\xdd\xe4\x0a\x86\x09\x9b\xbc\x03\x88\x2d\xbf\x40\xc6\x8e\x6e\xfc\x15\x3e\x4a\xb3\x70\xa2\x57\x60\xd4\xc0\x73\x0e\x51\xaa\x35\x66\x83\xc6\x17\x8c\x0a\x6f\x02\x17\x40\xec\x41\x13\x8a\xc8\xa9\x85\x39\x1c\xf3\xbd\x7d\xb9\x35\x49\x48\x9f\x77\xdf\xdf\xe6\x30\x22\x9b\xf1\x37\x34\xeb\x74\x8d\x63\xf0\x4e\x9f\x7c\xcc\xc1\x9b\xfe\xb6\x56\x6c\x8b\xf6\xd1\x36\x85\xc0\x7b\xa6\x54\x24\x91\x48\xbc\xdc\x46\x0e\x97\x47\xbc\x5f\x6c\xcb\x40\xc9\x53\x14\x0f\xaa\xa9\xa4\x04\x06\xa6\x63\x3e\xbc\x6f\x63\x12\x1e\x64\xf9\xfa\x42\x3b\x56\x42\x97\x5f\x65\xb0\x0a\x71\x88\x33\x8f\x60\x6d\x58\x48\xa2\x0e\x91\xd1\x08\x49\x7e\x74\xdd\xcf\xfb\xe0\x80\x07\xf8\x37\xe1\x6f\x64\xed\xf9\xa1\xfa\xac\xe2\x2f\x23\xa9\x19\xb3\x28\x2c\x61\x85\xe1\x7b\x5c\x3f\xab\xbd\xa1\x91\xbb\x26\xf9\x29\xdc\xbc\x3b\x25\xb2\x08\x82\x72\x15\x41\x8a\x91\xde\x92\x76\x92\x87\x6c\x63\x2b\xbd\x84\xc4\x22\xef\x0f\xa9\x09\xf7\x0b\x6b\xa1\xfe\x70\x3b\xc7\x21\x46\x79\xd2\x3c\x9e\xaa\xde\xaa\x5d\xfb\x01\x8e\x5f\xdc\x10\xe5\x6c\xd5\xcb\x48\xd6\x23\x80\x72\x90\x97\x60\x16\x2e\x06\x51\x77\xaf\x3b\x5d\x28\x6f\x89\x93\xba\x20\xfd\x77\x1a\xd6\x3b\x40\xdf\x15\x1f\xea\xd3\x9a\xf8\x68\x3b\x14\x83\xfe\xbb\xac\x14\xb1\x2e\x12\x22\xd5\xec\x22\xc3\x18\xb9\x72\xec\xee\x2e\x5d\x95\xc0\xbf\xbf\xfe\x88\x6a\x82\x50\x78\xd6\x89\x4c\xe3\xbe\x32\xc8\xd6\xfe\xa3\x64\x22\xdb\x68\xce\x70\xef\xb3\x96\xef\x5b\xc8\x48\x8a\x9d\xed\xba\xf5\x52\x5c\x53\xbc\x9b\x17\x50\x09\x81\xda\x45\xf0\xb3\x1c\x6a\xc1\x01\x60\xc3\x77\x41\xc0\xb5\xc7\xd2\xf7\xb7\x33\xa8\xe1\x27\xdc\xc9\xa4\xa3\xec\x4b\x28\xc8\x6d\x43\x12\x1c\x95\x97\xdd\x77\xa8\x9c\x22\x5e\xfd\x8e\x21\xf3\x89\x69\x6b\xf3\x92\xba\x34\x1b\xc5\xb2\x99\x4b\x83\x84\x7d\x86\x8c\x4b\x1e\xe5\xde\xf7\x1c\x48\x6c\xf5\x7d\xcb\x8a\x10\x2f\xbf\xf2\xa6\xd6\xda\xda\x3b\x16\x66\x59\x37\x11\x34\x20\x3a\x7b\xec\xec\xf4\x16\xef\xc8\x2b\x29\x8f\x0c\x70\x47\x54\xc5\x45\x1e\x42\x8d\x19\x2d\xe4\xea\xd1\xd0\xa2\xf0\xc4\xc3\x14\xa9\xed\x5e\x7c\x79\xb7\x1d\x6e\xb4\x57\x78\xbf\xc0\x83\x8a\xd2\x65\x64\x44\x64\xc9\x98\x63\x0f\x58\xbd\xb8\x85\xd4\xe4\xe1\xc5\xd6\x57\x54\x23\xfb\xd4\x99\xb4\xfa\x99\xd6\x92\xe9\xb3\xf6\x40\x4d\x44\x4d\x00\x65\xb2\x10\x3b\xdf\x14\xe3\x94\xd0\xc5\x90\xa8\xb7\x46\x4d\xa7\x57\x1b\x3e\xb5\x9c\xde\x21\xc1\xf1\x22\x62\x75\xe8\x4d\x42\x2f\x29\xf1\xa7\x8e\x4d\x48\xa4\x6f\x0a\xc4\xac\x15\xd9\x3a\xca\x3f\x6f\x62\x24\x40\x3d\xd5\x61\xce\x6f\x9f\xb2\xce\x6f\x72\x8e\x8e\x5b\x76\xd0\xf7\x4e\x55\xb5\xdf\x98\xb3\x5d\x32\x92\x8d\xf5\x93\x7c\x3d\xc5\x48\x0a\xf3\xa0\x39\x9c\xf5\xe7\x9f\xa0\x68\xce\x1a\x48\xcf\xf4\x4b\x9c\x1b\x13\xe5\x0f\xf2\x05\x7c\xea\xaf\x2a\xe1\xfe\x2f\xb7\xc9\xcd\x9f\xb8\x1a\xd3\x1d\x76\xca\xb8\x0f\x83\xeb\xb4\xd5\x3f\x51\x35\x9f\x91\x1d\x7a\xc5\x88\x65\x92\x3b\xfc\xf4\x6b\x68\xdc\x4d\x28\xcc\x1e\xb1\x83\xbe\x3f\xbe\x6b\xc2\x6b\x97\x01\x93\x72\x5f\x78\xda\xe6\x23\x5a\xc6\x33\x62\x6c\x9f\x34\xd3\x7e\x46\x50\x2b\xf8\x12\xf4\x6f\x4f\x32\x00\x87\xb7\xa3\x47\xe9\x6f\x2c\xff\xec\x59\x7c\x39\x0d\x8c\xb0\xdf\x9c\x8e\x58\xb0\x73\xbd\x23\x13\x79\x38\x9a\x75\xda\x60\x57\x78\xa0\x63\x47\xa0\xe0\x83\x0b\x09\x38\x24\xe4\x38\xd1\x36\x09\x07\xb5\xb5\x46\xe7\x94\x46\x29\xc5\x39\x3b\xf2\x40\x0d\x51\x1b\x7c\x77\x97\x2f\x5e\x95\x3f\x2f\xd2\xf3\x9a\xf8\xa5\xb6\x99\x42\xaf\xea\x1d\x98\xfc\xbf\x58\x59\xe8\xa3\xd0\x09\x4b\x18\xb7\x5d\x8a\xc5\x6c\x0b\x19\xcc\x28\x76\x41\x27\x84\xcb\x5c\xd4\xf6\xde\x6d\x1b\xae\xde\x57\x59\xa3\x3b\x48\x40\x97\xce\x7f\x69\x12\x98\x09\x70\xe0\xd8\x2c\xc3\x5c\xe9\xe2\x25\x1e\xac\xcd\x13\x6b\x94\x14\x9d\x6c\x68\x5f\x30\x1d\xc4\xe3\x10\x56\xda\xa9\xd3\xe9\xf4\xa5\x81\xcb\xa7\x49\x5e\x34\x49\xc3\x5b\xdd\xc8\xe3\x25\x9c\xa1\x7c\x33\xd6\xc5\x04\xd8\xad\x59\x8b\x45\xf2\x42\xd3\xc3\xb9\xe0\xce\xa3\x75\xdc\x91\x68\xe3\x98\x72\x03\xf1\x88\x35\xbd\x97\x4f\x1d\xcf\xfc\x7b\x1f\xca\xcc\x51\x84\xb2\x87\xaf\xba\xd3\x6f\x13\x61\x11\xac\x19\x25\x6b\x87\x79\x26\xa9\x16\x77\x17\x2d\x32\xa9\x52\x97\x2a\x33\x47\xed\xc4\x51\x4f\x57\x54\x93\x56\x06\x76\x31\x69\x84\xa8\x2f\x26\x18\xe9\x37\xcc\x48\x91\xad\x85\xc0\x62\xf9\xd6\x03\x93\x08\x4c\x86\xa3\x09\xff\x74\x04\xaa\x9f\x2d\xb4\xda\xea\xd3\x4d\x5b\x93\x9b\x51\x68\x1c\xa1\xa3\x20\x2d\x91\xea\x7e\xc8\x66\xfe\x28\xdf\x2f\x73\x8f\x65\xa9\xd4\x8b\x68\x81\x81\x69\x66\xe9\x9a\x78\x59\x1f\x56\x8e\x9f\x62\x95\x21\x9e\xe2\xe1\x7a\x5b\xee\xea\xbe\x3f\xef\xe9\xb5\x14\x8e\x2a\xec\xea\x7c\xb2\x82\xaa\x76\x7e\x90\x8c\x56\x67\xb2\x3b\x37\x4e\x0b\x36\x4e\x0f\x6e\x2a\x29\xd6\xfa\x95\xbf\x92\x27\x42\x91\x0d\xb1\xf6\xaf\x20\x75\x79\x56\xb2\xe2\xb8\xfb\xa7\xfe\x22\xf7\xa0\x68\xbd\xb1\x12\x20\xa5\xcb\xc6\xbb\x4d\xa7\x40\x9c\xb2\x01\xd4\x95\x88\x91\xd2\x69\x89\x9c\xf2\x07\x41\xbd\x4d\x7c\x89\xcf\x2a\x20\xef\xad\x5a\xd5\x5d\x93\x4f\xed\xc2\x1b\x3d\x67\x34\x04\x99\xed\x49\xe8\xa6\x99\x9d\x27\x30\xb7\xb7\x14\x06\x6e\x5a\x41\xe0\xeb\xbb\x68\x92\xca\x70\x8a\xa2\x7d\xa2\x6f\xe8\x74\xff\xa6\x9d\xdc\x48\x27\xf6\xd0\xcf\xb5\x19\x8f\x4e\xf9\x1d\x7e\xe5\xaa\x5d\xff\x68\x60\xd8\x79\x1c\xf1\x48\x12\xe4\x78\x13\x75\x19\xc1\x92\x63\xe1\x79\x64\x5e\xcb\x63\x8c\xd0\x9d\xa5\x16\x2b\x45\xbc\xd7\xb7\x52\x9c\xfd\x96\xe6\xa4\xa1\x8d\xb7\x41\x4e\x0d\x9f\xf3\x63\x23\x7f\x77\xd4\xeb\xee\x0a\x40\xbd\xba\x4f\xea\x63\x9e\x0e\x3c\x91\x19\x8f\xdb\x39\xc2\x02\xa3\x9c\x85\x1f\x35\xeb\xa8\xac\x79\x57\x76\xeb\x3e\xff\xcc\xa6\x11\x1d\x0c\xc5\x1a\x53\xd5\xa5\xd7\xda\xf5\x07\xec\xf2\xaa\x97\x87\xf2\x7f\xba\xf3\xb3\xf2\xfa\xb4\x15\x04\x3d\x03\xf7\xdf\x1c\x3c\xb6\x41\x6e\x70\x50\xb2\xd2\x91\x11\x3d\x11\x79\xe2\xb0\x88\x67\x81\x0a\xa3\x97\xd5\xf5\xfa\xfa\xf0\x57\xcb\x8a\x9d\x26\x6d\x5d\x1f\xfa\xd0\xbe\x6a\xca\x31\xaa\xc9\xb6\x1e\x3f\xac\xda\xa7\xfa\xbf\x5b\x7d\x50\xef\x3d\x86\xb7\xfe\xa0\x22\xc1\x4a\xce\xd7\xcb\xa4\x5e\xfc\x3e\x64\x04\x0a\x6a\xbe\xb2\xb9\xee\x7e\x8a\x3e\xff\x9e\xb8\x4d\x93\xc6\xd1\x45\x60\x5f\x57\x24\x5a\x56\x3a\xba\x55\x97\xb6\xa7\xe2\x85\xfe\x0a\x22\xf8\x7a\x12\x36\xc9\xab\x87\x76\xd0\x0f\xf4\xab\x93\x0a\xe0\x7b\xf1\xb3\xc0\x1d\x51\x05\x12\x96\xb0\x1b\x70\x8b\xc8\x08\x75\xe2\xc5\x62\xbb\xef\x2e\xeb\x54\xb0\x8c\x02\xa5\xb6\xad\x76\x0d\x1b\xc8\xb4\xd0\x1b\xf8\x75\xb4\xfb\x03\x99\x9d\x65\x09\x95\xb3\xd3\x56\x41\xb6\xa2\x6e\x51\x91\xb3\xef\x88\x77\x3b\x01\xa1\x71\xca\x0b\x6b\x2c\x16\xc2\xf0\x84\xb9\x64\xe3\xe8\x29\xca\x1a\x03\x3f\x93\x46\x83\xb6\x5f\x86\x97\xc8\xc5\xf9\xc1\xb9\x23\x4d\x92\x64\x5a\xec\xe0\xfe\x55\x75\xf8\x67\x1e\xa2\x48\xb1\xa9\x2a\x38\xde\x6e\xb3\xc6\x04\xb1\x5e\x91\x17\x11\x2d\xb3\x62\x30\x92\xb6\xc0\x25\x95\x1c\xaf\x1d\x07\x67\x3e\xf7\xd6\xd0\x24\xb6\x5c\xbc\x43\x8e\xcf\x07\x2c\x9f\x1c\x85\xd4\x38\x78\x5f\x48\xa3\x40\xb8\x94\x78\x6a\xf9\xe8\x0b\x07\x06\x7b\xd2\x17\x51\x73\x0c\xbb\x73\xdf\x47\xd1\x30\x11\x96\x94\xab\x0e\x34\x42\x0e\x46\x46\x51\x7a\x37\xdd\xc8\x5a\xe5\xee\x63\xe5\xb6\xcc\x61\x6d\x2d\xba\xa6\x15\xc9\x8a\x72\x76\x8a\x7c\x68\x32\xd7\x9c\x49\x20\xf1\x7c\xd2\x22\xd4\xa0\x0f\xc1\xc8\x9a\xd8\xbb\x81\xbe\x1b\x64\x3c\x1f\xe4\x6a\xa4\x3b\xfd\x4a\x62\xa1\x99\x49\x09\x10\x56\xe9\x8b\x91\x8f\x1d\xc2\xff\x04\xe0\x23\x56\xae\xb2\xa1\xc1\x36\x4c\x18\x80\xc2\x6b\x3b\xe3\xfd\xd1\xed\x6b\x38\x4a\xf1\x5d\xee\x0f\xac\x6c\x2f\x39\xff\x72\xc4\x1a\xfd\xa9\x00\xb7\x46\x2b\x48\x68\xd0\x04\x68\x38\xfb\x0f\x9f\xe4\x08\x7a\xa5\xed\xb2\xb1\x08\xe6\x70\x91\x9c\x75\x92\x22\x73\x22\x20\x35\x35\x8c\x6d\x72\x6a\x67\x58\x10\xed\x6d\x42\x43\xed\x3b\xf6\x4b\x99\xc9\xe6\x41\xbc\x79\x44\xab\x2c\x9c\x82\x20\xa2\x4d\xf4\x93\x1b\xb5\x9b\xb8\xc3\x50\x2a\xc8\x84\xd5\xea\x5d\x09\xab\x0b\x0d\xf0\x1e\x3e\xfb\x9d\x05\x83\x0e\xa2\x4b\xbb\xb1\x33\x05\x03\x02\x9f\x6d\x77\x25\x78\x8a\x19\x27\x47\xa7\x43\x94\xc3\x43\x58\xb9\xd9\x26\xb7\x38\xa1\xd5\xea\xd0\xab\x0d\xe4\x6c\x8f\xbb\x28\x36\x42\x52\x32\xa7\xae\xf5\xe8\x38\x7e\x29\xa9\xb9\xcf\x1e\xa2\xe6\x1f\x9d\xa8\xb8\x5d\x33\xe9\xe8\x14\xe2\xde\x29\x4a\xc4\x0a\x46\x2f\x08\xba\xa2\x69\x2c\x4c\x07\x35\x0b\xb4\xf2\x51\x6c\xb5\x4b\x69\xd9\xe9\xdc\x54\xea\x7a\x66\xbf\xf3\xd5\xfe\x8b\xd0\x16\x1e\x6b\x4e\xbb\x6a\xfe\xfa\xb0\xfe\x92\x2f\x98\xff\xa3\x5b\xf8\x30\x87\x08\xfb\xde\xa7\x84\x0d\x9f\xe0\xc5\xfa\xd7\x17\xeb\xb3\x02\x25\x82\xad\x17\xa9\x0b\xae\x5c\x94\xd9\x0a\xfd\x61\xde\xad\xdf\x4f\xbf\xcd\x6c\xce\xe1\xdb\xa7\xe6\x09\xec\x36\x1f\xd0\x36\x61\xc6\x55\xc3\x41\x29\x3c\xa8\xac\xbc\xa2\x23\x34\x3a\x26\x55\x88\xb8\x3a\xbc\x32\xfb\xb2\xec\xc0\xee\xa6\xcd\x4d\xad\xc3\x59\xb9\x2f\x95\x55\x97\xb5\xed\x50\xda\x98\xd2\x2d\x03\xdb\x97\x7c\x59\x88\xc6\xdb\x63\x7a\x4a\x44\xb4\x84\x89\xe7\x99\x1c\xac\x3c\x3e\x2d\x01\x1e\xd9\xa4\x1c\xd9\xa6\x83\xda\xc6\x66\xae\x34\xb5\x38\x4b\xae\x7b\x2d\x45\xca\x6d\x27\xb8\x6d\x6b\xfa\x96\x42\xa5\x24\x6c\x9e\x09\x5b\x12\x95\xda\x8f\x3a\x7b\xc2\x05\xec\x5b\x48\x6b\x13\x92\x6b\xbd\x30\x1c\x99\x1f\x4e\xd1\x9d\x44\x73\xf4\x70\xd0\x4d\xcc\xb6\x83\x0e\x4c\x5b\x78\x9c\xd9\xe5\x16\xf3\x9a\xa3\xcc\xf8\x8b\x90\x25\x41\x53\x96\x1b\xfe\x6b\xab\xf2\xf7\xac\xe2\x24\x08\xc9\xf9\xca\x83\x2c\x17\xee\x79\x07\xda\x13\xd4\xd6\xfe\xd1\xc6\xc0\xd1\xfe\xa5\x84\x61\xe4\xd1\x28\xb5\xbe\x77\x97\x83\x66\x55\x1d\x49\xcc\xe9\x0c\x45\x64\x50\x58\x24\xfe\x5b\x93\xdf\xbb\xcb\x4d\xcd\xa1\x73\x52\xfc\x51\xe1\xa4\x91\x55\x53\xfa\xf0\x7a\x12\xc9\x05\x94\x79\xcd\x61\xc6\xc0\x47\x13\xc5\x45\xe7\xac\x20\x28\x28\x59\xf9\x0f\xbb\xae\x97\x59\xdd\x07\xa2\x78\x0f\x85\x37\xdb\xb3\x0e\xd9\x91\xb2\x10\xac\xce\xa4\xbb\xd3\x5f\x96\x34\xc3\x36\x7c\xaf\xc7\x81\x41\xcb\x3f\xc7\x1a\xf3\x9b\xb6\x12\x50\x4c\xb4\xcc\xf2\x77\x6c\x94\xd2\xcd\x4d\x6d\x1c\x0c\xec\x74\x62\xba\xfa\x24\xe0\xbc\x11\xd3\x26\x17\x34\xb8\x03\xd2\xc3\xc7\x3b\x31\xa4\xbe\xbe\xcd\x2c\x78\x2b\xe1\xd3\x46\x1e\x0a\x06\x3e\x2d\x01\xb8\xf9\x48\x21\x0c\x78\x90\xf0\xc9\x5a\x7f\x7f\xbc\x07\x0e\x76\x38\xbc\x16\xcb\x00\x1f\x24\xd5\xae\x3c\x4c\x80\xbb\xca\x95\x82\xb3\x0d\xc0\x07\xcd\xbd\xfb\x14\x7e\x0d\x40\x8f\x56\xf9\xba\x87\x9f\x9f\x27\xf1\x84\xbf\x42\x8b\x54\xc9\xa6\x60\x54\xc4\x37\xe6\x59\x17\xba\x16\x7a\x54\xa6\xf8\xc6\x4c\xcd\x54\x63\xfb\xcc\xe2\x7a\x3b\x93\x26\x72\xad\x7e\xf2\x8a\xfd\x0e\x28\xe1\xdf\x4c\xec\x96\x7e\x36\x38\x01\x21\x50\x84\x45\xe8\x87\x0b\x2e\xbc\x3e\xcd\xab\x26\xe3\x51\xee\x92\x5d\xd2\x1f\x4a\x36\x91\x55\xb1\xd3\x03\x6f\xc9\xcd\x79\x41\xf7\x28\x02\x79\x0d\xf6\x2d\x23\xb1\x87\xd8\x50\x4c\x1b\x6b\x63\x45\xbf\xd9\xc0\xa0\xe0\x60\x9d\x7b\xb9\x6d\x88\xec\x72\xec\x95\x53\xed\x79\xd7\xb0\xd8\x79\x0b\x48\x81\x13\x2b\x2b\xd4\x23\x02\x7d\x5c\xa9\x3e\x29\x09\xa1\xab\x92\xfa\x43\x97\xde\x2c\xeb\x36\x1d\x16\x3f\x9c\xe1\xd0\x79\x71\xc7\x16\xd4\x69\xde\x8f\x97\x4b\xa4\x77\x30\xaf\x5f\x42\x5e\x93\x17\x59\xbe\xc8\xe4\x08\x03\xca\xed\x6f\x4e\x9b\x80\xe5\x49\x49\xf4\xfd\x79\x81\xbe\x5b\x34\x57\xd9\xe6\x06\x15\x50\x9f\x8e\x3f\xe8\x45\x0b\xf5\x17\x0c\xfa\xb7\x81\x42\xd3\xcd\xde\xe8\x2c\x77\x8d\xac\x27\xe8\x34\xc6\xc3\x8e\x1a\xa5\x2a\x77\x51\x77\xda\x36\x26\x80\xcf\x8e\x39\x44\x97\xde\xe1\xab\x75\x13\xe7\xb5\x5d\x6e\x0e\xbf\x7f\xed\x83\xbe\xe3\xff\x93\x22\x4e\x46\xf3\xfe\xcb\x73\xd9\x73\x56\x2d\x5c\x9d\xca\x02\x31\x7b\x04\xdb\x5b\x6f\x1a\xcc\xe6\xb5\x71\xa5\xd1\x54\x2e\xad\x1a\xb7\x9d\x79\xa7\x0f\x65\xf4\xfe\x2d\x02\xf3\x44\xc2\x7f\x64\x5b\x02\x7a\x3a\xa3\xc6\x95\xf9\x2c\x38\x3f\xfd\x14\x82\xd4\xf0\xfc\x62\xca\x11\x4e\x96\xc6\x6d\xdc\x74\x44\x0c\x31\x10\x66\x4e\x74\x0b\xdb\x9d\x78\x0c\xd8\x2d\xeb\x08\x32\xd8\xce\x3c\x2f\xee\xcd\x8b\x97\xbd\x2a\x9c\x63\x5f\x58\x87\xef\x61\xc6\x4f\x0f\x75\x96\xa3\x98\x84\x15\xd9\xcd\x92\x2b\x0f\xcd\x03\x43\x4e\xa1\x9b\xe7\x75\xbb\xa7\xe1\x5e\x58\x1e\xd7\x0f\xcb\xe3\x22\x09\x14\x8a\xdc\x4a\xc0\xe0\x3e\x1c\x1c\x87\xe9\xd7\xa5\x47\xd6\xb4\x88\x32\xfb\x23\xe6\xd0\xa2\xd2\x71\x3e\x04\x47\xfa\x28\xcd\x52\x68\xfb\xf2\x54\xd8\x46\xf2\x8d\x30\x06\x53\x41\x3c\x69\x44\x36\x0c\x52\xb9\x8b\xc7\xb2\xc4\x4d\x12\x84\x23\x24\x1a\xf8\x03\x3d\x0d\xdc\xa9\x8e\x71\x67\xf6\x34\x7c\x7b\x3f\x48\x9b\x98\x17\x3a\xc3\xfe\xdd\xf2\xba\x76\x37\x60\xff\x59\x65\x5d\xa2\xe2\x55\xbe\x59\xa1\x8d\x03\x8c\x00\xa5\x30\xad\xef\xc6\x3e\x73\x62\xe2\x1a\xcb\x41\x59\xd7\xd5\x99\x59\xfa\x8a\x30\xb8\x2d\x61\xfa\xce\xdf\x8d\xfd\x4c\xfb\x34\x0a\xd7\x26\x7a\x43\xda\x1f\xc1\x06\x48\x55\x8b\x98\x46\x11\x5b\x83\x17\x8f\xcd\x0d\xcc\x05\xc3\xef\x71\x54\xdc\x9a\x1d\xb8\x57\x08\x6b\x9f\x32\xff\xb6\x47\x6a\xe0\x3c\xba\x55\x1b\xf7\x73\x09\x83\x75\xc4\xbc\xc3\x49\x84\x5d\x3c\x65\x72\xc3\x11\x19\x4b\x70\x77\x1f\x27\x7f\xed\x6c\x2f\xa5\x57\x75\x96\x3e\x1e\x11\x83\xb9\x65\x0c\x9e\xfb\x11\x75\xb1\xf6\xd7\x26\x29\xe8\x6f\x16\x66\xbd\xf3\xa7\x65\x26\x78\xb7\x68\xb1\x1e\xe8\xbe\xef\xaf\x25\x1c\x24\xd5\xf2\xf5\x53\xb8\x34\x23\x9d\x21\xfe\x4d\x34\x20\x68\xbb\x99\xb5\xb6\x68\xec\xd5\xb9\x92\xfb\x0c\x33\xc1\x74\xb7\xf3\x0d\x80\x2c\x39\x38\x0f\xa9\x3e\x1a\x17\xa9\xf9\xc5\xd7\x2e\x0d\x52\x42\x77\xd5\x09\x6e\x6e\x10\xbf\xa8\x32\xe8\xf2\x8f\x22\x69\x37\x8c\x94\x53\x7e\xfe\xc4\xac\x5e\x7b\x2c\xcc\xc0\xe9\x28\x92\x96\x93\xec\xc7\xce\x07\x0c\xe9\xeb\x93\xc9\xf4\xa6\x9a\xff\xbe\x5c\x17\xc9\x62\xfb\xa2\x7d\xfc\x82\x0e\xc6\x93\x21\x3a\xfa\xeb\x7e\xa3\xb9\xf9\x7a\xcc\x04\x82\x78\x67\xf1\x8f\x50\x1c\x9f\x0f\x8a\x68\x05\xe3\xbc\xa1\x5c\x66\xa5\x8d\x23\xd0\x6b\xef\xa9\x5c\x9a\xb0\xbe\x6d\xff\x69\x4e\x48\xce\x0b\x7b\x7b\x95\xf4\xc6\xda\x21\x0a\x9c\x6a\x51\xa9\x6f\x29\x5a\x76\x3b\x39\x31\x8e\xf5\xdd\x5a\xec\x26\xdf\xb5\xd7\x24\x33\x91\x4d\x6c\x0d\xf0\x77\x07\x62\x0f\x45\x20\x84\x9d\x8d\x3e\xee\xb4\xbf\x6a\x97\x3b\xce\x15\x94\x9e\x4b\x3a\x7d\xf2\xa0\xc8\x82\x9a\x53\xcf\xcd\xdb\x4a\xeb\xc0\x6b\x8f\x3b\x48\xb9\x0e\x5c\xc8\x2f\xe0\xa7\x9e\xbb\x88\x6b\x3a\x04\xd1\xb8\x9b\x91\xc7\x7f\xa2\x04\x88\xec\x25\xdc\xd4\xda\x24\xce\x60\x60\xc6\x1c\x18\x91\xa4\x0f\xf7\x4f\xe4\xbd\x00\x2f\xdd\x25\x29\xa5\x54\x00\xcf\x4e\xc9\x8d\x3d\x48\x11\x57\xe2\xf2\xd9\x23\x06\x0c\x45\x77\x54\xd8\x7e\xe3\xd7\xd3\x8d\xa8\x7c\xef\xfc\x84\xae\xe4\xf8\xc7\xc3\x7c\xab\xdd\xc2\x9d\x18\x55\x5d\x41\x21\x8e\x75\xe6\x91\xb5\x09\x95\xdd\x12\x48\x94\x4c\x7e\x5b\x6f\xb2\x51\xd7\x2a\xdb\x89\x55\x5a\x03\x47\x16\x7c\x97\x0d\x9f\x7b\x58\x0c\xa3\x16\xe1\xd6\x3b\xb7\xf9\x5d\x8f\xad\x4f\x1a\x62\xe8\x2b\x58\x99\xd3\x4c\x89\xcb\xad\xc4\xce\x3c\xde\x89\x94\xa8\xe5\x15\xa3\xbc\x24\x35\xdd\xbd\xaa\x79\x5e\x6a\x94\x6f\xb6\xb3\xb0\x5c\x07\x44\xc4\x7d\x3a\xff\x6c\x1e\x3d\xf3\xe9\xe1\xf5\xb9\x86\x76\xc9\x31\xac\x5f\xbc\xde\x11\x0e\xad\x74\xab\x9b\x89\x68\x58\x0b\x84\x77\x62\xde\x34\x6b\x9e\x65\xf4\xc6\xfe\x6d\x4e\x54\x64\xcd\x9a\xb8\xff\xdd\x27\x8b\xb2\x12\xdc\xa8\xfb\x57\x14\x4e\xf7\x28\xfe\x82\x75\xf7\x84\x2f\x04\x2d\xd9\xfd\x48\xc2\x10\x48\xfa\xe2\x81\xfe\x9c\x67\xed\x96\x6f\x76\xef\x1e\x13\xce\xc5\x12\x01\x34\xb6\x8b\x87\x88\x79\xed\x88\x0d\xdf\x8d\x13\x3a\x88\xc5\xe0\x41\xe2\x27\x97\x3d\x5e\x50\x5f\x2f\x59\x66\xd2\xe3\xcf\xdb\x3c\xcb\xc3\xdc\xf6\x1d\xe6\x0b\x3e\x83\xf5\xf2\xd4\xfc\xf1\x99\x1a\x08\x7c\xb0\x1f\x00\x84\x4f\x3d\xf2\x5b\xac\x05\x7b\xdd\x29\xaf\x39\x7b\x70\x65\xdc\xf0\x69\x3b\xd7\xe6\xa9\xe2\x01\xcf\xa4\x32\x2c\x0e\x4e\xba\x2a\xd5\xdb\xcb\x4c\x15\xed\xf0\x39\x55\x79\x23\x40\xd1\x4f\x89\xe2\xf8\x90\x0f\xec\x8a\xc4\x3a\xf9\x3a\xc2\x0c\x2a\xa4\x27\x43\xde\x79\x70\x60\xa3\x10\xcd\x11\xb2\x9d\xd3\xce\x23\x1e\x15\x50\xf5\x3f\xa8\x5c\x86\x45\xb2\xab\x98\x51\x0d\x8b\x6a\x0b\x37\x5a\xd9\xa6\x1f\xf4\xe5\xec\xeb\xe1\xcd\xa3\x5d\xfe\x23\x5f\x30\x17\x51\xe8\x88\xc0\x08\xca\xcb\xdd\xfe\x1f\x7c\xa5\xc6\xa9\x31\x40\x71\x2d\x27\x0d\xe0\x6b\xe2\x90\xc2\x66\x9a\xf6\x5b\xee\xc8\x1e\x96\xd0\x35\x0d\xc1\x99\x10\x87\xb8\x83\xbb\x0d\xb7\xff\x9f\x4b\x0b\x26\x16\x64\x98\x1e\xce\xe6\x73\x22\x80\x26\xef\x88\xc6\x92\x27\x9f\x47\x2e\x73\x5b\x5e\xbb\x12\xd8\x88\xf6\x56\xb9\x1d\xbe\x70\xd6\x39\xac\xf8\xca\xdc\x0d\x5f\x49\x2d\x33\x2c\x9c\x96\x0f\x3d\x5c\x50\x20\x1d\x83\x28\x59\xb6\x0f\x84\x3e\xd3\x0e\x10\xf7\xaa\xb8\x9a\x6d\x08\x1c\x97\x1c\x38\xb8\x92\xf6\x94\x0b\x9e\x53\x72\x8f\x7b\xa7\xcf\x97\x20\x09\x4e\xc3\x7f\x4c\xd8\x45\xa9\xb3\x9f\xbb\xc8\xf3\xb2\x8d\xc8\xae\x30\xca\x3e\x77\x25\x20\xec\x25\xfc\x7a\x7c\xc9\xc2\xee\x5c\x38\xa4\x3a\x71\x6f\x2b\x2a\x94\xb2\x39\x0a\x04\xab\x62\xa0\x4e\xbd\xc2\x56\x78\xe5\x3e\x11\x87\xd1\xdd\xe1\xf2\x9f\x66\x8b\x1b\x7a\x41\x18\xeb\xf9\x9f\x99\xe8\x61\x73\xc2\x9f\xdb\x1f\x97\xa0\x65\x02\x81\x41\xd1\x4d\x03\xdc\x7a\x16\x61\x2b\x9b\x0c\x1c\xac\x20\xd4\x8a\xf4\xfa\xcc\x54\x56\x70\x2b\x38\x02\x52\x40\x8a\x7b\xee\xfb\x0f\x94\xfa\x68\xd7\xc9\xb3\x0b\x6f\xb7\x72\x87\xc0\xfd\x1e\x0a\x78\x98\xe8\xca\x43\xb7\x70\x4a\xb4\x23\xf7\xe1\xe7\x8a\xfd\x8e\x7a\xfb\x2c\x2a\xb8\x7b\x46\xaf\xd4\x8b\x33\x54\x5c\xdd\x5c\xf8\x9c\x90\x0e\x22\x95\xcc\xa6\xda\xe3\x4a\x91\x69\xa4\x1f\x20\x3e\x0b\xd8\x4a\x16\x8e\xb0\x79\xd4\x2d\x95\x49\x22\xf5\x6d\xcd\x3c\x17\x94\x49\x99\x41\xd8\xe5\x27\x86\x47\xef\x2a\x05\x9e\x12\xee\x20\x7a\xd2\x3f\xe2\xa3\x8d\xff\x16\xce\x7c\x89\x74\x4c\x2f\x5e\xad\xd6\xaa\xb9\x33\x4c\xae\xe4\x71\xb5\x30\x8a\x4c\x34\x89\x05\x87\x93\x76\xb3\xa5\xe6\xb7\x4a\xf5\x57\x73\x89\x29\x17\xd9\x66\xcb\x8f\xee\xb3\xe4\xf0\x9e\xb1\xed\x8f\xd8\x0e\xb2\x57\x9c\xf0\x91\x73\xb8\xcb\x30\xfd\x64\x09\x07\xfe\x25\xc8\x8f\x50\x61\x4a\x50\x99\xc2\x8e\x6d\xde\x22\x46\x10\x1e\xc7\x7c\xc4\xef\x9b\xd6\xe2\xcd\x0a\x1c\xd1\xc2\x13\x8b\x25\xd7\xdf\x1d\xf4\x1f\x0f\xfe\x26\x94\xa3\x0b\x69\xaa\x7b\xd8\x57\xd4\xa5\x19\x2d\x4f\xb5\xf9\xfe\x16\x19\xe8\xe7\x12\x74\xb8\x2c\x1f\x9e\x29\x32\xf2\xec\xec\x28\xfc\xc4\x5f\x26\x29\x0e\xde\xa8\xfe\x1e\x8e\x77\xcc\xfe\x51\xe7\x2b\xf9\x09\xd2\x62\x9a\x69\xd5\xa6\x6f\xca\x34\xf8\x83\xf7\x1f\xd5\x98\xb6\x0d\x31\x3b\xce\x7e\xd4\x12\x33\x44\xd6\xfd\x61\x51\xea\x1a\x6d\xdf\xe2\x95\x0e\x99\x45\xa8\x76\x99\x86\x1a\x83\x3c\x68\x1b\xbf\xb3\x1c\x2b\x8e\x30\xf4\x8b\x4c\x7f\xdb\xfe\x6d\xff\x29\xd2\x5e\x0a\x8d\x81\x7b\x45\x8c\x04\xdd\xf6\xcc\x57\x61\x2d\x86\xb4\xcf\x8b\x5f\xaf\xfc\xbf\xfe\x9b\x7b\xed\xf7\xa4\xb7\xd9\xd5\xb7\xd3\x8b\xb8\x8e\x83\xfc\x6c\x96\x70\x93\xec\xcb\x1e\x6c\x1f\x44\x18\x5d\x9c\xce\x41\xe4\xed\x7d\x43\xb6\x1a\x47\x7b\x67\x8f\xfb\xfb\x92\xa9\xb1\x66\x8b\x89\xe0\x06\xcc\x6d\x8a\x02\x37\x26\x9e\x02\x56\xde\x0b\x34\x41\x5b\x45\xb0\xfd\x73\x0a\x62\x79\x91\xd9\x51\xe5\xfb\x27\x3a\xf0\x42\x5b\x63\x20\x8b\xfe\x43\xe1\x7c\xad\x53\x81\x74\xb9\xa5\xf5\x19\x2e\x97\xe2\x27\xdd\x62\x8a\x47\x06\x3a\x19\xf6\x0b\x5f\x11\x90\x11\xb9\xc7\x76\x24\xfd\x13\x97\x23\x56\xef\x03\x3d\x40\xe6\x41\xf9\xf9\x15\xff\x92\x4e\xc3\x04\x43\x28\xcc\xac\x29\xe2\x29\x1b\x96\x77\xdc\xdc\xef\x38\x2b\x5f\xb2\x7f\xc6\x71\xc2\xaf\x81\xe1\x17\x21\xfa\x70\x02\xc1\x38\x4a\x1e\x5f\x6f\x69\xc8\xc3\x53\xf9\x52\x33\x7a\xa5\x7a\xac\xdc\xc1\xc0\xaa\xc8\xed\xd3\x01\xc6\x58\x09\xc7\x62\xfd\xc7\x9f\xb8\x5a\x1e\x81\xd5\xc5\xcd\xd5\x8b\x84\x8a\x22\x5d\xbc\xf7\x57\x52\x4c\x71\x02\x72\xea\x8e\x77\x22\xeb\x2f\x9d\x57\x09\x45\x67\x80\x3a\x69\xe7\xf5\x00\xa9\xb3\x57\xf4\x94\xce\x40\x48\xaf\x90\xb9\xef\xf7\x96\xe7\x85\x8c\xbd\xb2\xc4\x0f\x49\x1f\xfb\xec\xde\xc1\xf2\x3b\x92\xed\xf7\x16\x85\xb4\xdb\x6e\xab\xbb\x7e\x07\xa2\xe1\xb7\xea\xae\xad\x7e\xf1\x89\xbe\xf6\x7f\xd9\x43\xec\x21\x76\xc3\x99\x18\x27\x13\xa8\x45\xb9\xe7\xa8\x6d\x4f\xff\x71\xc7\x42\xa4\x05\xfe\x10\xc9\xad\x9c\x6e\x4c\x36\xdc\x5d\x7e\x81\xf0\x32\x9b\x58\x49\xd1\x5c\x5b\x9c\xcd\xca\x53\x78\x45\x07\x23\xaf\xa0\xa5\x44\x78\xc2\x30\x84\x59\xd0\x1a\xbd\x12\x54\x0f\x39\x47\x46\xd0\x0f\x9c\x4f\xc4\x59\xfa\x92\xff\xc9\x8a\x47\x32\x22\x8d\x32\x28\xd1\xb5\xea\x33\xf6\xdf\x77\x18\x7a\x59\xa9\xa7\x28\xd7\x14\xdd\xcc\x1c\x1d\xe4\xbc\x51\xda\xe5\x71\xd8\xe4\xcd\xa5\x83\x0f\x0b\x4b\x20\x38\x7a\xd1\x9c\xb9\x46\x9e\xab\xc6\x77\x7f\x2d\x15\xe1\x2f\x91\x74\x1a\x16\x4c\x53\x33\x6a\x70\xdd\xfa\x36\x9c\x6d\x5a\x58\x85\xac\x77\x0c\x12\xca\x0a\xcd\x99\xe2\x7a\x99\xd2\x18\x61\xf4\xc3\xe0\x57\x1c\xdc\x86\x4a\xb3\x1b\xb2\xe3\x4e\x6c\x6d\xab\xb0\x4e\x0a\x6f\x3c\x03\x8c\x95\xb9\x1d\x48\x2f\x72\x34\xbe\x2d\xbb\xe1\xe6\x2c\x31\x85\xb5\x36\x26\x60\x7e\x86\x3c\xeb\x16\xf0\x06\x89\x1b\xe2\xd4\xd1\xbe\xff\x09\x27\x5b\xa2\x5a\xcf\xd4\x4a\x77\xbb\x91\x5d\x52\x8a\xb3\xd0\xeb\xf4\xc2\x9d\x68\xa8\x41\x91\x1e\xc0\xc9\xa4\x9c\xe2\x50\xd6\xd4\x10\xcf\xce\x36\x5b\xff\x38\x69\xe8\x30\x28\xb5\xdb\x97\xa2\x92\xd8\xc2\xa9\xc6\x47\xe8\x6b\x7b\x69\xdd\xed\x56\x09\x6e\x05\x36\xf6\xc0\x68\x22\xbe\xa8\xca\x25\xc3\xe5\xaf\x0c\x5b\xa9\x9e\x14\xf4\xf8\x7f\x4c\x9d\x0d\x41\x7d\x8e\x3b\x96\xd6\x42\xa9\x05\x41\x04\xd4\x83\x27\xb9\x68\x33\x1e\x05\x83\x3f\x9f\xb7\xf4\x17\x72\x1e\xb3\xf2\xa5\x89\x2c\x30\x3a\x09\x82\x72\xcb\x2b\xe9\x00\x2c\xf1\x73\x5b\xda\xc5\x7b\xec\xea\xda\x45\x36\x59\x79\x89\x7d\xe7\x86\xaf\x10\x9e\x2d\x94\x9b\x8d\xa1\x2a\x1b\x02\x48\x6f\xa6\x1f\x2d\xcb\x0f\x80\x3b\xcf\x82\x3c\x54\x01\x42\x42\xf1\x61\xb9\x1e\xfe\xcb\xe9\xc3\xa8\x4c\xd4\xb8\x03\xcf\xa6\x64\xa5\x15\x21\x4a\x3b\xe2\x07\xb1\xf3\x00\x6d\xf2\x0b\xe7\xf6\xad\x32\x33\xc2\x17\x7c\x53\xc8\xfe\xed\x92\x97\x70\x63\x23\xb0\xf3\x86\x2c\x81\x1c\x3d\xeb\xa5\x7f\xee\x45\xea\xb4\xde\x4d\x2f\x9b\x08\x2f\xd8\xa3\xca\xad\xd7\x2f\xb8\xdf\x6e\x5e\x16\xcd\xb7\x3c\x8a\x2e\x86\x8d\x5d\xc0\xb0\x1f\x0e\xb3\x6f\x3d\xfd\x09\xae\xa3\xfe\xba\xe4\xcb\xd5\x59\x6e\x30\x92\x6e\x29\x4d\x4e\x67\x58\xfd\x7c\x8f\x44\x96\xc1\x8e\x2f\x99\x5a\x85\x8e\xb7\x31\xf1\x64\x6a\x8f\xb7\xbf\xf9\x23\xe5\x67\x16\xd7\xc4\xae\xb8\xac\xd5\x16\xac\x93\x88\xc0\xb9\x5a\x3e\x06\x22\x47\xa3\xc3\xb8\x0f\xcd\x93\xce\xe6\x49\x74\xee\x39\x72\x9f\x4e\xb4\x99\x7e\xa2\xcc\xb5\x72\xde\xab\x84\xab\x93\xa1\x66\xe7\x74\x47\xf2\x94\x5b\x9d\xaa\x13\xca\x92\x88\x9f\xb6\x7d\x47\xe4\x8e\x22\xd5\xbc\x2c\xf5\xa6\x05\xa1\xe4\xbf\x76\x64\x6b\xae\x26\x25\xd2\x75\x30\x3c\x67\x4f\x82\xd3\xe8\x2b\x45\xef\x19\xb4\xf0\x21\x3f\x6f\x1e\x56\x8e\x6c\xf8\xf9\x74\xdb\x51\xed\xbd\x86\x55\x04\x4a\x52\xe5\x00\x79\x15\x45\xdc\x39\x61\xf8\xb9\xdb\x50\x18\x06\xb0\x94\x16\x03\x40\x9b\xa6\x23\xc5\x67\x80\x7c\xfd\xac\x28\x3d\xb5\x98\xd9\x71\x4d\x38\xb5\xdf\x8a\xa1\xdb\x6b\x90\xe3\xf7\xba\xef\x82\xaf\x24\x96\x29\xca\xf5\xb1\x86\x3e\x18\xe4\x11\xe7\xc3\x75\xd2\x88\xe0\x92\xb7\x9d\xec\xa2\x40\xb2\xf7\x5f\x22\x79\xd9\x0e\x16\xea\x03\x27\xdb\x8a\xb0\xa2\x87\x37\x28\x92\xb3\x7c\x82\xf2\xad\x00\xeb\xb5\xb6\xc6\x42\x56\xf9\x6b\x7d\x3e\x93\x7f\x49\xd1\x49\xb9\x96\xad\xb9\x29\x84\x5a\x70\x45\x21\x5a\x35\x55\x08\x43\x84\xbe\xff\xed\xbd\x6b\xb3\xd9\x5f\x09\xe4\x84\xb8\x2f\xa4\x3c\xa9\xf7\x53\xdf\x13\x5a\xd8\x8a\x60\x44\xd3\x70\x63\x97\x13\xf2\x0a\x58\xf2\x14\x5c\x46\xed\xb0\xb6\xbd\xd9\x6d\xae\x99\xf2\xae\xb6\x63\xe2\x17\x93\x99\x6c\x9d\x7d\x72\x33\xc7\xf9\x8e\xe4\x61\xb0\xc8\x39\x88\xfe\xbb\x9d\x7f\xf4\x27\xe8\x0e\xe1\xe6\xde\xad\xdb\xd9\x57\x4f\x1e\x82\xd4\x30\x2b\x77\x7c\xaa\x1c\x1b\xd4\x21\x8e\x31\x64\x90\x3d\x7c\x80\x3c\xb7\xc9\x71\xe4\x33\xda\x55\xf4\x55\x6c\x81\x08\x9e\x76\x20\xc2\xa3\x40\x33\x88\x77\x90\xc6\xc5\x95\x04\xed\x5c\x8c\x04\x70\x1b\x23\x0b\xd3\x2e\x1d\x8a\xcd\xec\x95\xf3\x20\x2e\x6f\x49\xec\x4f\xd5\x28\x18\x0e\x0a\xfe\xa9\x06\x41\x83\x1d\xeb\x9c\xc9\x54\x02\x1c\x79\x2e\xa0\xce\xfb\x26\xff\xc4\xc8\x77\xd1\x42\x04\xe1\x67\x59\x44\xcb\x78\x5a\x89\x74\x90\xd5\x83\x1c\x4d\x07\xa1\x90\x99\xa5\x61\xb0\xda\x98\x29\x46\xc1\xf9\x59\x82\x40\xae\x4e\x70\xa8\x30\xe5\x89\xc5\xa8\xb9\x05\xd4\x10\xec\x60\x36\xe1\x57\xff\x02\x52\xc1\xb3\x1f\xda\x46\x62\xf7\x2a\x6c\x69\xc9\xf7\xc9\x9e\x4d\x4d\x7f\x2a\x99\xa1\xf6\xf7\x25\x75\x65\x64\x4e\x3f\xfc\x0c\xe5\x80\xac\xe7\x3d\xec\xcd\x88\x63\xcb\x8d\x67\x5e\xdf\x24\x0c\xd5\x96\x0b\x88\xbb\x2f\x3c\xcf\x77\xf2\x1f\x21\x0f\x12\xed\xfc\xfe\x99\xd2\x28\x86\x7a\xed\xc2\x9c\x66\x6d\xe7\x50\x27\xc0\x06\x98\x96\x42\xaa\x49\x34\xbf\xb1\x6d\xd0\xe6\xa1\x71\xbc\x9b\x3b\x34\x30\xe9\xb1\xf2\x94\xf4\x1c\x5c\xc9\x97\xbb\x22\x81\xf7\x3f\xf2\xdf\x0e\x26\xa6\x14\x5c\x17\xda\x41\x58\xdf\xa9\xce\xe5\x68\x0d\x4b\x17\x22\x98\x2e\x49\x2b\x6d\xc7\xa5\x57\x2b\x00\x12\x44\x80\xf1\x28\x08\x3f\x0c\x97\xfc\x9f\xb3\xda\x1f\x3a\x0e\x95\x82\x7d\x87\x4a\x42\xb6\x07\xef\xcf\x36\x13\xc5\x02\x52\xa6\x83\x8f\xca\x91\x17\xc1\xb2\xf2\x45\x3c\xb7\xe3\x65\x71\x93\xbd\x44\x0c\xe4\x6c\xf9\x37\xa6\xb0\x0f\xb4\x59\x5e\x77\xeb\x66\x18\x6e\xe6\x10\x9a\x5d\x6a\xb2\x6c\xbb\xf2\x7b\x8e\xc2\xfd\x4a\x1c\x4d\xe8\xb5\x3f\xdf\x32\x4e\x86\x8d\xb1\x06\x78\x3c\x0a\x85\x8d\xd9\x7a\xd0\x8c\x62\x8d\x63\x2f\xf7\x8d\x9d\x4e\xc8\x6b\x27\xa5\xc0\x2d\x26\x74\x7a\x55\x3f\x0c\xce\x99\xac\x94\xb3\xac\x6a\x8b\x9a\xe9\xaa\xfd\x5a\x5d\x6c\x67\xe6\xae\x7b\x06\x26\xe2\xd3\xe7\x60\x50\xae\x61\x36\x02\x6f\x87\x62\xcd\x1f\x4f\x93\xae\xdd\x90\x58\xf7\x93\xb0\xfc\xc3\x6d\x6e\x98\x2a\x65\x97\xa3\x48\x49\x83\xd4\x2b\xc8\xdd\x89\xd5\x44\x1e\xd2\x01\xf7\x8d\x93\x6d\xd3\x1d\x4d\x18\xd8\xeb\x1c\x18\xec\x37\x5f\x9e\x1d\xe2\x4c\xff\xc4\x4f\x4c\xbb\xd7\xeb\x25\xa6\xa6\x1d\xe1\x67\x21\x1f\xf3\x48\x03\xdd\xbc\x77\xeb\x22\xc2\x87\x10\x85\xd3\x45\x4e\x7b\x7d\x73\xa4\x58\x2f\xbd\x10\xee\xa2\x29\xb0\xab\x9e\x82\x25\xac\x50\x57\x4f\x25\xe9\x1b\x21\xb0\xfb\x94\xcf\x36\xca\x77\xbf\x7c\xb6\xca\x93\x0a\x9c\x6b\x65\x94\x58\x13\xab\x21\x0b\x49\x3f\xd6\x87\x89\x11\x8e\x00\xc7\x38\xa3\x38\x2f\x5a\x5d\x1d\xf6\xf8\x7f\x4c\xac\xf2\xe3\xa4\xef\xd9\x29\xb9\xcf\x05\xe9\x9a\xd7\x79\x33\xf4\xca\x3e\xa1\x73\x74\xf5\xf4\x59\x2e\x66\x21\x67\x08\xc0\x55\xf7\xb5\x49\x1e\xba\x51\x0c\x8d\xa3\xc9\x93\x20\x97\x4f\x17\xc8\xd1\x22\xfb\x64\xb8\xa5\x04\xf1\xc5\x11\xb3\xf1\x0c\x05\x14\xb6\xa1\x87\x0f\x52\xae\xb2\xea\xbc\x0a\x03\xe6\xf9\xd6\x0d\x34\xab\x8c\x42\x98\x8e\x2c\x0a\x17\xb7\x16\xc5\x7c\x48\x34\xa8\x99\xa7\xd4\xfc\x4f\xf7\xe2\xb9\xf6\xe1\x7f\xc0\x0f\xd4\xd6\x79\xb9\xfc\x07\x77\x7d\x3c\x72\xa6\xf9\x97\x9f\x7d\x4d\x04\xc5\x82\xac\x87\x55\x90\x59\xa6\xfc\xab\xb9\x91\xcf\x2c\x87\x66\x5b\x2e\x4a\x8b\xcd\x0a\x2e\x85\xd1\xcf\xff\x4f\x68\xea\xcb\xbc\x89\xe5\xd4\xee\x3d\xb8\x6a\xb1\xc3\x8b\xe2\x75\x52\x12\x37\xea\x97\xb8\xf9\xec\x80\xfb\x51\x70\x47\xb1\x32\xc7\x72\xc8\x32\x67\x2c\xb5\x88\x22\x2a\xe5\x23\x56\xf6\x2b\xa2\xe7\xe3\xf1\x26\xad\xd9\x98\x64\xa6\x32\xb2\x68\x47\x33\xc8\x9d\xc5\x87\xf3\xed\x42\xb4\x63\xc4\x19\x9a\xcf\xd6\xcd\xd9\x4a\x60\x1b\x42\x32\xc9\x98\xb4\xbe\x51\x1c\x82\xe7\xe2\xe9\x1b\x51\x89\x3c\xdd\xf3\x58\x21\xb6\xbc\x99\x9e\x90\xa9\xfa\x23\x47\x6a\x59\xf6\xea\x39\x66\x6d\xd6\x8a\xea\xc8\x1c\x94\x3b\xed\x63\x38\x29\xb1\xce\x33\x5c\xf1\xef\x83\xc1\xe1\x3e\xd9\xd7\xae\x00\xb6\x7f\xbd\x68\xe0\xe8\x9b\x17\xa5\xaa\x47\x04\x88\x1d\x5b\xc4\x04\xca\x46\x1d\xfe\x8c\x6e\xe5\x8e\x86\x90\xae\x74\x3d\x50\x58\xb6\x08\xde\x1b\xae\xe1\x3f\xeb\x00\xa0\x47\x27\x91\x56\x75\xca\xa7\x06\xe3\x1a\x9d\x7d\x68\x5e\xc3\x6f\x76\xe3\x44\xd1\x5d\x8b\xe4\xea\xb8\x84\x22\xab\xcb\xdf\x14\x2b\x61\x7b\xd7\x25\x41\xff\x4d\x27\x25\x9e\x89\xa7\xa2\x2f\xc0\x63\x09\xa2\xd4\x4d\x61\xa8\xe7\xe7\x86\xa5\xc8\x71\xaf\xe2\x47\x45\xb3\xd1\xc9\x75\xb0\xb3\xca\x23\x93\xe1\x82\x2d\x25\x64\x05\xa9\x89\xf9\x35\x72\xc5\xed\xd0\x91\x35\x63\x7f\xe7\x10\xd4\x42\x0c\x0a\x8f\xb0\x77\xfe\x16\x3b\x53\xf1\x15\xdf\x14\xda\x0c\x8c\xf6\xc7\x18\x5f\x7f\x70\x2f\xd1\x88\xf1\x53\xbd\x20\x7f\xdf\xba\x90\x50\x67\x91\x9a\xfa\xae\x7f\x97\xd5\x14\xbd\xd4\xb5\x72\x92\x2c\x8b\xba\x7d\x98\xba\x21\x3d\xc0\x5b\xc9\x7c\xd6\x66\x7e\xe6\x29\x21\xca\x98\x4f\x8b\x6f\x45\xaf\x7a\x31\xeb\x50\xba\x58\x68\x25\xd9\x56\x3b\x23\xcb\x0f\x40\xdb\x98\xcb\x7e\x52\xd4\x7f\x1d\xa5\xf9\xcb\xc5\xd8\xf3\x0a\x6f\xbe\xcb\xfe\x70\xc7\x3d\xd9\xc5\x91\xaf\xfb\x74\xdf\x9f\x0b\x81\x93\xb2\xdf\x3a\x3f\xf4\x07\xb0\xee\x56\x2e\x4c\xde\x30\xf2\x98\x04\x76\xab\xd5\xd6\xd0\x00\x68\xb4\x1e\x24\x6d\x69\x24\x14\xc2\x2a\x6b\xed\xc2\x5a\x60\x72\xd9\xa2\x83\x89\x7a\x94\x84\x17\xf2\x3e\x1d\xd1\xc8\xa9\x57\xf7\x87\x76\xae\x8d\x78\xcf\x20\x0c\xa1\x63\x8b\x5e\x91\xdc\x2c\x6f\xb6\x3c\x40\x09\x1e\xe7\xfe\x81\x54\xf3\x02\x70\x8e\x48\xfe\x3a\xd0\x1e\x72\x94\x34\xea\x6c\x74\xa1\xb4\x98\xb7\xb7\x97\xe5\xfb\x01\x56\xe1\xc3\x3b\x30\x1e\xf8\x7b\x09\xa7\xca\x32\x2a\x07\x7c\xa2\x8d\xd5\xde\x86\xab\xbb\x82\x1c\xad\xe9\xba\x69\xec\x74\x04\xb6\xb3\x27\x50\x10\x1c\x46\x86\x73\x9d\xe0\xcc\x2a\xb6\xdf\x16\x9e\x67\x1b\x25\x66\x1b\x72\x2e\xc5\xd5\x52\xea\xaa\x46\x80\x2b\x03\xe9\xd6\xba\x28\x40\xce\x4e\x11\xa6\x8c\x2f\x3f\x0b\xde\x86\x12\xac\x34\x8b\x59\xfb\x4d\x0a\x4f\x1c\x8a\xc7\xa6\xf3\xb1\x69\x16\x5c\x31\x3f\x6b\xed\x65\xdf\x9b\x87\x9d\xe6\x89\xab\xbb\xa5\xf3\xe4\x04\x46\xcb\x03\x30\x74\x0e\x6e\x14\xad\x7e\x6d\xd9\x39\x09\x06\x5a\xb9\xc9\xac\x62\xf9\xe8\xae\xb2\xe6\x87\x74\xaf\x7b\x5d\x15\x47\x67\x47\xe3\x24\x95\x9a\xad\x11\x2f\xa2\x7c\x15\xf1\x82\xab\xea\x97\xc5\xf7\xbe\xf0\xff\x25\x83\x21\x3f\x45\x9b\x5c\x72\x0e\x61\xf1\xa0\x58\x48\x58\xbd\xc8\x24\x2f\x8d\xda\xb5\xe6\x26\xd5\x9e\x85\x49\xce\x9b\x68\x0b\x41\x7b\xb0\x7b\xf4\x0a\xa9\xf0\xa2\x2a\x6d\x4e\x00\xc5\x7d\xb1\xeb\xaa\xb7\xa3\x34\xef\x93\x9f\x64\x77\xff\xd3\x01\xbb\x9e\x67\xaa\xcf\xdf\x29\x3c\x55\xc2\x7e\x93\x5b\x5d\x87\x82\xc2\x4b\x77\xff\x1e\xda\x8d\x4d\x32\x53\x08\x57\x3a\x6c\xbd\x41\x46\x3b\xec\x0a\x69\xa4\x86\xf0\x56\xbf\x39\x3f\xb5\x47\x9e\x7f\x47\x6a\x4e\xec\xe4\x31\x60\xd1\xe4\x15\x34\x2f\x05\x41\x38\x7a\x12\xac\xdb\x6b\x8d\xb1\x95\xce\xc6\xaa\x36\x64\x2c\x37\x55\xdc\xd6\x56\xaa\x61\x1d\x73\x1d\x27\x05\xd7\x8d\x76\x2d\xe9\x70\x65\xbe\xeb\xf3\x66\x75\x84\x40\xab\x07\x7d\x44\x19\x1c\xf0\xd4\xbc\x98\x15\x9f\x0c\xf8\x02\x1e\x77\xd7\x22\x76\x74\xb6\xdf\xda\x7f\x90\x71\x0f\xf6\x12\xf8\xa7\x0e\x4f\xe1\x78\x90\xe3\x36\x69\xc2\x05\x49\x84\x8e\x42\x0d\xae\xfe\xf9\x94\xd8\xbd\x03\x27\x18\x8a\xb2\x16\xad\x11\xcd\x21\x8a\xc9\x55\x6b\x12\x1b\xbe\xe9\xaf\xf9\xc7\xc2\xad\xbd\x04\xdd\xa1\xf5\x8c\x9a\x2b\xf6\x87\x4c\x71\x11\xbb\xeb\x8f\x3f\xf3\x2d\xe4\x07\x73\x85\xb8\x52\x1e\x76\x1f\x75\xdb\xc8\x74\x50\x37\xdc\xb7\xf8\x4e\x82\x45\x08\xb8\x16\xad\xc6\x27\x5f\x04\x57\xed\xc8\xe3\x97\x77\xc7\xdd\x32\x2a\xd1\xd9\xfc\x43\x95\xe3\x11\x57\x3f\xe1\xb2\xd1\xd5\x78\x66\x5d\xa5\x3d\x1a\xec\x92\xd9\x6b\xb2\xf0\xf5\x16\xd2\x8a\x73\xb1\x2b\x9a\xa7\x47\x17\x5c\xc1\x2e\x5a\xb3\x70\xbc\x21\xf5\x39\x6f\x9e\xf7\xe0\xcb\xa5\x6a\x6a\x96\x25\x7f\x69\x2a\xf2\x2e\x7d\xda\x0e\xdd\xa5\x66\xcc\x83\x4d\x55\x5d\x68\xc4\x0b\xa2\x3e\xe1\x77\xfc\x82\x52\x94\xc7\xe5\xc7\x31\xb6\x61\x35\x18\x08\x0f\x75\xa6\x33\xcc\x2e\x15\x47\x8a\xbd\x8f\x4e\xad\x40\x96\xf0\xb3\xbf\x37\xe1\x6a\x74\xa3\x9b\x46\x6f\x4b\x33\xfd\xb2\xa2\x59\x38\x2d\xa9\x54\x34\x9c\xf7\xc5\x10\x70\xed\x42\xa8\x16\x42\xef\xe3\x12\xcb\x8e\xd5\xce\x4b\xd1\x25\x2f\x22\x1e\xf6\x4a\xf9\xcd\x66\xcd\xeb\x37\x58\x1f\x1b\x5f\x93\xeb\x56\x19\x73\xa1\xa7\x0a\xfb\x67\x62\x67\xf0\x3b\xdc\xb5\x2a\x0e\xef\x5f\x14\xee\x5b\x1b\x7a\x3a\x21\xdd\xcf\x5d\xda\x4d\x5c\x95\xe6\x23\x28\xb6\x73\x04\x9f\x1e\xd3\x4d\x06\x49\x22\x09\xf1\xbc\xd1\xd6\xfa\x62\x8d\xfc\xc2\x2c\x25\xa9\x1f\xc7\x3a\x22\xeb\x42\x1b\x83\x33\xb8\xce\x8b\x48\x82\x67\x0b\x5c\x3c\xa7\x98\x46\x43\x61\xd3\x72\x80\xfc\x42\xe1\x6a\x54\x84\xf4\x99\x05\x9f\xe6\x10\x5f\x43\xd9\x49\x86\x05\xd0\x55\xc5\xaa\x1e\x4c\xf3\x3c\xc8\xc3\x83\xde\x3f\x44\x36\x37\xbd\x9f\xeb\x25\x43\xd8\x5f\x90\x6a\xb1\x4f\x91\x41\x75\x48\x3b\xee\x1e\x12\x2f\x0e\x04\xb7\xb0\xc0\x47\x24\x16\x53\xb1\x0f\x2a\x02\x5c\x90\x4d\xdc\x54\xac\x2a\xb4\xb4\x53\x5d\x57\xd2\x3e\x4a\x18\x5b\xb8\x27\x45\x6c\x7d\xde\xed\xfe\x33\x2d\xf4\xcf\xd5\xe5\xab\xb6\x37\x11\x29\xdf\x9d\xba\x1c\xd3\xc2\x31\x0e\x7c\xcf\xec\xf1\xa6\x18\x47\xe7\x8d\xdd\x75\x0f\x05\xbc\x2d\xd6\x30\xb2\x05\xc0\xe2\xc7\xfb\x57\x04\xd2\x7a\x44\x17\x7c\x0c\xce\x5d\xa5\xb6\xc0\x36\x15\x92\xb7\x93\xd8\x7c\x35\x8c\x7c\xad\x1b\x66\x49\x01\x1a\x37\xe9\x05\xd6\x58\xb9\xd1\xc5\x06\x34\xf3\x41\x1a\xf7\xc3\x0b\x02\x96\x9b\x2b\xf9\xb6\x76\xfc\x6b\xc7\xb7\x55\x27\xa1\x0f\xa8\xcf\xa2\x6b\xf7\x79\x79\x47\x3a\x09\xdd\x97\xa3\x5d\xee\xfd\xd5\xf5\x18\xc7\x68\x93\x8f\x25\xcc\x3f\xac\x25\x7e\x91\x53\xb0\x26\x9f\xce\x2f\x77\xd8\x7a\xdc\xbd\x0e\xf3\x43\x31\x91\xcb\x2f\x68\x68\x08\xa6\x77\xe3\x86\x84\xb6\x77\xf1\x11\x14\xe1\xd9\xe1\xa6\xbf\xd1\xad\x61\xd9\x2c\x4b\x88\xd9\x5e\xa6\xdd\xab\xec\xd9\x03\xdb\xe1\x84\xe4\x33\x4b\x5d\xd2\xb3\xc6\x39\xb3\xed\xc1\x85\xf9\x28\x2a\x6e\xe6\xf0\x16\xfb\x93\x1e\x10\x12\x20\xef\x5a\xd1\x52\x6b\x12\xf9\x56\x58\xca\xc6\x0a\x04\x8a\xc8\x9f\x36\x32\x11\x58\x85\xbf\xb6\xeb\x2a\xdd\x86\xe5\xc7\x1a\x8f\x84\x11\x40\x89\xa1\xa8\x44\x14\xb5\xfe\x35\xc5\xf9\x7d\xce\x2d\x89\xf6\x8a\xc6\x19\x9d\x95\xce\x6f\xec\x51\x91\xdc\x76\x8f\xd6\x86\x33\x6f\x19\xc3\x4e\xce\x02\x9c\x66\x2e\x88\xc4\x7a\x61\xba\x77\x2f\xe2\x4b\x8d\x68\x26\xfc\xd6\xf1\xaa\x9d\xfb\xd6\x98\x06\xd9\x2a\x85\xeb\x77\x10\xe3\x9f\xd6\xd9\x2f\x4d\xf1\x73\xff\x5c\x93\xad\xf9\x1d\xb9\xb3\x3e\x43\xdf\x6d\xfd\xed\xaa\x2a\x05\x31\x2b\x9a\x8f\xe6\xee\x26\xfa\xab\x28\x17\x27\x34\xfa\x01\xff\x12\x57\x65\x8e\xb3\x08\xcd\x6c\xdc\x74\xc3\x47\xa4\x95\x67\xeb\x69\x61\x4c\xe9\x6f\x99\x1d\xf4\xbb\x22\x56\x04\x0a\xfb\x79\x6d\xb7\xc6\x37\xf9\xbf\x47\xe7\x34\x60\x64\x47\x82\x2d\x12\xfa\x38\x71\xcd\x2b\x6f\x4d\xca\xda\x0f\x8d\x56\xef\x2e\x1a\x62\xc2\xbc\x39\xb5\xdc\x15\x59\x8d\x78\xeb\xc9\x3e\x57\xaa\x57\xf4\xbd\x57\x3b\xb6\x8f\x35\x87\x54\x48\xd3\xd6\xf4\x54\x86\x33\x5e\xb3\x49\x90\x2e\x0f\x7e\x9c\xd5\xde\xbb\x1e\xf0\xed\x20\xd7\x1d\x94\xe9\x18\x66\x2e\x4a\x6b\xee\x6a\xe8\xb0\xba\x3a\xc8\x80\x24\x8e\xd7\x4d\xba\x26\xef\x66\x75\xfa\xfe\xe3\x9e\x99\xee\x17\xe3\xde\xb0\xdc\x15\x64\xf9\xe1\x6b\xdf\xb5\x8b\x0c\x31\xfb\xf4\x8f\x4a\xbc\x6a\xad\x89\x61\xcb\x1b\xad\x6f\x7f\x93\xbe\xbe\xcd\xfa\xcc\x88\x97\xc2\xf9\x61\xe2\xc0\x7e\xdf\x25\x2a\xdf\x2f\xe2\xbe\xf0\xf8\xcf\xdc\xf1\x9b\xa9\x33\xfe\x08\x10\x03\x75\x72\xa2\xf6\xd4\xad\xe6\xc6\x90\xcd\x7b\xe4\xaf\xf7\xb9\x99\xa3\x82\x77\xfa\x3f\xae\xc0\xae\x51\x73\x62\x65\xb3\x34\x7f\x85\x9e\xd7\xb1\xe0\x57\xd6\xcc\xeb\x05\x6a\xb5\x3d\xde\x67\x30\x5f\xf4\x78\x2b\x43\xfd\xaa\x82\x0c\xed\x67\xcf\x72\xbb\x0b\xb6\x65\x87\xd9\xb1\xff\xdb\xd4\x32\xba\x2f\xaf\x48\x78\xbc\x26\x46\x08\xb5\x20\x3c\xef\x8b\x3d\xf3\x8c\x47\xec\x48\xce\xcc\xf1\x0f\x42\xfc\x7c\xb2\x61\xdd\x19\x1b\x75\xc2\x3d\xec\xe1\x87\x69\x48\x95\x72\xc8\x87\x7c\xdf\x13\x61\x72\xd5\x7b\x72\xfa\x25\xa7\x7e\x96\x1b\x26\x9c\x8d\x48\x89\x81\x53\x0a\xa1\xa6\x23\xac\xca\xd0\xca\xa7\x50\xa3\x7a\x34\x25\xc7\x8e\x9e\x1d\x11\xc2\xd5\xc8\x99\x39\x52\x59\x4e\x0d\x6e\x6c\x1b\xe7\xc8\x03\x3d\xac\xce\xb7\xb0\x13\xc3\xd1\x47\x38\x18\xef\x2d\x4f\xb7\x5a\x2e\xd2\xb4\xf7\x72\xf6\x25\x42\x86\x76\x2b\xcd\x0f\xd2\x21\xdf\xfe\xff\x23\xeb\xc3\x4d\x70\xef\xce\xf4\x30\x8c\x18\xa7\x70\xee\xb3\x3d\x9d\x57\x31\xb7\xd6\x4a\xc8\xa7\x72\x77\xa3\x75\xbb\xdc\x48\x71\x6f\x10\xdf\xae\x63\xfc\x75\x70\x42\xf1\x33\xe9\xde\x7a\x06\xe2\xd5\x77\x47\x9f\x0d\xd4\x80\x5b\x28\x5d\x35\xfb\xb3\xb3\x95\x23\x48\xbe\xd3\x6b\x91\xe8\x15\xf4\xb4\x42\xa5\xff\xba\xf2\x33\xf6\x9c\xfe\xa1\xe2\xc7\xd5\xb8\xfe\x83\x7b\xae\xbe\xb3\xbb\xdd\xcc\x83\x9d\x33\x4f\x40\xef\xf3\xc2\x41\xb0\x69\x67\xd6\x5e\x64\xb8\xb5\x0f\x38\x1c\x86\xf0\x99\xdd\x70\xc3\x04\xed\xcc\xe4\xce\xb2\x02\xc1\x26\x6b\x27\x7c\x18\x97\x7a\x07\x47\xff\xac\x1f\xe6\x4c\x9c\xae\xa3\xb2\x1d\x90\xd9\x12\xd9\xdd\x4e\x96\xdc\x71\x6a\xa9\xa3\xcc\x16\x41\xdf\x84\x9b\xe9\xc5\x32\xd1\x0e\x51\xba\x64\xb5\xa6\xd7\xb7\xb7\x99\xfb\xa4\xbb\x65\xcd\x3c\x5b\x97\x8a\xbe\xeb\xef\xe1\x78\xb2\x20\xe4\x96\x42\x3f\x2b\x5b\x6b\x0e\xc1\x8e\xf5\x25\x62\x09\xcc\x56\xad\xe0\xcf\xfa\xab\x34\x38\xfe\x0b\xa2\xc3\x1f\x72\xa5\x94\x72\x41\x4b\x24\x6c\x5e\xee\xb7\xce\x53\xca\x2a\xd9\xaf\xd2\x9e\xa7\x5b\x6e\x2f\xf7\xc0\xb3\xf7\x0e\xe1\x1c\xb4\xb7\x71\x0c\xd3\x36\x3a\x7f\xe2\x80\xdd\x2e\x69\x03\xf2\xa0\xf9\xc2\x94\x3e\x3a\x54\x3f\x3d\x84\xe9\xbe\x84\x45\xc3\x8f\xce\x79\x34\xaf\xd5\x68\xb3\x80\x43\x53\x59\xd0\xca\xe5\xa9\xbd\x98\x53\x8a\x0c\xa8\xc9\xc7\x61\xde\xe8\xde\x3f\x53\x69\x82\xe6\x08\x8d\xef\xfd\xa9\x8e\xd5\x43\x5c\x78\x0c\x37\x28\x02\x5e\xe8\x1c\xb4\x46\x58\xb7\x67\xfb\xdc\xca\xf6\x61\x35\x0d\x92\x83\x58\xa0\x76\xcc\x2b\x12\x03\x46\x5e\xfa\xa4\x47\xe1\xf1\x9b\x0b\x4b\xec\x7f\x40\x79\xba\xb0\xf3\x80\x05\x39\xf3\x2a\x74\xbc\x8f\x21\x32\xea\xd7\xa5\x0d\x14\xf1\x91\x7d\x70\x45\x0f\xee\xb7\x55\x2e\x3f\xd7\xc4\x61\x53\x0e\x62\xe6\x53\x56\x64\x5a\x58\xd1\x08\xa0\x96\xb9\x42\x58\x45\x0d\x32\xdc\xc7\xc9\x3c\x32\x45\xa8\x9c\x69\x79\x69\x74\x2b\x4d\xad\x35\xdc\x6b\x34\xe1\x81\xa0\x7a\x56\x22\xcf\x64\xc1\xc7\x87\x4c\xc2\xc2\xc2\xcf\x5a\xed\x40\xae\xd3\x25\x1f\xd9\x1a\x97\x67\x1f\xf1\x26\x7d\x8d\xd8\xa1\xf4\x1f\x8d\x1a\x97\x48\x9f\xb0\x15\x50\x0e\x5e\xbe\x7d\x8b\x7b\xb2\xeb\xcc\xed\x1b\xf9\x81\xc8\x4f\x7f\xc4\xad\xcf\x14\x7e\x0f\xec\x5d\x5d\x47\x9c\x95\x61\xbd\x39\xa3\x1b\x78\xf7\x37\xc2\xac\x31\xa4\x95\x8f\x4d\x34\xc0\xf7\x28\xd9\x14\x3d\x1c\xf9\xaf\x56\x20\xf0\x82\xeb\x0e\x69\xe1\x8e\x38\xb3\x5c\xcb\xd0\x62\x1b\x05\x69\x1f\x79\x26\xf4\x7d\xa8\xef\x82\x42\x8e\xf2\x90\x2e\x64\xeb\xce\xbd\x3a\x7d\x06\xd9\x85\xbf\xed\xd8\x12\x4e\x9a\xb1\xad\xce\x2d\x4f\x7b\x94\x3b\x07\xca\xc9\xe8\xd6\xa3\x59\x2f\x5f\xd6\x14\x11\xe2\x2f\xab\x32\x34\x19\xe1\x6b\x56\xe5\xbd\x0d\x2e\xcd\x46\xab\xdb\x21\xad\xfd\xf7\x83\x27\xf4\xc9\x22\x98\xd8\xc2\xbb\x0e\x98\xed\x8c\xb8\xa9\x1f\x4e\x9e\x92\x79\xd7\xbb\xb2\xe1\x2e\xff\x55\x96\x09\xd8\x6a\x13\x57\x60\x1b\x3a\xba\xed\xde\xdc\x6c\xe2\x33\xdd\x9b\xde\xff\xb7\xfa\x7e\x13\x0b\x79\x63\x83\x6d\x59\xba\xee\xe6\x93\x22\xf1\xca\xfa\x61\xba\x9a\x20\x2d\xfd\xdb\x53\xaf\x61\x0d\xbb\x4e\x18\x74\xac\xa7\x82\xe9\x6f\x3f\x96\x15\x0b\x78\xdd\x47\xaf\xc7\xae\xe5\x40\x6b\x08\xfd\xf0\x52\xe3\x9a\x44\xa0\xb2\xf5\xa4\xe0\xdd\xb6\xd9\x21\x90\x80\x47\xfb\xc7\x5e\x27\xf2\x96\xde\xbf\x50\xb9\x77\x91\xc7\xa6\xad\x82\x4a\x25\x3e\xa6\xbb\x41\xb5\x0a\x23\xba\x79\x00\xf4\xe4\x5e\x11\x6b\x3e\x45\x8b\xb7\x8a\x8f\x1e\x6d\x11\xf3\xc4\x0a\x44\x86\x4e\x40\xd5\xa3\xaf\x0f\x81\x22\x05\xd0\xdf\x58\xdf\x0b\x7f\x4e\x3f\x39\xa7\x46\x94\x5f\xa0\xad\x2c\x4c\x6e\x2b\x23\x22\x6e\x5c\x48\x2f\xd0\x30\x36\xef\x27\xcb\xf0\xa3\xb6\x41\xb6\x6f\xe6\x47\xe1\xc0\x5a\x27\xc6\x91\xd7\x36\xa4\x0e\xcf\xcc\xbe\xd0\x9f\xec\x20\xd5\xf1\x48\xf4\x54\xde\xe1\x38\x25\xc6\xd3\xe7\x9a\x44\x32\xd9\x69\x7d\xb1\xd7\xb9\x92\x49\x0e\x51\xb4\xc8\xba\xaa\xf5\x6d\x11\xaa\x8d\x2d\xac\x33\x3e\x11\xeb\x09\x17\x2a\x5f\xec\x28\x48\x68\x57\x58\xef\x4b\xb3\x15\xe4\xa5\x05\xaa\x86\xd8\x18\x62\xd3\xdb\x1d\xb2\x69\xf9\x8d\x6e\x38\x12\x1f\xa8\x45\x8e\x8b\xf2\xa5\xf5\x17\xb9\xba\x22\xb6\x44\xf3\x67\xe6\xfd\x7a\x39\x41\xaa\xc0\xaa\xf4\xa7\xb5\x44\x67\x1e\xe5\xf7\x0a\x33\x0e\x75\xdd\x91\xbe\x62\x45\x05\x72\x94\xd4\x8a\x1f\x3f\x1e\x70\x33\xc9\x00\x5d\xba\xb2\xf5\xae\x74\x8d\xc3\xfd\x1c\xfd\x96\x5b\x63\xa9\xb5\xae\x9d\xd2\xc9\x85\x3d\x2e\x0d\x28\xf7\x90\x06\x18\x0e\xf1\xc3\x29\x1c\x3a\x26\xb6\xe4\xd4\x08\x5b\x41\xab\x16\xdd\xca\x79\x19\x18\x2c\x29\x1c\xe2\x86\x77\xa1\x43\x9c\xf0\xdc\xf9\xfe\xae\xf4\xe3\x44\x6b\xa0\xc1\x75\x65\xce\x0c\x45\x04\xb3\xa3\x1c\x33\x58\xe3\x00\x30\xfe\xa6\xc6\x27\x96\xf1\x0f\x1c\xb0\x38\x18\xbe\xbd\xf2\xc1\xb4\x48\x55\x81\x74\x7e\xf5\x19\x1e\x9b\x41\x80\xa7\x60\x3b\x54\x38\x76\xc1\xd3\xbb\x08\x3b\x5a\x6b\xb8\xe3\x90\x3f\x2e\x05\xf1\x85\x78\x3c\x2d\x31\x90\x56\x1a\x07\xbd\x89\xf8\xf4\x01\xab\x7b\x23\x7d\xb7\x19\xe3\xe8\x54\x0d\x5f\x64\x59\x24\x7b\x50\xf1\xe2\x17\x04\xdd\x90\xc3\x53\xce\xff\xaf\xac\x85\xb1\x6e\xcc\x3d\x1c\x79\xc8\x81\x2a\xa9\xb6\x70\x0c\x15\xd0\xd8\xb2\xe7\x47\x98\x20\x06\x77\x79\x95\x5f\xf2\xe2\x2f\xe5\x98\x7e\x55\xc4\x52\xc0\x87\x7b\x78\x0e\xa0\xbf\x7c\x98\x59\xb3\xb0\x80\xe6\x26\x45\x80\x97\xfd\xf1\x7e\xb9\xa0\x49\x67\xc5\xe0\xd9\xaa\x2a\x0e\xec\x06\x52\x36\xea\x66\x05\x8c\xf7\xf0\xf6\x2e\x28\xf6\x98\xbe\xa4\xaa\xa0\x70\xfc\xeb\x9e\xf9\x49\x99\x87\xdb\x9a\x6b\x97\x8c\x1c\xf5\x4b\xe3\x8e\xb3\xaa\x39\xa7\x17\xef\x80\x33\xcc\x8b\x83\xfc\xc7\xfd\x61\xc0\x70\x71\xe5\xd7\x3c\x05\xda\x7b\x6a\x8f\xaf\xba\xa5\x0a\xaa\x67\x0f\xdb\xdf\x8e\x63\x78\x02\x8a\x2a\x85\x4a\xfb\xc9\x3e\x4c\x18\xbc\x8f\xe7\xe2\x18\xd8\x1f\xf4\xc8\x61\x51\x25\x87\xc8\x94\xf1\xe0\x6b\x65\xeb\x38\x65\xed\x8e\xfa\xd5\x02\xc8\x3b\xfd\x85\xc8\xdb\x66\x59\xda\x88\xfb\xd2\xe3\xf0\x1b\x7f\xc7\x96\xd8\xd3\x69\x0d\xc4\x2f\x6b\x91\xc9\x3f\xeb\x69\x27\xec\x97\x49\x77\xcb\x27\xe4\x8e\x88\x9e\x26\xd9\xb7\xf3\x3e\x0c\xd2\xec\xb8\xff\x82\x04\x46\x7e\xd6\xd1\x22\xe2\xbb\x43\xdc\x90\x4e\xe6\xd2\x76\xbe\xff\x4f\xf1\x1b\x04\x1a\xc2\x09\xdb\x03\x3a\x34\x04\x98\xc2\xb6\xf4\x9b\xe5\x3f\x15\x35\x47\x0e\x2e\x77\xfe\xc9\xe9\x33\xa2\x2b\x00\xf1\xe0\x03\x8f\x58\xb8\x82\x32\x26\x46\x75\xf5\x6b\x9b\x19\xb4\x94\xbc\xdc\xa4\x99\xd9\xfb\x6e\xef\x80\x97\xda\xf0\x3c\x55\xbc\xd0\x11\x4a\x7c\x37\x57\xd9\x7c\xb3\x45\x25\xe8\xef\x04\x34\x67\x62\x90\xa1\x74\xf2\xba\xf9\x53\x45\xd3\x7d\x7f\xfc\x96\x7a\x7f\x7a\x96\xa2\x6e\x7f\xca\x29\x80\x1d\x9d\x51\xee\xe2\x14\x25\x2a\x0d\x80\x62\x15\xc6\x9f\x9b\x2d\xcd\xbb\xc5\x07\x4a\x3c\x3f\x51\xbf\xf2\x76\xf7\x46\xf2\xd2\x14\x72\x63\x0b\xfb\xf9\x01\x44\x2c\x1a\x6d\xd2\x2b\xf5\x95\xbd\xa9\x7f\x31\xf7\xfe\xc5\x69\x26\x94\xab\xf2\x81\xbb\x28\x49\xbe\xea\x51\x3a\x7f\xe2\x5e\x11\x68\xc2\x1e\x06\xaa\xd8\x34\xdb\xf1\x09\xd3\x54\x2f\x22\xb2\xba\x7e\x2b\x2d\x49\x34\xba\xd8\xd0\x5d\x2e\x87\x25\xc4\xef\x4f\xe5\xbc\xee\x86\x36\xd4\x66\xee\x57\x83\x59\x63\xef\xd4\x14\xe4\xeb\x4d\xbd\x3e\x5c\x53\x97\xfe\xa6\xfd\xdf\xcd\x33\x7c\xcf\x41\xcc\x26\xd3\xf8\xac\xdc\xeb\xce\x55\x3e\x7c\x30\xd5\x7e\xa8\x84\x38\x36\xe6\x5d\x9c\x11\x2d\x74\xc2\xdc\x81\x0b\xd5\x31\xb9\x6f\xc3\x80\x24\x97\x16\x4f\x81\xbb\xb4\xa4\x7b\x23\x42\x4c\x5c\x81\x26\xd8\x83\xa3\x4a\x2c\xd2\x8b\xcf\x52\x6b\xae\xd2\x21\x3f\x41\x85\xad\x9d\x2d\x44\x2d\xfa\x08\xb1\xde\xbd\x6a\x80\xb9\x89\x30\xcb\xa3\x91\x8e\x0e\x76\x14\x56\x10\x6c\x74\xb7\xb6\x36\x87\x44\x94\x23\x8f\x32\xfd\x3c\x22\x77\x00\x1e\x17\x7c\x3f\x44\xe7\xdf\x0f\x51\x3b\xf7\xf8\x44\xfd\xc8\x2b\x40\x26\x33\x04\x46\xb0\x70\xdb\x3e\x22\x24\x02\xec\x77\xb7\x7d\xb0\xf7\xb5\xa9\x48\x37\x29\xe6\xf6\x4c\xe3\x1c\xf6\xa4\x3b\xb2\xd5\x12\xab\x11\x6b\x3e\x12\xbb\xde\x5d\xf4\x0e\xeb\x73\x7d\x63\xab\x83\xdf\x36\x5b\x7d\x55\x67\x01\xd4\x2a\xef\xd8\xb7\xee\x87\x0d\x44\x6f\x3c\xea\xe0\x5c\x23\xc1\x62\x05\x21\x45\xab\x25\x18\x71\xae\xcf\x23\x40\x22\x81\x51\x09\x75\xce\x8a\x20\x7c\x32\x04\xf0\x7a\x63\xd1\x0b\x60\x91\x23\x41\x22\x6f\x7b\x0b\x13\x6d\x00\x20\x0b\x9d\xf4\xd6\xbe\x44\x71\xbb\xf6\x69\xa8\xac\x54\x5c\x73\xca\x85\xed\x64\x0a\x36\xff\x06\x47\x40\x66\x06\x10\x59\x90\x1f\xf0\x97\x43\xc9\x64\xd5\x2e\x73\x5c\x2a\xd1\x0e\xf5\x1e\xcb\x9d\x3b\xc6\xba\xdc\xf4\x1b\x83\x8f\x4b\xf2\xad\x76\xa9\xbe\x4f\x2e\x4e\xdf\x15\x04\x52\xf8\x8a\x78\x35\xfb\x60\xc9\xb3\x05\x2b\x80\x26\xee\x4b\xe3\x83\xce\x2c\x99\xe6\x60\x80\x88\xc2\x3a\xcb\xc9\x6f\x5e\x0a\x2b\x9a\xf2\x0f\xb9\x0e\x30\xb4\x33\x42\xe6\xb2\x8a\xcb\x34\x07\xd5\x70\x2e\x5d\x47\x36\x9e\xed\xe6\xce\x19\x08\xd9\xcf\xcc\x43\xf2\x2f\xeb\x05\x70\x83\x07\x56\x3a\xc7\xd2\xdd\x74\xb0\xd9\xce\xb8\xdf\x41\x27\x48\x14\x73\x4c\xf5\xbf\xc2\xc7\x38\x95\xdd\xb1\x71\x0b\x64\x6a\xaa\xe1\x7a\x31\x05\x42\x3e\xc1\x91\xc8\xaf\x54\x94\xf1\xff\x30\xf2\x58\xf3\x78\x9e\x16\xab\x9e\xbb\x93\x40\x74\x8a\x93\x10\x93\xc0\x12\x25\x51\x09\xe6\x5e\xfb\xd5\x69\x6c\x2e\x0a\x8a\x7a\xbf\x1b\x43\xef\x10\x08\xe0\x35\x51\x04\x44\xd4\x88\x23\x85\xd9\xb9\x80\x92\xe5\x47\x4c\xff\x0d\x30\xb0\x53\x2c\x98\x5f\xc6\x87\xcd\xfe\xd1\x1f\x3b\x61\x10\x63\x73\xd8\xb1\xfb\x67\x91\x80\x56\xf0\xe9\xf3\x08\x33\xa2\xa7\x40\xbc\xe7\x02\xfd\x16\xbd\x22\x19\x8c\xe3\x9f\xb5\x1e\xea\xe9\x96\x2a\x10\xd4\x0b\xf7\x58\x22\x29\x5e\xe4\x5b\x5c\x12\x72\x5c\xe8\x39\xcd\xb4\xca\x24\xc2\x01\x63\x14\x71\x87\xdb\xd9\xf1\x09\x4f\x6d\x64\xc7\x27\x49\x72\x39\x86\xa8\xaa\x83\xb4\xa1\x0e\xe5\x5c\xe5\x93\x6f\x17\x89\x5d\x7a\x4a\x16\xb2\x0f\xe4\xc8\xf3\xce\xb2\xe8\xb1\xee\x48\xb6\x0d\xb8\x5c\xc4\x64\x68\x26\xcb\x30\x69\xd8\x14\xd4\xb3\xc8\xce\xf7\x81\x7a\x69\xf3\x9a\x8a\xb1\xf3\x2a\xd8\xc0\x76\xbf\x54\x33\x9d\xa7\x5b\x88\xfb\x07\x19\xf3\x8d\x36\x1c\x11\xb5\xe1\xba\x82\x34\x78\x89\x5e\xdb\xfb\x93\x92\xf3\xef\xd9\xe4\x66\x0c\xa9\x70\x2f\xe0\x20\x1c\x76\x5d\x98\x05\x89\xfa\x62\x47\x03\x6b\xa4\xc9\xde\x5b\x37\x00\x86\x19\xbe\x94\x68\xf0\x03\x24\x19\x62\x5f\x52\x8c\x57\x84\xb8\x74\xdc\xbb\x41\x8a\x08\xb7\x5f\xc4\x66\xcb\x55\x08\xa4\x83\x98\xb9\x9c\x92\x03\x59\x49\x75\x37\xf2\xb4\xe3\x29\xc2\x47\x38\xff\x84\x1b\x9b\x10\x93\x23\xa2\x62\x2b\xb1\xf8\x4e\xc1\xa7\xe4\xd8\x8b\x4e\x51\x8e\xe1\x8c\x60\xc5\x41\x31\xbb\x5d\x8a\xf2\xe8\xaa\x62\x30\x1c\x9c\xc2\xdb\x6a\xd3\x63\x9f\x37\xd1\x1b\xb6\x20\x1f\xf6\xac\x65\xed\x1a\x54\xe6\x61\x8a\x69\x61\x0b\xe7\x08\xd2\x62\x83\x22\xbd\x27\x39\xb9\x08\xc5\x15\xc2\x84\xf4\x88\x0a\xcd\x7f\x40\x4b\x70\xf8\x56\x71\xf1\xcf\xaa\x48\x8f\xf0\xd9\x7f\xe3\x86\xf2\x9a\xc9\xde\xf9\x12\x8b\x90\x04\xdb\xba\x0f\x3f\xf9\xcf\x0a\xaa\xbb\x2f\xe9\x23\xf5\x26\x2d\xdf\x1e\x72\x84\xef\xf3\xb5\x82\x11\x86\x26\xef\x2f\x9a\x82\x60\x5c\x53\x8f\x7f\xec\xe2\xa6\x5a\xdd\x2d\x6e\x93\x8d\xc3\x1d\xd3\x93\x8b\x66\x89\x30\x59\x0f\x3b\x6e\x5b\x8f\xcc\x34\xaa\x76\xcf\x2f\x11\x90\xad\xe1\x25\xd0\x11\x0e\x72\x42\x55\xfc\xd6\x71\x6d\x8b\x48\x90\x39\xdf\x00\x43\x88\xb5\x80\xee\xf9\xf8\x7f\xf4\x52\xfe\x49\xe1\xee\x35\xaa\xa8\x9b\xe8\x37\xba\xe6\x6f\x09\x04\x66\x54\x8a\xe4\x55\x64\x06\xe0\x2e\xf5\x64\x4f\x5c\x41\x73\x06\xcb\x82\x1e\xf7\x4b\x92\xcf\xdf\xe9\xe2\x59\xbf\x53\xdc\xbb\xc8\xc7\x3b\x93\xdd\x9e\x87\x16\x68\xa3\x02\x88\x06\xd9\x42\xf2\xe9\x2e\x7d\xfd\x4b\x33\x8b\x20\xa4\x8c\xa8\x5a\x7a\xa7\x2d\x70\x99\x23\xdb\xf5\x34\x52\x90\x8c\xea\x0a\x95\x45\x88\xac\x8b\x22\xea\x50\x2d\xc5\x90\xf5\xb8\xbf\xf6\xe7\x7b\xd9\x53\xd9\x02\x1c\x76\x07\x24\xd6\x30\x28\x4a\x84\xe1\x40\x0e\xc9\x08\x39\x38\x54\x05\xfd\xc9\xaa\x2c\x5d\xff\xc0\x76\x0b\xc9\x17\x25\xe0\xb5\x23\x0f\x2a\xe9\x6d\xbb\xe0\x9c\xe9\xbd\x04\xa1\xed\x88\x7c\xfb\xb0\x68\xfc\xdf\xad\x67\x61\x95\xe8\x4e\x6b\x13\xb8\xdf\x31\x36\x6d\x3f\x6c\xf3\x95\x29\x13\x06\x38\xc2\xf6\xc1\x8e\x1c\x48\xaf\xb4\xb3\x8b\x0b\x7b\x5e\x2a\xb2\xbc\xf2\x70\xd6\xc3\xfe\xa4\xc8\xc5\xca\x2b\x47\x9b\xf6\x9c\xce\xa0\x5d\xf8\xb7\x41\xb9\x40\xc7\x68\xbb\xc1\x46\xb2\x2a\x46\x5a\xb2\x01\x1e\x65\x5d\x85\xc3\xb1\x65\x6c\x8a\x0b\xb4\x15\xbf\xe9\xe0\xce\x21\xef\x54\x95\x58\x87\x32\xe9\x6a\x04\x39\xad\x21\x07\xaf\x85\x55\xd5\xf7\x48\x8e\x73\x2a\x10\x1b\x83\xa7\x0f\xf3\x58\x5a\x6e\xc7\x5a\x66\x72\x8e\x31\x5f\x5a\x55\x7a\x15\x72\xb3\xd7\x1e\x2a\x4a\x71\x2e\xfa\x11\x58\xba\x3e\x9f\xdf\x8d\x9b\x71\x6a\x47\xc7\xba\x65\x98\xc3\x9f\x5b\xac\x4d\x0a\x76\x54\x6e\x5d\xee\x1b\xce\x25\x9c\x2a\x42\xea\xd0\xec\x41\xc2\x58\x61\xf5\x7c\x53\xf6\xb7\xa8\x0e\x38\xb7\xda\xe4\x5f\x95\x02\x6c\x81\xab\x35\x0b\xaf\x90\xe6\x83\x79\x21\x7f\xeb\x12\x0a\x07\x2f\xb2\xca\xfe\xab\xc8\xa2\x77\x5b\xb2\x60\x4c\x92\x0a\xb8\xc8\xfa\x76\xab\xaa\xba\xe0\x4b\x2e\xe9\x3d\x09\x66\xba\xae\x12\x18\x54\x0b\x2b\x06\xab\x33\xd8\x23\x76\xc8\x5d\x4c\x24\x5d\x99\xcc\xb9\x24\xa2\xb1\xf3\x91\x9a\x4c\x7e\x5e\xaa\x44\xee\xff\x04\xbf\x9c\xd7\x2f\x0d\x46\x85\x1c\x32\x67\x1e\x98\x68\x7d\xdf\xd4\x7b\xfc\xa5\xf9\xee\xe2\xde\xc0\xb4\x12\x3f\xd9\xca\x3d\xaf\x19\x8a\x0f\xb2\x59\xc5\x0d\x8d\xfe\x79\x9f\x2d\x9c\xdd\xad\x26\xe0\x37\x18\xd5\xa3\xf3\x40\xbd\x9a\x2b\xe3\xf4\x54\x98\x69\x11\x50\x95\x1b\x47\x24\x13\x94\x9d\xf2\x10\x01\x5d\x9f\x1f\x9c\xd5\x92\x09\xbc\x66\xf3\x47\x19\x1b\xda\x2b\x20\x97\xd9\x99\x53\x22\x3b\x5f\x4f\x96\xea\xb0\x6b\x57\x12\x4d\x3f\x77\x72\xf9\x18\xef\x56\xc1\xf5\x92\x26\x3a\xd6\x15\x44\x14\xa7\x9c\x88\xf9\x03\xa3\xd9\x23\x9c\x66\xe1\x6d\x44\x2e\xe9\xd0\xd1\x6e\x67\x5c\xd4\xca\x8c\xf2\x72\x1e\x4b\xcb\xca\x19\x1d\x4d\xe1\x88\x76\x74\x69\x02\x0d\x50\x96\xc8\x3e\xf2\x18\x05\x3e\x26\x32\xb1\xac\x92\x53\x8e\xf5\xd3\x7a\x22\x0e\xbe\xbe\x1a\x80\x35\xdb\x75\x64\x1e\x76\x51\xd6\xda\x07\xac\xfc\x34\x35\x02\x91\xd1\xe7\x58\xb6\x0d\x58\x8b\x88\xbf\x3b\xa3\x6b\xd3\xbf\xa2\x05\xf7\x4d\x3c\x33\x4e\x33\xf7\x2d\xf0\x46\x41\x88\x07\xd5\x02\x83\xa0\x7f\xa7\x9a\x28\x5f\xc1\x33\x8a\xc2\x5c\x71\xe5\x35\x81\x62\x8c\xb1\x4d\xb6\x6a\x38\xcd\x90\xee\x9d\x59\xd9\x83\x13\x48\x0a\x0b\x33\xa2\x52\x07\x3d\xc1\xfb\xfa\x4d\x44\xa9\x9c\x8e\xc9\x4f\xad\x32\x43\xe9\x17\x41\x40\x76\x27\x0e\xcd\xa0\xae\xb7\x67\x95\x07\x55\x4e\x9f\x20\xa6\x9c\xff\x86\x49\x37\xb3\xdb\x45\xf5\x55\x65\xd4\x09\x36\x0d\x6a\xe5\xef\xaf\x0a\xa5\xfb\x54\xf9\x64\xad\x88\xde\x32\xcf\xc9\x09\x2b\x14\x3f\x58\x9e\xa2\x4a\xe3\x6f\x08\x1b\x14\xa0\x1b\x41\x47\xad\xdb\xd3\xdf\x66\x5f\xd3\x87\x08\x19\xb1\xfe\x58\xa0\x39\xf1\xc5\xc2\x1b\xa9\x0b\x8f\xe6\x2e\x47\x42\x35\x4b\x55\x56\x52\x8a\x27\xe9\x72\x4c\x72\xbd\xca\xca\x62\x65\x58\x55\xc5\x9a\x6a\x51\xba\x19\x6e\xaf\x83\x38\x69\x97\x26\x7e\xae\xd7\x21\x9b\x74\x40\xa2\x28\x23\x12\x55\x94\x7d\xdd\x2c\xec\xbe\x10\x72\x33\x80\x27\x7c\xfa\x68\xda\xf8\x50\x52\x44\xa2\x1a\x23\x38\x8b\x0e\x4b\xb1\xa8\x92\xae\x1f\x97\xfa\x25\x44\xaa\xaf\xff\x69\x34\x35\xad\x31\xb4\x4a\xa4\xb3\xb2\x9a\x22\xc6\x25\xac\x0a\x46\x59\x5e\x68\xb8\x3c\x92\x90\xdb\x2b\x32\x96\x59\x43\xd9\x8b\xd6\x8c\x5f\xfc\xcd\x7f\xb5\xdd\xd8\xee\x10\x4a\x3e\x3e\xaa\x91\xc8\x60\xba\x00\xbb\x84\x23\x3b\x15\x68\x58\xe6\xff\xac\x5c\xa3\x1b\x8c\x13\xd4\xaf\xb4\x87\x9d\x93\x95\x43\x1a\x18\x5d\x52\x31\xdb\x82\x2d\x0a\x4e\x51\x2f\x36\x70\x03\x13\xec\x41\xe3\x19\x02\xfc\xb0\x12\xb3\xab\x54\xa0\x0e\xe7\x50\xac\x4a\x0a\x60\x0a\x16\x2e\xbf\x0c\x89\x49\xb6\xaf\x18\x4e\xc5\xe7\x30\x97\x10\xb8\x14\xc8\x84\xff\x6d\x02\x87\xd8\x41\xd0\x6c\xac\x4d\xb1\x0e\x25\x08\xa3\x26\xaa\x4b\x5c\x2a\xac\x90\x1a\x66\x0d\x14\x2a\xd1\x7a\x07\x41\x40\xf1\x87\xa5\xb5\xa9\x46\x96\x22\xb7\x78\x19\x8e\x7d\xd8\x0f\x1d\xbc\x1b\x59\x12\x61\xce\x7d\xd3\x84\x52\x46\x34\xa4\x6b\x1d\x19\xb8\xad\xd4\x24\x6d\xda\xb5\x49\xab\xd0\xb8\x42\xf0\xf9\xfd\x93\xc6\xb2\x3e\x83\x65\x73\x69\x72\x87\xe9\x16\xef\xcd\x1d\x73\x86\x91\x0a\xcb\xc6\x99\xab\x74\x59\xaf\x07\x3d\x12\x20\x45\xd6\x61\x82\x25\xfc\xe4\x9d\x51\xb3\x55\x99\x4e\x56\x6f\x05\x79\xa6\xd6\x49\x43\x80\x2a\x4b\xa9\x9a\x23\x53\xae\xfb\xc8\xeb\xf2\xfe\xba\xa8\xcc\xf9\xa5\x04\x99\x88\x35\x6f\x01\xee\x6d\x6e\x9a\xa0\xdc\xdf\xa4\x12\xca\xfa\x52\x5a\x5c\xd6\xc8\xfe\x5e\x6b\x40\x51\x63\x84\xb4\xaf\xda\xb3\xad\x1c\x42\xf4\x07\x2b\x21\x6c\x12\xac\x8e\x40\x45\xf0\xda\x04\x0a\x04\xff\x3a\xc8\x53\xb4\xf0\xdc\xd1\x15\xd1\xb1\x2c\x76\xc0\x42\x12\xfd\x16\xd6\x01\x0b\xfd\x9d\xd6\x08\x7e\x71\xb6\x6a\xd8\x0d\x80\xa4\xda\xfc\x71\x8e\xfe\xb7\xf3\xae\xc8\x64\xdd\xd2\x20\x4f\x81\xdc\x08\x38\xe2\xdd\x6c\x63\x51\x54\xdd\x29\x2f\xfb\xed\xb2\xde\xc8\xd1\xd2\xc5\xbd\xf1\x7c\x2c\x96\x75\x36\xd9\x22\x09\x51\x92\x83\x24\x82\x3b\x53\x04\xa4\x8b\x6e\xb2\x90\x6b\xb8\x24\x45\xb7\x22\x52\xe9\x94\xf9\xbd\xae\x94\xf9\x0e\x73\xa2\x79\xf3\x56\xac\x8b\x50\x8e\x99\x84\x72\x94\x58\x9a\xdf\x42\xa3\x12\x50\x14\x3c\xaf\x55\xcd\x58\xab\x47\xce\x3f\x21\x27\x15\x36\xc1\xd4\x11\x7b\x60\x4e\x0a\x7f\x56\x86\x88\x3f\x6d\x3a\x8c\xf2\xb3\xb9\x45\x8b\xa0\xa7\xf7\x9d\xf2\x2f\x2f\x5e\x41\xc2\x4e\xbf\x0f\x4e\x0f\x8e\xcc\x12\x3e\x65\xd3\x3d\xaa\xb1\xb6\xd5\x28\x5f\x83\xfa\x0e\xe3\x65\xd6\x3b\x35\x0c\x33\x81\x63\xb1\x02\x52\xa6\x10\xae\x60\xbd\x68\x53\x08\x73\x7c\xc1\x1a\x07\xc9\x92\xc4\xad\xae\x2b\x45\x5e\x9e\xed\x94\x44\xad\xe0\x48\xc7\xb4\x64\x7f\x12\x51\x07\x0d\x21\x26\x0d\x21\x0b\x5a\x7f\x55\x35\xb6\x64\x89\xed\x4a\x18\xce\xe9\xca\x4f\x42\x2a\xd9\x28\x0d\x9a\x7d\x09\x5b\x75\xf9\x07\x75\x1a\xe7\x25\xb8\xa7\xfa\x3f\x3f\x3f\x4f\x59\xe9\x1f\xfc\x59\xcf\x7b\xc1\x66\xf5\xf4\x19\xdb\x83\xa5\x8c\x4a\x9a\xa0\x50\x3c\x59\x33\xd9\x03\x5f\xda\xa7\x33\x18\x7d\xa1\x11\xaf\x87\x52\x73\xc1\xea\xa7\x76\x6e\x55\x8a\x92\x87\x5c\x71\xd4\x3b\xbc\x9e\x9e\x40\xfb\xca\xc1\xae\xe9\x99\x29\xa1\x78\xb6\x91\xe5\xb3\xed\xa8\x08\x7e\xf7\x5d\xdb\xdd\xa0\xf5\xb9\x5e\x3a\x93\x1c\xe1\x3c\xc3\xbd\x11\x81\x19\xee\x30\x92\x3b\x32\x99\x96\x83\x50\xb5\xa1\x68\x8e\x3f\x14\xbd\x39\x43\x69\xda\xd3\x5c\x22\x42\xba\x5f\x54\x03\xbd\xfd\xff\x38\x3f\xe8\xcf\xb0\xcd\x2c\x83\x6c\x0b\x19\x54\x11\xf5\x54\x53\xf7\x62\xd0\xc2\x52\x34\x6c\xe6\x8e\x9d\x0f\x94\xa3\xd6\x3d\x3e\xbf\x9d\x65\x88\x28\x80\x2d\x6a\x0f\x5b\x76\x95\x28\x56\xaf\x60\xc8\x5e\xc6\x58\xfd\x92\xdf\x8c\xac\x0a\xb6\x3b\x7d\xea\x52\x54\xff\x3d\xca\x08\x3a\x60\x5b\xcb\x2d\xb2\x0f\xcd\x6f\x44\x0f\x6a\x85\x56\x09\x7a\x10\xf2\x35\xf6\x49\x14\xa2\x63\x8d\x37\x12\x7a\x1f\xa1\x87\x30\xc0\x66\xb9\x74\x43\x8a\x46\xaa\x8f\x4c\x1e\xd2\x97\x51\x44\xee\xa5\x14\xb0\x95\x5c\x4e\x8f\x34\xc8\xde\x08\x16\x10\x99\x5a\x1f\xcf\xa5\x28\x5c\x76\xb4\xc0\xae\xd7\x24\x74\x6b\xd2\x24\x90\xdf\x84\xfa\xc3\x17\xb2\xb1\x13\x55\xbe\x6b\x52\xba\xce\x4e\x1d\xc1\x5b\x25\x6b\x26\x99\xdd\x13\xbb\x52\x13\x24\x05\x90\x52\xaf\x95\x38\xd0\x85\x12\xa3\x0b\xc4\xb4\x4b\xdf\x80\xc4\x84\x8f\xb6\x72\x2d\x10\xb2\x10\xfb\xf0\x4d\xee\x52\x0b\x37\xb3\x42\x3a\xea\xb4\x2b\xe0\x30\xf1\x2d\x1c\x0f\x7b\x38\xdf\xc8\x3f\xbf\x80\x46\x24\xec\x8b\x39\x92\x8e\x81\x25\x0d\x18\x21\x05\x72\x2a\x52\xe7\x9f\xf8\xde\x59\xe2\xae\x6f\x8d\x9a\xe1\x53\xe7\xfa\x61\x9d\xf8\xa9\xdc\x36\xde\x9f\x85\x0c\x38\x2b\xea\x38\x14\x7b\x53\xbb\x6f\x0f\x21\xbd\x2d\x4b\x2b\xf3\xd6\x86\xa1\x2d\x89\x35\xda\xdb\x8f\xfd\x57\xd6\x88\x11\x69\x21\x84\xd4\x30\xd1\x51\x0f\x69\x6b\x75\x2c\x2f\x6b\x91\x79\xd9\x05\x3e\xe6\x5b\xec\x4b\x7e\xfe\xf7\xa8\x34\xe3\x0b\x8a\x19\x86\x3e\xdb\x2d\x42\x3c\xe3\x6a\x96\xc3\x57\x19\xf8\x00\x4e\xb3\x17\x7c\xb8\x70\x65\x7b\x46\x2d\xaf\xaa\xbf\xe4\xc1\x89\x14\x0d\xb8\xa9\x2c\x2b\x41\x0f\xe1\x75\xe0\xe9\x9d\x9d\xc3\x55\x1a\x66\x26\x94\xe2\x84\x59\x16\x37\x2b\xf8\x7a\xaf\x7c\x8c\x11\xa3\x9d\xf9\x1c\x3b\x42\x1e\x21\xf3\x6f\xbb\xed\x45\x79\xc7\x2d\xb1\x89\xb6\xc4\x3b\xdd\x17\x25\x4b\x02\x6d\x1f\x71\x67\xc4\xc2\x27\x85\xfb\x11\xb3\x46\x64\xe0\xb0\x42\x5b\xe9\xb0\xc4\x52\x10\x46\xb5\xaa\x28\x37\x47\x24\xe8\x16\xee\x8b\xfc\x14\x93\x0a\xdd\xf8\xff\x6e\x5a\xd7\xde\xe1\x1d\xee\x32\x32\xff\x63\xed\x82\x93\xa8\x58\x9c\xb2\x96\x04\x11\x38\x5b\x95\xff\x02\x38\xda\x6d\xf0\x8a\x78\x6a\x9a\xd4\x92\x63\x01\x39\x1e\xd3\xcc\x6a\x23\xb9\x3a\x98\xe6\x9b\x3f\x92\x21\xd5\xe3\xd8\xd9\xc3\x6d\xfe\x98\x14\xe7\x79\xe4\x7d\xd1\xe1\x67\x4d\xa6\xc4\x39\xb6\xe3\x88\x55\x05\x87\x26\xfe\x9b\xdf\xc1\xff\xbb\x13\x3d\x08\x0f\x9f\x96\x84\x99\xed\x10\x3a\xe2\xea\x03\x47\xeb\xca\xbc\x5e\xb4\x43\x01\xa3\x53\xce\x24\x47\x5d\x28\x7b\x4c\x5a\xad\x9c\xfc\x8d\x1a\x8f\x7f\xb5\xc8\x76\xfb\xd8\x4f\x62\x91\x41\x2f\x0f\x9e\x1a\xf5\xfe\xfa\x0f\xab\xbf\x30\x41\x24\x64\x91\xaa\xad\x5b\x0d\xb8\x86\x17\x97\xb3\xfd\xc0\x8b\x03\x4b\x72\xfe\x36\x6a\x03\xb6\x92\x65\xe1\x89\x0c\x13\xb9\xdf\xaa\x78\xb1\x05\x47\x64\x5b\xe4\xad\xd9\x56\x10\x45\xdb\x51\x59\x49\x7e\x02\x71\xb3\xae\x84\xf8\x13\x1d\xb1\x34\xd7\x6c\x30\x1c\x30\x05\x31\xc0\x99\xe1\x66\xf7\x15\x65\xd3\xf9\xd2\xdc\xdc\xde\x02\x19\x2e\x82\x9d\xf1\xf8\x7f\x2d\xfa\x98\xd6\x8c\x99\xe1\x4a\x98\xce\x16\xd5\xa2\x31\x19\x41\xe2\xe6\x30\x04\x21\xeb\x0e\x23\x65\x56\xa1\xc1\x71\x03\x3f\xab\x36\xa2\x56\x11\xbc\x76\x0b\x34\xd3\x6c\x36\x1d\x41\xa6\x87\xc4\x20\x4c\x1d\x97\x18\x89\xaa\x44\x1d\x03\x29\x84\x0f\xa2\x6c\xe0\x53\x27\x89\x55\x48\xad\x94\xc8\xb3\xdc\x9a\x72\xd6\x2e\x29\xcb\xf3\xa5\xf4\xb8\x5f\xf4\x16\xd2\x96\x64\xe1\xb3\x84\x1d\xc6\x82\xc3\x4a\x0b\x79\x60\xb9\xa3\x05\x8f\x2a\x7c\x80\x89\xf5\x43\x00\xdb\x11\x0c\xaf\x18\x27\xcd\x76\x51\x32\x88\x29\x88\x94\x33\x62\xf7\x7d\xeb\x9d\x97\x24\x82\x83\x15\xa8\x51\x9d\x6e\x9f\x58\x00\xbd\xaa\x2c\x46\xdf\x71\xdd\x60\xa9\x50\x2b\x27\x91\x7f\x7c\x91\x36\xc7\x80\xf1\xb5\x91\x2f\x51\x4e\x1f\xec\x17\xb6\xe9\xb0\x92\x0c\xbf\x5f\x8c\x7d\x88\xbf\x85\xb6\x06\x0e\x5c\xbf\x9a\xb0\x54\x19\xff\x36\x21\x88\xbd\x82\x4b\x99\x48\x21\xdb\xa2\x5a\xb3\x9e\xf4\x15\xf5\xe6\x67\xba\xe9\x91\x35\x25\xb7\xe9\xe3\x2a\x87\xb1\xb0\xcf\x69\x02\x9f\x6b\x7e\xc0\x56\xd4\xa4\x57\x18\x74\xd9\x09\xab\xa9\x25\xe2\x0a\x78\xd6\x83\x24\x16\x45\xa9\x46\xea\x23\xe7\x36\xa3\x9d\xd9\xba\xa4\x47\x9c\xda\xf2\x9f\x97\x9b\xd3\x88\xe2\x4d\x26\x29\xa5\x59\x1f\x8f\x3e\x84\x7e\x38\xbd\xdc\x93\x50\xed\xaf\x56\x75\x9b\x02\x71\x93\x17\x71\x6a\x59\xc2\xb0\xcd\x7a\x90\x60\x7e\x8a\x3f\x16\x11\xfb\xe7\xa5\x47\x09\xbd\xe2\x1e\x7f\xd6\x16\x6d\x03\xa3\x4c\xff\x29\x1a\x83\xc0\x02\xcc\x91\x34\x5e\xed\x39\x62\x2a\xf3\xae\x72\x20\xdb\x35\x44\x86\x99\x15\x5b\x4d\xe5\x31\xdc\x17\x75\x5f\xf6\x6d\x99\x9f\x58\x29\x6d\x1a\x0e\xda\xb2\x0d\xf5\xad\x5a\x03\x3b\xe9\xe4\x44\x9c\xa1\x56\x95\xa9\xb5\xab\x9a\xa6\x72\x2c\x5a\xd4\x4d\x5a\x4d\xda\x55\x45\x48\xd9\x31\x91\x2f\x16\xa3\xd6\x8c\xc9\x3c\x65\x77\xe1\x25\x72\x4f\x36\x25\xed\x0e\x3c\xb3\xfb\xcf\xde\x0c\xc1\x14\xd4\x7f\xd4\x9e\x73\xd2\x12\xae\x28\x87\x64\xcf\x3d\x0e\x41\x45\x9f\x72\xbe\x59\xd7\xbd\x6a\x1c\xba\xa2\x2c\x66\x39\x4a\x26\x57\x0f\xe5\xd5\x2b\x48\xe5\xf0\x47\x69\x5c\x32\xe9\xc9\x1d\xc5\xe2\x6e\x0d\x4e\x92\x68\x63\xf5\x7e\x6b\xca\x89\x72\x2e\xa8\x60\x31\x95\x3c\x52\x4c\xbe\x50\x23\xfe\xef\x6e\x51\xd6\x7c\x84\x11\x9e\x57\x72\x56\xf8\x8a\x68\xb6\x24\x15\x81\x22\xf0\x77\x53\x9a\x2f\x62\x6e\x3a\x61\x03\x2e\xea\x22\xfd\xa3\x4b\x56\x77\xb8\xa8\x01\x09\x10\x5e\x62\xed\x92\x11\xa5\x35\x6a\x33\x5a\xe2\x61\x42\x2c\x7f\xb2\x34\xd3\x75\xf3\x1b\x56\x21\xdf\x70\xff\x7d\x7f\xc2\xf7\xe4\xa3\x44\xd5\xda\x92\x57\x3d\xe5\x04\x77\xa2\xb8\xac\xef\xa9\xaa\x56\x7e\x03\x30\xe7\xf8\xd1\x2b\x2e\xf1\x11\xde\xb6\x83\xab\x0e\x2b\x7a\x02\xef\xe6\x40\x07\x76\xb8\xd7\x28\xbe\x9e\xc2\x84\xf3\xfa\xe9\x7d\x90\x6e\xd8\x1c\x56\x08\x45\xbd\x0a\xa6\xfd\x61\x54\xb6\x30\x9a\x0f\x90\x1c\x7e\xcb\x2d\xb6\xc4\x1d\xe9\xf6\x3e\x62\x97\x11\xe7\x3b\x3b\x68\x7f\xdd\xd5\x37\x15\xb8\xcd\x44\xca\x8a\xe7\x9d\x3f\x94\x95\xf5\x90\x04\x9c\xdf\x55\x85\xd9\x51\xba\x84\xd3\x77\x13\x72\x77\x30\x83\xcb\x16\x49\xbe\xce\xf9\x8a\x0a\xd0\xae\x2f\x4a\x29\xad\xd6\xba\x02\x5b\xc1\xab\x36\x71\x6a\x89\x98\x06\x0d\x2b\x61\xfe\x15\xea\x6b\x7c\x34\x04\x91\xdc\x2e\xb6\xbe\xec\x53\xcc\x34\xa3\xdd\x90\x74\x9c\xab\xa0\x92\x59\xc9\x28\xf0\x6f\x3f\x5a\xa6\xd6\xfe\xfb\x61\x7b\x60\x71\xb8\x51\xa3\x86\xf4\x6e\xc5\xcb\x3a\x28\x98\x68\x9a\xe6\x55\xd2\x59\x8e\x90\xc3\x15\x08\xa3\x93\xff\xb6\xd2\xc6\xb8\x25\x54\xa4\xe7\xa4\x88\x09\xcc\x50\xc5\x63\x8f\x29\x6c\xef\x24\xb0\x07\xeb\xb8\xd2\xa6\xa5\xef\xf0\x59\x83\xbd\x1f\x56\xe9\xb3\x54\x05\x81\xbb\xba\x55\x8e\x9f\xfe\xe5\xd6\x36\xf0\x39\x27\x58\x36\xf8\xe8\xb2\x4a\xb2\x5e\x65\x8f\xc6\x01\xb7\x15\xa8\xa4\xe2\x1f\x68\x95\xf8\xa8\x48\xc9\xd2\x28\x8d\xc7\xcf\xc8\xe2\x40\xac\xa7\x78\x66\x7b\x14\x7a\xab\xa8\x30\x21\x7d\xd9\x3f\x87\x9c\xd8\xa2\x43\xdf\x8f\xef\xa7\xfb\xa8\x80\xdc\xad\x82\x6c\xc5\x9e\x6c\x27\x76\x9d\x0a\x3b\x93\x5f\xf9\xed\x59\xf1\xe5\x3b\x84\x3a\xab\x2f\x7a\xaf\x61\xf6\x8c\xa3\xc6\x57\x24\x41\x87\x17\xa8\x34\x7f\xd4\xdf\x15\xa1\x86\xb4\x61\x8c\x58\xd8\x0a\x63\x1e\x0e\x46\x3f\x8c\xc8\xb3\x27\x64\x0b\x67\x9d\x65\x9e\x39\xa0\xc2\x2b\xe0\xe6\xcd\xdb\x94\xaa\x3c\xad\x46\xe7\xd5\xcb\x9e\xed\x08\xdb\x1a\xfb\xab\x6f\x96\x6f\xcf\xa7\x6f\xe9\x6b\xf9\x13\xdf\x1c\x6a\x79\x2a\x3c\x1e\xac\xcf\x0a\x6d\x45\x56\x48\x91\x06\xe5\x22\xe4\xbf\xaa\xa6\x0f\x4c\xb4\xeb\x6a\x7a\xf6\xf0\xad\xc1\x38\x2f\x56\xcb\x8b\xab\xfc\xe3\xa9\xf5\x55\xe5\x16\xce\xe6\x1c\x13\x4f\x39\x77\x63\xb0\xc3\xc5\xe5\x2e\x83\xbe\x3c\xc3\xfc\x26\xe2\x2f\x8f\x6f\xd8\xdc\x1c\x11\x8b\xe6\x81\x5d\xc1\x71\x1b\x15\xc6\x1e\x70\xa2\xcf\x4f\xbd\x4c\xbb\x39\x3c\x3d\x39\xa7\x5b\x30\x4b\xd7\x3c\xb5\x0b\x15\x60\xd9\x83\xad\x76\xca\x73\x6e\xf1\x18\x67\x8e\x4d\xe9\x5a\x8a\x11\x80\x1c\x4d\x8f\xa8\xd8\x76\xe5\x22\x4b\x85\xea\x52\xc0\x5e\x2b\x8e\xfe\xe6\x3b\x36\xc1\x19\xc3\x5e\x2f\xd1\xed\x86\x44\xc3\x42\x21\xe0\xc4\xa2\x6d\x3b\xc3\x47\x2e\x7c\x6e\x7c\x42\x2a\x22\x5b\x2e\x2a\xee\x24\x70\xf9\xbb\x1d\x44\xc4\x14\x37\x73\x62\x6a\x3b\x18\x3b\xca\x72\xa6\x70\x3c\xfd\xec\x82\x0a\x5b\x38\xe6\xbd\xb0\x5c\x3b\xfc\x39\x4e\x4a\x2d\xe6\xe4\x08\xb4\x35\xcd\x38\x33\x84\x3c\x82\x09\x25\xc0\x17\x71\x2e\x3a\x89\xc9\x55\x69\x41\xf0\xd7\x60\x62\x8a\xc1\xcf\xe4\x87\xd4\x45\x51\xd9\xa4\x63\x6f\x24\x8e\xe5\xba\xfb\x1a\xc3\x4e\x98\x30\x38\xe0\x77\x88\x84\x86\xf1\xa7\x98\x47\xa3\x4c\x7d\xc6\x66\x33\x6e\x25\xc6\x2f\x9c\x62\xac\x52\x7f\xf8\x40\x94\xc4\xb7\xb2\xd0\xbd\xd4\xd7\x22\xb9\x75\xb4\xb0\xcb\xe4\xc8\x00\x6b\x9c\xc2\xa0\xb5\x29\x87\xc6\x1c\xc6\x74\x63\xa4\xf1\xc3\x67\x27\x87\xe3\x4e\x4e\x0a\x1c\x2a\x34\x26\x27\x6f\xd9\xc1\xc1\x16\xbd\xf1\x0b\x8b\xf3\xcf\x3b\x3c\xe0\xe7\xd5\x33\x2f\x4d\x14\x20\x26\xbf\xe8\x6f\x31\x18\x45\x77\xe4\x15\x93\x75\xc0\xcd\xb3\x7d\x20\xf3\x72\xb0\x83\x6c\x8a\xf6\x4b\x35\x19\x8b\x32\x99\xeb\x94\xff\x8a\x8a\x31\xbf\x2f\x39\x3f\x4d\x8b\x2a\xb0\xbe\x5e\xcd\xb5\x6e\x67\x20\xd4\x10\x16\xcd\x43\x5e\x6f\x25\x4f\xd8\xdd\x2e\xf9\x00\xa4\x6e\x03\x67\xae\x4f\xe9\x6c\xe1\xe0\xed\x3f\x2e\x2d\xe1\x9f\x5e\xc6\x66\x1c\xde\x7f\xba\x5b\xbb\x27\xb8\x6b\x12\x16\xd6\x43\x52\xc1\x43\x49\xf0\x56\xb1\xd1\x10\xc0\xde\xd4\xce\x1f\xb9\xcd\xba\x22\xf0\xc3\x05\x76\xf5\x20\xb0\xd1\x3b\xb7\x4f\x97\x5b\x84\x73\xae\x8a\x4d\x61\xbc\x29\x35\x60\x45\x26\x69\x40\xc4\x4c\x59\x99\x07\x52\xc5\xd5\x8c\xf0\xfc\xf1\xaf\xc8\xf9\xe6\xc3\x87\xfb\x4b\x96\x67\xa7\xe3\xc6\x67\xb0\x0a\x20\x7d\xca\x1a\xe0\xf8\xe6\x6f\x40\x0d\xa0\xbb\xf9\x83\x5d\xe6\x5b\x14\x84\x5d\x00\x85\x7a\x6b\xba\x66\x60\x61\x65\x07\xdf\x06\xaf\xf8\xf4\x39\x78\x8a\x71\x2e\xab\x8a\xef\x1b\x06\xd8\xae\x74\x4b\xfd\xff\x6e\x95\x84\x8e\xdc\xba\xc3\x9e\x06\xb2\x6d\xc6\x82\x11\x70\xd4\x9e\xe9\x5e\x9b\x69\x8e\x7d\x30\xd4\x10\x13\x14\xe2\x82\x76\xcc\x0e\xb7\xa8\x71\x91\xa9\xb1\x09\x77\xe9\x52\x04\xf7\xf7\xa1\x4a\xc4\xd6\x54\x64\x03\xe4\xde\x05\xb0\x9a\x75\xbd\x01\x9d\x3c\xac\x99\xe8\x03\xf3\x7b\x38\xfd\x0d\x3f\xf2\x8b\x00\xf7\x77\x28\x0a\xe6\xca\x70\xff\x1a\x5e\x2c\x56\x93\x68\xe4\xfc\xc6\x6c\xfd\xe1\x70\xde\x45\x47\xbe\xf1\x57\x0f\x3a\x29\x8e\xf2\x5b\x44\x74\x84\x39\x50\xb1\x66\x57\x39\xc3\x6f\x17\xd2\xf9\x22\xd8\x19\x56\x52\xca\x57\x28\xa1\xe1\x08\xf7\x3e\x2b\x8e\xfe\x29\x34\x83\x1f\xe2\xf1\x51\x7a\x11\x5f\x56\x1f\xc2\xf2\x49\x4b\x62\x60\x2f\xbc\xd9\x3e\x07\x86\x27\x0f\x6b\xd2\xb4\x4d\x0e\x2e\x78\x4a\x6b\xd1\x5e\x63\x1f\xe0\x6a\xc0\xab\x78\xef\xd6\xce\x1c\xb4\xf9\xba\x3e\x1c\xa6\x21\xdf\x8e\x13\x3d\x19\x24\xd0\xa2\x28\x2c\xde\xaf\xa2\x9a\x03\xfe\x36\x42\x0b\x3d\x2d\x4c\xd6\x7b\x77\x98\x31\x80\x41\x27\xa6\x9c\x15\xa4\xa1\x3c\x38\x7e\x7c\x53\xf0\xe1\x0e\xd5\x86\x4a\xa3\x71\xa5\x81\xc2\xfe\xc2\x02\x70\x4d\x2d\x1d\xd0\x75\x06\x84\xf1\xe8\xcc\x74\xda\xad\xfa\x7c\x86\x17\x91\xf2\x9e\xdd\x7e\x48\xc5\x5c\x0a\x9f\x04\xa4\x1e\x79\x35\x75\xc3\x6e\x9e\xe0\xdb\x5b\x56\x42\xf2\x50\x70\xf3\x3f\x66\x1c\x1d\x95\x1c\x7c\x2b\x4a\xfe\x77\x8b\x99\x7f\xd4\xb1\x71\xdd\xf2\x7f\x61\xd3\x9e\xe5\x57\x67\x5b\xc6\x97\xff\x14\xf5\x5b\x9e\x74\x43\xc3\x5f\x9a\x15\xdd\xf3\xc9\x82\xce\xfd\x90\x7d\x95\x3c\xf8\x1b\xc6\x2d\xa7\x4a\x37\x4f\x38\xd9\xeb\x1d\x62\x95\x5d\x2e\x0b\xab\x07\xd3\xee\x0b\x15\x33\x52\x13\xe8\xda\xf0\x4c\x70\x1e\xc6\x7b\x58\x27\x62\xa3\x3c\xf5\xe8\x3f\x1a\xef\x52\x08\x1b\xad\x2d\x2d\x72\x71\xdf\x46\x05\xc1\x6e\x7d\x15\x70\x68\x37\xc8\xf7\x4b\x4b\x6d\xbc\x46\x1c\x23\xbf\xe0\xf1\xcc\x81\x32\x19\xf8\xf5\x68\x86\x93\x4a\x02\x61\x42\x15\x41\xba\x81\x8e\xf0\x89\xa3\x8f\x2d\xfd\x71\x3e\xfb\x39\x97\x02\xd1\x8d\xaf\x55\xbc\xdd\x92\x5b\xaf\x6e\xff\xaf\x29\x71\x70\x59\x57\xbb\x8a\xf8\x99\x05\x6d\xbd\x4a\x44\xda\x52\xac\x7a\x07\x51\xec\xfe\x69\x96\x5c\x07\xf9\x3d\x88\x1d\xba\x96\x19\xd3\x4c\x8d\x95\x85\xc0\xe5\xeb\xfb\x33\x38\x5c\x54\xdf\xfd\xef\x96\x7c\x61\xcf\x99\x85\xe1\x96\xd5\x3c\xac\xfd\x68\xc7\xfd\xa4\x2f\x1c\x27\xfe\x8a\x7e\x08\x0b\x53\xc0\x7b\x6b\x17\x78\x9e\x87\xcd\xf8\xb2\xcb\xf2\xa6\xff\x4c\x2c\x07\x56\xb1\x4b\xe1\x82\x48\xd1\x17\x8a\x3d\x0e\x87\x3f\x0c\x28\x5a\x6e\xf5\xbb\x0b\xb1\x68\xa8\x18\x54\xff\x2f\xee\x61\xb4\xd4\xa7\x88\x6f\xb5\xaf\x52\x33\x70\x72\x4c\x00\x0f\x64\x7e\x7f\xb4\xfb\x8c\x85\x5d\x86\x6e\xed\xc3\xda\xb0\x04\x7d\x18\x66\x10\x6f\x3d\xde\x99\xb1\xba\x3a\x23\xed\xa8\xff\xf2\x81\xe6\x4b\x18\x64\xc2\xbd\x4c\xa3\xe7\xe6\xbc\x36\xcb\xa5\xc4\xea\x43\xb1\x6d\xe7\x43\x7e\x88\x47\xcd\x31\x87\xbe\xb3\xda\xea\x59\x20\x82\xeb\x1f\xe2\xb4\x9a\xcb\x12\x75\xf7\x2c\x67\x87\xf9\x67\x41\x0c\x96\x1f\x2b\xca\x10\x9a\x3b\xf8\x47\x4a\xe8\x2c\x27\x7a\x8c\x12\xfc\xef\x26\x05\x62\xfa\xf1\xe8\x6c\xd5\x71\xbc\x7c\x84\x25\xdf\x74\xc7\x9c\xf9\x1f\x77\x62\xdb\xb8\x5b\x3b\x3e\xa9\xb1\x06\xfb\xee\x97\x3d\x13\x33\x6f\x2b\x1e\x17\xd9\xee\x0b\xf4\x87\xeb\x68\xe5\x3c\x3a\x25\xc6\x7d\x5d\x71\x5f\xd0\xf5\xc1\x4b\xb8\xd6\xb8\x03\xc6\x13\x33\xee\xa0\x37\xac\xea\xc2\x98\xe4\x8f\x4b\xf8\x35\x5a\x71\x97\xc8\x78\x83\x43\x17\x89\xc5\xcf\xc3\xa3\xb9\x34\xfd\x05\x27\xe6\x41\xd9\x26\x2b\x94\x27\x90\x5f\xff\x94\xa8\x80\x4f\x95\xd4\x59\xba\x0a\x6c\x0f\x4f\x79\x38\xc8\x67\x38\x23\x0f\x45\xb3\x5c\x84\x75\x3c\x5c\x52\x50\xac\xae\x65\xb8\x2d\x7c\x93\x56\x6c\x6b\x72\x4e\xe2\x16\x8c\x32\xeb\x95\x47\x55\x59\x25\xb2\x2b\xdd\x7e\xc6\x47\xbc\x24\x0b\x0d\x76\xea\x32\xfc\xae\xbf\x77\x99\xc5\x42\xfc\x57\x7d\x56\x88\x98\x60\x15\x4b\x04\x74\x5d\x90\xf9\xf3\x20\xe6\x35\xd2\x07\x56\xec\x8e\x0e\x17\xbf\xb1\x36\x3a\x0b\xe1\x74\x8e\x58\xeb\x38\x2d\x4d\x50\x50\x54\xbe\x29\xdd\xbd\x36\xeb\xb0\xde\xef\x66\xfe\xde\xb2\xd7\x30\x72\xb2\xfd\xa1\x9d\xc2\x80\xf3\x07\xcd\x79\x71\x39\x5e\x21\x3c\xd8\x77\x29\x75\x29\x42\x70\x61\x42\x0e\xd7\xfe\xb3\x79\x0d\xf6\x71\xc1\x7a\xba\x3c\xf1\xbd\xa4\x49\x7f\xef\x06\x93\xa2\xd9\x15\x69\x3f\x8f\x5f\xfe\x71\x8d\x62\xa9\x57\x6c\xae\x3d\x22\xfc\xd2\x57\x6b\x47\x7d\xe5\x27\x48\x78\xe0\x88\x45\x0c\xbc\x62\xe4\xef\x9e\x25\x61\x3f\xe3\x5d\x67\xb1\xc6\x8a\xb5\x3b\x3e\x1c\x16\x97\xc6\x19\x44\x90\x32\xd3\x73\x8e\x9f\x8f\x44\xfd\x85\x21\x57\x77\xec\x17\x0a\xb8\x85\xf1\x63\x11\x9d\xdb\x6a\x41\xa6\x11\x00\x07\xf4\xdf\x9a\xc3\x3a\xd2\xb6\xd1\x78\x8c\x38\x4d\xaf\xfd\x58\xbe\xc1\x7b\x4a\xd3\xdd\x41\x04\xec\x46\x24\x4e\x88\x07\xd6\xcb\x81\x17\xc6\x5f\x04\x7b\x2d\x6e\xca\xc2\xd2\xd0\xc4\x99\x49\xba\x8a\x4f\x84\x98\x7d\xfc\x6a\x47\x64\x32\xa9\x76\x42\xe2\x31\xa6\x7d\xc5\xbb\x88\x0f\xec\x15\x18\x27\x0e\x6c\x9d\x65\x2b\xed\x02\xad\x3d\xa4\x10\xf4\xaa\x6e\xa1\x22\x14\x35\x08\xab\x5f\x3b\x73\xbc\xfc\x03\xce\xf9\x52\x69\x17\x86\x57\x6f\xf9\x84\xbd\xf1\x0e\xfb\xa1\xff\xaa\xf5\x10\x20\xf0\x72\xd7\xde\x07\x85\xa2\xc2\x63\x62\x5b\x7d\x65\x8a\x41\x5e\x09\xde\x60\x27\xe9\x7a\xdb\xfb\xa3\x60\x03\x4f\x7b\x96\xc3\xaf\x17\x75\x9c\x4d\xde\x6b\x58\x9e\x5f\xef\x90\x8e\x22\x19\x97\xb9\x3f\x79\xa4\xbc\x74\x8d\x60\xa0\x56\xd7\x4d\x35\x58\x7e\xdc\xb9\xae\x14\x16\xcf\x91\xb0\x43\x73\x7b\xbc\x0d\x81\xfa\x85\x76\x00\x1e\x8a\x2d\x9b\xc2\x9a\x99\x59\x9a\x86\xcb\x0f\x75\x40\x7f\xaa\xee\xf6\xa0\xe2\x58\x51\xd7\x10\x3a\xeb\xa8\x13\xb3\xe1\xe6\x9f\x5f\xb5\xab\x20\x54\x20\xce\xcd\xfa\x79\x8e\x81\xe8\x59\x22\xb6\x5f\x96\x7c\xf6\x0c\xad\x9f\x68\xda\x8c\x12\x91\xff\x82\x24\xa7\xb8\xcf\xec\x5a\x15\x17\xe9\x6c\xf6\x9e\x30\xb0\xf3\x3f\x20\x17\xa1\xfd\xa7\x9c\x12\x00\x0c\x36\x6b\x4a\xce\xd0\x81\x06\x36\x0a\xa1\x7b\x6e\x11\x0f\xbc\x5b\xe8\xdb\xe9\x1b\x34\x60\x41\x5d\xae\xb6\x94\x83\xa5\x95\x92\xd0\x22\x3d\x58\x4d\xf2\x71\xa3\xaa\x82\x9c\x9c\x03\x1b\x92\x30\x41\x57\xff\x41\xec\x42\x17\x3d\x41\xf2\xfb\x91\x6f\x19\x59\x58\x13\x42\xa1\xab\x27\xd4\x71\xb5\xd4\x9b\x1c\xa2\xdd\x36\x91\x9b\x8f\xb0\x54\x15\xf3\x17\x66\x17\x1f\x29\xe7\x77\x51\x12\x77\x3b\x52\x16\xe2\x8a\xf0\x9b\xcc\x84\x48\x76\x68\xd4\xb9\xf0\xd2\xef\xc1\x7a\x4f\xf7\x58\x1d\xed\xcc\xc5\xa3\xbb\xf6\xd1\xe4\x02\xde\xa0\x7e\x99\x6d\x75\x10\xc6\x27\xc4\x66\x0b\x6b\x3d\x5b\xb8\x5b\x84\xd3\x00\x0f\x4d\x6a\xf9\xc6\x58\x79\xe7\x90\x1c\xa4\x80\x2c\xe8\x36\xff\xa5\xee\xa9\x15\xfa\xd2\x2b\x6e\x97\x35\xc7\x76\x89\xda\xec\x8a\x29\xea\x8c\x99\x5e\x83\xf0\xb2\x6a\xb3\x9b\x11\x7a\x3d\xa9\x48\x18\xc1\xca\x26\xc8\x7d\x2b\xf5\x49\x98\x48\x46\x36\x76\x55\xa6\xb0\x67\x3b\xfc\x72\x85\x3e\xe2\x63\xb8\x14\x22\xb0\xba\x4b\xe1\x66\x20\x07\x56\x65\xa2\x06\x41\xd7\xb5\xaa\x81\x0a\x2e\x9a\xd0\xb2\xd0\x4d\xe5\x6a\x6a\x89\xc9\x5f\x13\xeb\x24\x11\x09\xcd\x42\xec\x23\x91\x2a\xcf\xd5\x05\x45\x6d\xcb\x27\xaa\x27\x4b\x3e\x24\xcd\xb2\x22\x07\xd9\x30\xf5\x72\xbc\x0e\xbb\x8e\xf0\xff\x4a\xe5\x4b\xff\x2f\x99\xac\x2e\xd0\x95\x12\x00\xf4\x44\x7b\x0a\x5b\x9f\x32\xd4\x5b\x12\x0f\x0f\xf1\x0e\xef\xa3\x28\x2d\x42\x85\x9a\xe7\xff\xb1\xc2\x4c\x47\x4b\x9b\xd8\xce\x66\x1a\xb6\xf5\x8b\x0a\xc6\x95\x49\x82\xc9\x89\x84\xd6\x70\x34\x1e\xe5\xec\x17\xb7\x7f\xfa\xc7\x7b\xf0\x88\x56\x61\x85\x4b\x10\xf1\x67\x04\x22\x68\x59\x9a\xc4\xa2\x84\xe2\x13\x2b\x89\x2d\x72\xd8\xcf\xda\xdb\xce\xf9\xc8\x1c\x71\xe8\x33\x47\x65\x7f\xd5\xdf\x81\xbf\xb2\x6a\xef\x28\xfa\xc9\x98\xcc\x92\x71\x78\x58\x99\xe2\x52\x07\xda\x3b\x4c\x7e\x03\x4d\xf5\x54\xf0\xf5\xa4\x0e\x70\x52\xc6\xd9\x04\xe7\x50\xfd\x0c\xa7\x4f\x72\x01\xe7\x2e\xaf\x16\x8b\x0a\x45\x3c\x99\x70\x1a\xa1\x2c\x13\x87\xe7\xb7\xb2\x66\xdc\x84\x44\x6e\x7a\x02\x93\xc6\x1f\x53\x1e\x89\x43\x9e\x11\x4b\x7e\xec\x2c\x29\x0f\xc9\x31\x08\x58\x8e\x76\x21\x04\x43\x71\x15\x4d\x74\x14\xaa\x6d\xdd\xa9\x2c\x43\xde\xe1\xc6\x5d\x9b\x59\x77\x38\x75\xe7\x98\x13\x5b\x91\x29\x39\x6c\xa3\x3a\x16\xcf\xdb\xf5\xef\x00\xa5\x84\xb0\xe1\xb1\x05\x9b\x31\x78\xa2\x10\x5b\xb8\x69\xc8\x1d\xc4\xfa\x27\xda\x49\x87\x1e\x90\x31\x2c\x53\x24\xe4\x61\x88\x47\x78\x7b\x94\x08\x63\x2e\x60\xa7\xe5\xc5\x67\x8b\x09\xce\x07\x99\xec\x59\x29\x15\xf6\xe2\x94\xd1\xff\x81\x15\x86\xe3\x86\xfa\x52\x08\xcb\xbd\xc1\x84\x55\x04\x87\xc5\x4a\xed\xc9\xf2\x54\x1a\xac\x71\x66\xb0\xd3\xbd\xf5\x01\x4f\x0d\xc0\x31\x18\x95\x78\xf7\xf4\xf8\xae\x88\x5a\xe2\xd5\x38\xe8\x36\x02\x17\x31\x86\xc2\x3e\xac\x0f\x79\xc6\xaf\xe0\x85\x48\xe7\x64\x36\xd2\x90\xff\xd8\xdd\x01\x41\xa1\xa5\xdb\x90\x7b\xcd\x85\x73\x0a\xbf\x5e\x98\x9c\x88\xea\x98\x5a\xf5\x1b\xf6\xd9\xf0\x43\x08\xed\xec\xbb\x99\x96\x6d\x4d\xcc\x71\x74\xac\x89\x35\x36\xb5\xa2\x57\xc1\xe9\xd0\x45\xf0\x4b\xa4\x3e\xe9\xb3\xb8\x22\x3d\x0c\x5c\x06\xc1\x8b\xf0\xa3\x50\xd9\x28\xcf\xed\x96\xe7\xd3\x35\xf9\xb5\x4b\x62\x05\x18\xda\x5b\xfa\x8f\xcd\x58\xe0\x84\x35\x1c\xc4\xf8\xc3\xbc\x4e\xa4\x2d\x78\xbd\xce\x36\x48\x3e\x24\x88\xfd\x31\x0d\x23\x5a\xcd\x0e\x5a\x89\x66\xa3\xc9\xf2\x8c\x05\xc1\x23\x56\xa6\x87\xa8\xb6\x84\x2b\x49\x3e\x94\xc4\x7e\xfc\x32\xaa\x8e\xa8\x2a\x2f\x3d\x0e\x81\x27\x0e\x24\x39\x62\x57\x67\xd2\x64\x38\xbf\x83\xdb\xe2\xdf\x0c\xa4\x5f\x30\x63\x5c\x9f\x9e\x6d\x55\xe8\x88\x06\x6d\x11\x1f\xc1\x15\xf6\x55\xe3\x28\x16\x4d\x4c\x52\x40\x3e\x68\x07\xe4\xc1\x68\x5f\x3f\x53\xe4\x61\xaf\x3a\xac\x09\x89\xda\x82\x11\xf3\xfd\x45\xad\x26\x79\x38\xe3\x71\xe0\x48\x2c\x0d\xcc\x7e\x4a\x1d\x63\xe5\xbf\x99\x26\x2c\x30\x47\x8d\xb1\xf7\xea\x2f\xb8\x2d\x3f\xc0\x3a\x69\x99\x3a\x2a\x77\x9e\xf4\x40\x17\x8d\x9c\x3f\x00\x92\x7b\x07\xb1\x48\x8a\x85\xdf\xf9\xa3\x29\x75\xf6\xf0\xc5\x4a\x93\x33\xc5\x0d\xbf\xb9\x0b\x13\xaa\xcc\x6d\xf8\x9d\x39\xeb\x78\x67\x96\x6f\x72\x43\x09\x7a\x22\x88\x9e\x5e\x86\xf2\xaa\xf0\x92\x7d\xf1\xa7\xfd\x2a\x7a\xb9\x5f\xbe\x3f\xbc\xec\xd3\xa0\xe1\xe0\x9f\x3c\x64\xc4\x51\x15\x58\x9d\xd3\xf3\xec\xa8\x7f\x3f\xf5\xa8\x55\x95\x3b\xdb\xc4\xab\xde\x1a\x6c\xdb\x16\xe8\x5f\x58\x57\x0a\xa8\xac\xe2\xb0\x7b\xc8\x17\xc1\x53\x14\x69\xe9\xca\xe2\x63\x5f\x9c\x0e\x5c\x34\x4d\xb8\x1c\x49\xf7\xaa\x0c\x66\x6a\x78\x74\xd7\x34\x95\x95\x10\xfd\xca\xb6\x8c\x00\x32\xd4\x2c\x21\xf3\x2d\x0a\xbc\xcc\x41\x49\xcc\x63\xd8\xac\x25\xe1\xa8\xe7\xbe\xa4\xb7\x17\xa6\x56\xea\xb2\x32\xf4\x29\xf6\xcf\x3e\xfd\xe3\x9f\x5c\x15\x09\xb6\xf8\xbe\x61\xbf\x7c\x0f\x58\xc1\x2a\xda\xaa\x69\xf6\xda\x38\x8b\x65\x70\x4b\x10\xe7\x22\x06\xb2\xe9\x94\x79\x01\xac\x13\x0c\xb4\x94\x62\x79\xc8\xcd\xd0\x6a\xd8\x68\xf8\x4f\xeb\x68\x8b\xe4\x2f\xef\x44\x2c\xc8\x45\x2f\xed\xa7\x41\xfd\xab\x2f\xc8\x51\xf1\x82\x82\xe5\x1c\xcb\xb4\xf2\x2a\x3a\xee\x41\x83\xc5\x03\x89\xd9\xfe\x78\xff\x13\x30\x76\xa9\xd6\x81\x97\x1b\x49\xa8\x47\x5d\x83\xd9\x72\x48\xbf\x11\x51\xc1\x18\x3a\xa0\xcd\xc3\x72\xaa\x52\x09\x4f\x9e\x48\x75\xb8\xa2\xce\x27\xe7\xd6\x12\xfa\xc3\xdd\x84\xc4\x69\x67\x39\x0c\x5d\x70\x94\x66\x47\xe2\x65\x89\x12\x99\x67\xfe\x0e\x75\x3f\xcb\x60\xd6\xae\x7b\xd9\xa8\x9a\xf7\x90\x4b\x2e\xc0\xd9\xd3\x14\x1b\xfa\x65\x89\x62\xe0\x3c\xeb\x78\x6b\x06\x45\x98\xfe\x2b\x12\xd7\x40\x48\xa3\x34\xcd\x9f\x0d\x2b\x48\x90\x2c\x45\xf7\xc4\x70\x18\x54\xcc\x4f\xbf\x97\xeb\x25\xfb\xa0\x7a\x5e\x52\xde\x70\xf0\xa8\x54\xee\x0a\xf7\x2a\xbe\x7c\x35\xfa\xad\xad\xaa\x9e\xc6\x88\xdc\x17\xf9\xad\xc2\x13\x60\x6a\xd1\x4a\xae\x68\x9b\x93\x12\x2f\x95\xd9\x5d\x4b\x92\x3e\x84\x52\xde\x34\x75\x43\xb8\x99\x8a\xd7\xaa\xa8\x95\xfa\x4f\xbf\x0f\xbf\x77\xee\x64\xb8\x78\x04\x8c\xda\x6f\xf0\x6f\x28\xa7\x0c\xea\xd7\x12\x5a\xe0\xdc\x24\xa0\xc0\x48\x8b\x6c\x8c\xd6\x5f\x01\x6b\x55\xf7\x41\xef\x1f\xf7\x9d\x53\x5f\x6d\x15\xe1\x3f\xd5\x34\xfc\x89\xf8\xd9\xfb\xe4\xa3\x8f\xc9\x63\x3e\xee\x1a\xe3\xac\xda\xba\xfd\x09\x84\x21\xad\x8c\x8e\xa3\x62\x75\xda\x8d\x2f\x86\xe3\x1e\x59\x2e\x93\x94\x87\xb2\x78\x0b\xdd\xd4\x52\x5b\x60\x1a\xfa\x79\xcd\xc7\x59\xef\x2d\xd8\x45\x6e\x55\xc7\xb6\xb7\xb7\x5e\x76\xc9\xaf\x43\x03\x74\x7b\xbf\xe3\x16\x05\x33\xc9\x1f\x9e\xcc\xb5\x5d\x32\x0f\x57\x38\xd2\x8b\xdb\x48\x65\x8c\xd4\xd9\xf3\xed\x66\xcb\xaa\x7d\xeb\x1a\x63\xf3\xa4\xa9\xf9\x06\x9b\x4a\xc2\x9d\x95\xf9\xd5\xb3\x95\x1f\x2c\x70\x65\x11\x39\x17\x82\xc4\x1e\xd6\xc6\x7f\x82\x47\xbc\x3f\x96\x6b\xe2\x9b\x6d\xcb\xa7\xc6\xe8\x83\x4b\x5a\xfe\xc0\x88\xf1\x8d\xfb\x0f\xb7\x94\x24\x3a\x56\x01\x69\x90\x7e\x6f\x57\x73\x94\x9a\x64\xca\x72\xb3\x53\x9b\xdc\x37\x90\x55\xee\xd9\xd4\x36\xc8\x75\x25\x9b\xca\x6b\x60\xff\x21\x55\x41\x63\xb6\x83\x9c\x01\xa6\xc1\xe0\x3e\x0a\x63\x7b\x3d\xe5\x43\x53\x3a\x7d\x2e\x7c\x10\x26\x52\xdd\x29\xd0\x09\xef\xdd\x1c\xf1\x70\x01\xa5\xda\x4f\x0a\x83\xdd\x08\x1c\xc0\xb5\xac\x8a\x66\xe4\x6b\xec\xe3\xf7\x44\x11\x6c\x78\xec\x79\x05\x0c\x8f\x80\x77\x62\xb4\x8d\x57\x59\xbe\x80\x80\x90\xb2\xe5\x83\xd0\xcd\x08\x2a\x9c\x72\x6f\xb6\xa1\x89\x8d\x37\x11\x48\x46\x7f\x25\xfd\x0b\xe9\xf1\xcc\x29\x29\x3e\xd0\x4a\x16\x7e\xc1\xe2\x1c\xed\x5d\x02\x5c\x46\xf6\x64\x5c\xbe\xb0\x71\xcd\xbb\xff\xd9\xa0\x31\x86\x74\x99\x75\x08\xe6\xf1\x11\xac\xf9\xbc\x35\x7a\x78\x1e\xaa\x44\x6d\x91\x17\x9e\x40\x1e\x32\x47\xe4\xb7\x56\xa2\xbe\x6b\x47\x81\x0f\x19\xbc\xcf\xe5\x73\x51\x03\x54\xfe\x87\x3d\x8c\x1a\x1f\x0d\xeb\x1c\x97\xf5\x47\x78\x22\x70\xa6\xcf\x8c\x39\xb7\xe9\xc5\x02\x09\xf9\x3c\x05\x9f\xe1\xf2\xfe\x14\xb5\xd7\xd9\x54\xf8\xa6\xac\xed\x01\x1c\x2a\xa7\x6a\xda\xdf\xa6\xe4\xb9\x70\xf8\xd3\x86\x36\x04\xff\xdd\x4b\xee\x93\x35\x37\xfc\x77\x55\x68\xdb\x0b\xdb\xcb\xd3\x66\x09\x8a\xe6\x70\x70\x9f\x43\x7c\xab\x1c\x3b\xe1\x55\xe3\x0f\xcb\x33\x62\x5c\x97\xbe\x90\x9b\x89\xf8\xb9\xac\x15\x77\xb4\x21\x67\xd9\x03\x2f\x2e\xb6\xec\x63\xa2\x04\xd2\x75\x20\xc3\xb7\x6d\x19\x6c\x94\xa0\x9f\x16\xf3\xc9\x96\x00\x2e\x20\x02\x7b\xb0\x32\xff\xd9\xde\x90\xa3\x69\xbb\x83\x78\x9b\x76\x52\xb1\x15\xea\xed\x94\xd7\x63\x44\xfa\x10\x92\xfe\xc9\xc4\xfb\x96\x62\x0f\x39\x91\x44\x1c\x3d\xf3\x9e\x91\x25\xd9\x09\xc0\xb3\xb5\x86\x39\x7d\x6b\x6f\xad\xc5\x79\x5b\x09\x70\x04\x9f\xa0\xea\x4f\xb5\x3b\x49\x90\x35\x88\x79\x2c\xf0\xc3\x3c\x14\x4c\x02\xc9\x92\x52\xb8\xec\x00\x38\xcd\xb2\x0e\x8c\xe4\xd6\x23\x6c\x05\xeb\xff\x47\xd6\x9b\xa5\x3b\xcb\xf3\x4c\xa3\x73\xc9\xf1\x3f\x29\x03\x0e\xb0\x68\xcc\x0b\x38\x79\x92\xd1\x6f\x95\xaa\xe4\xdc\xdf\xb5\x8f\xf0\x4a\xb7\xd2\x80\x6d\x95\xaa\xf9\x2f\x6e\xb1\xaa\x9c\x8e\xff\x30\x14\x8e\xcd\xbf\x1c\x09\x61\x1a\xcc\x01\xa4\x44\x2d\x64\x1d\x84\xc9\xb0\xc1\xd9\x25\x30\x22\xd5\xdf\x77\xfa\x0a\x09\x0a\x42\x98\xed\xfa\x03\x83\x5e\xa5\x31\xa2\x12\xad\x5b\x45\x23\xee\x20\x8e\x75\xc3\x97\x2e\xf3\xbd\xa0\xe6\x73\x0a\x01\xb4\xe9\xa7\x60\xb2\x8e\xed\x49\xb7\xd0\x59\x69\xc1\x06\x69\x90\x5d\x0f\x31\xf2\xa3\xfb\x03\x77\x69\x95\x76\x68\xf1\xd3\x3e\x31\x23\x39\xdd\xbb\x5f\x0f\xb6\x3f\xf4\xcf\xfb\xa0\x6e\xc8\x0f\x9d\xc8\xaa\x88\x85\x21\x15\xd5\xa1\x7e\x0c\xd6\x21\x89\x39\xc0\x44\xe6\x7f\xb2\xa0\x52\x97\xb8\xf9\xf8\x7e\x70\x1b\x3e\xd7\x97\xf3\xd6\xa7\x68\x3e\x79\x73\xff\xf4\xae\xbb\x28\xa7\xc1\x16\x79\x2b\x34\xec\x05\x5f\x4a\xba\x0a\xfb\x6e\x9a\xbe\x82\xf3\x40\x86\xdd\x2b\xbd\x28\xef\x4e\x57\x17\x8b\xf2\x2b\xed\x30\xe6\x10\x4c\x3c\xb0\x26\xae\xa3\x2c\x27\xdd\x7a\xb8\x61\x59\x77\xf5\xb3\xc0\xde\xef\x38\xc8\x1b\xa7\x52\x0a\x77\xcb\x1e\xce\x63\xf9\x7e\x18\x31\x27\xb9\x5b\xe6\xb3\xa1\x77\xb3\xf2\x42\x89\x07\x9c\xac\xef\xa4\x6e\x2c\xa2\xfc\xf8\x72\x8a\x22\x42\x93\xc0\xb1\xd1\xb7\xac\xd5\xaf\x7a\xf7\x00\x62\x39\xde\x9b\xa9\x05\xbe\xc3\xd6\xdb\xc7\xf7\x29\x9f\x40\x18\xf9\x3c\xc4\x34\x75\x19\x0e\xf7\xdd\xf0\xa5\xd3\x80\xdc\x52\xd0\xde\x7d\xe0\xdb\x63\xa1\xd0\x63\xbc\x36\x3a\xdb\x18\x80\xfa\xa8\x30\x86\xa3\x91\x4d\x25\x1b\x2a\xff\xc7\xe4\x87\x5d\x6c\xc0\xa7\xfe\xef\xe7\xf0\x20\xb4\xf5\x91\x8b\x97\x8d\x08\x34\xcb\x9f\x47\x26\x54\x61\xd4\xd3\xb4\xe3\x53\x18\xfd\x30\x68\xee\xca\x49\x0b\x1e\x29\xa7\x3f\xa7\x64\x6d\xc8\xd3\xfa\x25\x76\x7c\x29\x62\x5e\xdb\x53\xe0\xca\x34\xcc\x40\xd4\x7c\x83\x9c\x69\x94\x81\x7d\x37\xb7\xd0\x11\x78\x79\x7e\x3a\x29\x6d\xc1\x72\x98\x83\xe6\x80\x82\x2d\xa8\x08\xe0\x38\x04\x16\x73\x16\x5b\x30\x44\x14\x3d\x7f\x3d\xb4\xb3\x0c\x84\x13\xdd\xb3\xda\x8f\xc3\x2a\x63\x9f\xc0\xab\xfb\x5e\xb2\xd7\x33\xcf\x61\xd1\xac\xfa\xe8\xcc\x0a\x94\xf8\x70\xe7\xee\x50\xb5\xcd\xbc\x2d\x2a\xf4\x7f\xd5\x5f\xcc\xb7\x92\x0f\xa7\x3c\x44\x3e\xf3\xe1\xbb\xc0\x07\x71\xec\x33\xb2\x21\x62\xc3\x9d\x43\x2a\x61\x85\xa2\x6d\xa8\xb8\xb5\x76\x5d\x89\x53\x10\x3e\xc1\x8e\xdd\xcb\x0f\xa5\x56\x38\x62\x52\xe3\x71\x4f\x12\xa6\xc3\x55\x6f\x16\xaf\x00\xf3\x6e\xf8\x9a\x39\x05\x61\xe7\x80\xd6\xcb\x1e\x0d\xe5\xfc\x72\x1f\x12\x3d\xc2\x50\x02\xa3\xc0\xc7\x00\xf7\x50\xff\x43\xd7\xc4\x87\x6f\xa1\x1b\x41\x35\x5e\xc3\x65\x2c\x0e\x81\xff\x08\x3f\xa2\x28\x70\x2f\x6c\x97\xc9\x1a\x69\x4c\xc2\x76\xb6\x4c\x2d\x4f\x96\xa3\xe2\x29\xbd\xd0\xe1\x2d\x3a\x3e\xcd\xb9\x0a\x3e\xb0\x2a\x80\xb7\x78\xe8\xbe\xff\xab\x7e\x88\x06\x2a\x36\xe8\xa5\x05\x35\xaa\xe6\x80\xf2\xa8\x92\x3d\xe2\x22\xa4\xb3\x59\x06\x6d\x47\x17\x5b\x71\x90\x5e\xe7\x06\x7f\xd7\x2f\x01\xee\xaa\x40\x27\xc5\x2c\x93\xb8\x48\xf6\x84\xbd\xb5\xa4\xbd\xba\x2b\xe9\xf9\xf6\x12\x8d\x47\xd7\xda\xab\x2b\x0c\x26\x1d\x2f\xb3\xb5\x10\x27\x5e\x35\xf1\xac\xb3\x58\x69\xee\xc1\x4b\x98\x59\xb6\x59\xab\x67\x61\x3e\x88\x46\xc7\xa6\x76\x0d\x49\xfd\xb3\xc8\x66\x74\x05\xbc\x42\xc0\x65\x61\x2c\xe6\xb2\x57\xe5\x3f\xe9\x22\x07\x11\x38\x16\x6d\xdb\x77\xf7\x12\x56\xda\x42\xc8\x1d\xcf\x32\xff\x92\x6b\x6c\xdc\x8c\x54\x96\xdc\x3c\x80\x8e\xd8\x90\x6f\x81\x45\xf3\xfa\x5c\xb4\x77\xa7\x93\x93\x93\x15\x14\xa7\xbc\xbb\xda\x81\xfa\xa5\x8d\xb6\x41\x6a\x07\xfe\xa1\x25\x44\x27\x21\x5b\x71\x98\x95\xa4\x2e\xbd\x6d\xc2\x47\xf6\x3a\x27\x9a\x57\x4e\xb3\x90\x6c\x86\xe4\x4f\x2d\x69\x71\xca\x32\x8f\xb6\x19\xe6\xdb\x76\xda\x7b\x78\x57\xda\xa6\x5b\xf3\x85\x47\x4a\xf9\x31\x94\x4b\xb2\xf2\x1c\x2b\xb1\x1b\x19\x56\xe7\x9d\x7e\x89\x67\x73\x9c\x2e\x59\x99\xb8\xe4\xad\xfa\x86\xdb\xdd\x6f\x39\x52\x14\xc4\x88\x22\x20\xa0\xe5\x9e\x3f\xc4\xf8\x4f\x00\x85\xad\x57\xdf\xe0\xa9\xd2\xfc\x3a\xad\xcd\xe4\x47\xbe\xd9\x29\x9f\xfa\xa6\x9f\x55\x0b\x10\xa2\x2e\xb8\x21\x3e\xa9\x14\x7e\xce\x25\xec\x53\x9f\x6a\x83\x3e\x49\x21\xdf\xc2\x28\xe1\x99\xe5\xa0\xff\x04\x37\xd4\x8f\x9d\x16\x36\xe4\x6b\xfb\x26\xb7\x8a\x0e\x01\x84\xd0\x07\xb0\xde\x26\x2f\x82\xe9\xd9\xa2\x44\x02\x7b\x8e\x90\xe5\x33\x44\xd1\x43\x95\x47\xf2\x10\x26\xec\x03\x88\xc1\xf4\x78\xcc\x6f\x65\x52\xb1\x56\x1d\xca\xe5\x33\x3b\xc7\x91\xff\x39\xcc\xa7\xbc\xb5\x87\xf9\x29\xab\x0b\xdb\x5a\x9c\x0b\xef\xc4\xbe\x5a\x7b\xec\x30\x0e\xda\x23\x0c\x2b\x83\x4f\xa4\x3d\xf1\xa6\x4c\x3a\xec\x98\x1d\xb3\x7f\x38\x17\x63\x8d\x38\x4b\xf6\xc3\x07\x5d\x88\xbd\x9d\xcf\x14\x2e\x60\xaf\xfc\xd1\x31\x18\x18\x95\x5e\xc6\x8e\x58\x6b\x9b\xda\xa6\x8f\x1e\xeb\xf5\x49\xaa\xa6\xbb\x39\x93\x6b\xf1\x12\x52\x5d\x95\x7f\x61\x9b\x62\xca\xef\x4b\xb0\x3a\x40\x58\xe6\xb6\x19\x00\xfd\x1e\xbc\x0d\x6e\x5a\x01\xb6\xfb\xd1\x49\x17\x1d\xb3\x2e\xfa\x19\xd6\x49\x3e\x9a\x6a\x38\x13\xf6\x48\x7e\xf9\x6d\x93\x3d\x28\x97\x9f\x1c\x05\x38\x36\xa6\xdc\xac\x7b\x07\xc3\xf7\xd5\xdc\xcf\x71\x93\xbc\x1d\x24\xdc\x01\x23\x9f\x15\x63\xee\x61\x1c\x1f\x29\xa9\x7a\x99\x70\x75\x9e\x41\x18\x2e\x91\x57\x20\xe0\xb6\x97\xca\x1a\x69\xbb\x0b\xd5\x39\x31\xf6\x53\xc2\xd4\xae\xbc\xb9\xff\xa5\xe7\x91\x00\xe5\xb2\xcb\x5c\x72\x8d\xc4\x4c\xce\xc2\xdd\xda\x78\xb1\xb8\x8e\xe4\x24\x29\x69\x2f\x93\x24\x7c\x40\x05\x63\x17\xf6\x66\x5d\x22\x5e\xd7\xb9\x0f\x39\xd1\xef\x73\x4f\x54\xf6\xa3\x0b\xa1\xa8\xaf\xb5\xab\x59\x36\x93\x11\xfd\xdf\xa5\x9f\x60\x2a\xd5\x4f\xa6\x31\x75\x0a\x57\x49\xd7\x38\x68\x6f\xcc\x9d\x9d\x4d\xb6\xb4\x03\x4e\xc1\x77\x48\x08\x3e\x91\x44\x14\x3e\xec\xfe\x3d\xd9\xb4\x3f\x3b\x71\x28\x59\xa1\xbe\xcb\x5a\x2a\x21\x91\x09\xa7\xc8\x17\x6d\x46\xdf\x26\xbb\x86\x1a\x83\x14\x06\xaf\x9f\x7a\xfb\xc2\xf2\x09\xcb\xc3\xf7\x67\xe4\xbf\x7e\xd7\xd3\x35\x5c\x95\x33\xfb\x7b\xf6\xec\x1a\x42\xd2\x90\x6d\x89\x3a\x6b\xcb\x38\x69\x1f\x13\x04\xb9\x82\xaf\xe7\xeb\xab\x63\xb3\x02\x07\x0d\x2e\x25\x0e\x7d\x0f\xf9\x4e\xff\x05\x27\xf7\x5f\x7e\xbe\xfd\x25\xe7\xef\x71\x94\x63\x85\x82\xc7\x1e\xdc\xac\x13\x8e\xb2\x3a\x59\xd3\x00\x33\xc7\x9c\xd9\x01\x8b\x91\x4f\xe9\x39\x1c\x3e\x61\xc1\x94\x77\x6f\xd1\xf2\xa2\xab\xc2\x38\xea\x4e\xb9\x5f\x75\xf6\xe9\x5d\x37\xed\xa8\x49\x2f\xb8\x4f\x8a\x60\x99\x0e\xea\x83\x00\x6e\x6f\x39\x0e\xdf\xf3\x11\x7e\x97\x6b\x23\xea\xd2\xcd\xc9\xc7\x68\x9b\x09\x77\xcf\x77\x10\x7e\xee\xcc\xa8\xcb\xdb\x49\xfd\x3d\x87\xae\x8d\x79\x00\x32\x5f\xb4\xf5\x7c\xff\xe8\xbb\x6f\x24\x94\x11\xde\xae\x8d\x5b\x51\xb5\x0b\x0f\xff\x4a\x7b\x9b\x1d\x8f\xe9\xa3\x76\x1d\xb6\xf4\x5b\x90\x7e\x5f\xaa\x35\xae\x3b\x24\xd5\xbe\x23\x6d\x00\xf6\x21\x78\xfa\x08\x77\x89\xeb\x20\x7e\x03\x76\x15\xb9\xc1\xfe\x15\x62\x1b\xaf\x6c\x1d\x1b\x32\xe7\xcb\x4e\x85\x21\x9e\xb5\x0a\x21\xbb\xb4\x88\x13\x69\xf7\xd2\xdd\xce\x84\x59\x06\x04\x6e\x40\xe5\x83\x71\x6f\xbd\x2b\xfb\x63\x6c\x9b\xff\x88\x41\x9d\x90\x6a\x1d\x9b\x70\xa7\x83\xb0\x18\x98\x3d\x2f\xcb\x36\xfd\x47\x0b\x45\x3d\xb1\xe1\xe4\x93\x52\xe0\x58\x57\x13\xa7\x45\x68\xee\x95\x37\x39\x0b\x6c\x9b\x82\x53\x15\xac\x71\xe5\xf8\xf7\x40\x08\xb8\x53\xba\xfa\x19\x4a\xfa\x5d\xd0\xbd\xed\x02\x03\xce\x0f\x7f\x85\xe6\x60\xa5\x3f\x1a\x9b\x25\xcf\xa1\x72\xcb\x59\x89\xab\x77\x18\x5a\x21\x71\x75\xe6\xe8\x24\x2f\xf1\x42\x42\x8f\x2c\x3c\xaf\x5f\x10\xdb\x95\x9a\x5c\xff\x92\x50\xfd\x94\xf7\xe6\x59\x23\xa8\x85\xec\x6a\xdf\xf9\x57\x0a\xa3\xdd\x83\x57\x78\x7e\xe9\xa2\x0b\x30\x33\x91\xef\xcc\xff\xc1\x6d\xd7\x47\x11\xe7\x9a\x77\xd6\x13\xfb\xed\xd9\xed\xbc\x2d\xbe\x44\x48\xe5\x34\x48\xcd\x11\x61\x63\xa5\x11\x9e\x59\xe1\xd6\x7c\x7c\x04\xbc\x1c\xa7\xac\xb3\xd0\x6e\x65\x0f\x00\xa3\x08\xb2\x63\x59\x62\x0b\x02\xbf\xe7\x83\x79\xe8\xf0\xd4\x4a\xea\x11\x7c\xc5\xa7\x19\x4e\x12\x79\x8e\xf4\x33\x3e\x98\x05\xbc\x1c\x49\xf5\xb6\x9d\x44\x6e\xac\x75\x76\x2a\xa8\xa8\x96\xf3\x27\x20\xe5\x8b\x26\x59\x36\xd5\xb7\x82\xc5\xdd\xd9\x3f\x3e\x6a\x6b\xef\x9e\xde\x60\x5c\x79\x7d\x20\x9a\xed\x56\x37\x06\xac\x96\xf3\x98\x58\x12\xb8\xca\x3a\x52\xbf\xb7\xf9\x93\x62\x63\xb9\xe1\x6c\xa6\x99\x80\x5b\xd2\x06\xce\x8f\xb0\x69\x92\x52\xe4\xf7\xb3\x29\x36\x0b\xd8\x7e\x4e\xf2\x02\xdd\x23\x78\xc6\xca\x8a\x39\xd2\x65\xd6\xbc\x36\x07\x51\xb7\xd9\x3c\x03\xfc\xcf\xf9\x15\x05\xc5\x1e\x49\x33\xf7\x1d\x22\xb8\xe6\x5c\x20\xa5\x07\xea\x01\xf9\x37\x42\xcc\xa9\xf2\x29\xa1\x56\x92\x52\xcf\x16\xab\x70\x6e\xde\x1a\x53\x27\x31\x5c\x7b\xfd\xec\xe4\x21\x7f\xd8\xa5\x74\xda\x0c\xcb\x87\x65\x11\x0b\x46\x47\xdb\xc3\x7b\x5d\x30\xaf\xc1\x8c\x06\xf8\x0a\xa3\x95\x87\xa3\xfd\x22\xc6\x8c\x51\x65\xe4\x81\x39\x38\x20\x46\xb3\x73\xb3\x7a\xd9\x23\x02\x8c\x6c\xd5\xbd\xf6\xe0\x72\x03\xdf\xc1\x3d\x58\x31\xb6\x3e\x3c\x89\x23\xc0\x64\x54\x7b\x3a\x30\x68\x95\x39\x8f\xbd\x98\x5a\x23\x56\xa9\xa4\x60\x53\x0f\x36\x73\xe5\xca\xd7\xb0\x9d\xc2\x4e\xb9\x5e\xc2\x1e\xa0\xe7\x48\xba\xea\xe5\xe3\xaf\xb3\x9c\x64\x23\x2d\xa7\x0e\x3a\xed\x97\x52\x9d\x6b\x66\x45\x0c\x69\x20\x70\x4c\x50\xd9\xb2\x05\x3b\x3b\x3e\xeb\x92\xc9\xf9\x59\x52\x44\x20\x2c\x11\x3d\xb9\x24\x01\x97\x7f\xde\x93\x54\xcc\x4e\xab\xbd\x6d\xb5\x67\x51\x62\xe5\xc9\x4b\xbf\xec\xc4\x96\x8e\x1d\xd4\x69\xb8\x44\xba\xde\x20\x12\xe6\xf0\xb9\xa7\x51\x41\x3c\x3b\xf9\xd3\xb6\xff\x61\xf9\x52\x82\xc6\x34\x51\x84\x3c\x15\xba\xed\x4f\x0e\x76\xad\x9a\x11\x11\x03\x91\x3b\x6d\x44\xa6\xbc\x89\x5a\xb3\x86\x13\xd8\x8e\x85\xa9\x39\xd6\xb7\xde\x41\x56\x10\xe4\x94\xec\x6e\x19\x9a\x56\x76\x15\x2e\x9c\x64\xa1\xf9\x8b\x34\x1f\x09\xef\x30\x83\x5f\xc1\xef\x8e\x44\xb0\x09\xb6\xb6\x61\xa6\xea\xcb\xf5\x58\xef\xa9\x45\xe2\xd7\xb5\x3b\x83\x70\x32\x0a\xdc\xa0\x2b\x2a\x4d\xc0\x4e\x36\x5d\x50\xcb\xda\x2e\xc1\xb1\x82\x30\x39\x1c\xcf\xc8\x06\x64\xcd\x88\xbe\x44\x94\xb5\x63\x91\xb3\xcd\x38\xdb\xd9\x91\x1e\xcd\xc5\x41\xf1\xfa\xab\xba\x17\x88\x34\xf1\xb5\x90\x85\xd8\x83\xb2\x41\xde\x09\x22\xa0\x3a\x16\xf4\x7a\xf8\x75\x23\x54\x1e\x55\x75\x78\x40\xe0\xf1\xb6\x80\xad\x05\x4a\xe4\xff\x4f\x0d\xed\xe7\x3f\xe2\x01\x28\x06\xc3\x3e\x35\xd4\x36\xcf\xf6\x51\x9f\xaa\x80\x9f\xc0\xe5\x6f\x95\x5b\xf6\xe6\xed\xe4\x73\xe8\x22\x8b\x00\x9f\x2f\x6f\x8f\xd0\x8b\xd2\xdd\xe7\xa2\xc0\x52\x25\x96\xae\x9b\x60\xe4\x50\x9d\x00\xed\x95\x4b\xf5\x95\xc3\x7e\x61\xd5\x0e\x43\x79\xb3\xcb\x10\x05\xd8\x3f\x61\xb3\xc3\xec\xde\x34\x3e\x7a\x06\xaa\x0d\x75\xb0\xce\x0f\x7b\xe7\x3c\xed\x59\x42\xb1\x34\x12\x29\x12\xfd\x85\x93\x09\xad\x18\xee\xac\xb9\xfa\x6c\x0b\x25\xef\x6e\x4e\x07\x03\x08\xfb\x72\x75\x85\x16\x81\x44\xcd\x21\xf1\x7d\x25\x2d\x1a\x43\x3a\x43\x79\xb8\x6a\x13\xe5\x55\x18\x2b\x2d\xda\xf1\x80\x23\xef\x75\x54\xb5\x0b\xce\x5f\xa5\xa7\xfb\x8e\x8b\xd6\x55\xbc\x9c\x11\x38\xec\x49\xe4\xe1\x25\x51\x69\x3a\x0d\xf3\x4b\x16\x5c\x9b\xf3\xf1\xfb\xf5\x13\x9d\x06\xc5\x9a\xf5\x39\xde\x88\x0b\x13\x67\xc9\x0f\xe9\xd7\xe5\x48\x0d\x49\x31\xb6\x43\x8d\xbc\xe2\xf0\xc2\xb1\x65\xea\x90\xea\x70\x15\x38\xd5\xd5\xf9\x3e\xc5\x23\x1a\x68\x0f\xdb\xad\x9c\x3d\x3b\x99\x61\x80\x73\x1e\xc5\x92\xf7\x8f\x83\x77\x5e\x14\x62\x54\x4a\x10\xc4\xc5\x90\xb5\x12\xea\xc7\x3f\x3f\xa1\x21\xe6\xbd\x60\xd9\x6c\x1a\x0d\x72\xb2\x88\x67\xda\xb2\xdf\xc8\xeb\x9f\xa8\xac\x7e\x2e\x0b\x1d\xdc\x25\xfd\xe8\x62\xfb\x87\x97\x59\x55\xfe\x5b\x5e\x71\x45\xf5\x35\x7b\x9d\xcd\xf2\x2b\xaf\xca\xe8\xec\x24\xc1\x75\xa3\x33\x02\x1e\x36\x6c\xbc\xf6\x95\x65\x2f\xce\x88\xb2\x89\x05\xcf\xb5\xb2\x93\x6f\x73\x87\x28\x33\xd6\x67\x39\x28\x58\x9e\x24\x61\x05\xdc\x35\x45\xe1\x76\xb2\x9b\x22\x6f\x8f\x54\xff\x23\x0a\x02\x9d\x20\x7f\xbc\x24\xde\x51\xa1\xc1\x76\x02\xda\x4a\xe6\xb8\x4d\x3d\x07\x67\x75\x80\x28\x44\x31\x51\x92\xd1\x13\xcd\xe5\x2f\xfe\x54\x7e\x1d\x29\x84\x9e\xa9\x1b\xd0\x5f\xc5\xf3\xbe\xa2\x95\x7c\x23\x38\xf8\xeb\xb8\xde\xdb\x47\x7f\x73\x9f\xd9\xd5\x58\xfc\x27\xf8\x04\xf3\xec\x0d\xc9\xae\xbc\x32\x6c\x57\xd8\xdc\xea\xdf\x10\xf6\x68\x20\x03\x0e\xab\xce\xc2\x8a\x23\xd4\xdc\x1e\xba\x24\xee\xbc\x0d\xc3\xec\x36\x47\xe0\x21\x7e\x52\xc5\x9a\xbe\x73\x0b\xec\x79\x4b\xd2\x6d\xe5\x59\x78\xac\x59\xd9\x66\x67\x17\x26\xf8\xd7\x29\xdf\xd6\x17\x34\x01\x5e\x8a\x15\xbd\x15\x08\x44\x75\x15\xbd\x50\x5a\x53\xdb\xec\x74\xfc\x9e\x5c\xab\xd7\x1c\x62\x2b\xe4\x3f\x4a\x3a\xb9\xc7\x6e\x19\x32\xca\x7f\x54\x94\x36\x78\xb1\xf7\xe7\x7f\xa0\xd3\xac\x3f\x92\x15\xf7\x9f\x9f\xe9\x6e\x2f\x74\xaa\x5e\xbc\xa2\xec\x3e\xf2\x97\x70\x3d\x71\x20\xac\xd3\x26\x26\xed\x83\xef\xf2\xde\x9b\xe2\x52\x71\x55\x50\x26\xdb\x47\xf1\xd3\xcf\x4b\x3a\x9e\xf0\xb0\x71\x63\x94\x54\x8a\x4e\x1f\x4a\x3a\x36\x67\x4e\x7a\xe6\xbe\x4b\x47\xa6\xf6\xf5\x9e\xa5\xf6\xb9\x60\x39\xc4\x5a\xfc\x12\x13\xc0\x8a\x38\x15\x0d\xb7\x3a\xa4\x97\x67\x63\xb3\xb7\xd2\x74\xe9\xd0\xe8\x04\x19\x6a\xde\xa3\x93\x76\x15\xc2\x64\xb6\xb1\x66\x12\x14\x24\x68\x0f\xef\xab\xb0\xe8\x00\x13\xd8\x9f\x6e\x5b\x83\x44\x62\xd2\x14\x14\xa1\x6b\x2a\x6f\x15\x99\x53\xd6\xa3\x72\x64\x75\x5c\xf4\xaa\x45\x80\x94\x5c\x81\x5b\x7c\xab\x73\xf5\xef\x89\x10\x39\x43\xb2\x95\x91\x1d\xb9\x44\x50\x81\xea\x8a\xbb\x40\x45\xa7\x7b\x6f\x0d\x99\x02\xa9\xfb\x52\x13\x83\x07\x35\x37\x87\x5f\xee\x34\xaf\x14\xce\x21\xa8\x8b\x54\xff\x28\x89\xdb\x4a\x22\xef\x82\x7c\xe2\x72\x82\x0b\xb0\xf7\x4c\xb8\xb3\x38\x29\x27\xd1\x52\x8e\x37\xef\xbb\x5d\x26\x72\xcb\xe3\x6d\x97\x0d\xf0\x47\xa5\x4e\x25\x6a\x88\x85\x58\xb5\x4f\x13\xd7\xda\xf8\xdf\x3f\x3a\x9d\xcb\x1e\x4f\xcf\xda\xe7\x79\x73\xc7\x65\xd7\x00\xbd\x90\xce\x94\x88\xd4\x82\x2f\x85\x54\x2b\xaf\x64\xd0\x31\xf2\x8a\xa8\xfe\x32\x51\x0f\x04\xdd\xed\x7d\x52\x53\x26\x5c\x0d\x50\x2a\x85\xbb\xdf\xd1\x64\x53\x47\xa1\x1c\xb5\xa1\x58\x68\xdc\xab\xec\x82\x87\xda\xaf\x19\x76\xcc\x0a\x77\x3e\xb0\xec\xd2\xce\xc5\xd5\x08\xfe\xd8\xbc\xa7\xe7\x2a\xcf\x91\x95\xfe\x91\x18\xc8\x8e\x24\x49\x92\x6c\x03\xee\x91\x61\x3c\xc7\xc2\xcb\x63\xb9\xc3\x61\xa4\x5c\x61\x5e\x54\xce\x6f\x46\x03\x9d\x1b\xf4\x66\x74\xec\x6f\x00\x5e\x81\xf4\x9d\xf3\xb0\x5e\xee\x36\x19\xd7\xa9\xbc\xce\x33\x42\xa1\x11\x9c\xb5\x84\x8e\x7f\xe7\x7c\xbf\xcf\x5c\x59\xf7\x39\x98\x57\x7b\xae\x08\x45\xf2\x91\xae\xda\x3d\x89\x94\xb6\x7d\xe8\x75\xb8\x55\x5a\x32\x6d\xee\xec\x7e\x8a\x8d\x45\x28\x0e\x80\x25\x82\x24\x63\x38\xf2\xd6\xf9\xab\x6d\x2d\xba\x45\xfe\x5a\xce\xab\x61\x57\x06\xe7\xaa\x6e\x53\xd1\xb7\xc6\x67\xdf\xe6\x85\xf3\xdd\x06\x63\x57\x0e\x82\xd5\x89\xad\x3c\x83\x11\xb6\x1c\x6d\xa1\x3c\x8f\xea\x2b\x85\xca\xf5\x4c\x11\xd5\xd5\x2e\x75\xd4\x7a\xbd\x34\x75\x88\x2d\xcf\x11\x3b\xea\xdb\x3d\x0e\x87\xa2\xb4\x09\x10\x12\xe2\xb5\xac\x50\x60\x00\xf8\x96\xbe\x73\x3a\x59\xd8\x55\x49\x2a\x22\xe8\x1c\xff\xe4\x8a\xaa\x30\xd8\x60\x67\x78\xfe\x63\x19\x66\x07\x89\xe0\x14\x0a\x43\x3d\x66\xdc\x9b\x6a\x38\xfd\xfb\x0e\x13\x57\xa9\xb5\xf2\xdb\x5f\xab\x17\x51\x04\x62\xd7\xe2\xfd\x45\xaf\xb5\xca\x2e\x7a\xd8\x25\x7d\x33\xc2\x48\x22\x62\x62\xa7\x79\x0a\x1c\x84\x59\xc4\x01\xb2\xfc\xaa\xf3\x74\x93\xb7\xb8\xfe\x43\x21\xc0\x52\xdf\x52\x25\xdc\x75\x40\xc3\x9d\x7e\x04\x6e\x91\x73\x4a\x72\x31\x46\x93\x73\x11\x22\xee\x16\xcd\xf2\x6a\x5b\x38\xbd\x59\xc9\x76\xa8\xfd\xe4\x00\xdd\x32\xab\x6c\x3b\xa5\x9b\x84\x64\x36\x85\xaf\x8a\x7d\xe5\x4e\x7f\x41\x33\x49\x35\x1c\x55\xb3\x7f\xf9\x08\x1a\xd8\x19\xdd\x9f\x58\x5e\x66\x49\x47\x27\xf7\xd5\x98\x00\x40\xb2\xb9\x84\xdc\x1b\x3a\xa8\xd8\xef\x37\xf2\x27\x06\x41\x4c\x75\xe6\x74\xd2\xd2\x03\xab\x8f\x6a\xac\x22\x68\x7b\x0a\xb3\x21\x54\x70\xa2\x86\x9d\x2c\x35\x3c\x75\x95\xcd\x2a\xb1\xa9\xa6\xac\x84\xe9\xf0\xd0\x63\x01\x96\x23\xc2\x12\xa5\xdd\x5b\x4a\xdb\x88\x29\x4b\x57\x96\x14\x69\x92\x4e\x6d\xfa\xa7\xaa\xb6\xba\xfe\x29\x61\xcc\x64\x93\x0a\x1b\x4f\x75\x8e\x7a\x6c\x97\x6e\xa2\xee\x3f\x86\x18\x89\x53\xe3\x29\x9b\x95\x33\x54\x24\xce\x0b\x63\xd1\x96\x44\xc2\x1c\x11\xdb\x4c\x4b\xbe\x12\xd0\xd1\x58\x5a\x3f\x2c\x5c\x78\x6d\xe4\x1b\x33\x18\xbb\xc8\xa1\xa5\x74\xf2\x72\xd9\xd5\x9f\x1b\xb1\x33\xba\x38\x18\x64\xe8\x12\x2a\x60\xd8\x49\x91\x47\x96\xc3\xb7\x1b\x96\xd2\xd1\x0c\x0b\xe1\xc0\xa8\xb2\xd6\x4a\xb8\xaa\x7f\x88\x5d\x5c\xb4\xd5\xd6\xc1\xce\x00\x6a\x34\xa2\x2a\x7c\x42\xdc\x13\x66\xd1\xef\x55\xb5\x9d\x26\x27\x9c\x55\x51\xd8\x31\x34\x55\x36\xd0\xe9\x11\x75\x5d\x69\x23\xda\xc1\xec\x73\xbc\x70\x56\x3b\xc1\x06\xb2\xf9\xa3\xff\xd3\x33\x35\x27\xe9\x14\x7a\x97\x27\x5d\xff\x9f\x20\x3c\x68\x34\x9f\x22\x98\x3f\x94\x48\xaf\xec\xb4\x5f\x7c\xf4\xf0\x81\x03\x09\x06\xa8\x8e\xee\x34\xb0\x0c\xdc\xf7\x28\x0d\x97\x30\xa0\x66\xbb\xad\x46\xec\xcf\x50\x3b\xbf\xfe\x87\xf2\x9f\x02\xd5\xf6\x4d\xa8\xe9\x50\x86\x51\xbd\xb6\x4b\x22\xdb\xa1\x39\xa5\x0f\x33\xf0\x2b\x9a\x0d\xda\x4f\xc4\x5c\x8f\xf9\x1f\xdb\xbf\xd9\xf1\x48\xba\xce\xfc\xd4\x1c\x43\xf6\xde\x32\x4a\xc9\x8b\x24\x36\xb7\xd6\xf0\x8c\x61\x52\xd7\x52\xb4\xfa\x32\x25\xc9\x43\x7a\x29\xe3\x63\x1e\xd5\xa8\x1b\x86\xc4\xbd\x5c\xff\x45\xc4\x85\x90\x26\x77\x0f\xa5\x9a\xb9\x76\x1d\x1b\xdd\x36\x5b\x47\x76\x01\x38\x50\x2c\x5e\x91\x58\xcb\xc9\x13\x52\xe8\x39\xe2\x6a\x3f\x3e\x55\xf9\xf3\xdd\xc3\x1a\x4b\x34\x81\xc8\x1e\x34\x5c\xca\x9f\xa5\x5d\x45\x99\x52\x98\xa0\xd4\xc3\x3f\xeb\x0e\x62\xd9\x27\x78\x65\x25\x22\xd7\x6c\x03\x3a\xb2\x01\x98\x90\xa3\x1d\xcd\xb5\x30\xd7\x44\xb4\xa3\xba\x7e\x14\x42\x76\x1f\x76\x9b\x90\x21\xe0\xb5\x9d\x0b\x02\x23\x09\x7f\xc9\xea\xc2\x11\x50\xe9\x20\x1a\x18\xa3\x1b\x37\x45\xe0\x9a\x9c\x4b\x70\x1c\xa5\x68\xf3\x94\x5c\x49\x4d\xd0\xae\xcb\x54\x3b\x75\x44\xa3\x7d\x54\xd2\x10\xa6\x9c\x98\x30\xb4\xa0\x78\x1d\xc9\xc7\x96\xba\xec\x9a\x48\xba\x9f\xd8\xd2\x87\x5b\x84\xbf\x5d\x49\x16\x87\xa5\x15\x95\x9b\x5b\xd3\x44\x85\xa9\x94\xdc\x35\xd2\xf1\xd7\xcc\x32\xad\x9b\xc5\xac\xb4\xc1\xd2\x0a\xc3\x1b\xef\x42\x32\x97\xa8\x23\xa3\x8c\xf4\x44\x68\x1f\xa6\x08\xd8\x17\x75\xcf\x21\xde\x87\x68\x70\xe4\xc8\x85\x88\x65\x9f\xe4\xb3\x6e\x63\xba\xee\x59\x25\xb9\xbe\x33\xad\xb5\xe7\x2b\xda\x7e\x3c\x09\xbb\xc4\xd6\x17\x08\x6c\xe4\x47\x41\x09\x48\xfe\x5d\x6a\x25\x2a\xba\x68\x4a\x90\xab\x5f\x54\xe2\x0f\x6f\x11\x7a\xe9\x78\x51\x06\x97\x04\x83\x00\xd5\xb4\xb9\x15\xa3\x41\x55\x26\xe6\x21\x96\x94\x65\x6d\x92\xc0\xaf\x1c\x2a\xbe\xe9\x5b\x69\xf7\xf1\x4d\xee\xf3\x86\x8f\x81\x28\x15\x99\xe2\x80\x9a\xc1\x34\x3a\x4d\x4e\xb8\x1c\x78\xa9\xbd\x5d\xca\xec\x2a\x95\xb9\xb9\xe9\x58\x79\xa9\x62\x90\xc2\x3c\xd6\x8f\x2e\xdc\x66\x51\x29\x7e\x1e\x06\xe2\x79\xa0\xfb\xa7\x44\xdf\x51\x48\xc2\xab\xd0\xde\xe4\x05\xa3\x24\xaa\x68\x5e\x2d\x22\xec\x25\x0e\x93\x12\x56\xd4\x07\x74\x97\x36\x4a\x54\xaa\xb6\x7f\x6e\xdd\xc8\xde\x5d\x5d\x59\x0b\xd8\x28\x64\x2b\x5a\x43\xd1\x7b\xed\x56\x6a\x5c\xea\x8f\xaf\x87\xc8\x44\xef\x99\xde\xf6\x31\xc8\x6e\xbc\xe7\x9f\x88\x7b\x24\x76\x78\x43\xc1\x38\x71\x90\x25\x7d\xc6\xee\x9c\x3e\xe0\xf9\xed\xba\x18\xc4\xff\x8b\x9b\x47\x8f\x9f\x14\xf6\xd4\x9f\x57\xac\x39\xd0\xc6\xe0\xab\x21\x3b\x0f\x5b\x88\x08\xb3\x43\xe7\xbb\xf9\x3f\x2a\xdd\x0f\xdf\x61\x44\x0b\x9f\x29\x40\x13\xe8\xc0\x1b\x03\x6f\xde\xf5\xed\xca\xdc\x3b\x58\x71\xc7\x1c\x12\x1a\x4f\x98\xf5\x42\x6a\x07\xac\xe5\xcf\x73\x58\x88\x8d\xb8\x3d\xca\x3e\x0f\xb4\xa6\xe2\x7b\x2b\x2c\xd0\x82\x14\x74\xcd\x6a\x1d\xca\x37\x14\x1a\x99\x25\x64\xe0\x4d\x4d\xde\x4c\xc7\x00\x27\xdd\x6a\xc8\x89\x75\x07\x6b\x3f\x8a\xd8\x6d\x83\x91\xd4\x40\x3b\x25\xe9\x07\x29\x7a\x0b\xed\x0c\x04\x8c\x91\x2d\x33\x51\x94\x60\x95\x64\x11\x1b\xcf\x2b\x49\xe9\xc2\x63\xe0\x67\xd0\x09\x29\xbe\x1f\x37\xf1\x07\xcf\x3a\x05\x55\xaf\x7c\x7d\x9b\x73\xa2\x74\x89\x66\x87\xad\xe9\x82\xd9\x4f\x45\x7f\xda\x91\x5f\xe5\x59\xd8\xfe\x08\x19\xee\x39\x2b\xc2\x19\x9d\x34\xaf\xf3\x26\x91\xfa\x00\xad\x88\x74\x97\xc3\x88\xea\x74\xcb\x3b\x1f\xd9\x2c\xee\xef\x8d\xee\x1c\x27\x98\xe9\xbe\x53\xb0\xe2\xe4\x9a\x5b\xa5\x7a\xb8\xed\x96\x55\x84\x7d\xa1\x98\xc8\x0b\x42\x0d\x28\x62\x3d\xce\x30\x87\x3d\x4e\x32\xd3\x8e\x93\xb1\x80\x07\x64\x8a\xfe\x2a\x2b\x63\x1c\x8f\x95\x6c\xbd\x03\x84\xdf\x3b\x7b\x25\x39\xef\xa4\xfe\x80\xc8\x35\x2b\xae\x0f\x8a\x43\x7f\x1e\xec\x8c\x5e\x5c\x60\xe1\x4e\xe8\x87\xe9\x0c\xd7\x4a\x0a\x00\xdd\xa3\xdc\x8f\xf4\x57\xb7\xc2\xb0\x6f\xbe\x8c\x47\x52\xef\x2e\x81\x8d\x47\xfb\xa3\xf0\x20\xd0\x0e\xc0\xdb\x17\x82\x22\xe1\xdd\xc9\xca\xb0\xea\x78\x02\x71\xc6\x60\x40\x72\x0f\x19\x1a\x85\xae\x35\x0f\x54\x84\x57\xa2\x6c\x87\x4e\xa2\x3b\x9c\xd1\x9a\xe8\xfd\x24\xd5\xf0\x9e\xa2\x1b\xb0\x55\xc2\x04\x5b\xf9\xb2\xd7\x66\x6b\x1e\x45\xec\xe5\xfe\x2c\xad\x24\x64\xad\x67\x85\x60\x93\xe7\x38\x2e\xf5\x88\x3e\xdf\xc3\x85\x3a\x6a\xa2\x29\xcd\x7f\x9b\x7f\x11\x9f\x1b\x3a\x11\xd2\xf8\xb8\x2b\x2f\x1b\x77\xee\x81\x19\x3c\x42\x39\x98\xcf\xc3\xcf\xff\x28\xed\xd1\xf4\x53\x48\x0e\x62\xc2\xfd\x2e\xab\x02\x97\xf0\x3c\xd2\x44\x80\x1a\x8f\x25\x59\xfd\x97\x0e\x38\xac\xe1\x7e\xf9\x95\xd5\xa5\xf6\x4f\x36\xb0\x39\x85\x7e\x3d\xb6\x2d\x22\x44\xec\x9e\x47\xac\x54\x93\x4e\x11\x1b\xcc\x5f\x3d\x63\xda\x94\xdd\x93\x5a\x98\xfe\x06\x23\x75\x14\x2a\x48\x7e\x9b\xb2\x6f\xaf\xe0\x7a\xa4\xee\x1b\xfc\x20\x58\x39\xd9\xce\x83\x9d\x3b\xa4\x37\xb7\x56\x1f\xfa\x8c\xec\xd8\x65\x7d\x6f\xab\x2c\xd6\x91\xbb\xa3\x1b\xdc\x65\xd5\xbb\x62\xf4\x5c\x70\x19\xbb\x1f\xc3\xb8\xf2\xa4\x2f\xff\x52\xc2\x9f\x88\xe0\xdf\x52\xa6\x75\x93\x90\x7b\x29\x21\xb3\x5b\x5a\x7c\x84\x6d\x2c\x9c\x06\x6c\xcb\x89\x5e\x79\x0d\xfa\x86\x8b\xda\x59\xe1\xc9\xcb\x68\x26\xef\x74\x99\x57\x87\x6f\x96\x38\xe5\x96\xdc\x08\xba\x0b\x1d\x57\x96\xe4\xcd\x9c\xbf\x22\x5f\x90\x3f\x44\x7a\xfb\xc8\x6a\x1d\xab\x39\x7c\x37\x35\x2b\x67\x61\xaa\x57\x78\x22\x39\x63\x52\xba\x9b\x4a\xfb\xdb\x49\xbd\x7a\xdb\x3f\x50\xa0\x8e\x7d\xc4\x02\xa9\x86\xdf\x6b\xd5\x01\xef\x1d\xb5\xfc\x4e\xd8\xd6\xf9\x4d\xde\x77\x7b\x38\xe7\xf0\x9a\xa3\x84\x13\xbd\x64\x82\x21\x25\xc5\xf4\xf6\x6b\xab\x86\x83\xda\x9f\x0f\x03\x4d\x4e\xd0\x93\x87\x8d\xad\xf1\xd8\xd4\xfa\x6d\xdf\x36\xc8\xab\xc4\x32\x53\xc4\xd6\x21\xda\x90\x37\xbc\x17\x1e\xaf\xd6\xc4\x7b\xeb\x43\x87\x11\x88\x47\xb5\x84\xe9\x67\xcc\x03\x53\x1a\x76\x2f\xa6\xbd\x38\xa7\x7e\x88\x09\x0a\xae\xa4\xf7\x02\xad\x34\x57\x9e\xb1\x28\x4f\x6b\x8c\x5c\x43\x20\xc5\x7c\xd4\xa4\xec\x1f\x30\x06\x58\xe1\xb5\x16\xc2\xc8\x84\xfe\x31\x5c\x38\xe3\x53\x7a\x03\x78\xd7\xda\x35\xc2\x44\x42\x75\xdd\x18\x64\xc7\x73\x54\x3f\xf5\x59\xd1\x76\xf4\x13\xe7\x59\xff\xe6\x37\x2d\x01\x30\x64\x60\xcf\x29\x06\xf6\x53\x11\x60\x30\x61\x97\x2d\x54\x51\xa1\xf9\x8c\x55\xf3\x09\x97\xe8\x55\x05\x5e\xa7\x9b\xec\x1d\x11\xe1\x7a\x12\x9f\x91\xcd\x07\x95\x40\x33\x94\xbb\xcc\x47\xd4\x2e\x11\x11\x82\xde\xb6\xbb\xa6\x70\x76\xcf\xe4\x91\xc2\x46\x98\x7c\xc9\x33\xcc\x26\xf0\x5f\x1e\x0c\xc9\xf6\xe7\x12\x69\xfb\x25\x0b\x01\x7f\x89\x27\x4d\xfa\xce\x50\x3f\xc6\xf3\xad\xe4\x03\x54\xc9\x36\x5b\x5d\xdd\x80\x71\xa8\x30\x04\xc5\xe0\x94\x51\xd6\x50\xae\x50\x15\xf5\xa4\x4d\xbe\x66\xd5\x74\x98\xa8\x28\x20\x3a\x9b\x96\x1c\x56\xa1\xbc\x8d\x08\x14\x8b\x35\x65\xb6\x0f\xe1\x75\xeb\x46\xef\x7e\xf4\xce\x21\x96\x01\xfe\xc5\x64\xa5\xc1\x76\x5a\x61\x4a\xda\xb1\x14\xed\x3f\x92\xb2\xf6\x08\x81\xf2\x0a\xa8\x5e\x08\xa3\x67\x6b\xef\xe2\xc7\xe8\xcf\xc2\x0d\x94\x9b\x5f\x15\xde\x86\x3d\xdf\x2e\x72\x8f\xdb\x5d\x91\xf8\x58\x4e\x01\x43\xb6\x0e\x4f\x7a\xd2\x1e\x06\x57\x5e\xf7\xd2\x1f\x6b\x94\x56\xb7\x0f\x9c\x05\x46\x55\xe8\x5a\x4a\x3b\x84\x25\xe2\x8f\xd6\xa5\x90\xc2\xcb\xf7\xbb\x47\x2d\xa1\x4a\x0e\x64\xac\x4b\x71\x44\x87\x2a\x50\x6f\x1f\xb1\xbc\x5b\x95\xa0\xd5\x7d\x42\x2d\x61\x67\xac\xfc\x01\x6c\x1b\xaa\x3b\xc1\x9e\x8f\x9e\xde\xbb\xb9\x07\x74\x51\x76\xc5\x2d\xf3\x10\x65\xd9\x1c\xe9\x99\x4e\x9f\x94\x5a\x29\x69\x8d\xeb\xc4\x47\xea\x3c\x16\x38\x42\x8e\x9a\x43\x29\xfe\x83\x1f\xb9\xbd\xb6\x6d\x54\x25\x68\x63\x23\x61\x2f\x60\x81\xee\x4f\x42\xdd\x5d\xd1\x4d\xcd\x10\xbf\x34\xa8\xbf\x13\xd6\x8d\x3e\x20\x4a\xf4\xc9\x99\x02\x9d\x32\x0a\xed\xa8\x2a\xee\x96\x5e\xbc\x9b\x2f\x17\xb4\xb2\x8f\x29\x9f\x8f\x6e\x8e\x78\x4b\xd8\x49\x0d\x51\xd9\x31\x6b\x12\x33\x6e\xf4\x08\xcf\x06\xf7\x74\xed\x43\xa3\x83\xc8\xed\x3f\xda\x83\x11\x94\x94\x68\xc4\x6c\x83\x41\x9e\x5a\xdc\x48\x79\x64\x92\xcf\x6c\xc9\xea\x25\xac\x02\xe8\x8e\x7b\x0d\x56\xb7\xb8\xd6\x5d\x44\x42\xfa\x26\xe5\x3e\x76\x59\xbd\x79\x3e\xa4\x73\x13\xa2\x0f\x1f\xc2\x9b\x47\x5d\x86\xce\xd6\xf7\xbb\x76\x95\x77\xee\x94\xc1\x53\x33\x79\xd4\x9d\x0f\x9c\x35\x6a\x97\x73\xd4\x9c\x29\x9e\x3f\x52\xdf\xf1\x9d\x73\xc4\xc5\xda\xec\x9d\x49\x68\xfd\xa6\xe5\xfc\x86\xee\xe1\x53\x27\x3f\x25\x3f\x9e\xfe\x8b\x01\x5a\x1d\xb4\x36\x28\x9b\x2e\x81\xf7\x1c\xa9\xf5\xef\x86\xcf\xd0\xf8\x20\x47\xd1\x07\xe8\xd8\x75\x55\xb6\x34\x3c\x68\xd4\xcf\xce\x64\xb2\x2f\x7f\x27\x8c\xfd\xe2\x16\xee\x55\xb0\xf1\x60\x0c\xdd\xab\xd8\x05\xee\x9f\xf0\x35\xbf\x44\x0d\xb0\x9f\xe8\x96\xfa\x6a\x75\xe2\x1d\xef\x0e\x83\x55\x16\x83\xbb\x1a\x7b\xbb\x15\x8d\x65\x8f\x66\xa0\xfd\x91\xf7\x30\xe8\x5a\x73\x7d\xc5\x38\x55\xf2\x91\xec\x6b\x12\x09\xbb\x12\x55\xf5\x1a\x51\xdc\xad\x5b\x17\x0e\x0c\xf8\x07\x5d\x6b\x77\x04\x8c\xdf\xe5\x60\x61\xb8\xf5\xec\x9f\xdc\x65\x6b\x7b\x51\x1b\xa7\x6b\x96\x75\xc2\xaa\xce\xc4\x1d\x8e\xbe\x56\x42\x36\x13\xc3\x7b\x0e\x61\xcc\x2d\x52\xd7\x1d\xc9\x0c\x48\x5e\x6a\x56\x0c\x36\x5f\x55\x5a\x15\xb8\xdb\x03\x37\x3d\x17\xac\x82\xd8\x2a\x0c\x17\xda\x0b\xf1\xa1\x57\x0c\xfc\xc8\x8d\x8e\xc7\xa0\xab\xd0\xb1\x79\x65\xfb\xc7\x2e\x4c\xd8\x20\x54\x7d\x8a\x09\xbd\x7f\x54\x17\x1b\x4f\xaa\x14\x77\x31\x40\xa3\x71\x77\xc4\x72\x65\x23\xb2\xab\xed\x0a\x0a\x2f\xb1\xbd\x55\x79\x5b\x63\x26\x5f\x76\x7d\xcc\x4c\x1a\x2d\x30\xe7\xf4\x11\xd9\x1c\xb6\xbd\x20\x63\x73\x65\xa6\xd7\xc5\x66\xf2\x35\x33\x99\xd2\x8e\xa1\x8a\xba\x40\x41\x92\xa9\xac\xcd\x09\x61\xc0\xf0\x0f\x9d\x74\x0a\x8b\x50\xd4\x95\x7a\x87\x53\x6c\x56\x9d\xe8\x29\x7f\x86\x57\xe8\x98\x20\xc0\x6a\x5a\xa8\x4b\x61\x00\xb6\x3a\x86\x6d\x84\xeb\xca\xd5\xcc\x04\xdd\x49\xdd\x4c\x60\xeb\x2a\x4c\x73\x84\x9f\x82\xce\xf9\x93\x90\x31\xca\x81\x99\x5d\xde\xd5\x0c\xdb\x10\x11\x14\xed\xf0\x57\x59\xc5\x02\x16\xe0\xbb\x4e\x6a\x23\x5d\xe8\x99\x53\x24\x97\x00\x30\xb2\xf8\xfc\x24\x39\x40\xdc\x42\x60\x3c\x3a\xa1\x63\xb0\xff\x19\x7b\x4b\xcc\xe2\x59\x81\x3d\x67\x04\xe0\xdb\x49\xd2\xa2\xdf\xe7\x95\x8c\x4e\x85\x21\x79\xbb\xb2\x65\x57\xd1\xfa\x61\x4f\xdc\x66\xb1\x4b\xe9\x15\x1f\xe9\xe8\x87\xa8\x82\x56\x8b\x32\xb0\xca\xe6\x22\x68\xc2\xbc\x7b\xc8\xd0\x6d\xba\xa4\xb1\xc7\x08\x1a\x29\x5b\x9c\x00\xb9\xbd\x98\x2c\x68\x5c\x3f\xd8\x88\x64\xe2\xbb\x36\x32\x68\x48\x72\xdf\x70\xb8\xba\xc2\xdf\xf7\xc1\x8a\x0b\x30\xfc\x29\x8b\x88\x9b\x97\xe3\x0f\xe1\x3c\x94\x39\x6b\x47\x45\xd2\xc3\xc1\xf4\x08\x6c\x05\x7f\xd9\xdc\x17\x7f\x04\x17\xed\x48\x9c\x8a\x8e\x5f\x10\x37\x12\xe7\x07\x99\xf3\x8a\x8d\x9a\x02\x6f\x3d\x12\xbd\xaf\xed\xa8\x58\xfa\x1b\x8e\x6c\x7e\x31\x16\x69\x22\xc1\x2c\xf5\x4f\x6b\x15\x88\xb8\xa6\xc8\x05\x18\x29\x53\x2c\xbd\xbb\x5a\x78\x19\x1b\x97\xd8\x5e\x82\x46\x64\x0f\xd3\x9d\x7b\x7e\xff\x43\x45\x75\x2c\xd9\x87\xb3\x60\x9c\xbd\xa5\x0b\xed\x99\x32\x3a\xdb\xae\xf3\xd3\x6d\x95\x1e\x4d\x9b\xe3\xd3\x94\xb8\xb9\x3f\xf0\x2f\xd4\xe1\x0e\x03\x0a\x15\x8b\x76\x65\xc5\x16\x62\xc3\x62\x12\x37\x87\xc5\xdb\x4c\x34\x1e\xc5\xac\x5a\x89\x73\x2f\xc3\x5d\x58\x2c\x2b\xef\x61\x78\x39\x8c\xb0\xd9\x62\xa9\x0b\x1e\x6d\x4c\x16\xb2\x57\xb4\x28\xff\x57\x93\x03\x88\xae\x8e\xa3\x76\xce\x76\xef\x03\x7b\x95\xe0\xc8\xb0\x3f\x69\x43\x45\x6a\xf5\x03\x3d\x77\xb7\xf4\xf9\x35\x25\xa8\x6e\xf3\xee\xb5\xfc\x29\x1a\x8f\x55\x9d\x03\xfb\xe9\xe6\xcb\x77\x4b\xfe\xc7\xfc\x65\xc9\x3a\x6d\x91\xc7\x35\x0c\x2d\x4d\x9f\xdd\x04\xd0\x5a\x59\xec\xfa\x0c\xb6\xd6\xa0\xae\x7a\x07\x61\x0d\xef\x6b\xf7\x6f\x22\x75\x95\x55\xad\xcb\x1e\x34\xb3\xc2\xc8\xa2\xd1\xbd\xad\xee\xf5\x34\x87\x1c\xc0\x27\xed\x05\x58\xf3\x6e\xea\x27\xaf\x0c\x86\x59\x73\x5f\x3f\x7a\x50\xd7\xaa\xe1\x70\x7e\x3b\x75\xba\xfa\xb6\x7b\xac\xec\x5f\xee\xc8\xf8\x24\xaa\xb5\x2a\x73\xdd\x96\xc7\x1c\xd9\xb5\x5d\x92\xdc\x4e\x5a\x68\xab\x94\xc7\x48\xf7\x9a\x58\x33\xef\xcc\xd8\x87\xf0\x8e\x76\x19\xab\x4c\x2f\xe0\xcf\x11\x61\x5f\x30\x95\x50\xea\xe0\x42\x46\x27\x47\x4d\x27\xb4\xcc\xd1\x9d\x04\xa7\x7f\xe4\x2c\x0d\xbf\xe0\x10\xe3\x29\xd5\x67\x49\x84\x75\x97\x74\x70\xb7\xfe\x57\xa6\x66\x85\xf1\x97\x7f\x91\xaf\x7f\xd1\xaf\x9f\x61\x57\xe6\xe7\x6a\x6b\x04\x4f\x1f\x5b\x3b\x9c\x32\x8a\xf2\x98\xc6\xb8\x6e\x85\x71\x8a\xae\x9a\xfd\x23\x4d\xd0\x0a\xf2\x68\xeb\xff\x92\x7c\x6d\x99\xc2\xca\x6a\x9a\xc7\xb0\xcc\x08\x9b\x2d\xfb\x81\x0a\xbb\xae\x59\x90\xa5\x4d\x07\x4f\x35\x43\xe7\x65\x69\x15\x32\xfe\x6b\x52\x9a\x45\x50\x61\xa6\xfc\x4f\xb0\xed\xe7\x97\x75\x1b\xd5\x6d\x0d\x9f\x63\xd4\xbe\xe4\xbb\xda\xd2\x4e\x07\x0e\xd7\xef\x28\x82\x4c\x4e\x62\x48\xb9\x90\x09\x08\x02\xad\x6b\x23\xc2\xe6\x67\xfc\x93\x41\xbe\x04\xb0\x37\xce\x8d\xdf\xfa\xd9\xd5\x57\xfd\x8a\xb1\xaa\x38\x7f\x9b\x9e\xdd\x39\x43\xce\x27\xa3\xcc\x75\x47\x45\x9f\x8f\xf2\x96\xc6\xb1\xa7\x34\xf0\x25\xb2\xaa\xc8\x19\xd8\x1c\xb3\x14\x96\xb8\x60\x84\x30\x81\x53\xf0\x98\xba\xa2\xea\x58\x3e\x21\xb0\x9e\xf3\xea\xf4\x84\x96\xc2\x9d\x2d\x4e\x72\xe4\x9e\x45\x41\x15\x4f\x60\x61\xfb\x8f\xa3\x0a\x00\xfd\xc1\x36\x25\xeb\xeb\xf4\x52\x82\x06\xea\x5f\xe6\xea\x82\x68\xf0\x80\x69\x32\xbd\xea\x22\xbe\x09\x57\x97\x40\x18\x86\x49\x91\xbe\x7a\xbf\x67\xb5\x42\x68\x04\xdb\x76\x5c\x5e\xde\xc6\x2e\x38\x0f\x71\xa2\x67\xad\x91\xd8\x0c\xc9\xc4\x0f\xed\xcc\x2c\x9d\xd9\x80\x75\xd7\x8f\x1e\x30\x1b\xa4\x56\x76\x0a\xe7\x6e\x66\x2c\x30\x72\x31\xa6\x1c\x91\xb9\xe7\x16\x76\x75\x23\x7c\x5f\x59\xc0\x0d\x50\x82\x89\x68\x4a\xee\x2c\xf8\xf6\xfa\xb0\xc8\xb3\x96\x74\x11\x36\x59\xf4\xdb\x48\xd4\xa1\xd8\x36\xf3\xdc\xc5\x7c\xb4\xb9\x62\x8d\x5a\xf6\xe6\xe9\x63\xfb\xa9\xad\xd9\xa2\xf4\xd0\x3b\x66\x0d\xa8\xf9\xab\xd2\x7f\xd2\x73\xe3\xe1\x94\x55\x6d\xdd\xfb\x33\x87\x43\x46\xfd\x59\x35\x9f\xa1\x1a\x3c\xef\xe8\xe6\xf7\xb0\x1d\x96\x5f\x07\xbe\x07\xe5\x6f\xec\x10\x7d\xb2\xbd\xb9\x0f\x72\x5d\x2e\x6b\xb9\x28\x38\xb3\x21\x82\xbf\x7d\xf7\xd2\x17\x82\x20\x7d\xb0\x49\xb0\x8a\xa8\xbf\xd9\x33\x47\x38\x7b\x36\x3e\xab\x62\x99\x96\x62\xb0\x47\x9d\x2c\x42\x0e\xca\xe4\xa0\xd9\xe2\xaa\xfa\x7e\x45\x99\x3d\x09\xc5\xa0\x60\xe6\x71\x53\x3c\x48\xa4\x65\xf7\x29\xdc\x47\xa0\xa7\xe1\xba\xde\x7d\x76\x4a\xfa\x6a\x70\x77\xc1\xaa\x25\xe3\xf6\x24\x8e\xe0\x91\x40\x6c\x8a\x36\xfa\x6a\x8d\xa6\x66\xcd\x72\xc3\xb0\x72\x37\x3a\x9e\x5b\xab\xba\x61\x59\xa0\xe2\x79\xce\xb2\xed\xcb\xb3\xaa\xe8\x25\x8b\xcc\xd0\x85\x1f\x51\x57\xb4\x85\xef\xf0\xad\x45\xd1\x6c\x9f\x51\x83\xf0\xca\x73\xa3\x7b\x5a\xf9\xc5\xa3\x56\x6d\x70\x6c\x60\x25\x39\x87\xff\x98\x4a\xcf\x61\xbf\xdd\x4d\xaa\xe2\xed\xc8\x14\x5f\xbb\x1e\xd5\xd3\xb4\x4f\x37\xf1\x98\x9b\x8f\x60\xc0\x10\x1d\x35\x07\x0d\x6e\xf0\x2b\xe1\x2e\x4a\x15\x9e\xe2\x15\x7e\xa3\x40\x0b\x51\x85\x37\xef\x99\x4e\x56\x36\x1d\xe6\xf9\x30\x2d\x81\x45\x31\xab\xe9\xb5\xb0\x37\xea\xaf\x4d\xc2\x66\xfa\x2f\x2e\xd3\x74\x90\x8a\x92\x8a\x2c\xfe\xec\x92\x17\x9b\x36\xff\xd1\x55\x04\x92\x47\x16\xdb\xab\xa8\xab\x09\x25\x0b\xeb\xe6\x5e\x2d\xca\x2f\x16\x0c\x86\x64\x7d\x03\x5c\xfa\x12\x54\xfb\x26\x30\xaf\x59\x05\x97\x0a\x1a\x90\xaf\xe6\x9f\x42\xd8\xe0\x63\x35\x85\x6f\x3a\xde\x1f\x5e\x48\x3e\xb1\x44\x30\x49\x58\xda\xa3\x51\xba\xa9\x30\xc6\xfe\xe0\x17\x1e\x02\x95\xe3\xf9\xeb\x97\x46\x17\xd5\x7e\x4a\x2b\x7d\x2e\x8d\xf5\x4c\x8a\x05\x1f\xb2\x27\x69\x97\xb7\x4b\x2a\x99\xcf\xfb\xb6\x05\x32\x2c\x06\xb3\xf4\x6d\x0c\xd5\xd3\xdb\x7e\xbb\xe8\x92\x6d\xd7\xb1\x45\x9c\xfc\x0c\x36\x10\x73\x12\x0a\xcc\x74\xd2\x4f\xeb\x0d\x8e\xd7\xa6\x73\x09\x81\xc7\x22\xfb\x32\xe8\xca\xea\x75\x2f\xdb\xe7\xaf\x5f\x79\xdc\x6c\xbe\xe0\xca\x4d\xb2\xee\xba\x72\x03\xfe\x92\x08\xc8\x96\xc6\x4a\x4e\x6f\xe6\x14\x54\x57\x32\x6e\xeb\x44\xdb\xe7\xbb\x9e\x36\x21\x78\x6f\xd4\x56\x8c\x43\xe5\xb5\x62\x6a\x6e\xc0\x6d\xac\x9f\x27\x38\x9a\x2d\x73\xa3\xd7\x2a\xc1\xff\x86\x40\x6f\x8d\x60\x64\xd9\x0e\xd9\x74\xcf\x02\xfd\x42\x6a\x05\xc5\x74\x77\xbd\x55\xde\xba\xd9\x36\x87\x27\xed\x6f\x30\xa0\x55\x00\x58\xb6\x39\x24\x90\x67\x6e\xd5\xee\x5d\xe4\x13\x79\xb9\x0b\x8b\x9a\xc0\x94\x4e\x72\x70\xa8\xd0\x6e\x95\xef\x9d\x2a\x35\x7e\x28\xe5\xe3\xa6\x4d\x71\x75\x77\x04\xf4\xf5\x8b\xb2\x0a\x90\xc1\x17\xfd\xd2\x23\xf7\x73\xd2\x50\x05\x78\x79\x87\xf7\x09\xc3\xa1\xaf\x02\x46\x9d\x0f\x86\x96\xa1\x08\x49\x78\xc4\x38\xff\x15\x51\xc5\xae\x19\x5f\x26\x05\x8b\xb3\xad\x9f\x8a\x58\xee\x45\x4d\xbc\x58\x5e\x5d\x93\x9b\xd5\xf8\x08\x19\xbd\xac\xa5\xe7\x97\x3a\xb9\x92\x8a\x8a\x6b\x4a\x65\x25\x8b\xec\xac\xcd\xd7\x25\x34\xcd\xe6\x1b\x16\xd5\xa3\x2a\x11\x6f\xe6\x92\x04\x78\x41\x3b\xc1\x77\xdd\x4f\xf5\xd7\xc1\xad\xb2\xbf\x44\x55\x2d\x37\x5a\x28\x0d\x53\x0b\x71\x0e\x8e\x1c\x86\xf0\x55\xec\x72\x50\x8d\x69\x2e\x84\x82\x9a\x75\x74\x47\x8b\x8b\xb3\x32\x90\xc4\x8e\x76\x8b\x0f\xb2\xb7\x57\xcb\xbb\x85\x01\x16\x56\xd2\x3e\x3b\x88\x04\x7c\x51\xa1\x0c\x3d\x07\x1f\x65\x57\x87\xa0\xf8\x73\xd6\x6f\x7d\xfe\x5a\x75\xa7\x73\x19\x5a\xf0\xcc\xe6\xa7\xc0\xa9\x84\x49\x52\x7f\x1f\x4a\x99\xe1\x0c\xe4\xc5\xb4\xd7\x92\x6a\x91\xd6\x93\x12\xb7\x43\xd1\x30\xb0\xae\x53\x64\x20\x2b\x0f\x74\x77\xfb\xf9\x48\x2a\xb5\x95\x98\x86\xbc\x46\xb1\x7d\xd1\x48\x63\x55\xcd\xc2\x19\x7c\x48\x1c\xc1\x8d\x3d\xd5\xd8\xdd\xa9\x06\x38\x9e\xdc\xf2\xdb\x11\x1b\x63\x38\xb0\xb2\x93\x6b\x67\x47\x14\xbb\x75\x0d\x4b\x17\x77\x52\x7e\xb0\x8d\x3b\xc9\x59\xf1\x5c\x94\x64\xc3\x9f\xb6\x54\x3b\x31\xbc\xfc\x0d\x38\xc2\x6a\x62\x9d\x8b\xe5\xdc\x66\xf5\x7f\x4a\x0f\xaf\xf6\x99\xdc\xfe\xbd\x84\xb6\xdc\x6d\x61\x9c\xc7\x5b\xb8\xcd\xb2\x9a\x4d\x39\x9b\xfb\xac\xc8\x02\xd8\x30\x22\x50\x8c\x45\xae\x7f\xb2\xbd\xb1\x63\x3f\x11\xf5\xbb\x55\x92\x83\xe0\xb7\xc8\x96\x65\xb9\xdb\xc4\xe6\x96\x8b\xa2\xf4\x46\xdc\x20\xda\xfa\xba\x13\x6a\x9c\xca\x32\x79\xf8\xe6\x7f\x2c\x60\xd4\x22\xb5\x92\x8d\x74\xe1\x19\xc2\x37\xd5\xc6\xb3\x2b\xcb\xfc\xf2\xa6\x82\xd3\x81\xad\x0d\x04\xf1\x97\x0a\x63\x74\x3c\xd8\xda\x5d\xb9\x29\x41\x3f\xf7\x62\xc7\x36\xaf\x53\xd4\x4f\xee\xff\x22\xad\xe6\x49\x0e\x1a\xac\x5d\x9a\x6f\x79\x5d\xa3\x7b\x2b\xaa\x32\x8a\x60\x71\x70\xef\x24\x41\x67\x2f\x76\x18\x98\xba\xfb\xcf\x11\x7d\xac\x52\x6f\xee\xef\x14\x01\xdb\x29\x9a\x3b\x68\xf9\x46\xf6\xe1\xe8\x08\xf2\xaa\x8c\xba\xb5\xf2\xbc\x5d\x09\x23\x5b\x29\x6c\xab\x04\x39\xbc\xb3\xd7\xbc\x75\x60\xc0\xfe\x5a\x85\x7e\xba\x43\x7a\xf4\x76\x1b\xfb\x0e\x51\x6c\xd1\x00\xc5\xd8\xbf\x7a\xc0\xd5\xcd\xc9\x11\x32\x43\x66\x5d\xd3\xfb\x61\xe5\x17\x84\xe0\xc4\x45\x14\x60\x56\xbe\xb6\x16\xde\xf4\x64\x27\x6c\xe7\x05\x76\x13\x0c\xaf\x59\xd6\xce\x36\xf0\x2a\xc1\xc1\x6d\xda\xd1\x00\x34\x60\x8a\x4f\xaa\x4f\x15\xc7\xbb\xfb\xf4\x3c\x54\x46\x47\x11\xbd\xfd\x6e\xf5\xc6\x33\xbf\x8b\xf4\xd4\x31\xb2\x76\xc0\x2e\x7c\x40\xfc\xf9\x8d\x16\xb4\xb7\xa4\xf5\xa6\xc2\x24\x69\x41\xd8\x14\x2f\x2f\x38\x23\xd9\xb5\xc9\xb3\x61\x39\xa5\xf3\x2c\x84\x89\x16\xbb\x60\x16\xf9\xe0\x0c\x11\xb1\xbd\x27\x5e\x0f\x0b\x5d\xe3\xbd\x5a\x5f\xd3\xa4\x8a\x5c\xfd\x19\x2b\xbc\xbf\xb2\xb9\x09\x80\xc0\xb3\x1d\x23\xe0\x3b\xe7\x96\xcf\x23\x5c\x1a\xe6\xbe\xe8\x22\xdb\xd0\x2e\x5b\xbc\x9b\xb9\xcf\x60\xa8\x79\x55\xf9\x89\x30\xc7\xa1\x88\x44\x5c\x0f\x76\x96\x57\x65\x1f\xd8\x28\x72\x1a\x0b\x1a\x30\x1c\x0d\xe9\x50\x79\x2d\x47\x4a\x64\x5b\xab\x87\x6c\xef\x85\xcc\xe2\x5d\xe5\x9a\x4d\xaf\xaf\xe8\x3a\xb3\xcf\x0d\xf3\xc9\x10\x89\x0e\xcd\xde\x32\x0f\xaa\xcb\xbb\x10\x8b\x7e\x5a\xb6\x8f\x3a\xca\x03\xa9\x42\x13\x84\x3d\x99\x25\xf4\xa4\x7e\xf4\x18\x26\x0b\x63\xfd\xce\x0c\x00\xa2\x89\xce\x59\xf2\xa5\xad\xd3\x08\x78\x9f\x95\xb3\x62\x39\xc6\x13\xb4\xf8\x5d\x2e\x94\xd7\x1d\xb4\x63\xe5\x7a\x57\x59\xb9\x5f\x57\x92\x87\x7b\x98\xe2\x8e\x45\xfa\x18\x8f\xfa\xf6\xda\x5a\xa7\xcb\x38\x97\x73\xa4\x2a\xd4\x7b\x36\xb4\x72\xc7\xef\xc5\x57\xc7\xc8\xcf\xf8\x51\x76\x99\xf9\xd7\x8d\xae\x5c\x12\xc7\x96\x5b\x32\xa6\x96\x14\x9e\x24\xc1\x1d\xed\x57\x18\x55\x92\x8f\x9a\xd1\x9e\xcd\x1f\xd1\x2a\x70\xac\xb6\xbd\x3c\x6c\xd0\x33\xb5\x5f\xf2\xe1\x5d\x68\xda\x34\xb1\x25\xed\x5e\xf0\xfe\xd4\xb5\x2a\xb2\x08\xb2\x2e\x94\xd8\xfe\x00\x78\xf9\xf8\xd7\xf2\x9c\xf7\xa6\x59\xb4\x1d\x64\xbf\xf0\xee\x3e\x5a\xda\xbd\x62\xe4\x9e\xbe\x3d\x7b\x44\xdf\xda\x07\x81\x96\x64\x61\x08\x19\xdc\xa0\x9e\x69\x45\x7e\x02\x7b\x75\x7f\xea\x41\xe4\x07\xe6\xb0\x21\x77\x57\x8a\xe8\x45\xaf\x17\xb3\x10\x9c\x7e\x21\x6a\x32\x3e\xb1\x1e\x2a\xc0\x6b\xa8\xa2\xde\xc3\x21\xc0\x2b\x6d\xcc\x91\x2c\x44\x31\x14\xdf\x14\x21\xe4\x2a\xe7\x21\x11\x93\x7c\xf5\x97\xad\x34\xdf\xee\xca\xce\xe1\x4d\x16\xce\x30\x4b\xb8\x31\xcc\x48\xcb\xd4\xbd\x0b\x21\x80\x57\x78\x20\x23\xb2\x9c\x5d\x69\xec\x52\x36\xf2\x90\xcf\x1f\xb1\x1e\x6d\x8c\xad\xc8\xc7\x7e\xbe\xc5\x5d\x06\x9b\x4d\xb8\x40\x66\x66\xd3\xb4\x85\x1e\xb5\x67\xf1\x3f\xfc\x15\x92\x8d\xc3\x31\xb2\x07\x7c\x1f\x99\xe6\x3a\x5f\xb1\x96\xa8\xaa\x7f\xb7\x9e\x74\xb3\x71\xee\xdd\xb6\x82\xa2\xd4\x93\xbe\x8e\x18\xf8\xe1\x08\xbf\xcd\xb2\xbf\xa2\xc6\x9f\x18\xa5\xbe\xd6\x10\xae\x46\xa4\x8d\xed\x4c\xce\x08\x93\x82\xa3\x94\x28\x69\xb6\xa3\x63\x1a\x27\x0a\x17\x5f\x2a\xb0\x97\x10\x54\x31\x01\x09\x6c\x80\x0c\xff\xec\xd4\x74\xc7\x17\x15\xe6\x9a\x69\xa3\xea\xb7\x47\xc8\xc2\x47\x65\x7f\xcb\xe9\x87\xdd\x5d\xf3\x0e\x42\xe2\x1f\x47\xfb\x3f\x69\xec\xf6\x05\xa8\xa7\xda\x7d\xa2\x96\xad\xd8\x15\xb1\x90\x17\x25\x03\x2d\xf2\x20\x35\xc3\x2a\x86\xaf\xd9\x9d\xdf\xf2\x8d\xfe\x5b\x77\x7e\xa2\x51\x5e\xb7\xb9\x29\x64\x05\xd8\xe1\xba\x6e\x9d\xf5\x66\xa1\x7f\xce\xff\xa9\x8d\x3e\xef\xaa\xfe\x47\x25\xb7\x5a\xfd\xbf\xb5\xc0\xcf\xb7\xfa\xea\xbb\x2d\xe2\x5b\x30\xa0\x43\x1a\x02\x5f\x7f\x11\x49\xbb\xf2\xcd\x6c\xaa\xd7\x55\x4e\xff\x4d\x14\x0b\xd0\xbe\xd0\x34\xb3\x73\xa9\xb5\x0f\xa2\x0c\x2f\x91\xcf\x59\xdc\x99\x22\x88\xd0\x8a\x10\x98\x5f\x85\x26\x44\xa8\x41\x5d\xc4\xdc\xcd\x5d\x14\xf0\xfb\x33\x06\x36\x93\x88\xce\x9d\xd7\xca\x0e\xf8\xba\xa6\x96\x04\xb0\x36\xac\x40\x2e\xff\x3f\xbe\x08\x6a\x7b\x89\xab\xbb\xd6\x0b\xec\x90\x23\xca\x36\x12\xc8\xcf\x12\x07\x3b\x47\x8a\x0d\x7b\x1b\x8a\x5c\xcd\x99\xd4\xf6\x3f\xd1\x1f\xbf\xb8\x1b\x4c\x17\x59\xd6\xe0\x8b\x24\xea\x6d\x91\x66\xa6\x4a\x10\xaa\x41\xfa\x21\xf1\x9a\x6d\x05\x2d\x1a\xe4\x95\x09\xf7\x56\x7f\xea\x25\x57\x96\x56\x0a\x66\x4b\x02\x19\x70\xce\x2a\x8a\x25\x41\xd6\x1c\x1e\x14\x68\xc7\xf9\xc3\xd3\xa5\xbc\xd2\x49\x7c\xbf\x0f\xf7\xec\x1f\xa1\xfb\x1f\x10\xb5\xe9\x88\xf4\xd1\x67\xc4\x87\x70\x8f\x8d\xac\x3f\xa4\xb4\x2d\x32\x4e\xda\xc3\x87\x16\x38\xc0\x25\x39\x2f\x02\xe2\xf8\xfd\xbe\x83\xa8\xe1\xf6\x88\x81\x0d\xa0\x96\x92\x8f\x69\x92\x70\xd7\xca\x84\x7f\xac\x95\xf6\x26\xd2\x05\x43\xff\x6e\x99\xfa\x21\xe9\x4d\x08\xc7\x3f\x1e\x24\x5d\xf3\x96\xe0\x64\x59\x69\xef\xa1\xf4\x4c\xd1\x77\x33\xd4\x17\x53\x41\xfc\x0f\xcc\x24\x2c\xfc\x47\xa9\x75\xe1\x13\xf9\xe1\x88\xab\x06\x68\x7f\xf3\x16\x0c\x17\xe7\x69\xdb\xa7\x64\x57\xe0\x65\xaf\x56\x78\x4c\x5f\x41\x5b\xf5\xe6\xe7\xf6\x84\x02\xc6\x66\xd7\x3d\x78\xe9\x4e\xd0\x0e\x6a\xf7\x69\xb3\xed\x97\x94\xee\x1c\x26\x64\x18\x8a\x63\x73\x9f\x6e\x02\xe0\x0f\x28\x74\x7d\xbc\x35\xdb\xdf\x73\xe3\xee\x59\x11\x74\xff\xb1\xfb\x0f\x0f\x0e\x82\xe6\x37\x50\x7b\x3f\x6a\xf7\x78\x83\xc2\xc6\x9f\xf0\x46\x5b\x99\x9d\xe1\x0f\xa5\x0a\xd7\x7b\x16\xec\xa0\x49\x17\x28\x82\x68\xde\x34\x49\x6d\x1e\x40\xce\xc5\x16\xc3\x00\x7f\x84\xd7\x92\xfd\x54\x12\x41\x79\x23\xfe\xd7\xeb\xf2\x7e\x83\x0a\x65\x5b\xbd\xd5\x71\x87\x03\x6f\x74\xe4\xad\x12\x7c\xca\x17\x6a\x9a\x9f\x94\xaa\xda\xa8\x63\xf2\x85\x4d\x1f\x2f\xbd\x93\xa9\x6d\x14\x2f\xdb\x3a\x57\xbe\x65\x2b\x58\xb8\x01\xbe\x9a\x4f\x96\x9d\x9c\xcd\x0e\x29\x2b\x22\xc1\x76\xc6\x4f\x6e\x7c\x61\x9d\x1a\xd2\x15\xf0\x70\xb3\x3a\xe3\x6f\x69\x9d\xdc\x08\x69\xe3\x60\x83\x99\xff\xbf\x4d\x72\xff\xb8\x89\x76\x28\x57\x00\x51\x3e\x3e\xb5\x75\xb2\x4a\x3e\x3c\xb7\x5d\xfa\xcb\x81\x4b\xf7\x88\x53\xd0\xfe\xc8\x47\xdd\xcc\x52\xff\xba\xc5\xea\x16\x79\xea\xac\xe1\x7d\xa4\x44\xc8\x33\xf8\xa1\xee\xb6\xfa\x45\xf0\xaf\xff\x41\xef\xd4\x12\xf1\xff\x7a\xcc\xcc\x3a\x13\x36\xdf\x7e\x18\x74\x3f\xca\x64\x39\x1d\xb9\x11\x0b\x47\xba\x0f\xb1\xde\x0f\xb6\xd6\xc3\x7e\x75\x88\x86\xba\x2d\x34\xfe\x4a\xa9\x09\x2e\x20\x62\xc3\x3b\xb5\x53\x5e\xad\xa3\x03\xfd\x3e\x0a\x7d\x23\x38\xcf\x4d\x92\x58\xed\xc7\x5e\x1e\x29\xb4\x3d\xab\x7d\x89\x1a\x31\xe0\x44\x78\x34\x87\x6b\x9b\x06\xc9\xb5\x8e\x66\xe5\xe1\x60\xe3\x87\x23\xc9\xf9\x8e\xe8\x87\x1d\x53\x78\x93\x53\x04\xcc\x16\xfb\x89\x3e\x38\x6f\xc4\xe4\x36\x9e\x91\x44\x7b\x27\xf6\xc2\x3d\x88\x83\xda\x61\x58\x5d\x87\x4f\x97\xfd\xb1\xf0\x01\xe7\xa5\xcc\x83\x43\x21\xa6\x76\x6c\x64\x70\x2b\xfd\x3a\xf5\xd4\xd5\x6f\xb6\x25\xde\x49\x01\x58\x55\x57\x96\x20\x9e\x70\xcb\xed\xba\xff\x80\x6a\xa8\x07\x67\x86\x6a\x7b\xff\x80\xe5\x50\xb0\xc3\x22\x9a\x64\xe9\x04\x51\xec\x65\xa4\x2b\x15\x76\x74\xd7\xcc\xee\xfa\xed\x45\xe7\x0e\x7f\x00\xbc\xe2\x6e\x1f\xca\xdf\x3c\x6c\x68\xf5\x36\x76\x9b\x09\xfd\x41\x0a\xb7\xb0\x45\x67\x4e\x1c\x9c\x72\x47\xc7\x28\xd1\x92\x56\x3e\xd2\x5b\xb8\x28\x9d\x5a\xad\x21\x6e\x23\xad\xfc\x7d\x0a\x6f\x38\xe5\x13\x75\x26\x0d\xca\x19\x84\x2d\x44\xe4\xf6\xc2\x27\x06\x51\xcf\x7b\xba\xf6\x6e\x73\xcc\x22\x7c\x19\xfb\xc9\x3c\xa8\xd8\x06\x61\x2a\x05\x45\x32\x39\xdf\x33\x8c\xdc\xf9\x2c\x3b\x49\x92\x14\xc8\x54\x25\x6c\x50\xb5\x5f\xa1\x3b\x9e\xfb\x35\xe0\x0a\xd9\xca\xfa\xfc\xc4\x95\x7b\x6b\xf1\x3d\xb0\x9a\x0a\x94\xc2\xce\x04\x0d\xe0\x1b\xc4\xaf\x04\xf4\x62\x72\x71\xb7\x44\x4a\x25\x61\x8a\x70\x9e\xc2\x46\xb7\xf0\xe6\x06\x54\xf4\x44\x47\x30\xd0\x8b\x90\x59\x83\x4d\x8d\xb8\x3c\x9b\xad\x4b\x7a\xd5\x15\x12\x72\x1f\xcd\xa1\x4b\xda\x58\x11\xc3\xc0\x96\x6f\xd2\xc9\xe9\x3e\x68\x06\xb4\x98\x1a\xd8\xce\xcf\x2a\x4f\x1d\x7f\x50\xfe\x44\x81\x45\xd4\x2f\xa1\xe2\x19\x6d\xfc\x62\x1b\x4d\x06\x8d\xac\xb1\x9b\xf7\x81\xd0\x06\xf4\xc3\x28\x4b\x7e\xe9\x85\xf2\x4b\x09\x14\xbb\xca\xe2\x48\xc9\x5d\xf3\x44\x7c\x03\xcc\x3b\x01\x09\x7b\x7f\x17\x36\xe7\x37\xf2\xdd\xa5\xf7\x80\x46\xa4\xe8\x31\x92\xb1\x3d\xc0\x75\xff\x4b\x2d\xb8\x4d\x9e\x9c\xb6\xc2\xd6\x30\x87\xc2\xd9\x13\xa9\x15\x3c\xe3\x97\x36\x0f\x2c\x65\xd2\x71\x8c\x96\xbf\x6f\x9d\x96\xf9\xe5\xaf\xe7\x9d\xfe\x87\x62\x2d\xd8\xfb\xb7\x19\x77\xd4\x40\x77\x29\xc3\x68\x91\xdd\xca\xa2\x2d\xc6\x92\xc3\x82\x86\xe1\xc0\x1a\x1e\xad\xed\x1f\x46\x46\x08\x02\x24\x7f\xc0\x7e\xb6\x81\x14\x00\xff\xe9\xff\x40\x36\xc4\x07\xff\x2b\x92\xad\xfc\x15\x38\x7f\xd2\x57\xe0\x8f\x82\x51\x89\x03\xec\x84\xf0\x84\x08\x67\x03\x6c\x89\x1e\x57\xb6\xef\x09\xb9\xa5\x9d\xa6\x51\x0b\x4e\x35\xa8\x60\x53\x55\xbb\x60\xaa\xf3\x17\xd1\xe8\x3e\x1c\x43\x11\x7d\xee\x9f\x44\xa0\x43\x13\xbc\xa3\xcc\x8f\x80\x32\x3a\x35\xab\x27\xb1\x40\xa7\x79\xac\x56\xcf\x3c\xfe\x1f\xe3\xe3\xa2\xf7\x7f\x0e\xc2\x3a\x5a\x16\x1d\x35\xa7\x53\x76\x8d\x1c\xef\x43\xd6\x0e\x3b\xfa\xf6\x3c\xed\x63\xa7\xf4\xe1\xda\x69\x83\x4c\xcf\xab\xf7\x22\xab\xab\xfa\xf3\x03\x8e\x58\xba\x14\xd6\xab\xcc\xbb\x7d\x50\x69\xbd\x7e\x62\x90\x83\x26\x10\xaa\xb9\xb1\x7e\xbf\x4c\x3c\x6e\xa2\x1a\x68\xae\x43\xf1\x6c\xe7\x92\xe3\x0c\xe7\xfc\xcb\xe4\x10\xf4\x40\x5a\xd7\x58\xae\x80\x3e\xd6\x38\x0e\x5d\x50\xed\xd7\x3c\x48\xcb\x3a\xce\x67\xc4\xd6\x45\xea\x88\x53\x88\x88\x59\x84\xd3\x8c\x0d\x9e\xff\xb8\x60\x71\x47\x62\x57\x5f\x3c\xc3\x9b\x86\xb7\x46\x0f\x87\x3d\x6e\xc5\x72\x48\xa8\x09\x20\x84\x91\x79\xe9\x0c\xc9\xb5\x40\x62\x44\x77\xd0\x2c\xe6\x59\x6d\xd3\xe7\x80\x03\x2d\x30\x3d\xab\x43\xdf\xe5\xb3\x79\x81\xf9\x88\x98\x88\x55\x53\x6e\x7f\x08\x48\x84\x4b\xf9\xb3\xc4\xe3\x57\x77\x03\xb2\x03\x1b\x1b\xcf\xf9\x94\x58\x18\x9f\x64\x16\x0a\x02\xca\x16\x91\x4d\x67\x32\xd0\x97\x8b\x56\xc7\x1c\x49\x0a\x00\x67\x23\xbf\xc5\x36\x52\x04\x2a\x30\x37\x39\x06\x91\x0f\xd9\x54\x06\xcc\x11\x43\x87\x14\xb2\x70\x8c\xbc\xba\x77\x1e\x44\xf8\x3c\x81\xbc\xd1\x44\x0c\x27\x93\x24\x91\x27\xba\x15\xb5\x78\xf2\x21\x56\xa8\xa1\x1e\xa7\x32\xf8\xba\xfa\xbf\x2a\xaa\xbe\x95\x3f\x0f\x47\x3e\x56\xe1\x1e\xab\xb4\x6d\xc3\x1c\xdc\xc3\xa1\x61\x33\x43\xde\x96\x46\xd1\x7f\x38\x95\xe1\xd7\xd7\xec\xbf\xe9\x60\xd9\x8d\xad\x61\xf0\x0a\x48\x5a\x04\x26\x51\x4e\x0d\x74\x57\x68\xf8\x7b\x49\xbf\xfa\xb0\x9a\xb1\xc1\x44\x62\x39\x7c\x92\xb8\xb4\x79\x02\xb5\x4a\xfd\x72\x45\x38\xf5\x45\xf4\xbb\xf7\x1d\x9d\xa0\x8c\x60\xf1\xa3\xcc\x8c\xf8\xe9\x00\x09\xd6\x16\x6a\xd7\xd3\x8c\x2c\xfe\x48\x6a\x70\xda\x76\x95\x90\x7f\x0f\x0b\x11\x49\xb1\x53\x1d\xa6\x33\xe8\xfb\x91\x06\x22\xa2\x4c\xcf\x2e\xe4\xc3\x39\x0a\xa2\x9e\xc0\x6f\x63\x09\xbe\x02\x5f\x36\x6d\x47\xb4\x5b\x9d\x8f\x10\x8d\x7b\xe7\x24\x88\xb1\x91\x86\x12\x1c\xde\xae\xde\x4b\x48\xed\x10\xdc\x1d\x18\x85\x24\xcd\xf5\x6c\x36\x5f\x7b\x0b\x9c\x46\x2f\x8f\xe9\x1c\xd0\x65\x07\xbb\xa0\x84\x11\x57\xb6\xd5\xcc\x6b\xfc\x33\xac\x89\xcb\xa7\x59\x1d\x93\xfa\x50\xf6\xb2\x11\x3f\xa0\x79\x3f\x58\x05\xca\x72\xed\xd6\x1f\xaa\x61\x97\x46\x33\xe5\x02\xbe\x12\x3e\xcc\x4e\xa9\x22\xbd\x7e\xbf\x57\xf6\xfc\x27\x08\x08\x78\x9b\xe2\x80\xbb\x3c\x10\xc8\x01\xa3\xfe\x2e\xa4\xd9\x5b\xa5\x15\x41\x80\x1f\x2a\x0b\x51\xc2\xab\x17\x89\x21\x22\x39\x84\x0f\x84\x1f\x6a\xe7\x73\x81\xd8\x04\xa1\x3e\x48\x10\xa7\x8b\xb4\x0a\x7c\x81\x2e\x9a\x9d\x8a\x41\xbb\x6f\x24\xc3\x40\x0a\x0a\x9b\x7e\x25\x4a\xb2\x0d\xba\x84\xe8\x20\xe8\x0f\x61\xeb\x75\xe3\x56\x1f\xa1\x22\xa0\xb7\x17\x4b\x5b\x1c\xc7\x2a\x06\x7f\x38\x31\xab\xc7\x9b\xce\xf9\xeb\xdd\x1f\x8c\x77\x61\x0e\x1b\xd5\xd8\xb8\x1d\xc7\xf5\x98\x64\x06\xf6\x0b\xbd\x4e\xda\xbc\x7d\xeb\x91\x78\xfc\x99\xe6\x7c\xb3\x38\x5b\x5f\xf7\x3b\xfc\xfa\x68\x3a\xd3\xb0\xcf\xa4\x2c\x08\xea\x01\x61\xc1\x9f\x6c\xb5\x08\xbf\x32\xb7\x4b\xc7\x33\x3f\xff\x5e\xad\x9f\xd0\xef\xd8\x4c\x22\x9a\x42\x0b\xff\xb1\xd1\xb3\x21\x07\x25\xeb\x53\xbd\xad\x36\x22\xf7\x5f\xd0\xe7\x1b\x3c\x2a\xdd\x85\x47\x0b\xdd\x70\x2f\x39\x0e\x02\xd9\xf8\xc7\xf3\xf8\x1d\x72\x47\x04\x19\x2e\x91\xcf\xfd\xf9\x05\x7f\xdb\x5b\xd0\xde\xcc\x8a\x61\x5d\x46\x28\x8b\x19\x92\xf8\x2a\x5e\x97\xbd\x8a\x9f\xdf\xaf\x39\xd2\xb7\x6d\x0b\x7c\xce\xc1\x3e\x70\x37\x97\x87\x67\xb3\x10\x98\x48\x7a\xc7\xaf\x14\x6e\x3f\xb0\x2d\x4c\x91\xed\x43\xdd\x38\x99\x9b\xed\xcf\x7f\x7c\xc3\x7a\x49\x03\xdc\x27\xda\x5f\xd1\xe3\x52\x06\x0a\x6b\xef\x8f\x4e\xd4\xdb\xbe\x06\xa5\x7c\xbf\x43\xc3\x72\x57\x47\xf3\x65\xff\x05\x1c\xd9\x77\x5f\x77\xed\x42\x74\x1e\x95\x1e\x48\x07\xd5\x8f\xb6\x30\x55\x2a\x0b\xea\xa5\xf0\x16\xb7\x36\xe0\x72\x75\xc7\xe4\x7a\x13\x2b\x84\xd2\xc0\x0f\x2c\x3b\xee\x19\x79\x47\xfe\x3f\x62\x47\x77\xcf\x61\x5c\x1d\xc1\x59\x7e\xa2\xdf\xf3\x20\x42\xfd\x9d\x1d\xd6\xbb\x1b\x29\xfa\x4e\x7d\x64\xc5\x34\xd4\xa2\xca\x77\xab\xf1\x9a\xa8\x4a\x0f\xa9\xb9\xfd\x41\x6a\xc4\x19\xa1\x53\x1e\x1f\x37\x34\xd0\xc3\x6a\x54\xc5\xc7\x74\x0d\xf9\x90\x33\x75\xfa\x34\xb6\x44\xdc\x97\xc2\xca\xec\x28\x3b\xb6\x42\xe4\x41\x94\x96\x58\x0e\xf4\x23\xb0\x8f\x71\x17\x2d\xc3\xd3\xcb\x15\x23\xb9\x27\xea\xd7\x05\xf7\x5b\x41\xfa\x86\xd5\xb9\xa2\xcb\x59\x50\x82\xd3\xb0\x54\x29\x06\xa8\xa3\xb7\x85\x87\xf7\xa4\xb0\x32\xb0\xe1\x34\x33\x91\xdc\xfd\x74\xaf\xdc\xe4\xef\xe8\x5b\xed\x31\x08\x9d\xc0\xb9\x0a\x21\x89\x33\xda\x71\x91\x55\x68\x48\x95\x0b\xf4\xdc\xc8\x0e\x73\xc3\x46\xf8\x9e\xd2\xfb\x16\x74\xc8\x9c\x19\x8d\x88\xb5\xd8\x17\x1a\xa4\x70\x37\x42\x13\x32\x22\x71\x45\x4a\xe1\xa0\x70\x7e\x22\x5a\x06\xf4\x40\x07\x1e\x6a\xec\xed\xce\x3a\xec\x2d\x90\x86\x5a\x1a\xb0\xe7\x98\x4a\xf3\x56\xa8\xe4\x05\xbd\xe8\x83\xc0\x08\x09\x0f\xe2\xf2\x9f\xc1\x9c\x05\x93\xed\xd2\xd1\x9f\x33\x15\xee\xd6\x90\x97\xae\xbe\x10\x62\x07\x57\x0d\x1a\x25\xdc\xb6\x4a\x91\x49\xd3\x31\x5c\xf0\x4c\x61\xb7\x06\x8b\x7a\xce\x9b\x20\xfe\x3e\x18\x51\xf3\x70\x8c\x84\xd5\xdc\xff\xea\x4f\x1f\x0e\xbe\x84\xcc\xc4\xa1\x89\x9f\x76\xdf\x1a\x1e\xa7\x78\x12\x25\xd2\x15\x6c\x34\x9c\x61\x90\x06\xed\xb6\x72\x51\xec\x8f\x49\xb4\x02\x70\x28\xd8\x15\x3d\xca\x7c\xe9\xaa\x3b\xa0\x20\xe6\xac\x75\xac\xe5\x0e\xbf\xb4\x9b\x93\xf4\x41\xa1\x27\x60\x15\x09\xee\xe7\xbc\x44\xc6\x20\x24\x32\xfc\xdf\x4f\xda\xb5\x81\xa6\xce\x78\xf8\x7c\x37\x19\xea\x91\x01\x10\xea\x19\xc1\x19\x02\xef\x67\x2f\x2f\x11\x3a\x60\xb7\x49\xda\xc5\xdd\x74\x0e\x56\x4b\x93\xb7\x76\xa0\x2f\xc8\x27\xb9\x62\x4c\x9a\x85\x88\x00\x3c\xf8\xe3\x1e\xf4\x1d\x28\x81\xf9\x96\x30\xbd\x16\x48\xb5\x97\xb4\x88\x67\xe1\x97\x8a\xa7\x5e\x16\xef\xc5\xfb\xd0\x2f\xa4\x3d\xbf\xc9\x82\x74\x7d\x1d\x5e\x66\x67\x07\xce\xc3\xe1\x14\xe3\xb3\x10\x6e\xdc\x7f\x96\xe4\x36\xc1\xa8\x0a\x00\xd8\x31\x86\xbd\x9a\xa4\x1e\x50\x1a\x44\x4e\xcf\x3a\xdf\x0a\xea\x99\x04\x19\x30\xc6\x9b\x50\x07\x00\x0b\x9d\xda\x9b\x82\xf7\x40\xa5\xe0\x0d\xfd\x86\xb4\x78\x99\x9d\x8d\xb2\x15\xc3\xc8\x63\x7d\x42\x4c\x70\x36\x61\x41\x1f\x57\x26\xac\xb1\xcf\x57\x8b\xdd\x41\xdf\x88\x43\xd1\x13\x9d\x84\x41\xcb\xb3\xbb\x8a\x8b\x81\x73\x27\xa8\x54\x5b\x72\x84\x3d\x89\x9e\xd1\xe8\x15\x0d\x52\xa1\xfa\x6f\x6b\x3c\x8f\x24\xad\xcb\xd6\xfc\xe8\x20\xb1\xe1\xbf\x8a\x83\x1c\xd3\xec\xf4\xe1\x03\x86\x53\x20\x49\x6f\x53\x18\xa1\xf0\x4d\x54\xd9\x0d\x00\xf0\xad\x30\xfa\x1a\x70\x47\xff\xfd\x84\xae\xbe\xf6\x0a\xb1\xef\x1b\x36\x87\x9e\x8f\xdf\xe6\xde\x06\x1c\xc1\x36\x7a\x27\x31\x63\x22\xdd\x43\x70\xe8\x3a\x1f\x8c\x96\x58\xff\xf5\x10\xf5\xac\x4e\xa9\x28\xd6\xb9\xb9\x91\xe0\xb2\x74\x16\x85\xed\x43\x9d\x4c\xb3\x66\x27\xe7\xc3\xc2\x9b\xcf\xcb\x49\x09\xf5\x8a\x47\x5e\xd3\x5b\x72\x7f\xdb\x3a\x0f\x0a\x0d\x58\x53\x73\xa6\x5f\x93\xbc\x61\x16\x5b\x80\xc5\xb0\x20\xf1\x02\x2d\x73\x6e\x73\x96\xd3\xe5\x42\x91\xe8\x99\xbb\xab\x0b\x76\x85\xb2\x5c\x96\x5d\x11\x46\x80\x3e\x3c\x46\x48\xcd\xf4\xc5\xed\x08\x7c\x90\xc0\xd6\x14\xfc\x71\xcb\xdb\x1c\x34\x0b\x8f\x86\x16\x3c\xb2\x04\x4e\x32\x9e\x22\x5f\x34\x8f\x3f\x30\xf0\x5b\x1e\x91\x13\x30\x7c\xff\xbb\xc0\xc7\xe3\x01\x94\x03\xe8\xb4\xfa\x27\x7f\xfa\x2c\x7f\xe1\xa8\xf3\x57\x09\x1f\xc0\x32\x80\x3b\x0a\x44\x98\x33\x78\x88\x9a\x6f\x0c\xe7\x77\x5c\x53\x8d\x20\xe5\xaa\x0b\x3f\xd2\x43\x8e\xd6\x23\xd3\x87\x66\x6b\x7c\x67\x13\x73\xa7\xe0\x1a\x17\x4e\x03\xcf\x27\x18\xb3\xc1\xf4\x90\x6a\x6d\xaa\x91\x0c\x6a\xfb\x11\x62\x23\x4a\x04\x06\x1b\xef\xe2\x31\x52\xca\x6d\xa8\xe0\xd1\x71\xe4\x66\xdc\xd6\xb3\x44\xd5\xfc\x44\x9f\xfe\x49\x7a\x4c\x78\x0c\x34\x42\x07\x8c\x33\x9a\xa5\xdc\x6c\x55\xf1\xdc\xa0\x91\x5b\xc6\xf5\xc4\x49\x98\x97\x04\x79\x2d\xc9\x1c\xf5\xb8\x9b\x92\x62\x9c\xe4\x3e\x70\x87\xa0\x42\x0e\x05\xe9\x6c\x16\x02\xdb\x26\xd0\xc7\xb6\xdb\xbc\x65\x0d\x75\xd8\x44\xf1\xd1\x94\xc6\x86\xc1\x8c\xf1\x0e\xc7\xea\xad\xe3\x8b\x43\x30\x16\x9d\x97\x51\xd1\x98\x50\x4e\x12\x62\x97\x4a\x0c\x22\x59\xa9\xf0\x42\x02\x38\x22\x37\x02\x9d\x71\x23\x29\x4d\x0c\x2c\xbd\x62\x24\x02\x88\x14\xe8\x23\x5c\x27\x08\x77\xd4\x16\xc0\xe4\x66\x8b\x1c\xc2\x35\x4a\x8c\x8f\x96\x5d\xfe\xb4\x3d\x3e\x1d\xdf\xea\x3f\xe5\xc3\xb3\xca\x12\x1c\xbe\x88\x72\x16\x80\x09\x51\x34\xad\x9e\x72\x84\x79\xb6\xc0\x0a\x1b\x31\xcd\xea\x69\x57\x3e\xd9\x1f\x79\x8b\x52\xeb\x39\x13\xd0\xb6\x6d\x03\xe5\x17\x11\xde\xb4\x08\xd6\xb0\x4f\xab\xcc\xba\x67\x3a\x27\x17\x1b\x3d\x13\x82\x0a\xe5\x21\xf8\x4c\x23\x03\x4c\x79\xf9\xe7\xff\x56\x96\x61\xf6\x2f\x7c\xc2\x40\xfd\xe4\xd4\x0f\x59\x45\x35\x35\x0d\x1c\xc6\x15\x12\x31\xd4\x5d\x9b\x54\xa0\x16\xb3\xb4\x42\x36\x9e\x45\x79\x1c\xce\x14\xde\x71\x68\x58\x1d\xe2\x60\x94\xda\x45\x26\xf0\xa0\x7d\xc9\x10\xfa\x3c\xbb\xa4\x83\xe4\x31\xc5\x52\x3c\xcc\x17\xb1\x8e\x19\x69\xb4\x64\x73\xc0\xa6\x86\xb7\x49\xcf\x31\x5b\xed\x2b\x0f\x39\x94\x48\x3e\xb8\xd4\xd0\x47\x36\x6a\x9e\x48\xfa\x08\x83\x8d\x21\xcb\xe1\x78\xc8\xca\xd9\x82\xb5\x9c\x40\x15\x9f\xe6\x42\x82\xeb\xd1\xd7\xdc\xf5\xc1\x90\x9c\xe7\xd5\x90\x18\x95\x00\x96\x93\x64\x5e\x7d\x5d\xc3\x49\xfc\xac\xdf\x16\x9c\x3a\x78\x37\x1b\xb4\xb4\x66\x3c\x8e\x19\x95\x0b\xd3\x2f\x12\x00\xf9\x4f\xc4\x4b\xa2\x7b\x49\xaa\x87\x0f\xca\x1a\x13\xb9\x2d\x06\x81\xc8\xec\xa2\x5f\x00\xe6\x5f\x67\xf6\x98\xfa\xe2\x79\xd4\x64\x85\x74\x81\x79\xb8\xdf\x8d\xca\x9f\x1e\x93\x81\x84\x3f\xbd\x15\xf6\x76\x62\x8e\x14\x74\x4c\xe5\x6f\x17\xf3\x13\x7b\xe0\x30\x32\x00\xe5\x43\x9c\x15\xef\x23\x89\xe8\x91\x42\xd3\x71\xe9\x93\xda\x2a\xf6\xe6\xb1\x0b\x87\x84\xd4\xa5\xbf\x44\x11\xc8\xda\x83\x00\xe5\xc3\x99\x0a\x0e\xd1\x9b\x20\xa0\x22\xdf\xe3\x6c\xa2\xe7\xae\xee\x71\x54\x76\x49\x57\x83\x2d\xe1\x31\x53\xe1\x6b\x17\x1e\xe9\xb2\xa6\x9b\xe5\x92\x8e\x5e\x77\xcf\x91\xbe\x02\x7f\xe9\xe6\x7b\x2e\xf3\x70\xdb\xbf\x92\xdd\xd5\x95\x4f\xab\x03\xbb\x72\xd2\xf6\xa1\x2b\x41\xde\x98\x0a\x43\x7f\x9c\xb2\xc1\xdb\x60\x46\x42\xdf\xb7\x02\x6c\x47\xaf\xac\xb5\xcb\xf5\x1d\xa2\x48\x75\xb3\x14\xe9\x1d\x2d\x9b\xba\x68\x58\x38\x83\x51\x4e\x4b\x18\x87\xd3\x81\x48\x1c\xa4\x5d\x76\x9c\xd0\xe0\x6e\xa7\xf8\x0b\x1b\x86\x19\x7b\x68\xa2\x6c\xe0\xc8\x26\x86\xe9\x0b\xe2\x06\x9d\xe9\x3e\x52\x6c\x04\x0a\x65\x33\x97\xac\xea\xa4\xd3\x45\xcb\x43\x47\x3e\x63\x95\x60\xc6\x66\x91\x10\xda\x80\x72\x21\x92\x8d\xed\xf6\x57\x40\x24\x7c\x87\xf6\x11\xe5\xe4\x8b\xcb\xc6\x31\x8f\x54\xc9\xa1\x04\x17\x36\x3a\x3c\x49\xf8\xbb\x5d\x2e\xf1\xce\x52\x30\x60\xd3\x26\xf0\x5c\x7e\x09\xb4\x4b\xb8\x9b\x3d\x82\xd0\x63\x3a\xb1\xcf\x31\x12\xfc\x33\xff\x84\x65\x0c\xcd\xf2\x0d\x2c\x8c\xd8\x39\x69\x20\x52\x16\xc6\x23\x17\x45\x24\xce\xab\xfe\xb2\x8c\xfb\xa6\x53\x4b\xd6\x97\xee\x35\x5f\xa4\x1e\xda\xa7\x74\x4e\x48\x99\x88\xd0\xe0\xcb\x98\xe8\x66\x07\xb8\x46\xc0\x4c\xc8\xc3\x3e\x89\x0e\xdd\x36\xd7\x28\x48\x6b\xfe\x4f\xc0\x4b\x33\x58\x87\x09\xb9\x23\x24\xd3\x7c\x5f\xac\xcb\xdf\x50\xbf\xbf\x1b\x9e\x92\x3f\x22\x29\xbf\x43\x1b\x82\x8d\x8a\xc3\x3c\x24\x18\xc4\xb9\xfe\x76\x87\x8f\x9f\x53\x7c\x5a\x4f\xd2\xc8\x6d\x24\x7d\x82\xfb\xb9\x3b\x49\x04\x96\x0d\x2e\xed\x98\xed\x4b\xdf\x89\xc5\x90\x54\xf5\xca\xa7\x7c\x19\xf6\xfc\x0d\xce\x48\x8e\x44\x8c\x17\xca\xdb\xf3\x21\xcf\x3e\x5f\x13\xdd\xa5\x21\xfc\xda\x0b\x51\x03\xff\xc3\x73\x61\x32\x87\x83\xa4\x24\x75\x3a\xa5\x18\xd9\x83\xbb\x51\xd1\x68\x70\x27\x05\xb0\xfc\x68\xd6\x87\x95\x4e\x4c\x0d\x5b\x1f\xe4\xa0\x7f\x97\x8f\x00\x13\x3d\xb3\x30\x07\xa7\xb4\xb1\x3f\x0a\x00\x0a\xf1\x91\xdd\x56\x5c\xbf\xa2\x6e\x42\x41\xb7\xbd\x21\xdf\x79\x61\xb7\xf2\x43\x75\x26\x38\xf3\x73\x20\xaf\x91\x7b\x4a\xcb\xe2\x08\xf9\x1d\x67\xf9\x1d\x62\x52\x0f\xee\xba\x82\x22\x92\xee\xe6\xd5\x87\xac\x84\x16\xaa\x4b\x74\xe0\x9e\x7f\x7e\x80\x77\x6e\x26\x0a\x07\x65\x62\x82\x3e\x28\x00\xa1\x07\xa6\x9d\xec\x52\x60\xac\x3f\x37\x83\x59\x9f\xf7\x9a\x18\xb3\x49\x71\xc7\x97\xa3\x3b\x54\x1e\x27\x71\x24\x20\x21\x4d\xd6\x21\xa3\xa6\xcb\x79\x1b\xf2\x53\x78\x7b\x69\x84\x70\x04\x17\xc4\xf9\xfb\x0d\x4f\xee\x2b\x8f\x61\xfe\x03\xda\xc8\x4c\xb0\x63\xf6\xd4\x3f\xb7\x5e\x00\x14\x72\xde\xdf\xa5\x1c\xcf\xf8\xb3\x6b\xa2\x8f\x60\x91\x04\xf7\xdc\x83\xa6\xfa\xc0\x50\x9c\x69\x34\xc7\x58\x3e\xb1\x8e\x9f\xfc\x02\xb5\xde\x7a\xad\xdc\xc7\x2b\xa4\xf3\x88\xf0\xb0\xfe\x67\x5c\x76\xa5\x7a\xff\x8c\xe6\xe3\x01\x88\x8d\x7a\x50\x3f\xe2\xcb\x8d\x82\x32\xce\x4f\x80\x58\xe7\xa7\x13\xd9\x64\x0a\xbd\x47\x75\xc1\x98\xad\xc0\x11\x80\x85\x5d\x33\x9f\xcd\xb5\xcd\xa1\x94\xc0\xfe\xc1\x3d\x16\xf6\xe1\x7a\x08\x7f\xdc\xac\x36\xae\x0b\x4e\xa8\x3c\xd9\x84\xb9\x88\x2d\x03\xe2\x74\xc4\x00\xcf\x5d\x27\x44\xe5\x23\x07\x74\x6c\xf1\xfc\xe0\x93\x0a\xd0\x71\xe2\x27\x61\x3e\x7f\xed\x74\xf5\x3f\xd3\x71\xe8\x19\xe2\x45\x40\x09\x01\xc9\x0e\x45\x23\x75\x65\x2b\xea\xf0\x40\x61\x79\x08\xc6\xbf\x3b\xca\x87\x0d\x9c\x63\x85\x0a\x49\x00\xc8\x37\x06\xf7\x15\xd4\x12\x7d\xaf\x87\x07\x9f\xbe\x35\x52\x34\xca\x81\x74\xab\x9d\xd6\x0c\xe4\x00\x20\x3a\x8e\x20\x05\x61\xd9\x83\x6c\xa8\x03\xdc\x7d\x62\x17\x6f\x38\x86\xf4\xb4\x12\xbc\x99\x5e\x79\x44\x5f\xf0\x08\x56\x3b\xaa\x54\x45\x56\x01\x09\x19\x32\x1f\x4f\x40\xc7\xce\x9a\x27\xdb\x57\x3a\xd9\x4b\xe4\x67\x94\x0b\x76\xd9\xb4\x71\x68\x8a\x15\xe7\x8a\x15\xed\x19\xe1\x37\xcf\x23\x39\x4a\x85\x45\xe7\x2f\x96\x19\x16\x0f\x59\x83\xa8\x00\xcb\x60\x5f\xd1\x03\xe8\x89\xed\x74\x3d\xd6\x6b\xcf\x21\x00\xdf\xf3\xd6\xc9\x48\x68\xcf\xba\x54\x76\xce\xc3\x0e\xb3\x20\x03\x59\x64\x8e\x1f\x47\xa3\x12\x4b\xa9\x22\x47\x54\x72\x05\xb6\xca\x2d\x03\x8e\x7e\xf8\x93\x2d\x61\x65\x3b\x77\xb3\xad\x8b\x4c\xee\x4f\xd5\xcd\x5b\x09\x34\x06\x18\x3e\x29\x23\x21\x82\xc9\xf7\x97\xa4\xa0\x8d\x73\xde\x16\xa6\x7c\x5b\x26\xc0\xb7\xf5\x98\xba\x88\xad\x20\x8d\x3d\xc7\x48\xc9\xc6\x87\xad\x3b\x62\x8f\x6d\xfd\x12\x70\xd6\xd6\xcf\xb1\x8e\x80\x2e\x22\x6c\x06\xfb\x60\x3e\xb0\xaf\x7a\x49\xec\x20\x6f\xc1\x24\xff\x71\xf7\xe4\x36\x85\x4a\x29\x0b\x9f\xaa\x0d\x54\x61\xd9\x29\x02\x28\xe7\x6d\xbb\x98\x70\x8e\x9f\xd0\xdd\xe1\x8f\x16\x8e\x49\x55\xcc\x96\x26\x49\x7c\xd2\x70\x36\x64\x85\x64\x93\xb0\xbb\xc2\xc8\x21\x88\x8f\xae\xe6\xd5\xa7\x09\x51\x3e\xea\x21\x03\x1c\x9c\x2a\x2c\xd4\x57\x04\xab\x8a\x40\xba\x16\xd5\xf1\xa0\x94\xa8\x66\x59\x21\x54\x23\xf4\xf1\xca\x6c\xb9\xae\x4e\x7a\xd7\x3a\xb1\x46\x63\x77\xf5\xf4\x5a\x55\xa4\x6b\x7a\x87\x85\xc3\x5b\x86\xf9\x38\xf5\xe9\xf9\x40\x66\xd5\x9a\x84\xf1\x2d\x75\x3d\x88\x90\x34\x5e\x99\x0d\x19\xae\x5c\xbb\x72\x6b\x40\x41\xdc\x62\x1f\x58\xa0\x89\x7f\x72\x3b\x2c\xa1\xb2\x5c\x30\x71\xdf\xbc\x95\x4c\x75\x7b\x41\x2b\x20\xf4\x9a\x7b\xe9\xb4\xca\x2e\x6b\xb9\xda\x97\xa2\x3f\x7c\x04\xf5\x23\x11\x94\x53\xb0\xca\xec\x22\xd2\x36\x64\x22\x32\xf8\x18\x89\x5e\x12\x9e\x88\x4c\x22\xc9\x15\x9c\x91\xdc\x52\xd1\x04\xe9\x2d\x42\xd4\x17\x24\xbc\x11\xd0\x49\x41\x19\x58\x68\x60\xfd\x67\x9b\x81\xe2\xfb\xc4\x3f\x77\xe1\xf9\x10\x3b\x41\x76\x9e\xbb\x2d\x12\xdc\x06\x6e\xe2\xc7\x93\x7d\xfb\xf9\x29\x90\xa0\x48\x24\x37\x45\x1e\xf7\x84\x84\x0a\x62\x1e\x87\xe8\x18\x65\x09\xe2\xc0\xc4\xc0\x96\xa9\xf4\x55\xae\x8b\x58\x57\xfc\x9e\x99\xea\x52\xf8\xeb\x3b\x47\x64\x56\xf6\xec\xa4\xe0\x3e\x9b\x09\x1d\x82\xc4\xfa\xe5\x07\x51\x4e\x7a\xf9\x4d\x04\xe9\x5a\x5a\x19\x7f\xad\xbc\x21\xf2\x2c\x11\x11\x59\x45\x39\x04\x94\x12\x28\x09\x69\xa7\x53\x23\xf2\xda\x0a\x1d\x2e\x37\x36\xd1\xa0\xa2\x66\x94\xa3\xfd\x41\xcc\x60\x0a\xf0\x11\x83\xf4\xc3\x4c\x66\x21\x25\x37\xd1\x1a\xdb\x83\xea\x3e\x8f\x4d\x9b\x29\x4d\x76\xaa\x83\x98\x24\x08\x90\x72\xbc\x02\x6b\x5c\x2f\x32\x39\xf4\x35\xbb\x1f\x67\x39\x74\x3b\x54\x12\x71\x6c\xae\x83\xa4\x9b\x63\x15\x9a\x84\xeb\xc7\x6a\x10\x6e\x56\x88\xa1\x34\xef\xdd\xb1\x9d\x5f\x23\x75\xe6\x1c\xa9\x3f\x8b\x91\x2a\x95\x91\x44\xfe\xd1\xc5\x98\xfe\x46\x5d\xd1\x22\x8a\x89\x42\x83\x46\x78\x1d\xf9\xc3\x84\x19\x8c\xe9\xa5\xa3\xcd\xad\xc2\x5b\xee\x40\x75\x30\xe7\xf8\x86\x1f\xb6\xfe\x95\x9f\xf9\xa9\x28\x2c\x87\x58\x78\x43\x56\x26\xf9\x13\x32\x1f\xd9\xe7\xaf\x0a\xee\x79\x3a\x04\x1d\x1b\xb1\xa7\x00\x25\x17\xd3\xf8\x94\xfe\x54\xfe\x01\x8e\x61\xdc\x3f\x23\x1d\x3a\x18\x26\xb2\xff\x47\x33\xac\x38\xb7\xa5\xd9\x95\x3c\x73\x8b\xd0\x6e\xee\x02\x4f\x2f\x72\x1e\x61\x10\x39\x3b\x82\x22\xc5\x2a\xa6\x9d\x95\x34\xff\x2c\x52\xb9\xfb\x60\xc4\x97\xe4\xad\x7a\xed\x73\xb2\xd5\x00\xab\xf8\x21\x3b\xe1\x14\x85\xb8\x85\x2f\x34\x01\x10\xbf\x2b\x87\xec\x13\x62\x97\x41\x31\xa3\x2e\x78\x79\x08\x15\xe1\x9d\x3b\x93\xdd\x80\x8e\x3b\x98\x62\xef\x82\xd9\xae\xfe\x07\xb2\x30\x74\x5e\x0d\x39\xeb\x46\xe1\x42\x43\x72\xdb\xec\x21\x55\xf4\xcc\x09\x84\x0c\x34\x2c\x19\x92\x9c\xe4\x06\x57\xb3\xea\xfd\x5b\x11\xd9\xd1\xe9\xe2\x0c\x90\xbb\xaf\x6b\x40\x23\x55\x19\x9b\x80\x4b\x42\x3c\x53\xae\x8b\x26\x8f\x67\xf8\xca\x23\xd3\x88\x62\x9b\x33\x49\x1b\xf3\x09\xcc\x64\x97\x7f\x46\x59\x0f\xb1\x73\x01\xef\x50\x1e\x33\xfb\xe7\xec\x7d\x1f\x1e\xe9\xd9\xf9\x07\x86\x20\x86\x97\x8f\xb0\x69\x48\x3a\x99\x59\xec\x1a\xcf\xcb\x0e\xaa\x4a\x3e\x68\xfa\xde\x5b\xe5\x2d\xbf\x0b\xaf\x88\x4e\x72\x4d\x02\x06\xed\x93\x6d\xef\xbd\x80\xb4\x55\xe5\x67\x87\xb1\xca\xdf\x02\x89\xdb\x42\x6d\x12\x26\x78\x09\x64\xee\x48\x9a\x5b\xd7\x66\x40\x39\x06\x00\x63\x97\x88\x2f\x94\x48\x07\xd8\xb9\x6f\x80\x50\x26\x78\x26\x67\xb0\x4c\x58\x90\x75\x75\xf8\xb6\xf2\xbd\x62\x26\x93\xc9\x7f\xa8\x38\xce\x10\x61\x01\x4b\x19\x9b\x2c\x0f\x39\x73\xdf\x96\x2f\xc7\xff\x02\xae\xf3\xac\x9b\xe6\x4d\x82\x9c\x53\x3e\x7f\x6e\x4b\xd9\xd8\x2c\x41\xc4\x74\x1f\x8d\xdf\x59\xec\x84\xbd\x30\xac\x8c\x08\xf7\xae\x7c\x86\xcb\x0a\x46\x1f\x12\x3d\xeb\x90\x97\x4e\x41\x8c\xf0\x09\xbb\x7a\x9b\x94\xe6\x1c\xf4\xde\x6d\xdb\xf7\x4c\x64\x81\x76\x21\x4a\x77\xab\xca\x48\x14\x08\xca\xac\x2d\x8e\x65\xb8\xfc\x44\xe9\xfe\xc2\x5d\x72\x86\xe9\xb0\x0f\x7a\xb5\x08\x7d\x44\xe9\x51\xfe\x39\x4b\x9e\x12\xe9\x3b\xb3\x97\xb8\xcd\xfe\x0d\x00\x66\x8d\xd0\xf9\x2e\xcf\xa7\x32\xeb\xf0\x22\xfe\x72\xb9\xa3\x54\xc1\x29\x32\x22\xcb\xd8\x45\xe4\xaf\x61\xd3\x57\x43\x62\xb2\xe2\xc6\xcf\x3e\x8b\x1a\x43\x03\x58\x17\xe3\x28\xdc\x2e\xd2\xee\xe8\x0b\x6a\x05\x12\x71\x8f\x8b\x8b\x7a\xba\x84\x18\xa6\xf3\xcb\x48\x1a\xe0\x04\x44\x90\x12\xf5\x7d\x76\x82\xd1\x91\x83\xab\x5f\x3b\xcb\x6c\x66\x1b\x32\xb1\x18\x7d\xc3\xc9\x63\x33\x42\xfd\x85\x5c\x14\x17\xcd\x27\x82\x8a\x56\x11\x2a\x8a\xfc\x9d\x67\x16\x40\xdf\x2c\x43\x3c\x8f\x24\xf0\x23\x5e\x81\x7e\x95\x5f\x60\x33\xcc\xf1\xf9\x00\xd6\x41\x65\xf9\x89\x6c\xec\xf7\x47\x2c\x96\xb2\xca\x65\xf3\x6d\x3b\x75\x3b\x0b\xe9\x9b\xff\x76\x85\x94\xc3\x22\x91\x09\x46\xc2\xca\x3e\x22\x77\xcb\x87\xdb\x95\xe4\x74\xb9\x86\x4d\x96\xa7\xe8\x69\x3f\x00\x9a\x4b\x68\x74\x86\xd8\x17\xc1\x0b\xb3\xb5\xe1\xde\x73\x38\x7f\x4c\x45\x19\x8f\xb8\x52\xe9\x27\xf8\x56\xb3\xdf\x3e\xab\xf4\xb1\xef\x9f\x1c\xd6\x87\x7e\x24\x65\xe3\x0d\xe1\xd3\x4e\xd3\x8e\x53\x1e\x45\xef\x90\x2c\x02\x9c\x69\xb1\x7b\xbd\x80\x9b\xf8\x40\x29\x82\xd2\xdf\x54\xc6\x3e\x90\xc8\x37\x67\x5f\xc3\x5e\x50\x6b\xfb\x2d\x85\xce\xa6\x2f\xf0\xd1\x19\xb7\x50\x40\x74\x99\xf4\x36\x5e\xf3\xc9\x1d\x95\x95\x8c\xdc\x4b\xc0\x49\xd1\xef\xc9\x36\xff\xfd\x8f\xf1\x56\x2f\x9c\x3b\x95\x18\xcf\xe9\x51\x96\x04\x7e\x4e\xae\x3e\x2f\x30\xa2\x1a\xa1\x06\xea\x8e\xfc\x08\xce\xcd\xc6\x04\x2a\xc8\x20\x7c\x8f\x4e\x9a\x0d\x8b\x06\x20\x3f\xfe\xa9\xea\xa4\x65\xf1\xb6\x33\x88\x90\x8d\x7e\xda\xfb\xdd\x2c\x8c\x6d\x98\xb9\xd6\xdf\x55\xcd\x8e\xbb\x9e\x61\xb9\x76\x53\x9a\x78\xc3\x38\xd1\xd9\x06\xf7\x29\xa4\x0a\x7a\x22\xf7\x88\xe7\x98\x95\x0f\xe0\x24\xc5\x3b\xd8\xa8\xa7\xc4\x28\x51\xab\x72\x97\x43\xea\x20\xdb\xf7\xfc\x51\x60\x84\x42\x9e\xeb\xc2\x2d\x4e\xcf\x54\xb6\x4a\xaa\xcd\x94\x28\xf3\xbc\x7f\x89\x00\xb7\xb7\xd4\x05\x26\x65\x89\xf3\x6e\xab\xd6\xf9\x2e\x5a\x5c\xe4\xcd\x7e\xca\xf5\xed\xbf\xf9\x08\xef\xf4\xeb\xa3\xfe\x97\x95\x42\x89\x16\x9c\x35\x92\xf1\xea\x78\x56\xde\x32\x86\x93\xe1\x55\x95\x80\x7e\x7f\xe4\x67\x79\x0b\x7c\xb3\x19\xf2\x58\x44\xe1\x51\x66\xc4\x29\x05\x94\xe3\x54\x1c\x14\x24\xe1\xf0\xe1\x56\x49\xfe\x63\x21\xfa\x27\x93\x2a\xcc\xc4\x9b\x6c\x54\xf2\x3f\x9a\x27\x14\x02\x92\x36\xfd\xcc\x51\x26\x86\x4c\xdc\x21\x1b\x3a\xea\xa9\xfc\xc0\x43\xc8\xd3\x51\x22\xa4\xc8\x26\x22\x1a\xb6\x1c\x69\x0e\xc1\xfa\x25\x03\x98\x6b\x9b\x09\x63\xd9\x0f\x4c\xe7\x9f\xcb\x4a\x33\xa6\x47\xac\xa9\x05\x58\xd8\xa6\xe6\x0e\x53\x53\x5b\x35\x75\xf3\x90\x99\x27\xe3\x7f\x74\x2a\x87\x3c\xa3\x62\x8a\xe8\x2e\xfc\x85\x86\x94\x7f\x2c\x20\x5f\xf4\x34\x39\x68\x73\x73\xe5\x48\xbd\xe8\x4b\xc4\x1f\xce\x0a\x49\x43\x6b\x9a\x1d\x64\x4a\xa1\x7e\x4a\xa8\xca\x63\x0a\xc1\xf4\x15\x51\xba\x17\xfa\x67\x7c\xe1\x74\xb7\x88\xc4\x7d\x28\x1c\x58\x3d\xc0\x99\xf8\x54\x3c\x45\x7d\xe6\xc0\x94\xfe\x4d\x35\xb4\x8b\xda\xbf\x42\x0c\xd4\x12\x3f\x9b\x2a\xe0\x44\x82\x02\x0b\x52\x0c\xb3\x5c\x22\x6c\xbc\xc8\x19\xc5\xdf\x80\x34\xdf\xe0\xfc\xc8\x68\x14\xf9\xef\x1c\x78\xd2\xab\x4d\x13\x11\x94\x48\x32\x10\xa2\x45\x02\x64\x0a\xcb\x90\xd3\x85\x5d\x3e\xe8\x6d\xa7\x83\xcf\xf8\x3f\x2f\x29\x1c\xba\x69\x5b\x0b\xf8\x86\x9e\x2c\x22\x0e\x65\x7f\x79\x20\x3c\x81\xa5\x33\xbb\x31\xf7\x83\x04\x1f\x4a\xa2\x50\x1b\x38\x5c\x84\x7a\x8d\x32\xa3\x08\xf9\x39\xbc\x4d\xef\xaf\x35\x03\x63\x72\x6a\x8c\xed\xcb\xdd\xd6\x24\x33\x56\x05\x47\xf8\x2a\x3f\xc4\xca\x59\x84\x4c\x2d\x61\x23\x3a\x2a\x6b\x12\xe0\x14\x71\x22\xd8\xa4\x50\xbc\x54\x57\xee\xcf\x0e\xcc\x7b\xa9\xa5\x2e\x1c\x29\xf2\xe9\xed\x8a\x43\x1f\x43\xf4\x9c\x48\x7c\x29\xaf\x99\xab\x49\x18\x87\x0e\xf1\xc7\x2e\x86\x63\xc1\x14\xff\x70\xbe\x8e\xec\x54\x4e\x31\xb2\x0b\xc4\x90\x38\xee\xe5\xc9\x6d\x76\x59\x5f\x3c\x53\x4a\xb4\xf7\x8b\x55\xd0\x4f\xdf\x98\x17\x65\xa7\xee\x15\x7b\x25\x16\x84\x7b\x79\x91\xf1\xf3\x7c\x36\xbe\x82\x0c\x49\xac\x42\x13\xd1\xa7\x61\x51\x79\x23\x41\x6f\xc7\xf4\x4f\xf4\x0a\xfd\x19\x3f\x12\x45\xaa\x57\x5b\xe4\xa0\x7f\x6a\xb0\xc0\x66\xdf\x8e\xfa\xed\x1b\x9a\xcd\xaa\x6d\x30\x26\x88\x63\xdb\xe1\x2c\xf3\x6a\xc6\x2d\xd2\x6e\x90\xe3\x4e\xda\x9e\x42\x0b\x89\x4d\x1c\xe6\x4d\x45\xc8\x36\xef\xa4\xd5\xd8\x29\x24\xf6\xee\x36\x07\x36\xee\x6a\xa7\xc8\xd5\xcf\x6f\xd1\xba\xb7\x1c\x1c\x43\xfb\x4d\x84\x07\xd9\x4e\xc8\x31\x9f\x3c\x46\xde\xe2\x10\xe0\xd5\x15\xcb\xf4\xd6\xdb\xe3\x45\xe2\x80\xfe\xc9\x0b\x69\x64\x2f\x56\x67\xb3\xf9\x1f\x63\x15\x36\x8e\x61\xdf\x92\x39\x9c\xc6\x12\x8f\x69\x66\x08\x9b\x6d\xe6\xef\x8f\xa0\xb3\xfe\x94\xb0\xaa\x4f\xef\xf8\x7f\xa0\x2a\x63\x90\x3e\x74\x8b\x45\x76\x87\x7c\x4d\xef\x40\xc7\x4e\x32\x78\x08\x8a\x71\xd0\x50\xaf\x73\x91\x0e\xea\x47\xb2\x4a\xfb\x93\xff\x30\x2d\x55\x50\xd8\x10\x30\x60\x02\x57\x9d\xe2\xa6\xaa\x26\xe2\x6a\x3b\x23\xde\xf0\xe4\x87\x59\xab\x2a\x10\x20\x5c\xbc\xa5\xdc\x13\x6d\x2c\xd7\x42\xd1\xf1\x5a\xa4\xa6\x4a\x03\xda\x49\x0f\xa7\x0e\x09\x6d\x5e\xe1\x09\x11\xb2\x29\x6f\x49\xfa\x28\x2d\x85\x6c\xa1\xb7\xc8\x88\xc0\xc8\xe8\x19\xe3\x26\xa9\x04\xcb\x3c\x13\x74\xcd\xba\x96\xd7\xf4\x9e\xf8\x23\xac\x0a\x10\xb0\xa3\xc8\x45\x69\x8f\xb0\xc7\x5d\x46\xa9\xb2\x88\x49\x4c\x2b\x5d\xce\xd2\xf9\x61\x0e\x01\x55\x98\x7c\x2d\x67\xfe\xeb\x29\xae\x0a\x72\xf2\x52\xe4\x72\x5a\x82\xf6\x03\xa7\x0f\xff\xcf\x4b\xc9\xa1\xb5\xea\xaf\x39\x08\x46\xfa\x42\x17\x98\xf0\xfa\xe3\xd7\x72\x3c\x03\x18\x73\x18\x2b\x22\xeb\x3c\xc0\xd4\x9f\x9f\xcf\xce\x9f\x9e\xb7\x63\x09\xcc\x2b\x7c\xe4\x96\xc4\x50\x9a\x25\x55\x02\x5d\x2d\x43\x32\xd1\x2a\xc6\xf7\xd0\x9a\xd7\xff\x94\x3a\xf4\x97\x3e\x7d\xf9\xcf\x07\x9a\x71\xff\x12\x7b\x6c\xf3\x2b\x5a\x34\xd3\xe7\xf0\x50\x58\x52\x85\xa8\x1f\x45\x5f\x48\xfe\xa4\x55\x50\x56\xed\x9a\x44\xea\x6a\x5a\x29\x49\xa5\xd6\xef\x5b\xe6\x99\x36\xde\x82\x24\xf4\x6b\x38\xc1\x19\x86\xce\xa0\x93\xd8\xa3\x53\xe1\x53\x67\x4f\x64\x15\x04\x16\x41\x92\xa8\x83\x7e\x42\xab\x71\x8a\x66\xc9\x94\xc3\xe8\x15\x09\x1e\x04\xdd\x6c\x96\x3c\x3f\x34\x69\x5d\xd7\x1a\xc8\x97\x4c\x64\x22\x06\x1f\xdc\xa2\xb0\x60\xfd\x5c\xeb\x4c\xbf\xd5\x4f\x43\xba\x2e\xa6\xdc\xc2\x03\x29\x76\xf9\xb6\xe1\xf3\xd9\x7c\xb2\x12\x86\xe8\x17\x4b\x47\xa6\x91\x38\x32\xe4\x7b\x51\x99\xa1\x56\xd9\x22\x5b\xe1\x31\x9c\xc5\x9d\x53\x6b\xb8\xf4\x8c\xbe\x66\xf1\x39\x67\xfa\x0c\xf2\x97\x49\x5b\xb8\xba\x9c\xd4\x2c\x8e\xa5\x1e\xde\xec\x80\x5f\x6e\xd8\xbb\x14\x2c\xc6\x5e\x7b\x62\xf8\x0f\x28\x46\xa3\xd5\x22\x6c\x4b\xc9\x4d\xe3\x4f\xef\xe9\x46\xad\x34\x8b\x99\x51\x67\x05\x67\x28\xea\x20\xdb\xfe\x5f\x11\x5c\xf9\x1d\x84\x6a\xcd\x90\x48\x38\x41\x49\x92\xc5\x67\x55\x80\x1a\x5d\x5d\xea\xc2\x64\xa0\x67\x1d\x85\x67\x55\xd9\xc0\x3e\xdb\xea\x84\x5c\x13\xd5\xaf\x4f\xd8\x7d\xf9\x72\xfa\x14\x0c\xf2\x0c\x7f\x1d\x24\x6d\x79\xf2\xa5\xbd\x47\x02\x69\xfc\xd5\x9e\x84\x9d\x84\x8b\xa5\x33\xe2\x27\xed\xed\x93\xaa\x94\xb4\x13\x78\x26\x36\xfc\x32\x75\xe3\x19\x3a\xf8\x55\x43\x9a\xc0\x3a\x85\x1f\xcf\xf6\xce\xc3\x27\x06\x8e\x7d\x2d\x01\x6c\x8d\xde\xe9\x63\xc8\x0d\x99\x39\x1f\xd9\x46\x0d\x55\xf4\x1b\x12\x3d\x87\x3a\xf1\x2f\x99\xa6\x0e\x9e\xce\x79\x71\x24\x16\xd1\x89\x94\x2e\xde\xc9\x88\xc9\x52\xf4\x1b\x0f\x92\x54\x80\xfb\xa1\x81\x5f\xae\xe4\x06\x0c\x40\x9e\x31\x3d\x3e\xa8\xb2\x3a\x77\x49\x75\xad\x8e\x2c\x44\xbe\x3c\xfc\x5c\xd4\x21\xa9\xc7\x86\xc8\xae\x1f\xf2\x73\x8e\x4b\x6d\xc8\xee\x68\x87\x2d\xac\xfb\xd5\xca\x55\x60\x48\x84\x39\x06\x8f\x8d\x18\x59\xf4\x0f\xc9\xaa\x63\xfa\xca\xd8\xe2\x27\x2b\x5a\xe7\x26\xa0\x9b\x21\x25\x54\x55\x47\xad\xaf\x6c\x82\xf7\x41\xa2\x46\x9f\xa6\x17\x6c\x76\x88\x6d\xe4\x67\x49\x1f\xfa\xf7\x5e\xf5\x47\x2f\x9a\x45\x5f\xce\xaf\x7c\x5c\x8a\xdc\xcb\xfb\x12\x0a\xaf\x35\x64\x5d\x2b\xdb\xce\xd4\x6b\x05\x27\x0f\x7e\x6f\xac\xe8\xfb\xc2\x96\x4c\x5f\x84\x8d\xb7\xd8\x4c\x8c\xe7\xbd\x0f\x3a\xd4\x0c\xd2\x15\x51\x34\x45\x69\xfa\x78\xbe\x64\x3d\x83\x1f\x60\x23\xef\x08\xce\x06\xfe\x9a\x4c\x20\xf7\x21\x32\xe3\x15\xca\x02\x86\x9b\x0f\x9e\x69\xc5\x95\x68\x4b\x24\x7b\xa0\x7d\xf8\x31\xf4\x49\x4e\x33\x67\x88\xbc\xfa\xb4\xe9\x96\x4e\x6e\x34\x90\x63\x10\xb6\x3b\x7e\x16\x35\x81\xcf\xed\x7a\xab\x09\x0a\x5f\x9a\x21\xf6\xb6\x07\xe2\x11\x06\x28\x0d\x75\x6b\x5e\xb4\xc4\x8f\x6a\x03\xb5\x29\x02\xf3\x41\x38\xcf\xd8\xc5\x2b\x20\x09\x6e\xb4\xe2\x32\x21\xfa\x9c\x19\x2d\xf5\xa2\xa9\x0d\x12\xec\x1b\x5c\x16\xd1\x94\xb6\xe1\xa7\x60\x6c\xbe\x3a\xdd\x05\x02\xc9\x3f\x78\x1b\x31\x38\x47\xdb\x74\xbd\xda\xa4\xfd\x0d\x57\x97\x53\xeb\x15\x3c\x52\xde\xed\xb6\x4d\xea\x7f\xf7\xb0\x41\x39\x4d\xc8\xed\x13\x34\xa8\x77\xa4\x6e\x96\x08\x7e\xef\x3c\xbc\x97\x0f\xdb\x29\xc5\x83\xcd\xad\xdb\xe4\x72\x9c\x64\x19\x53\xb2\x88\x50\x9f\x4b\x1a\xc1\x0e\x29\x5d\x29\x94\x69\xc9\xff\xf1\x3c\x0c\xa4\x48\x89\x09\x96\x95\xc8\xd2\xd9\x36\x37\x32\x60\xee\xd8\x30\xe2\x52\x0c\xe2\xd4\xf8\x0c\x87\x5b\xb0\x53\xf8\x48\x71\x58\x5c\x17\x49\x63\x9a\x5f\xe1\xee\x90\x1a\x77\xe5\x9d\x7b\xc7\xf9\x60\x1c\x74\x67\xa4\x12\xa1\xe1\xc0\xb9\xd4\xae\xe0\xab\x31\x28\x12\x3b\x47\x60\x01\x12\x5b\xb3\x3d\x7e\x38\xcd\x9c\xcc\xb3\x4a\xb6\x98\x90\xda\x84\xeb\xd9\x6f\x01\x0e\xed\x13\x74\x92\xfd\xba\x5b\x8b\xfa\x0b\xac\xae\x2b\xb7\x43\xc8\x45\x12\x79\xad\x69\x46\x91\xed\x68\x9c\xb7\x75\x82\xdc\x34\x70\x8e\xb0\x2b\x98\x90\x1e\x4c\x78\xf1\xf8\xaf\xcd\x3f\x59\x84\xa6\xbc\x75\x14\xa0\xf5\x6e\x8f\xfb\x20\xde\x46\xc0\xed\x2d\x74\xe7\x7d\x32\xea\xf2\x5d\x34\xf3\x03\x79\xbb\x62\xb8\x6a\x9b\xf1\x6e\x85\xa8\x4d\xe7\xbd\x60\x36\x50\x09\x9b\xd9\x8d\x2a\x06\x8a\xc9\x6e\x62\x6e\x8b\xd2\x41\x67\xf1\xc9\xdf\x73\x00\xa1\x74\xc2\x51\x34\x4d\x8e\x08\x6c\x3b\x0f\x6f\xa2\x67\xca\xe9\x7b\xd3\xf9\x3b\x0c\x14\xde\x79\x0e\x98\xec\xa7\xd1\x7a\x27\x05\xab\x02\x15\x5b\x35\x3a\x89\x7e\x8d\xb4\xbc\x69\x06\x6d\xaf\xb9\x87\x4b\xad\x10\x30\x84\x13\xfa\x60\xef\x67\xc9\xca\xbe\xaa\xab\x5f\x2e\x35\xf3\xc1\xfe\x65\x06\xac\x8d\x5e\xc2\x5e\x51\xf7\x83\xb0\xa4\x9b\xff\x0f\x07\x0a\xab\xda\x2b\x8b\x31\xa5\x3f\x84\x9c\xd1\x3c\xa1\x7e\x58\x01\xd6\xed\x98\x9a\xa9\x2e\x51\x34\x9e\x84\x77\xbd\x83\x28\x75\x9e\x6d\x67\xed\x52\x34\xdd\x3f\x36\x05\x5a\xa5\xe5\x04\x9c\x6b\x98\x80\x71\x6b\x21\x63\x9c\xcd\xe3\xc7\x99\xe2\xb8\xe9\x5d\xee\x58\xe8\x6e\xe4\xaf\x11\xfa\x9a\xc0\x2f\xa3\x6d\xef\xbf\xc2\x43\x3b\xd3\xc5\x8c\x42\x2b\xdc\x31\x37\xfb\xec\x03\xb9\xaa\xb7\x5d\x08\xb4\xda\xd9\x9b\xd4\xfe\xf2\x4c\x43\x1f\x0c\x81\x1c\xd9\x67\x0a\x91\x59\xb3\x90\xbd\xc5\xcd\xc4\x44\x43\x92\xa1\xbb\xf7\x4a\x84\x65\x5f\xe9\xbb\x19\xf3\x84\x5f\x2a\x86\x13\xed\x77\x4a\x55\x68\x4e\x21\x9a\x76\xbb\xe2\x21\x72\x56\x61\xc4\x14\x34\xac\x10\xab\x85\x4a\xeb\x46\xc1\xbd\x5f\x91\x35\x78\x35\xbf\x20\xdf\xa3\xac\xba\x22\xaf\x43\x7a\x29\x48\xd7\x48\xa1\x42\x76\xab\x0a\xd8\x2b\x92\x81\xe0\xe4\xeb\xff\x67\xaf\xac\x4b\x3d\x46\x27\xb6\xa9\xd7\x16\xd9\x3e\x9b\x26\xb6\x0b\x3d\x3d\x25\xbf\x2e\x32\x13\x90\xd6\x0d\x23\xf8\x8f\xfa\x4d\x00\x7b\x66\xb6\x3a\xae\x59\xaf\x61\x2f\xa1\x4c\xd9\xa9\x28\xd1\x66\x6a\x69\x4e\xc8\xd3\x11\xe5\x6b\xee\x7e\x84\x30\xbd\x5d\x5b\x97\x76\xb6\xbf\x6d\x18\xaa\xc1\x0b\x5b\xeb\x2c\x45\xdc\x99\x95\xab\x13\x42\xb7\x42\xe2\xe6\x25\x26\xb4\x3b\xfe\xde\x77\x8c\xae\x9f\xb9\xef\x89\xfe\xc6\x3e\xd2\xb1\x8f\x71\x3b\x91\xb6\x43\x5b\x85\x0b\x09\x93\xf3\xf0\x4f\xfa\x6b\x73\x21\x73\x3e\x18\x7f\x96\x16\x10\xab\xc7\xc0\xb0\x41\xa3\x68\x95\xd3\x90\x88\x03\xc9\xd2\xdd\xa7\xaf\x6b\xe4\xb1\x66\x48\xf4\xca\xec\xf9\x21\x58\x56\x8c\x99\x2b\xac\x89\xe5\x67\x72\xa1\xfb\x1a\xa1\x3e\x2b\xc0\x0b\x7f\x1f\x09\x22\x11\x59\x12\x55\x72\xc6\x94\xa4\x46\x49\x9e\x13\xb1\xea\x20\xc7\x4d\x57\xe0\x11\xcc\xab\x21\x4f\x75\x0a\x59\x33\x43\x38\xcb\xd6\xac\x87\xff\x11\xb9\xc3\xc5\x5a\xd0\x5e\x8e\x57\xf8\x05\x91\x9c\x20\x6a\x0f\x44\xee\x86\x51\x2f\x6b\xd5\x59\x25\x68\xf7\x11\xb5\xf5\xcc\xff\x9d\xf4\xe7\x38\xdd\xd7\x84\xa3\x4d\xb4\x34\xf0\xf6\x49\x59\xb3\x79\x34\xb4\x7c\x73\x53\xf5\x91\x3d\x62\xab\x94\x9f\x65\xe8\x36\xee\x97\x6d\x12\x9d\x39\xe9\x7f\xe9\xdf\x02\x71\x10\xb3\xe9\x74\x23\xb7\x36\x5e\x78\x20\x66\x38\xfa\xad\xe8\x29\x50\x96\xf5\xbf\x8a\x5c\x3c\x87\xe3\xaa\x13\xf4\x0f\xd0\x04\xe3\x12\x3d\x6e\xda\x10\xc9\xe8\xf1\xc0\x3e\xe6\x14\x72\xe8\xe6\xc9\x82\x15\x89\x0e\x3b\x84\xe8\xb7\xc0\x4b\x49\x81\x44\x51\xd1\x1c\x10\xa8\x15\xc9\x02\x91\xbb\xbc\x47\x4c\x2e\x8d\x68\x0f\x6f\xfe\x48\x5a\x08\x9b\x1d\x09\xf8\xa6\x88\xdc\xc7\x22\x57\x7d\xf7\x7c\x48\x2e\x6c\x5f\x60\xef\x07\xa9\x6d\x8e\xac\x14\xdd\xa4\xab\xed\xb0\xef\x67\x25\xfe\x98\x5e\x32\x57\x8a\xb7\x93\xae\x10\x18\x26\x37\x97\xe0\xa3\x70\x6a\x52\xef\x77\xb8\x65\xa9\x0f\x65\x30\x77\xa4\xa0\xc5\xe9\x0d\x25\xfb\x6d\x08\xc6\x78\x1c\x92\x5e\xcd\xce\x7e\x72\xdf\xe0\x97\xf6\x70\xee\x9b\xf0\x32\x2b\xeb\xe9\x67\x61\x33\xbc\x0c\x11\x8a\x3a\x70\xc5\xde\xb1\x68\xf5\x45\x3e\x3f\x7b\x0d\x4f\xfd\x3d\x3c\xb6\x76\xab\xb5\x3f\x7e\xe1\x7b\xa0\xd1\xcc\x44\xa3\x19\x7a\xe2\x41\xa8\x63\x23\xc4\x51\x32\x63\x3f\x72\xf1\x7a\x7e\x4f\xa2\x74\xec\x29\xa1\xb6\xd9\xaa\xe0\xbe\x0a\xce\xcb\xa2\x08\xa3\x2a\x6f\x24\x9a\x5d\xb8\x97\x33\x31\x42\xad\xde\x9b\xad\x5f\x91\x7a\xb0\x95\xfe\xfb\x19\xb5\x7b\xb1\x3f\xee\xfc\xad\x5e\x74\x6c\x73\x40\xd4\x1b\x99\xf3\x5b\x98\x0e\xcd\x6b\xa1\xaf\xf3\xea\xcc\x2c\x0e\x25\x51\xda\xf0\x4d\xf0\xe9\x99\x1f\x7b\x6b\x81\x89\x36\xa2\xe7\x53\xc6\xf2\x50\x09\x2c\x9e\x81\x38\x9e\x9c\xfa\x6c\xd0\xb3\x1b\xb4\x81\x9d\x40\x58\x52\x70\xf8\xf6\xb3\x60\xe2\x1b\xeb\xb5\x88\xf8\xd8\x7e\x8b\x9b\x8c\xb0\xad\x07\x8f\xca\xe1\x11\x0c\x51\x43\xf2\x21\x90\xac\x69\x3e\xb6\x3f\xd2\xa6\x47\xcf\xeb\x4b\x26\x08\x44\x2c\x75\xb3\xfb\x37\x85\x72\x32\x85\x95\x55\xff\xcc\x4d\x99\x02\xc4\x52\x7e\xa2\x5b\x4f\xab\x3b\x90\xf6\xee\x3e\xe2\x9c\xfa\x24\x49\xd3\xd6\x23\x58\xfe\xe1\xe0\x65\x1f\xf8\xe2\xa7\x13\x56\x69\x3f\x45\x93\x4c\xea\x28\x3e\xdf\xf5\x4b\x2c\x3e\xa3\xe0\xb1\xe1\xa6\x9b\x96\x2b\x5a\x1a\xf8\xa3\xdd\xdd\xd3\x69\x7a\x83\x55\x1c\xb9\x8d\xee\x65\x9d\x64\x2d\x45\x07\xb0\x2d\xe4\x06\x5b\xc2\xcf\x47\xcb\xeb\xf1\x43\x9a\x23\xf0\x5e\x3e\x38\x48\x44\x18\xa1\xb1\x4c\xd8\xb4\x7f\x36\x5c\x75\x95\x3e\x79\xad\xa4\x48\x42\x58\x49\x62\x5e\xed\x7b\x42\xa3\x4a\x2a\x59\x21\xbc\xd1\x57\xb7\x32\x4f\x68\x2d\x32\xba\xbe\x28\xb1\x04\x63\x28\x09\x50\x0d\x0b\x5a\xc0\x87\xc2\x61\x0b\x7e\x35\xda\x4d\x85\xbb\xd2\x3a\x37\xfc\x54\x0e\xd8\xb3\x60\x46\xc7\x56\xff\xd9\xd2\x82\xc2\x4b\xc4\x14\x6f\xa3\x97\x2c\x13\x4b\x87\x8f\x2e\xe5\x6f\xac\x5c\x9c\x57\xcc\x58\x72\xbc\x5b\x31\x37\xe1\xab\x02\xb2\x4a\x94\x37\xd5\x9d\x6e\x05\x6b\x0a\x5d\xd1\x9a\xae\x48\xa4\xba\xc8\x29\x84\xb1\x39\xc1\x3e\x8c\x82\xf7\x88\xd2\x84\x0e\xf8\x98\x35\xc3\xf4\x2a\x8c\xb1\x3c\x8d\xe3\x41\x63\x6d\x29\x42\xb1\x3e\xb7\xb4\x66\xb4\x12\xfc\x28\x7c\x96\xa6\x47\x40\xaf\x83\xcf\xe8\xd0\x68\xa1\xd6\x64\x09\xb6\xde\x82\xec\x0d\x3f\x46\x2c\xe1\x52\x74\x9a\x2e\x7b\xf3\xb9\x52\xee\xbf\x8b\x3f\x79\xe4\x75\xb1\xc8\x7f\x77\x09\x2f\x23\xd7\x7f\x92\xd0\xc8\x15\x00\xd2\x4f\xcd\x01\xf4\xc6\xa2\x1e\x74\x6b\x72\x50\xe5\x94\xd9\xa8\x8f\xfd\xfc\xe2\x84\xad\x71\x0a\x71\xa9\xe8\xd4\xf6\xc2\x2f\x05\x48\x1f\xeb\x4f\x39\x5a\x7c\x2d\xc3\x49\x5e\x48\x8b\xa4\x2b\xc1\x12\x6e\xf7\x4b\xfa\xda\x05\x7d\xca\x71\x7d\x09\xbf\x11\xa0\xc3\xfe\x5e\x30\xef\x13\x1d\xfe\xb1\x0f\xfe\xe8\x7b\xfd\x17\xdb\xa5\x3f\xdb\x44\x45\xca\xd6\xdb\x11\xed\x3f\x59\xbb\xff\xa5\xff\xb9\x78\xe6\x0f\x60\xe8\x97\x03\xdf\xa0\x83\xdf\x43\x2d\xaf\xa4\x80\x2d\x9b\x78\xfa\xec\x22\x69\x4d\x1f\x56\x0a\x53\xe5\x7e\x77\x72\x79\xab\x63\xa8\x55\x1b\x2a\x4a\x4f\xeb\x3f\xd2\x53\x35\x0f\x27\x31\x67\xed\xe8\x74\xe9\xa9\xbc\xc2\xfb\xaa\x54\xa6\x78\x91\xe7\x62\x87\xe6\x8a\x45\x09\x01\x54\xa9\xee\xf9\xca\xb1\x90\x13\xcf\x03\x0b\x98\x02\xba\xf1\x9f\x81\xcc\x44\x7d\xef\x18\x44\x4d\x3f\xa3\x9a\x88\x60\x8a\xa0\x44\x68\x09\x1c\xa7\x86\xec\x29\x60\xe5\x73\x0b\xcf\x28\xec\x84\x77\xd2\xcc\xa7\xac\xa0\x31\xf7\xb6\x6c\xc0\xe2\x84\x75\x43\xd3\x20\x2c\xbf\x22\xce\xeb\x9b\x57\xb4\x53\x7d\xfc\x69\xf7\x9f\x04\x6e\xe0\x6c\x1e\x96\xe6\x2d\x79\xdb\xe6\xba\x5f\x5e\xb6\xbe\xf6\xb4\xaf\x11\xbc\xbd\x0b\xe9\x6e\x9d\x5f\x76\xad\x5b\x5a\xf7\x86\x7a\x98\xff\xe5\x6f\xa8\x1c\xd8\xa5\xd9\xfe\xb5\x9f\xb2\x53\x8b\x37\x9d\x92\x9c\xc3\xd6\xb0\xf9\xb2\xf5\xa7\x53\x76\x38\xf0\x6e\xe5\x36\x8d\x60\x78\x91\xfd\x19\xaa\xcc\xb1\xc5\x63\xc0\x7f\x85\x2e\x0c\x36\x0a\x5c\x5c\x56\xc9\x63\x61\xa3\x75\x5c\xab\x5c\xd8\xe7\xd6\x20\x06\x8a\x2d\x94\xda\xe9\x9b\x44\xae\x45\x70\x18\xb3\xd0\xef\xc4\x4c\xb3\xa4\x5e\xc5\x68\x1b\x24\x32\x96\xa1\x96\xfd\xd9\x82\x45\x84\x99\xc7\x08\x91\xd1\xc9\xcb\xe9\xe9\xb1\x88\x7a\x0e\xfe\xf0\x55\xcb\x6d\xc2\x82\x76\xfb\xb4\x8d\x2d\xe9\x98\x20\xaf\x2a\xc8\x3b\x63\x3f\x5d\x7d\x3f\xfd\x84\x98\x42\x5e\xeb\xe5\x2d\xef\xf3\xc2\x26\xd5\x73\xcd\x55\x86\x40\x36\xf4\x1e\x87\x1d\xc5\x66\x86\xad\x3a\x62\xb1\xe4\x21\x76\xb9\xd2\x82\xbe\xea\x5c\x18\x7c\x08\x44\x4f\xcc\x4f\x00\xc5\xbc\xdf\x83\x21\xfd\x69\xf1\x25\x3d\xa1\x59\xf3\xd7\xcf\xf2\x2e\x00\xce\xae\x92\xc7\x86\x07\x1f\xbd\xca\x44\xfb\x19\x3e\x04\xcf\x84\x20\x0b\xff\x57\xc9\xbe\x7c\x8a\x86\x6d\xed\x23\xc2\x7e\x5d\x6d\x46\x82\x72\x25\x86\x6e\xb9\xae\xe1\xd6\xba\xd5\xcc\xbf\xf7\x5b\xc1\xca\x20\xe3\x74\xd2\x54\x93\x15\x9b\x9e\x07\x17\x15\xfb\x4d\x83\x84\x16\xb9\xfb\x07\x82\x67\xda\x31\x76\x8c\x62\x7c\xd6\x38\xfb\x07\xac\x05\xba\xcd\x6a\xec\x90\x02\xd3\x80\x65\x10\xda\x7d\xe6\x50\xa6\x0f\xe5\xe3\xdf\xc3\x50\xc4\x1b\x80\x8e\x24\xcc\xdd\x3d\xb8\x6f\xd0\xe3\xba\x8f\xff\x04\x48\xe8\xe0\x91\xf6\x69\xc3\x3c\x04\xee\x7e\x41\x2f\x18\x63\x65\x54\x0c\x8a\xf8\x01\x5c\x76\x11\x80\xf7\xda\xd3\x47\xb0\x94\x23\xc9\xb5\x23\xb8\x2e\x04\x06\x8c\x99\x4c\xb6\x2a\x36\x73\x04\xe6\x77\x41\x57\x03\xbb\x41\xfd\x67\x14\x00\x7f\xcd\xbd\x1f\xcf\x67\xd8\xb9\xdb\xaa\x10\x23\xa2\xda\xd1\xc2\xec\x61\x7e\xdc\x38\xac\xc9\x69\xef\x3d\x4a\x2d\x12\x58\x93\xe8\xe7\xfd\x49\x3d\x6c\x8f\xa2\x4a\x47\xb5\x51\xfb\x02\x17\x77\x76\x9c\x7a\x30\xb2\x03\x9f\x47\x83\x97\xa3\x33\xcc\xd4\x6d\xab\x18\x98\xbd\xa0\xf8\x12\xf4\xb2\xbe\xa8\xf4\xe9\xad\x26\xd8\x63\xc4\x7f\x1e\xc2\xe0\x07\xb1\xfb\xe0\xa8\xae\x2a\xf0\xfa\xf9\xa9\x26\x94\xd5\xf7\x2e\x46\x21\x34\xef\xd8\x9e\xe4\xc4\x13\xbb\x4a\xb0\x03\xd9\x35\x13\xd9\xba\xfe\x4a\xdc\xa7\xf4\xb0\x02\x88\x91\xf6\x5c\x18\xad\x54\x4c\x03\x6e\x52\x70\x3a\x30\xcc\xef\x43\xf4\xd9\xb0\x90\xbf\x63\x87\xdf\xdb\x8a\xdd\xb1\x79\xdd\x47\x66\x81\xc7\xc9\x3d\x44\xa9\xa5\xf4\xf8\x88\xf0\xf5\x5d\xaf\xb5\x85\x2f\x9d\x0b\x16\x25\x54\x8e\x14\xb0\xee\xb3\x5e\x5e\x6b\xb8\x8d\x1b\x3d\xdb\xae\xf8\x9a\x81\xe1\xff\x78\xb5\x63\x73\x4b\xb7\x71\xdc\x5a\xf6\xd2\x8b\xff\x59\xf7\x9f\xeb\x5b\xbb\xbf\x6d\xf6\xbb\xba\xa9\xe0\xed\x2a\x75\x5c\x9d\x2d\xb0\x8b\xb0\x7c\x88\x9c\x45\xa7\xb5\xcb\xa0\x01\xf4\x14\x42\x38\xe7\x89\xe8\xbf\x4d\x71\xca\x40\x07\x46\x16\x36\x6f\x70\xa3\xe7\x72\xe1\x38\x7c\x0b\x7f\x03\xc5\x96\xe0\x74\x07\x1d\xb6\x02\xdd\xdf\x43\x91\xfb\xbc\xf2\x4c\x3b\x3b\x9b\x08\xde\x2b\xc0\x6e\x47\xae\x1f\xa1\xfd\x95\x22\xc1\x6e\x8d\x8c\x4b\x90\x6a\x25\x70\x66\x05\xd4\x45\xdd\xdd\x85\xd9\x57\x37\x7b\xdd\xef\x74\x55\xa7\x59\xeb\x99\x39\xb6\x16\x9d\x13\xea\x04\xf3\x07\x85\xaa\x63\xd1\xe6\x78\xbe\x48\xb6\xe3\x15\xcf\xdc\xa9\xa1\xeb\x10\xb7\xee\xc7\xe1\x2a\x91\xfb\x1e\x6a\x64\x38\xe1\x92\x59\xeb\xaf\x4e\xe9\xb5\x1c\xc6\x90\x26\xb9\xa9\x6b\x03\x09\x41\xd6\xa0\x59\xb6\x74\x80\x09\x82\x97\xab\x2e\x81\x0b\x99\xf4\xec\x67\x29\xa4\xe1\xc2\x5c\x8a\x2f\xb3\x22\x8e\xc2\x4f\xa7\xf4\xed\x89\xae\x3b\x45\xcc\x61\xfc\xea\xf8\xa3\x8f\x14\xd3\x9e\x18\xcc\x60\xdf\x8b\x48\xb6\x75\xf0\x29\xde\xdf\x6d\xc4\xe0\x01\x52\xa2\xed\x9c\x03\x2f\x99\xc3\x49\x9b\x89\x74\xc9\x92\x11\x7d\x88\x2f\xa9\xbd\x7b\xa1\xb3\x9d\x0c\x30\xec\xbc\x93\xff\x1d\xfe\x6d\xf2\xf3\x15\x06\xd3\x77\x92\xb6\x7a\xbb\xf8\x23\x61\xdf\xc1\xb3\x3c\xad\x4c\x78\xfa\x17\x65\x4f\xa0\x7d\xf0\x7f\xae\x3d\xf7\xac\x7e\xc9\x90\x08\x9f\xa6\x55\x2d\xe5\x34\x56\xda\xec\x8f\xa8\x32\xfc\xad\x01\x18\xf4\xc7\x0f\x65\x3d\x26\x7d\x84\x5e\xcc\xe1\x7a\xaa\x7d\x21\xba\xf0\x3b\x0a\xa5\x2f\xa1\xc3\x6f\xe6\x56\xfe\xd3\xa9\x53\xf7\xf1\xb6\x8d\x7f\x39\x30\x7d\x16\xe4\x8c\xa1\x4b\x62\x6d\xfc\xae\x04\x0e\x7f\xf6\x61\xef\x12\x61\x29\xef\x52\x84\xe5\xbd\xcb\x3e\x7a\x35\xf2\x0e\x35\x35\x53\xb9\xc8\xff\xbd\xbf\x0b\xbb\x19\xf7\xa4\x0e\xc7\x95\x6d\x4a\x79\xa9\x8d\xd1\x52\xfd\xec\x2b\x69\xbe\x7b\x34\xe9\x56\xe3\xc2\xca\x0d\xf0\x2e\x7c\xb8\xea\x1f\x45\x34\xeb\x5b\x6e\x66\xef\x39\xe6\x82\xb7\x17\x1d\xa4\x81\x79\x6e\xe0\x8f\xd8\x9c\x2f\xba\x29\xbf\x5b\xb3\xc5\xe5\xe0\xd4\x87\xc7\xa2\xfe\xce\x33\xfd\x3d\xd1\x21\x61\x27\x05\xb3\xb1\x97\xd4\xef\x74\x9f\x04\xc7\xde\x49\x3f\xb5\xfd\x30\x11\x4d\x90\xe6\xfd\x67\xe4\x37\x35\xeb\x97\x37\x18\x47\x98\x3e\x5f\xa7\x83\x30\xaf\x02\x00\xf1\xe1\x19\xff\x92\x91\xbf\x98\x14\xd8\xe2\xb5\x9c\x1e\x7f\xf5\xba\x75\x85\x01\x6b\x8f\xce\x4a\xdc\x87\xac\x5c\xfa\xfd\xa5\x35\xa2\xc8\x5e\x20\xf4\x49\x70\xbe\x47\xc3\xe5\x67\xf2\x17\xf7\x25\x7b\x8f\x47\xb4\x54\x40\xcf\xf1\xcf\x88\xf6\x4a\xfd\xfc\x43\x46\x3e\x8a\x3a\x36\x76\xcd\xd9\xd7\xe5\xaa\x77\xa0\x03\x5f\x32\x04\xaa\x0a\xc0\xbb\x9e\x7b\x34\xd9\x6e\x16\x80\xf7\xd9\x18\xff\xf6\x86\x36\x96\x7c\x08\x6f\x64\x3a\x81\xb7\xba\xc4\x0e\xf6\x73\xc5\x15\xe4\x0f\x8f\x34\xec\x25\x38\xcf\xe1\xdd\x97\xf7\xa4\xd4\x84\xfb\xa7\x69\xb7\xa9\x43\xcd\x94\x34\x8b\x1a\xdc\x11\xf0\x8f\x7e\xc2\x3b\xf9\xcf\x7c\xd5\x0f\x31\x19\x34\x51\x98\x05\x50\x83\x08\x6c\xfb\x3d\x7a\xde\xdd\x55\x84\xd6\xdb\xa6\x8c\x20\xa1\x7a\x1a\xe2\xe3\xff\x45\x02\xa2\x8f\x4a\x19\xd4\x09\xb8\x4b\x58\x66\x7b\x6f\xe4\xad\xc5\x1c\x6e\xb6\x4b\x74\x45\xd0\xe2\x6b\xd1\x89\xd9\x36\x9f\x0c\xfe\xbf\x73\x6e\xaf\x02\x1f\x0f\xa9\xdf\xed\xcc\x91\x91\xa8\x07\x22\x06\xe5\x77\xe6\x91\x02\xd2\xab\xb8\xe3\x20\x57\x1f\x9b\xa0\x6f\xa6\xce\xd8\xc8\xc1\x98\xab\x50\xf3\x79\x15\x09\x1f\x6d\x30\x4b\xc0\x68\x43\x55\xcd\x17\x53\xd1\x31\x5a\x55\x5f\x5f\x2b\x52\x8d\xa3\x8b\x62\x55\xa4\xfa\x19\x8b\x6d\x6b\x14\xaa\x38\x53\x93\x75\xfd\xfa\x23\x54\x03\xf8\xeb\x4c\x67\x51\x03\xa4\xa8\x27\x32\x13\x49\xf3\xd0\x44\xde\xe3\xea\x48\xf5\x4e\xa0\x0b\x61\x8f\x25\xe7\x18\xa1\x89\x10\x5d\x94\x68\x6c\xd8\x26\x26\xf9\xba\x64\x7b\xd9\xa7\xa2\x08\x6c\x28\x82\xed\xe5\x84\x10\x3e\x3d\x3b\xc9\xc9\x0e\xbf\x87\x89\x2f\x9c\x83\xeb\x67\x9b\x1b\x09\x9f\xae\xcc\x7d\xe0\x25\x05\xe3\xd5\x83\x07\x4f\x36\x78\x3f\x27\x22\x5a\xe8\xca\xac\xd4\xb8\x79\xe7\xa5\x7d\x3f\x60\x16\xc8\x75\xcf\x3b\x2f\x41\x7d\x9e\xd6\x1f\x95\xb9\x87\x6c\x51\xad\x1a\xef\xd4\x3c\xd8\x4e\x81\xda\x06\x43\x79\xe6\x80\xd5\x3c\x39\x0f\xda\xb6\x4e\x7e\x96\x26\xa6\x39\x7c\xda\x27\x3b\x3f\x32\x02\x3a\xeb\x3d\xb7\x0c\x92\xb3\x16\x3a\xd9\x9f\x55\xb5\xdd\x59\x07\xb1\x64\x4f\xfe\x06\xde\x34\x51\xb5\xc6\x71\x56\x83\x65\x6b\x68\x99\xbb\xe3\xaa\x99\x79\x96\xa9\xbd\xc0\xb4\x86\x55\x22\xe8\xee\x3a\x3e\x5c\xaa\x9f\xf4\x7f\x67\x65\x0c\x9c\x9a\x7c\xcf\x39\x30\x70\xbf\xf6\xfd\x5c\xe6\xff\xc8\xd7\x91\x82\x1b\x1d\xe2\x7f\x3a\x24\x72\x34\x6a\x07\x88\xb0\x38\xb2\x32\xce\xac\x66\xcc\x30\xb8\x5b\xdc\x09\x7a\x68\xf4\x54\xfc\xf9\x29\x90\xc1\xf3\xb7\x7d\x85\xc8\x5a\x1d\x20\x5b\x84\xe3\x93\xa7\x39\x6c\x00\x86\x30\x14\x86\x25\x0d\x8b\x0d\x24\xf1\x3b\x6b\xda\xf6\xa6\xcc\x83\xb0\xb5\x2e\xab\x53\x62\x27\xcb\x2a\xe6\xb5\x5d\xd6\xfc\x1f\x1c\x6b\x70\xf1\xee\xc2\x66\x4c\xf1\x74\x5a\xb6\x1f\x40\xf9\x6d\xa3\xc4\x63\x1f\xd9\x10\x70\x1c\x92\x52\xf9\x50\x7c\xf6\x81\xc6\x5e\x38\xdc\x1c\x45\xd0\x04\xb8\xdc\x9e\x7e\xb9\xfe\x3a\x30\x44\xd7\x0f\xae\xcc\x08\xb5\x14\xed\x7b\xde\x9b\xfc\xf9\xd0\xa4\x7a\xd8\x5e\x82\x1e\x02\xd3\xbc\xea\xc7\x07\x03\xdc\x93\x36\x41\x35\x95\xff\x00\x3b\x08\x87\x36\x06\x87\x78\xc2\x36\xe3\xac\x6a\xaa\x20\xe3\x82\x1d\x99\xc3\x4e\x76\x19\x6d\x00\xcc\xd8\xf8\x50\x0f\xab\xe0\x59\x18\x05\x63\x39\xc9\x6d\x2c\x64\xf8\x16\xc5\xaf\x17\x85\xe8\x95\xc3\xe7\xab\xd2\x4f\x3a\x21\x0a\xfc\xcf\x1c\xd5\xd8\x3f\xda\xda\xef\xa5\x39\x42\xed\x10\x4a\x71\xd3\xba\xcf\x2f\xb5\x4f\xfa\x30\xb1\xda\xf3\x5b\x69\x8e\x3b\x0c\x55\x33\xf9\xd9\x4c\xc9\x4c\xe1\x14\x80\xf6\x00\x5b\x21\x60\xbb\xac\x42\xc9\x91\xa2\x21\xf3\xc2\x72\x06\x1b\xdb\x8a\x81\x70\x4a\xb4\xcf\x1a\x59\x99\x56\x83\xfc\x93\x50\x31\x36\xc8\xbe\x68\x21\xda\xe6\xf3\xcb\x9e\x48\x58\x1c\xa2\x65\x7e\xa8\x3b\x87\xac\x4c\xb6\x47\x82\xa8\x3c\x47\x2e\x65\xbb\x6e\x3c\x43\x93\x0a\x7d\xe9\xca\xb6\xbc\xd6\x31\xba\x22\xb3\x6e\x6a\xde\xa2\x5b\x9e\xd8\x39\x49\x9c\x9a\xb7\x7e\xb7\x95\x5c\xbd\x91\x14\xad\x0e\x00\xd6\x62\x5e\xc3\xa4\x5e\x83\x55\xa9\x66\xe8\x64\x34\x9f\x82\xbe\xbc\xc3\x8a\x80\xf4\x32\x78\x12\x20\xb0\xb4\x7f\x44\x9f\x43\x04\xec\xef\x57\xac\x33\x1b\xf2\xf0\xe1\x37\x93\x44\xc6\xd8\xd2\x1d\x29\x8b\x5b\xba\xc3\x5c\xe0\xbc\x3f\x7c\xfe\x19\xe6\x8f\xe7\xde\xfa\x19\x6b\xcb\xe6\xac\xed\xc3\x42\x8b\xcd\xd6\x86\x7e\xeb\x2d\x4d\x6c\x9e\x3c\x9f\x91\x32\xe2\x25\x98\x0f\x38\xcb\xac\x9f\x9b\xe5\xc7\xfa\x51\xeb\x82\x9b\x34\x26\x78\x66\x79\x69\xac\xd5\xfd\xe1\xfd\x09\xe5\x97\xa6\x69\xc3\xd4\x62\x31\x6e\x71\xbd\x3b\xfa\x16\x14\x6d\x21\xd7\x99\x32\x21\x47\xb5\x3b\xe6\xdb\x7b\x1b\xc2\x07\xe8\x3b\x90\xc3\x8d\x18\x19\x7a\x47\xe6\x5f\x0e\xeb\x9a\x0f\x86\x85\xe6\xed\x9f\xb8\x4e\xa5\x7a\x92\xef\xb4\x2a\xc7\x0d\x56\x6b\x77\x50\xbb\x47\xde\xb2\x0f\x91\xf6\x69\x55\xf7\x29\x75\x06\x0c\xa3\xd8\x7f\x10\xe8\x5f\xd5\x25\xb0\xf3\xea\x4b\xdb\x83\xbc\xd3\xd8\x20\xcb\x44\xc2\x47\x3a\x06\x1b\x3c\x41\x88\xa2\x3c\xce\x9b\x6d\x96\xa5\x5c\x6a\x23\x9c\x7b\xec\x82\x96\x72\xfc\xb0\xf5\xc5\x66\x98\xde\x7d\x3a\xc5\x4d\x5a\x0a\xa3\x0b\x96\xd2\xcb\x56\x61\x4f\xd5\x69\xe7\x9b\xcc\x15\xec\x9b\xd7\xd2\xb6\x00\x84\x54\x0b\x22\x87\x4d\xc2\xfd\xdd\x22\xfc\x7b\x99\xcf\x8b\x0d\x89\x88\xf2\x98\x57\x36\xe0\x96\x19\x69\xd7\x97\x7f\xb6\xdc\xd8\x6b\x4b\xfe\xc7\x83\x72\xe2\xc1\xb9\x59\x4b\xaa\xdf\x35\xa9\x1d\x84\x14\x0a\x35\x0d\x26\xc7\x15\xfe\x0a\x09\x7f\x7f\x73\x00\xf6\x7f\x82\xe5\x61\xa6\x20\x5d\x0f\x5a\x03\xec\xe7\xfc\xa5\xf0\xf7\xfe\xb3\x2a\x0b\x34\x35\x7e\x15\x70\x57\x58\xac\x46\xc3\x90\x15\xa2\xbf\x19\x9e\xb7\xde\x2d\x99\x95\xc0\x8b\x0e\xc1\xb7\xc1\xe4\xb6\x73\x0e\x63\xca\x2c\x3f\x85\x77\x18\x2d\x54\x42\xe1\x45\x26\xf4\x13\x13\xae\xa6\x12\x5c\x50\x77\xae\x92\x13\xe5\x7a\x5f\xfd\xea\x82\xc8\x29\xa8\xa4\x8d\xa3\x2e\x4e\x7b\x9c\xc1\x36\x08\xa6\xfa\x2c\x83\xbe\x09\x41\x48\x20\x35\xfb\x78\x1c\x91\x4e\x26\x16\x8f\x55\x6c\x82\xfc\x7f\x81\x1f\x62\x73\xb9\xc9\xe5\x45\x35\x86\x53\xd3\xc9\x2b\xa7\x08\x91\xcf\x61\x32\x49\x16\x49\x79\x4a\x41\x37\xe6\x88\x03\xe2\xf8\xaf\x55\x28\x3d\x01\xc9\x29\xfd\x96\x15\x99\xa0\xd9\x34\x2f\x0d\x82\x13\xaa\x22\xeb\x24\x9d\x7f\x95\xc7\x21\x74\x12\xde\x02\x08\x07\xcc\x66\x06\xb1\x06\x6f\x76\x6a\xba\xd0\xb1\x1e\xb7\x22\x3c\xec\x57\xe1\x6a\x45\xa6\x7b\x04\x88\xe8\x64\x1d\x6d\xa3\x75\x2a\x40\xc4\xa6\x2d\x5d\xda\xe3\x49\xdd\xc7\x78\x8a\xce\x8c\xff\xbf\xd2\xf4\x01\x84\x77\xfa\x67\x16\xf5\x52\x6c\xf0\xfb\xe1\xc7\x88\xbd\x03\xfc\xef\xbc\x98\x31\xcc\x52\xc6\xb9\x59\xb0\x8d\x40\xfc\x14\x8b\x1a\x1f\x69\xcc\xe1\xb4\x3b\x46\x7c\xca\x98\xa4\x4c\x19\x45\x8c\x97\x42\x6c\x4c\x57\x2f\xae\x3b\xef\xb5\x4f\xe3\x9f\x21\xc9\x3a\x15\x79\xaa\xea\xe3\xd8\x30\xb1\xb3\xe1\x05\x17\x19\xd9\xcf\xca\x1e\x3b\xa8\xf0\xd8\xcc\x3b\x66\x8e\x2d\xb6\xa3\xfb\x27\xaf\xe9\xa7\xe6\x17\xf4\x0a\xf4\xbd\x3e\xb1\x55\xa3\x2b\x84\x7d\xaf\xea\xbc\xdb\xf9\xc5\x68\x55\x59\xa1\x3f\x23\x33\xf2\xe9\x20\xbf\x23\xf3\xab\xfb\x85\xf1\xe3\x3d\x3d\xa0\x55\x0d\x07\x32\xc6\xf9\x3a\x98\x5b\x05\xfb\xaf\x8d\x5e\xaf\x8e\x40\x58\xe6\x3f\xc3\x99\xf3\x95\x65\x09\x51\xd7\x3e\x02\x59\x5b\x0c\x89\x38\xed\x4f\xc4\xe6\xba\xa2\xd3\xff\xe8\xf3\xa6\xee\x47\xf2\xfa\x5b\x94\xb7\xd0\xe7\xe0\x94\xf7\x9b\xb1\xa5\x67\x27\x19\xe5\xb6\x53\xee\xed\xe7\x72\xc2\x19\xb3\x4b\xf8\x39\x40\x20\x12\x1f\x7f\x86\x73\x9a\x23\xe8\xad\x08\xb2\x02\x45\x0f\x1b\x04\x22\x23\xb1\x84\x3f\xf5\x50\x01\x93\xcb\xac\x13\x8e\xe0\x5e\x25\x0c\x60\x40\x25\x0e\xe0\x1d\x40\x1f\xd0\xf2\x4f\x13\xa0\xe3\x94\x36\x44\x59\x03\x1a\xd7\xcd\x9d\xce\x30\x87\xd8\x71\x98\x49\x55\x05\xdb\xfe\x55\x34\x58\x3b\x3a\x1e\xd8\xd8\xbe\x30\x1f\x34\x55\xdb\x90\xaf\x26\xac\xb1\xf1\x94\x28\x4d\xb0\xa9\x4d\x9b\x60\x74\x05\xce\x20\xeb\xc7\x73\x56\x66\x23\x7b\xd4\xab\x18\x63\x43\x0e\xf6\x0b\xae\x58\xc5\xad\x00\xa8\x4a\x8c\x7b\x75\x81\x0e\x5b\x08\x3b\x0f\x70\xfb\xe4\x20\xd1\xd8\xbe\x07\x37\xbc\xb5\xfc\x70\x37\x91\xfe\x72\x75\x33\x47\x59\x0d\x05\x47\xf8\xc5\xc7\x3f\x93\x06\x81\xd1\x97\xa5\x81\x4f\x76\x72\x28\xe9\xd5\xcf\xbf\x5f\x38\x6b\x59\x45\x2b\xef\x6d\xa5\xd0\x6b\x52\x0e\xec\x21\xb0\x0e\xb2\x3b\xe7\xfe\x9f\xf7\x33\x6d\xa4\x6c\x62\x4b\x47\x98\x7c\xf2\x75\x87\x0f\x4e\x94\x16\x00\x99\xf7\x97\x69\x71\xad\x91\xf0\x0a\xd4\x63\xd0\x98\x01\xf4\xbd\x73\x64\x57\xf1\xf0\x85\xfd\x20\x4a\x65\x8e\xf4\x95\x75\xfe\x4f\xc0\xfc\xdc\x93\xbc\xd4\x7d\x02\xe4\xea\xdc\xc7\x89\xa3\x73\x20\x1c\x7f\xf6\x0a\x2f\xea\xaa\x52\x7f\x30\x10\x2e\x9f\xc5\x6f\xeb\x6a\xaf\xc8\xd5\xda\x2f\x42\xe0\x60\x0f\x1a\x8c\xfb\x46\xb3\xaf\x9d\x98\xf2\x44\x90\x80\xb8\x2f\xd0\x4e\x11\x56\xaf\xdb\xa5\x20\xd8\x1a\x5e\x18\x60\xe1\x0b\x69\x2f\xc3\xee\x29\x43\xdd\x99\x7f\x56\x1a\x08\xa2\x26\x8c\xec\x55\x5f\xf3\x15\xdd\x25\x6b\xeb\x68\x66\x08\xe6\xbc\x50\x71\x89\x85\xc0\xa0\x57\x77\xc0\x16\x4e\xc6\xc5\xf2\x97\x74\x8f\x8b\x1c\x98\x3c\xeb\x98\x0e\x19\x2a\x84\xca\xd7\x26\xd8\x05\xe4\xbe\x3f\x02\x83\xdf\xc3\x4e\xc8\x2e\x8d\x3e\x0b\x8c\xea\xa8\xb8\xbc\xd6\xcc\xbf\xec\xe2\xf2\x7f\x85\xfd\x9f\xc2\x67\xf3\x15\x18\x91\x9d\x16\x81\x90\x75\x79\x87\xeb\x0b\x47\x20\x05\xd2\x4e\xd5\x76\x07\x5f\x19\x48\x77\xad\x4c\xee\x5a\x23\x11\x76\x59\x00\xe4\x65\x40\xfa\x11\x0f\x1f\xd3\xbf\x50\xf8\x8b\x86\xa1\xd7\x2e\xa3\x0d\xdb\x3c\xae\x82\xd9\x85\x52\x76\x89\x6c\x63\x40\xec\xe7\x9f\x72\x61\x58\x93\x76\x30\x3f\x91\x17\xa9\xef\x67\xf1\x8d\x8b\x3c\x96\xce\x6f\xf5\x03\x89\xa1\x6a\x3f\x01\xca\x58\xb9\xd7\x4f\x8d\x83\x98\xc4\x26\xc0\xa9\xea\x13\x55\xda\x60\x9d\x10\x68\x78\xe0\xdd\x87\x82\x66\xd7\xa7\x90\x74\xcd\xcb\xb6\x28\xd3\xeb\x94\x5e\xa4\x0e\x6d\xb9\xed\x28\x5d\x88\x12\xe5\x83\x70\xb5\x4a\x80\x4b\x7d\xec\x14\x55\x1b\x7d\x3f\xa3\x2c\x66\xbe\x1f\x5f\x74\xbf\x25\x2c\x42\xbf\xf2\xa2\xfe\x2a\x47\xff\x0b\x76\x22\xf9\x37\xdf\x84\x8e\xe0\x45\x52\xff\xca\x5b\x56\x40\x80\x78\xde\x27\x27\xb2\x32\xde\x9f\x20\xde\x97\xfa\x6f\x42\x0c\x77\x0b\x70\xd0\x68\xc1\xb4\x57\xcb\x85\x59\x7f\x38\xb7\x7b\x13\xbf\xdd\x8b\x3f\x28\x19\xef\xd9\xb6\x6b\x73\x83\xa7\x57\xf9\x33\x39\x8d\x9f\x40\xb1\x0f\xe3\x75\xb3\x80\xf2\x0c\x8e\xb7\x3c\x32\x82\xad\xf9\x0e\xa4\xf7\xdd\x02\xe6\x41\xf3\xc7\x55\xe5\x43\xab\x00\xdd\x90\xfc\xed\x3e\x49\x02\x93\xc2\xf9\x94\x4d\xd0\xb7\xb8\x3a\xef\xe6\x25\x0e\xbc\x3a\xd3\xa4\xfa\x25\x3c\xff\x45\x53\x3d\x41\xcf\x8f\xf0\xc0\x20\xd8\x7c\x6e\xb9\xae\xe2\xe5\x7f\x9b\x0d\x06\xad\xda\xec\xdb\x84\x59\x4f\xb0\xfb\x41\x71\x90\x13\xea\xfe\x6c\xc6\x1b\x76\x4e\xd2\x22\x51\xd0\xf3\x5a\xf2\xc8\xbf\x7a\xf1\x94\x00\x3d\x9f\xa4\x63\xd5\x0f\xda\x54\x8e\x41\xff\x5c\x54\x00\x51\x73\x25\xbc\xdb\xf2\x79\x8b\xa2\x21\x17\x3d\xf0\xfb\x15\x95\x6b\x8b\xc2\x90\xc2\x2a\x75\x8f\x7c\xdb\x13\x27\xb2\x54\x03\x05\x01\x38\xcd\x28\x55\xdb\x13\x67\xfc\xfb\x91\xb1\xab\xee\x74\xa1\xb0\x19\x46\x52\xdc\xd3\xec\xf3\xac\xbd\x24\xda\xed\x62\xfc\x9f\xaa\xac\x00\x6b\xfb\xbd\x1e\x9c\xe0\x03\x5a\xc3\x5c\x88\x63\x95\xb1\x44\xc5\x4f\xa3\xb8\xda\xba\xe9\xa3\x5c\xb4\x09\xbc\x6e\x66\xba\xd9\x89\xf0\xb5\x73\x8c\xc2\x61\x60\xd5\xd7\x3e\x37\x76\x7f\x66\x2e\x84\xfd\x77\x9c\x5a\x5b\xf0\xf5\xcb\x29\x9e\x01\x86\x42\x8c\xa1\x1c\x8a\x0c\x11\xfb\x63\xbc\x06\xae\x09\x58\x81\x08\xa5\xd8\x68\xd3\xbf\x86\x23\x04\x19\x0e\xd0\x4f\x0d\xba\xb7\x5f\xe4\x63\x0f\xe2\xff\x2d\x18\x3c\xed\x11\x59\x03\x84\x2e\x6c\x5b\xd9\xff\xbc\x8e\xd0\x24\x34\xcc\xcb\x46\xb4\xee\x88\x98\x54\x24\xfa\x16\x81\xdb\x35\x2c\xcd\xae\x88\xb9\xe9\xbc\x33\x71\x6d\x14\x92\x03\xbd\xfe\x79\xbd\xda\xbb\x96\x56\xc0\x2d\xb8\x09\x5a\x6f\xad\xf1\x76\x39\xf6\x01\xbf\x0c\x3e\xdc\x7e\x35\x92\x4e\x80\x5c\xf1\x73\x4e\xed\x5d\xd9\x59\x76\xb4\x10\x9c\x73\xf6\x2f\xf5\xc7\xd4\x87\x2a\x57\x78\xb2\xc0\x23\x1b\xa4\x27\x27\xae\x2b\x87\xbf\x46\x5e\xc9\x47\xb0\x32\x49\xed\x25\xac\x0b\xfa\x0f\x39\x49\xf1\x67\x73\x33\x1b\x16\xfd\x0c\x63\xd4\x5b\x3c\xfa\x3e\xbe\xf0\xde\x0d\xb2\x05\x2e\xef\xf3\x2f\x51\x78\xcd\xf5\xda\x7f\x68\xb4\x26\x18\xea\x00\x38\xc8\x9a\x70\x41\xed\x6f\xcc\x7e\xa2\xb7\xf0\x81\xdd\x83\xc4\x7f\xab\x2d\xee\x96\xb0\x67\xe4\xee\x0c\xe4\x63\x5d\x90\xe7\x25\x0d\x44\xd9\xb1\x61\xa8\x50\x82\x6d\x00\x52\xa4\x06\x59\x8a\x04\x7b\x4b\x74\xf5\xf0\x2b\xe0\xac\xd2\x10\x9e\xe0\xbd\x6f\x3e\x10\xec\x8c\xad\x81\x43\xca\xb5\xf9\x91\x20\x42\x56\x2c\xfc\xf2\xbe\xc5\xf3\xaf\x31\xb8\x19\xb4\x0f\xca\x3b\x23\x7e\x0a\x08\x0c\x61\x9d\x77\x96\x33\x2c\x69\xc9\xe2\x43\xd4\x31\x51\x6f\x34\x5a\xf9\xa2\x1d\x77\x60\x11\x32\x7c\x36\x97\x59\xd2\x5c\x4e\xb1\x90\xcf\x9f\x34\xf3\x6c\x64\x46\x0f\xfe\xe1\x20\xd4\x6d\x27\xfd\xad\xf8\x1a\x19\xbe\x03\xee\x40\x92\x5b\x76\x39\x70\x17\x96\xc2\x67\x56\xf7\x04\x97\xab\x5f\x46\x1c\x0f\x9a\x94\xcf\x3c\x3c\x33\xcb\x36\x00\xe1\x44\x47\xcf\xf8\x3f\x29\xfc\x6b\x9b\x46\x07\xd0\xaa\x9f\x41\x36\x70\x7a\xdd\x71\x16\xdf\xd5\xe3\xa8\x73\x9c\xc3\x30\xb9\x1d\x46\xc6\x8b\xda\x25\xfa\xe1\xa2\x73\x20\x8b\xcb\x8f\x21\x47\x3c\x5a\x6a\x0e\x54\x01\x4e\x94\x70\x16\x7d\x99\xcf\x96\x28\x34\x33\xf7\xf4\x80\xd1\x8c\x70\xe9\xff\xc4\xea\x47\x3a\x0b\x07\x32\x86\x07\x67\xec\x52\x22\x32\x4f\xd0\x83\x66\xbb\x04\xaa\x8b\x3b\xd8\x4e\xb2\xc8\xb3\x01\x17\x95\xc3\x23\x4e\xfc\x21\xb9\xfd\xdf\x9f\xab\xf0\x91\x15\xd7\x73\xe4\x2e\x14\x08\x89\x14\xff\x77\xe4\x61\x61\x38\xd3\x0e\xf7\x25\xb1\xf9\xa1\x12\x55\x6e\xd2\x07\x30\x4b\x3e\xeb\xea\x85\x2e\x62\xe8\x42\x05\xfa\xaf\x36\x8b\x93\xbc\xf0\x56\xb8\x75\x64\xde\x06\x6a\x59\xe6\x68\xe1\x97\x69\x73\xa0\xe4\x04\x47\x1a\x93\xc4\x0a\xd1\x06\xb0\xad\x31\x0f\x52\x19\x15\xa8\xe7\x5c\x71\x80\xeb\xdc\x41\xf2\x75\x56\xe9\x6a\x8b\x0e\x4d\x4e\xb8\x4f\x2a\x70\xf8\xb8\x09\x74\xe0\x54\xe6\x37\xbb\x7f\x04\x96\xec\xa4\x83\xef\x25\x20\xd5\x3d\x30\xea\xdd\x56\x2d\xc5\x40\xf3\x02\x86\xf5\xc9\xac\x54\x15\x2b\x83\xd8\x84\xdd\xb3\x56\x4d\x9a\xf6\xca\x24\xc5\x5b\x5e\x04\xd9\xd9\x7e\xdf\x43\xba\xe1\xba\x04\xd1\xcd\xdb\x66\x1c\xd0\x3a\xd5\x06\xb6\xf3\xcd\x36\x79\xf9\xb8\xdc\x04\xba\x43\x35\x6b\x55\x36\x97\x6c\x80\x99\x9d\x40\xdf\x79\xd7\x9e\xce\x15\x07\x6b\x03\xcc\x19\x54\xb6\xcd\x7f\x40\x43\x03\x30\x8f\x7c\x24\x60\xe7\x6b\x28\x0f\xa6\x97\x40\x73\x44\x1e\x3d\x88\xa7\xf3\x61\xf6\x70\xc2\x33\x4e\xb5\xa6\x3a\x61\x8a\xd8\xa2\x2c\x18\xdd\xb6\x5e\x02\xca\xdf\x32\x23\xe9\x8f\x29\x49\xd8\x81\xd4\x25\x78\x75\x73\xe8\x19\x16\x3e\x04\x3a\x44\x44\xdd\x6a\x69\x3e\x70\x9c\x77\xd1\x71\xa1\x2d\xb0\x47\xf2\x7e\x8f\x48\xe5\xcb\x3e\x59\x46\xd2\xfb\x77\x17\x20\xaf\x1d\x26\x00\x77\x31\xa6\xa4\x31\x10\x8c\xaf\x20\x45\x84\x4b\xcf\xf2\x79\x49\xe7\xcf\x1a\x45\xe1\xd9\xd8\xaf\x13\x1f\x57\x52\xd3\x1e\xe6\x9c\xf0\x3c\x39\x53\x66\x22\xf4\xc1\x98\xa4\x9d\x7b\xeb\xf5\x67\xa2\xbb\xd6\x5e\x1a\xa0\xb5\xf4\xb3\xba\xf2\x6b\xe1\xea\x42\x66\x7e\xb8\xf5\x8a\xf8\x3f\xcb\x07\x6c\x9d\x25\xd8\x07\xb2\x44\xe6\x3b\xa6\xcc\x60\xba\xc7\xa4\xb9\x02\x56\x1c\x5a\xf0\xb4\x20\xb2\x15\x4c\x43\x31\xf4\xbf\x04\xcf\xf7\x24\x40\x7d\xfe\x07\x45\x8f\xc2\xc8\x26\xd6\xdc\x55\x71\xee\xbf\x11\xaf\x14\xbc\xe2\x35\x85\x8f\xb0\x4e\x69\x06\x2a\x91\x2d\x8f\x71\x7b\x41\x7c\xd5\x1c\x48\x61\x03\xe8\x29\xc0\xf7\x63\xca\x8d\xd5\xaf\x3b\xb7\x23\x12\x9a\x20\xca\x78\x00\x6d\x77\x13\xea\xa5\xb6\xdc\x69\xdb\xa0\x6d\x51\xcd\x2e\x70\x21\x0f\x28\x9d\x77\x17\xd5\xb1\x0b\x1c\xb4\x79\x94\xab\x4a\x84\x35\x81\xc0\x42\x08\x7d\x0e\x6f\x15\xef\x72\x2f\x3b\xd2\x8f\x7f\x9a\x87\x05\x7d\x42\xbf\x03\x70\x44\x84\x58\xdf\x21\x5c\x5a\xe6\xe6\x32\x0c\x40\xbd\x85\x5c\x87\x9d\x71\x8b\x84\x5d\x66\x2d\xc0\x70\x68\x09\x13\x62\x51\x05\x90\xad\xda\xa2\xac\x27\xde\x92\xce\x20\xe5\xdb\x2e\x2f\x18\xf9\xdb\x41\xc4\x7d\x8b\x34\xec\xc4\x8d\xc1\x22\xed\xc3\x92\xec\xc5\x83\xb5\xaf\x78\xed\xc4\x4f\xfc\xa7\x44\x92\xbf\x1a\xe4\x91\xbf\xf2\xd9\x79\x0c\xe0\xf7\x2f\xd2\xd7\xfe\xb2\xd2\xdb\xe8\x78\x3c\x13\xaf\x77\x8f\x62\x3f\x7f\x6c\x96\xc8\x6c\x96\xfe\x25\x7b\x00\x6e\xb2\x69\x87\x27\x08\x4c\x48\xfd\x06\x08\x3a\x75\x16\xcf\x07\x4f\x19\xf8\x96\x29\x34\x7a\xfa\xfc\x8c\x62\xea\x26\xd6\xc5\x54\x7c\xb1\x98\x6c\xab\x21\x50\x7d\x4f\x93\x5f\x62\xee\x0b\xf3\xc3\xdc\x87\x50\xc1\x60\xdc\xec\x60\x56\x55\xb1\x30\x51\xa6\x23\xcc\x1d\x64\xc8\x69\x8e\x08\xe4\xa9\xe5\xb6\x4d\xe1\x12\x36\xcd\x71\x57\x17\x59\xdb\x2f\xf1\xf3\xf9\x0f\xb3\xdc\x76\x1c\x92\x0f\xbe\xfe\x16\x24\x78\x26\xf2\x5c\xbf\xa1\x1e\x1b\x2c\x4d\x8e\xbc\x37\x60\x1f\x4b\x74\x7e\xed\x87\xa7\x90\x06\xe8\x62\x9a\x52\x15\x65\x3e\x44\x31\x13\xe8\x72\x57\x80\xf1\x77\x1b\x5d\x53\x3b\x47\x01\xd8\x7f\x22\xc2\xea\x94\xa7\xc9\x94\x44\xe1\xdf\x24\x9e\x9e\xd2\x38\xaa\x09\x02\x97\x46\xc9\x61\xa6\x14\xb3\xc4\x94\x06\x7d\x7a\x6c\x64\x17\x2e\xae\x63\x0d\x03\x5e\x8c\x66\xec\x5c\x69\x48\x73\x4f\xad\x95\xe4\x52\xff\xdc\xd8\xfc\x22\xe4\xa3\xb9\x4a\xd0\xbe\x82\xa3\x44\xe2\xbe\x5d\x75\xc4\xef\x73\xeb\xde\x38\x9b\x1f\x47\x06\xf7\x8e\xa5\x85\x68\x8f\x56\x60\x94\xa0\xe1\x17\xa4\xc1\x73\x40\xc6\xdc\x08\xba\x90\xe6\x53\x97\x6d\xf0\x39\xf3\x7a\xa9\x10\xf0\x8c\xf0\x91\xfd\x82\x79\x5d\xf4\x1d\x8e\xb3\xe2\xc9\x67\x24\x25\x73\x8f\x0b\x7b\x67\xf6\x03\x9c\x66\xe0\x6f\x35\x5f\xd1\x0f\x38\x15\xef\x3a\x26\xc1\x6b\x28\x25\x55\x38\x8e\x58\x13\x06\x82\xfe\x6e\xe8\xcc\x07\x62\xfe\xfc\x70\xb4\xce\xea\x19\xfc\x93\xd4\x3a\xda\x05\x4c\xc3\x9b\x33\x12\x44\x9f\x60\xa2\x13\x40\xaf\xea\x49\x3c\x4f\x6f\x75\x3f\x4f\xb5\x19\x40\x00\x8f\xec\x7a\xf8\xe2\xf0\x24\x8e\x80\x98\xe7\x1a\xad\x60\x1b\x69\xf3\xf0\xa4\x3c\xfb\x39\x87\x55\xcd\xb3\x31\xc7\x9e\x12\x2b\x38\xb5\xdf\xbf\x23\x1b\xf6\x22\xf9\xd3\x2f\xa7\x29\xaf\x6d\x11\x90\x67\x74\xfa\xe6\x25\x9c\x73\xe4\x2d\x9d\xe6\x80\xf9\xf3\x9b\xb4\x7c\x4f\x8a\x21\x5c\x7f\x7b\xa9\xed\x80\xfc\xda\xb0\x04\xec\xd1\x9e\x64\xf7\xe7\x8e\xc8\xfd\x70\xf2\xed\xb8\x37\xe9\xc3\xc1\xfa\xdc\x97\xad\xf3\xa1\x0b\x8b\x91\x0f\xe8\x5e\x34\xf6\x2a\xa4\x1d\x0f\xf5\xfa\x41\xc2\x1e\x43\xce\xbd\xb7\x0d\xcb\x11\x3c\xff\xa7\x20\xff\x7d\xd4\x71\x50\xc2\xd7\x2f\xcf\x7e\xa8\x5d\x1c\x23\x6e\x4a\xae\x4b\x03\x0a\x94\x88\x37\x1b\xce\xe8\xcb\x0d\xf8\xc9\x68\xf2\x34\x94\x4b\x36\xeb\x43\x69\x5d\x85\x42\xbd\xd0\x50\x14\xe7\xe0\x44\x5b\x1a\xe2\xfc\x92\x1d\x86\xe2\x3d\x96\xa1\x65\xa9\xc1\xcc\x67\x8f\x51\xb4\x1a\xac\x88\xe1\x13\x63\x87\x3f\x80\xcf\xde\x47\x3b\x61\xd7\x40\x6d\x88\x0c\x49\x81\x77\x2e\x40\x78\x61\x7f\xa0\xa5\x8c\xe5\xdd\x4d\xf9\x87\xfc\xb3\x03\xda\x0a\x9f\xb6\x25\x35\x15\xc6\xb9\x0e\x64\x77\x23\x41\xc1\x0f\x48\xa6\xe0\x3e\x68\xd0\x36\x74\x08\x8b\x6c\xa5\x22\xf6\xf5\x06\x95\x9b\x68\x7e\xbd\x66\x05\xcf\xf5\xf5\x9f\xec\x76\x68\xb4\xd8\x37\xf8\x48\x6b\x50\xaf\xa2\x96\x82\xf2\x3e\xfa\x93\xd6\x4d\x3d\xbe\xe7\xd0\x26\xa4\x83\x1d\x85\x37\x3f\x61\x5f\xea\x41\x8d\x40\x0d\x17\x8c\xbe\xdc\x6c\x2b\xdc\x7b\xa1\x51\x35\x7e\x88\x59\x0e\xda\x87\x3a\x0b\xfb\x05\x76\x17\x5f\xcb\xde\x0a\x5f\x4b\x6a\x69\xec\x66\xce\x78\x31\xca\x16\x6c\xda\x08\xdd\x03\x82\x5b\x7d\x30\xe5\x4b\x9e\x04\x3d\xe7\xd8\x93\xc3\x41\xa0\x5f\x0f\x21\x94\xe0\xeb\xde\x76\x4d\x6b\x34\x1b\xce\x4a\x6a\x24\xc6\xf3\xda\x6e\x0e\x59\x02\x64\x01\x74\xe0\x40\x10\xd9\x18\xb4\x83\x5e\xa9\xda\x2e\x11\xe0\xec\x09\x43\xa0\x70\xd6\x56\x26\x55\x9f\x0e\xf9\xf4\xda\xe8\x8c\x9b\x8e\xf9\xe7\x09\xc4\x6d\x7f\x1f\xa6\xfc\xbd\x1b\x58\xab\xbb\x31\x5b\xa5\x22\x73\x20\x3b\xad\xe4\x19\xb4\x22\x49\x8a\x0f\x98\x41\x45\xf1\x51\x18\xed\xd4\xab\xa7\xcd\x11\xa8\xd0\xd1\xa5\x38\x47\x4d\xb8\xe8\x7e\x38\x06\x6e\x4b\x58\x5a\x99\xfa\x5e\x3d\x9e\x98\x7c\xfe\xb7\x3a\x12\x55\xd4\x7b\x78\x77\x97\xb0\x0f\xda\x18\x68\x56\x42\x46\xa0\xfd\x31\x86\x6c\xec\x33\xe0\x2a\x06\xea\x73\x60\xef\xdb\xf4\x06\x59\xc6\x68\x5d\x63\x62\xb8\x71\x90\x8c\xc2\x13\x13\xd7\xd2\xe7\xd7\xec\x18\x66\xa9\x0b\xa2\x6d\x62\x7b\x26\x75\x3b\x3e\x8e\xae\xa2\xdb\x41\x3b\xa0\x4b\x2c\x28\x74\x3b\xd8\x38\xf1\xd0\x16\xfa\x5d\x17\x84\xc9\xcb\x1d\xb9\x53\x1b\xa7\xb8\x44\x30\x9a\x26\x91\x4e\x8c\x51\x98\x12\x79\x7d\x45\x31\x02\x9d\xb3\xba\xb5\x28\x9a\xa4\x8b\xec\xf9\x55\xf1\x6e\xc8\x63\x8b\x99\xa8\xc3\xee\x4c\x2f\x22\xd3\x8d\xce\x4d\x6b\xf4\xc1\x82\x24\x8b\xb6\x49\xba\xbe\xb1\x46\xba\x27\xb8\x1f\xa3\x4b\x94\x7f\xa4\xba\x0e\x93\x9b\x1f\xcf\xe8\x71\x00\x76\xfe\x63\x2b\x45\xc8\xa6\xdb\x85\x87\x6f\x51\xa4\x29\x76\xe9\x3f\xc4\x56\x49\x93\x70\xc7\xa9\xe0\xdb\x7f\x0e\x26\x29\x4c\xd0\x21\xd9\xba\xd0\x2e\xac\x0d\x5b\x81\x78\x81\x47\xb7\x33\x89\x30\xfd\x49\x1d\x13\x76\x2f\xea\x2d\x61\x41\x1c\xe5\xe6\x1d\x53\xa5\xaf\xbe\xd4\x14\x74\x21\x3a\x06\xd2\xe6\x2d\x0f\xa7\x8a\x3c\x3c\xa5\x8d\x17\x2b\xea\x8a\xe6\x65\xf4\x9a\x07\x6e\x6a\x90\xdc\xa6\x40\x38\x58\x04\x29\x49\xff\x29\x36\x42\xf2\xd8\x3a\xbe\xf0\x12\xad\xbf\xb4\x70\xf3\xe2\xd9\xfa\xfe\x4c\xe2\xc4\xc9\xa6\x00\xb6\x09\xd9\x45\xa1\x6c\x80\xea\xac\xd4\xc9\x4a\x0e\x3b\x73\x1e\xbb\xe2\x1c\x85\xaf\x67\xe4\xe3\x65\xbe\x48\x5f\xe5\x1e\x9f\x81\x70\x0f\x6f\xad\xf8\x72\xf9\x0d\x04\xf5\x9b\xe3\xe1\x1f\xac\x43\xaa\x48\x3e\x85\x22\x0e\x44\xbe\xf9\x91\x94\x6b\x88\x0e\x76\xba\x3b\xbe\x03\xcc\x78\x57\xf7\x2b\xf5\xee\x44\xa4\x93\xd8\x60\x20\xd3\x05\xbd\x97\x87\xf7\x56\xae\x35\xcb\xa3\xfc\x67\x61\xbe\x6e\x5c\xb2\xe1\xa1\x24\xa6\xef\x7b\x0e\xb3\x73\x79\xb6\x41\x29\xf0\x9e\x65\xb5\x14\x3b\x71\xef\xc9\xa8\x11\x32\xcd\x03\x17\x86\xb7\x1b\x48\x8a\x9c\xf8\x8e\xdc\x1a\x5c\xd9\xf2\x15\x87\xff\x22\x82\x5a\x39\xde\x43\x53\x90\xd5\x44\x4a\x9f\x70\x65\x72\xc1\x7f\x9c\xf3\xf0\xd6\xe2\xfd\x6b\xec\x3e\x64\xc7\xd4\x24\x05\x34\x90\x79\xa7\x1c\xf4\xe2\xd7\xfc\x9a\x59\xd6\xbf\x04\xe4\xb4\xd0\x7f\x2a\x02\xd8\x53\x41\xd6\xec\x83\x39\x74\xce\xdb\x78\x81\x6e\x77\x69\x60\x67\x2d\xbb\x2a\x67\xcb\xfc\xf7\x7c\x29\x8d\xcb\xef\x66\x3b\x5d\x68\x6d\xe6\xe3\xa0\x14\xfb\x1f\xdc\xdf\xbd\x64\xad\x85\xa3\xd6\x04\x06\xd6\xd9\xac\xa5\x3f\x92\xaf\x18\xe1\x54\x54\xe5\x4f\x78\x57\x6f\xbd\xdd\x95\xe1\x72\x30\x5d\x5a\x65\x46\xbe\x1d\xec\xcd\x60\x37\xe8\x0f\xb5\xef\x86\xec\xa7\x1b\xab\x27\x5b\x2e\xf0\x5e\x65\x1b\x86\x26\x2b\xf7\x5f\xe2\xbb\xbe\x23\x1a\x2f\x7c\x30\xef\xa9\x9e\x9b\xc2\xea\xe8\xef\x82\xc8\x9b\xca\x46\xec\x6d\xdb\xb2\x53\x36\xe8\x76\xdd\xf8\x07\xb8\x53\x78\x83\xdd\x12\xae\x5e\x9f\x9b\x42\xb6\xeb\x23\xa3\x6f\x88\x52\xe4\x1f\x64\xe7\x4e\x56\x0c\x12\x14\x08\x02\x12\x2f\xdb\xcc\x85\x02\xe4\xaa\xdb\x2e\x18\x3e\x1c\x05\x21\x37\xb8\xee\xe8\xb7\x9c\xc5\x89\x36\xde\x91\x09\x26\xfc\x0d\x1f\x4b\xf6\x69\x10\x85\x24\xe8\x16\x1d\x99\x8d\xc7\x79\x6f\x61\xb3\xfe\x57\x96\x35\x39\x1d\x99\xa2\x6d\x03\xe9\x41\x92\xb2\xe0\x0c\x89\x41\x38\x71\x1f\xf3\xa0\x4e\x0d\x1d\xe6\xae\xf2\x0e\xd4\xe2\x2a\x57\xa3\xb7\x5d\x45\x96\x02\xd0\x20\xb0\x0b\xb3\xca\x31\xd9\x46\x5a\x59\xae\xf2\xc7\xbb\xe0\x14\x1a\x1f\x5c\x51\xda\xd7\x4f\x77\x77\x15\x36\x7a\xaf\x55\x9f\xd9\x36\xb1\x31\x6d\x5f\x00\x21\xd8\x9b\x80\xd0\x87\xb8\xd3\x45\x44\xfb\xf2\xab\x96\x1d\x9d\x3c\x2a\x08\xe0\x9a\xbc\x0d\x7b\x81\x01\xc7\xce\xc3\xb4\xc0\x4f\xd4\x47\x79\x5e\x28\x43\x70\xc2\x78\x34\x72\x64\x8e\x85\x7e\x76\xb4\x8d\xa6\xa4\x47\x66\x71\x44\xd4\xca\x91\x85\x93\xf4\x1a\xe1\x78\x95\xd9\x5a\xc9\x43\x6c\xee\x2f\xab\x05\x28\x6e\xe8\x27\xca\xf7\x30\x88\x4e\x4c\x51\x77\xc6\xd6\xdd\xcc\xd1\x9e\x35\xd8\xc2\xcb\x8d\xb2\x82\xd6\xbb\xd9\x22\x1f\x30\xb3\x63\x44\xa3\x3d\xdb\xa8\xc8\xe2\x2b\x58\xbd\x57\xb2\x5a\xe3\x92\x65\xbb\xbb\x86\xca\xaf\x69\xff\x86\xfd\xd2\x4a\x65\x11\x2c\x99\xe2\x96\x79\xa0\x0a\x61\xe6\x4f\x9b\x26\x35\x64\x5a\x67\x26\x33\xd4\x2f\xf2\xf8\x2a\x01\x9a\xb3\xdc\xd3\x93\x84\x17\x0c\xff\x81\xa0\x60\x41\xf2\x8f\x57\x53\x90\x1d\xbc\x21\x23\xce\x1d\x6c\x9b\xee\xa2\x81\x3c\xd3\xcb\x2a\xc7\x26\x49\x05\x4a\x56\xba\x25\x2e\x80\x49\x36\xea\x85\x7a\x8c\xb3\x74\x55\x4a\x03\xbe\x03\xfb\xac\x2b\xbb\x20\xe4\x2b\xca\xe2\x3d\x43\xe2\x26\x4b\xf6\xd6\x6b\xca\xf0\x0d\xe0\x6d\xbb\x1e\xb6\xc9\xfa\x69\xe3\x65\x72\x46\x5e\x9b\x0d\xbc\x1b\xd5\xb8\xe4\x36\x8a\x57\x99\xa4\xc9\xb0\xdf\x4c\xef\x38\x29\x2c\x0e\x79\xb7\x4e\x79\x80\xb8\xc0\xaf\x52\xfb\x0e\x98\x2c\xf3\xbf\x1a\x2e\x44\x90\xb5\x5e\x6a\xb9\x90\x86\x7f\xda\xaa\x2a\xe5\xe3\xa1\x8b\xfe\xf0\xf6\x94\x3c\x9c\xf6\xdb\xc9\x03\x70\x86\x67\xd3\x03\x5e\x0c\x2f\x45\x05\xda\x67\x49\x4a\x29\x4c\x37\x61\x5f\x4c\xa0\x6c\x58\x94\x61\x29\x6f\x1a\x2a\xc1\x83\x98\x2a\x04\x38\x1a\xec\xd1\xac\xe1\x76\xca\x06\xd8\x47\xc8\xcc\xe9\xbe\x37\x8d\x50\x9e\x8d\xd1\xc4\x61\x8b\x63\x86\x24\x6c\xa7\x58\xa0\xd9\x29\x49\x6b\x80\x8d\x1a\x31\xae\xa3\x69\x4f\x61\x2f\x1f\xdd\x17\xf8\xe9\xf8\xa7\xcb\x6a\xe2\xa2\x27\xa9\x3d\xbb\x0d\xd7\x2d\xf2\x28\xed\xdf\xe6\x23\xeb\xbf\xe4\x17\x5f\x11\x46\xa5\x14\x3e\x64\xcd\xf0\x47\xfa\xfa\xb6\xf2\x48\xec\x4a\xa2\x51\xd3\x22\xfe\x61\x3d\xcf\xc3\xdc\x3a\x36\x4f\x72\xae\x50\x6c\xaa\x7b\x79\xc0\xa3\xac\xe3\x93\x57\x28\xeb\x38\x1c\xd3\x50\xe9\x24\xff\x9f\xb4\x09\xf6\x7d\xc7\xec\x84\x71\xcf\x28\x12\x70\x41\xd4\xb7\xf2\x3c\x45\x3a\xd4\x5f\x6e\xf2\x53\xb0\x79\xc3\xcf\x80\x2d\x36\x57\xfd\x42\xc7\xcc\x42\xf4\x60\xff\x48\xdf\xb9\x23\x7b\xcd\xdb\x2f\x58\xfc\x95\x73\xb1\x17\x85\x82\xec\x60\xe5\x7a\xb3\x25\xab\x26\xd8\x49\x86\xd8\x73\x6d\x62\xc5\xdd\x36\x1e\xab\x9a\x34\x62\xe7\x58\x01\xdd\xcf\x4e\x22\xdf\x69\x6f\x61\x27\x3b\xbf\x1e\xf5\x64\xce\x7f\xbc\xa1\xce\x63\xf2\x2e\x25\xbc\x05\xe4\x21\xb5\xdf\x21\xbd\xc0\xb8\x3e\xe9\x17\x14\x9e\xf5\x57\xfc\x71\x9e\xb4\xf4\x81\x20\x82\xa7\xc3\x66\x0b\xc0\x29\x6d\x85\x5d\xed\xbc\x17\xf6\x16\x6a\x46\xcc\x91\xbc\x09\xaf\x5a\x12\x26\xe0\xc4\x40\x26\x3f\x69\x3e\xdb\x3c\x7c\xb8\x97\x43\x53\x87\x56\x44\xb9\x46\x12\xe3\x75\x25\xdd\xb4\x7f\x69\xba\x44\xea\x29\x0c\x19\xe6\xc8\x40\xcc\x9a\xe9\xdc\x54\xea\x92\xd9\xbd\x9a\x55\x9a\xc2\xa1\xa3\x60\x33\x2a\x43\xab\xe5\x83\x14\x42\x88\x37\xe3\xde\x1e\x6a\x06\xa9\x47\xe3\x7d\xd5\x14\xfd\x20\x3c\xe4\x60\x6f\xe7\xf8\x65\xa6\x41\x83\xa1\x4e\xf8\xd6\x6f\xa9\xb9\xe1\xbb\x19\xbe\xc6\x88\x02\x64\x57\x67\xb1\x39\x26\x5c\xa4\x10\xe1\x43\xcd\x85\x9b\x5a\xbf\xce\xc4\xc7\x00\xb4\xd3\x80\x09\x6f\xe8\x1a\xd5\x55\x83\x41\xaf\x99\x5b\x88\x64\x95\x35\x2b\x44\x1c\xbb\x7a\x41\xde\x53\x8a\x07\xc4\x93\x3d\xfb\xaa\x75\x97\xc2\x1d\x66\x4b\x5f\x1d\x3f\xa1\xb8\xf8\xe8\x2d\x7a\x3a\xff\xdc\x46\x3e\xb0\x2b\xe9\x3f\x0d\xf2\x9b\x5d\x29\x5b\xd4\xb5\x65\x88\x40\x61\xb4\xa7\x66\x3e\x3e\x9c\xc0\x12\xba\x82\x72\xad\x3a\xa3\x75\x15\xdb\x03\x0c\x65\x5a\x85\x49\xfe\x8c\x7e\xd6\xbc\xeb\xe5\x1c\x10\xa4\xcc\x44\xed\x89\x2d\xfd\xe5\xcc\x00\x80\x49\xbe\x61\x36\x21\x77\xfa\xaf\x23\xb5\x37\x89\x4e\x28\x3e\x1c\xb2\x22\x01\x40\xa6\xf0\x56\xd1\x27\x2c\xd8\xd7\xaa\xa0\xca\xea\x9a\x63\x6f\x69\xd5\xac\x6c\x04\xb4\xc5\xd8\x78\x62\x02\xbf\xb7\xa8\xca\xdb\x9b\x42\x85\xf6\x51\x36\x75\xaa\x0f\x15\xd6\x84\x68\x84\x59\x7d\xcc\xdb\xc6\xe9\xee\x93\x47\x07\x58\xb5\x7b\xb3\xfd\xb9\x06\x40\xb6\xe6\x12\xdd\xcf\x96\x06\x6a\x83\x91\xa6\x1e\x6b\x5b\x93\x7c\xab\xc0\xae\xd8\xaf\xc5\xd5\x45\xa5\x09\xd1\x64\x95\x37\x55\x0d\x31\x09\x6c\x7c\x9a\x39\xd5\x2f\xd4\x13\x7c\x4a\x1e\xa9\xa7\xc0\x72\x50\x83\x66\xb0\x26\xe7\x17\x6b\x44\xb8\x7d\x75\x7b\xc8\x9b\x4f\x92\x27\xd6\xb3\x8a\xc7\x68\xc3\xdc\xe2\xb6\xd6\xd4\x17\xde\xbc\x7c\xd4\xa9\xaa\x07\xf3\x60\x97\xba\x7f\x23\xbf\x33\x4f\xb4\x9f\x52\x8e\x01\xc2\x3a\xdd\xfc\xea\x94\x19\xd4\xd9\xec\x2a\x97\x33\xbd\xf5\xfc\x33\x31\xbf\xca\x06\xf7\x42\xfd\xc9\x7d\xcb\x30\x78\x29\x8e\xc3\x2e\xc5\x67\x83\xa5\x44\x43\x0e\x01\xcb\xd2\xb7\x64\xed\x6c\xd8\x4a\x63\x13\x0d\xa5\x73\x14\x8f\xcb\x1f\x83\x36\xdb\xe3\xc0\xeb\x56\x1f\x8c\xff\xc3\x66\x8b\x32\xd1\x6a\x4a\x89\x09\xa1\x6a\x5a\x12\x3b\x50\x4b\xda\xce\x16\x49\x6a\xe7\x9e\x4b\x43\xfe\xca\x64\x13\x28\x5e\xe9\x6f\x5e\xd5\x9e\x92\xe7\x31\x66\x4e\xe9\x4a\xe4\xce\xca\x04\xcf\x4d\x41\x06\x91\x6c\xd0\x17\x4f\xbd\x9d\xa1\x53\xf3\x6f\x17\xdc\x94\x70\xe6\x9f\xed\x67\xe2\x0a\x09\x5b\x3b\x62\xad\x53\xfd\x70\xfa\x9c\xe0\x9e\x2d\xa3\x29\x02\x1a\x90\xa2\x94\xb0\x9e\x8a\xec\xcf\x8f\x7c\x97\xca\x19\xca\x94\xd2\x1a\x07\xa0\x23\xb5\x74\xcd\x72\xce\xf2\x0b\x98\xca\x11\x39\xdf\xce\x53\xd2\x40\x5c\x5b\x6c\x7c\x5b\xcf\xa9\x88\x6c\x3c\xd9\xf4\x39\xfd\xda\x5d\xd1\x03\x5b\x7d\x56\x86\x04\x05\x41\x3a\xa2\x01\xc1\x9e\xea\xe1\x4a\x14\x36\x8c\x64\xd1\xc3\x61\x68\x52\x00\xd8\xb0\x57\x66\xeb\xb5\xa2\x0e\x64\x18\xc4\x3c\xd1\x25\xac\xab\xd8\x21\xd3\x98\xa5\xe8\xe4\xa2\xa4\xd0\x2f\xa3\x73\x16\x6e\xdd\x68\x88\xa9\x89\x16\x6e\xcb\x53\x8e\x46\x86\xdb\x59\xb1\x05\xf6\x55\x73\xeb\x03\xe3\x04\x86\x35\x58\x69\x16\x91\xa4\xe8\x8a\x65\x8d\x28\x84\x81\x0b\x86\x5a\x5d\x67\xf8\xd9\x80\x6f\x36\xab\x47\x36\xd8\x94\xfc\xd1\x50\x8e\x58\x2d\x4d\xd6\x87\x8c\x47\xa5\x89\x93\x2c\xaf\xc4\x6a\x43\x96\x69\x68\x63\xd6\x2b\xde\xe0\x2f\x9c\xcd\xdb\x6c\x0f\x76\xd1\x28\x7d\x09\xd3\x29\x68\x3c\x16\x45\x3c\x9c\xbc\x45\x40\x07\xfc\xb0\x94\xd1\x00\x33\x15\x45\x9c\x16\xce\xe7\x9e\x70\x2a\x60\xc0\xc6\x1d\x0f\x91\x2d\x7a\x4a\x93\x72\xa6\x3f\xe1\xc4\xa3\x4d\x31\x91\xe8\x70\xd3\x26\x2b\x12\x67\x50\x45\xdb\x66\xee\x66\x4f\x7f\x2c\x83\x7a\x61\xab\x9d\x6c\xdc\x4f\xd8\xd0\x0b\x2a\x48\x1b\xd5\xe7\x1f\x95\x70\x3b\xce\x27\x21\xf6\x71\x6e\x4c\x65\xd8\x64\x85\x36\xa6\xb6\xe6\x98\x6e\x40\x47\x84\x3a\x19\x59\xb4\x61\x89\x88\x8e\x1c\x41\x0b\x2b\x78\x5a\xb3\xcb\xbb\xec\x60\x2d\xb3\x77\x75\xba\x8c\x41\x72\x17\x14\x5c\x33\x87\x23\xb1\xc6\x67\xc4\x6b\xa2\xf7\x30\xf3\x28\x42\xc8\xb3\xf0\x3c\xb7\x23\x70\x54\x1a\x50\x15\x7e\xd4\xe7\xea\xe7\xfc\x53\x88\x16\x2c\xb4\x6e\x76\xb4\x6c\xea\xf5\x7b\xb8\xcd\x71\x97\xac\x9d\x83\x9e\x45\x30\x45\x32\xda\x05\x3f\xc3\xca\xed\x99\x2b\x17\x8b\x67\xa4\x08\x3e\x33\x12\x23\xbd\x8a\x78\xe6\x34\x4a\x30\x93\x42\x15\x53\xe1\xef\x1a\xa5\xad\x6d\xfe\x5a\xb0\xc9\x33\xc2\x25\x9f\xda\x2b\xd9\xae\xfa\x25\xa1\x8c\x44\x6f\x4f\x59\x91\x64\xed\x9e\x7d\x65\xa3\xf3\x95\xdc\x76\xe0\x4d\xe8\xc7\x43\x18\x5b\x06\xb9\x96\x83\xe9\x64\x15\x65\x4b\x5e\x24\x56\xa8\xb7\x93\xff\x8d\x47\x70\x1b\x73\x5d\xc2\xb9\xc1\x76\x0a\x81\xc9\x83\x08\x66\x43\x3d\x63\xa0\xc6\x3a\xe5\x34\x3e\xd8\x56\x2f\xf3\x87\xaa\xa9\x62\x08\x4f\xd0\xa1\x86\x1b\xe6\xa0\x36\xf5\x50\xaa\x42\x2d\xce\xc0\x6b\xd1\x30\x9b\x0a\x1b\x66\x5b\x6c\xf1\x07\xba\x11\xfb\x48\xed\xe4\x61\x3e\xd0\xa2\xf0\xf6\x96\x95\x70\x6c\x94\x65\x66\x4e\xcc\x60\x7a\xb6\xf6\xd8\x51\xa4\x87\xb9\x40\xd3\xe5\xf2\x0b\x08\x8d\xb1\x16\x39\xfa\xc0\x68\x85\x85\xe6\xe6\x9c\x23\x3c\x76\x2d\xee\xcf\xc5\x3b\x18\x37\xcc\x8e\x9a\xad\x68\x61\xaa\x44\x7b\xae\x5e\x96\xe3\xf6\xd7\x0f\xfc\x1f\x32\x1d\xcb\xe1\xdb\xb5\x2b\x9c\x36\xb1\x69\x69\xf3\x1b\x8f\xe7\xc8\x6f\x87\x3b\x02\xbe\x7c\x62\xc6\xc0\xa0\x68\x12\x25\x99\xf7\x27\x59\x45\x1e\x2a\xab\x2e\x99\xfd\x46\xb2\x8f\x3a\x15\x03\xde\x23\x51\x58\x1d\x33\x25\xd4\xda\xd7\x2b\x1d\x0e\xf8\xc3\x6c\xb5\x15\x39\xb6\xb9\xe7\x16\x3b\x46\x85\xe2\x99\x12\x41\xc0\x9e\x8c\x41\xf1\xba\x0d\xc3\x7b\xeb\x64\x9b\x2c\xfe\x09\x4e\x9e\xa4\x76\xd9\x76\x90\xb1\x64\xc3\x4c\xcb\xb0\xb9\xaa\xeb\x05\xa2\xb0\xbf\x77\x6f\xbd\x3f\x42\xd8\xc3\xb7\x30\x95\xc4\xe6\xda\xec\x34\x45\x34\x47\xe4\x2b\x36\xa5\x17\x7b\x41\x7d\xba\xd5\xcd\xba\xd3\xfa\x8c\x4c\x8c\xeb\xd7\x64\xee\x9d\xf8\xad\x2b\xb4\xf7\x70\x51\x35\xce\xec\x97\x4e\xea\x9c\xad\x52\xfc\xc0\x41\x34\xee\xd7\x46\xc4\xb6\xea\x6a\x82\x85\x1d\x57\x18\x8f\x81\xe5\x42\x0a\x5a\xf7\x61\xd4\xeb\x87\x8d\x9a\x7a\xb7\x3e\x18\x55\x30\xf0\x38\xd8\xd5\x94\xf3\x00\x06\x79\x6e\xb5\xce\x89\xcd\xbd\x6c\x77\x54\x36\x55\x6a\x84\xab\xd9\xa8\xf0\x59\x72\x22\xed\xe8\x98\x16\x4d\xb3\x68\x6e\xd5\xfc\xff\x8b\xbc\xf5\x3f\xe6\x3b\xfa\x64\x8a\x99\xb0\x3d\x69\x4b\xc8\x98\xe1\x55\xe2\x50\x0f\xfa\x64\x6b\xeb\x8e\x45\x2f\x2c\xfa\xd8\x36\xd4\x01\xe8\x6a\xf0\x81\xba\xf2\x65\xcf\xab\xc4\xcc\xd6\x45\x08\x75\x67\x13\x6a\x24\xcc\xfe\x10\x10\xc8\x7d\x66\x1e\xc3\x55\xeb\x97\x75\xdf\x49\xaf\x0f\xa7\x2d\x7a\x89\xb5\x4e\x1a\xfe\xa1\x37\xb4\x3c\xf8\x42\x1d\xa9\x33\x52\x33\xf6\xa4\xce\x54\x17\xf6\xb3\x1d\xbe\xeb\x52\x9e\x1c\x22\x57\xff\x6a\x21\x1a\x76\x11\xd6\x96\x82\x3b\xec\xe1\xa4\xdd\x65\x9f\x82\xfe\xed\x64\xe5\x9f\x10\x28\x3c\xbb\xe0\xff\x46\x3d\x0f\x12\x25\x69\xa3\x75\x7d\xd4\xc7\x8a\xe4\x5f\x60\xd1\x6b\x69\x2e\x5b\x77\xe3\xf7\xc1\x86\x4b\xee\xa6\x1d\x38\x6f\x52\x0d\x59\x15\xf0\x95\x5f\xd7\xc6\x97\xfa\xb9\x85\x74\xb6\x99\x08\xbd\xd1\xba\x86\x49\x97\xc2\xcb\xba\x34\xb0\xb9\xd3\x14\xbe\x20\x15\x9f\x3c\xe6\x5f\xd6\xed\x7f\xea\x4a\xfd\x97\x57\x2a\x54\xdc\x24\x90\x92\xa2\x78\x22\x52\xfa\x71\x3c\xe6\x50\xc6\xd9\x8e\x58\x5d\xb7\xb4\x2f\xc4\x95\xd1\x32\x7b\xc5\x6d\xc3\x99\x65\xcb\x09\xcb\x00\x3f\x34\xef\x05\xd8\x23\xc5\x68\x53\x5c\xc8\xea\xaa\x57\x7f\x77\x6b\x96\x29\x05\xf3\x40\x38\x71\xa4\xf1\x54\x30\x08\xcd\x90\x93\xad\x7c\x89\x86\x32\xee\x6b\xa2\x0f\x61\x27\xea\xcb\x8f\x83\x7e\x81\x84\x6a\x96\xbf\xef\xf7\xb3\xfb\xff\xfa\x56\xce\xf2\xdf\x59\x06\x5c\x37\xb5\x9b\x5f\x02\x17\x5f\xf8\x91\x29\xc8\x17\xeb\x0c\xcf\xd3\x4f\xd1\x8a\xfe\xb1\x89\x58\x5f\xfa\x07\x5a\x34\x57\x09\xd9\x22\x68\xab\x96\xf7\x92\xca\xb4\xc2\xb6\xca\x87\x79\x65\x58\xf0\x1b\xc5\x3c\x8f\xd1\xe4\xda\xbf\x31\x58\x34\x68\x6c\xa3\x37\xd0\x53\xde\x06\xc2\x97\x63\x30\x6f\x70\xd1\xbc\x4f\x06\xc5\x91\x4f\x4b\x6f\x29\xb8\xdf\x3c\x27\xdf\x79\xee\x14\xdb\x2b\x1b\x28\xd7\x17\x71\x94\xde\xa7\x7d\x7a\xb6\x1c\xde\x52\x01\xbd\x71\xfd\xee\x11\x31\xc2\xe9\xfa\x9d\xb8\x0b\x7a\xd3\xa1\x94\xef\x82\x94\x5b\x98\x67\xa9\x2f\x66\xf3\xae\x3c\xe4\x5e\x25\xec\xb1\x61\x93\xc5\xfc\xdd\x59\xd1\x24\xab\x57\xa1\x2c\x88\xac\x9e\xfa\x9c\xf2\xc6\xc2\x4c\xfd\xb2\xf7\x1e\x42\x25\xd1\x22\x5e\x10\x3f\xb1\x79\x55\xaf\xd6\xdc\xb2\x33\x70\xfd\xa7\xed\x15\xfa\xc5\x97\x4d\xba\x73\xeb\x70\xf1\x18\x61\x9c\x2f\x21\x93\xf5\xfb\xf5\xef\x03\x1b\x0b\xff\x3d\x42\x4b\x59\xa3\x13\x6e\x5b\x5a\x52\xf6\x6e\x25\x0e\xde\x1e\x28\x43\xf1\x52\x73\x89\xbd\x91\x7f\xc0\xc7\x17\xcd\xba\x77\x21\xb6\x72\xcf\xfc\x09\xec\xe8\x93\xd3\x1d\x93\xd3\x3d\xcd\x08\x65\xf1\x3d\xfd\x8d\x70\x3e\x99\x03\xde\x61\xba\x7a\x2b\xb3\x37\x6c\xe1\xd0\x72\xef\xbf\x1f\xef\x53\xbc\x21\x32\x50\x6a\x6b\xe5\xb7\x89\xdd\x77\x6b\x41\x81\x73\xf4\x60\x83\x6a\x4f\xe1\x83\x55\x23\x0d\xd7\x8a\xf6\x2d\x9e\x84\x98\xa2\x48\xbb\xcd\xf4\x39\xb3\xc1\xdf\xb5\x24\x29\x85\x22\x1f\x24\x4b\xc2\x94\xb5\x41\xb5\x51\xb3\x7c\xb2\xe1\xd2\xdc\xb1\xf6\x60\xed\x60\x2c\x3a\xcd\x75\x2a\xfa\x16\x09\xb9\x7e\xc3\x91\x95\x74\x5b\xac\xc4\x27\x0e\xeb\x4d\x27\xbd\xe2\x2e\xdf\xdd\xab\xb9\x4c\x5c\x00\x4b\x9a\x60\x28\x52\xd8\xd1\x79\x8a\xde\x12\xdf\x31\xbc\x7e\x67\x0e\xc2\xf3\x6a\x68\xc7\x3d\x46\xc3\xfc\x3f\x36\x9b\xec\x7b\x08\xdd\x10\x85\xf2\xa8\x6f\x4b\x28\x89\x86\xa1\xfe\x7f\x54\x5d\xe9\x92\xb3\x3c\xaf\xbc\x97\xf9\x7d\x6e\xca\x80\x03\x0c\x8b\x79\x01\x27\x4f\x72\xf5\x47\xad\x6e\x39\xf3\x55\x4d\x15\x0a\x01\x86\xb0\x78\x91\x7a\x91\x0c\xd5\x9b\x47\x47\xca\x64\x55\xa4\x9e\xd3\xa2\x45\x15\xa7\x80\x53\x41\xd9\x4a\xd5\xa6\xac\x46\xfd\xca\x6d\x40\x7e\x61\x18\xc5\x32\x5f\x3f\xa1\xea\x7c\xc5\x1d\x00\xa8\xe5\xbc\x3f\xdf\x8f\x9c\xcf\x51\xd5\x8a\x41\xb8\x96\x40\xdd\x4a\x60\x64\xaf\x48\xdd\x31\x6f\x47\x4d\x6a\x0e\x05\x33\x4a\x5d\x29\x4c\xb1\x27\x49\x3d\xd6\x6d\x3f\x2b\x91\x38\xc8\x33\x1f\x2c\x41\x61\xf4\xd7\xd4\xae\x46\x45\x83\x0d\x95\x48\x32\x72\x1f\x5f\x46\x1b\x0b\x54\x84\x1c\xda\xe8\xfd\xd3\x5c\x44\xde\x89\xae\x1d\x5e\xc6\xf2\xe5\x3c\xb0\x66\xc5\xe4\xde\x95\x12\x39\x44\xfb\x4c\xae\x17\x26\xa7\xdf\xf2\x13\x2d\x44\xb2\xc7\x77\xdd\x77\xd1\x85\x64\x06\xbc\xed\xf2\xfa\x9d\xc2\x3f\x58\xfa\x57\xfd\x22\x6a\x34\xa0\x3d\x1b\xeb\xce\xe7\x2c\x4a\x1b\xca\x4d\x64\x0f\x39\x8c\xe5\xc1\x32\xd2\xbf\x93\xa3\xc3\x53\x0a\xd0\x67\x56\xa1\x2c\x53\x2d\x06\x2c\xc3\x07\x4b\x45\x48\x28\x90\x55\x94\x25\x6d\x6a\x01\xa6\xe7\x1e\x85\xfd\xc7\x2b\x7c\x45\x40\x12\xee\xcf\xd4\x6c\x44\xc8\x79\x82\x3b\xb6\x2f\xf7\xc1\xaf\x27\x34\xaf\xe6\x6f\x4d\x8a\x6e\xc6\xc9\x1e\xc4\x39\x02\x5f\xca\xcd\xef\xd4\x2c\xcd\x9a\x1d\x66\xf5\x30\xc7\x13\x73\xeb\x3f\x38\x39\x06\xa1\xe9\xa8\xbf\x85\x0a\x59\x20\x58\xa8\x98\x73\xba\x3a\x2e\x23\x9b\x35\xa9\x56\x35\x4a\x21\xab\x91\xa1\x0e\xbb\x16\x2c\x4a\x9d\xb7\x26\xfe\xd0\xc1\xe2\xaa\x03\x6a\x5c\x8c\x58\xd9\xb1\xe5\xaf\x1b\xd2\x1e\x65\x3b\xbc\x8a\x72\xac\x75\x50\x89\x2a\xaa\x56\x36\xcf\xaf\xd4\xad\x9a\x3f\x5a\x13\xe6\x67\x47\x60\x7d\x51\xa7\x3a\x25\x84\x35\x89\x61\xa4\xc4\x8d\x4d\xc6\x2e\x71\x26\x8f\x89\x3e\x47\xc8\xe4\xb3\x67\x3e\xb2\x9c\x54\xe0\xad\x28\x7c\x1e\xe5\xb1\x58\x8c\x3a\x1f\x51\x38\xca\x2e\xe6\xe5\xd1\x3e\x15\x8d\xc4\xed\x2d\x95\xa2\xd6\xba\x86\xc1\xc8\x93\x82\x06\x30\x4b\x66\x19\x0a\xcc\xcb\x59\xb6\xc9\xa7\x32\x33\xc7\x17\x3f\x07\x66\xd1\x2f\xcb\x50\xed\x5f\x84\x0d\xfa\x91\x7e\xfd\x60\xe5\x55\x2f\x74\x6a\x61\xb8\x80\xdc\x1c\x2b\x4c\x8e\xf6\x42\x10\xe8\x55\x97\x27\xd6\x64\xb6\x64\xcd\x42\xfc\xc3\xf0\x92\x74\x57\x0f\x31\x08\x92\x8b\x00\xa7\x8a\x6b\xb8\x7f\x05\xe8\xf6\xba\x1e\xae\xa5\x85\x51\xa4\xdf\x62\x2f\x55\xf9\x6b\xb7\x97\xb3\xa9\x75\x0d\xde\xaa\xed\x24\x75\x51\x9e\xeb\x27\xc4\xb9\x7c\x0b\x37\x2c\xf5\x40\x6e\x28\x98\x18\xb3\xf6\x85\x49\x91\x97\xb2\x00\xca\x20\xf3\x6a\x77\x1b\xe4\x81\xc9\xf6\xad\x5e\x3e\xd1\xda\x50\x41\xe5\x32\x95\x85\xd1\xc6\xfc\xed\x56\x6d\x3c\x29\x0e\xd2\x7e\xff\x2a\x94\x08\xb6\xdb\xa4\xb0\xcc\x60\x11\x6b\x60\x60\xa6\xa9\x78\x65\x03\xfa\x21\x97\x3e\xd6\xa3\x10\x34\x9e\x51\xfd\x4a\xfb\xfb\x1b\x0e\x3a\xc8\xcc\x89\xed\x46\xfc\xd1\xe6\x15\x56\x16\xb3\x6e\x39\xa3\x68\x14\x68\xc1\xaf\x44\x97\xa1\x01\x56\xe4\xa1\xee\x7c\xa5\xaf\x4d\x33\x6a\xe9\x3c\xd1\x2c\x6a\xc2\xd6\xc4\x3c\x36\x38\x25\xb0\x52\x85\x7c\x0f\x7f\x7f\x5e\x47\x3c\x2a\x52\x04\x6b\xbc\x18\x54\xb5\x5a\xdc\x3b\x1a\x8f\xa5\x28\x7b\xfe\x55\x7c\x82\x4a\x8f\xea\x48\x76\x63\x54\x82\xeb\x47\x78\x74\xa8\x94\xd2\x8f\x73\xd7\x85\x64\x98\xb5\xd6\xb2\x52\x41\x82\x44\x3b\xda\xb4\xfa\x8c\xca\x56\x8f\x24\x67\x14\xbf\x80\x23\x53\x0d\xa7\x87\xb7\x63\xf3\x50\x01\x4c\x53\x3c\xa4\xb7\x0a\x36\xff\x82\xb2\xf4\x8a\x42\x93\xfd\x03\x55\xbd\x5c\xcf\x3a\x56\x5b\xac\x62\xcf\x7d\x55\xf9\x34\x6d\xe9\x62\xbd\xd6\xcd\xa0\xb9\x24\x31\x03\x81\xf8\x51\x71\x8e\x98\xde\x68\x9b\x7e\x66\x07\xcb\xd0\x83\xbd\x95\x3a\xad\x9b\x7a\x87\x63\x74\x78\xb3\xec\x32\x5e\xf1\xec\xb0\x6b\x39\xfe\xb0\xec\x94\x54\x0a\x5b\x51\x9c\x66\x24\x38\x38\x6a\x51\x34\xe6\xd8\x52\x0f\x35\x38\x86\xcc\x4c\xac\xe1\xc2\xbb\x72\x32\xbe\x56\xb4\x26\x3e\x38\x5d\xab\xf2\x58\xa8\x36\x51\x11\x0c\x6d\xa4\x17\xa7\x00\xf2\x94\x42\x99\x3d\xf7\xd1\xfb\x43\xa4\x4c\xd6\x23\x45\xbe\xcd\x6b\xf9\x22\xa4\x31\x16\x3a\x09\xf1\x5b\x9b\xe2\x13\x74\x26\x58\x81\x77\x7a\xa1\xd7\x76\x9c\xcd\x75\xf0\xe5\x5e\x23\xab\xb8\xce\x9a\xc3\xc3\x6b\xe5\x12\xed\x2b\x77\x41\xbb\x0a\x55\x35\x14\xb1\x52\x44\x2a\x77\xe5\xa7\x9c\xb4\x91\xd8\xe2\x32\x8a\x8d\x2b\x11\x9d\xfe\xff\x9d\x49\x2d\xd2\xd7\xe5\xb0\x0f\x3b\x8b\xf0\xbd\x16\x45\x7c\x95\x00\xaf\xbd\x91\xb4\xde\x5a\xe9\x5d\x1b\x76\x2c\x4e\xfe\xe1\x86\x8f\x1c\xbf\x27\x4b\x6c\x77\xcd\x29\x4a\x68\xd1\x9a\x59\xb4\x85\x2d\xf6\x47\x95\xad\xe7\x5c\xa2\x92\xbf\xe2\x21\x54\x0d\x2d\xc4\xd8\x6c\x12\xc0\xc2\x98\x2e\x42\x0a\x77\x98\x10\x77\x5c\xc3\x76\x6a\xa5\x26\xb4\xb7\xbd\x78\x27\x58\x23\x93\x25\x30\xea\x66\x57\x69\x15\xb4\x1f\x71\xc7\xe2\xbb\x50\x75\x4b\x23\x9d\x71\xec\x21\xaa\xbb\x20\xaf\xb0\x89\x41\xeb\x73\x33\x96\x27\x4e\xea\x08\x22\x59\x53\x5a\x3c\x31\x0e\x85\x26\x5f\x64\xc1\x5e\x60\x18\xc3\x82\xd7\xe9\xbe\x17\x0b\xec\x85\xf9\xb9\xb0\x78\xf6\xad\xac\xe5\xca\x0e\x75\x29\x4f\x82\x32\x97\x72\x7c\xcb\x57\x45\xea\x8c\xa0\xa2\x91\x40\xb9\x48\x30\x64\x89\x14\x1b\x1c\x61\xd4\x13\x2d\xf2\xe6\x5b\xbc\x4e\xf1\xe3\x22\x6d\x7d\xb0\xc7\xce\x2b\xd4\x63\x16\xc7\x55\xb0\xaa\x26\xf9\xa4\x25\xcc\x7e\x97\x1c\xf5\xb6\xed\x58\x65\x14\x83\xbe\x29\x34\x18\xed\x8d\x6e\xac\xb6\x9c\x48\x30\x8b\x0d\x31\x55\x67\x21\x6e\x23\xba\xfe\xb7\xde\xac\x03\x39\xc3\xec\x24\x55\x2c\xb4\x5e\x7e\x53\xc3\xb8\xfd\x26\x9a\x2e\xcf\xd7\xe2\xad\x38\x50\x88\x27\xa1\xdd\xf3\x42\xf1\x5a\x1b\xc7\x7a\xe5\xe4\xdd\x48\x56\x6f\x56\xa5\xa7\x7a\x25\x39\x87\x07\xcd\x02\x23\xed\x18\x8a\x4e\x35\x46\x05\x93\x84\x32\x26\xcf\x7b\x90\x0b\xf6\x26\xc9\x0c\xf9\xd2\x39\xaa\x6c\x61\x51\x8b\x2a\x9b\x2f\xc4\x38\x44\x01\xed\xe2\xb2\xa9\xac\x95\xb5\x15\xef\xd6\x21\xb7\xb0\x93\x34\x5c\xbc\x23\x10\xe3\xf5\x13\x83\x34\x65\xf3\x74\x19\x44\x00\x5b\x55\xac\xfb\x3a\xc5\x64\xa1\x8e\x5c\xc2\x36\x28\x58\x79\x18\x8f\xe0\x9c\x59\xeb\x2e\x65\xe2\x49\x32\xe3\x28\x8d\xbd\xa8\x1c\x3f\x49\x49\x74\x6a\xa4\xc4\x09\x98\x68\x1a\xb9\x5c\x61\x49\x8a\x82\x98\x0d\x62\x1f\xaa\x84\x85\x4c\xdc\x79\x8a\x21\x76\x1e\x5a\x0e\x73\xe8\xc5\xad\x34\x28\x5f\x57\x49\xbd\x01\xf1\xa0\xba\x56\x98\x48\x4d\xae\x0a\x19\x94\xb6\x14\x6c\xba\x94\x0e\x9a\x36\x8d\x55\x86\x56\xa3\x9b\x07\x8b\x77\x55\x49\xa0\x1f\x6b\x64\xcc\xc6\x3a\x48\xac\xed\x94\x71\xf3\x78\x42\xbd\x47\x91\x7e\x33\xa8\x62\x45\x72\x70\x59\xcf\xed\x78\x46\xb1\xc9\xba\x7c\x2f\x60\x95\x53\x2c\xb1\x73\xe4\x80\x75\x2c\xe5\x0a\xe6\x18\xd1\x33\xa3\xa4\x56\x00\xa6\x69\x59\x37\x74\xcd\x90\x37\xf3\x33\x03\x6a\x4b\x1d\x88\xc5\xc3\x4b\xa6\x31\xe8\x39\xfd\x90\xf3\x6a\xf7\x43\x6f\xe1\x88\x5b\x4b\xa2\x98\x3a\x07\x97\x8b\x63\x95\x4b\x39\x77\x15\xc7\xa8\x25\x77\x4b\xb4\x66\x4c\x41\x6f\x01\x77\xac\x44\xa5\x2c\x82\xf0\x92\xb1\x57\x49\xa4\xcc\x31\xb2\xd1\x16\xb8\x90\xf6\x08\x86\x46\x94\xa1\xea\x1f\xd9\xfb\x50\xed\x94\x76\x8e\x2b\xc9\xb1\x86\x75\xfe\x29\xa5\xb1\x44\xa1\x72\x05\x2b\x69\x2f\x55\xd4\xaa\xda\x91\x07\xf0\x87\xe7\x38\xab\x72\x76\xaa\x24\x6d\xed\xe4\xa0\x60\xbe\xc8\x3d\xe3\x5c\xfe\x61\x43\x16\x96\xb3\xc0\xb4\x56\x8d\x13\x5e\x34\x28\x0d\xfb\xfa\xf9\x0a\xf9\xe1\x47\xe4\xa9\x1e\x73\xd8\xf0\xa2\xb0\xe6\x17\xec\x91\xd9\x79\x3e\x9c\x30\xa9\x3c\xcb\x03\x4f\x78\x50\xc1\x1f\x3e\x34\x61\x85\x0e\x30\x97\x29\xae\xa1\x97\xc8\x9c\x28\x76\x35\x73\xb9\x46\x24\x42\x81\x5a\xba\x39\x20\x68\xfa\x0d\xcc\x0b\x7f\x54\x5e\x06\x52\x0d\x72\x48\x45\x5a\x67\x18\xdc\x30\xa6\x8a\xb9\x5d\x22\xab\x22\x27\x9a\xb4\x0d\x95\xf2\x3c\x43\xdd\x91\x32\x24\xbd\x0c\x30\x45\x96\xb9\x64\x69\x3d\x54\xde\x01\x5b\xb2\xb2\x84\xe4\x3f\x8b\x64\xa0\xab\x88\x4e\xe6\x4d\x97\x8d\x7e\xd7\xc6\x17\x13\x72\x69\x28\x9b\x37\xa3\x43\x81\xa4\x57\xd1\x14\xd1\xcf\xc9\x57\xc3\x96\x9c\x3b\x07\xbb\x78\x98\xd7\xba\xae\x51\xf8\x8a\x4a\x97\x8f\x10\x3c\xba\x38\xa0\xb7\x60\x2f\x72\x7b\x85\xff\x4c\xbd\x59\xaa\x05\x87\xac\x4a\x82\xee\xec\xde\x9e\x76\xf1\x0f\x3b\xdb\x07\x6b\xff\x74\x0e\x39\xcc\xe9\x50\x2c\x0b\x26\xda\x2a\x99\xa8\x21\x10\x61\x43\xfe\xad\x32\x83\xf7\x9c\x26\xd7\x11\x93\x32\x40\x67\x88\x5f\xc9\xc9\x67\x80\x90\x07\xbf\xfa\xaa\xe2\xf5\x75\xe6\x77\x21\xeb\x62\x33\xe0\xeb\xad\x25\x37\x96\xbb\xea\x90\x5e\xbc\x0f\x78\x5a\x06\x71\xba\x86\xc6\x0c\x19\x42\x79\x78\x80\x06\x16\x03\x96\xf0\xfc\x94\x6d\x64\x21\x06\x55\x25\xc8\xce\x96\x60\x7c\x65\x86\x49\x7a\x28\xfd\x59\xe7\xe5\x9a\xe8\xc5\xe3\x55\xb8\xf0\x9c\x39\xa3\xc5\xe9\x31\x12\x78\x33\x78\x84\x7f\xce\x4c\x51\x91\xfe\xcc\xd6\xc7\x73\x96\xda\x17\x8d\xb3\x51\x88\xe3\xa4\xd2\x46\xb9\x36\xdf\x29\x32\xa7\x07\x1f\xc5\x9d\x01\xdc\xd1\x7e\xe7\xa6\xd1\x95\x48\x49\x4f\xc7\x2f\x5d\xd7\x3c\x72\xc8\xe8\xe8\x57\x11\x41\x7a\x52\xb1\x7a\xf8\x41\xb3\x32\x87\x4e\xcc\xbf\x41\xfd\xcd\x8f\x3f\x41\x96\x99\xc5\x39\x74\x32\x2c\x15\x42\x2b\x85\x92\x78\x13\x9b\x25\xd0\xdd\x7c\x09\xa3\x68\x52\xec\x6c\x30\xae\x72\x1b\xd2\x22\xfe\x0b\xf3\x10\x5c\xb2\x77\xbe\x23\x7c\x41\x9a\x51\x45\xba\x27\xac\x6c\x64\x4b\x6f\x5d\x01\x01\xb0\x20\xbc\xad\x73\x78\xe5\x9c\x7f\xab\x73\x5f\x42\xdf\xb7\xac\x62\xe1\x18\x72\x7d\xf8\x7f\x1f\x71\xda\x82\x8d\x97\xd6\x10\xc2\xf5\xe4\x8f\xbc\x7c\x6c\x1a\x91\x46\x9d\x11\x8d\x91\xc2\x97\xaa\x7b\x4f\xad\xa0\x17\x52\x7e\x6d\x49\x8f\x3b\xf8\xe9\xcc\x61\x94\xcf\xf1\xb2\x17\xf8\xa2\xfe\xd7\x26\x95\x80\x52\xc3\x82\x04\xe1\xf9\x6e\xb5\xba\xad\x15\xf0\xec\x14\xa8\x0c\x67\x61\x54\xef\xca\x15\x06\x86\x16\xeb\xd4\x41\x87\x53\x16\x17\x8a\x63\xd1\x95\xba\x8d\x7e\x44\xfb\xf5\x35\xcc\x91\x7f\x9e\x33\xe1\x32\x83\xf1\x8f\xb4\x5f\x14\xf8\x36\x11\x91\x3a\x38\x37\x35\x1b\x9e\x02\x99\x76\x0f\xae\x28\xfa\x9d\x55\xe5\xa7\xa6\x53\x23\x01\xa0\x8b\xe1\x18\x76\x3e\x45\xa6\xc5\x9d\x30\xbf\xce\x7e\xd3\x6f\x28\xaa\x6d\x58\x20\xf9\xbf\xf2\xf6\x7f\xa8\x6a\x57\xa3\xa0\xcd\x50\x90\xfd\x61\x59\x90\xdf\xc0\xad\x59\xba\x7e\x1f\x5e\xef\x4c\x51\x99\xae\x65\x8e\x9c\xa6\xc6\xaf\xc0\x43\x5c\xf5\x6d\xaf\xf3\x09\x9d\x2d\x0b\x9a\x7b\xcf\xba\x3b\x42\xb0\x73\xd0\x03\x2b\x82\x84\xb6\x41\x11\x90\xd5\x01\xd6\x0b\x95\xc4\xef\xb2\xa6\xc1\xac\xf7\x69\x1f\x8f\x19\x9c\x5f\xa3\x9d\x2e\xab\x6a\x68\xbd\x97\xa2\xfd\x29\x43\xfd\x0e\x25\x26\xd5\xf5\x00\x3b\x0c\x91\xc0\x60\xb8\x5d\x04\xcd\x27\xcc\xc8\xfd\x19\xb5\x48\xd2\x42\x4e\x73\xdb\xed\x76\xea\x26\xda\xb1\x59\x0e\x3c\xb7\xb0\x14\x77\xf3\x2f\xb6\xc3\xee\x58\x18\x08\x13\x7d\xf0\x4a\x9e\x2b\xe2\x7b\xef\x15\x80\x06\x2f\xee\x09\x77\xee\x56\x9a\x7e\xd4\x0d\x49\x3a\xb2\x56\x41\x8f\xe3\x41\x21\x81\x8c\xe1\x35\xeb\x7a\xf2\xf9\x59\xd9\x3f\x24\x70\xc4\x3c\x6d\x9b\x5c\xca\x17\x41\xf6\x04\xb7\x4c\x7a\xfa\x5e\xd7\x28\x75\x83\xe0\x00\x89\xa5\x8f\xcf\x8b\xed\xef\xa7\x62\x1c\x86\x60\x3e\x9b\xa4\xe0\xc8\x8b\xf8\x99\xdd\x34\xc3\xa5\x08\x91\xd8\xf7\x13\xfa\x10\xc7\xfe\xc9\xec\x22\x3f\xe9\x9d\x7a\x5f\x9e\x01\xc5\x26\x2b\x8e\x02\x3c\x28\xf5\x71\x96\xf5\x92\xe9\x3c\xac\x74\x82\xf2\xc6\x5f\x83\xa1\xf5\xc9\x1a\xe0\x3a\x90\xd0\xc6\xd9\x17\x96\xe2\xa1\x79\xb3\x44\x0d\xc1\x79\x97\x1d\x8a\x45\xb1\x2a\xa0\x6f\xa2\xbb\x79\x38\xcd\x41\x51\xa5\x02\x21\xc9\x75\x6e\xce\xe1\x49\xec\xd7\x14\xf3\xf7\x97\xad\x08\xbe\xdb\xfe\x91\xec\x20\xeb\x80\xae\x28\x28\xae\x1c\x35\x9d\x5f\x8d\x75\xf3\x92\x97\x95\x93\xd9\x54\xf2\x1b\x64\x3b\x53\xf6\x53\x43\x10\xba\xe2\x78\x35\xae\x50\x64\x08\x39\x4e\x1b\xe8\xb4\x12\xdf\x2a\xcb\x1b\x0b\xfb\x59\xe4\xb6\xbb\xaa\x5f\x50\xcc\xa8\x69\x0c\xae\xac\xc0\x58\x34\x15\xc9\x99\xbb\xd3\xcd\xa7\x85\x52\x57\x64\xcd\x8f\x26\x4b\xaa\xff\x45\x96\xe3\x09\x73\xc9\xbc\x44\xd4\x75\xda\x01\xa5\xbd\x9e\xd5\xc3\x55\xcc\x3a\x62\x90\xaa\xbd\x5c\x7e\xc3\xea\x71\x4d\x5e\xae\xaa\xdb\x63\x25\xa0\xf0\xbe\xea\x2f\x59\x6e\x6f\xd2\xa0\x6e\x78\x4b\x15\x06\x4d\xb7\xe7\xb6\xbe\xca\x5f\x2c\xe8\x13\x0a\x86\x7c\x17\x15\x10\x61\xa8\x3e\xee\xe2\xc5\x9d\xb1\x4c\x92\x28\x6c\x8d\xde\x5d\x36\x19\xee\x5c\xa1\xd3\x7a\xcf\xfb\xd2\xa2\x41\x41\xbf\xec\x85\x51\x27\xdc\x12\x22\xea\x18\xbb\x0f\x5e\x7b\x55\xd1\x45\x6e\x51\x9a\xbd\xa7\x50\xf1\xf5\x88\x23\x39\x7b\x08\x2a\x59\xa1\x37\xa6\xee\xfc\xc5\x79\x94\xcd\xcb\x0d\x8c\x99\x5a\xe2\x3b\x55\x65\x93\xee\x3f\x6e\x53\x77\x6a\xbc\x3b\x4f\xb2\xf5\x5c\xd9\x15\x56\xee\xaf\xf7\xa1\x7a\xd4\x5b\xff\xfb\x7a\x69\x90\x78\xd9\x93\x1f\x25\x0a\x1b\xf1\x0c\x51\xfa\x0a\x12\xd0\x55\x4f\xa7\xcc\x50\x02\xb1\x79\xe0\x54\xca\x82\x5d\x75\x1c\xb4\x42\x35\xbe\x2a\xeb\x5c\xf0\xe3\x5b\x09\xb4\x1c\x8a\x40\x95\x09\x4d\x28\x62\x45\xc9\xbc\x73\x09\x49\xed\x96\x42\xbc\xfa\xba\x09\xe5\xf5\xd3\xbc\xed\x26\x53\x52\x0f\x51\xcf\xe0\x11\x47\xb2\x2b\x25\x01\x3d\xb2\xfb\x82\xd0\x37\xad\xe1\x1e\xe4\xd4\x3e\x11\x08\xb3\x38\x58\xfc\xe4\x16\xa8\x2a\x9d\xae\xc1\xf6\x3a\xce\x34\xba\x5e\xc8\x75\xb0\x9d\xb9\x8e\xf9\xab\xba\xc8\x3a\xdb\x91\x50\x32\xe6\x19\x1c\xaa\x71\x5b\x80\x41\x80\x7f\x5f\x9a\xd3\x8f\x18\x5b\x2e\xc1\xc8\x13\xda\xf3\x3a\x9e\x52\x5c\xdc\xb3\xc6\x2a\xd7\x46\x08\xe4\xb5\x8a\xe8\x8c\x1c\xf1\x22\x6b\xa6\xf9\xf4\x6a\xb4\xbd\x18\x71\xfd\xec\x15\xb9\x55\xb3\xd0\xeb\x82\xc7\x81\x68\x07\x9b\x8c\xbc\x36\x51\x13\xa1\x14\xc3\x65\x38\x28\xb9\x22\x0c\x9e\xbb\x6b\x3c\x45\xdb\x7b\xd0\x07\xe2\xca\x87\x26\xfb\x57\x16\xf8\x1a\x81\x7e\x5c\x4e\x8d\xba\x67\xc3\x65\xf1\x31\xad\x49\x71\x2a\x21\x4b\xa9\x3f\xdf\x2a\xaa\x7e\x3c\x3e\x09\x00\xe8\x7a\x8c\x51\x0d\x2d\x50\xcb\x0f\x99\x46\xe4\x0e\xd4\xae\x82\xc8\xd7\xd4\x22\xfb\xf6\x62\xb8\x24\xe3\xac\xa3\x20\xb5\x32\x86\x52\x62\xd5\xab\x61\x91\xf8\x06\x57\x9b\x8b\x5f\x40\xea\xdb\x88\x5a\x64\x3e\xbc\xbc\x0f\x5e\x2a\x60\x7c\x19\x70\xde\x77\x25\xe5\x30\xaf\x44\x52\xc4\x95\xbe\x44\xc5\x44\x9d\xe6\xf3\xed\xed\x96\x35\x41\x89\x54\x3f\x4d\x74\xa1\x72\x20\x22\x1f\xe6\x83\x51\x05\xd5\x15\x38\x69\x2b\x75\x16\xa9\x97\x82\xdf\xd7\x58\x7f\x5c\x6e\x7a\xed\xce\xf2\x2b\x66\x5c\xe9\x27\x6d\xdc\x79\x69\xf0\x47\xba\x8b\x34\xed\x29\xcc\x1f\x41\x30\x81\x5c\xbe\x9d\x7e\x4a\x08\x34\xed\x05\x64\x83\x15\xd8\xe8\xbb\xce\xb9\x4b\x2c\xae\x3e\xc3\x3b\xc8\xcd\xe2\x7e\x58\x5d\x95\x9c\xc3\x99\xc3\x0f\x28\x13\xb5\x0a\x87\x50\x99\x01\xdd\x4c\xfe\x41\xbe\xe3\xc3\x7a\x6a\x28\x7a\x9d\xcd\x30\xe0\x4c\xa4\xa1\x9c\x32\x65\x12\xdb\xe6\x4c\x54\x93\x4c\xfd\xc2\x01\xf9\x29\xc7\xa8\x13\xe2\xe4\xe1\xa6\x94\x3a\x07\xe1\xfd\x57\x9d\xc6\xef\x35\x3d\xe0\x3f\xbc\xca\x57\xf7\x41\x8c\xbf\x5b\x37\xf7\x80\xf2\x35\xe1\xcd\x70\x16\xaa\x77\x33\x19\x1a\x51\xf2\x65\xe9\xf4\x3d\x30\x8b\xe9\x9a\x8c\x2a\x95\xa2\xb2\x9a\x6e\x99\x08\xe9\xd9\x3c\xe0\xc1\xc1\x52\x28\xa0\x91\x94\x56\x64\x75\x1a\x96\x42\x49\x93\x37\x6b\x9c\xe7\x10\x65\x94\x1f\xbb\x3d\x95\x7d\x39\x58\x5f\x45\x77\xc2\x28\x7e\x13\x2a\xac\x89\x81\x3c\x57\xa0\xdd\xc8\xfd\xfa\x9e\xf3\x05\x94\x53\x43\xb2\xf1\xce\x8d\x11\x48\x12\xc9\x01\x2f\x32\x7e\x79\x42\x7b\x49\xc5\xd4\x18\x0c\x1d\xe8\x1a\x28\x4e\x99\x99\x03\x80\xb6\x6e\x33\x55\xca\x5f\x41\x9c\xa3\xbd\x15\x87\x3b\x47\xb3\xda\xba\x6b\x00\x77\x04\x3a\xcd\x02\x32\x20\xd9\xa2\x1e\x61\x24\x77\xa4\x41\x8f\x3b\xdc\x0b\x59\x84\xd3\xd0\xa0\x9c\xf1\xf2\xba\xda\x80\x73\xfe\xd0\x3d\x73\x29\x26\x1f\xb7\x5c\x60\xde\x8e\x60\x4a\x3e\xfd\x0f\xda\x26\x96\x34\xe6\xf0\xf2\x69\x79\x7d\x75\x19\x7d\x08\xe1\xdc\x7a\x91\xff\x9c\x6a\xba\x97\x51\x36\x47\x50\x0b\xf1\xd2\xe8\xdc\xb3\x7d\xb3\xa0\x57\xd1\xf4\xeb\x92\xb8\x43\x1e\x23\x92\xb4\xf6\x61\xcc\xd1\x78\xef\x9e\xf9\x8f\xff\x97\x45\x48\x01\x41\xf0\xd2\x92\x0b\x55\x76\x33\x67\x65\x40\xb1\x52\xb2\xb0\xba\x0d\x1d\x23\x5d\x60\x8b\x84\xc5\xdd\xc2\xa1\xd4\x02\x89\x3c\xd6\xfd\xad\x35\xd0\x47\x22\x89\xf0\x8e\x42\xab\x3d\x4a\x62\x07\xa2\x99\x6b\xd4\x43\xd7\x2d\xc2\xe5\x5f\x45\x24\x04\x16\xc1\x03\x91\xf6\xfc\x31\x4e\x7b\xab\xcd\x6e\xf5\x6c\x85\xda\x14\xdc\x43\x25\x1a\xb7\xd2\xea\xd4\xdb\x9a\xfb\x0f\x8b\x7b\xf3\x9b\xfd\xc5\x36\xdf\x91\xe5\x6f\x9a\x67\x5b\x7b\x9c\x11\x91\xd8\x88\x02\x60\xe8\x48\x4e\x59\x0c\x5a\x67\x66\x6f\x2c\xe6\x92\x51\x97\x75\x4b\x95\xc7\x72\x79\x49\x11\x02\x33\x69\xf5\x5b\xfe\x52\xd3\x32\xec\x68\x83\x8f\x98\x59\xe2\xdb\x90\xf5\xe6\x21\x42\x6e\x65\x8b\x77\x75\xcb\x83\x4d\xfe\x9d\xac\x99\x99\x1e\x01\x23\x51\x1b\x61\xf0\x10\x25\x62\x88\x51\x8a\xc3\xb7\x85\x90\x8a\x85\x59\xd5\xdb\x2d\x11\x25\xb4\xd9\x23\x24\x41\xcb\xb1\xbc\x9a\xe0\xa4\x3d\x1d\x8a\xe1\xfc\x4c\x9e\x65\x0f\xde\xa9\x8a\xc6\x48\xf4\x30\x08\xb3\xc5\xad\xef\xc4\x45\x14\x58\x6d\x4b\x6f\xbb\x69\x64\xea\xbd\x73\x15\x01\xf0\xaa\x2c\xac\x5e\x95\x95\xd3\xf6\x00\xa5\xf3\x13\x5c\xd3\xe4\xc8\xe3\xd0\xac\x54\x41\x04\xf5\x59\x6b\xe5\x1e\x3f\xdf\x0a\x6d\x23\x10\xda\x60\x18\x73\x52\x56\x50\xad\x2d\x50\x51\x96\x86\x25\x9b\x63\xc2\x3c\x08\x33\x65\x2f\x9f\xa9\xd0\x0c\xfd\x68\x56\x66\xa5\x69\x8d\x80\x2b\x6c\xa2\x16\x46\x50\xf6\xe1\x7f\x08\x97\xa9\x1f\x4a\xe3\x21\x72\x36\x03\x22\x60\xd0\xf7\xca\xf3\x29\x1a\x5c\x79\x4a\x87\x6d\x75\x70\xc1\x8f\x97\x4e\x3f\x3f\xaa\xa0\xb2\x3a\x69\x4f\xd8\xb7\xee\xea\x68\xe5\xe1\xfe\x09\x3e\x60\x29\x54\xcb\xdc\x9a\xaf\x54\xee\x58\x05\xb5\xbb\x7a\xe7\x08\xa7\xaf\x79\xe9\xea\x8a\xeb\x08\xf2\xeb\x5b\x6b\x95\x08\xbb\x47\xbe\x14\xa3\x0d\x0a\x9a\x2a\xbf\x7e\xfd\x6c\x90\x58\x3b\xf9\xed\xac\x3a\x6f\x34\x07\x00\x3d\x84\xa3\x54\x58\x01\xad\x10\xd4\xad\x1e\xa4\x8b\x75\xd8\xd4\xb4\x35\x85\xd2\x5a\x61\x4c\xab\x92\xa8\xea\xbd\x09\x4e\x75\x51\x1a\xfd\x51\x61\x94\xe2\xa0\x10\x6f\x65\x89\xd7\x27\xf6\xb4\xec\x4a\x22\x14\xad\x5f\x47\xab\x72\xaa\x20\x3b\x9f\x97\x34\x37\x67\xa9\xbe\xac\x09\x25\x60\x0f\x6c\xe6\xa2\x62\x68\x9f\x3e\xdc\xbe\xab\x03\xff\x73\x47\x9c\x03\x5c\xb1\xf8\x4a\x42\x1c\xdb\xeb\x8e\x6f\x55\x47\xdf\xa2\xfe\xd5\x06\xc1\x45\xe8\x35\xc5\x3a\x49\x4b\x63\xf1\x8a\x83\x17\x31\x6b\x37\x13\xeb\xb9\x20\xeb\x14\x58\x47\x7c\x98\x88\xc1\x43\x3d\x55\x45\xd4\x5b\x5e\x59\xe7\x2e\xdd\xc8\xa5\x9c\x92\xf7\x2c\x92\xbe\x5b\x98\x0a\x5a\x58\x2d\x5b\x8a\x88\xab\xd0\x03\x65\xcd\xf5\x51\x32\xf7\x6c\x86\x38\x8b\x50\x03\x8b\x9c\x01\x97\xb5\x1c\x98\x0d\xa8\x54\xb8\x90\xfd\xf3\x13\x6c\x46\x0f\xf8\x92\xd9\x52\x7b\xb0\x13\x58\xe4\x70\xb1\x34\xf8\x23\x68\xc9\x11\x8c\x57\x8c\x17\xe1\xbd\x55\xb8\x76\x5d\x8f\xa4\xf2\x2e\xa0\x39\x7e\xf4\xf9\xb7\x95\x88\xc9\x95\x59\x20\xb0\x73\x53\xc1\x7a\x71\x6c\x7e\x14\x69\x81\xc4\xd3\x7f\xca\xee\xe1\xc1\x7e\xc2\x3e\x04\xc1\x02\xa6\x5d\x2a\x0c\x5b\xe3\xc0\xe5\x2a\x8a\xe5\xa5\x65\x92\xf0\xff\x22\x08\xf1\x92\xa2\xe8\x4b\x54\xf5\x6f\x25\x81\xee\xb7\xee\x10\xff\x67\x28\x83\x3c\xa8\x89\x2a\x60\x8e\xee\xb7\x78\x17\xf4\x3b\xbb\xea\x24\xcb\xc2\x02\xdb\x58\x60\xcf\x8d\xf3\x33\x71\xb6\x7c\xd9\x7e\x93\x77\x68\xbf\xc9\xdf\x73\x1b\x34\xf9\xa5\x85\x86\x32\x34\xa4\x70\x15\xa0\x1e\x2a\x20\xfa\xf4\x26\x53\x67\xaa\x42\xfb\x21\x33\xe5\x55\x4e\xd8\x7a\xed\x1e\x9c\xcf\xc4\x35\xe7\x75\xb7\x5a\xee\x41\x71\x3e\x0c\x21\x16\xb1\xfb\xca\x7a\xdd\xda\x65\xca\x7f\x2a\xc3\xf9\xa1\x4d\xe5\x1c\x3b\x05\x55\x71\x76\x02\xa3\x93\x10\xb3\xac\x18\x41\x90\x54\x05\xf7\x4b\x3d\xb4\x66\x21\x48\x91\xe7\xf0\xad\x08\xc7\x76\x9d\xf6\x5c\x1b\xdb\x72\x8d\x55\x73\x3b\xb9\x3c\xbb\xef\xc4\xa5\x58\xee\x84\x13\xb8\x66\x71\x44\x58\x1d\x91\x42\x99\x9e\xa7\x38\x9a\xa9\xd9\x77\xbd\xbf\x0e\x5d\xf5\xcf\xaf\x73\x56\xbd\x78\x8a\x54\x05\x71\x87\xaf\xfd\x6b\xe2\xb5\x2f\xda\x72\xd3\x2c\x13\xaa\xa1\xfb\xa5\x80\xa5\xd9\xa6\x35\x3d\xba\xa3\x67\x04\x5e\xfc\x3c\x83\xd5\x3b\x9e\xe2\x80\x8c\x85\x88\x8b\xb1\xe8\x22\xa0\x14\xab\x1a\x6d\x70\x3e\x47\x37\x66\x3e\xc8\x37\x5c\x81\x71\x62\xe9\x95\xff\x70\x0a\xd2\x9f\xab\x72\xaa\x8c\xfa\x07\xa2\x35\x52\x6f\x5a\xf1\x90\xb5\x6d\x48\x92\xa6\x7f\xf2\x19\xb7\x29\x6b\xf3\xdb\x1e\xad\xdf\x0d\x57\x69\x8b\xfb\xa9\x29\x7b\x8e\x33\x91\x85\x08\x7f\x68\xe1\xa5\x62\xee\xa0\x67\xf6\xf1\x96\xa9\x55\xb5\xc1\x35\xb9\x87\x95\x22\x5d\x8f\x1a\xfd\xd4\xe3\x9c\x3f\x11\xc1\x92\x4f\x51\x0e\xeb\x2d\xeb\x16\x16\x07\x5e\x9c\xfa\xc4\x14\xd5\xa3\xd4\x75\x54\xb5\xf5\xdc\x78\xcc\xa2\x59\xfb\x43\xcc\xef\x47\xb8\x74\x82\xe9\xa8\x61\xc0\x03\xfd\x04\xff\x9d\x7b\x7c\xfb\xd7\x33\x2d\xc0\xfc\xb8\xe0\x21\x78\xe7\xcc\x88\x75\x57\x3a\xcd\xf9\xb1\x81\x05\x92\xc7\x57\x9e\xa4\xf1\xf9\xf9\x88\x15\x69\xfd\x40\x63\x28\x3f\xa2\xce\xfd\x40\x59\xe6\x97\x41\xfc\x68\x0c\x40\xb8\xd1\xa9\x8e\xfe\x61\xf3\x85\x68\xcf\x1e\x89\x43\xb6\x66\x7a\x67\x43\xeb\xd6\x68\xe5\x3f\x8c\xae\xa8\x57\x66\x29\xfe\xe5\xf3\x1f\xb2\xd9\xbe\xd9\xee\x5d\x7f\xde\xc2\xe0\x6b\x6d\x75\x5f\x8c\x38\x83\xcc\xb8\x3e\x50\x16\x41\xb4\x4c\x44\x20\xa3\x60\xef\xcf\x43\x53\x5d\xcf\xae\x75\xbe\xd2\x4b\x31\x8f\xcc\xd7\x21\x71\x60\xbd\x1c\xc9\x9d\x6e\x23\xe6\xcb\x60\x4e\x92\xa0\x21\xf5\x5e\x7b\xdf\x82\x03\xf9\x62\xfd\x97\x93\x25\x5b\x9e\x59\x0e\xdd\x03\xe0\xd2\xa2\xcd\x0e\x55\xb3\x07\xaf\x1e\x13\x85\x3f\x54\x61\xfd\x87\xba\xe8\xdd\x1e\xea\x43\x95\xcd\xaa\xad\x75\x28\x7b\x7c\x58\xfa\x2c\x9f\xa4\x1a\x72\x00\xed\x86\xf9\xd6\xf4\x0b\x1c\x67\x19\x95\x6d\xf5\x23\x1d\xd1\x55\xe2\x27\xc3\x0c\xe7\x31\x0e\xc6\x87\xf9\x5b\x5b\x9d\x07\x15\x1a\x87\x29\x34\xba\x6c\x3c\x48\x80\xa3\xe7\x72\xf3\x9f\x92\xb2\x07\xd4\x7a\xb5\x65\x8a\xff\x9b\x4f\x91\xc1\xa1\x03\xb1\xa9\xb2\x7b\x8a\x59\xb9\x5f\xab\x58\x97\xaa\x19\x33\xef\xc2\xb0\xd3\x57\x14\xc1\x02\xfb\x21\xea\xd6\x2b\x2b\x80\x10\xaf\x7c\x0d\x3a\xe4\x9a\xda\xba\x09\xf0\x42\x8f\x7f\x0b\xfb\xe6\xe1\x0f\x5a\x73\xc8\xc3\x2c\xfe\x26\x4a\x81\xe4\x93\xa2\x0e\x2b\x1e\x69\x66\xaa\xd8\x96\x67\x7d\xf3\xc4\x3b\xb4\x51\x1e\xc9\x35\xad\xa2\x52\x5c\x55\x67\xd6\xa8\x69\xc0\xa8\xd9\xb7\x4a\x61\xc8\x96\x24\x4e\xdb\x98\x83\x9f\xe4\x98\xe3\xfe\xdd\x31\xdb\xd8\xd7\x5b\x29\x1b\xd4\x99\xff\x48\xa4\xa2\xea\xc1\x0a\x71\xc3\x61\xf4\x78\x74\x39\x2c\xeb\x4f\x49\x15\xf4\xb0\x67\x66\x71\x39\x35\x8f\x06\x20\xd8\x55\xc7\xeb\xcb\x4b\x3b\xf3\x99\x98\x55\x1f\xae\xc8\xde\xeb\x0b\xf5\x55\x7d\xf9\x8a\xa1\xaa\x1e\x04\x7a\x68\x94\xb8\x30\x59\x71\xdc\x85\x8e\xb0\x13\x9b\x86\xba\x73\x21\x95\x34\xc4\x84\xfb\x36\x2c\xee\x5d\x32\x43\x97\xbd\x97\x13\x30\x96\xbc\x2c\x3d\x74\x15\x58\xbf\xb5\x6e\x42\xac\xd0\x9e\xf2\xca\xc0\x75\xb0\x55\x60\x84\x60\x7a\xdb\x0c\x9f\x78\xa8\x7e\x3a\x3f\x5f\x30\x19\x99\xa3\x73\x50\x47\x6d\xc8\x4e\x3e\xe9\x7c\xe8\xb2\xdb\xd3\x2b\xbd\x9f\x3e\x84\x0d\x20\xe1\x2a\xb7\x72\x97\xde\x94\x97\x6c\xef\x9a\x65\x8a\xc6\x22\xae\xea\x94\xba\x08\x91\xc3\x88\x5a\xf7\x2d\xc1\x54\x19\xc4\x55\xb2\x46\x21\x17\x96\x7f\x82\x7f\xaa\x80\x6f\x28\x44\x5d\x45\x5e\x85\x34\xd8\x8f\x0a\xdd\xb9\x15\xba\x07\x28\x44\x29\x16\x1a\x00\xf6\x5f\xfb\xce\x64\x1e\x3f\x68\x3f\x1f\x6c\xb3\x7a\x7d\x94\xcf\xa7\xe8\x78\x47\x73\xb8\xdb\xf7\x24\xd5\xd8\xed\x00\x31\x47\x52\xb2\xdb\x11\x07\xc3\xb4\x59\x41\x66\xda\xa8\x4f\x61\x57\x6c\x11\x3b\x6c\x0b\x36\x29\xce\xae\xc1\x7f\x5d\xd7\xb6\xd1\xac\x1f\xd6\xf7\x73\x89\xeb\x61\x71\xba\xa5\xf3\xe9\x89\xe7\x26\xee\x69\xbd\x5c\x54\xca\xd3\xa6\x82\xba\x04\x5b\x2b\xe7\x23\x5d\xdd\xba\x14\x3a\xd8\x5d\xd4\xda\xf3\x5f\x1b\xbc\x24\xa2\x32\x68\xb0\x5c\x16\x79\xdf\x95\x14\x12\x5f\x4e\x80\x55\xb1\x3b\x32\x97\x16\x0d\xaa\x74\xab\x0e\x6c\x13\xd1\xae\x90\x1d\x9b\xae\x28\x5a\xbf\x69\x33\x57\xfe\xb9\x4f\x1e\x13\x2b\xb6\x60\xc9\xb9\x9c\x54\x64\x47\x8b\xc0\xcd\x60\xf6\xf0\x94\xb4\x0b\x2a\xdd\xe7\x2f\x07\x88\x5d\x69\xd2\x65\xdd\x4a\xae\xa8\x4d\x25\x62\xc8\x85\x38\xc7\x84\xa5\xc3\x3c\xd6\x97\x8d\x91\xe5\xec\x59\xed\xcc\x9f\xf1\x0b\xa0\x22\x7f\xb7\x0d\x71\x30\xf7\x66\x79\x3c\xb4\x22\xba\xd9\x1a\x4f\x2a\xc8\x42\x82\x4f\x22\xaf\x6e\xe1\xf6\xc3\x1a\xb9\x96\x8d\xb3\xd6\xfd\x49\xf9\x75\xe8\xf4\xbf\x2c\x58\xd4\x79\xc9\xbc\x5d\xbf\x14\x5a\x59\xed\xd9\xe8\x48\xe7\x98\xb3\x63\x5a\x3c\x4c\x75\x38\x25\xae\x9b\xde\xbb\x2e\x78\xaa\x9c\x9c\x59\xa0\xb2\x7f\x8a\x25\x1e\x7b\x1d\x1a\x3a\x1d\x19\xe6\x59\xfc\x20\x4e\x6c\x30\x93\x3a\x57\x4c\x3a\x09\x11\xe9\xd2\x1c\x42\xb3\x76\x05\x64\xa3\xe7\x82\x85\xf6\x1f\x6e\x95\xce\x47\x0b\xbd\xe1\x4e\x8e\x5b\x65\x8d\x1a\x0a\x68\xd0\x78\xeb\x3a\xa7\xae\x9e\xbf\xaa\x6e\x9f\xb9\x23\xcf\xdb\x69\xdf\xba\x32\xae\x11\x7b\x2b\x58\x05\xa4\xc3\x24\xfa\xcd\xa5\x8d\x37\x79\xee\xe8\xe5\x64\xbf\x07\x2f\xdd\x9e\x45\x72\x55\x82\xf1\x2e\xf1\xd0\x16\xb0\x0c\xbe\xd6\xa6\x83\x08\x9f\xed\x18\x5f\xdb\x2f\x19\x45\xd9\x73\x34\x80\xbf\x09\xc9\x85\xd0\x3d\x5a\xe6\x37\xf5\x3d\xd3\xb4\x06\xcc\x35\x0d\x65\x3d\x26\x9d\xc6\x30\x28\x35\x91\x7a\x0e\x6b\x52\xbb\x73\x09\xea\xbb\x64\xc7\x02\x72\xfd\xe3\x35\x75\x20\x88\x11\x65\xb6\x1a\x1f\x8c\x9b\x7a\x4f\xe0\x7e\xd2\x6b\xbe\xc8\xa5\xf9\x40\x3c\x9a\xeb\x22\xd5\xf6\xf6\x27\x43\xbd\x14\x34\x65\xd9\xd1\xbd\xf5\xfc\xbf\x4e\xde\x0c\x3b\x84\x40\xf4\x2f\xd4\x43\xc3\x5d\xe0\x35\x13\xc5\x0d\x15\xd8\xfd\x87\xba\xb1\xa5\x36\xe1\xd8\x39\x0a\xe8\x68\x5e\x6e\x45\xa9\x85\x2c\xc2\xdb\x93\x72\x44\x7d\xdc\x21\x01\x94\x7e\x05\x4b\x30\x0c\xff\x5c\x37\x5e\xe5\x76\x96\xca\xc3\xbe\x2f\x2d\xa1\x75\x0b\xe8\x6c\x51\xa4\xc9\x06\x39\x1c\x62\xcd\x6e\x71\xb0\x10\xef\x44\xa1\x83\x65\xfd\x94\x5c\x94\xb5\x9c\x07\x6b\x26\xcf\xb2\x2e\xfa\x77\xcf\x59\xb8\x30\x7b\x16\xe6\x1b\xc3\x5a\xae\xb5\x91\x71\x8c\xc8\x9f\xa0\xb4\x85\xab\x1f\x3b\xb3\xe7\x3c\x48\x4d\x96\xbf\xf5\x89\x32\x23\x2b\xee\xe7\x40\xe6\x09\x5c\xa5\x78\x2c\x8c\x73\x1c\xed\x8e\x64\x94\xca\xed\xa7\x2a\xf8\xe4\xd5\x7e\xed\x01\xf7\xc1\x13\x41\x4f\x60\xad\x83\x79\x2b\xf8\x7b\xfd\xba\x23\x03\xba\x68\xcd\xd2\xe8\xbe\x7d\xf5\x68\xaf\xcc\xfd\xe2\x24\xe6\xae\x5b\x93\xd7\x42\x92\x97\x53\x72\x18\xfc\x69\x78\x0f\x8b\x3f\xbf\xd9\x08\xac\x0d\x8b\x66\xc4\x3e\xfe\x8a\xb2\x0b\x87\x84\x42\x5b\x3e\x1b\xa8\x70\x14\x78\x63\x64\x23\xd7\x3e\x58\x34\xa9\x37\x03\x6d\xcb\xaf\xc6\x6d\x2d\x39\x29\xb5\xc5\x7b\xf9\xbb\x84\xf1\x06\xac\x00\x7d\xa4\xe5\x15\xf3\x2b\xc4\x66\xd9\x4d\xdd\x50\xa5\xf4\x03\xe5\x7f\x2c\x64\xdf\x00\xcf\xfa\xf3\x79\x03\x04\xaa\x8a\x39\x6a\x21\x0c\x56\x49\xda\xa0\x8a\xae\x75\x1b\x92\x90\x2c\xd4\x07\x90\xf7\xb6\x17\xc3\xbf\x54\x13\x76\x27\xfd\xbf\xb4\x6a\x43\x98\x26\xfa\x70\xc6\xe5\x6a\x1b\x29\xf6\x95\x73\x68\xd6\x5d\xaf\xe0\x75\xd6\x28\x24\x7a\x71\xdc\xeb\x8c\x95\x3e\x87\x60\x04\x8f\x62\xab\xda\xa5\x3f\xe4\x2f\x58\x31\xb1\xb7\x66\x96\x6a\xb4\xf5\xeb\x46\x38\x35\x0a\xa9\x5d\xe4\x4e\x24\x5f\x2f\x8d\x47\x49\xdd\xfa\xa3\x2e\x6c\x03\x1b\x39\x05\x72\x0e\x1f\x2e\xd7\x28\x88\xdb\x46\x51\x4e\x45\xac\xde\x09\xe4\x61\x95\xf5\xed\x32\x86\x87\x1e\xae\xa8\xb5\x13\x21\x59\x7b\x47\x6d\xc0\xa6\x68\x9f\x59\x15\xe9\x42\x67\xb7\x2b\xdc\x05\xbb\x72\x7b\x1b\x73\x6d\x44\x95\x5e\x84\x95\x63\x36\x27\x00\xd7\xf5\x1b\xc6\xe9\xb0\x8d\x98\x19\x60\x48\xc4\x3a\x02\x62\x5f\x60\x94\x32\xff\x09\x13\x43\x92\xb5\x51\x4a\x0d\x9e\xb1\xcd\xb1\x5b\xfe\xf9\xb2\x47\xa4\x70\xa9\xfa\x77\x09\x6a\x31\xd2\x4a\xbe\xcc\x32\x89\xb0\x48\x96\x29\x57\xfe\x27\x08\x40\x0e\xcb\x45\xa0\xa1\x7d\xb9\xba\x68\xe6\xe5\x69\x5d\x16\xc2\xf3\xd8\x88\x7d\xd0\x63\xe5\xef\xcb\xc9\x86\x39\x2a\x80\x97\x51\x04\x70\x1b\x42\xbf\x9b\x59\xa0\xb5\x2e\x1d\xa3\xda\x48\xc4\x6b\x4b\x46\xfb\x27\x49\xde\x9e\x02\x34\x80\xaa\xaf\x25\x0f\x37\xed\x55\x15\xef\x3d\xf0\xb6\x4e\x31\x1e\xee\x45\x3b\xb4\x21\x85\x3b\x16\x46\xe1\x1a\xa3\xdf\xa5\xf9\x17\xe6\xb6\x67\xb2\xc9\xab\x88\x08\x97\x3b\x2a\x7f\x14\xe1\x61\xd0\xea\xf4\xf0\x43\xa7\x77\xe6\x33\x65\x7d\xe0\x20\x0b\x43\xd5\xcb\x4f\x49\x01\xbb\x76\xee\x57\x3c\x77\x91\x71\xe1\xd9\x87\x50\xee\x58\x39\xdc\xf7\x8a\xba\xbc\x11\x63\xea\x70\x25\x3d\x80\xe7\x9b\x4f\xcc\x59\x9f\xf2\x23\x8c\x5e\xff\xac\x4c\xe5\x9d\x35\x3c\x35\x4e\x3a\xfa\x63\xbc\xc6\x2d\xc9\x50\xb5\x65\x50\x54\xcf\xd0\x61\xb3\x80\x2c\xe3\xd0\xc7\x80\x17\x62\x57\x64\x8b\xf8\x96\xa9\xaf\x45\x81\x41\x02\x2b\x17\x93\x0a\x39\x21\x92\x46\x5c\xae\x8c\x59\x98\x17\xcb\x8b\x37\xd1\x60\x37\x47\xb1\xbf\x74\x22\x9e\x53\x73\xd6\xbf\x9e\x65\x72\x7e\x36\xfd\xdb\xb9\x39\x1a\xce\xbd\x88\x11\x67\x54\x80\xcf\xfc\x71\x08\x0b\x50\x89\x82\x02\xe4\xf9\x6e\xc6\x86\xfb\xc0\x55\x2e\x09\x06\x1b\xc3\xb9\x57\x10\x1b\x87\xa8\x6f\x4e\xaa\x9b\x5f\x2a\xc7\xdf\x93\x17\xd0\xc1\x6b\xd6\x4f\x4d\x9b\xd0\x03\x09\x63\x0c\x0f\x46\x55\xe2\xf1\x18\x40\xc6\xe3\xd6\x94\x41\xb1\x22\x76\xa5\xae\xdf\xe9\xf7\x03\x95\x78\x49\x10\x1f\x00\x8f\xa9\xa8\x5c\xcf\x81\xaa\xbc\x75\xdb\x58\x31\x3a\x6a\x54\x8c\xab\x28\xbd\x77\x08\xd1\x9e\x9f\x77\x47\xb6\xa0\xd3\xa4\xfc\xb0\x80\x82\xbe\xa4\xbf\x6b\x27\xe5\x69\x99\xa3\x54\x32\x3a\x8f\x36\x67\x3e\x7c\x76\xeb\xbb\x16\xaf\x3c\xb0\x94\xcf\x77\xc8\x35\x7a\xfd\xcc\x66\xcd\xaf\x0e\xf8\x16\x73\x14\x72\xcc\x1a\x3f\x1d\x73\xa4\x64\x8f\x39\x0c\xef\x2d\x62\x71\x9e\x08\xbb\x63\x1e\xa9\xa7\x64\xbd\x92\x18\x94\xa8\xdb\x13\x40\x2e\xd6\x73\x54\xec\x27\x78\x60\x23\x7e\xac\x55\xb6\x9d\xc7\xc3\x06\x19\x2a\xcb\xb9\xba\x6f\x27\x9a\x75\xd0\xa1\x51\xd3\x17\x42\xc0\x9e\x0f\x9d\x8c\x5b\xdb\x69\x5d\x69\x6c\x69\xe1\x37\x0e\x0e\x97\x6d\x41\x52\x22\xc8\x55\xc1\x99\xde\xf7\xf7\xab\x71\xaa\x77\xda\x32\xa2\xc5\x90\x1e\xca\xd1\x20\x02\x83\x34\x67\x9d\x53\x7d\x29\x10\x85\xe5\x48\x02\x40\x48\x78\xf4\xb0\x71\xfb\xc6\x8d\x8b\x80\xa7\x30\x65\xb4\x4e\xa2\x13\x78\x60\x67\xe5\xee\xb0\x31\xb0\xdf\xb6\xf2\x49\xde\x75\x94\xd7\x4e\xfc\xbd\x8b\xff\x12\xf5\x69\x37\x92\xcf\x75\x51\x26\xc1\x75\xaa\x1c\x21\xa0\x9e\xb4\x2c\xac\x3d\xc1\xff\xc9\x7f\x42\xc9\xd4\xee\xdf\x09\x26\xe0\xfd\x44\xfd\xdf\xbb\x04\x04\x1c\xad\xed\x25\x5a\xb5\xbd\x74\x9c\xd2\x58\x47\xf6\x2a\x6a\x6a\xdc\xa6\x91\x7c\x67\xbd\xaf\x7b\x56\xf2\x66\xcf\x71\xd4\xa4\x67\x0a\x22\x1d\xd2\x0a\x4e\x2c\x97\xd7\x4b\x15\xed\x2a\x9d\x0f\x57\xf8\x3c\x19\xec\xc1\x90\xb6\x7e\x44\x25\x7a\x87\xb5\x4f\x94\x53\x2d\x52\xef\xb0\xa0\x0b\x2a\x35\x73\x2f\x5e\xc2\xcf\xdf\x7a\x7c\x55\x8d\x3e\xbf\x8f\xf0\x32\x2c\x54\xc0\xd9\x8a\x44\xb7\xb7\xa2\x1b\xb4\xd1\xc5\x66\x43\xeb\x1b\xe9\x3e\xfb\xf0\x2d\xca\xce\x67\xab\xda\x41\x29\x58\x72\xc0\x3b\x0d\x0d\xec\xe5\xf4\xf7\x74\x03\x0a\x99\x95\xfc\x25\x26\x16\x20\x50\x8b\x77\xb6\xe1\x2e\x90\x38\x6d\x4f\xa5\x34\x8e\x6d\x60\x55\xb4\x4e\xc5\xef\xbc\xee\x6f\xd6\xee\x07\x11\xa0\xa5\xc8\xbe\xf5\x4f\x52\xc5\x31\x5b\x3d\xa9\xc3\xef\x71\x68\xfa\xd6\x3e\x45\xa1\xbd\x95\xca\x97\x39\xe8\x57\xce\xb5\xde\xc5\xa3\x76\x27\x48\x8f\xc6\xb3\x10\x3d\xd0\xbb\x5d\x43\x93\xff\x5d\x53\xc0\x0a\xfa\x71\x7e\x46\xa9\x7f\xb4\x91\x44\x28\x01\xf7\x35\x0a\x65\x1e\x2b\x38\xdf\x00\xfb\x31\x2e\x5f\x45\x5f\xeb\x31\x1b\x43\xdb\x7e\x56\xec\x96\x36\x6d\x60\x17\x4e\xf7\x04\xae\x89\x73\x96\xa3\xa6\xcd\x92\x55\x5a\xb7\x97\x97\xd3\xb0\x2d\x51\xfa\x45\x9e\x9c\xe9\x0a\x17\x49\x2f\xeb\x33\x6a\x0c\x70\x8c\xfa\x57\x56\x02\x11\x0b\xb5\xbc\x01\xa3\x24\x0d\x72\xc0\x13\x78\xad\xd2\x2c\xbc\xce\x06\xe7\x0a\x21\x0b\xb2\xd8\xdc\x83\x1a\x35\x28\xf5\xca\x41\x06\xda\x4d\xc4\xee\xa3\x80\x1f\xec\x70\x66\xda\xd7\x37\xe7\xf4\x28\xd5\x3b\x09\xcf\x63\xa7\x63\xaf\x75\x91\x69\x65\x15\x95\xd8\xda\xf2\x25\xc7\x00\x75\xad\x6e\xab\xa1\x61\xe5\x5a\x9d\x9e\x63\x0b\x15\xa4\xad\x77\x22\x95\x98\x72\xbf\xe4\x5a\xbf\x72\xd4\xfd\x43\xe0\x57\xa6\x8e\x6b\x71\xc7\x5b\x8f\x68\xe7\x0c\x14\x26\x39\xd6\x4f\x95\xb1\x67\xf9\xc2\xac\x52\xf1\x41\x02\x40\x45\x6c\xf8\x65\xbe\x7e\x1a\x3e\x40\xf0\x00\xd1\x95\x67\x9c\xa7\x28\xd4\xfe\x73\xf2\xb5\xcf\xe1\x22\x02\x99\x71\x12\xa8\xf1\xd2\x91\x04\x4d\x02\xdc\x1a\x45\xd5\x15\x9c\xa6\x9d\xc1\xb6\xd4\x89\xf4\xe9\x38\x56\x5e\xb8\x53\xe0\x84\x6d\x58\x7f\xfd\xf1\xd0\x64\x21\x1d\x52\x33\xd2\x81\xe1\xe7\x71\x8a\x82\xc6\xea\x88\x45\x95\x21\xfd\xc3\x7e\x85\x5e\xcc\xea\xd9\x47\x15\xf6\xcf\x22\x75\x65\xb4\xcd\x39\xa2\xfe\x2b\x20\x7c\xe4\xf7\x29\x92\x2f\xa4\xfa\xce\xa0\x4c\x8b\xdb\x2d\x54\x9a\x1d\x5b\x87\x79\x00\x73\x58\xe6\x20\x4a\x27\x51\xb2\x21\x2b\x48\xe8\x81\xeb\x47\x79\xb3\xb2\xbc\xa5\xff\x0b\x15\x61\x31\x8f\xc1\xf7\xf6\x5a\x73\xcd\x7c\x87\x9d\x24\xdd\x74\x80\x91\xc3\x0d\xc8\x0a\x3f\x10\x00\x20\xec\xc7\xe2\xb5\x44\xdf\x9f\x12\x70\xb6\xe8\x3a\x7e\x93\xe5\xd9\xb4\x9c\xe2\x11\x2c\x25\x30\x31\x16\xa5\xe5\x4b\xae\xbe\xe8\x9d\x59\x0e\x0e\x64\x96\xb2\x2f\x85\xd0\x80\x7c\x08\x60\xb9\x34\x89\x1e\x44\x3f\xce\xbf\x76\x1c\x07\x14\x8c\x1d\x88\xeb\x44\x6c\xdf\x1d\x19\x64\xd5\xfe\x77\x7e\x03\x39\x3e\x0f\x12\x7d\x42\xe7\x56\x43\x5c\xc8\xa1\xc0\x38\x38\x4a\xfa\xe7\x12\x35\x4d\x8b\xfb\x49\xf3\x92\x25\x06\x54\x78\x31\xf9\x8b\x71\x0d\xf4\xe2\x2f\x21\x16\x60\x81\xd0\x0d\xa8\xcd\xc8\xea\x34\x2c\x5f\x17\x48\xc8\x24\x05\x3e\xb2\x70\x88\x00\x4b\xfd\x67\xe6\xb8\x65\xc9\x8d\xf0\x1d\x2f\x06\x1a\x52\xcc\x5b\x5e\x3f\xc2\x0b\x08\x2e\xb0\x46\x4a\x76\xc9\x1a\x34\x81\x0b\x2e\x11\xe6\xca\xe1\xcd\x22\x09\x80\x25\xd8\x45\x8b\x94\x1d\x17\x66\xea\xac\x71\xf8\x94\x3f\x3a\xcd\xfd\x67\x0b\x19\x3e\x00\x07\xfc\xc6\xfd\x96\x33\xca\xa9\x36\x15\xf4\x44\xd7\xaf\x4d\x28\x73\x6c\x97\x01\x9f\x3e\x29\xdd\x7c\x4a\x4d\xee\xd7\xc6\xa6\xc3\x27\x70\x25\xb0\x06\x72\x77\x51\xf9\x7f\xd9\x3c\xd6\x7d\xa4\x9c\x5a\xbe\x39\x59\xcb\x09\xe7\x12\x39\x95\x46\xf0\xbb\x09\xfa\xbe\xd5\xd0\x4c\xef\xe0\xd8\x4f\x50\xd0\xf5\xe5\x1e\x92\xce\x91\xfa\x98\xaa\x2b\x74\x6b\x8f\x02\x00\x9f\x9c\x4b\x6f\xc1\x05\xc4\xb2\x26\xfc\x61\x2a\x02\x1e\x4c\x2b\xc1\x08\x83\xe4\x9b\x6d\x1c\xc1\x3c\xd8\x34\xff\xfb\x8a\x85\x4e\x36\xc3\x76\xd7\x16\x0b\xbc\xee\x03\x59\x37\x02\x8d\x26\xd8\x15\x84\x2d\x01\xca\x1b\x61\x62\x3a\x46\x59\x3e\x9f\x5f\xde\xf9\x99\x04\x50\x80\x6e\x80\xa6\xb3\xfc\xb0\x70\x5b\xc9\x01\xca\xb1\x54\x0e\xaa\xf9\xaf\x7b\xe9\x18\x0e\xa5\xf3\x25\x7c\xc1\xdc\x38\xf1\x74\xa9\x9d\x32\xf5\x14\x26\x9f\x5a\xfa\x9a\xf4\xb2\x19\x1b\xcd\x57\xd1\xb4\x49\x64\xb9\x86\x02\xb3\xcd\xff\xc9\x2f\x0f\x9b\xb1\x89\xb6\x8e\x13\xdf\x1d\x64\x9a\x88\x7c\xb7\x48\xe7\x94\xc8\x1b\xb7\xa5\x68\xe8\xdb\xe9\xf3\x1c\xa8\x32\x37\x68\x03\x21\xa9\x8e\x50\xe8\xaa\x58\xee\x1d\x29\x30\x76\xc7\x3f\x03\x3d\x4b\x09\x59\x1b\x6b\x02\x29\x94\xe9\xd5\xf1\x6c\x62\x65\xa3\xcd\xce\xfc\x30\x6e\x53\xaa\x4c\x9d\x13\xd1\x7d\x19\x12\xdc\x22\xa4\x4b\x9a\x39\x7d\x98\xe8\xb4\x48\xb5\x60\x8b\x82\xa2\x3c\x86\x71\x61\xe8\x2e\x0b\xf5\x60\xcd\xb5\x9f\x59\x99\xf8\xf9\xf1\xd8\x25\xcf\x2c\x3b\xac\x71\xbe\x45\x5e\x0f\xf7\x09\xe0\x22\xde\xe1\x5c\x6a\xaf\x66\x09\x5f\xd3\xc6\x91\x03\x5c\xc2\xff\xe9\x0c\x90\x2a\x4f\x6f\xce\x5d\xec\x2e\xe8\x02\x0a\xe9\xbe\x3c\xed\xb7\xfa\xf4\x1b\x79\xef\x3d\xd0\x13\x9a\xf7\x8c\x59\xed\xf5\xc8\xe2\xd5\x88\x11\x4b\x90\xd5\x6f\x4a\x6e\x00\x37\x11\x66\xa9\x1c\x60\x80\xda\xae\x23\x21\xfb\x28\xcc\x05\x06\x9b\x52\x1a\x1a\xd3\xa6\x63\x6c\x9a\x4a\x8e\x2e\x44\xe4\x01\xe4\x7b\x44\xa4\x4f\x0e\x21\xa8\x85\x4c\x75\xcf\x97\xbd\x04\xfe\x7a\xd8\x24\x80\x1c\x71\xeb\x2f\x58\x2f\x0b\xe5\xdd\x49\x00\x87\x72\x6a\x68\x4c\x5d\x0f\x79\x2e\x3e\x30\xa2\x78\x47\xe0\xcb\xcc\x09\xeb\x23\x54\x66\x1e\x71\xb1\x1f\x48\x61\x2b\x1d\xfc\x98\xed\x66\xdf\xfc\x7a\xa4\x08\xe7\x63\x6e\x10\x89\x39\xf0\x6b\x0f\x55\x5b\x1e\xe9\x25\x17\xd6\xf4\xea\x28\x19\x02\x02\xbb\xd4\xa6\xc3\x23\x0c\xa8\x88\x91\x80\x0a\xeb\x05\x9a\x07\x6c\x9a\x66\x22\x25\x3a\x39\x90\xe5\x67\x78\xe1\xe6\x7a\xf3\x2d\xcc\xd7\x14\x0f\x6c\x96\x15\x61\x3e\x94\x1f\xcf\x10\x51\x0b\x49\x62\xa4\x52\x56\xc9\x43\xe5\xed\x7a\xa9\x8c\xd2\xe0\x46\x8e\x96\xe5\x30\x36\xab\xa3\xc9\x0f\x6f\x73\x72\xf3\xd5\x42\x99\x92\xb7\x2c\xf7\x02\x67\xf4\xf0\x46\xa6\x04\x58\xee\x02\x37\x93\xd3\x39\x65\xf1\xa8\x05\x03\x1b\xde\x2a\xa8\x0c\x6f\x14\x5e\x11\x40\xb4\x91\xb5\xf9\x3a\x11\xde\x60\xef\x30\x39\xf0\xb5\x3b\x03\xe1\xc0\x11\x39\xdc\x58\x45\x98\x7f\x73\xf1\x12\xc1\xfd\xcc\xcd\x71\xf5\x99\x08\x7e\x38\x75\x01\xa1\x21\x4d\x85\xe5\xb2\xf3\xfd\x71\x2e\xbd\x52\x89\x43\xa1\x34\x74\xc9\x37\x9b\xe8\xa1\x10\x84\x66\xdd\x4f\x27\x29\xe8\x66\x8f\x0f\x54\x6b\x42\xf3\xff\xfe\xfb\xc1\x63\xb1\xe6\x75\x16\x73\x8e\x52\x00\x1e\xf2\x31\x8b\x7b\x2f\x2c\xfe\x80\xe7\x32\x09\x72\xe1\x3a\xd3\x24\xcf\xef\x41\x78\xdf\xde\xe2\xb4\x37\xe6\x3c\xdc\x6d\x08\x65\x58\xe7\x60\xf2\xdb\x10\xb2\x12\x19\x31\x33\xdf\x3b\x64\xb9\x62\x0e\xd9\xa5\x76\x15\x52\x90\xf6\xc7\xf1\x0a\xa8\xf5\x1d\x6c\x02\x07\x3c\x77\x42\x2e\xc8\x00\xd7\x1a\x5a\xc9\xe2\xc3\xe3\x95\x6c\x34\x9b\x01\x84\xed\xbc\xbd\x64\xd0\xd6\x66\xd4\xb0\x0d\x60\x28\xb0\x7e\x5c\x9d\xb0\xce\x70\x3b\xae\xaf\xcd\x2b\x89\xf3\xa2\xc1\xf6\x67\xfd\x48\xa3\xda\x46\x5d\xf2\x7a\xe9\xcf\x39\xee\x88\x85\x1b\x97\x59\x48\x25\x8b\xb4\x4c\xef\x90\xe5\x23\xd0\x41\x06\xad\x6f\xca\x53\xd7\xd3\x0d\x59\x33\x3f\x3c\x12\xbf\x3c\x9d\x45\x52\x18\x1f\x1c\xd2\xd8\xbc\x2d\xa0\x31\x7d\xa1\x58\x6c\xcf\xd9\x03\x64\xab\xfd\x39\xe8\x51\x09\xdb\x03\xb2\xf0\x54\xd9\xc6\xc2\xf0\xcb\x06\x6c\x01\xb9\xaa\x3d\x90\x0b\x30\xc5\xfd\x83\x43\xe0\xa4\x15\x67\x44\x06\x73\x3f\x85\x8d\x54\xaf\x17\xd0\xf1\xde\x3b\x8b\xd1\xee\xfe\xba\x33\x4b\xe3\x40\x01\xe1\x03\xce\xca\x9a\x50\xef\x77\x4b\x65\xfe\xa3\xa9\x59\x7b\x96\x86\xe5\x79\xdb\x99\xb5\xf8\xbd\xd7\x76\x4c\x41\x73\xc3\x35\x76\x66\xb9\xda\x86\x3f\xe1\x5d\x5a\xcf\x4e\x33\x8a\xae\xae\x0f\x55\xd7\xe9\x81\x5a\x87\xef\x7c\xc7\xc5\xa6\x59\x23\x57\x51\xde\xc5\xc6\x55\x51\x2f\x83\x35\xde\x8d\x94\xde\x2f\x4d\xa1\x7a\x1e\x9b\x9b\xab\x3c\x4a\xec\xa5\x6e\x52\xd5\x7c\x12\xbb\xb3\xd9\xb1\xd6\x7b\x1e\x49\xb9\x3f\xa3\x44\x7c\xd2\x03\xb1\x49\x22\x43\xec\xdf\x8f\x5d\x84\xa0\xeb\x6c\x28\x29\x8e\x7d\xa1\x88\x76\xd1\xe0\xae\x53\xeb\x8e\x1c\x6e\x24\xdc\x1c\x45\x11\x37\xdf\x3e\xf0\xbf\x95\x66\x9e\xaa\x79\x4d\x57\x68\xfb\xd4\xc1\x62\x5c\xff\xb9\xf8\x58\xca\x23\x6b\x3f\x68\xdd\x0a\x49\x2f\xd6\xec\xa3\xd3\xb7\x48\x06\x37\xac\xd5\x33\x61\x05\xa9\xeb\xa8\xda\xfb\xb5\x9d\x9b\x02\x34\x87\xa0\xd7\x4a\x7a\x7b\x1a\xe7\x22\x02\xba\x06\x8f\x18\x59\xaa\xf6\xec\x0a\xd8\xca\xab\x39\xc9\x5d\xb5\x7c\x49\x65\x50\x04\xfb\x87\x25\xfd\x28\xce\xef\x03\xc6\x92\x1e\xae\xb7\x0d\x70\x78\x9c\x20\x2b\x76\x5f\xdb\xd8\x3f\x30\xc9\x2e\x8f\x84\x06\xa4\x37\xeb\xe3\x9d\x75\xf0\xce\x86\x0f\x30\x0b\x04\xaf\xf5\x4e\xa8\x81\x11\xe3\xbe\xb5\x36\x5e\xcf\x2f\x52\x2f\x4f\xe7\x92\x54\xe4\x97\x79\x6d\x0a\xae\xbe\x8c\x50\x3b\x97\x69\xf0\x6b\xea\xb8\x92\x60\xd4\x87\xce\x36\x2d\x9e\xba\x06\x8c\x00\x83\x86\x47\xb4\x3e\x9e\x5d\x75\x87\x2e\xf2\x74\xd3\xd6\x37\x2d\x50\x43\xf2\x0e\xda\xd7\x58\xbc\x44\x8b\x87\x0c\xf2\x8f\x83\x05\x1a\x99\x25\xb9\x17\x9f\x98\xe9\x55\x7a\x30\x90\x5c\xf1\x05\xc6\x11\xaa\xa3\x87\xef\xa9\x5d\x00\x8e\x85\x5d\x48\x3e\xe6\x0d\x18\x43\xfa\x7f\x3e\x77\xb9\xe9\x41\x67\x77\x24\x32\x25\xf1\x71\x44\xb9\x83\xdb\xf4\x60\xf1\x72\x76\x9e\x1c\x3d\x4d\xfa\x7d\x58\x42\x03\x6a\xc0\xa3\x6d\xef\x7f\xbe\x98\x03\x6f\xc0\xd7\x19\xe8\x08\x19\xd6\x1e\x0d\x36\xc0\xe5\x4c\xea\x69\x9a\xf5\x6c\xa4\xf1\xb6\x3e\xe4\xf0\xc8\x6e\x2b\x87\x12\xc8\xef\xf8\x12\x8e\x89\x7e\x60\xf8\x5a\xc9\xa2\x56\x4b\x20\x72\xfc\xda\x27\x3e\x5b\x42\x6e\x42\x64\x3b\x88\xf8\x23\xd9\xfd\x7a\x01\x3e\xae\xd2\xb4\x2a\x22\x70\x60\xfb\xf8\x73\xf0\x61\xf2\xf5\x5d\x4f\xa7\x0d\xd9\x92\xd7\xd9\x9e\xb2\x85\x3d\xe8\x3b\xab\x9c\xfd\xce\x29\x40\x05\xe7\x17\x5d\xe0\x8b\x89\x0b\x76\x5a\xb6\x74\x5b\x09\xf4\x51\x4d\xfd\xd0\x55\x71\x14\x7c\xeb\x67\xaf\xf2\x7b\xf7\xd4\x5a\x7f\xed\x2e\xcf\x46\xe6\xfe\x2c\xed\xee\x5d\xb4\x65\x8b\xe4\x1b\x3b\x87\xbe\xb6\x17\x5f\x9c\x45\xef\x0f\x1b\x01\x0a\x28\x93\xf9\x95\x79\x21\x23\x41\x2c\x02\x26\x66\x12\xe7\xde\x6f\x3d\x01\x2f\xa7\x65\xff\xd0\xb0\x96\xae\x2d\xfc\x3f\x6d\x68\xfd\xca\xb1\x26\xf9\x4c\xec\xe5\xaf\x19\xc5\xbc\x1b\xd2\xe3\x95\x54\xa7\x7a\xa5\xc6\x14\x02\x0a\xc1\x2b\xfa\xd6\x2a\x90\xa8\xbf\xb2\x5a\x42\x79\xee\x70\xa7\x85\xcf\x79\xd8\xd6\xf2\x3f\x41\x2f\x50\xd6\xb4\x73\x62\xfe\xea\x89\x5f\xb1\x08\x80\x00\xa2\xf3\xc8\x90\xc0\x83\x73\x2a\xd2\x16\x7c\xa2\xf0\xa4\xa3\x39\x0c\xc1\x37\x88\xa2\xe2\x13\x5a\x52\x00\x3a\x30\xeb\x0b\xe3\x5b\x5f\xd8\xcc\x4d\x4f\xa2\xc5\xcf\x52\xce\x49\xfa\xde\xfb\x24\xfc\xba\x6b\x04\xbc\x03\xb2\x60\x73\x91\x52\xa4\xf7\xed\x48\x1b\xc9\x41\x3d\xc3\x54\x13\x58\x53\x29\x8b\x43\xb1\xc4\x96\x35\x14\x8d\xea\x79\x39\xda\xa9\xa2\x46\xe6\xc1\xa1\x9c\xca\x5d\x05\x7f\xbd\x83\x5a\x67\xc1\xde\x69\xa8\x68\xb1\xdf\xf7\x1b\xf2\x35\x8e\x1d\xe0\xb4\xf1\x46\xd5\x90\xdd\xa5\x8d\x81\x8f\x4c\x91\x80\x12\x39\x68\xd8\xe8\x36\xf3\xdc\x46\xa0\x77\xbc\x19\x64\x46\x7f\xa4\x3b\xee\x4f\x08\x64\xc7\x6b\xfe\x09\xfd\x71\x04\xe5\x22\xac\x21\x39\xac\x20\x6a\x67\xb7\x8b\x1f\x13\xe6\xb0\x95\xdb\x1b\xd7\x7b\x16\x0d\xc7\x66\x5b\xfc\x6a\x0a\x87\xe6\xdb\x39\x06\x42\x12\xdf\x53\x16\x80\x21\xd2\x5f\x77\x5e\xea\xea\x1d\xda\x9d\x7f\x39\x0a\xb9\x95\x36\x93\x40\x80\xaf\x4a\xe7\xc1\x7f\xee\xe3\x3b\xbe\x4b\x30\xe8\x95\x5e\xc6\xf5\x71\x50\xdd\xf5\xb6\x43\x5d\x54\x02\x40\x02\x55\x86\xbc\x39\xb5\xfe\xe3\x72\xd6\xf6\xa2\x28\x56\x59\x13\xaa\xca\x79\xf5\x9f\x7c\x55\xaf\xf7\x7b\xe1\xb7\x52\xfd\x84\x58\x88\x61\xc8\x12\x21\xaf\x40\x34\x29\x54\x5e\x18\xf8\x06\x91\xf9\xad\x71\xfc\xf2\xfd\x0b\x07\xfe\x16\x08\xd0\x60\x8f\xc9\x24\x9c\xc4\x1c\x76\xb2\xb7\x3a\xfe\x0b\x4a\xee\xea\x05\xae\xdb\x26\x7b\x55\xd0\x07\x29\x86\xc3\x96\x42\x58\x87\x3e\xc6\xb7\x97\x74\x8b\xae\x5b\x19\x06\x0b\x94\xbb\xbd\x5c\xe7\x9d\x05\x7d\xf4\x5c\xf6\x12\xb0\xc4\xfd\x9f\x1b\x1c\xd0\x43\xf8\x38\x9f\xd2\x53\x87\x09\x69\x44\x3e\xf2\xb9\x8e\xa2\x5a\xfa\xc1\x79\xe8\x75\xb8\x42\xa8\x90\x14\xb9\xa9\x07\x90\x49\x86\x25\x53\x77\xd0\x11\x18\xb9\x1c\xf7\x1a\xda\x01\xd7\xd7\x4e\xf8\xe4\x8d\x2b\x9a\xd4\x21\x2b\xec\xb8\xa5\x0b\x0d\x23\x61\x07\x85\x33\xe6\x6b\xd7\xc1\xb7\x33\x2f\x64\xb5\x6f\x85\xed\x81\x8d\x4d\x42\x53\x00\x1c\x3c\x26\xe5\xed\x85\x24\xc5\x1f\x72\x9e\x0b\x83\x00\x16\x2c\xb3\x04\xe0\x97\xec\xa9\x1d\x94\xb4\x88\xcd\xb0\xe6\xf1\x62\x10\x2c\xfd\x39\x7e\xa7\x84\x62\xaf\x79\x13\x26\x66\xce\xe3\x1f\x11\x78\x39\x0d\xdb\x00\xbe\x51\xa5\xe0\xf2\x71\x84\x00\x7c\x49\x42\x73\xa0\x04\x1e\x70\x8e\x8d\xf8\xe8\x4b\xe2\xe2\xd7\x17\xe4\x30\xe5\x2d\xbc\x91\xa7\xac\xde\xef\xca\x1a\xa1\x5f\x98\x79\xf1\x44\x51\xe6\x22\x8c\xc3\xde\x20\x5d\x55\x81\xa4\xae\xdc\xf2\x2c\x2e\x60\x70\x46\xa0\x2c\x81\xc3\x38\x7e\x84\xbf\xc8\x57\xd3\x7b\x5f\x9b\x0a\x7c\x13\x44\x02\xe6\xa2\xfb\xca\x16\xa4\x80\x5b\x1c\x94\xe8\x00\x8e\x42\xcb\xd8\x21\x55\x21\x40\xfc\xa2\xd3\xbe\xd9\x3a\xf8\x59\x9a\xed\xc8\x37\x49\xd1\xfd\xf0\xd6\x9c\xd7\x21\xed\x5b\x58\x71\x59\xbc\xd6\x39\xa4\x0d\x6e\x2d\xc3\x84\x00\xee\x66\x5c\x47\x5d\xfd\xb4\x72\xf5\xc2\x6c\x3f\x54\x33\xfd\x12\xa4\xbe\x51\xf0\x60\x7c\x58\x37\x05\xb3\x96\x9e\x3b\x38\x4b\x50\x82\x4e\x6a\x72\xc1\x47\x40\x6f\x3e\x30\x14\x4d\xc0\x20\xf4\xeb\xe5\x62\xdc\xcb\xc5\x38\xe9\x71\xf6\x70\x6e\x2b\xb9\x6a\x0e\x3f\x64\xd9\x18\xd3\xea\x00\xca\x58\x7f\xcd\x92\xc1\x07\xf8\xa1\x34\x82\x30\xf1\xee\x32\xf4\x62\x20\x17\x74\x69\xc2\xa1\xc2\x10\x81\x6c\x98\x21\xbb\x42\x14\x46\x97\x2a\x2d\x90\x69\x64\x04\x55\x2d\xbb\x25\x0c\x25\xa5\x7b\x5a\x37\xaf\x94\x2c\x42\xb9\x1f\x4b\x79\xc5\xda\x2c\xf9\x20\xa7\x4b\x82\x08\x3b\xaf\x9a\x80\x64\x2e\xc5\x25\xf4\x85\xf6\xf8\x8d\x49\x18\x10\xfd\x42\xd5\x9d\x54\x5c\x75\xf3\x63\xff\x07\x89\xf2\xb9\x48\x86\xef\x9e\x31\x3a\x44\xb6\x3c\xea\xad\xde\xef\x60\x42\xe3\xc0\x45\xf2\x7a\xbf\xfd\x9c\x37\x83\xdc\xf4\x0f\xee\x00\x56\x74\x04\x49\xbc\x85\xa0\x78\x45\xc1\xd7\xc1\x14\x34\x5f\x3a\x50\x5a\xba\x25\x77\x20\x3e\xff\x51\x34\x25\x3d\xa0\xa1\xec\x4b\x02\xf1\xc1\x50\x65\x95\xe3\x98\x05\xa9\xd8\x35\xd0\x3a\xe0\x2c\x2d\x0c\xc5\x4a\xdc\xfd\xa1\x96\xda\x96\x49\xfa\xf3\x23\xd5\xb1\x80\xae\x68\xe5\x03\x48\xcf\x6f\x21\x53\x07\xb4\x85\xee\x2e\xf4\x11\x84\xe0\xb0\x77\xde\x2d\x53\x8f\x4c\x2d\x9f\xe3\xef\xee\x70\x49\xc6\x50\x85\x40\x0b\x81\x18\x60\x02\x16\x50\x8a\x43\x46\x66\x88\x74\xc0\xbc\x3f\xc2\x8a\xd9\xc6\x09\xf7\xac\xef\x63\x22\x75\x64\x2f\x7f\xfd\x10\x3b\xd1\xac\x8f\x6b\x08\xce\x23\x0b\x4a\x08\xc4\x45\x29\x87\x44\x3d\x2f\x17\x51\x60\x4d\x0e\x32\x2a\x0e\x44\xb1\x9e\x86\x57\x21\xf5\xed\x40\xb0\x73\x70\xcc\x83\x20\xfa\x58\xf2\xce\x94\xaa\xb6\xb4\x5c\x5f\x91\xf9\x2f\x92\x13\x4a\xb5\xbb\x38\x84\x65\x62\x6e\xbe\x50\x1d\x1a\xd1\x50\x5d\xea\x05\xf2\x09\xd2\x4a\x78\xb1\xb8\x08\xd4\xc4\x5a\xa5\xa8\xd0\x69\xfa\x63\x91\x57\x6a\xf6\x39\x66\x4d\x3b\xf2\x9e\x7a\x46\xf6\xb9\x13\xab\x62\xcf\xaf\x2e\x52\x71\x7b\xde\x88\x36\xdc\x33\x4a\xff\x81\x99\x78\x12\x7e\x81\x0c\x88\xb7\x1b\x16\xc5\xbf\x73\x38\x89\xf7\x88\x7b\x5a\x88\x7f\xb2\x20\x39\x3c\xc3\xe3\x66\x7e\x6c\xd3\xb7\x93\xa9\xd5\xad\x52\x43\xa0\x2a\xe7\xb1\x41\x32\xbf\xb1\x62\x70\x38\xd1\xe4\x8b\xf4\x9b\xb6\xa2\x0a\x52\xb3\x58\x26\x86\x62\xbf\xac\x35\x9d\x85\xb7\x50\xfb\x62\xd1\x6f\xe6\x52\x84\xed\xcd\xde\x2d\x61\x2e\x24\xcb\xb7\x15\x8e\xac\x80\xaf\xf0\xd9\xc6\x26\x19\x52\x2c\x57\x29\xd3\x53\xe0\x70\x0b\xc8\xd1\x36\xaf\xc2\x2b\x00\x4c\x44\xa1\x7d\xbf\x9e\x3c\x31\x4c\x3a\xbe\x2e\xbf\xf9\x82\x8c\x3f\x41\x15\x6e\x6e\x46\xa5\x83\xb0\xea\x71\x18\x06\x71\x15\x02\x98\x84\xb1\x2d\x3c\x9b\x2f\x2d\xfd\x57\xe4\x6d\x2b\x01\xca\xa0\xfe\xe4\x96\x03\x20\xb1\xff\x91\x3a\x40\x16\x4d\x18\x8c\x2f\xc4\x02\x05\x6f\x1a\x1f\xaf\xca\x66\x4a\xed\xfe\xad\x50\xba\xf4\x0b\xb8\x02\xda\x7d\xbe\x92\xa3\xd7\x2c\xe2\x0e\x63\x9d\x25\x7f\xe0\xa2\x00\x84\x6c\x3c\x52\xd3\x6b\xa5\x82\x42\x88\x32\xe4\xf5\x4c\x4f\x1e\x1e\x59\x5c\x3a\xcc\xcb\x83\x99\x91\xf8\x49\xef\xff\xf9\x14\x18\x8d\xaf\xb5\xdc\xd6\x77\xb9\x69\x2b\x10\x1c\x71\xbf\x09\x2e\xb1\x0e\x75\x9a\x73\x68\x26\xdc\x57\x65\x82\x7f\x83\xe8\x4b\x40\x35\xa6\xb7\x36\xb5\x07\x94\x2e\x2c\x5b\x12\x1b\xd1\x02\x69\x75\x24\x79\x20\x79\x97\x2b\x80\x06\x40\xcd\xfc\xd2\x22\x65\x75\x80\xdb\xc8\x94\xe7\xdd\xe0\x1a\x3d\x72\x27\x4c\x47\x19\xb4\x23\xef\xa5\x8c\xf2\x67\x08\x6b\x2a\xf4\x83\xb1\xc3\x1c\x9b\x49\xe9\x65\xb3\x01\x6e\xc0\x3b\x56\xaa\x01\x6c\x89\xe9\xe3\x0d\x09\x95\x4f\x6e\xb2\x0f\x33\x94\x51\x18\x82\xef\xfd\xeb\xd1\x28\x5c\xfd\x26\x99\xa3\x0d\xa0\x4c\x21\x50\xfa\xad\xa9\x55\x58\x2b\xd1\x84\x1c\x9a\x10\xc3\x3b\xa4\xe1\x2b\x51\xd5\x6b\x60\xb9\x56\xd0\x64\x7c\xb9\x7f\x88\xdb\x40\xf3\x24\x48\xf3\x5a\x1e\x77\x08\x8e\xaf\x25\x6b\xfa\xb4\x12\x47\xb9\x12\xff\x81\x68\xfe\x70\x5c\xb2\xba\xde\x88\xb0\x1c\x57\xbc\x20\xf0\x09\x6f\x01\x4f\xd8\x22\x8e\x80\x21\x19\x21\x34\x48\x08\x8a\xaf\xd0\xc9\x15\x52\x65\x26\x85\x7c\x9d\x25\xcd\xdf\x54\x1c\x6c\x28\xc0\x46\x7f\x9d\x9b\x19\xb3\xb3\xc5\x42\x14\x22\x4b\x46\xff\xaa\x9c\x4c\x00\xcf\x2d\x60\x87\x2c\xc0\xd6\x2c\x21\xeb\x95\xc6\x90\x74\x4d\x58\xf3\x10\xd2\xfa\x36\x13\xeb\xa1\xba\xea\x71\x55\x39\x91\x51\x13\x54\xb0\x2e\x73\x94\x72\xfd\x4e\x68\xba\x63\x36\x44\x49\x75\x2f\xe9\x5d\xb9\xe7\x35\x35\xfb\x69\x64\x5c\xf5\x3d\x99\x4e\xae\x84\x1f\xb8\x10\xbb\x73\xed\xdf\x86\x6b\x80\xdd\x72\x5a\x1a\xa4\xbe\x09\x43\xc8\x6e\x61\x79\x7b\xf6\xd0\x6b\xfc\x6f\xfe\xb4\xa5\xba\xe2\x8c\x47\x42\xe7\x2f\x62\x72\x2d\xb5\xff\x6a\x3d\x00\xae\xe2\x91\x0d\x41\x24\xbe\x80\x53\xc7\xb2\x7c\xc8\xe7\x86\x1c\x7e\x3f\x6b\x1d\xb4\x6e\x67\x45\x5c\x10\x0d\x02\xa6\xc2\xca\xa1\xa0\xc5\xd6\x7f\xf3\xa8\x7b\x61\x27\xbb\xec\x89\xf8\x8f\x0d\xb0\x13\x22\x32\xac\x09\x11\x14\x04\x9a\xb7\xc8\xf5\x71\x53\x18\x1a\xc4\x17\x59\xab\xd2\xdc\x09\x52\x71\xdf\x81\xda\x68\x06\xc8\xcb\x97\x5a\xbe\x34\x24\xd1\x02\x97\xfe\x29\xa0\x1d\xc2\x93\x83\xc2\xcd\xd3\x8f\xc7\xc8\xda\xc4\x99\x2b\xe6\x93\x9f\xb3\x4c\x00\x52\x75\x9c\x48\x88\x3c\xc3\xe3\x9a\xeb\x4f\x79\x96\x2c\xe9\xa8\x5c\x13\x53\xee\x25\xc9\xf7\x79\x49\x13\x87\x09\xbf\xf5\x0a\x75\x25\x10\x9b\x02\x40\x31\xed\xd7\x59\x07\x0f\x9b\x21\xcd\x2f\x44\xc2\xf0\xca\xfd\x3a\x9d\x5a\x3b\x65\x26\x48\x7f\xc9\xfd\xf6\x68\x08\x4a\xd0\x6f\x5a\x0a\x6e\xff\x7c\x69\x60\x0a\x79\x24\x02\x5e\xdd\xc8\x7b\xa6\x6c\x3f\xea\xe8\xec\x76\xa6\x37\xd1\x04\xf5\x9f\x4f\x8f\x3d\x7c\x71\x71\x4a\xe6\x72\xaa\x9b\x8d\x75\x3c\x18\xa7\xe6\x94\x1d\xb5\x09\x8b\xc6\x90\xf0\x67\x0b\x34\x35\xa7\x05\x1b\x63\x0d\xef\xe8\xf1\xe0\x95\x00\x00\x3b\xc1\x15\xd6\x7c\x34\x40\x07\x9e\x0c\x22\x30\xd6\xab\x11\xea\xdd\x11\x9b\x08\x8c\x06\x99\x01\x18\x43\x5f\xe6\x47\x44\xc3\x35\x08\xd2\xd1\xec\xb2\x7f\x8b\x84\xfd\x01\x49\x6d\x91\x2f\xc3\x60\xdd\x49\xd2\x52\x87\x08\xcd\xfd\xfc\xd6\xa2\x7d\x96\x5b\xf6\x18\x06\xd7\x3b\x50\x18\x01\xc9\x00\xf2\xa8\x79\x67\x0b\x1d\x92\xd7\x51\xf6\xd8\xae\x59\xe4\xca\x10\xd2\x88\x00\x1e\x24\x50\x1e\xb2\xca\x9a\x98\x24\x99\x32\x4d\xcc\x27\x32\xa0\x1a\x69\x0b\x73\x4c\xff\x3e\x52\xe4\x5e\x9d\xb2\x3b\xd0\x37\x98\xc6\x4a\x84\xc5\x1d\x86\xda\x17\xec\x96\x76\x85\x3f\x94\x8b\xf8\x08\xc5\x37\x25\x0d\x39\x26\x64\x26\x14\x8c\x9c\x6e\xa0\x3f\xe1\x9a\xc0\xcd\x00\xa4\xc1\x63\x6e\x49\xa9\xa5\x29\x32\xd8\x13\x14\x01\x7c\xd9\xe3\x65\x28\x42\x90\x74\x70\x80\xf4\x88\x42\x53\x70\x11\x28\x0a\x16\x59\x6a\xaf\xec\xc0\x31\xa2\x20\x72\xa2\xce\x6b\xc7\xe1\x95\x85\x52\x97\xa8\xa8\xc9\x7b\x55\xd5\xad\x06\xb8\x27\xaa\x12\x9e\xb5\x1b\x1d\xc6\xbf\x47\xa4\x89\xa9\xc5\x8e\x44\xb1\x25\x9d\xe0\x47\xa0\xf7\x7d\x49\xa4\x8c\x30\x1e\x39\xbc\x34\xe0\x45\xf0\xb5\x13\x40\xa6\xaf\x89\x6c\x00\xfe\x71\x12\xfe\x61\x57\x5b\xc2\xe9\x16\x0b\x31\x52\x30\x6f\xa5\xb2\x3f\xfa\xc7\x30\xef\x5e\xe7\x41\xe6\xdd\x51\x15\xb2\x48\x28\x12\x21\x7c\xc7\xf5\xbd\xb9\x6d\xd4\xb8\x6a\x44\xed\xde\x05\xfc\x59\x6b\x1a\x1e\x41\xf0\x19\x21\xe2\x23\x20\xc9\xad\x97\x66\x9c\xcf\x71\x66\x20\xf2\x93\x0b\x6d\x08\xee\xf2\xbd\x8c\xa8\xef\x72\xcf\xaf\xec\xca\x68\x6f\x51\x22\x54\xc4\xf1\x23\x8c\x54\x4e\x1f\xdd\xa0\xd5\x2f\x77\x3e\x02\x85\x60\x8d\x05\x4f\x8b\x73\xf5\x11\x2c\x05\x02\x3f\x28\x05\x92\x7c\xfe\xa5\x48\xf3\xcb\x31\x1d\x73\x13\xe7\xd8\x03\x88\xa2\x2e\x16\xd6\x08\xfa\x66\xcc\x1b\x23\x54\xd5\x08\x49\x59\x07\xae\x99\x75\x35\x53\x28\x90\x8f\x69\x68\x77\xc0\x99\xcb\xde\x85\x3f\xbc\x2f\xa3\x6f\xee\xa3\x9e\xf7\x1c\x6a\x1e\x0f\xb9\x92\xd7\x28\x7e\x3f\xa0\x63\x79\x31\x00\xa4\xd5\x61\x22\xa0\xf6\xf8\x61\xce\xfc\xbe\x13\xd5\x3c\x32\xd0\x99\xd6\xb2\x4b\xe6\x83\x8e\x26\x72\x30\x8f\x70\x91\x3f\x03\x68\xee\xff\x8b\x60\xf9\x71\xfc\x8a\x8f\x38\x21\x85\xcf\x93\x28\xab\x2a\x26\x8f\xb5\xfa\x3f\x59\x67\x65\xdf\x1e\x0e\x49\x25\x12\x45\xfa\x69\x8f\xf9\x74\x8d\xc1\x87\x8d\x0b\x29\xfa\x00\xf5\x0f\x65\x8b\x81\x5c\xf9\x21\x6c\x45\x9d\xd9\xc3\x65\x84\x28\x95\xf7\x70\x82\x81\x44\x47\xf2\x4c\x1d\x0f\x72\xe7\x1f\x9a\x7b\x3d\x92\xee\x5f\xe6\x50\x38\x7f\xe4\x00\x68\x8d\x1e\xf1\x21\x92\x3d\x03\x5e\x45\x80\x93\xca\x86\x1b\xde\xd8\x4f\x16\x9a\x32\x95\xe0\x33\x9a\x41\xc1\x5b\xac\x49\xb4\xf7\x15\x43\xee\xbc\x1d\x5a\x07\xee\x45\x68\x82\xb8\x27\x79\xa4\x8d\xf3\x3c\x7c\x65\x3b\xda\xcb\x67\x4f\x58\xb8\x96\x0f\x73\x98\x36\x58\xd3\xf6\x92\x94\x48\xea\xcf\x4c\xf1\x8d\x8f\xd4\x35\xfe\x28\x25\x0d\xb5\x17\x63\x72\xa8\x1d\x47\x27\xc3\x59\xf8\x72\x0d\xa7\xb0\xb6\x83\xa8\x58\xd6\x53\x30\xdd\xec\xf0\x12\x5f\xb6\x99\xf7\x50\x34\x79\x1d\x4a\x3e\x64\xde\x10\xa3\xbe\xa1\x60\x00\x2b\x48\x89\x4f\x81\x29\xca\xc1\x6c\x9c\x87\xbb\xd7\x5e\x87\x39\x1e\xf3\x61\x1e\xe6\x50\xe1\xf8\x48\x7e\x60\xc8\x77\xa8\x6a\x5c\x93\xbe\x6c\x26\x07\x4d\xe8\x1c\x90\x92\x2a\x81\x8c\x4d\x70\x2e\x44\x82\xe6\x03\x68\xf2\x2e\x0a\xce\x25\x02\x21\x49\x56\x25\xf1\x2c\x12\x16\x61\x70\x25\xda\xeb\x62\xfc\xdb\x00\x7c\x43\x76\x63\x66\xa1\x66\xdc\x6a\x94\x58\x92\x6b\xda\x3d\x23\x08\x9e\x32\xd7\x50\x6a\x0e\xcb\x00\x9e\x28\xe9\x3b\xa0\x74\x19\xd2\x28\xe9\xe1\xaf\xcc\xc0\x31\x69\x5f\x79\xd3\x7a\x87\x5d\x36\xdd\x84\xba\x2e\x61\xb5\xf0\x12\x72\xe3\x74\x39\x0a\x8f\xd2\x4b\x06\xdc\x16\x56\x6e\x96\xf6\xef\x2a\x19\x07\xd8\xd5\x61\x93\xd2\xfb\x10\x93\x12\x0a\xd0\x14\xd3\x80\xa2\x47\x26\x5d\xb0\x93\x82\x71\x93\xea\xbe\x36\xd3\xfc\x58\xcb\x23\x0b\x87\x70\x17\xf5\x48\x02\x19\x30\xa2\xd6\xba\x21\x14\x1b\xca\x16\xfe\x0c\x53\x91\xa0\x06\xdb\xf9\xde\x5e\xea\x00\xd0\xac\xf8\x35\xc2\xa6\x44\x0e\x0a\x30\x15\xb7\xdb\xf9\x7e\xa4\x38\xc3\xda\xd2\x50\x36\x29\x3f\xf8\x40\xf6\xce\x57\xe3\x11\x52\xd4\xba\x30\xc4\x7e\x73\x89\xd4\x9b\xff\xf8\xa9\x4a\x30\xe3\x56\xa3\x07\x35\x5d\xca\x7a\x00\x83\x1a\x22\x1a\x10\x23\x0a\x45\x8c\x0c\x44\x81\xef\x8c\xa7\x4d\x7a\x21\x39\xf8\x7c\xbd\x44\x32\x92\x10\x44\x7d\x7a\x6a\x5c\x09\xbb\xf6\x1d\x3c\x08\xc2\x6a\xd2\x95\x04\x83\x39\x25\x54\x64\x91\x27\x40\x92\x3e\xc4\xca\x81\xea\xb1\x7d\x78\x4f\xf5\x6e\x59\xc8\x80\x08\x1e\x1b\x5d\xf0\xc2\xa1\x0b\xd0\x1c\xd5\xe3\x31\x84\x2c\xf4\x98\x24\x8c\xd3\xaa\xbc\xd8\x3d\x43\xed\x90\x03\x3a\xed\x76\xd5\x8b\x45\x92\xa9\x20\xcc\xce\x2b\xb7\x52\x2b\xa8\x3e\x22\xe8\x6a\x08\x23\xa8\x48\xdb\x01\xdd\xce\x6d\xa1\x8d\x19\xe0\x99\x0a\xee\x2d\x0f\xcb\x9c\x40\xe7\x04\xc4\x70\x5f\x70\x85\x4e\x57\x01\x08\x54\xce\xc9\x81\x38\xc1\x34\x22\x4e\x74\x67\xb0\x62\x5d\xd6\x22\xab\xbd\xa1\xf3\x03\xe1\x11\xc8\x9a\x6c\x52\xc5\x68\x7b\xe5\x41\xb8\x9b\xb4\x7c\x6d\x21\xec\x83\xe0\x3c\xf6\x36\x04\xb2\x26\xe6\x96\x04\xdd\xbc\xe6\xac\x98\xea\x98\x5d\x34\x79\x1d\xc4\xbb\x08\x89\x79\x06\x06\x07\x49\x66\x3f\xf3\x12\x83\x48\x8b\x84\x96\xb9\xc2\x8e\xde\x75\x49\x09\xab\xb1\xd7\xe9\x25\xc5\x0a\x78\x80\xc4\x06\xa7\x8e\x7b\x52\xc2\x02\xe3\xad\x13\x25\x1d\xa1\x75\xa8\xae\x81\xe1\x23\x67\x1b\x36\x27\x8f\x3d\x91\x65\x26\xc0\xc8\xae\x45\x60\x78\x26\xb2\xc1\xba\x42\xcf\x12\xc0\xe2\x26\x2d\x69\xc4\xbe\xda\x65\xb8\x9a\xd6\x46\xbf\x68\xe0\xce\x58\x5e\x14\xf1\x36\x00\xb3\x23\xec\x0e\x15\xca\x3a\xa0\xf5\x79\xc2\x10\xe8\xa3\x10\x87\x36\xa5\x99\xbd\xe7\x07\x02\xb9\xd3\x70\x3b\x77\x58\x4c\x84\x77\x07\x73\xb1\x1d\x20\x54\x76\x24\x81\x7e\x46\x54\x3a\xaf\x2b\x00\x3d\x82\xeb\x40\xa2\x86\x84\x97\x2e\x4b\x93\xc0\x81\x3d\x01\xe6\x21\xb7\xd9\xad\xee\x4f\xa6\xb5\x3b\xeb\xb5\x79\x15\x6c\x4a\x10\x9e\xf6\x7a\x1a\x73\x8a\x43\x48\x48\x12\x79\x98\x40\xe8\xbc\xf5\x24\x7d\xfd\xef\xed\x95\x18\xe4\x42\xcf\x76\xa1\x13\xf8\x5f\x42\x1e\x8c\x4a\x98\x61\x14\x3d\xeb\xde\x2f\x30\xb0\x96\x8a\x4a\x21\x5f\x17\xc8\x2e\xc1\xd2\xe6\xe3\xb9\x0c\xc7\xfe\x7c\x84\xf8\x59\x7a\xfd\x0f\xa5\x4f\x81\xf9\xe1\x23\x99\x88\xaf\x4a\xe3\x58\x04\x22\xa2\xbe\x1f\x0a\x6f\x7a\x98\x53\xd7\xba\xf1\x2e\xb1\x8a\x93\x2e\x4e\x3b\xbc\x8d\x71\x6c\x8b\x4d\x5a\x46\xca\x7f\x00\x29\x60\x0d\x73\xd1\x87\x14\xab\x51\x8c\xa1\x0c\xc7\xd9\x4a\x1d\xf8\x85\x92\xd7\x50\xb1\x1f\x09\xbc\xfd\x96\x7f\x4d\x42\xe5\x7f\x6d\x08\x1f\xa5\x8d\x6c\xf6\xce\xd1\x91\x0d\x5e\x05\x42\x41\x9f\xb7\x53\x4a\x64\xd4\x88\xc9\x23\x3e\x1d\x48\x59\xef\x5f\xb8\x8f\x2f\x12\x8a\x15\x44\x04\xad\x77\x08\x85\xdc\x84\x94\xfc\xc8\x82\xbf\xa7\xaa\x08\x93\xd8\x76\x39\xaf\xaf\xba\x48\xfe\x57\x8e\x22\x12\x67\x5a\x59\x9a\x75\x79\x11\xca\x94\x38\x85\x81\x90\xa6\x25\x1e\xcd\xa4\xde\x38\xe4\xdf\x21\x31\xe2\x65\x82\xd4\x17\xc7\xf6\x24\xef\x0c\xfc\xdc\xbb\xc3\x3a\x1a\x9b\xc7\xfd\x50\x77\x44\x86\x1e\x7c\x29\x3f\xaf\xd2\x24\x3f\x3f\x30\x29\xea\x8b\x98\xe7\x1f\xa2\xa6\x3f\x14\xa3\xff\x04\x0a\xf6\x13\xa5\xd1\x4f\x5e\x55\x25\xb2\x08\xf5\x0b\x8f\x04\x1f\xfe\xa4\x4a\xec\x97\x05\x2c\x31\x7f\x40\x37\xf5\xfb\xf0\x49\x63\x39\x9b\xcf\xbf\x90\xd2\xef\xc4\xd1\x0a\x60\xf3\x99\xcb\xe8\x11\xad\x8f\x5a\x65\x4c\x81\xee\x0a\x82\xfa\xeb\x4f\x78\xff\xaf\xf4\xfe\xa7\x16\xe3\x2b\xc8\x13\xf0\x00\x79\x09\x33\x74\x02\xbf\xc9\x95\x7b\x7c\x8b\xe1\x9f\xb4\x4c\x96\x60\x13\x59\x6c\x53\x77\xbf\x86\xf0\xff\xff\x74\x32\x31\x01\x43\x6a\x0a\x85\x92\xb7\xf2\x91\x2f\x17\xf1\x14\x9e\xa8\xad\xdb\xe3\x50\x99\xee\x75\x2f\x09\x42\x32\x94\xb4\x49\x16\x36\x19\xad\xa2\x36\xc7\x8b\xe6\x4b\x01\x86\x5f\x7f\x74\x64\x9e\x04\xfa\x3d\x9d\x40\xeb\x7a\x26\xf3\x2d\x24\xd1\x7e\x71\xc2\xec\x02\x26\xbb\xe4\x4b\x38\xe5\x7b\xce\xda\xb6\x27\xe0\xee\x89\xb4\x9a\x14\x4e\x90\xf3\xf2\xa5\xee\xe8\x33\x03\x22\x89\x20\xbd\xbd\xb3\x7f\x26\x0d\xbf\x9e\xe9\x94\x77\xc8\x19\x5e\x8a\x72\x09\xa1\x45\x37\x2c\x40\xd0\x11\xb2\xc7\x7f\x42\xfc\x3d\xbc\x3a\x2a\xd8\x3f\x14\x27\xae\x24\x8c\xc2\x08\xc4\x2f\x45\x65\x6e\xaa\x86\x61\x4c\xdd\x48\x78\xb7\x2e\x9b\x60\x9f\x3b\xe0\xef\x8e\x01\x4a\x81\x01\xda\x28\x58\x4d\xfc\x0f\xc7\x27\x77\x0d\x2d\x85\xfb\xb4\xf7\x87\x40\x9a\xb3\x4c\x04\x02\xcd\x72\xc3\xb1\xe8\x1a\xa8\x79\x41\x48\xd0\x4d\xc4\xd0\xdc\x75\x11\xe6\x83\x35\x67\x00\x82\x64\x1e\xe2\x06\xe3\x21\xe0\x0a\xc5\x8e\x5b\x56\x08\x1e\x6b\xf2\x72\xf3\xb7\xd8\x42\x48\xb1\xbb\x89\x61\x20\x89\xe0\xd5\x46\x0b\xf8\x0c\x58\x90\xae\x2a\x15\x15\x0b\x75\x76\x45\x2a\x2a\x03\x1e\x0c\x1d\x04\x50\xd9\x1f\xd9\x95\x08\x6c\x74\x1e\xde\x38\x59\xd0\x57\x37\x1a\xb7\xde\x8a\xd3\xb8\x7b\x16\x4f\xfc\xd6\x68\xf3\x9e\x37\x42\x88\x22\xcd\x75\xcf\x1c\x6b\xdc\x93\x5d\xc5\x1f\x0a\xb3\x8c\x10\x16\x0e\x6d\x96\xd3\x06\x6b\x4b\x8e\xd8\x61\xc8\xfa\x20\x7f\x93\x12\x3f\x78\xca\x61\xea\x69\x9d\x43\xe5\xc2\xfa\xfd\x27\xc7\x45\x77\x0e\xd2\x2f\x30\x4e\xb3\x54\xc6\x2c\x16\x94\xf8\xce\xe1\xa2\x6f\x17\x56\x25\xe1\xdb\xd5\xa7\xb8\x52\xa2\x7d\xf6\xca\x32\x51\x0c\x4d\x7f\xef\x38\x81\xed\xa9\xf2\x83\x49\xba\xf9\x09\x6c\x85\x9f\xff\xa3\x84\x0b\x01\x4c\x5f\x4d\x0c\x77\xab\xb0\xb7\x22\x1c\x4b\x5e\x01\xab\xbf\x9a\x2b\xe9\x55\x9b\xf2\xd9\x55\x69\x22\x7f\xd9\xcc\x85\x10\x96\xca\x61\xf8\x65\x8f\x63\x83\x25\xdb\x07\x02\x32\xc0\xb8\x10\xc0\xe8\x64\xe6\x09\x63\x82\x5d\x80\xa7\x3d\xd3\x06\x85\x9f\x62\xbc\x72\xdd\x2c\x1c\x7a\xa8\x1a\x25\x46\xc1\xa8\x99\x52\x58\x26\x47\x3a\x38\x0c\x4f\xf4\xcf\xec\x83\xe8\xa4\x17\xaf\x9f\xff\x54\x98\xc6\xe8\xac\x92\xea\x99\x16\x9d\xb4\xc1\x02\x26\x6a\x14\x28\xca\xfd\x31\x02\x0e\xe5\x14\x50\x6e\x7c\x38\x75\x53\x17\xee\x38\x93\x58\x4c\x08\x71\xce\x8c\x0b\x28\x8e\x01\x78\x42\x6b\xa9\x08\x3e\x36\xcd\x3a\x05\x50\xaa\x37\xc3\x59\x18\xa1\xc3\xda\x14\x22\x41\x2c\x0c\xe9\x99\x14\xca\x95\x57\x61\x59\xed\x2a\x07\x7f\x7b\x51\x89\xf1\x6a\xb8\x50\xee\xe2\xf0\x49\xee\xb1\xc2\x84\xd5\xa3\x05\x28\x52\xff\x7f\x4a\xe9\x5c\xdb\x5b\xff\x76\x9b\xa5\x16\x75\xad\x85\xf6\x20\x3e\x21\x23\xe6\x89\x36\x5c\xd6\xf3\x10\x90\xb4\xb0\x07\xbc\x80\x89\x1a\x14\xac\x04\x41\xb1\xd0\x6b\x33\xfe\x73\x90\x76\x0d\x0a\x35\x02\x0a\xcd\x5b\xe0\xa1\xb8\xbb\x64\xa1\xaf\x70\x02\x03\x3e\x2a\x80\x52\x1a\x64\x5c\x53\x5d\x08\xb4\x9a\x6c\x10\x42\x00\xd3\x54\x7c\xb6\x6b\x4b\x31\x83\x90\x1e\x58\xa2\xe9\x03\x6e\x8a\x27\x03\xb0\x94\xa0\x51\x73\x5b\xfa\x33\x0b\x59\x62\x1b\x1b\x49\x0f\x67\x8f\x6b\x3b\x09\x53\x84\x54\x72\x89\x88\x4b\x42\x51\x60\x88\x38\xc9\x60\xd5\xe2\xc7\x19\xdf\x0a\xa8\x95\x42\x2a\x12\x4e\x32\x04\x54\xbd\xd8\xe7\x3a\x10\x8b\x9a\x3a\xf7\xc4\x6f\xa8\x47\x7d\xe5\xff\xaa\x10\x5a\x47\x5d\x9f\xb4\x4f\xbc\xe4\x5d\x71\x35\x1b\x30\xc7\xe4\xfc\x32\xb2\x5f\x45\x61\xa5\x3c\xfb\x94\xed\x6a\xa8\xb2\x9c\xc7\xd0\xeb\x19\x34\x17\xb1\x48\x00\xbc\xc6\xcb\xbe\xb2\x8f\x7b\x75\xcd\x7b\x09\x59\x5f\x7d\xd8\x2e\xc0\xbf\x23\x74\x73\x5e\x74\x8a\x93\x89\x4d\x03\x7c\xd5\xaf\xe0\x8e\xe4\x36\x5d\xaf\xe7\x52\xb0\x36\x83\x9b\x3d\x0c\x0f\x42\xbe\x87\xe1\x56\x43\x75\x87\xea\xf4\x01\x13\x0b\xd6\x16\x90\x62\xdb\x15\x81\xff\xc8\x3e\x89\x0a\x70\xf5\x49\x78\x9c\xcb\x65\x1a\x67\x46\x8f\xc7\x3c\x10\xc0\xf5\x8f\x62\x49\xe9\x45\x70\xfa\x95\xea\xd3\x46\xd3\x84\x25\xa6\x70\x66\x4a\x4d\x99\x29\xb1\x6a\x8b\x21\xc1\xdc\x22\x0d\xf6\x10\x36\x01\xa8\xf0\x0c\xf0\x80\x42\x3e\x9a\x98\x5f\xb0\xcf\xe1\x9d\x4b\xab\x40\x6c\x23\x1f\xd2\xf4\xe0\x49\xc5\x31\x7a\xcf\xc4\x72\x9d\x14\x10\xaf\x94\xbc\x8f\x81\xf0\xd8\x2c\x89\x1f\x95\x00\x4e\x71\x8d\xce\x2a\x7b\x41\x0b\x3c\xb7\x09\xf5\x78\xe9\x02\xd9\xf5\x23\x36\xad\xe3\x63\x01\xaa\xa7\x30\x67\x9f\x77\x2f\x98\x59\x3d\x08\x4d\xab\x0f\xdf\x04\x35\x01\xa2\xd7\xae\x4d\x5e\xe4\x98\x5b\x9d\x01\x55\x6b\xf6\x37\x65\xa7\x2d\x8d\x4d\xc2\xb8\xe3\x2a\xd4\x59\x00\xbd\x11\x49\xec\xe2\x2c\x01\x89\xcb\x13\x15\x86\xec\xb7\xaa\xbd\x46\xec\x8b\x0e\x15\x50\xff\x16\x3c\x93\xe8\x2f\xcf\x59\x8f\x9c\x9b\xf9\x72\xca\xec\xc6\xe2\x7e\x66\x33\x8d\x7a\x26\x0a\x2b\xd8\x5d\xdd\xc3\xb1\x47\x8f\xe1\x89\x8a\xdf\x25\xc8\xda\x41\x7a\x8e\x45\x74\x03\xb2\xde\x65\xa6\x52\x92\xbd\xde\x8b\xce\xda\x7b\x03\xcf\xc4\x59\x7f\x43\x38\x1b\x34\x7a\x89\x63\x43\xe3\xb3\xf2\x7e\xda\x88\x85\x58\xb4\x3b\xfd\x6a\x92\x73\x26\xf1\x10\xa1\xbd\x11\x4e\x3d\x4c\x19\x9d\x89\x59\xc7\xd3\x26\x17\x9c\x4f\x9d\xf2\x16\x05\x7f\x9f\xdf\xfd\x57\x13\x95\x84\x38\x04\x3d\xea\x05\xd5\x15\x07\x42\x55\x80\xa1\x5b\x13\x7e\x58\x8f\x7e\x4b\x1c\xc8\x2e\x15\x67\x9e\x16\xf3\xe6\x1e\x18\xa4\x85\x04\xd0\x19\x29\xe3\x03\x1d\xf4\x8b\x3e\x8f\x36\x31\xba\x02\xdf\x16\x90\xae\x72\xea\x2b\x6b\x39\x99\x17\x38\x94\x06\x74\x0c\x1c\xf5\x71\x10\x11\x00\x77\xaa\x88\x7e\x94\x10\xe3\x3c\xbe\x93\x1e\x0b\x1f\x81\x8f\x4b\xdf\x75\x90\xb4\xf2\x2d\xd7\xca\xb3\x5f\xe5\x5e\x6d\x73\xa9\xca\xb4\xcb\x31\x2b\x2d\x0f\xd8\xdc\xbd\x7c\x91\x6f\xee\xd0\xff\x43\x0c\x5c\xe0\xd5\x38\x1f\x3d\xe6\x14\x23\xf5\x03\x0c\x58\x3a\x7f\xc2\xc5\x04\x8d\xc3\xf1\x20\x1d\xe5\x20\xf6\x4b\xf0\x35\xd8\xfe\xfd\x08\x11\x47\x41\x25\x29\xf5\x00\x7b\x2f\xe0\xdc\x79\x25\x22\xdc\xce\x35\xea\x59\x16\x2f\xda\x8c\x18\xba\x5d\x22\x68\x87\x2b\x69\x7b\xc0\x73\x0a\x12\xec\xc1\x1c\x0c\xb0\xcc\x1c\x6d\x40\x34\x68\xe0\x37\x74\x8f\x07\xa8\x19\xbe\x95\x21\x19\x34\xd8\xb5\xe3\x21\x84\xfd\x3f\x20\x46\x7b\xde\xd4\x55\x3b\xe4\x12\x05\x47\x95\xb7\x96\x78\x65\x0a\x06\x4d\xbc\x56\x7f\xcc\xdd\xcb\xb9\x49\x19\x03\x62\x42\x4c\x1f\xe0\xb5\xf5\xe7\xae\xac\x3e\x30\xf7\xe7\xab\x84\x56\xb0\x0c\xd8\x8a\x30\x67\x85\x32\x16\x65\x28\x82\xba\x14\x22\x91\x7e\xdc\x87\xc8\x27\x97\xb6\x9c\x59\xcd\x68\x12\xf6\x7b\x55\x26\x67\x2f\xcf\xc2\x85\xe6\x7d\xfb\xd7\x32\x07\xbe\x0c\xec\x74\xf6\x79\x61\x93\xb6\x4b\x39\x1f\xd8\x9e\x46\x64\xd9\x95\xc5\xb3\xe5\xf0\xc1\xbc\x51\x07\x02\xed\x53\x81\x76\x8e\x39\xd3\x9e\xdf\xca\x2c\xee\xf9\x75\xc9\xdf\xe8\x29\x97\x86\xdd\xda\xfb\xc2\x49\x9b\x85\xee\x37\xa5\x1e\x67\x83\xc5\x71\x52\x20\x61\xec\xcd\xfd\xdb\x57\xaf\x67\x6f\x75\x3b\xc4\xab\xdb\xd0\xd4\x3a\xd4\x28\xda\x5a\x0b\x26\x01\x50\xb6\x52\x57\xcc\x05\x0e\x8f\x6f\xc9\x1b\x2d\x61\x47\x14\xba\x88\x80\x99\x09\xe9\x65\xb7\x89\x89\x30\x57\x56\x65\x8d\x18\xe1\x42\x5f\xb9\xcd\x3d\xdd\x19\x80\xf6\x4a\x79\xa4\x1d\x36\x8d\x8a\xb8\x90\x59\x50\xdc\x2a\xf8\x14\x5d\x84\x93\x2a\xcb\x65\x73\xbd\x4b\x42\x45\x9a\xcc\x6c\xf3\x1a\xa0\xbb\xa6\x45\xba\xcd\x13\xe5\x8f\x06\xc0\x16\xc9\xe0\xdb\x34\x24\xd8\xf2\x25\xf9\x21\xf7\x81\xfa\x21\xba\xce\x1e\x2e\x21\xef\xa8\xf9\x93\xd7\x50\xa8\xdc\x5a\xb7\xbd\x65\xbc\xfd\x7e\xe0\xfe\x9e\x47\xa2\xbd\xfa\x3d\x07\x0a\x0e\xf6\x4f\x67\x0e\x30\x9d\x5a\x27\x87\xd8\xfd\x11\x3c\x5a\x9f\x02\xd2\xfd\xd6\x3d\x14\x7c\xfa\xb1\x29\x1e\xcd\x8e\xe9\xb7\x20\x2b\xb5\xb1\xf5\x0d\x09\xd9\xe7\x75\xc2\x94\x4e\xe0\xb8\x56\xfa\x06\x6e\x4e\x5d\x35\x04\x8c\x02\xef\x97\xd0\x3f\x7a\xf0\x92\xdc\x53\xaa\x72\xed\xb9\xab\xdc\x86\x1c\x39\xf7\x43\xec\xdb\xc4\x79\x27\x64\x8b\x02\xf2\x86\xc4\x27\x37\xf4\x0a\xaf\xc2\x6d\xd6\x3f\x38\x97\x10\x33\xf5\x6e\x36\x7d\xe1\x71\xe5\x8f\xc4\x51\x0e\x21\x22\x4a\x04\x63\x29\x93\x21\x6b\x4f\x56\x41\xe6\xde\xa8\x8b\x73\x8f\xbd\xa1\xe7\xb8\xf9\x2e\xc4\xf4\x46\x5e\x91\x0e\xc6\x61\xaa\x2d\xb7\xc8\x88\x58\x9c\xfa\x24\xec\xdf\x6f\x33\x54\x1a\x03\xc0\x07\x52\x15\x6d\xe8\x60\x73\xb4\x2b\x88\x1d\x7a\x4a\xd9\x6e\x3c\x07\xba\x49\x31\xc4\x80\xcc\xdf\xc0\xf5\x4d\x85\x9e\x37\x6b\x3e\xd6\x03\x04\x0a\xad\x3a\x8b\x71\x85\x7d\x1d\xbf\x81\x44\x37\xa9\x80\x6b\x9d\xce\x58\xfe\xb8\x34\x12\xde\x0f\xc2\xbc\xca\x4b\x50\x74\x74\x22\xaa\xb1\x43\x47\x80\xa2\x3f\x90\x40\x70\x8c\x57\xd9\x3d\xb5\x4c\x1d\xa2\x42\xdc\x58\x79\xc4\xcf\x5e\x4b\x7e\x7d\xe1\x0a\xab\x0d\x41\x02\x71\xc7\x72\x1e\xc4\xe3\x5b\xaf\xbb\xda\xff\x5e\xb9\x76\xfd\xcd\x7b\x3b\xc6\x3c\xd6\x42\xdf\x24\x34\x4a\xbe\xec\xd8\xaf\xad\xb9\x2e\x31\xe5\x5c\xb3\x8d\x21\x89\x3b\xcb\x8d\xb3\xb2\xc2\xa9\x91\x8a\x4e\x79\xff\x30\x17\xba\x7a\xa9\x57\x6d\x83\x7d\x38\x04\xc5\x13\xeb\xdf\x3b\x42\xc2\xfc\xe0\x49\x48\x1c\x1e\xaa\x5f\xc2\xbc\x7d\x84\x93\xfb\x30\xad\x0b\x9c\x1d\x31\x6e\xc2\xbf\x61\x94\x6b\x6f\xbb\x84\x94\x24\xa8\x64\x13\x0e\x0e\xc0\xd7\x14\x32\xcf\x70\x47\x8d\x48\xe0\x45\x98\xe2\xf0\x58\x68\x15\x2f\x46\x23\xdd\xc2\xd1\xaa\x29\xf7\x80\x0a\x1c\xdb\x26\x47\xe8\x29\xf8\x6a\xc6\xac\xd1\xb3\xb9\xfb\x92\x56\x35\x33\xd2\x35\x8d\x67\x96\xbb\x53\xcf\x27\x0d\x66\x4b\x51\x97\x81\xcb\xd2\x4d\xa8\x1d\x50\x38\x4a\x7f\x2d\x75\x3e\x78\x46\x4b\xf5\xc9\x8c\x47\x3e\x3e\x86\x98\x12\x67\xb6\xcb\x99\x84\x89\x5a\x5a\x6a\x69\x09\x21\xc5\x05\x0c\xeb\x39\x24\x93\x3e\x14\x72\x2a\xb0\x9e\x22\xee\xee\x0e\x57\xa5\x5b\x3d\x90\xa0\x78\x6f\x86\x42\xf3\x39\x66\x6c\x81\x8b\x66\x83\x01\x96\xf9\x53\x37\x46\x53\x38\x14\x95\x86\xc2\x83\xbf\xbe\x2f\xf9\x54\x2f\x3b\xe7\x8b\x8e\xe5\xfb\x71\x74\x9e\xe7\x96\x96\xc6\x90\x5a\xe6\x06\xc2\x43\x01\xc5\xff\xfd\x7c\x04\x2c\x6f\x68\xea\x48\x8d\xfa\xb2\x7c\x4d\x64\xac\x6d\x88\x92\xc1\xd2\x04\x35\x97\x3c\xf8\x78\x64\xf1\xaa\x48\x56\x18\xc3\x20\x87\xe4\x49\x10\xc9\xde\x76\xb6\xd6\x0b\x58\xf9\x0a\x64\x7a\xb6\x34\x91\x04\x44\x3e\x1e\xb5\x60\x26\x60\x8f\x73\x80\x5f\xb8\xc7\x87\x04\xdf\x2f\x34\xa2\xd2\x52\x3d\x5c\x55\x57\xfc\xcd\xd5\x9f\x0b\xe0\xdc\x89\xa3\xf9\x45\x51\xc1\x93\x88\xbf\x36\xa2\x76\x89\x23\xa9\xb4\x23\x85\xe1\xcb\x2b\xc7\x93\x63\x4d\x70\x1f\x83\x61\x8b\x5d\xf1\x68\x9b\x0a\xae\x27\x3c\x17\xbc\x81\x06\x4c\x8f\x58\x3c\xa7\x39\x8f\xdf\xd0\xa3\x35\xf4\x83\x2c\x9a\x39\x3b\x9d\x6c\x7e\x15\x58\x3d\xf4\x88\x82\xad\x9d\x54\xce\xb0\x93\xf3\xc7\xdf\xe1\x76\x0a\xf6\x2f\x52\x4f\xbd\xe5\x44\xdf\x47\x46\x0b\x37\x3b\x59\xe7\x9b\x4a\x69\x5f\xd9\xd5\x7f\xc5\x9e\x16\x83\x72\xe9\x03\x00\x1a\x34\x31\x98\x03\xcb\xe7\x95\x0e\x62\x00\xed\x69\x52\xfd\x73\x2a\x1c\x41\x41\xe5\x97\x9e\x46\xf6\x86\xf5\x53\x00\xd7\x3c\x75\xe9\xf5\x4e\xff\x34\xea\xb7\x80\x36\x4d\x25\xa5\x2e\x60\x7e\x9e\xc5\xf5\xa3\xe7\xd7\x2a\x4b\xa5\x2b\x5c\x96\xac\x3f\x5b\x85\xe8\xdb\x04\xb0\x3b\xa4\x43\xd4\x6c\x67\x80\xd8\x5b\xbf\x90\xbd\x86\xd8\x9b\x87\xbb\x93\x1f\xcd\x04\x2c\x03\x61\x70\x6c\xa3\x26\xc0\xf6\x42\xf4\xc8\x5a\x0b\xa4\x4d\x05\xbe\xe3\x14\x70\x4a\x2a\x06\x4c\x3e\xcf\xde\x42\x0f\x29\x39\x26\x3f\x3e\x10\xa3\x67\xef\xe0\xc7\x83\x79\x8c\x53\x02\xc6\x5b\xfe\x4d\xfd\xa2\x74\xfc\xa8\x4a\x95\xcd\xc9\x07\xe6\xcf\x02\x49\xb7\x12\x37\x67\x3d\x5f\x65\xfa\xdd\x63\xfb\xaf\x0e\xa1\x42\x33\x2a\x4d\x9f\xb3\x36\x61\xa4\x2a\x38\x9b\x05\xe2\x2f\x5b\x18\x10\xbb\xfb\xb3\x08\x4f\x77\x5d\x8d\x6f\x40\x98\xdd\xc5\x68\xd0\x1a\x3c\xf3\x82\x6a\x9d\x45\xe2\x4b\x04\xb1\xd9\xf2\xf1\x23\xf8\x9d\xf2\x47\x1e\x57\x42\xf6\xac\x21\xe7\x2a\x40\xa7\x2f\x45\x43\x0c\x82\xc6\xa0\x5d\x01\xa5\x17\xc7\x67\x4e\x78\xb4\x41\xeb\xd0\xb8\x86\xa3\x24\xbc\x80\xd0\x0b\x41\x24\x80\xf5\x4e\x90\x73\x7f\x08\xd7\x4b\x42\xe6\xad\xb9\x9b\xdb\xd9\xda\x73\x21\x91\x24\xdb\x91\xa5\x83\x71\xfd\x56\x3f\xc7\x18\x6e\x8e\x9e\xf5\xd4\xa6\x36\xda\x69\x1a\x4f\x90\x60\x5c\x7d\xd2\x30\xe2\x9d\xdd\xd8\x25\x7a\x4c\x0a\xce\x38\x85\x66\x13\xab\xa0\xa8\x45\x7e\xb8\x0c\x49\x2a\x1b\x7e\x9e\x1b\xc7\x63\x16\x4b\x93\x2a\xcf\x4d\xe3\x69\xde\x84\xa3\xab\x36\x4c\x97\xaf\xf8\x88\xfb\x2d\x24\x65\x3a\x39\xcc\x44\xef\x4a\x24\x60\x42\x99\xc5\xff\x4b\x12\x10\xd3\xfa\xbd\x57\xa0\xf1\x06\x56\x2a\xfd\xc3\xfa\xe6\x59\x91\x6d\x0b\x60\x5e\x3c\x5f\x29\xd8\xe3\xa3\x80\x05\x23\x90\x64\x3c\x98\xce\xd1\x96\x6a\xca\xc6\x94\xce\x90\x7b\xba\x66\x51\xbf\xe1\xb1\xc5\xe9\x1a\x3c\xb6\x68\x29\x55\xc7\x4a\xfc\x1c\xa5\xd4\x1e\xd0\x46\x17\x5c\x6f\x26\xe5\xce\x02\x92\xcc\x2c\x18\xe2\xbb\x7c\x51\x5c\xf4\x11\x5a\x42\x8f\x53\xb2\xa6\x0e\xd4\x63\x23\xe2\x40\x3d\x9f\x87\xf9\x43\xf1\x10\x83\xe8\x21\xf1\x67\xc0\xf3\xd4\x5c\x5a\xd8\x31\xc9\xf2\x58\x59\x7f\x7d\xc0\x18\x98\x2b\x72\x00\xf5\xb2\xbe\x08\xd5\x29\x9b\x94\x74\x95\x6f\x38\xf4\xa6\x92\x6a\xc1\x8f\xb9\xc1\xfe\x1f\xb1\x66\x9d\x0f\x26\xd8\x21\x41\x95\x67\x89\x50\x09\x1d\x28\xdb\xc4\xc7\x9c\xae\x96\x41\x03\x92\xcf\xef\x84\xcb\x52\xb1\xd6\xfd\x08\x60\xba\x05\x63\x24\x40\x1e\xd6\xe7\x51\xe6\x2a\xcf\x01\x08\xf4\x96\xf3\x01\xe1\x5f\xff\x05\x18\x08\x31\xa0\xea\x3d\x7c\xbc\x1c\x4f\xf7\x92\xfa\x17\x66\x1b\x6a\x1c\x11\x4a\x2e\x38\xdf\xa1\x33\xa5\xa9\x86\x0b\xfa\x79\xb0\x37\x79\xa9\xdd\x2d\xb6\x54\x89\xce\x33\xd5\x0a\x91\x81\xfa\x03\xea\x13\x8a\xf0\x6b\xdf\x35\x7c\xa1\xcd\x79\xd8\x4a\x30\xcd\x73\xc0\x61\x32\x07\xc6\xd9\xf1\x62\x04\xf0\xbd\x66\xcd\x0a\x87\x7a\x64\x82\xfc\xe0\xd4\xaf\x68\x0c\x2b\xae\x44\x05\xdf\xa1\x62\x12\xab\x70\x24\x1a\x7d\xb0\x76\xcc\x73\x9c\x43\x1d\x3e\x5e\x83\x1b\x00\xf4\x04\x82\x9c\xa9\x8f\xa1\xf6\x52\xaa\x2a\x4e\x04\xf7\xb1\x20\xc4\xaa\x3a\x80\xb7\x2f\x7e\x08\x18\x61\x8e\x47\x67\x70\xd9\x7e\x62\xf8\x80\xfd\x62\x80\xf7\xd7\x8f\x55\x36\x89\xd8\x0d\x01\x7e\x19\x4a\x90\x87\x07\x1b\x14\x01\x4d\xa2\x0f\x6a\xd0\x1d\x4c\x48\x94\xe0\xfc\x75\xd6\x9a\x03\xaf\x38\xab\x65\x18\x9a\xc4\xf5\x30\x07\xfa\x94\xeb\x7b\xd5\x43\x87\xe8\x0d\x01\x32\x14\x74\x64\x80\xd4\xa4\x10\x82\xc8\x8a\xb3\x7d\xb0\x37\xb5\xbe\x03\x5f\xa8\x81\xfb\x90\x43\xab\x75\x50\x72\x6a\xc8\x9b\x4c\xb6\xc0\xba\x2a\x11\x9e\x17\xd3\x58\xd6\x9f\x55\x19\x6e\x2d\x85\x68\xc4\x4e\xc0\x1f\x98\x71\xf1\x02\xe6\xe6\xae\xf5\x5e\x65\xc0\xf5\x0a\x27\xae\x4a\x4b\x80\x21\x69\x98\x0d\x31\x01\x7e\x63\x0d\xad\x70\x88\x67\xa2\x4c\x18\x98\x57\x17\xf4\xe6\xfc\x54\x31\xf6\x7f\x72\x5f\x6b\x2e\xfd\xd6\x5a\xdb\xf4\xf3\x7f\xb4\xea\x22\xa6\x8c\x6e\x17\x7d\x0d\x34\x5f\x4d\x83\xec\x93\xce\x2a\x55\x2b\x6c\x2c\xdc\x1c\x68\xc6\xd2\xa1\xb2\xd0\xde\x5e\x45\x54\x9f\x3a\xf3\x53\x46\x5c\xf6\x1c\x2c\x5b\x65\x28\x9d\xf9\x5e\x7e\x2a\x7d\x00\xb0\xfa\xf2\x21\xd6\xad\x50\x29\xac\x2f\xff\x04\x1f\x7c\xb2\x95\xed\xff\x3c\x6f\x40\x32\x06\xcc\x10\x98\xb6\x42\x05\x2c\x9b\xdf\xcc\xf4\xba\x2a\xe7\xb3\x09\x64\xfd\x91\xb4\x82\x56\xf6\xa9\xa8\x29\xab\x20\xd6\xbf\x2c\x3c\x13\xe5\xde\x7b\x08\x16\xf3\x9f\x40\x66\x88\x08\x3b\xd0\x2b\x0e\xad\x1c\x63\x55\xd6\x52\xde\xc6\x7d\x99\xf5\x5f\xc0\x6d\xf6\xa0\x9f\x38\xec\xf0\x0e\x4e\x66\x62\xa5\x99\x89\x61\x26\xe9\x87\x70\xf6\xfc\x2e\x90\xa4\x24\xe9\x10\x64\x3e\xeb\xbd\xcd\xe5\xbc\xdc\x01\xa5\x2e\xa9\x74\x11\x8e\x38\x41\x29\x8c\xaf\x8e\x7b\x82\xd5\xf0\x04\x93\x01\x1f\x40\x6a\xca\xbb\x03\x81\x78\x0b\x02\x09\xd1\xb8\x50\xf5\xb2\x96\xf9\xc1\x79\x9c\xbd\x25\x7e\xd0\x6c\x93\x75\xa2\x53\xe0\x09\xa6\x47\xc2\x1d\x2d\xb4\xae\x0b\x4c\x64\x1f\xaa\x84\x08\xd3\xd9\xc4\xbc\x5e\x41\x77\x80\x95\x58\x13\xec\xba\xd4\x49\x23\xd2\xb5\x43\x3d\x2a\xbc\xc5\xec\xe5\x8d\x0d\xad\x8d\x70\x02\x00\xcc\xc4\x24\xa7\xef\x61\x03\x54\x6a\x43\xc0\x82\x75\x48\x15\x0b\x90\xe6\x78\x36\xc3\xb0\xe3\xd0\xca\x43\xff\x6e\xbf\x65\xf8\xd5\x04\xca\xec\xb5\x55\x70\xd8\x24\x24\xf4\xc6\xba\x53\x48\xcc\xf5\x93\xb4\xa1\xbd\x46\xbf\x8a\xe6\x71\xae\x52\x23\x7b\xc4\x2e\x83\xb2\x40\x7d\xea\x09\xed\xed\xde\x62\x67\x74\x55\xf2\xe7\x76\xb7\xa5\x83\x85\x82\xfa\xc5\xa0\x19\x24\xa2\x24\x22\xcd\xfc\xae\x86\x1a\x72\x57\x77\x61\x38\xc9\x31\xeb\xaa\x90\x66\x95\xa2\xdb\x5d\x1d\x56\xe1\x2b\x6d\xb6\x3f\x25\x11\x23\xec\x83\xf3\xec\x6e\x01\x34\x25\x81\xd0\x85\xd7\x17\x6a\x46\x12\x2c\x2b\x55\x4b\xb2\x5e\xa0\x85\xb6\x10\x4d\x59\x02\x4c\x89\x77\x9c\xdf\xcd\x9b\x60\x9a\xeb\xda\xe0\x9d\xf6\x3a\x35\xf4\xe6\x10\xf2\x67\x40\xca\x50\x0b\x07\x96\x21\x02\x6f\x86\x0e\xa3\xe3\x38\x2f\xfd\x3b\xb7\x61\x7e\x47\xc8\xd4\x52\x47\x6d\x85\xae\xbc\xa9\xdd\x55\x5e\x64\xe2\x22\x10\xa4\xaf\x54\x69\x8f\x76\xf0\x01\x14\xd4\xb2\x92\x30\xd4\x15\xd5\x1b\x3a\xdc\x93\xc6\x97\x06\x9e\x73\x0e\xf4\xe6\xa5\x2d\x35\x36\x25\x9e\x93\xbf\xa8\x9c\x25\x1c\xd1\xd4\x1e\x76\x45\xec\x0c\x0b\xbe\x47\x93\xee\xda\x3a\x54\x06\x23\x47\x91\x5d\x91\x29\x64\xb7\x5a\x5b\xe6\xe7\xbf\x52\x74\xe9\xe6\xf4\xbf\x5b\x9d\xea\x2c\x00\xea\x9a\x21\xa2\x4e\xd3\x34\x16\x9b\x51\x1d\xc4\x50\xe7\x47\xe0\xcd\x90\x84\x03\x44\x53\x67\x3b\x07\x6e\xaa\xfb\xe3\x78\xde\xcd\xcc\xfc\x75\x18\x12\xfa\xab\x6a\x11\x94\x84\x89\xfd\x1c\x05\x94\x14\xb6\xcf\x96\xcc\xa4\x74\xb0\xc6\xe6\xc3\x00\x6d\x73\x62\x28\x5d\xc6\x3f\x22\xe2\x62\xf9\x16\x3b\x1a\xbe\x27\xac\x04\xba\x6d\x60\xce\xf1\xee\xc3\x16\x73\x9a\x85\xde\xdc\xad\x05\xa9\xc2\x76\xee\x57\x40\x35\x85\x35\xec\x30\x8f\x87\x8d\x22\x35\xdf\xe2\xdb\x55\x0a\x6b\x8e\xfb\x26\xe6\x74\x7d\xac\x21\x76\x97\x57\x8a\xe8\xe5\x25\xce\xf1\x37\x71\x39\x33\x3f\xd3\x61\x60\x15\xea\x71\x54\x10\xb4\x89\x1e\x7f\x44\xda\x3b\x48\x38\x08\x84\xf9\x22\x22\x97\xda\xaf\x9d\xdb\xab\x79\x60\x83\xcb\xac\xc0\x4d\x0c\xe4\xc6\x76\x37\x5b\xb7\x8b\x34\x53\x0b\x94\x0c\x73\x8d\x38\xc2\x59\xd1\x16\x85\x0c\xdc\x42\xac\x28\x85\x03\xd3\xd6\x36\x5e\x01\xa6\x62\xa4\x23\x42\xf8\xe9\xa5\x88\x97\x31\xd9\xf3\xe4\xa8\xc4\xb7\x46\x30\x68\xce\xd8\xe8\xa7\x6b\xd2\x5c\xd4\x22\xbd\x4b\xf0\xea\x14\xf1\x1e\xad\xe2\x5b\x60\x4d\x24\xee\x81\x2c\xf3\x0f\xe4\x72\xba\xa9\x16\xb5\xdb\xdc\x8b\xe7\xd6\xda\xde\xbb\x99\x1f\x87\x73\x96\xc8\x54\x83\xb2\x4d\xa9\xb4\x9d\x0e\x01\x49\x6e\xc7\xe9\xeb\x03\x95\x36\x41\xd2\x93\x35\xdc\xbe\xd3\x26\x25\x33\xf7\x5c\x74\x79\x4d\x78\x74\xa8\x0a\x65\xa1\x10\x51\x0e\xf4\xb4\xe1\x2e\x01\x9a\xa1\xde\x63\x01\x9f\x50\x5c\x0a\xe6\x09\xac\xeb\xf0\xdf\xbd\xf6\x52\xe4\x40\xc4\xda\x68\x5a\xa6\x9b\x10\xd8\xa9\xd2\xf7\x0e\xf3\x5f\x19\x07\x83\xe4\xed\x17\x67\xf8\xa2\x3f\xa1\x0b\xe7\xeb\x3a\xcf\xfd\x26\x60\x71\x7f\x20\xfe\xe6\xfd\xd4\x07\x25\x6c\xc1\x35\x67\xa7\x8b\x7c\x98\xca\xff\xa8\xaf\xf9\x40\xea\xce\x97\x2c\xcc\x7f\x92\x70\x3b\x1f\x89\xca\x7f\xec\x3f\x78\x23\xf5\x2e\x8e\x48\x82\xdc\x20\x0e\xf0\xde\x83\xf9\xf3\xce\xcc\xab\xbd\x73\x90\x2a\xdf\x6e\xe5\xfb\x43\xe3\xb9\x9b\xdf\x35\x89\x80\xb7\x0d\xf5\xa8\x2d\xe7\x75\x0b\xfc\xae\x97\x9c\xbb\x90\xf2\xf8\x23\x10\xf7\xe0\x74\xc3\xa2\x14\xa0\x4f\x98\x5b\xec\x1e\xfd\xee\x89\xab\x7e\x7b\x4e\xb2\x80\xf4\x0c\x33\x39\x07\x84\xd3\xad\xee\x7a\x85\x40\x9c\xca\x7b\x2f\x17\x6d\x87\x7a\x1a\x37\xdd\xa3\xf9\x46\x39\x40\x8f\xf4\xcb\x7a\x42\x51\x21\x2d\x8c\xa6\xf1\xd5\xb8\xe6\x2f\x2a\x9d\xbd\xe6\x24\x91\xb7\x69\xbe\xf9\xb6\x22\x02\x74\x5f\xf2\x73\x02\x4c\xbd\x90\x97\x52\xbe\xfe\xd5\x08\xbe\x2f\x8d\xb1\x5f\x4a\x7b\x41\x85\x8e\x9f\xd7\xc0\x8c\x36\x7d\x3a\x1b\x0f\xf8\xb0\xf1\x85\xd6\x20\x30\xa8\x43\x73\x6c\x78\xb9\x7b\x10\x82\xf4\xd6\x63\x6f\xd1\x1f\x11\x3a\x18\xae\x27\x8f\xee\x4f\x04\xfa\x81\xcd\xfd\xd9\x23\xf6\x6e\x2f\x10\x82\x88\x65\x8d\x39\xfd\x4b\x22\x74\x40\x52\x3c\xcb\xa8\xff\xb6\x7e\x6f\x58\x9a\xf8\x35\xf2\x55\xda\x63\x18\x38\xc8\x79\x92\xf7\xf9\x04\x8e\x97\x50\x56\xbe\xa5\xcf\x22\xc6\xdf\x73\x3e\x47\x0a\xe1\x09\x89\x8a\xdc\x0b\x47\x3b\xae\x93\x17\xa6\xa8\xfe\x41\x82\xac\x40\xb6\x72\x1d\x1c\x7c\xde\x8c\x22\x95\xfa\x04\x75\xca\xbf\xf5\xc2\x01\xad\x42\x41\x99\xf5\x3e\xd9\x02\x01\xb2\x01\xd5\xf7\xc4\x02\x63\xee\x2a\x38\x06\x82\x76\xb8\x35\xfd\xc7\xc7\xfd\x99\x7d\x26\x2c\x78\xac\x27\x8b\x9f\xc8\x3e\x64\x06\x2f\x01\x68\x77\x0d\x00\x9f\x42\xe6\x26\xb8\x44\x14\xd6\xe7\xdc\x85\x54\x5a\x79\x2e\xf7\x12\x36\x80\x4a\x0a\x84\x9e\x1e\x1d\x52\xf9\xe9\x28\x79\x6d\x1f\x60\x86\xc1\xdd\x5d\x61\xcf\x2f\x61\x0d\x05\xa7\x6a\x4b\x57\xf0\xa8\x67\x62\x5f\x54\x0f\xe9\x0d\xd4\x63\x78\xfb\xfd\xad\x1c\x5c\x55\x40\xe2\xbd\xd0\xe3\xf5\x2b\xee\xde\x8c\x2f\x11\x69\x3e\x5f\xd7\x37\xf3\x27\x64\x56\xee\x8c\x92\x50\xba\x0b\x91\xb8\xa7\xfd\x9d\x0a\x77\xb9\x62\x23\x94\x5c\x9e\x0d\xe9\x59\xae\xbf\x61\xb6\x2e\x69\xe0\x1b\x27\xc9\x7d\xfe\x82\x7a\x61\xbe\x1d\x46\x86\xc5\xe1\xa2\x67\xbd\x62\xf7\x33\x28\x3d\xb0\x31\xd4\xd8\x1b\x76\x2c\xfe\xff\xdc\x7b\x39\xe0\xb9\x59\x80\x39\x8b\x06\x36\xbd\x16\x91\xc2\x6a\x77\xf0\xad\xe9\xb5\x85\x8e\xf8\x2d\x74\x68\xbe\x0b\xc5\x23\x6c\x69\x53\x7f\x97\xbc\xe2\x27\x9f\xe0\x5a\xbb\xaf\x22\x2e\x7a\x00\x01\x77\xe5\xa6\x72\xcf\x67\x28\x03\x86\xaa\xdf\xcc\x57\xda\x2e\xb3\x75\x0b\x81\x69\xd5\x35\xbf\xe7\xa1\x4b\x02\xd0\xbe\x00\x65\xf5\xa3\x4e\xca\x61\xb8\x65\x62\xd8\xcd\x3b\xfe\x56\x9b\x96\x53\xd3\x2b\x94\x72\x1b\x18\x77\xce\x4d\x66\x50\x3a\x66\x9a\x1f\x41\x2f\x87\xf9\x77\x9b\x1c\x3d\xd8\x3b\xdc\xe9\xdd\x11\x11\x78\x27\xa5\x94\x6e\xc1\xee\x6f\x75\x0c\x8e\x95\x97\xcb\xea\x6d\x2f\x32\xe5\x0d\x53\xc7\xf9\x8f\x05\xb4\xe6\xbe\x3e\x79\x21\x7f\xee\xfa\xa4\x2f\xf4\xc5\x05\x08\xb1\x44\xfb\xaa\x46\x95\x40\xdc\x47\xfa\x23\x40\x28\xa8\x2e\x56\xdd\xc4\xda\x22\x01\x46\x04\x69\xd5\x83\xee\xf1\xf6\x0d\x39\x5e\x83\xee\xe0\x2c\xd9\xc1\x2e\x94\xca\xdc\x86\x51\x01\xc5\x81\xdd\x80\x31\x0b\x61\x7b\xbe\x03\x12\x6c\x8f\x90\xbe\x86\x02\x9a\x02\xa6\x6a\x91\xe4\x0a\xe3\x45\x28\x9f\x35\x9f\xc5\x33\x4d\x02\xd9\xb6\x87\xce\xc2\xb2\x5c\x61\x19\x88\x11\x53\x7b\x61\xec\xd3\x22\xb0\x6f\xd0\x28\x6c\x94\x1e\xf8\x4d\x3c\x0e\xbe\x04\xe3\x9a\x28\x43\xf7\xb4\xe4\x66\xa0\x81\xef\x47\x99\x56\x7d\xd2\x7c\xc7\x3b\x10\x9d\x42\xe3\x09\x59\xf8\x78\x84\xc4\x61\x0e\xd9\xc5\x66\x0c\x6f\x63\x73\x41\x1f\xed\x7e\x22\x53\xfe\x56\x9c\xc2\xe8\xd2\x15\x12\xb5\x76\xd4\x44\x51\xe8\x60\xdd\xca\xff\xea\xdc\xb9\xe7\xe1\x71\xd6\x10\x80\x74\x7d\xc4\xcc\x28\x4f\x11\x08\x29\x7c\x36\x1b\xca\xa3\x08\xcb\x71\x1d\x73\xe0\x45\xed\xea\x09\xd1\x7b\x68\xab\x02\x48\x2d\xaa\x3d\x7e\x9b\xda\xe5\xda\xcb\xeb\x0b\xff\xdd\x13\x6f\xec\xf6\x26\xc1\xc8\x02\x7e\xb1\xa6\x37\x07\x67\x2e\x6e\x18\x11\xbb\x19\x1b\x67\x3c\x67\x41\x7d\xb3\xae\xf3\x6f\x91\x72\x95\x45\x44\x25\x5d\xb6\x89\x0d\x21\x89\xee\x05\xbb\xe7\x0e\x14\x2f\x81\xc8\xc0\xea\xec\x29\xc0\xb8\xb5\xe9\xbb\x5d\x13\x25\x06\x30\x3b\x10\xca\x73\x9a\xb7\xd4\xd5\x45\x52\x80\x93\x4d\x5c\x08\xdc\x75\xd5\xe7\x9b\xa1\x80\xf8\x00\xe7\x4a\xdb\x70\xd0\xb0\xc9\x71\xba\xfc\x2e\xd5\x8e\x4b\xe4\x24\x78\xb0\x40\xe9\x01\xb3\x3b\xf0\xb0\x69\xd2\x25\x07\x60\x57\x8f\x24\x18\xfe\x36\xac\x70\x5c\xa7\xaa\x0c\x97\x2a\xa4\x97\xb4\xaa\xae\x3c\x7f\x4d\x65\xe9\x89\xe9\xc1\xc4\x05\xd1\xe2\x79\x0c\xa0\xaf\x83\x6b\xf9\x7f\xfa\x79\x63\x95\x9b\x48\xda\x10\x49\x84\x6a\xae\xc0\xad\x2f\x92\x92\xe5\x94\x99\x19\xd6\xaf\x3d\x25\x00\x98\x5a\x7b\x26\x21\x63\xf1\x44\xec\x0a\x65\x44\xda\x83\x66\xd0\x76\x0a\xdd\x4b\x57\x69\x14\x7c\x77\x4b\x4d\x97\xd1\x21\xb7\x0a\xe3\x98\x71\x8f\x00\xf8\x13\x2e\x78\x52\x93\x80\x87\xb3\x0b\xcd\x52\xd8\x67\x86\xac\x35\x3f\x04\x12\xf7\x3c\x42\x9e\x11\xb9\x37\x5f\x09\xc4\x81\xbe\x4f\x47\x51\x9e\xf3\xfa\x56\x8a\x2e\x0a\x43\xcf\x0a\x13\xc5\x7d\xaf\xb4\x7e\xa2\x15\x49\x01\x95\xc7\xb0\x5e\xf0\xef\x06\xbb\x4e\xbd\x48\xb9\x30\xac\x77\x40\x26\x20\x69\x04\x60\x56\xd1\x8a\x4f\xef\x1a\xf9\x25\xd0\x95\x04\xc8\xe2\x75\xfd\x71\x80\x6c\xde\x08\x67\xfd\x47\x88\x29\x58\x55\x44\xe0\x96\x7a\x52\x96\x51\x43\x30\x6b\xdb\x2a\xa5\x77\x91\x22\x39\x37\xbe\x14\x8e\x9f\xe5\xf6\xda\xbc\x50\x02\x51\xae\x65\x67\x11\x12\x36\x50\x01\x27\x9b\x29\x48\xed\x6a\xc3\xe0\x5d\x38\x15\x56\xcb\x3d\xbc\x32\x69\x64\x39\x93\x2a\x79\xce\xcc\xf6\x9d\xf3\x78\x71\x8a\x74\xba\x1b\xa5\x9f\xf9\x1c\xda\xbd\xa7\x6c\x0e\x4e\x70\x4c\x03\x97\xe2\x98\xd9\x4a\x58\xec\x5b\xdd\xe1\x99\x5f\x33\xe1\xae\x4e\x6c\xda\xb9\xae\x86\x63\x27\x75\xed\x4e\xe9\xaa\xb9\xee\x70\x78\x73\x4a\x01\xde\xbd\x39\x39\x69\x73\x3c\x6d\xfb\x5f\xd3\x49\xe5\xca\xb0\x0d\xb3\x06\x2e\x0b\x3b\x0d\x47\x2b\x62\x67\x2b\xcf\x92\xb9\x0e\x20\x01\xe8\x07\x71\xa6\xab\x63\x53\x7b\xda\x33\xc3\xdf\x2d\x2a\xfb\x99\xe4\x47\xe2\x12\x91\x52\x92\xec\x39\x3c\x07\xc2\x23\xeb\x88\xf1\xfb\x52\x77\xca\xf4\xb3\x2b\x7e\x37\x6c\x44\x7a\x69\xec\xee\x16\x7c\xb7\xb2\xd1\x07\x64\xcb\x82\x7d\x84\x56\x5b\x58\x5a\xc9\x76\x1d\x70\xa9\x8c\x48\xad\xed\x81\xfa\x6d\xe2\xff\xb6\xb8\x13\xfb\xf6\x40\xd6\x5b\xea\x91\xa7\x84\x96\x1c\x46\x2b\xa0\xec\x51\x7a\xe2\x69\x37\x8e\xc0\x2d\x10\xbe\x36\x1c\x3c\x57\x50\x07\x9e\x3c\xc2\x3a\x0b\xbb\x7f\xd8\x3c\x2f\x51\x52\x71\x7d\x6f\x2c\xca\x5a\xf3\x26\x67\x18\x8b\xa8\xad\xe8\x72\xb5\x08\xe4\xfb\x0c\xd7\xcf\x49\xc2\x94\xbd\x34\x28\x9b\x28\x88\x85\xc9\x8b\x96\xee\xe3\xa9\xf6\xd6\xba\x98\x8e\x3a\x98\x0f\x3e\xa8\x47\x8e\x5f\x91\x39\xde\xb1\x65\x48\x3a\x5a\xd3\x39\x13\x17\x0b\x90\xa3\xa2\x06\xac\x5d\x22\xb0\x06\xd3\xcf\x32\xef\x49\xfb\xad\xb2\xdf\xf4\xe9\xde\x2c\x4c\x2e\xba\x65\xee\x01\x87\x57\x69\x5e\x66\x25\xb8\x8f\xac\x1f\x9d\xde\xa1\xce\x99\xfe\x6d\x42\xd3\xbe\xd6\xf9\x8b\x21\xa6\x98\xde\x91\x08\x58\xb2\x25\xb3\xe8\x16\x78\xf7\x71\x68\x06\x6a\xcb\x44\xa4\xae\xf5\xd7\xd4\xaa\xbc\x04\x4e\x46\x45\x85\xf7\xd5\x7a\x77\xa1\x78\xcf\x90\x96\x38\x84\x30\x3d\x84\x1d\x3b\x12\x48\x4b\x97\x54\x2f\x0b\xcb\xc0\xc8\x20\x6f\x59\x5e\xa1\x91\x61\x39\x92\x73\xcf\xa0\x3e\xfa\x9c\x59\xbb\x6b\x5e\x6e\xc5\x7b\x42\x04\xe7\xbd\xd2\x89\xa9\x9c\x74\x74\x2b\x9a\x0e\xd8\xc4\xd6\x1e\x19\x3a\x84\xb2\x85\x2e\x13\x69\x39\x25\xae\x5c\x71\xf6\x54\xd0\xc4\x00\xe2\x95\x30\x5d\x19\x38\xb4\x2d\x43\x56\x46\x44\x0e\x64\x05\xf9\xed\x5d\x91\x04\xd7\x5c\xc3\x8f\x80\xde\x97\x26\xde\x16\x0d\x12\xd0\x7c\xea\x2d\xd9\x09\xb8\xde\xed\x34\x55\xe5\x84\xa6\xa6\xbc\xb4\xf6\x28\x6d\xec\x65\x0d\xf4\xef\xf5\xc7\x88\x74\x11\xaf\x74\xb7\x6e\x72\xa2\x62\x2f\x42\x55\xc8\xf7\x5c\xc1\x3d\xa5\xbc\x66\x8d\x19\xfb\x9e\x39\x03\xa4\xfa\xa1\xaf\x49\x73\xe8\x6d\x8e\x69\x93\x5c\x63\xa8\xa1\x6f\x15\xa3\xf8\x3b\xa0\xbe\x83\xa6\x68\xd6\x6c\x53\xf7\xaf\x4e\x6b\xa7\xe9\x85\xbd\x8a\x7f\x84\x0d\x36\xa8\x70\xf9\xd2\xad\x68\x36\xb4\x01\x44\xf7\xda\xe4\x8f\x15\x0b\xff\x64\xef\xbb\x70\xf6\x1e\xff\x10\xeb\xab\x65\xbe\x78\x28\xd9\x1f\x6d\xc5\x5e\x73\x1e\xcd\x66\xcf\xe5\xad\x88\x45\x09\x44\x72\xe1\x72\x13\x54\x8d\x29\x01\xf5\xd5\xb5\xde\x9c\xe3\x25\x70\xf0\x1a\x83\x77\x0b\x07\xdd\xdf\xad\x4c\xfc\x55\xf2\xe4\xf3\xaf\xe7\x6b\x22\x70\xd3\xc1\x53\x81\x87\x70\x74\x70\x12\x74\x18\xcf\xeb\xcc\xc8\xae\x7f\x43\xd1\xc2\xcb\x97\xca\x99\x5e\x3b\xd3\xe3\x60\x1f\xac\x07\xf0\xa0\x09\x61\xe2\xde\x04\xf2\x57\x6a\x09\x5b\xf3\x31\xcd\xca\xa9\x83\xff\xf5\xa2\x58\x97\x7f\xda\xaf\xd8\x65\xbf\x12\xa1\xc4\x3b\x71\xd6\x70\xf6\xe8\x84\xc9\xb6\x46\x82\xef\xe3\x16\xb2\x78\xa8\xfa\xf0\x8a\x79\x11\x9f\xff\x6c\x3a\x55\x2f\xdf\xf2\xa0\x2f\x81\xb9\xf1\xff\xd4\xdf\x32\x78\xdc\x7a\x1b\x4f\x9f\xfe\xfa\x59\x38\x35\x47\xd6\xf2\xda\x15\x85\xb5\x39\x84\x3f\xcf\xc0\x0f\x2f\x73\x8b\xf2\x77\xed\x58\xdf\x01\x3b\x4e\x01\x8f\xb6\x70\x78\x0b\x69\x4c\xa3\xa1\x08\xf9\xec\xf4\x7d\x0d\xc1\x4c\xa0\x92\x43\x3a\x14\x56\x3e\x82\x2a\xaf\x55\x72\xa3\x3d\xdf\x47\xc2\x94\x53\x44\xc3\x1a\xc2\xa4\x69\x2d\xc2\xf7\xbe\x75\x1b\x95\xec\xdb\x92\x0e\x61\x3d\xaa\xd4\x3d\xaf\x2a\x2b\x62\x8b\x25\x8a\x8a\xdb\x40\x69\xcb\x3b\xcb\x11\xf5\x2a\x61\xa6\x7a\x7d\xf1\xcd\x35\x44\x35\x4f\x82\x88\xcf\xab\xac\x59\xe0\x64\x58\xd9\xca\xa9\xd5\xa1\x18\x82\x2a\x07\x84\x64\x83\xe9\x52\x18\xbc\x42\xf2\x93\x67\xc0\x4a\x22\xa4\x3c\x4f\xe9\x76\xee\x63\x60\x9b\x99\x1d\x03\x7c\x59\x50\x76\xe4\x91\xe2\x6e\x43\x13\x90\xbf\x78\x0d\x4c\xf2\xda\xfe\xeb\x2a\xa0\xe6\x96\x7e\x97\x2a\x65\x4f\xe1\xaa\xbd\x35\xf4\xa8\xb7\x59\xe3\xcc\xff\xc0\x37\x35\xf5\xd6\x9c\xe8\xea\xc1\x40\x88\xd8\x65\x71\x41\x57\x6a\x41\xad\x55\x3a\x72\x2b\xd2\x41\x04\x31\x03\xef\x75\x32\xb4\xa1\x48\xc7\x43\x40\xfe\x93\x57\x6b\x85\x66\x88\xa4\x40\xa1\x5b\xe8\xbd\xf2\x2a\xee\xd5\x2a\x42\xcb\x5a\xdc\xe3\x9b\xdb\xef\x41\xaf\x76\x08\x73\x94\x00\xd7\x32\xc9\xf1\xb5\x8c\x4c\x26\x5b\x10\xa9\x8b\xb5\xa8\xd6\xb8\x16\x59\xf1\xd9\x9b\xe2\xfe\xba\x08\x81\x9c\x1c\x09\x6f\xfe\xce\x59\x20\xa4\xc5\x75\xca\x23\xa2\x5d\xe7\x3d\x84\xcc\x4e\x38\xae\xda\x68\x6e\x42\x7b\xee\x31\x7f\x1a\x21\xa5\xab\xb3\x2e\x6e\x1d\xab\x6b\x0a\xa2\xc0\xc6\x04\xc4\x19\x89\xb6\xa6\x56\x6a\xad\x8d\x30\xbb\x6b\x70\x66\x2c\x18\x40\x0c\x64\x48\xd7\xda\xb0\xf9\xf2\xc0\xff\x91\xbd\xcf\x8b\x82\x7d\xa2\x39\xe9\xca\x09\x16\x94\x2c\xf9\x8d\x0c\x68\x07\xae\xd5\x7f\xe9\x56\xb2\xbe\x6c\x28\x34\x09\x0a\xfd\xf9\xb0\xe0\xb0\xa6\x57\xc0\x0e\x56\x8c\x15\x08\x69\x7e\x05\xee\xd0\x42\x5e\x6b\x9b\xb7\x8c\x7b\xa0\xa9\x25\x5f\x5a\xe5\x00\xe3\xbe\xb5\x0a\xe2\x3e\xd8\xfb\x35\x71\x73\x90\x34\xd4\x2a\xe3\x83\x0e\x22\xa4\x99\x3d\xc5\x0b\x57\x08\xc4\x62\x41\x53\x31\xd5\xaf\x05\x52\x43\x27\x78\xc4\x3f\x74\x2d\x21\xfe\xa3\x6d\xd3\x91\x36\x6d\xbe\x81\x4a\x40\x50\x37\x44\x6b\xeb\xd5\x42\xed\xdc\xe7\xa6\xc0\xda\x71\x32\xb8\xa6\x44\x4f\xd9\x7a\x0b\x4c\x2d\x3c\x31\xcb\x26\x4b\x25\x7a\x67\x39\x21\xfa\x24\xab\xda\xda\x04\xea\x16\xf0\xea\xf8\x7d\xfe\x82\xaa\xf7\x08\xc2\xb8\x15\x7d\x24\xdd\x67\xa9\xf4\xbb\x14\x60\x3a\xfd\xf8\x28\xff\x30\x58\x65\x61\xb2\xa8\x45\x59\x8a\x4c\x85\x97\x12\xfa\x2f\x88\x2e\x09\xa6\x42\x1a\xcb\x37\xdb\x39\xb5\x5a\x6c\x04\x40\xf8\xb4\xf5\xfb\x34\xd0\xb5\x91\x03\x16\x6b\x65\x4b\xb8\x48\xfd\x7c\x11\x8e\x76\x59\x93\x4f\xd5\xe1\x53\x3b\x92\x6d\xe3\xe2\xa7\x42\x51\x37\x2f\x81\x25\x64\x01\x10\x34\xaf\x58\x8b\xe5\xe7\xb8\xb8\xf9\x82\xff\xc7\x79\x1d\x89\x95\xb0\xa8\x2f\x6f\xb9\xde\x46\xd7\x67\x91\x4f\xfb\x16\xd7\xba\x50\x0f\x09\x77\xda\xeb\x96\x3d\x2d\x80\x9b\xf2\x94\xcd\x7e\x7c\x02\xc3\xf3\x1f\x8b\xda\x75\xf8\x4a\xac\xce\x61\x70\xfb\x48\xf1\x1b\x13\x38\xfa\x2d\xdf\xb3\x10\x49\xbd\xa4\x4b\x0b\x61\xd5\x53\x5c\x75\x9b\x48\x07\x8a\x3e\xcd\x21\xd0\x3a\xbf\x66\x2e\x77\x47\x6b\xd7\xb3\x27\x07\xfe\xb7\xda\x0f\x8e\x49\xfa\x6f\x05\x67\x08\x01\x78\x7c\xcc\x8b\x43\x80\x75\xa0\x16\xe6\x2f\x7a\xb3\x3d\x14\x58\x11\x37\xb9\xd6\xc7\xe3\x9c\xc3\xf0\xd6\x7f\xf7\xaf\xaa\x12\xbf\x48\xb4\xf0\xfe\xfe\x42\x34\x77\xe7\x97\x52\x87\xfb\xf5\x69\x41\x80\xc5\x31\xdf\xf2\xf4\xcd\x6f\xaa\x7e\x91\x7e\x13\x38\x19\xbe\xaf\x3d\x80\xcc\x52\xff\x72\x9c\x35\xbf\xd2\x95\xc2\x2b\x57\x8a\xae\x17\xe7\x4d\xf3\xce\x7b\x38\xef\xac\x2e\xdb\xcc\x88\x7d\x37\xd0\xd2\x0f\x30\x99\x10\x67\x8e\x87\x20\x05\xc9\x25\xc8\xd1\xd4\x4d\x9c\xde\xab\x8c\xf6\xa7\xfa\x4f\x65\xa6\x29\xd4\x57\xeb\x86\xdc\xdc\x9b\x98\xf3\x48\x8f\x4c\x04\x17\x4f\x6e\x04\x33\x68\xc3\x15\xe0\x0f\x8f\xfa\xc5\x5e\x4d\xa2\xc4\x5f\x59\xd2\xae\x3e\x11\x97\xbf\xee\x53\x18\xf0\xda\x90\xe3\xf5\x14\x62\x72\x2a\x97\x70\xe9\xc7\x28\xd4\x73\xd9\x04\x8c\x75\x18\x79\xa0\xce\xed\x25\x5a\xe9\xaf\x5b\x16\xca\x4b\x63\xb4\x74\xa4\xea\x59\xed\xa9\x44\x16\x0c\x6a\xb0\xf1\x16\x30\x0e\xe3\x13\x7c\x12\x47\x6f\xb2\x1b\xe3\xae\xb6\x40\x78\xb9\x02\xeb\x1c\x9e\x6c\x53\x53\x9e\x46\xb4\xea\xdf\xcf\x7b\x48\xc6\x76\xce\x85\x9e\xbc\xbf\xf0\xe0\xfc\x04\x6a\xfc\xbc\x3f\x71\x7c\x17\x79\x6f\xa7\x01\xa0\x51\x62\xf0\x47\xe3\x75\x3f\xa5\x05\xbb\x07\xd6\x1c\xd4\x1f\x0f\x34\x4c\x80\x14\xcd\xc2\x6d\xd6\x31\x9e\x23\xa0\xd3\xaf\x22\x37\x5f\x1b\xd5\xfa\x72\x54\x1e\x03\x0a\xb3\xda\x75\x94\xc4\xec\xc3\xbb\x6a\x97\x98\xed\x43\x40\xf6\xbd\x86\x97\x6f\x0d\xa1\x5c\x6b\x89\x42\x4b\xf6\xa6\x58\x0f\xbc\x7f\x67\x7a\xfc\xba\x7e\xd4\xa5\xd0\x25\xf6\xa7\x90\x4d\x07\xd6\xbd\x84\xcc\xec\x76\x85\xbc\xac\xde\x50\xc8\xca\x6a\xd5\x57\xb9\x71\x8a\x61\x10\xcc\x44\x43\x04\x0e\x23\xf9\x98\x7f\xb9\xa2\xec\xc5\x89\x1e\xe2\x51\x00\xe4\x1a\x93\x4c\x80\xdf\x1d\xfa\x5c\x5d\x57\x33\xd3\x2c\xf8\x2b\xfd\x0c\x48\xfc\xa3\xbc\x03\xb0\x5e\x57\x87\x4c\x9f\xf3\x25\x24\x35\x52\x4c\x3a\x43\x1b\xc2\xbd\xb8\x59\xa0\xd3\xe5\xa1\xef\x08\x73\x45\xa7\x44\x8e\x46\xf2\xa6\xec\x49\x95\x46\xab\xe3\xca\x1d\x16\x60\x21\x07\xd3\x6e\x16\xcc\x60\x3d\x26\x6d\xa6\x31\xf9\x58\x1a\x0c\xdc\xc1\x1b\x8a\xfc\xab\x55\x4c\xd9\x71\x3e\x87\xaf\x83\xb0\xab\x5d\x78\x90\xa4\x05\x8b\xb1\xe4\x41\x1c\x36\x66\x37\xcd\x56\x78\x10\x38\xdd\x3a\xfe\xde\x83\x66\x24\xdc\x75\xb3\xf6\xc5\x4c\x7f\x17\x58\x7d\xa3\x55\x07\x3e\xe4\x5b\x2f\xe6\xf8\x47\x4f\x14\x31\x99\xb3\x23\x2a\x30\x82\xaa\xc3\xbd\xd1\xab\x72\x0c\x3d\x00\x5a\x25\xf6\x57\x5b\x05\xbc\xb9\x5f\xcd\x24\x03\x59\x97\x7c\xd5\x57\x42\x08\x20\x48\x9c\xe2\x5a\x98\x89\x47\xb7\xd3\xf3\x7f\xce\x6e\x0e\xb8\x71\x59\xf2\x86\xfd\xe5\xa3\x36\xd1\xd0\xc7\xd9\x54\x55\xcf\x79\x26\x3c\x7c\xce\xc3\x4a\xf0\xb7\xcb\xba\xb6\x5e\xc5\x3e\x0b\x84\xf8\x38\x13\x47\x19\xc8\xbd\xfa\xd2\x6e\x34\x91\xe7\x01\x9d\x7a\x14\xe8\x89\x31\xc2\x34\xd6\x83\x55\xc3\x90\x47\x89\xd2\xfe\xa3\xb0\xfc\xfd\x50\x9f\xe0\x3e\xc5\xc4\x8c\x0b\x80\xbd\x66\xd9\x2b\xc3\xba\xd8\xbb\x31\xa8\xbe\x8a\x4f\xff\x10\xdc\xe2\x31\x9f\x34\x42\x7a\x40\x4a\x4d\x0d\xde\x63\xde\x1f\xf2\xd8\x79\x60\x5c\xcb\x76\xe5\x31\xb7\xc3\x38\x79\xd8\xd7\xb9\x44\x78\x03\x8a\xef\x89\xd9\xc9\x47\x30\x09\x1e\x36\x82\xd5\x3b\xf6\x80\xa2\x1c\x45\x62\x9f\x74\x54\x46\x2e\xc1\x77\xb4\x6b\x42\xd3\x65\x9f\x43\xfd\x48\x3f\x96\x5f\xb5\x25\x9f\x9d\x07\xb0\x30\xef\x1f\xe1\xca\x83\xf6\x6c\x1f\x62\x65\x40\xda\x13\xfb\x82\x07\x6c\x88\x42\x51\xd6\xe7\x0f\xf9\x5a\x08\x73\xce\x51\xd8\xcd\xf4\x22\xca\xa7\x8f\xcc\x90\x71\x3b\x7d\x49\x14\xea\x17\xf0\x96\xb7\x47\x3c\x9f\x79\x53\xf5\x0d\xee\x6d\x92\xfe\x41\xcb\x5d\x09\x0d\xc8\xab\x3c\x0e\xa0\x22\x90\x62\x9f\x15\x43\x70\xef\x66\x90\x5c\x6a\x87\x62\x5b\x89\x6b\x2b\x5b\xe5\x41\xd2\xe6\x39\xfc\x04\x81\xe1\xf6\xff\x60\xc3\x12\x99\xa6\x0e\x35\xe0\xd4\xf0\x9e\xd7\x2a\xbf\xac\x43\xdd\x57\x26\xef\x1c\xab\xce\x55\xe1\xc8\x39\xd4\x31\xfc\x92\x65\x67\x6a\x11\x21\xd1\x57\xa9\xde\xc3\x0f\x27\x79\x8e\xc3\x29\x96\xe3\x50\xaa\x8c\x8f\x85\x15\x1a\x90\x88\xd5\x92\x1b\x48\x82\x77\x28\x2b\xc7\xea\x83\x3d\x3c\x82\x78\x37\xe2\xfa\x00\xdd\x2b\x07\xd5\xe3\xc7\x73\x38\x05\xfc\xf8\xd9\x11\xb5\x0d\xc3\x38\x02\xc8\x5f\x84\xae\xe7\x60\xd8\x0d\xe0\xa3\x8f\xd4\x89\x85\x50\xb0\x12\x73\x03\xa4\x82\x7d\x79\x07\x9c\xfc\xe2\x36\xe7\xb7\xa7\xb3\x0f\xc5\xc9\x94\x8c\xb9\xea\x28\x01\x32\xdf\x6d\x3e\xa8\xff\xf6\x15\xa5\x15\x0c\xc3\xf1\xe6\xef\x08\xe4\x14\x9d\xd7\xda\xeb\x4c\x56\x0a\xcf\x66\xa8\xef\x34\x54\x3a\x65\x54\x10\x68\x05\x94\x82\x3d\x9a\x27\x9e\xec\x14\x62\xbc\xae\x23\xcb\x68\x62\x0b\xef\x36\xcd\x95\xdf\x76\x76\x1b\xf8\xad\x14\x7c\x86\xf0\xce\x1c\x32\xf9\xcb\x43\x92\xc5\x34\x06\x72\xe1\x0f\x34\x00\x6b\x4b\xdf\xc0\x21\x85\xb6\xae\xc8\x09\x69\x0a\x67\xe6\x89\xbe\xfa\x43\x92\x6b\xe0\xe0\x34\x64\xc7\x02\xd7\x5b\xaf\x4b\x5f\x65\xb9\x85\x9c\x8b\x80\xc6\x5e\x26\xbf\x18\x91\xbc\xd5\xd7\x50\x33\xeb\x21\x8f\x76\x31\x5b\x0d\xd7\x15\xbe\x00\x16\x59\xef\x8b\x33\xeb\x4f\x72\xc2\x9d\x4d\x1e\x6a\xbc\xc7\x25\x08\x7c\x91\x56\x2c\x0a\x03\xcc\x59\x3b\x02\x5e\xc6\x75\x88\x13\xd4\xb5\x1d\x24\x7c\x72\x26\x0b\x3c\xfc\x20\xc8\xf8\xb3\xe9\xe6\x3e\x85\x39\x3f\x29\x5c\x0b\x2c\x05\xad\x95\xed\xa8\xfa\x15\xd0\x54\x52\x74\x04\xe6\xfc\xd0\xb8\xab\x47\x16\x91\x10\x6c\xb7\xfc\x21\xde\x19\x9c\x7d\x12\xad\xa0\xd1\xcb\x69\x53\x5f\x36\x15\x92\x01\x66\x97\xad\x5d\x2f\x49\x88\xbe\x4c\xa1\x05\x6c\x23\x2b\xc1\xc1\xcb\x1f\x04\x3d\x19\x03\xf6\x9a\x48\x31\xbb\x27\xf1\x1b\x92\xbe\xc4\x2b\x22\x81\xc6\x84\x3f\x45\x7a\x19\x58\xf7\x2c\x15\x60\xe1\xfe\xe7\x9b\x0d\xa4\x05\x81\x64\xb7\x6e\x48\x17\x03\x45\x8a\x2f\x8a\x7c\x3a\x21\xc0\xfa\xfa\xeb\x44\x1d\xc2\xbd\x8d\x6c\x10\xae\x75\x54\xf5\x3d\x19\xd9\xdc\x81\x5f\x4a\x88\x1b\xc1\xdc\xc7\xaa\x59\x68\xf9\x3c\xf3\x86\xdb\x60\x6e\xd2\x2a\x7b\x16\x25\xc5\x2b\xbb\xfb\x1e\x7a\x4c\x84\xbf\xaf\x6b\x20\xdd\x91\x82\xe0\x46\xbf\x04\xc9\xa7\x67\x43\x04\xf4\x98\xa3\xea\xce\x40\x17\x58\x72\xc4\x48\xd3\x48\x82\xd7\x63\x37\x2d\xe6\x87\x4b\xf6\x04\x3d\x6c\x32\xb2\x20\xec\x72\x8b\x81\x14\x21\xf7\x77\x6e\x07\x7f\x1f\xe8\x92\x4d\xa1\x13\xda\xc2\x65\x7f\x2b\x8a\x0d\x56\xe5\x77\x01\x86\x1f\x02\x5f\x7f\x1c\x25\x50\xf1\xb9\xd7\x2a\x09\xca\x23\xf7\x18\xff\x7b\x97\xf2\x71\x72\x55\x0d\x7d\x9b\x05\x6d\x5f\x7b\x94\x51\x78\x69\xd2\xd0\x64\x88\x3b\xbd\xe9\xdd\x9b\xea\xaf\xef\x3f\x72\xc1\x77\x3f\x11\x0e\x5b\x03\x6a\x5d\xc5\xe5\xe9\xaa\x97\xa7\x89\x92\xad\x9c\x55\x76\xc4\xd5\x63\x26\x25\x58\x70\x85\x9c\x5a\xd3\x0d\xae\x0d\xf8\xcc\x91\x8d\x47\x83\x06\x9c\x80\xc0\x87\x86\x31\xc0\xf0\x9a\xd5\xc3\xef\xfb\x97\x70\xfb\xb3\x6e\xab\xdc\xb0\xd1\x6b\xe8\x00\x36\xe6\x9d\x9a\xfd\x77\x6d\x68\xf6\x12\x23\x6c\x0b\x63\xcc\xe0\xe2\x8d\x3c\x94\x32\xf3\xe0\xbb\xea\x94\x2c\x1a\xd8\x9e\x42\xe3\x40\xbd\xac\x85\xb1\x9c\x83\x33\x06\x2c\xfc\xa0\xb5\x78\x02\xc8\x52\x04\x75\x37\xc5\xbf\x49\xa1\x7d\x9c\xa8\x92\x21\x5f\x73\xb1\x64\xba\xf2\x4f\x92\xbe\xa5\x86\x6a\x30\x72\xd9\x9c\x76\x03\xf6\xae\x7f\xa4\xdc\x23\x00\xef\x01\xd8\x2f\xa7\xd3\x49\x5d\xab\xf8\x64\x00\xd9\x97\x33\x80\xee\x36\x26\x2e\x52\x1f\x46\x2b\x42\x4d\xe4\xe0\x15\x94\x5f\xde\x4c\xa4\x6e\xb8\x0c\x98\x5b\x57\x46\xfd\xa4\x22\x0c\xbf\xb5\x75\x40\x0a\x10\x93\x6e\x97\x4d\x33\xdb\xae\x74\xba\xd7\x48\xdd\x91\x58\x80\x21\xa0\x4c\xb4\xe1\x57\xc4\x75\x48\x4b\xcf\x8c\x9c\xa9\x28\x4f\xed\xdf\x72\xc6\x8d\x43\x8b\x20\x41\x65\x3f\x80\x07\xf6\x6b\xfc\xe8\x33\x44\x70\xd7\x10\xbe\x6e\x96\xf6\x9d\xd0\x90\xdd\x3c\x0c\x6e\xa6\xe7\x41\xa0\xf1\x67\x40\xef\x43\xd3\xf8\x29\x86\x01\x5e\x04\xfa\x8a\xa3\x70\xec\x6d\x23\x60\xf0\x36\x2e\x8b\x9e\xdc\x89\x6a\xb7\x02\x00\x41\x3f\x8c\xd7\xb9\xd9\x99\x37\x6f\xf2\x73\x69\x45\x99\x0e\x4a\x38\xdc\x6d\x97\x47\xbc\x0d\x21\x22\x5a\x55\xde\xed\x32\xce\xaf\xf1\x0e\xb2\x3d\x80\xf1\x60\x22\x09\xae\x20\xa8\x01\x50\x62\x51\x98\x02\xe9\xd8\x25\x2f\x54\x3a\x5a\x1d\x40\x34\xc6\xfa\x3f\x29\xc4\x1d\x21\x6e\x2c\x49\x64\x0b\x3a\xed\x11\xe9\x78\x0b\x3b\xf1\x2c\x00\xea\x1e\xd8\x31\x74\x54\xef\x3d\xb9\x71\x53\x41\x9e\xf9\xab\xd4\xbc\x60\xd9\x04\xa2\x3d\x66\x4e\x02\xb1\xb5\x97\x8c\xfa\x44\x59\x06\x0b\xbd\xc7\xe8\x92\x6c\xda\x67\x32\xd1\xd2\xc7\x7f\xa9\x7b\xbb\x24\x06\x5f\x88\x6b\xaa\x97\x8a\xff\x09\x43\x0b\x5f\x02\xed\xee\xe8\x71\x88\xa3\x3a\x84\xdd\x26\xe1\x2c\x32\x41\x2d\xb9\x95\x2d\x92\x46\x06\xf8\xd1\x75\x50\xa0\x1d\xf2\x4e\x04\xfd\x50\xa5\x64\x0c\x61\x2c\x1e\xff\x4c\x12\xf0\x49\xf0\x55\x14\x22\x5e\x4a\xee\x8e\xd8\x0b\xed\xe3\x8b\x94\x23\xaf\x7a\xf0\x4b\x71\xeb\xd2\xf6\x72\x63\x6a\xe0\xe8\x29\x52\x94\x02\x2a\x0f\xd0\x0e\x91\xef\x92\x08\x4b\x6b\xe1\x62\x0d\x4b\x56\xcd\x20\xa0\xf6\xa9\x67\xdc\xae\x94\xde\x71\x9b\x0f\x66\x0e\x4e\x5d\x09\x43\x28\x7d\xd8\x3b\x10\x2a\x3f\x70\xa0\x05\xb4\x22\x3b\x1f\x46\x4d\x16\xd9\xb3\x44\x10\x3e\x26\xc2\xbe\xeb\xbe\xc8\xfa\x2e\xf9\x2d\xfd\x28\x39\xfb\xa9\x92\xc4\xfb\x40\xbb\xd6\xef\xea\xa7\x66\xce\x10\x3f\x1c\x97\x7f\x8a\xf7\xfc\x1f\x96\xd4\x3f\xd9\xc7\x82\x1f\xe6\xef\x3f\x99\xb2\x33\x1f\xa7\x89\xdd\x0c\x3d\x6d\xfd\x2e\xf5\x72\x32\xfc\xbb\x10\x34\x5f\x98\xe2\x7c\x67\x80\x42\x1c\x67\x9f\xf6\x58\xfa\x33\xf0\x4e\x32\x2d\x04\x4a\xde\x11\xd6\x6f\x19\xa7\x07\xb9\x14\x91\x98\x84\x40\xd0\xd3\xf0\xbc\x08\xdd\xf6\xf2\x4c\x04\xbd\xcf\xcb\xa6\x6a\xe4\xcb\x86\x73\xd7\xe7\xcd\xef\xc5\xd0\x78\xed\x39\x60\xf4\x3e\x04\x74\xe7\x75\x06\x91\x71\x79\xcd\xca\xc7\x00\x43\x4f\xbf\x74\x1b\xec\x2c\xde\x72\xbc\xa8\xde\x41\xd0\xfd\xba\x4e\x25\x3c\xdb\x57\x0d\xf7\x5e\xb3\x7e\x06\xf4\xb2\xb8\x42\x08\x7c\x41\xce\xe7\x74\xf3\xe2\x03\x43\x9f\x55\xd4\x7d\x4d\x76\x61\x35\x1d\x76\x3b\x77\x1f\x94\x41\x7e\x39\x55\xc9\x29\xbf\x39\xc2\x7d\x79\xb6\xfa\x0b\xad\x1f\x70\xbb\xfc\x1f\x64\x31\x20\x5c\x84\xd9\xc1\x08\x0e\xad\x8f\xd6\xca\x3e\xac\x78\xf8\xe2\x83\x67\xfa\x5f\x01\x8b\x6b\x3a\xb2\x2f\x81\xfa\xc3\x6e\xc9\x82\xa5\xe9\x48\x27\x25\x95\x2c\xf8\xca\x85\xd8\x87\x59\x10\x7a\xbb\xb6\x99\x11\xaf\xbf\xcf\x45\x79\x7f\x30\x38\xe3\x77\x71\xbe\x02\xbe\xbd\xdc\x5a\xd4\x6f\x9c\x4d\x14\x04\x45\x40\x18\x66\xf9\xa1\xfc\xfd\x02\xfc\x0b\x3f\xeb\x09\xcf\x76\xe2\xe9\xc1\xec\x42\xc6\x0c\xfb\xc0\xdb\x65\xa6\xaa\xf1\x93\x22\x16\x0e\xa3\x3f\xcf\x2a\x69\xe8\xd5\x5f\xb6\x16\x4a\x37\x7a\x85\xe4\xcd\x93\x1e\xf1\x20\xe1\x73\x6d\x7f\x87\xc1\xcd\xd3\x26\xf2\x42\xd5\x43\xe7\xed\x62\x68\x0f\xcb\xbc\x09\x32\xaf\x84\x12\x3d\xf3\xe4\x09\x9f\x89\xe6\x7a\x7a\x66\x21\x33\xa2\x0a\x75\xda\x9f\x39\x80\xf0\x37\x00\xef\x45\x80\xf7\x1c\xa0\xf9\xa1\xc1\xe7\x7b\x4e\x9a\x2d\xb2\x26\x92\x65\xfc\xa7\x2b\x9b\x4f\x3a\x82\xb5\xd0\xcf\x39\x3b\x7a\x25\x7c\xe4\x2b\xc1\xd9\xf5\x18\x72\x40\x92\xea\x7e\x7a\x41\xbd\x42\x6d\x86\x10\xee\x77\xcb\x1f\x5a\xfb\x4a\x91\x99\xbb\xee\x81\x37\xaf\x19\x18\x4d\xa2\xd0\x35\x66\xb9\x25\x18\x0a\x14\x39\xd5\x02\x6e\x98\x00\x4b\xd1\x58\x23\xd6\x1b\xa2\xee\x44\x5f\xdd\x85\xed\xf7\xad\x69\x27\xae\xe7\xc7\x97\xac\x07\xb5\x26\xf6\x2e\x84\x11\xdc\xa5\xa1\x9f\x6f\x7b\xe5\x67\xae\xa3\x28\x32\xe6\xf2\xfe\x85\x9d\x03\xa1\xe8\x32\x0d\xb9\x27\x02\x9b\xef\xe9\x14\x2c\x9c\x6a\xce\xfc\x4e\x58\xf9\x29\xd7\x7d\x16\xcf\x1f\x7c\xb8\x4d\x22\xd0\x59\xa8\xf4\xfc\xef\xf6\x44\xdc\x0d\xb0\x90\x1f\x2d\x53\x98\x5b\x9a\x69\x77\x5e\x12\x5b\x78\x7b\x5f\x4f\x8a\xfc\xde\xd9\xad\x75\x6e\xb9\x97\xc1\xbb\x5e\xea\xe2\xb7\x5d\x38\x97\xe4\xe2\x3f\x0f\x89\xc5\x3b\x51\xf4\x03\x3a\xc5\xf4\x85\xbd\xdd\x23\x8a\xa7\xad\xc6\xf0\x8e\x6c\xb1\x05\x60\x99\xce\x2d\x0c\xca\x40\x5a\x2f\xed\xbc\x12\x21\x0c\x9d\xe8\x81\x6b\x88\x01\xbe\xd3\x94\xb5\xa3\x35\xe9\x3c\xaa\xf5\x0f\x5c\x03\xdf\x4c\x0b\xac\x51\xdc\x24\x8b\x79\x7d\xfa\x4f\x3e\x00\x7e\xe0\x27\x87\x69\x0a\x12\xfd\x7a\xcb\x14\xee\x7a\xd1\x3d\xdd\xa1\xed\x6b\x53\x56\xad\xa1\x3d\x8c\xcc\x3a\xfd\x74\x1c\xcf\x2e\xb1\xe9\xd5\xb5\x8c\x7d\xff\xda\xaa\x62\x16\x06\x92\xbc\xaa\x99\x00\x8c\x5d\x1a\xb1\x18\x19\x35\x79\xe9\x50\xd3\xb5\x50\x62\xd0\xd6\xac\xf1\x4b\x58\xea\xeb\x41\xb3\x0f\x94\x2c\xbe\x0b\x91\xbd\x36\xba\x19\xc3\x66\x1d\x54\x85\xe6\xae\x1f\x66\xed\xf7\x57\xe3\x01\x31\x0f\x02\xcd\xe9\x2f\xa2\xfb\x96\xf3\xf9\x0d\x75\x51\x9e\x63\xda\x8f\x76\x54\xdc\xcb\xe6\x59\xea\x38\xf3\xb3\xa1\xcc\xa7\xca\xff\x46\xe5\x69\x6f\x21\xaf\x13\x46\xfc\xf6\x8c\xf8\x79\x1e\x45\x4e\xf9\x21\xa9\x0d\x04\x2e\x71\xd9\xc7\x1c\x12\xb5\x87\xfc\xdf\xcb\x4b\x87\xa6\xf1\xdb\x55\x4a\xc0\xca\x77\x76\x64\x57\x09\x88\x7b\x41\xa5\x4f\xf0\xe8\x22\x6d\xd7\xab\xb8\x1f\x89\x4e\x74\xa7\xe2\x9f\xff\x9e\x8d\xd3\x49\x6b\xd0\x6f\xe1\x77\x37\x5a\xdc\x40\x59\xd6\x77\x5d\x09\x72\xbc\xe0\x57\xe3\x2b\x16\x10\x85\x42\x96\x78\x49\xa1\x49\x3d\x8b\x99\x79\xcd\x67\xe8\x44\xcb\xe3\x7f\x46\x5e\x32\xb8\xe4\xd0\x8d\xe6\x13\x30\x2f\x0b\xdb\x67\x4e\x56\x28\xaf\x78\x59\x2b\x24\x7d\xe4\xa9\x6e\x3a\xf4\x14\x96\xee\x10\x8f\x5e\x69\xf8\x0e\xd1\x68\x2e\x1b\x74\xda\x9d\x0f\xb9\xc3\xbc\xd1\xbf\xc7\x8d\xf6\xed\xb7\x06\xe6\x79\x9a\x01\xb7\x23\x36\x7d\x96\xea\xf5\x94\x8f\x49\xbe\x45\x16\xab\xa3\x02\x50\xbd\x41\xd7\x81\x49\x12\x06\x1d\xb8\xb4\x90\x8b\x3e\xbf\x18\x75\x24\x19\x89\x6f\xc7\x2b\xfc\x20\x7b\x0d\xc3\x07\x59\xb0\x5b\x98\x05\xf4\x9f\xec\x35\x0c\x04\x3c\x25\x1c\xc0\x43\xf5\x24\xa8\xcb\x4c\x0b\xc2\x6c\x13\xa1\x4f\x08\x3e\x1f\x6c\xad\x2f\x99\xae\x5c\xc0\x62\x86\x2c\xb4\xab\x0b\x08\x85\x9d\x57\x16\x54\x2d\x28\x4f\xed\x1b\xd2\xaf\x57\x86\xc8\x92\x70\xe0\xf9\x21\xd4\x7f\x06\xa4\xd0\x7f\x5a\x86\xd4\x04\xd7\xa5\x90\xcd\xb3\x30\xc0\xfa\x19\x70\xdc\xfc\xf1\xff\xd9\x9f\xca\x3b\x5d\xbd\xf4\x33\x80\x7a\xd7\x53\x0c\x56\xea\xc2\xcd\xa6\xf3\x1d\xdb\x4d\xa7\xe6\x50\x8e\x84\xdf\xb2\x50\xf3\x45\x8a\xd5\xa8\xe9\x3c\xbe\x20\xf6\x3f\x82\x7e\xc0\xc3\xcf\x79\xf8\xc6\x7f\x70\xf0\x4d\x84\x3a\xd0\x69\xc0\xbf\x9f\x7f\xc0\xfe\x78\x8d\x03\xe1\x3e\x85\xeb\x2d\xc2\xef\xc9\xe4\xb9\x0b\x55\x6b\x32\x89\x11\x2c\xa1\x9f\x9d\x7c\x10\x74\xa5\x7f\xbe\x09\x26\x2b\x6f\x06\x4c\xd1\x5e\x5e\x5c\xa2\xde\x3a\x10\xf0\x91\xf4\xba\x9c\xfe\x96\x46\x3d\x4a\xd6\x64\x64\x16\xc7\xa1\x3d\xad\x07\x02\xd1\x18\xeb\x34\xdc\xb9\xa8\x59\x2f\x02\x11\x46\xc4\x64\xc5\xa4\xf5\x03\xfa\x63\xc4\x7c\x0d\xd3\xfa\x0c\xc8\xfe\xfa\x4c\x6d\xfe\x06\xd0\xbd\x84\xb6\x2c\x8c\x8e\xf2\x4a\x31\x8e\xba\xd2\xd4\xc4\xad\x33\xd5\x65\x2e\xf9\xd1\x9c\xef\x1d\xaa\x72\x04\xaf\xcb\x48\xf7\xac\x47\x33\xf3\x3d\x6b\x13\x54\x3c\xeb\x76\xb2\x15\x3c\xeb\xb4\x0b\x0b\x2f\xf6\x89\x2b\x69\x46\x8d\xc4\x26\x49\x92\x52\x2e\x17\xf3\x4f\x08\x9a\x03\x3b\x8c\x2c\x99\x6c\x3d\x61\x5f\xe6\xcb\x4d\x60\x7e\x01\xff\xad\x39\x17\xc4\x09\xe8\x7b\x09\x60\x8f\xcd\x89\xef\x2c\x92\xc2\x1e\xb0\x6a\xe6\x2a\x64\xf3\xa5\x80\x1d\xfb\xce\x14\x5d\x14\xbd\xdb\xed\x30\xfc\xdf\xcd\xfa\xf7\xf2\x2f\xd3\x63\x07\x68\xfe\xe5\x30\x27\x68\x53\x48\xda\x5a\x1c\x80\xd9\x75\x0f\xb8\x4e\x52\x09\xa7\x46\xf5\x8e\xda\xef\x88\x93\x3a\xa7\x10\x28\x83\xff\x8e\x9f\x43\x0e\xc6\x2d\xb0\xf7\xe1\xd4\x76\x8a\xe3\xea\xc7\xce\x23\x6b\x52\x67\x1e\x9a\x59\x1f\xa8\x7b\x85\x4b\x24\xaa\xa9\x50\x4d\xa9\xeb\x44\xd7\x2f\xd4\x8c\xe2\x08\x30\x47\x92\xed\xc1\x29\x33\x24\x87\xe2\x53\xe8\x7a\x17\x5e\x7f\xd7\x11\x09\x54\xb3\x37\x72\x4f\x54\xa7\x3a\xed\xf1\xf0\x9f\x86\x19\xa4\x6f\xfc\x5f\x05\xba\xbf\x48\x2d\x00\xc2\xd7\xb8\xaf\x47\x95\x73\x81\x05\x69\x17\x7a\x9e\xfa\xa1\x07\x20\x92\x97\xb0\xf5\x73\xc8\xd2\x1e\x1c\xf7\x01\x62\x4f\xb4\x0b\x1f\x2b\x42\xec\xe5\x21\x7a\x40\xbe\x82\x40\x79\xe0\xef\x2f\x06\x0d\x1c\x5e\x30\x47\xbf\xa5\x89\xbd\x87\x1b\x1a\x80\xf6\x92\xc5\xb6\x80\x1b\x4a\x87\x7a\x2d\x84\x2d\x1e\x40\x71\x31\x33\x65\x61\xcf\xdc\x09\x60\xf6\x55\x22\xd5\x00\x9b\xf9\xb1\x66\x58\xa4\x0b\xf1\xed\xa3\x4d\x3f\x87\x39\x94\x6c\x2d\x92\x8c\xd8\xc1\x51\xab\x2d\xc6\x70\xfb\x00\xf6\x8b\xf2\x4a\xc0\xe9\x17\x6d\xe6\x88\xfd\x39\x42\x5d\x0b\xeb\x95\xbc\xea\xe7\x81\x96\xf1\x85\x10\xef\xc0\x5d\x50\xd0\xfa\xb1\x86\xb1\xc2\x01\x7b\x45\xfd\xea\x0c\x32\x5f\x44\x99\x28\xfb\x7b\x96\xea\x36\xab\x90\x47\x86\xc0\xc0\x92\xb8\x2a\x0c\xb1\x21\xc2\x29\x55\x6e\x8f\x42\x8e\xcb\x4d\x97\x43\x24\xd7\x49\x01\xc1\x09\xf0\xb9\xd4\x11\xd9\x77\x0b\x46\xfd\xb8\x3f\x40\xa8\x23\xa3\x02\xe4\x2f\x01\xba\x42\x81\xfb\x33\xbc\x26\xfc\x62\xe7\x90\x11\x3d\x72\x8a\xab\x94\x45\x33\x3b\xd2\x73\x15\x17\xf8\x48\x97\x60\xac\x84\xf6\xc7\x80\xf7\x80\x0d\xa5\xef\x0e\xa7\x8f\x5e\x7a\xdd\x9f\x39\x78\x05\xe4\x53\x1f\xc8\x85\xcf\x11\x0d\x69\xe1\x4f\x48\x71\xc4\x9e\x37\xad\x10\xec\x0b\x29\x2b\xc7\xf1\xbf\x6c\x0c\x7c\x72\x18\x5c\x62\x2c\x5b\x50\x53\x65\xf5\x12\xc6\x0a\x9c\x35\xb4\x8c\xac\x4d\x66\x5e\xce\xbc\xf5\x58\x14\xf4\xe6\xb7\x6d\xa3\x38\x0a\x50\x15\x5d\x3b\x1b\xdc\x40\xbc\xc8\x0f\x71\xe6\x07\xa1\xf0\xf0\x79\xe6\x33\x2e\xc7\x67\x5b\x4c\x2c\xd4\x4a\x4d\xbf\xac\x07\x25\xc2\xbd\xce\xe3\xbf\xab\x2c\x7e\x15\xec\x42\x9f\x22\xf6\x95\x25\x09\x26\x5c\xa6\x5b\x84\x82\xe8\xf5\xf6\x37\x41\xf7\xf5\xe6\x14\x67\x47\xff\x4f\xf9\xef\x72\x92\x7d\xb2\x53\x36\xc9\xfa\x58\x21\xb1\xd9\xdb\x4e\x21\xc3\x8a\xa4\x7c\x11\x01\xd9\x66\x2c\xbe\x6f\x7e\xb3\xee\x01\xe9\xee\xa0\x0f\xb8\x57\x8c\x07\xfe\x2e\xee\xc4\xce\x95\x81\x12\xdf\x94\x34\xdc\x31\xd3\xf2\x23\xa4\xca\x5b\x60\x7d\x27\x48\x76\x1c\x44\x78\xca\x95\x6f\xd7\x2e\x08\xd7\xf6\x66\xc7\xb8\x41\x20\x29\xd2\x0f\x5b\xd8\x05\x81\xc5\xc5\x8e\xdd\x3f\xfc\x4a\xce\x9f\x82\xdf\x01\xd4\xaf\xa4\x77\x6c\x45\x1e\x9d\x5b\x91\x66\xdc\x56\x6e\xb9\x18\x6d\x21\xfd\x8c\xb2\xdd\x8f\x70\xfe\xb9\x12\x73\x5c\xc4\xdb\xf5\xdc\xd9\x2a\xab\x13\xfb\xb0\x47\xf3\x6c\xf1\x54\x84\xef\x70\xd8\x7f\x6c\x0e\x60\xc3\xa6\xe3\x61\x0e\xce\xc8\xfa\x8e\x59\xbb\xf5\x2a\x19\x68\x0c\xbe\x95\x91\x8b\x70\xe6\xda\x4a\xcf\x9b\x84\x0a\x67\xd1\x32\x73\xc9\xe2\x8b\xf5\xf4\x37\x47\x6d\x90\x70\x09\xd8\xf6\xdc\xc4\xf0\x37\xb5\x56\x10\x13\x26\x25\xa0\x9f\x44\x02\x98\x72\x80\x16\xf0\x81\x69\x0a\x48\x87\xfb\xe6\x4d\x86\x5a\xa5\x48\xbb\x45\xf3\xc3\xfb\xcb\x0d\x39\xa9\xf2\x23\x3c\x3f\x97\x21\x37\x1e\x2c\xb9\xcd\x61\x7f\x44\xf8\x0f\x14\x01\xda\x72\xef\x95\xc6\x2d\x6b\xb0\x6e\x01\xcf\xc4\x5a\xe3\xc4\xe0\x45\xc5\x16\x8f\xa1\x29\xe7\x9b\xf5\x28\x73\x0b\x69\xde\x2f\x4a\x51\x6c\x3d\x34\x33\x0b\x37\x18\x73\x0a\x71\x71\x5e\x93\x1e\x6e\xf7\x5c\xe3\x30\x4c\xc5\x43\x38\x61\x02\xcf\x6f\xcd\xd6\x1c\x82\xe2\x67\xd5\x48\x5f\x9a\xe3\xb3\xe2\x22\xcc\x3e\xb4\xc2\x02\xf2\xdf\x80\xfc\x10\xfb\x4a\x8d\x09\xc0\x9c\x22\xb0\xfe\xe7\x1d\xf8\xff\x48\xc8\x6f\x7d\x97\x04\xa7\x7f\x6b\xca\x8b\x48\xa0\xf8\x00\x5c\x59\xd4\x73\xbe\xbe\x25\x2a\x0c\x50\xbc\x5c\x41\x26\xfd\x00\x6e\xfc\xdc\xe6\xaa\x21\x46\x6e\x27\x4c\x1e\x06\xea\x02\x92\x17\x40\x4c\x25\x40\x6a\x0c\xdb\x7b\xd5\xd3\x88\x65\xf3\x8a\x01\x9f\xa2\x84\x21\x9b\xa4\xc7\xff\xe8\xfe\x36\xad\x73\x1d\x69\xca\x0f\x81\xff\xcf\x9e\x3a\x68\x5b\x90\xd9\x31\xe8\x08\x8c\x8c\xc5\x92\x13\x05\x25\x60\x0a\x96\x80\xa8\x75\x5b\x5a\x41\x59\x63\xb4\xa2\xd0\xc2\x2d\xd7\x50\x7e\xb6\x70\x2a\xb7\xc4\xca\x75\x95\x93\x44\x81\xa0\x3c\x10\x80\xd6\x2d\x61\x12\x26\x16\xc4\x38\x93\xc9\x90\x4f\xa9\xa5\x0f\xdc\x1f\x52\x6b\xe3\x24\xd9\xfc\x90\xa8\xb6\x80\xf2\xa8\x24\x1a\xfc\xb5\x63\x25\x8f\x60\x1f\x07\x0e\x6e\xb6\x24\x7c\xf6\x7b\xe7\x62\x70\x31\xc5\xb5\xbe\x25\x53\xb9\xd6\x9b\x58\x6e\x60\xac\x25\xb6\x63\xed\x31\x45\xd2\xad\x51\x22\x00\x70\xb5\x26\x69\xe7\xe6\x13\x3f\x4b\x6f\xc4\x02\xd2\xef\xd7\x3a\x00\x31\xe7\x51\x14\x32\xd7\xe0\x0f\x7b\xd0\x68\x0a\xfc\x20\x58\x7e\xed\x67\x9e\x47\x58\xf1\xae\x41\x67\x02\x9d\x61\x24\x0c\x04\xa2\xeb\x5a\x2e\x5c\x0c\x6f\x2d\x73\x0c\xa9\xd7\x12\x12\xef\x70\x3c\x0b\x75\x73\xc4\xec\xf1\x3c\xf4\xdf\x5e\xb6\x7a\xf5\x3a\x2e\xdc\xeb\xd9\x89\x61\x7a\xb8\x07\x8d\x61\x91\x3a\x38\xf4\xf2\x54\xea\xb4\x11\x99\x5e\x78\x70\xa0\x5e\x5c\x75\xd8\x6d\x3e\x3c\x82\x1c\x11\xd7\x41\x20\x9a\x40\xfe\xd9\x45\xca\x23\xcc\xfb\xc6\x81\xa9\x7d\x80\x62\x39\xe9\x0d\x0e\xb2\x06\xd5\xae\xfd\x6c\x94\xf9\x04\x73\x5a\x81\xb5\x7a\xba\x46\xe2\xaa\x32\xdc\x9a\x8b\x74\xdb\x77\xe5\x68\xd6\x3c\xea\xbc\xa1\x90\x11\x01\x17\x43\x93\xc3\x82\x44\xbb\x2c\x1b\xd7\xf4\x56\x86\x65\x85\x8c\x23\x19\x20\xf6\xfa\x56\x2e\xc7\x29\xe8\x01\x16\xea\x46\x92\xeb\x46\xec\x3f\xdd\xd8\x00\xfe\xb3\xc6\x5e\x24\x06\xa0\x06\xc4\x24\x90\x5a\x0f\xd2\xd4\x3e\x62\x58\x93\xf0\xb3\x6b\x3a\x84\xd2\x05\xd6\x86\xc2\x53\xab\xeb\x3a\x05\xd1\x60\x6c\x5c\x01\xf7\xea\x8c\xd5\x43\x5c\x77\xe4\x20\xb8\x14\xc7\xa2\xe1\x23\x10\xcd\xfc\xff\x1a\xdf\xda\xa9\x61\x8c\xed\x91\x4d\xb1\x38\x13\x5b\x3d\x17\xd8\x17\x9d\xf5\xe3\x31\x07\x59\x42\x3e\x01\xf6\x28\xf1\x6a\xf4\x4c\x6d\xad\xc9\x2b\xb0\x24\x26\xc8\x77\x7f\xa9\xec\xba\x96\x2a\xf2\xd7\x52\x3b\x1f\x0b\x2c\xd5\x4e\x0c\xbb\x2f\x2e\x70\xe7\xb8\xf7\x93\xf9\xee\xc5\x9e\x3d\x92\x07\xce\xf0\x57\x73\x7d\xf8\x0f\x03\x4e\x31\x2c\x68\x38\x85\x05\x3e\xc0\x7e\x84\xf2\x91\x26\xfc\x87\x5c\x85\x86\x40\x71\x49\x78\x87\xe8\x17\x19\x52\x2d\xe5\x97\xec\xcd\xa5\x68\x84\x0c\x46\xc2\x2f\x01\x26\xcb\x5a\x95\xe5\xb4\xc8\x67\xac\xc0\x20\x2e\x53\xe3\x4c\xe0\x59\x54\x94\x83\xbf\xa0\x2c\xe6\xb2\x8a\xcc\x64\x41\x22\xef\xe0\xf3\x21\x18\x7f\x21\xd5\xcf\x23\x24\xab\xe8\x27\xb2\xb8\x10\x78\x60\xa3\xe3\x93\x54\x49\xc0\x64\xe0\xab\x8a\x88\x0b\xd1\x15\xf6\x81\x24\x8d\x39\x48\xde\x16\xf5\x49\x7a\xf2\xb3\x06\x6f\x8b\x27\xc2\x78\x1a\xe3\x74\xb7\xd9\xa5\xb5\xfb\xfb\x87\x62\xfc\xec\x47\x96\x69\x26\xfb\xc1\x75\x45\xaf\x26\x4b\x4f\x0a\x83\x1d\x8d\x9f\x65\x89\xb7\xe4\xe0\x23\x64\x1f\xd6\xa0\x9c\xea\x6d\x9e\xea\xaa\xcb\x57\xb1\x3e\x5d\x87\x66\x03\x4b\x3a\x5a\x83\xb5\xe0\xb1\xfe\xfb\x81\x0b\x0e\x46\x97\x38\x16\x3a\x0a\xb2\x1d\x56\x6e\xa0\x3a\xa3\x05\x8d\x18\x81\xb7\x51\xdb\xa4\xf8\x92\xd7\x3d\xcd\xaa\x1d\x2d\x49\x97\xfd\xb7\x72\xcc\xfd\x5b\x5d\xec\xe3\xb7\x28\x39\xe4\x81\x2f\x31\xe6\xe6\x73\x6e\x31\xf9\x0f\x74\xd6\xfb\x9d\x41\x00\xf6\x9d\x6d\x9c\x53\x49\x7e\xb0\xf3\x26\x93\xe1\x7c\xce\x5c\x12\x46\xf1\x0b\xb9\x04\x1e\xd9\x7e\x0a\x47\x71\x8c\xb8\xd9\xdf\x04\xb2\x7f\x0a\x66\x84\xeb\xe8\xbf\x22\x05\x3f\xd7\xc0\x70\xcd\xa7\xdf\x2b\xbb\x7b\x92\x1c\x9a\x35\x52\x9a\x7f\x25\x1c\x3e\xcb\xe4\x63\x16\x8f\x1f\xb8\x47\xdd\x8c\xe9\xbd\xfb\xb3\x34\x85\x4c\x00\x9c\xe0\x48\x7b\x90\xec\xb1\x05\x3e\x0f\x9a\x6c\x54\x39\x48\x51\x7f\xbf\x5b\x91\x88\x8a\x73\xd9\xa3\xc0\x80\x4d\x75\xac\x79\xd7\xde\x23\xa9\x13\x04\x80\x4e\x15\x70\x0d\x8e\x3b\xa6\x2a\x7e\xc3\x4b\xc4\x08\xaf\x74\x79\x14\xd2\xfd\xa8\x10\x85\x85\x02\x98\x6c\x8f\x24\x9d\x7d\xf0\xb8\x79\x1d\x6c\xa0\xfd\x99\x44\xfc\xc5\xa0\x7b\x96\xb6\x7d\xf9\x43\xd2\xb0\x51\xf4\x29\x42\x86\x0d\xf8\x1a\xe8\x68\x9a\xdd\x12\x92\xd1\x95\x45\x85\xe0\x55\x98\xcf\xf4\x16\xc1\xc2\x5e\x2a\x70\xeb\x44\xac\x90\xf0\x94\x5b\xcc\xc3\x29\xfa\xc1\x4f\xeb\xfd\x15\xe8\x5f\xbf\x17\x67\xfe\x03\xe7\x9f\x83\x5a\xe1\xdd\x36\xa6\x90\x9b\x3e\x12\xe2\x3f\x77\xa1\xd4\xff\x0e\x2e\xc5\x2b\xc8\x0e\x61\x3f\x84\xd7\x8f\x57\x0d\x93\xf0\x60\x5c\x0c\xa4\x55\xec\xba\x83\xb9\x31\x82\xa1\xa0\xa0\x23\xac\x0f\x31\x22\xe6\x18\x32\x58\xb8\x2c\x04\x3d\x80\x27\x41\x1e\x07\x86\xe9\xda\xa3\x63\xb7\x28\xce\x04\x6f\x31\x54\xec\xb8\xec\xa2\x24\x37\x29\x4d\x34\xb9\x77\xe9\x2c\x12\x84\xf7\x7e\x6f\x86\xe2\x40\xd8\x0f\xf6\xd1\x2c\x18\x15\xfa\xea\xbc\x0f\xf1\xe4\x30\x82\xa3\x0b\x24\x7a\xfd\x38\xeb\x04\x06\x3a\x47\x90\x93\x4f\x05\x3d\xd8\xaf\x96\x2c\x74\x29\x98\xa9\x64\x85\x2b\x0f\x6b\xf3\x91\x85\xdc\x8d\x35\xd6\x84\xa9\x41\x5a\x1f\xaa\xd5\x20\x94\xea\xd2\x94\xac\x55\x89\x7f\xc9\x6c\xa6\x2d\xcf\xef\xbf\x56\x4f\x3e\x11\xeb\x38\xa5\x07\xa1\x46\x53\x0a\x15\xa1\xb1\x02\x34\x10\x14\x8c\x7b\xd9\x95\x1f\x1d\x2b\x46\x17\xa2\x38\xd4\x5d\xa9\xf3\x11\xdd\x1a\x84\x28\x43\xd3\x1e\x52\x62\x7c\x89\xc0\xe5\x10\xa7\x63\x0d\x9b\xe2\xb1\xfa\xbc\x08\xef\x54\x5b\xf3\xe5\x30\xd8\xfc\x64\xe2\x93\x30\x86\xe2\xc8\x78\xd2\x47\x72\x74\x6c\xe2\x1d\x91\xf3\x14\x6c\x16\x1b\x34\x06\x28\x82\x34\x9e\x83\xac\x09\x06\x6e\x2d\xab\x75\xb7\x26\x08\x47\x84\x14\x09\x5c\x0b\x85\x60\x40\xf4\x78\x44\xc0\x65\x27\x2f\x85\xd4\x51\x85\xbf\xdc\x2c\xc8\x8e\xe5\x7a\x05\x7f\xc4\xe7\xdf\x23\xe0\xaf\x3b\x45\x64\x2d\xee\x3f\xef\x9e\xab\xcb\x10\xcf\xd1\x58\x56\xb2\x4a\xec\xe4\x27\x2f\x54\xc3\xab\xe0\xc5\x66\x0e\x61\xd0\x57\x40\x4d\x23\x81\x74\xc4\xc8\x49\x98\x21\x8b\xe3\x44\xf1\xf3\x89\x88\x1d\x81\x6e\xe4\x55\x9c\xa9\x90\x37\x46\x32\xcd\xe6\x0e\x36\x27\x75\xe7\x86\x19\xe8\x00\x0a\x64\x8c\x60\x8f\x29\x8d\x3f\x66\xe5\x25\xad\x1b\xaf\x42\x41\x8d\x39\xa6\x4f\x76\x94\x97\x37\xb0\x23\x44\x88\x2e\xae\xfa\xb2\xe6\xdc\x80\x1d\x42\x97\x59\x1f\x58\xa2\x18\x95\x0b\xb1\x65\xd7\xf0\x1b\xee\xb6\xce\xb5\xb3\x9c\x12\xb2\xd4\x7a\xc7\x3c\xc8\xf2\x20\x87\xe2\x81\x4d\x73\xf9\xd6\x8e\xe9\x39\x93\x42\x52\x9b\x2f\x42\x15\x2b\x6a\x04\x46\x83\x1b\x9d\x54\x46\x85\xaf\x06\x4f\x3c\xa8\x01\x23\x4a\x08\xfc\x6a\x6d\xe3\x01\x8f\x7b\x39\x38\xa4\x35\xb8\xda\x63\xa2\x93\xf2\x98\x06\x9d\x58\xea\xf8\x1f\x3b\x20\x7f\x2f\xfd\xaf\xce\xde\x7a\x65\xbd\x1f\x55\xfc\x7a\x0b\x1a\x93\xeb\x51\x7f\xe7\xe2\xaf\xeb\xa3\x8a\x6f\xf0\xa8\x21\x34\x63\x97\x6e\x97\x0b\xc2\x28\xde\x8a\x17\xc4\x3c\x4a\x3e\x92\x9c\x19\x2f\xda\x3e\x0d\x7a\x47\x48\x68\x21\xb5\xe5\xbc\x94\x1a\x7b\x80\xc4\xf4\x43\x46\x4b\x7b\x9b\x1e\x65\xd7\x76\xfe\xb4\xd9\x82\xaf\xa5\x05\x6b\x38\x25\xac\x9a\x8a\x3d\x56\x2f\xa5\x3a\xc7\x03\x59\x8e\x46\x6c\x01\x93\x74\x14\xdd\x05\x56\xd5\x49\x53\xb6\x47\x2b\x8a\x5b\xa4\xb4\xa0\x0d\x97\xa7\x59\x56\x09\x4d\x8b\x58\xe1\xac\x30\x3d\xa5\x87\xff\x98\xb3\x08\x30\x9c\x29\x3e\x66\x90\xd3\x2f\x46\xbd\xcf\xa4\x1f\x59\x3c\x9d\xbf\x84\x03\xb0\x60\x26\xfd\x22\xa5\x0a\xdd\x41\x21\x2e\x7b\xe6\xcb\xf8\xc8\x82\x44\x3d\xd2\x73\x16\xf9\xc5\x2e\x5c\x9b\xef\x3c\x92\xe8\x2b\xe7\xae\xcf\x82\x8c\x3e\xd2\xe2\x0c\x46\x0f\xe7\xd3\x86\x07\xde\x70\x3e\xa8\x82\x99\x05\x86\xf6\x50\x7e\x3a\xd9\x25\xd2\x3c\xd0\xc4\x03\x9a\x49\x6a\xeb\xed\x25\xaa\xfc\x0e\x50\x64\xa7\xc9\x9c\xb9\xf3\xd3\xce\x47\x93\xa1\xc9\x87\x6c\x15\xf6\x37\x67\x96\x50\x9a\x58\xa5\x75\x93\xbf\x66\x69\x79\xf3\x76\x21\xbb\xcc\x86\xb7\x0b\xad\xd0\x92\x75\x27\xf5\xfb\xff\x94\x5a\x20\x73\xc4\xdd\x26\xd1\x5c\x06\xd4\xd8\x75\xc4\x41\x67\xd0\x20\x04\x2a\xbf\x81\x0b\x43\xe3\x06\x67\x6b\x37\x83\x1f\xc7\xb3\x69\xdf\x34\x8a\x36\x43\xab\x00\x52\xf2\x06\xeb\x27\x5a\x86\x65\x40\x47\xc1\x9c\x92\x85\xbd\x27\x1a\x87\x1a\x5e\x07\x36\x0f\x1a\x0b\x75\xa9\x07\xa0\x86\x9c\x0c\x72\xe6\x37\xc7\x9a\xc0\xff\xc9\x64\xe1\x45\xef\x80\xd2\xa8\x29\xf6\xbc\xeb\xab\x33\x8c\x0c\x4a\x89\xad\xf7\xe4\xaa\x59\x1e\x88\x2e\xb3\x75\x6d\xea\x34\x14\x09\xc1\x0d\x12\xc4\x1f\x4a\x27\x75\xa7\x01\xfe\xd0\xdc\x03\x33\x3f\xb1\x9d\x87\x59\x33\xbb\x61\x96\xa0\x32\x44\xbd\x39\x1e\x1b\xe6\xf8\x0a\xd9\x05\xb1\x74\xe6\xc3\x0b\x34\x7e\x0e\xf3\x16\x32\x35\xc3\xbc\xca\x6f\xc2\x35\x23\x9b\x65\xf7\xf0\xb5\x85\x70\x0c\x31\xb7\xed\xc2\xf7\x21\x3f\xc5\x9f\xb9\xef\x20\xb6\x5c\xa1\x1b\x6d\xa1\x4d\x6b\x77\x71\x6f\x2a\x69\xfe\x36\x62\xd7\x1c\x77\x00\x29\xae\xb3\x9e\x91\x07\xd8\x50\xef\xfd\x11\xc7\x86\x0d\x8c\x85\xf6\xec\x8a\x25\xb3\x16\x92\x71\x56\x2f\x2d\x0e\x41\x8f\xb5\xc0\x73\x18\x43\x9e\x83\x06\x34\xcb\x89\x6f\xc8\xf4\xc5\xe1\x89\x5a\xc3\x79\x73\xe8\x3e\xe4\x47\x95\x81\x45\xee\x4a\xb0\x7d\xec\xa9\x27\x23\x2a\xa7\x48\x71\x59\x38\x84\x48\xf0\x80\xa6\xc1\x81\x5d\x2e\x82\x73\x37\xdb\x08\x7d\x2b\x49\xf3\x01\x78\x54\x3d\x70\xca\x51\x0d\x50\x5a\xd5\x97\xeb\x87\x16\xda\x16\xf1\xe6\x26\x11\x70\xa8\xb0\x82\x8a\x58\x4c\x35\xfa\x7a\xbf\xce\x99\xaa\x69\x16\xaf\x34\x0d\xef\x2b\xe7\x1d\x7d\x95\x48\x52\x4f\x0c\x3f\xcf\xc7\x3f\xa8\x09\xe9\x6b\xb4\x8d\x3d\x2a\x77\xda\xe0\x9c\xd5\x95\xba\xed\x84\xa8\x3e\x00\xdf\xdb\x06\x9b\x68\x35\x3e\x33\xc6\xd2\x9f\x9d\xfe\x4c\xb3\xce\x0e\xee\xbb\x24\xc4\x88\x10\x51\x68\xf6\xd4\x17\xaf\xcb\xf7\xf6\x6f\xb2\x9c\x23\x9e\x8d\x85\x22\x58\x90\x2d\xc5\x88\xb9\xef\xa0\xdf\x5c\x04\x66\xad\x22\xe8\xfc\x3f\x55\x5f\x96\xe0\x2c\xcf\xf4\xba\x97\x77\x67\x06\x9c\xe0\x66\x30\xbf\x81\xe4\x4b\x56\x7f\x4a\x25\x95\xf3\x9c\x9b\xb6\xa0\x99\xc2\xe0\xa1\x5c\x92\x82\xa8\x73\x44\xdc\xdd\xf0\x46\xed\x72\x43\x62\x01\x1b\x5a\x98\x5f\xe8\x0c\x1d\x1a\x45\xec\xe2\x1d\x21\x03\x9e\x6c\x24\xfb\xb8\x2e\xae\x5a\xab\xf7\x2d\xc0\xd2\xb9\x75\x06\xb8\x12\xcb\xb4\x42\x43\x71\x0f\x2d\x5f\x5a\xa5\xfa\x03\x48\xde\x11\xd0\x86\x62\x97\x73\x8c\xa9\x80\x11\xfe\x89\xb3\xba\xb2\xe3\x1a\x42\x11\xe3\x9a\xc3\x6f\xdf\x20\x12\x15\xb4\x1f\x74\x2b\xc8\xca\xb1\xb7\xcb\x4f\x19\x0c\x96\xf2\x08\x8a\x4e\xb1\xce\x86\x87\x08\x49\xcf\x11\x25\x02\x79\x4b\x71\x43\x5c\xb4\xd0\x7b\x78\x80\x5a\x67\xbd\x36\xd1\x4d\xe6\x7f\x9b\x22\xc4\x2c\xd4\xd6\xc2\xb7\xe2\x15\x9b\xa4\xce\xd4\x89\xfc\x97\x11\xc9\x09\x7c\xd8\x39\x1c\x31\x92\x24\x3b\x5c\xcc\x79\xfd\x4f\xe4\x9a\x35\xd2\xbc\x9d\x5f\x43\x03\x8b\x24\x33\x4a\xf7\x8f\x10\xe3\x66\x63\xfc\x00\x3e\x12\xf1\x1e\x24\xb8\x86\x74\x4b\x8b\xd6\xed\x25\x50\xff\x68\x8b\xa3\xe8\x0b\x1d\x99\xf2\x2d\x94\x7c\x3c\x30\x86\x28\x32\x02\xe8\x9d\xfd\x83\xf1\x26\x8f\x84\x19\x06\xad\x4b\x9b\xec\x26\x98\x49\x3c\x6a\x7e\x00\xe5\x1a\x1c\x9b\x14\x13\xc8\xc0\x64\xdb\xbc\x25\x6a\x36\x7c\xd8\x33\x19\x3e\xf8\xc9\x38\xc2\x80\xa0\x59\x23\x98\xbd\xbb\x65\x20\x2c\x25\x44\x46\x47\x7e\x20\x5f\x65\xb0\x6f\x62\x73\xeb\xf8\x24\xfd\x57\xc3\x10\x43\xa2\xc4\xdc\xf4\x29\x85\x09\x05\x77\x13\x1d\x6f\xb8\x73\xa7\xe5\xa8\xd3\x39\xd8\x70\x2e\x34\xe3\x1d\x07\x83\xa4\x51\x0f\xd5\x4a\x45\x56\xac\x25\xfc\x5f\x50\x69\x38\xb4\x03\xf5\xc6\xa9\x09\x48\x92\x95\x37\x44\x61\x4e\x05\x38\x36\x4c\x3d\x71\x9f\xb9\xce\x0b\x6a\x65\x5b\x63\xcb\x50\xa9\x1a\x64\x0c\x3a\x84\x31\xd1\xa0\xec\x5b\x0c\xc1\x69\x7a\xa1\xee\x20\xfc\x26\x7c\x45\x7d\x73\x86\x6f\x80\xeb\xc0\xa9\x9f\x6f\xf5\x41\xe7\xd8\x9c\xb3\x7c\x23\xc4\x6a\x69\x93\x3e\xa3\xa1\xfe\x63\xc4\x80\xcc\xd4\x2c\xf0\x20\x9b\xc1\x27\xf5\x72\x16\x9b\x46\xb4\x97\x3a\x77\x02\x39\x98\x34\xd1\x03\x1c\xba\x36\xe4\x50\x47\x3a\x6e\x01\xe8\x6a\x06\xc9\x11\x0c\xdd\x52\x66\x60\x78\x09\x2d\x83\x2e\x74\xd5\x78\xc6\x1a\xc0\x6f\xfe\x8b\x30\xd1\x00\x1b\x19\xcd\xef\x39\xe6\x1d\x43\x16\x06\x9a\x05\xe2\xf2\x15\xe8\x5c\x2a\x40\xa9\xe0\x39\x16\x19\x46\x2d\xb5\xdb\x52\xe8\x3a\xf4\x82\x0e\xd0\xd6\xf0\xcd\x4b\x18\x38\xa1\x59\x85\x25\x04\x61\xb7\x12\xb7\x26\x4c\xec\x92\x02\x8d\x47\xd2\x6e\x3e\xa2\x6d\xe5\x8f\xdf\x2d\xb7\xf6\xe6\x7f\xc2\xaf\x68\x70\xd3\x2d\x12\x67\x90\x4d\x97\x88\xc4\x9b\x69\x41\xb4\xe9\xd2\x49\x8e\x45\xb2\xca\x9a\x4e\x1f\x82\xdc\xb3\xe7\x09\xc9\xda\xc4\x0a\x83\x5a\x6f\x41\x31\x2a\x47\x32\xb8\x58\xd7\x68\x67\x87\x1c\xbf\x3e\x2b\x7e\x31\xe4\x7f\x28\x38\xe3\x42\xdf\x12\x68\xb5\x34\x02\xde\x5e\x28\xc4\x4e\xa4\xbe\x38\xe1\x49\x2b\xf5\xea\x3a\x3d\x67\x0e\xb4\xfe\x8c\x25\x12\xeb\x6e\x2e\x05\xd9\x0d\x1a\x42\xe1\x37\x61\x5d\x2f\x31\x78\xfa\xfb\xe4\x55\x97\x38\x3c\x83\x6c\x4f\xa0\x34\x41\x3e\x58\xff\x34\xc3\x0b\x1b\x5c\x1c\x11\x7a\xd2\x79\x83\x7f\xc6\x34\xe5\x21\xf9\x48\x75\x48\x33\x37\xb7\x5e\x70\x0e\x1a\x90\x55\x37\xbc\x12\x11\x84\x98\x0f\x98\x3e\x9c\xe6\x85\x1c\x2c\xaf\xa5\x1b\xf2\x80\xa6\x13\xfd\x5e\x39\x2e\x5b\xd7\x44\xf5\x6d\xba\x16\xb5\x63\x40\x61\xdb\x80\xc1\xaf\x88\x29\x92\xd8\x82\xb8\xac\xd3\x74\xce\x3c\x70\x2c\xef\xd5\x38\x37\x97\x65\xa5\x95\x91\x14\x88\xf9\x49\xae\x72\x7e\xa7\xac\x32\x50\x5b\x67\xe5\x21\xd9\xa0\x56\x34\x39\xe8\xf1\x50\x42\x28\xc9\x9b\x10\x6e\x0f\xe4\x15\x6d\xac\xe8\xd3\x7a\x87\xaf\xc6\x6a\x2d\x30\x6f\x45\xfa\x31\xe5\xd5\x4d\x02\xb3\xc9\xc3\x82\x60\xc0\xa2\x98\x25\x7e\x97\x62\x14\x61\x1d\x28\x3a\x0b\xa5\x27\x7c\x69\xf6\x7f\xa0\xda\x9c\x14\x75\x4b\x9a\x4e\xd7\xb0\xc3\x14\x45\x7c\xbf\x69\x64\x25\x9e\xc6\x48\xd4\x43\x80\xda\x2f\x9d\x5d\x1e\x2b\xd8\xb3\xf8\xba\x6c\x38\x2b\x86\xef\x9d\x43\x93\xf4\x5b\x98\xc9\xf5\xed\x91\xd3\x2f\x63\x34\xce\xc5\xf9\x92\x8a\xc3\xa8\xec\xd7\x33\x67\xfc\x83\xfd\xa6\xe3\x50\xed\xff\xb5\x1b\xc2\xdb\x06\xeb\x0b\x1d\x3f\xe8\x21\x9f\x9b\xfc\xa3\xcf\xc9\xef\xfb\x63\x35\xbb\x78\x3c\x4c\x24\xfb\x60\xd4\xc3\x96\xe6\x23\x49\x5c\x78\x5f\xd0\x5a\xeb\x83\xb7\xc2\x0f\x83\xdb\x8e\xff\xfd\x8f\xd3\xab\xd6\xb7\x25\xaf\xa6\xa1\x1a\x64\x1d\xf2\xb6\xc1\xc6\x38\x87\x21\x05\x3c\x2d\xc9\xc6\xa9\x2b\xeb\x37\x18\x64\x20\x98\xa9\xfc\xbc\x77\xc5\xa8\x4d\x29\x9b\xef\xee\xbc\x0b\x94\x77\x89\x65\xdb\xc2\xe2\x0e\xef\xef\xae\x27\x04\x26\xcf\x97\xe5\x92\xd7\xee\x9f\xb1\x4f\x3a\xce\xae\xf7\xe4\x5d\x36\xae\x58\x5d\x74\x9f\x70\xd5\xd4\xb1\x1b\x69\x9f\xe1\x97\x11\x9d\x35\x43\x9e\x41\xeb\x57\x5d\xf2\xf4\x21\xbd\x68\xea\x27\xb1\xfe\x59\x38\x6f\x8c\x0c\x55\xbc\x4b\xb8\x15\xc9\x51\x83\x14\x20\x28\x3e\x6a\xcb\xb9\x4c\xde\x60\xbe\x99\x55\x03\xd2\xcf\xcf\x03\x03\xb9\x3c\x3e\x55\xf3\xf6\xfa\x99\x7e\x19\xec\xa6\xbf\xc9\x4f\x14\xf3\x28\xab\xa5\x72\xe1\xea\xdc\x7f\x63\xee\x32\x72\x80\xf2\x9f\x7d\x4b\x31\x00\x1e\x1c\xf3\x15\xd6\x1b\x45\xd3\x26\x6f\x28\x36\xc6\x49\x9f\x4d\x9c\xaa\xfc\x8c\x1f\x99\x4e\x36\xc1\x6f\x6b\x9a\xbd\xf2\x44\xd2\xfd\x4c\x22\xfa\xdb\x3b\x0f\x9a\xb5\xb0\x05\x05\xaa\xdc\x54\x43\x64\x9f\x18\xdb\x1b\x4a\xef\x08\xe8\x83\x03\xc4\x78\x0e\x50\x6c\x30\x8b\xe9\xff\xe6\x68\xe1\x65\xc3\xe8\x60\x0a\xbf\x60\x4c\xe5\x44\x53\xff\x0f\xf3\xc4\x5f\x1e\xde\x69\x8e\x20\x9a\xe3\x95\xee\x6b\xb5\x31\x31\x19\x3f\x90\xc0\xf6\x00\xdf\xab\x34\x79\x74\x1c\x5d\x63\xe4\x85\xc1\x02\xc3\x88\xaf\x32\x05\x1d\xe8\x94\xb9\xc6\x49\x7e\xc2\x4b\xb1\x74\x2b\x9f\x24\x00\xc2\x77\x43\x6c\x9e\x8c\x3c\x9d\x22\xc3\x8d\x15\x7d\xdb\xe7\xcd\x4d\x9e\x6c\x93\x5f\xea\x9a\xc2\x53\x83\xc7\x4d\xfb\x8b\xe6\x9e\x5a\xa0\xf2\xc8\xcd\x8d\xa1\xdc\x3a\x31\xf9\x0d\x0b\x5e\xd3\x00\x8c\xf3\xd5\xdd\x35\x74\xdc\x3d\x4b\x8b\xfe\x95\xc2\xa2\x63\x52\x72\x97\x9c\x37\xae\x4e\x44\x12\x67\x03\x28\x09\x29\xa6\xec\x60\x17\xa0\x33\x08\xc0\xca\x03\x43\xbd\xc2\x2b\xb2\x9b\xca\x71\x38\xbe\xb3\x8f\xe4\xc8\xb1\x2a\x56\x80\xe4\x45\xb7\x58\xf8\x6c\xd1\x79\xb8\xde\x55\x95\xae\xdd\x21\xa7\x5d\xc3\x24\x43\x44\x24\x0d\x8e\xae\x76\xff\x4f\x5d\x6f\xd8\x61\xb0\x0f\x65\x5f\xe6\x8b\x7a\x93\x86\x8a\x5c\x2e\x8a\xcf\x75\xbb\x2d\xc6\x49\x60\x55\xff\xaa\x75\x62\x16\x5e\x56\xf3\xc7\xf6\xf9\x41\x8e\x90\xd4\xfc\xc1\x2c\x41\xd0\x56\x27\xb0\xc6\x2f\xd3\x26\xc2\x2d\xc8\x7b\x52\xf3\x55\x6f\x86\x50\x0c\x50\x21\x04\x2e\x1a\x35\xda\x6a\x43\x9b\xfe\x1d\x23\x0f\x43\xf6\xd9\x71\x5f\x51\x94\x2a\xb3\xe0\xe1\xab\x71\xf2\x77\xd7\x9f\x72\x9a\x61\xce\x31\x82\xa3\xeb\xc5\xc0\xf5\x50\xf1\x8a\xc1\xdd\x55\x2e\x46\x79\x2e\x68\x74\xf1\x87\x94\x4c\xb1\xaa\x6b\x0e\x12\x88\x21\xbf\xe5\x73\x63\x82\x35\xb9\x51\x31\xa7\x72\xcd\x65\x80\xdf\xbc\x37\xa8\x17\x03\x99\xbc\xfb\xf6\xcb\x69\x8d\x81\xc1\xdd\x25\xc4\xea\xff\xca\xa2\x8f\xe5\x51\x97\x9b\x35\x86\x31\x80\x3a\x45\xe4\x25\x3d\xf5\x0b\xae\xe4\xe2\x2d\x1d\x4a\x39\xbe\xfa\x04\xc3\x45\xfb\x74\x78\x68\x90\x62\x63\x5f\xbe\xa7\x76\x19\x98\xc2\xbd\xe0\xbe\x1e\x32\xc4\x60\x92\xbb\x1a\x26\x94\xe1\x99\xd1\x93\xd6\x0c\xc3\xf6\xe7\x76\xe7\xf2\xd3\xde\xbd\x1c\x9d\x1d\x5b\x28\x2f\xd1\x8f\xc2\xa1\x1f\x16\x1b\xdd\xf5\xc2\xed\xcf\x85\x9e\x59\x5e\x19\x90\x87\x23\xc8\x94\x26\x83\x7d\xc6\x18\x4e\xaf\x98\xf1\x13\x01\x09\x79\xe7\x8d\xc8\xad\xa3\xf7\x8e\x09\x72\x19\x02\xb0\x84\xc3\x62\xec\x91\x2e\x11\x8c\x5a\x9a\x49\x49\xaa\x4c\x6a\x3a\xdd\x99\xa5\x09\x29\xe5\xff\xaa\x73\xd8\x60\x84\x73\x46\xd5\xeb\x8d\xbe\xc7\xde\x2d\x42\xc4\xaa\xb9\x4a\xa7\x56\x61\xd6\xcf\x5a\xce\xa7\x2e\x2f\x3f\xac\xda\x08\x82\xd2\x95\x95\xc4\x70\xfa\x83\x0c\x9a\xd3\x75\xf3\x8a\xba\x29\xc3\x15\x53\xd5\x3e\xa7\x5a\x82\xb1\x80\x05\x1d\xd6\x3a\x61\xe2\x4b\xcd\x6b\xee\x46\x24\x69\x52\x43\x7d\x1e\x2d\x05\x6b\xec\x88\x01\x1c\x0c\x34\x4a\x18\x68\xc4\x08\xc5\x6a\x57\xca\x23\x1b\x20\x09\x07\x19\xc4\x72\xa0\x38\x42\x85\xd6\xd0\xaa\xae\xf6\x59\xef\x35\xc8\x52\x22\x4f\x1d\x24\x24\xb1\x9a\x71\xca\x94\x5f\x64\xe5\x84\x21\xb4\x71\xa5\xc8\x6f\x50\x94\xf8\xb3\x52\xa0\xc8\x4a\xc9\x2a\x9e\x36\xc4\xc8\xa2\x40\x19\x94\x0d\xc7\x56\xfb\x30\xc8\xb1\x6f\x69\x55\x26\x29\x53\xe9\xa5\x87\xbf\x40\xaf\x41\x9b\x2d\x55\x92\xc8\xb6\x0c\xa7\x53\x47\x59\x64\x24\xc8\x39\x0a\xb0\xa3\x6c\x80\xe7\x2c\xd6\xab\x18\x1d\xbc\xc4\x70\x3e\x83\x86\x53\xc8\x2f\x38\xe9\x79\x76\x86\x99\xd7\x29\x65\x31\x2b\x47\xd1\x93\x60\x9b\xde\x15\x33\xcf\x92\x7b\x35\x8c\x3c\x8f\x3e\x07\x74\x5a\xe5\x21\xde\xcc\xec\x73\x9a\x9e\x18\xe2\xbe\x80\xfc\x77\x99\xc2\x20\xa4\x3b\xd5\xcc\x1e\xb8\xd7\x17\x38\x63\xcc\xa6\x03\xdb\xd3\xe3\xeb\x83\x19\x60\x4d\x9b\x83\x31\x15\x8c\xab\xb4\xa7\x7f\xf9\x52\x2c\x83\xee\xe5\x6c\xf0\xe0\x2a\xc9\x03\xc5\xda\xd9\x85\x6c\x29\x29\x1d\xc0\xef\x57\x16\x28\x59\x09\x90\xd6\xcd\x79\x42\xf8\xd7\xe1\xfa\x8f\xfb\x87\xf8\x4f\xfd\x07\xe4\x0c\x19\x48\x1e\x3f\xbb\x96\x1a\x20\xa5\x7d\x88\xda\x37\x58\x3d\x63\x45\xa3\x2a\x92\x10\x7a\x8d\x81\xa2\x6d\xd0\x72\x50\xc8\xdc\x35\x24\xb8\x50\x6f\xfc\xa6\xd8\xe4\x0e\xfd\x52\xe0\x10\x5f\x74\x12\x95\xb4\x09\x9d\x46\xe5\x69\x9f\x3a\x5d\xab\xba\x1e\x43\xf9\x78\xc4\xce\xad\x4a\x8c\xc8\x29\x56\xdb\xf1\x20\x64\xb8\xc1\x41\xac\xf9\xc7\xf6\xa3\xe6\xbd\xfb\xcf\xf8\x52\x1c\x4d\xc9\xe0\xee\x3c\x12\x6e\x27\x6b\x56\x00\x06\xb3\x6f\xe8\x20\xe8\xf7\x94\x7e\x00\x43\x7d\x0a\x1c\x53\x11\x61\xfb\x03\x1d\xb1\x47\x6f\x33\x4f\x8f\x24\xd5\x40\x3a\x4a\x8a\x53\x93\x68\x35\x3a\x39\xc0\x51\x9f\xf3\x3e\xd3\x9b\x8f\x3b\x75\xbd\xe2\x33\xbd\xe8\xc4\x00\x4a\x96\x98\x58\xb7\xdc\x67\x52\x3b\x44\xcd\x2a\x5a\x76\x63\x69\xc2\xf4\x08\x46\xd6\x22\x12\xd5\xfe\x77\xb7\xbf\xa0\x61\xc5\xe4\x83\x61\x78\xe4\x5c\xda\x78\xbb\xa7\xc2\x4d\x36\xa6\xd3\x6a\x41\xc4\x2f\x9f\x75\x03\xed\x2a\x48\x57\x8b\x88\x6c\x69\x95\xfe\xcb\x99\x16\x6b\xb7\x78\xe5\x0b\x1b\xf4\x33\x49\xf6\xff\x14\x51\xd1\x3a\x18\xde\x8c\x80\x44\xb3\x7b\x19\xcc\x25\xcc\x4c\xbf\x05\xe4\x85\xf2\x0f\x25\x6b\x63\xbe\x1e\xfd\x51\x9c\xe4\x03\xef\x6f\xdd\x28\xc3\x24\x2a\x45\x8a\x33\x92\x1c\x1a\xe9\x56\x60\x3a\x30\x1c\x0d\xa7\x8c\x53\x86\x27\x37\x8d\xcf\xdc\x3c\xa3\x11\x3c\xc5\x71\xb2\xca\x79\x24\xbf\x6b\x13\x33\x0b\xd1\x05\x8d\xfb\xed\xfd\x0c\x6a\x56\xf0\xbd\x9e\xb4\xff\x00\x31\xeb\xff\x6e\xf1\xb2\x5a\xfe\xbf\xa0\x6d\x4d\x3a\xe3\x28\xe7\x90\x2a\x0a\x15\x98\xec\x4d\x48\xcd\x58\xf8\xe4\x37\x17\xc3\xaf\xe2\x36\x42\xa8\x47\xf3\xaf\x5c\xb2\x7e\x0c\xa9\x5c\x1b\xeb\xee\x56\xfc\xb9\xa3\x72\xf0\x9b\x51\x94\xd6\x63\x40\x73\x6d\x4d\x99\x5c\x8d\xf9\x06\x2d\x7f\xea\x26\x60\x9d\x6a\x4d\x06\xb6\x7c\xeb\x14\x5d\xfc\xbe\x85\xd2\x8b\x5b\xe4\xd2\xb8\xc4\xc7\x2b\x95\xb0\x74\x76\x40\x73\xae\xa1\xd6\x8a\x49\x16\x62\x6c\x2d\x3f\x8b\x00\x6f\x59\xd6\xdc\x7a\x73\x09\x01\xf2\xc0\xd2\xad\x2b\x4a\x4f\x12\xd8\xa8\xdd\x09\xcb\x15\x29\x37\x45\x26\xa4\x95\x73\xa6\xf5\xca\x7e\x71\xc5\x2e\xb6\xd8\x3e\x29\xdc\xd8\xd2\x56\x78\xff\x53\x24\xf0\xb7\xa4\x08\x4a\x4b\x7f\x3a\x5e\x39\x35\x6e\x31\xb8\x69\x4a\xd5\xe0\x10\x3e\x2e\x61\xec\x02\x41\x46\xe6\x44\xfd\xdf\x1d\x9e\xd6\x44\x4f\x47\x7c\xd5\x60\xd6\xe2\x1b\x1d\x94\xf2\x38\xee\x06\xc3\x7a\x86\xae\x0e\x74\xfa\x1f\x8c\x22\x19\x0e\x96\xd6\xad\xfc\xb9\xe3\xe6\xec\xb7\x7b\xbc\x90\x51\x86\xcc\x31\xfa\xbe\xb4\x30\xaa\x38\x1a\xf3\xe3\xe1\xce\xe5\x7b\x35\x26\x00\x1e\x60\xc0\x2d\x04\x7a\x1e\x07\xb4\xb4\x88\xbc\xcb\x2e\x20\xf3\x92\xda\xe4\xfe\x72\x70\xbe\xcc\x00\xa6\xaa\x1d\x6d\x69\x15\x23\x6d\xad\x6f\x6e\xbd\xea\xae\x92\x79\x76\x06\x62\xa9\x23\xaa\x9f\xe6\x9c\x34\xd2\xd5\x26\x1b\x4c\xfa\x45\x55\xb7\x6f\x82\x27\x0c\x4f\xb6\xd6\xe0\x79\xad\xca\x27\x3c\xec\xc5\x67\x8f\xf7\x28\xa1\x20\xe1\x88\xa5\x8c\x58\x22\x85\xfe\x70\x3d\x3e\x07\xe8\x71\x71\xe2\x9a\x5c\xb4\xba\x05\x5f\x6d\xe4\x54\xfa\x51\x40\xbd\xf1\xcb\x98\xd9\xfb\x75\x46\xd9\x37\x1a\x3b\x5b\x62\xe2\x0e\x1a\xf5\x60\x6e\xc1\x3c\xfc\xd2\xca\x9f\x67\x4b\x8e\x74\x23\x43\x63\x89\x88\x1d\x98\xeb\x4c\x04\x39\xb2\x24\x18\x8f\xac\x5c\x45\x78\xc8\x5c\xe1\x26\x13\xee\x3a\xb9\xfc\xaf\xca\x4c\x46\xde\x35\x09\x5d\x6b\x92\xd0\x52\xeb\x31\xb3\x23\x47\x78\xea\x48\xaa\x2b\x0d\x90\xf4\xf5\xce\xab\x68\x64\x9c\x1b\x3a\xac\x4a\xe0\x7f\xae\x59\x86\x31\x2d\x24\xdc\x0e\xe8\x94\xf0\xf0\x76\x74\xef\xfe\x1d\x89\x63\xc5\x03\x39\x40\x83\x7a\xa5\xd6\xb3\xac\x8c\x1c\x00\xb1\xd8\xd4\xa8\x1d\x98\x8b\x8f\x3b\x96\x1e\x0f\x89\x77\x1e\xc9\xbd\x3d\xb8\xf1\x14\xd7\xe8\xce\x60\x4e\xd4\x7a\x69\x8a\x96\x86\x7b\x00\x67\xdc\xcd\xd0\x63\xb5\xca\xd6\x3f\x6a\x1b\xe7\x2b\xbf\xc9\xc9\x64\x7c\xd0\xb5\x49\x13\x15\x1f\x80\xdf\xe3\xaa\x2e\x41\x0d\xcb\xcb\x2a\xa7\x24\xe4\xb1\xfa\x17\x54\x97\x7b\xe3\xab\x54\x17\x0e\xec\x2a\x87\xae\x14\x6b\x5f\x93\xde\x3d\x8d\x61\xac\x7d\x65\xe7\x0a\x26\x33\xe4\x9c\x49\x8a\xbe\x52\xea\x62\xff\xcc\x3e\xf6\xdc\x3f\x3f\x17\x98\xdb\x53\xa7\x48\x30\xbb\xa1\x82\xc6\x3b\xb8\x83\xbb\xe0\x95\xe4\x4e\x0f\x1c\x78\xd3\x90\xa0\x66\xb7\x62\x09\x12\xca\x5e\xaf\x3c\xd4\x70\xa3\x79\xf1\x0b\xdc\x35\x0a\xda\x31\xa6\xde\x65\x5a\xa3\xf1\xef\x4e\xa2\x2d\xc2\x1f\x7e\x45\x45\x33\x50\x7b\xb9\xfc\xde\xed\x2e\x13\xff\x21\x9a\x8b\x52\x3c\xf7\x12\xbb\x23\x1f\xc3\x9e\xd4\xc6\x3b\x6f\x8b\x31\x4e\x44\xab\x16\xdb\x8c\x8b\x8e\x30\x42\x90\x9b\xac\xb5\x7c\x3f\x75\x2d\x99\xcc\x35\x7c\x19\xfc\x4f\x59\xd8\x09\xdf\x11\x3f\xf3\x52\x4a\xeb\x7b\xe6\x7c\xe2\x9e\xbe\x89\x31\xb0\x1d\x34\xf2\x2a\x40\x55\x03\xbb\xe5\xce\xd1\x27\x49\x8e\xd2\x49\xbb\xd5\x3b\x07\xff\xb9\xa4\xaa\xd2\x2f\x38\x41\xf9\xd4\x89\x30\x1f\x24\x9d\xd3\x17\x7a\xbb\xa5\x1e\x6f\x4f\x9b\x07\xc2\x63\x17\x45\xd5\xe1\x7f\x64\xce\x91\x5b\x74\x43\x9b\x41\x39\x2e\xdb\x6d\xa3\xc5\x50\x68\xdb\xee\xac\x24\x61\xeb\xfe\x90\x96\x73\x87\x44\xec\xd6\x6a\xef\x62\x80\x58\x47\xda\x9a\x93\x23\xfd\xfe\x6d\x35\xf8\x63\xb5\x49\x80\x1d\x68\x97\xb9\x4f\x70\x21\xb7\x8a\xf8\x08\x6f\xb4\x61\x71\xbf\xea\x7e\x45\x29\x3e\x9b\xa3\x49\xfc\x39\xcc\xe2\x0b\x16\xfd\x97\x3f\x09\xea\x77\xf4\x0e\xa9\x72\x3f\xf1\xfa\x99\x20\x91\x5e\xba\xd5\x85\x04\xac\xda\x15\x95\xe1\xbe\x33\x88\x91\xf7\x4c\xaf\x38\xb8\x8e\x14\x9c\xac\xf2\x01\xbb\xd3\xd1\xf5\x95\xe1\x4a\x39\xe5\xd0\xd3\xb8\xa8\x21\x31\xd2\x1f\x32\xcb\xee\x65\x53\x56\xd1\x11\x83\xc4\x54\x22\xee\xbd\xe1\x6d\x94\xe1\x50\x11\xc9\x6f\xf6\xde\xbb\x95\x89\xe3\x49\x6b\xb2\xff\xb5\x38\xca\xae\x36\x29\xb8\xe8\xd1\x41\xb6\xdf\x27\x53\x7d\x41\x1a\x40\x1b\x66\xcd\xff\x35\xef\x69\x0b\x37\x56\xd6\xc8\x16\x62\x35\x9b\x38\x94\x59\xe3\x77\x03\x36\x40\xf3\x56\xd6\xda\xa6\x1e\xd7\xde\xf2\x42\x67\x21\xab\x89\xbf\xda\x31\x18\x7b\x57\x09\xb7\x9e\xff\x83\x42\x39\x89\x76\x90\x2a\x15\xcd\x0e\x36\x4e\x7c\x60\x48\x50\x10\x27\x0f\x6c\x12\xe5\x32\xb8\x61\xcf\x37\xd0\x30\x88\x85\x67\x1d\x82\x60\xd9\xc1\xc9\x9a\x07\x78\xde\x8d\xcc\x3a\x34\x05\x4d\xff\x9e\xea\x5b\x96\x3a\x4e\xf3\x2a\x41\xc4\xbb\x39\xf7\x05\x72\x9f\x0c\xe5\x9d\xdb\xb7\x04\x17\xd0\x3a\x18\x4b\x40\x3b\x85\xc8\x8c\x20\xf8\x51\xf6\xd3\x1d\x7c\x94\x05\xb2\xa5\xef\xf7\x1e\x45\x68\xfb\x7e\x6b\x87\xf7\xff\xc7\x9f\x83\xf7\x07\xd5\x62\xb7\xf4\x91\xee\xc9\x96\xfe\x37\x92\xb4\xf6\x62\xd2\xef\x96\xee\xaf\x68\x6c\x37\x02\xf4\x24\x9e\x5d\xf7\x8f\x10\xb0\xc1\x4e\x5c\x1f\x92\x41\x91\xf6\xae\xf3\x0e\xa2\xb1\x2f\x88\x7c\x27\x9b\xf1\xcd\x75\xba\x08\x66\x0f\x16\xd3\x57\x44\xcc\xcc\x14\x0a\x8d\x40\xec\x09\x10\x89\x4b\x38\x93\x76\x9b\xdc\xfd\x4e\xa4\x3f\x51\x70\x53\x7b\xd6\xee\x16\xc4\x46\x02\x8c\x40\x06\xfc\x21\x55\xac\xad\xac\x7f\x95\x48\x64\x4d\xfb\xfb\xb7\x77\x70\x76\x93\xd3\x68\x79\x16\xfa\x36\x80\x2e\xd8\x0d\x87\x3c\xb3\x77\x2f\x22\x0a\x06\x37\xd2\x5e\xc1\xec\x12\x83\x1b\x32\x29\x74\xf4\x25\x75\xb6\xa0\xee\x51\x39\x83\xfe\xc8\x5c\x13\x2b\xd7\xb9\x54\x19\x0b\xe9\x37\x4e\x7a\x23\x51\x7b\xf2\xa4\xe3\x12\x5e\x4c\xa3\x54\x76\xc1\x07\x6c\xe1\x00\xf3\xa1\x01\xe9\x0a\x65\xe2\xec\x20\xc4\x61\xdd\x31\x88\xe5\x73\xde\xc2\x85\x8a\x19\x3a\xde\x13\xb7\x6e\xce\x79\x28\x58\x2a\x86\x9d\x23\x6b\xe5\x09\x58\x55\xa0\x74\xe1\x2f\xed\xbf\x67\x11\xf7\xe6\x98\xed\xb1\xae\xa1\x4f\xe6\xad\xb0\x7e\x63\x3f\xc8\x60\x30\xef\x64\x24\x54\x42\xd3\x1e\xac\x3b\xb9\xa7\xac\x85\x1e\xa3\x78\xb5\xc9\xa9\xeb\x89\x04\x10\xf4\xe1\xaa\xac\x79\x17\xa2\x70\xc8\x81\x55\x10\x27\x9a\xd7\xfc\x1d\xc5\x64\xcc\x2f\x3b\x10\x25\x22\xf0\x4d\x78\x07\x1a\x73\x80\xf9\x26\x0a\x65\xd7\x35\xcb\x16\x6a\xcd\xdb\x21\x53\x20\x0f\xee\x40\x65\x91\x9b\x5a\x4d\xaa\x7f\x94\xfd\x1d\x66\x48\x20\x4a\xf3\x2e\xd3\xdd\x77\x95\xf6\xcb\x9a\xde\x68\x8b\xc9\x64\xd3\x5d\x4f\x9e\x67\xe2\x34\xbb\x24\x9a\xdd\xd9\xc9\x72\xe7\xfc\x16\x3b\xad\x61\x20\x99\x09\x19\xf5\x5c\x93\x68\x77\x7b\xbd\xbb\xf3\x0f\x83\x13\x78\xbd\x54\x49\x3b\xa1\x8e\x9b\x87\x70\xe2\x9a\x82\x39\xa7\xc1\x90\x73\xe3\xe4\xca\x94\x1e\x1a\x3e\x58\x6b\x73\xe7\x53\x2b\x47\x5d\xfe\x10\xa6\x41\x43\x55\xc9\x61\xf5\xf2\x4e\x27\x7a\x22\xa2\xa7\x51\x28\x97\x04\xb0\x9b\xbe\x37\x77\xa4\x24\x2c\x36\x6e\xd2\xbf\x1a\xe9\xa0\xec\x85\x2e\xad\x2a\x45\xc1\x50\x16\x31\xad\x91\xda\x60\xe5\x33\x18\x64\x8d\xb2\x7c\xce\xa6\x8b\xe3\xe4\x50\x5c\x36\xf8\xe0\x0e\xe9\xa4\x94\xe6\xc2\x19\xa9\x85\xce\xb5\x4b\xbd\x3f\x9c\x8d\x59\x34\x75\xb0\x54\xb9\x05\x21\x5a\x4e\x02\x9d\xa6\x1c\x00\x06\x4a\x4b\x2f\x9e\xeb\x1f\x3e\x44\xd6\x5f\xe5\x86\x87\x82\xaa\x4b\xdd\x79\x8c\xed\xa7\xf3\xb1\x04\x9b\x7e\xa9\x3d\x99\x66\xa9\xf9\x08\xfa\x5b\xcd\x94\xad\x05\x5f\x8f\xae\x47\xca\x22\x5b\x76\x9f\xb3\xe3\xaa\x94\x29\x6a\xb3\xac\xa4\x47\x80\xb7\x07\x09\x56\xde\x95\xb5\x6c\x71\x05\xa2\x4c\x5a\x53\xad\x0e\xe6\xb2\xa6\x03\x1a\x40\xff\x39\x3b\x2f\x7c\x86\xec\xd3\xe5\x1a\xce\x5f\x38\xeb\x8e\xbc\xb6\xa2\x10\x0c\x0c\x86\x58\xe8\xcc\x25\x38\x72\x98\x1a\xf6\x46\x00\x0d\x1b\x77\x12\x8b\xc3\x59\x76\x3c\x30\x24\xe9\xe9\x1d\x64\x8d\xf2\xcf\x52\x08\x46\x08\xfc\xdd\xc0\xe2\xb8\x00\x4f\x02\x7d\xd3\x6d\x17\x89\x2e\x6f\xba\x68\xbc\x0b\xdc\x6a\xdd\xe7\xfa\xd0\xca\x1f\x4b\x69\x89\xe4\x09\x00\xb2\xc6\x96\xc8\x67\x05\x9f\x0f\xb3\x00\x93\xe3\xbc\xf3\x38\xf2\x54\x36\xf0\xf3\x32\xca\xda\x13\xe2\x78\x7a\xad\x38\x2f\xbf\xd8\x28\x5c\x9d\xee\x25\x8c\xd7\x01\xc8\x2f\x74\x3a\xa0\x58\x96\x4c\x81\xb5\x0a\xfd\x2d\x66\xdc\x92\x0e\xd0\x8d\xe3\xbd\x01\x21\x4e\x44\xc0\x4e\x9a\x00\x29\x70\x12\xcd\x6f\x09\xba\x9f\x5f\x90\xb5\x0c\xa3\x78\x86\xe3\xd7\xdb\x28\xf9\x22\x35\x06\xb0\xfe\x94\xc5\x40\xa1\x34\xaf\xfa\xff\x40\x3a\x61\x28\x03\xee\x48\x8c\xb3\xfd\x95\x9d\x3d\xdf\x3f\x68\x54\xb8\xc9\x52\x50\x02\x7d\xd2\x37\x4c\x8e\x1a\xc9\xd8\x7f\x79\x6f\xfd\xff\x3b\x05\xa6\xff\xa8\x90\xfa\x97\x3e\xcd\x3f\x7b\x03\xa4\x00\x4a\x95\xf8\x2f\x59\xb3\x7d\x39\x60\xec\x08\xfe\x48\x99\x2b\x30\x2d\xe3\x8d\xeb\x9f\x8f\xcd\xf8\x5f\x4d\xf2\x94\xef\xbd\x39\x31\xd0\x3b\xd0\x00\xfb\xf7\xa6\x74\x4e\xb0\x49\x0b\x15\xf4\x40\x7d\x94\xa0\x6c\xf1\x19\xf2\x2c\x94\x64\xbf\x3c\xdf\x4a\x35\x46\x54\x3a\x31\x4c\x30\xf7\xb4\x41\xa0\xe1\xa6\x73\xce\x7d\x84\x4b\x11\xa6\xc4\xfc\xcd\x9a\xef\xf5\xec\x1f\xa9\xf3\xfd\x64\xec\x83\xc0\xa3\x48\x56\x06\xf9\x38\x66\xaa\x4b\xcc\x2d\x7b\x5c\x6e\xae\xc1\xa8\x9e\xeb\x9b\x86\x48\xd6\xb3\xa9\x6b\xf0\xf8\xee\x73\x0a\x13\x25\x6f\x94\xe7\x2a\x57\x5a\xfb\x76\x64\xa4\xc4\x9f\x08\x63\xba\x6e\x43\x84\x49\x9d\x88\x41\x38\x45\x90\xc9\xc8\xa4\x08\x0e\x32\x12\xb5\x1e\x76\xb8\x34\xcf\xf5\x69\x35\x1f\x0f\xf3\xec\xd7\x43\xf2\x59\x9d\x9e\x4b\x77\x55\xea\xc9\x8f\xf3\x9f\x4c\x3a\x67\x18\xf3\xf1\x20\x6e\xa5\xdc\x3d\x94\x20\x4e\x16\x5c\x41\x5e\x61\x59\x83\x85\xb8\x0e\xe4\x05\x0e\x91\x93\x32\xe7\x8f\x47\xd2\xe7\xc8\xe5\x35\x10\x64\xbc\xeb\xf6\xa2\x33\x17\x61\xca\xe9\x6c\x4a\xcc\xc9\x4e\x72\x3b\x52\xa5\x0b\x90\xc4\x57\xf4\x6b\xa1\x7e\x35\xf1\xa8\xd5\x72\x75\x98\x73\x18\x32\x5d\x61\xa4\x67\xb8\xc4\x4a\x1f\x66\xce\x98\x1c\x22\xe7\x70\xdd\x82\xc5\x69\x57\xd8\xfd\x9e\x70\x01\x6d\x09\xa2\xa1\x32\x44\x66\x06\x6f\x66\x7b\x63\x99\x54\x03\xf5\xbc\xf4\xcf\x59\xc2\x63\x65\x4e\x1f\xb6\x54\x06\x94\x1e\x39\xff\x74\x80\x90\xd9\xb3\x26\x3d\x7f\xab\x1d\x74\xab\x12\xd4\xf1\xb4\xad\x8d\x71\xc8\xcf\x6b\x74\xa5\x4a\x3a\x43\x8a\x0e\x0c\xb8\x85\x2c\x31\xdc\x21\x53\x71\x57\x30\x16\x33\x10\xf1\x9b\xd2\xd6\xc8\x1f\xdc\x82\xa9\xb8\xe5\x60\x3b\xba\xcf\x8a\x23\xab\xd6\xc9\x67\x7c\x8a\x0d\xf8\xd4\x26\x0c\x39\x5a\x29\xa3\x29\x0c\xfa\xe2\x72\x13\x63\xda\x10\xf5\xda\xbd\x2c\x2d\x28\x84\x12\xb1\x7e\xde\xcf\x67\xe6\x5c\xa9\x8d\x9f\xa0\x2e\x48\xbb\x25\x60\xab\x81\xab\x30\x7d\xe8\x9f\xf7\xc4\xa8\xc8\xf3\xee\x46\xd0\xcf\x3b\x4c\x8f\xda\x4d\x52\x9f\x63\xf1\xc8\x5a\xe9\xe4\xbd\x2c\xcf\xa7\xcc\x2c\x99\xa7\xe7\xd3\x8a\xb7\xa5\x2f\xe0\xd9\x72\x90\x05\x39\xb2\x71\x6e\xa0\x58\x88\xcd\x95\x46\x88\xc0\x35\xda\x04\x75\x78\xcc\x03\x13\xcc\x41\x21\xec\x8e\x92\xc0\x22\xa8\xc1\xf2\xfb\x43\x5e\xe0\x1d\x22\x06\x18\x57\x60\x0a\x88\x66\x54\xb5\xc5\x5d\x83\xc8\xa5\xc0\xb4\xec\x9a\xe2\x7b\xba\xd4\x33\x57\xc3\x89\x8a\x26\x4a\xee\x9a\x21\xee\x62\x45\xc4\x84\x4c\x42\x6f\x90\x9f\x35\x1e\x08\x48\x84\x97\x1d\x75\x16\x3e\x15\x61\x00\xe6\xe5\xc9\x48\xe3\x59\xe5\x82\x95\x7f\x2e\x56\xbc\xb8\x1c\xd7\x36\x65\xfe\x0a\x6e\x2f\xf1\x8f\xe7\xca\x00\x97\x95\xbf\x1f\xdf\x27\x88\x9f\xab\x7c\xb7\xec\xb9\x4e\x2c\xd5\x87\x78\x16\xdd\xbd\xd2\x2b\xac\x67\x97\x92\x7e\x96\x20\x2c\xe6\xb3\xfb\x3c\x63\xe6\x80\x57\xa2\x7b\x58\x06\x51\x85\x9e\x05\xfa\x8d\x94\x54\x72\x36\x63\xb2\xee\x16\x04\x79\xb9\x4c\xb9\xe2\x67\x37\x06\x06\x4a\x9a\x3a\x7f\x66\xc5\x8e\xec\x84\x90\x49\x22\xf2\x20\x9b\x95\xb2\xcd\x33\x94\x98\x5f\xfd\x8c\x3a\xf4\x89\x29\xc4\xec\x99\xb9\xc8\x03\x4d\x17\x0d\xba\x62\xc2\xe3\x19\x96\xf2\x4f\x70\xad\xbc\x84\x95\x20\x0f\x21\x36\xd3\x13\xb1\xdb\xff\xc8\x69\xdc\x45\x6a\x3c\xc9\x4d\xbc\xde\x9c\xb8\x7f\xa6\xab\x5b\x6d\x49\xb7\x05\xe2\x95\xe2\x34\xb6\x46\x59\xb9\x27\x2c\xd9\x58\x96\xa0\x3d\x2a\xa4\xf5\x84\x6a\x03\x5f\x32\xfb\xb0\x99\x3d\xe5\xc8\x4b\x90\xc9\x49\xd6\x4c\x13\x87\x0e\x06\x2a\xd3\x6a\x1e\xb7\x52\x30\x1e\x91\xc5\x85\x29\x0b\xd6\xd2\x8f\x7b\xb9\x49\x4b\xfc\xb8\x4b\x18\x26\x91\xc3\x02\xcb\xbd\xb9\x4a\x47\x01\xc2\x3f\xaa\x61\x74\x27\x7d\x13\x5b\x90\x25\x16\xd2\xd7\x68\xbb\xd5\x92\xa7\x71\x3f\x7a\x1e\xd8\x83\xef\xee\xa3\x8a\xca\xd8\x94\x54\x0d\xa6\xa3\x7f\x08\x0f\xa7\xae\xd0\x91\xab\xca\x52\xca\xc0\xb3\x93\x1f\x45\xc9\xac\xa1\x7c\xf3\xa8\x24\xae\xf9\xf5\xac\xf2\xfc\x7b\x90\x57\xc2\x53\xda\xe3\x0c\x50\x68\xc8\x75\xf1\x15\x70\x7c\x86\x71\x3f\x2c\xbd\xc4\x72\xdc\x95\xda\xf7\x88\x2c\x4b\xe2\x7e\x4a\x3e\xe0\x87\xdb\x2e\x28\x8b\xc6\xc9\x8c\xe1\xd8\x45\x9f\xa7\x07\xfa\xbb\xe7\xe9\xb7\x3f\xaf\xf2\x2f\x33\x40\xfe\xa2\x8d\x19\x75\x60\xf0\x40\x58\xf2\x51\xe1\x4d\xe0\xed\x4b\x1c\xb9\x3c\x5c\x32\x33\x85\x91\x17\x7f\x61\x8f\x23\x88\xd9\xc8\x5d\x0b\x18\x7d\x8a\x96\x3d\x42\xa2\xde\xc0\x93\x49\x19\x8f\x34\x8a\x06\x23\xd1\x8f\xfc\x1e\x48\x42\xc8\x2f\xb9\x7b\xbd\x34\x9b\x9e\x31\x7d\x2c\x6e\xe4\x3b\x18\x91\xa2\x3a\x52\x91\x2c\xbb\xe0\x6f\x78\x82\xdd\x57\x11\xea\x04\x45\x98\xaf\x2a\x2e\x04\x9f\x8a\xae\x4d\xd9\x7b\xc0\x99\xc9\xac\x3e\xd2\x9e\x83\x21\x39\x50\xa1\x3f\x6b\x06\x3f\xff\xf4\x09\x5c\xf5\x57\xdf\x92\x14\x80\x49\x54\x04\xe1\x57\x9e\x64\xe0\x82\xd2\x2a\xec\xb7\x1b\x26\x5d\x91\x2a\xff\xe5\xc2\x48\xd1\xf1\xa0\xb3\x83\xf6\x26\x60\x7d\x24\x19\x10\xe7\x99\x99\x52\x19\x2f\x97\x7c\xca\x9e\xe1\x2f\x66\xdf\x50\x18\x8e\x85\x20\x6d\x8e\x09\x82\xcc\xe1\x51\xfe\x71\xa3\x9d\x59\x29\xda\xdb\xbb\xc4\x93\x98\xde\x6c\x6e\x27\xd2\xd0\x4e\xc1\x24\xa1\xe9\xe9\xd6\x10\x68\x92\xb1\xca\x74\x33\x3a\x39\x59\x5b\xba\xf0\x67\x4f\xe8\x97\xd2\x72\xcc\x7e\x95\xb8\xe5\xd6\xdf\xa7\x81\x3c\x40\xf4\x16\x0d\x8b\xf4\x67\x2f\xd4\xb3\x92\x45\xf9\x26\x6b\x4f\xce\x4f\x53\xfd\x91\xf3\xea\x3d\x91\x7a\x89\x04\x7c\x17\xc4\x81\x85\x19\x8b\x33\xee\x10\xb8\x9a\xac\xb9\xa7\xda\x19\x97\x7e\xfd\x8e\x10\x4d\x5e\x02\x3d\xbd\x35\x9b\xa2\x67\x3c\xc9\x99\xab\x0e\x54\xbf\x9f\x8a\xc4\x3b\xa6\x88\x7f\x4d\x45\x29\x78\x53\x81\xf2\x27\x57\xc5\xbc\xe1\x64\xf5\x1c\x7f\x77\x59\xc5\xef\x5c\x11\x95\xd0\x6f\x2d\x41\xf5\x5c\x74\xf0\xe7\x33\x40\x06\xd1\x88\xb4\xc6\xd2\x3d\xd5\xf4\xd9\x41\x0f\x8a\x7d\x86\xa9\x88\xf8\xb0\x65\x2e\x26\xb1\xb2\x60\xb6\x46\xea\xa8\x7d\x2d\x22\x51\x5a\x7b\xa3\xa8\x97\xfd\xb6\x3e\x7f\x80\x89\x74\x9f\xc6\x10\x1d\xb2\x91\xa0\x79\x24\x37\xf5\x07\x10\x0b\x14\x2e\xd3\xba\x29\x39\x42\x65\x40\x34\x79\x84\x95\x85\xec\x95\xad\x46\xa5\x0b\xc0\x7f\xe2\x74\x66\x81\xb3\x95\xaa\x0d\xd0\xeb\xe1\x6e\x1e\x28\x12\x52\x18\x6b\xca\x7f\x56\x49\xfa\x1d\xca\x9d\xf9\x9a\x9f\xc5\xcd\x21\x85\x27\x21\x18\x2f\x8a\xd3\xf9\x90\x5b\xdb\x08\x83\x34\xf2\x50\x9d\xab\xa2\x59\x11\x30\x3d\xb3\x12\x04\x27\x5a\xdd\x4e\xe9\xfe\xfa\x84\x86\xf3\x3d\x7f\x43\x16\x79\xab\x4f\x89\x6e\x73\x36\x54\xe6\x74\xc3\x64\x37\xf7\xae\x7c\xec\x21\xcb\x36\xb9\xe7\x34\xef\x06\x3c\x47\x78\xdc\x95\xcf\x83\xb2\x16\x53\x1a\xe5\x99\x46\x97\xba\xf1\x26\xe1\x11\x53\x78\x74\xad\xe2\xcc\x50\xd0\x28\xef\xd1\x19\x0d\xce\x5c\xbb\x07\x9f\xe3\x86\x18\xdc\xc6\x72\x22\x85\xb3\xbe\xbb\x8b\x1a\xb3\xe6\x47\xd7\x02\x26\x71\x10\x73\xb9\x31\x30\x1b\x9b\xe4\xff\x47\x06\x22\x46\xf5\x57\x41\x09\xbd\xc2\xce\x0a\xf7\x45\x4d\xb2\x61\xcd\x08\x8c\xd6\x4c\x66\x71\xef\x5a\xb8\x98\x41\xac\x96\x36\x25\x63\x45\x54\xa2\x33\x3d\xaf\x8b\x9c\x54\xa8\xfa\x91\x15\x2a\xe9\x38\xb8\xb1\x05\x3a\xe4\xe2\x55\x8f\x24\xaa\x27\xdf\x4e\x2b\x27\xd1\x3b\x2f\x8a\x5f\xc1\x91\x4d\xac\xd1\xdf\x4c\x27\x30\x7b\x02\x86\x7a\x5d\x05\x4e\x68\x13\x13\xf4\xd2\x76\xd0\x33\x13\x63\xb2\xae\xa1\x37\x62\xf0\xa1\xab\x05\x67\xa7\xf1\x56\xba\x14\x15\x79\xab\xf1\xc3\xd7\x5f\x87\x19\x73\x16\x27\x4b\x0d\x85\xc7\xb5\x7c\x5d\x61\x0c\xba\x84\xec\xe0\x8f\xab\xeb\x0d\x76\x58\x3b\xbe\xcf\x20\x8d\x26\xf2\xf1\xe0\xeb\x26\x3b\x3d\x28\x4d\x86\x59\x5b\x01\xab\x33\xc6\x19\xf6\xfc\x49\xf3\x1e\x3b\xb5\x65\x2c\x1b\x88\xb4\x7e\x43\x4a\x0a\xa3\x02\x91\x48\x49\x3c\xe2\x42\x30\x5b\x67\x0c\xe9\x48\x34\x2d\x5f\x86\x81\x91\x54\xb6\x97\x91\xdb\x96\x4e\x77\xb2\x9f\xff\x92\xd3\x04\x60\xa7\x99\xca\xfe\x0f\xe3\x57\x92\x50\x23\x3b\x70\x74\xb7\x5d\x82\x8d\xc5\x5a\x9e\xf5\x0f\x30\xaf\x39\xb8\x39\x63\xfa\xc8\x35\x2d\xc8\xa3\xaf\x14\x49\x0d\x23\xbe\x34\xf9\xda\xa5\x6b\x13\x6f\x38\x79\xce\x32\xf7\x95\xea\xe6\x98\xda\xdd\xd9\xa5\x37\x74\x0b\x09\xe1\x34\x21\xf4\x23\x9c\xb6\x7b\x10\x5d\xb5\x31\xad\xc9\x50\xa5\xaf\xcb\xe8\x59\x0d\xfa\x02\x12\x74\xbf\xb5\xe5\x8f\xbb\x3a\x24\xd1\x5e\x8f\x10\x5e\x1a\xa9\x4f\xf2\x9f\x98\xa9\x41\x26\xdd\x82\x54\xed\x39\x6a\x55\x3f\x68\x2b\x3a\xd0\x96\xff\x04\x92\x72\x63\xc6\x54\x4e\xd9\xd2\xd9\x23\x3e\x0e\xfe\x7b\x18\xa0\x59\x66\x9f\xe0\xc2\xc5\xe4\x11\x08\xe7\xad\x92\x1e\x26\x57\x9e\xe1\xfe\x9f\xa2\xca\xc3\x1d\x72\x45\xfe\x02\x04\x0b\x18\x6f\xde\x99\xb5\x7a\xef\x02\x13\xe0\xa3\xfe\xbb\xf0\x24\xcb\xb4\x5c\x8d\x1e\xe0\xc3\x9d\x49\x6d\x83\x28\x48\x27\xa3\x26\x71\x51\x17\xfd\x72\x50\x51\x87\x12\x3c\xcb\x7b\x14\x67\xf4\x3e\x3b\x3b\x75\x3f\xaf\x4e\x46\x2d\x9a\x06\x76\x87\xca\x7a\x93\x3b\x5a\xeb\x26\x16\xa9\x12\xd1\x00\x26\x1e\xa7\x8e\xdd\x48\x2e\xaa\x7a\xa0\xa0\x2d\xe2\xbd\x0c\x9a\x6a\xfe\xb2\x33\x6b\xe8\x0c\xcf\xb8\x1f\x27\xd0\x30\xc5\xe6\x86\x16\x33\xab\x30\x90\xd3\x61\x32\xb7\x8f\x38\x08\x4c\xe4\xee\xe0\xbc\x42\x40\x9e\x04\x72\x60\x5d\x60\x8a\x90\xb3\xc1\x60\x29\x3a\x31\x41\x80\xd3\x14\xe2\xc6\x0e\xe2\x7d\xca\xde\x7e\xa8\xff\x0b\x8a\xeb\x9b\x41\xe1\xa1\x86\x21\x1a\xc8\xdd\x62\x44\xd6\x2e\xf0\x45\xfb\x39\x12\x61\x2f\x49\x27\x0c\xd2\x41\xb6\x92\xd9\x58\x00\xa1\xff\x09\xe9\x17\xde\x2b\xa8\x4f\x88\x6a\x6b\xd5\xd9\x47\x20\xac\xee\xd0\x35\xe1\xf3\xa8\x0a\x75\x0e\x35\xec\xf8\xea\x1a\x6e\x76\x85\x3d\x7f\x03\x6b\x5c\xe5\xbc\xeb\xe4\x73\xf8\xd9\x75\xbe\x72\xb0\xe3\x01\x82\x30\x49\xcf\x98\x61\xfd\x90\x3e\x5c\x5e\x52\x50\x03\xa1\x8e\x25\xc7\xba\x70\x8a\xbe\x44\xcb\x55\x70\x1f\x14\x58\x8d\x46\x86\x22\x1d\x78\x03\xb3\xec\x3d\xc1\x7d\x4d\xc1\xc6\xfd\x35\x52\xe4\xb8\x0a\x90\x9c\xc6\x0b\xce\x8a\x7d\x1b\x08\x2f\x38\x4d\xd0\x83\xd6\x5e\xc9\x7b\x6d\xfb\x15\x5b\x85\x81\x1b\xec\x85\xd4\xa0\x0e\x68\x8a\xdf\x04\x4f\x5a\xbf\x58\x3f\xe2\x23\xbe\xeb\x27\x9c\xed\x38\x4b\x35\x60\x16\x4e\xc7\xda\xe9\xf4\x97\xe5\xd2\x01\xfa\x6b\x8a\x04\x3a\x58\x83\x51\x90\xc2\x4d\xc2\xc8\x1c\xed\xa9\xd1\xc3\xef\x0b\xcc\x4f\x99\xaa\x19\xe2\xa9\x1f\xec\xd1\x0e\xb4\x00\x02\x83\x53\xb7\x60\x9a\xe2\x5a\x7e\x5f\x2b\xcc\x35\x4e\xf1\xbd\x81\x83\x9d\xab\xa1\xff\x90\x3e\x2b\x99\xb3\xb4\x02\x1e\xe4\xb2\x63\x65\x50\xb6\x53\xf4\xe7\x07\x6a\x04\xcb\x84\x0e\xb7\xb9\x3b\xea\x59\xe3\x1d\x37\x2b\xb1\x66\x1b\x10\x38\xd4\x85\x59\x45\x1d\x46\x79\x56\x4d\xaf\xb4\xab\x0b\xa2\x75\x6a\x32\xab\x83\x8e\x15\x59\xb0\xa8\xa3\xf8\x13\x13\x85\x74\x87\xb4\x9e\xac\xb5\x9c\x6c\xab\xb7\x03\x7e\xde\xa2\xf4\xae\x52\x35\xb0\x1a\x54\x84\xac\xc1\xdd\x3e\x89\x46\xd6\x3b\x70\x83\x61\x39\xfa\xc1\x92\x52\x96\x90\x78\x12\xb6\x6f\x9c\x56\x01\xc9\x5b\x8e\x77\x77\x37\xb9\x43\x2e\x84\xd3\x42\xaf\x51\x39\x16\x98\x62\x41\x61\x75\x76\x63\x52\x00\x1e\xe9\xca\xfe\x27\x6c\x7a\x78\x30\x1b\x13\x87\xdf\x80\x4f\x82\x0e\x91\x31\x8f\x9c\x99\x91\xf4\xdb\xb4\x7b\x1b\xe1\x4e\x78\x7a\xa3\xe0\x6b\x02\xa1\x39\xde\xfc\x84\x04\x43\xb2\x5d\x3d\x37\x47\x74\xdb\x5d\x1c\xd6\x9d\xaf\x2d\x14\x49\xe5\x9f\x37\x35\xfd\x67\x6a\x1c\xaa\x00\x65\xa9\x78\x28\x07\x0e\x71\x43\xfd\xcb\xda\xc7\x27\xad\xf4\x3e\x3e\x27\x02\xfa\x6e\x7d\x39\xc8\x2b\x55\x27\x3c\x34\xeb\xbb\x6d\x49\x77\xce\x3a\xf6\x34\xb8\x73\x0d\xc0\xda\x1e\x8e\xed\x3c\x8c\x8f\xdb\x80\xbf\xbc\xb4\x01\xd3\x04\xad\x3c\x3c\x81\x2a\x95\x5f\x7b\x95\x58\x8f\xa7\x42\x6b\xfa\x34\x33\xaa\x0c\xa2\xaf\xf7\x46\xd3\xb3\x69\x4a\x17\x6e\x57\x9a\x09\x48\xd9\x7d\x48\x82\x0b\xac\x18\x27\xba\xf4\x8a\x95\x25\xeb\x66\x7b\xda\x50\x1a\x17\xa6\xf2\xcb\x69\x3f\x0d\x13\xc6\xec\x9b\xeb\x17\xdb\x4b\xe7\x47\xe3\x2c\xd8\xb7\x36\xb5\xea\xdf\x48\x94\xfa\x76\x6d\xaa\x2f\x67\x3a\xbf\xe5\x78\xd0\xb0\x0f\xb3\x3c\xe4\x7c\x7e\x0b\xfd\xfa\x38\x34\xfb\xb2\x8f\x6c\xcf\x8e\x93\x64\xdf\x14\xdc\x5e\xa9\xe4\x7c\xed\x49\x36\xfe\x67\x24\xc1\xe6\x8b\x39\xea\xe8\xfc\xd9\x42\x84\x2d\x3f\xdf\xff\xbb\xad\xcd\xf2\xa7\xe5\x69\x50\x5f\xaa\x49\x7e\xa8\xf0\xf7\x29\x3d\x4c\xf1\x89\x7a\xed\xc3\x59\x00\xe7\x02\x53\x6a\xc6\xe0\x12\x8e\x7f\x5b\x22\x81\xe3\xa3\x58\xfa\x27\xc1\x44\x54\x3c\xe0\x0f\x93\x3f\xde\x6c\xb6\xde\x61\x77\xd7\xbe\xf9\x8c\x0b\x7a\x37\x1f\xbe\xbd\x5b\x67\xe1\xda\x10\xfa\x26\x63\x37\x06\xd3\x4e\x21\xe6\x07\x49\x36\xb1\x03\xe5\x3d\xc1\x1a\xb0\x5b\xe0\xd9\xbd\xf5\xfc\xc7\x67\x5f\xd4\x01\x56\x65\xe8\xbf\xa3\x87\xfe\x56\x8f\xe9\x5d\x82\xab\x5b\x9a\x12\xc2\xdf\x1e\xf4\xda\xb5\x83\x2d\x74\x04\x41\xaf\x22\x18\x5a\xc2\x6f\xa5\x88\xbd\xd1\xde\x64\x91\x8a\x83\x7c\x09\x16\xb2\xbe\x77\x30\x8d\xf5\x25\x02\xe6\xed\x94\x87\xe0\xba\xd4\x93\x3c\x66\xe8\x90\x2c\xdc\x76\x91\x47\x61\x90\xa8\x8b\xc8\x27\x00\x39\xd0\xef\xdd\x7c\x97\xf0\xf8\x7e\x43\xcd\x99\x74\x65\x64\x15\x74\xed\x7f\xb0\x92\x65\xc8\x0f\x56\xf2\x1e\x2b\x25\xaf\xfe\xee\xa4\x7e\x43\x13\x09\x54\x86\x12\x33\xb7\xdf\xca\xc9\x78\x5b\xeb\xd7\x6d\x0a\x7d\x4c\xef\xcf\x29\xff\x04\xf4\xc1\xf4\x6d\x0c\x6c\x3a\xe9\xd7\xcb\x6e\xf1\x98\x8b\xc6\xc7\x20\x29\x2f\x34\x1a\x05\x0d\x39\xa8\xc9\x59\xbe\x88\x9e\xe4\x26\x1a\x17\x2c\x08\xc7\xb0\x20\x9c\x28\x9a\xec\x8c\x63\xf6\xb5\xe1\x3d\x18\xef\xb9\xe1\x91\xd3\x9b\xef\xa4\x2a\xf1\x9d\x94\x65\x61\x40\xc3\xa2\x77\x9a\x74\x57\x5f\xf5\xbd\xca\x73\xb0\x6d\x9a\x6d\x79\x61\xac\x47\xa2\x70\x9d\xc9\x1d\xf6\xbd\x5e\x48\xc3\x71\xca\xaf\x98\xd8\x2f\x99\x05\xb9\x00\x85\xd7\x37\x1e\x94\xd8\xf3\xfd\xea\x0b\xae\xb5\xfc\x5b\x62\x75\x04\xb1\x36\xff\x8c\x5e\xc5\x46\xae\xce\xb9\x2d\x49\x07\x90\xe9\x60\x0b\xf5\xaa\x97\x8c\x80\x5e\x56\x73\xfb\x3d\xc0\x54\xb3\xc0\x2a\xca\x32\x59\x81\xaf\xac\xe4\x9a\x57\xd2\x06\x68\x3b\x76\xb1\x7b\xe1\x7d\x2f\xc6\x6f\x1b\x82\x69\xfc\x66\xa2\x10\xc2\x6c\xe1\x57\x68\xbb\xd4\xe0\x30\xef\x08\xbd\x68\xd3\x2d\xa5\x3d\x78\xc5\x73\x37\x30\xb4\xe7\xa4\x83\xee\xa4\xc8\xbf\xd8\x3a\x04\xed\xb8\xb6\x43\x28\x87\x2e\x0e\x59\xca\xaf\xac\x6c\xb0\x4e\x5a\x5e\xaf\xbe\x34\x57\x17\xa4\xe4\xc2\xd0\x1d\x14\x07\xa4\x5b\xe8\x10\x78\xfc\x25\x08\xd0\x49\xba\x8c\x70\x4e\x64\x1c\xd6\x17\x8a\x38\xcf\x9a\x9b\x73\x25\x75\xf5\x8b\x40\x53\xf0\xde\xf0\x2d\x61\xee\x1b\x59\x45\x2c\x33\xf3\xa8\x7c\x52\x9c\x79\x82\x12\xe7\xbf\xc3\x4c\xf7\x92\x1a\x0a\x5c\x43\xfc\x82\x2e\x7b\xe7\xb8\x06\x13\xe5\xce\xf0\xbd\xd3\x97\x6b\xc0\x66\x16\x63\xd9\x0d\x6f\x2e\x62\xf2\x8c\xbd\xb9\xd6\xaa\x3e\xe9\x7a\x49\x0e\xf3\x6a\x91\x66\x77\xd5\xaf\xca\xff\x05\x13\x19\xe4\xd1\x51\x5c\x64\x0e\xa3\xaf\x7a\x54\xf9\x29\x1b\x2c\xe4\x19\x33\x55\xdf\x4a\x38\xa9\xf8\xf5\x54\xba\x8e\x21\x07\x97\x26\x87\x55\x2c\xe7\xcc\xc4\x2e\x6b\xfe\x55\x75\x5d\x4e\xa3\xcf\xb4\x66\x74\x9a\x71\x95\x9e\xb9\x2d\x6d\x4a\xd3\xbb\x66\x48\xbe\xf9\x8f\x99\xb3\x4c\x39\xf0\xed\x16\x19\x33\x26\x89\x12\x80\x8c\xcc\x2a\x1a\xce\x8c\x02\xed\x4b\x22\xf2\x0e\xef\x19\xd2\x94\x6d\xe4\xcb\x86\xf9\xca\x59\xee\x8c\xc9\xe7\x14\xae\xae\x58\x72\x61\x2e\xa9\x90\x6c\x1c\xf7\x3d\x29\xb3\xe7\xf2\x14\x45\xef\x0f\x5f\x49\x29\xaa\x20\x2c\xeb\x61\xa4\xee\x33\x74\x61\xe0\xfd\x21\x90\xa8\xce\x15\x19\x62\x34\x67\xe4\x56\x83\x68\xa8\x5f\xfb\x66\x9f\x1f\x27\x7d\x7d\x90\x07\x4b\x6e\x33\xe2\x5b\x0b\x11\x7c\x1e\xc2\x92\x0f\x72\x0b\xe1\xb1\x98\x3e\x7c\x76\x86\x68\xf6\xf7\xb2\xd6\x94\xac\xe7\x4b\x8e\x9f\x27\x0c\xd9\xbd\xa4\x61\xe0\x4d\x53\x51\x2b\xc9\x22\x75\xd1\xf2\x08\x01\xfa\x92\x76\x23\x3d\xe2\x44\xa0\xc3\x83\x39\x27\x0c\x08\x50\x5e\x37\xa7\xcd\x0c\x1c\xf2\x3c\x14\xe9\xb7\x1b\x13\xa0\xfa\x14\x9b\xb8\xd5\xb9\xaf\x63\xa6\x23\x4d\x19\x83\xe9\x8c\xfb\xcd\x73\x5f\x6e\x8d\xce\x53\x1c\xe9\x16\x55\x99\x31\x47\x67\x36\xb3\xdc\x36\x59\x40\x6e\x72\x56\xbb\xfe\x6e\x65\x30\xda\x67\x4b\xfe\xdf\x85\x50\x34\x6f\xe3\xd5\x2d\x18\x73\x30\x6c\xfb\xfc\xaf\xa1\x43\x53\x60\x06\xb7\xa0\x49\xc7\x44\x14\x51\xec\x83\x26\x85\x9c\x53\x77\x7e\x94\xd9\xdd\x35\xda\x37\xf8\x3f\xa2\x19\xe4\x10\x51\x99\xef\x6e\x31\xee\x8d\xbd\xa8\xd0\xd6\xa2\x75\x63\x3d\x2c\x91\xd6\xa7\x86\xf3\x3c\x10\xda\xe4\x3e\x07\x19\x53\x7e\x15\x56\xe7\xdc\xec\x07\x1b\x0c\xab\xcc\x23\x7f\x44\x11\x3d\x7a\x35\x66\xd0\x86\xfd\x8c\x15\x1a\xee\x0f\x03\x9e\x47\x37\xb7\xf5\xb7\x30\x68\x96\xd6\xb5\x25\xcb\xf9\xcd\x67\x55\x6f\x25\xb8\x9d\xd5\xd5\x88\xe8\x39\x07\x57\x7c\xfe\xbb\x89\xe6\xbc\xc7\x56\x5b\xd5\x5b\x0b\x5f\x4a\xf2\xa7\x29\x2a\x74\x56\x76\x1e\xfc\xb5\xd8\xad\xd2\x3f\x05\x16\x01\x52\x5d\xf7\xda\x0d\xa9\x4f\xba\x7c\xf8\xc8\x43\xa3\x9b\x13\x69\xb2\xe4\xd8\x6f\xf4\x2a\xdc\x52\x74\x6e\xad\x9f\xf0\xa3\x78\xae\x9a\xdd\x32\x40\x93\xc4\xe8\xa1\x9d\x4b\x15\x77\x7d\xf1\x04\x90\x13\x44\xf1\x44\x00\x91\x56\x32\xa3\xdf\x7c\x01\xca\x6f\xb8\x78\x22\x2a\xc9\x52\x2f\xa4\x55\xfb\x07\x47\x6a\x67\xb1\xcb\x0a\xd2\xf4\x46\x65\xd4\x13\x49\x5f\xb1\xab\x3b\x58\x2a\x73\xc0\x96\xc8\x6d\xef\xb3\x51\x27\xdc\xe8\xfd\xda\xca\x40\x8b\x8a\xb3\x68\xd8\x08\x2a\x75\xb8\x44\xde\x9c\x7f\x30\x90\xc7\x96\x1e\xa4\x3c\xb7\x90\xc8\x3b\x95\xa2\xd4\x9d\x0f\xe7\x2a\xff\x49\x90\x57\xf8\x04\xe0\x70\x79\x0a\x68\x27\xeb\x52\xc8\x79\x32\xb7\x6e\xa1\x38\x33\xd1\xc0\xfd\x2a\xd9\x80\x38\xfc\x51\xae\xe3\x2d\xb2\xe6\x8a\x9f\xb9\x35\xb0\xe2\x1a\x7b\x53\xbb\x92\x44\xdd\xe8\xf2\x71\x4a\x75\xfc\xec\x9f\x13\x72\x25\x65\x59\x29\xc3\xb2\x33\x26\x8c\x4f\xf5\x32\x40\xb2\x16\xb3\x58\xc2\x07\x79\x7e\x26\xbf\xd4\x9c\x43\xb5\xff\xcc\x53\x79\x71\xeb\x41\x1e\x88\xd6\x2b\xf5\x22\x6e\x60\x4e\x1e\x2a\x3f\x03\x6b\xab\x34\x30\x54\x4b\xc2\xf5\xd5\x39\xcc\x6f\x51\xa3\x9c\x72\xdd\xbe\xb1\xba\xdd\xbb\x08\xcd\x30\xf0\xec\x6b\x7f\xce\x92\x52\x93\x03\x21\x9a\xb5\x2e\x6c\x28\x1f\x3f\x4b\xca\x6c\x7d\x9f\xeb\x8a\xad\xe3\xa6\x03\xfd\x93\x89\xab\x65\xa2\xed\xee\x0e\x9e\x20\x54\xff\xd8\xdf\x36\xea\x7b\xf6\xfd\xd7\x5b\x67\x5b\x23\x75\x97\xde\x96\xc1\xa6\xee\xe2\x14\xc0\x0f\xb1\xb9\x73\xbc\x29\x5c\x4c\xc1\x37\x4f\x79\xea\x67\x94\xa9\xa3\xb5\xc8\x0a\x8e\x9d\xc9\x87\x4d\x67\xba\x29\x7d\x75\xba\xcc\xe0\x4e\xb4\xeb\x35\x01\xbf\x99\xa5\xdc\x24\xe5\x92\x01\x7f\xcb\xfa\x11\x80\xf5\xbf\x38\xd3\x56\xbf\x8c\x5a\x3d\x05\x8d\x5a\xf5\x25\x44\x64\x5c\x82\x43\x09\x56\x60\x4c\x8b\x88\xbd\x96\x6e\x62\xe9\x61\x10\xe4\x1d\x4a\x50\xc1\x9a\x7f\x35\x1d\x29\x5f\x59\x46\x95\xd3\x2d\x27\xd8\xd4\xeb\x3f\xc4\xa6\xb5\x1d\xfd\x22\xef\x6b\xa6\x8e\x79\xbb\xcf\x1f\x5b\xa6\x81\xbb\x9b\xff\x23\x53\xda\x49\xb6\xf7\xcc\xfd\x0c\xe4\xa8\xfd\xdb\xfd\x70\x8e\xeb\x2d\x42\xf4\x3d\x71\xc4\xd8\x50\x8b\x0a\x30\xc8\xdd\x7e\xb3\x30\x4e\x8d\xf6\x40\x45\x83\x71\xd1\x26\x1f\xca\x8b\x24\xda\x2a\x13\x20\x04\x9d\x83\x22\x5d\xa5\x69\x61\x68\xe2\x51\xf7\xa7\x72\x25\xc0\xef\x2f\x5c\x27\x8b\xd3\x56\x99\x42\xd8\xaa\x3d\x1a\x91\x89\xab\x06\x6a\x08\x51\x8b\x46\x6d\x0f\xda\x2f\xa1\xbc\x38\x09\x0c\x8f\x61\x44\x58\xe5\xc5\x19\x43\x64\x88\x30\x92\x1c\x8d\xae\x41\xe7\xeb\xb7\x42\xea\xaf\xdb\x5d\xca\x10\x33\xcb\xf9\xb3\x64\x0e\xcf\x91\xb1\x42\x3a\xb5\xab\x1e\x64\xc1\x4d\xc7\xb5\xb7\x8b\x36\x8a\x80\xea\x2d\x23\xd1\x36\xb4\x94\xdb\xec\x6e\x3d\x2d\xbf\x82\xec\xbc\x9d\x61\x0e\x9a\xb7\x7f\xfc\x2f\x6c\x49\x03\xd2\x98\x05\x02\x79\x9a\x89\x2f\x86\x34\xcb\xd0\x60\x55\x4f\x1a\xb5\xcf\x3e\xfb\xaf\xc8\xb3\x0c\x36\x95\xb9\x63\x60\xa7\xea\x94\xa1\x22\x37\xcc\x3c\x49\x4e\x88\xfa\x50\x9a\x57\xb5\x05\xcd\x92\x59\xbf\x7e\x92\xad\xe6\x67\xb8\xc5\x7f\xbe\x67\x26\x9f\x36\x31\x49\x9b\x44\x00\xc1\xf4\xfc\x23\x38\xa4\x8a\x82\xf8\x3c\x77\xdf\x42\xab\xc2\xe1\x1d\x68\x4a\x22\x50\x6f\x24\x54\xc3\x68\x8b\x5c\xec\x22\x5b\xce\xe0\xb2\xc3\xb1\x50\x1c\xeb\x99\x7b\xdb\x57\xc1\xd3\x3f\x92\xba\xec\xcd\xae\x76\xa7\x41\x67\x16\x1b\xcb\xd0\x5f\x62\x99\x45\xaf\xfe\xf8\x17\x74\x58\x55\x24\xd6\x33\xdc\x12\xc8\xa8\xfe\x67\xb6\xe6\xa0\xb4\xf7\x71\x93\x3e\x7c\x6b\xa6\xfc\x68\x9c\xfd\x3d\x14\x08\x86\x9d\x27\x23\xd8\xb0\xf1\xd4\x44\x81\xc1\x3b\x87\xa3\x27\xa4\x75\x7d\x25\x8c\xa9\xc8\x3f\x36\x94\x84\xae\x4b\xe9\x3e\x07\x3e\x18\x99\x76\x92\x31\xab\x21\xe4\x61\x9f\xcd\x4c\x5f\xf4\x43\x93\x0d\x47\x6d\x32\x6d\x3d\xea\xc1\x77\xfc\xa8\x55\x12\x81\x68\xbf\x27\xd2\x59\x0d\x8e\x1f\xae\x5b\x18\xd9\x3a\x2a\x8f\xb9\xde\xaf\x42\x8d\x9e\x43\x21\x21\x7b\x62\x3e\xe2\x3e\x56\xe5\x1a\x1e\x45\xcc\xdf\xf2\x9b\xc2\x3d\x90\xc8\x2b\x11\x06\x78\x7b\x86\x4f\x26\x08\xd5\x62\x62\xff\xd3\x85\x77\x57\x70\x92\x8e\xe7\x42\xf1\xbe\x63\x4e\x5c\x56\xa0\xfb\x78\x50\xcd\xe8\xd0\xdb\x71\x78\x83\xa2\x5f\x19\x8d\x8b\xd3\xb0\xc7\x1f\x0b\xbb\x31\x79\xef\xd4\x52\x12\xf0\xee\xe9\x11\x71\x68\xa7\x58\xb7\x30\xdd\x0c\xa3\x20\x43\x0c\xd7\x3a\xdf\x9a\xa5\x4c\x3d\xa5\x1a\x62\xfd\xc9\x59\xdc\xee\xe4\x8f\x28\x7d\xb7\x30\xcb\x04\x31\xc1\xff\x95\xac\x7b\xd3\x86\xff\x48\x9e\xe6\x29\x52\x84\x28\xa1\xe2\x42\xa2\x75\x1b\x15\xda\x39\x92\xbf\xad\x42\x93\x88\xd5\x87\x8e\xc5\xf9\x08\x74\x59\x6d\x88\x55\x02\x23\xdf\x56\x47\xde\x27\x71\xb9\xf7\x51\xc1\xf3\x43\x73\x8f\xe0\x5d\x6b\x56\x06\x6a\x3f\x62\x7b\x62\x9c\xba\x2f\xb1\x81\xd8\xdf\x3e\x6e\xe7\xc1\xc7\x85\x93\x8d\x70\xff\xe4\x03\xac\xfa\x14\x20\x23\x11\xb5\x80\x55\x16\x41\xbc\xbe\xcb\xf6\x33\xfe\xd4\xcc\xb5\xf5\x75\x6f\xd2\xb1\x35\xc7\x5b\x4f\x37\x9f\x24\x6e\xf5\xeb\xc5\x93\x83\x12\xce\x70\x51\xa8\xb4\x36\xf2\x1f\xac\x4f\xe1\xc4\xed\x43\xea\x79\xd5\x86\x90\xce\xdb\x5e\x41\xd9\xf2\x4e\x64\x0d\x45\x3c\xeb\xa5\x3f\x74\x64\x58\xe7\xeb\x62\xd7\xfc\x67\x8f\x55\x2e\xa5\x4b\x30\xb9\x6f\x0f\x02\xd5\xd9\xab\xc1\x3a\xab\xd5\xae\x70\x0f\x21\xc3\x5c\xe9\xa1\x61\x0a\xea\x47\x0d\x62\x6f\xb5\xa7\x7f\xd2\xc3\x74\xaa\xa1\x29\x6d\xbd\x77\xbf\x49\x48\xcb\x11\x39\x1d\x81\xa5\x0a\xeb\x11\x6f\x41\xea\xd0\x3e\x22\x84\xa3\x2a\x27\x77\xfa\x23\x01\xb5\xfd\x23\xc5\x2e\x03\x5a\xa1\x11\xc3\x7e\x93\x9b\x7d\x4b\x00\x6c\xc7\x67\xed\xaf\x29\xbc\xdf\xb5\x46\x03\x21\x43\xd2\x33\xdb\x91\x8b\xd1\x1c\x88\xbd\xbe\x73\x0c\xba\x87\x40\xda\x6e\x37\x2b\x46\x65\x7b\x1d\xa9\x1f\x05\x13\x53\x68\xa0\x12\xa2\xb5\x91\x01\x6a\xf1\x2c\x0c\xbf\xe4\x2c\x41\xec\x3d\xdf\xc3\xad\x3e\x37\x9c\x4a\xad\xdd\x65\x67\x03\x0b\xcc\x46\x07\x67\x5b\x61\x0d\x7b\x15\xaf\x56\x04\xbc\x78\x56\x45\x75\x61\x56\x8a\x02\x22\x0a\xe4\x5d\x5f\x67\x50\xb7\x90\xe4\x29\x60\x1d\xee\x4c\xeb\x46\x78\x50\x25\x5a\x2b\xde\x68\x14\x48\x94\x36\x38\xa9\xa4\x37\xe3\xed\xaf\x87\x15\xe4\x36\xde\xfb\x88\x2e\xac\x43\xfb\x88\xc8\x35\x0e\x67\xc1\x4d\x71\x9f\xad\x7e\x44\x7d\x56\xb8\xd2\x3d\x4e\x49\x44\xad\x9a\x55\x33\x30\x52\xed\x7a\x83\xae\x18\x77\x67\xe2\xd3\x06\x4b\x0a\x57\x9b\x02\x22\x3f\x7b\xd7\x71\xf6\x91\xb4\x52\xe7\x5b\x3b\xdf\xb5\xae\x5f\x0a\xcb\xda\xd0\x91\xe9\x20\xe0\x4f\xf3\xe2\x99\x42\x63\x45\x09\xe2\x69\xb9\x54\x3d\x61\x54\x28\x5d\xaa\xad\x78\x6d\xc3\x4b\xb7\x2e\x0b\xe9\xc1\x88\x9a\xca\x05\x60\xb3\xee\xcc\x50\xc4\x9d\xde\x5d\xe5\x5d\x98\x94\xe9\xbd\x33\xad\xf7\xae\x40\x01\x0c\x72\x95\xd8\xe0\x3d\xc0\xbe\x21\x0a\xcb\xd8\x16\x46\x7d\x59\x3b\xae\xeb\x9b\xf4\x62\xb7\x71\xfa\xf9\xa7\x32\x0a\xb1\x95\xa5\xdd\xbc\xfe\x39\xad\xbc\xbc\x18\xfe\xb9\x81\xaa\x77\xec\xb6\xec\xf1\x29\xab\x40\x82\x24\x9e\x4f\xd0\xa1\xfd\x27\x20\xc5\xd5\xc6\x10\x3f\x2e\x36\x0b\x8d\x31\x36\x88\x67\x68\x95\x9b\x51\xd2\x92\x16\x86\x85\x2c\x27\xeb\x33\x53\x32\x7c\x0b\x69\x4c\x37\x63\x25\x79\x39\xaf\x61\xcd\xee\xba\x2e\x64\xcb\x6b\x54\x8a\x72\x67\xbe\xf5\x96\x17\xca\x57\x6f\xb9\xd0\x05\x6a\xcb\xfe\x33\xc4\x17\x17\xf9\x19\xa1\x7d\xf1\x75\xc7\xb7\xb2\xac\xb6\x11\x31\x07\xd1\x79\x47\x06\x41\xb7\x71\xa7\x74\x0d\x40\x12\x5d\x7a\xf3\x9e\x85\xc3\x25\x27\x72\xaf\x67\xe4\xb2\xf9\xe9\xc6\xe7\x5d\xa4\xbb\x61\x38\x46\xdd\xb0\x6a\x6d\x99\xea\x19\xc0\xb3\x08\xc1\x80\x59\x71\x37\xb7\x73\x0d\xc3\x4b\x10\xbb\xdb\x95\xc2\xab\xf5\xe6\xa7\x47\x62\x77\x13\x6c\x41\xf6\x6e\x9b\xfb\x77\x92\xe1\xad\x0d\x57\xe9\x31\xb8\x7b\x2b\x72\x3b\xb4\x71\x6a\xfd\x04\xe0\x8d\x38\x4a\x61\xef\x9b\xbe\x5f\x59\xb2\x7e\x45\xb2\xfe\xca\xc6\x6c\xb3\xc1\x95\x5c\x84\x35\x7d\xbd\x91\x9e\x0a\xe6\x36\x3d\x74\x9d\x90\xdd\xb9\xd9\x20\x66\x10\xbb\xe9\x92\x60\xf0\xb0\x8b\x76\xc1\x5c\x6e\x15\x0a\xbb\x5e\x83\xe9\x19\x3c\xed\x2f\xe7\xb2\x0d\xc9\x06\x0b\xdc\x6d\xdd\x96\xd4\xce\xaf\x9a\x44\xe4\x04\xc5\x86\x9b\x8e\xdd\x38\xb7\x00\xef\x57\x65\x05\xbb\xf3\xab\x14\x10\x92\xd2\xaf\x00\xc2\x23\x76\xac\x9b\x40\x89\xf7\x13\x82\xcc\xc1\x2d\x6f\xb2\x0d\xda\x90\xb7\xa4\x7d\xf6\x6f\xa7\x76\x5f\x62\xbb\x63\xe6\x47\xfc\x70\x7c\x36\x64\x67\xef\xa9\xca\xe2\x76\xdd\x9e\xc1\x19\x77\x49\xbf\x2c\x58\x62\x9d\xc4\x03\xd2\xda\x6f\xf8\xd2\x5f\xe0\x30\xb2\x74\x76\xf8\x8f\x90\x5f\xc0\x44\x0f\x8a\x7d\x61\x52\x2e\x18\xe1\xbc\xda\x67\xbd\x3f\xfc\x1a\x23\x0d\x6e\x4b\x39\x18\xee\xd3\x47\x8f\x71\xba\xb3\x2e\x3b\x58\xe9\x93\x06\x59\x08\x27\xc6\x69\xc5\xcf\x73\xd3\x59\xd5\x98\x49\x26\xce\x69\x7c\x62\x14\xf9\x1f\x28\xe5\xcc\x6e\x01\x29\x6c\x25\x48\xec\x3c\xad\xb7\xba\x81\xeb\xad\xb7\x7e\xbd\x17\xef\xf9\xaf\xf7\x94\xbb\x41\x6c\xf1\x36\x7a\xd5\x34\xc3\x5a\xdf\x93\xdc\x5a\xd5\x5b\x70\x0a\x7a\xf7\x60\xad\x67\x10\xd0\x79\x97\xc8\x44\x17\xa1\xbb\xb6\xd8\x57\x23\xfd\xb5\x1e\x1a\xc5\x81\xa7\x1e\xc7\xab\x9b\x80\x8d\x58\x35\xc9\x0e\x8c\x6c\x3b\x8f\x48\xd9\xc2\x48\x5e\x77\x0d\x16\xfb\x53\x6f\xd5\x5a\x21\x39\xb9\xca\x9e\x08\x3d\xf0\x1f\x55\xbe\xbc\x2a\x19\xe6\x65\xd7\x04\x1b\xbe\xd0\x5f\x10\x0c\x29\x93\x2b\xc7\x0c\x74\x83\x55\xd6\x19\xc8\x1a\x4f\xf9\xc5\x8a\xf1\x8d\xd9\x3b\x85\x85\x1d\x77\xd5\x0a\xab\xc1\x4f\x11\xcd\xc9\xa1\xcf\x3e\xd1\x24\x12\x7c\xe6\x48\x6f\xcd\x07\xd3\xf3\x60\x15\xab\x61\xe5\x2a\xaa\x14\xfc\x9e\xb8\xa3\xc2\x5f\x2b\xd3\xe3\x89\x30\x52\xe3\x56\x33\x26\x98\x04\xf9\xa4\x72\xbe\xe4\x3f\x1b\x64\xba\xd5\xc6\xd2\xe1\x40\x3b\xbd\x99\x91\xb1\xe6\x7f\x1c\x67\xf3\xb8\xc6\x85\xe8\xc2\x82\x9c\x9f\x93\x52\x4a\xd7\xe4\x32\x4d\x8e\x3e\x24\xad\x7b\x64\x67\x4d\xff\x13\x5f\x3d\x74\x45\x41\x38\x6a\xca\xf6\x59\xd3\xab\x72\x6f\xc4\x32\xef\x40\x13\xff\x77\xd5\x9b\x71\x12\x83\xe1\x64\x7b\xcd\x3a\x9c\xf2\xcb\x41\xaa\x8f\x0e\x33\x32\x87\xd8\xc1\x72\xcf\x5a\xa6\x86\xae\x29\xdc\x84\xad\xe7\x5f\xf8\x4f\x1b\x7d\x6d\xfc\xdf\xfe\x2d\x6b\x0d\xae\xbc\x75\x66\x68\xb0\x8b\xd9\xbf\xa7\xfc\x72\xf7\x89\x8a\x3e\xce\x28\xf5\x26\x62\x4d\x5b\xb7\xa6\x5d\x75\xba\x95\x67\x58\xe2\x73\xb0\x4f\xfd\xaa\xdc\xc4\xe3\x8c\x6b\x9a\xc5\xfc\x77\xfa\x1a\x51\x6e\xd1\x3e\x82\xa7\xcf\x7f\x3f\xec\x16\xeb\x37\x87\xc8\xc0\xd0\xc4\x29\x86\xd8\x66\xa7\x1f\xdf\xba\x25\x60\xe7\x2b\xf8\xb3\xdc\xeb\x3f\xbe\xb3\xf7\x9f\xf7\xcb\x97\x3b\xcf\x3b\xb9\xe0\xf7\x60\xaf\x08\x57\xb6\xef\x4f\xed\x18\x14\x7e\xa7\xaa\x37\x56\x77\x8b\x0d\x6d\xcb\x52\x05\x69\xde\x8a\x99\x30\x9e\xa3\x85\x27\xe4\x02\xf7\x3e\xa7\x86\xb4\x58\x62\x79\x86\x51\x6e\xb0\xb6\x1b\x19\x1a\xc2\x22\xa2\x37\x66\x0d\x59\x19\xdc\xe9\x96\x90\x5a\x4e\xab\xc1\xa5\xb2\x87\xb9\x54\x65\xa0\x2d\x55\x8a\x83\x4b\x3d\x10\x4e\x72\xb4\x33\xbd\x60\x89\xdc\x17\x03\x64\xe3\xcb\x60\x70\xa9\x73\x90\xff\x31\x18\xe5\x71\xf2\x5e\x9e\x3c\xb4\xa8\xfb\x48\xd3\x0d\x96\xff\x40\x92\x38\xc4\xa0\x74\x55\xbb\x98\xbe\x06\xb2\x42\xb7\xe4\xf4\x93\xc8\x5f\x69\xfb\xe0\x3f\x7d\x75\x5d\x3d\xd1\xf5\xd5\x42\xb9\xcf\x2e\x5b\xd5\xa5\x9c\x29\x88\xf1\x45\xd4\xfb\xc6\x7e\xdb\xa2\x18\x7a\x6f\x34\xe0\xa7\x9b\xc3\x73\x37\x22\x22\x0b\x3b\x0a\x20\xf3\x6b\x76\x7a\x91\x2c\xc4\x52\x86\x3a\x69\x78\x87\xb1\xe5\x0b\x55\xa2\xdf\xa3\xfc\x61\x26\xf9\x12\x4e\xc0\xe2\x5e\x2e\xb2\x27\x5f\x5c\xb6\xff\x95\xfc\x68\x48\x7a\xf0\x41\x3c\x10\x0f\x9c\xb7\xe3\x52\xa9\x15\x99\x44\x74\xeb\x46\x49\xa1\x6e\xc1\x00\x3d\xb7\xa0\xc5\x7f\x45\x80\xff\xfe\x98\xf4\xef\x04\x43\x61\xae\x0e\xef\xe5\x74\xde\xfc\xe7\xa9\x24\x0e\xa0\x1c\x2c\xfc\xdf\xe1\xfa\x40\xca\xa0\x6c\xb1\x16\x37\xe8\x74\xb0\x6b\xe2\x77\x61\xe6\x01\xf8\xf7\xdc\x6d\x8d\xb0\xce\xa2\x6f\x14\x4c\xfc\x9d\xff\x9b\x29\xc7\x90\x66\x4d\xc9\x2d\x31\xa9\x0b\x07\x5e\x8a\xf3\xfd\xdd\x08\x00\x9c\x8e\x48\x3a\xf9\xbb\x33\xd5\x24\xff\x6e\xf9\x8c\xff\x31\xfa\xf6\x57\x31\x77\xe3\x51\x9e\xbf\xba\x2b\xad\xd2\x10\x69\xf2\x55\x9c\xfa\x3a\x04\x33\xff\x49\xd3\x42\xf8\xf3\xfe\xa5\xd1\x2a\x29\xff\x7f\x7a\xff\xf2\x9c\xfe\x78\x03\x1c\xed\x32\x3d\xff\x4b\x92\x45\xfa\x43\xb8\xa2\x93\xf0\x77\x15\xb1\x3c\x2e\xbf\x83\xc4\xbc\xde\x5f\x1a\x06\x06\x1e\x0b\x63\x3c\xe5\xa5\x10\x42\xe4\xcf\xd8\xa0\x44\x12\x98\x05\xd6\xdd\x6a\x92\x0d\xcb\xc6\xd7\xde\xb7\xfa\xa4\xd5\x2f\xdf\xb7\xb2\x64\x99\xa3\xfc\x63\x4d\x39\x7f\x82\x5c\xff\x3f\xb5\x9b\x90\xb1\xa5\x35\xeb\x2d\x42\x74\x58\x17\xfa\x0c\x14\xd7\x74\xb2\xd4\x7c\x6f\xdd\x4b\x61\x16\x3b\x19\x2a\x6e\x85\xa4\x38\xef\xae\x8b\xf4\xff\x64\x2b\x30\xdf\x53\xc8\x04\x0c\xbc\x03\x30\xd0\xf3\x68\xce\x8c\x48\x8a\xc2\xdd\x33\xc6\x99\x24\xcf\x9f\x1c\xdb\x22\x6b\x56\xde\xbf\x9d\x99\x6d\x97\x4c\xf2\x7a\xdd\xd5\x92\xfd\x04\x6a\xc1\xe6\xd7\xa1\xd6\xa0\xf7\x5b\x9f\x44\xde\x35\xa4\xf4\xf7\x09\x57\x5f\xfc\xb1\xfa\x3b\x39\xbd\xce\xfd\x54\xf6\x52\x28\xf1\x63\xae\x53\x9c\x6c\x92\xaf\xaf\x0e\x5a\x1a\x7f\x48\xd9\xbf\xb1\x5f\xd9\x51\xab\xf0\x85\x98\x7f\x16\xbf\xd2\x75\xb0\x8e\xc6\x97\x85\x94\x3d\x66\xeb\x72\x84\xe5\xef\x33\x51\x2b\xcc\x9a\x0a\x72\x52\xe9\x02\x0c\x90\x43\xbb\x79\xce\xdd\xda\x57\x16\x97\x48\x11\x98\x97\x70\xc2\x06\xc3\x3f\x33\xda\xa7\x39\x20\xc1\x27\xf9\xe8\xd9\x2e\xef\x79\x8b\xe1\x2f\xc6\xc7\x1c\x9a\x3b\x60\xec\x77\xd1\x63\x2c\x14\xf1\xf8\xa7\x90\x1c\x90\x69\x37\x0c\x82\xe3\x7c\xe5\x11\x3a\x02\x88\xa8\x72\xb3\xa7\x78\xf0\xd6\x81\xd3\xc3\xcf\x43\x6c\xd5\xd9\xb8\x06\xcf\xb5\x90\x4a\xff\x0d\xf0\xe1\x84\xbe\x01\x0e\x0b\xe7\xf4\x66\xa5\x38\xa3\xd3\xb1\x25\x91\xe8\x5f\xfc\x85\x9e\xe2\xea\xe0\xa4\xfb\x38\x38\xff\x7b\x18\x3d\x83\xe1\xb9\x12\x5c\x7b\x37\x13\x8e\x55\xf4\xf7\x33\x70\x94\x10\x00\x58\x9a\xe6\x50\xe6\xf0\x8d\x81\x16\x80\x56\xa0\x7f\xc5\xe9\x17\xab\x93\xbe\x59\x9e\xc1\x3b\x75\x2f\x52\x37\x66\x9c\x9d\x52\x41\xb0\xb9\x11\xf3\x56\xa8\xd3\x90\xd8\x0a\x23\x0b\x9d\x49\x87\x73\x8c\x4e\x30\x11\xb7\xc6\x55\x14\x2a\x0e\x3c\x9f\xec\x4c\xc2\x47\x98\xdb\xe8\x42\xa6\x22\x86\xb2\xc1\xc4\x6d\xc7\x25\x3e\xe6\x34\xe4\xec\xd6\xb4\xf7\x87\x81\xee\xa7\x0f\x0c\x9c\x95\x7c\xef\x9a\xac\x7b\x92\xda\x10\x56\xc2\x61\x11\x0e\x38\xa8\x81\x32\x2c\xdf\xd9\x1b\xf6\x84\x8d\xda\x03\x4a\x2f\x7c\xde\xb4\x74\xbd\x47\xd1\xaa\x6f\x5c\x94\x23\xeb\xb3\x0c\x3f\xf6\x3e\xb2\x48\x9d\xed\xee\x12\xc4\x91\x64\x6b\x4b\x9b\xbf\x8c\xae\x3c\x10\x8a\xf2\xcf\x7f\xf5\x87\x3d\x68\xa8\x2f\xca\x30\xf7\xd2\x4c\x14\x80\x5c\x4f\x0d\x3e\x1e\x85\x56\xe4\x2e\x59\xa0\x5e\xfe\x33\x26\x82\x20\x56\xa0\x89\x2c\xef\xd3\xe9\x26\xbb\xea\x80\x22\x20\x54\x20\x88\xa4\x64\x5b\x12\xf7\x5f\xa6\x6a\x36\xf4\x92\xd7\x6e\xbd\x99\xe4\xf3\x8c\x38\xd8\x93\xb9\xec\x88\xe3\xc5\x71\x6b\x8b\x59\x16\xc8\x0d\x44\x34\x08\x98\x32\x2e\x40\x6b\x5f\x07\x51\x8b\x90\x26\x98\x03\xe2\xd5\x92\x0a\xc1\xfe\x13\x3a\x58\xa7\x9f\xc0\x23\x96\x68\xd9\xf8\xc4\x14\x5f\x08\x0c\xb4\x55\xda\x0d\xd4\xf9\xe6\xd1\xb2\x3a\x57\xcf\x3a\x48\x99\x60\xc8\x6a\x1f\xec\x1b\xf5\xa6\xfc\xb9\x4a\x68\xcc\x4d\x91\x79\xaf\x3c\xbf\x9f\x1b\x75\x1f\xa2\x67\xb9\x4f\x89\x03\xb4\xae\x30\x70\xb0\xc7\xf1\x8c\x81\x19\xb4\x06\x74\xbf\x8a\xdd\xc9\x4a\x4a\x3e\x6a\x70\x09\x16\x64\x4d\xc0\x3c\x73\x37\xab\x7a\xa2\x72\x12\xf3\x1f\x63\x49\x5d\x4d\x3e\x74\x12\xb6\xce\x56\xe8\x66\x64\xaa\xb7\x3c\xff\xa1\x28\x43\x32\x40\x0a\x01\xc3\x20\x6f\xe3\x8f\x76\x4f\xca\xaa\x7c\x26\x37\x9b\xfd\x8f\x32\x00\x65\xe7\x84\xd4\x13\xb3\x14\xf1\xc2\xe2\x57\x17\xca\x4f\x43\x18\xa0\xb2\x94\x6d\xf1\x2e\xff\x6c\xf1\xbf\x9f\x69\x3d\xf4\x9f\x75\x95\x51\xf2\x5a\xbe\x3a\xf9\xdf\xc4\xd2\x2d\x19\x9e\xf1\x8a\x27\x7b\x5b\x9f\xe1\x6d\x2c\x39\x80\xc6\xbc\x65\x98\x1d\x2b\x6f\xf2\xd1\x6c\x4c\xcc\x80\xfd\xa3\x75\x0b\x22\x97\x07\x38\x05\xda\xc4\x9b\xe4\x8c\x51\x89\x51\x3c\x42\xbe\xd9\x69\xff\x21\x8e\x0a\x5b\x63\x16\x2d\x77\x80\xfb\x82\x0c\x51\x66\x87\x3c\x38\xb9\xf3\x08\x0d\x95\x87\x3c\x0a\xad\x64\xde\xc5\xa3\x87\x49\x9d\x99\xbf\x77\x0a\x95\x2d\xe6\x87\x12\x96\x1e\x65\x75\x2e\x98\x95\xe4\x90\x3c\x4a\xee\xcc\xfe\xde\x82\x80\xaf\x9f\x3f\x8d\x3c\x7e\xeb\x67\x48\x6c\x06\x9e\xc3\x39\x2c\x87\xf5\x5f\xf9\xdb\x3e\xa4\xbd\xff\xc8\x4a\xb3\x7d\x64\xa7\xbe\x96\x80\xbc\x12\xcc\x4b\x4b\x3c\x21\xf8\x21\x8f\x74\x9f\xbb\x9a\xf8\x87\xb7\x14\xbe\x3b\x69\x6c\x8f\x20\x71\x3c\x3c\x76\xb5\xca\xd4\xd8\xee\xa0\xd2\xab\x0c\xb3\xf7\x84\x89\x53\x49\x00\x40\xbf\xd0\xdf\x9a\x47\x82\x67\x2b\x37\x1b\xfc\x3d\xc9\xff\x53\x48\x3a\xbf\xc5\x5b\x27\x51\x10\x0d\x77\x66\x0d\x65\x3d\x78\xe6\xaf\x79\x2c\xb7\x8f\x18\xdc\x04\x59\x29\x53\xf9\x47\xfe\x4f\x3f\x8f\x60\xe5\x20\xe6\xf3\x60\xdd\x01\x11\x29\xe8\x88\xd3\x74\xc0\x6e\xe3\x97\xcc\xfa\x83\xb9\x3d\x56\xb2\xc2\xce\xfb\xf5\x2e\x9c\xa8\xc9\x91\x45\x49\xb3\x63\x07\xe8\x06\x28\x32\x9c\x43\xd2\x1d\x09\x36\xe2\xeb\xcb\x43\x59\x4a\xe7\xa8\x23\x82\xa4\xdf\xed\xa7\x34\xd1\x9f\x9f\x32\x73\x44\x48\x38\x54\x08\x28\x8c\x92\x7f\xd3\x41\x18\x33\xaf\x3f\x31\x02\x4e\x75\x66\xe8\x20\x00\x58\xdd\x4f\x3b\xdd\x0f\x87\xd6\x13\xf9\x96\x93\x24\xd4\xa7\x5b\x92\xce\x53\xa4\x45\x4d\x90\xa4\xe5\x26\xbf\x6e\xdd\x74\x53\x3f\x60\x52\xc2\xe2\xc4\x91\xea\x04\xd7\x96\xdd\xc1\x43\x2d\xe5\x74\xf7\x33\xde\x63\xcb\x87\xfe\x3d\xd0\x7b\xda\x01\xcb\xa2\xd2\x3b\x1c\x93\xa7\x67\x38\x28\xd4\xcd\x9c\x6c\xac\xad\x9e\xfd\x54\xff\x77\x25\x4a\x83\xc3\x63\x99\x47\xac\xef\xdd\x9b\x24\xb0\xfa\x33\x09\xfc\x72\xb4\x9d\x22\x48\x36\x49\x22\x76\xfa\x51\xfc\xcf\x1c\x5c\xff\x21\x6e\x00\x1a\x06\x96\x14\x23\x9b\x6a\xb7\xca\x00\x7c\x32\xa8\x32\xd5\x59\xfa\x02\x21\xef\x04\xa4\x4e\xd8\x54\x07\x9d\x79\x08\x4f\xe3\x42\xf7\x83\xa9\x58\xed\xbe\x8a\xf0\xff\x8f\xf3\x70\x89\x29\xbf\xa9\x28\xb3\x65\x0a\x37\x24\xfb\x70\x93\xf7\xf6\xc0\xca\xff\xa8\xe4\x23\xca\x2f\xcd\xf2\x4e\xfe\xf6\x3b\xb8\x38\x58\x9a\xf2\x09\x9f\x2b\xb6\xad\x13\xec\x1b\xb9\xeb\xc9\x18\xa9\x2b\xe1\xf3\x5f\x47\x9e\x44\xc6\x0f\x52\xc4\xe4\xa4\x2c\xde\xa2\xee\x26\x0d\xc0\x3d\xb7\xd2\xfe\x8a\x8c\x94\x31\x17\x32\x87\x7a\x00\x22\xe9\xd4\x79\x77\x9c\xc5\xd5\x7f\x2a\x5a\x69\xf0\x11\xfa\xbd\xc8\xa9\xbe\x5d\x70\xf8\xd4\xd2\x16\xd4\xff\x34\xf2\x1a\xca\xa5\x06\xca\xe0\x29\xff\xec\x0c\x79\x22\xb2\xe5\x01\xd3\xe3\x3f\xd2\xf9\xa5\xb3\x90\x51\x27\x1e\x87\x8e\x39\x62\xce\x58\x3f\x68\x68\x37\x5f\x13\xb7\x73\x2e\x44\x3a\x63\xd8\x21\x19\xf2\xc6\x71\x82\x24\xac\x0f\x97\x27\x68\xdd\x90\x93\x2f\x1f\x98\xc9\x4d\x10\x9d\x64\x6c\x70\xf8\xb8\xe5\x8a\x2f\x40\xd2\x87\x9b\x1e\x8d\xf3\x60\x53\xda\xc5\xff\x4f\x33\x8f\xbb\x7a\x92\x16\x21\x58\x7e\x92\x4f\x48\x52\x30\xb0\x6e\x26\xc5\x1b\x74\x0b\xd2\x78\xd3\x18\x63\xb2\xda\x83\x7d\xa2\xf1\xfb\x71\x1a\xfe\x7d\xf5\x26\x79\x8c\x61\xe4\x78\x23\xc7\x20\xb8\xc7\xf7\x1e\x12\x67\xa3\x0d\x25\xf9\x7f\x0c\xd3\x04\x30\x9d\xcf\x7f\xca\x10\x74\xbc\xa7\xe0\xf2\x73\x28\x3f\xde\xe3\x2d\x1b\xe7\x5b\x86\xcf\x71\xa0\x6e\x3e\xe1\xb6\xd1\xe4\x54\x3b\xff\x56\x84\xfb\x96\xd5\x21\x01\x0a\xd7\x68\x79\xed\x36\x69\x0b\x8f\x4d\xd4\x46\x03\x72\x9b\xb6\xa1\xb9\x9f\x1f\x0e\xd6\xab\xe8\xe0\x91\x0b\x30\x56\x75\x33\x20\x20\xe0\x93\x7e\x5a\xf8\xe9\x4a\xc1\x49\xfa\x9a\x83\xe9\x7f\x83\xb4\xe0\x8c\x79\xab\x07\xc8\xe0\xae\x4c\x4e\xb7\x72\xbf\xe5\x06\xdd\x96\xa6\x7d\x99\x40\x39\x22\xbd\x9e\x34\xf5\xce\xdc\xaf\xfb\x29\x23\xe2\xba\x33\x59\x1e\x20\xfe\xb7\x07\xa5\x0a\x6e\xd3\x3f\x63\x6e\xcf\xc5\xe7\xea\x6d\xa5\xba\x80\xb5\x0c\x8b\x74\x06\xc8\x3d\x0f\xf9\x6b\xd0\x01\xc3\x14\x7b\x55\x56\x31\xa6\x55\xdd\x58\xc4\x71\x89\xdf\x1e\xf4\x77\x64\xfa\xf2\x5e\x0d\x72\x9d\xe6\x04\xdb\xb8\xba\xd7\xb6\x23\xbc\x20\xfb\xc1\xd9\x44\x57\x1d\x08\xf7\xe9\x7d\x72\x5b\x10\x2e\xf4\x1c\x5a\xe8\x29\xeb\x18\x39\x74\xb1\x5d\x97\x40\x2d\x3b\xc4\x08\xb8\x61\xe9\xec\xfa\x02\x0b\x01\xa2\xca\x86\xc0\xbe\xce\xed\xf8\x09\x0b\x54\x4f\xac\xf7\xa3\xce\x50\xd5\xf7\xa9\x38\x64\x70\x92\x49\x3f\x7b\x6e\x3b\x1a\x58\x4a\x02\x58\xa5\x13\x8f\x66\xce\xbf\x8c\x71\x0a\x0b\xd0\xe7\xdc\x07\xdb\x94\x28\xc8\xeb\xcf\xc6\x1a\x3a\xd4\xd4\xc9\xf0\x81\x66\x12\xaa\x2a\x9f\xd2\x87\xc0\xa0\x31\x8e\x49\x3e\x22\x7f\xe7\x0c\xe3\x19\xdf\xc2\xfa\x4d\xb7\x7f\xa3\xd6\xcd\xa0\x42\x80\x35\xfa\xe1\x34\x6d\x9f\xac\x7a\x2d\x23\x34\x6e\xa5\x26\x70\x53\x85\x22\x75\x09\x83\xee\x56\x0d\xe1\xe6\x1f\x8a\x7f\xb7\x16\xff\x6f\x61\x94\x9e\xf4\x62\x25\xcc\x84\x32\x90\x0b\xf1\x81\x4f\xe8\x15\xac\x59\xff\x9e\x58\x7f\x8f\xe9\x60\x4e\xdf\x18\x96\x5f\x06\xa0\xc2\xec\x68\x3f\x29\x94\x32\xd2\x30\x30\x04\x08\xf4\x9e\x1a\xaa\x67\x5c\x01\x86\x13\x1e\xdd\x76\xf8\x97\x02\xc9\x21\x71\x44\xc6\xb6\x56\x62\x7a\x51\x48\x76\xde\xbf\xef\x30\xd1\x9f\x65\x4c\x2e\xf9\xe2\xa3\x65\xc7\x72\xf3\x1e\xd8\xeb\x1a\x6e\x7a\xd3\x0f\x1a\xe0\x58\x19\x83\xcf\x01\x5c\x6c\x78\xec\x3a\x6e\x5d\x91\x76\xf0\xbc\x9f\x8f\x50\xa8\x0b\x90\x50\x69\xe5\x42\xcd\x94\x81\xc6\x24\x5a\x29\x01\x3b\xf8\x67\xcb\x31\xf9\x2e\x98\x8c\x70\xe4\x0f\x73\x97\x20\xae\x2d\x3e\xb9\x53\x16\x53\x67\xb0\x7a\x43\x1c\xf0\x7b\x9a\x65\x49\x0c\x61\x03\x22\x12\x1b\xa1\x64\x30\x6b\xf2\x6c\x40\xad\x98\x42\x45\xe0\x0e\xdf\x0c\x6f\x70\x42\x6a\x01\x2e\x3f\xec\x3e\xd3\xd6\x2f\x60\x77\xcf\x35\xac\x0b\x69\x3e\x5a\xd5\x3a\xbc\x09\x61\xc8\x5d\xd5\x02\x0c\xad\x7c\x6f\x32\x92\x06\x89\xb2\x0c\x6e\xbb\x23\xd1\xbd\x21\x32\xbf\xc0\x20\x7e\x06\xcf\x1f\x43\x99\xb8\x18\xcc\x3a\x06\x11\xdb\xc6\x08\x2e\x30\x46\xfc\xa2\x09\x71\xcb\x77\xe7\xfe\x0d\x31\x85\x01\xf0\x93\x4d\x58\xcf\xdf\x11\xca\xa5\xc9\x64\x48\x25\x74\xfd\x03\x66\x19\x85\x50\x82\xa0\x86\xb3\x83\x2c\xf4\xa0\x82\x50\xb5\xfd\x30\x48\xe0\xe0\x1b\xd2\x04\x1f\xc9\x1c\x84\xeb\x7a\xfd\x2c\xd2\x17\xe8\x66\xe0\xef\x30\x0c\xbf\xa4\x53\xc0\x74\x48\xaa\x24\x04\xf0\xf2\xea\xea\x10\xf5\x54\x78\x17\xdc\xa7\x38\x50\x93\x3a\x81\x54\xef\x0c\x74\x89\x89\xba\x87\x50\xc3\x1e\x3a\x0a\xa2\xff\x5b\x69\x5f\x2b\x57\x45\x6e\x18\x90\xce\x23\xe9\xde\x21\x26\x60\x06\xb1\xda\xc3\x03\xbe\x5a\x37\x81\x6f\x5a\x9d\xd3\xe8\xe5\x53\x06\x24\x43\xd5\x14\xfb\x10\x8e\x33\x43\xb5\x6e\x74\xdd\x29\xb9\x40\x21\x80\xda\x15\x1b\x94\x03\xe9\x52\x0a\xdc\x7a\x05\xb5\x94\x28\x85\x02\xc6\xca\x40\x9f\x95\x5b\xfc\x0b\xef\x35\xef\x00\x30\x9c\x84\x80\xf5\x56\x89\x13\x39\xfc\xac\x57\x6d\x3c\xca\xff\x28\x29\x04\x32\x0c\xf1\xbe\x3b\x19\xf2\xce\x32\x38\x2f\xcf\x78\x3f\x3c\x49\x99\xc7\x11\xd7\x6f\x98\x91\x78\x4e\xda\x3d\x12\x2d\x63\xba\x7a\xc8\xaf\x50\xb9\x70\x7d\x86\xbe\x1a\x75\xa7\x34\x16\x2e\x25\x8b\x43\x83\x41\x65\x8f\xa3\xba\x1c\x83\xbc\xc9\x35\x99\x01\xc1\x85\x10\x6d\x30\x24\xb5\x87\x5d\xd3\xa5\x86\xf8\xf6\x59\xc9\xa9\x47\x43\xfa\xf1\x19\x93\xe7\x7c\x29\x40\xa0\x90\x78\x02\x75\x8c\x07\x28\xa3\xb3\xb6\x88\x69\x3d\x07\x5c\x23\x62\x3a\xda\x71\x6e\x0c\x56\x92\xae\x81\x5d\x1f\x94\x3c\x5e\x92\xc6\x49\x86\xbc\xd7\x25\xc4\x03\xa6\xaf\x12\x00\x06\x3c\x40\x59\x90\x5b\x97\x4c\x8e\xe7\x4d\x9a\x07\x67\x7c\x0b\xe9\xe4\x1c\xeb\x90\xba\x30\x09\x94\x14\xa8\xd7\xd0\xe2\xed\xa4\xbb\x4e\x98\xb4\x93\x7c\x52\x03\x52\x1f\xc5\x9a\xa2\x5d\x7b\x2d\xf3\xcd\x91\x92\xbb\xa0\xb3\x9c\x52\x38\x99\x87\xb5\x00\x90\x76\x48\xf2\x55\xdf\x1f\x45\x57\x85\x04\x11\x6e\xb4\x6e\xe1\x80\x4e\xc5\x0b\x1c\xe7\x0a\x39\x55\xa8\x33\xe8\xeb\x02\xe3\x73\x95\x3c\x83\x3e\xf8\x54\xa4\x3b\xa1\x20\xdb\x90\x74\xcc\x89\x53\x39\x06\xc2\xdb\x7d\xe2\x33\xe3\xdb\x4c\xa4\xaf\x0f\x8a\x0e\xff\xc1\x37\xfd\x1c\xbd\xad\x4a\xaa\x57\xd2\x7d\x46\x0a\x5a\xba\x7b\xac\x2c\x85\xfe\x6b\x02\x13\x4c\xc6\x15\xe9\x5c\xde\xa1\xd1\x00\x73\x2f\x07\xad\xae\x01\xa9\x48\xa0\x4e\x0b\xa5\x92\x74\x0e\x1b\xb6\xb0\xe1\x4e\xfb\xa5\x14\x7d\xc8\x82\x69\x15\x38\x3a\x54\x5c\x60\x7a\x82\x12\x6e\x6b\x87\x04\x48\x11\xe2\x0e\x53\x4b\x7e\x08\xa4\xed\x51\x6c\x21\xcb\x0f\x3d\x0e\x0e\x3e\x14\xff\xb5\x52\x6b\xcd\xca\x3a\xc4\xef\x84\xe5\xaa\x87\xd2\x12\xb2\xd2\x46\x66\xc9\xd8\x6f\x3c\x98\x51\x8c\x0e\xc0\xc6\x6c\x7e\x0c\x54\x5c\x07\x03\x66\x02\x3c\xe0\x72\xf0\xf7\xf5\x80\x43\x2a\x7c\x63\xd2\xf3\xa3\xf6\x06\x2c\x20\xf9\x74\x62\x50\xe3\x69\x73\x00\x7a\x63\xd2\x48\x52\x9b\xdd\x94\x97\xf4\x2a\xac\x1d\x51\x99\xe6\x24\x1a\x3d\x12\x0a\x71\x0d\x5f\xa7\xbd\x37\x47\xd9\x9b\xa8\xef\xad\xa8\xdb\xf7\xde\x24\xfe\xf4\xbd\xd7\x9b\xb6\x16\xdf\x7b\xf0\xd7\xe3\x5b\xe5\x86\xfb\xb5\x16\x4e\xdd\x8c\x6f\xe9\x33\xfd\x5f\x97\x81\x97\xe8\x02\x66\x3f\xa5\xca\xe0\x71\x85\x6f\xfe\x79\xad\xdf\xa1\xc7\xb0\x85\x34\xf2\x17\xf1\x45\x3f\xeb\xe7\x3e\x9d\xf0\xfe\xb9\xee\xc4\xaa\xef\xc3\x2e\xc7\x07\x06\x5c\xba\xc8\x4f\x96\x30\xe0\x27\x9d\x1c\x5b\x7d\x48\x1c\xfd\x28\x53\xe9\xe3\x9a\xc4\xd4\x5e\x18\xbb\x5e\xcf\xfb\xc3\xdc\x94\x37\xd3\x56\xdf\x61\x33\xe8\x31\x18\x11\xf6\xc1\x71\x67\x3f\x04\x30\x49\x4e\x21\xd2\x74\xdf\x1e\x0f\xf7\xa8\xfe\xdb\x55\x79\x9f\x5d\x8e\x61\x9a\x53\xe8\x31\x4c\x7d\xeb\x55\xea\x3e\xef\xfa\xf7\xcb\x9b\xb7\x85\x51\xc6\x0e\xef\xca\x80\xdf\x7b\xad\x53\x57\x6d\x7f\x97\xff\x5d\x99\x2a\x05\x7e\x59\xe1\xbb\x6e\x4d\x91\x73\xf9\x23\xc0\xf5\xee\x3a\x01\xf0\x89\x69\x5d\xad\xbb\x33\x0a\xdf\x65\x97\x39\xfb\x9e\x7b\x02\xd2\xdb\x93\xbd\x1d\xac\xd7\xa3\x4a\xcb\x01\x73\x8a\x2d\xcc\xda\xd7\x55\x66\xed\x2b\xf3\x34\xdc\xe8\x9d\xd7\xb0\x30\x4a\xf4\xee\xc4\x54\x20\x2f\x7e\x96\xe8\x85\x26\x79\x0e\x35\x3b\x09\x5d\x85\x30\xac\x9f\xdd\xb1\x5e\x3f\xca\x16\x42\x2a\x01\x50\xb1\x3c\x60\x0c\x73\x8e\xda\xb7\xd2\xd9\x80\x7c\xfc\xd9\xd7\x0f\x85\xaa\x09\x73\x0e\xf5\x05\x8f\x51\xf2\x01\x64\xa7\xd7\x2e\x82\x49\xce\xf2\xed\xfa\x27\xdf\xea\x6d\xd7\x12\x36\xf5\x98\x38\x95\x60\x42\x34\xf7\x5d\x15\xf6\x2d\x15\xab\x37\x9a\xdf\xa2\x88\xed\x3b\x4f\x59\xfa\xa1\x6f\x24\x1e\xf9\x35\x06\xfd\xf7\x6d\x15\x96\xd4\xd0\xdf\x64\xf0\x4b\xaa\x61\xbd\x64\xa0\xef\x4f\xec\xc4\xf4\x23\x97\x86\x48\x60\x7b\x5b\x5d\xe0\x83\x5c\x00\xa6\x49\xbd\x15\x99\x7f\xa7\x42\xc7\x71\x03\x30\xb0\xe5\x1b\x1d\xea\x58\x06\x7e\x6f\x4c\x7a\x8a\x2c\x01\x27\x56\xe7\xf9\xdf\x9f\xf8\x84\x5e\x37\x87\xe0\xaf\x7b\x8d\x15\xfd\xf3\x7a\x61\x1a\xba\x11\xac\x32\x78\x03\xec\x52\xcc\xaf\x6a\x75\xe8\x33\xdb\x98\xe7\xe9\x4b\x21\x97\xf3\x5a\xe5\x4d\x2f\xfd\x99\x57\xb9\x34\xb0\x85\x30\x04\xe9\x93\xaf\xa2\x7c\x55\x03\x89\xcd\xd2\xab\x50\x8d\xe8\x55\xc2\x4b\xe5\xe5\xd2\x21\xae\x34\x81\x6e\xd0\x21\xaa\x9d\x2f\x84\x41\xbd\x0e\xa2\x13\xc9\xbc\x1d\xb3\xf2\x0d\x34\x3a\x2e\xd8\x5b\xef\xdc\x0a\x64\x7d\x51\x84\x21\xef\x2c\x34\xe3\xfe\x12\x3f\x04\xde\x75\xaf\x10\x5b\xa8\x2d\x44\x22\xf6\xd5\x5b\x36\xe8\x39\xe4\x2e\xd8\x90\xdb\xbb\x72\x1e\x51\x52\x0c\x88\x34\xc7\x92\x6d\x78\xbf\x7e\x9b\xee\x43\x3d\x03\xeb\x5b\xa0\xd5\x3c\xc1\xb0\x46\x8a\x29\x24\x1a\xba\xf3\x7d\x52\xed\x8c\x80\x96\xd4\x2e\xd2\x1a\x52\x0e\x2b\x3d\x3b\x5e\x29\x56\x48\xda\x22\x69\x2c\x80\x69\x53\x5a\xcf\x43\xe8\xd3\xef\xc4\xdd\xac\x07\xe1\x6d\xc6\xbd\xeb\x79\x42\x3a\x56\x0e\xf5\x4e\x8f\xab\x8a\xb4\xde\x91\x7a\x71\x89\x98\x7d\x41\x52\x31\x8c\xeb\x93\x62\xa9\x36\xda\xdb\x95\x62\x60\x6d\xae\xdf\x41\x7f\xd2\x61\x53\xef\x95\x31\x64\x1d\xe4\x60\x1f\xa2\x72\x86\x24\xa5\x60\x63\x29\xfd\x6b\x70\x0d\x69\x00\xd6\xd8\x17\xdc\x77\xf3\x3b\xb0\x07\x55\x31\xff\xc5\xdd\x72\xa8\xde\xc3\xc9\x3e\x2b\x5f\xef\xf2\x71\x52\x23\xfa\x1f\x8b\x9b\x8a\x11\x6a\x86\xa0\xb6\x17\x1b\xa8\x9a\xbd\xac\x3e\x5e\x43\x2a\xc2\xde\x6c\xbc\x5b\x27\x97\xf6\x70\x8f\xb3\x82\x9b\xc2\xa3\xb5\x0a\xa9\xcd\xbf\x20\xbc\xc3\x1d\x38\xad\x07\xb2\xb9\xa7\x45\x5d\x52\xe4\xb9\x68\xd9\x7b\x39\x25\xbb\x7f\x96\x57\x39\x10\xf5\x77\xc1\x07\x9f\x9e\xea\xb6\xf0\x98\xc0\xfb\x10\x70\x96\xe2\x9a\x3f\xcf\xee\x8f\x3f\x93\xb3\x27\x8f\xab\xcb\xe7\x34\xd2\xf4\x5f\xe8\x4e\xe8\x18\x33\x02\xcd\xd2\x95\x80\xcf\xbe\xce\x39\xc7\x25\x79\x62\x86\x03\x48\xa2\xf0\x48\x79\x08\x33\x7c\xf5\x63\x61\x1d\xc9\xff\xe5\x37\x27\x8b\xae\x7c\x53\x7e\xc9\xc6\x85\xba\x69\x98\x0f\x1b\x42\x29\x23\x47\x08\xe6\x82\x88\xb3\xbe\xe2\x4b\x0f\x8d\x5d\x8c\xeb\x37\xfb\x72\xd9\x18\x2c\x32\xa8\xae\x4c\x83\xe5\x2b\x5d\xfe\x29\x5f\xd6\xe5\x55\x34\xfc\x52\x0f\xe0\x0a\x95\x57\x98\xb0\x8b\x34\x72\x59\x27\xc8\xbb\x78\x97\x5c\x89\xaf\xa4\xae\xc7\x95\xfc\xeb\x3a\xbf\x9f\x69\xed\x6a\x13\xdf\xda\x55\x28\xaa\x34\x22\xac\xba\x9e\x18\x65\x30\x18\x9e\xd2\x56\xa1\x3b\x5f\xf7\x9d\x64\x63\xfd\x0e\xab\x8f\xf3\x96\xb1\xcb\x79\x37\xa5\x1d\x9c\xe4\x10\x42\xc2\x94\x9c\x5e\xb8\x14\xef\x0c\xde\xbb\x04\x05\xc1\xd6\xdd\xe9\x4e\xda\x83\x42\x94\xa2\x88\xd4\x7b\x3f\x1e\x51\xe9\x9f\xf7\x40\x7d\x85\xcf\x28\xf7\xfd\x89\x26\x34\x70\xdf\x27\x43\xdb\x6d\xf8\xbb\x0e\x05\x39\x31\xee\xb7\x1f\x4d\x98\xcf\xc8\x8d\xe4\x1c\xe3\x63\xa1\x64\x44\x50\x75\x4f\x11\x9a\x2f\x1b\x1b\xd9\xfd\xa3\x1e\xc2\x05\x36\xd7\xbd\x08\x4e\x29\xcc\xf5\x8f\x30\xea\xaf\x21\xf0\x60\xe8\x51\x08\x72\x88\x42\x54\xb0\xcd\xc2\x4f\xdc\x25\x2c\x74\x75\x05\x42\x39\x55\x38\xec\xd9\x2f\x10\x0c\x3b\x67\xff\x2a\xcf\xd0\xaa\xc0\xa0\xb6\xc8\xfc\x1f\x33\xed\xaa\xdc\xac\xfa\xba\xb5\x45\xbe\xbb\x9d\xff\x2d\x61\x85\x2b\x1f\x57\xac\x3b\xf6\xfe\xac\x5d\x0d\x23\x2e\x23\x44\xbb\x69\xfb\x1f\xbe\xe6\x57\x24\xf5\xc0\xef\x47\x02\x1b\x99\x29\xa3\xf6\x9e\x7c\xe2\x7f\xe9\xa6\x12\xad\x21\x5d\x5b\x3a\xe9\x63\x7f\x71\x06\x09\x65\x1c\x1f\xc9\x65\xbc\x75\xc8\xfb\x95\x24\xca\xf5\xcf\x84\xb6\x2d\x6c\x1c\x5e\x19\xa2\x3e\xc0\x85\x86\x39\x9e\xa7\x1a\x69\x03\xe3\xcc\x68\xda\xf9\x7f\x77\x9a\x1a\x09\x5e\xa7\x53\x52\xc3\x9f\x08\xca\x1a\x4f\xaa\x5f\xc0\x72\x60\xd3\x3b\x7d\x74\x59\x86\x23\xf1\x4c\xf5\x55\xc7\x4a\xc1\x93\x7a\x23\x4a\x90\x08\xc9\x5a\x3a\x91\x7e\xda\xf4\xc6\x56\x19\x91\xd7\x9d\xa3\xf9\xd3\xfa\xb4\x94\xc5\x60\x24\xe9\xdc\x31\xff\xe1\xff\xd9\x14\x17\x82\xce\x05\xe7\x04\x5d\xf1\x42\xda\x17\x59\x9c\x6d\x48\x81\xfe\xd4\x2d\xea\x4b\x1e\x45\xa7\x7b\xf3\x6a\xb5\xf5\x8a\x9b\x46\xb4\x86\x17\xde\x8a\x45\xa3\x3c\xb7\xfb\xbf\x42\x91\x22\x44\x1f\x4f\xb0\x1f\x59\xc6\x0a\x58\x63\xee\x1d\x25\xc1\xcd\x9e\x02\x0f\xb3\x4a\x41\xe8\x2c\x91\x2f\x67\x43\xd4\x07\xdb\xdb\xb3\x4c\x22\xe2\xcf\x37\x7e\xcc\x4f\xda\x64\x8e\xc7\x6f\x40\xd2\x24\x33\x0d\x4a\x50\x26\x99\xfd\x17\x59\x32\xbb\x30\x05\x4b\x79\xfb\x43\x9f\xec\x24\x9a\xe2\xb9\xcc\xd1\xf5\x35\xb4\xbe\x24\x93\x81\xd7\x92\x0f\x79\x06\x6b\x80\xf1\x7d\x48\x5a\x8c\xad\x4a\x34\x23\x5d\xda\xc0\x9d\x48\x42\x5f\x65\x86\x00\xaa\x84\x02\xe6\xf0\xdd\x3d\xb3\xf4\x55\x0d\x3c\x92\x7e\x8b\x55\xdb\x92\x67\x41\x55\xcd\xc8\x06\xa0\x17\x87\x0d\xf5\x54\xf1\x59\xfd\x45\x71\x8a\xf0\xb4\xc7\x00\x94\x1b\xaf\x8c\x66\x9e\x90\xcc\x6f\x8b\x10\x8b\xf2\x3c\x43\x12\x83\xda\xb2\x67\x2e\xcc\xaf\x39\xd1\x6d\x56\xf5\x90\xbb\x0b\xf9\xe9\x93\xf3\xe7\x15\xc3\xd0\xae\x89\x7e\xe2\x73\x94\xca\x45\xe5\x2c\x27\x08\x41\x92\x46\x33\xf8\xe4\x80\xc9\x10\xc9\xfb\x90\x65\x95\x67\x15\xe0\x3a\xd5\x30\xda\x7f\xbb\x50\x60\xe0\xa8\xb0\x20\x97\xd1\x11\x33\xab\x0d\xdd\x76\x43\xbb\x5f\x18\x96\x31\x7b\x4c\xd8\x6a\xb8\xfe\x5b\x7d\xfb\x8a\x0d\x5a\x19\x3a\xa4\xcb\x9f\x23\xe8\x61\xd7\x33\xb6\x4f\x3f\xad\x8d\xfa\x8f\x76\x45\xa5\x08\xbd\xa3\x55\x67\x41\x3a\xd4\x0f\x7b\x72\xf6\xfe\x5b\x22\x82\xc9\x6f\x1c\x6f\x63\x7a\x80\xe7\xe8\xf1\x01\x43\x4e\x03\xfd\x8c\x78\x53\x31\x77\x88\xac\xf4\x90\x1d\xc1\xb2\x0e\x14\x13\xe1\x80\x43\x21\xc8\x21\xa8\xa1\xce\xac\xa3\xe1\x87\x08\xd2\xbd\xfd\xa3\xc1\x61\xdd\xe4\x2e\xc3\x81\xd6\xd7\xa1\x55\x26\x12\xfc\x71\x98\x45\x6b\x3d\xd1\x43\xf3\xd2\x6a\x0e\xe9\x66\xdc\xd2\x07\xf1\xe4\x2d\xfe\xb3\x61\x3a\x9a\x8d\x2b\x72\xdc\xbd\xe4\x43\x42\x82\x8b\xe6\xa1\x1c\x6b\x23\xa0\xe8\x91\x9d\xae\x61\x4a\x30\xbd\x58\x51\xbb\xc0\x5a\x5a\x03\x0e\x1d\x82\x68\x39\x6a\x13\xef\x5f\x14\x1e\xc2\xde\x72\x2a\x47\x1b\x3c\x43\x96\xf0\x84\xa6\xfc\x49\x90\xf4\xed\xc1\x14\x9e\x25\x7c\x23\x75\xfd\x6a\x02\x92\x64\x5f\x30\x12\x61\x43\x91\xb2\xc6\xda\x67\x9a\xca\xff\x79\x39\x50\x4d\x12\xba\x1e\x2b\xe9\xee\xed\xf3\xe4\x34\x22\xa6\x43\xd8\x37\x69\xf7\x3e\x52\xa8\x83\x4d\x17\x4a\x3f\x7f\xb3\x9a\x7b\x64\xd6\x6a\xbb\xd9\x4b\xb6\x72\xb8\x3d\x60\xd8\xee\x69\xe5\xe9\xda\xcd\x0f\xd2\x85\x3e\xe8\xca\x6f\xdd\x8a\x93\xe3\x63\x9f\x46\x61\xf3\xd3\x14\x28\x6f\x77\x27\x81\xb4\x5b\x8d\x64\x43\x3d\x28\x69\x0b\xa4\x42\xef\xd4\xf6\xf8\xf6\x26\xd7\x70\x64\x74\x20\xcd\x9c\x5b\x56\x1a\x86\x34\x70\x2d\xd2\x4b\xa9\x7b\xb6\x34\xa5\xb8\xc8\x6a\x63\x07\x8a\x67\xc0\x81\x64\x95\x98\x88\x75\x10\xaa\x34\x43\x4e\x85\x0c\x0d\x49\xee\xa2\x9e\x4a\x77\x04\xda\x31\xd7\x4c\x4d\x90\xa6\x73\xad\xeb\x27\x4e\x2f\xc1\xc8\x56\xff\x32\x77\x2d\xf2\x0a\x6d\x95\x29\xfa\xad\x3e\x25\x60\x42\xa3\x28\xfb\xd2\x6d\x54\xa2\x13\x4e\x55\x35\x92\xc1\xde\x07\x37\x9c\xa2\x94\x28\x09\x69\x40\x10\x25\x11\xdb\xab\xd5\x01\xfd\x5c\xef\x50\x37\x97\xb2\x8f\x7d\x93\x34\x45\xec\x17\x2a\xc6\xef\x72\x77\x11\x20\xc5\x42\xbe\x2a\xd7\xbb\x4a\x0a\x65\x38\xca\x3f\x5a\x57\x2d\x9a\xbc\x16\x5d\x27\x9f\x1f\x57\x57\xae\x05\xc3\x12\x8a\x26\x5e\x4c\xfa\x39\x76\x45\x7a\x94\x86\xfa\xb1\x34\xcb\x61\xdd\x59\xbf\x0d\xb3\xfa\x3d\x36\xa0\xe5\x5e\x9a\xa8\x6a\x99\x3c\xec\xe6\xb4\x0d\xdd\x43\xb9\xa3\x34\xf7\x4a\x51\xda\x32\xc4\x4b\x7e\x59\xc3\x58\x9a\xc9\x6e\x02\xd4\x75\xe7\xf2\x38\xf7\x8f\xf4\x5e\xf2\x2c\x2a\xb0\xfc\xf1\x60\xd0\xa5\x90\x85\x8d\xee\x1e\xcc\x7e\x6c\xa1\xf0\x03\x61\x13\xd2\xda\x9a\x4b\x2d\x37\xa1\x50\x44\xc1\x04\x51\xa5\xe4\x8b\xe3\xc4\x0d\x30\xc9\x5e\x5f\x39\x16\xf6\x8e\x02\xe8\xc7\x51\xd5\x18\xfe\x25\x7e\x37\x5c\x76\x59\x3f\x36\x5d\x4a\x7e\x6c\x52\xe0\x69\xe9\x74\x11\x1d\xf4\x53\x78\xaf\x9c\xc9\x45\xd9\x94\xad\xf0\x00\xdb\x44\x99\x9e\x14\x75\x66\x4b\xe0\x52\xe4\x8d\x5a\x26\x4f\xda\x68\x34\xd5\x19\x90\x90\xe0\x97\xca\x0c\x59\xd0\xb2\xf4\x06\x52\xae\x9e\x7b\x0d\x10\x08\x66\x7f\x12\x81\x66\xce\x6c\xff\x9f\x4f\x13\xb5\x8d\x52\xef\xb6\xe4\x3f\xe1\xff\xd0\x4f\x16\x61\xd2\xb0\xc6\x31\x86\x28\x4c\xa1\x68\x3d\x84\x52\xfc\x02\x0e\x5a\x4c\x5b\x5f\xa0\x70\x46\xfe\xb8\x5d\x54\x82\x5b\x59\x8d\xe4\xaf\xbc\x01\xf1\x12\x0e\x17\xfe\xa9\x44\x24\x18\x41\x2d\x45\xea\x21\x4d\xfe\xb8\x47\x88\x08\x1f\x78\x55\x62\xcf\xf4\x5e\x59\x6a\x30\x79\x54\xce\x63\x1f\x4e\xde\xf7\x43\xd5\x97\xfe\x63\x1d\x9f\x26\x05\x95\xfc\x1f\xf5\x52\x62\xa7\x26\x3d\x8d\x1a\x59\xf2\x47\xa5\xdf\xf0\x01\x03\x8b\x26\xdf\x74\x5f\x50\xc9\x62\x84\xdf\x54\xee\x72\x2a\x5b\xde\xb9\x13\xf4\x89\x6f\x9e\x9d\x04\x91\xc3\xda\x65\x3e\x84\x03\x41\x2e\xcd\x65\x1d\x56\x25\x44\x4c\xe4\x40\xab\xeb\xbb\xac\x32\xc0\x3e\xdc\x9e\x97\x3b\xad\xe0\x00\xc7\xc7\x6b\x4b\x45\x6b\x23\x56\x7a\xe0\x56\x8b\x64\x74\x94\x9f\x9d\xbc\x61\xe4\x46\x50\x58\x06\xf4\xb6\x90\x6c\xb1\xc3\x51\x9c\x65\xe7\x68\xd9\x00\x95\x2d\x01\x3c\xe0\x6f\x40\xb7\xa7\x88\x1b\x71\x78\x96\x28\xff\x07\xc3\x57\x9e\x2c\xfa\x54\x47\xd1\x0f\x2c\x5d\x6b\xa5\x30\x6d\xc5\xf5\x5d\xf8\x5c\x91\x50\xcb\xad\x1e\x1c\x1f\x1e\xf9\xfb\x65\xbe\x04\xd5\x5b\xfe\x95\x6f\x89\x93\x65\xc8\x53\x3a\xb0\xae\x80\x02\x2a\xd6\x55\x56\xbe\x07\x10\xeb\x17\x43\x22\x49\x02\xed\x02\x4c\xa2\x02\x45\x75\x0d\x95\x97\x36\x96\xc7\xcd\xb3\x1f\x52\x57\x81\xf2\xcb\xff\x02\xf0\x65\xb4\xea\x48\x71\x98\x23\x6f\x1c\xb9\x1c\xd9\xab\x66\x2b\xd4\x71\x36\x04\xe5\xd2\xcf\x7f\x52\x8a\xd1\x46\x34\xf0\x05\xc8\x50\x00\xe1\x31\xd6\xb2\xe8\xfc\x7a\xfa\x79\x88\x11\xc2\xa1\x98\xf3\x61\xef\xb3\x22\xfa\x87\xe7\xea\xfb\xf7\x79\x84\x67\x9b\x01\x7c\x8b\x39\x04\x64\xe4\xc4\x6e\x40\xdf\x48\x3a\x95\x2c\x71\x58\xef\x97\xed\x3e\x84\x07\x02\xf4\x35\xca\xbe\x70\xc4\x1d\x1b\x5f\x39\x65\x92\x1c\xe9\x40\x8e\x83\x24\x64\x90\x1a\x7a\x49\x6f\x06\x59\x7a\xbb\xb6\xd9\xa5\x5f\xb3\x4f\xba\x8c\x0d\x4f\x3a\x13\xda\x2e\xb7\x74\x69\x36\x9d\x63\xbd\x4f\xee\xc8\xd4\x90\x43\xd5\xd2\x11\xd4\xf1\x23\xfd\xe3\xd5\x5f\xbf\xd2\x96\xb2\x5a\x2a\x22\x5e\xa8\x7d\x43\x9a\xb3\xc2\xf0\xc1\x5f\x0b\xc4\x26\x9b\xb4\x53\xe0\x0e\xee\x5b\x9e\x19\x5c\x0d\x57\x74\x39\x39\xc0\x82\x9e\xaa\x57\x29\xb5\x6d\x12\xec\xaa\xcd\x9e\x49\x3f\x61\xb3\xaa\xb9\xb0\x8e\xb1\x77\x8c\xf5\xb4\x81\xae\x73\x63\x75\xa6\x78\xec\x15\xc9\xc7\x34\x34\xb1\x0f\x09\x63\x4b\xca\xd8\x48\x38\x66\xab\xf3\xbd\x33\x75\x13\x2d\xc9\xf6\xdf\x4f\x8e\xc6\xdf\x5d\xab\x29\x5e\xc8\xed\xf6\x43\xf1\x1b\xb3\x2f\x37\x12\x91\xeb\xc2\xf7\x0f\xba\x33\xbf\xd9\x85\xea\x33\x10\x14\xa1\x51\x87\xa2\x32\x4d\xb2\xda\x6d\x3c\x25\x10\xf3\xbd\xa9\x17\xc3\xf3\xec\xbf\x51\xb3\xd5\xf5\x95\x93\x09\x7b\xed\x74\x5e\xc4\xa7\xa9\x9c\xb6\xd7\xda\x18\x9f\xdb\xab\x33\x3a\x95\x92\xb1\x87\x71\xd6\xfe\x57\x17\x74\x44\xf6\xf2\x65\xfc\x77\x2f\x6f\x4a\xc4\x78\x25\xbb\xff\x78\xa0\x7b\xd9\xfc\xed\x46\xfb\xa4\x00\xe9\x5e\x34\x7e\x71\x0d\x99\x4a\x30\xb3\xa7\xba\x17\x4f\x70\x00\x42\xda\xf8\x7b\x27\x62\xb7\xd2\x00\x83\xda\x3b\x06\x4c\xfa\x91\xf9\x16\x51\xc4\x90\xe7\x80\xbf\x65\xdd\x6a\xcd\x90\xa6\x86\x76\x75\x34\xf6\xfc\xa7\x8b\xca\x88\x38\xf0\x5f\x1c\x3b\x6a\x41\xa2\x2b\xfb\x8f\x06\xba\xa7\x97\xcf\x4c\xed\xfc\x22\x91\x01\xff\xd1\x3f\x76\xa6\xe3\x40\x78\x66\xe3\x5e\xcc\x6a\xb0\x92\x52\x37\x53\x68\x02\x5b\xe5\x3f\xa6\xd0\xa4\x89\x0a\xc2\xa0\xe2\x19\x86\x64\x5d\x0d\xa9\x9a\x4b\xd4\x4f\xc8\xd4\x50\xc8\xc1\xde\x9e\x77\x4c\xb3\x41\xb4\x46\xbb\x93\x8c\x0e\x77\x9d\x3e\x1a\xb3\x05\xcc\x57\xed\x84\x63\x92\x16\xc7\xed\xcc\x2b\x6a\xe1\x8c\x74\xbf\xd8\x90\x90\xa9\x0e\xf1\x86\x1c\x4c\x8a\xcb\x30\x85\x7b\xab\xed\x95\xb8\x02\xd2\x42\xfe\x1e\x6e\x54\x98\x85\xbb\xf8\xc9\x32\xb4\x36\xaa\xbc\xe0\x91\x7c\x21\xe7\x86\x2d\xb4\x10\x00\x42\xab\x9d\x52\x38\xfa\xb7\x4c\x4e\x37\xbc\x69\xa2\x4a\xb9\xe7\xca\x5f\x0d\xf4\xa4\x48\x4c\xdd\xaf\xf8\x6f\x24\xe5\x1a\xec\x57\xbe\xd3\x0e\x62\x43\x1e\x6a\x12\xd2\x39\x66\x6e\x91\x67\x26\xa1\x39\x92\x72\x45\x9d\xc0\x29\x8a\xcb\x9a\x12\xde\x06\x62\x26\x8d\x6f\x95\xae\xe5\x5b\xf9\xa4\x59\xd2\x14\x98\x69\xf2\x6d\x4a\xd4\xaa\x6e\x28\x77\x12\xa8\x12\xde\xca\xa6\x35\x9a\xec\x34\x30\xb4\xd0\xeb\x89\x2c\x83\xad\xc0\x90\xfd\x4f\xdf\x83\x2d\x25\xef\xbb\x6d\x59\xbd\xaa\x2d\x5f\xa1\x37\x13\x52\x8c\x86\xa8\x27\x64\xdd\x18\x65\xb9\x00\xfe\x4b\xa7\xb3\x65\x0c\x12\x78\xb7\xb2\xab\x8f\x52\xd0\xa6\x9d\xec\xb8\x6d\x9a\x33\xdf\xa4\xc6\xb0\x41\x5c\x8b\x2b\x56\xc6\xb1\xb6\xb0\xe2\x32\xf0\xe0\x95\x94\xd0\x70\xd8\xf2\x13\x55\x1b\x77\x7c\x86\xc2\x4c\x8e\x8e\xf5\x96\xbb\x46\x8e\x2a\x4b\x7b\xe3\x18\x8a\xdf\xa2\xa7\xbd\xe5\x98\x3e\xdf\xfa\xfe\x4a\xc6\xd8\x6c\xc4\xc3\x29\xdf\x6d\x3c\x22\xe2\xb4\x45\xb6\x2c\xf4\x6f\xac\xca\x3c\x4e\xe1\xa2\x09\x9a\x6d\x7c\xba\xb8\x82\xf4\x69\x9e\x5d\x29\x64\x7c\x32\x8b\x79\x1b\x11\xb8\xf1\x1f\x3f\x7a\x5a\xf5\x46\xd8\x34\x29\xe6\x70\x5c\x42\xfc\xc6\x7a\x09\x64\x94\x41\xcb\xa6\x66\x01\x77\xb3\x8a\xb5\xe9\xb1\xc6\xd6\x3f\x0d\x9f\x91\x86\x9e\xdb\x98\xee\x95\x1f\xce\x88\x77\xca\x0f\x90\xac\x47\x33\x52\xb6\xe4\x73\xdd\xc3\x40\xc9\x15\x8d\x89\x0c\xf0\xd1\xdb\xb0\xa0\xeb\x2b\x19\x9e\x25\xe1\x72\x5d\x1a\x34\x39\x4c\xda\xd4\xba\x10\xa1\xd2\x82\x89\x65\xeb\xf0\xbf\xba\xee\xcd\x15\x93\xa6\x1b\x4c\xb6\x46\x49\xd6\xc4\x8b\x05\x3f\xc1\x96\xf6\x90\xb7\xb1\xce\xd0\x57\x50\xfb\xb8\xe1\x56\x0a\xe1\x9a\x7f\x8f\xd6\x9a\xae\x09\xea\xb7\x3a\x40\x0d\xf1\x1c\x10\xf0\x84\xe8\x5d\x08\xb1\x9b\x8b\x97\x64\x3d\x75\xa9\xde\x64\x0e\x55\xa5\x6f\x23\x35\x9b\x36\xf0\x43\x87\x6d\x4a\xc8\xdf\x24\xf2\xb6\xb7\xc4\xfe\xbf\xd5\x34\x76\x76\x65\x03\xba\xec\xcd\x19\x80\xe5\xb3\xeb\xe0\x3c\x7b\x30\xde\xbd\xba\x75\xa1\x9b\xee\xd6\x5a\x25\xa6\x63\x77\x9a\xdd\xc5\x2d\xf5\x1f\xf8\x37\xce\x8d\x69\x2f\x1b\x06\x54\xbc\x80\xdf\x97\x9d\x9c\xd2\xea\xc8\x67\xfa\x79\x09\x93\x8e\x3c\x7a\x04\x8b\xb0\x54\xd6\xcc\x88\xb7\x3f\x93\x50\xa8\xee\x20\x9d\x99\xeb\x68\x63\xb8\x7e\x86\x90\x25\xb9\x5f\x01\xd8\xf5\x47\xd9\x68\x9e\xb6\xde\x87\xff\xf8\xf5\x5e\xc2\x83\x1e\x32\x36\x6f\x7f\xed\x56\xab\xd4\x3b\xcb\x00\x02\xd7\xa3\xe4\x83\xd6\x6a\x4d\x3b\x14\x61\xaf\xff\xa4\x64\x23\x25\x9c\xea\xc2\xe3\x8e\x34\x85\x04\x5e\xb8\x54\x40\xa0\x5a\xc3\xbd\x77\x89\xd7\x6c\x4a\x0b\x5e\xad\x33\x92\x39\x52\x58\x6b\x59\xf8\xcf\xb9\xd1\xd1\xdf\x90\xf6\x7f\x5c\xa4\x79\x20\x32\xbc\x4a\xca\xc6\x86\xd3\x03\x4f\xdd\x7b\x8c\x48\xba\xf2\x12\xcc\x7e\x29\xcf\x5c\xaa\x4d\x56\x8d\xc8\xdd\xf1\x99\xff\xda\x25\x41\xb3\x4f\x0a\x45\x5a\x77\xf8\x56\x2e\xad\x55\x2a\xb7\x5f\x20\xa4\x51\xff\xa3\xf4\x8c\x5e\x03\x6b\x1c\x7d\x08\x88\x92\xff\xda\x79\x73\xad\x12\x49\xfc\x47\x99\x22\x4c\x6c\x58\xc2\xa9\x2b\x78\xa2\x5e\x4a\x52\x25\x3f\xa4\x80\x92\xb3\xd7\x10\x6b\x9e\xa8\xd4\x92\x9d\xdb\x40\x94\x79\x11\x91\xe5\x06\x79\x19\x7e\x2b\x86\x46\xfd\x5a\xeb\x5b\xac\x92\x8a\x79\x15\x16\x50\x68\x4c\x01\xbd\x94\xaa\x0c\x9d\x89\x56\xf6\x1d\x56\xcf\x47\x67\xea\xd4\x9a\x8e\x42\x89\x55\x43\x1a\x7b\xc1\x61\xb3\x2b\x15\x21\x1d\xed\xc5\x20\x48\x77\xde\x74\x59\x18\x75\x6f\x81\x95\xba\x0a\xe8\x66\xca\x8e\xbd\x26\xda\x79\xbc\xc8\x1a\xc7\x00\x53\x8d\x0e\x24\x61\x78\x8b\xed\x42\x78\x63\x53\x88\xce\xd0\xa2\x13\x35\xe4\xad\xdd\x1e\x48\x61\x25\xf2\x2e\x9b\xc3\x89\x07\x1f\xab\x74\x69\xc6\x78\x2b\x91\x5b\x26\xd1\x1b\x4f\x09\xe1\x9e\x83\x57\xa8\xcb\x3b\x9d\xec\x6a\x2e\x37\x9b\xcd\xe5\x0e\x69\xb8\xe5\x3e\xe7\xbd\x08\x51\x1b\xe3\x6e\x97\xd2\x93\x97\x3b\x04\x3d\xac\x6f\x14\xd2\x19\xf7\xb2\xfe\x24\x69\x38\x19\xba\xdc\x63\xcf\x65\x87\xe6\x8c\x74\x61\xee\x18\x24\x2f\x8d\x51\x10\x2b\x45\x67\x5f\x5a\x6c\x54\x42\x66\xc4\x23\x65\x0e\x42\x48\xd6\x65\x64\xbc\x4c\xd7\x57\x07\x22\xa1\x67\x91\xe2\xa0\x95\xa1\x2e\x53\xbf\xf7\xc0\x92\xb2\x23\x95\x13\xc1\x0b\xd2\x42\x98\xd1\xba\xd4\x48\x8f\x36\xe4\xfd\x9d\xa5\x62\xba\x83\x80\xea\x31\x27\xa5\x6d\xea\xe1\x1f\x28\x4a\xee\xe9\x73\xb4\x4b\x85\x90\x8c\x22\x07\x0b\x94\x07\x43\x44\x46\xb9\x39\x4b\x9d\xd7\x18\x54\x2d\x95\x44\x9f\xc5\x06\x04\x07\xcb\x68\xca\x0d\x72\xc2\xdf\x65\x65\xd6\x8e\x7a\x54\x62\x81\x36\x61\xcb\x9e\x3e\xbe\xec\x59\x16\x71\xcb\x4a\x2f\xf2\x05\xbe\x9b\x7a\x7a\x6b\x58\x30\x59\x65\xf1\x0e\xf5\x1d\xe4\x40\xfb\x53\xf3\x89\x40\xdf\x05\x55\x19\xc5\x6f\x4a\x8b\x79\x69\x83\x6e\xa3\xac\xbe\xa8\x2d\x8e\x8b\xa7\xd1\x2d\xe5\x50\x3d\x09\x62\x9f\xba\x53\x06\x8b\x34\x69\xd6\x10\xa7\x09\xc9\x7c\xab\xd9\xa8\xe1\xc3\xd9\xef\x85\x7d\x36\x1b\x4b\x85\xa4\x8e\xa4\xaf\x16\x17\xe8\xf0\xca\x7c\xc9\xf1\xcb\xa1\x12\xed\x33\xe9\x50\x9c\x91\x16\x4e\x8e\xd7\x44\xf7\x20\x2b\x95\x6a\xc9\x99\x9c\x24\x03\x13\x35\x69\xd4\x00\x2c\x99\x4a\x98\x56\xb6\x41\x22\x35\xef\xf4\xbc\xe9\x46\xb3\xa4\xfb\xb8\x59\x32\xfa\xb0\x24\xcc\x2e\xa9\xe7\xbf\xa4\xfe\x62\xa0\x0d\x3f\x09\x8e\x2a\xe1\x36\x60\xea\xca\x20\x65\xc7\xc1\x2e\x49\x75\x88\xd0\x34\x29\xca\x6c\x87\x56\xe9\x9e\x80\xe8\xfb\x26\x48\x0f\x6f\xa6\x97\x14\x52\x3c\xc9\x35\x78\x04\x2b\x0b\xb9\x57\xfd\xdd\x5d\x31\xee\xef\x5e\x43\x5b\xe6\x2b\xf7\xee\xbf\x10\xe8\xfe\xab\xf6\xd9\xb2\xf2\x30\xe8\xed\xdc\x9f\x35\xd0\x3e\x68\xfd\xcb\x6f\x29\xd8\xa0\x83\x29\xe0\x2f\xf2\x5f\x6e\x2e\xe8\xf0\x17\xea\xeb\x7f\xa9\xc9\x19\xca\x5a\x6d\x3a\xfa\xa1\xf9\xe6\x8c\xfa\x5f\xf7\x4e\xfb\x4b\x9b\x84\x65\x5c\x08\xfa\xcf\x2a\x20\xfc\x20\x8c\xbd\xf1\xef\x72\x85\xba\x0c\x66\xec\x38\xc7\x50\xaa\x68\x85\xe8\xac\x9c\x23\xee\xbe\xfd\xc0\xe6\x17\x58\x42\x6a\xa7\x6c\xcd\x7f\x4d\xd9\xd8\xf5\x2b\xf6\x9c\x43\xee\xbe\xcc\x5e\xd3\x97\xa7\xe7\x22\x15\x3d\xab\xf9\xfe\x84\x24\x8c\x7d\x30\x5e\xae\x57\xe8\xad\x60\x3e\x26\x74\x62\x9e\xae\xa4\x71\x67\x8f\x93\xa0\x94\x4c\xc8\x59\xbc\xe5\x9a\x63\x86\x7b\xae\x2f\xca\x70\x60\xfa\xbc\x53\xdb\x6c\x09\xb5\xf5\x4e\x28\x55\xb4\xd9\xd5\xc9\xb8\x2e\x3e\x8b\xb9\x9e\x21\x09\xa3\xd4\x3b\x64\xfe\x94\x45\x80\xf2\x23\x95\x59\xca\x73\xdd\x3f\xf7\x76\x20\x81\x87\x4b\xf9\xa3\x8b\x92\xbc\xec\x8c\xac\xa5\xa6\x17\x61\xae\xeb\xff\x27\x30\x53\xff\x11\x98\x41\x0d\x2c\x06\x0d\x96\x24\xf9\x4d\x48\x20\xcd\x58\xb8\x6c\x31\x54\x3b\xd7\x45\x17\x13\x1a\x16\x73\xb5\x0f\xd4\x75\x47\xea\xd4\x65\xa8\x0c\x3f\xe3\xa2\x26\x89\x25\xcc\xf6\x62\xd9\xaf\x0c\xe5\x1d\xcc\xab\x84\x39\xd7\x8c\xd9\x14\xde\x3e\xa6\xfb\xcf\x7b\xa2\xd6\x8c\x02\x6a\xb3\x57\x32\x44\xbb\x77\x9d\x3c\xe3\xd0\x16\x16\x16\xfe\x53\x51\x93\xf0\x78\x25\xb2\xeb\x5c\xc8\x5a\xc1\x7e\x1b\xe0\x5f\xec\xf9\x41\xc2\xc2\x3b\x58\xb3\x67\xb4\x6a\x6f\x0c\x42\x9e\x43\x50\x20\x6d\xe0\xee\x57\x02\x45\xdd\x90\xb7\x41\xfa\x27\xbd\x18\xfc\x9e\x41\x04\xb5\x4a\xee\x26\x54\x6b\x9a\x0d\x05\xd3\x7f\x21\x74\xe3\xbf\x1b\xdd\x1d\x8d\x57\x67\x5a\x85\x9d\x21\x71\x23\x2f\x33\x88\xf7\xb3\xf8\x47\xe8\xe6\x52\x0e\x9b\x0b\xe0\x64\x81\x22\x5e\x37\x30\x1f\x44\x8e\x4c\x64\x20\x48\xf3\x12\xea\xb8\xe5\x8a\x96\xc4\xb0\xae\xba\xec\x3a\x1c\x34\x65\x63\xbb\x3d\x49\xf6\x00\xa2\xce\x67\xd5\x61\xca\xa0\xcb\xa6\x8d\x8a\x95\x12\x94\xc9\x0f\xfd\xc3\x6a\xd2\x95\x19\x9a\x73\x9e\x7e\xa9\x70\xf6\x5a\x8d\x15\xe1\x5b\xc8\xe8\xe4\xf0\x87\xb6\x85\xac\x48\x27\x54\x75\xd8\x9f\x81\x88\xce\x2e\xb1\x43\x7b\x23\xe2\x11\xb9\x26\x9f\x64\x71\xd8\xa5\x44\x6b\xa2\xbc\x68\xc0\x78\x6e\xa9\x75\x39\x1c\x49\x43\xb9\x2b\x64\x4b\x21\x9b\x83\x97\xfc\x4d\x14\x02\x39\x8b\xce\xb1\x4b\xa4\x7e\x46\x87\x98\x97\xbb\x85\x68\x12\x26\x77\xd4\x46\xd9\x80\x21\x04\xa9\xd0\x23\x3b\xa5\xdb\xb3\x4a\xd6\x10\x48\xda\x3f\x25\x1e\x9a\xf5\xd7\x78\xf6\x12\x2a\x3f\x22\xa6\x1a\x58\xc3\xa3\x75\xf6\x71\x8c\xcb\x7f\xdc\x5f\xff\xd2\x9e\x51\x31\x3d\xc3\x00\xd8\x80\xb2\xc2\x9f\x77\x93\xa0\x92\x21\xaf\x88\x9f\x37\xf8\xb6\x14\xfa\xb8\x83\xa6\x6c\x88\x63\xf7\x27\x66\x79\xaa\x34\x64\xee\x4c\x56\x36\x80\x94\xb5\x3d\x1e\x2b\x15\x9d\x29\x15\xf2\xcb\xa1\x9b\x93\x6d\xa0\xe2\xb5\xe2\xd3\x13\x2c\xbc\x99\xb7\x3a\x97\xab\x9c\xc3\x47\x35\x14\x48\xe5\x50\x90\x06\x48\xd5\xe7\x93\x69\xd6\x56\x4c\x5d\x37\x47\xd7\xd3\xca\x97\x13\x52\xcf\xe6\x99\xe2\x44\xa7\x9c\xe7\x00\x67\x51\x7a\x9e\x98\x0e\x7d\xf2\x7c\x25\xd2\xf6\x01\x79\xb6\xf2\x78\x48\x3f\x07\x5a\x3b\xba\x04\x70\xa6\xb8\x12\x2e\x7d\x54\x76\x69\xb1\xc6\xf3\xbf\xb3\x14\x7e\x72\x5a\x19\x27\x74\xfd\x1d\xde\x6e\xa4\x4a\x7d\x05\x22\x8d\x0d\x38\x44\x6d\x42\x70\x06\x72\x82\x14\xe3\x69\xd2\xea\xa9\x2d\xc4\x78\xea\xc4\x19\x1b\x20\x74\xe7\x79\xe3\xe0\x8f\xb1\x71\x22\xe2\x59\xad\xfe\x65\xb9\x4a\x38\x1a\x30\xd1\x14\x1a\x1a\x3a\x6f\xd7\x83\x73\x6d\x9d\x81\x56\x00\x8e\x55\xb6\xd8\x67\xee\xe7\x9c\xb9\x3d\x18\xbd\x7c\x28\x15\x02\x7d\xd2\xd5\xe1\xe4\xc8\x13\x74\x86\x99\xc7\x62\x95\xf4\x5c\xef\xcd\x69\x74\x48\x78\x57\x27\xd0\x20\xf7\x5a\xbb\xb2\xde\x13\x3a\x97\x81\x38\xd6\x7a\xfe\xe5\x35\xc1\x88\xfc\x59\x5e\x6c\xd8\x9e\x85\x5a\xeb\x56\x32\x9e\x60\xe0\x99\xa5\x85\x54\x20\x24\xaf\x20\xc1\xb3\xac\x47\xba\x98\xfa\x01\x6d\x9e\x12\xfb\x6b\xd6\xc0\x00\xe3\xe7\x90\x79\xbf\x2f\x81\xd0\x20\x2a\xea\xa1\xe1\x70\xf1\x4e\xbb\x86\xdc\x25\xfd\x1f\xfb\x5c\x35\xaa\x85\xdb\xad\x6e\x4f\xbe\xa9\x6e\x82\xf9\x8c\x12\x80\xaf\x20\x45\x1b\x3c\x23\x91\x97\x87\x26\x93\x9b\x34\x8d\x3d\x9e\xee\x44\xc0\xcd\xba\xda\x9c\x4b\xfd\xf8\x65\x22\x6d\x6a\x27\x58\x63\x33\xf5\x30\x9f\x79\x9a\xfa\xf6\xa9\x49\x5d\x48\x9f\x8d\x0d\x3f\x43\xee\x28\x7d\xba\xde\x52\xba\xf9\xce\xa5\x9b\x29\x3c\x4f\xe7\xc2\x39\x08\x0a\xcb\x13\xb3\x4d\xdc\xcf\x7a\xc0\xac\x01\x92\xb8\x07\xd0\x06\xea\xca\x43\x76\xc6\x87\xf4\xb3\x52\x28\x06\xed\xac\xb5\x40\x56\x0e\xe5\x1f\x48\x1f\x9f\x44\x03\x8f\xb1\xd7\x3b\x04\x85\xfa\x47\x60\xdf\x00\x8d\x48\x9e\x98\x37\xe2\xd1\x56\x09\x34\x3f\xe1\x44\xa8\x73\xae\x6b\x4c\x52\x40\x74\x28\x44\xb3\x0c\x6e\x01\x16\x96\x39\x31\xf0\xf3\x4c\xf4\xe2\x42\x29\x76\x1f\x14\x43\xa2\x64\x88\xe9\x89\x24\x1c\x6e\x95\xe1\xc5\xc5\x7b\x35\xd9\x90\x1b\x57\xfc\xb8\xe3\x5d\x7d\xdc\xed\x5e\xe8\xe5\xfa\xb8\xdd\xb8\xb2\x33\x2c\x01\xce\xdf\x64\xed\xa3\x7d\x1a\x83\xae\x8f\x56\x39\x58\x7c\xf4\x5b\xe7\xfa\x18\x52\x3c\xf2\x9c\x8b\x99\x6a\xf0\x58\x5a\xfb\x16\x13\x77\xb2\x8e\x17\xdb\x5b\x87\x52\x44\xca\xc8\xed\xed\xa7\xca\x7d\xb5\x7f\xbc\x1c\x51\x3d\x5a\x96\x52\x92\x12\xf5\x3d\x51\xd3\xfb\xb4\xae\x93\x54\x76\x21\x0f\x5a\x3e\x64\x27\xff\x68\xdd\x8c\xf9\x51\x6f\xd9\x8d\x3f\xaa\x44\x42\x1f\x10\x0b\xbf\xb8\x4a\x2a\x2b\x0f\x18\x8b\xf8\x74\x29\x50\x11\x8f\xfd\x21\x05\x9f\x07\x33\x28\x1f\x21\x1f\xf1\x50\x00\xfa\xb1\x4a\xcd\x0f\x92\x4b\x3c\x0e\x34\x83\xb5\xf5\x8a\xf0\x07\xaf\x6f\x4d\x5b\xec\x99\xc4\x80\x7b\xb8\x3d\x1c\xab\xf3\x07\xd4\x8e\xf9\xde\x3e\xca\x4f\x15\xeb\xe1\x36\xb0\x6f\xa1\xdf\x5a\xf0\x4f\x08\x35\x27\xf7\x08\x62\x07\x3a\xf2\xb2\x36\x7a\xe0\xcd\xf1\x53\xa6\x17\x15\xaa\xec\xab\x19\xd5\xed\x7d\xa0\x63\xbb\x87\xca\x12\x3b\x2e\x8f\x14\x8d\xa7\x21\xee\xd8\x38\xf7\xf3\xf0\x20\x6a\x26\xda\xa3\x87\x6c\x58\xc3\xda\x07\x1a\x70\xaf\xcd\x1f\xf1\xb5\x3e\x52\xf8\x4a\x50\x6a\x89\xca\x4d\xc3\x2d\x99\xa6\x61\xf0\x50\x41\xfe\xac\x65\xf4\x8b\xc4\xb0\xc9\xbb\x3d\xc8\x93\x58\x29\xa5\x84\xe9\xef\xd1\x1e\x1d\x97\xc6\xf4\xc7\xe4\xcc\xfc\x7f\xb7\xff\x9e\xfc\x4f\x94\x35\xef\x55\x19\xf1\x36\xb8\xa6\x3c\xd2\xfe\x8c\xf4\x41\xaf\x84\x24\x9a\xa4\x7c\xce\x10\x74\xce\xc1\xaf\xce\x70\x01\xa0\x38\x13\x2a\xa8\xae\xb5\xc4\xe7\x6c\x20\x04\x66\xf3\xda\xc5\x93\x30\xf6\x1a\x18\x2f\x89\x80\x41\x2e\xf4\x04\xf3\xf8\x3b\x32\xfd\x95\x0e\x65\x83\x6a\x9e\xef\x97\x45\x85\x88\x91\x4b\x82\x02\x0f\xe1\xa8\xab\xf4\xeb\xe9\x5b\x6e\xaa\x29\x2d\xb3\x92\x8c\x27\xbb\xef\xd2\x3b\xf2\x6b\x9a\xee\x83\x92\x46\x37\x1b\x63\xc8\x28\xcd\x12\x3f\xda\x11\x61\xe7\x46\x7b\xd4\x48\x93\x67\xe0\xeb\x23\x9c\xee\xb8\x8c\xe9\xb6\x81\xa5\x04\x99\xe4\x09\x03\x90\x4f\xe9\xab\x4d\x8a\xc5\x4f\xf7\x10\xc2\x4b\xf1\xfb\x20\xaa\x44\x25\x1d\xeb\xe7\x80\xe4\xed\x97\x13\x92\x03\x93\x58\xd3\x53\xcb\xff\xa3\x0e\x4d\xd3\xc7\x02\xd0\xf7\xcc\x92\x5c\x9d\x1a\x4d\x49\x1c\x5b\x0f\xc2\x2f\xa4\x4a\x14\x7d\xaa\xa7\x02\x53\x86\xb4\xa6\x69\x64\x31\xd5\x26\xa5\x26\x1f\x74\x4d\x75\xcb\x21\xcb\xb4\xf6\x92\x35\x8b\xa1\xc1\x5f\x53\x00\xed\x34\x34\x9a\x29\x01\x25\x45\x6f\x27\x04\x92\x7a\xdc\x64\xb2\x1e\x1e\x85\x76\x4a\x3d\x27\xf2\x4a\xd1\x60\xe9\xed\x9a\x22\xc1\xd6\x40\x50\x2c\x09\x5d\x62\xc7\x1d\x7f\xa5\x70\x6a\x0b\x89\x29\xed\x13\xcc\xb6\xb8\x37\x99\x03\x0e\xa1\x55\x10\x48\xff\x4d\x9b\x04\xf7\x11\x3d\x67\x20\x16\x06\xb9\xfa\xe9\xf9\x15\x52\x46\xaf\xd0\x61\x31\x48\xf6\xca\x94\x7f\x89\x34\x93\xcf\xb5\x65\xb6\xef\x93\x93\xed\x36\x21\xed\x2f\x0f\x79\x57\x66\x93\xc9\xe9\x84\xcc\x09\xae\xd4\x68\xda\x00\xa2\xdf\x45\x82\x4d\x11\x92\x31\x74\xb9\x34\x0f\xe5\x9a\xf6\x50\xa9\xca\xdb\x39\x4b\x0b\x49\x12\x00\x10\x79\x0a\x51\x27\xf7\xb0\xd5\x76\x12\xa4\x5a\xbf\x3a\xde\xca\xec\x33\x74\xae\xd9\xda\x06\x75\xdb\xca\xce\x0e\x84\xa6\xd3\x2e\xe5\x2a\x43\x63\xa0\xb9\x7e\x78\x7d\x8b\x0e\x5f\x62\x24\x34\x85\x8a\xd4\x2c\x09\x69\x57\x7b\xd2\xed\x7d\x84\x5e\xfa\x24\x3b\x59\x2b\xfd\xa1\xe5\x31\x02\x0e\x06\x43\xe6\x0a\x84\x07\xfe\x12\x4f\x73\xba\x28\xac\xc4\x0f\x13\x39\x2b\x8c\x1b\x4c\xd1\x27\xa4\x32\x4e\xa4\xac\x4d\x50\xaf\x14\xcf\x74\x42\xcb\xa5\x2f\x9c\xa6\xd1\x56\x78\x57\x93\x5b\xc6\x20\xc9\x5e\x3c\x69\x2b\x1b\x9a\x98\x1f\x04\xc4\x07\x93\x46\xd1\x95\xc7\xcf\xa1\x00\xf2\x78\x87\x81\xed\x78\x37\x8a\x3b\x49\x6c\x6a\x24\x3f\xbc\xcf\x01\xf5\x99\xc6\xf1\x9e\xa2\x72\x1f\x25\x98\x36\xb6\x8f\x3e\x4a\x43\x3d\x4d\x16\x92\x4d\x9b\x34\x99\xec\x28\xab\xd4\x9b\xac\xb1\x9c\x25\x07\x37\xa2\xbb\xe0\xa5\x8d\x1a\x35\x79\x36\x36\x58\x2e\x0b\x8c\x02\x29\x14\x9f\x52\xc8\x1d\xbd\xa5\x93\xf4\x9e\xd8\xfa\x8c\xf5\x8e\x60\xe1\x58\xaf\x7f\x64\x99\x10\x61\xe8\xd8\x87\x37\x0e\xc3\x13\xd2\x90\xac\x9b\x0d\x1d\xb5\x0b\x32\x85\x46\x11\x90\x34\x91\xda\x44\x8d\x9f\xda\x49\x5b\x50\x60\x8a\xff\xee\x98\xde\x21\xca\x21\xb1\xb4\x91\xa9\x30\x86\x66\x31\x45\x97\xfc\x1b\x32\x38\x89\xf9\x69\x10\xf2\x46\xd2\x50\x42\x36\xdd\x75\x57\x09\x50\xad\x49\x09\x86\xc8\xe6\x87\x90\x1a\xd5\xaa\x6a\x30\x9b\x80\xa2\x5f\x39\x56\x37\x35\x10\x62\x61\x6f\x19\xb2\x90\xfd\xba\xad\x97\x40\x75\x23\xc8\x22\x7c\x04\x28\xae\xb5\x6a\x8a\xdf\xd5\x97\x74\x63\xd6\x2c\xf9\x20\xc8\x30\x85\x5b\xc2\x88\x09\x9e\x9d\x20\x3e\x31\xcc\x1f\x3f\x78\xc0\x42\xa7\xc4\xd1\x87\x40\x44\x47\x75\x9f\x0e\xc7\x08\x3c\x53\xa7\x29\xff\x79\x6f\x17\xf2\x08\x4a\xc2\x32\x38\xce\x4a\x58\x06\x4f\xe1\x11\x7b\xcd\x98\xaf\xd0\xd3\x70\x59\x27\x25\xee\xba\x6b\x26\x58\x33\x92\x75\x2a\x21\x71\xe4\xb1\x2a\xff\x35\xd6\xb0\xde\xdc\x34\x53\x4a\xd8\x80\x0d\x88\x1d\xa0\xbf\xa3\xed\xd3\x4b\xf5\xb0\x41\x09\x55\x23\x63\xdf\x09\x7b\x94\x83\x0a\xef\x7e\x97\x70\xaa\x5e\x73\x3a\xd4\x4e\x6b\x79\x68\xa5\x74\x0f\xc6\x6c\xad\x92\xd7\x4e\x23\x3b\xa6\x63\x0c\x8b\x01\xf6\x89\xdf\x2d\xf2\x67\x98\x8d\x3c\xfa\x9c\x37\x32\x98\xb4\x80\xfc\x3a\x36\xa9\x5a\x92\x42\x13\x48\x52\x7c\x3c\x49\xf2\x5c\xce\xa0\x3e\x85\xf4\x80\x5d\xf0\x89\x20\x64\xa2\x10\xe8\x91\x3a\x18\x6a\x9e\x53\x00\xbc\x62\xef\x1b\xf9\xc2\x53\x80\x19\x2b\x30\xbb\x29\x91\xac\xe8\xce\x37\x3a\x7a\x5b\x69\xd8\x6e\x48\x83\x49\x77\x76\x7c\x25\x21\x89\xc0\xf9\x8c\x38\x81\x87\x69\x47\xc8\xd4\x49\x93\x49\x3c\x20\x03\xf1\x7e\xa7\xa8\x9b\x30\x04\x95\xa6\x15\xcc\xbb\x79\xa2\x35\x5c\x67\x47\xb7\x7d\x11\x90\x6a\x96\xcf\xe9\x75\x24\xc3\x7e\x88\x47\xfd\x4f\xa5\xb6\xd7\xb7\x8f\xa9\xca\x16\xd2\x58\x6b\xd8\xb4\x8c\x29\x8c\xe6\x0d\x31\xb3\x15\x80\x5f\x19\x84\x11\x36\xfe\xe8\xc1\xa5\x96\x43\x94\xe5\xbe\x12\xe5\xa1\x40\x58\xcb\xbb\x44\xa0\x4e\xca\x3b\x59\xed\xaf\x36\x01\x12\x51\x92\x91\xb9\xdb\xcc\xde\x1b\x6d\xc5\xa8\x10\xa5\x83\x35\xf2\x0f\xa0\x1d\x25\x1d\xa2\x7b\xd5\x9a\xbc\xee\xd2\x8c\x0a\x19\x92\x3b\x36\xa6\x08\xd0\x8d\x2e\xc2\x2e\x95\xa5\x0f\x89\x7a\xd6\x6d\xb9\x42\x49\xe9\xd6\x8a\x8d\x99\xe2\x03\x23\xfe\x56\xc4\xff\x95\xcd\x35\xb4\xfa\x51\xec\x10\x90\xc5\x1b\x7a\xe2\x94\x67\xaa\x78\xb7\x78\x84\x8a\x3c\xbe\x27\x8f\xab\x88\x94\x74\xa3\xba\x74\x4b\xf3\x4c\x3e\xc2\x22\xdd\xad\x16\x31\xe8\xa1\x95\x3d\xe4\x9f\xf8\x00\x5d\xf0\x29\x54\xa3\xd2\xfe\xe9\x68\xe2\x7f\xd3\x26\x41\x1d\x08\x38\x4b\x7b\xa6\xf5\x29\xdd\xa1\x7e\x43\xec\xe8\xc3\x9e\xb6\x75\xe4\xc0\xf2\xf5\x38\xdb\xe0\xec\x39\x02\xde\xb9\x8a\xc6\x2f\x76\x95\x8b\x22\x80\xa4\x6d\x07\xb4\xcf\x7a\x7e\x08\x90\x40\x4a\x99\x7a\x31\xd5\x6a\x55\xff\xfa\x5c\xc5\x09\xaa\xa3\x3c\x81\xc4\x77\x6a\x5b\xe4\x1f\x63\x10\xce\x56\xfa\x2f\x42\x66\x59\xa7\x6e\x12\x8f\xaa\x57\xe8\x3b\x39\x61\x5f\xff\xdd\xd9\x24\x0d\x35\xb2\x91\x91\xa3\xcf\x63\x97\x6b\xe7\x70\xc3\x20\x65\x71\x60\xad\x71\x05\x08\xcf\x5a\x5b\x90\xd0\x52\xcd\x21\x21\x95\x15\x1c\x87\x43\x05\xb5\x9b\x90\x54\x21\x59\xa9\xa1\x9b\x1e\x0c\x60\x65\xa0\x5c\xef\xdc\x2f\x18\x1e\x3f\xf6\xb4\x26\x4a\xb3\xdb\x22\x5f\x87\xd5\x3a\x9c\xbc\x9a\xd5\x27\x2c\x89\x24\x08\x95\x4e\x69\xf4\xac\xc9\x05\x85\xb3\x52\xf0\x87\x55\x1a\x05\x00\x3f\x8e\xab\x2f\xe9\x25\x5c\xd3\x1a\xb2\x52\xc8\x6a\x02\x73\x90\x0b\xa3\xc6\xe4\x43\x81\x34\x8e\x5f\x43\x69\x6a\xb2\x06\xcc\x94\x86\x80\x59\x7f\xb5\x42\x03\x7a\x70\xc1\x38\x7f\x2b\x40\x1e\xf7\x29\xdb\x41\xaf\x5d\xd8\x2f\x0f\xb3\x12\x15\x5d\x1b\x6a\xd5\x6f\xcf\x57\x96\xb4\x93\x7a\x39\xd6\x23\xfa\x16\x09\x2d\x35\x8c\x44\xb9\x59\xfb\xa9\x3c\x31\xd7\xd8\xad\x05\x29\xe5\x30\x64\x65\xf8\x0c\xd1\x07\x1f\x5c\x36\x43\xc2\x4f\x7f\xa8\x3d\x08\x8b\xdd\x84\x53\xbb\x3c\xab\x52\xab\x87\xb0\x01\x19\x5c\x40\x51\xab\x46\xf1\xc2\x0d\xfa\xd7\xe8\x70\x3d\xd9\xeb\x00\x62\x02\xef\x90\x7b\xca\xc9\x20\xad\x76\x1b\x91\x46\xe5\x83\x6c\xd1\x50\x6a\xcb\xb3\xae\xe2\xc1\xea\x22\x4b\x56\x0a\x7a\xb4\x3c\xbb\xf5\xfb\x2f\x75\x4a\x07\xcf\x30\xd1\x55\xe9\xb9\x59\x3f\x57\x04\x2b\x9f\x15\xe3\x51\x41\x79\xe1\x66\x49\x41\x43\x03\x2a\x43\xd7\x7a\x40\x3b\xc6\xd6\x7f\x40\xab\xe5\xb7\x59\x8a\x55\xa0\x66\x84\x90\x53\x83\x60\x40\x6c\xc7\x29\x27\x2b\xf7\x28\xcb\xa8\x13\xb5\x95\xd1\x6e\x88\x47\xf1\xb7\x18\x98\x6e\x09\x43\xb9\x1d\xa9\x14\xab\xda\x10\x03\x32\x68\x48\x85\xf2\x1f\x20\xbb\x76\xd0\x2e\xd6\xad\xa2\xeb\x28\x37\x85\xf3\x8b\xfe\x1f\x9c\x15\x47\x5d\x71\xea\x9a\x9b\x27\x18\x40\x7c\x2a\x8d\x8c\x4a\x0c\xdd\xcd\x7e\x40\xc4\xfc\x5f\x05\xaa\xae\x9b\x05\xfd\x18\xad\x1b\x58\x3e\x43\x78\xea\xc9\xd1\xc4\x90\xa6\xc4\xae\xf1\xa0\x09\x5f\x0c\x94\xf9\x6b\x87\x12\xf7\x53\x1f\x31\xe2\xff\xfc\xa1\xd4\x62\x86\x50\x7a\x98\x25\x26\xe5\xaf\xa0\x4f\xe2\x1a\x4a\x2f\x8d\x6e\x6c\xac\xc1\x0e\x0f\x62\xa7\xcd\x4b\x12\x74\xd2\xcd\xcc\x36\x24\x28\x32\x27\xd7\xe7\xe8\x59\xc3\xe0\x61\xea\x56\xa6\xf3\x50\xba\x7a\x3a\xd7\x60\x98\x27\x98\xf1\xbb\x9c\xd4\x69\x95\x53\xe2\x7f\x3d\x83\xca\x5e\x78\x5f\x8f\x94\x3d\x91\x20\x61\x54\xb7\xb2\x23\x92\xda\xff\x29\xc0\xe3\x88\x8a\x52\xae\xd1\xfc\xbc\xb9\x9b\x74\x67\x31\xde\xa2\x5e\x55\x53\x96\x3b\x8c\x39\x39\x6b\x25\x9d\x30\x3c\x6e\xe9\x50\x1d\x74\x29\x74\x87\xe6\x3d\xc0\x53\x24\xe0\xa4\xfc\x0d\xa7\x3b\x86\x72\x15\x3c\x6e\xa8\x51\xb5\x5f\xdd\xfa\x05\x99\x7a\xa7\xca\x2a\x71\xad\x67\x57\xa7\x72\x05\xad\x55\x22\x5a\xd3\xcd\xdf\xb3\xc7\xbc\x83\x13\x8d\xf4\xf6\x58\x07\x83\x2c\x49\x1b\xcd\xaf\x8f\x22\xbe\x10\x38\x96\xa7\x80\x77\xd4\xec\xc5\xa2\xe9\x0d\x04\x71\xfc\xbc\xeb\x26\xab\x4d\xfb\x61\x6c\x4d\x60\x17\xd7\xd1\x53\xd3\x95\x2e\xac\x19\x36\xc5\xf6\xf6\x31\xe9\xca\x86\x91\x9c\x0b\x4a\xc1\xf6\x4e\x98\x34\xd0\xf1\xe0\x92\x3a\xe9\x21\x2c\xde\x49\x49\xe5\x62\x34\x15\x2a\x3a\x27\xcb\xd8\xf1\xd9\x6f\x14\xe4\xd4\x98\x6c\xeb\x0a\x5c\xbe\x1d\xda\x6c\xff\x36\xd2\x40\xa6\x9b\xbd\x85\x17\x89\x97\x5f\x1b\xe7\xaa\xf1\xf9\xde\x0f\x8e\x71\xbe\xf7\xe0\x8d\xd5\xb7\x90\xee\xf4\x75\xee\xb8\xff\x92\x6f\x51\x38\xc8\x80\x7f\x56\xdf\xc8\x24\xff\xb2\xe3\xf2\x85\x8d\x12\xbf\xef\x6f\xb6\x4e\xb1\x1f\x38\x4b\x40\xdd\xfe\x6a\xec\x07\x73\x99\x90\xe6\xfa\x55\x91\xdf\x41\x24\xd8\x2f\x98\x22\xfe\x40\xbf\x90\x37\xf5\xe9\x1d\xe4\xb9\xb1\xfa\xfd\x26\xce\xdb\x7f\x45\xf1\x80\xc9\xa9\x44\x0b\xbf\x1e\xb6\xe7\x21\x06\x46\xd0\x01\xf6\xec\x7a\x5c\x36\x94\xf2\x00\x9c\x01\xb6\x08\x9f\xca\x18\xe8\xa7\xf2\xe3\xfb\xf0\x0d\x87\x88\x17\x65\xb9\xd8\x9e\x7e\xec\x83\xe3\x5c\xf1\x27\x51\x13\xf9\x03\x3f\x14\x55\x58\x1f\xab\x7b\xb0\xd7\xdb\x3e\xc0\x9d\xa5\x75\x5e\xd4\x97\x7a\x47\x46\x24\x00\x3f\x6c\x43\xa1\xe4\x54\xeb\x1a\x03\x7a\xe0\x47\xd3\x06\x5d\x0c\xf4\x6d\xcf\xeb\xcf\x7f\x99\xa1\x07\x3e\x28\x1e\x6b\xed\x00\x55\xc0\xc2\xbd\xfe\xa4\xb3\x65\xdd\x0e\x4d\x24\xbc\x5d\xd3\xe5\x24\x0a\x65\xcb\x77\x39\xbb\x34\xd7\xb9\x97\x1c\x2a\x5c\xe7\xbf\x82\x5c\xec\xe0\x18\xfa\xe9\x81\xc1\x9a\x60\xe5\xb1\xc0\xf5\xec\x2a\x5e\x6a\xc1\x80\x20\xf9\x1d\x67\x5e\xbb\x4a\x54\x59\x15\x7b\x7a\x33\x95\xe1\xec\x50\x82\x6f\xb6\x30\x93\xcf\x0d\x94\xd7\x7f\x56\x4b\x21\x0f\xb1\xb5\x2e\x23\x16\x3f\x3e\x9c\xe7\xdf\xe2\x86\x41\xe4\xeb\x1f\x61\x04\x1b\x9e\x46\xb6\xc3\x1b\xe2\x09\x62\xfc\xbe\x4b\xd2\xc5\x48\xe8\x81\x52\x5f\x97\x50\x96\x00\x81\x63\x7f\x49\xde\xb3\x9c\x0c\x21\xce\x65\x0d\x4b\x16\x0c\x92\x19\xb0\x7f\x97\xef\xde\x83\x06\x8a\xd8\x9e\xe1\x08\x74\xbf\xa5\xea\x0a\x6d\xaf\x39\x24\x3f\xde\x9e\xf6\x45\x44\x35\x17\x2b\x9f\x7d\xcd\x24\xb0\x1e\x5e\x94\xc8\x52\x34\x78\x46\xe2\xdd\x9b\xa1\x6e\xd2\xac\x6d\x41\x13\x7d\xef\x90\x6f\x31\x30\xf5\x4b\x98\x1b\xdd\x0e\x80\xfa\xe4\xce\x3b\x67\x86\x21\x00\xb8\x4f\xe4\x94\xbf\x43\x9d\xc7\x80\x0c\x2c\xde\x49\xda\xae\x6f\x69\x79\xbf\x21\x7e\xc8\x9b\x6e\xb5\x7c\x17\x07\x87\x72\x58\x1c\x04\x61\xd6\xe8\xd2\x62\x92\xbc\x4a\x11\xcc\x3e\x6a\xaa\x90\xad\x92\x0d\xe3\x7b\x90\x7e\x3c\x1a\xc3\x12\xad\x7b\x85\x4c\x57\xad\x90\xb3\xf2\x55\x75\x77\xbf\xac\xdd\xb1\xb2\x47\xa0\x02\x86\xec\x9c\x4b\x58\x5a\x5c\x4c\xc5\x85\x2a\xd8\x7f\x2e\xf5\x75\x29\x6c\xfa\x2a\x55\x89\x1c\x2f\x25\x38\x58\x39\x16\xb7\xe3\xa1\x16\xd8\xee\xd7\xe8\xc3\x84\x2b\x05\x6a\x72\x3f\x7a\xe1\x3d\xe4\x10\xfc\x85\xee\x6d\xa2\x7c\x0e\xbc\x90\x37\xaa\x7a\x7d\x76\x96\x88\x17\xac\x12\xfa\xb2\xeb\xcb\x1e\x83\x74\xab\x47\x59\x7c\xbe\xc2\x83\xc5\x23\x15\x6c\x2f\x5e\x39\xcc\x19\x5f\xf9\x2f\x49\xbf\xe8\xd5\x99\x7f\x44\x00\x29\xec\xb4\x0c\xc9\x81\xea\xd5\xe9\x7c\xd6\xbd\xf0\xb6\x1d\x99\xfd\x69\x26\x98\x3f\xa1\x63\x66\x98\x89\x94\x40\xec\xd8\x3a\x52\xbc\x07\x5a\x60\xe5\x45\x37\x1e\xd7\x08\x7b\xc5\x7b\x49\x69\x31\x7a\x4b\x11\x2f\xb5\x96\x58\xc0\x28\x73\xe1\x82\x94\x4d\x5c\x2a\x4c\xc7\x54\x9e\x89\x83\xfd\x67\xb4\x09\x0d\x31\x74\x3a\x28\x8e\x86\x39\xd4\xcc\x63\x90\x7d\xf4\x4a\x4f\x1e\xea\x86\xe8\xe4\x75\x62\x7c\x41\xe1\x30\x07\xfe\xa4\x7b\x56\xc7\x45\x21\xed\xeb\xe3\x0f\xe2\x7a\x7f\x44\xf4\xb9\xde\x75\x0b\x1d\xaf\x77\x9d\x29\xfc\xe4\xd1\x05\x4e\x93\x41\x38\x8c\xa2\x59\x77\xfb\x59\x0f\x5e\xb7\xc2\x2a\xd6\x27\x5e\xf8\x5f\x06\x59\x2f\x9c\xd0\xdb\xf4\xeb\x46\x7a\x28\x95\xc9\xe0\x4c\x1f\x32\x50\xa7\x07\xd8\xfc\x96\x5d\x4e\x28\xa5\xda\xd7\x3d\x48\x3f\xac\xba\xb6\x3d\xcf\xd2\x98\xb0\x74\x79\x37\x8b\xdb\xe9\x1f\x52\x94\xb9\x64\x0a\x6e\x65\x6a\x2e\xde\x0a\x31\x32\x3f\x4f\x93\xc7\xb1\x0b\x89\x9d\x6c\x13\xaf\x5a\x25\x39\x65\x4d\x8c\x54\xba\xea\x2e\xc2\xc2\x55\xb7\xa5\x44\x76\xe5\x05\x29\x2e\xef\xf2\x44\x6f\xeb\xf2\x46\xc9\x4f\x56\x25\xd2\x6b\xc3\x07\x1f\x22\x5c\xa5\x51\x05\x6c\x3f\xa5\x58\x70\xf9\x4c\x8b\x2a\x1a\x88\xa6\xf0\x6b\xbc\x0a\xb4\xb9\xa9\x4b\x36\xdf\x3f\x09\xb0\x56\xf7\x2e\xfb\x85\x34\xd7\xed\x3f\xe9\x7d\x79\x29\x73\xeb\x8b\x46\x5d\xfe\xd0\x30\x3d\xa5\x43\x76\xcf\x8a\x0b\xf3\xba\x04\xf1\x9d\x5f\xdd\x67\xdb\x50\x76\x89\xb7\xac\x34\x81\x2b\xcb\x3f\xc4\x80\x77\x57\xae\xf4\x71\x23\xec\xcb\xfa\xe6\xfe\x44\x9d\x4f\x7f\xc6\x3f\xa1\xf8\x41\xf5\xae\x76\xce\xda\x40\x9c\x5e\x00\xbf\xc0\xd4\x2f\x25\x29\x6e\x6a\x20\xde\xb3\x54\xd4\x4e\x5e\xc9\x53\xf2\xaf\x9e\x7f\x0b\xf9\x24\xa6\x8a\xdb\x98\x80\x9a\x5f\xdf\x4f\x70\x1a\xcf\xef\x3b\xb9\x26\xfb\xf9\xad\x47\x17\x21\xfa\xb8\xcc\x90\x14\xc0\x10\x94\x6e\x8e\x4a\x44\xdf\x0d\x52\xd4\xc5\x5a\xbe\x36\x32\x07\x0b\x98\xca\x2a\x48\x97\x95\x3e\x8d\x35\x7d\x97\xfe\x9b\x69\x89\x6f\x40\x89\xc6\x50\x19\xfb\x72\x55\xa2\xa8\x03\x71\xd8\xaf\x19\x94\xdc\xc5\xf9\x66\x3e\xd1\xf9\xca\x1e\xd0\x3a\x5f\x4a\x2c\xe1\x2e\xb4\xa9\x3f\x6f\x30\x91\x1c\x1c\xd4\x28\xb9\x69\xef\x44\xc1\x31\x85\xbb\xb0\x20\x81\xab\x7b\x2d\x54\xcd\xfa\xf8\xa2\x7d\x95\x91\xa7\x6a\xf8\xe0\x8d\xb2\xef\xcd\xad\x90\xce\x2b\x64\x46\x0c\x65\xeb\x04\xfc\xdd\x99\x3e\xf9\xb6\x1c\xe1\x0a\xc2\x55\x68\x5e\xa5\x8c\x75\xeb\x5e\xd8\x47\x78\x85\xec\x17\x47\x8d\x2e\xae\x19\x22\x5d\xad\x2a\x9b\x9e\x3a\x65\x14\x62\xc3\x67\x46\xf1\xa3\x4b\xf5\xb1\x83\x90\x1f\x93\x84\xcc\x85\x94\x05\x82\x83\x8e\x4c\x86\xea\xc5\x9f\x55\xd9\x01\x85\x58\xd9\xd5\xe7\x1f\x6d\x29\x04\x7b\xae\x9a\x55\x4b\x58\xad\x1e\x3a\x4a\x57\x91\x80\x59\x89\x04\x03\xab\x21\xf8\x1d\x1b\x78\xe7\xae\x37\x16\x37\xc5\x9a\xdb\xa5\x71\xf6\x12\x43\xb6\xae\xd7\x63\x6d\xcf\xa1\x87\x68\xf0\x77\x7a\x90\xee\xf8\x23\x22\x80\x04\xb4\xf0\x57\xd8\x28\x3e\x94\xd2\xd2\xae\xe4\x6b\x57\x0e\xcb\x02\x45\xc2\x44\x57\x30\x44\x20\x20\x86\xe2\xff\xee\xc2\x5e\xa8\xeb\x81\x49\x77\x07\x90\x91\x1c\xc0\x2e\x61\x03\x05\x03\xd5\xa0\xe7\x51\xa8\xe6\x60\x80\x3e\x90\xe7\xa1\xf4\x05\x03\x92\x21\x3b\x72\x88\x8a\x65\xf1\xc7\xdc\xbc\xc9\xef\xc4\x91\xe8\xef\x0a\x10\x67\x4d\xae\x53\x41\xa8\xf7\xea\x48\xa5\xe7\x68\x9f\xf5\xd6\xa5\x7a\x66\x33\x15\xc7\x44\xe8\x3e\xd9\xc1\xb2\xa2\x48\x82\xac\x79\xc7\xff\xac\xff\xe7\x83\x61\xd8\x85\x70\x03\x29\xda\xc1\xad\x43\x69\x7b\x67\x65\x52\xf0\xb9\xdd\xa1\x21\xb5\x9d\xd2\x44\xda\x44\xd3\x76\x10\x3a\x59\xc2\x45\x58\x12\x4d\x9b\xcb\xc6\xfa\xf5\xad\x37\x67\x1a\xc0\xc4\xe7\xee\x6b\xed\x2a\x66\x3d\xc9\xe5\xb4\x1e\x8b\x74\xd2\x0c\x65\xad\xd2\xab\xba\xa6\xa7\x5e\xa3\x35\x51\x61\xfc\x84\xa5\x32\xbf\x10\xd8\x23\x1f\x52\x3c\x2b\x24\x6e\x9c\x7f\x35\x94\x67\x0d\x06\xd1\xfb\x2c\xaf\xc6\x1b\x65\x03\x54\xbf\x1f\x50\x8e\xf7\x32\x0c\x11\x4f\x44\x02\xf9\x63\x5d\xfa\x8c\x80\x97\x6f\x25\x77\xb2\x51\xf6\x49\xcd\x6a\xe8\xfe\xa8\x1b\x6a\x90\x5a\x49\x65\x55\x72\x24\xc5\xd1\x66\x3d\x0b\xeb\x7b\x71\xb2\xc6\x3a\xb5\x2d\xae\x27\xff\xc3\xf4\xe7\x12\x15\xcf\x18\xec\xb7\xd2\x73\x3e\xac\x44\xae\xa7\x23\x19\x4f\x9e\x73\x7d\xe9\x45\xb1\x13\x5c\x0c\x6d\x60\x22\x47\x07\x28\x1f\xcf\xbc\x77\x5d\xb5\x42\x53\x29\xc4\x47\xd5\x7b\x3c\xe7\xcc\xff\xe6\x50\xdb\x9b\xb3\x06\x2d\xc8\xfc\xf0\x2e\x03\x26\x60\xf9\x4e\xce\x69\x29\xdc\xc8\x7a\x36\xce\x96\x82\x36\x5a\xe5\xaf\x86\x0b\xa5\x56\x75\xef\x49\x24\x94\x7a\xc8\xe9\xcc\xb7\xe4\xc9\x6e\xf9\x10\x22\x7e\xf7\x51\xa9\xd7\x23\x37\xb6\x68\x50\x4f\xcb\x1d\xf0\x07\xe5\xc6\xd4\x14\xab\xa9\x4f\x38\x41\x13\x52\xc2\x0d\xc6\x30\xac\xb9\xf3\xa6\x8d\xb6\xc4\x8b\x82\x12\x1c\x3f\x4c\xb4\xb5\xf1\xdd\x61\xd0\xe7\x65\xc8\x8e\x59\x85\xc2\xd7\x2b\x43\x71\x2d\xd6\xc1\x66\x53\x30\xb4\xbe\xb2\xb2\x28\xce\x9c\x94\x2b\x72\x4a\xa9\x02\xe5\xaa\x92\x6a\x93\x98\x03\x96\xe2\xd6\x58\x63\x36\xe0\x74\xb7\x1c\xae\x84\x78\x9a\xd2\x2a\x99\xd5\xde\xa5\xd1\xde\x9a\xb7\x83\x60\xda\x1d\xe0\xf8\x09\x8e\x21\x7d\xb4\x2b\x96\xf1\x2b\xb0\x72\x0a\xed\xb1\x7b\x08\x7d\x31\x68\x23\xc5\x76\x5d\xab\xd2\xe5\xd1\xfa\xcd\x70\x21\xb4\x59\x82\x75\x58\x08\x7f\x56\x5f\xe8\x7b\x43\x43\x41\xa8\x76\x14\x23\x2f\x60\xf2\xc5\x1d\x95\x21\x14\xd7\x36\xd5\xe4\xa1\xa1\x46\x5c\xf6\xd8\x16\x52\x82\xfb\x33\x70\x96\xbe\x5a\x59\xaa\x74\xe7\xec\xf5\x64\xb8\xcd\x8d\xc8\x8f\xbe\x6d\x7f\x5d\x01\x25\xa1\x96\xb7\xae\x1c\x67\x0f\x7b\xa6\x85\x04\x16\xa6\xfe\x7b\xac\x53\xaf\x53\xa4\xc7\xa3\xd3\x1f\xb8\xd8\x1f\x44\xea\xdb\x87\x8a\x3d\xd0\xa3\x06\x78\x10\xec\x91\x01\x7f\x8e\xd4\x93\x3a\xd3\x27\xde\x09\x38\xd5\x7a\xf9\xbf\x2e\xd2\xf6\x92\x7e\xd9\xcb\x67\x65\xfd\x60\x1a\x75\x9d\xb0\x48\xf0\x12\xd3\x7e\x0e\x76\xef\x10\xee\xc4\x53\x64\x1f\x9d\xf0\x2b\x62\x35\x85\xf8\x9e\x3a\x2d\x08\xf1\xf1\x64\x36\xd2\xe4\xbb\xe0\x93\x9d\x94\x44\x5b\x59\xed\xdb\x98\xe4\x0a\xf5\x37\x0d\x08\x01\x36\x5e\x9b\x73\x22\x05\xd7\x38\xd7\x80\xb0\x3b\xeb\x3d\xeb\xed\x5d\x21\xf0\x99\x42\xe8\x0d\x96\x06\x38\x6f\xfb\x4c\xdf\x70\xcb\x6c\x9f\xc1\xab\x1d\x2b\xd5\x2d\xc4\x74\x3c\x6b\xcf\x66\xbd\x29\x4d\x2a\xb7\x5b\x9a\xf4\x90\x5a\x63\x86\x0a\xd4\xd4\xa4\xd6\x05\xc4\xd2\x0f\x75\x0f\x1f\xef\xff\xb6\xfa\xf1\x08\x6c\xab\xff\x8b\x96\xb7\xd5\x9b\xdd\x0c\x03\x9b\x67\xd6\xf9\x9d\xf8\xc7\x28\xb6\x49\xcf\xc1\x45\xcd\x72\x80\x61\x65\xca\x1a\x16\x14\x90\x31\xa8\xc0\x40\x0b\xc7\x21\x00\xaa\x98\x59\x5b\x2f\xd6\x8e\xb5\x24\x85\x87\xd9\xf8\x15\xb7\x6e\xa7\x02\x89\x34\x0a\xcb\x21\x3d\x7c\xe4\xd6\xcf\x99\xca\x44\x86\x18\x2d\xb0\xce\xd9\xc5\x6b\xa4\x9e\x58\xb5\x66\x2f\x36\x96\x51\xb9\x81\x10\x48\xb3\x57\x57\xa5\xf4\xd4\xa6\x3c\xe7\x24\xc9\x2d\xa8\xe1\xef\xbf\x5b\x81\xb9\x16\x5d\x88\x86\xd7\xd0\x42\x68\x13\x0f\xa9\x7a\xcb\x00\x26\x03\x6a\x48\xbd\x0d\x89\xf9\x58\xa0\x06\x54\xa6\x72\x03\x52\x3f\xab\xf7\xd2\x61\xb3\x2b\xc1\xae\x72\x4a\xd0\xb7\x95\x83\x3b\x52\x83\xcd\x06\x0d\x90\xb7\xde\x28\xc4\xb6\xbb\x3c\x3b\x77\xdd\x25\x85\xa6\x57\x12\x56\x67\x67\x90\xc1\x99\xe3\xdb\x65\xd3\xdc\xe1\x0b\xd5\x4a\xa1\x12\x5b\x7f\x38\xee\x79\xdd\x9f\x81\x96\x78\xd7\xe6\x4a\xf1\x37\x77\x64\xf1\xdf\x9a\xef\x2b\x94\xce\xce\x43\x32\xd7\x56\xb0\x8f\xd0\x22\x5d\xb3\xfd\xc3\xcd\x01\xee\xe2\x6b\xb1\x6f\xe9\xb1\x1f\xe0\xaa\x72\xc9\xff\xec\xf4\xd0\xc5\xc6\x72\x57\xb3\x43\x9a\x26\x55\xf9\x90\xa5\x59\xf4\xff\x99\xe7\xcd\x7c\x24\xcc\x62\x6e\x79\x94\x9a\xda\x90\xa9\x80\xda\x94\x40\xe3\xf0\x4d\x01\xb3\xfb\x92\xa2\xd9\x0d\x5e\x0a\x11\x1e\xbe\xe4\xfe\x30\xdf\x22\x3d\x3f\x1b\x0c\x4a\x4f\xed\xb8\xf5\x1a\xa7\xa3\x1e\x0c\x84\xb8\x1b\x2c\x7d\x3b\x30\x77\xd5\xb9\x56\x4d\xcd\x8d\x3d\x3f\x70\x4c\xe9\x0d\x00\x75\xb5\x2a\x36\xb1\x75\x1d\x78\xa8\x12\xba\x23\x2e\xa2\x16\xc9\x67\xe8\x0b\xef\x61\x05\x6a\x7d\x2c\x4d\x14\xa1\xb7\xe5\x03\x4e\x37\x1c\xcc\x5a\xb5\x96\xd0\x4d\xbb\x2e\x51\x16\x80\xf5\x6f\x4d\x29\x19\xa0\x6e\xd2\xdd\xc2\x36\xc6\xe0\xc1\x66\xe1\xb0\x36\x21\x80\xde\xd0\xc3\x13\x1a\x58\xff\xdb\xa0\x4d\xe5\xcd\x01\xb9\x01\x1f\xa0\x1d\x50\x65\xdc\xd9\x95\x3e\x30\x81\xcd\x32\x78\xd2\x87\x8b\x25\x36\xfd\xd7\x53\x85\x03\x26\x8a\xaa\x95\x17\xe3\x38\x07\x3f\x0d\x41\xcf\x7b\x3c\xe4\x42\x79\xa8\xc3\x62\xa5\x2e\x22\xf3\x12\xf2\x44\x71\xa8\xc6\xb9\xbd\x03\x72\x78\x92\x6f\x43\xb0\xd0\x2f\xa0\x5e\xa1\x31\x05\x4a\x33\xf7\x47\x44\xc5\x43\x41\x70\x42\xe3\xb4\x9a\xdd\x06\x6b\xeb\xb8\xce\x1a\x04\x0a\x38\x42\x83\x8d\xbb\x6e\x4d\x41\xd9\x03\x95\x14\x5d\x9f\x3c\xaf\x8a\x9b\xad\x88\x0e\xa9\x2f\x7a\x44\xf6\xf9\xc1\x08\xf2\xb1\x4a\x86\x4f\x4a\x6a\x40\x45\x72\xd5\xd6\xf8\x7e\xf9\xb8\x0e\x17\x57\xe7\x08\xf4\xf8\xd9\x86\x3b\xf4\x07\x6f\x28\x1d\x85\x0a\x69\xcf\x3d\x76\x7a\xee\xbd\x15\x39\xfc\x53\xe1\x06\xf9\x70\x6e\x8c\xfd\x90\x38\x22\x58\xd3\xfc\x5f\xc4\xff\x8f\xa2\x2a\xed\x88\x30\xc0\x21\xc7\xbc\x03\x9d\x53\xa4\xb2\xdc\x2f\xee\xcd\x14\x55\x8e\xd1\xb9\xc0\xc9\x66\xe8\xa7\xd9\xfb\x4a\x45\x39\x1b\x92\x30\x4e\x75\x64\xf9\x44\x50\x9e\x0c\x21\x13\xaf\xa5\x0e\xf4\x3c\xbf\x02\x89\xe5\x93\x89\x49\x98\x57\x92\x5c\x59\x93\x2e\x9d\xf3\x80\x79\xe0\xbd\x2b\xc2\x11\x72\xdf\x9d\xea\x42\x50\x50\x93\x5c\x9a\x18\x50\x47\x46\x47\x82\xff\x63\x3a\xfc\x91\x3e\x67\x95\x78\xd9\xab\xa7\x77\x1a\x66\xaf\xdc\x55\xd0\xbc\x49\x3b\xac\xfb\x72\x15\x29\x8a\x85\xfa\x9a\xdd\x1d\x3e\x0b\x7b\xb7\xe8\x2f\x64\xdd\xe6\xef\x2f\x5c\x76\xb0\x57\x04\x5d\x34\xc9\x9e\x02\x7a\x93\xf0\x9f\xa4\xd1\xf4\x30\xad\x32\xff\xe3\x1d\x4d\x52\xc3\x38\xdc\x2d\x82\xd3\xa0\x47\xd2\x53\x45\x8d\x12\x82\x7f\x29\x4c\x26\xa0\x12\x3e\x8e\x3a\xfd\x9e\xba\x6e\x1d\x8c\x95\x42\xb8\x4d\xfd\x9b\xc3\x1d\x94\xa9\x96\xd6\xab\xca\x23\x4d\x4f\x7e\x5d\x52\xee\xb6\x26\xbf\x2a\xce\x59\x5f\x9a\x3f\xae\xf7\xf5\xd6\xdb\x8a\x60\x33\x33\xd2\xeb\xc5\x6e\xa8\xa7\xd7\x76\x65\xb4\x73\x53\x19\x71\x29\xd8\xec\x8e\x12\x39\xab\x89\x1a\x68\xbb\xb4\x7a\xa0\x86\xe6\x05\xc7\xa0\xe8\xc4\xeb\xd8\x07\xb5\xca\x6d\x94\x2a\xde\x35\x22\x22\xfe\x5a\xd6\x18\x35\xd4\xe5\xf6\xf1\x75\x5d\xaa\xd3\x57\x21\x25\x20\x91\xb2\x70\x19\x36\xc0\xda\x16\x7a\x66\xa1\x0a\x5f\x3d\xf7\xcb\xab\xbc\xaa\x94\xf6\x3a\x21\xa3\xd0\xff\x39\x65\xae\xc8\x48\x5f\xd2\x2f\xe0\xd8\x1c\x19\xd8\x71\xd7\x80\xbb\x62\x3c\xbc\xdd\xcf\x99\x19\x42\xd5\x93\x3f\x88\xf7\xdb\x1f\xef\x6e\x5d\x4f\x57\xf3\xaa\xed\x47\x1a\xdd\xab\x42\x0e\x7b\x95\x5c\x5a\x0b\x0a\x09\xa0\xa2\xec\xdd\xc4\x03\x20\x69\xf3\xe4\x4d\xef\x8e\x5e\x4e\x26\x1a\x2a\xe5\xd0\xc2\x06\x6d\x2f\x3d\xce\x6a\x70\x57\x82\x3a\x94\xd0\x9a\xc7\xd1\xfb\xe2\x10\x3f\xd1\xc5\xd1\xf4\x09\x39\xa6\x97\xe3\xee\xda\x9c\xd1\xef\x41\xce\x61\x77\x12\xd8\xf3\x3b\xd2\x83\xf6\x7c\xa3\x1f\x46\x14\x77\x68\xf7\xb1\x66\x28\xe6\xee\x90\x85\x3a\x25\x72\x46\x59\xa7\x5d\x19\x99\x56\xfa\x18\x0e\xa5\x8c\x18\x76\x89\x14\xee\xff\x88\xa5\xec\x39\x85\x06\x9b\xf7\xbc\xf6\xf4\x82\xa2\xe9\x4a\xc8\x1b\x81\xee\xbe\x7f\x73\x86\xbc\x2b\x08\x77\x10\x8a\xa5\x29\x26\x0e\x10\xd3\x02\x12\x73\x95\xc8\x9a\x64\xd6\x0e\x8f\x1c\xee\x69\x73\xe5\x37\x4f\xf9\xe0\x7e\x8b\x01\xeb\x81\x50\x96\x2d\x12\x5c\xb6\x8f\x94\xac\xac\x8f\x1b\x8a\x69\x10\x5f\x0b\x6d\x25\x1b\xc7\x31\xb1\x69\xbb\xc9\x72\xd8\xee\x5a\xf8\x9f\x7d\xd2\x3f\xf6\xf4\xe0\x9a\xc5\xea\xfe\x3f\xaa\x38\xc1\x26\x7b\x15\xdd\x6f\xbb\xc3\x80\xdc\x63\x43\x94\x58\x53\x53\xbc\xb5\x9b\xea\x63\x1f\xaa\x8f\xa9\xf9\x36\xc0\x7c\xd3\xcd\x3e\xdc\x26\x6d\x35\x55\x5b\x5b\x64\xc3\x53\x49\x4d\xb3\x09\x58\xa0\x14\x19\x24\xe1\x3e\x84\xfb\x25\x37\x68\x57\x48\xfb\xde\x5b\xac\xc6\x3c\xc8\xb7\x2f\x6c\x31\xeb\xe4\x4b\xfa\xe5\x06\x07\x64\xb2\x4b\x37\xed\x4a\x6c\x32\x1c\x92\x34\x83\x40\xcf\x93\x73\x6e\x94\x58\xbb\xb8\x76\x55\x3c\x1f\x11\xae\xd0\x4c\x83\xe0\x10\x01\x1f\xfe\x56\xe3\xdd\xdb\x6a\x26\xc5\x60\x8b\xf1\xf3\x86\xcc\xac\xef\xcd\x3d\xcb\x27\x7d\x53\x87\x67\x40\x66\x00\xc3\x79\x97\xc7\x2d\x2e\x2c\xee\x7b\x63\x72\x5b\x3a\x65\x45\xa9\xd2\x5b\x59\x6d\xf0\xf2\xf2\xac\x9d\xcd\xa7\x97\x95\xed\x8d\x34\x67\x56\x20\x5b\x09\x11\x31\xe4\x4d\xab\xe6\x03\x16\x87\x1d\x30\xec\x63\x48\x9d\xd0\xb0\x80\x0b\x3f\xf4\x08\x53\x30\x2c\xea\xf6\x59\x3d\x4e\xe2\xb3\x55\xad\x0b\xc5\xd1\x9a\xf2\xf4\x88\xfc\x51\x64\x06\x8e\x10\x9f\x09\xd5\xb3\x5d\x19\x10\x5b\xd8\xc6\x6d\x88\xb3\x3c\xf8\x4f\x76\x91\xad\xe4\x45\x65\x1b\x44\xbe\x29\xd8\x36\xbe\x23\x46\xb3\xfd\x84\xa6\x46\xeb\x4c\x89\x06\xb2\x8d\x7b\xd6\xca\x5d\xfa\x63\x5b\x61\x02\xa1\xa1\xae\x75\xb6\xba\x6f\x5e\x0e\xfc\x0c\x25\xb3\x88\x2f\x6e\xe3\x72\xeb\xdf\x8b\xdf\xf5\x93\x38\x3d\xf9\x7e\x8c\x73\xd2\xe4\xc0\x36\x5a\x7f\xe0\xe0\x8b\x3a\x3e\xd7\xfa\xd3\x63\x93\xae\xdb\xf8\x08\x7b\x8f\x6d\x9c\xd2\xae\xa4\x23\x88\xb0\x31\x81\x03\x62\x6b\x94\x95\x1b\xc7\xf5\x13\x5c\x27\x2c\x14\x89\x75\x41\x6b\x6d\xd3\xa6\x3d\x3f\xce\x55\xd7\xae\x0e\xa3\xec\x7a\x71\x10\x09\xd5\x05\x02\x4a\x78\x6f\xf4\x2c\x5f\x47\x98\x4d\x5d\x57\x49\xb4\xad\xf9\xd5\x11\x33\x4f\xa1\xd1\x86\xe4\x53\x2a\x74\x7d\x64\x61\x61\x48\x63\x31\x43\xf2\xb2\xd9\x6c\x58\xc2\x5b\xee\x22\x6d\xef\x10\x64\xbb\xe6\xe2\x7c\x7f\xf8\xaa\xb7\x3d\x00\x8f\x27\x0d\xd6\xcd\x93\xf6\x78\xba\xf8\x00\x20\xd1\x56\x09\x70\x01\xbc\x5b\xc8\xf1\xda\x25\x7a\xd6\x1a\x13\xa2\x28\xc4\xa6\x93\x35\xe6\xec\xc3\x8b\x8c\xad\x34\x10\xf5\x19\x01\xa8\xbe\x67\x68\x0b\x61\xb5\x2e\x31\xd7\x86\xa6\xed\x07\xfd\xef\x08\xcd\xb9\xfd\x26\x8d\x68\x73\xbf\x43\x02\xca\xaa\x71\x57\xf4\x82\x74\x7d\xf6\xca\x7f\x25\xbc\xa6\x2a\x02\xd3\x4e\xdc\x6c\xbd\x06\xfe\x0b\x79\xe6\x8b\x90\xe4\xd5\x64\x3a\x05\xd0\xe3\xbe\x5b\xfa\x93\xd8\x1f\x94\xd8\x74\x6b\x8b\x9e\x0a\xbf\x0c\xb8\xf9\x5d\x02\x99\x67\x99\xee\x2c\xa5\x36\x64\x66\x12\x80\xa1\x10\xba\x6b\xaf\xa4\x33\x85\x53\xb6\x21\x37\x03\xd7\x2f\x50\xcf\x7a\x73\x3b\x3f\xb6\x2c\xeb\xc7\x1b\x7d\x2b\xa2\x03\xbe\xde\xd1\xb7\x33\xc4\x0c\x59\x64\xec\x51\x3d\xcb\xbe\x47\x4a\x7c\xf9\x87\x49\x65\x36\xca\x35\xac\xf7\xcf\xc9\x6f\xb5\x96\x82\x73\x9c\x20\x2b\xcc\x0c\x2d\xad\x48\x24\x67\x8d\xb6\xde\x49\x86\x70\x6b\xfd\xea\x14\x22\xed\x41\xd1\x4d\xf2\x6b\xaf\x48\x76\x59\xeb\xad\x12\x62\x80\xdc\xaa\x49\xf3\xad\x29\xf8\xb0\x56\x4e\xad\x59\xa9\x86\x0b\xda\xfd\xf6\xa1\x36\x0a\xb1\x51\x2f\x13\x06\x04\x71\xbe\xb9\x85\x04\x9c\x04\xc3\x30\x20\xf3\x43\xd8\xbd\xe3\x47\x01\xdd\xda\xfe\x9b\x8a\x34\x97\xad\x3b\xaf\x94\x4c\xb8\xfa\x67\xb6\x74\x6b\xf1\xd0\xfb\xea\x02\x92\x13\xd7\xa0\x89\x75\x79\x26\x97\x71\xf3\x4b\xb2\x8b\x0d\x42\xa6\x61\x26\xa2\xae\xe2\x59\x59\x29\xd5\x5f\xeb\x61\x3e\x39\x3f\xb2\x96\xa9\x6b\xc4\x4d\x12\x50\x95\x30\x32\xfc\x12\x9a\xb4\xd2\xf2\xe7\x64\x4d\xb4\x66\x34\xc1\x7a\x7a\x20\x61\x52\xbc\x8d\xb1\x4f\xb0\x8d\x25\xcb\x06\xc5\x38\x76\xfe\x57\x4a\xa6\x10\x15\x8a\xac\x61\x7a\x46\x65\x1c\x6a\xa3\x7a\xc9\x9a\x9f\xcf\xbe\x23\xb8\xa8\x94\x57\xcb\x6a\x33\xd7\x88\xb2\x1b\xd0\x46\xe4\x22\x40\x37\x6e\xd3\x9a\xb1\x8e\xff\xe7\x40\x79\x72\x06\xfc\x66\x42\x86\xd6\xa5\xf5\xd2\xa7\x4a\xec\xed\xdd\xa4\x95\xf6\xe6\x2c\xba\x55\xe3\x94\xb5\x53\x1e\x81\x8b\x55\xfa\x10\x57\xf7\x34\x5d\xb7\x3f\x14\xe2\x4b\x87\xb9\x68\x26\xe4\xb8\xdf\x82\xf0\x1c\x02\x5d\x89\x9b\x85\xc2\x93\x0d\x68\x5b\xd1\xf1\x38\x9b\x0e\xf3\xbc\x50\x9a\xe3\xce\x98\x47\xe6\x1d\x4f\xbb\x46\xcf\x40\xaa\x38\x5d\xdf\x47\x53\x51\x8e\x15\xf6\x72\xec\x99\xd7\xab\xfb\xad\xf0\xff\x50\x8e\xd6\x89\x37\xf8\x0b\xaf\x94\x8c\xf3\x0f\x8c\xbf\x1a\x04\x0e\xea\xd8\xfd\x85\xc2\xde\x93\x43\xa4\x3e\x76\x47\x3a\xa6\x04\x12\x53\x27\xda\xad\xd1\x56\xac\x69\xe4\x5c\x92\x01\xe8\xdb\x09\xce\x9e\xb2\x4b\x51\x3a\x5c\x00\x7c\x64\x51\xbc\x12\xcd\xd8\x00\xfe\x73\xf1\xb9\x33\xd4\xaf\x6e\x8e\x82\x96\x5b\x29\x87\xd6\x86\xf2\xf5\x59\xdc\x02\xcf\x77\xbf\xd7\x3f\xd7\xee\xba\x17\x06\x62\x97\xdb\xeb\x82\x45\x4e\x40\x56\x52\xb2\x0b\x54\x60\x09\xb2\xb5\xcf\x79\x59\xa7\xca\x6b\xcc\x05\x46\x5d\x89\x80\xd2\x73\x77\xaf\x37\x0d\xe7\xa7\x04\xe9\xec\x1d\xee\xda\x6d\x92\xb7\x5e\x9c\x4b\xe2\x27\xc1\xc8\x5d\xff\xa3\x5d\xe1\xd2\xa4\x8b\x60\xe0\xe1\xb3\x49\x0b\x9c\x00\x56\x89\xd1\x15\x89\xe9\xb9\xce\x36\x7f\x5a\x7d\x25\x7a\x9d\x02\x35\xee\x5b\xaf\xee\x87\x66\x6d\xcf\xc6\x48\x2f\x58\x1d\xd4\x9b\x63\xbf\x7f\xa1\x16\xc0\x52\xdb\xc1\x0d\x5b\x8f\x43\x2f\x15\xb2\x71\x0e\xe0\xee\xdc\xb8\xdd\xbc\xce\x99\x92\x6a\x55\x69\x7b\x8b\x0c\x6c\x08\x43\x32\x6f\xfc\xde\x3c\xfe\xc0\xfe\xfc\x82\x18\xef\x5c\x9e\xcc\x25\xc5\x12\x0a\x0c\xfc\xa4\xcb\xb6\xb3\x59\x5c\x82\x55\x4b\xd9\xba\x46\x64\x23\xa0\x2e\x58\xc7\xee\x0b\x14\xeb\x74\x52\xab\x0e\xbd\xb0\xa1\x90\x34\xe1\x56\xa4\x5b\x0a\x40\x94\x28\xc4\xeb\xec\x29\x48\x4e\x6c\x01\x31\xe2\xc8\x5d\xd5\x4e\x93\x2e\x0b\x3e\xc1\x4c\xc0\xf9\x66\x07\xff\x49\xe6\xce\xaf\xa1\xb4\xa5\x4b\xd8\xd9\x87\x18\xc3\x38\xeb\x99\x7d\x23\xd3\x0e\x1e\xa1\xd2\xb8\x73\xb6\x2e\x4a\x5e\x75\xf8\xd9\x2d\xd4\x39\x88\x14\x4b\x5b\x1c\x6f\x35\x34\x8b\xd7\xae\xdc\x3a\x77\xb9\x44\x1b\x9d\xf2\xb6\x60\x6c\xda\x9f\x6b\x99\x24\x5a\x08\x67\x28\x96\x56\x39\xfb\xbf\x7c\x54\xd9\x45\xf2\x10\x19\xa4\xdc\x1d\xe8\xfd\xac\x97\x17\xe6\xd1\xfd\x47\xc5\x3c\x2f\x76\x69\xe4\x45\xbb\x0a\x94\xa4\x86\xb7\xc3\x40\xdd\x7f\x5d\xde\x0e\x4c\xf5\xf3\x6a\xb3\xb4\xb4\xb8\x50\xc8\x1f\x5a\xe0\x36\xa8\x35\x92\xf4\x5e\x32\x05\x97\x96\x9c\x57\xe9\xec\x25\xf7\x61\x59\x22\x97\xc8\xc0\xca\x53\xe9\x94\xd6\x52\x84\xe0\x5d\x97\x0a\x24\x7d\xf0\x24\x3c\xbd\x3e\x86\x88\x1e\xdf\x31\xab\x72\x6e\x95\x08\xbf\xd9\xd8\x96\x1b\x1e\x2a\xd6\x9b\x9b\x1d\x49\x00\x7e\xd1\x21\x8c\x68\x15\x97\x57\xc7\x4b\x0c\xdc\x1d\xfc\x3f\xaa\xde\x2e\xd9\x59\x9e\x07\x16\xbd\x3f\xc3\x78\xe7\x75\x2e\x0c\x18\x70\x02\x98\x8f\x9f\xe4\x49\xaa\xf6\xdc\xb7\x5a\xdd\x72\xd6\xae\x5a\x55\x6e\x58\x04\x0c\x18\x5b\x96\xa5\xee\x85\x80\x9c\x8e\x9a\xfc\x3e\xd3\x4a\xce\xc1\xe4\x31\x27\xc1\xf4\xb7\x2c\x7f\x98\xe0\x9f\x21\xfc\xfc\x4c\xa3\xbe\x73\x2d\xdc\x3e\x53\x17\xf7\x92\xca\xec\x7d\xdd\xe3\x66\x7b\x79\x54\x17\x26\xe5\xeb\x79\xd4\x07\x3b\x58\xf0\xf1\x69\x15\xe5\x51\x07\xb1\xf6\xa5\x9e\x52\xd3\x8f\xb2\xc5\x02\xd6\x03\xd3\x5f\x52\xf9\x79\x08\x87\xb7\x88\x47\xa6\xa7\xe0\x61\x13\x30\x72\xf0\x65\xbb\x6b\xf9\xd3\x80\xa7\xa0\xc4\x7e\xa4\x77\xd0\x17\x3d\x40\x95\xe1\x4d\xdc\x7a\xf1\xe3\xa3\x52\xc3\xa9\x43\x7f\xce\x60\xf8\xbb\x78\xd4\x56\x79\x8a\x4d\xaa\xed\x86\xa4\x55\xfd\x48\x4b\x65\x4d\xcc\x02\x1d\xf8\xbf\x89\xf7\x95\x7a\x0f\x68\x71\xc8\xc9\x53\x79\xd3\xfd\x0c\x35\x41\xf6\x07\x66\x53\xfb\xc1\x88\x4b\x67\x63\x28\x27\x5d\x2e\x56\x9a\xf5\xe8\x68\x73\xde\x79\x47\x63\x7c\x83\xa5\xa3\xcf\x69\xfe\x88\x4e\xee\x23\x02\xbb\x8f\xc7\xb9\xfa\xae\xb7\x3b\x11\x66\x4f\xbb\x0e\x92\x3a\x6c\x84\x0e\xdb\xac\xd0\x90\xf9\x3e\x16\x28\x0c\x9c\x8e\x23\x4e\x6d\x76\xcb\x32\x7e\xb6\x9c\xfc\xc5\xa2\xed\x39\x38\xcb\x6e\xf9\x7d\x0d\xc0\x04\xe0\x39\xc6\x71\x0d\xb9\x88\x19\xce\x0a\xef\x0e\x67\xeb\xe5\xeb\x8b\xaf\x60\xae\xef\x41\x7c\x80\x8d\x54\xdf\x8c\x07\xf7\x14\xc3\x88\xb0\xcf\x88\xbd\x23\x36\x48\xdd\xa7\xbc\x5f\x9b\xc3\x50\xd8\xc3\x40\x4c\xd6\xe7\xba\x93\xd3\xad\x56\x95\x9b\xa8\xf5\x16\xeb\x10\x0b\xd1\x59\x57\x49\x04\xd9\x46\xe5\xc4\xc5\xd0\x1a\x22\x84\x33\x86\x81\xa2\x9a\xcc\x6d\x21\xca\x70\xb0\x82\xcc\x75\x22\x03\x8d\x01\xa6\xae\x19\x68\x4f\xd6\x5e\xa8\xfd\xe6\x0a\x4e\xc3\x58\xd1\x87\x0e\x9b\x17\x79\x0c\xf6\xb6\xaa\x99\xed\x5c\x38\x30\x92\xe9\x2f\x3c\x19\x10\xe5\x03\xbb\x3f\xa1\xf8\x82\x90\x04\x78\xf1\x37\x5b\x63\x21\x2c\x5b\x5a\x1b\xe3\x1f\x6f\xd8\x5b\xbb\x5c\xeb\x33\x5c\x14\x3f\x1e\x40\xf4\x2c\x24\xc3\x8b\x26\x93\x3d\x76\x0e\xb3\x48\x2f\x8e\x20\x66\x74\xf9\xd3\x60\xc6\x13\x57\x64\x0e\x02\x3d\xe4\x09\xfe\xe4\x06\xc1\x7d\x12\xf4\x78\x7f\xe8\xf4\x22\x0a\x90\xf1\x01\x41\xef\xa7\xaa\xd8\xa7\xaa\x1d\x8b\x96\x61\xe7\xfc\xa3\xc5\x81\xef\x23\x18\xef\xe0\x03\xd9\x42\xc9\x1b\x84\x7d\x75\xd3\x55\xcb\x26\x1a\x3a\x30\xb5\xb0\xfa\x25\x18\x73\xe6\x3c\x91\xff\x79\xce\xe3\x78\xe8\x07\xea\x95\x67\x30\xb7\x74\xe2\xb5\xcb\x9e\xa3\xbf\x09\xc6\xb3\x84\xb4\x3b\x6b\x02\xe6\xbe\xc8\x93\x9d\xd3\x5b\x77\x8c\xa5\xe0\xb8\x12\xd6\x93\x38\x7d\x83\x33\x55\xc2\x51\x73\x0a\x82\xbd\xe3\xfd\xa3\xee\x3b\x79\xd4\x11\x4a\x62\x4e\xdd\xc7\xd2\xd9\xe2\xb4\x6f\x50\xc3\x4c\x4e\x66\xd9\xf6\xe6\x55\xa4\x7c\xa1\x88\x37\xd3\x47\x60\x03\xa3\x08\x05\x23\xc5\x0d\x2e\xa9\x68\xe7\xa9\xc4\x47\x43\x02\x3e\xd5\x74\x26\xc5\xe0\x14\xe4\x7c\x41\x5b\x69\xa6\x75\x63\x4e\x4c\xb9\x71\xf0\x21\xb6\x48\x0e\xc5\x99\x74\xda\x73\xb2\x7e\xcc\x03\x4f\xa7\x17\x16\x6d\xc8\x90\x75\xdb\x15\xd4\xb9\x03\x93\xb8\x7a\xba\x49\x60\x6b\x25\x59\x6d\x9a\xd6\xd0\xd4\x3c\x25\xd3\x2d\x6e\x3e\x0a\x2d\x80\xe1\x2f\x18\x21\xc0\xe7\xe7\x95\x98\xee\x01\xbe\x52\x7e\x6b\x13\xa6\xb8\x24\xcd\xba\x91\x5a\x76\x90\x73\xcf\x3a\x2c\xce\xf0\x0d\x92\x48\x0b\x0b\x8d\x2c\xcf\xd3\x0c\xbe\x51\x58\xe7\x36\xd4\xb1\x83\x06\xf7\xde\x15\x68\x09\x22\xbd\x90\x59\x9c\x8e\xfc\x4e\xe4\xf0\xcb\x8d\x98\xb0\x51\x5e\x4c\x8a\x9c\xb4\xb2\x9d\xf8\xf7\xaf\x6d\x8b\x5d\x1b\x67\x86\x58\xd1\x8a\x7f\x76\x4a\x42\x9e\x2a\x17\x4d\x27\x08\x46\xf9\xff\x6c\x04\x0b\x8a\x40\x0c\x66\x71\x62\x28\xc7\x89\x80\x8f\x87\xf9\xf2\x1a\x09\xef\x18\xbe\x35\x55\x67\xc7\x12\x1c\x74\x7b\xc8\x14\x22\x8b\x5a\xdd\x5c\x83\x42\x30\x31\x05\x6b\xaa\x6d\xdd\x0c\x74\x7d\xab\xf8\xfa\x1a\x5b\x9f\x7d\xc5\x25\xc2\x4d\xa6\xca\x14\x65\x1b\xed\xbe\x64\x37\xab\x64\xb0\x03\xb7\x32\xaf\xb6\x78\x02\x92\x6c\x2c\x6d\xc5\x46\x52\x07\x39\x89\xf4\x8c\x32\x51\x01\xf9\xaf\x42\x2f\xef\xc4\xf9\xbd\x5f\xac\xac\x8b\xf6\x41\x5c\x54\x04\x7d\x25\x7c\x3c\x13\x13\x86\x06\x42\xaf\x7d\x28\xca\x4d\xe1\x90\x05\x9b\x9e\x0f\xeb\x93\xf3\xf3\xfc\x47\x2e\xbd\x5b\xf3\x51\xe7\xd5\xc3\xfc\xf4\xe4\xa6\x73\x54\xea\xa1\xe7\x83\xb3\x08\x00\xbe\x92\x1c\x99\x59\x86\x0a\x49\xf7\x40\x06\x9c\xff\x13\x93\x1e\x69\xe8\x48\x50\x6f\x05\x96\xcf\x48\xb7\xc7\x34\x70\x9b\x37\x1d\x37\x7f\x5e\xae\x89\x8d\x0d\x0a\x74\xc1\xa3\x37\x47\x5e\xb3\x4d\x27\x0e\xef\xa3\xa7\xf4\x6a\x32\x1e\xce\x9a\x17\x6c\x76\xd7\x0c\x05\xfd\xcc\x8d\xb5\x0a\x4c\xa2\x91\xe3\x67\x95\x22\xbc\x12\x7c\x75\x65\x6a\x7c\x75\xcb\x0f\xfc\xf6\x89\xba\x77\x6a\xb1\xe9\x13\xc9\xe0\x26\x65\x41\x4d\x49\xa6\xd3\x18\x64\x9d\x60\xa1\xfb\x90\x83\x8e\x52\xaf\xe3\xfd\x28\x92\x5d\x1f\xef\xf9\x28\x41\x07\x77\x67\xf2\xbe\x49\x60\x7c\x64\x1c\x0e\xd9\xd2\xc0\x38\x40\x27\x09\xb8\xe6\xc8\x31\x6e\x7d\x77\x09\xfe\xb9\x0c\xd6\x1d\xfe\x2a\x77\xb1\x4f\x84\x76\xa0\x36\x0d\x90\x1b\x87\xdf\x18\x91\xd6\x4e\x08\xe4\xef\x66\xac\xff\x7c\x46\xe2\x7b\x2b\x32\x51\x17\x31\xc5\x35\x4e\xb6\x7a\x70\x68\x1e\xf1\x45\x9c\xea\x6b\x47\xa4\xfd\x91\x97\x8e\x94\xc1\x8e\x06\xba\xc7\x46\x86\x84\x8e\xf0\x77\x71\x91\xc9\x06\xfe\xfb\x60\x1e\x30\x88\xe5\xe6\xc6\x28\xb7\x51\x4c\x65\x04\x2b\x10\x98\x80\xb5\xa2\x65\xdb\xea\x68\x0c\x69\x7a\x3f\xd2\xba\xb6\xc2\x87\xf2\xb1\xbc\x72\x5f\x9d\x1f\x78\x2c\x3f\x35\xa8\xb1\xd4\x48\x17\x35\xc3\xf0\xee\x39\x5b\x1a\xa3\x07\x1b\x8b\xf5\xac\xbe\x24\x38\x7a\x96\xd2\x40\x38\x0c\xa2\xca\x1d\x41\x15\x49\xf7\xe0\xc8\xf9\x94\xff\x2a\x22\xca\xc7\xbc\x92\x70\xce\x5e\x83\xdf\x72\x9e\x83\xdc\x2e\x4b\x2c\x6b\x04\x3f\xa1\x97\x8d\xca\x2e\xbd\x5f\x02\x60\xbe\xd7\xbb\xf2\x14\x64\xfe\x02\x4c\x9b\x66\xdd\x0b\x33\xfd\xdd\x80\xa8\xeb\x8e\xc3\xec\xc9\x24\x28\x5e\xbb\x43\x54\x00\x63\x23\x33\x19\x29\x7d\x34\xa6\x45\xe3\x92\x21\x27\x66\xb1\xf2\xf9\xcb\x1f\x1b\x45\x2c\x02\x36\xbb\xca\x7a\x14\x11\xf9\x99\x05\xc6\x85\x93\x51\xb6\x18\xe9\xed\x08\x90\x75\x45\x9f\xd1\x98\xf8\xa5\xe5\x8f\xdd\x80\xfc\xdf\xf9\xc3\xfe\x13\x1e\x36\x3a\xa3\xf2\x8b\x49\xc4\x6e\x28\x20\x38\x99\x04\x74\x88\xec\x77\x87\x70\x3e\xf7\xca\xc5\x19\x10\x27\x85\x63\x29\x87\x2b\x27\x6b\xb5\x16\xcd\xe7\x40\x9c\xac\xf0\xc6\xc9\x10\x14\x75\x58\x8a\xde\x3a\xef\xbc\xad\x4c\xb1\x38\x64\x01\x32\xc3\x22\x83\xfd\xc1\x07\xf7\xcc\x00\x30\xc4\x5d\x71\x56\xe3\x76\xd8\x27\x40\xd0\xe2\x5d\x5f\x2d\xfb\x99\x49\x96\x3e\x59\x04\x7a\x5a\x87\xcd\x9e\x8a\xe7\x40\x0e\x69\xac\x4a\x1d\xdc\x63\xa6\x11\x33\xbb\xb3\x66\x2e\x7e\x42\x7c\xae\xf2\x40\x80\x46\xd9\xcb\xf9\x88\x5f\xcf\x47\x8c\x63\x79\xa2\xba\x64\x36\x13\xe4\xed\xa5\x42\xfc\xf3\xc8\x1c\x26\xc4\xc3\xf2\x3b\xcb\xc3\xea\x41\x61\xfe\xa0\x20\x00\x7a\x89\x75\xef\x19\xef\x28\x23\x0a\x89\x57\x68\x31\xd0\x19\xe1\xb6\x7c\x4b\x9a\x27\x65\x17\xec\x59\xc8\xcd\x67\xd3\x6d\x0e\x1c\xc8\x90\x0f\x36\x52\x70\xf4\xdd\x85\x19\xc8\xc3\x47\x9c\x7c\x36\x0c\x47\x27\x64\x1b\x6e\x94\x0f\x58\xed\x97\x0b\x83\x38\x0b\x93\xc4\x71\xc0\x62\xd0\x22\xc0\xe6\x69\xa8\xe8\x5f\xec\x5e\x49\x1b\x56\x1d\x21\x9a\xe9\x14\xc9\xdf\x09\x65\x2a\xc1\x5c\x44\xf1\xb7\x6d\x1e\x61\x6a\x40\xf4\x77\xf7\xa6\x25\xa4\x81\x4b\xb1\xc3\x0d\x55\x16\x02\xa6\x6b\x0f\x77\x51\x73\x1e\x6e\xc6\x5d\x0f\xf7\x98\xc9\x3a\xd8\x57\xde\x9a\x47\x27\x64\xc1\xff\xc8\x0c\xe8\xa4\x7a\x20\x93\xc9\x04\xfe\xdd\x0d\x47\xfd\x99\xe7\xb6\xf1\xe4\x3f\x0b\x12\xae\xf8\xff\xf4\x56\x6c\x93\x41\xf1\x01\xda\x97\xef\x97\x93\x65\x33\xd4\xfb\xc9\x47\x5a\x11\x0b\x40\x20\x0e\xbf\x43\x56\x90\xa1\x8d\xcc\x88\x55\x2e\x61\x46\x63\x88\xc6\xce\xe6\x74\x2f\xd1\xff\xc1\x83\xe1\x0f\x0f\xa2\x18\x5e\x32\xba\x60\xa8\x72\x65\x0f\xc5\x17\x88\x86\xf2\x2a\x36\x18\x92\x4c\x75\x28\x52\x6d\x1c\x8a\x12\xe6\x0c\x60\xd9\x4f\xfb\x3a\x9e\xb2\xec\x12\xda\x1c\x1a\x69\xf9\x50\x96\xfb\xab\x73\x60\xb0\x24\x0f\x63\x21\xd3\x2f\x77\x8f\xb1\x10\x32\xc0\xa9\xa5\x06\xc3\xa8\x4b\x21\x45\x9a\xc0\x22\x63\xe3\x07\x7a\xea\x40\x50\xd3\x25\x2a\xc6\xd8\x46\x3e\xe9\x94\x1b\xf2\xbf\x96\xfe\x3b\x38\x8d\x4b\x16\xe2\x4b\xce\xaf\x7a\x91\x4d\x0f\x89\xa8\xe0\x1f\x3e\xb9\xc5\xe8\xf8\x21\xbb\xbb\x58\x8d\x06\x92\xdc\xf4\x39\x18\x2c\x72\x9b\x0c\x98\x15\x9e\x22\x05\x64\x23\xcc\xc8\x7d\x21\xc9\x1f\xd2\x48\x08\xc2\x6f\x68\xd0\xd9\x57\x79\x1d\x39\xe7\x07\xac\xd2\xb0\xee\x36\x5b\x14\x0d\x64\xde\x29\xb2\x07\x1e\xc1\x8f\x76\x6d\x55\x84\x84\x14\xc6\x1b\x5a\x25\xb6\x70\x16\x03\x3e\xb5\x4f\x17\x59\x83\x06\x70\x0d\xf2\x3f\x03\x3d\x7f\x6f\xf5\x3b\xb8\xde\x33\x60\x72\x19\x74\x82\x2f\xfe\x20\x56\xa2\x86\x90\x17\x1b\xd0\x47\xeb\x66\x97\xb9\x7e\x84\xa6\x43\xda\x7d\xc0\x52\xa6\x37\xd8\x33\x22\x0c\x54\x84\x85\xa0\xfc\xa1\x1b\xbc\x3f\x02\x9c\xe6\x18\xb2\x31\x42\xf7\xa9\x40\x6b\x03\xe3\x2f\x82\x76\xc8\x39\x1e\x4d\x4f\x22\x98\xc1\xe3\xd0\x1c\x74\x95\x27\x71\x82\x1d\x47\xa1\x25\xeb\x14\x85\x24\xf0\x31\x28\x26\x44\x1b\xb3\x0a\xbf\x6a\xc9\x02\x0e\xa2\x9e\x74\xc7\x96\x5e\x38\x03\xa7\x86\x24\x4e\x42\x36\x09\xeb\xea\xc4\x6d\x58\x29\xfe\x33\x90\xef\x63\x48\x4d\xfe\x1a\x4c\x86\xfc\x3c\xa8\x0f\x37\xa4\xc6\xc1\x60\x90\x62\xaa\x03\x88\x27\xbc\x7c\xea\x62\x6a\x0a\x29\x42\x8e\x07\x19\x92\x43\x8c\xab\x06\x26\xd6\x91\xae\x81\xfe\x8b\xb5\x62\x5d\xd3\x36\xf6\xc6\x9f\x0c\x7a\x30\x52\xbc\x99\x79\xc2\x14\xaa\xde\x0d\xaa\xaa\x9d\x9d\x93\x5e\xf5\x9c\x35\x7a\x4c\x5d\xfc\x0b\x29\x3f\xe2\x3d\xf4\xc4\x67\x1d\xd1\x75\x1a\xbb\xfb\x13\x09\x6b\x78\x72\xfd\xf1\xb9\x82\xb2\x30\x42\x62\x7a\x74\x78\xc1\xdb\xef\x1b\x6d\x37\xed\x94\x3e\x74\xc6\xfa\xa3\xb4\xdf\x20\x08\x5a\x64\x83\x98\x1e\x92\x43\x31\xbb\x4f\xd6\x4a\xd1\xa3\x21\x44\xa9\x27\x28\x53\x0d\xc0\xbb\x34\xd4\xb1\x74\x05\xad\x45\xff\xe6\x24\xa5\xaf\x1f\xf8\xa6\x83\x55\xf0\x1d\x64\x86\x11\x50\xd5\x23\x1c\x9f\x24\x6b\xce\xaf\x48\x70\xb6\x5d\x67\x12\x0d\xe3\x9f\x49\xb5\x6d\x78\x12\x04\x69\x18\xc5\x05\xc7\x00\x26\x2b\x98\x5e\x0d\xd6\xc5\x74\x73\x17\x82\x97\x44\x7d\x78\x40\x6c\xf1\x20\x14\xf5\x5e\x3d\x9e\xb7\x7e\x91\xc9\x1d\x67\x63\x30\x17\xe8\x7b\xd0\x7e\xea\xa0\x14\x19\x69\x7d\xdd\xa4\xac\xd9\x23\xb2\x28\x7e\xb3\x9d\x37\xbe\x26\xe1\x4b\xa4\x4c\x86\x2b\x03\x27\x40\xf4\x41\xd2\x39\xd0\x5c\xf1\x37\x2b\x13\xee\xa0\xe7\x79\x16\x01\x56\x65\x41\xd0\x0b\x67\xc4\xa0\x74\x0c\xdd\x05\xa7\x77\x0c\x06\xc9\x85\x61\xf8\x08\x72\x7b\xab\xbc\x8e\x5b\xd4\xdb\x64\x79\x3c\x7e\x50\x92\xfa\x3d\x42\x8f\xbc\x9c\xe2\x26\x86\xe0\xa9\x1c\x86\x20\x9d\xec\x9f\x22\xd4\xab\x58\xe5\x0c\x01\xe5\xbe\xca\x3f\xd1\x2f\x11\xc1\x05\x24\xee\xc7\xaa\x44\x16\x43\x4f\x1e\x04\x6d\x80\x95\x68\xc3\xca\xd3\x42\x3c\x8e\xfc\xb7\xcf\xab\xd9\x84\xac\x79\xc7\x97\x54\x8e\xe0\x03\x2c\x47\x52\x63\x2a\xd6\x6c\xbd\xd2\x90\xd0\xe5\x33\x36\x9b\x83\x2d\xb9\x74\x41\x34\x3a\xdf\xd4\x6c\x82\x7e\x9c\xdf\x86\x73\x39\xea\xd3\x37\x83\x6a\xe5\x3f\x11\x69\xae\xef\x8d\x8c\x8e\x27\xa1\xaa\x32\xbb\x2a\x73\x11\xe4\x4f\xf2\xfd\x3a\x48\xed\x81\x98\xdd\x45\x3b\x4f\x3d\x15\xd0\xaf\x71\xf0\x85\x41\xcc\x93\xd8\x8c\x94\xc4\xf8\x10\x9f\x27\x4d\xb8\x53\x3f\xea\xf9\xcd\x69\x0f\x5a\x4f\x83\xca\x38\x07\xdf\xa3\xb2\xf5\xfb\x7c\xf4\x2c\x17\x2e\xa5\xf7\x79\x09\xf2\x42\x66\xb4\xf4\x08\xee\x0d\xf6\xc3\xeb\x0a\x42\x44\x6b\x77\x49\x74\x90\x57\xb2\x8e\x48\xe4\x82\x8d\xee\xb1\xfe\x36\xb9\x12\x0c\x26\xc7\x70\x9a\xf5\x64\xc8\x4a\x82\x94\x1c\x33\xb4\xeb\xc0\x39\x5a\xa1\xf5\xc9\x72\x3c\x81\x48\x6c\x13\xe3\xe2\xc1\x58\xf8\xd8\x30\x13\x66\x09\xf8\xa2\xeb\xc2\x99\x1f\x15\xba\x01\x9c\x24\x44\x87\x20\x92\xe0\x8c\x70\x4e\xc8\xd8\xbb\x54\x55\xf2\x78\xc2\x29\x4f\x38\xe8\x63\x01\x62\x69\xcf\x61\x08\x1e\xc8\x1f\x8d\xe3\x11\xdf\x60\xf2\xd8\x32\x36\x6d\x7c\x14\xea\x8c\xd2\xb6\x8b\xa5\x92\xf4\xbd\x88\x72\x2a\x90\x9e\xe3\xcf\x25\x7a\x05\xa0\x07\xb1\xa9\x39\x63\xa4\x5e\x4b\x20\x96\xce\x62\xa9\x5e\x26\xc2\x7a\x7a\x9b\xe6\x1d\xfa\x2d\x72\x0a\xf5\x6e\x13\x02\x45\x82\x1c\x12\x5f\x81\x98\x34\xa5\xfa\x06\x9a\x48\xcd\x7a\xfa\x14\x6c\x60\xce\x0f\xf9\xe2\xf8\xd9\x43\xe7\x2d\x08\x36\xbb\x23\x0e\xe8\x24\x30\xd9\xc7\x02\x56\x77\xab\x8f\x77\x42\x49\x96\xc1\x28\x16\x92\x2d\xa0\x95\x2c\xa4\x29\xbb\x35\x5c\x18\x20\xaf\xd7\x7d\xca\x2a\x06\xd2\xbf\x8e\xb6\x2e\x02\xc2\x49\xcd\x71\x3a\x67\x8f\x38\x85\x1a\xe3\xe4\xa4\x20\x23\xc0\x83\xe9\x6e\xe0\xa1\x5c\x58\xaa\x1e\x9c\xab\x75\xf7\xaa\x99\x4f\x77\x2b\x56\xa7\xbb\x1f\x6d\x48\xef\xec\x83\x26\x3b\x5c\x48\x17\x76\x68\xcc\x22\x4a\xbb\xd5\x16\xbb\xe3\x5b\x29\x71\xd0\x1d\x9f\x61\x12\xdd\xe3\xbd\x32\x7c\xcc\x79\x25\xc5\xd3\x47\x8a\x60\xfd\xa8\x3e\x49\x59\xd8\x52\xa8\x9c\xd8\x85\xbc\x7c\xe8\x40\x82\x3e\x92\xdf\x5f\x0b\x06\x75\x7d\xda\xc8\xe5\xe1\xf6\xb9\x89\x4d\x12\xa1\x30\x35\xe0\x46\x06\x97\xae\xf1\x84\xd9\x8b\xfa\xea\xa4\xf6\x95\x15\x51\x4c\x9e\x2d\x40\xc8\x09\xc0\x35\x39\x04\x6e\x3b\xa3\x7a\x56\x01\x91\xc4\x3b\xd6\x3d\x25\x59\x89\x86\x4a\x43\x74\x0e\x74\x07\x27\xd8\x9d\xd8\x30\x6c\xa2\x24\xbe\xcb\xfa\x0e\x0e\xc7\xa0\x02\xe9\x68\x36\x76\x9e\x17\x4e\x0e\x47\x9a\x94\x56\x4a\x4e\xc1\xe3\xea\xc5\x7e\xc9\x4c\x87\xae\x4d\x82\xc0\x37\x39\x1f\x8c\xe3\x35\xcc\x77\x5a\xc9\x85\xd0\x55\xe5\x55\x00\x60\x6e\xc4\x9d\x4b\x7e\x88\x89\xb1\x2e\xa2\x43\xed\xaa\x88\xae\xba\x3a\x71\x8a\x62\x20\xf5\xba\x02\x02\xac\xf9\x74\x6a\x9e\xb7\xe0\x50\x44\x36\x3a\x6f\x72\x48\xa4\xe8\xec\xc8\x10\x5a\x45\x11\x79\x8b\xe0\xbb\x43\x0b\xe3\x7a\x44\xb7\x14\xda\x1c\x06\xb6\xde\x8d\x58\xfb\x78\xd4\x9c\x96\xf4\x19\xf8\x48\x16\x7b\x3b\xa4\xf8\x2b\x92\x22\xb1\x81\xf0\x94\x5a\x59\x57\xb4\x0e\xdd\x95\x08\x86\x75\x22\x48\x71\x68\xba\x92\xb1\x37\xc0\xe2\x8a\x76\x68\xac\x67\xb0\x49\x5a\xaf\xce\x83\x7e\x41\x03\x5d\x89\x98\x3b\xb0\x2a\xfb\x9e\x99\x0e\x97\x6e\xe6\xc1\x59\x46\x54\x97\x25\x1a\x63\xe0\x0a\x16\xaa\x2e\xa8\x0b\x63\xee\xe6\x94\x92\x24\x66\x3c\x83\x5a\x30\x8b\xfd\x11\x54\x87\x3c\xb8\xb1\xcc\x23\x46\xbe\xe4\x1f\x12\x10\x13\x2a\x12\x07\x04\xf2\x36\x89\xd8\x35\x44\x1b\x91\x3d\x20\xc2\x4c\x1b\xd7\x07\x77\xee\x74\x79\xe5\x15\x97\x22\x1a\xc7\xb2\x34\x26\xc8\x7b\xd3\x25\xe7\xf0\xc0\x74\xf6\x33\x31\x10\x66\xfa\xd8\xe0\xf4\x0e\x02\xc8\x1b\x89\x24\x34\xfd\x3a\x10\x9b\x68\xf7\xa4\xfb\x4b\x9f\x9b\xc4\x88\x1f\x31\x16\x7e\xc4\xc7\x8b\x29\x4c\x50\x46\x82\x1e\xf2\x0a\xfa\xc3\x4b\x14\xb5\xa9\x25\x79\x18\x9c\x52\x50\x38\x5e\x30\xc7\xb2\xc8\x1a\xc5\x17\x00\x14\xff\xf6\x20\x16\x00\x2c\xc8\xae\x29\x98\x24\x45\x9f\x01\x38\x89\x83\x12\x6f\xfc\x0c\x18\xf4\x8f\x91\x03\x05\x76\xc8\x60\xdb\x6e\x24\x4f\x5d\x92\x94\x06\xa8\x24\xdb\x7d\x1c\xdd\xcd\xd2\xe6\x2d\x97\x50\x9f\xb6\xe0\x93\xec\x74\x8e\x4d\xc4\x93\x9b\x6a\x18\x3c\x41\x5d\x62\x42\x17\xca\xe9\xe6\xb1\xb4\x4e\xad\x1c\x4a\x90\x42\x8a\x74\x72\xe9\xf9\x5a\xc1\x4d\xc4\x5f\x17\x3e\x2d\x79\x23\xbb\xc4\x06\x9d\xc8\xae\xdf\xa5\x29\xd8\x40\x13\x48\x5b\x74\xde\x81\x6d\xc8\x8c\x09\x3e\xb6\xfe\x79\xf3\xa3\x4a\x5a\x67\xc0\x57\x26\x1d\x93\xf4\xee\x18\xa8\xe7\xb4\x91\xa2\x27\x7c\x25\x34\x2b\x87\x37\x79\x8e\xd2\xad\xf5\xcb\x74\x3f\xfc\xcb\xc0\xfb\x6d\x5e\x53\x84\xa0\xd0\xd0\x01\x45\xa4\x76\xb1\xdf\x49\x71\xce\xe3\x2e\xdf\xfb\xbf\xa0\x80\x74\x10\x7c\x89\xd6\x0d\x86\x13\x9b\x64\x8f\x1b\x11\xfa\xf7\x2b\x76\x43\x86\xd5\x2b\x7c\x3c\x83\x17\x32\x66\xd2\x66\xb5\x9b\xe5\x43\xe6\x43\xf9\x10\xcc\x0e\xb9\x69\xcb\x03\x25\x8a\x3e\x9b\x21\xf2\x26\x67\xa3\xf3\xe3\x6f\x84\xd2\x1a\xf7\x65\x37\xe7\x4c\x44\x88\xbe\x5f\x69\x9b\x38\xaf\x73\x01\xfd\x55\x84\x8b\xee\x3a\xe5\xd9\x26\x0d\x50\xee\xca\x65\x03\xc7\xd8\xf0\xe1\x7f\x7b\xb6\x74\xc4\x19\xb3\x71\xa4\x75\x2d\x07\x79\x0b\xa1\xe3\xd3\xbb\x10\x30\x28\x47\xab\xba\xba\xd4\xe8\x02\x80\xe6\x40\xc1\xeb\xb9\xbc\x8a\xbb\x4c\xdc\xb0\x61\x86\x9a\x41\x5a\x20\x56\xe3\xda\xc9\x8a\x0f\x4c\xd8\xd2\xe7\x11\x9a\x13\x04\x96\x0b\x58\x89\x68\xfc\xa5\xe5\x74\x8e\x2d\x24\x7d\x7d\x78\x63\x2d\xfd\x2b\x2d\x71\x3c\x72\x15\x98\xee\xeb\x51\x3c\xda\x5b\x44\x1f\x96\x3c\xa0\x55\x1c\x94\x20\xdb\x1a\x08\xbb\xd2\x18\x2b\xbb\xe6\x8b\x46\x26\x59\xe1\x0d\xe9\xf1\x95\x20\x9d\x3c\x79\xde\xd9\x49\x95\x2b\x53\xf8\x93\x02\x36\x92\xdd\xb3\x9f\xb5\x0f\x1b\xc8\x1e\x11\xdf\x5c\x2f\xf6\xd0\x3e\x7b\xa4\x6e\xea\x4e\x05\x65\x9a\x81\x76\x93\x68\xd2\x90\x0f\x5f\xa9\x13\x31\x66\xc7\xa9\x28\x32\x62\xb9\x9d\x7d\x02\x03\x79\x1a\xfb\x09\xa7\xe0\x29\x69\x81\xfc\xfb\x71\x15\x80\xef\x2d\xa3\xff\x7b\xaf\xd1\xf4\xbf\x37\x03\x6e\xbf\xf7\xcc\x15\x92\xef\x6d\x83\xe2\x39\xa8\xf6\x5f\x3a\x4a\xad\x50\x7a\xfd\xb7\x1e\xe2\xb4\xfa\x52\x94\x0c\x21\x72\x22\xa4\x34\x34\xa9\xe4\x27\xf2\xe5\x6c\xe8\x8b\x0e\xda\x7d\xa3\x86\xfc\x88\x7c\x90\xfa\xfe\x1b\x91\x12\x5f\x4a\x23\x7e\xf3\xc2\xa0\xdd\x2f\x38\xfc\x58\x0e\x9c\x1f\x7c\xad\x9f\x0f\x52\xcb\x97\x4d\x40\x9d\x15\xd3\x1a\xcf\xd7\x9b\xe1\x17\xd9\x4b\x41\x8b\xb9\xd3\x50\x05\x41\x26\x05\x9b\xbf\xd6\xdf\x89\xc0\xf6\x0b\xba\x5c\x82\x75\x47\x52\x98\xc3\x60\xea\x4c\x36\x89\x7d\x30\x18\x13\x1f\x24\xf7\xd9\x40\xfb\xd5\xe5\xdc\x0e\x28\x82\xb8\xda\x87\x79\xd2\x9f\xdb\xab\x0f\xf6\xcc\x89\x79\x35\x9f\x08\xde\xf9\x38\xd9\xf8\x49\x34\x7b\x77\xe8\x24\x9a\x2c\x19\xeb\xfd\x51\xf7\xfb\xfe\xfc\xb8\x11\x83\x63\xf0\x88\xf8\xc8\xb7\xd5\xa2\xf0\xea\x58\xd2\xfb\xb2\x54\xbc\xdf\xdb\x6c\x28\xd1\x59\x56\x91\x6a\xd6\xa5\x17\x5f\xa3\x35\x19\xb2\x27\xc2\x7e\x92\xd7\xe3\x5d\x17\x8e\x4e\xf0\xb1\x86\x50\xe1\x9b\x4b\xd3\x44\xee\x3d\xb3\x32\x56\x17\xc1\xa6\x65\x36\x39\x09\x22\x1b\xf3\x01\x20\xa9\xec\x0c\x85\x62\xfa\x1b\xcb\xd8\xb7\xb8\x24\x0f\x45\xb0\xbc\x8b\x07\x23\xbc\x0b\x93\xa8\xde\x3c\xe7\xa6\x65\x35\xe8\x0f\x8a\x84\x32\x94\x08\x88\xfa\x80\x24\x61\x2c\xc8\x76\xd0\xf5\xe0\xa4\x0b\x42\xcb\xa0\xed\xb4\x96\xdf\xa0\x59\x86\xa5\xe1\x9f\xbd\xe2\x5b\xdb\x9c\x75\x2b\x39\x88\x1e\xed\xe1\xbe\xe9\x85\x06\x7c\xca\x9c\x04\xd6\x33\x06\x1b\xa6\xe6\xb3\xc0\xa2\xd6\x04\x1b\xe6\xc4\x85\x4a\xe0\xf6\x8c\x7c\xf1\x4c\x84\x9a\x86\x49\x6f\x39\x9b\x8d\x15\x67\xcb\xba\x61\x2c\x9f\x05\x89\xa6\x56\x3c\xdf\xe8\x2c\x82\x1a\x34\x37\x0a\x10\x90\x5e\xa2\xf3\xd0\xee\x9e\x1c\x9b\xe5\x74\x65\xb7\x83\x1b\xdb\x8f\x5d\x53\x89\x49\x06\x94\x6c\x06\xa4\xdf\xf4\x33\xe8\xf1\x79\xa2\xf9\xf0\x7e\xd7\x00\x0f\xa7\x0a\xd2\x5b\x99\xc2\xef\x14\x1a\xd0\xef\xf4\x7b\xed\xe9\xf8\x66\xba\x53\xdf\x18\x08\xff\x09\xe8\xde\x6c\x48\xa4\x7d\xfe\x4e\x62\xd3\x7a\x83\xc8\x24\x4e\xd3\xe8\x2b\x91\xe1\x52\x88\x78\xdf\x50\xb2\x60\xa5\x13\xe8\x5d\x37\x21\x57\xfb\x61\xff\x6d\x9b\x76\x3b\x07\xaf\xbc\xa8\x4f\x76\xa4\x9f\x89\x11\xe4\x9d\x34\xc1\x44\xb4\x40\x10\x77\x16\x5e\xb6\xd0\xb1\xf5\x4e\xf3\x6e\x13\x38\x2e\x45\xda\xc6\x12\x87\xc9\x3c\x7c\x83\xdb\xfa\xb9\xc9\xac\x04\xf1\x26\x0f\x1c\x86\x7a\xef\xa7\xa0\x78\x22\x25\x8e\xf2\xba\x9d\xa0\xc9\xad\xc9\xd7\x3d\x41\x19\x4c\x04\x9c\x27\xe5\x1b\x5e\x9e\xf0\xfb\x24\x62\xde\xd7\xab\x22\x1e\xdf\x01\x95\x1c\x5f\xb0\x9e\x9c\x2a\xb2\x44\x26\x3b\xf8\xb1\x05\xce\x3e\x35\xf2\xcd\x4c\x3a\x4d\xb5\x14\x77\x90\x4e\xe9\xbf\x60\xe1\x74\x4e\x4f\x64\xc6\x93\xe7\xb2\x64\xa9\xbe\xbf\xca\xa0\x3c\x95\x57\xe9\xdd\x8f\xf1\x6a\x81\xc3\x2f\x38\xc9\x5e\x64\xd7\x94\x24\x07\x46\xeb\xe0\xde\xb4\xf7\x3a\x2d\x62\xd7\x3c\xb8\xb0\xfc\x72\x05\xb7\x2c\xd4\x0e\xc4\xa4\x9f\xe4\x5f\x4e\xce\xf9\x9f\x93\x6f\xd2\x12\x78\x71\x92\xf2\x42\x2b\x19\xf8\x3d\xbd\xe0\xf5\xf0\x51\xf0\x05\x17\xcc\x76\x05\xbb\xe6\x79\xaf\xf9\x68\x1b\xfd\x7c\x7f\xb8\xd6\xfe\x82\xfa\x49\xbe\xdf\xf1\x2f\xb0\x94\x05\xaa\xdf\x38\x24\x07\x75\x27\x94\xa7\x96\x67\xec\xc6\x32\x12\xd2\x8b\xdb\x56\xfe\xfd\xe7\xf8\xbe\x53\x9a\xda\xd6\x5b\x73\x75\x6e\xcd\x9f\xdf\x86\x82\xbb\x0d\x9b\x0d\x44\x9a\x38\x60\x46\x8d\x3a\x9b\x27\xff\xbd\x90\xa3\x13\xb1\x10\x34\x97\x0d\xf7\x4e\xf6\xfe\x9f\x58\x3c\xfb\x2a\x34\x24\x22\xd9\x4e\xf7\x61\x0f\xd0\x73\xd1\x6e\xef\x33\xb3\xb4\x65\xef\x0d\x51\xc1\x01\x55\x32\x50\xda\x13\x21\xfa\x16\x89\x79\x8f\x63\x78\xc0\x6d\x2a\xcb\xd5\x83\x9b\xcc\x10\xd7\xe7\xfc\xba\xad\x6f\x80\xdc\x99\x9f\x55\x94\xa0\xbe\xfe\x70\x7d\x12\x43\x48\xcc\xe6\xdc\xdc\x89\x75\xdd\x0c\x52\xb9\xee\x53\x93\xb6\xeb\xd6\xe4\x0e\x64\xa0\x31\x1b\x05\x8e\x9d\x1e\x02\xe1\x27\xbf\x77\x1a\xcb\xd7\xfd\x14\x7d\xe8\xe8\x33\x99\x8b\xe2\x3c\xd7\x2d\xba\x50\xb6\x42\x27\x26\x94\xb1\x77\x9d\xb7\xfd\xb9\xf3\xcc\x4a\x1b\x42\xdd\x3e\xf5\xfc\xdc\xe0\x32\x3d\xca\x8b\xeb\x45\x86\xf6\xbd\x04\x00\x87\x57\xe6\xc6\xfa\x3b\x94\xbe\x3e\x07\xfe\x8c\x0c\x71\x2c\x07\xe8\x48\x3a\x9a\x5f\x85\xb6\xdc\x15\xca\x6f\xd7\x91\x3c\xc7\x97\xd0\x6d\x23\x2b\x9d\xc9\x12\x6b\x0f\xfe\xb3\x7a\xb1\x09\x5f\x2e\xc0\xa1\x10\x2a\x6c\x68\xe9\xe8\x92\x5f\x1f\xd9\x26\x0b\x4b\x4e\xc4\xcc\xde\x6d\x2a\x7d\x57\xa9\x93\x75\x90\xde\x26\xc4\xa5\x74\x81\x2d\xee\x24\x98\xc2\xcd\x73\x05\x03\xe5\xe5\xe1\x15\x0e\x98\x5a\x82\x92\xf7\x5d\xbc\x7f\xb8\x20\x68\xce\x43\x21\x5b\x14\xcc\xa2\x47\x8d\xd8\x42\xa8\x91\x6c\xa7\xd6\xf7\xaf\xa6\x44\x8e\x04\x4b\xed\x2a\xd1\x8a\x00\xff\x13\x19\xa9\x4e\x49\x82\x19\xb3\xd3\x2f\x95\xc1\x4e\xba\xc4\x6c\xc0\xf0\x20\x92\xd1\x3b\x22\x40\xd0\x9e\x6d\xce\xe5\xe6\x4f\x5b\x91\x41\xfe\x26\x1b\x67\xde\x47\x1d\x86\x5b\x67\x2d\xf3\xaa\x80\x3f\x43\x34\xb2\x2e\x0f\xdd\x28\xfc\x85\x72\xab\xc1\x5f\xaa\x9f\x26\xb9\xa3\x6c\xb2\x90\x9e\x74\x5b\x5c\x50\xb1\x3b\x09\xa2\x26\x98\xd1\x4d\xca\x12\xb6\x8d\x9d\x3f\xd9\x82\x3d\x55\xaf\x88\x3c\xcb\x56\x88\xfe\x35\x31\x4c\xef\x4a\xd2\x75\x82\x77\x34\x14\xef\x2e\x9b\x6b\x7f\x18\xb0\x03\xc8\xcf\x02\x74\x65\x5e\x72\x31\xe3\xb2\x67\x72\x9e\x81\xbc\xe8\x62\x55\x0d\xbc\xa7\xce\xab\xf5\xe5\xba\x88\x95\xce\x3b\xf7\xa5\x61\x6b\xa5\x2f\x0b\x9d\x1f\x91\x40\x7e\x16\x11\xcc\x7d\x44\x29\x66\x96\x5e\xe3\x40\x9d\x64\x61\x9d\xd6\x57\x9e\x8d\xc9\x94\x5c\x5e\x36\xd6\x1f\x01\xfc\xb5\x19\x48\xdb\x27\x40\x0e\xb6\xd3\xeb\x5d\x6f\x9e\x43\x5c\x5e\x6f\x11\x30\x9c\x91\xb3\x73\xde\x47\x80\x6d\xe8\x16\xff\x32\x48\x64\x7a\x92\x01\x91\xa4\xa6\x89\xdc\xa5\xe8\xd4\x93\xf8\x4d\xc9\xe1\x76\x4f\x91\x48\x73\xde\x20\xe5\x0f\x79\x86\xd3\x7b\x11\x82\x9d\x1c\xa4\x66\x6b\x07\x43\xe9\xbd\x6a\x9f\xcd\xce\x9f\xcc\x86\x20\x11\xf9\x29\xa4\x59\xaf\xc3\xc6\xca\x78\x89\x14\x09\x29\x50\xdf\xaf\x7e\x94\x6e\x27\x57\xbb\xa0\xad\xc6\x39\x38\xf0\xa3\xce\x41\x0c\x5a\x19\x93\xe2\xae\x20\x9d\x14\xbc\x08\x1f\xf1\xd6\xf8\x56\x8b\xfc\x06\x7b\x29\x23\xb2\x0d\x3d\xc5\x03\x5a\x9f\xba\xa5\x0a\x37\xdc\x22\xd8\x28\x58\x6b\xd0\x02\x3b\x0c\x33\xce\x37\x82\xbf\xd4\xe0\x20\x5e\xd8\xab\x8a\x7d\xcf\x49\x50\x83\x0e\x35\x2f\x24\x29\x2d\xc7\x24\x6e\x53\x30\x86\x10\x59\x33\x88\xf3\x23\x32\x22\x60\xf0\x7f\x42\xe5\x82\xf1\x9b\xa0\x02\xe2\x63\xc5\x12\xd0\x25\x12\xd5\xb2\x35\x2e\xbf\xeb\x8f\x99\xe9\x1b\x0a\x03\x3f\x9d\x4e\xf8\x78\xd3\xff\x80\x2d\xf1\xfa\xd9\x17\x78\x90\x1f\xd2\xbe\xbb\xf1\x4f\x52\x0d\x62\x31\x4e\x5e\xc0\xac\x7a\x55\xb9\x49\x11\x43\xbf\x6a\x8d\xe3\x9e\x99\x8f\x3f\x89\x60\xee\x32\x83\x6d\x0b\x8a\x0c\xdb\x9a\xb6\xc2\xb1\xc6\x70\x56\x1c\x97\xc1\xe4\x8f\xe6\x10\x8b\x1d\xc8\x97\x48\x80\x2a\xed\x28\x50\x77\x6d\x4f\x31\xa7\x3a\xa3\xd1\x22\xd8\xb8\x65\xf7\x43\x5d\x0b\xd0\x16\xe4\xaa\x62\xd9\xdc\xcb\xab\x11\xb1\x26\x96\x66\x6a\x68\x0f\x83\xee\x01\xa4\x54\xed\x54\xac\x6f\x02\xfe\x2b\xfb\x9b\x26\x14\x95\xe0\xce\xe4\x0c\x04\xa5\xe8\x21\x81\xe8\x26\x10\xdf\xfe\x8f\x93\xf5\x9a\x35\xa3\x3b\xeb\xe9\xbd\xe9\x29\x19\xa7\xb3\x56\x2d\xc9\x9e\x1e\x3d\xe4\xcf\xa3\x32\x31\xfc\x24\x67\x89\x15\x3c\x9b\x07\x92\xfa\x53\xad\x43\xcb\x31\x3b\xab\x1c\x14\x67\xed\xd8\x6d\xac\x4c\x7d\xb5\x32\x24\x07\xce\xb5\x5c\xf3\x83\xc0\x2b\xdd\x42\xa2\xa1\xaa\x27\x90\xb7\x86\x74\x43\x0b\x83\xea\xcf\x67\x15\x8f\xcc\xa9\xf4\x39\xc2\xae\x11\x3b\x3f\x33\x3f\xe5\x27\x47\x15\x2b\xc7\x42\x76\xaa\xb3\x90\x95\xe2\x2c\x7f\xb8\x9f\x83\x12\xec\x2c\xe2\xc9\xa5\xea\xd0\x69\xef\xa6\xa7\x00\x1a\x74\x15\x7b\xd1\x9f\xae\x7b\x1c\xbd\x8a\x66\xd6\xec\x04\x9a\xc8\xa4\x52\xd5\xcc\xf0\x2c\x41\xe0\x59\xf2\xf4\xd6\x94\xf3\x2c\x43\xf0\xb0\x0e\x9c\x18\x9c\xe0\x82\x15\xdd\xe9\xbd\xaa\x8b\x9a\x6f\x2e\x1d\x39\x96\xb6\x26\x16\xc9\x3a\x96\xfb\xe5\xee\xcf\x13\x69\x3b\x1f\x02\xe4\xd4\xe8\x2d\xfb\xc2\x73\xa3\x81\x01\x69\x54\xfb\xea\xb0\xd0\x2c\x4a\x03\xc3\xe3\x21\x6a\xd6\xd2\x58\x35\xe7\x88\x1b\x3c\x83\x74\x73\xce\x22\x79\xcd\x20\x81\x62\xed\xf2\xd2\x7a\xc5\x39\xc7\x2f\xd5\x15\xce\xae\x9d\x2c\xb4\x6b\x42\x87\xf5\x79\xdc\x31\xa7\x35\xe7\x6f\xfd\xd9\x65\x20\xff\x7e\xd9\x3f\x82\xcb\x59\x5e\xe6\x73\x14\xcb\xd5\xc9\x34\x9c\x33\xff\x8b\x8e\xc3\x1e\xf0\x47\x25\x59\x4b\xf3\xa5\x96\x4a\x8d\x9d\x33\x8b\x6b\x39\xc7\x97\x8c\x53\x29\xba\xcd\xf0\x40\x79\x66\xb0\x2f\x42\xfa\xd0\xe1\x32\xd4\x35\xd6\x38\xce\x0c\xb6\x5c\xf5\x25\x39\xe8\x98\xa1\x32\xc5\x5c\x82\xb3\x09\xab\x9e\x66\x1e\xfb\x47\x83\x05\x7a\x5e\x49\x7c\x9f\x99\xf1\x7d\x67\x0e\x85\x22\x27\xb7\x4a\x07\xa9\x3e\x8f\xaa\xfb\x66\xa0\x8a\xa3\x02\xc6\xab\x24\x78\x04\xd7\x68\x1b\x74\x9d\x8c\x35\xb8\x58\xef\xb5\x51\x8d\xde\x12\xd1\x01\xec\x23\xa7\xbf\x6d\x10\x1f\x25\x37\x1a\xd2\x83\xce\x33\x47\x76\x6b\x8b\x7e\x5b\x39\x73\xd6\x86\x9d\xf4\x2b\xf8\xe3\x5d\x1d\xa3\xa6\x22\x5d\x72\x02\x56\x09\xda\xf8\x42\x65\x1b\x27\x20\x6c\x79\x05\x9d\xea\x5a\xe8\x22\x70\xbe\x55\x32\x83\x3b\xd5\x62\x3c\x01\xa8\xf0\x9c\x8d\xb2\x75\x09\xba\x7d\x60\x9b\x52\xff\xf8\x59\x39\x3d\x73\x34\xb6\x9d\xa0\xcb\x21\x85\xad\x35\xd8\x6f\xec\xce\xe2\xba\x04\xb4\xf9\x78\x3b\x79\x70\x90\xe3\xd1\xec\x6d\x6f\x6a\x07\xa7\xc4\xea\xc1\x2b\x78\x15\x11\x22\xf7\xd6\x34\xe9\xf1\x3a\xed\x6a\xa1\x17\x71\x42\x45\x94\xe4\xa3\xf1\x82\xcd\x70\x9c\xb8\x00\x7c\xa6\xfb\xc5\xd0\xe7\x33\x18\xce\xd1\x76\xb5\xa8\x7a\x8a\x9c\x37\x41\xda\x59\x88\x5c\x52\x8e\x37\xe5\x21\x9d\x14\x6b\x12\x4a\xcb\xad\xd6\x81\x8d\xfe\xb8\xc5\xa1\xba\x81\x60\xbb\x08\x8b\x5b\xe4\x54\x26\xc4\xe9\x32\x4d\x02\x31\x43\x3a\x13\x38\xe2\x1b\xdd\x2b\x34\x65\x64\xe7\xc1\x15\xae\x3a\xc0\x80\xe7\x19\xac\xcd\x7e\x09\x44\xe8\xfa\x64\x4c\xad\x81\x46\x0d\x9d\x1e\x03\x3f\x3f\x2e\xd8\x9c\x69\x42\x14\x94\x23\xeb\x6b\x48\x27\xab\x78\x9e\x13\xf2\x5e\x2a\xc9\x04\xf9\x91\x96\x52\x38\xaf\x0f\x1b\xa4\x62\xda\x62\x38\x79\x71\x32\xe3\x05\x20\x89\xc1\x95\x14\xaa\xb7\x98\x89\x0c\x04\x7b\xda\xd1\xa6\x0d\xc7\xbd\x93\xc7\xf2\xfe\x65\xd9\x1d\xb7\x48\xde\x0c\x58\xff\x27\x6e\xcc\x3b\xdc\x39\x07\x0c\x0e\x85\xdf\x1f\xb7\x02\x67\xc0\xfe\x2a\x8f\x07\xa0\x17\x6c\x1c\xc7\x6d\x1d\x1a\x0f\xf1\xd5\x4e\x21\xb2\x8b\xda\xb0\xeb\x1d\x3c\xac\x88\x1f\x9d\xd8\x21\xbd\x44\x04\xb3\x4c\xb9\x0b\xa4\x4c\x00\x86\xb8\x34\xf6\xd5\x93\x9e\x70\x4c\x5f\xd9\xda\xb0\x0c\x1e\xe1\x9a\x58\x4a\x21\x7d\x29\x03\x56\x10\xe3\xa2\x78\x7f\x64\x6e\x89\xc0\x54\xc4\x99\x95\x6b\xa1\xf6\x5c\xf3\x29\x07\x04\xf0\xa2\x3a\xb5\x53\xfe\x54\xe1\x1d\x8f\x0d\xd3\x3f\x76\x54\x19\x4b\x47\x15\xad\xed\xcc\x0c\x1f\x80\x2e\x7c\x11\xb6\xd1\x28\x6c\x67\x71\xbc\x86\x60\xa1\x04\x93\xad\x38\xa2\xf6\x79\x96\x81\x00\x95\x00\xef\x36\x8e\x3a\xd8\xa4\xd8\x93\x25\x0d\xfe\x61\xba\x75\x03\x88\x61\x32\x47\x8d\x67\x5f\x3b\x31\xd1\xa6\xa1\xf7\x2f\xd8\x99\x63\x49\xe1\x6b\x03\x7f\x56\xc3\x2a\x2f\x86\xf0\x02\x1c\x62\x88\x3d\x45\x2f\x1b\x69\x6b\xf4\x04\x48\xc1\xc0\x36\xc8\x1c\x4c\x41\x2a\xd4\x37\x04\x55\x98\x11\x13\xec\xb1\x9b\x7c\x5a\x87\x2f\xd5\xfb\xed\x95\xac\xc4\xf7\xc3\x5d\xcb\x9b\x10\x8f\x52\x2e\x14\xba\x65\xb2\xf3\xba\x55\xd0\x12\x93\x8f\xb9\x7a\xa4\x0e\x78\x64\xfd\x21\xda\x74\x59\x59\xa4\xc7\xcc\x20\x9e\x03\xd6\xb5\x5f\x08\x71\xcf\x22\x1c\x86\x66\x18\x9f\x48\x6e\xbb\x7e\xe2\xe8\xee\x9c\xe0\x75\xf3\xff\x7c\x1d\xe4\x50\x0e\xf1\x91\xeb\xae\x76\x83\xb5\xf6\xf8\x14\x14\x7e\x7c\x84\x45\xa6\x91\xe3\x00\x81\x40\xdb\x33\x88\xab\x37\xcb\xd6\x3d\xf2\x4a\xd5\x3c\x92\xda\xf2\x04\xab\x8d\x6d\x5f\xa2\xf4\x54\x93\x03\xf4\xb2\x5c\x9c\x8b\x91\xfc\x36\x78\x69\xcb\x49\x92\x10\xa0\x59\xbf\x28\xca\x92\x3b\x98\xbf\x6b\xc5\xf0\xbb\x39\xb5\x20\x38\xab\x79\xd1\x89\x5d\xd8\x81\x17\xc1\xef\xd0\xcc\x43\xb2\x36\xe7\x4c\x02\x1d\xeb\xa6\x76\x66\x1d\x82\x0a\xb5\xe8\x28\xfb\xfa\xbf\x65\xd2\xdd\xa8\x2b\x80\x0d\x24\x8e\xda\xcf\x56\x3d\xd9\xfc\x48\xff\x44\xcb\x9b\xae\xd6\x17\x1e\xc9\xe6\xa8\xfc\xef\x09\x27\xee\xa9\x1f\x29\x65\x28\x12\x1f\x0f\x57\xea\x73\x36\xc6\x43\x02\x28\x98\x2d\x58\x87\x25\x14\xbc\xfd\x4d\x2f\xf6\xc0\x0a\x94\x7f\xa2\x69\xf8\x36\xea\x4c\xb3\xc7\x8e\x44\x42\x38\xf0\xd9\x5e\x1f\x51\xd7\x16\xcd\x13\x49\x68\xcb\xae\xc3\xf0\xb3\xd1\xf3\xda\x06\xdd\xab\xfb\x47\xa4\xa3\xb7\x16\xd7\x77\x69\x7d\x81\xe5\x96\x81\x06\xfb\xcd\xe8\xf5\xfd\x16\xa7\xc1\x7e\x4f\x2b\xa9\x59\xf6\x3b\x68\x34\x6d\xf0\x7d\xfa\x47\xb3\x1f\x94\x40\x02\xc1\x6d\x16\x33\x6d\x7d\xf1\x44\xf6\x59\xcd\xe2\x02\xb5\x4f\x19\x8a\x03\x1b\xe9\x6c\x69\x57\xed\x70\xb3\xa5\x20\xbe\xd5\x80\x6f\x93\xab\x4b\xf5\xc0\x0a\x39\x09\x3c\x0f\x08\x89\x0b\xf4\xbe\xc6\x09\x29\x44\x91\xdd\x3a\x59\x18\x11\xec\x4a\xa2\xa0\x94\x65\x80\xd2\x8e\xc8\x5e\x35\x1d\xc3\x8c\x3f\x00\x93\x2f\x79\x70\x2b\xde\x4e\x50\xfc\x56\xdd\x7d\x55\x06\xec\x5e\xd7\x35\x78\x70\x23\xdb\x0d\x9c\xb5\x43\x25\x37\xaf\x8d\xe3\xcc\xe1\xdf\x39\xa2\xef\xb5\x50\x0c\x68\x97\x54\xf6\x1e\xd4\x29\x7b\x1d\xea\x12\xc7\x4a\x73\x7a\x5f\x6e\xcd\x7b\xf6\x85\x5e\x6a\x2b\xf9\x74\xac\xe4\x2a\x9c\x21\xbe\x22\x08\xb6\xfb\x25\x96\x26\x55\xb7\x2f\x8c\x4a\x06\x6b\xee\x37\xf6\x90\x79\x17\x1c\xda\x7c\x0a\xc5\xba\x63\x2f\x9b\x40\x14\x18\x75\xf9\xaf\xca\xef\x67\x47\x28\xec\x49\x20\x8f\xc2\xae\x25\x84\xbd\xc0\x39\xde\xa8\x76\x59\x95\xb2\x90\x14\x89\x94\xba\x22\x67\x75\x7a\x4d\xbb\x00\x37\xfa\x78\xf8\x2d\x02\x09\xa8\x55\x20\xc8\x0a\xf6\xb9\x20\x80\x91\x54\xae\xb3\x08\x68\x67\x86\x57\xee\xa3\x0f\x24\x7e\xd8\xe8\xb4\xd8\xc4\xde\xcd\x05\x8f\x6f\xbe\x0e\x31\x60\x89\x5f\xb7\x17\x54\xe8\x92\xf3\xbe\x34\x5a\xd7\x1c\x79\xdf\xbb\xc7\x5f\xc4\x02\xe6\x9e\x65\x73\xec\xf2\xe9\x62\xfa\xc7\x57\x65\x93\x89\x9b\x9e\x20\x40\xb1\x2f\x23\x98\xa9\xa1\x76\x21\xe4\x7e\xeb\xc0\xaa\xf4\xa8\xa6\xaf\xb2\x6b\x10\x72\xee\x5e\x96\x83\x07\x72\x19\x48\x1c\xb2\x76\xb1\x0b\xec\x0c\x74\xdc\x7d\xc6\xc4\xfc\x4c\xd0\xf6\x4e\x7c\x41\xca\x57\x46\xa9\x9a\x96\x5d\xf7\x26\x6a\x90\xdd\x07\x23\x7d\x58\xe8\xe9\x78\x52\x50\x96\xef\x1a\x5a\x6d\x96\xe7\xff\x4d\x9f\xcc\xf2\xb5\x28\xe2\x0e\x90\x0c\xff\x76\xac\x16\x2a\x76\xbc\xd5\x53\x0c\xbb\xe7\x0f\xe4\x8f\x00\xfc\xb9\x1c\x64\x6c\x0b\x5d\x13\xcf\x74\xb2\x5b\x82\xa0\x8c\x28\x84\xed\xb1\xe9\x09\x72\x41\x30\x09\x92\x93\xd8\x23\x64\x78\xce\x83\xf1\x20\x3b\xc2\x99\x83\x61\x18\xcc\xc1\xc7\xc4\x53\x5b\x73\x7d\x7c\x03\xb1\x0c\x9a\xe2\x4d\xb3\xbc\x3d\x2d\x3e\x95\xdc\x53\x08\xfa\xef\xa9\x65\x55\xec\x49\xd4\xc3\x8b\x18\x2c\xc1\xa4\xb5\xf0\xf0\x1e\x79\xa4\x64\x3a\xee\xf9\x99\xa4\xbe\xd5\xd5\x4d\xcc\xfa\xed\x3c\xde\x09\x6c\x1d\x6f\x0f\x5b\x00\x02\xab\x86\xbf\x89\x8a\x25\x1e\x7f\x4b\x48\x42\xa0\xc7\xcb\x93\x0b\x3a\x4e\x09\x14\x5a\xe2\x94\xa3\x52\xba\xa9\x0a\x20\x35\x4b\x8e\xd4\xc2\xbe\x86\xea\x40\xf1\x79\xc8\x3b\x70\xcf\x7f\x75\x27\xa6\x9f\xe0\xa0\xfc\x60\x3d\x9a\x0e\x5a\x05\x13\xae\x37\x47\x24\x8b\xf9\x9e\x95\xd3\x8e\x1a\x0b\xa2\xf5\x19\x4c\x9c\xb5\x31\x14\x99\x05\xa7\x49\x54\x9d\x13\xc3\xa2\xea\x74\xb3\xb2\x5a\xf1\xac\xe3\x95\x83\x2a\x18\x99\x3c\x5e\x86\xb8\x7d\xcd\xb1\x24\x5b\x39\x45\x66\x4c\xe4\x40\x54\x28\xf8\x46\xa6\x60\x11\x22\x23\x68\xa6\x1e\xce\x76\xdc\x25\xc9\xa3\xd6\x4e\x61\x78\x95\x73\xd9\x9a\x9e\x1c\x86\xb7\x0f\xd3\x67\xb6\x0f\xcf\xbe\xdd\xab\x68\x7f\x79\xb6\xa0\xb8\xb1\x72\x8e\xa5\x7c\x30\x84\x44\x84\xbc\x8d\xe1\x3a\xce\x67\xe4\x1b\x94\x81\x50\x82\x3b\x59\xb9\xd9\xc1\xa3\x6c\x7d\x2e\x52\xfd\x1d\x29\x64\x61\xb3\x91\xed\xde\x83\x11\x58\xeb\x25\x06\x66\x11\x06\x0f\xc1\x7a\x84\x69\x9d\x04\xf0\x39\xc3\xfb\xc4\xb1\xd6\x05\xfa\xa0\xe6\x48\xa5\xbe\xa8\xad\xc9\x52\x01\x55\x1f\x16\xb6\xe9\xe3\xed\x6b\xcb\x6f\x25\x3d\x18\x0a\xea\xe2\xfc\xca\x4e\x7e\xb9\xe5\xfb\x4b\xa2\xdf\x7c\x83\x12\xd3\x4f\x91\x63\x25\x7d\xcb\xb2\x46\xb6\xc6\x80\x12\x5d\xe6\xa6\x84\xe7\x0d\x9c\x77\xcc\xdf\xd8\xc0\x72\xe7\xff\xb3\x49\x2f\x49\x7c\x0d\x49\x56\x17\xc8\xcf\x14\x6c\x05\x1b\xc9\x05\xb7\x14\x9b\xd4\x2e\xde\xd2\xf1\x4a\x85\xbf\x38\x86\xb8\x58\x72\x37\x3c\x28\x5c\xe2\x49\xa7\x42\xa6\xe3\xe4\x5e\xd6\x2d\x4d\x3a\xcb\xc4\x59\xea\x96\xc6\x6f\x89\x7d\xe3\x1f\x3c\x44\xf2\xe3\x8a\x0e\xff\x0f\x97\xb0\x4a\x91\x00\x1f\x4c\x99\x5e\x21\x9f\x47\x40\x72\xca\x5b\x8e\xd2\xf5\x5e\x6c\x20\x24\x57\xa9\xf7\x70\xc5\x5d\x70\x86\x15\x15\x60\xc8\x07\xde\xf5\x9e\xb9\x09\xc7\x19\xd9\x82\x3f\x9b\x12\xb9\x56\x84\xf3\xf0\x74\xf5\xba\xe2\xdf\x24\x5e\x5e\xeb\x29\x7b\x0e\xa8\xe3\xbf\xfe\xcc\xa0\xd7\x26\x92\xb4\xe2\xa3\x3e\x0f\x8f\x14\x06\x16\xb1\xae\x7d\xd7\x22\xa6\x6d\xa2\xb7\x4e\x4b\x7c\x04\x00\xdf\xfc\x12\x9b\xbc\x13\xe7\x2b\xd5\x79\xd2\xef\x42\x62\x7a\x06\xf2\x8f\xdf\x01\x4f\x58\xb9\x0d\x71\xe1\x8f\x90\x38\x52\x81\xb2\x80\xa8\x3b\x81\xa6\x80\x27\x8b\x1a\x8f\x22\x18\x15\x0c\x3d\x83\xf3\xd0\x70\x2f\x2a\xd1\xba\xee\x73\x23\x2f\xfe\x6c\xc1\xdd\x5a\xd5\x47\x3a\xd8\xc4\x47\xb2\xd6\x88\x63\x05\xbd\x31\x8b\x35\x6a\xac\x30\xb4\xf5\x27\xd5\x0b\x9e\x63\x1e\xd5\x73\x85\xc0\x00\xa3\x35\xb1\x16\x27\xbe\xe2\xef\x37\x1e\x4d\x09\x9f\x95\x21\x36\x1b\x04\x6c\xdf\x1a\xd2\x7c\x43\x74\xc5\xf0\x49\x5c\x42\xf1\x93\xe0\x29\x06\x79\x35\x1b\x9f\x19\x4b\x62\x4a\x6e\xde\x57\xa7\x47\x2e\x3a\x72\x8b\xa8\xa7\xb5\xfc\x5c\x32\x8e\x05\xa2\x35\x95\x60\x02\x5d\x23\x7a\x13\x60\x6e\x16\xe7\xea\x4c\x46\xed\x1f\xee\x7e\x6e\xff\xa0\xef\xc9\x10\x24\x44\xae\xc0\xd2\xca\x33\x38\xd7\xb8\xc8\xf0\xc7\x09\xbb\x36\xe6\xb9\x15\x5d\x5e\x7a\x88\xc2\x0b\x9c\xc5\x64\xaf\x2d\xcf\x27\x6d\xda\xf5\x8f\x40\xeb\x5a\xc6\xf3\xe6\x95\x33\x89\x2c\x0d\xc4\xea\x23\x98\x9f\xc3\x87\xbe\x96\x81\x27\x07\xf3\xb3\x40\xa9\xcf\x24\x48\xd7\x99\xd3\x39\x37\xa2\x67\x8e\xc9\xae\xd6\xc6\x52\xca\xe7\x6b\xe3\x99\x59\x65\x9e\xad\x5a\x2b\x41\xa9\xe6\x9b\xff\xdf\xef\x22\x73\x3d\x78\xcd\xdb\x1d\xb4\xcf\x21\x25\xb2\x36\x36\x96\x95\x14\x8c\x56\x4c\x62\x83\x05\xd3\x25\x7b\x8d\x2c\xa7\xeb\x8a\x70\x62\x96\x88\xd3\x20\x11\x9b\x93\x65\x88\x86\xba\x81\xf2\x4f\x8d\xd2\x85\x85\x5b\xae\xf2\x8a\xd8\x0c\x36\xdc\x5c\x62\xb5\x65\x75\x1d\x61\xa1\x85\x3c\xe6\x59\xc9\x76\x6b\x1e\xce\x60\xa8\x56\x6a\xb7\x03\x66\xd6\xac\x39\x75\x22\x67\x7e\x07\x19\xdc\xda\xff\x41\x39\xd8\x9f\x0f\x0e\xfc\x2b\x88\xd7\x0e\xf1\x24\xf7\xd0\xa3\x6f\xbb\xe3\x80\x7d\x16\x5f\xf3\x06\xee\x33\x9e\x7c\xcb\x8d\x3b\x7a\xcb\xfa\x6f\x2a\xfa\x01\x28\x86\xd7\x80\x41\x3b\xfd\x14\x57\x2e\x88\xab\x5f\xba\x9c\x7d\x1f\x8b\xc8\xb0\x9f\x39\x89\xed\xbd\x2f\xc7\x2b\xd0\x76\x1d\x1f\x9e\x1d\xea\x2d\x42\xe0\x18\x26\x9c\x0e\xb3\x05\x44\x56\x3d\x89\x4b\xb9\x9f\x70\x7a\xfe\x3e\x6f\x51\xa5\xbc\xcc\x25\x18\xb4\xed\x15\x1e\x5c\x74\x02\xd9\x35\x1c\xf1\xa7\x70\xd7\xa9\x8f\xef\xed\x91\x35\x92\x6b\x58\x6f\x41\x88\x1d\x1a\x80\xe0\xbe\x66\xf2\x8a\xf3\x5d\xcb\x67\xe5\x38\x07\x23\xf6\x12\x0f\xab\x53\x96\xc3\x0a\x66\xec\x99\xa4\xce\x9f\x2a\xd6\xe3\x0f\xf9\x45\xd7\xf4\x2f\x91\x1c\xf9\x3e\x92\x68\x9e\xcd\x1a\xe7\xbf\x2e\x0a\x8f\x62\xfe\xc4\xff\x5c\xfa\xcd\x35\x8b\x8f\xf9\xa2\x27\x1a\x4c\xd6\x59\xff\x4a\x2f\xee\xe1\x84\x13\x25\x7b\x3c\x00\x4e\xde\x56\x4f\x04\x4a\xa2\x92\x76\x39\x31\x47\xc7\xef\x43\x81\x43\x81\x97\x3c\x74\x9a\xe3\x9c\x1b\x57\x75\x78\x82\x57\x27\x20\xd1\xff\xe9\xc2\x75\x40\xbe\xe9\x48\xd8\x32\x34\xdd\xed\x07\x43\x81\xab\x32\xce\x04\x4f\x7a\x9c\x40\x82\x31\x4e\x91\x2f\xfe\x0f\xc7\x04\xdb\xad\x0a\xa9\x33\x43\xa4\x57\x50\xcd\x62\x43\xe5\xa6\x33\x37\xa1\x0f\xe4\xbc\x07\xa7\xb5\x22\x34\x30\x74\x14\x71\x61\x7b\x52\x9d\xa3\x95\x3b\x96\x70\x3c\x1b\xac\x37\x69\xba\xed\x85\x8e\xc1\x37\x8e\xee\x92\x7c\x30\x6b\x72\x62\x5c\x44\x3a\x2f\xb1\x2d\x12\x6d\xac\x5f\xa9\x22\x4f\x0d\xda\xc9\xa3\x3b\x5f\xac\x48\xd9\xaa\x48\xb9\xdb\x7f\x1b\x4d\x77\x8b\xc4\xb3\x6f\x68\xbd\x05\x06\xde\xde\x6c\xd3\x9d\x4b\x94\xe5\x78\x57\x1f\x21\xf1\xd4\xdb\x6c\xd0\x3e\x6a\xd6\x01\xfc\x6e\x1c\x3c\xcc\x84\xba\x54\x7a\x61\x9f\x11\xc1\x60\x33\xac\x1a\x28\xb8\xba\xe9\x86\x61\x60\xfe\x15\x48\xa1\x09\xc2\x44\xb3\xfe\xdb\x47\x13\xec\xff\x34\xf3\xe4\xc3\xf4\xf2\xa1\x78\xc0\x72\x33\xa1\x1c\x25\x17\xf8\x97\x5b\x33\x83\x25\x2c\x26\x03\xa4\x01\xe6\xda\xc2\x72\xab\xf5\x2c\xf7\x2c\x1b\x77\x91\x9c\xe8\x72\x0f\xaf\x22\x69\x5c\xc3\xf4\x47\x81\xdd\xa3\x1d\xf7\x87\xc5\x3b\xb3\xb9\x2c\x77\xa7\x5b\x5c\x44\xe1\xb1\xdc\x9d\xae\x2b\x5f\xbd\xd9\xe2\x22\x90\xae\x2f\xb1\x7b\xbb\x2b\xce\x0a\x91\x75\x33\xee\x6e\x31\x43\xed\x64\x29\x1b\x04\xb4\x46\xdb\x57\x13\x7e\xb0\x8b\x28\xcf\x10\x50\x94\xc6\x86\xac\x02\xa4\xa5\xae\x4f\xbb\xa3\xab\xbe\xfe\x23\x9d\xb7\x17\x39\x2e\x19\xf4\xd7\x95\x6c\xb1\x56\x36\x71\x22\x1b\xc9\x7d\xa0\x04\x89\x8e\xca\xba\x31\xbb\x7b\x71\xd1\xfa\x80\xc1\x1a\x5d\x0e\xf1\x65\x40\x05\x9c\x9e\xa9\xa5\xec\xb2\x61\x60\x0b\x44\x95\xed\x49\x37\x96\xf0\xad\xa9\x67\x2d\x6e\xbf\x04\xa1\xb8\xbd\x26\xd0\xe8\x12\x6b\xa1\x16\x88\x34\xce\x25\xd2\xef\x91\xe3\xe6\x96\x33\x2c\x2d\x25\x23\x3a\xf4\x32\xe2\x1e\x81\x8e\x60\x08\x8f\x50\x3b\x30\xce\xf3\x97\x36\x6a\xcd\x71\xba\x78\x96\xe0\x0c\xe1\xf3\xc3\x42\xe6\x7f\x41\x32\xce\xf0\xe7\xc5\xdd\x49\x1f\xa2\x39\x48\xc8\xd3\x4e\xb2\xec\xcc\x87\x00\x3d\x16\x2f\x45\x07\x67\x20\x9f\x4c\x5e\x04\xd4\x92\xc7\x92\x5f\xad\xde\xf9\xfe\x65\x93\x98\x05\xda\x05\x73\xa5\x59\x5d\x77\x80\xb5\x49\xb3\xd9\x86\xfb\x29\x16\x79\xa4\x96\xbc\xef\x52\x35\x33\x18\x3e\x86\xa5\x89\x5a\x82\x32\x2e\x1e\x02\xd2\x69\x32\x51\xf0\x11\x2e\xca\x68\x40\xee\x61\x94\x53\x12\xc5\x79\xf9\x99\x6c\xbe\xa1\x27\x98\xcb\x93\x5f\x03\xdc\xe2\x3c\x72\xbe\x6a\xd4\x21\x56\xac\x17\xf1\xf0\x2e\x79\x12\x97\x77\x1e\x21\x6e\xe9\xa8\xe7\x2d\xf4\x8a\x5d\x6c\x6c\x5b\x4b\xee\xc2\x13\xbe\xe4\x44\xe7\xd2\x92\xde\x57\x80\x83\xa1\x40\x4b\x7a\x91\x06\xfc\xe6\xfe\x1b\x82\xfc\xf2\x2f\xf9\xd6\x26\x20\x36\xf8\x14\x09\x04\x86\xb8\x9e\xb7\x84\xbc\xe3\x02\x67\x92\xd8\xbf\x0d\x15\xce\x34\x16\xe4\x8a\x93\xf0\x3e\x9d\x3c\xfe\x24\xb1\x27\x7c\xae\xf5\xad\x77\x9b\x48\xa9\x08\xc9\xfb\xad\x63\x8d\xce\x3e\xd8\xca\x61\x34\x09\xf5\x8c\xa5\x5b\xd2\x2e\x12\xf8\xe4\x7e\x3a\x31\xaa\x6f\xf7\x97\xc7\x6d\xad\x96\x6d\xca\x63\xf0\x1c\x38\x88\x1a\xfc\xd1\xa2\x83\x62\xbd\x88\x58\x7d\x92\x87\xc8\x79\xe9\x74\xa4\x8d\x18\xfe\x3a\xd3\xba\x33\x5c\xda\x99\xd4\x09\xca\xf7\xd6\x0d\x97\x4b\x64\x01\x06\x27\x5d\x64\x26\x05\xbb\x35\x59\x9f\x2b\x19\x0a\x65\x01\x43\x18\x96\x8b\x08\xdf\x27\x4d\xf0\x80\xf4\xa8\x46\x46\x7c\x1b\x90\x96\x41\x1a\x31\xa9\x17\x92\x1c\x41\x1a\xee\x5e\x77\x31\x6c\x71\x3f\xe0\xb8\xe1\x39\xfa\xea\x7e\x5d\xe2\x67\xa3\x8f\xef\xf3\xa1\x47\xd7\x31\x7f\xde\x40\x3d\xc4\x45\x2f\x36\x07\x8c\x88\xb7\x0f\x7e\x4f\xd1\x04\x3d\xef\xe6\xba\x35\x18\x44\xde\x37\xd7\x48\x9e\x77\xf0\xb4\x1f\x8c\x20\x32\x30\x7c\x48\x5f\x2e\x06\x86\xe7\xbd\x89\x43\x08\xac\xee\xf1\x73\x6f\x38\x90\x4a\xf9\xb0\x74\x5a\xf0\x5b\xa2\x66\x00\x13\x7f\xbb\x24\x81\x22\x26\xea\x9b\x16\x95\x95\xd4\xa8\x7b\xde\x6e\xea\x2f\xc2\x4f\x5d\x69\x50\x1d\x40\x0f\x47\xd4\x42\x8f\x00\xfb\x40\x89\xac\xef\xdf\xcf\xf7\x47\x1a\x03\xaa\xf8\x42\x6e\x64\x83\xeb\x5b\x4b\x81\xc0\x24\xb0\x3f\xea\x5e\x86\x1f\x63\xfb\x51\xd9\x1f\x3e\x91\x08\xcd\xf3\x95\x46\x13\x5f\x3a\xfe\x2b\x17\xad\x8c\x3c\x7d\x95\x4c\xff\x4d\x9f\x4d\xec\xf4\xe9\xe4\x71\xa9\x3d\x2d\xe8\x27\xa2\xac\xdf\x8f\x08\xdd\xbf\x51\x6f\xb8\x28\xc5\x1c\x8f\x98\xf3\xb9\xe1\x5e\xfe\xd0\x67\xbd\x6e\x91\xc8\x5f\x47\x27\x20\xdf\xb3\x55\xf6\x0f\xd9\xfc\x33\x07\xd9\x7c\xd1\x71\x67\xdf\x9e\x54\xd5\xdb\x85\x80\xa9\x97\x58\x6b\x11\x60\x25\x01\x96\x60\x94\x07\x76\xb0\xbd\x7f\xa7\x58\x1a\x8d\x7d\x38\xa9\x9f\xbe\x40\x1d\x3b\xff\x1c\xa9\x01\x1e\xf3\x56\x51\xdd\x67\x77\x2b\x3c\x49\x46\xfd\x84\xbf\xeb\x95\x8e\x80\x24\x76\xaf\x7c\xc0\x1b\xf3\xb5\xac\xcc\x51\x0d\x32\x39\x90\x92\x9e\x8c\xea\xfa\x56\x9e\x3e\x3b\x22\xc2\x8a\x1e\x4f\xa4\x80\x21\x10\xd1\x5f\x8d\xec\x1d\xe3\xec\x8f\x77\x7c\x91\x18\xa9\x53\xd2\x23\x3b\x99\xd7\x5c\xb2\xc7\x06\x58\xa9\xb5\xd6\xe7\xc3\x2e\x10\x3f\xc2\x9a\x69\x84\xa4\x3f\x0b\x57\x35\xad\xa4\x86\xd6\x93\x5c\x43\xcf\x42\x59\x75\x30\xd3\x8b\x3b\x7e\x9b\x4e\x0d\xa9\xc0\x22\x99\x5f\x77\x11\x94\x97\x55\x3f\x5f\x96\x55\x7b\x82\x40\xd4\xd0\x14\x9e\x5d\x90\xd5\xab\xad\x95\x99\x3b\x82\x9e\xee\x59\x5a\x6d\x75\x04\x0c\x55\x9e\x35\x7f\x4b\x22\xed\x7c\xb0\x89\x90\x96\xde\xcf\x90\xcf\x19\xde\x56\x11\xc3\x1f\xe7\x15\xfc\xf3\x87\x5a\x0b\xd6\xda\x4f\x82\xb8\x78\xde\xf2\xa8\xda\xe5\x75\x9f\x55\xfa\x4b\xcd\xcb\xd9\x26\xdb\x30\x5a\x37\x95\x7f\x09\xda\xf3\x33\xcd\xf7\xc6\xc3\xcb\xd9\x98\xf2\xcb\x21\x92\x77\xfb\x7d\xe1\x2e\xde\x64\xe6\x67\x9d\x18\x58\x6c\xe5\x38\x73\xb2\x03\x38\x06\x03\x3e\xa6\x6d\x3f\x4a\x79\x7b\xb0\x7e\x81\x74\x7e\x3f\xd1\x24\x0d\xdf\x9d\xf6\x9e\x60\xaa\x24\x4b\x3c\x1b\x27\x66\xb6\x59\xa0\x69\x5d\x24\x24\xa3\xf1\xee\x9d\xea\x5e\xcd\xbc\xad\x8d\x3c\xd3\x21\x9e\x7a\x2c\x2f\xfb\x03\x49\xfb\xa1\xea\xea\x9b\x82\x50\x10\x3b\x14\x1b\x14\x66\xae\xcb\x23\xc9\xb9\xd5\x7b\x15\xf9\xfd\xc2\xbb\x5b\xb8\x4a\xef\xac\xf6\x2f\x3e\x87\x98\xdb\x3e\x31\x01\x6c\xea\xca\x4f\x28\x2d\xce\x34\x3a\x9f\xe8\x37\xda\x3c\xf2\xe9\x31\xee\x02\xd6\x9d\xf0\x68\xc9\x13\xd8\xbc\xe5\x9d\x88\x48\xf0\xfa\x00\x51\x88\xf7\x57\x8f\x3f\xe9\x21\x86\x91\x79\x1d\x6b\x04\x0f\xeb\xb2\x5d\x8e\xf8\x51\x77\xbd\xb1\x07\x98\x23\x7d\x0d\xe2\x51\xb9\xf6\xf1\xa8\xe4\xc4\x62\x34\x76\x38\xbd\x1f\x2d\x76\xfa\x91\x5b\xe5\x01\x49\x98\x7f\x8a\x4d\xf8\x01\x36\x49\xaf\x8f\x7d\xf2\xfa\x25\x9c\x43\x64\xfb\x70\x36\x7d\x52\xde\x43\x7a\x46\x68\x64\x95\xcc\xea\x51\x0e\xd3\xc3\x66\xa0\x6c\xb7\x40\xa4\xe4\x17\x3d\xac\x95\xc9\x6c\x00\x3c\xad\xf2\x4e\xe1\x19\xfb\xb3\xea\x50\xce\x3f\x8d\xb4\x9c\x5d\x18\x98\x05\x7a\x22\x3e\xa7\x2b\xa2\x43\x28\xdb\x87\xae\x44\xb7\xe0\x7d\x04\x2b\xdb\x56\x7b\xb1\x0b\xd9\xe3\xd1\xd0\x57\x7c\x02\x1b\xaa\xaa\x08\x56\x79\xd1\x88\x2a\x10\xe8\x43\x89\x85\x19\xff\xcd\x6a\x1d\x90\x0f\x81\x25\x54\x93\x42\x1e\xa0\x80\x11\xcd\x63\x9e\xc0\x04\xac\xf0\xa7\xf9\xa6\x57\x67\xbe\xaf\xe0\xc4\x57\xf4\xde\x7c\x47\xf2\xdf\x7c\x7b\x7f\x6b\xdf\xda\x75\xfe\xb8\xce\x6f\x7b\x90\xc1\x99\x7d\x5b\x63\x73\x3e\x76\x2a\xe2\x5a\x41\x46\x7b\x33\x1c\x83\x5d\x5f\x74\xfc\x4e\x20\x2f\xd2\xed\x3b\xc7\x95\x06\xb1\x48\xce\xf5\x15\x9c\xf9\x0a\x14\xf6\x18\xda\xab\xd1\xca\x9f\x67\xf0\xdb\x2b\xd6\x01\x0e\x26\x75\x88\xa0\xcd\x27\xe3\xfd\xb1\xb5\x38\xa6\xd9\x35\x50\xec\xa2\x1e\x54\x09\x16\xfd\xd2\xd8\xec\xc9\xfd\x03\xd6\x27\xde\x66\x5d\xbe\xbf\xe9\x80\x6d\x7d\x7a\xd1\x43\x1a\xfe\x43\xe1\xbf\x5c\xdf\x25\xe6\x18\xb6\x25\x26\x13\xf0\xec\x2f\x8c\x9b\x41\xaf\x92\x83\xd2\x95\x1b\x8d\xf9\xbe\x2e\xaa\xff\x63\x13\x59\xc9\x5c\xe7\x65\x8c\xff\xce\x7f\x9a\xce\x8c\xc4\xa0\xb8\xa8\xc1\x5e\x8c\xec\x88\x18\x26\x21\x7c\xcd\x4a\x63\x98\x6b\x3c\xbf\x2c\xc1\xf9\xb9\x0e\x7c\x23\xc1\xbb\x5e\x5d\xdd\xfa\xd6\x13\xa2\x7b\xd9\x7a\xec\x33\x1c\xdb\x33\x7a\x50\x3f\x3f\x32\x78\xfd\xf4\x45\x8f\x8e\xca\x00\x45\x62\x32\x90\xd9\xff\xd1\xf3\x33\x4d\xd7\x40\x3f\x07\x07\x05\xd4\xf7\xf5\x13\x1f\xee\x78\xc9\xb2\x0c\x0a\xb6\x72\xa2\x7e\x56\xaa\xe4\x91\x0e\xfd\x19\xb1\xd4\x7c\x8b\x45\x9a\xe2\x73\xfe\x84\xfc\x29\x20\x0b\x11\xe1\xbf\xdc\x67\x31\x3b\xa9\x89\x48\xf2\x79\xd7\x90\xda\xe5\xbf\x30\x08\x0c\xa4\xea\x57\x7e\xda\x9c\x95\x35\x3b\xbb\x1c\x38\xd3\x4b\x67\x4f\x38\xfa\x10\x2d\x2a\x73\xe3\xfb\xcf\x54\x73\x9b\xa1\x74\xea\xe5\x2a\xf5\x2b\x43\x2b\x8b\x50\x09\x68\x3c\xfb\x8b\xf2\x33\x40\xf9\xef\x04\xeb\xdc\x78\x6c\x3c\x53\xd9\x16\x95\x14\x72\xf8\x13\x02\x35\xdb\xc1\x41\xd1\x8f\xe5\xc7\xc6\xe7\xcf\xf5\xc7\x39\x77\x4c\x21\x06\x9f\x6b\xc8\x04\x24\x89\x17\xa4\x89\xa7\x4f\x83\xc8\xc6\x01\xfd\x0e\xc1\xf1\xdf\x49\x1e\x71\xf6\x48\x00\x32\xe7\xc3\x48\xb7\xb7\x72\x71\x83\xf7\xe9\x59\x69\xa3\x82\x79\x66\x9f\x7d\x05\x19\xbf\x99\xf6\x5a\x79\x75\xae\xff\xd0\x8e\x30\xac\x9f\x1e\x57\x7c\xc5\x18\xee\x82\xcc\x7f\xaf\x55\xfb\x56\xf1\xf4\x1f\x43\xfb\xc6\xb0\xa4\xf8\x09\xe0\xde\x21\xd0\xff\xd3\x15\x09\xd4\xbe\x55\xeb\x59\x43\x35\x80\xb9\x19\x36\x30\xb4\xee\x29\x29\x29\x72\x4e\x5b\xc8\x12\x6c\x67\x6b\x78\x49\x39\x1e\x70\x36\xea\xbd\x62\x28\x8d\x5b\xe1\xa8\x09\xf5\x1d\x36\x7a\xcf\x40\xf9\x09\x09\xb4\x59\xc4\x2c\x9d\xaa\xd9\x83\x6f\xb5\xc2\x8f\x50\xbe\x25\x6e\xf5\x8f\x0e\x44\x6a\xc1\xfa\x36\x94\xee\x87\x9e\xd4\x12\x22\x04\x66\x93\xcd\x01\xa5\xff\x33\xa7\xa2\x05\x49\x68\x14\xb0\x26\x13\xb2\x65\x79\xd8\xf0\xd6\x39\xba\xc2\x49\xbc\xf3\x4e\xaf\x14\xb6\x9c\x44\xd7\x3c\xdd\x21\x36\x64\x28\x63\x5e\x75\xfd\x27\xa1\x82\x10\x15\x60\x78\x69\xfe\x8f\xda\x04\x0c\xf6\x70\x95\x02\xee\xda\x1a\xe5\xc6\x74\xaf\x1c\x61\x26\x2c\xa7\x72\x8c\x30\xe8\x6c\x52\x71\xb2\x82\x19\xa0\x13\xc0\xdf\x30\xee\x2a\x11\x35\xa9\xa7\xbb\x7f\xf3\xe7\x9e\xe9\x7b\xd0\x8e\xb0\x2d\xa4\x13\xeb\xd0\x04\xe6\x4c\x87\xc7\xcd\x55\xc0\xe9\xa8\xd4\x00\x01\xf0\xa5\xa6\x49\x42\x2e\x56\x66\x8c\x37\x13\x31\xa2\xdd\x1d\x49\x81\xcd\x40\x53\x39\x81\xaa\x01\x23\x40\x79\x70\xb6\x16\xcd\xfe\xd5\xb1\x1a\xd2\x74\xd0\x0f\x35\x1d\xc9\x66\xb4\x24\xaf\x3f\x12\x4f\x9a\x34\xba\x4e\xce\xbe\xa5\xa3\xb6\xaf\x2e\x69\x4f\xe0\x91\x9b\xe4\x41\xc7\x93\x81\x01\xc5\x51\xfd\x9a\xf1\x44\xb9\x02\x5a\x3c\x53\x65\xa0\xcc\x54\x4f\x71\xda\xdb\x4b\xe5\xa1\x87\x12\xb9\x21\x5e\x30\x31\xd6\x63\xaa\x9b\xe7\xbb\xba\x5e\x41\xbc\x0b\x70\x00\x1f\x3c\x50\x06\x01\xc0\xd4\xa4\x15\x9c\x13\x8b\x47\x16\x29\x17\x20\x7c\xd4\xc1\xa0\xa5\xd9\x09\xa2\x77\x2c\x15\xc9\x08\xe4\xc9\x8f\x53\x1b\xce\xa6\x82\x44\x16\x6a\x5d\x94\x9f\x3c\x00\x3c\x95\x6e\x5d\x18\x5a\x1b\x3c\x5e\xfa\xef\x71\x49\x7e\xe0\x10\x07\xb8\xdd\x0b\xe8\x7a\x79\x1a\x7d\x7e\x13\xe4\x39\x74\x11\x76\xb8\x53\x69\x37\x08\x5f\x20\x05\x1d\x8a\xab\x82\xf0\x02\xf6\xc1\xb2\x79\x30\x9e\x61\xca\x52\x16\x56\x82\xe3\x14\x52\x60\xd3\x4f\xa0\x23\x1f\x8a\x50\xc1\xba\x21\xaf\x92\xc9\x09\x32\xd1\xf0\xcb\x84\xcc\x13\x02\x38\x59\x0e\xa1\x4c\xc0\xb4\x89\x49\xde\x3b\x28\x15\x48\xd0\x60\xfa\xb3\xfc\x37\x79\xf7\xcc\xfd\x59\x33\x9d\x49\xa9\x09\x53\x7a\xc5\x75\x0c\xe9\x81\xd8\x1c\x41\xf5\x4a\xf7\x50\x18\x7d\x3a\x25\xb9\x44\x01\x78\xd4\x75\x9d\xf2\x9c\x4e\x89\xdd\xca\xe4\xbc\xf2\xdc\x83\x6c\xb2\x42\xf4\xe4\xf1\x67\xa9\x8d\x15\x6c\xc2\x7a\x56\x3c\x11\x60\x66\x04\x4e\x29\xb2\xf9\x1d\x51\x4c\x82\x0f\x39\xf6\x62\x49\x44\x87\xb2\x0d\x43\x7d\x8b\x15\xc3\x4a\xce\xc8\xb3\xfb\x78\x37\xa5\x55\x95\x59\xe3\x6e\x63\xaa\xe9\x2a\x0b\xa2\xcb\x70\x99\x85\x8b\xbf\x2b\x5b\x55\x45\x8a\x4b\x1f\x7b\xf3\x4d\xb3\x8c\x81\x09\xe9\xb1\xbc\x68\xee\x42\xae\x61\xf8\xc6\xf4\xdf\xb0\x6c\x96\x29\x75\xba\x79\x37\x78\xc7\x0f\xf9\xfd\x41\xef\xff\x26\xe0\x4d\x18\xe8\x19\x95\x37\xde\x9b\x0a\x4a\x1c\xdc\xcb\x9b\x64\x3a\x86\x5e\xee\xc4\x32\xb0\xa8\xc6\xe3\xfd\xbc\x15\x37\x35\xde\x0c\x32\xb7\xd2\xaf\x3c\x1e\x1f\xc5\xca\x8e\x07\x43\x6f\x47\x44\xc7\xd3\x6c\x82\xc4\x03\x53\x8e\x0c\x05\xa0\x8e\x9d\xdf\x8c\x0b\xfd\x08\xc1\xd4\x72\xe7\x3a\x64\x1f\x36\x95\x14\x72\x00\x3d\x3c\xd7\xf1\xc6\x43\xfc\xcc\xc8\xd1\xf3\x10\x48\x57\x77\xb0\xd9\xc8\xcd\x9f\xda\xdc\x0d\xdf\xf3\x58\xdf\x4c\x63\x1f\x3d\xdf\xa0\xc5\xd4\x8f\x15\xfe\xd4\x8d\x88\x4b\xc0\x23\x39\x7c\xb8\xef\x60\xa7\x6f\x40\xd9\xa7\xa3\x59\xc8\xea\x92\x47\xc6\x86\x30\x92\x6d\x44\x30\x48\xa6\x0a\x41\x95\xd4\xc8\x58\x23\xee\x73\x5c\x6e\x5f\xc1\xb5\x52\xdc\xfe\x86\xfc\x5e\x16\x2e\x55\xc0\x51\x59\xf9\xfc\x16\x8f\x98\x10\xcc\x7c\x02\x4b\xfa\x27\xd1\x0c\xef\x72\xfc\x2a\xf6\xd8\x18\x3c\xe3\x1b\x36\x65\xeb\x6f\x2a\x43\x6c\xcf\x50\x7b\xd8\x64\x14\x21\x91\x29\x94\x12\x6c\x3e\xea\x1c\x00\x63\x79\x24\x57\x4a\x80\xad\xcd\xef\x60\x2c\x41\x9e\x31\xba\xcd\xa9\x4b\xc2\x34\x68\x50\x4f\xc1\xc6\x6e\x8d\x92\x63\xa4\xa7\x8f\xe8\x32\x0e\xee\x52\xe0\x00\x06\x92\x88\x3b\x1d\xb3\xe6\x2f\x23\x46\x15\x1e\x36\x64\x19\xa4\x06\x13\xcb\xce\x5d\x38\x63\x86\x19\xe6\x67\x45\x64\x28\x55\x2c\x12\x75\x1a\x47\x2c\x52\x5c\x04\x07\xc7\x3f\x48\x4b\xa8\xd9\xa4\xbb\xe3\xd0\x30\xa6\x3f\xcd\x2a\x49\x28\xce\xe6\x85\x93\x13\x75\x8f\xce\xcc\x25\xd1\x8c\xb4\xf0\x29\x73\x5a\x3d\xa6\x54\xfc\x95\xe6\x7f\x7c\x79\xf9\x2d\xd9\x03\xe4\x41\xfb\x62\x68\xd6\xaa\x05\x4a\x01\x9b\x08\xbf\x7c\x20\xcb\xd6\xef\x3c\x78\xd0\x5a\xdc\x98\xf3\x75\x17\x3e\x57\x71\xec\x66\x12\x14\x99\xe5\xb4\x2b\xeb\xce\x1e\xdc\xc9\x45\x68\x90\xa8\x4b\x14\xa1\x09\x25\x1c\x1a\x95\xf2\xd1\x27\xc8\x5f\x51\xaa\xe0\xa0\x58\x67\x96\x3f\x11\x5d\xf8\x1a\x77\x8c\x01\xbd\xd0\xd6\xb6\xca\xd3\x69\xda\xe6\xf2\x79\x9b\x22\xaf\x11\x5a\x11\x59\x33\xdf\xbc\xfd\x86\x36\xc4\x8a\x6b\x66\xeb\x61\xe3\xfa\xbf\xec\xed\x4c\x96\x56\xf0\x97\x4b\xdc\x61\x55\x8a\x5c\x5e\xf9\x9f\x45\xdd\x3c\x7c\x51\x3c\x4b\x38\xa3\x7e\x58\x5f\x7a\x66\xc8\x87\x6b\x49\xf8\x65\x16\xb3\x39\xfc\x1f\x50\x74\x90\xe8\x43\x48\x6d\xf8\x88\x7a\x11\x49\x09\x2c\xb6\x54\x35\x38\x22\xf4\xbe\xe6\x63\xa2\xcb\x22\x2b\x80\x33\xc7\x9d\x20\xfb\x64\x0d\xdd\x88\x76\x13\x0e\x75\x64\xff\x8c\xca\xc2\x5f\x2a\xeb\xd8\x9f\x94\x9f\x1a\x8b\xbf\xba\x20\x14\x23\xf8\x6d\x61\x76\xc1\x5d\x3d\x03\x23\x87\x8f\x34\x0e\x6e\xb7\x98\x5c\x08\x42\x72\x0c\x66\xe6\x6d\x0e\x36\x79\x71\x0c\x85\xb8\x91\xcd\x45\x59\xc8\x01\xe5\x20\x11\x50\x6a\xe0\x8e\x14\x8f\xe1\xee\xf8\xe3\x4e\x1c\xfd\x87\xa8\xe4\x41\x99\x2a\xe1\x85\x99\xfa\x0e\x47\x12\x13\xd9\x50\xdf\xcc\x8d\x02\x60\x37\x68\x88\x52\x01\xf5\x3d\x2b\x79\x7a\x08\xfa\xe9\xc1\x1d\xe5\x6e\xe1\x0d\x75\xe7\x22\xfa\x10\x39\x74\x4e\x3a\x4a\xb0\xc6\x28\x34\x78\x72\xff\x4c\x66\x98\xa1\x46\x14\x9a\x21\x25\xac\x0d\xf0\x52\xf3\x9f\xcc\x94\x1c\x22\x76\x6d\xa8\xdd\x53\x55\x03\xe7\x07\x40\x79\x31\x20\x14\xd2\x0d\x5c\xe9\x18\x42\x17\x6a\x08\xea\xa2\xc1\x69\xb6\xa4\x47\xe1\x9f\x8f\x3f\xe4\x72\x70\xb9\x7c\x00\x43\x08\x9f\x24\x8d\x25\x4c\xfa\xde\x49\xa7\x75\x5d\xea\x4a\xb8\x86\x20\x44\x4b\xcb\x00\xad\x5a\xa0\xd2\x24\x1d\xa6\x59\xf2\x04\x25\x02\x23\x87\x92\x6f\x57\xa7\x20\x0e\x3d\x89\x7c\xfc\xea\x65\x5f\xef\x93\xb7\x94\xa3\xc5\xc0\xfb\x74\xa4\x76\xc0\x08\x91\xe1\x83\x5a\x10\xcc\x98\xb2\x32\xad\x0a\xf4\x1c\xc0\xcc\xad\x9a\x76\x74\xb4\x0e\xf9\x0b\x9a\x1f\x47\xef\x50\xa6\x73\xf5\x87\x33\x80\x44\x03\xee\xfd\xe0\x23\x47\x68\x99\x64\x6a\x06\x57\x9f\xa9\x44\xab\xd4\x45\xf2\xf9\x48\xf6\xdc\xa4\x1c\x11\x62\x45\x83\xf2\x4f\xac\xb4\xe1\x35\x74\x25\x8e\x23\x84\x27\xb0\x8a\x18\xda\x0f\xd5\xd9\x02\x75\x04\x92\xa1\x79\x02\x1b\xb5\x79\x29\x25\x16\x0d\x19\x4b\x82\xbb\xb4\x35\xb0\x31\x4a\x8a\xc1\x46\x58\x9d\xd6\xf3\x0d\x1c\x6d\x17\xef\x63\xab\x1b\x74\x18\x78\x9f\x1b\x16\xe6\xa4\xf6\x20\x89\x8d\xbc\x42\xa4\x56\x22\x08\xd9\x23\xee\xf8\x2a\xf2\xca\x88\x71\x00\x89\x69\xac\x49\x5c\xb8\x43\x46\x64\x86\x40\x68\x58\xa0\x31\xa4\x45\x30\x9d\x97\x2a\x02\x4c\x80\xf5\xb5\x4b\x7a\x1b\x92\x1b\xb1\xbe\xeb\xec\x7e\x32\x11\xc7\x1a\x7b\x8f\xe9\x23\x84\x59\x50\xa8\x50\xf8\x42\x65\x88\xae\xe4\xa2\xb7\x47\x5b\x7a\x40\x2e\x83\x6e\x63\x0e\x9d\x0e\x9f\x7e\xf1\x2e\xa6\x90\xf1\xf8\xa3\xbf\x31\x22\x80\x56\x67\xa1\xe5\x00\x6d\x09\x1f\x3a\xa0\x2d\x81\xa4\x46\xee\xec\xee\x99\x75\x54\x27\x37\x20\x17\xef\x08\xc0\x5b\x82\x7c\xd8\x26\x94\x55\x5a\xbf\xc5\x9a\xa4\x8f\x68\x2c\x06\x85\x5d\x0f\x58\x60\xe5\x7b\x4d\xce\xaa\x15\x90\xef\xc7\xc6\xee\x7c\x53\xe6\x05\x10\x19\x89\xc4\xdc\x75\x6c\xfa\x8a\x40\xc4\xfa\x20\xda\xe9\xd5\x1e\xe0\x7d\x95\x28\xdb\x00\x3f\xb3\xce\xbc\x45\x08\xea\x00\x52\x70\xfd\x7b\x51\xee\xd2\x10\xbc\x33\x58\xb3\xe6\xe2\x38\x50\x0c\x40\x03\x63\xb4\xad\xe0\x77\x82\x57\x40\x30\x69\xe9\x7a\x20\x87\x8c\x15\xa4\x18\xff\x7e\x9a\x0f\x1d\xd2\x14\x54\x3c\x80\x46\xc5\x9f\xbd\x0f\x92\xe5\x7f\x26\xd4\x4d\xf9\x6a\x90\xae\xe0\x27\x66\xe8\xe0\x47\xdb\x7b\x76\xef\x49\x94\x22\x24\xbd\xbf\xad\xb1\x93\x9a\xfe\xde\xa8\x6b\x70\xaf\xe5\x94\x2a\xc0\x1d\x12\x07\x77\xf9\x4a\xda\x42\x91\x4d\x00\x59\x25\x5f\x1d\xa4\x2e\xc4\xb9\x0e\x26\x6f\x94\xc7\x87\x5f\x61\x0f\x57\xbc\xff\xfc\x70\xfd\x07\xa2\x55\x3a\x0a\x47\x53\xad\xd0\xc1\x66\xa0\xdd\x42\x7e\xa9\x0a\x7e\x4b\x02\x31\xca\xd7\xb7\x04\x17\xde\x03\xcd\x7f\xd7\x9a\x38\x08\x8e\x8b\xce\x03\xc0\x16\x5c\xd3\xd7\x2b\x44\x27\x4e\xad\xe6\x02\x85\xe8\x44\x28\x09\x40\x6d\x42\x62\x0b\xae\x36\x51\x02\x4a\xee\x82\x5c\xf7\xda\x1b\x3f\xc9\x2a\x3b\xed\xa7\xb5\xd6\xd7\x9d\xcf\xd5\x9d\xdb\x93\x6a\x57\xed\x71\x6b\x86\x63\x1b\x9b\x1b\x64\x00\x94\x17\x71\x21\x8a\x10\x9f\xd8\x24\xd4\x0c\xc5\x09\x55\x73\xbd\x98\x0e\xdc\xbb\xb3\x81\x3f\x59\x7f\x32\x14\xab\xbc\x8a\x06\xf3\xf4\x21\x5a\x3e\xa4\xa5\x97\x04\x03\x24\x94\x34\xc5\x77\xac\xfb\xb2\x8e\x44\xb4\xfd\x22\x22\xb0\xb2\xa3\x5f\xab\xaf\x73\x28\x55\x4c\x5d\x68\x4d\x28\x0f\xa5\xaf\xbd\xd2\xc9\x7b\xc4\x97\xfb\x15\x97\x1a\xe7\x87\xf2\x3e\x4b\x84\x07\x4e\xd1\xd7\xf7\x10\x08\xd7\x0d\x9b\x61\xa1\xd7\xb2\x44\x7e\x53\xbf\x48\x88\x42\xe1\x9e\xfd\x22\xf6\xf3\xbe\x68\xcd\xbf\x47\x0c\x39\x5b\xb7\x99\xcc\x91\xcd\xd4\x3b\xa9\xa5\x03\xa7\x1d\xe5\xbb\x2b\x48\xcd\xa7\x92\x02\x95\x9a\xfb\x42\x5e\x59\x62\xb8\xa8\x42\xb0\xc2\x03\x4c\x25\x3a\x80\x90\x68\x3f\xe9\x2c\x75\x97\xf9\xee\xba\x5b\x4a\x0f\x87\x22\xbc\x29\x4c\x81\x58\x29\xdf\x28\x5c\xe4\xea\xc1\x48\x19\xce\x73\xdb\x30\x9b\x97\x17\xa3\x22\x85\xe0\x32\x70\x60\xf4\xe0\x4c\x89\xb3\x98\xc5\xd7\x14\x03\xe6\x4c\x59\x8c\xd9\x95\xb8\x29\x83\x81\x18\x4f\xab\xd6\xc8\x8d\x7d\x95\xf8\x05\xa4\x10\x3e\x44\xcc\xbf\x42\x18\x6f\x66\xcb\xca\x52\x99\xb1\x6f\x1c\x41\x9d\x27\x71\xf0\xad\xf5\x39\x62\x4b\x7b\xd0\x10\xe6\x21\x0e\xa0\xe2\x4e\x8f\xd8\xa5\x45\x8f\x27\x79\x6a\x95\x34\x0a\x98\x05\xe8\x0f\x06\x21\xaf\x21\x35\x41\x0f\x78\x1f\xf4\xcc\x00\x11\xba\x88\xe5\x38\xbe\x7d\xf8\xa2\x9b\x2e\x82\xbc\x52\xe8\x38\x7e\x1a\x12\xdb\x41\x07\x19\x60\x68\x3c\x20\x57\x5f\xaa\x09\xc7\x22\x35\x0c\x03\x5c\x1f\x33\xc8\x17\x62\x25\x83\x4e\x7a\x77\x9e\xe4\x40\xca\xea\x00\x0e\xb9\x8c\x03\xb6\x8c\x84\x16\xf6\x5b\xe5\x1e\x3a\x15\x88\x43\x68\x4a\x1d\x48\x58\xd5\xb5\x37\x2e\x4b\xbb\xfc\x44\x5e\x84\xd4\xec\xf0\x80\x8f\xf0\x68\x4b\x84\xa2\x0a\xaa\xc6\x58\x1d\x16\x60\xf3\x40\x94\x6c\xa8\x58\x0c\x6c\x10\x69\xdd\x3b\x9d\xda\x53\x1a\xf8\x83\x55\x32\x3c\x69\xa1\xc8\x25\x42\xa0\x4b\x88\xe5\x90\xce\xb0\x4f\x6a\x68\x11\xc4\xdd\x8b\xe1\xcd\x4a\x1b\x11\xa9\x64\x41\x39\x12\xcc\x14\x54\x56\xbd\xc6\xee\xc8\x0f\x21\x51\x27\x1b\x0a\xe9\x10\x58\xa5\x38\x75\xf7\x61\x57\xd0\x31\x53\xad\xbb\x3f\xd2\x78\x88\xe0\x22\x20\x29\x3c\x84\x0d\xd7\xdd\xb1\xd0\xd0\x61\x22\x72\x06\x0c\xa6\xf4\x1b\x42\xff\x9a\xb9\x77\xe2\xd7\xb6\xd2\x4d\x3f\x67\x21\xbf\xd7\x9d\x11\x36\xdd\xfd\xd3\x7f\x03\xe6\x62\x84\xa1\x89\x2e\xc7\xee\x9e\x48\xde\x7e\x73\x5a\x6f\x1f\x6c\x8b\x07\xc0\xc7\xdb\xcc\x5c\xa9\x4e\x70\x7f\x47\x62\x85\xee\xf8\x6c\x91\x6b\xd9\x1d\xb7\x07\xda\xa1\x0c\x47\x02\xf0\x53\x0a\x14\xf7\x26\xaa\x4e\x87\x1c\x48\xa1\x50\xa1\x95\x56\x83\x93\xec\x24\x83\x52\x3b\x40\x0c\xf3\xbd\xe8\xa2\x87\x0d\x69\x8a\x00\x35\xac\x98\x58\x43\x57\xfc\xaa\xf6\x21\x12\x51\xd3\x00\x6e\x34\x77\x3d\x74\xe4\x74\xed\x9a\x0b\xd1\x10\xfd\x66\x06\xd6\x95\xe6\x35\x22\xe2\xa9\x00\x68\x68\xc0\xda\xa0\xa4\x36\x8e\x0c\x85\x26\xd5\x06\x16\x3c\xc1\x8b\x7c\xf8\x87\x18\x6d\x75\x59\x6c\x49\x7c\x02\x84\x61\x11\xfd\xd8\x1d\xb1\xbc\xef\x91\x8a\x5e\xa6\x6f\x93\xc1\xb8\x63\x86\x02\x1c\xff\x6e\x22\x1c\xd0\xb5\x6d\x72\x17\x73\x0a\x14\x8a\x21\x10\x4a\x3d\x04\x9a\xc2\x06\xd9\xe7\x8f\x84\x15\xba\x10\x17\x80\xa8\x9f\x2b\x9b\xd4\xcf\xc5\x22\x74\x27\xde\x1c\x8b\x3b\x7b\xb8\xd2\x9f\xb8\x65\xcd\xba\xfa\x85\x80\x2e\x53\xcf\xff\x89\xc2\x1e\x39\x9f\x89\x80\x0f\x4e\x63\x3b\x46\x40\xac\x5d\xf3\x2a\x47\xa3\x79\xec\x6a\x0c\x3a\x1d\x42\x38\xd7\xbd\x12\x6e\x25\x5a\x40\xdd\x42\x85\x63\x53\x5f\x8b\xee\x86\xdf\x90\x8d\xb0\xac\xed\x5c\x79\xec\x9c\x7c\x96\xd1\xd9\xa8\xca\x73\x7a\xc0\x0e\xeb\xa8\xa4\x47\x03\xf2\xb7\x50\x1f\x43\xff\x6c\x34\x54\x1d\xc2\x2e\xbc\x6d\x54\x77\xfc\x77\x35\xf9\xb9\x17\x33\x35\xce\x88\x88\xf2\xad\x89\xc6\x47\xb7\x90\xfb\xc2\xc9\xb3\x39\xa9\xef\x96\xf2\x8f\x25\x32\x79\x63\x9f\x3d\xda\x98\xe1\xf9\x06\x49\xc2\xba\x07\xd6\xef\x69\xd6\x76\x11\x31\xe7\xaa\x1a\x5b\xd7\xf4\x51\xca\x15\x02\x18\xc8\x3b\xe0\x83\x71\x8f\xa1\xea\x0c\x6a\x72\xa6\x20\xc1\xae\xc8\x4d\x67\x43\x5d\x68\x57\x26\x29\x30\x94\x50\x21\xb0\xe1\xa8\x13\x98\x42\xc0\xe2\xeb\xe6\x42\xa7\x00\x49\x94\x58\xb0\x5a\x42\x10\xe3\x20\xdf\x1b\xd2\xb6\x34\xfb\x45\xb5\xa9\x17\x91\xff\x28\xbc\xd8\xfc\xf0\xc3\xd2\x86\xbd\xcc\x7e\xc4\x3f\x02\x01\x9b\x3a\x4c\x14\x3a\xf1\x64\x27\xfe\x1e\x11\x21\x92\xd1\xc9\x1b\x95\x73\xf2\xb6\x85\xac\xc7\xf6\xf0\x1e\x9c\x38\x7f\x03\xf0\x3e\xb3\x52\x93\xf0\xb8\x18\x90\x0a\x24\xb1\x8d\x6d\x68\xe7\x48\x77\x91\x7a\x49\x6e\x8a\x1b\x8a\x1a\x02\x90\x3a\x09\x66\x82\xae\xf7\xab\x0d\x3d\x93\xe5\x11\xbf\x98\xe8\x55\xe9\xa4\xe6\x89\x7c\x68\x39\xc7\x3b\x74\x70\xba\xcd\x99\x6d\x22\x67\x71\x2d\x19\xfa\x49\x7a\x64\x84\xfc\x53\x16\x64\x78\xc7\xe9\x86\x96\x69\x62\x58\x1f\x96\x35\x4b\xbd\xe1\xac\x65\x11\x03\x34\x6b\xa1\xfe\x81\x4e\x93\xf0\x18\xe4\xf9\x80\x0c\xc8\x9a\x25\x3f\xf1\x65\x1f\x91\xd4\xa8\xd2\xbd\x22\x86\x42\x70\x4a\xf2\x05\xdb\x46\x63\x81\x86\x1c\x88\x5e\x23\x7a\x1b\xce\x45\x3b\x50\x84\xb0\x97\x6e\x5a\x47\xa9\x7d\xf2\xe9\x54\x84\x3f\x50\x28\x3e\x75\xa2\x78\xee\xc0\x00\xf6\x11\x60\xc1\x8c\x3b\x07\xd4\x30\x03\xcc\x52\x12\xd1\xc2\x96\xa3\xf8\xe7\x56\x9b\x40\x08\x9d\x85\x06\x9e\x4d\x51\x24\x44\xc0\x0d\xfe\xd4\x43\x54\xb3\xc3\x49\x89\x63\x5f\x04\x06\x41\x34\x44\x95\x84\x91\xa1\x53\x77\x48\x9e\x4f\xba\x91\x43\xaa\x1d\xb1\x38\x01\xf4\xab\xc6\x7e\xd1\xc5\x00\xa6\xf6\x78\x58\xdb\x53\xb7\x19\xec\x9d\x86\x24\x8f\x82\x00\x1a\xfd\x53\xfe\xc0\x0e\x64\xcd\xda\x23\x19\x1d\x64\xea\xb4\xd1\x3d\x3d\x19\xb7\x6a\x20\x2d\x7a\x97\xe3\x78\xab\x2a\x99\x1a\xc4\x1d\x04\x83\x58\xa1\xfe\x59\x75\x16\xa4\x13\x2c\x42\x47\x48\x9c\xc0\x1c\xe7\x81\x5d\x3c\x0d\x28\xf3\x6c\x85\xa7\xf1\x0b\xa4\xaf\x66\x24\xe9\xeb\xab\xca\xe9\xd3\xd7\x7f\x5e\x26\x09\x51\xbc\x2a\xfd\xbc\xe9\x3e\xff\x58\x67\x3e\x50\x09\x8d\xa0\x90\x16\xa1\xb4\x06\x2d\x0c\x54\x9b\xf4\x48\x93\x7d\xec\x24\x98\x4e\xd1\x2b\xfb\xda\x2c\x35\x2a\xce\x10\x26\xa1\xcb\xcf\xda\x8f\x26\x77\x86\x0e\xb7\xd4\x0d\xb4\x38\xa7\x74\x76\xc1\x7d\x87\xd0\x03\x4e\x2d\xac\x89\x49\x66\xc4\xec\x72\x2e\xff\xa2\x1d\x7d\x55\xfe\xef\x96\x72\x89\xbd\x4b\x77\x02\xc3\x14\xe6\x28\xed\xd1\x1a\x97\x24\xc4\x5c\xda\xa4\x34\x69\x13\x0f\xf3\xc7\x84\x61\x25\x45\x18\x20\x69\xab\x21\x48\xa3\x18\xb5\xa4\x44\x6d\x04\x71\x50\xd1\xe2\x48\x2f\x1e\xc4\x78\x46\xd0\x7e\x2f\xfc\xfd\x76\xdd\x2c\xcc\x38\x67\x8d\xdc\xf0\xbd\x7c\xe8\xf2\xd8\xfd\x7a\xe8\xc0\xf9\xa7\x82\xa2\x00\x36\x08\x61\x71\xdd\xdf\x43\x05\xfd\x01\x6c\xcf\xd0\x32\x81\x1c\xd0\xa9\xdf\x0c\x9a\x3d\x43\xf3\xc4\x79\x16\x1d\xdb\x07\xcc\x9b\xdc\x24\xf1\x90\xd6\x73\xaf\x21\x6b\x72\xb0\x7d\x18\x90\x72\xcc\xaa\xd0\x78\xad\x83\x4a\x0e\x85\x4a\x1f\xcb\xd9\xc9\x59\x9d\x96\xed\xa6\x5c\x0d\x9c\x6b\xfc\x27\x08\x5e\xf8\xda\xb1\x36\x9a\xb3\xbf\x41\x7b\x02\x94\x52\x41\x6b\x27\x4f\x3c\x42\x42\xfc\x0d\x99\x15\xeb\x97\xd0\xf7\x93\x24\x01\x0a\x31\x7c\xff\x89\x07\x0d\x72\xc1\x27\x15\x7e\x3e\x2e\x45\xe2\xb2\x5d\x60\xb7\x47\xe1\x51\x16\x0e\xc8\xa5\x94\x86\x66\xec\xa4\x01\x8c\xc4\x5e\xa3\x41\x41\x11\x09\xae\xa7\x42\x57\x27\xc2\xd3\xf4\xe8\xba\x5b\x9a\x23\xf6\x0c\xa9\xa6\x9d\xba\xc1\x07\x04\x2b\x19\xdf\x63\x76\x3c\xe5\x05\xbe\x9f\x77\x71\x13\xea\xfb\x86\xfb\x77\x99\x2b\x79\x14\xbe\x20\xdc\xf7\x8f\xfd\x7b\x6b\x5d\xdf\xa5\x47\x50\xae\xb7\xd7\xf1\xbb\xca\x7e\xf9\x16\x92\xb3\x7c\x45\x8e\x83\xe5\x60\x9e\x04\xc9\xd9\x59\xe6\x6d\x5b\x0c\x73\x01\x92\xd0\x84\xfc\x16\x24\xf5\x70\x37\xd6\xec\x47\x72\x19\x7d\x41\xd4\xe5\x17\x73\x8e\xc3\x55\xc1\x19\xdf\x2c\xb5\x2e\x48\x94\x78\x3b\x80\x32\x49\xf6\x72\xed\xb4\x70\xf0\x75\x5a\x96\x98\xcd\x7f\xb3\x67\xaa\xfc\x47\xd1\x12\x1e\xca\x5a\x33\xde\xfb\x0b\xd9\x26\xaa\x99\x19\x94\xb6\x08\xc5\x07\xbf\x69\xde\xbc\x9b\x06\xe0\x55\x40\xa0\xe0\x8f\xfb\x9b\x7a\x2e\xba\x7f\x93\xdb\xe8\x3c\xde\xcc\xc1\x84\x87\xf9\xb9\x23\xbf\xf2\x73\x63\x55\x8b\xa3\x25\xf4\x47\x7c\x4a\xf4\x21\x73\xc1\x49\x48\x43\xf1\xc3\xf1\xfb\x83\x55\x60\x7f\xdc\x9f\x7a\x3c\x79\x04\xed\x11\xe8\x93\x64\xe9\x93\x90\x85\xe4\x93\xa5\x28\xf5\xc9\x52\xc3\xf8\xd8\xc8\xc9\x16\x0a\x44\xcb\xe1\x13\x4c\xd1\x9f\x4e\xb1\x22\x1f\x1b\x0f\x2f\xa6\xc7\x7d\x12\x39\x77\x3e\x69\xd3\xf6\xc6\x88\x95\x8f\xba\x7f\xf0\x64\x7f\x19\x1b\x05\xe8\x55\x84\xd7\xda\xca\x7f\xf0\x62\x78\xef\xf4\xfe\x7c\xd9\xe8\xdf\x1f\x59\x7c\xef\x8f\x9b\x69\xef\x8f\x34\x2e\x6e\xc5\x4e\xbc\x95\x19\xf7\xbe\xb5\x04\x69\xa0\x93\x52\x87\xe7\x4f\x33\xd6\xc5\xec\x54\x51\xcc\x19\x62\xbe\x91\x01\x4d\x0f\xde\xa2\x86\x81\x86\xca\x19\x6a\x2a\xc3\x41\x2b\x16\x90\x97\x06\x90\xfc\x44\xdd\xc8\x4f\xf5\x0e\x29\x87\x77\x5d\xcc\x58\x67\x68\xa0\xe1\x85\x2d\xf0\xfd\xcb\x63\x30\xa8\xd5\xc0\x77\x7d\x5c\x7a\x16\x0e\x09\xe6\x65\x0c\x6d\x93\x0a\x0f\x8f\x83\xce\x7a\xa4\x4b\x2a\x29\xbc\x39\x28\x92\x28\x92\xfa\xed\xcc\x06\x5e\x33\xfb\x4e\xf1\x38\x84\xb7\xf0\xe0\xbe\x63\xdd\xf5\x5d\x0e\xc9\xaa\x44\x5a\xc3\xbb\x6c\x3f\x1d\x94\x75\xf7\x09\xdb\xbb\x98\xed\xc7\xab\x2c\xd7\xa9\xb3\x2d\xcc\x63\x77\x90\x0e\x21\x29\xcf\x60\x4d\x69\x38\x25\xf6\xb2\x0c\xb3\x08\x10\x81\x13\x7f\xad\x98\x04\xeb\x09\xde\x7c\xf8\x25\x37\xc1\x99\x7c\x79\x3b\xff\x2f\x54\x5c\x02\xcc\xaa\x32\x98\x5f\x3d\xfa\xe0\x5d\x62\x95\xf3\x5d\x86\x4d\xf5\x1a\x56\x12\xb1\x82\x48\x47\xef\xac\x38\xb3\x20\x6b\x16\x32\xab\xef\xf9\xe2\xcb\x86\xe7\xac\xa1\x36\x19\xc5\x86\x38\x51\x5d\xd7\xc5\xcc\x20\x1f\x4a\x20\xe0\xb2\x37\xdd\x16\x69\x35\x1b\xca\x12\x0a\x71\x74\x36\xc4\xff\xda\x20\x2e\xad\x9d\xfc\x09\xe9\x13\x91\x9f\xba\xe6\x8b\xa7\xa3\x02\xed\x88\xaf\xdf\xb4\xc1\xb6\x05\x10\x3f\x09\x5e\x04\x43\x55\x5e\xd4\x77\xfe\xed\x93\x7c\x89\xcc\x8d\x37\xed\x43\x08\xc8\x88\x92\xd0\xe0\x73\x56\x0e\x2c\xe6\x8c\xe0\x97\x7e\x0a\xc7\xf3\xc9\x4b\x34\xfd\xdc\x16\xc8\xc1\x11\x7f\x4e\xf9\xa7\x2c\x83\x04\x0c\xde\x8e\x84\x55\xb2\x9e\x94\xe7\xf2\xf1\xa0\x26\xcb\xe7\xaa\x32\x7c\x38\x30\xf5\xa5\xc3\x13\xca\x32\x6a\x30\x8d\x49\xf7\x9d\xae\x23\x94\x5c\xce\xd3\xc7\x6a\x89\xcd\x08\xf9\xc2\xca\x3b\x39\x95\x30\x87\x38\xdb\x90\xa9\x13\x8c\xcc\x6f\x0f\x10\x95\x13\xfe\x8d\xf8\x68\x2f\xd7\x35\xa4\x68\x56\xa8\x45\xfa\x1d\xfc\xd1\x12\x83\x2e\xc8\x9f\x5f\x99\xdd\xd9\xe6\xe1\xef\x1f\x95\xd4\x3b\x3d\x9b\x26\x0c\xab\x29\x72\xb7\xd7\xdd\xb7\x0c\xdb\x57\xad\x93\x6b\xae\x54\xe5\xf1\xbc\xea\x53\x0a\x2f\xcc\xf9\xb3\x32\x2f\x41\xe3\xf9\xaa\x83\xd2\xc7\x5e\x0c\xbb\xa6\x90\x4c\xd9\x19\x18\x86\x80\xb9\x42\xb5\x16\xfb\xac\x16\x2e\xac\xbc\xca\x4f\x17\xe3\x15\x43\x95\x01\x2e\xef\xbe\x10\x99\xd1\xfe\x2b\x59\x91\xec\xd3\x88\x42\x78\xba\xd9\xfe\xca\x4c\xf6\x7a\x79\x0c\xc5\x49\x94\x7b\xc9\xba\x80\xf5\x51\x48\x01\x47\xaf\x6c\x1f\xf3\x5d\xa8\x1c\xf9\xb2\x17\xeb\x3f\xc1\x7b\x90\x02\x8a\xbd\x9e\xba\xd7\x9b\xe9\x28\x2f\x64\x66\xf6\xb7\xa3\xe3\x25\x95\x93\x83\xea\x38\xf0\xa3\x9e\x01\x78\x9b\x5a\xd9\x02\x0f\xd1\x49\x65\xae\x57\xda\xde\x1f\x6f\xd4\x40\xf6\x3d\x0d\x3f\xfd\x97\xd2\xd4\x5f\x36\x2d\x5f\x43\x08\xe6\x7e\xc5\x11\x4b\xad\x02\x08\x16\x54\x77\xf3\x02\x8d\xee\xfa\x53\x8a\x71\x36\xbd\x97\x6b\xf3\xee\x4b\x9c\x6f\xaa\xc7\xde\x50\xbb\xa2\x7c\x2f\x2f\xb7\x1c\x4f\xc9\xd8\x40\x96\x4a\x20\x7f\x94\x39\x4f\x8d\x19\x84\x96\xc7\x31\xf9\x75\xc6\x59\x06\xe7\xc4\x5f\xda\x86\xd4\xf0\xb9\x11\xcd\x21\x31\xd2\x9f\x3f\x59\x9e\xbc\x8f\x05\x71\x37\x3e\x04\x02\x87\xa2\xec\x2b\x85\xf6\x0c\xc8\xa2\x93\x10\xca\x9b\xbe\xb6\xbb\x09\x9f\xdf\x10\x55\x3e\x08\x2a\x77\x30\x9c\xfe\xde\xaf\x39\x87\xf2\x3b\x96\x1f\xff\x28\xca\x78\x55\x6f\x39\x17\xee\xb5\x05\xc7\x63\x8d\xce\x0b\x04\xbf\xfa\xc1\x74\x38\xdd\x8b\xb2\x5e\xee\x79\x71\x89\xa5\x7b\xa0\x8c\xdb\xf5\x91\x5f\xe6\xfa\xac\x21\xe3\xf1\x61\x57\x7b\xd9\x68\x34\xd0\xd7\x7d\xbd\xb3\xbe\x26\x20\x92\xa9\x5f\xc1\xf5\x74\xc9\x4f\x8b\x52\xda\x30\x9e\x11\x76\xdd\x92\x7c\x41\xe2\x7f\x48\xc3\xdb\x44\x8b\x3d\x11\x64\x3a\x77\x99\x6b\xc0\x1d\x27\xff\x88\x01\x96\x6e\xc9\x51\x25\xe2\x52\x9b\xc2\x4b\x79\xc1\xc0\xa5\x0e\x08\xa8\xff\x1a\xd0\x2f\xca\x15\x3a\x31\xc8\x04\xff\x10\x82\x79\xa3\x38\x44\xdc\x01\xcd\x66\xc3\xbc\xd7\x23\x3f\xfc\x9b\xb8\x10\x1a\xa0\xc8\x98\xeb\x68\xc1\xa2\xd7\x61\xb3\x48\x84\xf6\x13\xbf\xe2\x4c\x8a\x03\x03\x80\xf6\x12\x5b\x18\x22\x85\x4e\x17\x51\x00\xca\x2a\xfd\x51\xd8\x4b\xf4\xab\x54\xfa\x19\x2e\x36\x65\x48\x59\x44\x14\xd4\xd5\x44\x5d\x2a\x48\x3a\xfc\xce\xaa\xbf\xc2\x4b\xec\xf4\xd6\x01\xaa\x5c\xa1\x6c\xab\x97\x55\x57\x2e\x4e\x41\xce\xa2\x48\x39\xef\x0a\x52\xa7\xab\x3e\xd9\xf1\x5d\x55\x62\x3e\x55\xbc\xb8\xae\x49\xe1\xe5\x2a\x59\xbe\xcb\x75\xb1\xfc\x54\x05\x16\x35\x8f\xea\x16\x0e\x0c\xd7\xfc\xd1\x67\x70\xc1\x03\x48\x15\x9e\xf9\x0e\x3d\x31\x40\xd7\xbc\x99\x8f\x3b\x74\x68\xd0\x47\xe7\x41\x90\x7d\xf3\x05\x92\x5d\x9e\xae\x4a\x9c\xa6\x84\xaa\x4e\x0b\xd5\xc5\x1c\x9b\x7b\xd2\xb6\xa7\xcc\x57\xe2\x41\xfc\xaf\x6a\xa3\x61\xe2\x66\xc8\xdd\xe4\x7f\x85\xde\x24\xa0\x81\x0f\x2c\xbf\x7e\x39\xf0\x36\xf5\xa2\x78\x92\xbd\x27\x7d\x0c\x57\xde\x45\xae\x68\xc8\x6f\x9d\x54\x8f\x17\x06\x96\x85\x63\xeb\xe5\xac\xad\x7c\x76\x08\xf2\xe2\x4c\xcf\x2c\x46\xde\x79\x7e\xe4\xb8\x56\xb9\x9a\x4f\xf5\x02\x11\xae\x86\xd7\x4b\x66\xd1\x95\xa7\x66\x00\x5e\x59\xea\x38\x6e\xc4\x5f\x94\x5a\xb9\xd2\xad\xe0\x37\x43\xf2\xfb\x5c\xe9\x0c\x66\x4e\x17\xbf\x59\xd5\xcb\xd9\x86\xf3\x3a\x56\x62\x68\x80\xb3\x15\x60\x8d\x2a\x16\x34\x6c\xa3\x3c\x78\xf4\xc6\x61\x19\x5a\x39\x69\xa6\x2d\x70\x21\x6f\xc2\xe6\x0c\x54\xb1\x59\xd2\xfc\xb9\xf2\x9b\x47\x3f\xd3\x29\x75\xfc\x2b\x85\x2f\xf9\xf2\x09\x0d\x81\x64\x75\x3a\x55\xf7\xfc\x7e\xd6\x1f\x1f\xf9\x17\x6b\xb7\x6d\x0b\x1a\x60\x92\x01\xf8\x1c\x92\x5c\xf8\x6c\x9b\x74\x30\x3e\x83\xb8\xd2\xcd\x92\x75\xf2\xf2\x77\x0e\x25\x1b\x04\x7a\x4c\xa1\x74\x63\xb7\x2e\xe1\x94\xf7\x4f\x3d\xfb\x7c\x65\x76\x5d\xe7\x7d\x7c\x24\x68\xb3\xe3\x85\x66\xc2\x4d\x6a\x36\xb5\x63\xb6\xb1\xcb\xdd\xf8\xc9\xc1\xcf\x97\x04\xba\xc4\xa3\x16\x8e\x99\xe7\x8d\xac\x6b\x0a\x3c\xdc\x4f\x5f\x0f\x3b\xef\xa9\xd1\xb7\xdf\xd6\x85\xe8\xce\xee\xe1\xad\xb8\x16\x83\xa1\x45\xe1\xbc\xff\x3a\xe0\xba\x2f\x99\x61\x50\xbf\x19\xab\xc4\x60\x9c\xbe\xce\xd1\x71\xbb\xfc\x1d\x00\x09\xff\xbd\x2b\xa4\xb6\xcd\x51\xdf\xcd\x2b\xe4\xe4\x67\x8a\xf0\x03\x66\x3a\x12\xd0\xec\xfd\x7d\xec\x1f\xc7\x70\xe1\x9c\x2e\x90\x15\x97\xc9\x2f\x89\xce\x1c\x9a\x20\x03\x79\x58\x80\xf0\x1c\x47\x26\x26\xaf\x03\xad\x2a\xfb\x50\xc4\xb1\x89\xbe\x62\xa9\xa1\xb6\xc3\x1b\xbf\xaa\x44\x7d\x20\xa8\x63\x06\x78\x28\xbc\x54\xa9\xca\x54\x7e\x5d\x06\xc6\xf8\x4f\xff\x9c\x75\x6e\x83\xa3\x32\x35\xcf\x0b\x19\xa8\x3c\x77\x09\x21\x72\x83\x71\xcf\xe4\xd3\x3c\x03\xa7\x98\xde\xdb\x96\xbc\xd4\xae\x8e\x93\xfa\x80\xbc\x0b\x64\x91\x12\x6c\x3f\x45\xa1\xbc\x35\x69\x9d\x65\x89\x0b\x64\x05\xdd\x38\x8a\x1e\x43\x1b\x7d\xa8\x06\x99\x11\x1d\xcf\x0c\x9e\x41\x3e\xd3\x2c\x05\x2f\x08\xe7\x14\x70\xf0\x09\xeb\x37\xe9\xbc\xf4\xb6\xa0\x32\xce\x6a\x35\xf6\x2a\xc0\x45\x74\xb1\xc4\xac\x8d\x19\x44\x32\xf2\x81\xe3\xdf\xb0\x6b\x02\x85\x08\x03\x70\xfa\x61\x09\x2a\xba\x2a\x49\x04\x56\x9c\xd7\x2f\x71\x07\x7a\x3b\xf1\xb2\x5b\xd0\xbe\xc1\x41\x55\x1c\xae\x96\xd8\x6e\xc6\xcc\x87\x7d\xd0\xb9\xc3\x10\x61\x85\xf7\x83\xf2\xa9\xae\xaf\x13\x92\x37\xd5\x2c\x5e\xb9\xec\x4f\x50\x29\xfb\x4d\xec\x85\xa4\x9e\x66\xe7\x32\x5e\xca\xa3\xeb\x4e\x01\x18\x66\xda\xd9\x6b\x90\xc3\x64\x47\xda\x28\xbb\xe2\xb8\x5c\x43\x87\xd1\x9e\x06\xed\x46\xd5\xba\xcd\x8a\xf7\x53\x83\x01\x81\xfa\x4f\x08\xd5\x39\x04\xe2\x20\x5d\xcd\x4a\xea\x2a\xd4\xa3\x6b\x87\x47\x1b\x40\xd6\x8b\xdf\xbb\x02\x5f\x6d\xda\x56\x25\x68\x54\xa5\x4b\x54\x5b\xd8\xb0\x2b\xee\x60\x89\xcc\x31\x7b\xc1\x73\x2b\x4a\x63\xb6\xc9\xbb\x04\x25\x56\x3a\x3c\xa0\xc1\xb3\x85\xf6\x4e\xad\xee\xa6\x35\xc0\x79\x0d\xde\xce\x57\xa5\x3d\x66\xf6\x18\x6b\x38\xd5\x0d\x71\x79\xe7\x04\x39\x53\x48\xf2\xdc\x3e\x7e\x21\x80\x7a\x63\xf9\xd2\xd9\x97\x2a\x12\xa1\xf3\xa7\xec\xb1\x14\x8f\xc4\xb2\xc9\x67\xa8\x78\x2c\x29\xc4\x7d\x9e\xf7\xc8\xef\x12\xcc\x19\x7e\x99\x67\xf8\xad\xce\xa7\xd3\x23\x9d\xcf\x47\xe6\x66\x51\x92\x9c\x0d\x9e\x94\xc2\x35\x40\x06\x0e\x00\x76\x17\x4f\xaa\xec\x9d\xe5\xdf\xb3\x35\x1f\x99\x15\x67\xd1\xd5\x8b\x54\x61\x4a\x74\xa5\xe5\xa0\xfa\x49\x09\xb6\x58\x20\xfe\x67\x93\x1c\x2e\x50\x6e\x5f\xa3\x0d\x11\x75\xe5\x4f\x40\xa8\x28\x19\xa1\xe5\xc5\x55\x87\xb3\x55\x14\x4b\xab\x7a\x87\xe5\xf9\xa4\x25\x73\xc2\x36\x08\x31\xa1\x2c\x01\xa5\xa2\xb0\x6b\x00\x55\x32\x8f\xcf\x40\x3f\x45\xa1\x4e\x2d\x41\xf4\x47\x67\xe9\xef\x58\xe9\x3d\x9b\x72\x88\xf3\x20\x01\xcc\xf7\xaa\xda\x1b\xb2\xd9\x16\x1f\xcd\x7c\xff\x15\x0b\xba\xc1\xbf\xcf\x0b\xcd\x37\xd7\x1f\xcf\xf9\x88\x43\x0f\xac\xb4\x39\x82\x95\xc8\x53\x55\xd1\xc2\x01\xf1\x77\xe5\x15\x6a\x3e\x65\xb3\xa3\x6e\x41\x4a\x7f\xd8\xf0\x5d\x25\x22\x69\xb8\xb8\x8f\x0e\x1c\x25\x54\xb4\x42\x3a\xed\x4d\x51\xac\x39\xfa\xc8\xd9\x19\x1d\x98\x6c\x07\x81\xa1\x97\x64\x8a\x6c\x16\x7c\xa5\xd8\xb9\xb3\x2c\x71\x94\x26\x76\xd0\x21\x92\x42\xc9\xec\xeb\x5e\x42\x7b\xec\x92\xca\xdb\x6c\xd6\xc9\x47\x40\xe2\x41\x20\x2f\xd0\xe1\x0c\x34\x3c\xf3\x27\x9a\x50\x16\xad\xe0\x09\x5f\x37\x85\x7e\x14\x11\x7f\x62\x1e\xa1\x1e\xc4\x03\x7f\x09\xb8\x2d\x46\x0d\x00\x9d\xa7\xd9\x1b\x19\xa2\x8c\x7a\x3b\x79\xe3\xe3\xce\x5a\x7a\x38\xf3\xba\x8b\xac\xff\x44\xc3\xd0\x3e\x04\x28\x38\x5a\x9c\xdd\xef\x8c\x17\x9f\x97\xce\xdd\x6b\x67\x48\x7d\x42\xab\x88\x05\x3f\x70\x9b\x7c\xb3\x8c\xf4\x62\x43\xf6\x1b\xb9\x6c\xce\x3c\x30\x7c\xfe\x8c\x8c\x87\x33\x27\x24\xa2\x13\xf5\xea\xfe\x73\x12\x6f\xd7\xd9\xdf\x1b\xe3\x83\x5d\xbf\x68\x62\x07\xd8\x1f\xf0\x24\xb6\xd7\x06\x0e\xc5\x5d\x54\x34\xb6\x91\xa2\xd7\xb6\xb3\xf1\x7b\xef\x6b\xc7\xe7\x67\xb3\xf3\x44\x85\x4b\x48\x1b\xdd\x54\x42\x05\xa4\xd8\x86\x23\xcd\x02\x5d\x06\xe9\x88\x43\xc5\x89\x4e\x41\x24\xa7\xdb\xb8\x79\x35\xb3\xfb\x25\x5a\x74\xd3\x94\xc3\x7c\xd7\xff\x3d\x69\x2b\x64\x8b\x6e\xa7\xe6\xd6\xc1\x87\x7a\x7a\x2c\xf1\x35\x4d\xa2\x2a\xe2\x11\xc0\xed\x8f\xaa\x52\x65\x3a\x68\x3b\x2c\x6e\xcf\x50\x47\xb0\x95\xeb\xdb\x64\x90\xa2\xf3\x35\x94\xee\x90\x54\x22\xaf\x08\x40\xfe\x49\x2e\xad\x2e\x5c\xb1\x70\xc3\xba\xdc\xfc\x93\x47\x6a\x5a\x2e\xbe\xd1\xd5\x59\x37\xb7\x48\x80\x0f\x28\x78\xd4\x7c\xa3\xfc\x95\x53\x0a\xd1\x0c\x6e\xc4\x13\x58\x9a\xda\x1e\x16\xcf\x55\xc7\x12\x8f\xe4\x27\x0c\xe6\x12\x4b\x85\x28\xdf\xb1\x0f\x8d\x53\x52\x55\x73\xfe\xa9\x2b\x2d\x7a\x04\x0c\x63\x76\x60\x0f\xcb\x1d\x15\xda\x6e\x62\x51\xbf\x27\x9a\x8e\x5f\xd5\x53\x17\x2a\xa0\x67\x4f\x93\xa6\xc7\x44\x4b\x48\x52\x6a\x06\xc6\xb6\x6f\xd1\x97\x93\x3e\xd2\x4c\xfa\xf8\x34\x0f\xea\x4c\x7c\xdc\xce\x50\x2d\x6a\x05\x6c\x24\xac\x9e\x10\xb3\x27\x42\x28\x3b\x7f\xca\x5e\x2d\x1d\xc8\xcf\xbd\x08\x25\xa7\xe4\xdc\xd5\x7e\xbf\x58\x5c\xfc\x34\x24\x01\x28\x04\xad\x13\xfc\xd1\x44\xda\x46\x9e\xc3\xba\xc3\x77\x80\x2c\x20\x29\xa0\xf3\x8f\x19\x15\xf2\x1e\x0e\x24\xda\x84\x5c\x71\xf7\xcb\x19\x94\xf6\xd3\xca\x81\xde\x7a\x3d\x1d\x9c\x24\xea\x64\x7d\x83\xd4\x91\x0d\x5f\xa2\x8f\x30\x78\x4e\xf2\x82\x9d\xa1\x5b\x0f\x6e\x7e\x49\x3a\x85\x08\x94\x0d\xa3\x2a\xbd\xb0\xde\x7c\xa9\xb7\xf4\x9e\x28\x13\x72\x5a\xcf\x40\x6d\xb5\x34\x4d\xf1\xcc\xa7\x84\x69\x05\x71\x08\x4d\x85\x12\x94\x35\x07\x5e\x24\x2d\xae\x17\x28\xcc\x62\x70\x3d\xc3\xe3\x43\x59\x9d\x8f\xb4\x87\x3e\x54\x8b\xf9\xb8\xcf\xf4\xc0\xfa\x90\x8c\xc9\xe3\xfe\x4a\x10\xe9\xfe\x48\x72\xe5\x7e\x55\x2f\x48\xcb\x74\xdc\x9c\x05\x98\x69\x38\x28\x5e\x07\x30\xab\x4c\x92\x6e\x62\x48\xda\x61\x46\x8c\x52\xb4\x11\x0f\x27\xbb\xf4\xb8\x3d\x53\xf5\xb8\x7d\x69\xf5\xf0\xe8\x3b\xa9\x40\x31\x07\x0f\xd3\x21\xc4\x6a\x51\x7a\x48\xb1\x5a\x2d\x32\x0e\xd3\x23\xb8\xb8\x63\xef\x6c\x83\xd1\x4f\x73\x0a\x29\x09\x1e\x56\x41\xb4\x09\x25\x96\x3c\xbb\x8d\xed\x92\x7a\x62\x60\x2a\xd4\x9c\x36\x70\x77\x9d\xb1\x11\xe7\xca\x5b\x8f\x35\xf7\xef\xdf\xad\x38\x88\xd6\xe5\x51\x15\x4e\xe2\x6a\x82\x17\x17\x59\x91\x5f\xcd\x7f\x82\x5f\x80\x79\xcd\xc0\x52\x5e\x7a\x4a\x09\x6a\x86\x7f\x8d\x57\xca\xd7\x1c\x37\x64\xf3\xdc\xb8\x97\xa1\x69\x4c\x0d\x91\x26\x7c\xd4\xa1\x71\x3d\x00\x8f\x71\x68\x92\xe4\x33\x6c\xbb\x78\x50\x36\xfd\x92\xe2\x57\x24\xe2\x03\xa8\xba\xdd\x22\x99\xaa\x6e\x91\xfa\x13\xe7\x90\x9e\x45\xc3\x43\x7c\x30\x3c\xb4\xc8\x6b\xa5\x77\x4f\x56\xfa\xc5\xcb\x3f\x0a\xfb\x58\xa3\x2f\x3e\x18\x1f\xb4\xcd\x10\x99\x18\x82\x78\x86\x0f\xcc\xb0\xf9\x6f\x4a\x67\x61\xbd\xc2\x4b\x84\xda\x3a\xa0\x83\x0b\x2e\x3b\x35\x4f\x8f\x0a\x8b\xd8\x32\xcf\x63\x2a\x52\xf7\xc1\x24\x91\x8f\xb6\x84\x8e\x56\xa1\x2b\xef\x28\xf9\x19\xa5\x8e\xcd\xfd\x1c\x72\x50\xf0\x5e\xf2\x68\x0d\xb6\x98\x94\xfd\xc4\xae\x4a\xdf\xd6\x42\x80\xb3\x34\xd0\xf2\xc7\x0c\x78\x3f\x69\xfe\xc7\x9e\x13\xc1\x18\x59\x32\x4c\xfb\x1e\xd2\x64\x79\x27\xd1\x21\xc8\x19\x6f\x2e\x6f\x1f\x59\x1a\x36\x47\xf6\x4c\x7c\x4a\x8a\x21\xf4\x4a\x7b\xed\x69\x48\x60\x69\xb4\x69\xc5\x10\x7b\xc7\x00\xdd\x29\x65\xaa\x5c\x64\x33\xd8\xd4\x5d\x9a\x4a\xe1\x6d\x32\xdb\x71\x90\x60\xd3\xa0\x50\xd9\x23\xf7\x9c\xa1\x18\xb8\x65\x77\x19\xd4\x0f\x7b\xc5\x28\x1c\x41\x37\x69\xd3\xf8\xa5\x63\x7c\xce\xa1\x68\xab\x23\xe2\xf1\xe1\x04\x3d\x92\xf7\xad\x06\x7d\x7d\xe0\x48\x6f\xb6\x91\x04\xbd\xfb\xc2\x5e\xf9\xf0\x44\xfa\x2a\xb4\x85\x92\x9b\x9c\xa5\x56\x52\x69\xe9\xba\xc4\x3b\xe3\x50\x02\x4b\xd7\x3c\x4a\x73\xe9\x4a\x0f\x2f\xed\x61\xf4\x0e\x28\xdb\x94\x88\x11\x80\xcd\x8a\x6c\x41\x23\x74\xe8\x19\x78\x2f\x7e\x26\xee\x5a\x29\x95\x96\xc0\x63\x7d\xe8\x2e\xca\x36\x27\x81\xc8\x6b\x3f\x22\xcc\x02\x40\x72\x6b\x50\x30\xe5\xed\x20\xc5\x91\xd5\x1b\xee\x5e\xbf\x1d\x48\x05\x76\x84\x78\x26\xf4\x8b\xd8\x2f\xa4\xfe\xfb\x47\x93\xca\xa6\x0f\xe4\x2a\xfb\x9f\x13\x4d\xbb\x63\x16\xce\x3b\x85\x2f\x82\x01\x9c\x0b\x3a\x20\x00\x6f\xde\xad\x3d\xc8\x9c\xf6\x7b\xf7\x48\xd2\x3d\xb4\xf3\x76\xd9\xda\xfb\x3d\x49\x3c\x8a\xfa\x30\x07\x09\xd5\x76\xeb\x2b\x39\x84\x42\xfa\x49\x7e\x0d\x83\x3e\x0a\xc0\xc2\x7d\xc6\xca\x34\x36\xd4\x3d\xef\xf8\x8c\x78\xa0\x07\x61\xd0\x2a\xdb\xdd\x03\x25\x19\x29\x10\xe5\x52\xdb\xe5\xc8\x14\xd8\x39\x22\x2b\x17\x68\x8b\x13\x21\xb3\x9a\x2a\x36\x58\x86\x39\x03\x78\x19\x52\x30\x1e\xfe\x7b\x0a\x95\x10\xb1\x12\x37\x82\x01\xaf\xaa\xd2\x40\x77\x4f\xe7\xa1\x0e\x0d\xb2\x74\xf2\x3b\xb9\x53\x8d\x1b\x04\xbd\x14\xa4\xa0\x5a\x4e\x24\x09\x9b\xba\x37\x21\xa9\x9d\xd3\x2b\x03\x08\x02\xf1\x1b\x80\x1d\x75\x85\xd0\x4e\x0d\x57\x03\x10\xcf\xbb\xc8\x55\xba\xbb\x0a\x82\x8e\x6a\x3f\x7e\xc2\x51\xcf\x6a\xd9\x98\x3d\xe4\x7f\xa1\x50\x85\x90\x17\xe9\x2a\x99\xf9\xf8\xf5\x56\xbc\x2f\x12\x28\x5a\xb2\xf4\xa4\xf2\xa5\x6a\x23\xf1\x65\x21\xb0\xc9\x32\xff\x99\x3e\x6a\xd2\x06\xff\xb9\x15\x02\x49\x29\xaa\xe0\x2c\x29\xa4\x6f\x77\x68\x0d\x78\x53\x35\xd4\x17\xef\x05\xf7\x72\x86\x07\x72\x2f\xdb\x9d\xb9\x8a\xb7\x97\x46\xa1\xb1\x17\xd9\xc5\x7b\x51\x06\xd1\x8e\xf5\xcb\x10\x8d\xda\xf8\x86\x68\x8d\x5a\x71\xa9\x94\xa0\x0d\xe4\xa7\x20\x4e\x45\xfc\xbc\x79\x30\x48\x5b\x64\xe9\xdb\x86\x6c\x5e\x43\x21\x2a\x55\x32\x52\x7f\x99\xc9\xbe\xa3\x13\x96\xb7\x01\xac\x9c\xad\x12\x08\x21\x3f\xe5\xfa\xdf\xa5\x1e\x04\x12\x80\xc8\xad\xdb\xcd\xcc\x77\x0f\x1a\x34\xaa\x96\xb2\x4b\xf8\x68\xf6\xd8\x60\x7f\xb6\x20\x53\x98\x78\xa8\x58\x42\x77\xcc\x21\xa5\x7f\x94\xaf\x43\x52\x63\x40\x2b\x17\xb4\x1c\xc3\x3f\xe6\xd8\xa7\x39\xbb\xe7\x60\x73\xe4\xda\x99\x56\x7a\x85\x56\xd4\xa1\x06\x91\x0f\xc9\x3b\xa3\x3f\xbd\x58\x86\xc2\x93\x9d\xaf\x48\xd3\x6a\x8b\xd0\x00\x83\xdb\xa7\xe7\x14\x68\xa7\xde\x01\xef\xd3\x70\x92\x03\x0c\x8e\xfb\xd6\x88\x6c\x44\x91\x52\xbc\x19\x59\xf4\x7d\xef\x31\x61\x31\x40\x49\x36\xe6\x8d\xec\x59\xca\x5b\x45\xf4\xe8\x7b\xd6\xd0\xb6\x5b\x87\xcf\x8a\x88\xa2\x6e\x87\xe4\x2e\x4f\x91\x8a\x8f\xe8\x7b\x52\x86\x96\x01\xda\x62\x7b\xb2\x4f\x86\x72\x4b\x2f\x49\xaf\x52\x84\x8a\x72\x4e\xaf\x06\xa4\xc9\x74\x6b\xdd\x10\xfa\x54\x14\x48\x4b\x97\xbc\x81\xbb\x33\x68\x27\x21\xed\x09\xc3\x17\xe9\x1b\x4d\x99\xea\xa4\xd5\x4d\x8d\x2a\xbf\x59\xa7\x41\x91\xd2\x94\x3d\x5a\x5e\xc1\xf5\xff\x1c\xed\x2d\x6a\x0c\x92\x53\xe4\xf4\xdb\xc5\x50\xef\xe2\x53\xda\x31\xdc\x87\x50\x08\x76\x91\xce\x68\x87\xf6\x2a\xcb\x45\xfa\x4f\x2e\x47\x35\x11\x24\xe5\x06\xed\x52\x6f\x4b\x8f\x8b\xdf\x91\x59\xe4\x58\xc5\xa2\x30\x58\x8a\xf6\x8d\x6c\x76\x96\xe8\x43\xde\x29\x36\xa4\xc8\x35\x51\x62\x2c\xe9\xd3\x4f\xda\x8c\xb7\x94\xfa\xc5\xe7\xaf\xd0\xb7\xd2\x2b\x45\x0a\x53\x88\x64\x71\xca\x5e\x15\x78\x5b\xbf\x85\xd3\x90\xfa\x4d\xbe\x5c\x53\xdf\xec\x85\xea\x2d\xaf\xbd\x4d\x1e\x96\x50\x6d\xa9\xb7\x47\x5d\xfb\xf1\x18\x59\x38\x64\x79\x2e\x5e\xf3\xf4\x56\xd1\x6b\x6c\x81\x97\x3a\x07\x14\xfb\x52\x75\x6e\x31\x8e\xb7\x66\x32\x1f\xfe\xb9\x40\x23\xcb\xdf\x55\x0d\xfe\x63\x9f\xb7\x67\x27\xfc\x74\x32\x10\x49\x67\x55\x3a\x0e\x99\x1e\xa1\x03\xf3\xe3\x66\xec\x82\x75\x73\x95\xd3\xc7\xba\x9f\xd2\xb3\xda\xf5\xd5\xd4\xad\x8e\xde\x90\xea\xc6\x60\x58\x33\x98\xe7\xea\xfe\xf4\xba\x9c\xdf\xfa\xf6\x6f\xdc\x20\x57\xd8\xaa\x22\x9e\xaa\xac\x8a\x2a\x27\xa1\xf5\xde\xff\xf8\x9b\x21\x96\x54\x0c\x8e\x49\x86\x97\x75\xe9\x74\x55\x9b\x15\xbe\xb1\x08\x19\xae\x27\x1c\xf9\xbd\x23\x8a\x6f\x31\x14\xbe\x62\xce\x1f\xeb\x02\x20\xba\xcc\x8a\x76\xaf\xc3\x46\xa6\x52\xf0\xc9\xf8\xf7\x05\x97\xf1\x93\xca\x00\x75\xa0\x6b\xbc\xf6\xcc\x77\xa9\x1d\xa2\x5a\xf5\x3d\xd5\xc4\x20\xb0\xed\x96\x8e\x9b\xe7\x19\xd3\x4c\x36\x58\xbf\x2c\x37\x9b\x95\x90\x4b\xd0\x36\xa8\xac\xb3\xc1\x1b\xce\x1e\x72\x73\xc2\x60\x4a\x6a\x41\x79\x2b\xd4\xb6\xcc\xc2\xf1\x40\x9d\xad\x6a\x2d\x6e\xa3\x90\x91\xd7\x1f\x22\x5c\x54\xce\xaa\xc7\x94\x68\x0c\x6e\x48\x5f\x4d\x02\xdc\xd1\x41\xd3\x13\xa8\x7c\x8b\x62\x3d\x37\x0c\x2a\x21\x83\x55\xf2\xcb\xbf\x10\x70\x13\x41\x92\x93\xd0\xbf\xa7\x0d\x7c\xcb\x4d\x6a\x4c\x5b\xa9\x68\x0b\x69\xa6\xfe\xc3\xfc\x6e\xda\x5a\x3d\x0d\x5d\x43\x6d\x1a\xb7\x65\x44\x0e\xf0\xc0\x17\x07\xbd\x4d\x0b\x5b\x10\xdc\x8a\xc6\x1c\xcc\xfa\x5b\x8b\xc5\x42\xce\xa7\x57\xdc\x86\xd9\xcb\x4b\x32\xe9\x62\xdc\x69\x40\x47\x96\xd0\xe8\x2a\x74\x8e\x6d\x61\x7d\x6f\x8c\xaa\x40\x82\x1e\xfb\x08\x43\x21\xad\xb4\x31\x20\xd8\x8a\x21\xce\x83\x5a\x73\x7c\x40\x7b\x70\x33\x66\x03\x8f\x94\x37\x4b\x43\x63\x0b\x80\xdd\x12\xe3\x9d\xb7\x14\x32\x5f\x20\x5c\x63\xf7\x89\x4c\x44\xbd\xc2\x44\x2f\xed\x96\x1a\xa9\xe3\x06\xc3\x96\xcb\x75\x1e\x5f\xe3\x5f\x05\x8c\xb0\xc2\x1f\x3c\xb9\xce\xb3\x29\xfd\x6f\x6b\x91\xf3\x5b\xea\xd0\xd9\xac\x9f\x23\x31\x77\x72\x85\x9a\x9b\xab\x5d\xbc\xd3\xb3\x5c\x6f\xfa\x1c\x20\xea\xf5\xf1\x12\xec\xed\x12\xcb\xb8\x19\xa9\x84\x52\xf2\x0e\x80\x14\xb9\x00\xa0\x40\xc6\xfd\x4b\xf0\x5c\x29\xe5\xef\xb2\x60\x3e\xf6\x1a\x1a\x29\xa5\x62\xc6\x30\xcf\xbf\xe1\x05\x08\x4a\x58\xe3\xde\x44\x60\x03\x39\x5b\x69\x88\xdc\x41\x35\x6b\x28\x49\x64\x0c\xcb\x25\x5b\xfe\xd7\xb0\x9c\x30\xd0\x0e\x9b\x75\x26\x68\x29\xe8\x80\xd0\xfa\xb9\x75\x1a\x30\x43\x52\xb6\xe8\x6e\x6b\x3c\xeb\x3d\xb0\xb7\x76\xc0\x3d\xc8\x11\x54\x2c\xb2\x6d\xcc\xa1\xf4\xf5\xe5\x27\xb2\x56\xad\x40\xac\xf5\x5e\xb8\x20\x8d\xee\x83\x2a\x2a\x35\x46\xb6\x55\x1e\x87\xd5\xdd\x04\x5e\x49\x52\x2c\xad\xf8\x26\xff\xa8\x8f\xcd\x44\xa1\xc5\x75\x14\x1d\x3b\x29\x59\x1e\x6d\x43\x6f\xa1\x1e\xd4\xc0\x01\x0b\x14\xff\x55\xcf\x10\x3a\xb3\x31\xb1\xea\xc2\xb0\xd6\x6a\xa0\x09\x71\x17\x1f\x6d\x51\x19\xc6\x85\xc6\x4a\x6d\x90\x00\x4e\x2d\x5e\x7a\xfb\xfb\x9b\x29\xe9\xff\x43\x88\x6e\xd5\x0d\xce\xe4\x38\x55\x08\x8b\xb9\x7c\x9c\x23\x8a\xd3\xb8\xa8\xd8\x9c\x6e\x9d\x1e\x89\xce\xab\x50\x0d\x55\x97\xaa\xd1\x61\xad\xcf\x78\xc6\xe5\x94\xfa\x4b\x05\x5d\xbc\xa4\xd5\xe6\x50\xee\xaa\x60\x6b\xe4\xf5\x42\x8d\x8d\x53\xa2\x35\xf2\x86\x1d\xa8\xec\x59\xfa\xec\x6d\x45\x62\x3a\xe5\xb5\xdc\xa1\x08\x29\x32\x32\xd4\x03\x49\x9f\xcb\xe9\xdb\x2e\x66\x64\xdb\xc7\x86\xb1\xf0\x22\x94\x3b\xc8\xe9\x3d\xb0\x02\x4b\x2d\x9c\x72\x84\xce\xe4\x5a\x2a\x15\xf8\x0d\x70\xc8\x35\x7b\xe2\xca\x02\x3c\x62\x83\xfd\x13\x0a\x64\x92\x46\x5b\x43\x23\xac\x49\x8b\xd5\x8f\x40\x69\x72\x63\xfc\xa0\x0d\x68\x40\x86\x72\x98\x8d\x24\x84\x60\xda\x97\xda\xd9\x33\x64\xc3\x16\x49\x99\xd9\xdd\xf4\x7c\x0a\x05\xd2\x56\xf2\xbe\xc4\x86\xc3\xd0\xf3\x2a\x03\x17\x8f\x3c\xbf\x5a\x02\x70\xee\x22\xd7\x4e\x49\x18\xe5\xaf\xc4\xbc\xde\x27\x0b\x89\x7c\xc1\xed\xeb\xf5\xc9\x4d\x39\xeb\x54\xb5\x6c\x7a\xa8\x81\x73\x85\x9a\x2a\x9b\xb7\x7d\x98\x7a\xa5\x88\x16\x39\x24\x46\xe6\xaa\xae\x14\xcc\x70\xcc\x45\x9c\xb5\x31\xbd\x80\x3b\x85\x24\x7d\xab\x13\x93\xeb\x04\xc8\xe7\xae\x84\x24\xb2\x43\x3e\x0c\x4d\x68\x20\x3e\x62\x74\x5f\xda\x53\xaf\x38\x8a\xbf\xda\x26\xdd\x1c\x18\xf4\x24\x3e\x16\x9c\x08\xae\x3a\xa6\x6a\xe0\x41\xf3\xbd\x21\x55\x82\x02\x58\x88\x28\x1e\x42\xea\x0c\x3c\xfe\xca\x1d\x5d\x73\x5b\x98\x58\xf3\x7c\xa9\xc1\x60\x89\x28\x54\xc7\x42\xfe\xc7\x06\xc7\x22\xf9\x20\x84\xde\x38\xe8\x2f\x26\x86\x3b\xf0\x72\x6f\x51\x99\x6b\xef\xe4\x23\x44\x39\x94\x89\x5c\x11\xec\x2d\xa5\xaf\x25\x4b\x58\x2b\xa4\xbf\x96\xf4\x0a\xe9\xaf\xa7\x7d\xe5\x4d\x25\x6c\xd3\xeb\xec\x9f\xb1\x2b\xc7\x45\x9e\x7a\xe3\x7d\x59\xde\x36\x2a\x49\xd2\xac\x80\x42\xd9\xd1\x74\xd0\xf0\x81\x2c\xd8\xad\x4f\xbf\x87\xef\xa0\xb4\x8d\x26\xd4\x35\xfa\x92\x34\xef\xcc\x1e\x1d\xe3\xf3\xd6\x7e\x50\x3a\x85\xab\x7e\xfd\x50\xa7\x5b\xef\xb9\x38\xe6\x60\x69\xaa\x61\x55\x9a\xb8\x84\x29\x8e\xa0\x6b\xce\x35\xc3\x42\x49\x0c\x43\x45\x08\x8c\xb9\xe9\x17\xd8\x5a\x61\x53\x10\x13\xfb\x16\x25\xc6\xd8\x40\x00\xd5\xeb\xf5\xbd\x8b\x83\xeb\xd2\x18\x80\x75\x15\xad\xa5\x01\x51\xfc\xaf\x47\x34\x4c\x08\xa5\xa1\xe3\x0a\xf4\xd3\x28\x43\x36\x5c\x08\xa4\x21\x84\x83\x07\x4b\x7b\xd8\x4a\x6d\xde\x8d\x25\xd2\x36\x0a\x19\x74\x21\x66\x16\x12\x53\x1f\x89\x17\xa6\x7f\x91\xc6\xb6\xa6\x7b\x09\x31\x31\x9b\x19\x95\xd4\x94\xcc\x42\xa8\x2c\x6e\xd8\xec\xb4\x10\x0a\x83\x9c\x59\xfb\x3f\xf5\xfe\x92\xbc\x29\x50\x36\xe3\x6c\x7a\x45\xf2\xa4\x14\xb7\x6c\x38\xe3\x39\xce\x10\x0f\xc3\xc2\xa4\xbb\x06\xa1\x61\x56\x34\x2c\x3b\x97\x83\x1e\x2a\x74\x52\x34\xd5\x06\xd6\xd4\x10\xba\x65\xf7\xa0\xbb\x39\x14\x0b\xb0\x46\x42\x27\x72\x05\x42\x0f\x4d\x12\x6a\x47\x0e\xdd\xb2\xdc\xc4\xcc\x3c\xb9\x48\x34\x37\x2e\x68\xc6\x77\x07\x4e\xfe\x68\x80\x69\xfb\xde\xf9\x4a\x82\x09\x19\xd8\xda\x40\x44\xa0\x1a\x4c\xda\xa2\x6f\x49\x1b\x1c\x73\xbc\xd0\x56\x43\xec\x2c\xe4\xcc\x7e\xe2\xa1\x69\x7b\xa0\xa9\xb0\x8a\xdb\xa4\x47\xb8\x85\xf2\xd7\xf6\x1b\xde\x52\x48\x19\x82\x13\x52\xf7\x1b\x7e\xfb\x35\xad\x0c\x57\x59\x11\xef\xce\xbb\x58\xe2\x51\x35\x0d\xb0\xa8\xb1\x9a\x50\xfa\x29\xf2\x00\x4b\xbb\xd2\xd0\xa4\x9e\x1d\x3a\xd0\xf3\xaf\xa6\x5e\x69\xbe\xb4\xa7\x34\x6e\x10\x86\xb0\x67\xc6\x4d\xad\xe9\xf1\xe7\xb6\x1e\xd4\xeb\x4b\x0f\x78\x27\x79\x68\x39\xd5\x6c\x8a\x88\x0b\x5d\x32\xad\x34\xf9\xb4\x29\x94\xd7\xe6\x25\x04\xeb\x38\xd8\xa6\x09\x6b\x67\xdc\x33\xed\x66\x12\xf2\x79\x4c\x5b\x68\x9f\x4d\x21\xa8\x36\x65\x1b\x4c\x79\xfb\xbf\xbc\x30\x60\x44\x29\xf3\xd8\x88\xdf\x5a\xa1\x94\xa3\x87\x37\x0c\xea\x5b\x10\x24\x24\xe6\x21\x9b\xa0\x6d\x3f\xea\x01\xdb\x5a\x83\xc2\x0e\xab\x2e\x71\x2b\xfd\x73\x0b\xa9\x46\xc5\x87\x58\x69\x56\x87\xa7\x6e\x01\xe6\x87\xd6\xc1\xb0\x91\xd8\x34\x30\xd6\xe8\x53\xeb\x67\x91\x26\x1a\x9c\xee\x22\x71\xc0\x9e\x94\x50\xc4\x3d\xe4\xca\x54\x51\xeb\x20\x3a\x1e\xd2\x75\x1a\xce\x68\x8e\x9b\x3d\xc2\xed\xe5\xd3\x4b\x8d\xed\x22\x71\x34\x58\x3a\xc5\xc5\xb7\xc8\xfe\xb6\x12\xfc\x25\x8e\x38\xb9\x59\xee\xe0\xfe\xc4\x6a\x6b\xf8\xc3\xa1\xe8\x76\x7a\xc9\x06\xb1\xdc\x90\xd8\xa2\xf4\xd1\xed\x02\xe4\x22\xf3\x5a\xcc\xd8\x4d\x92\x6b\x1b\xf8\xcb\x7e\x0e\xc7\xd9\x72\x77\xce\xeb\xb7\xd4\x2f\x5b\x32\x74\x18\xa5\x9b\x04\xe2\xa6\xe8\x77\x20\xd7\x36\x1f\xb9\xc1\xa4\xbd\x0a\x4d\x5d\xea\x19\x0a\x6b\x48\x7e\x95\x30\x95\x99\xc3\xd2\x66\xc3\x7a\x32\xe5\xc2\x2a\xd3\xc1\x16\xb0\x22\xd1\xc6\x5e\x14\x3e\x65\xe5\x49\x49\xa6\x5a\xd9\xc4\xa0\xef\x76\x5e\x8c\x3f\x02\xae\x5d\x3c\x19\x08\xbf\xc5\x92\xe1\x52\xb9\x64\x8b\xf2\xdc\x54\xc5\x96\x00\x63\xb0\xcd\x1f\x97\x6a\x13\xb7\x8e\xd5\xc8\xaa\x06\x42\xfc\x16\x47\x83\xc4\xbf\x17\xae\xbe\xb1\x26\xfd\x93\xb6\x2c\xce\xe0\x95\x05\x47\x11\xab\x6d\xb6\x24\x47\x11\xa0\xb8\x5a\x89\xe7\x80\xd8\x74\x96\x9b\x76\xfc\xe6\xd3\x70\x45\x85\xbe\x5b\x5e\xb9\x6e\xe2\x98\x1a\x52\x91\xdc\xb5\x94\x10\xeb\x2b\xf9\x06\xd9\x6c\x26\x3e\xdb\x69\xb2\x2c\x2b\xf8\x42\xf8\xf6\x4a\x08\x0c\xc2\x80\x59\x4a\x48\xa8\x7d\x38\x7f\x37\x10\x22\x6a\x6f\x7f\x4e\xf9\xee\x54\x3d\x4c\xa9\xa9\xf7\x95\xcf\x2d\xe4\xd3\x90\xb1\x59\xc8\xf9\x66\xf7\x4f\x19\x2c\xa4\x27\x53\x4d\x0b\xa4\x79\x89\x80\xdd\xc4\x02\xb2\x11\xfe\x6b\xa3\x99\xb7\xe4\x95\xba\x52\x0b\x98\x5a\x37\x01\x16\x12\x21\xcb\x25\x58\x1a\x16\x04\x6a\x44\x75\x4a\x13\x48\x2b\x9d\x6e\x32\xcf\xab\xd6\x08\x97\x1c\xba\x38\xe0\x14\x1d\x78\x01\x2c\x46\x89\xea\xc2\x36\x34\x59\x01\xbb\xb6\x62\xaf\x16\x1c\x70\x85\x12\xd8\x2b\x49\xb9\xeb\x0e\x9d\x39\x9b\xc3\xfb\xf2\x13\x18\x92\xdd\xd1\x0c\x25\x34\xe9\x72\x9d\x73\xfc\xee\x14\xb5\x24\x84\xcf\xb0\xe4\xe3\x35\xc3\x98\xa8\x16\x83\x01\x8f\xa9\x60\x4b\x62\x38\x8d\x95\x76\x6e\x5d\x6d\x57\x1c\x2b\x44\xd0\xa8\x3b\xb6\x9d\x4a\xba\x70\xb9\x33\x55\x65\xab\xd2\x5e\x8b\x2c\x7d\xe4\xd1\xe8\x03\x45\x66\x8c\x7a\x72\x60\x59\xa7\x80\x11\x2b\xe4\x58\x13\x9a\x45\xc4\xa5\x74\x09\xe9\x49\x7a\xaa\x35\x09\x36\x21\x98\x16\xa5\xb4\xdd\xd6\x90\xa1\xd3\xcc\xd0\xd7\x24\x04\x10\x8d\xc0\x4b\x78\x1e\x81\xb4\xca\xca\xd9\x04\xd6\xf4\xe4\x26\x29\xf9\xa5\xe9\x77\xd1\x20\x75\x5d\xbc\xfb\xf7\xb7\x97\xfa\x7a\x4a\xc1\x0d\xfc\x56\xbb\xa6\xcf\x2e\x75\xb6\x09\x70\x5c\x86\xc0\x59\xf2\xd2\x7b\x52\x2b\x3c\xe8\xfd\x79\x1f\x1f\x37\x5a\x9e\x3f\x5b\xca\xa0\x96\xd4\x9f\xf7\x6e\x63\xa4\x83\x45\x12\x5f\xf7\xc2\xf5\x2a\x07\x5e\xce\x2a\x78\x99\x50\x46\x23\x43\x1e\xc4\xc5\x24\x2d\x56\x9b\xf8\xd0\x51\xd7\xd8\xc7\x78\x8d\xe7\x21\x22\x30\x03\x48\x56\x12\xdc\x38\x5f\x75\x09\x31\x9e\x2c\x5d\x75\x64\xb5\x0f\x4a\xb5\x5b\xd9\x06\xee\x67\xc4\x63\x3f\xeb\x57\xe2\x63\x55\xda\x39\xcf\xca\xe5\x02\x17\x10\xcb\xa1\xc0\x75\x99\x71\xc6\x06\xfa\xac\xe2\x09\x86\x44\x98\x46\x7f\x68\x84\x29\x19\xf7\x59\x19\x6e\x63\x65\x27\x41\x2e\xc4\xd2\xf3\xa8\x06\x28\x62\x54\xb7\x0f\x37\x37\x69\x54\x3f\xab\xbb\x24\xad\xf0\x07\x09\x46\x55\x9e\x62\xe1\x82\x0b\xc0\xf3\x27\x51\xe6\x21\x54\xcf\x3a\xa9\x0e\xf9\x54\x3c\x87\x41\x91\x55\x43\x1f\x8c\xea\x45\xb5\x97\x14\x5a\x3f\xcf\x91\xd9\xfc\xac\x5d\x1c\xd6\xd1\xe5\xf4\x04\x91\x8a\x3c\xa9\x4f\x38\xed\xfc\x01\x6e\xc9\x5e\x2d\xe9\xd9\x9e\xf2\x7a\x3d\x97\x5b\x1c\x4c\x50\xd5\xd6\x65\x97\xf6\x1a\x96\x62\xf3\x53\xc9\x84\xf9\x37\xa8\x54\xc2\xe7\xa2\xb8\x37\x03\xeb\x53\xa0\x6c\xa1\xdf\xc4\x0e\x8a\x22\x51\xa1\x10\x49\x3c\x8e\x71\x8d\xdc\xb7\x73\x25\x29\x84\x9d\x3e\x91\x7f\x82\x2f\x56\x3a\x5f\xa0\x90\xd0\x3a\xda\xb3\xc0\x99\xae\xba\x16\xc6\xdb\xa3\xd4\xf9\x0c\xf1\x6c\x70\x41\xc4\x51\x5b\x24\x57\x19\xdc\x6e\xbd\x63\x48\xba\x7c\x02\x48\x56\xaf\x80\x38\x8c\x3b\x97\x2b\x4a\x5e\x01\x09\xd0\x1f\x5d\xc3\x06\x19\x72\xfd\x02\x26\x1e\x47\x1a\x95\x27\x08\x64\x79\xaa\x1c\x72\x6b\xa5\xe9\xc6\xcd\x69\xf1\x1e\xe0\x99\xad\x71\x7a\x79\x86\x06\x5e\x16\x9f\xdf\x33\x1c\x02\xcf\xc6\x7c\x88\x75\x0a\xc5\xe1\x3c\x3d\x11\x96\x0d\x32\x4b\x48\x0d\x41\xe3\xd2\x2b\xab\xeb\x6d\xdd\x17\xe3\xbe\x9e\x11\x55\xf1\xcc\x5b\xd3\xc8\x7e\x86\x0e\x35\xd8\xbd\xbe\xc8\x47\x66\xd3\xb3\xa1\x46\xcf\x0f\xf9\x0f\x27\x41\x3e\x9a\xfe\xd8\xc2\x49\xcd\x13\x53\xf7\x38\x90\x6a\x7a\x08\xd3\xa0\xde\x57\x2e\x6c\x09\x79\xe2\x6f\x74\x58\xe2\x9c\xea\x99\x3e\x71\x3b\x89\x92\x37\x4f\x9b\x87\x4b\x5e\xea\x69\xf3\xa7\xae\x36\x29\xb2\x0b\x8c\x3e\x52\xc8\xf3\xc5\x30\x82\xfd\xa0\xc1\xf9\x84\x2b\x58\x82\x6e\xc8\xca\x1c\xe3\x87\xea\x2d\x9f\x29\xd4\xd4\xa4\x22\xf9\x6c\xac\x87\x4f\x10\xd9\x35\x8d\xb0\x7d\x9f\x19\x76\xf7\xc4\x04\xc6\x5f\x88\x4d\x37\x98\xf1\xfe\x24\x9d\x1c\x51\x6a\xea\x66\xcb\xcd\xd3\x70\xf9\xd7\xca\xdd\x3e\x60\xbe\x0f\x9b\x0b\x82\x08\x2c\x7e\xe4\x81\xc7\xcf\x54\xfc\xeb\x4a\xb1\xe2\xfb\x4c\xad\xb9\x2b\xb5\x1c\x09\x1e\xd5\x4b\xce\xf2\x51\x52\xa5\x8b\x2a\x63\xde\x2a\x0c\xfb\xe4\xe7\x71\x33\x2a\xf8\x71\xcb\x8c\x7e\x20\x7c\x4c\xe7\x99\x78\x1a\x2d\xfa\x3e\xaa\x56\xf8\x1f\x15\xb6\x2d\xd5\x12\x1f\x35\x7a\xbb\x87\x75\x52\x6e\xd7\x3c\xaa\x77\x28\x8f\x3a\x6f\xbe\x58\x48\x81\x32\xfe\x67\xa8\x85\xc7\x3a\xe9\xb6\x23\x7e\xcd\x8f\xb2\x35\x51\xf7\x07\x3a\x4d\xd6\xae\x44\x86\xe4\xc3\x99\xa4\x2e\x22\x2d\xc5\x3f\x82\x53\xd8\x41\xfe\x8f\x6a\x66\xc1\xeb\xfd\x80\x7f\x88\x15\x32\x03\xc4\xf5\x01\x48\xde\xf9\x48\x5f\x5f\xce\x7b\x24\x90\xe5\x39\x90\xd5\x61\xf3\xcb\x2f\x26\x00\x54\x30\xb3\x47\xcf\x75\x9f\x87\xdd\x2d\x43\x51\x1e\xe9\xe9\x6a\x8e\x8f\x04\x0d\x4b\x52\x78\x3c\x6c\xd8\xec\x28\x1f\xfa\xe0\xdc\xb6\x7c\x13\xcc\x32\x4a\x95\xbd\x13\xa5\xff\x6d\x2c\x62\xd0\x45\xb9\x90\xe4\x01\x70\x1e\x29\x8b\x4b\xa1\x9c\x92\x1f\x43\x44\x21\xbd\x03\x98\x1a\xa1\x22\x25\xfc\x4f\x2e\x88\xa6\x10\x0e\xe4\x22\x4e\x12\x37\x9b\xf2\x24\xb6\x4d\xcf\xbb\x3c\x79\x72\xd4\xdd\xbf\xb5\x02\x07\x31\xe5\xd7\x7a\x9b\xcf\xd3\xe5\x36\x7f\xf8\x30\xad\xa4\xa2\x90\x98\x04\xe7\x9b\x2e\x3a\x94\x14\xef\xb9\x2f\x2e\x7d\x40\xf2\x8c\x2a\x54\xf7\x21\xb1\x9f\x3b\xb8\x21\xe6\x9b\x44\x31\xf3\x2d\x6d\xcb\xf9\xde\xb8\x8c\x07\x90\x75\xb4\xa4\x9c\xee\x26\x98\x36\x5f\xc9\xee\xf1\xe0\xf5\xa4\x00\x75\x8f\xd2\x40\x0b\x49\xa8\xc3\x1e\xae\x7f\x2a\xb3\xd4\x84\xaa\x84\x7c\xe6\xfa\x3a\xf3\x4e\xbf\xae\xa7\xf2\xbb\x53\x79\x46\xc4\x5b\x88\x93\x61\x49\xd6\x01\x33\x24\xa0\x8c\x26\x55\x35\x43\x4d\x4e\x0c\xba\xbb\x3e\xfd\xf2\xd0\xff\x4d\x80\x05\x0f\x56\x06\xf2\x5c\xa3\x0a\x75\x2f\xfc\x81\x84\xc7\xea\xa4\x77\x34\x8b\x52\x76\x46\xca\xac\xce\xbf\x66\xf5\x53\x73\x5d\xa4\xcf\x54\x97\x6b\x3a\xf2\x3b\x0b\xeb\x1e\x9a\x2c\xbb\x43\xd2\x02\x18\xfc\xfd\xc8\xa9\x09\xe6\xac\x73\x2d\xce\x0a\xf8\xd4\x46\x92\xbc\x9b\x87\x68\xa8\x5a\x0a\x49\x9a\xe1\xab\x8f\xfa\x8d\x4a\x32\x98\x6d\xd2\x15\x12\x6a\xba\xab\x34\x85\x36\x5b\x39\x68\xca\x20\xe1\x01\xeb\x89\x4d\x8b\x0a\xf3\xa6\x8d\x20\xb4\xa8\x1c\xc5\x7f\xcd\xd8\xf6\x5a\x43\x63\x73\xb4\xae\x91\x58\x8a\x62\x45\x66\x9f\x07\x95\x48\xe5\x2c\x78\x32\x1c\x51\xf8\x0f\xe4\xac\x4d\xec\xab\x4c\xe1\x35\x30\xa8\xe1\x17\x32\xc4\x88\x6b\xe7\x11\x99\xec\x50\x60\xa0\x90\x48\x1b\x5c\xe1\xd2\x1f\x3b\xbe\xf1\x9a\x0d\xea\xf8\x03\x19\x18\x92\xcc\xc2\x86\x6c\x08\xa9\xa1\x55\x42\x90\xac\x4c\x65\x89\xcd\x76\x3e\x29\x3a\x00\x0d\x02\x9d\x74\xc7\x0e\x26\x33\x02\xf0\x5d\xe4\x9d\x47\xb8\x90\xda\x42\x88\xae\x58\xa2\x7d\x59\x1c\x85\x0e\x7e\xb2\x58\x1e\xd4\x23\xd3\x04\x1b\x2a\x87\x43\x35\xde\x86\x26\x91\x32\xe7\x95\xa4\x84\x00\x2a\x9d\x83\x38\xd4\xd6\xd4\xda\x91\x63\xc2\x7f\x2f\xab\xe4\xdb\x96\xb5\x49\x5d\xcf\x39\xde\x46\x0e\x09\xb5\x65\xa4\x77\x01\xb1\xee\xba\x80\xcd\x26\x0e\xa2\xf2\x0d\xf9\xb5\x98\x5f\x23\x33\xf2\xa3\x32\xfc\x0d\x4e\xe9\xd5\xe4\xde\x1c\x13\xfd\xb9\xd3\x50\x7d\xcb\x8c\x92\x37\xc0\x6a\x64\xd9\x72\x73\xfe\x31\x3b\x38\x8e\x7c\xdb\x39\xa7\x97\xaa\x9a\x86\x10\x0c\x43\x78\x4d\xa4\x05\xdb\x96\x22\x6a\x0c\xa5\x27\xe3\x37\xe6\xf4\x7e\x9e\xa1\x1f\xf6\x72\xf9\xd5\x50\x79\xbb\x58\xe8\xc1\xa5\x9b\x5d\x55\xba\x3b\x7d\xc4\x49\x4b\x55\x0e\xda\x2d\x9a\x29\x11\x9a\x89\x66\x7e\xbb\x6b\xc2\x25\xe0\x82\x2b\x03\x29\x3a\x25\xd0\x1e\x00\x61\xad\xa1\xf2\xb6\x96\xa6\xdd\xa6\xfc\x29\xa7\x3a\x8a\x7d\x85\x9d\x63\x3a\xa8\x6b\xe3\x60\x15\xc0\xbf\x59\xfb\xed\x1b\xda\x6d\x2f\xdd\x9c\x3a\x21\x97\x7a\xcb\x42\x7f\x84\xd7\x36\xb5\xaa\xa4\x9c\xf3\x39\xb5\xdc\x0f\x83\x23\x0b\xad\x20\x52\xb2\x6d\x09\x75\x36\x11\x0f\x1a\x3a\x93\x74\xec\x16\x56\x6d\x59\x22\xf3\x73\x6e\x72\x47\x33\x99\x71\xad\x50\xf2\x83\xa1\xc4\x43\x1e\x74\x44\xcf\x88\x00\xfd\xbd\x35\xdd\xd1\xcc\x9b\x9c\xa2\xc2\x13\x97\x05\xe6\x24\x9d\xc6\x34\xe8\x8e\x87\x21\x5e\xa1\x07\x5e\xf3\x9a\x29\x04\xee\x9c\x00\x6e\xba\xbf\x5f\x79\xec\x0c\x7e\xbc\xb8\xfe\x48\xb8\x85\xb7\xc8\x50\x9b\x39\x41\x0e\x8e\xcb\x9a\xd3\x7d\x70\xf8\x71\x01\xb8\xc3\x81\x75\x1e\xb2\x7e\xa7\xbb\x89\x8e\xdd\xb4\x07\xa7\xbb\x2c\x2b\x1d\x11\x80\x85\xeb\x4f\x06\xf5\x5b\xf6\x76\x28\x25\xc6\x75\x87\xe7\xcd\x90\xe6\x58\xa0\x23\x2b\x49\xe2\x6a\x77\xa8\x8e\x21\xda\x9e\x86\xa1\xc1\x53\xfd\x39\xe0\xcc\xd2\x67\x8c\x13\x32\x95\x55\xc6\x7d\x1d\x35\x6b\x58\x9e\x0e\xb2\x93\x4e\x1e\x56\x3e\x8e\xc2\x3f\x15\x0d\x97\x8a\xd3\x5e\xe6\x15\x18\x50\xda\xed\xe4\x5c\x0e\x3c\x2a\x6f\xbf\x5f\x64\x7a\x19\x26\xb0\x39\xc8\xfa\x07\x8e\xff\x4e\xbc\x8d\xfc\x47\xb3\x13\x72\x06\xdc\x1b\x9f\x95\x6b\xc8\xf1\x22\xd2\xbd\x83\x82\xf7\x87\x60\xd0\xfa\xc1\x54\xf9\xcd\x4f\x88\xbf\xca\x2b\x19\x4b\x6c\x83\x8b\xae\x93\x8d\x58\xfe\x83\x1a\x22\xc7\x56\x1d\xbe\x24\x33\x52\xf4\xea\x6a\x15\xf5\x01\x5c\x53\xef\x24\xa9\x35\x68\x9c\xb2\x9a\x36\xdf\xae\x2c\x25\x1e\x86\x65\xf8\x85\x44\x12\x53\x5d\x5b\x6c\xa6\xe1\x8e\xcf\xbb\x2e\x75\xd3\xa1\x91\xe3\x0c\xa9\xb9\xeb\x48\xbb\x60\x70\x2b\x4f\x35\x2a\xba\xb8\x0d\x39\x55\xdd\xd5\xa4\x5f\xb9\xba\xb2\x23\x4a\x61\xe8\x57\xc3\x53\x77\x3d\x84\x62\xda\x22\xfd\xb0\x85\xa9\xa8\x13\x1c\x5a\x3c\xd8\x65\xeb\x3e\x42\xda\x57\x5e\x45\x92\x7a\xc5\x8c\xab\xa3\x48\x7c\xee\x64\x80\x30\x54\xe8\x9a\x18\xc1\x54\xb6\xca\x37\x53\x36\x29\xcd\xf9\x2a\xdc\xde\xde\x5c\x41\x52\x0f\x1b\xbc\x73\x57\x10\xc4\x3f\x27\x6a\x1c\x4f\x25\x77\x71\xf1\xae\x93\xd8\x5a\x31\x33\xd9\x9d\x16\x8e\x16\x86\xdc\x01\xf7\x7f\xe0\xdc\xb4\xec\x78\x87\x1c\x4b\x25\x75\xa7\x0d\xc0\x31\x02\x89\xb0\xee\xe9\x15\xb5\xb9\x6d\x91\x28\xdd\xa1\x66\x82\x0e\x9e\x2a\x8e\x59\x91\x30\x06\x32\x33\x8c\x26\x2c\x5e\xbb\xca\x9b\x02\x0c\xac\xec\xdb\x32\x08\x04\xed\x24\x9a\xd7\x5c\xd7\x54\xb3\xe3\xb5\xe8\x89\x9b\x72\x34\xa0\xf4\x66\x3c\xa6\xeb\xd6\xf1\x0e\xb0\x02\x97\x08\x0e\xad\x17\x39\x04\xb9\xf2\xc5\x8d\x3a\x52\x13\xc0\x60\xf9\x09\x3e\xa6\x83\x52\x5e\xc4\x79\xf9\x89\xd1\x29\x92\x17\xc2\x73\xa3\xda\x4e\xa2\x5f\xdb\x5a\x90\x1c\x3b\x40\x73\xa0\xc9\x89\x05\xbd\xc7\x80\x58\x06\xfb\x96\x14\x59\xa6\x93\x96\x52\x51\xaa\xf6\xcb\x12\x72\x77\x8b\x19\x6d\x3a\x9c\xd7\x44\xcb\x22\x2a\x13\xeb\x36\x90\x91\x64\x4a\x1d\x0d\x20\x68\xce\xb9\xd8\xd6\x87\x03\x03\xc4\xe6\x28\x48\x76\x73\x32\x07\x6d\x39\xe5\x5a\x18\x94\x8c\xd8\xfd\xbc\x15\x71\x38\xde\x8f\xa2\x81\x7a\x04\x0f\x44\xfe\x8f\xea\x72\xcc\xc6\x1d\xc9\x7e\x38\x1e\x1f\xfd\x10\x04\x0e\x5e\x5a\xb7\xf8\xd3\x75\x3b\x82\x50\x06\xa8\xd7\x64\x89\x4a\x74\xb1\x5b\xe6\xde\x88\x0c\x1b\x3f\xb3\x67\x76\x4a\xe9\xec\x28\x21\xd4\x76\x20\x92\xba\x19\x6b\xbe\x19\xf2\x70\xae\x6e\xc3\x7b\x3c\x42\x9a\xee\x94\xd0\x5d\x0b\x80\x18\xb5\x78\x6a\x25\xfd\x87\xd0\xb1\xd3\xf2\x82\x4b\xda\xc5\x51\x22\x2d\x01\xf2\x07\xea\x80\x39\xc3\x06\x21\x30\x24\x64\x66\xdf\x33\x6a\x93\xb5\x3c\x31\x1e\x4d\x31\xed\x48\x1f\x29\xad\x1d\xa1\x99\x38\x92\xfc\xbb\xfc\x27\xa1\x3c\xed\xdb\x42\x95\x0f\xab\x18\x67\xaf\xe7\xa9\xd5\x35\x03\x53\x3c\x0c\xce\x2e\xc6\xfa\xcf\x7f\x58\xdf\x8b\xa8\x66\xc7\x96\xaa\x89\xc0\x18\x1f\xa8\x0c\x6c\xe9\x92\x3a\x5f\x70\x45\x8d\x5a\x4c\x1a\xa5\x53\x3a\xd6\xe9\x62\xc1\x05\xd7\x11\xc1\x44\x97\xfe\x13\x53\xe1\x71\xf9\x4c\x94\x9e\x19\xed\xc1\xb1\x2c\x72\x82\x8c\xec\x72\xc6\x85\x2e\x15\x94\xda\x9f\x60\xd1\xf1\xe7\xde\xba\xc7\x07\xed\xfe\xb1\x20\x04\x84\x29\xfe\x23\xd4\x22\x78\x7c\xf9\x2d\x8c\x8d\xee\xfe\x53\xf3\x28\xb2\xa5\x46\x84\xee\x27\x21\x1a\x1f\x63\x59\x98\x68\x04\x2d\xbd\x5e\xc1\x8f\x86\xf9\xd2\xe0\xf9\xba\x04\x24\xd4\x07\xbf\xcc\x46\xc4\x4f\x12\xfd\x47\x13\xd2\x43\x22\x1e\x1b\x08\x30\x73\x99\x46\xda\x04\x23\x9c\x87\x0c\xb7\x31\xf8\xd4\x2e\xef\xcf\x38\x3f\x1c\x95\x6a\x3a\x4a\x1f\x09\x25\x8b\xad\x84\x54\x63\xe6\x4a\xc3\x98\x49\x1f\x69\x3d\xa6\x0b\x02\x8d\xe1\x3a\xc4\xbc\x48\xf9\x99\x23\xe6\x77\xb3\xc8\x5a\x6d\xe3\x51\x79\xc9\xe2\x5c\xde\x0e\xe7\xa6\x0a\x48\xb1\xbc\x9c\xa3\xd9\x59\x63\x4d\x21\xe6\xa7\x00\x00\x43\xfa\xcc\x73\x38\xf7\x46\x31\x36\x8c\x29\xbe\x5f\x18\xe8\xfe\x1f\xd7\x08\xfa\x47\x74\x46\x6b\x4d\x5c\xc2\xb0\xb2\xd7\x36\xe7\x90\x23\x1a\xb4\x57\xc9\xfa\xb3\x5b\x3a\x4e\xc0\xf4\x08\x19\x4a\xfa\xc1\xd6\x4e\xb5\x91\xff\xde\x00\x9f\x77\xf2\xa4\x00\x1e\x2e\xa7\xd7\x88\x05\xff\x37\x41\x28\x0a\x3a\xe9\x5d\xe2\xcc\x7f\x4c\x0f\x95\x73\x48\x21\xa6\x4e\xbf\x6c\xb4\x25\xf9\x83\x30\x36\x89\xca\x7d\x34\x63\xce\xff\xe4\x23\xc9\xff\xfc\xf8\xfc\xd2\x88\xe5\xa1\xb5\xec\x89\xb3\x73\xb1\x01\x80\xd6\xcb\xdb\x55\xd6\xfd\xe6\xab\x2f\xa4\xf8\xcd\xd1\x76\xf3\xa9\x46\x94\x7f\x76\x9b\x0d\xd1\x0b\x8d\x4e\x0c\xd6\xdb\x09\x03\x99\x1b\x88\x1b\xf0\x06\x90\x91\xb3\xde\x71\x90\xc9\x9e\xa7\xee\x9f\xe0\xdf\xac\x8b\xe6\x62\x73\xa9\x58\xfe\x77\x09\xf2\x11\x98\xa9\xf2\x23\x1a\x14\x9d\x64\x10\x21\x3a\x63\x76\x48\x10\x36\x73\x3e\x07\x6b\x5a\xe6\x93\xcf\x72\x1e\x90\x9b\x95\x40\x24\x1f\x40\x4d\x90\xcf\x3a\xee\x8d\x61\x1b\x79\xe3\xe2\x84\xf2\x76\xf2\xf2\xf5\x79\x2c\xf8\x02\x19\x2c\x18\xad\x19\xf6\x00\x14\x12\x7d\x42\x8b\x8c\x14\xee\x1c\xe3\x8b\x01\xd1\x8d\xce\xbe\x64\xe5\xda\x01\xf1\x7f\x58\x62\xe6\xd9\x44\x87\x01\x32\xc7\x3d\xb9\x58\x56\xa6\x16\x8a\x75\xd8\x48\xa8\xf7\x33\x94\x48\xf2\x64\x2e\x7b\x0e\x84\x72\xa6\x46\x73\x9e\x6e\xf2\x82\xf9\xda\xa8\x9f\x72\xa8\xb7\x74\x1d\x07\x33\x2b\x98\xdd\x12\x71\x67\x59\xf9\xa0\xb9\xfb\x49\x0d\xbe\xc2\x49\x61\x9f\x0e\x2d\x1a\x10\xb6\x4b\xa7\x50\x69\x10\x59\x13\xa2\xe1\x7b\x73\xf0\x1d\x3e\xb4\x95\x87\x4f\xd4\x71\x78\x73\xde\x3e\x40\x88\xea\x4d\xc0\xb8\xe3\xe1\x3e\xdd\xd8\xb3\x32\x04\xf5\xee\xb3\x09\x15\x7e\xa8\x1b\x77\x1f\xf7\xae\xff\x1d\x97\xb8\x08\x05\xf5\x7f\xbe\xe2\xe1\x66\x5c\x34\x4a\x29\xc3\x0f\xb7\xa6\x97\x03\x79\x0a\x20\x63\xe8\x75\xbc\xf9\x89\xa1\x5c\x54\x25\x05\x58\x1a\x28\x8b\xaf\x11\xba\xd6\x21\xaf\x10\x92\x87\xf4\xdf\x0f\xf7\x4f\xf8\x76\x40\x34\x53\xe1\xde\xfe\x19\xd2\x7e\x58\xf1\x25\x27\xdf\x70\x77\x71\xcf\x64\x5f\x41\x29\x31\xc2\xdb\xed\x9b\xe1\xb8\x29\x9c\x06\x9d\x10\x3d\x84\x23\x9c\x5c\x03\x5c\x74\xbc\xf8\x21\x6e\xd6\xe1\xf8\x85\x17\x0e\x48\xe9\x8c\xdf\x24\xa6\x0e\x0e\x9e\xc0\xa8\x5d\x1d\x4d\xbd\xa1\x7e\xb8\xa7\xbe\x07\x3d\xde\x7a\x77\x5e\x1c\x21\xa7\x88\x21\x48\x92\x7b\xf5\xcf\x17\x39\x44\xe2\xdb\x50\x5b\x1c\xff\xa0\xf5\x43\x2b\x7b\xfe\x6b\xa3\x16\xfa\x50\x23\xbc\xdb\x91\x97\x88\x8f\xf2\xa5\xf0\xa1\x2e\x3c\xc6\xda\x07\x48\x5c\x89\xa5\x7a\x56\xe9\xe7\x1a\x6a\x91\x1e\x5b\x0b\xfc\x35\xa4\x82\x81\x75\x66\x84\x32\x25\x71\xa8\x14\xfd\x47\xf9\x53\x80\xec\x24\x8a\x08\x9e\xce\x2c\x4d\xb6\xc2\xd1\x95\x75\x2f\xf6\xbc\x4f\xee\x3e\x6a\xdf\x13\x85\xb2\xee\x50\xea\xee\xc5\x26\x9e\x41\x84\x16\x37\xc9\xc4\x35\x98\x11\x5d\x4e\x88\x3d\x91\x41\x24\x39\xf9\xe4\xde\xa7\x89\x2f\xe7\x02\x34\x18\x2a\x71\x65\x54\x24\x0f\x34\x1b\x55\x3b\xbc\xa1\x01\x19\x37\x47\x6c\xf2\xb4\x63\xd6\x5a\xa4\xc1\xd4\x49\xf3\x31\x87\x5c\xbc\xcb\x3b\x36\x88\x34\x3c\x31\xf3\xfa\xca\x92\x6c\x43\x17\x6e\xdc\xdd\x66\x1e\x4a\x68\xea\x95\xf4\x35\x6b\x2f\x4b\x3a\x32\xa9\x66\x59\x13\x16\x00\x69\x15\x86\xe6\x25\x00\x4b\x7f\x8e\x97\x30\xeb\x8b\x81\x23\xe4\x22\xf3\x8b\x0e\x96\x21\xe8\x77\x87\x3f\x49\x76\xd0\x7c\xac\x21\x5b\x78\x85\xab\x70\x08\x96\x5c\x17\xf8\x31\xa3\x2d\x24\x1f\x53\x68\x2d\xb6\x17\x03\x2f\x28\x8f\x3c\xa4\x2a\x18\x42\x94\xd0\xa8\x5d\xdb\x3f\x53\xa8\x4d\xfe\xef\xb6\xe1\x39\x84\x1d\x93\xf4\x0c\xf7\x34\xdc\xac\xce\xf6\x91\x60\xe1\x26\xf1\x40\x1f\x36\x78\xf8\xd6\xf8\x94\x86\xac\xcc\x9e\x21\x2b\x70\x1f\xa0\x31\xa9\x62\xc3\x7e\x36\x6d\x9f\xb6\xc1\xdb\x5a\x33\x7b\x33\xd8\x91\xfc\xf9\x02\xf2\x01\x9e\x7e\xd9\xcb\x25\x90\x76\x1d\x56\x7f\x9a\x8f\x52\x48\xcd\x7a\x33\x0b\x52\x20\x02\x4a\x1b\x14\xeb\x7d\x7b\xaa\x8a\x3c\xb2\x4d\x4e\x29\x1d\x34\xb9\x4a\xbc\x64\xcc\x51\x4f\x6d\x29\x76\xc7\x20\xd4\xb2\x6a\x40\x06\x79\x08\x12\xa5\x77\x3c\x13\x04\xad\xf4\xba\x46\x5a\xee\xaf\xd0\x7c\xab\x1d\x20\x9c\x03\xd7\xe0\x21\xcf\x2c\xab\xdf\x20\x45\x62\xf3\x23\xe5\x78\x92\x0f\x88\x3c\x48\x8d\x72\xd6\xbf\xe7\x78\x31\x13\xfb\x2a\xcc\x6c\xb8\xfd\xd3\x27\x8d\x1e\xdc\x85\x48\x08\x86\x23\xee\x05\xd9\xa3\x90\x02\xe1\xc6\x5c\xd4\x58\xfa\x1c\xcd\x06\xba\x63\xbc\x44\xfb\x44\x72\x53\x2e\x85\xf0\x86\xc4\x7c\x29\x3f\xa9\xb7\x6a\x66\x14\x0f\x80\x00\x65\x28\x4f\x62\x0a\x4b\x85\x58\x17\x28\xa1\xef\x62\x48\x5a\x4f\x19\xd2\x4b\x2d\xcf\xe6\xdd\x7e\x42\x30\x26\x7b\x79\x4e\xf7\xce\x5e\x21\x35\xb5\x52\xcc\x80\x45\x3e\x3d\x84\x47\x75\x48\xf5\xe6\xa9\xb6\x53\x1a\xea\x83\x2f\xdd\xf2\x9f\x5b\xd3\x5f\x33\x9c\x67\xfd\xbb\xd7\x45\x57\x49\x7e\x42\xdf\x80\xd7\x5a\xfa\xd8\x35\x2f\x8d\x5c\x73\x48\x43\x30\xd5\x0c\xa9\xbf\x99\xda\x6d\x28\x49\xd2\x7b\x60\xa0\x62\xff\x39\x94\xd6\xd9\x7f\x10\x7a\x84\x7a\xf6\x6f\xee\xb8\xe5\xb6\xea\x6f\xa5\xab\x18\xf0\x06\x6d\xa5\xcf\x3f\x50\x56\x2f\x29\xf0\x8e\xd2\x8d\x0d\x00\xa9\x9f\xd9\x84\x59\x2a\x8b\xb7\x35\x3c\x9f\xcd\xf7\x66\x5e\x6f\x4a\xca\x84\x7e\xa4\x9f\xe2\x94\x2d\xd1\x43\x31\xae\xf0\x2c\x3f\x71\x2d\xc0\x95\x19\xd6\x80\xa1\x21\x59\xef\x36\x83\x80\xb2\x3c\xd5\x05\x1b\xed\x86\x99\x9e\x67\x72\x77\x23\x88\x93\xa8\x52\x07\x53\xb7\x0a\xc4\x60\xd1\x3b\x61\x83\xe4\xf8\x40\xb0\x20\xd5\x4a\x48\xa6\x90\x62\xa1\xaf\xdf\x6f\x96\xde\xe2\xcb\xbb\x09\x2a\x4e\xc6\xda\x31\xb6\x7a\x05\x2e\x19\x8e\xfc\xc6\x1e\x22\x00\xb3\x64\x14\xef\x58\x2d\xb3\xd6\x70\x84\xb4\xe3\x39\x81\x40\xc1\xa1\x8d\xb9\x14\x2d\xe9\xab\xd2\x84\xc0\x5b\x51\x29\x52\x07\x99\x49\x5e\xc8\x97\x9a\x43\x53\xb1\xd6\x2d\x02\xbe\x6c\x42\x1d\xd1\x21\x14\x94\xd4\x15\xa0\xc7\xc1\x3b\xae\x5b\x88\x65\x6e\x87\xa4\x28\xb1\x5c\xa8\x5f\x04\xff\x30\x1c\x63\x12\xd7\xc4\x4a\x36\x91\x52\x95\x0d\x34\x3d\xcd\xc5\x66\xc5\xaa\xe5\x22\x82\x0d\x50\xa5\xbd\xa4\x46\x57\x17\x09\x50\x16\x5d\x60\x9a\xf4\xc3\xbc\x49\x44\x32\x28\xfb\x7b\xd2\x77\xc2\x08\x56\x80\xb9\x43\xbe\x55\x5f\xb2\x0f\xfd\x49\x6a\xf0\x80\xe4\x4a\x34\xb3\xfd\x82\xd5\xd6\x8d\xc8\x5f\xcf\xa2\x47\xb7\x80\x62\x44\x69\x2c\xfd\xd2\x84\x19\x97\x18\x40\x30\xc1\x49\x43\xd3\x93\x0c\x41\x44\xb3\x5a\xd9\x44\x8b\x34\x5d\x9b\x40\x24\xf7\x42\x23\xac\x49\x47\xaa\x73\x05\x18\x14\x37\x0f\x71\x48\xc5\xc3\xf6\x33\x69\x73\xac\xaf\x3a\xa4\xea\x58\xec\x49\xf9\xb4\x08\xa2\x8f\x89\xa9\x5f\x98\xbc\xd1\x42\x75\x62\x7c\x21\x3e\xf7\xd9\x17\x95\x1f\x92\x8c\x4c\x1a\x6d\x81\xd2\xb4\x71\x60\x76\xa9\xc8\xa2\xdd\xfb\x7e\x4b\xa2\x12\xbd\x89\x4e\xb1\xc6\x24\x0d\xe4\x0c\xf7\xce\x75\x05\xe0\x31\xf6\x8e\x63\x9c\x6a\x90\x96\x25\xf4\x47\x42\x1c\x35\x9f\x21\x75\xe8\x4f\xb1\x0a\x49\xfe\x35\xab\x2b\xed\x7d\xf1\x92\xff\xdc\x94\x1d\xd7\x43\x27\x4a\x2a\x89\xd0\xbe\x08\xf9\xc7\x97\x74\x11\x41\xb2\x1c\x4a\x87\x27\x73\x2d\x7b\x10\x46\x95\x3e\x7e\x05\x26\xd2\x1c\xaa\x92\x21\x1a\x09\x22\xcc\x90\x28\x3c\x29\xfb\xa5\x8d\xf3\x8a\xd4\x51\x17\xa8\x44\xba\x2c\xf1\xae\xda\x26\x91\xa7\x01\x24\xa9\x28\xd2\x50\xf3\xd1\xe3\xd4\xe1\x89\xaa\x89\x8d\xcb\x1a\x39\x24\xf1\x49\x23\xe1\x61\xe2\xda\x09\xd2\x49\xf8\x94\x93\xf2\x6e\x7b\xef\xf7\x6b\x20\xc9\x3e\x1e\xbb\x27\x87\xe9\x4e\x8f\x75\x89\x1f\x85\x67\xcb\xe1\x19\xb0\x0c\x43\x11\xea\xeb\xa8\xeb\x4b\x1b\x92\xf2\x20\x28\xef\x26\x82\xd9\x69\x97\x8f\x5b\xbc\xc6\xee\xc9\x54\x25\x70\x12\x10\xc1\xbb\xc1\xa6\x48\x79\xf3\xbc\xdb\x25\x31\xcc\x2d\x64\x72\x95\x71\x6a\xe5\x64\xc6\x63\xe5\x57\x61\xc3\xd1\xae\xe3\x86\xf6\x40\xcc\xae\xd0\xd9\xd6\x9d\x47\x21\xe7\x91\x20\x1e\xc6\xda\xba\x29\x74\xd7\xda\x97\x8e\xa6\x73\x99\xf2\x4c\xb4\xbc\x42\x7f\x93\x92\xb5\x84\xc3\x4f\xef\xd5\x46\xbb\x3b\xf4\x2f\xfb\x38\xb6\x48\x7f\xb2\x17\xc7\x5c\x8f\x40\x7c\x0a\xbf\xa6\xae\x5e\x4c\xda\x31\xc8\x65\xe5\xee\x13\x22\x94\x5f\xea\xca\xfd\x59\x83\x83\x94\xa5\xf4\xeb\xee\x93\x46\x06\x44\x2d\xeb\xab\xf0\xc3\xb1\x8d\x4e\xb2\x93\xa7\xc4\xb3\x6e\x70\x7d\xf5\x9c\xa4\xda\x68\x7e\x35\x85\x4b\xc9\xb3\x00\x29\x2d\x1d\x50\x27\x67\x28\x75\x77\x87\x88\xe5\x31\x85\x24\xd8\xed\x4e\x77\xa1\x12\x87\x83\x57\x57\xd7\xdb\xf8\x25\x18\x08\xe5\xcb\x6d\x90\x0a\xe4\xbd\xea\x8e\x5c\xf3\x84\xa8\x34\x31\xcc\x45\x35\xc3\xa9\xb8\x07\x9c\x38\xfa\xa7\x99\xdb\x7c\x3a\xb7\xce\x4e\xa7\x5b\x67\x33\xdf\xbf\x72\x9a\x12\xc1\x3b\x3c\x84\xcd\x8a\x21\xb4\x33\x3f\x52\x53\x3b\xee\xed\x7c\x71\x01\x1b\x38\x94\xef\x40\x2c\xcb\x7b\x31\x14\xad\x01\xf2\x99\x7a\x27\xc7\xcd\x02\x6a\xcf\x89\xa8\xc9\x8b\x82\x7b\xeb\x43\x50\x9f\xfc\xc0\x0d\x7a\x52\x21\x61\x98\x89\x6e\xf9\xfd\xb4\x3b\x9d\x0d\x8b\x1d\x0b\x54\xb2\xf8\x02\x9d\x21\x27\x50\x9f\x7f\x55\x29\x10\x51\xf0\x8f\xa6\x73\x6a\x8a\x4b\xbf\x63\x07\x04\x30\x68\x8f\x2b\x63\xd2\x8f\xdb\xe1\xca\x71\x8b\x52\xff\x46\xf8\x9c\x6a\x80\x14\xe4\x9f\xa2\xe6\x65\xa3\x1a\x63\x8b\x7d\xab\x93\x32\xe1\xd1\x22\x5d\x00\xb7\xd0\x05\x85\x26\x7b\x3b\x8f\x3c\xf7\x1d\x18\xa1\x36\x01\x4e\x8e\x3d\x13\x6d\x10\x78\x86\x16\x69\xfa\x96\x40\x9f\x96\xfc\x00\x7d\xce\x55\x25\x8b\x50\x5b\x75\x42\x7b\xfd\x6b\x6b\x4a\x61\xd8\xe8\xd3\x15\x50\x29\xbf\xdd\xc1\x74\x8c\xce\x55\xb1\x59\xd7\xd4\x94\x4b\x81\x36\x19\xb5\xee\x1b\x8b\xfd\x5a\x1f\xef\x10\x49\xb5\x11\x78\x27\x0e\x21\xcf\x2d\x54\x3a\xdf\xd2\x38\x84\xd3\xe2\xd2\xf1\xf7\xe5\x0c\x2c\x00\xf3\x8f\xf9\x02\xca\xf7\x67\xf9\xdf\x1d\xff\x3b\x1e\x95\x6e\x08\xe0\xac\x9d\xd0\x69\xe8\x75\x34\xeb\x81\xc8\xfc\x22\x62\x00\x6e\xf0\xdf\x21\x57\x5a\xc1\x02\xed\x7d\x11\x02\x39\x55\x86\xd0\xe8\xf1\x61\xe5\x0e\x15\x12\x03\xb5\x4b\xf3\xb7\xc7\xc4\x4e\xa0\x1e\x89\x55\xaf\xfa\x52\xab\x04\x0f\xeb\xe6\x33\xab\x08\x68\xef\x6a\x48\x43\x75\x10\x55\xe3\xd9\xb6\xa4\x29\xba\x6b\x87\x52\x35\x4f\x64\xfa\x5d\x0d\x51\xbe\x16\x7a\xe5\x88\x65\x61\x6d\x4b\xd0\xe1\x19\x94\x1a\xa9\xe2\x01\xa0\x3d\x7a\x48\xc3\xa2\xab\x13\x62\xd0\x42\x30\x35\x9f\xfb\xb8\xdc\x93\xb0\x2e\xa6\x0e\xa0\x86\xea\xe6\xef\x33\xf3\xe5\x61\x9e\xdb\xb5\x66\xb3\x1e\xde\x10\x42\xa8\x7d\x84\xab\x1b\xec\x79\x6d\x26\x19\x41\xa2\x54\xe5\xcc\xdf\xa4\x81\x91\x66\x1d\xb2\x99\x58\x86\x0a\x29\x65\x11\xe0\xac\x55\xeb\x5a\x62\x7c\x87\xfa\x12\x13\x82\x0d\x35\x39\xd4\x05\xd1\x38\x3c\x57\xd2\xa7\x88\x60\x6c\x8e\x84\x2e\x70\x4a\x85\x4c\x28\x9a\xea\xcb\x7a\xd4\xe3\x19\x11\x24\xdd\x83\x4c\x2a\x5d\xf9\xba\xa7\xac\x43\x48\x4c\x25\xa0\xb3\xcb\x40\x6a\xad\xa7\x78\x9c\x9e\x15\x14\xfa\xea\x8a\xa4\x1c\x6d\xf2\x72\x25\x0f\xf1\x07\x94\x8a\xa1\x3a\x35\xfc\x98\x8f\xb0\xfc\x51\x35\x8e\x6c\x1f\x0a\xa2\x3a\x98\x34\xdb\x34\x44\x67\x0b\x54\x50\xe5\x45\xec\x4a\x04\xa0\x74\x66\x9d\xf2\x8b\x2e\x69\x54\x1b\x9b\x13\x73\x13\x3b\x7a\x26\xba\xfc\x61\x63\x0c\x57\x4e\x07\x56\x0d\xaf\x9d\xf5\x45\xfe\x8b\x1c\x4a\xae\xf6\xa4\x3c\x1c\x49\x1b\xb3\xf4\x50\xaf\x18\x79\x9a\x38\x33\x32\xbb\x6d\x06\x20\xc8\x79\x2b\xd2\xc4\x62\x98\x43\xa2\xd0\x25\x90\x9a\x12\xab\xcd\x38\x0b\xe1\xb3\xc9\xaf\x42\xb1\x87\xad\x1d\x3c\x2a\x92\x26\x85\xe6\x6e\xd6\x01\x64\x6b\x80\x68\xeb\x97\xdd\x5d\x3e\x98\xf2\xdf\x65\x24\xa1\xa9\xae\x1b\x96\x63\x89\xe6\x54\x24\xd3\x6a\x56\x1a\xdf\xbc\xc1\x90\x44\x5d\x99\x87\xd1\x99\x11\x92\x74\xf7\xcb\x22\x5b\x4a\xca\xaa\x01\x43\xf6\xd4\x90\xbb\x65\x5c\x61\xb5\x1c\xf1\x23\x9b\x59\x86\x8c\x69\x7c\x0c\x59\x51\xa7\x5d\xe6\x2c\xa4\xcb\xb3\x9c\xd1\x90\x54\x65\xef\x94\x07\x9d\x0c\xc3\x46\x00\x2f\x43\x1c\x34\x43\x8f\x32\x85\x84\xac\x6d\x68\x6c\xcf\x69\x68\x75\x6a\xfd\x6a\xfa\x4a\x73\xf3\x73\xba\x03\xe3\xff\xff\x3f\xff\xdf\xff\x0d\x00\x00\xff\xff\x9b\xc6\xef\xe7\x7d\x0c\x06\x00")
+
+func dataSurnamesJsonBytes() ([]byte, error) {
+ return bindataRead(
+ _dataSurnamesJson,
+ "data/Surnames.json",
+ )
+}
+
+func dataSurnamesJson() (*asset, error) {
+ bytes, err := dataSurnamesJsonBytes()
+ if err != nil {
+ return nil, err
+ }
+
+ info := bindataFileInfo{name: "data/Surnames.json", size: 396413, mode: os.FileMode(420), modTime: time.Unix(1452717629, 0)}
+ a := &asset{bytes: bytes, info: info}
+ return a, nil
+}
+
+// Asset loads and returns the asset for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func Asset(name string) ([]byte, error) {
+ cannonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[cannonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
+ }
+ return a.bytes, nil
+ }
+ return nil, fmt.Errorf("Asset %s not found", name)
+}
+
+// MustAsset is like Asset but panics when Asset would return an error.
+// It simplifies safe initialization of global variables.
+func MustAsset(name string) []byte {
+ a, err := Asset(name)
+ if err != nil {
+ panic("asset: Asset(" + name + "): " + err.Error())
+ }
+
+ return a
+}
+
+// AssetInfo loads and returns the asset info for the given name.
+// It returns an error if the asset could not be found or
+// could not be loaded.
+func AssetInfo(name string) (os.FileInfo, error) {
+ cannonicalName := strings.Replace(name, "\\", "/", -1)
+ if f, ok := _bindata[cannonicalName]; ok {
+ a, err := f()
+ if err != nil {
+ return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
+ }
+ return a.info, nil
+ }
+ return nil, fmt.Errorf("AssetInfo %s not found", name)
+}
+
+// AssetNames returns the names of the assets.
+func AssetNames() []string {
+ names := make([]string, 0, len(_bindata))
+ for name := range _bindata {
+ names = append(names, name)
+ }
+ return names
+}
+
+// _bindata is a table, holding each asset generator, mapped to its name.
+var _bindata = map[string]func() (*asset, error){
+ "data/Dvorak.json": dataDvorakJson,
+ "data/English.json": dataEnglishJson,
+ "data/FemaleNames.json": dataFemalenamesJson,
+ "data/Keypad.json": dataKeypadJson,
+ "data/L33t.json": dataL33tJson,
+ "data/MacKeypad.json": dataMackeypadJson,
+ "data/MaleNames.json": dataMalenamesJson,
+ "data/Passwords.json": dataPasswordsJson,
+ "data/Qwerty.json": dataQwertyJson,
+ "data/Surnames.json": dataSurnamesJson,
+}
+
+// AssetDir returns the file names below a certain
+// directory embedded in the file by go-bindata.
+// For example if you run go-bindata on data/... and data contains the
+// following hierarchy:
+// data/
+// foo.txt
+// img/
+// a.png
+// b.png
+// then AssetDir("data") would return []string{"foo.txt", "img"}
+// AssetDir("data/img") would return []string{"a.png", "b.png"}
+// AssetDir("foo.txt") and AssetDir("notexist") would return an error
+// AssetDir("") will return []string{"data"}.
+func AssetDir(name string) ([]string, error) {
+ node := _bintree
+ if len(name) != 0 {
+ cannonicalName := strings.Replace(name, "\\", "/", -1)
+ pathList := strings.Split(cannonicalName, "/")
+ for _, p := range pathList {
+ node = node.Children[p]
+ if node == nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ }
+ }
+ if node.Func != nil {
+ return nil, fmt.Errorf("Asset %s not found", name)
+ }
+ rv := make([]string, 0, len(node.Children))
+ for childName := range node.Children {
+ rv = append(rv, childName)
+ }
+ return rv, nil
+}
+
+type bintree struct {
+ Func func() (*asset, error)
+ Children map[string]*bintree
+}
+
+var _bintree = &bintree{nil, map[string]*bintree{
+ "data": &bintree{nil, map[string]*bintree{
+ "Dvorak.json": &bintree{dataDvorakJson, map[string]*bintree{}},
+ "English.json": &bintree{dataEnglishJson, map[string]*bintree{}},
+ "FemaleNames.json": &bintree{dataFemalenamesJson, map[string]*bintree{}},
+ "Keypad.json": &bintree{dataKeypadJson, map[string]*bintree{}},
+ "L33t.json": &bintree{dataL33tJson, map[string]*bintree{}},
+ "MacKeypad.json": &bintree{dataMackeypadJson, map[string]*bintree{}},
+ "MaleNames.json": &bintree{dataMalenamesJson, map[string]*bintree{}},
+ "Passwords.json": &bintree{dataPasswordsJson, map[string]*bintree{}},
+ "Qwerty.json": &bintree{dataQwertyJson, map[string]*bintree{}},
+ "Surnames.json": &bintree{dataSurnamesJson, map[string]*bintree{}},
+ }},
+}}
+
+// RestoreAsset restores an asset under the given directory
+func RestoreAsset(dir, name string) error {
+ data, err := Asset(name)
+ if err != nil {
+ return err
+ }
+ info, err := AssetInfo(name)
+ if err != nil {
+ return err
+ }
+ err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
+ if err != nil {
+ return err
+ }
+ err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
+ if err != nil {
+ return err
+ }
+ err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
+ if err != nil {
+ return err
+ }
+ return nil
+}
+
+// RestoreAssets restores an asset under the given directory recursively
+func RestoreAssets(dir, name string) error {
+ children, err := AssetDir(name)
+ // File
+ if err != nil {
+ return RestoreAsset(dir, name)
+ }
+ // Dir
+ for _, child := range children {
+ err = RestoreAssets(dir, filepath.Join(name, child))
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func _filePath(dir, name string) string {
+ cannonicalName := strings.Replace(name, "\\", "/", -1)
+ return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...)
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go b/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go
new file mode 100644
index 00000000000..028732d26f0
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/entropy/entropyCalculator.go
@@ -0,0 +1,215 @@
+package entropy
+
+import (
+ "github.com/nbutton23/zxcvbn-go/adjacency"
+ "github.com/nbutton23/zxcvbn-go/match"
+ "github.com/nbutton23/zxcvbn-go/utils/math"
+ "math"
+ "regexp"
+ "unicode"
+)
+
+const (
+ START_UPPER string = `^[A-Z][^A-Z]+$`
+ END_UPPER string = `^[^A-Z]+[A-Z]$'`
+ ALL_UPPER string = `^[A-Z]+$`
+ NUM_YEARS = float64(119) // years match against 1900 - 2019
+ NUM_MONTHS = float64(12)
+ NUM_DAYS = float64(31)
+)
+
+var (
+ KEYPAD_STARTING_POSITIONS = len(adjacency.AdjacencyGph["keypad"].Graph)
+ KEYPAD_AVG_DEGREE = adjacency.AdjacencyGph["keypad"].CalculateAvgDegree()
+)
+
+func DictionaryEntropy(match match.Match, rank float64) float64 {
+ baseEntropy := math.Log2(rank)
+ upperCaseEntropy := extraUpperCaseEntropy(match)
+ //TODO: L33t
+ return baseEntropy + upperCaseEntropy
+}
+
+func extraUpperCaseEntropy(match match.Match) float64 {
+ word := match.Token
+
+ allLower := true
+
+ for _, char := range word {
+ if unicode.IsUpper(char) {
+ allLower = false
+ break
+ }
+ }
+ if allLower {
+ return float64(0)
+ }
+
+ //a capitalized word is the most common capitalization scheme,
+ //so it only doubles the search space (uncapitalized + capitalized): 1 extra bit of entropy.
+ //allcaps and end-capitalized are common enough too, underestimate as 1 extra bit to be safe.
+
+ for _, regex := range []string{START_UPPER, END_UPPER, ALL_UPPER} {
+ matcher := regexp.MustCompile(regex)
+
+ if matcher.MatchString(word) {
+ return float64(1)
+ }
+ }
+ //Otherwise calculate the number of ways to capitalize U+L uppercase+lowercase letters with U uppercase letters or
+ //less. Or, if there's more uppercase than lower (for e.g. PASSwORD), the number of ways to lowercase U+L letters
+ //with L lowercase letters or less.
+
+ countUpper, countLower := float64(0), float64(0)
+ for _, char := range word {
+ if unicode.IsUpper(char) {
+ countUpper++
+ } else if unicode.IsLower(char) {
+ countLower++
+ }
+ }
+ totalLenght := countLower + countUpper
+ var possibililities float64
+
+ for i := float64(0); i <= math.Min(countUpper, countLower); i++ {
+ possibililities += float64(zxcvbn_math.NChoseK(totalLenght, i))
+ }
+
+ if possibililities < 1 {
+ return float64(1)
+ }
+
+ return float64(math.Log2(possibililities))
+}
+
+func SpatialEntropy(match match.Match, turns int, shiftCount int) float64 {
+ var s, d float64
+ if match.DictionaryName == "qwerty" || match.DictionaryName == "dvorak" {
+ //todo: verify qwerty and dvorak have the same length and degree
+ s = float64(len(adjacency.BuildQwerty().Graph))
+ d = adjacency.BuildQwerty().CalculateAvgDegree()
+ } else {
+ s = float64(KEYPAD_STARTING_POSITIONS)
+ d = KEYPAD_AVG_DEGREE
+ }
+
+ possibilities := float64(0)
+
+ length := float64(len(match.Token))
+
+ //TODO: Should this be <= or just < ?
+ //Estimate the number of possible patterns w/ length L or less with t turns or less
+ for i := float64(2); i <= length+1; i++ {
+ possibleTurns := math.Min(float64(turns), i-1)
+ for j := float64(1); j <= possibleTurns+1; j++ {
+ x := zxcvbn_math.NChoseK(i-1, j-1) * s * math.Pow(d, j)
+ possibilities += x
+ }
+ }
+
+ entropy := math.Log2(possibilities)
+ //add extra entropu for shifted keys. ( % instead of 5 A instead of a)
+ //Math is similar to extra entropy for uppercase letters in dictionary matches.
+
+ if S := float64(shiftCount); S > float64(0) {
+ possibilities = float64(0)
+ U := length - S
+
+ for i := float64(0); i < math.Min(S, U)+1; i++ {
+ possibilities += zxcvbn_math.NChoseK(S+U, i)
+ }
+
+ entropy += math.Log2(possibilities)
+ }
+
+ return entropy
+}
+
+func RepeatEntropy(match match.Match) float64 {
+ cardinality := CalcBruteForceCardinality(match.Token)
+ entropy := math.Log2(cardinality * float64(len(match.Token)))
+
+ return entropy
+}
+
+//TODO: Validate against python
+func CalcBruteForceCardinality(password string) float64 {
+ lower, upper, digits, symbols := float64(0), float64(0), float64(0), float64(0)
+
+ for _, char := range password {
+ if unicode.IsLower(char) {
+ lower = float64(26)
+ } else if unicode.IsDigit(char) {
+ digits = float64(10)
+ } else if unicode.IsUpper(char) {
+ upper = float64(26)
+ } else {
+ symbols = float64(33)
+ }
+ }
+
+ cardinality := lower + upper + digits + symbols
+ return cardinality
+}
+
+func SequenceEntropy(match match.Match, dictionaryLength int, ascending bool) float64 {
+ firstChar := match.Token[0]
+ baseEntropy := float64(0)
+ if string(firstChar) == "a" || string(firstChar) == "1" {
+ baseEntropy = float64(0)
+ } else {
+ baseEntropy = math.Log2(float64(dictionaryLength))
+ //TODO: should this be just the first or any char?
+ if unicode.IsUpper(rune(firstChar)) {
+ baseEntropy++
+ }
+ }
+
+ if !ascending {
+ baseEntropy++
+ }
+ return baseEntropy + math.Log2(float64(len(match.Token)))
+}
+
+func ExtraLeetEntropy(match match.Match, password string) float64 {
+ var subsitutions float64
+ var unsub float64
+ subPassword := password[match.I:match.J]
+ for index, char := range subPassword {
+ if string(char) != string(match.Token[index]) {
+ subsitutions++
+ } else {
+ //TODO: Make this only true for 1337 chars that are not subs?
+ unsub++
+ }
+ }
+
+ var possibilities float64
+
+ for i := float64(0); i <= math.Min(subsitutions, unsub)+1; i++ {
+ possibilities += zxcvbn_math.NChoseK(subsitutions+unsub, i)
+ }
+
+ if possibilities <= 1 {
+ return float64(1)
+ }
+ return math.Log2(possibilities)
+}
+
+func YearEntropy(dateMatch match.DateMatch) float64 {
+ return math.Log2(NUM_YEARS)
+}
+
+func DateEntropy(dateMatch match.DateMatch) float64 {
+ var entropy float64
+ if dateMatch.Year < 100 {
+ entropy = math.Log2(NUM_DAYS * NUM_MONTHS * 100)
+ } else {
+ entropy = math.Log2(NUM_DAYS * NUM_MONTHS * NUM_YEARS)
+ }
+
+ if dateMatch.Separator != "" {
+ entropy += 2 //add two bits for separator selection [/,-,.,etc]
+ }
+ return entropy
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go b/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go
new file mode 100644
index 00000000000..5718830adb8
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/frequency/frequency.go
@@ -0,0 +1,47 @@
+package frequency
+
+import (
+ "encoding/json"
+ "github.com/nbutton23/zxcvbn-go/data"
+ "log"
+)
+
+type FrequencyList struct {
+ Name string
+ List []string
+}
+
+var FrequencyLists = make(map[string]FrequencyList)
+
+func init() {
+ maleFilePath := getAsset("data/MaleNames.json")
+ femaleFilePath := getAsset("data/FemaleNames.json")
+ surnameFilePath := getAsset("data/Surnames.json")
+ englishFilePath := getAsset("data/English.json")
+ passwordsFilePath := getAsset("data/Passwords.json")
+
+ FrequencyLists["MaleNames"] = GetStringListFromAsset(maleFilePath, "MaleNames")
+ FrequencyLists["FemaleNames"] = GetStringListFromAsset(femaleFilePath, "FemaleNames")
+ FrequencyLists["Surname"] = GetStringListFromAsset(surnameFilePath, "Surname")
+ FrequencyLists["English"] = GetStringListFromAsset(englishFilePath, "English")
+ FrequencyLists["Passwords"] = GetStringListFromAsset(passwordsFilePath, "Passwords")
+
+}
+func getAsset(name string) []byte {
+ data, err := zxcvbn_data.Asset(name)
+ if err != nil {
+ panic("Error getting asset " + name)
+ }
+
+ return data
+}
+func GetStringListFromAsset(data []byte, name string) FrequencyList {
+
+ var tempList FrequencyList
+ err := json.Unmarshal(data, &tempList)
+ if err != nil {
+ log.Fatal(err)
+ }
+ tempList.Name = name
+ return tempList
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/match/match.go b/vendor/github.com/nbutton23/zxcvbn-go/match/match.go
new file mode 100644
index 00000000000..052394394f7
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/match/match.go
@@ -0,0 +1,40 @@
+package match
+
+type Matches []Match
+
+func (s Matches) Len() int {
+ return len(s)
+}
+func (s Matches) Swap(i, j int) {
+ s[i], s[j] = s[j], s[i]
+}
+func (s Matches) Less(i, j int) bool {
+ if s[i].I < s[j].I {
+ return true
+ } else if s[i].I == s[j].I {
+ return s[i].J < s[j].J
+ } else {
+ return false
+ }
+}
+
+type Match struct {
+ Pattern string
+ I, J int
+ Token string
+ DictionaryName string
+ Entropy float64
+}
+
+type DateMatch struct {
+ Pattern string
+ I, J int
+ Token string
+ Separator string
+ Day, Month, Year int64
+}
+
+type Matcher struct {
+ MatchingFunc func(password string) []Match
+ ID string
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go
new file mode 100644
index 00000000000..e55b3da8a2c
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/dateMatchers.go
@@ -0,0 +1,204 @@
+package matching
+
+import (
+ "regexp"
+ "strconv"
+ "strings"
+
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+)
+
+const (
+ DATESEP_MATCHER_NAME = "DATESEP"
+ DATEWITHOUTSEP_MATCHER_NAME = "DATEWITHOUT"
+)
+
+func FilterDateSepMatcher(m match.Matcher) bool {
+ return m.ID == DATESEP_MATCHER_NAME
+}
+
+func FilterDateWithoutSepMatcher(m match.Matcher) bool {
+ return m.ID == DATEWITHOUTSEP_MATCHER_NAME
+}
+
+func checkDate(day, month, year int64) (bool, int64, int64, int64) {
+ if (12 <= month && month <= 31) && day <= 12 {
+ day, month = month, day
+ }
+
+ if day > 31 || month > 12 {
+ return false, 0, 0, 0
+ }
+
+ if !((1900 <= year && year <= 2019) || (0 <= year && year <= 99)) {
+ return false, 0, 0, 0
+ }
+
+ return true, day, month, year
+}
+
+func dateSepMatcher(password string) []match.Match {
+ dateMatches := dateSepMatchHelper(password)
+
+ var matches []match.Match
+ for _, dateMatch := range dateMatches {
+ match := match.Match{
+ I: dateMatch.I,
+ J: dateMatch.J,
+ Entropy: entropy.DateEntropy(dateMatch),
+ DictionaryName: "date_match",
+ Token: dateMatch.Token,
+ }
+
+ matches = append(matches, match)
+ }
+
+ return matches
+}
+func dateSepMatchHelper(password string) []match.DateMatch {
+
+ var matches []match.DateMatch
+
+ matcher := regexp.MustCompile(DATE_RX_YEAR_SUFFIX)
+ for _, v := range matcher.FindAllString(password, len(password)) {
+ splitV := matcher.FindAllStringSubmatch(v, len(v))
+ i := strings.Index(password, v)
+ j := i + len(v)
+ day, _ := strconv.ParseInt(splitV[0][4], 10, 16)
+ month, _ := strconv.ParseInt(splitV[0][2], 10, 16)
+ year, _ := strconv.ParseInt(splitV[0][6], 10, 16)
+ match := match.DateMatch{Day: day, Month: month, Year: year, Separator: splitV[0][5], I: i, J: j, Token: password[i:j]}
+ matches = append(matches, match)
+ }
+
+ matcher = regexp.MustCompile(DATE_RX_YEAR_PREFIX)
+ for _, v := range matcher.FindAllString(password, len(password)) {
+ splitV := matcher.FindAllStringSubmatch(v, len(v))
+ i := strings.Index(password, v)
+ j := i + len(v)
+ day, _ := strconv.ParseInt(splitV[0][4], 10, 16)
+ month, _ := strconv.ParseInt(splitV[0][6], 10, 16)
+ year, _ := strconv.ParseInt(splitV[0][2], 10, 16)
+ match := match.DateMatch{Day: day, Month: month, Year: year, Separator: splitV[0][5], I: i, J: j, Token: password[i:j]}
+ matches = append(matches, match)
+ }
+
+ var out []match.DateMatch
+ for _, match := range matches {
+ if valid, day, month, year := checkDate(match.Day, match.Month, match.Year); valid {
+ match.Pattern = "date"
+ match.Day = day
+ match.Month = month
+ match.Year = year
+ out = append(out, match)
+ }
+ }
+ return out
+
+}
+
+type DateMatchCandidate struct {
+ DayMonth string
+ Year string
+ I, J int
+}
+
+type DateMatchCandidateTwo struct {
+ Day string
+ Month string
+ Year string
+ I, J int
+}
+
+func dateWithoutSepMatch(password string) []match.Match {
+ dateMatches := dateWithoutSepMatchHelper(password)
+
+ var matches []match.Match
+ for _, dateMatch := range dateMatches {
+ match := match.Match{
+ I: dateMatch.I,
+ J: dateMatch.J,
+ Entropy: entropy.DateEntropy(dateMatch),
+ DictionaryName: "date_match",
+ Token: dateMatch.Token,
+ }
+
+ matches = append(matches, match)
+ }
+
+ return matches
+}
+
+//TODO Has issues with 6 digit dates
+func dateWithoutSepMatchHelper(password string) (matches []match.DateMatch) {
+ matcher := regexp.MustCompile(DATE_WITHOUT_SEP_MATCH)
+ for _, v := range matcher.FindAllString(password, len(password)) {
+ i := strings.Index(password, v)
+ j := i + len(v)
+ length := len(v)
+ lastIndex := length - 1
+ var candidatesRoundOne []DateMatchCandidate
+
+ if length <= 6 {
+ //2-digit year prefix
+ candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[2:], v[0:2], i, j))
+
+ //2-digityear suffix
+ candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[0:lastIndex-2], v[lastIndex-2:], i, j))
+ }
+ if length >= 6 {
+ //4-digit year prefix
+ candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[4:], v[0:4], i, j))
+
+ //4-digit year sufix
+ candidatesRoundOne = append(candidatesRoundOne, buildDateMatchCandidate(v[0:lastIndex-3], v[lastIndex-3:], i, j))
+ }
+
+ var candidatesRoundTwo []DateMatchCandidateTwo
+ for _, c := range candidatesRoundOne {
+ if len(c.DayMonth) == 2 {
+ candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:0], c.DayMonth[1:1], c.Year, c.I, c.J))
+ } else if len(c.DayMonth) == 3 {
+ candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:2], c.DayMonth[2:2], c.Year, c.I, c.J))
+ candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:0], c.DayMonth[1:3], c.Year, c.I, c.J))
+ } else if len(c.DayMonth) == 4 {
+ candidatesRoundTwo = append(candidatesRoundTwo, buildDateMatchCandidateTwo(c.DayMonth[0:2], c.DayMonth[2:4], c.Year, c.I, c.J))
+ }
+ }
+
+ for _, candidate := range candidatesRoundTwo {
+ intDay, err := strconv.ParseInt(candidate.Day, 10, 16)
+ if err != nil {
+ continue
+ }
+
+ intMonth, err := strconv.ParseInt(candidate.Month, 10, 16)
+
+ if err != nil {
+ continue
+ }
+
+ intYear, err := strconv.ParseInt(candidate.Year, 10, 16)
+ if err != nil {
+ continue
+ }
+
+ if ok, _, _, _ := checkDate(intDay, intMonth, intYear); ok {
+ matches = append(matches, match.DateMatch{Token: password, Pattern: "date", Day: intDay, Month: intMonth, Year: intYear, I: i, J: j})
+ }
+
+ }
+ }
+
+ return matches
+}
+
+func buildDateMatchCandidate(dayMonth, year string, i, j int) DateMatchCandidate {
+ return DateMatchCandidate{DayMonth: dayMonth, Year: year, I: i, J: j}
+}
+
+func buildDateMatchCandidateTwo(day, month string, year string, i, j int) DateMatchCandidateTwo {
+
+ return DateMatchCandidateTwo{Day: day, Month: month, Year: year, I: i, J: j}
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go
new file mode 100644
index 00000000000..b76921f0d60
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/dictionaryMatch.go
@@ -0,0 +1,54 @@
+package matching
+
+import (
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+ "strings"
+)
+
+func buildDictMatcher(dictName string, rankedDict map[string]int) func(password string) []match.Match {
+ return func(password string) []match.Match {
+ matches := dictionaryMatch(password, dictName, rankedDict)
+ for _, v := range matches {
+ v.DictionaryName = dictName
+ }
+ return matches
+ }
+
+}
+
+func dictionaryMatch(password string, dictionaryName string, rankedDict map[string]int) []match.Match {
+ length := len(password)
+ var results []match.Match
+ pwLower := strings.ToLower(password)
+
+ for i := 0; i < length; i++ {
+ for j := i; j < length; j++ {
+ word := pwLower[i : j+1]
+ if val, ok := rankedDict[word]; ok {
+ matchDic := match.Match{Pattern: "dictionary",
+ DictionaryName: dictionaryName,
+ I: i,
+ J: j,
+ Token: password[i : j+1],
+ }
+ matchDic.Entropy = entropy.DictionaryEntropy(matchDic, float64(val))
+
+ results = append(results, matchDic)
+ }
+ }
+ }
+
+ return results
+}
+
+func buildRankedDict(unrankedList []string) map[string]int {
+
+ result := make(map[string]int)
+
+ for i, v := range unrankedList {
+ result[strings.ToLower(v)] = i + 1
+ }
+
+ return result
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go
new file mode 100644
index 00000000000..7185744c929
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/leet.go
@@ -0,0 +1,75 @@
+package matching
+
+import (
+ "strings"
+
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+)
+
+const L33T_MATCHER_NAME = "l33t"
+
+func FilterL33tMatcher(m match.Matcher) bool {
+ return m.ID == L33T_MATCHER_NAME
+}
+
+func l33tMatch(password string) []match.Match {
+
+ substitutions := relevantL33tSubtable(password)
+
+ permutations := getAllPermutationsOfLeetSubstitutions(password, substitutions)
+
+ var matches []match.Match
+
+ for _, permutation := range permutations {
+ for _, mather := range DICTIONARY_MATCHERS {
+ matches = append(matches, mather.MatchingFunc(permutation)...)
+ }
+ }
+
+ for _, match := range matches {
+ match.Entropy += entropy.ExtraLeetEntropy(match, password)
+ match.DictionaryName = match.DictionaryName + "_3117"
+ }
+
+ return matches
+}
+
+func getAllPermutationsOfLeetSubstitutions(password string, substitutionsMap map[string][]string) []string {
+
+ var permutations []string
+
+ for index, char := range password {
+ for value, splice := range substitutionsMap {
+ for _, sub := range splice {
+ if string(char) == sub {
+ var permutation string
+ permutation = password[:index] + value + password[index+1:]
+
+ permutations = append(permutations, permutation)
+ if index < len(permutation) {
+ tempPermutations := getAllPermutationsOfLeetSubstitutions(permutation[index+1:], substitutionsMap)
+ for _, temp := range tempPermutations {
+ permutations = append(permutations, permutation[:index+1]+temp)
+ }
+
+ }
+ }
+ }
+ }
+ }
+
+ return permutations
+}
+
+func relevantL33tSubtable(password string) map[string][]string {
+ relevantSubs := make(map[string][]string)
+ for key, values := range L33T_TABLE.Graph {
+ for _, value := range values {
+ if strings.Contains(password, value) {
+ relevantSubs[key] = append(relevantSubs[key], value)
+ }
+ }
+ }
+ return relevantSubs
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go
new file mode 100644
index 00000000000..70f1631d028
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/matching.go
@@ -0,0 +1,87 @@
+package matching
+
+import (
+ "sort"
+
+ "github.com/nbutton23/zxcvbn-go/adjacency"
+ "github.com/nbutton23/zxcvbn-go/frequency"
+ "github.com/nbutton23/zxcvbn-go/match"
+)
+
+var (
+ DICTIONARY_MATCHERS []match.Matcher
+ MATCHERS []match.Matcher
+ ADJACENCY_GRAPHS []adjacency.AdjacencyGraph
+ L33T_TABLE adjacency.AdjacencyGraph
+
+ SEQUENCES map[string]string
+)
+
+const (
+ DATE_RX_YEAR_SUFFIX string = `((\d{1,2})(\s|-|\/|\\|_|\.)(\d{1,2})(\s|-|\/|\\|_|\.)(19\d{2}|200\d|201\d|\d{2}))`
+ DATE_RX_YEAR_PREFIX string = `((19\d{2}|200\d|201\d|\d{2})(\s|-|/|\\|_|\.)(\d{1,2})(\s|-|/|\\|_|\.)(\d{1,2}))`
+ DATE_WITHOUT_SEP_MATCH string = `\d{4,8}`
+)
+
+func init() {
+ loadFrequencyList()
+}
+
+func Omnimatch(password string, userInputs []string, filters ...func(match.Matcher) bool) (matches []match.Match) {
+
+ //Can I run into the issue where nil is not equal to nil?
+ if DICTIONARY_MATCHERS == nil || ADJACENCY_GRAPHS == nil {
+ loadFrequencyList()
+ }
+
+ if userInputs != nil {
+ userInputMatcher := buildDictMatcher("user_inputs", buildRankedDict(userInputs))
+ matches = userInputMatcher(password)
+ }
+
+ for _, matcher := range MATCHERS {
+ shouldBeFiltered := false
+ for i := range filters {
+ if filters[i](matcher) {
+ shouldBeFiltered = true
+ break
+ }
+ }
+ if !shouldBeFiltered {
+ matches = append(matches, matcher.MatchingFunc(password)...)
+ }
+ }
+ sort.Sort(match.Matches(matches))
+ return matches
+}
+
+func loadFrequencyList() {
+
+ for n, list := range frequency.FrequencyLists {
+ DICTIONARY_MATCHERS = append(DICTIONARY_MATCHERS, match.Matcher{MatchingFunc: buildDictMatcher(n, buildRankedDict(list.List)), ID: n})
+ }
+
+ L33T_TABLE = adjacency.AdjacencyGph["l33t"]
+
+ ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["qwerty"])
+ ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["dvorak"])
+ ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["keypad"])
+ ADJACENCY_GRAPHS = append(ADJACENCY_GRAPHS, adjacency.AdjacencyGph["macKeypad"])
+
+ //l33tFilePath, _ := filepath.Abs("adjacency/L33t.json")
+ //L33T_TABLE = adjacency.GetAdjancencyGraphFromFile(l33tFilePath, "l33t")
+
+ SEQUENCES = make(map[string]string)
+ SEQUENCES["lower"] = "abcdefghijklmnopqrstuvwxyz"
+ SEQUENCES["upper"] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ SEQUENCES["digits"] = "0123456789"
+
+ MATCHERS = append(MATCHERS, DICTIONARY_MATCHERS...)
+ MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: spatialMatch, ID: SPATIAL_MATCHER_NAME})
+ MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: repeatMatch, ID: REPEAT_MATCHER_NAME})
+ MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: sequenceMatch, ID: SEQUENCE_MATCHER_NAME})
+ MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: l33tMatch, ID: L33T_MATCHER_NAME})
+ MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: dateSepMatcher, ID: DATESEP_MATCHER_NAME})
+ MATCHERS = append(MATCHERS, match.Matcher{MatchingFunc: dateWithoutSepMatch, ID: DATEWITHOUTSEP_MATCHER_NAME})
+
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go
new file mode 100644
index 00000000000..97bd33b4c0b
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/repeatMatch.go
@@ -0,0 +1,66 @@
+package matching
+
+import (
+ "strings"
+
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+)
+
+const REPEAT_MATCHER_NAME = "REPEAT"
+
+func FilterRepeatMatcher(m match.Matcher) bool {
+ return m.ID == REPEAT_MATCHER_NAME
+}
+
+func repeatMatch(password string) []match.Match {
+ var matches []match.Match
+
+ //Loop through password. if current == prev currentStreak++ else if currentStreak > 2 {buildMatch; currentStreak = 1} prev = current
+ var current, prev string
+ currentStreak := 1
+ var i int
+ var char rune
+ for i, char = range password {
+ current = string(char)
+ if i == 0 {
+ prev = current
+ continue
+ }
+
+ if strings.ToLower(current) == strings.ToLower(prev) {
+ currentStreak++
+
+ } else if currentStreak > 2 {
+ iPos := i - currentStreak
+ jPos := i - 1
+ matchRepeat := match.Match{
+ Pattern: "repeat",
+ I: iPos,
+ J: jPos,
+ Token: password[iPos : jPos+1],
+ DictionaryName: prev}
+ matchRepeat.Entropy = entropy.RepeatEntropy(matchRepeat)
+ matches = append(matches, matchRepeat)
+ currentStreak = 1
+ } else {
+ currentStreak = 1
+ }
+
+ prev = current
+ }
+
+ if currentStreak > 2 {
+ iPos := i - currentStreak + 1
+ jPos := i
+ matchRepeat := match.Match{
+ Pattern: "repeat",
+ I: iPos,
+ J: jPos,
+ Token: password[iPos : jPos+1],
+ DictionaryName: prev}
+ matchRepeat.Entropy = entropy.RepeatEntropy(matchRepeat)
+ matches = append(matches, matchRepeat)
+ }
+ return matches
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go
new file mode 100644
index 00000000000..89f15265926
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/sequenceMatch.go
@@ -0,0 +1,75 @@
+package matching
+
+import (
+ "strings"
+
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+)
+
+const SEQUENCE_MATCHER_NAME = "SEQ"
+
+func FilterSequenceMatcher(m match.Matcher) bool {
+ return m.ID == SEQUENCE_MATCHER_NAME
+}
+
+func sequenceMatch(password string) []match.Match {
+ var matches []match.Match
+ for i := 0; i < len(password); {
+ j := i + 1
+ var seq string
+ var seqName string
+ seqDirection := 0
+ for seqCandidateName, seqCandidate := range SEQUENCES {
+ iN := strings.Index(seqCandidate, string(password[i]))
+ var jN int
+ if j < len(password) {
+ jN = strings.Index(seqCandidate, string(password[j]))
+ } else {
+ jN = -1
+ }
+
+ if iN > -1 && jN > -1 {
+ direction := jN - iN
+ if direction == 1 || direction == -1 {
+ seq = seqCandidate
+ seqName = seqCandidateName
+ seqDirection = direction
+ break
+ }
+ }
+
+ }
+
+ if seq != "" {
+ for {
+ var prevN, curN int
+ if j < len(password) {
+ prevChar, curChar := password[j-1], password[j]
+ prevN, curN = strings.Index(seq, string(prevChar)), strings.Index(seq, string(curChar))
+ }
+
+ if j == len(password) || curN-prevN != seqDirection {
+ if j-i > 2 {
+ matchSequence := match.Match{
+ Pattern: "sequence",
+ I: i,
+ J: j - 1,
+ Token: password[i:j],
+ DictionaryName: seqName,
+ }
+
+ matchSequence.Entropy = entropy.SequenceEntropy(matchSequence, len(seq), (seqDirection == 1))
+ matches = append(matches, matchSequence)
+ }
+ break
+ } else {
+ j += 1
+ }
+
+ }
+ }
+ i = j
+ }
+ return matches
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go b/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go
new file mode 100644
index 00000000000..145cfb8b1c3
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/matching/spatialMatch.go
@@ -0,0 +1,87 @@
+package matching
+
+import (
+ "strings"
+
+ "github.com/nbutton23/zxcvbn-go/adjacency"
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+)
+
+const SPATIAL_MATCHER_NAME = "SPATIAL"
+
+func FilterSpatialMatcher(m match.Matcher) bool {
+ return m.ID == SPATIAL_MATCHER_NAME
+}
+
+func spatialMatch(password string) (matches []match.Match) {
+ for _, graph := range ADJACENCY_GRAPHS {
+ if graph.Graph != nil {
+ matches = append(matches, spatialMatchHelper(password, graph)...)
+ }
+ }
+ return matches
+}
+
+func spatialMatchHelper(password string, graph adjacency.AdjacencyGraph) (matches []match.Match) {
+
+ for i := 0; i < len(password)-1; {
+ j := i + 1
+ lastDirection := -99 //an int that it should never be!
+ turns := 0
+ shiftedCount := 0
+
+ for {
+ prevChar := password[j-1]
+ found := false
+ foundDirection := -1
+ curDirection := -1
+ //My graphs seem to be wrong. . . and where the hell is qwerty
+ adjacents := graph.Graph[string(prevChar)]
+ //Consider growing pattern by one character if j hasn't gone over the edge
+ if j < len(password) {
+ curChar := password[j]
+ for _, adj := range adjacents {
+ curDirection += 1
+
+ if strings.Index(adj, string(curChar)) != -1 {
+ found = true
+ foundDirection = curDirection
+
+ if strings.Index(adj, string(curChar)) == 1 {
+ //index 1 in the adjacency means the key is shifted, 0 means unshifted: A vs a, % vs 5, etc.
+ //for example, 'q' is adjacent to the entry '2@'. @ is shifted w/ index 1, 2 is unshifted.
+ shiftedCount += 1
+ }
+
+ if lastDirection != foundDirection {
+ //adding a turn is correct even in the initial case when last_direction is null:
+ //every spatial pattern starts with a turn.
+ turns += 1
+ lastDirection = foundDirection
+ }
+ break
+ }
+ }
+ }
+
+ //if the current pattern continued, extend j and try to grow again
+ if found {
+ j += 1
+ } else {
+ //otherwise push the pattern discovered so far, if any...
+ //don't consider length 1 or 2 chains.
+ if j-i > 2 {
+ matchSpc := match.Match{Pattern: "spatial", I: i, J: j - 1, Token: password[i:j], DictionaryName: graph.Name}
+ matchSpc.Entropy = entropy.SpatialEntropy(matchSpc, turns, shiftedCount)
+ matches = append(matches, matchSpc)
+ }
+ //. . . and then start a new search from the rest of the password
+ i = j
+ break
+ }
+ }
+
+ }
+ return matches
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go b/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go
new file mode 100644
index 00000000000..0456fd7c206
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/scoring/scoring.go
@@ -0,0 +1,180 @@
+package scoring
+
+import (
+ "fmt"
+ "github.com/nbutton23/zxcvbn-go/entropy"
+ "github.com/nbutton23/zxcvbn-go/match"
+ "github.com/nbutton23/zxcvbn-go/utils/math"
+ "math"
+ "sort"
+)
+
+const (
+ START_UPPER string = `^[A-Z][^A-Z]+$`
+ END_UPPER string = `^[^A-Z]+[A-Z]$'`
+ ALL_UPPER string = `^[A-Z]+$`
+
+ //for a hash function like bcrypt/scrypt/PBKDF2, 10ms per guess is a safe lower bound.
+ //(usually a guess would take longer -- this assumes fast hardware and a small work factor.)
+ //adjust for your site accordingly if you use another hash function, possibly by
+ //several orders of magnitude!
+ SINGLE_GUESS float64 = 0.010
+ NUM_ATTACKERS float64 = 100 //Cores used to make guesses
+ SECONDS_PER_GUESS float64 = SINGLE_GUESS / NUM_ATTACKERS
+)
+
+type MinEntropyMatch struct {
+ Password string
+ Entropy float64
+ MatchSequence []match.Match
+ CrackTime float64
+ CrackTimeDisplay string
+ Score int
+ CalcTime float64
+}
+
+/*
+Returns minimum entropy
+
+ Takes a list of overlapping matches, returns the non-overlapping sublist with
+ minimum entropy. O(nm) dp alg for length-n password with m candidate matches.
+*/
+func MinimumEntropyMatchSequence(password string, matches []match.Match) MinEntropyMatch {
+ bruteforceCardinality := float64(entropy.CalcBruteForceCardinality(password))
+ upToK := make([]float64, len(password))
+ backPointers := make([]match.Match, len(password))
+
+ for k := 0; k < len(password); k++ {
+ upToK[k] = get(upToK, k-1) + math.Log2(bruteforceCardinality)
+
+ for _, match := range matches {
+ if match.J != k {
+ continue
+ }
+
+ i, j := match.I, match.J
+ //see if best entropy up to i-1 + entropy of match is less that current min at j
+ upTo := get(upToK, i-1)
+ candidateEntropy := upTo + match.Entropy
+
+ if candidateEntropy < upToK[j] {
+ upToK[j] = candidateEntropy
+ match.Entropy = candidateEntropy
+ backPointers[j] = match
+ }
+ }
+ }
+
+ //walk backwards and decode the best sequence
+ var matchSequence []match.Match
+ passwordLen := len(password)
+ passwordLen--
+ for k := passwordLen; k >= 0; {
+ match := backPointers[k]
+ if match.Pattern != "" {
+ matchSequence = append(matchSequence, match)
+ k = match.I - 1
+
+ } else {
+ k--
+ }
+
+ }
+ sort.Sort(match.Matches(matchSequence))
+
+ makeBruteForceMatch := func(i, j int) match.Match {
+ return match.Match{Pattern: "bruteforce",
+ I: i,
+ J: j,
+ Token: password[i : j+1],
+ Entropy: math.Log2(math.Pow(bruteforceCardinality, float64(j-i)))}
+
+ }
+
+ k := 0
+ var matchSequenceCopy []match.Match
+ for _, match := range matchSequence {
+ i, j := match.I, match.J
+ if i-k > 0 {
+ matchSequenceCopy = append(matchSequenceCopy, makeBruteForceMatch(k, i-1))
+ }
+ k = j + 1
+ matchSequenceCopy = append(matchSequenceCopy, match)
+ }
+
+ if k < len(password) {
+ matchSequenceCopy = append(matchSequenceCopy, makeBruteForceMatch(k, len(password)-1))
+ }
+ var minEntropy float64
+ if len(password) == 0 {
+ minEntropy = float64(0)
+ } else {
+ minEntropy = upToK[len(password)-1]
+ }
+
+ crackTime := roundToXDigits(entropyToCrackTime(minEntropy), 3)
+ return MinEntropyMatch{Password: password,
+ Entropy: roundToXDigits(minEntropy, 3),
+ MatchSequence: matchSequenceCopy,
+ CrackTime: crackTime,
+ CrackTimeDisplay: displayTime(crackTime),
+ Score: crackTimeToScore(crackTime)}
+
+}
+func get(a []float64, i int) float64 {
+ if i < 0 || i >= len(a) {
+ return float64(0)
+ }
+
+ return a[i]
+}
+
+func entropyToCrackTime(entropy float64) float64 {
+ crackTime := (0.5 * math.Pow(float64(2), entropy)) * SECONDS_PER_GUESS
+
+ return crackTime
+}
+
+func roundToXDigits(number float64, digits int) float64 {
+ return zxcvbn_math.Round(number, .5, digits)
+}
+
+func displayTime(seconds float64) string {
+ formater := "%.1f %s"
+ minute := float64(60)
+ hour := minute * float64(60)
+ day := hour * float64(24)
+ month := day * float64(31)
+ year := month * float64(12)
+ century := year * float64(100)
+
+ if seconds < minute {
+ return "instant"
+ } else if seconds < hour {
+ return fmt.Sprintf(formater, (1 + math.Ceil(seconds/minute)), "minutes")
+ } else if seconds < day {
+ return fmt.Sprintf(formater, (1 + math.Ceil(seconds/hour)), "hours")
+ } else if seconds < month {
+ return fmt.Sprintf(formater, (1 + math.Ceil(seconds/day)), "days")
+ } else if seconds < year {
+ return fmt.Sprintf(formater, (1 + math.Ceil(seconds/month)), "months")
+ } else if seconds < century {
+ return fmt.Sprintf(formater, (1 + math.Ceil(seconds/century)), "years")
+ } else {
+ return "centuries"
+ }
+}
+
+func crackTimeToScore(seconds float64) int {
+ if seconds < math.Pow(10, 2) {
+ return 0
+ } else if seconds < math.Pow(10, 4) {
+ return 1
+ } else if seconds < math.Pow(10, 6) {
+ return 2
+ } else if seconds < math.Pow(10, 8) {
+ return 3
+ }
+
+ return 4
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go b/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go
new file mode 100644
index 00000000000..d885479c322
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/utils/math/mathutils.go
@@ -0,0 +1,40 @@
+package zxcvbn_math
+
+import "math"
+
+/**
+I am surprised that I have to define these. . . Maybe i just didn't look hard enough for a lib.
+*/
+
+//http://blog.plover.com/math/choose.html
+func NChoseK(n, k float64) float64 {
+ if k > n {
+ return 0
+ } else if k == 0 {
+ return 1
+ }
+
+ var r float64 = 1
+
+ for d := float64(1); d <= k; d++ {
+ r *= n
+ r /= d
+ n--
+ }
+
+ return r
+}
+
+func Round(val float64, roundOn float64, places int) (newVal float64) {
+ var round float64
+ pow := math.Pow(10, float64(places))
+ digit := pow * val
+ _, div := math.Modf(digit)
+ if div >= roundOn {
+ round = math.Ceil(digit)
+ } else {
+ round = math.Floor(digit)
+ }
+ newVal = round / pow
+ return
+}
diff --git a/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go b/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go
new file mode 100644
index 00000000000..086270c68bf
--- /dev/null
+++ b/vendor/github.com/nbutton23/zxcvbn-go/zxcvbn.go
@@ -0,0 +1,21 @@
+package zxcvbn
+
+import (
+ "time"
+
+ "github.com/nbutton23/zxcvbn-go/match"
+ "github.com/nbutton23/zxcvbn-go/matching"
+ "github.com/nbutton23/zxcvbn-go/scoring"
+ "github.com/nbutton23/zxcvbn-go/utils/math"
+)
+
+func PasswordStrength(password string, userInputs []string, filters ...func(match.Matcher) bool) scoring.MinEntropyMatch {
+ start := time.Now()
+ matches := matching.Omnimatch(password, userInputs, filters...)
+ result := scoring.MinimumEntropyMatchSequence(password, matches)
+ end := time.Now()
+
+ calcTime := end.Nanosecond() - start.Nanosecond()
+ result.CalcTime = zxcvbn_math.Round(float64(calcTime)*time.Nanosecond.Seconds(), .5, 3)
+ return result
+}
diff --git a/vendor/github.com/pelletier/go-toml/.gitignore b/vendor/github.com/pelletier/go-toml/.gitignore
new file mode 100644
index 00000000000..99e38bbc53f
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/.gitignore
@@ -0,0 +1,2 @@
+test_program/test_program_bin
+fuzz/
diff --git a/vendor/github.com/pelletier/go-toml/.travis.yml b/vendor/github.com/pelletier/go-toml/.travis.yml
new file mode 100644
index 00000000000..ab2775d7d1d
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/.travis.yml
@@ -0,0 +1,22 @@
+sudo: false
+language: go
+go:
+ - 1.8.5
+ - 1.9.2
+ - tip
+matrix:
+ allow_failures:
+ - go: tip
+ fast_finish: true
+script:
+ - if [ -n "$(go fmt ./...)" ]; then exit 1; fi
+ - ./test.sh
+ - ./benchmark.sh $TRAVIS_BRANCH https://github.com/$TRAVIS_REPO_SLUG.git
+before_install:
+ - go get github.com/axw/gocov/gocov
+ - go get github.com/mattn/goveralls
+ - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi
+branches:
+ only: [master]
+after_success:
+ - $HOME/gopath/bin/goveralls -service=travis-ci -coverprofile=coverage.out -repotoken $COVERALLS_TOKEN
diff --git a/vendor/github.com/pelletier/go-toml/LICENSE b/vendor/github.com/pelletier/go-toml/LICENSE
new file mode 100644
index 00000000000..583bdae6282
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2013 - 2017 Thomas Pelletier, Eric Anderton
+
+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/pelletier/go-toml/README.md b/vendor/github.com/pelletier/go-toml/README.md
new file mode 100644
index 00000000000..0d357acf35d
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/README.md
@@ -0,0 +1,131 @@
+# go-toml
+
+Go library for the [TOML](https://github.com/mojombo/toml) format.
+
+This library supports TOML version
+[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)
+
+[![GoDoc](https://godoc.org/github.com/pelletier/go-toml?status.svg)](http://godoc.org/github.com/pelletier/go-toml)
+[![license](https://img.shields.io/github/license/pelletier/go-toml.svg)](https://github.com/pelletier/go-toml/blob/master/LICENSE)
+[![Build Status](https://travis-ci.org/pelletier/go-toml.svg?branch=master)](https://travis-ci.org/pelletier/go-toml)
+[![Coverage Status](https://coveralls.io/repos/github/pelletier/go-toml/badge.svg?branch=master)](https://coveralls.io/github/pelletier/go-toml?branch=master)
+[![Go Report Card](https://goreportcard.com/badge/github.com/pelletier/go-toml)](https://goreportcard.com/report/github.com/pelletier/go-toml)
+
+## Features
+
+Go-toml provides the following features for using data parsed from TOML documents:
+
+* Load TOML documents from files and string data
+* Easily navigate TOML structure using Tree
+* Mashaling and unmarshaling to and from data structures
+* Line & column position data for all parsed elements
+* [Query support similar to JSON-Path](query/)
+* Syntax errors contain line and column numbers
+
+## Import
+
+```go
+import "github.com/pelletier/go-toml"
+```
+
+## Usage example
+
+Read a TOML document:
+
+```go
+config, _ := toml.Load(`
+[postgres]
+user = "pelletier"
+password = "mypassword"`)
+// retrieve data directly
+user := config.Get("postgres.user").(string)
+
+// or using an intermediate object
+postgresConfig := config.Get("postgres").(*toml.Tree)
+password := postgresConfig.Get("password").(string)
+```
+
+Or use Unmarshal:
+
+```go
+type Postgres struct {
+ User string
+ Password string
+}
+type Config struct {
+ Postgres Postgres
+}
+
+doc := []byte(`
+[Postgres]
+User = "pelletier"
+Password = "mypassword"`)
+
+config := Config{}
+toml.Unmarshal(doc, &config)
+fmt.Println("user=", config.Postgres.User)
+```
+
+Or use a query:
+
+```go
+// use a query to gather elements without walking the tree
+q, _ := query.Compile("$..[user,password]")
+results := q.Execute(config)
+for ii, item := range results.Values() {
+ fmt.Println("Query result %d: %v", ii, item)
+}
+```
+
+## Documentation
+
+The documentation and additional examples are available at
+[godoc.org](http://godoc.org/github.com/pelletier/go-toml).
+
+## Tools
+
+Go-toml provides two handy command line tools:
+
+* `tomll`: Reads TOML files and lint them.
+
+ ```
+ go install github.com/pelletier/go-toml/cmd/tomll
+ tomll --help
+ ```
+* `tomljson`: Reads a TOML file and outputs its JSON representation.
+
+ ```
+ go install github.com/pelletier/go-toml/cmd/tomljson
+ tomljson --help
+ ```
+
+## Contribute
+
+Feel free to report bugs and patches using GitHub's pull requests system on
+[pelletier/go-toml](https://github.com/pelletier/go-toml). Any feedback would be
+much appreciated!
+
+### Run tests
+
+You have to make sure two kind of tests run:
+
+1. The Go unit tests
+2. The TOML examples base
+
+You can run both of them using `./test.sh`.
+
+### Fuzzing
+
+The script `./fuzz.sh` is available to
+run [go-fuzz](https://github.com/dvyukov/go-fuzz) on go-toml.
+
+## Versioning
+
+Go-toml follows [Semantic Versioning](http://semver.org/). The supported version
+of [TOML](https://github.com/toml-lang/toml) is indicated at the beginning of
+this document. The last two major versions of Go are supported
+(see [Go Release Policy](https://golang.org/doc/devel/release.html#policy)).
+
+## License
+
+The MIT License (MIT). Read [LICENSE](LICENSE).
diff --git a/vendor/github.com/pelletier/go-toml/benchmark.json b/vendor/github.com/pelletier/go-toml/benchmark.json
new file mode 100644
index 00000000000..86f99c6a877
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/benchmark.json
@@ -0,0 +1,164 @@
+{
+ "array": {
+ "key1": [
+ 1,
+ 2,
+ 3
+ ],
+ "key2": [
+ "red",
+ "yellow",
+ "green"
+ ],
+ "key3": [
+ [
+ 1,
+ 2
+ ],
+ [
+ 3,
+ 4,
+ 5
+ ]
+ ],
+ "key4": [
+ [
+ 1,
+ 2
+ ],
+ [
+ "a",
+ "b",
+ "c"
+ ]
+ ],
+ "key5": [
+ 1,
+ 2,
+ 3
+ ],
+ "key6": [
+ 1,
+ 2
+ ]
+ },
+ "boolean": {
+ "False": false,
+ "True": true
+ },
+ "datetime": {
+ "key1": "1979-05-27T07:32:00Z",
+ "key2": "1979-05-27T00:32:00-07:00",
+ "key3": "1979-05-27T00:32:00.999999-07:00"
+ },
+ "float": {
+ "both": {
+ "key": 6.626e-34
+ },
+ "exponent": {
+ "key1": 5e+22,
+ "key2": 1000000,
+ "key3": -0.02
+ },
+ "fractional": {
+ "key1": 1,
+ "key2": 3.1415,
+ "key3": -0.01
+ },
+ "underscores": {
+ "key1": 9224617.445991227,
+ "key2": 1e+100
+ }
+ },
+ "fruit": [{
+ "name": "apple",
+ "physical": {
+ "color": "red",
+ "shape": "round"
+ },
+ "variety": [{
+ "name": "red delicious"
+ },
+ {
+ "name": "granny smith"
+ }
+ ]
+ },
+ {
+ "name": "banana",
+ "variety": [{
+ "name": "plantain"
+ }]
+ }
+ ],
+ "integer": {
+ "key1": 99,
+ "key2": 42,
+ "key3": 0,
+ "key4": -17,
+ "underscores": {
+ "key1": 1000,
+ "key2": 5349221,
+ "key3": 12345
+ }
+ },
+ "products": [{
+ "name": "Hammer",
+ "sku": 738594937
+ },
+ {},
+ {
+ "color": "gray",
+ "name": "Nail",
+ "sku": 284758393
+ }
+ ],
+ "string": {
+ "basic": {
+ "basic": "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF."
+ },
+ "literal": {
+ "multiline": {
+ "lines": "The first newline is\ntrimmed in raw strings.\n All other whitespace\n is preserved.\n",
+ "regex2": "I [dw]on't need \\d{2} apples"
+ },
+ "quoted": "Tom \"Dubs\" Preston-Werner",
+ "regex": "\u003c\\i\\c*\\s*\u003e",
+ "winpath": "C:\\Users\\nodejs\\templates",
+ "winpath2": "\\\\ServerX\\admin$\\system32\\"
+ },
+ "multiline": {
+ "continued": {
+ "key1": "The quick brown fox jumps over the lazy dog.",
+ "key2": "The quick brown fox jumps over the lazy dog.",
+ "key3": "The quick brown fox jumps over the lazy dog."
+ },
+ "key1": "One\nTwo",
+ "key2": "One\nTwo",
+ "key3": "One\nTwo"
+ }
+ },
+ "table": {
+ "inline": {
+ "name": {
+ "first": "Tom",
+ "last": "Preston-Werner"
+ },
+ "point": {
+ "x": 1,
+ "y": 2
+ }
+ },
+ "key": "value",
+ "subtable": {
+ "key": "another value"
+ }
+ },
+ "x": {
+ "y": {
+ "z": {
+ "w": {}
+ }
+ }
+ }
+}
diff --git a/vendor/github.com/pelletier/go-toml/benchmark.sh b/vendor/github.com/pelletier/go-toml/benchmark.sh
new file mode 100644
index 00000000000..8b8bb528e75
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/benchmark.sh
@@ -0,0 +1,32 @@
+#!/bin/bash
+
+set -e
+
+reference_ref=${1:-master}
+reference_git=${2:-.}
+
+if ! `hash benchstat 2>/dev/null`; then
+ echo "Installing benchstat"
+ go get golang.org/x/perf/cmd/benchstat
+ go install golang.org/x/perf/cmd/benchstat
+fi
+
+tempdir=`mktemp -d /tmp/go-toml-benchmark-XXXXXX`
+ref_tempdir="${tempdir}/ref"
+ref_benchmark="${ref_tempdir}/benchmark-`echo -n ${reference_ref}|tr -s '/' '-'`.txt"
+local_benchmark="`pwd`/benchmark-local.txt"
+
+echo "=== ${reference_ref} (${ref_tempdir})"
+git clone ${reference_git} ${ref_tempdir} >/dev/null 2>/dev/null
+pushd ${ref_tempdir} >/dev/null
+git checkout ${reference_ref} >/dev/null 2>/dev/null
+go test -bench=. -benchmem | tee ${ref_benchmark}
+popd >/dev/null
+
+echo ""
+echo "=== local"
+go test -bench=. -benchmem | tee ${local_benchmark}
+
+echo ""
+echo "=== diff"
+benchstat -delta-test=none ${ref_benchmark} ${local_benchmark}
\ No newline at end of file
diff --git a/vendor/github.com/pelletier/go-toml/benchmark.toml b/vendor/github.com/pelletier/go-toml/benchmark.toml
new file mode 100644
index 00000000000..dfd77e09622
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/benchmark.toml
@@ -0,0 +1,244 @@
+################################################################################
+## Comment
+
+# Speak your mind with the hash symbol. They go from the symbol to the end of
+# the line.
+
+
+################################################################################
+## Table
+
+# Tables (also known as hash tables or dictionaries) are collections of
+# key/value pairs. They appear in square brackets on a line by themselves.
+
+[table]
+
+key = "value" # Yeah, you can do this.
+
+# Nested tables are denoted by table names with dots in them. Name your tables
+# whatever crap you please, just don't use #, ., [ or ].
+
+[table.subtable]
+
+key = "another value"
+
+# You don't need to specify all the super-tables if you don't want to. TOML
+# knows how to do it for you.
+
+# [x] you
+# [x.y] don't
+# [x.y.z] need these
+[x.y.z.w] # for this to work
+
+
+################################################################################
+## Inline Table
+
+# Inline tables provide a more compact syntax for expressing tables. They are
+# especially useful for grouped data that can otherwise quickly become verbose.
+# Inline tables are enclosed in curly braces `{` and `}`. No newlines are
+# allowed between the curly braces unless they are valid within a value.
+
+[table.inline]
+
+name = { first = "Tom", last = "Preston-Werner" }
+point = { x = 1, y = 2 }
+
+
+################################################################################
+## String
+
+# There are four ways to express strings: basic, multi-line basic, literal, and
+# multi-line literal. All strings must contain only valid UTF-8 characters.
+
+[string.basic]
+
+basic = "I'm a string. \"You can quote me\". Name\tJos\u00E9\nLocation\tSF."
+
+[string.multiline]
+
+# The following strings are byte-for-byte equivalent:
+key1 = "One\nTwo"
+key2 = """One\nTwo"""
+key3 = """
+One
+Two"""
+
+[string.multiline.continued]
+
+# The following strings are byte-for-byte equivalent:
+key1 = "The quick brown fox jumps over the lazy dog."
+
+key2 = """
+The quick brown \
+
+
+ fox jumps over \
+ the lazy dog."""
+
+key3 = """\
+ The quick brown \
+ fox jumps over \
+ the lazy dog.\
+ """
+
+[string.literal]
+
+# What you see is what you get.
+winpath = 'C:\Users\nodejs\templates'
+winpath2 = '\\ServerX\admin$\system32\'
+quoted = 'Tom "Dubs" Preston-Werner'
+regex = '<\i\c*\s*>'
+
+
+[string.literal.multiline]
+
+regex2 = '''I [dw]on't need \d{2} apples'''
+lines = '''
+The first newline is
+trimmed in raw strings.
+ All other whitespace
+ is preserved.
+'''
+
+
+################################################################################
+## Integer
+
+# Integers are whole numbers. Positive numbers may be prefixed with a plus sign.
+# Negative numbers are prefixed with a minus sign.
+
+[integer]
+
+key1 = +99
+key2 = 42
+key3 = 0
+key4 = -17
+
+[integer.underscores]
+
+# For large numbers, you may use underscores to enhance readability. Each
+# underscore must be surrounded by at least one digit.
+key1 = 1_000
+key2 = 5_349_221
+key3 = 1_2_3_4_5 # valid but inadvisable
+
+
+################################################################################
+## Float
+
+# A float consists of an integer part (which may be prefixed with a plus or
+# minus sign) followed by a fractional part and/or an exponent part.
+
+[float.fractional]
+
+key1 = +1.0
+key2 = 3.1415
+key3 = -0.01
+
+[float.exponent]
+
+key1 = 5e+22
+key2 = 1e6
+key3 = -2E-2
+
+[float.both]
+
+key = 6.626e-34
+
+[float.underscores]
+
+key1 = 9_224_617.445_991_228_313
+key2 = 1e1_00
+
+
+################################################################################
+## Boolean
+
+# Booleans are just the tokens you're used to. Always lowercase.
+
+[boolean]
+
+True = true
+False = false
+
+
+################################################################################
+## Datetime
+
+# Datetimes are RFC 3339 dates.
+
+[datetime]
+
+key1 = 1979-05-27T07:32:00Z
+key2 = 1979-05-27T00:32:00-07:00
+key3 = 1979-05-27T00:32:00.999999-07:00
+
+
+################################################################################
+## Array
+
+# Arrays are square brackets with other primitives inside. Whitespace is
+# ignored. Elements are separated by commas. Data types may not be mixed.
+
+[array]
+
+key1 = [ 1, 2, 3 ]
+key2 = [ "red", "yellow", "green" ]
+key3 = [ [ 1, 2 ], [3, 4, 5] ]
+#key4 = [ [ 1, 2 ], ["a", "b", "c"] ] # this is ok
+
+# Arrays can also be multiline. So in addition to ignoring whitespace, arrays
+# also ignore newlines between the brackets. Terminating commas are ok before
+# the closing bracket.
+
+key5 = [
+ 1, 2, 3
+]
+key6 = [
+ 1,
+ 2, # this is ok
+]
+
+
+################################################################################
+## Array of Tables
+
+# These can be expressed by using a table name in double brackets. Each table
+# with the same double bracketed name will be an element in the array. The
+# tables are inserted in the order encountered.
+
+[[products]]
+
+name = "Hammer"
+sku = 738594937
+
+[[products]]
+
+[[products]]
+
+name = "Nail"
+sku = 284758393
+color = "gray"
+
+
+# You can create nested arrays of tables as well.
+
+[[fruit]]
+ name = "apple"
+
+ [fruit.physical]
+ color = "red"
+ shape = "round"
+
+ [[fruit.variety]]
+ name = "red delicious"
+
+ [[fruit.variety]]
+ name = "granny smith"
+
+[[fruit]]
+ name = "banana"
+
+ [[fruit.variety]]
+ name = "plantain"
diff --git a/vendor/github.com/pelletier/go-toml/benchmark.yml b/vendor/github.com/pelletier/go-toml/benchmark.yml
new file mode 100644
index 00000000000..0bd19f08a69
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/benchmark.yml
@@ -0,0 +1,121 @@
+---
+array:
+ key1:
+ - 1
+ - 2
+ - 3
+ key2:
+ - red
+ - yellow
+ - green
+ key3:
+ - - 1
+ - 2
+ - - 3
+ - 4
+ - 5
+ key4:
+ - - 1
+ - 2
+ - - a
+ - b
+ - c
+ key5:
+ - 1
+ - 2
+ - 3
+ key6:
+ - 1
+ - 2
+boolean:
+ 'False': false
+ 'True': true
+datetime:
+ key1: '1979-05-27T07:32:00Z'
+ key2: '1979-05-27T00:32:00-07:00'
+ key3: '1979-05-27T00:32:00.999999-07:00'
+float:
+ both:
+ key: 6.626e-34
+ exponent:
+ key1: 5.0e+22
+ key2: 1000000
+ key3: -0.02
+ fractional:
+ key1: 1
+ key2: 3.1415
+ key3: -0.01
+ underscores:
+ key1: 9224617.445991227
+ key2: 1.0e+100
+fruit:
+- name: apple
+ physical:
+ color: red
+ shape: round
+ variety:
+ - name: red delicious
+ - name: granny smith
+- name: banana
+ variety:
+ - name: plantain
+integer:
+ key1: 99
+ key2: 42
+ key3: 0
+ key4: -17
+ underscores:
+ key1: 1000
+ key2: 5349221
+ key3: 12345
+products:
+- name: Hammer
+ sku: 738594937
+- {}
+- color: gray
+ name: Nail
+ sku: 284758393
+string:
+ basic:
+ basic: "I'm a string. \"You can quote me\". Name\tJosé\nLocation\tSF."
+ literal:
+ multiline:
+ lines: |
+ The first newline is
+ trimmed in raw strings.
+ All other whitespace
+ is preserved.
+ regex2: I [dw]on't need \d{2} apples
+ quoted: Tom "Dubs" Preston-Werner
+ regex: "<\\i\\c*\\s*>"
+ winpath: C:\Users\nodejs\templates
+ winpath2: "\\\\ServerX\\admin$\\system32\\"
+ multiline:
+ continued:
+ key1: The quick brown fox jumps over the lazy dog.
+ key2: The quick brown fox jumps over the lazy dog.
+ key3: The quick brown fox jumps over the lazy dog.
+ key1: |-
+ One
+ Two
+ key2: |-
+ One
+ Two
+ key3: |-
+ One
+ Two
+table:
+ inline:
+ name:
+ first: Tom
+ last: Preston-Werner
+ point:
+ x: 1
+ y: 2
+ key: value
+ subtable:
+ key: another value
+x:
+ y:
+ z:
+ w: {}
diff --git a/vendor/github.com/pelletier/go-toml/doc.go b/vendor/github.com/pelletier/go-toml/doc.go
new file mode 100644
index 00000000000..d5fd98c0211
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/doc.go
@@ -0,0 +1,23 @@
+// Package toml is a TOML parser and manipulation library.
+//
+// This version supports the specification as described in
+// https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md
+//
+// Marshaling
+//
+// Go-toml can marshal and unmarshal TOML documents from and to data
+// structures.
+//
+// TOML document as a tree
+//
+// Go-toml can operate on a TOML document as a tree. Use one of the Load*
+// functions to parse TOML data and obtain a Tree instance, then one of its
+// methods to manipulate the tree.
+//
+// JSONPath-like queries
+//
+// The package github.com/pelletier/go-toml/query implements a system
+// similar to JSONPath to quickly retrieve elements of a TOML document using a
+// single expression. See the package documentation for more information.
+//
+package toml
diff --git a/vendor/github.com/pelletier/go-toml/example-crlf.toml b/vendor/github.com/pelletier/go-toml/example-crlf.toml
new file mode 100644
index 00000000000..12950a163d3
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/example-crlf.toml
@@ -0,0 +1,29 @@
+# This is a TOML document. Boom.
+
+title = "TOML Example"
+
+[owner]
+name = "Tom Preston-Werner"
+organization = "GitHub"
+bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
+dob = 1979-05-27T07:32:00Z # First class dates? Why not?
+
+[database]
+server = "192.168.1.1"
+ports = [ 8001, 8001, 8002 ]
+connection_max = 5000
+enabled = true
+
+[servers]
+
+ # You can indent as you please. Tabs or spaces. TOML don't care.
+ [servers.alpha]
+ ip = "10.0.0.1"
+ dc = "eqdc10"
+
+ [servers.beta]
+ ip = "10.0.0.2"
+ dc = "eqdc10"
+
+[clients]
+data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
diff --git a/vendor/github.com/pelletier/go-toml/example.toml b/vendor/github.com/pelletier/go-toml/example.toml
new file mode 100644
index 00000000000..3d902f28207
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/example.toml
@@ -0,0 +1,29 @@
+# This is a TOML document. Boom.
+
+title = "TOML Example"
+
+[owner]
+name = "Tom Preston-Werner"
+organization = "GitHub"
+bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
+dob = 1979-05-27T07:32:00Z # First class dates? Why not?
+
+[database]
+server = "192.168.1.1"
+ports = [ 8001, 8001, 8002 ]
+connection_max = 5000
+enabled = true
+
+[servers]
+
+ # You can indent as you please. Tabs or spaces. TOML don't care.
+ [servers.alpha]
+ ip = "10.0.0.1"
+ dc = "eqdc10"
+
+ [servers.beta]
+ ip = "10.0.0.2"
+ dc = "eqdc10"
+
+[clients]
+data = [ ["gamma", "delta"], [1, 2] ] # just an update to make sure parsers support it
diff --git a/vendor/github.com/pelletier/go-toml/fuzz.go b/vendor/github.com/pelletier/go-toml/fuzz.go
new file mode 100644
index 00000000000..14570c8d357
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/fuzz.go
@@ -0,0 +1,31 @@
+// +build gofuzz
+
+package toml
+
+func Fuzz(data []byte) int {
+ tree, err := LoadBytes(data)
+ if err != nil {
+ if tree != nil {
+ panic("tree must be nil if there is an error")
+ }
+ return 0
+ }
+
+ str, err := tree.ToTomlString()
+ if err != nil {
+ if str != "" {
+ panic(`str must be "" if there is an error`)
+ }
+ panic(err)
+ }
+
+ tree, err = Load(str)
+ if err != nil {
+ if tree != nil {
+ panic("tree must be nil if there is an error")
+ }
+ return 0
+ }
+
+ return 1
+}
diff --git a/vendor/github.com/pelletier/go-toml/fuzz.sh b/vendor/github.com/pelletier/go-toml/fuzz.sh
new file mode 100644
index 00000000000..3204b4c4463
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/fuzz.sh
@@ -0,0 +1,15 @@
+#! /bin/sh
+set -eu
+
+go get github.com/dvyukov/go-fuzz/go-fuzz
+go get github.com/dvyukov/go-fuzz/go-fuzz-build
+
+if [ ! -e toml-fuzz.zip ]; then
+ go-fuzz-build github.com/pelletier/go-toml
+fi
+
+rm -fr fuzz
+mkdir -p fuzz/corpus
+cp *.toml fuzz/corpus
+
+go-fuzz -bin=toml-fuzz.zip -workdir=fuzz
diff --git a/vendor/github.com/pelletier/go-toml/keysparsing.go b/vendor/github.com/pelletier/go-toml/keysparsing.go
new file mode 100644
index 00000000000..284db64678b
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/keysparsing.go
@@ -0,0 +1,85 @@
+// Parsing keys handling both bare and quoted keys.
+
+package toml
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "unicode"
+)
+
+// Convert the bare key group string to an array.
+// The input supports double quotation to allow "." inside the key name,
+// but escape sequences are not supported. Lexers must unescape them beforehand.
+func parseKey(key string) ([]string, error) {
+ groups := []string{}
+ var buffer bytes.Buffer
+ inQuotes := false
+ wasInQuotes := false
+ ignoreSpace := true
+ expectDot := false
+
+ for _, char := range key {
+ if ignoreSpace {
+ if char == ' ' {
+ continue
+ }
+ ignoreSpace = false
+ }
+ switch char {
+ case '"':
+ if inQuotes {
+ groups = append(groups, buffer.String())
+ buffer.Reset()
+ wasInQuotes = true
+ }
+ inQuotes = !inQuotes
+ expectDot = false
+ case '.':
+ if inQuotes {
+ buffer.WriteRune(char)
+ } else {
+ if !wasInQuotes {
+ if buffer.Len() == 0 {
+ return nil, errors.New("empty table key")
+ }
+ groups = append(groups, buffer.String())
+ buffer.Reset()
+ }
+ ignoreSpace = true
+ expectDot = false
+ wasInQuotes = false
+ }
+ case ' ':
+ if inQuotes {
+ buffer.WriteRune(char)
+ } else {
+ expectDot = true
+ }
+ default:
+ if !inQuotes && !isValidBareChar(char) {
+ return nil, fmt.Errorf("invalid bare character: %c", char)
+ }
+ if !inQuotes && expectDot {
+ return nil, errors.New("what?")
+ }
+ buffer.WriteRune(char)
+ expectDot = false
+ }
+ }
+ if inQuotes {
+ return nil, errors.New("mismatched quotes")
+ }
+ if buffer.Len() > 0 {
+ groups = append(groups, buffer.String())
+ }
+ if len(groups) == 0 {
+ return nil, errors.New("empty key")
+ }
+ return groups, nil
+}
+
+func isValidBareChar(r rune) bool {
+ return isAlphanumeric(r) || r == '-' || unicode.IsNumber(r)
+}
diff --git a/vendor/github.com/pelletier/go-toml/lexer.go b/vendor/github.com/pelletier/go-toml/lexer.go
new file mode 100644
index 00000000000..d11de428594
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/lexer.go
@@ -0,0 +1,750 @@
+// TOML lexer.
+//
+// Written using the principles developed by Rob Pike in
+// http://www.youtube.com/watch?v=HxaD_trXwRE
+
+package toml
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "regexp"
+ "strconv"
+ "strings"
+)
+
+var dateRegexp *regexp.Regexp
+
+// Define state functions
+type tomlLexStateFn func() tomlLexStateFn
+
+// Define lexer
+type tomlLexer struct {
+ inputIdx int
+ input []rune // Textual source
+ currentTokenStart int
+ currentTokenStop int
+ tokens []token
+ depth int
+ line int
+ col int
+ endbufferLine int
+ endbufferCol int
+}
+
+// Basic read operations on input
+
+func (l *tomlLexer) read() rune {
+ r := l.peek()
+ if r == '\n' {
+ l.endbufferLine++
+ l.endbufferCol = 1
+ } else {
+ l.endbufferCol++
+ }
+ l.inputIdx++
+ return r
+}
+
+func (l *tomlLexer) next() rune {
+ r := l.read()
+
+ if r != eof {
+ l.currentTokenStop++
+ }
+ return r
+}
+
+func (l *tomlLexer) ignore() {
+ l.currentTokenStart = l.currentTokenStop
+ l.line = l.endbufferLine
+ l.col = l.endbufferCol
+}
+
+func (l *tomlLexer) skip() {
+ l.next()
+ l.ignore()
+}
+
+func (l *tomlLexer) fastForward(n int) {
+ for i := 0; i < n; i++ {
+ l.next()
+ }
+}
+
+func (l *tomlLexer) emitWithValue(t tokenType, value string) {
+ l.tokens = append(l.tokens, token{
+ Position: Position{l.line, l.col},
+ typ: t,
+ val: value,
+ })
+ l.ignore()
+}
+
+func (l *tomlLexer) emit(t tokenType) {
+ l.emitWithValue(t, string(l.input[l.currentTokenStart:l.currentTokenStop]))
+}
+
+func (l *tomlLexer) peek() rune {
+ if l.inputIdx >= len(l.input) {
+ return eof
+ }
+ return l.input[l.inputIdx]
+}
+
+func (l *tomlLexer) peekString(size int) string {
+ maxIdx := len(l.input)
+ upperIdx := l.inputIdx + size // FIXME: potential overflow
+ if upperIdx > maxIdx {
+ upperIdx = maxIdx
+ }
+ return string(l.input[l.inputIdx:upperIdx])
+}
+
+func (l *tomlLexer) follow(next string) bool {
+ return next == l.peekString(len(next))
+}
+
+// Error management
+
+func (l *tomlLexer) errorf(format string, args ...interface{}) tomlLexStateFn {
+ l.tokens = append(l.tokens, token{
+ Position: Position{l.line, l.col},
+ typ: tokenError,
+ val: fmt.Sprintf(format, args...),
+ })
+ return nil
+}
+
+// State functions
+
+func (l *tomlLexer) lexVoid() tomlLexStateFn {
+ for {
+ next := l.peek()
+ switch next {
+ case '[':
+ return l.lexTableKey
+ case '#':
+ return l.lexComment(l.lexVoid)
+ case '=':
+ return l.lexEqual
+ case '\r':
+ fallthrough
+ case '\n':
+ l.skip()
+ continue
+ }
+
+ if isSpace(next) {
+ l.skip()
+ }
+
+ if l.depth > 0 {
+ return l.lexRvalue
+ }
+
+ if isKeyStartChar(next) {
+ return l.lexKey
+ }
+
+ if next == eof {
+ l.next()
+ break
+ }
+ }
+
+ l.emit(tokenEOF)
+ return nil
+}
+
+func (l *tomlLexer) lexRvalue() tomlLexStateFn {
+ for {
+ next := l.peek()
+ switch next {
+ case '.':
+ return l.errorf("cannot start float with a dot")
+ case '=':
+ return l.lexEqual
+ case '[':
+ l.depth++
+ return l.lexLeftBracket
+ case ']':
+ l.depth--
+ return l.lexRightBracket
+ case '{':
+ return l.lexLeftCurlyBrace
+ case '}':
+ return l.lexRightCurlyBrace
+ case '#':
+ return l.lexComment(l.lexRvalue)
+ case '"':
+ return l.lexString
+ case '\'':
+ return l.lexLiteralString
+ case ',':
+ return l.lexComma
+ case '\r':
+ fallthrough
+ case '\n':
+ l.skip()
+ if l.depth == 0 {
+ return l.lexVoid
+ }
+ return l.lexRvalue
+ case '_':
+ return l.errorf("cannot start number with underscore")
+ }
+
+ if l.follow("true") {
+ return l.lexTrue
+ }
+
+ if l.follow("false") {
+ return l.lexFalse
+ }
+
+ if l.follow("inf") {
+ return l.lexInf
+ }
+
+ if l.follow("nan") {
+ return l.lexNan
+ }
+
+ if isSpace(next) {
+ l.skip()
+ continue
+ }
+
+ if next == eof {
+ l.next()
+ break
+ }
+
+ possibleDate := l.peekString(35)
+ dateMatch := dateRegexp.FindString(possibleDate)
+ if dateMatch != "" {
+ l.fastForward(len(dateMatch))
+ return l.lexDate
+ }
+
+ if next == '+' || next == '-' || isDigit(next) {
+ return l.lexNumber
+ }
+
+ if isAlphanumeric(next) {
+ return l.lexKey
+ }
+
+ return l.errorf("no value can start with %c", next)
+ }
+
+ l.emit(tokenEOF)
+ return nil
+}
+
+func (l *tomlLexer) lexLeftCurlyBrace() tomlLexStateFn {
+ l.next()
+ l.emit(tokenLeftCurlyBrace)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexRightCurlyBrace() tomlLexStateFn {
+ l.next()
+ l.emit(tokenRightCurlyBrace)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexDate() tomlLexStateFn {
+ l.emit(tokenDate)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexTrue() tomlLexStateFn {
+ l.fastForward(4)
+ l.emit(tokenTrue)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexFalse() tomlLexStateFn {
+ l.fastForward(5)
+ l.emit(tokenFalse)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexInf() tomlLexStateFn {
+ l.fastForward(3)
+ l.emit(tokenInf)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexNan() tomlLexStateFn {
+ l.fastForward(3)
+ l.emit(tokenNan)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexEqual() tomlLexStateFn {
+ l.next()
+ l.emit(tokenEqual)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexComma() tomlLexStateFn {
+ l.next()
+ l.emit(tokenComma)
+ return l.lexRvalue
+}
+
+// Parse the key and emits its value without escape sequences.
+// bare keys, basic string keys and literal string keys are supported.
+func (l *tomlLexer) lexKey() tomlLexStateFn {
+ growingString := ""
+
+ for r := l.peek(); isKeyChar(r) || r == '\n' || r == '\r'; r = l.peek() {
+ if r == '"' {
+ l.next()
+ str, err := l.lexStringAsString(`"`, false, true)
+ if err != nil {
+ return l.errorf(err.Error())
+ }
+ growingString += str
+ l.next()
+ continue
+ } else if r == '\'' {
+ l.next()
+ str, err := l.lexLiteralStringAsString(`'`, false)
+ if err != nil {
+ return l.errorf(err.Error())
+ }
+ growingString += str
+ l.next()
+ continue
+ } else if r == '\n' {
+ return l.errorf("keys cannot contain new lines")
+ } else if isSpace(r) {
+ break
+ } else if !isValidBareChar(r) {
+ return l.errorf("keys cannot contain %c character", r)
+ }
+ growingString += string(r)
+ l.next()
+ }
+ l.emitWithValue(tokenKey, growingString)
+ return l.lexVoid
+}
+
+func (l *tomlLexer) lexComment(previousState tomlLexStateFn) tomlLexStateFn {
+ return func() tomlLexStateFn {
+ for next := l.peek(); next != '\n' && next != eof; next = l.peek() {
+ if next == '\r' && l.follow("\r\n") {
+ break
+ }
+ l.next()
+ }
+ l.ignore()
+ return previousState
+ }
+}
+
+func (l *tomlLexer) lexLeftBracket() tomlLexStateFn {
+ l.next()
+ l.emit(tokenLeftBracket)
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexLiteralStringAsString(terminator string, discardLeadingNewLine bool) (string, error) {
+ growingString := ""
+
+ if discardLeadingNewLine {
+ if l.follow("\r\n") {
+ l.skip()
+ l.skip()
+ } else if l.peek() == '\n' {
+ l.skip()
+ }
+ }
+
+ // find end of string
+ for {
+ if l.follow(terminator) {
+ return growingString, nil
+ }
+
+ next := l.peek()
+ if next == eof {
+ break
+ }
+ growingString += string(l.next())
+ }
+
+ return "", errors.New("unclosed string")
+}
+
+func (l *tomlLexer) lexLiteralString() tomlLexStateFn {
+ l.skip()
+
+ // handle special case for triple-quote
+ terminator := "'"
+ discardLeadingNewLine := false
+ if l.follow("''") {
+ l.skip()
+ l.skip()
+ terminator = "'''"
+ discardLeadingNewLine = true
+ }
+
+ str, err := l.lexLiteralStringAsString(terminator, discardLeadingNewLine)
+ if err != nil {
+ return l.errorf(err.Error())
+ }
+
+ l.emitWithValue(tokenString, str)
+ l.fastForward(len(terminator))
+ l.ignore()
+ return l.lexRvalue
+}
+
+// Lex a string and return the results as a string.
+// Terminator is the substring indicating the end of the token.
+// The resulting string does not include the terminator.
+func (l *tomlLexer) lexStringAsString(terminator string, discardLeadingNewLine, acceptNewLines bool) (string, error) {
+ growingString := ""
+
+ if discardLeadingNewLine {
+ if l.follow("\r\n") {
+ l.skip()
+ l.skip()
+ } else if l.peek() == '\n' {
+ l.skip()
+ }
+ }
+
+ for {
+ if l.follow(terminator) {
+ return growingString, nil
+ }
+
+ if l.follow("\\") {
+ l.next()
+ switch l.peek() {
+ case '\r':
+ fallthrough
+ case '\n':
+ fallthrough
+ case '\t':
+ fallthrough
+ case ' ':
+ // skip all whitespace chars following backslash
+ for strings.ContainsRune("\r\n\t ", l.peek()) {
+ l.next()
+ }
+ case '"':
+ growingString += "\""
+ l.next()
+ case 'n':
+ growingString += "\n"
+ l.next()
+ case 'b':
+ growingString += "\b"
+ l.next()
+ case 'f':
+ growingString += "\f"
+ l.next()
+ case '/':
+ growingString += "/"
+ l.next()
+ case 't':
+ growingString += "\t"
+ l.next()
+ case 'r':
+ growingString += "\r"
+ l.next()
+ case '\\':
+ growingString += "\\"
+ l.next()
+ case 'u':
+ l.next()
+ code := ""
+ for i := 0; i < 4; i++ {
+ c := l.peek()
+ if !isHexDigit(c) {
+ return "", errors.New("unfinished unicode escape")
+ }
+ l.next()
+ code = code + string(c)
+ }
+ intcode, err := strconv.ParseInt(code, 16, 32)
+ if err != nil {
+ return "", errors.New("invalid unicode escape: \\u" + code)
+ }
+ growingString += string(rune(intcode))
+ case 'U':
+ l.next()
+ code := ""
+ for i := 0; i < 8; i++ {
+ c := l.peek()
+ if !isHexDigit(c) {
+ return "", errors.New("unfinished unicode escape")
+ }
+ l.next()
+ code = code + string(c)
+ }
+ intcode, err := strconv.ParseInt(code, 16, 64)
+ if err != nil {
+ return "", errors.New("invalid unicode escape: \\U" + code)
+ }
+ growingString += string(rune(intcode))
+ default:
+ return "", errors.New("invalid escape sequence: \\" + string(l.peek()))
+ }
+ } else {
+ r := l.peek()
+
+ if 0x00 <= r && r <= 0x1F && !(acceptNewLines && (r == '\n' || r == '\r')) {
+ return "", fmt.Errorf("unescaped control character %U", r)
+ }
+ l.next()
+ growingString += string(r)
+ }
+
+ if l.peek() == eof {
+ break
+ }
+ }
+
+ return "", errors.New("unclosed string")
+}
+
+func (l *tomlLexer) lexString() tomlLexStateFn {
+ l.skip()
+
+ // handle special case for triple-quote
+ terminator := `"`
+ discardLeadingNewLine := false
+ acceptNewLines := false
+ if l.follow(`""`) {
+ l.skip()
+ l.skip()
+ terminator = `"""`
+ discardLeadingNewLine = true
+ acceptNewLines = true
+ }
+
+ str, err := l.lexStringAsString(terminator, discardLeadingNewLine, acceptNewLines)
+
+ if err != nil {
+ return l.errorf(err.Error())
+ }
+
+ l.emitWithValue(tokenString, str)
+ l.fastForward(len(terminator))
+ l.ignore()
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) lexTableKey() tomlLexStateFn {
+ l.next()
+
+ if l.peek() == '[' {
+ // token '[[' signifies an array of tables
+ l.next()
+ l.emit(tokenDoubleLeftBracket)
+ return l.lexInsideTableArrayKey
+ }
+ // vanilla table key
+ l.emit(tokenLeftBracket)
+ return l.lexInsideTableKey
+}
+
+// Parse the key till "]]", but only bare keys are supported
+func (l *tomlLexer) lexInsideTableArrayKey() tomlLexStateFn {
+ for r := l.peek(); r != eof; r = l.peek() {
+ switch r {
+ case ']':
+ if l.currentTokenStop > l.currentTokenStart {
+ l.emit(tokenKeyGroupArray)
+ }
+ l.next()
+ if l.peek() != ']' {
+ break
+ }
+ l.next()
+ l.emit(tokenDoubleRightBracket)
+ return l.lexVoid
+ case '[':
+ return l.errorf("table array key cannot contain ']'")
+ default:
+ l.next()
+ }
+ }
+ return l.errorf("unclosed table array key")
+}
+
+// Parse the key till "]" but only bare keys are supported
+func (l *tomlLexer) lexInsideTableKey() tomlLexStateFn {
+ for r := l.peek(); r != eof; r = l.peek() {
+ switch r {
+ case ']':
+ if l.currentTokenStop > l.currentTokenStart {
+ l.emit(tokenKeyGroup)
+ }
+ l.next()
+ l.emit(tokenRightBracket)
+ return l.lexVoid
+ case '[':
+ return l.errorf("table key cannot contain ']'")
+ default:
+ l.next()
+ }
+ }
+ return l.errorf("unclosed table key")
+}
+
+func (l *tomlLexer) lexRightBracket() tomlLexStateFn {
+ l.next()
+ l.emit(tokenRightBracket)
+ return l.lexRvalue
+}
+
+type validRuneFn func(r rune) bool
+
+func isValidHexRune(r rune) bool {
+ return r >= 'a' && r <= 'f' ||
+ r >= 'A' && r <= 'F' ||
+ r >= '0' && r <= '9' ||
+ r == '_'
+}
+
+func isValidOctalRune(r rune) bool {
+ return r >= '0' && r <= '7' || r == '_'
+}
+
+func isValidBinaryRune(r rune) bool {
+ return r == '0' || r == '1' || r == '_'
+}
+
+func (l *tomlLexer) lexNumber() tomlLexStateFn {
+ r := l.peek()
+
+ if r == '0' {
+ follow := l.peekString(2)
+ if len(follow) == 2 {
+ var isValidRune validRuneFn
+ switch follow[1] {
+ case 'x':
+ isValidRune = isValidHexRune
+ case 'o':
+ isValidRune = isValidOctalRune
+ case 'b':
+ isValidRune = isValidBinaryRune
+ default:
+ if follow[1] >= 'a' && follow[1] <= 'z' || follow[1] >= 'A' && follow[1] <= 'Z' {
+ return l.errorf("unknown number base: %s. possible options are x (hex) o (octal) b (binary)", string(follow[1]))
+ }
+ }
+
+ if isValidRune != nil {
+ l.next()
+ l.next()
+ digitSeen := false
+ for {
+ next := l.peek()
+ if !isValidRune(next) {
+ break
+ }
+ digitSeen = true
+ l.next()
+ }
+
+ if !digitSeen {
+ return l.errorf("number needs at least one digit")
+ }
+
+ l.emit(tokenInteger)
+
+ return l.lexRvalue
+ }
+ }
+ }
+
+ if r == '+' || r == '-' {
+ l.next()
+ if l.follow("inf") {
+ return l.lexInf
+ }
+ if l.follow("nan") {
+ return l.lexNan
+ }
+ }
+
+ pointSeen := false
+ expSeen := false
+ digitSeen := false
+ for {
+ next := l.peek()
+ if next == '.' {
+ if pointSeen {
+ return l.errorf("cannot have two dots in one float")
+ }
+ l.next()
+ if !isDigit(l.peek()) {
+ return l.errorf("float cannot end with a dot")
+ }
+ pointSeen = true
+ } else if next == 'e' || next == 'E' {
+ expSeen = true
+ l.next()
+ r := l.peek()
+ if r == '+' || r == '-' {
+ l.next()
+ }
+ } else if isDigit(next) {
+ digitSeen = true
+ l.next()
+ } else if next == '_' {
+ l.next()
+ } else {
+ break
+ }
+ if pointSeen && !digitSeen {
+ return l.errorf("cannot start float with a dot")
+ }
+ }
+
+ if !digitSeen {
+ return l.errorf("no digit in that number")
+ }
+ if pointSeen || expSeen {
+ l.emit(tokenFloat)
+ } else {
+ l.emit(tokenInteger)
+ }
+ return l.lexRvalue
+}
+
+func (l *tomlLexer) run() {
+ for state := l.lexVoid; state != nil; {
+ state = state()
+ }
+}
+
+func init() {
+ dateRegexp = regexp.MustCompile(`^\d{1,4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,9})?(Z|[+-]\d{2}:\d{2})`)
+}
+
+// Entry point
+func lexToml(inputBytes []byte) []token {
+ runes := bytes.Runes(inputBytes)
+ l := &tomlLexer{
+ input: runes,
+ tokens: make([]token, 0, 256),
+ line: 1,
+ col: 1,
+ endbufferLine: 1,
+ endbufferCol: 1,
+ }
+ l.run()
+ return l.tokens
+}
diff --git a/vendor/github.com/pelletier/go-toml/marshal.go b/vendor/github.com/pelletier/go-toml/marshal.go
new file mode 100644
index 00000000000..b5a241505bf
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/marshal.go
@@ -0,0 +1,600 @@
+package toml
+
+import (
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "reflect"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type tomlOpts struct {
+ name string
+ comment string
+ commented bool
+ include bool
+ omitempty bool
+}
+
+type encOpts struct {
+ quoteMapKeys bool
+ arraysOneElementPerLine bool
+}
+
+var encOptsDefaults = encOpts{
+ quoteMapKeys: false,
+}
+
+var timeType = reflect.TypeOf(time.Time{})
+var marshalerType = reflect.TypeOf(new(Marshaler)).Elem()
+
+// Check if the given marshall type maps to a Tree primitive
+func isPrimitive(mtype reflect.Type) bool {
+ switch mtype.Kind() {
+ case reflect.Ptr:
+ return isPrimitive(mtype.Elem())
+ case reflect.Bool:
+ return true
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return true
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return true
+ case reflect.Float32, reflect.Float64:
+ return true
+ case reflect.String:
+ return true
+ case reflect.Struct:
+ return mtype == timeType || isCustomMarshaler(mtype)
+ default:
+ return false
+ }
+}
+
+// Check if the given marshall type maps to a Tree slice
+func isTreeSlice(mtype reflect.Type) bool {
+ switch mtype.Kind() {
+ case reflect.Slice:
+ return !isOtherSlice(mtype)
+ default:
+ return false
+ }
+}
+
+// Check if the given marshall type maps to a non-Tree slice
+func isOtherSlice(mtype reflect.Type) bool {
+ switch mtype.Kind() {
+ case reflect.Ptr:
+ return isOtherSlice(mtype.Elem())
+ case reflect.Slice:
+ return isPrimitive(mtype.Elem()) || isOtherSlice(mtype.Elem())
+ default:
+ return false
+ }
+}
+
+// Check if the given marshall type maps to a Tree
+func isTree(mtype reflect.Type) bool {
+ switch mtype.Kind() {
+ case reflect.Map:
+ return true
+ case reflect.Struct:
+ return !isPrimitive(mtype)
+ default:
+ return false
+ }
+}
+
+func isCustomMarshaler(mtype reflect.Type) bool {
+ return mtype.Implements(marshalerType)
+}
+
+func callCustomMarshaler(mval reflect.Value) ([]byte, error) {
+ return mval.Interface().(Marshaler).MarshalTOML()
+}
+
+// Marshaler is the interface implemented by types that
+// can marshal themselves into valid TOML.
+type Marshaler interface {
+ MarshalTOML() ([]byte, error)
+}
+
+/*
+Marshal returns the TOML encoding of v. Behavior is similar to the Go json
+encoder, except that there is no concept of a Marshaler interface or MarshalTOML
+function for sub-structs, and currently only definite types can be marshaled
+(i.e. no `interface{}`).
+
+The following struct annotations are supported:
+
+ toml:"Field" Overrides the field's name to output.
+ omitempty When set, empty values and groups are not emitted.
+ comment:"comment" Emits a # comment on the same line. This supports new lines.
+ commented:"true" Emits the value as commented.
+
+Note that pointers are automatically assigned the "omitempty" option, as TOML
+explicitly does not handle null values (saying instead the label should be
+dropped).
+
+Tree structural types and corresponding marshal types:
+
+ *Tree (*)struct, (*)map[string]interface{}
+ []*Tree (*)[](*)struct, (*)[](*)map[string]interface{}
+ []interface{} (as interface{}) (*)[]primitive, (*)[]([]interface{})
+ interface{} (*)primitive
+
+Tree primitive types and corresponding marshal types:
+
+ uint64 uint, uint8-uint64, pointers to same
+ int64 int, int8-uint64, pointers to same
+ float64 float32, float64, pointers to same
+ string string, pointers to same
+ bool bool, pointers to same
+ time.Time time.Time{}, pointers to same
+*/
+func Marshal(v interface{}) ([]byte, error) {
+ return NewEncoder(nil).marshal(v)
+}
+
+// Encoder writes TOML values to an output stream.
+type Encoder struct {
+ w io.Writer
+ encOpts
+}
+
+// NewEncoder returns a new encoder that writes to w.
+func NewEncoder(w io.Writer) *Encoder {
+ return &Encoder{
+ w: w,
+ encOpts: encOptsDefaults,
+ }
+}
+
+// Encode writes the TOML encoding of v to the stream.
+//
+// See the documentation for Marshal for details.
+func (e *Encoder) Encode(v interface{}) error {
+ b, err := e.marshal(v)
+ if err != nil {
+ return err
+ }
+ if _, err := e.w.Write(b); err != nil {
+ return err
+ }
+ return nil
+}
+
+// QuoteMapKeys sets up the encoder to encode
+// maps with string type keys with quoted TOML keys.
+//
+// This relieves the character limitations on map keys.
+func (e *Encoder) QuoteMapKeys(v bool) *Encoder {
+ e.quoteMapKeys = v
+ return e
+}
+
+// ArraysWithOneElementPerLine sets up the encoder to encode arrays
+// with more than one element on multiple lines instead of one.
+//
+// For example:
+//
+// A = [1,2,3]
+//
+// Becomes
+//
+// A = [
+// 1,
+// 2,
+// 3
+// ]
+func (e *Encoder) ArraysWithOneElementPerLine(v bool) *Encoder {
+ e.arraysOneElementPerLine = v
+ return e
+}
+
+func (e *Encoder) marshal(v interface{}) ([]byte, error) {
+ mtype := reflect.TypeOf(v)
+ if mtype.Kind() != reflect.Struct {
+ return []byte{}, errors.New("Only a struct can be marshaled to TOML")
+ }
+ sval := reflect.ValueOf(v)
+ if isCustomMarshaler(mtype) {
+ return callCustomMarshaler(sval)
+ }
+ t, err := e.valueToTree(mtype, sval)
+ if err != nil {
+ return []byte{}, err
+ }
+
+ var buf bytes.Buffer
+ _, err = t.writeTo(&buf, "", "", 0, e.arraysOneElementPerLine)
+
+ return buf.Bytes(), err
+}
+
+// Convert given marshal struct or map value to toml tree
+func (e *Encoder) valueToTree(mtype reflect.Type, mval reflect.Value) (*Tree, error) {
+ if mtype.Kind() == reflect.Ptr {
+ return e.valueToTree(mtype.Elem(), mval.Elem())
+ }
+ tval := newTree()
+ switch mtype.Kind() {
+ case reflect.Struct:
+ for i := 0; i < mtype.NumField(); i++ {
+ mtypef, mvalf := mtype.Field(i), mval.Field(i)
+ opts := tomlOptions(mtypef)
+ if opts.include && (!opts.omitempty || !isZero(mvalf)) {
+ val, err := e.valueToToml(mtypef.Type, mvalf)
+ if err != nil {
+ return nil, err
+ }
+ tval.SetWithComment(opts.name, opts.comment, opts.commented, val)
+ }
+ }
+ case reflect.Map:
+ for _, key := range mval.MapKeys() {
+ mvalf := mval.MapIndex(key)
+ val, err := e.valueToToml(mtype.Elem(), mvalf)
+ if err != nil {
+ return nil, err
+ }
+ if e.quoteMapKeys {
+ keyStr, err := tomlValueStringRepresentation(key.String(), "", e.arraysOneElementPerLine)
+ if err != nil {
+ return nil, err
+ }
+ tval.SetPath([]string{keyStr}, val)
+ } else {
+ tval.Set(key.String(), val)
+ }
+ }
+ }
+ return tval, nil
+}
+
+// Convert given marshal slice to slice of Toml trees
+func (e *Encoder) valueToTreeSlice(mtype reflect.Type, mval reflect.Value) ([]*Tree, error) {
+ tval := make([]*Tree, mval.Len(), mval.Len())
+ for i := 0; i < mval.Len(); i++ {
+ val, err := e.valueToTree(mtype.Elem(), mval.Index(i))
+ if err != nil {
+ return nil, err
+ }
+ tval[i] = val
+ }
+ return tval, nil
+}
+
+// Convert given marshal slice to slice of toml values
+func (e *Encoder) valueToOtherSlice(mtype reflect.Type, mval reflect.Value) (interface{}, error) {
+ tval := make([]interface{}, mval.Len(), mval.Len())
+ for i := 0; i < mval.Len(); i++ {
+ val, err := e.valueToToml(mtype.Elem(), mval.Index(i))
+ if err != nil {
+ return nil, err
+ }
+ tval[i] = val
+ }
+ return tval, nil
+}
+
+// Convert given marshal value to toml value
+func (e *Encoder) valueToToml(mtype reflect.Type, mval reflect.Value) (interface{}, error) {
+ if mtype.Kind() == reflect.Ptr {
+ return e.valueToToml(mtype.Elem(), mval.Elem())
+ }
+ switch {
+ case isCustomMarshaler(mtype):
+ return callCustomMarshaler(mval)
+ case isTree(mtype):
+ return e.valueToTree(mtype, mval)
+ case isTreeSlice(mtype):
+ return e.valueToTreeSlice(mtype, mval)
+ case isOtherSlice(mtype):
+ return e.valueToOtherSlice(mtype, mval)
+ default:
+ switch mtype.Kind() {
+ case reflect.Bool:
+ return mval.Bool(), nil
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return mval.Int(), nil
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
+ return mval.Uint(), nil
+ case reflect.Float32, reflect.Float64:
+ return mval.Float(), nil
+ case reflect.String:
+ return mval.String(), nil
+ case reflect.Struct:
+ return mval.Interface().(time.Time), nil
+ default:
+ return nil, fmt.Errorf("Marshal can't handle %v(%v)", mtype, mtype.Kind())
+ }
+ }
+}
+
+// Unmarshal attempts to unmarshal the Tree into a Go struct pointed by v.
+// Neither Unmarshaler interfaces nor UnmarshalTOML functions are supported for
+// sub-structs, and only definite types can be unmarshaled.
+func (t *Tree) Unmarshal(v interface{}) error {
+ d := Decoder{tval: t}
+ return d.unmarshal(v)
+}
+
+// Marshal returns the TOML encoding of Tree.
+// See Marshal() documentation for types mapping table.
+func (t *Tree) Marshal() ([]byte, error) {
+ var buf bytes.Buffer
+ err := NewEncoder(&buf).Encode(t)
+ return buf.Bytes(), err
+}
+
+// Unmarshal parses the TOML-encoded data and stores the result in the value
+// pointed to by v. Behavior is similar to the Go json encoder, except that there
+// is no concept of an Unmarshaler interface or UnmarshalTOML function for
+// sub-structs, and currently only definite types can be unmarshaled to (i.e. no
+// `interface{}`).
+//
+// The following struct annotations are supported:
+//
+// toml:"Field" Overrides the field's name to map to.
+//
+// See Marshal() documentation for types mapping table.
+func Unmarshal(data []byte, v interface{}) error {
+ t, err := LoadReader(bytes.NewReader(data))
+ if err != nil {
+ return err
+ }
+ return t.Unmarshal(v)
+}
+
+// Decoder reads and decodes TOML values from an input stream.
+type Decoder struct {
+ r io.Reader
+ tval *Tree
+ encOpts
+}
+
+// NewDecoder returns a new decoder that reads from r.
+func NewDecoder(r io.Reader) *Decoder {
+ return &Decoder{
+ r: r,
+ encOpts: encOptsDefaults,
+ }
+}
+
+// Decode reads a TOML-encoded value from it's input
+// and unmarshals it in the value pointed at by v.
+//
+// See the documentation for Marshal for details.
+func (d *Decoder) Decode(v interface{}) error {
+ var err error
+ d.tval, err = LoadReader(d.r)
+ if err != nil {
+ return err
+ }
+ return d.unmarshal(v)
+}
+
+func (d *Decoder) unmarshal(v interface{}) error {
+ mtype := reflect.TypeOf(v)
+ if mtype.Kind() != reflect.Ptr || mtype.Elem().Kind() != reflect.Struct {
+ return errors.New("Only a pointer to struct can be unmarshaled from TOML")
+ }
+
+ sval, err := d.valueFromTree(mtype.Elem(), d.tval)
+ if err != nil {
+ return err
+ }
+ reflect.ValueOf(v).Elem().Set(sval)
+ return nil
+}
+
+// Convert toml tree to marshal struct or map, using marshal type
+func (d *Decoder) valueFromTree(mtype reflect.Type, tval *Tree) (reflect.Value, error) {
+ if mtype.Kind() == reflect.Ptr {
+ return d.unwrapPointer(mtype, tval)
+ }
+ var mval reflect.Value
+ switch mtype.Kind() {
+ case reflect.Struct:
+ mval = reflect.New(mtype).Elem()
+ for i := 0; i < mtype.NumField(); i++ {
+ mtypef := mtype.Field(i)
+ opts := tomlOptions(mtypef)
+ if opts.include {
+ baseKey := opts.name
+ keysToTry := []string{baseKey, strings.ToLower(baseKey), strings.ToTitle(baseKey)}
+ for _, key := range keysToTry {
+ exists := tval.Has(key)
+ if !exists {
+ continue
+ }
+ val := tval.Get(key)
+ mvalf, err := d.valueFromToml(mtypef.Type, val)
+ if err != nil {
+ return mval, formatError(err, tval.GetPosition(key))
+ }
+ mval.Field(i).Set(mvalf)
+ break
+ }
+ }
+ }
+ case reflect.Map:
+ mval = reflect.MakeMap(mtype)
+ for _, key := range tval.Keys() {
+ // TODO: path splits key
+ val := tval.GetPath([]string{key})
+ mvalf, err := d.valueFromToml(mtype.Elem(), val)
+ if err != nil {
+ return mval, formatError(err, tval.GetPosition(key))
+ }
+ mval.SetMapIndex(reflect.ValueOf(key), mvalf)
+ }
+ }
+ return mval, nil
+}
+
+// Convert toml value to marshal struct/map slice, using marshal type
+func (d *Decoder) valueFromTreeSlice(mtype reflect.Type, tval []*Tree) (reflect.Value, error) {
+ mval := reflect.MakeSlice(mtype, len(tval), len(tval))
+ for i := 0; i < len(tval); i++ {
+ val, err := d.valueFromTree(mtype.Elem(), tval[i])
+ if err != nil {
+ return mval, err
+ }
+ mval.Index(i).Set(val)
+ }
+ return mval, nil
+}
+
+// Convert toml value to marshal primitive slice, using marshal type
+func (d *Decoder) valueFromOtherSlice(mtype reflect.Type, tval []interface{}) (reflect.Value, error) {
+ mval := reflect.MakeSlice(mtype, len(tval), len(tval))
+ for i := 0; i < len(tval); i++ {
+ val, err := d.valueFromToml(mtype.Elem(), tval[i])
+ if err != nil {
+ return mval, err
+ }
+ mval.Index(i).Set(val)
+ }
+ return mval, nil
+}
+
+// Convert toml value to marshal value, using marshal type
+func (d *Decoder) valueFromToml(mtype reflect.Type, tval interface{}) (reflect.Value, error) {
+ if mtype.Kind() == reflect.Ptr {
+ return d.unwrapPointer(mtype, tval)
+ }
+
+ switch tval.(type) {
+ case *Tree:
+ if isTree(mtype) {
+ return d.valueFromTree(mtype, tval.(*Tree))
+ }
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a tree", tval, tval)
+ case []*Tree:
+ if isTreeSlice(mtype) {
+ return d.valueFromTreeSlice(mtype, tval.([]*Tree))
+ }
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to trees", tval, tval)
+ case []interface{}:
+ if isOtherSlice(mtype) {
+ return d.valueFromOtherSlice(mtype, tval.([]interface{}))
+ }
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to a slice", tval, tval)
+ default:
+ switch mtype.Kind() {
+ case reflect.Bool, reflect.Struct:
+ val := reflect.ValueOf(tval)
+ // if this passes for when mtype is reflect.Struct, tval is a time.Time
+ if !val.Type().ConvertibleTo(mtype) {
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
+ }
+
+ return val.Convert(mtype), nil
+ case reflect.String:
+ val := reflect.ValueOf(tval)
+ // stupidly, int64 is convertible to string. So special case this.
+ if !val.Type().ConvertibleTo(mtype) || val.Kind() == reflect.Int64 {
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
+ }
+
+ return val.Convert(mtype), nil
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ val := reflect.ValueOf(tval)
+ if !val.Type().ConvertibleTo(mtype) {
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
+ }
+ if reflect.Indirect(reflect.New(mtype)).OverflowInt(val.Int()) {
+ return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
+ }
+
+ return val.Convert(mtype), nil
+ case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
+ val := reflect.ValueOf(tval)
+ if !val.Type().ConvertibleTo(mtype) {
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
+ }
+ if val.Int() < 0 {
+ return reflect.ValueOf(nil), fmt.Errorf("%v(%T) is negative so does not fit in %v", tval, tval, mtype.String())
+ }
+ if reflect.Indirect(reflect.New(mtype)).OverflowUint(uint64(val.Int())) {
+ return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
+ }
+
+ return val.Convert(mtype), nil
+ case reflect.Float32, reflect.Float64:
+ val := reflect.ValueOf(tval)
+ if !val.Type().ConvertibleTo(mtype) {
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v", tval, tval, mtype.String())
+ }
+ if reflect.Indirect(reflect.New(mtype)).OverflowFloat(val.Float()) {
+ return reflect.ValueOf(nil), fmt.Errorf("%v(%T) would overflow %v", tval, tval, mtype.String())
+ }
+
+ return val.Convert(mtype), nil
+ default:
+ return reflect.ValueOf(nil), fmt.Errorf("Can't convert %v(%T) to %v(%v)", tval, tval, mtype, mtype.Kind())
+ }
+ }
+}
+
+func (d *Decoder) unwrapPointer(mtype reflect.Type, tval interface{}) (reflect.Value, error) {
+ val, err := d.valueFromToml(mtype.Elem(), tval)
+ if err != nil {
+ return reflect.ValueOf(nil), err
+ }
+ mval := reflect.New(mtype.Elem())
+ mval.Elem().Set(val)
+ return mval, nil
+}
+
+func tomlOptions(vf reflect.StructField) tomlOpts {
+ tag := vf.Tag.Get("toml")
+ parse := strings.Split(tag, ",")
+ var comment string
+ if c := vf.Tag.Get("comment"); c != "" {
+ comment = c
+ }
+ commented, _ := strconv.ParseBool(vf.Tag.Get("commented"))
+ result := tomlOpts{name: vf.Name, comment: comment, commented: commented, include: true, omitempty: false}
+ if parse[0] != "" {
+ if parse[0] == "-" && len(parse) == 1 {
+ result.include = false
+ } else {
+ result.name = strings.Trim(parse[0], " ")
+ }
+ }
+ if vf.PkgPath != "" {
+ result.include = false
+ }
+ if len(parse) > 1 && strings.Trim(parse[1], " ") == "omitempty" {
+ result.omitempty = true
+ }
+ if vf.Type.Kind() == reflect.Ptr {
+ result.omitempty = true
+ }
+ return result
+}
+
+func isZero(val reflect.Value) bool {
+ switch val.Type().Kind() {
+ case reflect.Map:
+ fallthrough
+ case reflect.Array:
+ fallthrough
+ case reflect.Slice:
+ return val.Len() == 0
+ default:
+ return reflect.DeepEqual(val.Interface(), reflect.Zero(val.Type()).Interface())
+ }
+}
+
+func formatError(err error, pos Position) error {
+ if err.Error()[0] == '(' { // Error already contains position information
+ return err
+ }
+ return fmt.Errorf("%s: %s", pos, err)
+}
diff --git a/vendor/github.com/pelletier/go-toml/marshal_test.toml b/vendor/github.com/pelletier/go-toml/marshal_test.toml
new file mode 100644
index 00000000000..1c5f98e7a84
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/marshal_test.toml
@@ -0,0 +1,38 @@
+title = "TOML Marshal Testing"
+
+[basic]
+ bool = true
+ date = 1979-05-27T07:32:00Z
+ float = 123.4
+ int = 5000
+ string = "Bite me"
+ uint = 5001
+
+[basic_lists]
+ bools = [true,false,true]
+ dates = [1979-05-27T07:32:00Z,1980-05-27T07:32:00Z]
+ floats = [12.3,45.6,78.9]
+ ints = [8001,8001,8002]
+ strings = ["One","Two","Three"]
+ uints = [5002,5003]
+
+[basic_map]
+ one = "one"
+ two = "two"
+
+[subdoc]
+
+ [subdoc.first]
+ name = "First"
+
+ [subdoc.second]
+ name = "Second"
+
+[[subdoclist]]
+ name = "List.First"
+
+[[subdoclist]]
+ name = "List.Second"
+
+[[subdocptrs]]
+ name = "Second"
diff --git a/vendor/github.com/pelletier/go-toml/parser.go b/vendor/github.com/pelletier/go-toml/parser.go
new file mode 100644
index 00000000000..2d27599a999
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/parser.go
@@ -0,0 +1,430 @@
+// TOML Parser.
+
+package toml
+
+import (
+ "errors"
+ "fmt"
+ "math"
+ "reflect"
+ "regexp"
+ "strconv"
+ "strings"
+ "time"
+)
+
+type tomlParser struct {
+ flowIdx int
+ flow []token
+ tree *Tree
+ currentTable []string
+ seenTableKeys []string
+}
+
+type tomlParserStateFn func() tomlParserStateFn
+
+// Formats and panics an error message based on a token
+func (p *tomlParser) raiseError(tok *token, msg string, args ...interface{}) {
+ panic(tok.Position.String() + ": " + fmt.Sprintf(msg, args...))
+}
+
+func (p *tomlParser) run() {
+ for state := p.parseStart; state != nil; {
+ state = state()
+ }
+}
+
+func (p *tomlParser) peek() *token {
+ if p.flowIdx >= len(p.flow) {
+ return nil
+ }
+ return &p.flow[p.flowIdx]
+}
+
+func (p *tomlParser) assume(typ tokenType) {
+ tok := p.getToken()
+ if tok == nil {
+ p.raiseError(tok, "was expecting token %s, but token stream is empty", tok)
+ }
+ if tok.typ != typ {
+ p.raiseError(tok, "was expecting token %s, but got %s instead", typ, tok)
+ }
+}
+
+func (p *tomlParser) getToken() *token {
+ tok := p.peek()
+ if tok == nil {
+ return nil
+ }
+ p.flowIdx++
+ return tok
+}
+
+func (p *tomlParser) parseStart() tomlParserStateFn {
+ tok := p.peek()
+
+ // end of stream, parsing is finished
+ if tok == nil {
+ return nil
+ }
+
+ switch tok.typ {
+ case tokenDoubleLeftBracket:
+ return p.parseGroupArray
+ case tokenLeftBracket:
+ return p.parseGroup
+ case tokenKey:
+ return p.parseAssign
+ case tokenEOF:
+ return nil
+ default:
+ p.raiseError(tok, "unexpected token")
+ }
+ return nil
+}
+
+func (p *tomlParser) parseGroupArray() tomlParserStateFn {
+ startToken := p.getToken() // discard the [[
+ key := p.getToken()
+ if key.typ != tokenKeyGroupArray {
+ p.raiseError(key, "unexpected token %s, was expecting a table array key", key)
+ }
+
+ // get or create table array element at the indicated part in the path
+ keys, err := parseKey(key.val)
+ if err != nil {
+ p.raiseError(key, "invalid table array key: %s", err)
+ }
+ p.tree.createSubTree(keys[:len(keys)-1], startToken.Position) // create parent entries
+ destTree := p.tree.GetPath(keys)
+ var array []*Tree
+ if destTree == nil {
+ array = make([]*Tree, 0)
+ } else if target, ok := destTree.([]*Tree); ok && target != nil {
+ array = destTree.([]*Tree)
+ } else {
+ p.raiseError(key, "key %s is already assigned and not of type table array", key)
+ }
+ p.currentTable = keys
+
+ // add a new tree to the end of the table array
+ newTree := newTree()
+ newTree.position = startToken.Position
+ array = append(array, newTree)
+ p.tree.SetPath(p.currentTable, array)
+
+ // remove all keys that were children of this table array
+ prefix := key.val + "."
+ found := false
+ for ii := 0; ii < len(p.seenTableKeys); {
+ tableKey := p.seenTableKeys[ii]
+ if strings.HasPrefix(tableKey, prefix) {
+ p.seenTableKeys = append(p.seenTableKeys[:ii], p.seenTableKeys[ii+1:]...)
+ } else {
+ found = (tableKey == key.val)
+ ii++
+ }
+ }
+
+ // keep this key name from use by other kinds of assignments
+ if !found {
+ p.seenTableKeys = append(p.seenTableKeys, key.val)
+ }
+
+ // move to next parser state
+ p.assume(tokenDoubleRightBracket)
+ return p.parseStart
+}
+
+func (p *tomlParser) parseGroup() tomlParserStateFn {
+ startToken := p.getToken() // discard the [
+ key := p.getToken()
+ if key.typ != tokenKeyGroup {
+ p.raiseError(key, "unexpected token %s, was expecting a table key", key)
+ }
+ for _, item := range p.seenTableKeys {
+ if item == key.val {
+ p.raiseError(key, "duplicated tables")
+ }
+ }
+
+ p.seenTableKeys = append(p.seenTableKeys, key.val)
+ keys, err := parseKey(key.val)
+ if err != nil {
+ p.raiseError(key, "invalid table array key: %s", err)
+ }
+ if err := p.tree.createSubTree(keys, startToken.Position); err != nil {
+ p.raiseError(key, "%s", err)
+ }
+ p.assume(tokenRightBracket)
+ p.currentTable = keys
+ return p.parseStart
+}
+
+func (p *tomlParser) parseAssign() tomlParserStateFn {
+ key := p.getToken()
+ p.assume(tokenEqual)
+
+ value := p.parseRvalue()
+ var tableKey []string
+ if len(p.currentTable) > 0 {
+ tableKey = p.currentTable
+ } else {
+ tableKey = []string{}
+ }
+
+ // find the table to assign, looking out for arrays of tables
+ var targetNode *Tree
+ switch node := p.tree.GetPath(tableKey).(type) {
+ case []*Tree:
+ targetNode = node[len(node)-1]
+ case *Tree:
+ targetNode = node
+ default:
+ p.raiseError(key, "Unknown table type for path: %s",
+ strings.Join(tableKey, "."))
+ }
+
+ // assign value to the found table
+ keyVals := []string{key.val}
+ if len(keyVals) != 1 {
+ p.raiseError(key, "Invalid key")
+ }
+ keyVal := keyVals[0]
+ localKey := []string{keyVal}
+ finalKey := append(tableKey, keyVal)
+ if targetNode.GetPath(localKey) != nil {
+ p.raiseError(key, "The following key was defined twice: %s",
+ strings.Join(finalKey, "."))
+ }
+ var toInsert interface{}
+
+ switch value.(type) {
+ case *Tree, []*Tree:
+ toInsert = value
+ default:
+ toInsert = &tomlValue{value: value, position: key.Position}
+ }
+ targetNode.values[keyVal] = toInsert
+ return p.parseStart
+}
+
+var numberUnderscoreInvalidRegexp *regexp.Regexp
+var hexNumberUnderscoreInvalidRegexp *regexp.Regexp
+
+func numberContainsInvalidUnderscore(value string) error {
+ if numberUnderscoreInvalidRegexp.MatchString(value) {
+ return errors.New("invalid use of _ in number")
+ }
+ return nil
+}
+
+func hexNumberContainsInvalidUnderscore(value string) error {
+ if hexNumberUnderscoreInvalidRegexp.MatchString(value) {
+ return errors.New("invalid use of _ in hex number")
+ }
+ return nil
+}
+
+func cleanupNumberToken(value string) string {
+ cleanedVal := strings.Replace(value, "_", "", -1)
+ return cleanedVal
+}
+
+func (p *tomlParser) parseRvalue() interface{} {
+ tok := p.getToken()
+ if tok == nil || tok.typ == tokenEOF {
+ p.raiseError(tok, "expecting a value")
+ }
+
+ switch tok.typ {
+ case tokenString:
+ return tok.val
+ case tokenTrue:
+ return true
+ case tokenFalse:
+ return false
+ case tokenInf:
+ if tok.val[0] == '-' {
+ return math.Inf(-1)
+ }
+ return math.Inf(1)
+ case tokenNan:
+ return math.NaN()
+ case tokenInteger:
+ cleanedVal := cleanupNumberToken(tok.val)
+ var err error
+ var val int64
+ if len(cleanedVal) >= 3 && cleanedVal[0] == '0' {
+ switch cleanedVal[1] {
+ case 'x':
+ err = hexNumberContainsInvalidUnderscore(tok.val)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ val, err = strconv.ParseInt(cleanedVal[2:], 16, 64)
+ case 'o':
+ err = numberContainsInvalidUnderscore(tok.val)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ val, err = strconv.ParseInt(cleanedVal[2:], 8, 64)
+ case 'b':
+ err = numberContainsInvalidUnderscore(tok.val)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ val, err = strconv.ParseInt(cleanedVal[2:], 2, 64)
+ default:
+ panic("invalid base") // the lexer should catch this first
+ }
+ } else {
+ err = numberContainsInvalidUnderscore(tok.val)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ val, err = strconv.ParseInt(cleanedVal, 10, 64)
+ }
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ return val
+ case tokenFloat:
+ err := numberContainsInvalidUnderscore(tok.val)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ cleanedVal := cleanupNumberToken(tok.val)
+ val, err := strconv.ParseFloat(cleanedVal, 64)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ return val
+ case tokenDate:
+ val, err := time.ParseInLocation(time.RFC3339Nano, tok.val, time.UTC)
+ if err != nil {
+ p.raiseError(tok, "%s", err)
+ }
+ return val
+ case tokenLeftBracket:
+ return p.parseArray()
+ case tokenLeftCurlyBrace:
+ return p.parseInlineTable()
+ case tokenEqual:
+ p.raiseError(tok, "cannot have multiple equals for the same key")
+ case tokenError:
+ p.raiseError(tok, "%s", tok)
+ }
+
+ p.raiseError(tok, "never reached")
+
+ return nil
+}
+
+func tokenIsComma(t *token) bool {
+ return t != nil && t.typ == tokenComma
+}
+
+func (p *tomlParser) parseInlineTable() *Tree {
+ tree := newTree()
+ var previous *token
+Loop:
+ for {
+ follow := p.peek()
+ if follow == nil || follow.typ == tokenEOF {
+ p.raiseError(follow, "unterminated inline table")
+ }
+ switch follow.typ {
+ case tokenRightCurlyBrace:
+ p.getToken()
+ break Loop
+ case tokenKey:
+ if !tokenIsComma(previous) && previous != nil {
+ p.raiseError(follow, "comma expected between fields in inline table")
+ }
+ key := p.getToken()
+ p.assume(tokenEqual)
+ value := p.parseRvalue()
+ tree.Set(key.val, value)
+ case tokenComma:
+ if previous == nil {
+ p.raiseError(follow, "inline table cannot start with a comma")
+ }
+ if tokenIsComma(previous) {
+ p.raiseError(follow, "need field between two commas in inline table")
+ }
+ p.getToken()
+ default:
+ p.raiseError(follow, "unexpected token type in inline table: %s", follow.String())
+ }
+ previous = follow
+ }
+ if tokenIsComma(previous) {
+ p.raiseError(previous, "trailing comma at the end of inline table")
+ }
+ return tree
+}
+
+func (p *tomlParser) parseArray() interface{} {
+ var array []interface{}
+ arrayType := reflect.TypeOf(nil)
+ for {
+ follow := p.peek()
+ if follow == nil || follow.typ == tokenEOF {
+ p.raiseError(follow, "unterminated array")
+ }
+ if follow.typ == tokenRightBracket {
+ p.getToken()
+ break
+ }
+ val := p.parseRvalue()
+ if arrayType == nil {
+ arrayType = reflect.TypeOf(val)
+ }
+ if reflect.TypeOf(val) != arrayType {
+ p.raiseError(follow, "mixed types in array")
+ }
+ array = append(array, val)
+ follow = p.peek()
+ if follow == nil || follow.typ == tokenEOF {
+ p.raiseError(follow, "unterminated array")
+ }
+ if follow.typ != tokenRightBracket && follow.typ != tokenComma {
+ p.raiseError(follow, "missing comma")
+ }
+ if follow.typ == tokenComma {
+ p.getToken()
+ }
+ }
+ // An array of Trees is actually an array of inline
+ // tables, which is a shorthand for a table array. If the
+ // array was not converted from []interface{} to []*Tree,
+ // the two notations would not be equivalent.
+ if arrayType == reflect.TypeOf(newTree()) {
+ tomlArray := make([]*Tree, len(array))
+ for i, v := range array {
+ tomlArray[i] = v.(*Tree)
+ }
+ return tomlArray
+ }
+ return array
+}
+
+func parseToml(flow []token) *Tree {
+ result := newTree()
+ result.position = Position{1, 1}
+ parser := &tomlParser{
+ flowIdx: 0,
+ flow: flow,
+ tree: result,
+ currentTable: make([]string, 0),
+ seenTableKeys: make([]string, 0),
+ }
+ parser.run()
+ return result
+}
+
+func init() {
+ numberUnderscoreInvalidRegexp = regexp.MustCompile(`([^\d]_|_[^\d])|_$|^_`)
+ hexNumberUnderscoreInvalidRegexp = regexp.MustCompile(`(^0x_)|([^\da-f]_|_[^\da-f])|_$|^_`)
+}
diff --git a/vendor/github.com/pelletier/go-toml/position.go b/vendor/github.com/pelletier/go-toml/position.go
new file mode 100644
index 00000000000..c17bff87baa
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/position.go
@@ -0,0 +1,29 @@
+// Position support for go-toml
+
+package toml
+
+import (
+ "fmt"
+)
+
+// Position of a document element within a TOML document.
+//
+// Line and Col are both 1-indexed positions for the element's line number and
+// column number, respectively. Values of zero or less will cause Invalid(),
+// to return true.
+type Position struct {
+ Line int // line within the document
+ Col int // column within the line
+}
+
+// String representation of the position.
+// Displays 1-indexed line and column numbers.
+func (p Position) String() string {
+ return fmt.Sprintf("(%d, %d)", p.Line, p.Col)
+}
+
+// Invalid returns whether or not the position is valid (i.e. with negative or
+// null values)
+func (p Position) Invalid() bool {
+ return p.Line <= 0 || p.Col <= 0
+}
diff --git a/vendor/github.com/pelletier/go-toml/test.sh b/vendor/github.com/pelletier/go-toml/test.sh
new file mode 100644
index 00000000000..a70a8b0222a
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/test.sh
@@ -0,0 +1,91 @@
+#!/bin/bash
+# fail out of the script if anything here fails
+set -e
+set -o pipefail
+
+# set the path to the present working directory
+export GOPATH=`pwd`
+
+function git_clone() {
+ path=$1
+ branch=$2
+ version=$3
+ if [ ! -d "src/$path" ]; then
+ mkdir -p src/$path
+ git clone https://$path.git src/$path
+ fi
+ pushd src/$path
+ git checkout "$branch"
+ git reset --hard "$version"
+ popd
+}
+
+# Remove potential previous runs
+rm -rf src test_program_bin toml-test
+
+# Run go vet
+go vet ./...
+
+go get github.com/pelletier/go-buffruneio
+go get github.com/davecgh/go-spew/spew
+go get gopkg.in/yaml.v2
+go get github.com/BurntSushi/toml
+
+# get code for BurntSushi TOML validation
+# pinning all to 'HEAD' for version 0.3.x work (TODO: pin to commit hash when tests stabilize)
+git_clone github.com/BurntSushi/toml master HEAD
+git_clone github.com/BurntSushi/toml-test master HEAD #was: 0.2.0 HEAD
+
+# build the BurntSushi test application
+go build -o toml-test github.com/BurntSushi/toml-test
+
+# vendorize the current lib for testing
+# NOTE: this basically mocks an install without having to go back out to github for code
+mkdir -p src/github.com/pelletier/go-toml/cmd
+mkdir -p src/github.com/pelletier/go-toml/query
+cp *.go *.toml src/github.com/pelletier/go-toml
+cp -R cmd/* src/github.com/pelletier/go-toml/cmd
+cp -R query/* src/github.com/pelletier/go-toml/query
+go build -o test_program_bin src/github.com/pelletier/go-toml/cmd/test_program.go
+
+# Run basic unit tests
+go test github.com/pelletier/go-toml -covermode=count -coverprofile=coverage.out
+go test github.com/pelletier/go-toml/cmd/tomljson
+go test github.com/pelletier/go-toml/query
+
+# run the entire BurntSushi test suite
+if [[ $# -eq 0 ]] ; then
+ echo "Running all BurntSushi tests"
+ ./toml-test ./test_program_bin | tee test_out
+else
+ # run a specific test
+ test=$1
+ test_path='src/github.com/BurntSushi/toml-test/tests'
+ valid_test="$test_path/valid/$test"
+ invalid_test="$test_path/invalid/$test"
+
+ if [ -e "$valid_test.toml" ]; then
+ echo "Valid Test TOML for $test:"
+ echo "===="
+ cat "$valid_test.toml"
+
+ echo "Valid Test JSON for $test:"
+ echo "===="
+ cat "$valid_test.json"
+
+ echo "Go-TOML Output for $test:"
+ echo "===="
+ cat "$valid_test.toml" | ./test_program_bin
+ fi
+
+ if [ -e "$invalid_test.toml" ]; then
+ echo "Invalid Test TOML for $test:"
+ echo "===="
+ cat "$invalid_test.toml"
+
+ echo "Go-TOML Output for $test:"
+ echo "===="
+ echo "go-toml Output:"
+ cat "$invalid_test.toml" | ./test_program_bin
+ fi
+fi
diff --git a/vendor/github.com/pelletier/go-toml/token.go b/vendor/github.com/pelletier/go-toml/token.go
new file mode 100644
index 00000000000..1a908134667
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/token.go
@@ -0,0 +1,144 @@
+package toml
+
+import (
+ "fmt"
+ "strconv"
+ "unicode"
+)
+
+// Define tokens
+type tokenType int
+
+const (
+ eof = -(iota + 1)
+)
+
+const (
+ tokenError tokenType = iota
+ tokenEOF
+ tokenComment
+ tokenKey
+ tokenString
+ tokenInteger
+ tokenTrue
+ tokenFalse
+ tokenFloat
+ tokenInf
+ tokenNan
+ tokenEqual
+ tokenLeftBracket
+ tokenRightBracket
+ tokenLeftCurlyBrace
+ tokenRightCurlyBrace
+ tokenLeftParen
+ tokenRightParen
+ tokenDoubleLeftBracket
+ tokenDoubleRightBracket
+ tokenDate
+ tokenKeyGroup
+ tokenKeyGroupArray
+ tokenComma
+ tokenColon
+ tokenDollar
+ tokenStar
+ tokenQuestion
+ tokenDot
+ tokenDotDot
+ tokenEOL
+)
+
+var tokenTypeNames = []string{
+ "Error",
+ "EOF",
+ "Comment",
+ "Key",
+ "String",
+ "Integer",
+ "True",
+ "False",
+ "Float",
+ "Inf",
+ "NaN",
+ "=",
+ "[",
+ "]",
+ "{",
+ "}",
+ "(",
+ ")",
+ "]]",
+ "[[",
+ "Date",
+ "KeyGroup",
+ "KeyGroupArray",
+ ",",
+ ":",
+ "$",
+ "*",
+ "?",
+ ".",
+ "..",
+ "EOL",
+}
+
+type token struct {
+ Position
+ typ tokenType
+ val string
+}
+
+func (tt tokenType) String() string {
+ idx := int(tt)
+ if idx < len(tokenTypeNames) {
+ return tokenTypeNames[idx]
+ }
+ return "Unknown"
+}
+
+func (t token) Int() int {
+ if result, err := strconv.Atoi(t.val); err != nil {
+ panic(err)
+ } else {
+ return result
+ }
+}
+
+func (t token) String() string {
+ switch t.typ {
+ case tokenEOF:
+ return "EOF"
+ case tokenError:
+ return t.val
+ }
+
+ return fmt.Sprintf("%q", t.val)
+}
+
+func isSpace(r rune) bool {
+ return r == ' ' || r == '\t'
+}
+
+func isAlphanumeric(r rune) bool {
+ return unicode.IsLetter(r) || r == '_'
+}
+
+func isKeyChar(r rune) bool {
+ // Keys start with the first character that isn't whitespace or [ and end
+ // with the last non-whitespace character before the equals sign. Keys
+ // cannot contain a # character."
+ return !(r == '\r' || r == '\n' || r == eof || r == '=')
+}
+
+func isKeyStartChar(r rune) bool {
+ return !(isSpace(r) || r == '\r' || r == '\n' || r == eof || r == '[')
+}
+
+func isDigit(r rune) bool {
+ return unicode.IsNumber(r)
+}
+
+func isHexDigit(r rune) bool {
+ return isDigit(r) ||
+ (r >= 'a' && r <= 'f') ||
+ (r >= 'A' && r <= 'F')
+}
diff --git a/vendor/github.com/pelletier/go-toml/toml.go b/vendor/github.com/pelletier/go-toml/toml.go
new file mode 100644
index 00000000000..05493a444bc
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/toml.go
@@ -0,0 +1,309 @@
+package toml
+
+import (
+ "errors"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "runtime"
+ "strings"
+)
+
+type tomlValue struct {
+ value interface{} // string, int64, uint64, float64, bool, time.Time, [] of any of this list
+ comment string
+ commented bool
+ position Position
+}
+
+// Tree is the result of the parsing of a TOML file.
+type Tree struct {
+ values map[string]interface{} // string -> *tomlValue, *Tree, []*Tree
+ comment string
+ commented bool
+ position Position
+}
+
+func newTree() *Tree {
+ return &Tree{
+ values: make(map[string]interface{}),
+ position: Position{},
+ }
+}
+
+// TreeFromMap initializes a new Tree object using the given map.
+func TreeFromMap(m map[string]interface{}) (*Tree, error) {
+ result, err := toTree(m)
+ if err != nil {
+ return nil, err
+ }
+ return result.(*Tree), nil
+}
+
+// Position returns the position of the tree.
+func (t *Tree) Position() Position {
+ return t.position
+}
+
+// Has returns a boolean indicating if the given key exists.
+func (t *Tree) Has(key string) bool {
+ if key == "" {
+ return false
+ }
+ return t.HasPath(strings.Split(key, "."))
+}
+
+// HasPath returns true if the given path of keys exists, false otherwise.
+func (t *Tree) HasPath(keys []string) bool {
+ return t.GetPath(keys) != nil
+}
+
+// Keys returns the keys of the toplevel tree (does not recurse).
+func (t *Tree) Keys() []string {
+ keys := make([]string, len(t.values))
+ i := 0
+ for k := range t.values {
+ keys[i] = k
+ i++
+ }
+ return keys
+}
+
+// Get the value at key in the Tree.
+// Key is a dot-separated path (e.g. a.b.c) without single/double quoted strings.
+// If you need to retrieve non-bare keys, use GetPath.
+// Returns nil if the path does not exist in the tree.
+// If keys is of length zero, the current tree is returned.
+func (t *Tree) Get(key string) interface{} {
+ if key == "" {
+ return t
+ }
+ return t.GetPath(strings.Split(key, "."))
+}
+
+// GetPath returns the element in the tree indicated by 'keys'.
+// If keys is of length zero, the current tree is returned.
+func (t *Tree) GetPath(keys []string) interface{} {
+ if len(keys) == 0 {
+ return t
+ }
+ subtree := t
+ for _, intermediateKey := range keys[:len(keys)-1] {
+ value, exists := subtree.values[intermediateKey]
+ if !exists {
+ return nil
+ }
+ switch node := value.(type) {
+ case *Tree:
+ subtree = node
+ case []*Tree:
+ // go to most recent element
+ if len(node) == 0 {
+ return nil
+ }
+ subtree = node[len(node)-1]
+ default:
+ return nil // cannot navigate through other node types
+ }
+ }
+ // branch based on final node type
+ switch node := subtree.values[keys[len(keys)-1]].(type) {
+ case *tomlValue:
+ return node.value
+ default:
+ return node
+ }
+}
+
+// GetPosition returns the position of the given key.
+func (t *Tree) GetPosition(key string) Position {
+ if key == "" {
+ return t.position
+ }
+ return t.GetPositionPath(strings.Split(key, "."))
+}
+
+// GetPositionPath returns the element in the tree indicated by 'keys'.
+// If keys is of length zero, the current tree is returned.
+func (t *Tree) GetPositionPath(keys []string) Position {
+ if len(keys) == 0 {
+ return t.position
+ }
+ subtree := t
+ for _, intermediateKey := range keys[:len(keys)-1] {
+ value, exists := subtree.values[intermediateKey]
+ if !exists {
+ return Position{0, 0}
+ }
+ switch node := value.(type) {
+ case *Tree:
+ subtree = node
+ case []*Tree:
+ // go to most recent element
+ if len(node) == 0 {
+ return Position{0, 0}
+ }
+ subtree = node[len(node)-1]
+ default:
+ return Position{0, 0}
+ }
+ }
+ // branch based on final node type
+ switch node := subtree.values[keys[len(keys)-1]].(type) {
+ case *tomlValue:
+ return node.position
+ case *Tree:
+ return node.position
+ case []*Tree:
+ // go to most recent element
+ if len(node) == 0 {
+ return Position{0, 0}
+ }
+ return node[len(node)-1].position
+ default:
+ return Position{0, 0}
+ }
+}
+
+// GetDefault works like Get but with a default value
+func (t *Tree) GetDefault(key string, def interface{}) interface{} {
+ val := t.Get(key)
+ if val == nil {
+ return def
+ }
+ return val
+}
+
+// Set an element in the tree.
+// Key is a dot-separated path (e.g. a.b.c).
+// Creates all necessary intermediate trees, if needed.
+func (t *Tree) Set(key string, value interface{}) {
+ t.SetWithComment(key, "", false, value)
+}
+
+// SetWithComment is the same as Set, but allows you to provide comment
+// information to the key, that will be reused by Marshal().
+func (t *Tree) SetWithComment(key string, comment string, commented bool, value interface{}) {
+ t.SetPathWithComment(strings.Split(key, "."), comment, commented, value)
+}
+
+// SetPath sets an element in the tree.
+// Keys is an array of path elements (e.g. {"a","b","c"}).
+// Creates all necessary intermediate trees, if needed.
+func (t *Tree) SetPath(keys []string, value interface{}) {
+ t.SetPathWithComment(keys, "", false, value)
+}
+
+// SetPathWithComment is the same as SetPath, but allows you to provide comment
+// information to the key, that will be reused by Marshal().
+func (t *Tree) SetPathWithComment(keys []string, comment string, commented bool, value interface{}) {
+ subtree := t
+ for _, intermediateKey := range keys[:len(keys)-1] {
+ nextTree, exists := subtree.values[intermediateKey]
+ if !exists {
+ nextTree = newTree()
+ subtree.values[intermediateKey] = nextTree // add new element here
+ }
+ switch node := nextTree.(type) {
+ case *Tree:
+ subtree = node
+ case []*Tree:
+ // go to most recent element
+ if len(node) == 0 {
+ // create element if it does not exist
+ subtree.values[intermediateKey] = append(node, newTree())
+ }
+ subtree = node[len(node)-1]
+ }
+ }
+
+ var toInsert interface{}
+
+ switch value.(type) {
+ case *Tree:
+ tt := value.(*Tree)
+ tt.comment = comment
+ toInsert = value
+ case []*Tree:
+ toInsert = value
+ case *tomlValue:
+ tt := value.(*tomlValue)
+ tt.comment = comment
+ toInsert = tt
+ default:
+ toInsert = &tomlValue{value: value, comment: comment, commented: commented}
+ }
+
+ subtree.values[keys[len(keys)-1]] = toInsert
+}
+
+// createSubTree takes a tree and a key and create the necessary intermediate
+// subtrees to create a subtree at that point. In-place.
+//
+// e.g. passing a.b.c will create (assuming tree is empty) tree[a], tree[a][b]
+// and tree[a][b][c]
+//
+// Returns nil on success, error object on failure
+func (t *Tree) createSubTree(keys []string, pos Position) error {
+ subtree := t
+ for _, intermediateKey := range keys {
+ nextTree, exists := subtree.values[intermediateKey]
+ if !exists {
+ tree := newTree()
+ tree.position = pos
+ subtree.values[intermediateKey] = tree
+ nextTree = tree
+ }
+
+ switch node := nextTree.(type) {
+ case []*Tree:
+ subtree = node[len(node)-1]
+ case *Tree:
+ subtree = node
+ default:
+ return fmt.Errorf("unknown type for path %s (%s): %T (%#v)",
+ strings.Join(keys, "."), intermediateKey, nextTree, nextTree)
+ }
+ }
+ return nil
+}
+
+// LoadBytes creates a Tree from a []byte.
+func LoadBytes(b []byte) (tree *Tree, err error) {
+ defer func() {
+ if r := recover(); r != nil {
+ if _, ok := r.(runtime.Error); ok {
+ panic(r)
+ }
+ err = errors.New(r.(string))
+ }
+ }()
+ tree = parseToml(lexToml(b))
+ return
+}
+
+// LoadReader creates a Tree from any io.Reader.
+func LoadReader(reader io.Reader) (tree *Tree, err error) {
+ inputBytes, err := ioutil.ReadAll(reader)
+ if err != nil {
+ return
+ }
+ tree, err = LoadBytes(inputBytes)
+ return
+}
+
+// Load creates a Tree from a string.
+func Load(content string) (tree *Tree, err error) {
+ return LoadBytes([]byte(content))
+}
+
+// LoadFile creates a Tree from a file.
+func LoadFile(path string) (tree *Tree, err error) {
+ file, err := os.Open(path)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+ return LoadReader(file)
+}
diff --git a/vendor/github.com/pelletier/go-toml/tomltree_create.go b/vendor/github.com/pelletier/go-toml/tomltree_create.go
new file mode 100644
index 00000000000..79610e9b340
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/tomltree_create.go
@@ -0,0 +1,142 @@
+package toml
+
+import (
+ "fmt"
+ "reflect"
+ "time"
+)
+
+var kindToType = [reflect.String + 1]reflect.Type{
+ reflect.Bool: reflect.TypeOf(true),
+ reflect.String: reflect.TypeOf(""),
+ reflect.Float32: reflect.TypeOf(float64(1)),
+ reflect.Float64: reflect.TypeOf(float64(1)),
+ reflect.Int: reflect.TypeOf(int64(1)),
+ reflect.Int8: reflect.TypeOf(int64(1)),
+ reflect.Int16: reflect.TypeOf(int64(1)),
+ reflect.Int32: reflect.TypeOf(int64(1)),
+ reflect.Int64: reflect.TypeOf(int64(1)),
+ reflect.Uint: reflect.TypeOf(uint64(1)),
+ reflect.Uint8: reflect.TypeOf(uint64(1)),
+ reflect.Uint16: reflect.TypeOf(uint64(1)),
+ reflect.Uint32: reflect.TypeOf(uint64(1)),
+ reflect.Uint64: reflect.TypeOf(uint64(1)),
+}
+
+// typeFor returns a reflect.Type for a reflect.Kind, or nil if none is found.
+// supported values:
+// string, bool, int64, uint64, float64, time.Time, int, int8, int16, int32, uint, uint8, uint16, uint32, float32
+func typeFor(k reflect.Kind) reflect.Type {
+ if k > 0 && int(k) < len(kindToType) {
+ return kindToType[k]
+ }
+ return nil
+}
+
+func simpleValueCoercion(object interface{}) (interface{}, error) {
+ switch original := object.(type) {
+ case string, bool, int64, uint64, float64, time.Time:
+ return original, nil
+ case int:
+ return int64(original), nil
+ case int8:
+ return int64(original), nil
+ case int16:
+ return int64(original), nil
+ case int32:
+ return int64(original), nil
+ case uint:
+ return uint64(original), nil
+ case uint8:
+ return uint64(original), nil
+ case uint16:
+ return uint64(original), nil
+ case uint32:
+ return uint64(original), nil
+ case float32:
+ return float64(original), nil
+ case fmt.Stringer:
+ return original.String(), nil
+ default:
+ return nil, fmt.Errorf("cannot convert type %T to Tree", object)
+ }
+}
+
+func sliceToTree(object interface{}) (interface{}, error) {
+ // arrays are a bit tricky, since they can represent either a
+ // collection of simple values, which is represented by one
+ // *tomlValue, or an array of tables, which is represented by an
+ // array of *Tree.
+
+ // holding the assumption that this function is called from toTree only when value.Kind() is Array or Slice
+ value := reflect.ValueOf(object)
+ insideType := value.Type().Elem()
+ length := value.Len()
+ if length > 0 {
+ insideType = reflect.ValueOf(value.Index(0).Interface()).Type()
+ }
+ if insideType.Kind() == reflect.Map {
+ // this is considered as an array of tables
+ tablesArray := make([]*Tree, 0, length)
+ for i := 0; i < length; i++ {
+ table := value.Index(i)
+ tree, err := toTree(table.Interface())
+ if err != nil {
+ return nil, err
+ }
+ tablesArray = append(tablesArray, tree.(*Tree))
+ }
+ return tablesArray, nil
+ }
+
+ sliceType := typeFor(insideType.Kind())
+ if sliceType == nil {
+ sliceType = insideType
+ }
+
+ arrayValue := reflect.MakeSlice(reflect.SliceOf(sliceType), 0, length)
+
+ for i := 0; i < length; i++ {
+ val := value.Index(i).Interface()
+ simpleValue, err := simpleValueCoercion(val)
+ if err != nil {
+ return nil, err
+ }
+ arrayValue = reflect.Append(arrayValue, reflect.ValueOf(simpleValue))
+ }
+ return &tomlValue{value: arrayValue.Interface(), position: Position{}}, nil
+}
+
+func toTree(object interface{}) (interface{}, error) {
+ value := reflect.ValueOf(object)
+
+ if value.Kind() == reflect.Map {
+ values := map[string]interface{}{}
+ keys := value.MapKeys()
+ for _, key := range keys {
+ if key.Kind() != reflect.String {
+ if _, ok := key.Interface().(string); !ok {
+ return nil, fmt.Errorf("map key needs to be a string, not %T (%v)", key.Interface(), key.Kind())
+ }
+ }
+
+ v := value.MapIndex(key)
+ newValue, err := toTree(v.Interface())
+ if err != nil {
+ return nil, err
+ }
+ values[key.String()] = newValue
+ }
+ return &Tree{values: values, position: Position{}}, nil
+ }
+
+ if value.Kind() == reflect.Array || value.Kind() == reflect.Slice {
+ return sliceToTree(object)
+ }
+
+ simpleValue, err := simpleValueCoercion(object)
+ if err != nil {
+ return nil, err
+ }
+ return &tomlValue{value: simpleValue, position: Position{}}, nil
+}
diff --git a/vendor/github.com/pelletier/go-toml/tomltree_write.go b/vendor/github.com/pelletier/go-toml/tomltree_write.go
new file mode 100644
index 00000000000..d322a9764f2
--- /dev/null
+++ b/vendor/github.com/pelletier/go-toml/tomltree_write.go
@@ -0,0 +1,289 @@
+package toml
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "math"
+ "reflect"
+ "sort"
+ "strconv"
+ "strings"
+ "time"
+)
+
+// encodes a string to a TOML-compliant string value
+func encodeTomlString(value string) string {
+ var b bytes.Buffer
+
+ for _, rr := range value {
+ switch rr {
+ case '\b':
+ b.WriteString(`\b`)
+ case '\t':
+ b.WriteString(`\t`)
+ case '\n':
+ b.WriteString(`\n`)
+ case '\f':
+ b.WriteString(`\f`)
+ case '\r':
+ b.WriteString(`\r`)
+ case '"':
+ b.WriteString(`\"`)
+ case '\\':
+ b.WriteString(`\\`)
+ default:
+ intRr := uint16(rr)
+ if intRr < 0x001F {
+ b.WriteString(fmt.Sprintf("\\u%0.4X", intRr))
+ } else {
+ b.WriteRune(rr)
+ }
+ }
+ }
+ return b.String()
+}
+
+func tomlValueStringRepresentation(v interface{}, indent string, arraysOneElementPerLine bool) (string, error) {
+ switch value := v.(type) {
+ case uint64:
+ return strconv.FormatUint(value, 10), nil
+ case int64:
+ return strconv.FormatInt(value, 10), nil
+ case float64:
+ // Ensure a round float does contain a decimal point. Otherwise feeding
+ // the output back to the parser would convert to an integer.
+ if math.Trunc(value) == value {
+ return strings.ToLower(strconv.FormatFloat(value, 'f', 1, 32)), nil
+ }
+ return strings.ToLower(strconv.FormatFloat(value, 'f', -1, 32)), nil
+ case string:
+ return "\"" + encodeTomlString(value) + "\"", nil
+ case []byte:
+ b, _ := v.([]byte)
+ return tomlValueStringRepresentation(string(b), indent, arraysOneElementPerLine)
+ case bool:
+ if value {
+ return "true", nil
+ }
+ return "false", nil
+ case time.Time:
+ return value.Format(time.RFC3339), nil
+ case nil:
+ return "", nil
+ }
+
+ rv := reflect.ValueOf(v)
+
+ if rv.Kind() == reflect.Slice {
+ var values []string
+ for i := 0; i < rv.Len(); i++ {
+ item := rv.Index(i).Interface()
+ itemRepr, err := tomlValueStringRepresentation(item, indent, arraysOneElementPerLine)
+ if err != nil {
+ return "", err
+ }
+ values = append(values, itemRepr)
+ }
+ if arraysOneElementPerLine && len(values) > 1 {
+ stringBuffer := bytes.Buffer{}
+ valueIndent := indent + ` ` // TODO: move that to a shared encoder state
+
+ stringBuffer.WriteString("[\n")
+
+ for i, value := range values {
+ stringBuffer.WriteString(valueIndent)
+ stringBuffer.WriteString(value)
+ if i != len(values)-1 {
+ stringBuffer.WriteString(`,`)
+ }
+ stringBuffer.WriteString("\n")
+ }
+
+ stringBuffer.WriteString(indent + "]")
+
+ return stringBuffer.String(), nil
+ }
+ return "[" + strings.Join(values, ",") + "]", nil
+ }
+ return "", fmt.Errorf("unsupported value type %T: %v", v, v)
+}
+
+func (t *Tree) writeTo(w io.Writer, indent, keyspace string, bytesCount int64, arraysOneElementPerLine bool) (int64, error) {
+ simpleValuesKeys := make([]string, 0)
+ complexValuesKeys := make([]string, 0)
+
+ for k := range t.values {
+ v := t.values[k]
+ switch v.(type) {
+ case *Tree, []*Tree:
+ complexValuesKeys = append(complexValuesKeys, k)
+ default:
+ simpleValuesKeys = append(simpleValuesKeys, k)
+ }
+ }
+
+ sort.Strings(simpleValuesKeys)
+ sort.Strings(complexValuesKeys)
+
+ for _, k := range simpleValuesKeys {
+ v, ok := t.values[k].(*tomlValue)
+ if !ok {
+ return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k])
+ }
+
+ repr, err := tomlValueStringRepresentation(v.value, indent, arraysOneElementPerLine)
+ if err != nil {
+ return bytesCount, err
+ }
+
+ if v.comment != "" {
+ comment := strings.Replace(v.comment, "\n", "\n"+indent+"#", -1)
+ start := "# "
+ if strings.HasPrefix(comment, "#") {
+ start = ""
+ }
+ writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment, "\n")
+ bytesCount += int64(writtenBytesCountComment)
+ if errc != nil {
+ return bytesCount, errc
+ }
+ }
+
+ var commented string
+ if v.commented {
+ commented = "# "
+ }
+ writtenBytesCount, err := writeStrings(w, indent, commented, k, " = ", repr, "\n")
+ bytesCount += int64(writtenBytesCount)
+ if err != nil {
+ return bytesCount, err
+ }
+ }
+
+ for _, k := range complexValuesKeys {
+ v := t.values[k]
+
+ combinedKey := k
+ if keyspace != "" {
+ combinedKey = keyspace + "." + combinedKey
+ }
+ var commented string
+ if t.commented {
+ commented = "# "
+ }
+
+ switch node := v.(type) {
+ // node has to be of those two types given how keys are sorted above
+ case *Tree:
+ tv, ok := t.values[k].(*Tree)
+ if !ok {
+ return bytesCount, fmt.Errorf("invalid value type at %s: %T", k, t.values[k])
+ }
+ if tv.comment != "" {
+ comment := strings.Replace(tv.comment, "\n", "\n"+indent+"#", -1)
+ start := "# "
+ if strings.HasPrefix(comment, "#") {
+ start = ""
+ }
+ writtenBytesCountComment, errc := writeStrings(w, "\n", indent, start, comment)
+ bytesCount += int64(writtenBytesCountComment)
+ if errc != nil {
+ return bytesCount, errc
+ }
+ }
+ writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[", combinedKey, "]\n")
+ bytesCount += int64(writtenBytesCount)
+ if err != nil {
+ return bytesCount, err
+ }
+ bytesCount, err = node.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine)
+ if err != nil {
+ return bytesCount, err
+ }
+ case []*Tree:
+ for _, subTree := range node {
+ writtenBytesCount, err := writeStrings(w, "\n", indent, commented, "[[", combinedKey, "]]\n")
+ bytesCount += int64(writtenBytesCount)
+ if err != nil {
+ return bytesCount, err
+ }
+
+ bytesCount, err = subTree.writeTo(w, indent+" ", combinedKey, bytesCount, arraysOneElementPerLine)
+ if err != nil {
+ return bytesCount, err
+ }
+ }
+ }
+ }
+
+ return bytesCount, nil
+}
+
+func writeStrings(w io.Writer, s ...string) (int, error) {
+ var n int
+ for i := range s {
+ b, err := io.WriteString(w, s[i])
+ n += b
+ if err != nil {
+ return n, err
+ }
+ }
+ return n, nil
+}
+
+// WriteTo encode the Tree as Toml and writes it to the writer w.
+// Returns the number of bytes written in case of success, or an error if anything happened.
+func (t *Tree) WriteTo(w io.Writer) (int64, error) {
+ return t.writeTo(w, "", "", 0, false)
+}
+
+// ToTomlString generates a human-readable representation of the current tree.
+// Output spans multiple lines, and is suitable for ingest by a TOML parser.
+// If the conversion cannot be performed, ToString returns a non-nil error.
+func (t *Tree) ToTomlString() (string, error) {
+ var buf bytes.Buffer
+ _, err := t.WriteTo(&buf)
+ if err != nil {
+ return "", err
+ }
+ return buf.String(), nil
+}
+
+// String generates a human-readable representation of the current tree.
+// Alias of ToString. Present to implement the fmt.Stringer interface.
+func (t *Tree) String() string {
+ result, _ := t.ToTomlString()
+ return result
+}
+
+// ToMap recursively generates a representation of the tree using Go built-in structures.
+// The following types are used:
+//
+// * bool
+// * float64
+// * int64
+// * string
+// * uint64
+// * time.Time
+// * map[string]interface{} (where interface{} is any of this list)
+// * []interface{} (where interface{} is any of this list)
+func (t *Tree) ToMap() map[string]interface{} {
+ result := map[string]interface{}{}
+
+ for k, v := range t.values {
+ switch node := v.(type) {
+ case []*Tree:
+ var array []interface{}
+ for _, item := range node {
+ array = append(array, item.ToMap())
+ }
+ result[k] = array
+ case *Tree:
+ result[k] = node.ToMap()
+ case *tomlValue:
+ result[k] = node.value
+ }
+ }
+ return result
+}
diff --git a/vendor/github.com/pkg/errors/.gitignore b/vendor/github.com/pkg/errors/.gitignore
new file mode 100644
index 00000000000..daf913b1b34
--- /dev/null
+++ b/vendor/github.com/pkg/errors/.gitignore
@@ -0,0 +1,24 @@
+# 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/pkg/errors/.travis.yml b/vendor/github.com/pkg/errors/.travis.yml
new file mode 100644
index 00000000000..588ceca183f
--- /dev/null
+++ b/vendor/github.com/pkg/errors/.travis.yml
@@ -0,0 +1,11 @@
+language: go
+go_import_path: github.com/pkg/errors
+go:
+ - 1.4.3
+ - 1.5.4
+ - 1.6.2
+ - 1.7.1
+ - tip
+
+script:
+ - go test -v ./...
diff --git a/vendor/github.com/pkg/errors/LICENSE b/vendor/github.com/pkg/errors/LICENSE
new file mode 100644
index 00000000000..835ba3e755c
--- /dev/null
+++ b/vendor/github.com/pkg/errors/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2015, Dave Cheney
+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.
+
+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 HOLDER 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/pkg/errors/README.md b/vendor/github.com/pkg/errors/README.md
new file mode 100644
index 00000000000..273db3c98ae
--- /dev/null
+++ b/vendor/github.com/pkg/errors/README.md
@@ -0,0 +1,52 @@
+# errors [![Travis-CI](https://travis-ci.org/pkg/errors.svg)](https://travis-ci.org/pkg/errors) [![AppVeyor](https://ci.appveyor.com/api/projects/status/b98mptawhudj53ep/branch/master?svg=true)](https://ci.appveyor.com/project/davecheney/errors/branch/master) [![GoDoc](https://godoc.org/github.com/pkg/errors?status.svg)](http://godoc.org/github.com/pkg/errors) [![Report card](https://goreportcard.com/badge/github.com/pkg/errors)](https://goreportcard.com/report/github.com/pkg/errors)
+
+Package errors provides simple error handling primitives.
+
+`go get github.com/pkg/errors`
+
+The traditional error handling idiom in Go is roughly akin to
+```go
+if err != nil {
+ return err
+}
+```
+which applied recursively up the call stack results in error reports without context or debugging information. The errors package allows programmers to add context to the failure path in their code in a way that does not destroy the original value of the error.
+
+## Adding context to an error
+
+The errors.Wrap function returns a new error that adds context to the original error. For example
+```go
+_, err := ioutil.ReadAll(r)
+if err != nil {
+ return errors.Wrap(err, "read failed")
+}
+```
+## Retrieving the cause of an error
+
+Using `errors.Wrap` constructs a stack of errors, adding context to the preceding error. Depending on the nature of the error it may be necessary to reverse the operation of errors.Wrap to retrieve the original error for inspection. Any error value which implements this interface can be inspected by `errors.Cause`.
+```go
+type causer interface {
+ Cause() error
+}
+```
+`errors.Cause` will recursively retrieve the topmost error which does not implement `causer`, which is assumed to be the original cause. For example:
+```go
+switch err := errors.Cause(err).(type) {
+case *MyError:
+ // handle specifically
+default:
+ // unknown error
+}
+```
+
+[Read the package documentation for more information](https://godoc.org/github.com/pkg/errors).
+
+## Contributing
+
+We welcome pull requests, bug fixes and issue reports. With that said, the bar for adding new symbols to this package is intentionally set high.
+
+Before proposing a change, please discuss your change by raising an issue.
+
+## Licence
+
+BSD-2-Clause
diff --git a/vendor/github.com/pkg/errors/appveyor.yml b/vendor/github.com/pkg/errors/appveyor.yml
new file mode 100644
index 00000000000..a932eade024
--- /dev/null
+++ b/vendor/github.com/pkg/errors/appveyor.yml
@@ -0,0 +1,32 @@
+version: build-{build}.{branch}
+
+clone_folder: C:\gopath\src\github.com\pkg\errors
+shallow_clone: true # for startup speed
+
+environment:
+ GOPATH: C:\gopath
+
+platform:
+ - x64
+
+# http://www.appveyor.com/docs/installed-software
+install:
+ # some helpful output for debugging builds
+ - go version
+ - go env
+ # pre-installed MinGW at C:\MinGW is 32bit only
+ # but MSYS2 at C:\msys64 has mingw64
+ - set PATH=C:\msys64\mingw64\bin;%PATH%
+ - gcc --version
+ - g++ --version
+
+build_script:
+ - go install -v ./...
+
+test_script:
+ - set PATH=C:\gopath\bin;%PATH%
+ - go test -v ./...
+
+#artifacts:
+# - path: '%GOPATH%\bin\*.exe'
+deploy: off
diff --git a/vendor/github.com/pkg/errors/errors.go b/vendor/github.com/pkg/errors/errors.go
new file mode 100644
index 00000000000..842ee80456d
--- /dev/null
+++ b/vendor/github.com/pkg/errors/errors.go
@@ -0,0 +1,269 @@
+// Package errors provides simple error handling primitives.
+//
+// The traditional error handling idiom in Go is roughly akin to
+//
+// if err != nil {
+// return err
+// }
+//
+// which applied recursively up the call stack results in error reports
+// without context or debugging information. The errors package allows
+// programmers to add context to the failure path in their code in a way
+// that does not destroy the original value of the error.
+//
+// Adding context to an error
+//
+// The errors.Wrap function returns a new error that adds context to the
+// original error by recording a stack trace at the point Wrap is called,
+// and the supplied message. For example
+//
+// _, err := ioutil.ReadAll(r)
+// if err != nil {
+// return errors.Wrap(err, "read failed")
+// }
+//
+// If additional control is required the errors.WithStack and errors.WithMessage
+// functions destructure errors.Wrap into its component operations of annotating
+// an error with a stack trace and an a message, respectively.
+//
+// Retrieving the cause of an error
+//
+// Using errors.Wrap constructs a stack of errors, adding context to the
+// preceding error. Depending on the nature of the error it may be necessary
+// to reverse the operation of errors.Wrap to retrieve the original error
+// for inspection. Any error value which implements this interface
+//
+// type causer interface {
+// Cause() error
+// }
+//
+// can be inspected by errors.Cause. errors.Cause will recursively retrieve
+// the topmost error which does not implement causer, which is assumed to be
+// the original cause. For example:
+//
+// switch err := errors.Cause(err).(type) {
+// case *MyError:
+// // handle specifically
+// default:
+// // unknown error
+// }
+//
+// causer interface is not exported by this package, but is considered a part
+// of stable public API.
+//
+// Formatted printing of errors
+//
+// All error values returned from this package implement fmt.Formatter and can
+// be formatted by the fmt package. The following verbs are supported
+//
+// %s print the error. If the error has a Cause it will be
+// printed recursively
+// %v see %s
+// %+v extended format. Each Frame of the error's StackTrace will
+// be printed in detail.
+//
+// Retrieving the stack trace of an error or wrapper
+//
+// New, Errorf, Wrap, and Wrapf record a stack trace at the point they are
+// invoked. This information can be retrieved with the following interface.
+//
+// type stackTracer interface {
+// StackTrace() errors.StackTrace
+// }
+//
+// Where errors.StackTrace is defined as
+//
+// type StackTrace []Frame
+//
+// The Frame type represents a call site in the stack trace. Frame supports
+// the fmt.Formatter interface that can be used for printing information about
+// the stack trace of this error. For example:
+//
+// if err, ok := err.(stackTracer); ok {
+// for _, f := range err.StackTrace() {
+// fmt.Printf("%+s:%d", f)
+// }
+// }
+//
+// stackTracer interface is not exported by this package, but is considered a part
+// of stable public API.
+//
+// See the documentation for Frame.Format for more details.
+package errors
+
+import (
+ "fmt"
+ "io"
+)
+
+// New returns an error with the supplied message.
+// New also records the stack trace at the point it was called.
+func New(message string) error {
+ return &fundamental{
+ msg: message,
+ stack: callers(),
+ }
+}
+
+// Errorf formats according to a format specifier and returns the string
+// as a value that satisfies error.
+// Errorf also records the stack trace at the point it was called.
+func Errorf(format string, args ...interface{}) error {
+ return &fundamental{
+ msg: fmt.Sprintf(format, args...),
+ stack: callers(),
+ }
+}
+
+// fundamental is an error that has a message and a stack, but no caller.
+type fundamental struct {
+ msg string
+ *stack
+}
+
+func (f *fundamental) Error() string { return f.msg }
+
+func (f *fundamental) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ if s.Flag('+') {
+ io.WriteString(s, f.msg)
+ f.stack.Format(s, verb)
+ return
+ }
+ fallthrough
+ case 's':
+ io.WriteString(s, f.msg)
+ case 'q':
+ fmt.Fprintf(s, "%q", f.msg)
+ }
+}
+
+// WithStack annotates err with a stack trace at the point WithStack was called.
+// If err is nil, WithStack returns nil.
+func WithStack(err error) error {
+ if err == nil {
+ return nil
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
+type withStack struct {
+ error
+ *stack
+}
+
+func (w *withStack) Cause() error { return w.error }
+
+func (w *withStack) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ if s.Flag('+') {
+ fmt.Fprintf(s, "%+v", w.Cause())
+ w.stack.Format(s, verb)
+ return
+ }
+ fallthrough
+ case 's':
+ io.WriteString(s, w.Error())
+ case 'q':
+ fmt.Fprintf(s, "%q", w.Error())
+ }
+}
+
+// Wrap returns an error annotating err with a stack trace
+// at the point Wrap is called, and the supplied message.
+// If err is nil, Wrap returns nil.
+func Wrap(err error, message string) error {
+ if err == nil {
+ return nil
+ }
+ err = &withMessage{
+ cause: err,
+ msg: message,
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
+// Wrapf returns an error annotating err with a stack trace
+// at the point Wrapf is call, and the format specifier.
+// If err is nil, Wrapf returns nil.
+func Wrapf(err error, format string, args ...interface{}) error {
+ if err == nil {
+ return nil
+ }
+ err = &withMessage{
+ cause: err,
+ msg: fmt.Sprintf(format, args...),
+ }
+ return &withStack{
+ err,
+ callers(),
+ }
+}
+
+// WithMessage annotates err with a new message.
+// If err is nil, WithMessage returns nil.
+func WithMessage(err error, message string) error {
+ if err == nil {
+ return nil
+ }
+ return &withMessage{
+ cause: err,
+ msg: message,
+ }
+}
+
+type withMessage struct {
+ cause error
+ msg string
+}
+
+func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() }
+func (w *withMessage) Cause() error { return w.cause }
+
+func (w *withMessage) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ if s.Flag('+') {
+ fmt.Fprintf(s, "%+v\n", w.Cause())
+ io.WriteString(s, w.msg)
+ return
+ }
+ fallthrough
+ case 's', 'q':
+ io.WriteString(s, w.Error())
+ }
+}
+
+// Cause returns the underlying cause of the error, if possible.
+// An error value has a cause if it implements the following
+// interface:
+//
+// type causer interface {
+// Cause() error
+// }
+//
+// If the error does not implement Cause, the original error will
+// be returned. If the error is nil, nil will be returned without further
+// investigation.
+func Cause(err error) error {
+ type causer interface {
+ Cause() error
+ }
+
+ for err != nil {
+ cause, ok := err.(causer)
+ if !ok {
+ break
+ }
+ err = cause.Cause()
+ }
+ return err
+}
diff --git a/vendor/github.com/pkg/errors/stack.go b/vendor/github.com/pkg/errors/stack.go
new file mode 100644
index 00000000000..6b1f2891a5a
--- /dev/null
+++ b/vendor/github.com/pkg/errors/stack.go
@@ -0,0 +1,178 @@
+package errors
+
+import (
+ "fmt"
+ "io"
+ "path"
+ "runtime"
+ "strings"
+)
+
+// Frame represents a program counter inside a stack frame.
+type Frame uintptr
+
+// pc returns the program counter for this frame;
+// multiple frames may have the same PC value.
+func (f Frame) pc() uintptr { return uintptr(f) - 1 }
+
+// file returns the full path to the file that contains the
+// function for this Frame's pc.
+func (f Frame) file() string {
+ fn := runtime.FuncForPC(f.pc())
+ if fn == nil {
+ return "unknown"
+ }
+ file, _ := fn.FileLine(f.pc())
+ return file
+}
+
+// line returns the line number of source code of the
+// function for this Frame's pc.
+func (f Frame) line() int {
+ fn := runtime.FuncForPC(f.pc())
+ if fn == nil {
+ return 0
+ }
+ _, line := fn.FileLine(f.pc())
+ return line
+}
+
+// Format formats the frame according to the fmt.Formatter interface.
+//
+// %s source file
+// %d source line
+// %n function name
+// %v equivalent to %s:%d
+//
+// Format accepts flags that alter the printing of some verbs, as follows:
+//
+// %+s path of source file relative to the compile time GOPATH
+// %+v equivalent to %+s:%d
+func (f Frame) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 's':
+ switch {
+ case s.Flag('+'):
+ pc := f.pc()
+ fn := runtime.FuncForPC(pc)
+ if fn == nil {
+ io.WriteString(s, "unknown")
+ } else {
+ file, _ := fn.FileLine(pc)
+ fmt.Fprintf(s, "%s\n\t%s", fn.Name(), file)
+ }
+ default:
+ io.WriteString(s, path.Base(f.file()))
+ }
+ case 'd':
+ fmt.Fprintf(s, "%d", f.line())
+ case 'n':
+ name := runtime.FuncForPC(f.pc()).Name()
+ io.WriteString(s, funcname(name))
+ case 'v':
+ f.Format(s, 's')
+ io.WriteString(s, ":")
+ f.Format(s, 'd')
+ }
+}
+
+// StackTrace is stack of Frames from innermost (newest) to outermost (oldest).
+type StackTrace []Frame
+
+func (st StackTrace) Format(s fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ switch {
+ case s.Flag('+'):
+ for _, f := range st {
+ fmt.Fprintf(s, "\n%+v", f)
+ }
+ case s.Flag('#'):
+ fmt.Fprintf(s, "%#v", []Frame(st))
+ default:
+ fmt.Fprintf(s, "%v", []Frame(st))
+ }
+ case 's':
+ fmt.Fprintf(s, "%s", []Frame(st))
+ }
+}
+
+// stack represents a stack of program counters.
+type stack []uintptr
+
+func (s *stack) Format(st fmt.State, verb rune) {
+ switch verb {
+ case 'v':
+ switch {
+ case st.Flag('+'):
+ for _, pc := range *s {
+ f := Frame(pc)
+ fmt.Fprintf(st, "\n%+v", f)
+ }
+ }
+ }
+}
+
+func (s *stack) StackTrace() StackTrace {
+ f := make([]Frame, len(*s))
+ for i := 0; i < len(f); i++ {
+ f[i] = Frame((*s)[i])
+ }
+ return f
+}
+
+func callers() *stack {
+ const depth = 32
+ var pcs [depth]uintptr
+ n := runtime.Callers(3, pcs[:])
+ var st stack = pcs[0:n]
+ return &st
+}
+
+// funcname removes the path prefix component of a function's name reported by func.Name().
+func funcname(name string) string {
+ i := strings.LastIndex(name, "/")
+ name = name[i+1:]
+ i = strings.Index(name, ".")
+ return name[i+1:]
+}
+
+func trimGOPATH(name, file string) string {
+ // Here we want to get the source file path relative to the compile time
+ // GOPATH. As of Go 1.6.x there is no direct way to know the compiled
+ // GOPATH at runtime, but we can infer the number of path segments in the
+ // GOPATH. We note that fn.Name() returns the function name qualified by
+ // the import path, which does not include the GOPATH. Thus we can trim
+ // segments from the beginning of the file path until the number of path
+ // separators remaining is one more than the number of path separators in
+ // the function name. For example, given:
+ //
+ // GOPATH /home/user
+ // file /home/user/src/pkg/sub/file.go
+ // fn.Name() pkg/sub.Type.Method
+ //
+ // We want to produce:
+ //
+ // pkg/sub/file.go
+ //
+ // From this we can easily see that fn.Name() has one less path separator
+ // than our desired output. We count separators from the end of the file
+ // path until it finds two more than in the function name and then move
+ // one character forward to preserve the initial path segment without a
+ // leading separator.
+ const sep = "/"
+ goal := strings.Count(name, sep) + 2
+ i := len(file)
+ for n := 0; n < goal; n++ {
+ i = strings.LastIndex(file[:i], sep)
+ if i == -1 {
+ // not enough separators found, set i so that the slice expression
+ // below leaves file unmodified
+ i = -len(sep)
+ break
+ }
+ }
+ // get back to 0 or trim the leading separator
+ file = file[i+len(sep):]
+ return file
+}
diff --git a/vendor/github.com/sirupsen/logrus/.gitignore b/vendor/github.com/sirupsen/logrus/.gitignore
new file mode 100644
index 00000000000..66be63a0057
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/.gitignore
@@ -0,0 +1 @@
+logrus
diff --git a/vendor/github.com/sirupsen/logrus/.travis.yml b/vendor/github.com/sirupsen/logrus/.travis.yml
new file mode 100644
index 00000000000..a23296a53ba
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/.travis.yml
@@ -0,0 +1,15 @@
+language: go
+go:
+ - 1.6.x
+ - 1.7.x
+ - 1.8.x
+ - tip
+env:
+ - GOMAXPROCS=4 GORACE=halt_on_error=1
+install:
+ - go get github.com/stretchr/testify/assert
+ - go get gopkg.in/gemnasium/logrus-airbrake-hook.v2
+ - go get golang.org/x/sys/unix
+ - go get golang.org/x/sys/windows
+script:
+ - go test -race -v ./...
diff --git a/vendor/github.com/sirupsen/logrus/CHANGELOG.md b/vendor/github.com/sirupsen/logrus/CHANGELOG.md
new file mode 100644
index 00000000000..1bd1deb2947
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/CHANGELOG.md
@@ -0,0 +1,123 @@
+# 1.0.5
+
+* Fix hooks race (#707)
+* Fix panic deadlock (#695)
+
+# 1.0.4
+
+* Fix race when adding hooks (#612)
+* Fix terminal check in AppEngine (#635)
+
+# 1.0.3
+
+* Replace example files with testable examples
+
+# 1.0.2
+
+* bug: quote non-string values in text formatter (#583)
+* Make (*Logger) SetLevel a public method
+
+# 1.0.1
+
+* bug: fix escaping in text formatter (#575)
+
+# 1.0.0
+
+* Officially changed name to lower-case
+* bug: colors on Windows 10 (#541)
+* bug: fix race in accessing level (#512)
+
+# 0.11.5
+
+* feature: add writer and writerlevel to entry (#372)
+
+# 0.11.4
+
+* bug: fix undefined variable on solaris (#493)
+
+# 0.11.3
+
+* formatter: configure quoting of empty values (#484)
+* formatter: configure quoting character (default is `"`) (#484)
+* bug: fix not importing io correctly in non-linux environments (#481)
+
+# 0.11.2
+
+* bug: fix windows terminal detection (#476)
+
+# 0.11.1
+
+* bug: fix tty detection with custom out (#471)
+
+# 0.11.0
+
+* performance: Use bufferpool to allocate (#370)
+* terminal: terminal detection for app-engine (#343)
+* feature: exit handler (#375)
+
+# 0.10.0
+
+* feature: Add a test hook (#180)
+* feature: `ParseLevel` is now case-insensitive (#326)
+* feature: `FieldLogger` interface that generalizes `Logger` and `Entry` (#308)
+* performance: avoid re-allocations on `WithFields` (#335)
+
+# 0.9.0
+
+* logrus/text_formatter: don't emit empty msg
+* logrus/hooks/airbrake: move out of main repository
+* logrus/hooks/sentry: move out of main repository
+* logrus/hooks/papertrail: move out of main repository
+* logrus/hooks/bugsnag: move out of main repository
+* logrus/core: run tests with `-race`
+* logrus/core: detect TTY based on `stderr`
+* logrus/core: support `WithError` on logger
+* logrus/core: Solaris support
+
+# 0.8.7
+
+* logrus/core: fix possible race (#216)
+* logrus/doc: small typo fixes and doc improvements
+
+
+# 0.8.6
+
+* hooks/raven: allow passing an initialized client
+
+# 0.8.5
+
+* logrus/core: revert #208
+
+# 0.8.4
+
+* formatter/text: fix data race (#218)
+
+# 0.8.3
+
+* logrus/core: fix entry log level (#208)
+* logrus/core: improve performance of text formatter by 40%
+* logrus/core: expose `LevelHooks` type
+* logrus/core: add support for DragonflyBSD and NetBSD
+* formatter/text: print structs more verbosely
+
+# 0.8.2
+
+* logrus: fix more Fatal family functions
+
+# 0.8.1
+
+* logrus: fix not exiting on `Fatalf` and `Fatalln`
+
+# 0.8.0
+
+* logrus: defaults to stderr instead of stdout
+* hooks/sentry: add special field for `*http.Request`
+* formatter/text: ignore Windows for colors
+
+# 0.7.3
+
+* formatter/\*: allow configuration of timestamp layout
+
+# 0.7.2
+
+* formatter/text: Add configuration option for time format (#158)
diff --git a/vendor/github.com/sirupsen/logrus/LICENSE b/vendor/github.com/sirupsen/logrus/LICENSE
new file mode 100644
index 00000000000..f090cb42f37
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Simon Eskildsen
+
+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/sirupsen/logrus/README.md b/vendor/github.com/sirupsen/logrus/README.md
new file mode 100644
index 00000000000..f77819b1686
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/README.md
@@ -0,0 +1,511 @@
+# Logrus [![Build Status](https://travis-ci.org/sirupsen/logrus.svg?branch=master)](https://travis-ci.org/sirupsen/logrus) [![GoDoc](https://godoc.org/github.com/sirupsen/logrus?status.svg)](https://godoc.org/github.com/sirupsen/logrus)
+
+Logrus is a structured logger for Go (golang), completely API compatible with
+the standard library logger.
+
+**Seeing weird case-sensitive problems?** It's in the past been possible to
+import Logrus as both upper- and lower-case. Due to the Go package environment,
+this caused issues in the community and we needed a standard. Some environments
+experienced problems with the upper-case variant, so the lower-case was decided.
+Everything using `logrus` will need to use the lower-case:
+`github.com/sirupsen/logrus`. Any package that isn't, should be changed.
+
+To fix Glide, see [these
+comments](https://github.com/sirupsen/logrus/issues/553#issuecomment-306591437).
+For an in-depth explanation of the casing issue, see [this
+comment](https://github.com/sirupsen/logrus/issues/570#issuecomment-313933276).
+
+**Are you interested in assisting in maintaining Logrus?** Currently I have a
+lot of obligations, and I am unable to provide Logrus with the maintainership it
+needs. If you'd like to help, please reach out to me at `simon at author's
+username dot com`.
+
+Nicely color-coded in development (when a TTY is attached, otherwise just
+plain text):
+
+![Colored](http://i.imgur.com/PY7qMwd.png)
+
+With `log.SetFormatter(&log.JSONFormatter{})`, for easy parsing by logstash
+or Splunk:
+
+```json
+{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the
+ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"}
+
+{"level":"warning","msg":"The group's number increased tremendously!",
+"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"}
+
+{"animal":"walrus","level":"info","msg":"A giant walrus appears!",
+"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"}
+
+{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.",
+"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"}
+
+{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true,
+"time":"2014-03-10 19:57:38.562543128 -0400 EDT"}
+```
+
+With the default `log.SetFormatter(&log.TextFormatter{})` when a TTY is not
+attached, the output is compatible with the
+[logfmt](http://godoc.org/github.com/kr/logfmt) format:
+
+```text
+time="2015-03-26T01:27:38-04:00" level=debug msg="Started observing beach" animal=walrus number=8
+time="2015-03-26T01:27:38-04:00" level=info msg="A group of walrus emerges from the ocean" animal=walrus size=10
+time="2015-03-26T01:27:38-04:00" level=warning msg="The group's number increased tremendously!" number=122 omg=true
+time="2015-03-26T01:27:38-04:00" level=debug msg="Temperature changes" temperature=-4
+time="2015-03-26T01:27:38-04:00" level=panic msg="It's over 9000!" animal=orca size=9009
+time="2015-03-26T01:27:38-04:00" level=fatal msg="The ice breaks!" err=&{0x2082280c0 map[animal:orca size:9009] 2015-03-26 01:27:38.441574009 -0400 EDT panic It's over 9000!} number=100 omg=true
+exit status 1
+```
+
+#### Case-sensitivity
+
+The organization's name was changed to lower-case--and this will not be changed
+back. If you are getting import conflicts due to case sensitivity, please use
+the lower-case import: `github.com/sirupsen/logrus`.
+
+#### Example
+
+The simplest way to use Logrus is simply the package-level exported logger:
+
+```go
+package main
+
+import (
+ log "github.com/sirupsen/logrus"
+)
+
+func main() {
+ log.WithFields(log.Fields{
+ "animal": "walrus",
+ }).Info("A walrus appears")
+}
+```
+
+Note that it's completely api-compatible with the stdlib logger, so you can
+replace your `log` imports everywhere with `log "github.com/sirupsen/logrus"`
+and you'll now have the flexibility of Logrus. You can customize it all you
+want:
+
+```go
+package main
+
+import (
+ "os"
+ log "github.com/sirupsen/logrus"
+)
+
+func init() {
+ // Log as JSON instead of the default ASCII formatter.
+ log.SetFormatter(&log.JSONFormatter{})
+
+ // Output to stdout instead of the default stderr
+ // Can be any io.Writer, see below for File example
+ log.SetOutput(os.Stdout)
+
+ // Only log the warning severity or above.
+ log.SetLevel(log.WarnLevel)
+}
+
+func main() {
+ log.WithFields(log.Fields{
+ "animal": "walrus",
+ "size": 10,
+ }).Info("A group of walrus emerges from the ocean")
+
+ log.WithFields(log.Fields{
+ "omg": true,
+ "number": 122,
+ }).Warn("The group's number increased tremendously!")
+
+ log.WithFields(log.Fields{
+ "omg": true,
+ "number": 100,
+ }).Fatal("The ice breaks!")
+
+ // A common pattern is to re-use fields between logging statements by re-using
+ // the logrus.Entry returned from WithFields()
+ contextLogger := log.WithFields(log.Fields{
+ "common": "this is a common field",
+ "other": "I also should be logged always",
+ })
+
+ contextLogger.Info("I'll be logged with common and other field")
+ contextLogger.Info("Me too")
+}
+```
+
+For more advanced usage such as logging to multiple locations from the same
+application, you can also create an instance of the `logrus` Logger:
+
+```go
+package main
+
+import (
+ "os"
+ "github.com/sirupsen/logrus"
+)
+
+// Create a new instance of the logger. You can have any number of instances.
+var log = logrus.New()
+
+func main() {
+ // The API for setting attributes is a little different than the package level
+ // exported logger. See Godoc.
+ log.Out = os.Stdout
+
+ // You could set this to any `io.Writer` such as a file
+ // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY, 0666)
+ // if err == nil {
+ // log.Out = file
+ // } else {
+ // log.Info("Failed to log to file, using default stderr")
+ // }
+
+ log.WithFields(logrus.Fields{
+ "animal": "walrus",
+ "size": 10,
+ }).Info("A group of walrus emerges from the ocean")
+}
+```
+
+#### Fields
+
+Logrus encourages careful, structured logging through logging fields instead of
+long, unparseable error messages. For example, instead of: `log.Fatalf("Failed
+to send event %s to topic %s with key %d")`, you should log the much more
+discoverable:
+
+```go
+log.WithFields(log.Fields{
+ "event": event,
+ "topic": topic,
+ "key": key,
+}).Fatal("Failed to send event")
+```
+
+We've found this API forces you to think about logging in a way that produces
+much more useful logging messages. We've been in countless situations where just
+a single added field to a log statement that was already there would've saved us
+hours. The `WithFields` call is optional.
+
+In general, with Logrus using any of the `printf`-family functions should be
+seen as a hint you should add a field, however, you can still use the
+`printf`-family functions with Logrus.
+
+#### Default Fields
+
+Often it's helpful to have fields _always_ attached to log statements in an
+application or parts of one. For example, you may want to always log the
+`request_id` and `user_ip` in the context of a request. Instead of writing
+`log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})` on
+every line, you can create a `logrus.Entry` to pass around instead:
+
+```go
+requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})
+requestLogger.Info("something happened on that request") # will log request_id and user_ip
+requestLogger.Warn("something not great happened")
+```
+
+#### Hooks
+
+You can add hooks for logging levels. For example to send errors to an exception
+tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to
+multiple places simultaneously, e.g. syslog.
+
+Logrus comes with [built-in hooks](hooks/). Add those, or your custom hook, in
+`init`:
+
+```go
+import (
+ log "github.com/sirupsen/logrus"
+ "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake"
+ logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
+ "log/syslog"
+)
+
+func init() {
+
+ // Use the Airbrake hook to report errors that have Error severity or above to
+ // an exception tracker. You can create custom hooks, see the Hooks section.
+ log.AddHook(airbrake.NewHook(123, "xyz", "production"))
+
+ hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
+ if err != nil {
+ log.Error("Unable to connect to local syslog daemon")
+ } else {
+ log.AddHook(hook)
+ }
+}
+```
+Note: Syslog hook also support connecting to local syslog (Ex. "/dev/log" or "/var/run/syslog" or "/var/run/log"). For the detail, please check the [syslog hook README](hooks/syslog/README.md).
+
+| Hook | Description |
+| ----- | ----------- |
+| [Airbrake "legacy"](https://github.com/gemnasium/logrus-airbrake-legacy-hook) | Send errors to an exception tracking service compatible with the Airbrake API V2. Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. |
+| [Airbrake](https://github.com/gemnasium/logrus-airbrake-hook) | Send errors to the Airbrake API V3. Uses the official [`gobrake`](https://github.com/airbrake/gobrake) behind the scenes. |
+| [Amazon Kinesis](https://github.com/evalphobia/logrus_kinesis) | Hook for logging to [Amazon Kinesis](https://aws.amazon.com/kinesis/) |
+| [Amqp-Hook](https://github.com/vladoatanasov/logrus_amqp) | Hook for logging to Amqp broker (Like RabbitMQ) |
+| [Application Insights](https://github.com/jjcollinge/logrus-appinsights) | Hook for logging to [Application Insights](https://azure.microsoft.com/en-us/services/application-insights/)
+| [AzureTableHook](https://github.com/kpfaulkner/azuretablehook/) | Hook for logging to Azure Table Storage|
+| [Bugsnag](https://github.com/Shopify/logrus-bugsnag/blob/master/bugsnag.go) | Send errors to the Bugsnag exception tracking service. |
+| [DeferPanic](https://github.com/deferpanic/dp-logrus) | Hook for logging to DeferPanic |
+| [Discordrus](https://github.com/kz/discordrus) | Hook for logging to [Discord](https://discordapp.com/) |
+| [ElasticSearch](https://github.com/sohlich/elogrus) | Hook for logging to ElasticSearch|
+| [Firehose](https://github.com/beaubrewer/logrus_firehose) | Hook for logging to [Amazon Firehose](https://aws.amazon.com/kinesis/firehose/)
+| [Fluentd](https://github.com/evalphobia/logrus_fluent) | Hook for logging to fluentd |
+| [Go-Slack](https://github.com/multiplay/go-slack) | Hook for logging to [Slack](https://slack.com) |
+| [Graylog](https://github.com/gemnasium/logrus-graylog-hook) | Hook for logging to [Graylog](http://graylog2.org/) |
+| [Hiprus](https://github.com/nubo/hiprus) | Send errors to a channel in hipchat. |
+| [Honeybadger](https://github.com/agonzalezro/logrus_honeybadger) | Hook for sending exceptions to Honeybadger |
+| [InfluxDB](https://github.com/Abramovic/logrus_influxdb) | Hook for logging to influxdb |
+| [Influxus](http://github.com/vlad-doru/influxus) | Hook for concurrently logging to [InfluxDB](http://influxdata.com/) |
+| [Journalhook](https://github.com/wercker/journalhook) | Hook for logging to `systemd-journald` |
+| [KafkaLogrus](https://github.com/tracer0tong/kafkalogrus) | Hook for logging to Kafka |
+| [Kafka REST Proxy](https://github.com/Nordstrom/logrus-kafka-rest-proxy) | Hook for logging to [Kafka REST Proxy](https://docs.confluent.io/current/kafka-rest/docs) |
+| [LFShook](https://github.com/rifflock/lfshook) | Hook for logging to the local filesystem |
+| [Logbeat](https://github.com/macandmia/logbeat) | Hook for logging to [Opbeat](https://opbeat.com/) |
+| [Logentries](https://github.com/jcftang/logentriesrus) | Hook for logging to [Logentries](https://logentries.com/) |
+| [Logentrus](https://github.com/puddingfactory/logentrus) | Hook for logging to [Logentries](https://logentries.com/) |
+| [Logmatic.io](https://github.com/logmatic/logmatic-go) | Hook for logging to [Logmatic.io](http://logmatic.io/) |
+| [Logrusly](https://github.com/sebest/logrusly) | Send logs to [Loggly](https://www.loggly.com/) |
+| [Logstash](https://github.com/bshuster-repo/logrus-logstash-hook) | Hook for logging to [Logstash](https://www.elastic.co/products/logstash) |
+| [Mail](https://github.com/zbindenren/logrus_mail) | Hook for sending exceptions via mail |
+| [Mattermost](https://github.com/shuLhan/mattermost-integration/tree/master/hooks/logrus) | Hook for logging to [Mattermost](https://mattermost.com/) |
+| [Mongodb](https://github.com/weekface/mgorus) | Hook for logging to mongodb |
+| [NATS-Hook](https://github.com/rybit/nats_logrus_hook) | Hook for logging to [NATS](https://nats.io) |
+| [Octokit](https://github.com/dorajistyle/logrus-octokit-hook) | Hook for logging to github via octokit |
+| [Papertrail](https://github.com/polds/logrus-papertrail-hook) | Send errors to the [Papertrail](https://papertrailapp.com) hosted logging service via UDP. |
+| [PostgreSQL](https://github.com/gemnasium/logrus-postgresql-hook) | Send logs to [PostgreSQL](http://postgresql.org) |
+| [Promrus](https://github.com/weaveworks/promrus) | Expose number of log messages as [Prometheus](https://prometheus.io/) metrics |
+| [Pushover](https://github.com/toorop/logrus_pushover) | Send error via [Pushover](https://pushover.net) |
+| [Raygun](https://github.com/squirkle/logrus-raygun-hook) | Hook for logging to [Raygun.io](http://raygun.io/) |
+| [Redis-Hook](https://github.com/rogierlommers/logrus-redis-hook) | Hook for logging to a ELK stack (through Redis) |
+| [Rollrus](https://github.com/heroku/rollrus) | Hook for sending errors to rollbar |
+| [Scribe](https://github.com/sagar8192/logrus-scribe-hook) | Hook for logging to [Scribe](https://github.com/facebookarchive/scribe)|
+| [Sentry](https://github.com/evalphobia/logrus_sentry) | Send errors to the Sentry error logging and aggregation service. |
+| [Slackrus](https://github.com/johntdyer/slackrus) | Hook for Slack chat. |
+| [Stackdriver](https://github.com/knq/sdhook) | Hook for logging to [Google Stackdriver](https://cloud.google.com/logging/) |
+| [Sumorus](https://github.com/doublefree/sumorus) | Hook for logging to [SumoLogic](https://www.sumologic.com/)|
+| [Syslog](https://github.com/sirupsen/logrus/blob/master/hooks/syslog/syslog.go) | Send errors to remote syslog server. Uses standard library `log/syslog` behind the scenes. |
+| [Syslog TLS](https://github.com/shinji62/logrus-syslog-ng) | Send errors to remote syslog server with TLS support. |
+| [Telegram](https://github.com/rossmcdonald/telegram_hook) | Hook for logging errors to [Telegram](https://telegram.org/) |
+| [TraceView](https://github.com/evalphobia/logrus_appneta) | Hook for logging to [AppNeta TraceView](https://www.appneta.com/products/traceview/) |
+| [Typetalk](https://github.com/dragon3/logrus-typetalk-hook) | Hook for logging to [Typetalk](https://www.typetalk.in/) |
+| [logz.io](https://github.com/ripcurld00d/logrus-logzio-hook) | Hook for logging to [logz.io](https://logz.io), a Log as a Service using Logstash |
+| [SQS-Hook](https://github.com/tsarpaul/logrus_sqs) | Hook for logging to [Amazon Simple Queue Service (SQS)](https://aws.amazon.com/sqs/) |
+
+#### Level logging
+
+Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic.
+
+```go
+log.Debug("Useful debugging information.")
+log.Info("Something noteworthy happened!")
+log.Warn("You should probably take a look at this.")
+log.Error("Something failed but I'm not quitting.")
+// Calls os.Exit(1) after logging
+log.Fatal("Bye.")
+// Calls panic() after logging
+log.Panic("I'm bailing.")
+```
+
+You can set the logging level on a `Logger`, then it will only log entries with
+that severity or anything above it:
+
+```go
+// Will log anything that is info or above (warn, error, fatal, panic). Default.
+log.SetLevel(log.InfoLevel)
+```
+
+It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose
+environment if your application has that.
+
+#### Entries
+
+Besides the fields added with `WithField` or `WithFields` some fields are
+automatically added to all logging events:
+
+1. `time`. The timestamp when the entry was created.
+2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after
+ the `AddFields` call. E.g. `Failed to send event.`
+3. `level`. The logging level. E.g. `info`.
+
+#### Environments
+
+Logrus has no notion of environment.
+
+If you wish for hooks and formatters to only be used in specific environments,
+you should handle that yourself. For example, if your application has a global
+variable `Environment`, which is a string representation of the environment you
+could do:
+
+```go
+import (
+ log "github.com/sirupsen/logrus"
+)
+
+init() {
+ // do something here to set environment depending on an environment variable
+ // or command-line flag
+ if Environment == "production" {
+ log.SetFormatter(&log.JSONFormatter{})
+ } else {
+ // The TextFormatter is default, you don't actually have to do this.
+ log.SetFormatter(&log.TextFormatter{})
+ }
+}
+```
+
+This configuration is how `logrus` was intended to be used, but JSON in
+production is mostly only useful if you do log aggregation with tools like
+Splunk or Logstash.
+
+#### Formatters
+
+The built-in logging formatters are:
+
+* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise
+ without colors.
+ * *Note:* to force colored output when there is no TTY, set the `ForceColors`
+ field to `true`. To force no colored output even if there is a TTY set the
+ `DisableColors` field to `true`. For Windows, see
+ [github.com/mattn/go-colorable](https://github.com/mattn/go-colorable).
+ * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#TextFormatter).
+* `logrus.JSONFormatter`. Logs fields as JSON.
+ * All options are listed in the [generated docs](https://godoc.org/github.com/sirupsen/logrus#JSONFormatter).
+
+Third party logging formatters:
+
+* [`FluentdFormatter`](https://github.com/joonix/log). Formats entries that can be parsed by Kubernetes and Google Container Engine.
+* [`logstash`](https://github.com/bshuster-repo/logrus-logstash-hook). Logs fields as [Logstash](http://logstash.net) Events.
+* [`prefixed`](https://github.com/x-cray/logrus-prefixed-formatter). Displays log entry source along with alternative layout.
+* [`zalgo`](https://github.com/aybabtme/logzalgo). Invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚f̝͍̠ ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗l͖͎g̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦.
+
+You can define your formatter by implementing the `Formatter` interface,
+requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a
+`Fields` type (`map[string]interface{}`) with all your fields as well as the
+default ones (see Entries section above):
+
+```go
+type MyJSONFormatter struct {
+}
+
+log.SetFormatter(new(MyJSONFormatter))
+
+func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) {
+ // Note this doesn't include Time, Level and Message which are available on
+ // the Entry. Consult `godoc` on information about those fields or read the
+ // source of the official loggers.
+ serialized, err := json.Marshal(entry.Data)
+ if err != nil {
+ return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
+ }
+ return append(serialized, '\n'), nil
+}
+```
+
+#### Logger as an `io.Writer`
+
+Logrus can be transformed into an `io.Writer`. That writer is the end of an `io.Pipe` and it is your responsibility to close it.
+
+```go
+w := logger.Writer()
+defer w.Close()
+
+srv := http.Server{
+ // create a stdlib log.Logger that writes to
+ // logrus.Logger.
+ ErrorLog: log.New(w, "", 0),
+}
+```
+
+Each line written to that writer will be printed the usual way, using formatters
+and hooks. The level for those entries is `info`.
+
+This means that we can override the standard library logger easily:
+
+```go
+logger := logrus.New()
+logger.Formatter = &logrus.JSONFormatter{}
+
+// Use logrus for standard log output
+// Note that `log` here references stdlib's log
+// Not logrus imported under the name `log`.
+log.SetOutput(logger.Writer())
+```
+
+#### Rotation
+
+Log rotation is not provided with Logrus. Log rotation should be done by an
+external program (like `logrotate(8)`) that can compress and delete old log
+entries. It should not be a feature of the application-level logger.
+
+#### Tools
+
+| Tool | Description |
+| ---- | ----------- |
+|[Logrus Mate](https://github.com/gogap/logrus_mate)|Logrus mate is a tool for Logrus to manage loggers, you can initial logger's level, hook and formatter by config file, the logger will generated with different config at different environment.|
+|[Logrus Viper Helper](https://github.com/heirko/go-contrib/tree/master/logrusHelper)|An Helper around Logrus to wrap with spf13/Viper to load configuration with fangs! And to simplify Logrus configuration use some behavior of [Logrus Mate](https://github.com/gogap/logrus_mate). [sample](https://github.com/heirko/iris-contrib/blob/master/middleware/logrus-logger/example) |
+
+#### Testing
+
+Logrus has a built in facility for asserting the presence of log messages. This is implemented through the `test` hook and provides:
+
+* decorators for existing logger (`test.NewLocal` and `test.NewGlobal`) which basically just add the `test` hook
+* a test logger (`test.NewNullLogger`) that just records log messages (and does not output any):
+
+```go
+import(
+ "github.com/sirupsen/logrus"
+ "github.com/sirupsen/logrus/hooks/test"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestSomething(t*testing.T){
+ logger, hook := test.NewNullLogger()
+ logger.Error("Helloerror")
+
+ assert.Equal(t, 1, len(hook.Entries))
+ assert.Equal(t, logrus.ErrorLevel, hook.LastEntry().Level)
+ assert.Equal(t, "Helloerror", hook.LastEntry().Message)
+
+ hook.Reset()
+ assert.Nil(t, hook.LastEntry())
+}
+```
+
+#### Fatal handlers
+
+Logrus can register one or more functions that will be called when any `fatal`
+level message is logged. The registered handlers will be executed before
+logrus performs a `os.Exit(1)`. This behavior may be helpful if callers need
+to gracefully shutdown. Unlike a `panic("Something went wrong...")` call which can be intercepted with a deferred `recover` a call to `os.Exit(1)` can not be intercepted.
+
+```
+...
+handler := func() {
+ // gracefully shutdown something...
+}
+logrus.RegisterExitHandler(handler)
+...
+```
+
+#### Thread safety
+
+By default Logger is protected by mutex for concurrent writes, this mutex is invoked when calling hooks and writing logs.
+If you are sure such locking is not needed, you can call logger.SetNoLock() to disable the locking.
+
+Situation when locking is not needed includes:
+
+* You have no hooks registered, or hooks calling is already thread-safe.
+
+* Writing to logger.Out is already thread-safe, for example:
+
+ 1) logger.Out is protected by locks.
+
+ 2) logger.Out is a os.File handler opened with `O_APPEND` flag, and every write is smaller than 4k. (This allow multi-thread/multi-process writing)
+
+ (Refer to http://www.notthewizard.com/2014/06/17/are-files-appends-really-atomic/)
diff --git a/vendor/github.com/sirupsen/logrus/alt_exit.go b/vendor/github.com/sirupsen/logrus/alt_exit.go
new file mode 100644
index 00000000000..8af90637a99
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/alt_exit.go
@@ -0,0 +1,64 @@
+package logrus
+
+// The following code was sourced and modified from the
+// https://github.com/tebeka/atexit package governed by the following license:
+//
+// Copyright (c) 2012 Miki Tebeka .
+//
+// 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.
+
+import (
+ "fmt"
+ "os"
+)
+
+var handlers = []func(){}
+
+func runHandler(handler func()) {
+ defer func() {
+ if err := recover(); err != nil {
+ fmt.Fprintln(os.Stderr, "Error: Logrus exit handler error:", err)
+ }
+ }()
+
+ handler()
+}
+
+func runHandlers() {
+ for _, handler := range handlers {
+ runHandler(handler)
+ }
+}
+
+// Exit runs all the Logrus atexit handlers and then terminates the program using os.Exit(code)
+func Exit(code int) {
+ runHandlers()
+ os.Exit(code)
+}
+
+// RegisterExitHandler adds a Logrus Exit handler, call logrus.Exit to invoke
+// all handlers. The handlers will also be invoked when any Fatal log entry is
+// made.
+//
+// This method is useful when a caller wishes to use logrus to log a fatal
+// message but also needs to gracefully shutdown. An example usecase could be
+// closing database connections, or sending a alert that the application is
+// closing.
+func RegisterExitHandler(handler func()) {
+ handlers = append(handlers, handler)
+}
diff --git a/vendor/github.com/sirupsen/logrus/appveyor.yml b/vendor/github.com/sirupsen/logrus/appveyor.yml
new file mode 100644
index 00000000000..96c2ce15f84
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/appveyor.yml
@@ -0,0 +1,14 @@
+version: "{build}"
+platform: x64
+clone_folder: c:\gopath\src\github.com\sirupsen\logrus
+environment:
+ GOPATH: c:\gopath
+branches:
+ only:
+ - master
+install:
+ - set PATH=%GOPATH%\bin;c:\go\bin;%PATH%
+ - go version
+build_script:
+ - go get -t
+ - go test
diff --git a/vendor/github.com/sirupsen/logrus/doc.go b/vendor/github.com/sirupsen/logrus/doc.go
new file mode 100644
index 00000000000..da67aba06de
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/doc.go
@@ -0,0 +1,26 @@
+/*
+Package logrus is a structured logger for Go, completely API compatible with the standard library logger.
+
+
+The simplest way to use Logrus is simply the package-level exported logger:
+
+ package main
+
+ import (
+ log "github.com/sirupsen/logrus"
+ )
+
+ func main() {
+ log.WithFields(log.Fields{
+ "animal": "walrus",
+ "number": 1,
+ "size": 10,
+ }).Info("A walrus appears")
+ }
+
+Output:
+ time="2015-09-07T08:48:33Z" level=info msg="A walrus appears" animal=walrus number=1 size=10
+
+For a full guide visit https://github.com/sirupsen/logrus
+*/
+package logrus
diff --git a/vendor/github.com/sirupsen/logrus/entry.go b/vendor/github.com/sirupsen/logrus/entry.go
new file mode 100644
index 00000000000..778f4c9f0d3
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/entry.go
@@ -0,0 +1,288 @@
+package logrus
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+ "sync"
+ "time"
+)
+
+var bufferPool *sync.Pool
+
+func init() {
+ bufferPool = &sync.Pool{
+ New: func() interface{} {
+ return new(bytes.Buffer)
+ },
+ }
+}
+
+// Defines the key when adding errors using WithError.
+var ErrorKey = "error"
+
+// An entry is the final or intermediate Logrus logging entry. It contains all
+// the fields passed with WithField{,s}. It's finally logged when Debug, Info,
+// Warn, Error, Fatal or Panic is called on it. These objects can be reused and
+// passed around as much as you wish to avoid field duplication.
+type Entry struct {
+ Logger *Logger
+
+ // Contains all the fields set by the user.
+ Data Fields
+
+ // Time at which the log entry was created
+ Time time.Time
+
+ // Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic
+ // This field will be set on entry firing and the value will be equal to the one in Logger struct field.
+ Level Level
+
+ // Message passed to Debug, Info, Warn, Error, Fatal or Panic
+ Message string
+
+ // When formatter is called in entry.log(), an Buffer may be set to entry
+ Buffer *bytes.Buffer
+}
+
+func NewEntry(logger *Logger) *Entry {
+ return &Entry{
+ Logger: logger,
+ // Default is three fields, give a little extra room
+ Data: make(Fields, 5),
+ }
+}
+
+// Returns the string representation from the reader and ultimately the
+// formatter.
+func (entry *Entry) String() (string, error) {
+ serialized, err := entry.Logger.Formatter.Format(entry)
+ if err != nil {
+ return "", err
+ }
+ str := string(serialized)
+ return str, nil
+}
+
+// Add an error as single field (using the key defined in ErrorKey) to the Entry.
+func (entry *Entry) WithError(err error) *Entry {
+ return entry.WithField(ErrorKey, err)
+}
+
+// Add a single field to the Entry.
+func (entry *Entry) WithField(key string, value interface{}) *Entry {
+ return entry.WithFields(Fields{key: value})
+}
+
+// Add a map of fields to the Entry.
+func (entry *Entry) WithFields(fields Fields) *Entry {
+ data := make(Fields, len(entry.Data)+len(fields))
+ for k, v := range entry.Data {
+ data[k] = v
+ }
+ for k, v := range fields {
+ data[k] = v
+ }
+ return &Entry{Logger: entry.Logger, Data: data}
+}
+
+// This function is not declared with a pointer value because otherwise
+// race conditions will occur when using multiple goroutines
+func (entry Entry) log(level Level, msg string) {
+ var buffer *bytes.Buffer
+ entry.Time = time.Now()
+ entry.Level = level
+ entry.Message = msg
+
+ entry.fireHooks()
+
+ buffer = bufferPool.Get().(*bytes.Buffer)
+ buffer.Reset()
+ defer bufferPool.Put(buffer)
+ entry.Buffer = buffer
+
+ entry.write()
+
+ entry.Buffer = nil
+
+ // To avoid Entry#log() returning a value that only would make sense for
+ // panic() to use in Entry#Panic(), we avoid the allocation by checking
+ // directly here.
+ if level <= PanicLevel {
+ panic(&entry)
+ }
+}
+
+// This function is not declared with a pointer value because otherwise
+// race conditions will occur when using multiple goroutines
+func (entry Entry) fireHooks() {
+ entry.Logger.mu.Lock()
+ defer entry.Logger.mu.Unlock()
+ err := entry.Logger.Hooks.Fire(entry.Level, &entry)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to fire hook: %v\n", err)
+ }
+}
+
+func (entry *Entry) write() {
+ serialized, err := entry.Logger.Formatter.Format(entry)
+ entry.Logger.mu.Lock()
+ defer entry.Logger.mu.Unlock()
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v\n", err)
+ } else {
+ _, err = entry.Logger.Out.Write(serialized)
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to write to log, %v\n", err)
+ }
+ }
+}
+
+func (entry *Entry) Debug(args ...interface{}) {
+ if entry.Logger.level() >= DebugLevel {
+ entry.log(DebugLevel, fmt.Sprint(args...))
+ }
+}
+
+func (entry *Entry) Print(args ...interface{}) {
+ entry.Info(args...)
+}
+
+func (entry *Entry) Info(args ...interface{}) {
+ if entry.Logger.level() >= InfoLevel {
+ entry.log(InfoLevel, fmt.Sprint(args...))
+ }
+}
+
+func (entry *Entry) Warn(args ...interface{}) {
+ if entry.Logger.level() >= WarnLevel {
+ entry.log(WarnLevel, fmt.Sprint(args...))
+ }
+}
+
+func (entry *Entry) Warning(args ...interface{}) {
+ entry.Warn(args...)
+}
+
+func (entry *Entry) Error(args ...interface{}) {
+ if entry.Logger.level() >= ErrorLevel {
+ entry.log(ErrorLevel, fmt.Sprint(args...))
+ }
+}
+
+func (entry *Entry) Fatal(args ...interface{}) {
+ if entry.Logger.level() >= FatalLevel {
+ entry.log(FatalLevel, fmt.Sprint(args...))
+ }
+ Exit(1)
+}
+
+func (entry *Entry) Panic(args ...interface{}) {
+ if entry.Logger.level() >= PanicLevel {
+ entry.log(PanicLevel, fmt.Sprint(args...))
+ }
+ panic(fmt.Sprint(args...))
+}
+
+// Entry Printf family functions
+
+func (entry *Entry) Debugf(format string, args ...interface{}) {
+ if entry.Logger.level() >= DebugLevel {
+ entry.Debug(fmt.Sprintf(format, args...))
+ }
+}
+
+func (entry *Entry) Infof(format string, args ...interface{}) {
+ if entry.Logger.level() >= InfoLevel {
+ entry.Info(fmt.Sprintf(format, args...))
+ }
+}
+
+func (entry *Entry) Printf(format string, args ...interface{}) {
+ entry.Infof(format, args...)
+}
+
+func (entry *Entry) Warnf(format string, args ...interface{}) {
+ if entry.Logger.level() >= WarnLevel {
+ entry.Warn(fmt.Sprintf(format, args...))
+ }
+}
+
+func (entry *Entry) Warningf(format string, args ...interface{}) {
+ entry.Warnf(format, args...)
+}
+
+func (entry *Entry) Errorf(format string, args ...interface{}) {
+ if entry.Logger.level() >= ErrorLevel {
+ entry.Error(fmt.Sprintf(format, args...))
+ }
+}
+
+func (entry *Entry) Fatalf(format string, args ...interface{}) {
+ if entry.Logger.level() >= FatalLevel {
+ entry.Fatal(fmt.Sprintf(format, args...))
+ }
+ Exit(1)
+}
+
+func (entry *Entry) Panicf(format string, args ...interface{}) {
+ if entry.Logger.level() >= PanicLevel {
+ entry.Panic(fmt.Sprintf(format, args...))
+ }
+}
+
+// Entry Println family functions
+
+func (entry *Entry) Debugln(args ...interface{}) {
+ if entry.Logger.level() >= DebugLevel {
+ entry.Debug(entry.sprintlnn(args...))
+ }
+}
+
+func (entry *Entry) Infoln(args ...interface{}) {
+ if entry.Logger.level() >= InfoLevel {
+ entry.Info(entry.sprintlnn(args...))
+ }
+}
+
+func (entry *Entry) Println(args ...interface{}) {
+ entry.Infoln(args...)
+}
+
+func (entry *Entry) Warnln(args ...interface{}) {
+ if entry.Logger.level() >= WarnLevel {
+ entry.Warn(entry.sprintlnn(args...))
+ }
+}
+
+func (entry *Entry) Warningln(args ...interface{}) {
+ entry.Warnln(args...)
+}
+
+func (entry *Entry) Errorln(args ...interface{}) {
+ if entry.Logger.level() >= ErrorLevel {
+ entry.Error(entry.sprintlnn(args...))
+ }
+}
+
+func (entry *Entry) Fatalln(args ...interface{}) {
+ if entry.Logger.level() >= FatalLevel {
+ entry.Fatal(entry.sprintlnn(args...))
+ }
+ Exit(1)
+}
+
+func (entry *Entry) Panicln(args ...interface{}) {
+ if entry.Logger.level() >= PanicLevel {
+ entry.Panic(entry.sprintlnn(args...))
+ }
+}
+
+// Sprintlnn => Sprint no newline. This is to get the behavior of how
+// fmt.Sprintln where spaces are always added between operands, regardless of
+// their type. Instead of vendoring the Sprintln implementation to spare a
+// string allocation, we do the simplest thing.
+func (entry *Entry) sprintlnn(args ...interface{}) string {
+ msg := fmt.Sprintln(args...)
+ return msg[:len(msg)-1]
+}
diff --git a/vendor/github.com/sirupsen/logrus/exported.go b/vendor/github.com/sirupsen/logrus/exported.go
new file mode 100644
index 00000000000..013183edabf
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/exported.go
@@ -0,0 +1,193 @@
+package logrus
+
+import (
+ "io"
+)
+
+var (
+ // std is the name of the standard logger in stdlib `log`
+ std = New()
+)
+
+func StandardLogger() *Logger {
+ return std
+}
+
+// SetOutput sets the standard logger output.
+func SetOutput(out io.Writer) {
+ std.mu.Lock()
+ defer std.mu.Unlock()
+ std.Out = out
+}
+
+// SetFormatter sets the standard logger formatter.
+func SetFormatter(formatter Formatter) {
+ std.mu.Lock()
+ defer std.mu.Unlock()
+ std.Formatter = formatter
+}
+
+// SetLevel sets the standard logger level.
+func SetLevel(level Level) {
+ std.mu.Lock()
+ defer std.mu.Unlock()
+ std.SetLevel(level)
+}
+
+// GetLevel returns the standard logger level.
+func GetLevel() Level {
+ std.mu.Lock()
+ defer std.mu.Unlock()
+ return std.level()
+}
+
+// AddHook adds a hook to the standard logger hooks.
+func AddHook(hook Hook) {
+ std.mu.Lock()
+ defer std.mu.Unlock()
+ std.Hooks.Add(hook)
+}
+
+// WithError creates an entry from the standard logger and adds an error to it, using the value defined in ErrorKey as key.
+func WithError(err error) *Entry {
+ return std.WithField(ErrorKey, err)
+}
+
+// WithField creates an entry from the standard logger and adds a field to
+// it. If you want multiple fields, use `WithFields`.
+//
+// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
+// or Panic on the Entry it returns.
+func WithField(key string, value interface{}) *Entry {
+ return std.WithField(key, value)
+}
+
+// WithFields creates an entry from the standard logger and adds multiple
+// fields to it. This is simply a helper for `WithField`, invoking it
+// once for each field.
+//
+// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal
+// or Panic on the Entry it returns.
+func WithFields(fields Fields) *Entry {
+ return std.WithFields(fields)
+}
+
+// Debug logs a message at level Debug on the standard logger.
+func Debug(args ...interface{}) {
+ std.Debug(args...)
+}
+
+// Print logs a message at level Info on the standard logger.
+func Print(args ...interface{}) {
+ std.Print(args...)
+}
+
+// Info logs a message at level Info on the standard logger.
+func Info(args ...interface{}) {
+ std.Info(args...)
+}
+
+// Warn logs a message at level Warn on the standard logger.
+func Warn(args ...interface{}) {
+ std.Warn(args...)
+}
+
+// Warning logs a message at level Warn on the standard logger.
+func Warning(args ...interface{}) {
+ std.Warning(args...)
+}
+
+// Error logs a message at level Error on the standard logger.
+func Error(args ...interface{}) {
+ std.Error(args...)
+}
+
+// Panic logs a message at level Panic on the standard logger.
+func Panic(args ...interface{}) {
+ std.Panic(args...)
+}
+
+// Fatal logs a message at level Fatal on the standard logger.
+func Fatal(args ...interface{}) {
+ std.Fatal(args...)
+}
+
+// Debugf logs a message at level Debug on the standard logger.
+func Debugf(format string, args ...interface{}) {
+ std.Debugf(format, args...)
+}
+
+// Printf logs a message at level Info on the standard logger.
+func Printf(format string, args ...interface{}) {
+ std.Printf(format, args...)
+}
+
+// Infof logs a message at level Info on the standard logger.
+func Infof(format string, args ...interface{}) {
+ std.Infof(format, args...)
+}
+
+// Warnf logs a message at level Warn on the standard logger.
+func Warnf(format string, args ...interface{}) {
+ std.Warnf(format, args...)
+}
+
+// Warningf logs a message at level Warn on the standard logger.
+func Warningf(format string, args ...interface{}) {
+ std.Warningf(format, args...)
+}
+
+// Errorf logs a message at level Error on the standard logger.
+func Errorf(format string, args ...interface{}) {
+ std.Errorf(format, args...)
+}
+
+// Panicf logs a message at level Panic on the standard logger.
+func Panicf(format string, args ...interface{}) {
+ std.Panicf(format, args...)
+}
+
+// Fatalf logs a message at level Fatal on the standard logger.
+func Fatalf(format string, args ...interface{}) {
+ std.Fatalf(format, args...)
+}
+
+// Debugln logs a message at level Debug on the standard logger.
+func Debugln(args ...interface{}) {
+ std.Debugln(args...)
+}
+
+// Println logs a message at level Info on the standard logger.
+func Println(args ...interface{}) {
+ std.Println(args...)
+}
+
+// Infoln logs a message at level Info on the standard logger.
+func Infoln(args ...interface{}) {
+ std.Infoln(args...)
+}
+
+// Warnln logs a message at level Warn on the standard logger.
+func Warnln(args ...interface{}) {
+ std.Warnln(args...)
+}
+
+// Warningln logs a message at level Warn on the standard logger.
+func Warningln(args ...interface{}) {
+ std.Warningln(args...)
+}
+
+// Errorln logs a message at level Error on the standard logger.
+func Errorln(args ...interface{}) {
+ std.Errorln(args...)
+}
+
+// Panicln logs a message at level Panic on the standard logger.
+func Panicln(args ...interface{}) {
+ std.Panicln(args...)
+}
+
+// Fatalln logs a message at level Fatal on the standard logger.
+func Fatalln(args ...interface{}) {
+ std.Fatalln(args...)
+}
diff --git a/vendor/github.com/sirupsen/logrus/formatter.go b/vendor/github.com/sirupsen/logrus/formatter.go
new file mode 100644
index 00000000000..b183ff5b1db
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/formatter.go
@@ -0,0 +1,45 @@
+package logrus
+
+import "time"
+
+const defaultTimestampFormat = time.RFC3339
+
+// The Formatter interface is used to implement a custom Formatter. It takes an
+// `Entry`. It exposes all the fields, including the default ones:
+//
+// * `entry.Data["msg"]`. The message passed from Info, Warn, Error ..
+// * `entry.Data["time"]`. The timestamp.
+// * `entry.Data["level"]. The level the entry was logged at.
+//
+// Any additional fields added with `WithField` or `WithFields` are also in
+// `entry.Data`. Format is expected to return an array of bytes which are then
+// logged to `logger.Out`.
+type Formatter interface {
+ Format(*Entry) ([]byte, error)
+}
+
+// This is to not silently overwrite `time`, `msg` and `level` fields when
+// dumping it. If this code wasn't there doing:
+//
+// logrus.WithField("level", 1).Info("hello")
+//
+// Would just silently drop the user provided level. Instead with this code
+// it'll logged as:
+//
+// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."}
+//
+// It's not exported because it's still using Data in an opinionated way. It's to
+// avoid code duplication between the two default formatters.
+func prefixFieldClashes(data Fields) {
+ if t, ok := data["time"]; ok {
+ data["fields.time"] = t
+ }
+
+ if m, ok := data["msg"]; ok {
+ data["fields.msg"] = m
+ }
+
+ if l, ok := data["level"]; ok {
+ data["fields.level"] = l
+ }
+}
diff --git a/vendor/github.com/sirupsen/logrus/hooks.go b/vendor/github.com/sirupsen/logrus/hooks.go
new file mode 100644
index 00000000000..3f151cdc392
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/hooks.go
@@ -0,0 +1,34 @@
+package logrus
+
+// A hook to be fired when logging on the logging levels returned from
+// `Levels()` on your implementation of the interface. Note that this is not
+// fired in a goroutine or a channel with workers, you should handle such
+// functionality yourself if your call is non-blocking and you don't wish for
+// the logging calls for levels returned from `Levels()` to block.
+type Hook interface {
+ Levels() []Level
+ Fire(*Entry) error
+}
+
+// Internal type for storing the hooks on a logger instance.
+type LevelHooks map[Level][]Hook
+
+// Add a hook to an instance of logger. This is called with
+// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface.
+func (hooks LevelHooks) Add(hook Hook) {
+ for _, level := range hook.Levels() {
+ hooks[level] = append(hooks[level], hook)
+ }
+}
+
+// Fire all the hooks for the passed level. Used by `entry.log` to fire
+// appropriate hooks for a log entry.
+func (hooks LevelHooks) Fire(level Level, entry *Entry) error {
+ for _, hook := range hooks[level] {
+ if err := hook.Fire(entry); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/vendor/github.com/sirupsen/logrus/json_formatter.go b/vendor/github.com/sirupsen/logrus/json_formatter.go
new file mode 100644
index 00000000000..fb01c1b1040
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/json_formatter.go
@@ -0,0 +1,79 @@
+package logrus
+
+import (
+ "encoding/json"
+ "fmt"
+)
+
+type fieldKey string
+
+// FieldMap allows customization of the key names for default fields.
+type FieldMap map[fieldKey]string
+
+// Default key names for the default fields
+const (
+ FieldKeyMsg = "msg"
+ FieldKeyLevel = "level"
+ FieldKeyTime = "time"
+)
+
+func (f FieldMap) resolve(key fieldKey) string {
+ if k, ok := f[key]; ok {
+ return k
+ }
+
+ return string(key)
+}
+
+// JSONFormatter formats logs into parsable json
+type JSONFormatter struct {
+ // TimestampFormat sets the format used for marshaling timestamps.
+ TimestampFormat string
+
+ // DisableTimestamp allows disabling automatic timestamps in output
+ DisableTimestamp bool
+
+ // FieldMap allows users to customize the names of keys for default fields.
+ // As an example:
+ // formatter := &JSONFormatter{
+ // FieldMap: FieldMap{
+ // FieldKeyTime: "@timestamp",
+ // FieldKeyLevel: "@level",
+ // FieldKeyMsg: "@message",
+ // },
+ // }
+ FieldMap FieldMap
+}
+
+// Format renders a single log entry
+func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) {
+ data := make(Fields, len(entry.Data)+3)
+ for k, v := range entry.Data {
+ switch v := v.(type) {
+ case error:
+ // Otherwise errors are ignored by `encoding/json`
+ // https://github.com/sirupsen/logrus/issues/137
+ data[k] = v.Error()
+ default:
+ data[k] = v
+ }
+ }
+ prefixFieldClashes(data)
+
+ timestampFormat := f.TimestampFormat
+ if timestampFormat == "" {
+ timestampFormat = defaultTimestampFormat
+ }
+
+ if !f.DisableTimestamp {
+ data[f.FieldMap.resolve(FieldKeyTime)] = entry.Time.Format(timestampFormat)
+ }
+ data[f.FieldMap.resolve(FieldKeyMsg)] = entry.Message
+ data[f.FieldMap.resolve(FieldKeyLevel)] = entry.Level.String()
+
+ serialized, err := json.Marshal(data)
+ if err != nil {
+ return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
+ }
+ return append(serialized, '\n'), nil
+}
diff --git a/vendor/github.com/sirupsen/logrus/logger.go b/vendor/github.com/sirupsen/logrus/logger.go
new file mode 100644
index 00000000000..fdaf8a65341
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/logger.go
@@ -0,0 +1,323 @@
+package logrus
+
+import (
+ "io"
+ "os"
+ "sync"
+ "sync/atomic"
+)
+
+type Logger struct {
+ // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a
+ // file, or leave it default which is `os.Stderr`. You can also set this to
+ // something more adventorous, such as logging to Kafka.
+ Out io.Writer
+ // Hooks for the logger instance. These allow firing events based on logging
+ // levels and log entries. For example, to send errors to an error tracking
+ // service, log to StatsD or dump the core on fatal errors.
+ Hooks LevelHooks
+ // All log entries pass through the formatter before logged to Out. The
+ // included formatters are `TextFormatter` and `JSONFormatter` for which
+ // TextFormatter is the default. In development (when a TTY is attached) it
+ // logs with colors, but to a file it wouldn't. You can easily implement your
+ // own that implements the `Formatter` interface, see the `README` or included
+ // formatters for examples.
+ Formatter Formatter
+ // The logging level the logger should log at. This is typically (and defaults
+ // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be
+ // logged.
+ Level Level
+ // Used to sync writing to the log. Locking is enabled by Default
+ mu MutexWrap
+ // Reusable empty entry
+ entryPool sync.Pool
+}
+
+type MutexWrap struct {
+ lock sync.Mutex
+ disabled bool
+}
+
+func (mw *MutexWrap) Lock() {
+ if !mw.disabled {
+ mw.lock.Lock()
+ }
+}
+
+func (mw *MutexWrap) Unlock() {
+ if !mw.disabled {
+ mw.lock.Unlock()
+ }
+}
+
+func (mw *MutexWrap) Disable() {
+ mw.disabled = true
+}
+
+// Creates a new logger. Configuration should be set by changing `Formatter`,
+// `Out` and `Hooks` directly on the default logger instance. You can also just
+// instantiate your own:
+//
+// var log = &Logger{
+// Out: os.Stderr,
+// Formatter: new(JSONFormatter),
+// Hooks: make(LevelHooks),
+// Level: logrus.DebugLevel,
+// }
+//
+// It's recommended to make this a global instance called `log`.
+func New() *Logger {
+ return &Logger{
+ Out: os.Stderr,
+ Formatter: new(TextFormatter),
+ Hooks: make(LevelHooks),
+ Level: InfoLevel,
+ }
+}
+
+func (logger *Logger) newEntry() *Entry {
+ entry, ok := logger.entryPool.Get().(*Entry)
+ if ok {
+ return entry
+ }
+ return NewEntry(logger)
+}
+
+func (logger *Logger) releaseEntry(entry *Entry) {
+ logger.entryPool.Put(entry)
+}
+
+// Adds a field to the log entry, note that it doesn't log until you call
+// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry.
+// If you want multiple fields, use `WithFields`.
+func (logger *Logger) WithField(key string, value interface{}) *Entry {
+ entry := logger.newEntry()
+ defer logger.releaseEntry(entry)
+ return entry.WithField(key, value)
+}
+
+// Adds a struct of fields to the log entry. All it does is call `WithField` for
+// each `Field`.
+func (logger *Logger) WithFields(fields Fields) *Entry {
+ entry := logger.newEntry()
+ defer logger.releaseEntry(entry)
+ return entry.WithFields(fields)
+}
+
+// Add an error as single field to the log entry. All it does is call
+// `WithError` for the given `error`.
+func (logger *Logger) WithError(err error) *Entry {
+ entry := logger.newEntry()
+ defer logger.releaseEntry(entry)
+ return entry.WithError(err)
+}
+
+func (logger *Logger) Debugf(format string, args ...interface{}) {
+ if logger.level() >= DebugLevel {
+ entry := logger.newEntry()
+ entry.Debugf(format, args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Infof(format string, args ...interface{}) {
+ if logger.level() >= InfoLevel {
+ entry := logger.newEntry()
+ entry.Infof(format, args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Printf(format string, args ...interface{}) {
+ entry := logger.newEntry()
+ entry.Printf(format, args...)
+ logger.releaseEntry(entry)
+}
+
+func (logger *Logger) Warnf(format string, args ...interface{}) {
+ if logger.level() >= WarnLevel {
+ entry := logger.newEntry()
+ entry.Warnf(format, args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Warningf(format string, args ...interface{}) {
+ if logger.level() >= WarnLevel {
+ entry := logger.newEntry()
+ entry.Warnf(format, args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Errorf(format string, args ...interface{}) {
+ if logger.level() >= ErrorLevel {
+ entry := logger.newEntry()
+ entry.Errorf(format, args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Fatalf(format string, args ...interface{}) {
+ if logger.level() >= FatalLevel {
+ entry := logger.newEntry()
+ entry.Fatalf(format, args...)
+ logger.releaseEntry(entry)
+ }
+ Exit(1)
+}
+
+func (logger *Logger) Panicf(format string, args ...interface{}) {
+ if logger.level() >= PanicLevel {
+ entry := logger.newEntry()
+ entry.Panicf(format, args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Debug(args ...interface{}) {
+ if logger.level() >= DebugLevel {
+ entry := logger.newEntry()
+ entry.Debug(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Info(args ...interface{}) {
+ if logger.level() >= InfoLevel {
+ entry := logger.newEntry()
+ entry.Info(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Print(args ...interface{}) {
+ entry := logger.newEntry()
+ entry.Info(args...)
+ logger.releaseEntry(entry)
+}
+
+func (logger *Logger) Warn(args ...interface{}) {
+ if logger.level() >= WarnLevel {
+ entry := logger.newEntry()
+ entry.Warn(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Warning(args ...interface{}) {
+ if logger.level() >= WarnLevel {
+ entry := logger.newEntry()
+ entry.Warn(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Error(args ...interface{}) {
+ if logger.level() >= ErrorLevel {
+ entry := logger.newEntry()
+ entry.Error(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Fatal(args ...interface{}) {
+ if logger.level() >= FatalLevel {
+ entry := logger.newEntry()
+ entry.Fatal(args...)
+ logger.releaseEntry(entry)
+ }
+ Exit(1)
+}
+
+func (logger *Logger) Panic(args ...interface{}) {
+ if logger.level() >= PanicLevel {
+ entry := logger.newEntry()
+ entry.Panic(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Debugln(args ...interface{}) {
+ if logger.level() >= DebugLevel {
+ entry := logger.newEntry()
+ entry.Debugln(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Infoln(args ...interface{}) {
+ if logger.level() >= InfoLevel {
+ entry := logger.newEntry()
+ entry.Infoln(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Println(args ...interface{}) {
+ entry := logger.newEntry()
+ entry.Println(args...)
+ logger.releaseEntry(entry)
+}
+
+func (logger *Logger) Warnln(args ...interface{}) {
+ if logger.level() >= WarnLevel {
+ entry := logger.newEntry()
+ entry.Warnln(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Warningln(args ...interface{}) {
+ if logger.level() >= WarnLevel {
+ entry := logger.newEntry()
+ entry.Warnln(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Errorln(args ...interface{}) {
+ if logger.level() >= ErrorLevel {
+ entry := logger.newEntry()
+ entry.Errorln(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+func (logger *Logger) Fatalln(args ...interface{}) {
+ if logger.level() >= FatalLevel {
+ entry := logger.newEntry()
+ entry.Fatalln(args...)
+ logger.releaseEntry(entry)
+ }
+ Exit(1)
+}
+
+func (logger *Logger) Panicln(args ...interface{}) {
+ if logger.level() >= PanicLevel {
+ entry := logger.newEntry()
+ entry.Panicln(args...)
+ logger.releaseEntry(entry)
+ }
+}
+
+//When file is opened with appending mode, it's safe to
+//write concurrently to a file (within 4k message on Linux).
+//In these cases user can choose to disable the lock.
+func (logger *Logger) SetNoLock() {
+ logger.mu.Disable()
+}
+
+func (logger *Logger) level() Level {
+ return Level(atomic.LoadUint32((*uint32)(&logger.Level)))
+}
+
+func (logger *Logger) SetLevel(level Level) {
+ atomic.StoreUint32((*uint32)(&logger.Level), uint32(level))
+}
+
+func (logger *Logger) AddHook(hook Hook) {
+ logger.mu.Lock()
+ defer logger.mu.Unlock()
+ logger.Hooks.Add(hook)
+}
diff --git a/vendor/github.com/sirupsen/logrus/logrus.go b/vendor/github.com/sirupsen/logrus/logrus.go
new file mode 100644
index 00000000000..dd38999741e
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/logrus.go
@@ -0,0 +1,143 @@
+package logrus
+
+import (
+ "fmt"
+ "log"
+ "strings"
+)
+
+// Fields type, used to pass to `WithFields`.
+type Fields map[string]interface{}
+
+// Level type
+type Level uint32
+
+// Convert the Level to a string. E.g. PanicLevel becomes "panic".
+func (level Level) String() string {
+ switch level {
+ case DebugLevel:
+ return "debug"
+ case InfoLevel:
+ return "info"
+ case WarnLevel:
+ return "warning"
+ case ErrorLevel:
+ return "error"
+ case FatalLevel:
+ return "fatal"
+ case PanicLevel:
+ return "panic"
+ }
+
+ return "unknown"
+}
+
+// ParseLevel takes a string level and returns the Logrus log level constant.
+func ParseLevel(lvl string) (Level, error) {
+ switch strings.ToLower(lvl) {
+ case "panic":
+ return PanicLevel, nil
+ case "fatal":
+ return FatalLevel, nil
+ case "error":
+ return ErrorLevel, nil
+ case "warn", "warning":
+ return WarnLevel, nil
+ case "info":
+ return InfoLevel, nil
+ case "debug":
+ return DebugLevel, nil
+ }
+
+ var l Level
+ return l, fmt.Errorf("not a valid logrus Level: %q", lvl)
+}
+
+// A constant exposing all logging levels
+var AllLevels = []Level{
+ PanicLevel,
+ FatalLevel,
+ ErrorLevel,
+ WarnLevel,
+ InfoLevel,
+ DebugLevel,
+}
+
+// These are the different logging levels. You can set the logging level to log
+// on your instance of logger, obtained with `logrus.New()`.
+const (
+ // PanicLevel level, highest level of severity. Logs and then calls panic with the
+ // message passed to Debug, Info, ...
+ PanicLevel Level = iota
+ // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the
+ // logging level is set to Panic.
+ FatalLevel
+ // ErrorLevel level. Logs. Used for errors that should definitely be noted.
+ // Commonly used for hooks to send errors to an error tracking service.
+ ErrorLevel
+ // WarnLevel level. Non-critical entries that deserve eyes.
+ WarnLevel
+ // InfoLevel level. General operational entries about what's going on inside the
+ // application.
+ InfoLevel
+ // DebugLevel level. Usually only enabled when debugging. Very verbose logging.
+ DebugLevel
+)
+
+// Won't compile if StdLogger can't be realized by a log.Logger
+var (
+ _ StdLogger = &log.Logger{}
+ _ StdLogger = &Entry{}
+ _ StdLogger = &Logger{}
+)
+
+// StdLogger is what your logrus-enabled library should take, that way
+// it'll accept a stdlib logger and a logrus logger. There's no standard
+// interface, this is the closest we get, unfortunately.
+type StdLogger interface {
+ Print(...interface{})
+ Printf(string, ...interface{})
+ Println(...interface{})
+
+ Fatal(...interface{})
+ Fatalf(string, ...interface{})
+ Fatalln(...interface{})
+
+ Panic(...interface{})
+ Panicf(string, ...interface{})
+ Panicln(...interface{})
+}
+
+// The FieldLogger interface generalizes the Entry and Logger types
+type FieldLogger interface {
+ WithField(key string, value interface{}) *Entry
+ WithFields(fields Fields) *Entry
+ WithError(err error) *Entry
+
+ Debugf(format string, args ...interface{})
+ Infof(format string, args ...interface{})
+ Printf(format string, args ...interface{})
+ Warnf(format string, args ...interface{})
+ Warningf(format string, args ...interface{})
+ Errorf(format string, args ...interface{})
+ Fatalf(format string, args ...interface{})
+ Panicf(format string, args ...interface{})
+
+ Debug(args ...interface{})
+ Info(args ...interface{})
+ Print(args ...interface{})
+ Warn(args ...interface{})
+ Warning(args ...interface{})
+ Error(args ...interface{})
+ Fatal(args ...interface{})
+ Panic(args ...interface{})
+
+ Debugln(args ...interface{})
+ Infoln(args ...interface{})
+ Println(args ...interface{})
+ Warnln(args ...interface{})
+ Warningln(args ...interface{})
+ Errorln(args ...interface{})
+ Fatalln(args ...interface{})
+ Panicln(args ...interface{})
+}
diff --git a/vendor/github.com/sirupsen/logrus/terminal_bsd.go b/vendor/github.com/sirupsen/logrus/terminal_bsd.go
new file mode 100644
index 00000000000..4880d13d26d
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/terminal_bsd.go
@@ -0,0 +1,10 @@
+// +build darwin freebsd openbsd netbsd dragonfly
+// +build !appengine,!gopherjs
+
+package logrus
+
+import "golang.org/x/sys/unix"
+
+const ioctlReadTermios = unix.TIOCGETA
+
+type Termios unix.Termios
diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
new file mode 100644
index 00000000000..3de08e802fd
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/terminal_check_appengine.go
@@ -0,0 +1,11 @@
+// +build appengine gopherjs
+
+package logrus
+
+import (
+ "io"
+)
+
+func checkIfTerminal(w io.Writer) bool {
+ return true
+}
diff --git a/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
new file mode 100644
index 00000000000..067047a1233
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go
@@ -0,0 +1,19 @@
+// +build !appengine,!gopherjs
+
+package logrus
+
+import (
+ "io"
+ "os"
+
+ "golang.org/x/crypto/ssh/terminal"
+)
+
+func checkIfTerminal(w io.Writer) bool {
+ switch v := w.(type) {
+ case *os.File:
+ return terminal.IsTerminal(int(v.Fd()))
+ default:
+ return false
+ }
+}
diff --git a/vendor/github.com/sirupsen/logrus/terminal_linux.go b/vendor/github.com/sirupsen/logrus/terminal_linux.go
new file mode 100644
index 00000000000..f29a0097c81
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/terminal_linux.go
@@ -0,0 +1,14 @@
+// Based on ssh/terminal:
+// 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.
+
+// +build !appengine,!gopherjs
+
+package logrus
+
+import "golang.org/x/sys/unix"
+
+const ioctlReadTermios = unix.TCGETS
+
+type Termios unix.Termios
diff --git a/vendor/github.com/sirupsen/logrus/text_formatter.go b/vendor/github.com/sirupsen/logrus/text_formatter.go
new file mode 100644
index 00000000000..61b21caea45
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/text_formatter.go
@@ -0,0 +1,178 @@
+package logrus
+
+import (
+ "bytes"
+ "fmt"
+ "sort"
+ "strings"
+ "sync"
+ "time"
+)
+
+const (
+ nocolor = 0
+ red = 31
+ green = 32
+ yellow = 33
+ blue = 36
+ gray = 37
+)
+
+var (
+ baseTimestamp time.Time
+)
+
+func init() {
+ baseTimestamp = time.Now()
+}
+
+// TextFormatter formats logs into text
+type TextFormatter struct {
+ // Set to true to bypass checking for a TTY before outputting colors.
+ ForceColors bool
+
+ // Force disabling colors.
+ DisableColors bool
+
+ // Disable timestamp logging. useful when output is redirected to logging
+ // system that already adds timestamps.
+ DisableTimestamp bool
+
+ // Enable logging the full timestamp when a TTY is attached instead of just
+ // the time passed since beginning of execution.
+ FullTimestamp bool
+
+ // TimestampFormat to use for display when a full timestamp is printed
+ TimestampFormat string
+
+ // The fields are sorted by default for a consistent output. For applications
+ // that log extremely frequently and don't use the JSON formatter this may not
+ // be desired.
+ DisableSorting bool
+
+ // QuoteEmptyFields will wrap empty fields in quotes if true
+ QuoteEmptyFields bool
+
+ // Whether the logger's out is to a terminal
+ isTerminal bool
+
+ sync.Once
+}
+
+func (f *TextFormatter) init(entry *Entry) {
+ if entry.Logger != nil {
+ f.isTerminal = checkIfTerminal(entry.Logger.Out)
+ }
+}
+
+// Format renders a single log entry
+func (f *TextFormatter) Format(entry *Entry) ([]byte, error) {
+ var b *bytes.Buffer
+ keys := make([]string, 0, len(entry.Data))
+ for k := range entry.Data {
+ keys = append(keys, k)
+ }
+
+ if !f.DisableSorting {
+ sort.Strings(keys)
+ }
+ if entry.Buffer != nil {
+ b = entry.Buffer
+ } else {
+ b = &bytes.Buffer{}
+ }
+
+ prefixFieldClashes(entry.Data)
+
+ f.Do(func() { f.init(entry) })
+
+ isColored := (f.ForceColors || f.isTerminal) && !f.DisableColors
+
+ timestampFormat := f.TimestampFormat
+ if timestampFormat == "" {
+ timestampFormat = defaultTimestampFormat
+ }
+ if isColored {
+ f.printColored(b, entry, keys, timestampFormat)
+ } else {
+ if !f.DisableTimestamp {
+ f.appendKeyValue(b, "time", entry.Time.Format(timestampFormat))
+ }
+ f.appendKeyValue(b, "level", entry.Level.String())
+ if entry.Message != "" {
+ f.appendKeyValue(b, "msg", entry.Message)
+ }
+ for _, key := range keys {
+ f.appendKeyValue(b, key, entry.Data[key])
+ }
+ }
+
+ b.WriteByte('\n')
+ return b.Bytes(), nil
+}
+
+func (f *TextFormatter) printColored(b *bytes.Buffer, entry *Entry, keys []string, timestampFormat string) {
+ var levelColor int
+ switch entry.Level {
+ case DebugLevel:
+ levelColor = gray
+ case WarnLevel:
+ levelColor = yellow
+ case ErrorLevel, FatalLevel, PanicLevel:
+ levelColor = red
+ default:
+ levelColor = blue
+ }
+
+ levelText := strings.ToUpper(entry.Level.String())[0:4]
+
+ if f.DisableTimestamp {
+ fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m %-44s ", levelColor, levelText, entry.Message)
+ } else if !f.FullTimestamp {
+ fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, int(entry.Time.Sub(baseTimestamp)/time.Second), entry.Message)
+ } else {
+ fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%s] %-44s ", levelColor, levelText, entry.Time.Format(timestampFormat), entry.Message)
+ }
+ for _, k := range keys {
+ v := entry.Data[k]
+ fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=", levelColor, k)
+ f.appendValue(b, v)
+ }
+}
+
+func (f *TextFormatter) needsQuoting(text string) bool {
+ if f.QuoteEmptyFields && len(text) == 0 {
+ return true
+ }
+ for _, ch := range text {
+ if !((ch >= 'a' && ch <= 'z') ||
+ (ch >= 'A' && ch <= 'Z') ||
+ (ch >= '0' && ch <= '9') ||
+ ch == '-' || ch == '.' || ch == '_' || ch == '/' || ch == '@' || ch == '^' || ch == '+') {
+ return true
+ }
+ }
+ return false
+}
+
+func (f *TextFormatter) appendKeyValue(b *bytes.Buffer, key string, value interface{}) {
+ if b.Len() > 0 {
+ b.WriteByte(' ')
+ }
+ b.WriteString(key)
+ b.WriteByte('=')
+ f.appendValue(b, value)
+}
+
+func (f *TextFormatter) appendValue(b *bytes.Buffer, value interface{}) {
+ stringVal, ok := value.(string)
+ if !ok {
+ stringVal = fmt.Sprint(value)
+ }
+
+ if !f.needsQuoting(stringVal) {
+ b.WriteString(stringVal)
+ } else {
+ b.WriteString(fmt.Sprintf("%q", stringVal))
+ }
+}
diff --git a/vendor/github.com/sirupsen/logrus/writer.go b/vendor/github.com/sirupsen/logrus/writer.go
new file mode 100644
index 00000000000..7bdebedc60b
--- /dev/null
+++ b/vendor/github.com/sirupsen/logrus/writer.go
@@ -0,0 +1,62 @@
+package logrus
+
+import (
+ "bufio"
+ "io"
+ "runtime"
+)
+
+func (logger *Logger) Writer() *io.PipeWriter {
+ return logger.WriterLevel(InfoLevel)
+}
+
+func (logger *Logger) WriterLevel(level Level) *io.PipeWriter {
+ return NewEntry(logger).WriterLevel(level)
+}
+
+func (entry *Entry) Writer() *io.PipeWriter {
+ return entry.WriterLevel(InfoLevel)
+}
+
+func (entry *Entry) WriterLevel(level Level) *io.PipeWriter {
+ reader, writer := io.Pipe()
+
+ var printFunc func(args ...interface{})
+
+ switch level {
+ case DebugLevel:
+ printFunc = entry.Debug
+ case InfoLevel:
+ printFunc = entry.Info
+ case WarnLevel:
+ printFunc = entry.Warn
+ case ErrorLevel:
+ printFunc = entry.Error
+ case FatalLevel:
+ printFunc = entry.Fatal
+ case PanicLevel:
+ printFunc = entry.Panic
+ default:
+ printFunc = entry.Print
+ }
+
+ go entry.writerScanner(reader, printFunc)
+ runtime.SetFinalizer(writer, writerFinalizer)
+
+ return writer
+}
+
+func (entry *Entry) writerScanner(reader *io.PipeReader, printFunc func(args ...interface{})) {
+ scanner := bufio.NewScanner(reader)
+ for scanner.Scan() {
+ printFunc(scanner.Text())
+ }
+ if err := scanner.Err(); err != nil {
+ entry.Errorf("Error while reading from Writer: %s", err)
+ }
+ reader.Close()
+}
+
+func writerFinalizer(writer *io.PipeWriter) {
+ writer.Close()
+}
diff --git a/vendor/github.com/spf13/afero/.travis.yml b/vendor/github.com/spf13/afero/.travis.yml
new file mode 100644
index 00000000000..0637db726de
--- /dev/null
+++ b/vendor/github.com/spf13/afero/.travis.yml
@@ -0,0 +1,21 @@
+sudo: false
+language: go
+
+go:
+ - 1.9
+ - "1.10"
+ - tip
+
+os:
+ - linux
+ - osx
+
+matrix:
+ allow_failures:
+ - go: tip
+ fast_finish: true
+
+script:
+ - go build
+ - go test -race -v ./...
+
diff --git a/vendor/github.com/spf13/afero/LICENSE.txt b/vendor/github.com/spf13/afero/LICENSE.txt
new file mode 100644
index 00000000000..298f0e2665e
--- /dev/null
+++ b/vendor/github.com/spf13/afero/LICENSE.txt
@@ -0,0 +1,174 @@
+ 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.
diff --git a/vendor/github.com/spf13/afero/README.md b/vendor/github.com/spf13/afero/README.md
new file mode 100644
index 00000000000..0c9b04b53fc
--- /dev/null
+++ b/vendor/github.com/spf13/afero/README.md
@@ -0,0 +1,452 @@
+![afero logo-sm](https://cloud.githubusercontent.com/assets/173412/11490338/d50e16dc-97a5-11e5-8b12-019a300d0fcb.png)
+
+A FileSystem Abstraction System for Go
+
+[![Build Status](https://travis-ci.org/spf13/afero.svg)](https://travis-ci.org/spf13/afero) [![Build status](https://ci.appveyor.com/api/projects/status/github/spf13/afero?branch=master&svg=true)](https://ci.appveyor.com/project/spf13/afero) [![GoDoc](https://godoc.org/github.com/spf13/afero?status.svg)](https://godoc.org/github.com/spf13/afero) [![Join the chat at https://gitter.im/spf13/afero](https://badges.gitter.im/Dev%20Chat.svg)](https://gitter.im/spf13/afero?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+# Overview
+
+Afero is an filesystem framework providing a simple, uniform and universal API
+interacting with any filesystem, as an abstraction layer providing interfaces,
+types and methods. Afero has an exceptionally clean interface and simple design
+without needless constructors or initialization methods.
+
+Afero is also a library providing a base set of interoperable backend
+filesystems that make it easy to work with afero while retaining all the power
+and benefit of the os and ioutil packages.
+
+Afero provides significant improvements over using the os package alone, most
+notably the ability to create mock and testing filesystems without relying on the disk.
+
+It is suitable for use in a any situation where you would consider using the OS
+package as it provides an additional abstraction that makes it easy to use a
+memory backed file system during testing. It also adds support for the http
+filesystem for full interoperability.
+
+
+## Afero Features
+
+* A single consistent API for accessing a variety of filesystems
+* Interoperation between a variety of file system types
+* A set of interfaces to encourage and enforce interoperability between backends
+* An atomic cross platform memory backed file system
+* Support for compositional (union) file systems by combining multiple file systems acting as one
+* Specialized backends which modify existing filesystems (Read Only, Regexp filtered)
+* A set of utility functions ported from io, ioutil & hugo to be afero aware
+
+
+# Using Afero
+
+Afero is easy to use and easier to adopt.
+
+A few different ways you could use Afero:
+
+* Use the interfaces alone to define you own file system.
+* Wrap for the OS packages.
+* Define different filesystems for different parts of your application.
+* Use Afero for mock filesystems while testing
+
+## Step 1: Install Afero
+
+First use go get to install the latest version of the library.
+
+ $ go get github.com/spf13/afero
+
+Next include Afero in your application.
+```go
+import "github.com/spf13/afero"
+```
+
+## Step 2: Declare a backend
+
+First define a package variable and set it to a pointer to a filesystem.
+```go
+var AppFs = afero.NewMemMapFs()
+
+or
+
+var AppFs = afero.NewOsFs()
+```
+It is important to note that if you repeat the composite literal you
+will be using a completely new and isolated filesystem. In the case of
+OsFs it will still use the same underlying filesystem but will reduce
+the ability to drop in other filesystems as desired.
+
+## Step 3: Use it like you would the OS package
+
+Throughout your application use any function and method like you normally
+would.
+
+So if my application before had:
+```go
+os.Open('/tmp/foo')
+```
+We would replace it with:
+```go
+AppFs.Open('/tmp/foo')
+```
+
+`AppFs` being the variable we defined above.
+
+
+## List of all available functions
+
+File System Methods Available:
+```go
+Chmod(name string, mode os.FileMode) : error
+Chtimes(name string, atime time.Time, mtime time.Time) : error
+Create(name string) : File, error
+Mkdir(name string, perm os.FileMode) : error
+MkdirAll(path string, perm os.FileMode) : error
+Name() : string
+Open(name string) : File, error
+OpenFile(name string, flag int, perm os.FileMode) : File, error
+Remove(name string) : error
+RemoveAll(path string) : error
+Rename(oldname, newname string) : error
+Stat(name string) : os.FileInfo, error
+```
+File Interfaces and Methods Available:
+```go
+io.Closer
+io.Reader
+io.ReaderAt
+io.Seeker
+io.Writer
+io.WriterAt
+
+Name() : string
+Readdir(count int) : []os.FileInfo, error
+Readdirnames(n int) : []string, error
+Stat() : os.FileInfo, error
+Sync() : error
+Truncate(size int64) : error
+WriteString(s string) : ret int, err error
+```
+In some applications it may make sense to define a new package that
+simply exports the file system variable for easy access from anywhere.
+
+## Using Afero's utility functions
+
+Afero provides a set of functions to make it easier to use the underlying file systems.
+These functions have been primarily ported from io & ioutil with some developed for Hugo.
+
+The afero utilities support all afero compatible backends.
+
+The list of utilities includes:
+
+```go
+DirExists(path string) (bool, error)
+Exists(path string) (bool, error)
+FileContainsBytes(filename string, subslice []byte) (bool, error)
+GetTempDir(subPath string) string
+IsDir(path string) (bool, error)
+IsEmpty(path string) (bool, error)
+ReadDir(dirname string) ([]os.FileInfo, error)
+ReadFile(filename string) ([]byte, error)
+SafeWriteReader(path string, r io.Reader) (err error)
+TempDir(dir, prefix string) (name string, err error)
+TempFile(dir, prefix string) (f File, err error)
+Walk(root string, walkFn filepath.WalkFunc) error
+WriteFile(filename string, data []byte, perm os.FileMode) error
+WriteReader(path string, r io.Reader) (err error)
+```
+For a complete list see [Afero's GoDoc](https://godoc.org/github.com/spf13/afero)
+
+They are available under two different approaches to use. You can either call
+them directly where the first parameter of each function will be the file
+system, or you can declare a new `Afero`, a custom type used to bind these
+functions as methods to a given filesystem.
+
+### Calling utilities directly
+
+```go
+fs := new(afero.MemMapFs)
+f, err := afero.TempFile(fs,"", "ioutil-test")
+
+```
+
+### Calling via Afero
+
+```go
+fs := afero.NewMemMapFs()
+afs := &afero.Afero{Fs: fs}
+f, err := afs.TempFile("", "ioutil-test")
+```
+
+## Using Afero for Testing
+
+There is a large benefit to using a mock filesystem for testing. It has a
+completely blank state every time it is initialized and can be easily
+reproducible regardless of OS. You could create files to your heart’s content
+and the file access would be fast while also saving you from all the annoying
+issues with deleting temporary files, Windows file locking, etc. The MemMapFs
+backend is perfect for testing.
+
+* Much faster than performing I/O operations on disk
+* Avoid security issues and permissions
+* Far more control. 'rm -rf /' with confidence
+* Test setup is far more easier to do
+* No test cleanup needed
+
+One way to accomplish this is to define a variable as mentioned above.
+In your application this will be set to afero.NewOsFs() during testing you
+can set it to afero.NewMemMapFs().
+
+It wouldn't be uncommon to have each test initialize a blank slate memory
+backend. To do this I would define my `appFS = afero.NewOsFs()` somewhere
+appropriate in my application code. This approach ensures that Tests are order
+independent, with no test relying on the state left by an earlier test.
+
+Then in my tests I would initialize a new MemMapFs for each test:
+```go
+func TestExist(t *testing.T) {
+ appFS := afero.NewMemMapFs()
+ // create test files and directories
+ appFS.MkdirAll("src/a", 0755)
+ afero.WriteFile(appFS, "src/a/b", []byte("file b"), 0644)
+ afero.WriteFile(appFS, "src/c", []byte("file c"), 0644)
+ name := "src/c"
+ _, err := appFS.Stat(name)
+ if os.IsNotExist(err) {
+ t.Errorf("file \"%s\" does not exist.\n", name)
+ }
+}
+```
+
+# Available Backends
+
+## Operating System Native
+
+### OsFs
+
+The first is simply a wrapper around the native OS calls. This makes it
+very easy to use as all of the calls are the same as the existing OS
+calls. It also makes it trivial to have your code use the OS during
+operation and a mock filesystem during testing or as needed.
+
+```go
+appfs := afero.NewOsFs()
+appfs.MkdirAll("src/a", 0755))
+```
+
+## Memory Backed Storage
+
+### MemMapFs
+
+Afero also provides a fully atomic memory backed filesystem perfect for use in
+mocking and to speed up unnecessary disk io when persistence isn’t
+necessary. It is fully concurrent and will work within go routines
+safely.
+
+```go
+mm := afero.NewMemMapFs()
+mm.MkdirAll("src/a", 0755))
+```
+
+#### InMemoryFile
+
+As part of MemMapFs, Afero also provides an atomic, fully concurrent memory
+backed file implementation. This can be used in other memory backed file
+systems with ease. Plans are to add a radix tree memory stored file
+system using InMemoryFile.
+
+## Network Interfaces
+
+### SftpFs
+
+Afero has experimental support for secure file transfer protocol (sftp). Which can
+be used to perform file operations over a encrypted channel.
+
+## Filtering Backends
+
+### BasePathFs
+
+The BasePathFs restricts all operations to a given path within an Fs.
+The given file name to the operations on this Fs will be prepended with
+the base path before calling the source Fs.
+
+```go
+bp := afero.NewBasePathFs(afero.NewOsFs(), "/base/path")
+```
+
+### ReadOnlyFs
+
+A thin wrapper around the source Fs providing a read only view.
+
+```go
+fs := afero.NewReadOnlyFs(afero.NewOsFs())
+_, err := fs.Create("/file.txt")
+// err = syscall.EPERM
+```
+
+# RegexpFs
+
+A filtered view on file names, any file NOT matching
+the passed regexp will be treated as non-existing.
+Files not matching the regexp provided will not be created.
+Directories are not filtered.
+
+```go
+fs := afero.NewRegexpFs(afero.NewMemMapFs(), regexp.MustCompile(`\.txt$`))
+_, err := fs.Create("/file.html")
+// err = syscall.ENOENT
+```
+
+### HttpFs
+
+Afero provides an http compatible backend which can wrap any of the existing
+backends.
+
+The Http package requires a slightly specific version of Open which
+returns an http.File type.
+
+Afero provides an httpFs file system which satisfies this requirement.
+Any Afero FileSystem can be used as an httpFs.
+
+```go
+httpFs := afero.NewHttpFs()
+fileserver := http.FileServer(httpFs.Dir()))
+http.Handle("/", fileserver)
+```
+
+## Composite Backends
+
+Afero provides the ability have two filesystems (or more) act as a single
+file system.
+
+### CacheOnReadFs
+
+The CacheOnReadFs will lazily make copies of any accessed files from the base
+layer into the overlay. Subsequent reads will be pulled from the overlay
+directly permitting the request is within the cache duration of when it was
+created in the overlay.
+
+If the base filesystem is writeable, any changes to files will be
+done first to the base, then to the overlay layer. Write calls to open file
+handles like `Write()` or `Truncate()` to the overlay first.
+
+To writing files to the overlay only, you can use the overlay Fs directly (not
+via the union Fs).
+
+Cache files in the layer for the given time.Duration, a cache duration of 0
+means "forever" meaning the file will not be re-requested from the base ever.
+
+A read-only base will make the overlay also read-only but still copy files
+from the base to the overlay when they're not present (or outdated) in the
+caching layer.
+
+```go
+base := afero.NewOsFs()
+layer := afero.NewMemMapFs()
+ufs := afero.NewCacheOnReadFs(base, layer, 100 * time.Second)
+```
+
+### CopyOnWriteFs()
+
+The CopyOnWriteFs is a read only base file system with a potentially
+writeable layer on top.
+
+Read operations will first look in the overlay and if not found there, will
+serve the file from the base.
+
+Changes to the file system will only be made in the overlay.
+
+Any attempt to modify a file found only in the base will copy the file to the
+overlay layer before modification (including opening a file with a writable
+handle).
+
+Removing and Renaming files present only in the base layer is not currently
+permitted. If a file is present in the base layer and the overlay, only the
+overlay will be removed/renamed.
+
+```go
+ base := afero.NewOsFs()
+ roBase := afero.NewReadOnlyFs(base)
+ ufs := afero.NewCopyOnWriteFs(roBase, afero.NewMemMapFs())
+
+ fh, _ = ufs.Create("/home/test/file2.txt")
+ fh.WriteString("This is a test")
+ fh.Close()
+```
+
+In this example all write operations will only occur in memory (MemMapFs)
+leaving the base filesystem (OsFs) untouched.
+
+
+## Desired/possible backends
+
+The following is a short list of possible backends we hope someone will
+implement:
+
+* SSH
+* ZIP
+* TAR
+* S3
+
+# About the project
+
+## What's in the name
+
+Afero comes from the latin roots Ad-Facere.
+
+**"Ad"** is a prefix meaning "to".
+
+**"Facere"** is a form of the root "faciō" making "make or do".
+
+The literal meaning of afero is "to make" or "to do" which seems very fitting
+for a library that allows one to make files and directories and do things with them.
+
+The English word that shares the same roots as Afero is "affair". Affair shares
+the same concept but as a noun it means "something that is made or done" or "an
+object of a particular type".
+
+It's also nice that unlike some of my other libraries (hugo, cobra, viper) it
+Googles very well.
+
+## Release Notes
+
+* **0.10.0** 2015.12.10
+ * Full compatibility with Windows
+ * Introduction of afero utilities
+ * Test suite rewritten to work cross platform
+ * Normalize paths for MemMapFs
+ * Adding Sync to the file interface
+ * **Breaking Change** Walk and ReadDir have changed parameter order
+ * Moving types used by MemMapFs to a subpackage
+ * General bugfixes and improvements
+* **0.9.0** 2015.11.05
+ * New Walk function similar to filepath.Walk
+ * MemMapFs.OpenFile handles O_CREATE, O_APPEND, O_TRUNC
+ * MemMapFs.Remove now really deletes the file
+ * InMemoryFile.Readdir and Readdirnames work correctly
+ * InMemoryFile functions lock it for concurrent access
+ * Test suite improvements
+* **0.8.0** 2014.10.28
+ * First public version
+ * Interfaces feel ready for people to build using
+ * Interfaces satisfy all known uses
+ * MemMapFs passes the majority of the OS test suite
+ * OsFs passes the majority of the OS test suite
+
+## Contributing
+
+1. Fork it
+2. Create your feature branch (`git checkout -b my-new-feature`)
+3. Commit your changes (`git commit -am 'Add some feature'`)
+4. Push to the branch (`git push origin my-new-feature`)
+5. Create new Pull Request
+
+## Contributors
+
+Names in no particular order:
+
+* [spf13](https://github.com/spf13)
+* [jaqx0r](https://github.com/jaqx0r)
+* [mbertschler](https://github.com/mbertschler)
+* [xor-gate](https://github.com/xor-gate)
+
+## License
+
+Afero is released under the Apache 2.0 license. See
+[LICENSE.txt](https://github.com/spf13/afero/blob/master/LICENSE.txt)
diff --git a/vendor/github.com/spf13/afero/afero.go b/vendor/github.com/spf13/afero/afero.go
new file mode 100644
index 00000000000..f5b5e127cd6
--- /dev/null
+++ b/vendor/github.com/spf13/afero/afero.go
@@ -0,0 +1,108 @@
+// Copyright © 2014 Steve Francia .
+// Copyright 2013 tsuru authors. All rights reserved.
+//
+// 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.
+
+// Package afero provides types and methods for interacting with the filesystem,
+// as an abstraction layer.
+
+// Afero also provides a few implementations that are mostly interoperable. One that
+// uses the operating system filesystem, one that uses memory to store files
+// (cross platform) and an interface that should be implemented if you want to
+// provide your own filesystem.
+
+package afero
+
+import (
+ "errors"
+ "io"
+ "os"
+ "time"
+)
+
+type Afero struct {
+ Fs
+}
+
+// File represents a file in the filesystem.
+type File interface {
+ io.Closer
+ io.Reader
+ io.ReaderAt
+ io.Seeker
+ io.Writer
+ io.WriterAt
+
+ Name() string
+ Readdir(count int) ([]os.FileInfo, error)
+ Readdirnames(n int) ([]string, error)
+ Stat() (os.FileInfo, error)
+ Sync() error
+ Truncate(size int64) error
+ WriteString(s string) (ret int, err error)
+}
+
+// Fs is the filesystem interface.
+//
+// Any simulated or real filesystem should implement this interface.
+type Fs interface {
+ // Create creates a file in the filesystem, returning the file and an
+ // error, if any happens.
+ Create(name string) (File, error)
+
+ // Mkdir creates a directory in the filesystem, return an error if any
+ // happens.
+ Mkdir(name string, perm os.FileMode) error
+
+ // MkdirAll creates a directory path and all parents that does not exist
+ // yet.
+ MkdirAll(path string, perm os.FileMode) error
+
+ // Open opens a file, returning it or an error, if any happens.
+ Open(name string) (File, error)
+
+ // OpenFile opens a file using the given flags and the given mode.
+ OpenFile(name string, flag int, perm os.FileMode) (File, error)
+
+ // Remove removes a file identified by name, returning an error, if any
+ // happens.
+ Remove(name string) error
+
+ // RemoveAll removes a directory path and any children it contains. It
+ // does not fail if the path does not exist (return nil).
+ RemoveAll(path string) error
+
+ // Rename renames a file.
+ Rename(oldname, newname string) error
+
+ // Stat returns a FileInfo describing the named file, or an error, if any
+ // happens.
+ Stat(name string) (os.FileInfo, error)
+
+ // The name of this FileSystem
+ Name() string
+
+ //Chmod changes the mode of the named file to mode.
+ Chmod(name string, mode os.FileMode) error
+
+ //Chtimes changes the access and modification times of the named file
+ Chtimes(name string, atime time.Time, mtime time.Time) error
+}
+
+var (
+ ErrFileClosed = errors.New("File is closed")
+ ErrOutOfRange = errors.New("Out of range")
+ ErrTooLarge = errors.New("Too large")
+ ErrFileNotFound = os.ErrNotExist
+ ErrFileExists = os.ErrExist
+ ErrDestinationExists = os.ErrExist
+)
diff --git a/vendor/github.com/spf13/afero/appveyor.yml b/vendor/github.com/spf13/afero/appveyor.yml
new file mode 100644
index 00000000000..a633ad500c1
--- /dev/null
+++ b/vendor/github.com/spf13/afero/appveyor.yml
@@ -0,0 +1,15 @@
+version: '{build}'
+clone_folder: C:\gopath\src\github.com\spf13\afero
+environment:
+ GOPATH: C:\gopath
+build_script:
+- cmd: >-
+ go version
+
+ go env
+
+ go get -v github.com/spf13/afero/...
+
+ go build github.com/spf13/afero
+test_script:
+- cmd: go test -race -v github.com/spf13/afero/...
diff --git a/vendor/github.com/spf13/afero/basepath.go b/vendor/github.com/spf13/afero/basepath.go
new file mode 100644
index 00000000000..616ff8ff74c
--- /dev/null
+++ b/vendor/github.com/spf13/afero/basepath.go
@@ -0,0 +1,180 @@
+package afero
+
+import (
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "time"
+)
+
+var _ Lstater = (*BasePathFs)(nil)
+
+// The BasePathFs restricts all operations to a given path within an Fs.
+// The given file name to the operations on this Fs will be prepended with
+// the base path before calling the base Fs.
+// Any file name (after filepath.Clean()) outside this base path will be
+// treated as non existing file.
+//
+// Note that it does not clean the error messages on return, so you may
+// reveal the real path on errors.
+type BasePathFs struct {
+ source Fs
+ path string
+}
+
+type BasePathFile struct {
+ File
+ path string
+}
+
+func (f *BasePathFile) Name() string {
+ sourcename := f.File.Name()
+ return strings.TrimPrefix(sourcename, filepath.Clean(f.path))
+}
+
+func NewBasePathFs(source Fs, path string) Fs {
+ return &BasePathFs{source: source, path: path}
+}
+
+// on a file outside the base path it returns the given file name and an error,
+// else the given file with the base path prepended
+func (b *BasePathFs) RealPath(name string) (path string, err error) {
+ if err := validateBasePathName(name); err != nil {
+ return name, err
+ }
+
+ bpath := filepath.Clean(b.path)
+ path = filepath.Clean(filepath.Join(bpath, name))
+ if !strings.HasPrefix(path, bpath) {
+ return name, os.ErrNotExist
+ }
+
+ return path, nil
+}
+
+func validateBasePathName(name string) error {
+ if runtime.GOOS != "windows" {
+ // Not much to do here;
+ // the virtual file paths all look absolute on *nix.
+ return nil
+ }
+
+ // On Windows a common mistake would be to provide an absolute OS path
+ // We could strip out the base part, but that would not be very portable.
+ if filepath.IsAbs(name) {
+ return os.ErrNotExist
+ }
+
+ return nil
+}
+
+func (b *BasePathFs) Chtimes(name string, atime, mtime time.Time) (err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return &os.PathError{Op: "chtimes", Path: name, Err: err}
+ }
+ return b.source.Chtimes(name, atime, mtime)
+}
+
+func (b *BasePathFs) Chmod(name string, mode os.FileMode) (err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return &os.PathError{Op: "chmod", Path: name, Err: err}
+ }
+ return b.source.Chmod(name, mode)
+}
+
+func (b *BasePathFs) Name() string {
+ return "BasePathFs"
+}
+
+func (b *BasePathFs) Stat(name string) (fi os.FileInfo, err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return nil, &os.PathError{Op: "stat", Path: name, Err: err}
+ }
+ return b.source.Stat(name)
+}
+
+func (b *BasePathFs) Rename(oldname, newname string) (err error) {
+ if oldname, err = b.RealPath(oldname); err != nil {
+ return &os.PathError{Op: "rename", Path: oldname, Err: err}
+ }
+ if newname, err = b.RealPath(newname); err != nil {
+ return &os.PathError{Op: "rename", Path: newname, Err: err}
+ }
+ return b.source.Rename(oldname, newname)
+}
+
+func (b *BasePathFs) RemoveAll(name string) (err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return &os.PathError{Op: "remove_all", Path: name, Err: err}
+ }
+ return b.source.RemoveAll(name)
+}
+
+func (b *BasePathFs) Remove(name string) (err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return &os.PathError{Op: "remove", Path: name, Err: err}
+ }
+ return b.source.Remove(name)
+}
+
+func (b *BasePathFs) OpenFile(name string, flag int, mode os.FileMode) (f File, err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return nil, &os.PathError{Op: "openfile", Path: name, Err: err}
+ }
+ sourcef, err := b.source.OpenFile(name, flag, mode)
+ if err != nil {
+ return nil, err
+ }
+ return &BasePathFile{sourcef, b.path}, nil
+}
+
+func (b *BasePathFs) Open(name string) (f File, err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return nil, &os.PathError{Op: "open", Path: name, Err: err}
+ }
+ sourcef, err := b.source.Open(name)
+ if err != nil {
+ return nil, err
+ }
+ return &BasePathFile{File: sourcef, path: b.path}, nil
+}
+
+func (b *BasePathFs) Mkdir(name string, mode os.FileMode) (err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return &os.PathError{Op: "mkdir", Path: name, Err: err}
+ }
+ return b.source.Mkdir(name, mode)
+}
+
+func (b *BasePathFs) MkdirAll(name string, mode os.FileMode) (err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return &os.PathError{Op: "mkdir", Path: name, Err: err}
+ }
+ return b.source.MkdirAll(name, mode)
+}
+
+func (b *BasePathFs) Create(name string) (f File, err error) {
+ if name, err = b.RealPath(name); err != nil {
+ return nil, &os.PathError{Op: "create", Path: name, Err: err}
+ }
+ sourcef, err := b.source.Create(name)
+ if err != nil {
+ return nil, err
+ }
+ return &BasePathFile{File: sourcef, path: b.path}, nil
+}
+
+func (b *BasePathFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
+ name, err := b.RealPath(name)
+ if err != nil {
+ return nil, false, &os.PathError{Op: "lstat", Path: name, Err: err}
+ }
+ if lstater, ok := b.source.(Lstater); ok {
+ return lstater.LstatIfPossible(name)
+ }
+ fi, err := b.source.Stat(name)
+ return fi, false, err
+}
+
+// vim: ts=4 sw=4 noexpandtab nolist syn=go
diff --git a/vendor/github.com/spf13/afero/cacheOnReadFs.go b/vendor/github.com/spf13/afero/cacheOnReadFs.go
new file mode 100644
index 00000000000..29a26c67dd5
--- /dev/null
+++ b/vendor/github.com/spf13/afero/cacheOnReadFs.go
@@ -0,0 +1,290 @@
+package afero
+
+import (
+ "os"
+ "syscall"
+ "time"
+)
+
+// If the cache duration is 0, cache time will be unlimited, i.e. once
+// a file is in the layer, the base will never be read again for this file.
+//
+// For cache times greater than 0, the modification time of a file is
+// checked. Note that a lot of file system implementations only allow a
+// resolution of a second for timestamps... or as the godoc for os.Chtimes()
+// states: "The underlying filesystem may truncate or round the values to a
+// less precise time unit."
+//
+// This caching union will forward all write calls also to the base file
+// system first. To prevent writing to the base Fs, wrap it in a read-only
+// filter - Note: this will also make the overlay read-only, for writing files
+// in the overlay, use the overlay Fs directly, not via the union Fs.
+type CacheOnReadFs struct {
+ base Fs
+ layer Fs
+ cacheTime time.Duration
+}
+
+func NewCacheOnReadFs(base Fs, layer Fs, cacheTime time.Duration) Fs {
+ return &CacheOnReadFs{base: base, layer: layer, cacheTime: cacheTime}
+}
+
+type cacheState int
+
+const (
+ // not present in the overlay, unknown if it exists in the base:
+ cacheMiss cacheState = iota
+ // present in the overlay and in base, base file is newer:
+ cacheStale
+ // present in the overlay - with cache time == 0 it may exist in the base,
+ // with cacheTime > 0 it exists in the base and is same age or newer in the
+ // overlay
+ cacheHit
+ // happens if someone writes directly to the overlay without
+ // going through this union
+ cacheLocal
+)
+
+func (u *CacheOnReadFs) cacheStatus(name string) (state cacheState, fi os.FileInfo, err error) {
+ var lfi, bfi os.FileInfo
+ lfi, err = u.layer.Stat(name)
+ if err == nil {
+ if u.cacheTime == 0 {
+ return cacheHit, lfi, nil
+ }
+ if lfi.ModTime().Add(u.cacheTime).Before(time.Now()) {
+ bfi, err = u.base.Stat(name)
+ if err != nil {
+ return cacheLocal, lfi, nil
+ }
+ if bfi.ModTime().After(lfi.ModTime()) {
+ return cacheStale, bfi, nil
+ }
+ }
+ return cacheHit, lfi, nil
+ }
+
+ if err == syscall.ENOENT || os.IsNotExist(err) {
+ return cacheMiss, nil, nil
+ }
+
+ return cacheMiss, nil, err
+}
+
+func (u *CacheOnReadFs) copyToLayer(name string) error {
+ return copyToLayer(u.base, u.layer, name)
+}
+
+func (u *CacheOnReadFs) Chtimes(name string, atime, mtime time.Time) error {
+ st, _, err := u.cacheStatus(name)
+ if err != nil {
+ return err
+ }
+ switch st {
+ case cacheLocal:
+ case cacheHit:
+ err = u.base.Chtimes(name, atime, mtime)
+ case cacheStale, cacheMiss:
+ if err := u.copyToLayer(name); err != nil {
+ return err
+ }
+ err = u.base.Chtimes(name, atime, mtime)
+ }
+ if err != nil {
+ return err
+ }
+ return u.layer.Chtimes(name, atime, mtime)
+}
+
+func (u *CacheOnReadFs) Chmod(name string, mode os.FileMode) error {
+ st, _, err := u.cacheStatus(name)
+ if err != nil {
+ return err
+ }
+ switch st {
+ case cacheLocal:
+ case cacheHit:
+ err = u.base.Chmod(name, mode)
+ case cacheStale, cacheMiss:
+ if err := u.copyToLayer(name); err != nil {
+ return err
+ }
+ err = u.base.Chmod(name, mode)
+ }
+ if err != nil {
+ return err
+ }
+ return u.layer.Chmod(name, mode)
+}
+
+func (u *CacheOnReadFs) Stat(name string) (os.FileInfo, error) {
+ st, fi, err := u.cacheStatus(name)
+ if err != nil {
+ return nil, err
+ }
+ switch st {
+ case cacheMiss:
+ return u.base.Stat(name)
+ default: // cacheStale has base, cacheHit and cacheLocal the layer os.FileInfo
+ return fi, nil
+ }
+}
+
+func (u *CacheOnReadFs) Rename(oldname, newname string) error {
+ st, _, err := u.cacheStatus(oldname)
+ if err != nil {
+ return err
+ }
+ switch st {
+ case cacheLocal:
+ case cacheHit:
+ err = u.base.Rename(oldname, newname)
+ case cacheStale, cacheMiss:
+ if err := u.copyToLayer(oldname); err != nil {
+ return err
+ }
+ err = u.base.Rename(oldname, newname)
+ }
+ if err != nil {
+ return err
+ }
+ return u.layer.Rename(oldname, newname)
+}
+
+func (u *CacheOnReadFs) Remove(name string) error {
+ st, _, err := u.cacheStatus(name)
+ if err != nil {
+ return err
+ }
+ switch st {
+ case cacheLocal:
+ case cacheHit, cacheStale, cacheMiss:
+ err = u.base.Remove(name)
+ }
+ if err != nil {
+ return err
+ }
+ return u.layer.Remove(name)
+}
+
+func (u *CacheOnReadFs) RemoveAll(name string) error {
+ st, _, err := u.cacheStatus(name)
+ if err != nil {
+ return err
+ }
+ switch st {
+ case cacheLocal:
+ case cacheHit, cacheStale, cacheMiss:
+ err = u.base.RemoveAll(name)
+ }
+ if err != nil {
+ return err
+ }
+ return u.layer.RemoveAll(name)
+}
+
+func (u *CacheOnReadFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ st, _, err := u.cacheStatus(name)
+ if err != nil {
+ return nil, err
+ }
+ switch st {
+ case cacheLocal, cacheHit:
+ default:
+ if err := u.copyToLayer(name); err != nil {
+ return nil, err
+ }
+ }
+ if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 {
+ bfi, err := u.base.OpenFile(name, flag, perm)
+ if err != nil {
+ return nil, err
+ }
+ lfi, err := u.layer.OpenFile(name, flag, perm)
+ if err != nil {
+ bfi.Close() // oops, what if O_TRUNC was set and file opening in the layer failed...?
+ return nil, err
+ }
+ return &UnionFile{Base: bfi, Layer: lfi}, nil
+ }
+ return u.layer.OpenFile(name, flag, perm)
+}
+
+func (u *CacheOnReadFs) Open(name string) (File, error) {
+ st, fi, err := u.cacheStatus(name)
+ if err != nil {
+ return nil, err
+ }
+
+ switch st {
+ case cacheLocal:
+ return u.layer.Open(name)
+
+ case cacheMiss:
+ bfi, err := u.base.Stat(name)
+ if err != nil {
+ return nil, err
+ }
+ if bfi.IsDir() {
+ return u.base.Open(name)
+ }
+ if err := u.copyToLayer(name); err != nil {
+ return nil, err
+ }
+ return u.layer.Open(name)
+
+ case cacheStale:
+ if !fi.IsDir() {
+ if err := u.copyToLayer(name); err != nil {
+ return nil, err
+ }
+ return u.layer.Open(name)
+ }
+ case cacheHit:
+ if !fi.IsDir() {
+ return u.layer.Open(name)
+ }
+ }
+ // the dirs from cacheHit, cacheStale fall down here:
+ bfile, _ := u.base.Open(name)
+ lfile, err := u.layer.Open(name)
+ if err != nil && bfile == nil {
+ return nil, err
+ }
+ return &UnionFile{Base: bfile, Layer: lfile}, nil
+}
+
+func (u *CacheOnReadFs) Mkdir(name string, perm os.FileMode) error {
+ err := u.base.Mkdir(name, perm)
+ if err != nil {
+ return err
+ }
+ return u.layer.MkdirAll(name, perm) // yes, MkdirAll... we cannot assume it exists in the cache
+}
+
+func (u *CacheOnReadFs) Name() string {
+ return "CacheOnReadFs"
+}
+
+func (u *CacheOnReadFs) MkdirAll(name string, perm os.FileMode) error {
+ err := u.base.MkdirAll(name, perm)
+ if err != nil {
+ return err
+ }
+ return u.layer.MkdirAll(name, perm)
+}
+
+func (u *CacheOnReadFs) Create(name string) (File, error) {
+ bfh, err := u.base.Create(name)
+ if err != nil {
+ return nil, err
+ }
+ lfh, err := u.layer.Create(name)
+ if err != nil {
+ // oops, see comment about OS_TRUNC above, should we remove? then we have to
+ // remember if the file did not exist before
+ bfh.Close()
+ return nil, err
+ }
+ return &UnionFile{Base: bfh, Layer: lfh}, nil
+}
diff --git a/vendor/github.com/spf13/afero/const_bsds.go b/vendor/github.com/spf13/afero/const_bsds.go
new file mode 100644
index 00000000000..5728243d962
--- /dev/null
+++ b/vendor/github.com/spf13/afero/const_bsds.go
@@ -0,0 +1,22 @@
+// Copyright © 2016 Steve Francia .
+//
+// 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.
+
+// +build darwin openbsd freebsd netbsd dragonfly
+
+package afero
+
+import (
+ "syscall"
+)
+
+const BADFD = syscall.EBADF
diff --git a/vendor/github.com/spf13/afero/const_win_unix.go b/vendor/github.com/spf13/afero/const_win_unix.go
new file mode 100644
index 00000000000..968fc2783e5
--- /dev/null
+++ b/vendor/github.com/spf13/afero/const_win_unix.go
@@ -0,0 +1,25 @@
+// Copyright © 2016 Steve Francia .
+//
+// 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.
+// +build !darwin
+// +build !openbsd
+// +build !freebsd
+// +build !dragonfly
+// +build !netbsd
+
+package afero
+
+import (
+ "syscall"
+)
+
+const BADFD = syscall.EBADFD
diff --git a/vendor/github.com/spf13/afero/copyOnWriteFs.go b/vendor/github.com/spf13/afero/copyOnWriteFs.go
new file mode 100644
index 00000000000..9aef39794c1
--- /dev/null
+++ b/vendor/github.com/spf13/afero/copyOnWriteFs.go
@@ -0,0 +1,292 @@
+package afero
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "syscall"
+ "time"
+)
+
+var _ Lstater = (*CopyOnWriteFs)(nil)
+
+// The CopyOnWriteFs is a union filesystem: a read only base file system with
+// a possibly writeable layer on top. Changes to the file system will only
+// be made in the overlay: Changing an existing file in the base layer which
+// is not present in the overlay will copy the file to the overlay ("changing"
+// includes also calls to e.g. Chtimes() and Chmod()).
+//
+// Reading directories is currently only supported via Open(), not OpenFile().
+type CopyOnWriteFs struct {
+ base Fs
+ layer Fs
+}
+
+func NewCopyOnWriteFs(base Fs, layer Fs) Fs {
+ return &CopyOnWriteFs{base: base, layer: layer}
+}
+
+// Returns true if the file is not in the overlay
+func (u *CopyOnWriteFs) isBaseFile(name string) (bool, error) {
+ if _, err := u.layer.Stat(name); err == nil {
+ return false, nil
+ }
+ _, err := u.base.Stat(name)
+ if err != nil {
+ if oerr, ok := err.(*os.PathError); ok {
+ if oerr.Err == os.ErrNotExist || oerr.Err == syscall.ENOENT || oerr.Err == syscall.ENOTDIR {
+ return false, nil
+ }
+ }
+ if err == syscall.ENOENT {
+ return false, nil
+ }
+ }
+ return true, err
+}
+
+func (u *CopyOnWriteFs) copyToLayer(name string) error {
+ return copyToLayer(u.base, u.layer, name)
+}
+
+func (u *CopyOnWriteFs) Chtimes(name string, atime, mtime time.Time) error {
+ b, err := u.isBaseFile(name)
+ if err != nil {
+ return err
+ }
+ if b {
+ if err := u.copyToLayer(name); err != nil {
+ return err
+ }
+ }
+ return u.layer.Chtimes(name, atime, mtime)
+}
+
+func (u *CopyOnWriteFs) Chmod(name string, mode os.FileMode) error {
+ b, err := u.isBaseFile(name)
+ if err != nil {
+ return err
+ }
+ if b {
+ if err := u.copyToLayer(name); err != nil {
+ return err
+ }
+ }
+ return u.layer.Chmod(name, mode)
+}
+
+func (u *CopyOnWriteFs) Stat(name string) (os.FileInfo, error) {
+ fi, err := u.layer.Stat(name)
+ if err != nil {
+ isNotExist := u.isNotExist(err)
+ if isNotExist {
+ return u.base.Stat(name)
+ }
+ return nil, err
+ }
+ return fi, nil
+}
+
+func (u *CopyOnWriteFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
+ llayer, ok1 := u.layer.(Lstater)
+ lbase, ok2 := u.base.(Lstater)
+
+ if ok1 {
+ fi, b, err := llayer.LstatIfPossible(name)
+ if err == nil {
+ return fi, b, nil
+ }
+
+ if !u.isNotExist(err) {
+ return nil, b, err
+ }
+ }
+
+ if ok2 {
+ fi, b, err := lbase.LstatIfPossible(name)
+ if err == nil {
+ return fi, b, nil
+ }
+ if !u.isNotExist(err) {
+ return nil, b, err
+ }
+ }
+
+ fi, err := u.Stat(name)
+
+ return fi, false, err
+}
+
+func (u *CopyOnWriteFs) isNotExist(err error) bool {
+ if e, ok := err.(*os.PathError); ok {
+ err = e.Err
+ }
+ if err == os.ErrNotExist || err == syscall.ENOENT || err == syscall.ENOTDIR {
+ return true
+ }
+ return false
+}
+
+// Renaming files present only in the base layer is not permitted
+func (u *CopyOnWriteFs) Rename(oldname, newname string) error {
+ b, err := u.isBaseFile(oldname)
+ if err != nil {
+ return err
+ }
+ if b {
+ return syscall.EPERM
+ }
+ return u.layer.Rename(oldname, newname)
+}
+
+// Removing files present only in the base layer is not permitted. If
+// a file is present in the base layer and the overlay, only the overlay
+// will be removed.
+func (u *CopyOnWriteFs) Remove(name string) error {
+ err := u.layer.Remove(name)
+ switch err {
+ case syscall.ENOENT:
+ _, err = u.base.Stat(name)
+ if err == nil {
+ return syscall.EPERM
+ }
+ return syscall.ENOENT
+ default:
+ return err
+ }
+}
+
+func (u *CopyOnWriteFs) RemoveAll(name string) error {
+ err := u.layer.RemoveAll(name)
+ switch err {
+ case syscall.ENOENT:
+ _, err = u.base.Stat(name)
+ if err == nil {
+ return syscall.EPERM
+ }
+ return syscall.ENOENT
+ default:
+ return err
+ }
+}
+
+func (u *CopyOnWriteFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ b, err := u.isBaseFile(name)
+ if err != nil {
+ return nil, err
+ }
+
+ if flag&(os.O_WRONLY|os.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 {
+ if b {
+ if err = u.copyToLayer(name); err != nil {
+ return nil, err
+ }
+ return u.layer.OpenFile(name, flag, perm)
+ }
+
+ dir := filepath.Dir(name)
+ isaDir, err := IsDir(u.base, dir)
+ if err != nil && !os.IsNotExist(err) {
+ return nil, err
+ }
+ if isaDir {
+ if err = u.layer.MkdirAll(dir, 0777); err != nil {
+ return nil, err
+ }
+ return u.layer.OpenFile(name, flag, perm)
+ }
+
+ isaDir, err = IsDir(u.layer, dir)
+ if err != nil {
+ return nil, err
+ }
+ if isaDir {
+ return u.layer.OpenFile(name, flag, perm)
+ }
+
+ return nil, &os.PathError{Op: "open", Path: name, Err: syscall.ENOTDIR} // ...or os.ErrNotExist?
+ }
+ if b {
+ return u.base.OpenFile(name, flag, perm)
+ }
+ return u.layer.OpenFile(name, flag, perm)
+}
+
+// This function handles the 9 different possibilities caused
+// by the union which are the intersection of the following...
+// layer: doesn't exist, exists as a file, and exists as a directory
+// base: doesn't exist, exists as a file, and exists as a directory
+func (u *CopyOnWriteFs) Open(name string) (File, error) {
+ // Since the overlay overrides the base we check that first
+ b, err := u.isBaseFile(name)
+ if err != nil {
+ return nil, err
+ }
+
+ // If overlay doesn't exist, return the base (base state irrelevant)
+ if b {
+ return u.base.Open(name)
+ }
+
+ // If overlay is a file, return it (base state irrelevant)
+ dir, err := IsDir(u.layer, name)
+ if err != nil {
+ return nil, err
+ }
+ if !dir {
+ return u.layer.Open(name)
+ }
+
+ // Overlay is a directory, base state now matters.
+ // Base state has 3 states to check but 2 outcomes:
+ // A. It's a file or non-readable in the base (return just the overlay)
+ // B. It's an accessible directory in the base (return a UnionFile)
+
+ // If base is file or nonreadable, return overlay
+ dir, err = IsDir(u.base, name)
+ if !dir || err != nil {
+ return u.layer.Open(name)
+ }
+
+ // Both base & layer are directories
+ // Return union file (if opens are without error)
+ bfile, bErr := u.base.Open(name)
+ lfile, lErr := u.layer.Open(name)
+
+ // If either have errors at this point something is very wrong. Return nil and the errors
+ if bErr != nil || lErr != nil {
+ return nil, fmt.Errorf("BaseErr: %v\nOverlayErr: %v", bErr, lErr)
+ }
+
+ return &UnionFile{Base: bfile, Layer: lfile}, nil
+}
+
+func (u *CopyOnWriteFs) Mkdir(name string, perm os.FileMode) error {
+ dir, err := IsDir(u.base, name)
+ if err != nil {
+ return u.layer.MkdirAll(name, perm)
+ }
+ if dir {
+ return syscall.EEXIST
+ }
+ return u.layer.MkdirAll(name, perm)
+}
+
+func (u *CopyOnWriteFs) Name() string {
+ return "CopyOnWriteFs"
+}
+
+func (u *CopyOnWriteFs) MkdirAll(name string, perm os.FileMode) error {
+ dir, err := IsDir(u.base, name)
+ if err != nil {
+ return u.layer.MkdirAll(name, perm)
+ }
+ if dir {
+ return syscall.EEXIST
+ }
+ return u.layer.MkdirAll(name, perm)
+}
+
+func (u *CopyOnWriteFs) Create(name string) (File, error) {
+ return u.OpenFile(name, os.O_CREATE|os.O_TRUNC|os.O_RDWR, 0666)
+}
diff --git a/vendor/github.com/spf13/afero/httpFs.go b/vendor/github.com/spf13/afero/httpFs.go
new file mode 100644
index 00000000000..c42193688ce
--- /dev/null
+++ b/vendor/github.com/spf13/afero/httpFs.go
@@ -0,0 +1,110 @@
+// Copyright © 2014 Steve Francia .
+//
+// 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.
+
+package afero
+
+import (
+ "errors"
+ "net/http"
+ "os"
+ "path"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+type httpDir struct {
+ basePath string
+ fs HttpFs
+}
+
+func (d httpDir) Open(name string) (http.File, error) {
+ if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 ||
+ strings.Contains(name, "\x00") {
+ return nil, errors.New("http: invalid character in file path")
+ }
+ dir := string(d.basePath)
+ if dir == "" {
+ dir = "."
+ }
+
+ f, err := d.fs.Open(filepath.Join(dir, filepath.FromSlash(path.Clean("/"+name))))
+ if err != nil {
+ return nil, err
+ }
+ return f, nil
+}
+
+type HttpFs struct {
+ source Fs
+}
+
+func NewHttpFs(source Fs) *HttpFs {
+ return &HttpFs{source: source}
+}
+
+func (h HttpFs) Dir(s string) *httpDir {
+ return &httpDir{basePath: s, fs: h}
+}
+
+func (h HttpFs) Name() string { return "h HttpFs" }
+
+func (h HttpFs) Create(name string) (File, error) {
+ return h.source.Create(name)
+}
+
+func (h HttpFs) Chmod(name string, mode os.FileMode) error {
+ return h.source.Chmod(name, mode)
+}
+
+func (h HttpFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
+ return h.source.Chtimes(name, atime, mtime)
+}
+
+func (h HttpFs) Mkdir(name string, perm os.FileMode) error {
+ return h.source.Mkdir(name, perm)
+}
+
+func (h HttpFs) MkdirAll(path string, perm os.FileMode) error {
+ return h.source.MkdirAll(path, perm)
+}
+
+func (h HttpFs) Open(name string) (http.File, error) {
+ f, err := h.source.Open(name)
+ if err == nil {
+ if httpfile, ok := f.(http.File); ok {
+ return httpfile, nil
+ }
+ }
+ return nil, err
+}
+
+func (h HttpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ return h.source.OpenFile(name, flag, perm)
+}
+
+func (h HttpFs) Remove(name string) error {
+ return h.source.Remove(name)
+}
+
+func (h HttpFs) RemoveAll(path string) error {
+ return h.source.RemoveAll(path)
+}
+
+func (h HttpFs) Rename(oldname, newname string) error {
+ return h.source.Rename(oldname, newname)
+}
+
+func (h HttpFs) Stat(name string) (os.FileInfo, error) {
+ return h.source.Stat(name)
+}
diff --git a/vendor/github.com/spf13/afero/ioutil.go b/vendor/github.com/spf13/afero/ioutil.go
new file mode 100644
index 00000000000..5c3a3d8fffc
--- /dev/null
+++ b/vendor/github.com/spf13/afero/ioutil.go
@@ -0,0 +1,230 @@
+// Copyright ©2015 The Go Authors
+// Copyright ©2015 Steve Francia
+//
+// 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.
+
+package afero
+
+import (
+ "bytes"
+ "io"
+ "os"
+ "path/filepath"
+ "sort"
+ "strconv"
+ "sync"
+ "time"
+)
+
+// byName implements sort.Interface.
+type byName []os.FileInfo
+
+func (f byName) Len() int { return len(f) }
+func (f byName) Less(i, j int) bool { return f[i].Name() < f[j].Name() }
+func (f byName) Swap(i, j int) { f[i], f[j] = f[j], f[i] }
+
+// ReadDir reads the directory named by dirname and returns
+// a list of sorted directory entries.
+func (a Afero) ReadDir(dirname string) ([]os.FileInfo, error) {
+ return ReadDir(a.Fs, dirname)
+}
+
+func ReadDir(fs Fs, dirname string) ([]os.FileInfo, error) {
+ f, err := fs.Open(dirname)
+ if err != nil {
+ return nil, err
+ }
+ list, err := f.Readdir(-1)
+ f.Close()
+ if err != nil {
+ return nil, err
+ }
+ sort.Sort(byName(list))
+ return list, nil
+}
+
+// ReadFile reads the file named by filename and returns the contents.
+// A successful call returns err == nil, not err == EOF. Because ReadFile
+// reads the whole file, it does not treat an EOF from Read as an error
+// to be reported.
+func (a Afero) ReadFile(filename string) ([]byte, error) {
+ return ReadFile(a.Fs, filename)
+}
+
+func ReadFile(fs Fs, filename string) ([]byte, error) {
+ f, err := fs.Open(filename)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+ // It's a good but not certain bet that FileInfo will tell us exactly how much to
+ // read, so let's try it but be prepared for the answer to be wrong.
+ var n int64
+
+ if fi, err := f.Stat(); err == nil {
+ // Don't preallocate a huge buffer, just in case.
+ if size := fi.Size(); size < 1e9 {
+ n = size
+ }
+ }
+ // As initial capacity for readAll, use n + a little extra in case Size is zero,
+ // and to avoid another allocation after Read has filled the buffer. The readAll
+ // call will read into its allocated internal buffer cheaply. If the size was
+ // wrong, we'll either waste some space off the end or reallocate as needed, but
+ // in the overwhelmingly common case we'll get it just right.
+ return readAll(f, n+bytes.MinRead)
+}
+
+// readAll reads from r until an error or EOF and returns the data it read
+// from the internal buffer allocated with a specified capacity.
+func readAll(r io.Reader, capacity int64) (b []byte, err error) {
+ buf := bytes.NewBuffer(make([]byte, 0, capacity))
+ // If the buffer overflows, we will get bytes.ErrTooLarge.
+ // Return that as an error. Any other panic remains.
+ defer func() {
+ e := recover()
+ if e == nil {
+ return
+ }
+ if panicErr, ok := e.(error); ok && panicErr == bytes.ErrTooLarge {
+ err = panicErr
+ } else {
+ panic(e)
+ }
+ }()
+ _, err = buf.ReadFrom(r)
+ return buf.Bytes(), err
+}
+
+// ReadAll reads from r until an error or EOF and returns the data it read.
+// A successful call returns err == nil, not err == EOF. Because ReadAll is
+// defined to read from src until EOF, it does not treat an EOF from Read
+// as an error to be reported.
+func ReadAll(r io.Reader) ([]byte, error) {
+ return readAll(r, bytes.MinRead)
+}
+
+// WriteFile writes data to a file named by filename.
+// If the file does not exist, WriteFile creates it with permissions perm;
+// otherwise WriteFile truncates it before writing.
+func (a Afero) WriteFile(filename string, data []byte, perm os.FileMode) error {
+ return WriteFile(a.Fs, filename, data, perm)
+}
+
+func WriteFile(fs Fs, filename string, data []byte, perm os.FileMode) error {
+ f, err := fs.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
+ if err != nil {
+ return err
+ }
+ n, err := f.Write(data)
+ if err == nil && n < len(data) {
+ err = io.ErrShortWrite
+ }
+ if err1 := f.Close(); err == nil {
+ err = err1
+ }
+ return err
+}
+
+// Random number state.
+// We generate random temporary file names so that there's a good
+// chance the file doesn't exist yet - keeps the number of tries in
+// TempFile to a minimum.
+var rand uint32
+var randmu sync.Mutex
+
+func reseed() uint32 {
+ return uint32(time.Now().UnixNano() + int64(os.Getpid()))
+}
+
+func nextSuffix() string {
+ randmu.Lock()
+ r := rand
+ if r == 0 {
+ r = reseed()
+ }
+ r = r*1664525 + 1013904223 // constants from Numerical Recipes
+ rand = r
+ randmu.Unlock()
+ return strconv.Itoa(int(1e9 + r%1e9))[1:]
+}
+
+// TempFile creates a new temporary file in the directory dir
+// with a name beginning with prefix, opens the file for reading
+// and writing, and returns the resulting *File.
+// If dir is the empty string, TempFile uses the default directory
+// for temporary files (see os.TempDir).
+// Multiple programs calling TempFile simultaneously
+// will not choose the same file. The caller can use f.Name()
+// to find the pathname of the file. It is the caller's responsibility
+// to remove the file when no longer needed.
+func (a Afero) TempFile(dir, prefix string) (f File, err error) {
+ return TempFile(a.Fs, dir, prefix)
+}
+
+func TempFile(fs Fs, dir, prefix string) (f File, err error) {
+ if dir == "" {
+ dir = os.TempDir()
+ }
+
+ nconflict := 0
+ for i := 0; i < 10000; i++ {
+ name := filepath.Join(dir, prefix+nextSuffix())
+ f, err = fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600)
+ if os.IsExist(err) {
+ if nconflict++; nconflict > 10 {
+ randmu.Lock()
+ rand = reseed()
+ randmu.Unlock()
+ }
+ continue
+ }
+ break
+ }
+ return
+}
+
+// TempDir creates a new temporary directory in the directory dir
+// with a name beginning with prefix and returns the path of the
+// new directory. If dir is the empty string, TempDir uses the
+// default directory for temporary files (see os.TempDir).
+// Multiple programs calling TempDir simultaneously
+// will not choose the same directory. It is the caller's responsibility
+// to remove the directory when no longer needed.
+func (a Afero) TempDir(dir, prefix string) (name string, err error) {
+ return TempDir(a.Fs, dir, prefix)
+}
+func TempDir(fs Fs, dir, prefix string) (name string, err error) {
+ if dir == "" {
+ dir = os.TempDir()
+ }
+
+ nconflict := 0
+ for i := 0; i < 10000; i++ {
+ try := filepath.Join(dir, prefix+nextSuffix())
+ err = fs.Mkdir(try, 0700)
+ if os.IsExist(err) {
+ if nconflict++; nconflict > 10 {
+ randmu.Lock()
+ rand = reseed()
+ randmu.Unlock()
+ }
+ continue
+ }
+ if err == nil {
+ name = try
+ }
+ break
+ }
+ return
+}
diff --git a/vendor/github.com/spf13/afero/lstater.go b/vendor/github.com/spf13/afero/lstater.go
new file mode 100644
index 00000000000..89c1bfc0a7d
--- /dev/null
+++ b/vendor/github.com/spf13/afero/lstater.go
@@ -0,0 +1,27 @@
+// Copyright © 2018 Steve Francia .
+//
+// 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.
+
+package afero
+
+import (
+ "os"
+)
+
+// Lstater is an optional interface in Afero. It is only implemented by the
+// filesystems saying so.
+// It will call Lstat if the filesystem iself is, or it delegates to, the os filesystem.
+// Else it will call Stat.
+// In addtion to the FileInfo, it will return a boolean telling whether Lstat was called or not.
+type Lstater interface {
+ LstatIfPossible(name string) (os.FileInfo, bool, error)
+}
diff --git a/vendor/github.com/spf13/afero/match.go b/vendor/github.com/spf13/afero/match.go
new file mode 100644
index 00000000000..c18a87fb713
--- /dev/null
+++ b/vendor/github.com/spf13/afero/match.go
@@ -0,0 +1,110 @@
+// Copyright © 2014 Steve Francia .
+// Copyright 2009 The Go Authors. All rights reserved.
+
+// 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.
+
+package afero
+
+import (
+ "path/filepath"
+ "sort"
+ "strings"
+)
+
+// Glob returns the names of all files matching pattern or nil
+// if there is no matching file. The syntax of patterns is the same
+// as in Match. The pattern may describe hierarchical names such as
+// /usr/*/bin/ed (assuming the Separator is '/').
+//
+// Glob ignores file system errors such as I/O errors reading directories.
+// The only possible returned error is ErrBadPattern, when pattern
+// is malformed.
+//
+// This was adapted from (http://golang.org/pkg/path/filepath) and uses several
+// built-ins from that package.
+func Glob(fs Fs, pattern string) (matches []string, err error) {
+ if !hasMeta(pattern) {
+ // Lstat not supported by a ll filesystems.
+ if _, err = lstatIfPossible(fs, pattern); err != nil {
+ return nil, nil
+ }
+ return []string{pattern}, nil
+ }
+
+ dir, file := filepath.Split(pattern)
+ switch dir {
+ case "":
+ dir = "."
+ case string(filepath.Separator):
+ // nothing
+ default:
+ dir = dir[0 : len(dir)-1] // chop off trailing separator
+ }
+
+ if !hasMeta(dir) {
+ return glob(fs, dir, file, nil)
+ }
+
+ var m []string
+ m, err = Glob(fs, dir)
+ if err != nil {
+ return
+ }
+ for _, d := range m {
+ matches, err = glob(fs, d, file, matches)
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
+// glob searches for files matching pattern in the directory dir
+// and appends them to matches. If the directory cannot be
+// opened, it returns the existing matches. New matches are
+// added in lexicographical order.
+func glob(fs Fs, dir, pattern string, matches []string) (m []string, e error) {
+ m = matches
+ fi, err := fs.Stat(dir)
+ if err != nil {
+ return
+ }
+ if !fi.IsDir() {
+ return
+ }
+ d, err := fs.Open(dir)
+ if err != nil {
+ return
+ }
+ defer d.Close()
+
+ names, _ := d.Readdirnames(-1)
+ sort.Strings(names)
+
+ for _, n := range names {
+ matched, err := filepath.Match(pattern, n)
+ if err != nil {
+ return m, err
+ }
+ if matched {
+ m = append(m, filepath.Join(dir, n))
+ }
+ }
+ return
+}
+
+// hasMeta reports whether path contains any of the magic characters
+// recognized by Match.
+func hasMeta(path string) bool {
+ // TODO(niemeyer): Should other magic characters be added here?
+ return strings.IndexAny(path, "*?[") >= 0
+}
diff --git a/vendor/github.com/spf13/afero/mem/dir.go b/vendor/github.com/spf13/afero/mem/dir.go
new file mode 100644
index 00000000000..e104013f457
--- /dev/null
+++ b/vendor/github.com/spf13/afero/mem/dir.go
@@ -0,0 +1,37 @@
+// Copyright © 2014 Steve Francia .
+//
+// 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.
+
+package mem
+
+type Dir interface {
+ Len() int
+ Names() []string
+ Files() []*FileData
+ Add(*FileData)
+ Remove(*FileData)
+}
+
+func RemoveFromMemDir(dir *FileData, f *FileData) {
+ dir.memDir.Remove(f)
+}
+
+func AddToMemDir(dir *FileData, f *FileData) {
+ dir.memDir.Add(f)
+}
+
+func InitializeDir(d *FileData) {
+ if d.memDir == nil {
+ d.dir = true
+ d.memDir = &DirMap{}
+ }
+}
diff --git a/vendor/github.com/spf13/afero/mem/dirmap.go b/vendor/github.com/spf13/afero/mem/dirmap.go
new file mode 100644
index 00000000000..03a57ee5b52
--- /dev/null
+++ b/vendor/github.com/spf13/afero/mem/dirmap.go
@@ -0,0 +1,43 @@
+// Copyright © 2015 Steve Francia .
+//
+// 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.
+
+package mem
+
+import "sort"
+
+type DirMap map[string]*FileData
+
+func (m DirMap) Len() int { return len(m) }
+func (m DirMap) Add(f *FileData) { m[f.name] = f }
+func (m DirMap) Remove(f *FileData) { delete(m, f.name) }
+func (m DirMap) Files() (files []*FileData) {
+ for _, f := range m {
+ files = append(files, f)
+ }
+ sort.Sort(filesSorter(files))
+ return files
+}
+
+// implement sort.Interface for []*FileData
+type filesSorter []*FileData
+
+func (s filesSorter) Len() int { return len(s) }
+func (s filesSorter) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s filesSorter) Less(i, j int) bool { return s[i].name < s[j].name }
+
+func (m DirMap) Names() (names []string) {
+ for x := range m {
+ names = append(names, x)
+ }
+ return names
+}
diff --git a/vendor/github.com/spf13/afero/mem/file.go b/vendor/github.com/spf13/afero/mem/file.go
new file mode 100644
index 00000000000..885e5542959
--- /dev/null
+++ b/vendor/github.com/spf13/afero/mem/file.go
@@ -0,0 +1,314 @@
+// Copyright © 2015 Steve Francia .
+// Copyright 2013 tsuru authors. All rights reserved.
+//
+// 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.
+
+package mem
+
+import (
+ "bytes"
+ "errors"
+ "io"
+ "os"
+ "path/filepath"
+ "sync"
+ "sync/atomic"
+)
+
+import "time"
+
+const FilePathSeparator = string(filepath.Separator)
+
+type File struct {
+ // atomic requires 64-bit alignment for struct field access
+ at int64
+ readDirCount int64
+ closed bool
+ readOnly bool
+ fileData *FileData
+}
+
+func NewFileHandle(data *FileData) *File {
+ return &File{fileData: data}
+}
+
+func NewReadOnlyFileHandle(data *FileData) *File {
+ return &File{fileData: data, readOnly: true}
+}
+
+func (f File) Data() *FileData {
+ return f.fileData
+}
+
+type FileData struct {
+ sync.Mutex
+ name string
+ data []byte
+ memDir Dir
+ dir bool
+ mode os.FileMode
+ modtime time.Time
+}
+
+func (d *FileData) Name() string {
+ d.Lock()
+ defer d.Unlock()
+ return d.name
+}
+
+func CreateFile(name string) *FileData {
+ return &FileData{name: name, mode: os.ModeTemporary, modtime: time.Now()}
+}
+
+func CreateDir(name string) *FileData {
+ return &FileData{name: name, memDir: &DirMap{}, dir: true}
+}
+
+func ChangeFileName(f *FileData, newname string) {
+ f.Lock()
+ f.name = newname
+ f.Unlock()
+}
+
+func SetMode(f *FileData, mode os.FileMode) {
+ f.Lock()
+ f.mode = mode
+ f.Unlock()
+}
+
+func SetModTime(f *FileData, mtime time.Time) {
+ f.Lock()
+ setModTime(f, mtime)
+ f.Unlock()
+}
+
+func setModTime(f *FileData, mtime time.Time) {
+ f.modtime = mtime
+}
+
+func GetFileInfo(f *FileData) *FileInfo {
+ return &FileInfo{f}
+}
+
+func (f *File) Open() error {
+ atomic.StoreInt64(&f.at, 0)
+ atomic.StoreInt64(&f.readDirCount, 0)
+ f.fileData.Lock()
+ f.closed = false
+ f.fileData.Unlock()
+ return nil
+}
+
+func (f *File) Close() error {
+ f.fileData.Lock()
+ f.closed = true
+ if !f.readOnly {
+ setModTime(f.fileData, time.Now())
+ }
+ f.fileData.Unlock()
+ return nil
+}
+
+func (f *File) Name() string {
+ return f.fileData.Name()
+}
+
+func (f *File) Stat() (os.FileInfo, error) {
+ return &FileInfo{f.fileData}, nil
+}
+
+func (f *File) Sync() error {
+ return nil
+}
+
+func (f *File) Readdir(count int) (res []os.FileInfo, err error) {
+ var outLength int64
+
+ f.fileData.Lock()
+ files := f.fileData.memDir.Files()[f.readDirCount:]
+ if count > 0 {
+ if len(files) < count {
+ outLength = int64(len(files))
+ } else {
+ outLength = int64(count)
+ }
+ if len(files) == 0 {
+ err = io.EOF
+ }
+ } else {
+ outLength = int64(len(files))
+ }
+ f.readDirCount += outLength
+ f.fileData.Unlock()
+
+ res = make([]os.FileInfo, outLength)
+ for i := range res {
+ res[i] = &FileInfo{files[i]}
+ }
+
+ return res, err
+}
+
+func (f *File) Readdirnames(n int) (names []string, err error) {
+ fi, err := f.Readdir(n)
+ names = make([]string, len(fi))
+ for i, f := range fi {
+ _, names[i] = filepath.Split(f.Name())
+ }
+ return names, err
+}
+
+func (f *File) Read(b []byte) (n int, err error) {
+ f.fileData.Lock()
+ defer f.fileData.Unlock()
+ if f.closed == true {
+ return 0, ErrFileClosed
+ }
+ if len(b) > 0 && int(f.at) == len(f.fileData.data) {
+ return 0, io.EOF
+ }
+ if int(f.at) > len(f.fileData.data) {
+ return 0, io.ErrUnexpectedEOF
+ }
+ if len(f.fileData.data)-int(f.at) >= len(b) {
+ n = len(b)
+ } else {
+ n = len(f.fileData.data) - int(f.at)
+ }
+ copy(b, f.fileData.data[f.at:f.at+int64(n)])
+ atomic.AddInt64(&f.at, int64(n))
+ return
+}
+
+func (f *File) ReadAt(b []byte, off int64) (n int, err error) {
+ atomic.StoreInt64(&f.at, off)
+ return f.Read(b)
+}
+
+func (f *File) Truncate(size int64) error {
+ if f.closed == true {
+ return ErrFileClosed
+ }
+ if f.readOnly {
+ return &os.PathError{Op: "truncate", Path: f.fileData.name, Err: errors.New("file handle is read only")}
+ }
+ if size < 0 {
+ return ErrOutOfRange
+ }
+ if size > int64(len(f.fileData.data)) {
+ diff := size - int64(len(f.fileData.data))
+ f.fileData.data = append(f.fileData.data, bytes.Repeat([]byte{00}, int(diff))...)
+ } else {
+ f.fileData.data = f.fileData.data[0:size]
+ }
+ setModTime(f.fileData, time.Now())
+ return nil
+}
+
+func (f *File) Seek(offset int64, whence int) (int64, error) {
+ if f.closed == true {
+ return 0, ErrFileClosed
+ }
+ switch whence {
+ case 0:
+ atomic.StoreInt64(&f.at, offset)
+ case 1:
+ atomic.AddInt64(&f.at, int64(offset))
+ case 2:
+ atomic.StoreInt64(&f.at, int64(len(f.fileData.data))+offset)
+ }
+ return f.at, nil
+}
+
+func (f *File) Write(b []byte) (n int, err error) {
+ if f.readOnly {
+ return 0, &os.PathError{Op: "write", Path: f.fileData.name, Err: errors.New("file handle is read only")}
+ }
+ n = len(b)
+ cur := atomic.LoadInt64(&f.at)
+ f.fileData.Lock()
+ defer f.fileData.Unlock()
+ diff := cur - int64(len(f.fileData.data))
+ var tail []byte
+ if n+int(cur) < len(f.fileData.data) {
+ tail = f.fileData.data[n+int(cur):]
+ }
+ if diff > 0 {
+ f.fileData.data = append(bytes.Repeat([]byte{00}, int(diff)), b...)
+ f.fileData.data = append(f.fileData.data, tail...)
+ } else {
+ f.fileData.data = append(f.fileData.data[:cur], b...)
+ f.fileData.data = append(f.fileData.data, tail...)
+ }
+ setModTime(f.fileData, time.Now())
+
+ atomic.StoreInt64(&f.at, int64(len(f.fileData.data)))
+ return
+}
+
+func (f *File) WriteAt(b []byte, off int64) (n int, err error) {
+ atomic.StoreInt64(&f.at, off)
+ return f.Write(b)
+}
+
+func (f *File) WriteString(s string) (ret int, err error) {
+ return f.Write([]byte(s))
+}
+
+func (f *File) Info() *FileInfo {
+ return &FileInfo{f.fileData}
+}
+
+type FileInfo struct {
+ *FileData
+}
+
+// Implements os.FileInfo
+func (s *FileInfo) Name() string {
+ s.Lock()
+ _, name := filepath.Split(s.name)
+ s.Unlock()
+ return name
+}
+func (s *FileInfo) Mode() os.FileMode {
+ s.Lock()
+ defer s.Unlock()
+ return s.mode
+}
+func (s *FileInfo) ModTime() time.Time {
+ s.Lock()
+ defer s.Unlock()
+ return s.modtime
+}
+func (s *FileInfo) IsDir() bool {
+ s.Lock()
+ defer s.Unlock()
+ return s.dir
+}
+func (s *FileInfo) Sys() interface{} { return nil }
+func (s *FileInfo) Size() int64 {
+ if s.IsDir() {
+ return int64(42)
+ }
+ s.Lock()
+ defer s.Unlock()
+ return int64(len(s.data))
+}
+
+var (
+ ErrFileClosed = errors.New("File is closed")
+ ErrOutOfRange = errors.New("Out of range")
+ ErrTooLarge = errors.New("Too large")
+ ErrFileNotFound = os.ErrNotExist
+ ErrFileExists = os.ErrExist
+ ErrDestinationExists = os.ErrExist
+)
diff --git a/vendor/github.com/spf13/afero/memmap.go b/vendor/github.com/spf13/afero/memmap.go
new file mode 100644
index 00000000000..09498e70fba
--- /dev/null
+++ b/vendor/github.com/spf13/afero/memmap.go
@@ -0,0 +1,365 @@
+// Copyright © 2014 Steve Francia .
+//
+// 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.
+
+package afero
+
+import (
+ "fmt"
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/spf13/afero/mem"
+)
+
+type MemMapFs struct {
+ mu sync.RWMutex
+ data map[string]*mem.FileData
+ init sync.Once
+}
+
+func NewMemMapFs() Fs {
+ return &MemMapFs{}
+}
+
+func (m *MemMapFs) getData() map[string]*mem.FileData {
+ m.init.Do(func() {
+ m.data = make(map[string]*mem.FileData)
+ // Root should always exist, right?
+ // TODO: what about windows?
+ m.data[FilePathSeparator] = mem.CreateDir(FilePathSeparator)
+ })
+ return m.data
+}
+
+func (*MemMapFs) Name() string { return "MemMapFS" }
+
+func (m *MemMapFs) Create(name string) (File, error) {
+ name = normalizePath(name)
+ m.mu.Lock()
+ file := mem.CreateFile(name)
+ m.getData()[name] = file
+ m.registerWithParent(file)
+ m.mu.Unlock()
+ return mem.NewFileHandle(file), nil
+}
+
+func (m *MemMapFs) unRegisterWithParent(fileName string) error {
+ f, err := m.lockfreeOpen(fileName)
+ if err != nil {
+ return err
+ }
+ parent := m.findParent(f)
+ if parent == nil {
+ log.Panic("parent of ", f.Name(), " is nil")
+ }
+
+ parent.Lock()
+ mem.RemoveFromMemDir(parent, f)
+ parent.Unlock()
+ return nil
+}
+
+func (m *MemMapFs) findParent(f *mem.FileData) *mem.FileData {
+ pdir, _ := filepath.Split(f.Name())
+ pdir = filepath.Clean(pdir)
+ pfile, err := m.lockfreeOpen(pdir)
+ if err != nil {
+ return nil
+ }
+ return pfile
+}
+
+func (m *MemMapFs) registerWithParent(f *mem.FileData) {
+ if f == nil {
+ return
+ }
+ parent := m.findParent(f)
+ if parent == nil {
+ pdir := filepath.Dir(filepath.Clean(f.Name()))
+ err := m.lockfreeMkdir(pdir, 0777)
+ if err != nil {
+ //log.Println("Mkdir error:", err)
+ return
+ }
+ parent, err = m.lockfreeOpen(pdir)
+ if err != nil {
+ //log.Println("Open after Mkdir error:", err)
+ return
+ }
+ }
+
+ parent.Lock()
+ mem.InitializeDir(parent)
+ mem.AddToMemDir(parent, f)
+ parent.Unlock()
+}
+
+func (m *MemMapFs) lockfreeMkdir(name string, perm os.FileMode) error {
+ name = normalizePath(name)
+ x, ok := m.getData()[name]
+ if ok {
+ // Only return ErrFileExists if it's a file, not a directory.
+ i := mem.FileInfo{FileData: x}
+ if !i.IsDir() {
+ return ErrFileExists
+ }
+ } else {
+ item := mem.CreateDir(name)
+ m.getData()[name] = item
+ m.registerWithParent(item)
+ }
+ return nil
+}
+
+func (m *MemMapFs) Mkdir(name string, perm os.FileMode) error {
+ name = normalizePath(name)
+
+ m.mu.RLock()
+ _, ok := m.getData()[name]
+ m.mu.RUnlock()
+ if ok {
+ return &os.PathError{Op: "mkdir", Path: name, Err: ErrFileExists}
+ }
+
+ m.mu.Lock()
+ item := mem.CreateDir(name)
+ m.getData()[name] = item
+ m.registerWithParent(item)
+ m.mu.Unlock()
+
+ m.Chmod(name, perm|os.ModeDir)
+
+ return nil
+}
+
+func (m *MemMapFs) MkdirAll(path string, perm os.FileMode) error {
+ err := m.Mkdir(path, perm)
+ if err != nil {
+ if err.(*os.PathError).Err == ErrFileExists {
+ return nil
+ }
+ return err
+ }
+ return nil
+}
+
+// Handle some relative paths
+func normalizePath(path string) string {
+ path = filepath.Clean(path)
+
+ switch path {
+ case ".":
+ return FilePathSeparator
+ case "..":
+ return FilePathSeparator
+ default:
+ return path
+ }
+}
+
+func (m *MemMapFs) Open(name string) (File, error) {
+ f, err := m.open(name)
+ if f != nil {
+ return mem.NewReadOnlyFileHandle(f), err
+ }
+ return nil, err
+}
+
+func (m *MemMapFs) openWrite(name string) (File, error) {
+ f, err := m.open(name)
+ if f != nil {
+ return mem.NewFileHandle(f), err
+ }
+ return nil, err
+}
+
+func (m *MemMapFs) open(name string) (*mem.FileData, error) {
+ name = normalizePath(name)
+
+ m.mu.RLock()
+ f, ok := m.getData()[name]
+ m.mu.RUnlock()
+ if !ok {
+ return nil, &os.PathError{Op: "open", Path: name, Err: ErrFileNotFound}
+ }
+ return f, nil
+}
+
+func (m *MemMapFs) lockfreeOpen(name string) (*mem.FileData, error) {
+ name = normalizePath(name)
+ f, ok := m.getData()[name]
+ if ok {
+ return f, nil
+ } else {
+ return nil, ErrFileNotFound
+ }
+}
+
+func (m *MemMapFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ chmod := false
+ file, err := m.openWrite(name)
+ if os.IsNotExist(err) && (flag&os.O_CREATE > 0) {
+ file, err = m.Create(name)
+ chmod = true
+ }
+ if err != nil {
+ return nil, err
+ }
+ if flag == os.O_RDONLY {
+ file = mem.NewReadOnlyFileHandle(file.(*mem.File).Data())
+ }
+ if flag&os.O_APPEND > 0 {
+ _, err = file.Seek(0, os.SEEK_END)
+ if err != nil {
+ file.Close()
+ return nil, err
+ }
+ }
+ if flag&os.O_TRUNC > 0 && flag&(os.O_RDWR|os.O_WRONLY) > 0 {
+ err = file.Truncate(0)
+ if err != nil {
+ file.Close()
+ return nil, err
+ }
+ }
+ if chmod {
+ m.Chmod(name, perm)
+ }
+ return file, nil
+}
+
+func (m *MemMapFs) Remove(name string) error {
+ name = normalizePath(name)
+
+ m.mu.Lock()
+ defer m.mu.Unlock()
+
+ if _, ok := m.getData()[name]; ok {
+ err := m.unRegisterWithParent(name)
+ if err != nil {
+ return &os.PathError{Op: "remove", Path: name, Err: err}
+ }
+ delete(m.getData(), name)
+ } else {
+ return &os.PathError{Op: "remove", Path: name, Err: os.ErrNotExist}
+ }
+ return nil
+}
+
+func (m *MemMapFs) RemoveAll(path string) error {
+ path = normalizePath(path)
+ m.mu.Lock()
+ m.unRegisterWithParent(path)
+ m.mu.Unlock()
+
+ m.mu.RLock()
+ defer m.mu.RUnlock()
+
+ for p, _ := range m.getData() {
+ if strings.HasPrefix(p, path) {
+ m.mu.RUnlock()
+ m.mu.Lock()
+ delete(m.getData(), p)
+ m.mu.Unlock()
+ m.mu.RLock()
+ }
+ }
+ return nil
+}
+
+func (m *MemMapFs) Rename(oldname, newname string) error {
+ oldname = normalizePath(oldname)
+ newname = normalizePath(newname)
+
+ if oldname == newname {
+ return nil
+ }
+
+ m.mu.RLock()
+ defer m.mu.RUnlock()
+ if _, ok := m.getData()[oldname]; ok {
+ m.mu.RUnlock()
+ m.mu.Lock()
+ m.unRegisterWithParent(oldname)
+ fileData := m.getData()[oldname]
+ delete(m.getData(), oldname)
+ mem.ChangeFileName(fileData, newname)
+ m.getData()[newname] = fileData
+ m.registerWithParent(fileData)
+ m.mu.Unlock()
+ m.mu.RLock()
+ } else {
+ return &os.PathError{Op: "rename", Path: oldname, Err: ErrFileNotFound}
+ }
+ return nil
+}
+
+func (m *MemMapFs) Stat(name string) (os.FileInfo, error) {
+ f, err := m.Open(name)
+ if err != nil {
+ return nil, err
+ }
+ fi := mem.GetFileInfo(f.(*mem.File).Data())
+ return fi, nil
+}
+
+func (m *MemMapFs) Chmod(name string, mode os.FileMode) error {
+ name = normalizePath(name)
+
+ m.mu.RLock()
+ f, ok := m.getData()[name]
+ m.mu.RUnlock()
+ if !ok {
+ return &os.PathError{Op: "chmod", Path: name, Err: ErrFileNotFound}
+ }
+
+ m.mu.Lock()
+ mem.SetMode(f, mode)
+ m.mu.Unlock()
+
+ return nil
+}
+
+func (m *MemMapFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
+ name = normalizePath(name)
+
+ m.mu.RLock()
+ f, ok := m.getData()[name]
+ m.mu.RUnlock()
+ if !ok {
+ return &os.PathError{Op: "chtimes", Path: name, Err: ErrFileNotFound}
+ }
+
+ m.mu.Lock()
+ mem.SetModTime(f, mtime)
+ m.mu.Unlock()
+
+ return nil
+}
+
+func (m *MemMapFs) List() {
+ for _, x := range m.data {
+ y := mem.FileInfo{FileData: x}
+ fmt.Println(x.Name(), y.Size())
+ }
+}
+
+// func debugMemMapList(fs Fs) {
+// if x, ok := fs.(*MemMapFs); ok {
+// x.List()
+// }
+// }
diff --git a/vendor/github.com/spf13/afero/os.go b/vendor/github.com/spf13/afero/os.go
new file mode 100644
index 00000000000..13cc1b84c93
--- /dev/null
+++ b/vendor/github.com/spf13/afero/os.go
@@ -0,0 +1,101 @@
+// Copyright © 2014 Steve Francia .
+// Copyright 2013 tsuru authors. All rights reserved.
+//
+// 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.
+
+package afero
+
+import (
+ "os"
+ "time"
+)
+
+var _ Lstater = (*OsFs)(nil)
+
+// OsFs is a Fs implementation that uses functions provided by the os package.
+//
+// For details in any method, check the documentation of the os package
+// (http://golang.org/pkg/os/).
+type OsFs struct{}
+
+func NewOsFs() Fs {
+ return &OsFs{}
+}
+
+func (OsFs) Name() string { return "OsFs" }
+
+func (OsFs) Create(name string) (File, error) {
+ f, e := os.Create(name)
+ if f == nil {
+ // while this looks strange, we need to return a bare nil (of type nil) not
+ // a nil value of type *os.File or nil won't be nil
+ return nil, e
+ }
+ return f, e
+}
+
+func (OsFs) Mkdir(name string, perm os.FileMode) error {
+ return os.Mkdir(name, perm)
+}
+
+func (OsFs) MkdirAll(path string, perm os.FileMode) error {
+ return os.MkdirAll(path, perm)
+}
+
+func (OsFs) Open(name string) (File, error) {
+ f, e := os.Open(name)
+ if f == nil {
+ // while this looks strange, we need to return a bare nil (of type nil) not
+ // a nil value of type *os.File or nil won't be nil
+ return nil, e
+ }
+ return f, e
+}
+
+func (OsFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ f, e := os.OpenFile(name, flag, perm)
+ if f == nil {
+ // while this looks strange, we need to return a bare nil (of type nil) not
+ // a nil value of type *os.File or nil won't be nil
+ return nil, e
+ }
+ return f, e
+}
+
+func (OsFs) Remove(name string) error {
+ return os.Remove(name)
+}
+
+func (OsFs) RemoveAll(path string) error {
+ return os.RemoveAll(path)
+}
+
+func (OsFs) Rename(oldname, newname string) error {
+ return os.Rename(oldname, newname)
+}
+
+func (OsFs) Stat(name string) (os.FileInfo, error) {
+ return os.Stat(name)
+}
+
+func (OsFs) Chmod(name string, mode os.FileMode) error {
+ return os.Chmod(name, mode)
+}
+
+func (OsFs) Chtimes(name string, atime time.Time, mtime time.Time) error {
+ return os.Chtimes(name, atime, mtime)
+}
+
+func (OsFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
+ fi, err := os.Lstat(name)
+ return fi, true, err
+}
diff --git a/vendor/github.com/spf13/afero/path.go b/vendor/github.com/spf13/afero/path.go
new file mode 100644
index 00000000000..18f60a0f6b6
--- /dev/null
+++ b/vendor/github.com/spf13/afero/path.go
@@ -0,0 +1,106 @@
+// Copyright ©2015 The Go Authors
+// Copyright ©2015 Steve Francia
+//
+// 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.
+
+package afero
+
+import (
+ "os"
+ "path/filepath"
+ "sort"
+)
+
+// readDirNames reads the directory named by dirname and returns
+// a sorted list of directory entries.
+// adapted from https://golang.org/src/path/filepath/path.go
+func readDirNames(fs Fs, dirname string) ([]string, error) {
+ f, err := fs.Open(dirname)
+ if err != nil {
+ return nil, err
+ }
+ names, err := f.Readdirnames(-1)
+ f.Close()
+ if err != nil {
+ return nil, err
+ }
+ sort.Strings(names)
+ return names, nil
+}
+
+// walk recursively descends path, calling walkFn
+// adapted from https://golang.org/src/path/filepath/path.go
+func walk(fs Fs, path string, info os.FileInfo, walkFn filepath.WalkFunc) error {
+ err := walkFn(path, info, nil)
+ if err != nil {
+ if info.IsDir() && err == filepath.SkipDir {
+ return nil
+ }
+ return err
+ }
+
+ if !info.IsDir() {
+ return nil
+ }
+
+ names, err := readDirNames(fs, path)
+ if err != nil {
+ return walkFn(path, info, err)
+ }
+
+ for _, name := range names {
+ filename := filepath.Join(path, name)
+ fileInfo, err := lstatIfPossible(fs, filename)
+ if err != nil {
+ if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir {
+ return err
+ }
+ } else {
+ err = walk(fs, filename, fileInfo, walkFn)
+ if err != nil {
+ if !fileInfo.IsDir() || err != filepath.SkipDir {
+ return err
+ }
+ }
+ }
+ }
+ return nil
+}
+
+// if the filesystem supports it, use Lstat, else use fs.Stat
+func lstatIfPossible(fs Fs, path string) (os.FileInfo, error) {
+ if lfs, ok := fs.(Lstater); ok {
+ fi, _, err := lfs.LstatIfPossible(path)
+ return fi, err
+ }
+ return fs.Stat(path)
+}
+
+// Walk walks the file tree rooted at root, calling walkFn for each file or
+// directory in the tree, including root. All errors that arise visiting files
+// and directories are filtered by walkFn. The files are walked in lexical
+// order, which makes the output deterministic but means that for very
+// large directories Walk can be inefficient.
+// Walk does not follow symbolic links.
+
+func (a Afero) Walk(root string, walkFn filepath.WalkFunc) error {
+ return Walk(a.Fs, root, walkFn)
+}
+
+func Walk(fs Fs, root string, walkFn filepath.WalkFunc) error {
+ info, err := lstatIfPossible(fs, root)
+ if err != nil {
+ return walkFn(root, nil, err)
+ }
+ return walk(fs, root, info, walkFn)
+}
diff --git a/vendor/github.com/spf13/afero/readonlyfs.go b/vendor/github.com/spf13/afero/readonlyfs.go
new file mode 100644
index 00000000000..c6376ec373a
--- /dev/null
+++ b/vendor/github.com/spf13/afero/readonlyfs.go
@@ -0,0 +1,80 @@
+package afero
+
+import (
+ "os"
+ "syscall"
+ "time"
+)
+
+var _ Lstater = (*ReadOnlyFs)(nil)
+
+type ReadOnlyFs struct {
+ source Fs
+}
+
+func NewReadOnlyFs(source Fs) Fs {
+ return &ReadOnlyFs{source: source}
+}
+
+func (r *ReadOnlyFs) ReadDir(name string) ([]os.FileInfo, error) {
+ return ReadDir(r.source, name)
+}
+
+func (r *ReadOnlyFs) Chtimes(n string, a, m time.Time) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) Chmod(n string, m os.FileMode) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) Name() string {
+ return "ReadOnlyFilter"
+}
+
+func (r *ReadOnlyFs) Stat(name string) (os.FileInfo, error) {
+ return r.source.Stat(name)
+}
+
+func (r *ReadOnlyFs) LstatIfPossible(name string) (os.FileInfo, bool, error) {
+ if lsf, ok := r.source.(Lstater); ok {
+ return lsf.LstatIfPossible(name)
+ }
+ fi, err := r.Stat(name)
+ return fi, false, err
+}
+
+func (r *ReadOnlyFs) Rename(o, n string) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) RemoveAll(p string) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) Remove(n string) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ if flag&(os.O_WRONLY|syscall.O_RDWR|os.O_APPEND|os.O_CREATE|os.O_TRUNC) != 0 {
+ return nil, syscall.EPERM
+ }
+ return r.source.OpenFile(name, flag, perm)
+}
+
+func (r *ReadOnlyFs) Open(n string) (File, error) {
+ return r.source.Open(n)
+}
+
+func (r *ReadOnlyFs) Mkdir(n string, p os.FileMode) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) MkdirAll(n string, p os.FileMode) error {
+ return syscall.EPERM
+}
+
+func (r *ReadOnlyFs) Create(n string) (File, error) {
+ return nil, syscall.EPERM
+}
diff --git a/vendor/github.com/spf13/afero/regexpfs.go b/vendor/github.com/spf13/afero/regexpfs.go
new file mode 100644
index 00000000000..9d92dbc051f
--- /dev/null
+++ b/vendor/github.com/spf13/afero/regexpfs.go
@@ -0,0 +1,214 @@
+package afero
+
+import (
+ "os"
+ "regexp"
+ "syscall"
+ "time"
+)
+
+// The RegexpFs filters files (not directories) by regular expression. Only
+// files matching the given regexp will be allowed, all others get a ENOENT error (
+// "No such file or directory").
+//
+type RegexpFs struct {
+ re *regexp.Regexp
+ source Fs
+}
+
+func NewRegexpFs(source Fs, re *regexp.Regexp) Fs {
+ return &RegexpFs{source: source, re: re}
+}
+
+type RegexpFile struct {
+ f File
+ re *regexp.Regexp
+}
+
+func (r *RegexpFs) matchesName(name string) error {
+ if r.re == nil {
+ return nil
+ }
+ if r.re.MatchString(name) {
+ return nil
+ }
+ return syscall.ENOENT
+}
+
+func (r *RegexpFs) dirOrMatches(name string) error {
+ dir, err := IsDir(r.source, name)
+ if err != nil {
+ return err
+ }
+ if dir {
+ return nil
+ }
+ return r.matchesName(name)
+}
+
+func (r *RegexpFs) Chtimes(name string, a, m time.Time) error {
+ if err := r.dirOrMatches(name); err != nil {
+ return err
+ }
+ return r.source.Chtimes(name, a, m)
+}
+
+func (r *RegexpFs) Chmod(name string, mode os.FileMode) error {
+ if err := r.dirOrMatches(name); err != nil {
+ return err
+ }
+ return r.source.Chmod(name, mode)
+}
+
+func (r *RegexpFs) Name() string {
+ return "RegexpFs"
+}
+
+func (r *RegexpFs) Stat(name string) (os.FileInfo, error) {
+ if err := r.dirOrMatches(name); err != nil {
+ return nil, err
+ }
+ return r.source.Stat(name)
+}
+
+func (r *RegexpFs) Rename(oldname, newname string) error {
+ dir, err := IsDir(r.source, oldname)
+ if err != nil {
+ return err
+ }
+ if dir {
+ return nil
+ }
+ if err := r.matchesName(oldname); err != nil {
+ return err
+ }
+ if err := r.matchesName(newname); err != nil {
+ return err
+ }
+ return r.source.Rename(oldname, newname)
+}
+
+func (r *RegexpFs) RemoveAll(p string) error {
+ dir, err := IsDir(r.source, p)
+ if err != nil {
+ return err
+ }
+ if !dir {
+ if err := r.matchesName(p); err != nil {
+ return err
+ }
+ }
+ return r.source.RemoveAll(p)
+}
+
+func (r *RegexpFs) Remove(name string) error {
+ if err := r.dirOrMatches(name); err != nil {
+ return err
+ }
+ return r.source.Remove(name)
+}
+
+func (r *RegexpFs) OpenFile(name string, flag int, perm os.FileMode) (File, error) {
+ if err := r.dirOrMatches(name); err != nil {
+ return nil, err
+ }
+ return r.source.OpenFile(name, flag, perm)
+}
+
+func (r *RegexpFs) Open(name string) (File, error) {
+ dir, err := IsDir(r.source, name)
+ if err != nil {
+ return nil, err
+ }
+ if !dir {
+ if err := r.matchesName(name); err != nil {
+ return nil, err
+ }
+ }
+ f, err := r.source.Open(name)
+ return &RegexpFile{f: f, re: r.re}, nil
+}
+
+func (r *RegexpFs) Mkdir(n string, p os.FileMode) error {
+ return r.source.Mkdir(n, p)
+}
+
+func (r *RegexpFs) MkdirAll(n string, p os.FileMode) error {
+ return r.source.MkdirAll(n, p)
+}
+
+func (r *RegexpFs) Create(name string) (File, error) {
+ if err := r.matchesName(name); err != nil {
+ return nil, err
+ }
+ return r.source.Create(name)
+}
+
+func (f *RegexpFile) Close() error {
+ return f.f.Close()
+}
+
+func (f *RegexpFile) Read(s []byte) (int, error) {
+ return f.f.Read(s)
+}
+
+func (f *RegexpFile) ReadAt(s []byte, o int64) (int, error) {
+ return f.f.ReadAt(s, o)
+}
+
+func (f *RegexpFile) Seek(o int64, w int) (int64, error) {
+ return f.f.Seek(o, w)
+}
+
+func (f *RegexpFile) Write(s []byte) (int, error) {
+ return f.f.Write(s)
+}
+
+func (f *RegexpFile) WriteAt(s []byte, o int64) (int, error) {
+ return f.f.WriteAt(s, o)
+}
+
+func (f *RegexpFile) Name() string {
+ return f.f.Name()
+}
+
+func (f *RegexpFile) Readdir(c int) (fi []os.FileInfo, err error) {
+ var rfi []os.FileInfo
+ rfi, err = f.f.Readdir(c)
+ if err != nil {
+ return nil, err
+ }
+ for _, i := range rfi {
+ if i.IsDir() || f.re.MatchString(i.Name()) {
+ fi = append(fi, i)
+ }
+ }
+ return fi, nil
+}
+
+func (f *RegexpFile) Readdirnames(c int) (n []string, err error) {
+ fi, err := f.Readdir(c)
+ if err != nil {
+ return nil, err
+ }
+ for _, s := range fi {
+ n = append(n, s.Name())
+ }
+ return n, nil
+}
+
+func (f *RegexpFile) Stat() (os.FileInfo, error) {
+ return f.f.Stat()
+}
+
+func (f *RegexpFile) Sync() error {
+ return f.f.Sync()
+}
+
+func (f *RegexpFile) Truncate(s int64) error {
+ return f.f.Truncate(s)
+}
+
+func (f *RegexpFile) WriteString(s string) (int, error) {
+ return f.f.WriteString(s)
+}
diff --git a/vendor/github.com/spf13/afero/unionFile.go b/vendor/github.com/spf13/afero/unionFile.go
new file mode 100644
index 00000000000..1e78f7d1efb
--- /dev/null
+++ b/vendor/github.com/spf13/afero/unionFile.go
@@ -0,0 +1,305 @@
+package afero
+
+import (
+ "io"
+ "os"
+ "path/filepath"
+ "syscall"
+)
+
+// The UnionFile implements the afero.File interface and will be returned
+// when reading a directory present at least in the overlay or opening a file
+// for writing.
+//
+// The calls to
+// Readdir() and Readdirnames() merge the file os.FileInfo / names from the
+// base and the overlay - for files present in both layers, only those
+// from the overlay will be used.
+//
+// When opening files for writing (Create() / OpenFile() with the right flags)
+// the operations will be done in both layers, starting with the overlay. A
+// successful read in the overlay will move the cursor position in the base layer
+// by the number of bytes read.
+type UnionFile struct {
+ Base File
+ Layer File
+ Merger DirsMerger
+ off int
+ files []os.FileInfo
+}
+
+func (f *UnionFile) Close() error {
+ // first close base, so we have a newer timestamp in the overlay. If we'd close
+ // the overlay first, we'd get a cacheStale the next time we access this file
+ // -> cache would be useless ;-)
+ if f.Base != nil {
+ f.Base.Close()
+ }
+ if f.Layer != nil {
+ return f.Layer.Close()
+ }
+ return BADFD
+}
+
+func (f *UnionFile) Read(s []byte) (int, error) {
+ if f.Layer != nil {
+ n, err := f.Layer.Read(s)
+ if (err == nil || err == io.EOF) && f.Base != nil {
+ // advance the file position also in the base file, the next
+ // call may be a write at this position (or a seek with SEEK_CUR)
+ if _, seekErr := f.Base.Seek(int64(n), os.SEEK_CUR); seekErr != nil {
+ // only overwrite err in case the seek fails: we need to
+ // report an eventual io.EOF to the caller
+ err = seekErr
+ }
+ }
+ return n, err
+ }
+ if f.Base != nil {
+ return f.Base.Read(s)
+ }
+ return 0, BADFD
+}
+
+func (f *UnionFile) ReadAt(s []byte, o int64) (int, error) {
+ if f.Layer != nil {
+ n, err := f.Layer.ReadAt(s, o)
+ if (err == nil || err == io.EOF) && f.Base != nil {
+ _, err = f.Base.Seek(o+int64(n), os.SEEK_SET)
+ }
+ return n, err
+ }
+ if f.Base != nil {
+ return f.Base.ReadAt(s, o)
+ }
+ return 0, BADFD
+}
+
+func (f *UnionFile) Seek(o int64, w int) (pos int64, err error) {
+ if f.Layer != nil {
+ pos, err = f.Layer.Seek(o, w)
+ if (err == nil || err == io.EOF) && f.Base != nil {
+ _, err = f.Base.Seek(o, w)
+ }
+ return pos, err
+ }
+ if f.Base != nil {
+ return f.Base.Seek(o, w)
+ }
+ return 0, BADFD
+}
+
+func (f *UnionFile) Write(s []byte) (n int, err error) {
+ if f.Layer != nil {
+ n, err = f.Layer.Write(s)
+ if err == nil && f.Base != nil { // hmm, do we have fixed size files where a write may hit the EOF mark?
+ _, err = f.Base.Write(s)
+ }
+ return n, err
+ }
+ if f.Base != nil {
+ return f.Base.Write(s)
+ }
+ return 0, BADFD
+}
+
+func (f *UnionFile) WriteAt(s []byte, o int64) (n int, err error) {
+ if f.Layer != nil {
+ n, err = f.Layer.WriteAt(s, o)
+ if err == nil && f.Base != nil {
+ _, err = f.Base.WriteAt(s, o)
+ }
+ return n, err
+ }
+ if f.Base != nil {
+ return f.Base.WriteAt(s, o)
+ }
+ return 0, BADFD
+}
+
+func (f *UnionFile) Name() string {
+ if f.Layer != nil {
+ return f.Layer.Name()
+ }
+ return f.Base.Name()
+}
+
+// DirsMerger is how UnionFile weaves two directories together.
+// It takes the FileInfo slices from the layer and the base and returns a
+// single view.
+type DirsMerger func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error)
+
+var defaultUnionMergeDirsFn = func(lofi, bofi []os.FileInfo) ([]os.FileInfo, error) {
+ var files = make(map[string]os.FileInfo)
+
+ for _, fi := range lofi {
+ files[fi.Name()] = fi
+ }
+
+ for _, fi := range bofi {
+ if _, exists := files[fi.Name()]; !exists {
+ files[fi.Name()] = fi
+ }
+ }
+
+ rfi := make([]os.FileInfo, len(files))
+
+ i := 0
+ for _, fi := range files {
+ rfi[i] = fi
+ i++
+ }
+
+ return rfi, nil
+
+}
+
+// Readdir will weave the two directories together and
+// return a single view of the overlayed directories
+func (f *UnionFile) Readdir(c int) (ofi []os.FileInfo, err error) {
+ var merge DirsMerger = f.Merger
+ if merge == nil {
+ merge = defaultUnionMergeDirsFn
+ }
+
+ if f.off == 0 {
+ var lfi []os.FileInfo
+ if f.Layer != nil {
+ lfi, err = f.Layer.Readdir(-1)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ var bfi []os.FileInfo
+ if f.Base != nil {
+ bfi, err = f.Base.Readdir(-1)
+ if err != nil {
+ return nil, err
+ }
+
+ }
+ merged, err := merge(lfi, bfi)
+ if err != nil {
+ return nil, err
+ }
+ f.files = append(f.files, merged...)
+ }
+ if c == -1 {
+ return f.files[f.off:], nil
+ }
+ defer func() { f.off += c }()
+ return f.files[f.off:c], nil
+}
+
+func (f *UnionFile) Readdirnames(c int) ([]string, error) {
+ rfi, err := f.Readdir(c)
+ if err != nil {
+ return nil, err
+ }
+ var names []string
+ for _, fi := range rfi {
+ names = append(names, fi.Name())
+ }
+ return names, nil
+}
+
+func (f *UnionFile) Stat() (os.FileInfo, error) {
+ if f.Layer != nil {
+ return f.Layer.Stat()
+ }
+ if f.Base != nil {
+ return f.Base.Stat()
+ }
+ return nil, BADFD
+}
+
+func (f *UnionFile) Sync() (err error) {
+ if f.Layer != nil {
+ err = f.Layer.Sync()
+ if err == nil && f.Base != nil {
+ err = f.Base.Sync()
+ }
+ return err
+ }
+ if f.Base != nil {
+ return f.Base.Sync()
+ }
+ return BADFD
+}
+
+func (f *UnionFile) Truncate(s int64) (err error) {
+ if f.Layer != nil {
+ err = f.Layer.Truncate(s)
+ if err == nil && f.Base != nil {
+ err = f.Base.Truncate(s)
+ }
+ return err
+ }
+ if f.Base != nil {
+ return f.Base.Truncate(s)
+ }
+ return BADFD
+}
+
+func (f *UnionFile) WriteString(s string) (n int, err error) {
+ if f.Layer != nil {
+ n, err = f.Layer.WriteString(s)
+ if err == nil && f.Base != nil {
+ _, err = f.Base.WriteString(s)
+ }
+ return n, err
+ }
+ if f.Base != nil {
+ return f.Base.WriteString(s)
+ }
+ return 0, BADFD
+}
+
+func copyToLayer(base Fs, layer Fs, name string) error {
+ bfh, err := base.Open(name)
+ if err != nil {
+ return err
+ }
+ defer bfh.Close()
+
+ // First make sure the directory exists
+ exists, err := Exists(layer, filepath.Dir(name))
+ if err != nil {
+ return err
+ }
+ if !exists {
+ err = layer.MkdirAll(filepath.Dir(name), 0777) // FIXME?
+ if err != nil {
+ return err
+ }
+ }
+
+ // Create the file on the overlay
+ lfh, err := layer.Create(name)
+ if err != nil {
+ return err
+ }
+ n, err := io.Copy(lfh, bfh)
+ if err != nil {
+ // If anything fails, clean up the file
+ layer.Remove(name)
+ lfh.Close()
+ return err
+ }
+
+ bfi, err := bfh.Stat()
+ if err != nil || bfi.Size() != n {
+ layer.Remove(name)
+ lfh.Close()
+ return syscall.EIO
+ }
+
+ err = lfh.Close()
+ if err != nil {
+ layer.Remove(name)
+ lfh.Close()
+ return err
+ }
+ return layer.Chtimes(name, bfi.ModTime(), bfi.ModTime())
+}
diff --git a/vendor/github.com/spf13/afero/util.go b/vendor/github.com/spf13/afero/util.go
new file mode 100644
index 00000000000..4f253f481ed
--- /dev/null
+++ b/vendor/github.com/spf13/afero/util.go
@@ -0,0 +1,330 @@
+// Copyright ©2015 Steve Francia
+// Portions Copyright ©2015 The Hugo Authors
+// Portions Copyright 2016-present Bjørn Erik Pedersen
+//
+// 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.
+
+package afero
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "unicode"
+
+ "golang.org/x/text/transform"
+ "golang.org/x/text/unicode/norm"
+)
+
+// Filepath separator defined by os.Separator.
+const FilePathSeparator = string(filepath.Separator)
+
+// Takes a reader and a path and writes the content
+func (a Afero) WriteReader(path string, r io.Reader) (err error) {
+ return WriteReader(a.Fs, path, r)
+}
+
+func WriteReader(fs Fs, path string, r io.Reader) (err error) {
+ dir, _ := filepath.Split(path)
+ ospath := filepath.FromSlash(dir)
+
+ if ospath != "" {
+ err = fs.MkdirAll(ospath, 0777) // rwx, rw, r
+ if err != nil {
+ if err != os.ErrExist {
+ return err
+ }
+ }
+ }
+
+ file, err := fs.Create(path)
+ if err != nil {
+ return
+ }
+ defer file.Close()
+
+ _, err = io.Copy(file, r)
+ return
+}
+
+// Same as WriteReader but checks to see if file/directory already exists.
+func (a Afero) SafeWriteReader(path string, r io.Reader) (err error) {
+ return SafeWriteReader(a.Fs, path, r)
+}
+
+func SafeWriteReader(fs Fs, path string, r io.Reader) (err error) {
+ dir, _ := filepath.Split(path)
+ ospath := filepath.FromSlash(dir)
+
+ if ospath != "" {
+ err = fs.MkdirAll(ospath, 0777) // rwx, rw, r
+ if err != nil {
+ return
+ }
+ }
+
+ exists, err := Exists(fs, path)
+ if err != nil {
+ return
+ }
+ if exists {
+ return fmt.Errorf("%v already exists", path)
+ }
+
+ file, err := fs.Create(path)
+ if err != nil {
+ return
+ }
+ defer file.Close()
+
+ _, err = io.Copy(file, r)
+ return
+}
+
+func (a Afero) GetTempDir(subPath string) string {
+ return GetTempDir(a.Fs, subPath)
+}
+
+// GetTempDir returns the default temp directory with trailing slash
+// if subPath is not empty then it will be created recursively with mode 777 rwx rwx rwx
+func GetTempDir(fs Fs, subPath string) string {
+ addSlash := func(p string) string {
+ if FilePathSeparator != p[len(p)-1:] {
+ p = p + FilePathSeparator
+ }
+ return p
+ }
+ dir := addSlash(os.TempDir())
+
+ if subPath != "" {
+ // preserve windows backslash :-(
+ if FilePathSeparator == "\\" {
+ subPath = strings.Replace(subPath, "\\", "____", -1)
+ }
+ dir = dir + UnicodeSanitize((subPath))
+ if FilePathSeparator == "\\" {
+ dir = strings.Replace(dir, "____", "\\", -1)
+ }
+
+ if exists, _ := Exists(fs, dir); exists {
+ return addSlash(dir)
+ }
+
+ err := fs.MkdirAll(dir, 0777)
+ if err != nil {
+ panic(err)
+ }
+ dir = addSlash(dir)
+ }
+ return dir
+}
+
+// Rewrite string to remove non-standard path characters
+func UnicodeSanitize(s string) string {
+ source := []rune(s)
+ target := make([]rune, 0, len(source))
+
+ for _, r := range source {
+ if unicode.IsLetter(r) ||
+ unicode.IsDigit(r) ||
+ unicode.IsMark(r) ||
+ r == '.' ||
+ r == '/' ||
+ r == '\\' ||
+ r == '_' ||
+ r == '-' ||
+ r == '%' ||
+ r == ' ' ||
+ r == '#' {
+ target = append(target, r)
+ }
+ }
+
+ return string(target)
+}
+
+// Transform characters with accents into plain forms.
+func NeuterAccents(s string) string {
+ t := transform.Chain(norm.NFD, transform.RemoveFunc(isMn), norm.NFC)
+ result, _, _ := transform.String(t, string(s))
+
+ return result
+}
+
+func isMn(r rune) bool {
+ return unicode.Is(unicode.Mn, r) // Mn: nonspacing marks
+}
+
+func (a Afero) FileContainsBytes(filename string, subslice []byte) (bool, error) {
+ return FileContainsBytes(a.Fs, filename, subslice)
+}
+
+// Check if a file contains a specified byte slice.
+func FileContainsBytes(fs Fs, filename string, subslice []byte) (bool, error) {
+ f, err := fs.Open(filename)
+ if err != nil {
+ return false, err
+ }
+ defer f.Close()
+
+ return readerContainsAny(f, subslice), nil
+}
+
+func (a Afero) FileContainsAnyBytes(filename string, subslices [][]byte) (bool, error) {
+ return FileContainsAnyBytes(a.Fs, filename, subslices)
+}
+
+// Check if a file contains any of the specified byte slices.
+func FileContainsAnyBytes(fs Fs, filename string, subslices [][]byte) (bool, error) {
+ f, err := fs.Open(filename)
+ if err != nil {
+ return false, err
+ }
+ defer f.Close()
+
+ return readerContainsAny(f, subslices...), nil
+}
+
+// readerContains reports whether any of the subslices is within r.
+func readerContainsAny(r io.Reader, subslices ...[]byte) bool {
+
+ if r == nil || len(subslices) == 0 {
+ return false
+ }
+
+ largestSlice := 0
+
+ for _, sl := range subslices {
+ if len(sl) > largestSlice {
+ largestSlice = len(sl)
+ }
+ }
+
+ if largestSlice == 0 {
+ return false
+ }
+
+ bufflen := largestSlice * 4
+ halflen := bufflen / 2
+ buff := make([]byte, bufflen)
+ var err error
+ var n, i int
+
+ for {
+ i++
+ if i == 1 {
+ n, err = io.ReadAtLeast(r, buff[:halflen], halflen)
+ } else {
+ if i != 2 {
+ // shift left to catch overlapping matches
+ copy(buff[:], buff[halflen:])
+ }
+ n, err = io.ReadAtLeast(r, buff[halflen:], halflen)
+ }
+
+ if n > 0 {
+ for _, sl := range subslices {
+ if bytes.Contains(buff, sl) {
+ return true
+ }
+ }
+ }
+
+ if err != nil {
+ break
+ }
+ }
+ return false
+}
+
+func (a Afero) DirExists(path string) (bool, error) {
+ return DirExists(a.Fs, path)
+}
+
+// DirExists checks if a path exists and is a directory.
+func DirExists(fs Fs, path string) (bool, error) {
+ fi, err := fs.Stat(path)
+ if err == nil && fi.IsDir() {
+ return true, nil
+ }
+ if os.IsNotExist(err) {
+ return false, nil
+ }
+ return false, err
+}
+
+func (a Afero) IsDir(path string) (bool, error) {
+ return IsDir(a.Fs, path)
+}
+
+// IsDir checks if a given path is a directory.
+func IsDir(fs Fs, path string) (bool, error) {
+ fi, err := fs.Stat(path)
+ if err != nil {
+ return false, err
+ }
+ return fi.IsDir(), nil
+}
+
+func (a Afero) IsEmpty(path string) (bool, error) {
+ return IsEmpty(a.Fs, path)
+}
+
+// IsEmpty checks if a given file or directory is empty.
+func IsEmpty(fs Fs, path string) (bool, error) {
+ if b, _ := Exists(fs, path); !b {
+ return false, fmt.Errorf("%q path does not exist", path)
+ }
+ fi, err := fs.Stat(path)
+ if err != nil {
+ return false, err
+ }
+ if fi.IsDir() {
+ f, err := fs.Open(path)
+ if err != nil {
+ return false, err
+ }
+ defer f.Close()
+ list, err := f.Readdir(-1)
+ return len(list) == 0, nil
+ }
+ return fi.Size() == 0, nil
+}
+
+func (a Afero) Exists(path string) (bool, error) {
+ return Exists(a.Fs, path)
+}
+
+// Check if a file or directory exists.
+func Exists(fs Fs, path string) (bool, error) {
+ _, err := fs.Stat(path)
+ if err == nil {
+ return true, nil
+ }
+ if os.IsNotExist(err) {
+ return false, nil
+ }
+ return false, err
+}
+
+func FullBaseFsPath(basePathFs *BasePathFs, relativePath string) string {
+ combinedPath := filepath.Join(basePathFs.path, relativePath)
+ if parent, ok := basePathFs.source.(*BasePathFs); ok {
+ return FullBaseFsPath(parent, combinedPath)
+ }
+
+ return combinedPath
+}
diff --git a/vendor/github.com/spf13/cast/.gitignore b/vendor/github.com/spf13/cast/.gitignore
new file mode 100644
index 00000000000..53053a8ac59
--- /dev/null
+++ b/vendor/github.com/spf13/cast/.gitignore
@@ -0,0 +1,25 @@
+# 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
+
+*.bench
diff --git a/vendor/github.com/spf13/cast/.travis.yml b/vendor/github.com/spf13/cast/.travis.yml
new file mode 100644
index 00000000000..4da9766841a
--- /dev/null
+++ b/vendor/github.com/spf13/cast/.travis.yml
@@ -0,0 +1,14 @@
+language: go
+sudo: required
+go:
+ - 1.7.5
+ - 1.8
+ - tip
+os:
+ - linux
+matrix:
+ allow_failures:
+ - go: tip
+ fast_finish: true
+script:
+ - make check
diff --git a/vendor/github.com/spf13/cast/LICENSE b/vendor/github.com/spf13/cast/LICENSE
new file mode 100644
index 00000000000..4527efb9c06
--- /dev/null
+++ b/vendor/github.com/spf13/cast/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Steve Francia
+
+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.
\ No newline at end of file
diff --git a/vendor/github.com/spf13/cast/Makefile b/vendor/github.com/spf13/cast/Makefile
new file mode 100644
index 00000000000..7ccf8930b56
--- /dev/null
+++ b/vendor/github.com/spf13/cast/Makefile
@@ -0,0 +1,38 @@
+# A Self-Documenting Makefile: http://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
+
+.PHONY: check fmt lint test test-race vet test-cover-html help
+.DEFAULT_GOAL := help
+
+check: test-race fmt vet lint ## Run tests and linters
+
+test: ## Run tests
+ go test ./...
+
+test-race: ## Run tests with race detector
+ go test -race ./...
+
+fmt: ## Run gofmt linter
+ @for d in `go list` ; do \
+ if [ "`gofmt -l -s $$GOPATH/src/$$d | tee /dev/stderr`" ]; then \
+ echo "^ improperly formatted go files" && echo && exit 1; \
+ fi \
+ done
+
+lint: ## Run golint linter
+ @for d in `go list` ; do \
+ if [ "`golint $$d | tee /dev/stderr`" ]; then \
+ echo "^ golint errors!" && echo && exit 1; \
+ fi \
+ done
+
+vet: ## Run go vet linter
+ @if [ "`go vet | tee /dev/stderr`" ]; then \
+ echo "^ go vet errors!" && echo && exit 1; \
+ fi
+
+test-cover-html: ## Generate test coverage report
+ go test -coverprofile=coverage.out -covermode=count
+ go tool cover -func=coverage.out
+
+help:
+ @grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
diff --git a/vendor/github.com/spf13/cast/README.md b/vendor/github.com/spf13/cast/README.md
new file mode 100644
index 00000000000..e6939397ddd
--- /dev/null
+++ b/vendor/github.com/spf13/cast/README.md
@@ -0,0 +1,75 @@
+cast
+====
+[![GoDoc](https://godoc.org/github.com/spf13/cast?status.svg)](https://godoc.org/github.com/spf13/cast)
+[![Build Status](https://api.travis-ci.org/spf13/cast.svg?branch=master)](https://travis-ci.org/spf13/cast)
+[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cast)](https://goreportcard.com/report/github.com/spf13/cast)
+
+Easy and safe casting from one type to another in Go
+
+Don’t Panic! ... Cast
+
+## What is Cast?
+
+Cast is a library to convert between different go types in a consistent and easy way.
+
+Cast provides simple functions to easily convert a number to a string, an
+interface into a bool, etc. Cast does this intelligently when an obvious
+conversion is possible. It doesn’t make any attempts to guess what you meant,
+for example you can only convert a string to an int when it is a string
+representation of an int such as “8”. Cast was developed for use in
+[Hugo](http://hugo.spf13.com), a website engine which uses YAML, TOML or JSON
+for meta data.
+
+## Why use Cast?
+
+When working with dynamic data in Go you often need to cast or convert the data
+from one type into another. Cast goes beyond just using type assertion (though
+it uses that when possible) to provide a very straightforward and convenient
+library.
+
+If you are working with interfaces to handle things like dynamic content
+you’ll need an easy way to convert an interface into a given type. This
+is the library for you.
+
+If you are taking in data from YAML, TOML or JSON or other formats which lack
+full types, then Cast is the library for you.
+
+## Usage
+
+Cast provides a handful of To_____ methods. These methods will always return
+the desired type. **If input is provided that will not convert to that type, the
+0 or nil value for that type will be returned**.
+
+Cast also provides identical methods To_____E. These return the same result as
+the To_____ methods, plus an additional error which tells you if it successfully
+converted. Using these methods you can tell the difference between when the
+input matched the zero value or when the conversion failed and the zero value
+was returned.
+
+The following examples are merely a sample of what is available. Please review
+the code for a complete set.
+
+### Example ‘ToString’:
+
+ cast.ToString("mayonegg") // "mayonegg"
+ cast.ToString(8) // "8"
+ cast.ToString(8.31) // "8.31"
+ cast.ToString([]byte("one time")) // "one time"
+ cast.ToString(nil) // ""
+
+ var foo interface{} = "one more time"
+ cast.ToString(foo) // "one more time"
+
+
+### Example ‘ToInt’:
+
+ cast.ToInt(8) // 8
+ cast.ToInt(8.31) // 8
+ cast.ToInt("8") // 8
+ cast.ToInt(true) // 1
+ cast.ToInt(false) // 0
+
+ var eight interface{} = 8
+ cast.ToInt(eight) // 8
+ cast.ToInt(nil) // 0
+
diff --git a/vendor/github.com/spf13/cast/cast.go b/vendor/github.com/spf13/cast/cast.go
new file mode 100644
index 00000000000..8b8c208befd
--- /dev/null
+++ b/vendor/github.com/spf13/cast/cast.go
@@ -0,0 +1,159 @@
+// Copyright © 2014 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+// Package cast provides easy and safe casting in Go.
+package cast
+
+import "time"
+
+// ToBool casts an interface to a bool type.
+func ToBool(i interface{}) bool {
+ v, _ := ToBoolE(i)
+ return v
+}
+
+// ToTime casts an interface to a time.Time type.
+func ToTime(i interface{}) time.Time {
+ v, _ := ToTimeE(i)
+ return v
+}
+
+// ToDuration casts an interface to a time.Duration type.
+func ToDuration(i interface{}) time.Duration {
+ v, _ := ToDurationE(i)
+ return v
+}
+
+// ToFloat64 casts an interface to a float64 type.
+func ToFloat64(i interface{}) float64 {
+ v, _ := ToFloat64E(i)
+ return v
+}
+
+// ToFloat32 casts an interface to a float32 type.
+func ToFloat32(i interface{}) float32 {
+ v, _ := ToFloat32E(i)
+ return v
+}
+
+// ToInt64 casts an interface to an int64 type.
+func ToInt64(i interface{}) int64 {
+ v, _ := ToInt64E(i)
+ return v
+}
+
+// ToInt32 casts an interface to an int32 type.
+func ToInt32(i interface{}) int32 {
+ v, _ := ToInt32E(i)
+ return v
+}
+
+// ToInt16 casts an interface to an int16 type.
+func ToInt16(i interface{}) int16 {
+ v, _ := ToInt16E(i)
+ return v
+}
+
+// ToInt8 casts an interface to an int8 type.
+func ToInt8(i interface{}) int8 {
+ v, _ := ToInt8E(i)
+ return v
+}
+
+// ToInt casts an interface to an int type.
+func ToInt(i interface{}) int {
+ v, _ := ToIntE(i)
+ return v
+}
+
+// ToUint casts an interface to a uint type.
+func ToUint(i interface{}) uint {
+ v, _ := ToUintE(i)
+ return v
+}
+
+// ToUint64 casts an interface to a uint64 type.
+func ToUint64(i interface{}) uint64 {
+ v, _ := ToUint64E(i)
+ return v
+}
+
+// ToUint32 casts an interface to a uint32 type.
+func ToUint32(i interface{}) uint32 {
+ v, _ := ToUint32E(i)
+ return v
+}
+
+// ToUint16 casts an interface to a uint16 type.
+func ToUint16(i interface{}) uint16 {
+ v, _ := ToUint16E(i)
+ return v
+}
+
+// ToUint8 casts an interface to a uint8 type.
+func ToUint8(i interface{}) uint8 {
+ v, _ := ToUint8E(i)
+ return v
+}
+
+// ToString casts an interface to a string type.
+func ToString(i interface{}) string {
+ v, _ := ToStringE(i)
+ return v
+}
+
+// ToStringMapString casts an interface to a map[string]string type.
+func ToStringMapString(i interface{}) map[string]string {
+ v, _ := ToStringMapStringE(i)
+ return v
+}
+
+// ToStringMapStringSlice casts an interface to a map[string][]string type.
+func ToStringMapStringSlice(i interface{}) map[string][]string {
+ v, _ := ToStringMapStringSliceE(i)
+ return v
+}
+
+// ToStringMapBool casts an interface to a map[string]bool type.
+func ToStringMapBool(i interface{}) map[string]bool {
+ v, _ := ToStringMapBoolE(i)
+ return v
+}
+
+// ToStringMap casts an interface to a map[string]interface{} type.
+func ToStringMap(i interface{}) map[string]interface{} {
+ v, _ := ToStringMapE(i)
+ return v
+}
+
+// ToSlice casts an interface to a []interface{} type.
+func ToSlice(i interface{}) []interface{} {
+ v, _ := ToSliceE(i)
+ return v
+}
+
+// ToBoolSlice casts an interface to a []bool type.
+func ToBoolSlice(i interface{}) []bool {
+ v, _ := ToBoolSliceE(i)
+ return v
+}
+
+// ToStringSlice casts an interface to a []string type.
+func ToStringSlice(i interface{}) []string {
+ v, _ := ToStringSliceE(i)
+ return v
+}
+
+// ToIntSlice casts an interface to a []int type.
+func ToIntSlice(i interface{}) []int {
+ v, _ := ToIntSliceE(i)
+ return v
+}
+
+// ToDurationSlice casts an interface to a []time.Duration type.
+func ToDurationSlice(i interface{}) []time.Duration {
+ v, _ := ToDurationSliceE(i)
+ return v
+}
diff --git a/vendor/github.com/spf13/cast/caste.go b/vendor/github.com/spf13/cast/caste.go
new file mode 100644
index 00000000000..4fe19289347
--- /dev/null
+++ b/vendor/github.com/spf13/cast/caste.go
@@ -0,0 +1,1166 @@
+// Copyright © 2014 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+package cast
+
+import (
+ "encoding/json"
+ "errors"
+ "fmt"
+ "html/template"
+ "reflect"
+ "strconv"
+ "strings"
+ "time"
+)
+
+var errNegativeNotAllowed = errors.New("unable to cast negative value")
+
+// ToTimeE casts an interface to a time.Time type.
+func ToTimeE(i interface{}) (tim time.Time, err error) {
+ i = indirect(i)
+
+ switch v := i.(type) {
+ case time.Time:
+ return v, nil
+ case string:
+ return StringToDate(v)
+ case int:
+ return time.Unix(int64(v), 0), nil
+ case int64:
+ return time.Unix(v, 0), nil
+ case int32:
+ return time.Unix(int64(v), 0), nil
+ case uint:
+ return time.Unix(int64(v), 0), nil
+ case uint64:
+ return time.Unix(int64(v), 0), nil
+ case uint32:
+ return time.Unix(int64(v), 0), nil
+ default:
+ return time.Time{}, fmt.Errorf("unable to cast %#v of type %T to Time", i, i)
+ }
+}
+
+// ToDurationE casts an interface to a time.Duration type.
+func ToDurationE(i interface{}) (d time.Duration, err error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case time.Duration:
+ return s, nil
+ case int, int64, int32, int16, int8, uint, uint64, uint32, uint16, uint8:
+ d = time.Duration(ToInt64(s))
+ return
+ case float32, float64:
+ d = time.Duration(ToFloat64(s))
+ return
+ case string:
+ if strings.ContainsAny(s, "nsuµmh") {
+ d, err = time.ParseDuration(s)
+ } else {
+ d, err = time.ParseDuration(s + "ns")
+ }
+ return
+ default:
+ err = fmt.Errorf("unable to cast %#v of type %T to Duration", i, i)
+ return
+ }
+}
+
+// ToBoolE casts an interface to a bool type.
+func ToBoolE(i interface{}) (bool, error) {
+ i = indirect(i)
+
+ switch b := i.(type) {
+ case bool:
+ return b, nil
+ case nil:
+ return false, nil
+ case int:
+ if i.(int) != 0 {
+ return true, nil
+ }
+ return false, nil
+ case string:
+ return strconv.ParseBool(i.(string))
+ default:
+ return false, fmt.Errorf("unable to cast %#v of type %T to bool", i, i)
+ }
+}
+
+// ToFloat64E casts an interface to a float64 type.
+func ToFloat64E(i interface{}) (float64, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case float64:
+ return s, nil
+ case float32:
+ return float64(s), nil
+ case int:
+ return float64(s), nil
+ case int64:
+ return float64(s), nil
+ case int32:
+ return float64(s), nil
+ case int16:
+ return float64(s), nil
+ case int8:
+ return float64(s), nil
+ case uint:
+ return float64(s), nil
+ case uint64:
+ return float64(s), nil
+ case uint32:
+ return float64(s), nil
+ case uint16:
+ return float64(s), nil
+ case uint8:
+ return float64(s), nil
+ case string:
+ v, err := strconv.ParseFloat(s, 64)
+ if err == nil {
+ return v, nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to float64", i, i)
+ }
+}
+
+// ToFloat32E casts an interface to a float32 type.
+func ToFloat32E(i interface{}) (float32, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case float64:
+ return float32(s), nil
+ case float32:
+ return s, nil
+ case int:
+ return float32(s), nil
+ case int64:
+ return float32(s), nil
+ case int32:
+ return float32(s), nil
+ case int16:
+ return float32(s), nil
+ case int8:
+ return float32(s), nil
+ case uint:
+ return float32(s), nil
+ case uint64:
+ return float32(s), nil
+ case uint32:
+ return float32(s), nil
+ case uint16:
+ return float32(s), nil
+ case uint8:
+ return float32(s), nil
+ case string:
+ v, err := strconv.ParseFloat(s, 32)
+ if err == nil {
+ return float32(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to float32", i, i)
+ }
+}
+
+// ToInt64E casts an interface to an int64 type.
+func ToInt64E(i interface{}) (int64, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case int:
+ return int64(s), nil
+ case int64:
+ return s, nil
+ case int32:
+ return int64(s), nil
+ case int16:
+ return int64(s), nil
+ case int8:
+ return int64(s), nil
+ case uint:
+ return int64(s), nil
+ case uint64:
+ return int64(s), nil
+ case uint32:
+ return int64(s), nil
+ case uint16:
+ return int64(s), nil
+ case uint8:
+ return int64(s), nil
+ case float64:
+ return int64(s), nil
+ case float32:
+ return int64(s), nil
+ case string:
+ v, err := strconv.ParseInt(s, 0, 0)
+ if err == nil {
+ return v, nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int64", i, i)
+ }
+}
+
+// ToInt32E casts an interface to an int32 type.
+func ToInt32E(i interface{}) (int32, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case int:
+ return int32(s), nil
+ case int64:
+ return int32(s), nil
+ case int32:
+ return s, nil
+ case int16:
+ return int32(s), nil
+ case int8:
+ return int32(s), nil
+ case uint:
+ return int32(s), nil
+ case uint64:
+ return int32(s), nil
+ case uint32:
+ return int32(s), nil
+ case uint16:
+ return int32(s), nil
+ case uint8:
+ return int32(s), nil
+ case float64:
+ return int32(s), nil
+ case float32:
+ return int32(s), nil
+ case string:
+ v, err := strconv.ParseInt(s, 0, 0)
+ if err == nil {
+ return int32(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int32", i, i)
+ }
+}
+
+// ToInt16E casts an interface to an int16 type.
+func ToInt16E(i interface{}) (int16, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case int:
+ return int16(s), nil
+ case int64:
+ return int16(s), nil
+ case int32:
+ return int16(s), nil
+ case int16:
+ return s, nil
+ case int8:
+ return int16(s), nil
+ case uint:
+ return int16(s), nil
+ case uint64:
+ return int16(s), nil
+ case uint32:
+ return int16(s), nil
+ case uint16:
+ return int16(s), nil
+ case uint8:
+ return int16(s), nil
+ case float64:
+ return int16(s), nil
+ case float32:
+ return int16(s), nil
+ case string:
+ v, err := strconv.ParseInt(s, 0, 0)
+ if err == nil {
+ return int16(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int16", i, i)
+ }
+}
+
+// ToInt8E casts an interface to an int8 type.
+func ToInt8E(i interface{}) (int8, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case int:
+ return int8(s), nil
+ case int64:
+ return int8(s), nil
+ case int32:
+ return int8(s), nil
+ case int16:
+ return int8(s), nil
+ case int8:
+ return s, nil
+ case uint:
+ return int8(s), nil
+ case uint64:
+ return int8(s), nil
+ case uint32:
+ return int8(s), nil
+ case uint16:
+ return int8(s), nil
+ case uint8:
+ return int8(s), nil
+ case float64:
+ return int8(s), nil
+ case float32:
+ return int8(s), nil
+ case string:
+ v, err := strconv.ParseInt(s, 0, 0)
+ if err == nil {
+ return int8(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int8", i, i)
+ }
+}
+
+// ToIntE casts an interface to an int type.
+func ToIntE(i interface{}) (int, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case int:
+ return s, nil
+ case int64:
+ return int(s), nil
+ case int32:
+ return int(s), nil
+ case int16:
+ return int(s), nil
+ case int8:
+ return int(s), nil
+ case uint:
+ return int(s), nil
+ case uint64:
+ return int(s), nil
+ case uint32:
+ return int(s), nil
+ case uint16:
+ return int(s), nil
+ case uint8:
+ return int(s), nil
+ case float64:
+ return int(s), nil
+ case float32:
+ return int(s), nil
+ case string:
+ v, err := strconv.ParseInt(s, 0, 0)
+ if err == nil {
+ return int(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i)
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to int", i, i)
+ }
+}
+
+// ToUintE casts an interface to a uint type.
+func ToUintE(i interface{}) (uint, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case string:
+ v, err := strconv.ParseUint(s, 0, 0)
+ if err == nil {
+ return uint(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v to uint: %s", i, err)
+ case int:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case int64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case int32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case int16:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case int8:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case uint:
+ return s, nil
+ case uint64:
+ return uint(s), nil
+ case uint32:
+ return uint(s), nil
+ case uint16:
+ return uint(s), nil
+ case uint8:
+ return uint(s), nil
+ case float64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case float32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint(s), nil
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to uint", i, i)
+ }
+}
+
+// ToUint64E casts an interface to a uint64 type.
+func ToUint64E(i interface{}) (uint64, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case string:
+ v, err := strconv.ParseUint(s, 0, 64)
+ if err == nil {
+ return v, nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v to uint64: %s", i, err)
+ case int:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case int64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case int32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case int16:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case int8:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case uint:
+ return uint64(s), nil
+ case uint64:
+ return s, nil
+ case uint32:
+ return uint64(s), nil
+ case uint16:
+ return uint64(s), nil
+ case uint8:
+ return uint64(s), nil
+ case float32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case float64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint64(s), nil
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to uint64", i, i)
+ }
+}
+
+// ToUint32E casts an interface to a uint32 type.
+func ToUint32E(i interface{}) (uint32, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case string:
+ v, err := strconv.ParseUint(s, 0, 32)
+ if err == nil {
+ return uint32(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v to uint32: %s", i, err)
+ case int:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case int64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case int32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case int16:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case int8:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case uint:
+ return uint32(s), nil
+ case uint64:
+ return uint32(s), nil
+ case uint32:
+ return s, nil
+ case uint16:
+ return uint32(s), nil
+ case uint8:
+ return uint32(s), nil
+ case float64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case float32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint32(s), nil
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to uint32", i, i)
+ }
+}
+
+// ToUint16E casts an interface to a uint16 type.
+func ToUint16E(i interface{}) (uint16, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case string:
+ v, err := strconv.ParseUint(s, 0, 16)
+ if err == nil {
+ return uint16(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v to uint16: %s", i, err)
+ case int:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case int64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case int32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case int16:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case int8:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case uint:
+ return uint16(s), nil
+ case uint64:
+ return uint16(s), nil
+ case uint32:
+ return uint16(s), nil
+ case uint16:
+ return s, nil
+ case uint8:
+ return uint16(s), nil
+ case float64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case float32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint16(s), nil
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to uint16", i, i)
+ }
+}
+
+// ToUint8E casts an interface to a uint type.
+func ToUint8E(i interface{}) (uint8, error) {
+ i = indirect(i)
+
+ switch s := i.(type) {
+ case string:
+ v, err := strconv.ParseUint(s, 0, 8)
+ if err == nil {
+ return uint8(v), nil
+ }
+ return 0, fmt.Errorf("unable to cast %#v to uint8: %s", i, err)
+ case int:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case int64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case int32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case int16:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case int8:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case uint:
+ return uint8(s), nil
+ case uint64:
+ return uint8(s), nil
+ case uint32:
+ return uint8(s), nil
+ case uint16:
+ return uint8(s), nil
+ case uint8:
+ return s, nil
+ case float64:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case float32:
+ if s < 0 {
+ return 0, errNegativeNotAllowed
+ }
+ return uint8(s), nil
+ case bool:
+ if s {
+ return 1, nil
+ }
+ return 0, nil
+ case nil:
+ return 0, nil
+ default:
+ return 0, fmt.Errorf("unable to cast %#v of type %T to uint8", i, i)
+ }
+}
+
+// From html/template/content.go
+// Copyright 2011 The Go Authors. All rights reserved.
+// indirect returns the value, after dereferencing as many times
+// as necessary to reach the base type (or nil).
+func indirect(a interface{}) interface{} {
+ if a == nil {
+ return nil
+ }
+ if t := reflect.TypeOf(a); t.Kind() != reflect.Ptr {
+ // Avoid creating a reflect.Value if it's not a pointer.
+ return a
+ }
+ v := reflect.ValueOf(a)
+ for v.Kind() == reflect.Ptr && !v.IsNil() {
+ v = v.Elem()
+ }
+ return v.Interface()
+}
+
+// From html/template/content.go
+// Copyright 2011 The Go Authors. All rights reserved.
+// indirectToStringerOrError returns the value, after dereferencing as many times
+// as necessary to reach the base type (or nil) or an implementation of fmt.Stringer
+// or error,
+func indirectToStringerOrError(a interface{}) interface{} {
+ if a == nil {
+ return nil
+ }
+
+ var errorType = reflect.TypeOf((*error)(nil)).Elem()
+ var fmtStringerType = reflect.TypeOf((*fmt.Stringer)(nil)).Elem()
+
+ v := reflect.ValueOf(a)
+ for !v.Type().Implements(fmtStringerType) && !v.Type().Implements(errorType) && v.Kind() == reflect.Ptr && !v.IsNil() {
+ v = v.Elem()
+ }
+ return v.Interface()
+}
+
+// ToStringE casts an interface to a string type.
+func ToStringE(i interface{}) (string, error) {
+ i = indirectToStringerOrError(i)
+
+ switch s := i.(type) {
+ case string:
+ return s, nil
+ case bool:
+ return strconv.FormatBool(s), nil
+ case float64:
+ return strconv.FormatFloat(s, 'f', -1, 64), nil
+ case float32:
+ return strconv.FormatFloat(float64(s), 'f', -1, 32), nil
+ case int:
+ return strconv.Itoa(s), nil
+ case int64:
+ return strconv.FormatInt(s, 10), nil
+ case int32:
+ return strconv.Itoa(int(s)), nil
+ case int16:
+ return strconv.FormatInt(int64(s), 10), nil
+ case int8:
+ return strconv.FormatInt(int64(s), 10), nil
+ case uint:
+ return strconv.FormatInt(int64(s), 10), nil
+ case uint64:
+ return strconv.FormatInt(int64(s), 10), nil
+ case uint32:
+ return strconv.FormatInt(int64(s), 10), nil
+ case uint16:
+ return strconv.FormatInt(int64(s), 10), nil
+ case uint8:
+ return strconv.FormatInt(int64(s), 10), nil
+ case []byte:
+ return string(s), nil
+ case template.HTML:
+ return string(s), nil
+ case template.URL:
+ return string(s), nil
+ case template.JS:
+ return string(s), nil
+ case template.CSS:
+ return string(s), nil
+ case template.HTMLAttr:
+ return string(s), nil
+ case nil:
+ return "", nil
+ case fmt.Stringer:
+ return s.String(), nil
+ case error:
+ return s.Error(), nil
+ default:
+ return "", fmt.Errorf("unable to cast %#v of type %T to string", i, i)
+ }
+}
+
+// ToStringMapStringE casts an interface to a map[string]string type.
+func ToStringMapStringE(i interface{}) (map[string]string, error) {
+ var m = map[string]string{}
+
+ switch v := i.(type) {
+ case map[string]string:
+ return v, nil
+ case map[string]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = ToString(val)
+ }
+ return m, nil
+ case map[interface{}]string:
+ for k, val := range v {
+ m[ToString(k)] = ToString(val)
+ }
+ return m, nil
+ case map[interface{}]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = ToString(val)
+ }
+ return m, nil
+ case string:
+ err := jsonStringToObject(v, &m)
+ return m, err
+ default:
+ return m, fmt.Errorf("unable to cast %#v of type %T to map[string]string", i, i)
+ }
+}
+
+// ToStringMapStringSliceE casts an interface to a map[string][]string type.
+func ToStringMapStringSliceE(i interface{}) (map[string][]string, error) {
+ var m = map[string][]string{}
+
+ switch v := i.(type) {
+ case map[string][]string:
+ return v, nil
+ case map[string][]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = ToStringSlice(val)
+ }
+ return m, nil
+ case map[string]string:
+ for k, val := range v {
+ m[ToString(k)] = []string{val}
+ }
+ case map[string]interface{}:
+ for k, val := range v {
+ switch vt := val.(type) {
+ case []interface{}:
+ m[ToString(k)] = ToStringSlice(vt)
+ case []string:
+ m[ToString(k)] = vt
+ default:
+ m[ToString(k)] = []string{ToString(val)}
+ }
+ }
+ return m, nil
+ case map[interface{}][]string:
+ for k, val := range v {
+ m[ToString(k)] = ToStringSlice(val)
+ }
+ return m, nil
+ case map[interface{}]string:
+ for k, val := range v {
+ m[ToString(k)] = ToStringSlice(val)
+ }
+ return m, nil
+ case map[interface{}][]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = ToStringSlice(val)
+ }
+ return m, nil
+ case map[interface{}]interface{}:
+ for k, val := range v {
+ key, err := ToStringE(k)
+ if err != nil {
+ return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i)
+ }
+ value, err := ToStringSliceE(val)
+ if err != nil {
+ return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i)
+ }
+ m[key] = value
+ }
+ case string:
+ err := jsonStringToObject(v, &m)
+ return m, err
+ default:
+ return m, fmt.Errorf("unable to cast %#v of type %T to map[string][]string", i, i)
+ }
+ return m, nil
+}
+
+// ToStringMapBoolE casts an interface to a map[string]bool type.
+func ToStringMapBoolE(i interface{}) (map[string]bool, error) {
+ var m = map[string]bool{}
+
+ switch v := i.(type) {
+ case map[interface{}]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = ToBool(val)
+ }
+ return m, nil
+ case map[string]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = ToBool(val)
+ }
+ return m, nil
+ case map[string]bool:
+ return v, nil
+ case string:
+ err := jsonStringToObject(v, &m)
+ return m, err
+ default:
+ return m, fmt.Errorf("unable to cast %#v of type %T to map[string]bool", i, i)
+ }
+}
+
+// ToStringMapE casts an interface to a map[string]interface{} type.
+func ToStringMapE(i interface{}) (map[string]interface{}, error) {
+ var m = map[string]interface{}{}
+
+ switch v := i.(type) {
+ case map[interface{}]interface{}:
+ for k, val := range v {
+ m[ToString(k)] = val
+ }
+ return m, nil
+ case map[string]interface{}:
+ return v, nil
+ case string:
+ err := jsonStringToObject(v, &m)
+ return m, err
+ default:
+ return m, fmt.Errorf("unable to cast %#v of type %T to map[string]interface{}", i, i)
+ }
+}
+
+// ToSliceE casts an interface to a []interface{} type.
+func ToSliceE(i interface{}) ([]interface{}, error) {
+ var s []interface{}
+
+ switch v := i.(type) {
+ case []interface{}:
+ return append(s, v...), nil
+ case []map[string]interface{}:
+ for _, u := range v {
+ s = append(s, u)
+ }
+ return s, nil
+ default:
+ return s, fmt.Errorf("unable to cast %#v of type %T to []interface{}", i, i)
+ }
+}
+
+// ToBoolSliceE casts an interface to a []bool type.
+func ToBoolSliceE(i interface{}) ([]bool, error) {
+ if i == nil {
+ return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i)
+ }
+
+ switch v := i.(type) {
+ case []bool:
+ return v, nil
+ }
+
+ kind := reflect.TypeOf(i).Kind()
+ switch kind {
+ case reflect.Slice, reflect.Array:
+ s := reflect.ValueOf(i)
+ a := make([]bool, s.Len())
+ for j := 0; j < s.Len(); j++ {
+ val, err := ToBoolE(s.Index(j).Interface())
+ if err != nil {
+ return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i)
+ }
+ a[j] = val
+ }
+ return a, nil
+ default:
+ return []bool{}, fmt.Errorf("unable to cast %#v of type %T to []bool", i, i)
+ }
+}
+
+// ToStringSliceE casts an interface to a []string type.
+func ToStringSliceE(i interface{}) ([]string, error) {
+ var a []string
+
+ switch v := i.(type) {
+ case []interface{}:
+ for _, u := range v {
+ a = append(a, ToString(u))
+ }
+ return a, nil
+ case []string:
+ return v, nil
+ case string:
+ return strings.Fields(v), nil
+ case interface{}:
+ str, err := ToStringE(v)
+ if err != nil {
+ return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i)
+ }
+ return []string{str}, nil
+ default:
+ return a, fmt.Errorf("unable to cast %#v of type %T to []string", i, i)
+ }
+}
+
+// ToIntSliceE casts an interface to a []int type.
+func ToIntSliceE(i interface{}) ([]int, error) {
+ if i == nil {
+ return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i)
+ }
+
+ switch v := i.(type) {
+ case []int:
+ return v, nil
+ }
+
+ kind := reflect.TypeOf(i).Kind()
+ switch kind {
+ case reflect.Slice, reflect.Array:
+ s := reflect.ValueOf(i)
+ a := make([]int, s.Len())
+ for j := 0; j < s.Len(); j++ {
+ val, err := ToIntE(s.Index(j).Interface())
+ if err != nil {
+ return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i)
+ }
+ a[j] = val
+ }
+ return a, nil
+ default:
+ return []int{}, fmt.Errorf("unable to cast %#v of type %T to []int", i, i)
+ }
+}
+
+// ToDurationSliceE casts an interface to a []time.Duration type.
+func ToDurationSliceE(i interface{}) ([]time.Duration, error) {
+ if i == nil {
+ return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i)
+ }
+
+ switch v := i.(type) {
+ case []time.Duration:
+ return v, nil
+ }
+
+ kind := reflect.TypeOf(i).Kind()
+ switch kind {
+ case reflect.Slice, reflect.Array:
+ s := reflect.ValueOf(i)
+ a := make([]time.Duration, s.Len())
+ for j := 0; j < s.Len(); j++ {
+ val, err := ToDurationE(s.Index(j).Interface())
+ if err != nil {
+ return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i)
+ }
+ a[j] = val
+ }
+ return a, nil
+ default:
+ return []time.Duration{}, fmt.Errorf("unable to cast %#v of type %T to []time.Duration", i, i)
+ }
+}
+
+// StringToDate attempts to parse a string into a time.Time type using a
+// predefined list of formats. If no suitable format is found, an error is
+// returned.
+func StringToDate(s string) (time.Time, error) {
+ return parseDateWith(s, []string{
+ time.RFC3339,
+ "2006-01-02T15:04:05", // iso8601 without timezone
+ time.RFC1123Z,
+ time.RFC1123,
+ time.RFC822Z,
+ time.RFC822,
+ time.RFC850,
+ time.ANSIC,
+ time.UnixDate,
+ time.RubyDate,
+ "2006-01-02 15:04:05.999999999 -0700 MST", // Time.String()
+ "2006-01-02",
+ "02 Jan 2006",
+ "2006-01-02 15:04:05 -07:00",
+ "2006-01-02 15:04:05 -0700",
+ "2006-01-02 15:04:05Z07:00", // RFC3339 without T
+ "2006-01-02 15:04:05",
+ time.Kitchen,
+ time.Stamp,
+ time.StampMilli,
+ time.StampMicro,
+ time.StampNano,
+ })
+}
+
+func parseDateWith(s string, dates []string) (d time.Time, e error) {
+ for _, dateType := range dates {
+ if d, e = time.Parse(dateType, s); e == nil {
+ return
+ }
+ }
+ return d, fmt.Errorf("unable to parse date: %s", s)
+}
+
+// jsonStringToObject attempts to unmarshall a string as JSON into
+// the object passed as pointer.
+func jsonStringToObject(s string, v interface{}) error {
+ data := []byte(s)
+ return json.Unmarshal(data, v)
+}
diff --git a/vendor/github.com/spf13/cobra/.gitignore b/vendor/github.com/spf13/cobra/.gitignore
new file mode 100644
index 00000000000..1b8c7c26116
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/.gitignore
@@ -0,0 +1,36 @@
+# 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
+
+# Vim files https://github.com/github/gitignore/blob/master/Global/Vim.gitignore
+# swap
+[._]*.s[a-w][a-z]
+[._]s[a-w][a-z]
+# session
+Session.vim
+# temporary
+.netrwhist
+*~
+# auto-generated tag files
+tags
+
+*.exe
+
+cobra.test
diff --git a/vendor/github.com/spf13/cobra/.mailmap b/vendor/github.com/spf13/cobra/.mailmap
new file mode 100644
index 00000000000..94ec53068aa
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/.mailmap
@@ -0,0 +1,3 @@
+Steve Francia
+Bjørn Erik Pedersen
+Fabiano Franz
diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml
new file mode 100644
index 00000000000..5afcb209619
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/.travis.yml
@@ -0,0 +1,21 @@
+language: go
+
+matrix:
+ include:
+ - go: 1.9.4
+ - go: 1.10.0
+ - go: tip
+ allow_failures:
+ - go: tip
+
+before_install:
+ - mkdir -p bin
+ - curl -Lso bin/shellcheck https://github.com/caarlos0/shellcheck-docker/releases/download/v0.4.3/shellcheck
+ - chmod +x bin/shellcheck
+script:
+ - PATH=$PATH:$PWD/bin go test -v ./...
+ - go build
+ - diff -u <(echo -n) <(gofmt -d -s .)
+ - if [ -z $NOVET ]; then
+ diff -u <(echo -n) <(go tool vet . 2>&1 | grep -vE 'ExampleCommand|bash_completions.*Fprint');
+ fi
diff --git a/vendor/github.com/spf13/cobra/LICENSE.txt b/vendor/github.com/spf13/cobra/LICENSE.txt
new file mode 100644
index 00000000000..298f0e2665e
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/LICENSE.txt
@@ -0,0 +1,174 @@
+ 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.
diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md
new file mode 100644
index 00000000000..851fcc087ca
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/README.md
@@ -0,0 +1,736 @@
+![cobra logo](https://cloud.githubusercontent.com/assets/173412/10886352/ad566232-814f-11e5-9cd0-aa101788c117.png)
+
+Cobra is both a library for creating powerful modern CLI applications as well as a program to generate applications and command files.
+
+Many of the most widely used Go projects are built using Cobra including:
+
+* [Kubernetes](http://kubernetes.io/)
+* [Hugo](http://gohugo.io)
+* [rkt](https://github.com/coreos/rkt)
+* [etcd](https://github.com/coreos/etcd)
+* [Moby (former Docker)](https://github.com/moby/moby)
+* [Docker (distribution)](https://github.com/docker/distribution)
+* [OpenShift](https://www.openshift.com/)
+* [Delve](https://github.com/derekparker/delve)
+* [GopherJS](http://www.gopherjs.org/)
+* [CockroachDB](http://www.cockroachlabs.com/)
+* [Bleve](http://www.blevesearch.com/)
+* [ProjectAtomic (enterprise)](http://www.projectatomic.io/)
+* [GiantSwarm's swarm](https://github.com/giantswarm/cli)
+* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack)
+* [rclone](http://rclone.org/)
+* [nehm](https://github.com/bogem/nehm)
+* [Pouch](https://github.com/alibaba/pouch)
+
+[![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra)
+[![CircleCI status](https://circleci.com/gh/spf13/cobra.png?circle-token=:circle-token "CircleCI status")](https://circleci.com/gh/spf13/cobra)
+[![GoDoc](https://godoc.org/github.com/spf13/cobra?status.svg)](https://godoc.org/github.com/spf13/cobra)
+
+# Table of Contents
+
+- [Overview](#overview)
+- [Concepts](#concepts)
+ * [Commands](#commands)
+ * [Flags](#flags)
+- [Installing](#installing)
+- [Getting Started](#getting-started)
+ * [Using the Cobra Generator](#using-the-cobra-generator)
+ * [Using the Cobra Library](#using-the-cobra-library)
+ * [Working with Flags](#working-with-flags)
+ * [Positional and Custom Arguments](#positional-and-custom-arguments)
+ * [Example](#example)
+ * [Help Command](#help-command)
+ * [Usage Message](#usage-message)
+ * [PreRun and PostRun Hooks](#prerun-and-postrun-hooks)
+ * [Suggestions when "unknown command" happens](#suggestions-when-unknown-command-happens)
+ * [Generating documentation for your command](#generating-documentation-for-your-command)
+ * [Generating bash completions](#generating-bash-completions)
+- [Contributing](#contributing)
+- [License](#license)
+
+# Overview
+
+Cobra is a library providing a simple interface to create powerful modern CLI
+interfaces similar to git & go tools.
+
+Cobra is also an application that will generate your application scaffolding to rapidly
+develop a Cobra-based application.
+
+Cobra provides:
+* Easy subcommand-based CLIs: `app server`, `app fetch`, etc.
+* Fully POSIX-compliant flags (including short & long versions)
+* Nested subcommands
+* Global, local and cascading flags
+* Easy generation of applications & commands with `cobra init appname` & `cobra add cmdname`
+* Intelligent suggestions (`app srver`... did you mean `app server`?)
+* Automatic help generation for commands and flags
+* Automatic help flag recognition of `-h`, `--help`, etc.
+* Automatically generated bash autocomplete for your application
+* Automatically generated man pages for your application
+* Command aliases so you can change things without breaking them
+* The flexibility to define your own help, usage, etc.
+* Optional tight integration with [viper](http://github.com/spf13/viper) for 12-factor apps
+
+# Concepts
+
+Cobra is built on a structure of commands, arguments & flags.
+
+**Commands** represent actions, **Args** are things and **Flags** are modifiers for those actions.
+
+The best applications will read like sentences when used. Users will know how
+to use the application because they will natively understand how to use it.
+
+The pattern to follow is
+`APPNAME VERB NOUN --ADJECTIVE.`
+ or
+`APPNAME COMMAND ARG --FLAG`
+
+A few good real world examples may better illustrate this point.
+
+In the following example, 'server' is a command, and 'port' is a flag:
+
+ hugo server --port=1313
+
+In this command we are telling Git to clone the url bare.
+
+ git clone URL --bare
+
+## Commands
+
+Command is the central point of the application. Each interaction that
+the application supports will be contained in a Command. A command can
+have children commands and optionally run an action.
+
+In the example above, 'server' is the command.
+
+[More about cobra.Command](https://godoc.org/github.com/spf13/cobra#Command)
+
+## Flags
+
+A flag is a way to modify the behavior of a command. Cobra supports
+fully POSIX-compliant flags as well as the Go [flag package](https://golang.org/pkg/flag/).
+A Cobra command can define flags that persist through to children commands
+and flags that are only available to that command.
+
+In the example above, 'port' is the flag.
+
+Flag functionality is provided by the [pflag
+library](https://github.com/spf13/pflag), a fork of the flag standard library
+which maintains the same interface while adding POSIX compliance.
+
+# Installing
+Using Cobra is easy. First, use `go get` to install the latest version
+of the library. This command will install the `cobra` generator executable
+along with the library and its dependencies:
+
+ go get -u github.com/spf13/cobra/cobra
+
+Next, include Cobra in your application:
+
+```go
+import "github.com/spf13/cobra"
+```
+
+# Getting Started
+
+While you are welcome to provide your own organization, typically a Cobra-based
+application will follow the following organizational structure:
+
+```
+ ▾ appName/
+ ▾ cmd/
+ add.go
+ your.go
+ commands.go
+ here.go
+ main.go
+```
+
+In a Cobra app, typically the main.go file is very bare. It serves one purpose: initializing Cobra.
+
+```go
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "{pathToYourApp}/cmd"
+)
+
+func main() {
+ cmd.Execute()
+}
+```
+
+## Using the Cobra Generator
+
+Cobra provides its own program that will create your application and add any
+commands you want. It's the easiest way to incorporate Cobra into your application.
+
+[Here](https://github.com/spf13/cobra/blob/master/cobra/README.md) you can find more information about it.
+
+## Using the Cobra Library
+
+To manually implement Cobra you need to create a bare main.go file and a rootCmd file.
+You will optionally provide additional commands as you see fit.
+
+### Create rootCmd
+
+Cobra doesn't require any special constructors. Simply create your commands.
+
+Ideally you place this in app/cmd/root.go:
+
+```go
+var rootCmd = &cobra.Command{
+ Use: "hugo",
+ Short: "Hugo is a very fast static site generator",
+ Long: `A Fast and Flexible Static Site Generator built with
+ love by spf13 and friends in Go.
+ Complete documentation is available at http://hugo.spf13.com`,
+ Run: func(cmd *cobra.Command, args []string) {
+ // Do Stuff Here
+ },
+}
+
+func Execute() {
+ if err := rootCmd.Execute(); err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+}
+```
+
+You will additionally define flags and handle configuration in your init() function.
+
+For example cmd/root.go:
+
+```go
+import (
+ "fmt"
+ "os"
+
+ homedir "github.com/mitchellh/go-homedir"
+ "github.com/spf13/cobra"
+ "github.com/spf13/viper"
+)
+
+func init() {
+ cobra.OnInitialize(initConfig)
+ rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
+ rootCmd.PersistentFlags().StringVarP(&projectBase, "projectbase", "b", "", "base project directory eg. github.com/spf13/")
+ rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "Author name for copyright attribution")
+ rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "Name of license for the project (can provide `licensetext` in config)")
+ rootCmd.PersistentFlags().Bool("viper", true, "Use Viper for configuration")
+ viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
+ viper.BindPFlag("projectbase", rootCmd.PersistentFlags().Lookup("projectbase"))
+ viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
+ viper.SetDefault("author", "NAME HERE ")
+ viper.SetDefault("license", "apache")
+}
+
+func initConfig() {
+ // Don't forget to read config either from cfgFile or from home directory!
+ if cfgFile != "" {
+ // Use config file from the flag.
+ viper.SetConfigFile(cfgFile)
+ } else {
+ // Find home directory.
+ home, err := homedir.Dir()
+ if err != nil {
+ fmt.Println(err)
+ os.Exit(1)
+ }
+
+ // Search config in home directory with name ".cobra" (without extension).
+ viper.AddConfigPath(home)
+ viper.SetConfigName(".cobra")
+ }
+
+ if err := viper.ReadInConfig(); err != nil {
+ fmt.Println("Can't read config:", err)
+ os.Exit(1)
+ }
+}
+```
+
+### Create your main.go
+
+With the root command you need to have your main function execute it.
+Execute should be run on the root for clarity, though it can be called on any command.
+
+In a Cobra app, typically the main.go file is very bare. It serves, one purpose, to initialize Cobra.
+
+```go
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "{pathToYourApp}/cmd"
+)
+
+func main() {
+ cmd.Execute()
+}
+```
+
+### Create additional commands
+
+Additional commands can be defined and typically are each given their own file
+inside of the cmd/ directory.
+
+If you wanted to create a version command you would create cmd/version.go and
+populate it with the following:
+
+```go
+package cmd
+
+import (
+ "fmt"
+
+ "github.com/spf13/cobra"
+)
+
+func init() {
+ rootCmd.AddCommand(versionCmd)
+}
+
+var versionCmd = &cobra.Command{
+ Use: "version",
+ Short: "Print the version number of Hugo",
+ Long: `All software has versions. This is Hugo's`,
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
+ },
+}
+```
+
+## Working with Flags
+
+Flags provide modifiers to control how the action command operates.
+
+### Assign flags to a command
+
+Since the flags are defined and used in different locations, we need to
+define a variable outside with the correct scope to assign the flag to
+work with.
+
+```go
+var Verbose bool
+var Source string
+```
+
+There are two different approaches to assign a flag.
+
+### Persistent Flags
+
+A flag can be 'persistent' meaning that this flag will be available to the
+command it's assigned to as well as every command under that command. For
+global flags, assign a flag as a persistent flag on the root.
+
+```go
+rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
+```
+
+### Local Flags
+
+A flag can also be assigned locally which will only apply to that specific command.
+
+```go
+rootCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
+```
+
+### Local Flag on Parent Commands
+
+By default Cobra only parses local flags on the target command, any local flags on
+parent commands are ignored. By enabling `Command.TraverseChildren` Cobra will
+parse local flags on each command before executing the target command.
+
+```go
+command := cobra.Command{
+ Use: "print [OPTIONS] [COMMANDS]",
+ TraverseChildren: true,
+}
+```
+
+### Bind Flags with Config
+
+You can also bind your flags with [viper](https://github.com/spf13/viper):
+```go
+var author string
+
+func init() {
+ rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution")
+ viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
+}
+```
+
+In this example the persistent flag `author` is bound with `viper`.
+**Note**, that the variable `author` will not be set to the value from config,
+when the `--author` flag is not provided by user.
+
+More in [viper documentation](https://github.com/spf13/viper#working-with-flags).
+
+### Required flags
+
+Flags are optional by default. If instead you wish your command to report an error
+when a flag has not been set, mark it as required:
+```go
+rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
+rootCmd.MarkFlagRequired("region")
+```
+
+## Positional and Custom Arguments
+
+Validation of positional arguments can be specified using the `Args` field
+of `Command`.
+
+The following validators are built in:
+
+- `NoArgs` - the command will report an error if there are any positional args.
+- `ArbitraryArgs` - the command will accept any args.
+- `OnlyValidArgs` - the command will report an error if there are any positional args that are not in the `ValidArgs` field of `Command`.
+- `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args.
+- `MaximumNArgs(int)` - the command will report an error if there are more than N positional args.
+- `ExactArgs(int)` - the command will report an error if there are not exactly N positional args.
+- `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args.
+
+An example of setting the custom validator:
+
+```go
+var cmd = &cobra.Command{
+ Short: "hello",
+ Args: func(cmd *cobra.Command, args []string) error {
+ if len(args) < 1 {
+ return errors.New("requires at least one arg")
+ }
+ if myapp.IsValidColor(args[0]) {
+ return nil
+ }
+ return fmt.Errorf("invalid color specified: %s", args[0])
+ },
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Println("Hello, World!")
+ },
+}
+```
+
+## Example
+
+In the example below, we have defined three commands. Two are at the top level
+and one (cmdTimes) is a child of one of the top commands. In this case the root
+is not executable meaning that a subcommand is required. This is accomplished
+by not providing a 'Run' for the 'rootCmd'.
+
+We have only defined one flag for a single command.
+
+More documentation about flags is available at https://github.com/spf13/pflag
+
+```go
+package main
+
+import (
+ "fmt"
+ "strings"
+
+ "github.com/spf13/cobra"
+)
+
+func main() {
+ var echoTimes int
+
+ var cmdPrint = &cobra.Command{
+ Use: "print [string to print]",
+ Short: "Print anything to the screen",
+ Long: `print is for printing anything back to the screen.
+For many years people have printed back to the screen.`,
+ Args: cobra.MinimumNArgs(1),
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Println("Print: " + strings.Join(args, " "))
+ },
+ }
+
+ var cmdEcho = &cobra.Command{
+ Use: "echo [string to echo]",
+ Short: "Echo anything to the screen",
+ Long: `echo is for echoing anything back.
+Echo works a lot like print, except it has a child command.`,
+ Args: cobra.MinimumNArgs(1),
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Println("Print: " + strings.Join(args, " "))
+ },
+ }
+
+ var cmdTimes = &cobra.Command{
+ Use: "times [# times] [string to echo]",
+ Short: "Echo anything to the screen more times",
+ Long: `echo things multiple times back to the user by providing
+a count and a string.`,
+ Args: cobra.MinimumNArgs(1),
+ Run: func(cmd *cobra.Command, args []string) {
+ for i := 0; i < echoTimes; i++ {
+ fmt.Println("Echo: " + strings.Join(args, " "))
+ }
+ },
+ }
+
+ cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input")
+
+ var rootCmd = &cobra.Command{Use: "app"}
+ rootCmd.AddCommand(cmdPrint, cmdEcho)
+ cmdEcho.AddCommand(cmdTimes)
+ rootCmd.Execute()
+}
+```
+
+For a more complete example of a larger application, please checkout [Hugo](http://gohugo.io/).
+
+## Help Command
+
+Cobra automatically adds a help command to your application when you have subcommands.
+This will be called when a user runs 'app help'. Additionally, help will also
+support all other commands as input. Say, for instance, you have a command called
+'create' without any additional configuration; Cobra will work when 'app help
+create' is called. Every command will automatically have the '--help' flag added.
+
+### Example
+
+The following output is automatically generated by Cobra. Nothing beyond the
+command and flag definitions are needed.
+
+ $ cobra help
+
+ Cobra is a CLI library for Go that empowers applications.
+ This application is a tool to generate the needed files
+ to quickly create a Cobra application.
+
+ Usage:
+ cobra [command]
+
+ Available Commands:
+ add Add a command to a Cobra Application
+ help Help about any command
+ init Initialize a Cobra Application
+
+ Flags:
+ -a, --author string author name for copyright attribution (default "YOUR NAME")
+ --config string config file (default is $HOME/.cobra.yaml)
+ -h, --help help for cobra
+ -l, --license string name of license for the project
+ --viper use Viper for configuration (default true)
+
+ Use "cobra [command] --help" for more information about a command.
+
+
+Help is just a command like any other. There is no special logic or behavior
+around it. In fact, you can provide your own if you want.
+
+### Defining your own help
+
+You can provide your own Help command or your own template for the default command to use
+with following functions:
+
+```go
+cmd.SetHelpCommand(cmd *Command)
+cmd.SetHelpFunc(f func(*Command, []string))
+cmd.SetHelpTemplate(s string)
+```
+
+The latter two will also apply to any children commands.
+
+## Usage Message
+
+When the user provides an invalid flag or invalid command, Cobra responds by
+showing the user the 'usage'.
+
+### Example
+You may recognize this from the help above. That's because the default help
+embeds the usage as part of its output.
+
+ $ cobra --invalid
+ Error: unknown flag: --invalid
+ Usage:
+ cobra [command]
+
+ Available Commands:
+ add Add a command to a Cobra Application
+ help Help about any command
+ init Initialize a Cobra Application
+
+ Flags:
+ -a, --author string author name for copyright attribution (default "YOUR NAME")
+ --config string config file (default is $HOME/.cobra.yaml)
+ -h, --help help for cobra
+ -l, --license string name of license for the project
+ --viper use Viper for configuration (default true)
+
+ Use "cobra [command] --help" for more information about a command.
+
+### Defining your own usage
+You can provide your own usage function or template for Cobra to use.
+Like help, the function and template are overridable through public methods:
+
+```go
+cmd.SetUsageFunc(f func(*Command) error)
+cmd.SetUsageTemplate(s string)
+```
+
+## Version Flag
+
+Cobra adds a top-level '--version' flag if the Version field is set on the root command.
+Running an application with the '--version' flag will print the version to stdout using
+the version template. The template can be customized using the
+`cmd.SetVersionTemplate(s string)` function.
+
+## PreRun and PostRun Hooks
+
+It is possible to run functions before or after the main `Run` function of your command. The `PersistentPreRun` and `PreRun` functions will be executed before `Run`. `PersistentPostRun` and `PostRun` will be executed after `Run`. The `Persistent*Run` functions will be inherited by children if they do not declare their own. These functions are run in the following order:
+
+- `PersistentPreRun`
+- `PreRun`
+- `Run`
+- `PostRun`
+- `PersistentPostRun`
+
+An example of two commands which use all of these features is below. When the subcommand is executed, it will run the root command's `PersistentPreRun` but not the root command's `PersistentPostRun`:
+
+```go
+package main
+
+import (
+ "fmt"
+
+ "github.com/spf13/cobra"
+)
+
+func main() {
+
+ var rootCmd = &cobra.Command{
+ Use: "root [sub]",
+ Short: "My root command",
+ PersistentPreRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args)
+ },
+ PreRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside rootCmd PreRun with args: %v\n", args)
+ },
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside rootCmd Run with args: %v\n", args)
+ },
+ PostRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside rootCmd PostRun with args: %v\n", args)
+ },
+ PersistentPostRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args)
+ },
+ }
+
+ var subCmd = &cobra.Command{
+ Use: "sub [no options!]",
+ Short: "My subcommand",
+ PreRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside subCmd PreRun with args: %v\n", args)
+ },
+ Run: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside subCmd Run with args: %v\n", args)
+ },
+ PostRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside subCmd PostRun with args: %v\n", args)
+ },
+ PersistentPostRun: func(cmd *cobra.Command, args []string) {
+ fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args)
+ },
+ }
+
+ rootCmd.AddCommand(subCmd)
+
+ rootCmd.SetArgs([]string{""})
+ rootCmd.Execute()
+ fmt.Println()
+ rootCmd.SetArgs([]string{"sub", "arg1", "arg2"})
+ rootCmd.Execute()
+}
+```
+
+Output:
+```
+Inside rootCmd PersistentPreRun with args: []
+Inside rootCmd PreRun with args: []
+Inside rootCmd Run with args: []
+Inside rootCmd PostRun with args: []
+Inside rootCmd PersistentPostRun with args: []
+
+Inside rootCmd PersistentPreRun with args: [arg1 arg2]
+Inside subCmd PreRun with args: [arg1 arg2]
+Inside subCmd Run with args: [arg1 arg2]
+Inside subCmd PostRun with args: [arg1 arg2]
+Inside subCmd PersistentPostRun with args: [arg1 arg2]
+```
+
+## Suggestions when "unknown command" happens
+
+Cobra will print automatic suggestions when "unknown command" errors happen. This allows Cobra to behave similarly to the `git` command when a typo happens. For example:
+
+```
+$ hugo srever
+Error: unknown command "srever" for "hugo"
+
+Did you mean this?
+ server
+
+Run 'hugo --help' for usage.
+```
+
+Suggestions are automatic based on every subcommand registered and use an implementation of [Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance). Every registered command that matches a minimum distance of 2 (ignoring case) will be displayed as a suggestion.
+
+If you need to disable suggestions or tweak the string distance in your command, use:
+
+```go
+command.DisableSuggestions = true
+```
+
+or
+
+```go
+command.SuggestionsMinimumDistance = 1
+```
+
+You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but makes sense in your set of commands and for some which you don't want aliases. Example:
+
+```
+$ kubectl remove
+Error: unknown command "remove" for "kubectl"
+
+Did you mean this?
+ delete
+
+Run 'kubectl help' for usage.
+```
+
+## Generating documentation for your command
+
+Cobra can generate documentation based on subcommands, flags, etc. in the following formats:
+
+- [Markdown](doc/md_docs.md)
+- [ReStructured Text](doc/rest_docs.md)
+- [Man Page](doc/man_docs.md)
+
+## Generating bash completions
+
+Cobra can generate a bash-completion file. If you add more information to your command, these completions can be amazingly powerful and flexible. Read more about it in [Bash Completions](bash_completions.md).
+
+# Contributing
+
+1. Fork it
+2. Download your fork to your PC (`git clone https://github.com/your_username/cobra && cd cobra`)
+3. Create your feature branch (`git checkout -b my-new-feature`)
+4. Make changes and add them (`git add .`)
+5. Commit your changes (`git commit -m 'Add some feature'`)
+6. Push to the branch (`git push origin my-new-feature`)
+7. Create new pull request
+
+# License
+
+Cobra is released under the Apache 2.0 license. See [LICENSE.txt](https://github.com/spf13/cobra/blob/master/LICENSE.txt)
diff --git a/vendor/github.com/spf13/cobra/args.go b/vendor/github.com/spf13/cobra/args.go
new file mode 100644
index 00000000000..a5d8a9273ea
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/args.go
@@ -0,0 +1,89 @@
+package cobra
+
+import (
+ "fmt"
+)
+
+type PositionalArgs func(cmd *Command, args []string) error
+
+// Legacy arg validation has the following behaviour:
+// - root commands with no subcommands can take arbitrary arguments
+// - root commands with subcommands will do subcommand validity checking
+// - subcommands will always accept arbitrary arguments
+func legacyArgs(cmd *Command, args []string) error {
+ // no subcommand, always take args
+ if !cmd.HasSubCommands() {
+ return nil
+ }
+
+ // root command with subcommands, do subcommand checking.
+ if !cmd.HasParent() && len(args) > 0 {
+ return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0]))
+ }
+ return nil
+}
+
+// NoArgs returns an error if any args are included.
+func NoArgs(cmd *Command, args []string) error {
+ if len(args) > 0 {
+ return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
+ }
+ return nil
+}
+
+// OnlyValidArgs returns an error if any args are not in the list of ValidArgs.
+func OnlyValidArgs(cmd *Command, args []string) error {
+ if len(cmd.ValidArgs) > 0 {
+ for _, v := range args {
+ if !stringInSlice(v, cmd.ValidArgs) {
+ return fmt.Errorf("invalid argument %q for %q%s", v, cmd.CommandPath(), cmd.findSuggestions(args[0]))
+ }
+ }
+ }
+ return nil
+}
+
+// ArbitraryArgs never returns an error.
+func ArbitraryArgs(cmd *Command, args []string) error {
+ return nil
+}
+
+// MinimumNArgs returns an error if there is not at least N args.
+func MinimumNArgs(n int) PositionalArgs {
+ return func(cmd *Command, args []string) error {
+ if len(args) < n {
+ return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args))
+ }
+ return nil
+ }
+}
+
+// MaximumNArgs returns an error if there are more than N args.
+func MaximumNArgs(n int) PositionalArgs {
+ return func(cmd *Command, args []string) error {
+ if len(args) > n {
+ return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args))
+ }
+ return nil
+ }
+}
+
+// ExactArgs returns an error if there are not exactly n args.
+func ExactArgs(n int) PositionalArgs {
+ return func(cmd *Command, args []string) error {
+ if len(args) != n {
+ return fmt.Errorf("accepts %d arg(s), received %d", n, len(args))
+ }
+ return nil
+ }
+}
+
+// RangeArgs returns an error if the number of args is not within the expected range.
+func RangeArgs(min int, max int) PositionalArgs {
+ return func(cmd *Command, args []string) error {
+ if len(args) < min || len(args) > max {
+ return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args))
+ }
+ return nil
+ }
+}
diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go
new file mode 100644
index 00000000000..291eae7d8e5
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/bash_completions.go
@@ -0,0 +1,555 @@
+package cobra
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "sort"
+ "strings"
+
+ "github.com/spf13/pflag"
+)
+
+// Annotations for Bash completion.
+const (
+ BashCompFilenameExt = "cobra_annotation_bash_completion_filename_extensions"
+ BashCompCustom = "cobra_annotation_bash_completion_custom"
+ BashCompOneRequiredFlag = "cobra_annotation_bash_completion_one_required_flag"
+ BashCompSubdirsInDir = "cobra_annotation_bash_completion_subdirs_in_dir"
+)
+
+func writePreamble(buf *bytes.Buffer, name string) {
+ buf.WriteString(fmt.Sprintf("# bash completion for %-36s -*- shell-script -*-\n", name))
+ buf.WriteString(fmt.Sprintf(`
+__%[1]s_debug()
+{
+ if [[ -n ${BASH_COMP_DEBUG_FILE} ]]; then
+ echo "$*" >> "${BASH_COMP_DEBUG_FILE}"
+ fi
+}
+
+# Homebrew on Macs have version 1.3 of bash-completion which doesn't include
+# _init_completion. This is a very minimal version of that function.
+__%[1]s_init_completion()
+{
+ COMPREPLY=()
+ _get_comp_words_by_ref "$@" cur prev words cword
+}
+
+__%[1]s_index_of_word()
+{
+ local w word=$1
+ shift
+ index=0
+ for w in "$@"; do
+ [[ $w = "$word" ]] && return
+ index=$((index+1))
+ done
+ index=-1
+}
+
+__%[1]s_contains_word()
+{
+ local w word=$1; shift
+ for w in "$@"; do
+ [[ $w = "$word" ]] && return
+ done
+ return 1
+}
+
+__%[1]s_handle_reply()
+{
+ __%[1]s_debug "${FUNCNAME[0]}"
+ case $cur in
+ -*)
+ if [[ $(type -t compopt) = "builtin" ]]; then
+ compopt -o nospace
+ fi
+ local allflags
+ if [ ${#must_have_one_flag[@]} -ne 0 ]; then
+ allflags=("${must_have_one_flag[@]}")
+ else
+ allflags=("${flags[*]} ${two_word_flags[*]}")
+ fi
+ COMPREPLY=( $(compgen -W "${allflags[*]}" -- "$cur") )
+ if [[ $(type -t compopt) = "builtin" ]]; then
+ [[ "${COMPREPLY[0]}" == *= ]] || compopt +o nospace
+ fi
+
+ # complete after --flag=abc
+ if [[ $cur == *=* ]]; then
+ if [[ $(type -t compopt) = "builtin" ]]; then
+ compopt +o nospace
+ fi
+
+ local index flag
+ flag="${cur%%=*}"
+ __%[1]s_index_of_word "${flag}" "${flags_with_completion[@]}"
+ COMPREPLY=()
+ if [[ ${index} -ge 0 ]]; then
+ PREFIX=""
+ cur="${cur#*=}"
+ ${flags_completion[${index}]}
+ if [ -n "${ZSH_VERSION}" ]; then
+ # zsh completion needs --flag= prefix
+ eval "COMPREPLY=( \"\${COMPREPLY[@]/#/${flag}=}\" )"
+ fi
+ fi
+ fi
+ return 0;
+ ;;
+ esac
+
+ # check if we are handling a flag with special work handling
+ local index
+ __%[1]s_index_of_word "${prev}" "${flags_with_completion[@]}"
+ if [[ ${index} -ge 0 ]]; then
+ ${flags_completion[${index}]}
+ return
+ fi
+
+ # we are parsing a flag and don't have a special handler, no completion
+ if [[ ${cur} != "${words[cword]}" ]]; then
+ return
+ fi
+
+ local completions
+ completions=("${commands[@]}")
+ if [[ ${#must_have_one_noun[@]} -ne 0 ]]; then
+ completions=("${must_have_one_noun[@]}")
+ fi
+ if [[ ${#must_have_one_flag[@]} -ne 0 ]]; then
+ completions+=("${must_have_one_flag[@]}")
+ fi
+ COMPREPLY=( $(compgen -W "${completions[*]}" -- "$cur") )
+
+ if [[ ${#COMPREPLY[@]} -eq 0 && ${#noun_aliases[@]} -gt 0 && ${#must_have_one_noun[@]} -ne 0 ]]; then
+ COMPREPLY=( $(compgen -W "${noun_aliases[*]}" -- "$cur") )
+ fi
+
+ if [[ ${#COMPREPLY[@]} -eq 0 ]]; then
+ declare -F __custom_func >/dev/null && __custom_func
+ fi
+
+ # available in bash-completion >= 2, not always present on macOS
+ if declare -F __ltrim_colon_completions >/dev/null; then
+ __ltrim_colon_completions "$cur"
+ fi
+
+ # If there is only 1 completion and it is a flag with an = it will be completed
+ # but we don't want a space after the =
+ if [[ "${#COMPREPLY[@]}" -eq "1" ]] && [[ $(type -t compopt) = "builtin" ]] && [[ "${COMPREPLY[0]}" == --*= ]]; then
+ compopt -o nospace
+ fi
+}
+
+# The arguments should be in the form "ext1|ext2|extn"
+__%[1]s_handle_filename_extension_flag()
+{
+ local ext="$1"
+ _filedir "@(${ext})"
+}
+
+__%[1]s_handle_subdirs_in_dir_flag()
+{
+ local dir="$1"
+ pushd "${dir}" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1
+}
+
+__%[1]s_handle_flag()
+{
+ __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
+
+ # if a command required a flag, and we found it, unset must_have_one_flag()
+ local flagname=${words[c]}
+ local flagvalue
+ # if the word contained an =
+ if [[ ${words[c]} == *"="* ]]; then
+ flagvalue=${flagname#*=} # take in as flagvalue after the =
+ flagname=${flagname%%=*} # strip everything after the =
+ flagname="${flagname}=" # but put the = back
+ fi
+ __%[1]s_debug "${FUNCNAME[0]}: looking for ${flagname}"
+ if __%[1]s_contains_word "${flagname}" "${must_have_one_flag[@]}"; then
+ must_have_one_flag=()
+ fi
+
+ # if you set a flag which only applies to this command, don't show subcommands
+ if __%[1]s_contains_word "${flagname}" "${local_nonpersistent_flags[@]}"; then
+ commands=()
+ fi
+
+ # keep flag value with flagname as flaghash
+ # flaghash variable is an associative array which is only supported in bash > 3.
+ if [[ -z "${BASH_VERSION}" || "${BASH_VERSINFO[0]}" -gt 3 ]]; then
+ if [ -n "${flagvalue}" ] ; then
+ flaghash[${flagname}]=${flagvalue}
+ elif [ -n "${words[ $((c+1)) ]}" ] ; then
+ flaghash[${flagname}]=${words[ $((c+1)) ]}
+ else
+ flaghash[${flagname}]="true" # pad "true" for bool flag
+ fi
+ fi
+
+ # skip the argument to a two word flag
+ if __%[1]s_contains_word "${words[c]}" "${two_word_flags[@]}"; then
+ c=$((c+1))
+ # if we are looking for a flags value, don't show commands
+ if [[ $c -eq $cword ]]; then
+ commands=()
+ fi
+ fi
+
+ c=$((c+1))
+
+}
+
+__%[1]s_handle_noun()
+{
+ __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
+
+ if __%[1]s_contains_word "${words[c]}" "${must_have_one_noun[@]}"; then
+ must_have_one_noun=()
+ elif __%[1]s_contains_word "${words[c]}" "${noun_aliases[@]}"; then
+ must_have_one_noun=()
+ fi
+
+ nouns+=("${words[c]}")
+ c=$((c+1))
+}
+
+__%[1]s_handle_command()
+{
+ __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
+
+ local next_command
+ if [[ -n ${last_command} ]]; then
+ next_command="_${last_command}_${words[c]//:/__}"
+ else
+ if [[ $c -eq 0 ]]; then
+ next_command="_%[1]s_root_command"
+ else
+ next_command="_${words[c]//:/__}"
+ fi
+ fi
+ c=$((c+1))
+ __%[1]s_debug "${FUNCNAME[0]}: looking for ${next_command}"
+ declare -F "$next_command" >/dev/null && $next_command
+}
+
+__%[1]s_handle_word()
+{
+ if [[ $c -ge $cword ]]; then
+ __%[1]s_handle_reply
+ return
+ fi
+ __%[1]s_debug "${FUNCNAME[0]}: c is $c words[c] is ${words[c]}"
+ if [[ "${words[c]}" == -* ]]; then
+ __%[1]s_handle_flag
+ elif __%[1]s_contains_word "${words[c]}" "${commands[@]}"; then
+ __%[1]s_handle_command
+ elif [[ $c -eq 0 ]]; then
+ __%[1]s_handle_command
+ else
+ __%[1]s_handle_noun
+ fi
+ __%[1]s_handle_word
+}
+
+`, name))
+}
+
+func writePostscript(buf *bytes.Buffer, name string) {
+ name = strings.Replace(name, ":", "__", -1)
+ buf.WriteString(fmt.Sprintf("__start_%s()\n", name))
+ buf.WriteString(fmt.Sprintf(`{
+ local cur prev words cword
+ declare -A flaghash 2>/dev/null || :
+ if declare -F _init_completion >/dev/null 2>&1; then
+ _init_completion -s || return
+ else
+ __%[1]s_init_completion -n "=" || return
+ fi
+
+ local c=0
+ local flags=()
+ local two_word_flags=()
+ local local_nonpersistent_flags=()
+ local flags_with_completion=()
+ local flags_completion=()
+ local commands=("%[1]s")
+ local must_have_one_flag=()
+ local must_have_one_noun=()
+ local last_command
+ local nouns=()
+
+ __%[1]s_handle_word
+}
+
+`, name))
+ buf.WriteString(fmt.Sprintf(`if [[ $(type -t compopt) = "builtin" ]]; then
+ complete -o default -F __start_%s %s
+else
+ complete -o default -o nospace -F __start_%s %s
+fi
+
+`, name, name, name, name))
+ buf.WriteString("# ex: ts=4 sw=4 et filetype=sh\n")
+}
+
+func writeCommands(buf *bytes.Buffer, cmd *Command) {
+ buf.WriteString(" commands=()\n")
+ for _, c := range cmd.Commands() {
+ if !c.IsAvailableCommand() || c == cmd.helpCommand {
+ continue
+ }
+ buf.WriteString(fmt.Sprintf(" commands+=(%q)\n", c.Name()))
+ }
+ buf.WriteString("\n")
+}
+
+func writeFlagHandler(buf *bytes.Buffer, name string, annotations map[string][]string, cmd *Command) {
+ for key, value := range annotations {
+ switch key {
+ case BashCompFilenameExt:
+ buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name))
+
+ var ext string
+ if len(value) > 0 {
+ ext = fmt.Sprintf("__%s_handle_filename_extension_flag ", cmd.Root().Name()) + strings.Join(value, "|")
+ } else {
+ ext = "_filedir"
+ }
+ buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext))
+ case BashCompCustom:
+ buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name))
+ if len(value) > 0 {
+ handlers := strings.Join(value, "; ")
+ buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", handlers))
+ } else {
+ buf.WriteString(" flags_completion+=(:)\n")
+ }
+ case BashCompSubdirsInDir:
+ buf.WriteString(fmt.Sprintf(" flags_with_completion+=(%q)\n", name))
+
+ var ext string
+ if len(value) == 1 {
+ ext = fmt.Sprintf("__%s_handle_subdirs_in_dir_flag ", cmd.Root().Name()) + value[0]
+ } else {
+ ext = "_filedir -d"
+ }
+ buf.WriteString(fmt.Sprintf(" flags_completion+=(%q)\n", ext))
+ }
+ }
+}
+
+func writeShortFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) {
+ name := flag.Shorthand
+ format := " "
+ if len(flag.NoOptDefVal) == 0 {
+ format += "two_word_"
+ }
+ format += "flags+=(\"-%s\")\n"
+ buf.WriteString(fmt.Sprintf(format, name))
+ writeFlagHandler(buf, "-"+name, flag.Annotations, cmd)
+}
+
+func writeFlag(buf *bytes.Buffer, flag *pflag.Flag, cmd *Command) {
+ name := flag.Name
+ format := " flags+=(\"--%s"
+ if len(flag.NoOptDefVal) == 0 {
+ format += "="
+ }
+ format += "\")\n"
+ buf.WriteString(fmt.Sprintf(format, name))
+ writeFlagHandler(buf, "--"+name, flag.Annotations, cmd)
+}
+
+func writeLocalNonPersistentFlag(buf *bytes.Buffer, flag *pflag.Flag) {
+ name := flag.Name
+ format := " local_nonpersistent_flags+=(\"--%s"
+ if len(flag.NoOptDefVal) == 0 {
+ format += "="
+ }
+ format += "\")\n"
+ buf.WriteString(fmt.Sprintf(format, name))
+}
+
+func writeFlags(buf *bytes.Buffer, cmd *Command) {
+ buf.WriteString(` flags=()
+ two_word_flags=()
+ local_nonpersistent_flags=()
+ flags_with_completion=()
+ flags_completion=()
+
+`)
+ localNonPersistentFlags := cmd.LocalNonPersistentFlags()
+ cmd.NonInheritedFlags().VisitAll(func(flag *pflag.Flag) {
+ if nonCompletableFlag(flag) {
+ return
+ }
+ writeFlag(buf, flag, cmd)
+ if len(flag.Shorthand) > 0 {
+ writeShortFlag(buf, flag, cmd)
+ }
+ if localNonPersistentFlags.Lookup(flag.Name) != nil {
+ writeLocalNonPersistentFlag(buf, flag)
+ }
+ })
+ cmd.InheritedFlags().VisitAll(func(flag *pflag.Flag) {
+ if nonCompletableFlag(flag) {
+ return
+ }
+ writeFlag(buf, flag, cmd)
+ if len(flag.Shorthand) > 0 {
+ writeShortFlag(buf, flag, cmd)
+ }
+ })
+
+ buf.WriteString("\n")
+}
+
+func writeRequiredFlag(buf *bytes.Buffer, cmd *Command) {
+ buf.WriteString(" must_have_one_flag=()\n")
+ flags := cmd.NonInheritedFlags()
+ flags.VisitAll(func(flag *pflag.Flag) {
+ if nonCompletableFlag(flag) {
+ return
+ }
+ for key := range flag.Annotations {
+ switch key {
+ case BashCompOneRequiredFlag:
+ format := " must_have_one_flag+=(\"--%s"
+ if flag.Value.Type() != "bool" {
+ format += "="
+ }
+ format += "\")\n"
+ buf.WriteString(fmt.Sprintf(format, flag.Name))
+
+ if len(flag.Shorthand) > 0 {
+ buf.WriteString(fmt.Sprintf(" must_have_one_flag+=(\"-%s\")\n", flag.Shorthand))
+ }
+ }
+ }
+ })
+}
+
+func writeRequiredNouns(buf *bytes.Buffer, cmd *Command) {
+ buf.WriteString(" must_have_one_noun=()\n")
+ sort.Sort(sort.StringSlice(cmd.ValidArgs))
+ for _, value := range cmd.ValidArgs {
+ buf.WriteString(fmt.Sprintf(" must_have_one_noun+=(%q)\n", value))
+ }
+}
+
+func writeArgAliases(buf *bytes.Buffer, cmd *Command) {
+ buf.WriteString(" noun_aliases=()\n")
+ sort.Sort(sort.StringSlice(cmd.ArgAliases))
+ for _, value := range cmd.ArgAliases {
+ buf.WriteString(fmt.Sprintf(" noun_aliases+=(%q)\n", value))
+ }
+}
+
+func gen(buf *bytes.Buffer, cmd *Command) {
+ for _, c := range cmd.Commands() {
+ if !c.IsAvailableCommand() || c == cmd.helpCommand {
+ continue
+ }
+ gen(buf, c)
+ }
+ commandName := cmd.CommandPath()
+ commandName = strings.Replace(commandName, " ", "_", -1)
+ commandName = strings.Replace(commandName, ":", "__", -1)
+
+ if cmd.Root() == cmd {
+ buf.WriteString(fmt.Sprintf("_%s_root_command()\n{\n", commandName))
+ } else {
+ buf.WriteString(fmt.Sprintf("_%s()\n{\n", commandName))
+ }
+
+ buf.WriteString(fmt.Sprintf(" last_command=%q\n", commandName))
+ writeCommands(buf, cmd)
+ writeFlags(buf, cmd)
+ writeRequiredFlag(buf, cmd)
+ writeRequiredNouns(buf, cmd)
+ writeArgAliases(buf, cmd)
+ buf.WriteString("}\n\n")
+}
+
+// GenBashCompletion generates bash completion file and writes to the passed writer.
+func (c *Command) GenBashCompletion(w io.Writer) error {
+ buf := new(bytes.Buffer)
+ writePreamble(buf, c.Name())
+ if len(c.BashCompletionFunction) > 0 {
+ buf.WriteString(c.BashCompletionFunction + "\n")
+ }
+ gen(buf, c)
+ writePostscript(buf, c.Name())
+
+ _, err := buf.WriteTo(w)
+ return err
+}
+
+func nonCompletableFlag(flag *pflag.Flag) bool {
+ return flag.Hidden || len(flag.Deprecated) > 0
+}
+
+// GenBashCompletionFile generates bash completion file.
+func (c *Command) GenBashCompletionFile(filename string) error {
+ outFile, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer outFile.Close()
+
+ return c.GenBashCompletion(outFile)
+}
+
+// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists,
+// and causes your command to report an error if invoked without the flag.
+func (c *Command) MarkFlagRequired(name string) error {
+ return MarkFlagRequired(c.Flags(), name)
+}
+
+// MarkPersistentFlagRequired adds the BashCompOneRequiredFlag annotation to the named persistent flag if it exists,
+// and causes your command to report an error if invoked without the flag.
+func (c *Command) MarkPersistentFlagRequired(name string) error {
+ return MarkFlagRequired(c.PersistentFlags(), name)
+}
+
+// MarkFlagRequired adds the BashCompOneRequiredFlag annotation to the named flag if it exists,
+// and causes your command to report an error if invoked without the flag.
+func MarkFlagRequired(flags *pflag.FlagSet, name string) error {
+ return flags.SetAnnotation(name, BashCompOneRequiredFlag, []string{"true"})
+}
+
+// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag, if it exists.
+// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
+func (c *Command) MarkFlagFilename(name string, extensions ...string) error {
+ return MarkFlagFilename(c.Flags(), name, extensions...)
+}
+
+// MarkFlagCustom adds the BashCompCustom annotation to the named flag, if it exists.
+// Generated bash autocompletion will call the bash function f for the flag.
+func (c *Command) MarkFlagCustom(name string, f string) error {
+ return MarkFlagCustom(c.Flags(), name, f)
+}
+
+// MarkPersistentFlagFilename adds the BashCompFilenameExt annotation to the named persistent flag, if it exists.
+// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
+func (c *Command) MarkPersistentFlagFilename(name string, extensions ...string) error {
+ return MarkFlagFilename(c.PersistentFlags(), name, extensions...)
+}
+
+// MarkFlagFilename adds the BashCompFilenameExt annotation to the named flag in the flag set, if it exists.
+// Generated bash autocompletion will select filenames for the flag, limiting to named extensions if provided.
+func MarkFlagFilename(flags *pflag.FlagSet, name string, extensions ...string) error {
+ return flags.SetAnnotation(name, BashCompFilenameExt, extensions)
+}
+
+// MarkFlagCustom adds the BashCompCustom annotation to the named flag in the flag set, if it exists.
+// Generated bash autocompletion will call the bash function f for the flag.
+func MarkFlagCustom(flags *pflag.FlagSet, name string, f string) error {
+ return flags.SetAnnotation(name, BashCompCustom, []string{f})
+}
diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/spf13/cobra/bash_completions.md
new file mode 100644
index 00000000000..8d01f456f8a
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/bash_completions.md
@@ -0,0 +1,221 @@
+# Generating Bash Completions For Your Own cobra.Command
+
+Generating bash completions from a cobra command is incredibly easy. An actual program which does so for the kubernetes kubectl binary is as follows:
+
+```go
+package main
+
+import (
+ "io/ioutil"
+ "os"
+
+ "k8s.io/kubernetes/pkg/kubectl/cmd"
+ "k8s.io/kubernetes/pkg/kubectl/cmd/util"
+)
+
+func main() {
+ kubectl := cmd.NewKubectlCommand(util.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard)
+ kubectl.GenBashCompletionFile("out.sh")
+}
+```
+
+`out.sh` will get you completions of subcommands and flags. Copy it to `/etc/bash_completion.d/` as described [here](https://debian-administration.org/article/316/An_introduction_to_bash_completion_part_1) and reset your terminal to use autocompletion. If you make additional annotations to your code, you can get even more intelligent and flexible behavior.
+
+## Creating your own custom functions
+
+Some more actual code that works in kubernetes:
+
+```bash
+const (
+ bash_completion_func = `__kubectl_parse_get()
+{
+ local kubectl_output out
+ if kubectl_output=$(kubectl get --no-headers "$1" 2>/dev/null); then
+ out=($(echo "${kubectl_output}" | awk '{print $1}'))
+ COMPREPLY=( $( compgen -W "${out[*]}" -- "$cur" ) )
+ fi
+}
+
+__kubectl_get_resource()
+{
+ if [[ ${#nouns[@]} -eq 0 ]]; then
+ return 1
+ fi
+ __kubectl_parse_get ${nouns[${#nouns[@]} -1]}
+ if [[ $? -eq 0 ]]; then
+ return 0
+ fi
+}
+
+__custom_func() {
+ case ${last_command} in
+ kubectl_get | kubectl_describe | kubectl_delete | kubectl_stop)
+ __kubectl_get_resource
+ return
+ ;;
+ *)
+ ;;
+ esac
+}
+`)
+```
+
+And then I set that in my command definition:
+
+```go
+cmds := &cobra.Command{
+ Use: "kubectl",
+ Short: "kubectl controls the Kubernetes cluster manager",
+ Long: `kubectl controls the Kubernetes cluster manager.
+
+Find more information at https://github.com/GoogleCloudPlatform/kubernetes.`,
+ Run: runHelp,
+ BashCompletionFunction: bash_completion_func,
+}
+```
+
+The `BashCompletionFunction` option is really only valid/useful on the root command. Doing the above will cause `__custom_func()` to be called when the built in processor was unable to find a solution. In the case of kubernetes a valid command might look something like `kubectl get pod [mypod]`. If you type `kubectl get pod [tab][tab]` the `__customc_func()` will run because the cobra.Command only understood "kubectl" and "get." `__custom_func()` will see that the cobra.Command is "kubectl_get" and will thus call another helper `__kubectl_get_resource()`. `__kubectl_get_resource` will look at the 'nouns' collected. In our example the only noun will be `pod`. So it will call `__kubectl_parse_get pod`. `__kubectl_parse_get` will actually call out to kubernetes and get any pods. It will then set `COMPREPLY` to valid pods!
+
+## Have the completions code complete your 'nouns'
+
+In the above example "pod" was assumed to already be typed. But if you want `kubectl get [tab][tab]` to show a list of valid "nouns" you have to set them. Simplified code from `kubectl get` looks like:
+
+```go
+validArgs []string = { "pod", "node", "service", "replicationcontroller" }
+
+cmd := &cobra.Command{
+ Use: "get [(-o|--output=)json|yaml|template|...] (RESOURCE [NAME] | RESOURCE/NAME ...)",
+ Short: "Display one or many resources",
+ Long: get_long,
+ Example: get_example,
+ Run: func(cmd *cobra.Command, args []string) {
+ err := RunGet(f, out, cmd, args)
+ util.CheckErr(err)
+ },
+ ValidArgs: validArgs,
+}
+```
+
+Notice we put the "ValidArgs" on the "get" subcommand. Doing so will give results like
+
+```bash
+# kubectl get [tab][tab]
+node pod replicationcontroller service
+```
+
+## Plural form and shortcuts for nouns
+
+If your nouns have a number of aliases, you can define them alongside `ValidArgs` using `ArgAliases`:
+
+```go
+argAliases []string = { "pods", "nodes", "services", "svc", "replicationcontrollers", "rc" }
+
+cmd := &cobra.Command{
+ ...
+ ValidArgs: validArgs,
+ ArgAliases: argAliases
+}
+```
+
+The aliases are not shown to the user on tab completion, but they are accepted as valid nouns by
+the completion algorithm if entered manually, e.g. in:
+
+```bash
+# kubectl get rc [tab][tab]
+backend frontend database
+```
+
+Note that without declaring `rc` as an alias, the completion algorithm would show the list of nouns
+in this example again instead of the replication controllers.
+
+## Mark flags as required
+
+Most of the time completions will only show subcommands. But if a flag is required to make a subcommand work, you probably want it to show up when the user types [tab][tab]. Marking a flag as 'Required' is incredibly easy.
+
+```go
+cmd.MarkFlagRequired("pod")
+cmd.MarkFlagRequired("container")
+```
+
+and you'll get something like
+
+```bash
+# kubectl exec [tab][tab][tab]
+-c --container= -p --pod=
+```
+
+# Specify valid filename extensions for flags that take a filename
+
+In this example we use --filename= and expect to get a json or yaml file as the argument. To make this easier we annotate the --filename flag with valid filename extensions.
+
+```go
+ annotations := []string{"json", "yaml", "yml"}
+ annotation := make(map[string][]string)
+ annotation[cobra.BashCompFilenameExt] = annotations
+
+ flag := &pflag.Flag{
+ Name: "filename",
+ Shorthand: "f",
+ Usage: usage,
+ Value: value,
+ DefValue: value.String(),
+ Annotations: annotation,
+ }
+ cmd.Flags().AddFlag(flag)
+```
+
+Now when you run a command with this filename flag you'll get something like
+
+```bash
+# kubectl create -f
+test/ example/ rpmbuild/
+hello.yml test.json
+```
+
+So while there are many other files in the CWD it only shows me subdirs and those with valid extensions.
+
+# Specify custom flag completion
+
+Similar to the filename completion and filtering using cobra.BashCompFilenameExt, you can specify
+a custom flag completion function with cobra.BashCompCustom:
+
+```go
+ annotation := make(map[string][]string)
+ annotation[cobra.BashCompFilenameExt] = []string{"__kubectl_get_namespaces"}
+
+ flag := &pflag.Flag{
+ Name: "namespace",
+ Usage: usage,
+ Annotations: annotation,
+ }
+ cmd.Flags().AddFlag(flag)
+```
+
+In addition add the `__handle_namespace_flag` implementation in the `BashCompletionFunction`
+value, e.g.:
+
+```bash
+__kubectl_get_namespaces()
+{
+ local template
+ template="{{ range .items }}{{ .metadata.name }} {{ end }}"
+ local kubectl_out
+ if kubectl_out=$(kubectl get -o template --template="${template}" namespace 2>/dev/null); then
+ COMPREPLY=( $( compgen -W "${kubectl_out}[*]" -- "$cur" ) )
+ fi
+}
+```
+# Using bash aliases for commands
+
+You can also configure the `bash aliases` for the commands and they will also support completions.
+
+```bash
+alias aliasname=origcommand
+complete -o default -F __start_origcommand aliasname
+
+# and now when you run `aliasname` completion will make
+# suggestions as it did for `origcommand`.
+
+$) aliasname
+completion firstcommand secondcommand
+```
diff --git a/vendor/github.com/spf13/cobra/cobra.go b/vendor/github.com/spf13/cobra/cobra.go
new file mode 100644
index 00000000000..7010fd15b72
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/cobra.go
@@ -0,0 +1,200 @@
+// Copyright © 2013 Steve Francia .
+//
+// 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.
+
+// Commands similar to git, go tools and other modern CLI tools
+// inspired by go, go-Commander, gh and subcommand
+
+package cobra
+
+import (
+ "fmt"
+ "io"
+ "reflect"
+ "strconv"
+ "strings"
+ "text/template"
+ "unicode"
+)
+
+var templateFuncs = template.FuncMap{
+ "trim": strings.TrimSpace,
+ "trimRightSpace": trimRightSpace,
+ "trimTrailingWhitespaces": trimRightSpace,
+ "appendIfNotPresent": appendIfNotPresent,
+ "rpad": rpad,
+ "gt": Gt,
+ "eq": Eq,
+}
+
+var initializers []func()
+
+// EnablePrefixMatching allows to set automatic prefix matching. Automatic prefix matching can be a dangerous thing
+// to automatically enable in CLI tools.
+// Set this to true to enable it.
+var EnablePrefixMatching = false
+
+// EnableCommandSorting controls sorting of the slice of commands, which is turned on by default.
+// To disable sorting, set it to false.
+var EnableCommandSorting = true
+
+// MousetrapHelpText enables an information splash screen on Windows
+// if the CLI is started from explorer.exe.
+// To disable the mousetrap, just set this variable to blank string ("").
+// Works only on Microsoft Windows.
+var MousetrapHelpText string = `This is a command line tool.
+
+You need to open cmd.exe and run it from there.
+`
+
+// AddTemplateFunc adds a template function that's available to Usage and Help
+// template generation.
+func AddTemplateFunc(name string, tmplFunc interface{}) {
+ templateFuncs[name] = tmplFunc
+}
+
+// AddTemplateFuncs adds multiple template functions that are available to Usage and
+// Help template generation.
+func AddTemplateFuncs(tmplFuncs template.FuncMap) {
+ for k, v := range tmplFuncs {
+ templateFuncs[k] = v
+ }
+}
+
+// OnInitialize sets the passed functions to be run when each command's
+// Execute method is called.
+func OnInitialize(y ...func()) {
+ initializers = append(initializers, y...)
+}
+
+// FIXME Gt is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra.
+
+// Gt takes two types and checks whether the first type is greater than the second. In case of types Arrays, Chans,
+// Maps and Slices, Gt will compare their lengths. Ints are compared directly while strings are first parsed as
+// ints and then compared.
+func Gt(a interface{}, b interface{}) bool {
+ var left, right int64
+ av := reflect.ValueOf(a)
+
+ switch av.Kind() {
+ case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
+ left = int64(av.Len())
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ left = av.Int()
+ case reflect.String:
+ left, _ = strconv.ParseInt(av.String(), 10, 64)
+ }
+
+ bv := reflect.ValueOf(b)
+
+ switch bv.Kind() {
+ case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
+ right = int64(bv.Len())
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ right = bv.Int()
+ case reflect.String:
+ right, _ = strconv.ParseInt(bv.String(), 10, 64)
+ }
+
+ return left > right
+}
+
+// FIXME Eq is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra.
+
+// Eq takes two types and checks whether they are equal. Supported types are int and string. Unsupported types will panic.
+func Eq(a interface{}, b interface{}) bool {
+ av := reflect.ValueOf(a)
+ bv := reflect.ValueOf(b)
+
+ switch av.Kind() {
+ case reflect.Array, reflect.Chan, reflect.Map, reflect.Slice:
+ panic("Eq called on unsupported type")
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
+ return av.Int() == bv.Int()
+ case reflect.String:
+ return av.String() == bv.String()
+ }
+ return false
+}
+
+func trimRightSpace(s string) string {
+ return strings.TrimRightFunc(s, unicode.IsSpace)
+}
+
+// FIXME appendIfNotPresent is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra.
+
+// appendIfNotPresent will append stringToAppend to the end of s, but only if it's not yet present in s.
+func appendIfNotPresent(s, stringToAppend string) string {
+ if strings.Contains(s, stringToAppend) {
+ return s
+ }
+ return s + " " + stringToAppend
+}
+
+// rpad adds padding to the right of a string.
+func rpad(s string, padding int) string {
+ template := fmt.Sprintf("%%-%ds", padding)
+ return fmt.Sprintf(template, s)
+}
+
+// tmpl executes the given template text on data, writing the result to w.
+func tmpl(w io.Writer, text string, data interface{}) error {
+ t := template.New("top")
+ t.Funcs(templateFuncs)
+ template.Must(t.Parse(text))
+ return t.Execute(w, data)
+}
+
+// ld compares two strings and returns the levenshtein distance between them.
+func ld(s, t string, ignoreCase bool) int {
+ if ignoreCase {
+ s = strings.ToLower(s)
+ t = strings.ToLower(t)
+ }
+ d := make([][]int, len(s)+1)
+ for i := range d {
+ d[i] = make([]int, len(t)+1)
+ }
+ for i := range d {
+ d[i][0] = i
+ }
+ for j := range d[0] {
+ d[0][j] = j
+ }
+ for j := 1; j <= len(t); j++ {
+ for i := 1; i <= len(s); i++ {
+ if s[i-1] == t[j-1] {
+ d[i][j] = d[i-1][j-1]
+ } else {
+ min := d[i-1][j]
+ if d[i][j-1] < min {
+ min = d[i][j-1]
+ }
+ if d[i-1][j-1] < min {
+ min = d[i-1][j-1]
+ }
+ d[i][j] = min + 1
+ }
+ }
+
+ }
+ return d[len(s)][len(t)]
+}
+
+func stringInSlice(a string, list []string) bool {
+ for _, b := range list {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go
new file mode 100644
index 00000000000..15b8112795c
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/command.go
@@ -0,0 +1,1507 @@
+// Copyright © 2013 Steve Francia .
+//
+// 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.
+
+// Package cobra is a commander providing a simple interface to create powerful modern CLI interfaces.
+// In addition to providing an interface, Cobra simultaneously provides a controller to organize your application code.
+package cobra
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ flag "github.com/spf13/pflag"
+)
+
+// Command is just that, a command for your application.
+// E.g. 'go run ...' - 'run' is the command. Cobra requires
+// you to define the usage and description as part of your command
+// definition to ensure usability.
+type Command struct {
+ // Use is the one-line usage message.
+ Use string
+
+ // Aliases is an array of aliases that can be used instead of the first word in Use.
+ Aliases []string
+
+ // SuggestFor is an array of command names for which this command will be suggested -
+ // similar to aliases but only suggests.
+ SuggestFor []string
+
+ // Short is the short description shown in the 'help' output.
+ Short string
+
+ // Long is the long message shown in the 'help ' output.
+ Long string
+
+ // Example is examples of how to use the command.
+ Example string
+
+ // ValidArgs is list of all valid non-flag arguments that are accepted in bash completions
+ ValidArgs []string
+
+ // Expected arguments
+ Args PositionalArgs
+
+ // ArgAliases is List of aliases for ValidArgs.
+ // These are not suggested to the user in the bash completion,
+ // but accepted if entered manually.
+ ArgAliases []string
+
+ // BashCompletionFunction is custom functions used by the bash autocompletion generator.
+ BashCompletionFunction string
+
+ // Deprecated defines, if this command is deprecated and should print this string when used.
+ Deprecated string
+
+ // Hidden defines, if this command is hidden and should NOT show up in the list of available commands.
+ Hidden bool
+
+ // Annotations are key/value pairs that can be used by applications to identify or
+ // group commands.
+ Annotations map[string]string
+
+ // Version defines the version for this command. If this value is non-empty and the command does not
+ // define a "version" flag, a "version" boolean flag will be added to the command and, if specified,
+ // will print content of the "Version" variable.
+ Version string
+
+ // The *Run functions are executed in the following order:
+ // * PersistentPreRun()
+ // * PreRun()
+ // * Run()
+ // * PostRun()
+ // * PersistentPostRun()
+ // All functions get the same args, the arguments after the command name.
+ //
+ // PersistentPreRun: children of this command will inherit and execute.
+ PersistentPreRun func(cmd *Command, args []string)
+ // PersistentPreRunE: PersistentPreRun but returns an error.
+ PersistentPreRunE func(cmd *Command, args []string) error
+ // PreRun: children of this command will not inherit.
+ PreRun func(cmd *Command, args []string)
+ // PreRunE: PreRun but returns an error.
+ PreRunE func(cmd *Command, args []string) error
+ // Run: Typically the actual work function. Most commands will only implement this.
+ Run func(cmd *Command, args []string)
+ // RunE: Run but returns an error.
+ RunE func(cmd *Command, args []string) error
+ // PostRun: run after the Run command.
+ PostRun func(cmd *Command, args []string)
+ // PostRunE: PostRun but returns an error.
+ PostRunE func(cmd *Command, args []string) error
+ // PersistentPostRun: children of this command will inherit and execute after PostRun.
+ PersistentPostRun func(cmd *Command, args []string)
+ // PersistentPostRunE: PersistentPostRun but returns an error.
+ PersistentPostRunE func(cmd *Command, args []string) error
+
+ // SilenceErrors is an option to quiet errors down stream.
+ SilenceErrors bool
+
+ // SilenceUsage is an option to silence usage when an error occurs.
+ SilenceUsage bool
+
+ // DisableFlagParsing disables the flag parsing.
+ // If this is true all flags will be passed to the command as arguments.
+ DisableFlagParsing bool
+
+ // DisableAutoGenTag defines, if gen tag ("Auto generated by spf13/cobra...")
+ // will be printed by generating docs for this command.
+ DisableAutoGenTag bool
+
+ // DisableFlagsInUseLine will disable the addition of [flags] to the usage
+ // line of a command when printing help or generating docs
+ DisableFlagsInUseLine bool
+
+ // DisableSuggestions disables the suggestions based on Levenshtein distance
+ // that go along with 'unknown command' messages.
+ DisableSuggestions bool
+ // SuggestionsMinimumDistance defines minimum levenshtein distance to display suggestions.
+ // Must be > 0.
+ SuggestionsMinimumDistance int
+
+ // TraverseChildren parses flags on all parents before executing child command.
+ TraverseChildren bool
+
+ // commands is the list of commands supported by this program.
+ commands []*Command
+ // parent is a parent command for this command.
+ parent *Command
+ // Max lengths of commands' string lengths for use in padding.
+ commandsMaxUseLen int
+ commandsMaxCommandPathLen int
+ commandsMaxNameLen int
+ // commandsAreSorted defines, if command slice are sorted or not.
+ commandsAreSorted bool
+ // commandCalledAs is the name or alias value used to call this command.
+ commandCalledAs struct {
+ name string
+ called bool
+ }
+
+ // args is actual args parsed from flags.
+ args []string
+ // flagErrorBuf contains all error messages from pflag.
+ flagErrorBuf *bytes.Buffer
+ // flags is full set of flags.
+ flags *flag.FlagSet
+ // pflags contains persistent flags.
+ pflags *flag.FlagSet
+ // lflags contains local flags.
+ lflags *flag.FlagSet
+ // iflags contains inherited flags.
+ iflags *flag.FlagSet
+ // parentsPflags is all persistent flags of cmd's parents.
+ parentsPflags *flag.FlagSet
+ // globNormFunc is the global normalization function
+ // that we can use on every pflag set and children commands
+ globNormFunc func(f *flag.FlagSet, name string) flag.NormalizedName
+
+ // output is an output writer defined by user.
+ output io.Writer
+ // usageFunc is usage func defined by user.
+ usageFunc func(*Command) error
+ // usageTemplate is usage template defined by user.
+ usageTemplate string
+ // flagErrorFunc is func defined by user and it's called when the parsing of
+ // flags returns an error.
+ flagErrorFunc func(*Command, error) error
+ // helpTemplate is help template defined by user.
+ helpTemplate string
+ // helpFunc is help func defined by user.
+ helpFunc func(*Command, []string)
+ // helpCommand is command with usage 'help'. If it's not defined by user,
+ // cobra uses default help command.
+ helpCommand *Command
+ // versionTemplate is the version template defined by user.
+ versionTemplate string
+}
+
+// SetArgs sets arguments for the command. It is set to os.Args[1:] by default, if desired, can be overridden
+// particularly useful when testing.
+func (c *Command) SetArgs(a []string) {
+ c.args = a
+}
+
+// SetOutput sets the destination for usage and error messages.
+// If output is nil, os.Stderr is used.
+func (c *Command) SetOutput(output io.Writer) {
+ c.output = output
+}
+
+// SetUsageFunc sets usage function. Usage can be defined by application.
+func (c *Command) SetUsageFunc(f func(*Command) error) {
+ c.usageFunc = f
+}
+
+// SetUsageTemplate sets usage template. Can be defined by Application.
+func (c *Command) SetUsageTemplate(s string) {
+ c.usageTemplate = s
+}
+
+// SetFlagErrorFunc sets a function to generate an error when flag parsing
+// fails.
+func (c *Command) SetFlagErrorFunc(f func(*Command, error) error) {
+ c.flagErrorFunc = f
+}
+
+// SetHelpFunc sets help function. Can be defined by Application.
+func (c *Command) SetHelpFunc(f func(*Command, []string)) {
+ c.helpFunc = f
+}
+
+// SetHelpCommand sets help command.
+func (c *Command) SetHelpCommand(cmd *Command) {
+ c.helpCommand = cmd
+}
+
+// SetHelpTemplate sets help template to be used. Application can use it to set custom template.
+func (c *Command) SetHelpTemplate(s string) {
+ c.helpTemplate = s
+}
+
+// SetVersionTemplate sets version template to be used. Application can use it to set custom template.
+func (c *Command) SetVersionTemplate(s string) {
+ c.versionTemplate = s
+}
+
+// SetGlobalNormalizationFunc sets a normalization function to all flag sets and also to child commands.
+// The user should not have a cyclic dependency on commands.
+func (c *Command) SetGlobalNormalizationFunc(n func(f *flag.FlagSet, name string) flag.NormalizedName) {
+ c.Flags().SetNormalizeFunc(n)
+ c.PersistentFlags().SetNormalizeFunc(n)
+ c.globNormFunc = n
+
+ for _, command := range c.commands {
+ command.SetGlobalNormalizationFunc(n)
+ }
+}
+
+// OutOrStdout returns output to stdout.
+func (c *Command) OutOrStdout() io.Writer {
+ return c.getOut(os.Stdout)
+}
+
+// OutOrStderr returns output to stderr
+func (c *Command) OutOrStderr() io.Writer {
+ return c.getOut(os.Stderr)
+}
+
+func (c *Command) getOut(def io.Writer) io.Writer {
+ if c.output != nil {
+ return c.output
+ }
+ if c.HasParent() {
+ return c.parent.getOut(def)
+ }
+ return def
+}
+
+// UsageFunc returns either the function set by SetUsageFunc for this command
+// or a parent, or it returns a default usage function.
+func (c *Command) UsageFunc() (f func(*Command) error) {
+ if c.usageFunc != nil {
+ return c.usageFunc
+ }
+ if c.HasParent() {
+ return c.Parent().UsageFunc()
+ }
+ return func(c *Command) error {
+ c.mergePersistentFlags()
+ err := tmpl(c.OutOrStderr(), c.UsageTemplate(), c)
+ if err != nil {
+ c.Println(err)
+ }
+ return err
+ }
+}
+
+// Usage puts out the usage for the command.
+// Used when a user provides invalid input.
+// Can be defined by user by overriding UsageFunc.
+func (c *Command) Usage() error {
+ return c.UsageFunc()(c)
+}
+
+// HelpFunc returns either the function set by SetHelpFunc for this command
+// or a parent, or it returns a function with default help behavior.
+func (c *Command) HelpFunc() func(*Command, []string) {
+ if c.helpFunc != nil {
+ return c.helpFunc
+ }
+ if c.HasParent() {
+ return c.Parent().HelpFunc()
+ }
+ return func(c *Command, a []string) {
+ c.mergePersistentFlags()
+ err := tmpl(c.OutOrStdout(), c.HelpTemplate(), c)
+ if err != nil {
+ c.Println(err)
+ }
+ }
+}
+
+// Help puts out the help for the command.
+// Used when a user calls help [command].
+// Can be defined by user by overriding HelpFunc.
+func (c *Command) Help() error {
+ c.HelpFunc()(c, []string{})
+ return nil
+}
+
+// UsageString return usage string.
+func (c *Command) UsageString() string {
+ tmpOutput := c.output
+ bb := new(bytes.Buffer)
+ c.SetOutput(bb)
+ c.Usage()
+ c.output = tmpOutput
+ return bb.String()
+}
+
+// FlagErrorFunc returns either the function set by SetFlagErrorFunc for this
+// command or a parent, or it returns a function which returns the original
+// error.
+func (c *Command) FlagErrorFunc() (f func(*Command, error) error) {
+ if c.flagErrorFunc != nil {
+ return c.flagErrorFunc
+ }
+
+ if c.HasParent() {
+ return c.parent.FlagErrorFunc()
+ }
+ return func(c *Command, err error) error {
+ return err
+ }
+}
+
+var minUsagePadding = 25
+
+// UsagePadding return padding for the usage.
+func (c *Command) UsagePadding() int {
+ if c.parent == nil || minUsagePadding > c.parent.commandsMaxUseLen {
+ return minUsagePadding
+ }
+ return c.parent.commandsMaxUseLen
+}
+
+var minCommandPathPadding = 11
+
+// CommandPathPadding return padding for the command path.
+func (c *Command) CommandPathPadding() int {
+ if c.parent == nil || minCommandPathPadding > c.parent.commandsMaxCommandPathLen {
+ return minCommandPathPadding
+ }
+ return c.parent.commandsMaxCommandPathLen
+}
+
+var minNamePadding = 11
+
+// NamePadding returns padding for the name.
+func (c *Command) NamePadding() int {
+ if c.parent == nil || minNamePadding > c.parent.commandsMaxNameLen {
+ return minNamePadding
+ }
+ return c.parent.commandsMaxNameLen
+}
+
+// UsageTemplate returns usage template for the command.
+func (c *Command) UsageTemplate() string {
+ if c.usageTemplate != "" {
+ return c.usageTemplate
+ }
+
+ if c.HasParent() {
+ return c.parent.UsageTemplate()
+ }
+ return `Usage:{{if .Runnable}}
+ {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}}
+ {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}}
+
+Aliases:
+ {{.NameAndAliases}}{{end}}{{if .HasExample}}
+
+Examples:
+{{.Example}}{{end}}{{if .HasAvailableSubCommands}}
+
+Available Commands:{{range .Commands}}{{if (or .IsAvailableCommand (eq .Name "help"))}}
+ {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}}
+
+Flags:
+{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}}
+
+Global Flags:
+{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}}
+
+Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}}
+ {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}}
+
+Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}}
+`
+}
+
+// HelpTemplate return help template for the command.
+func (c *Command) HelpTemplate() string {
+ if c.helpTemplate != "" {
+ return c.helpTemplate
+ }
+
+ if c.HasParent() {
+ return c.parent.HelpTemplate()
+ }
+ return `{{with (or .Long .Short)}}{{. | trimTrailingWhitespaces}}
+
+{{end}}{{if or .Runnable .HasSubCommands}}{{.UsageString}}{{end}}`
+}
+
+// VersionTemplate return version template for the command.
+func (c *Command) VersionTemplate() string {
+ if c.versionTemplate != "" {
+ return c.versionTemplate
+ }
+
+ if c.HasParent() {
+ return c.parent.VersionTemplate()
+ }
+ return `{{with .Name}}{{printf "%s " .}}{{end}}{{printf "version %s" .Version}}
+`
+}
+
+func hasNoOptDefVal(name string, fs *flag.FlagSet) bool {
+ flag := fs.Lookup(name)
+ if flag == nil {
+ return false
+ }
+ return flag.NoOptDefVal != ""
+}
+
+func shortHasNoOptDefVal(name string, fs *flag.FlagSet) bool {
+ if len(name) == 0 {
+ return false
+ }
+
+ flag := fs.ShorthandLookup(name[:1])
+ if flag == nil {
+ return false
+ }
+ return flag.NoOptDefVal != ""
+}
+
+func stripFlags(args []string, c *Command) []string {
+ if len(args) == 0 {
+ return args
+ }
+ c.mergePersistentFlags()
+
+ commands := []string{}
+ flags := c.Flags()
+
+Loop:
+ for len(args) > 0 {
+ s := args[0]
+ args = args[1:]
+ switch {
+ case s == "--":
+ // "--" terminates the flags
+ break Loop
+ case strings.HasPrefix(s, "--") && !strings.Contains(s, "=") && !hasNoOptDefVal(s[2:], flags):
+ // If '--flag arg' then
+ // delete arg from args.
+ fallthrough // (do the same as below)
+ case strings.HasPrefix(s, "-") && !strings.Contains(s, "=") && len(s) == 2 && !shortHasNoOptDefVal(s[1:], flags):
+ // If '-f arg' then
+ // delete 'arg' from args or break the loop if len(args) <= 1.
+ if len(args) <= 1 {
+ break Loop
+ } else {
+ args = args[1:]
+ continue
+ }
+ case s != "" && !strings.HasPrefix(s, "-"):
+ commands = append(commands, s)
+ }
+ }
+
+ return commands
+}
+
+// argsMinusFirstX removes only the first x from args. Otherwise, commands that look like
+// openshift admin policy add-role-to-user admin my-user, lose the admin argument (arg[4]).
+func argsMinusFirstX(args []string, x string) []string {
+ for i, y := range args {
+ if x == y {
+ ret := []string{}
+ ret = append(ret, args[:i]...)
+ ret = append(ret, args[i+1:]...)
+ return ret
+ }
+ }
+ return args
+}
+
+func isFlagArg(arg string) bool {
+ return ((len(arg) >= 3 && arg[1] == '-') ||
+ (len(arg) >= 2 && arg[0] == '-' && arg[1] != '-'))
+}
+
+// Find the target command given the args and command tree
+// Meant to be run on the highest node. Only searches down.
+func (c *Command) Find(args []string) (*Command, []string, error) {
+ var innerfind func(*Command, []string) (*Command, []string)
+
+ innerfind = func(c *Command, innerArgs []string) (*Command, []string) {
+ argsWOflags := stripFlags(innerArgs, c)
+ if len(argsWOflags) == 0 {
+ return c, innerArgs
+ }
+ nextSubCmd := argsWOflags[0]
+
+ cmd := c.findNext(nextSubCmd)
+ if cmd != nil {
+ return innerfind(cmd, argsMinusFirstX(innerArgs, nextSubCmd))
+ }
+ return c, innerArgs
+ }
+
+ commandFound, a := innerfind(c, args)
+ if commandFound.Args == nil {
+ return commandFound, a, legacyArgs(commandFound, stripFlags(a, commandFound))
+ }
+ return commandFound, a, nil
+}
+
+func (c *Command) findSuggestions(arg string) string {
+ if c.DisableSuggestions {
+ return ""
+ }
+ if c.SuggestionsMinimumDistance <= 0 {
+ c.SuggestionsMinimumDistance = 2
+ }
+ suggestionsString := ""
+ if suggestions := c.SuggestionsFor(arg); len(suggestions) > 0 {
+ suggestionsString += "\n\nDid you mean this?\n"
+ for _, s := range suggestions {
+ suggestionsString += fmt.Sprintf("\t%v\n", s)
+ }
+ }
+ return suggestionsString
+}
+
+func (c *Command) findNext(next string) *Command {
+ matches := make([]*Command, 0)
+ for _, cmd := range c.commands {
+ if cmd.Name() == next || cmd.HasAlias(next) {
+ cmd.commandCalledAs.name = next
+ return cmd
+ }
+ if EnablePrefixMatching && cmd.hasNameOrAliasPrefix(next) {
+ matches = append(matches, cmd)
+ }
+ }
+
+ if len(matches) == 1 {
+ return matches[0]
+ }
+
+ return nil
+}
+
+// Traverse the command tree to find the command, and parse args for
+// each parent.
+func (c *Command) Traverse(args []string) (*Command, []string, error) {
+ flags := []string{}
+ inFlag := false
+
+ for i, arg := range args {
+ switch {
+ // A long flag with a space separated value
+ case strings.HasPrefix(arg, "--") && !strings.Contains(arg, "="):
+ // TODO: this isn't quite right, we should really check ahead for 'true' or 'false'
+ inFlag = !hasNoOptDefVal(arg[2:], c.Flags())
+ flags = append(flags, arg)
+ continue
+ // A short flag with a space separated value
+ case strings.HasPrefix(arg, "-") && !strings.Contains(arg, "=") && len(arg) == 2 && !shortHasNoOptDefVal(arg[1:], c.Flags()):
+ inFlag = true
+ flags = append(flags, arg)
+ continue
+ // The value for a flag
+ case inFlag:
+ inFlag = false
+ flags = append(flags, arg)
+ continue
+ // A flag without a value, or with an `=` separated value
+ case isFlagArg(arg):
+ flags = append(flags, arg)
+ continue
+ }
+
+ cmd := c.findNext(arg)
+ if cmd == nil {
+ return c, args, nil
+ }
+
+ if err := c.ParseFlags(flags); err != nil {
+ return nil, args, err
+ }
+ return cmd.Traverse(args[i+1:])
+ }
+ return c, args, nil
+}
+
+// SuggestionsFor provides suggestions for the typedName.
+func (c *Command) SuggestionsFor(typedName string) []string {
+ suggestions := []string{}
+ for _, cmd := range c.commands {
+ if cmd.IsAvailableCommand() {
+ levenshteinDistance := ld(typedName, cmd.Name(), true)
+ suggestByLevenshtein := levenshteinDistance <= c.SuggestionsMinimumDistance
+ suggestByPrefix := strings.HasPrefix(strings.ToLower(cmd.Name()), strings.ToLower(typedName))
+ if suggestByLevenshtein || suggestByPrefix {
+ suggestions = append(suggestions, cmd.Name())
+ }
+ for _, explicitSuggestion := range cmd.SuggestFor {
+ if strings.EqualFold(typedName, explicitSuggestion) {
+ suggestions = append(suggestions, cmd.Name())
+ }
+ }
+ }
+ }
+ return suggestions
+}
+
+// VisitParents visits all parents of the command and invokes fn on each parent.
+func (c *Command) VisitParents(fn func(*Command)) {
+ if c.HasParent() {
+ fn(c.Parent())
+ c.Parent().VisitParents(fn)
+ }
+}
+
+// Root finds root command.
+func (c *Command) Root() *Command {
+ if c.HasParent() {
+ return c.Parent().Root()
+ }
+ return c
+}
+
+// ArgsLenAtDash will return the length of c.Flags().Args at the moment
+// when a -- was found during args parsing.
+func (c *Command) ArgsLenAtDash() int {
+ return c.Flags().ArgsLenAtDash()
+}
+
+func (c *Command) execute(a []string) (err error) {
+ if c == nil {
+ return fmt.Errorf("Called Execute() on a nil Command")
+ }
+
+ if len(c.Deprecated) > 0 {
+ c.Printf("Command %q is deprecated, %s\n", c.Name(), c.Deprecated)
+ }
+
+ // initialize help and version flag at the last point possible to allow for user
+ // overriding
+ c.InitDefaultHelpFlag()
+ c.InitDefaultVersionFlag()
+
+ err = c.ParseFlags(a)
+ if err != nil {
+ return c.FlagErrorFunc()(c, err)
+ }
+
+ // If help is called, regardless of other flags, return we want help.
+ // Also say we need help if the command isn't runnable.
+ helpVal, err := c.Flags().GetBool("help")
+ if err != nil {
+ // should be impossible to get here as we always declare a help
+ // flag in InitDefaultHelpFlag()
+ c.Println("\"help\" flag declared as non-bool. Please correct your code")
+ return err
+ }
+
+ if helpVal {
+ return flag.ErrHelp
+ }
+
+ // for back-compat, only add version flag behavior if version is defined
+ if c.Version != "" {
+ versionVal, err := c.Flags().GetBool("version")
+ if err != nil {
+ c.Println("\"version\" flag declared as non-bool. Please correct your code")
+ return err
+ }
+ if versionVal {
+ err := tmpl(c.OutOrStdout(), c.VersionTemplate(), c)
+ if err != nil {
+ c.Println(err)
+ }
+ return err
+ }
+ }
+
+ if !c.Runnable() {
+ return flag.ErrHelp
+ }
+
+ c.preRun()
+
+ argWoFlags := c.Flags().Args()
+ if c.DisableFlagParsing {
+ argWoFlags = a
+ }
+
+ if err := c.ValidateArgs(argWoFlags); err != nil {
+ return err
+ }
+
+ for p := c; p != nil; p = p.Parent() {
+ if p.PersistentPreRunE != nil {
+ if err := p.PersistentPreRunE(c, argWoFlags); err != nil {
+ return err
+ }
+ break
+ } else if p.PersistentPreRun != nil {
+ p.PersistentPreRun(c, argWoFlags)
+ break
+ }
+ }
+ if c.PreRunE != nil {
+ if err := c.PreRunE(c, argWoFlags); err != nil {
+ return err
+ }
+ } else if c.PreRun != nil {
+ c.PreRun(c, argWoFlags)
+ }
+
+ if err := c.validateRequiredFlags(); err != nil {
+ return err
+ }
+ if c.RunE != nil {
+ if err := c.RunE(c, argWoFlags); err != nil {
+ return err
+ }
+ } else {
+ c.Run(c, argWoFlags)
+ }
+ if c.PostRunE != nil {
+ if err := c.PostRunE(c, argWoFlags); err != nil {
+ return err
+ }
+ } else if c.PostRun != nil {
+ c.PostRun(c, argWoFlags)
+ }
+ for p := c; p != nil; p = p.Parent() {
+ if p.PersistentPostRunE != nil {
+ if err := p.PersistentPostRunE(c, argWoFlags); err != nil {
+ return err
+ }
+ break
+ } else if p.PersistentPostRun != nil {
+ p.PersistentPostRun(c, argWoFlags)
+ break
+ }
+ }
+
+ return nil
+}
+
+func (c *Command) preRun() {
+ for _, x := range initializers {
+ x()
+ }
+}
+
+// Execute uses the args (os.Args[1:] by default)
+// and run through the command tree finding appropriate matches
+// for commands and then corresponding flags.
+func (c *Command) Execute() error {
+ _, err := c.ExecuteC()
+ return err
+}
+
+// ExecuteC executes the command.
+func (c *Command) ExecuteC() (cmd *Command, err error) {
+ // Regardless of what command execute is called on, run on Root only
+ if c.HasParent() {
+ return c.Root().ExecuteC()
+ }
+
+ // windows hook
+ if preExecHookFn != nil {
+ preExecHookFn(c)
+ }
+
+ // initialize help as the last point possible to allow for user
+ // overriding
+ c.InitDefaultHelpCmd()
+
+ var args []string
+
+ // Workaround FAIL with "go test -v" or "cobra.test -test.v", see #155
+ if c.args == nil && filepath.Base(os.Args[0]) != "cobra.test" {
+ args = os.Args[1:]
+ } else {
+ args = c.args
+ }
+
+ var flags []string
+ if c.TraverseChildren {
+ cmd, flags, err = c.Traverse(args)
+ } else {
+ cmd, flags, err = c.Find(args)
+ }
+ if err != nil {
+ // If found parse to a subcommand and then failed, talk about the subcommand
+ if cmd != nil {
+ c = cmd
+ }
+ if !c.SilenceErrors {
+ c.Println("Error:", err.Error())
+ c.Printf("Run '%v --help' for usage.\n", c.CommandPath())
+ }
+ return c, err
+ }
+
+ cmd.commandCalledAs.called = true
+ if cmd.commandCalledAs.name == "" {
+ cmd.commandCalledAs.name = cmd.Name()
+ }
+
+ err = cmd.execute(flags)
+ if err != nil {
+ // Always show help if requested, even if SilenceErrors is in
+ // effect
+ if err == flag.ErrHelp {
+ cmd.HelpFunc()(cmd, args)
+ return cmd, nil
+ }
+
+ // If root command has SilentErrors flagged,
+ // all subcommands should respect it
+ if !cmd.SilenceErrors && !c.SilenceErrors {
+ c.Println("Error:", err.Error())
+ }
+
+ // If root command has SilentUsage flagged,
+ // all subcommands should respect it
+ if !cmd.SilenceUsage && !c.SilenceUsage {
+ c.Println(cmd.UsageString())
+ }
+ }
+ return cmd, err
+}
+
+func (c *Command) ValidateArgs(args []string) error {
+ if c.Args == nil {
+ return nil
+ }
+ return c.Args(c, args)
+}
+
+func (c *Command) validateRequiredFlags() error {
+ flags := c.Flags()
+ missingFlagNames := []string{}
+ flags.VisitAll(func(pflag *flag.Flag) {
+ requiredAnnotation, found := pflag.Annotations[BashCompOneRequiredFlag]
+ if !found {
+ return
+ }
+ if (requiredAnnotation[0] == "true") && !pflag.Changed {
+ missingFlagNames = append(missingFlagNames, pflag.Name)
+ }
+ })
+
+ if len(missingFlagNames) > 0 {
+ return fmt.Errorf(`required flag(s) "%s" not set`, strings.Join(missingFlagNames, `", "`))
+ }
+ return nil
+}
+
+// InitDefaultHelpFlag adds default help flag to c.
+// It is called automatically by executing the c or by calling help and usage.
+// If c already has help flag, it will do nothing.
+func (c *Command) InitDefaultHelpFlag() {
+ c.mergePersistentFlags()
+ if c.Flags().Lookup("help") == nil {
+ usage := "help for "
+ if c.Name() == "" {
+ usage += "this command"
+ } else {
+ usage += c.Name()
+ }
+ c.Flags().BoolP("help", "h", false, usage)
+ }
+}
+
+// InitDefaultVersionFlag adds default version flag to c.
+// It is called automatically by executing the c.
+// If c already has a version flag, it will do nothing.
+// If c.Version is empty, it will do nothing.
+func (c *Command) InitDefaultVersionFlag() {
+ if c.Version == "" {
+ return
+ }
+
+ c.mergePersistentFlags()
+ if c.Flags().Lookup("version") == nil {
+ usage := "version for "
+ if c.Name() == "" {
+ usage += "this command"
+ } else {
+ usage += c.Name()
+ }
+ c.Flags().Bool("version", false, usage)
+ }
+}
+
+// InitDefaultHelpCmd adds default help command to c.
+// It is called automatically by executing the c or by calling help and usage.
+// If c already has help command or c has no subcommands, it will do nothing.
+func (c *Command) InitDefaultHelpCmd() {
+ if !c.HasSubCommands() {
+ return
+ }
+
+ if c.helpCommand == nil {
+ c.helpCommand = &Command{
+ Use: "help [command]",
+ Short: "Help about any command",
+ Long: `Help provides help for any command in the application.
+Simply type ` + c.Name() + ` help [path to command] for full details.`,
+
+ Run: func(c *Command, args []string) {
+ cmd, _, e := c.Root().Find(args)
+ if cmd == nil || e != nil {
+ c.Printf("Unknown help topic %#q\n", args)
+ c.Root().Usage()
+ } else {
+ cmd.InitDefaultHelpFlag() // make possible 'help' flag to be shown
+ cmd.Help()
+ }
+ },
+ }
+ }
+ c.RemoveCommand(c.helpCommand)
+ c.AddCommand(c.helpCommand)
+}
+
+// ResetCommands delete parent, subcommand and help command from c.
+func (c *Command) ResetCommands() {
+ c.parent = nil
+ c.commands = nil
+ c.helpCommand = nil
+ c.parentsPflags = nil
+}
+
+// Sorts commands by their names.
+type commandSorterByName []*Command
+
+func (c commandSorterByName) Len() int { return len(c) }
+func (c commandSorterByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c commandSorterByName) Less(i, j int) bool { return c[i].Name() < c[j].Name() }
+
+// Commands returns a sorted slice of child commands.
+func (c *Command) Commands() []*Command {
+ // do not sort commands if it already sorted or sorting was disabled
+ if EnableCommandSorting && !c.commandsAreSorted {
+ sort.Sort(commandSorterByName(c.commands))
+ c.commandsAreSorted = true
+ }
+ return c.commands
+}
+
+// AddCommand adds one or more commands to this parent command.
+func (c *Command) AddCommand(cmds ...*Command) {
+ for i, x := range cmds {
+ if cmds[i] == c {
+ panic("Command can't be a child of itself")
+ }
+ cmds[i].parent = c
+ // update max lengths
+ usageLen := len(x.Use)
+ if usageLen > c.commandsMaxUseLen {
+ c.commandsMaxUseLen = usageLen
+ }
+ commandPathLen := len(x.CommandPath())
+ if commandPathLen > c.commandsMaxCommandPathLen {
+ c.commandsMaxCommandPathLen = commandPathLen
+ }
+ nameLen := len(x.Name())
+ if nameLen > c.commandsMaxNameLen {
+ c.commandsMaxNameLen = nameLen
+ }
+ // If global normalization function exists, update all children
+ if c.globNormFunc != nil {
+ x.SetGlobalNormalizationFunc(c.globNormFunc)
+ }
+ c.commands = append(c.commands, x)
+ c.commandsAreSorted = false
+ }
+}
+
+// RemoveCommand removes one or more commands from a parent command.
+func (c *Command) RemoveCommand(cmds ...*Command) {
+ commands := []*Command{}
+main:
+ for _, command := range c.commands {
+ for _, cmd := range cmds {
+ if command == cmd {
+ command.parent = nil
+ continue main
+ }
+ }
+ commands = append(commands, command)
+ }
+ c.commands = commands
+ // recompute all lengths
+ c.commandsMaxUseLen = 0
+ c.commandsMaxCommandPathLen = 0
+ c.commandsMaxNameLen = 0
+ for _, command := range c.commands {
+ usageLen := len(command.Use)
+ if usageLen > c.commandsMaxUseLen {
+ c.commandsMaxUseLen = usageLen
+ }
+ commandPathLen := len(command.CommandPath())
+ if commandPathLen > c.commandsMaxCommandPathLen {
+ c.commandsMaxCommandPathLen = commandPathLen
+ }
+ nameLen := len(command.Name())
+ if nameLen > c.commandsMaxNameLen {
+ c.commandsMaxNameLen = nameLen
+ }
+ }
+}
+
+// Print is a convenience method to Print to the defined output, fallback to Stderr if not set.
+func (c *Command) Print(i ...interface{}) {
+ fmt.Fprint(c.OutOrStderr(), i...)
+}
+
+// Println is a convenience method to Println to the defined output, fallback to Stderr if not set.
+func (c *Command) Println(i ...interface{}) {
+ c.Print(fmt.Sprintln(i...))
+}
+
+// Printf is a convenience method to Printf to the defined output, fallback to Stderr if not set.
+func (c *Command) Printf(format string, i ...interface{}) {
+ c.Print(fmt.Sprintf(format, i...))
+}
+
+// CommandPath returns the full path to this command.
+func (c *Command) CommandPath() string {
+ if c.HasParent() {
+ return c.Parent().CommandPath() + " " + c.Name()
+ }
+ return c.Name()
+}
+
+// UseLine puts out the full usage for a given command (including parents).
+func (c *Command) UseLine() string {
+ var useline string
+ if c.HasParent() {
+ useline = c.parent.CommandPath() + " " + c.Use
+ } else {
+ useline = c.Use
+ }
+ if c.DisableFlagsInUseLine {
+ return useline
+ }
+ if c.HasAvailableFlags() && !strings.Contains(useline, "[flags]") {
+ useline += " [flags]"
+ }
+ return useline
+}
+
+// DebugFlags used to determine which flags have been assigned to which commands
+// and which persist.
+func (c *Command) DebugFlags() {
+ c.Println("DebugFlags called on", c.Name())
+ var debugflags func(*Command)
+
+ debugflags = func(x *Command) {
+ if x.HasFlags() || x.HasPersistentFlags() {
+ c.Println(x.Name())
+ }
+ if x.HasFlags() {
+ x.flags.VisitAll(func(f *flag.Flag) {
+ if x.HasPersistentFlags() && x.persistentFlag(f.Name) != nil {
+ c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [LP]")
+ } else {
+ c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [L]")
+ }
+ })
+ }
+ if x.HasPersistentFlags() {
+ x.pflags.VisitAll(func(f *flag.Flag) {
+ if x.HasFlags() {
+ if x.flags.Lookup(f.Name) == nil {
+ c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [P]")
+ }
+ } else {
+ c.Println(" -"+f.Shorthand+",", "--"+f.Name, "["+f.DefValue+"]", "", f.Value, " [P]")
+ }
+ })
+ }
+ c.Println(x.flagErrorBuf)
+ if x.HasSubCommands() {
+ for _, y := range x.commands {
+ debugflags(y)
+ }
+ }
+ }
+
+ debugflags(c)
+}
+
+// Name returns the command's name: the first word in the use line.
+func (c *Command) Name() string {
+ name := c.Use
+ i := strings.Index(name, " ")
+ if i >= 0 {
+ name = name[:i]
+ }
+ return name
+}
+
+// HasAlias determines if a given string is an alias of the command.
+func (c *Command) HasAlias(s string) bool {
+ for _, a := range c.Aliases {
+ if a == s {
+ return true
+ }
+ }
+ return false
+}
+
+// CalledAs returns the command name or alias that was used to invoke
+// this command or an empty string if the command has not been called.
+func (c *Command) CalledAs() string {
+ if c.commandCalledAs.called {
+ return c.commandCalledAs.name
+ }
+ return ""
+}
+
+// hasNameOrAliasPrefix returns true if the Name or any of aliases start
+// with prefix
+func (c *Command) hasNameOrAliasPrefix(prefix string) bool {
+ if strings.HasPrefix(c.Name(), prefix) {
+ c.commandCalledAs.name = c.Name()
+ return true
+ }
+ for _, alias := range c.Aliases {
+ if strings.HasPrefix(alias, prefix) {
+ c.commandCalledAs.name = alias
+ return true
+ }
+ }
+ return false
+}
+
+// NameAndAliases returns a list of the command name and all aliases
+func (c *Command) NameAndAliases() string {
+ return strings.Join(append([]string{c.Name()}, c.Aliases...), ", ")
+}
+
+// HasExample determines if the command has example.
+func (c *Command) HasExample() bool {
+ return len(c.Example) > 0
+}
+
+// Runnable determines if the command is itself runnable.
+func (c *Command) Runnable() bool {
+ return c.Run != nil || c.RunE != nil
+}
+
+// HasSubCommands determines if the command has children commands.
+func (c *Command) HasSubCommands() bool {
+ return len(c.commands) > 0
+}
+
+// IsAvailableCommand determines if a command is available as a non-help command
+// (this includes all non deprecated/hidden commands).
+func (c *Command) IsAvailableCommand() bool {
+ if len(c.Deprecated) != 0 || c.Hidden {
+ return false
+ }
+
+ if c.HasParent() && c.Parent().helpCommand == c {
+ return false
+ }
+
+ if c.Runnable() || c.HasAvailableSubCommands() {
+ return true
+ }
+
+ return false
+}
+
+// IsAdditionalHelpTopicCommand determines if a command is an additional
+// help topic command; additional help topic command is determined by the
+// fact that it is NOT runnable/hidden/deprecated, and has no sub commands that
+// are runnable/hidden/deprecated.
+// Concrete example: https://github.com/spf13/cobra/issues/393#issuecomment-282741924.
+func (c *Command) IsAdditionalHelpTopicCommand() bool {
+ // if a command is runnable, deprecated, or hidden it is not a 'help' command
+ if c.Runnable() || len(c.Deprecated) != 0 || c.Hidden {
+ return false
+ }
+
+ // if any non-help sub commands are found, the command is not a 'help' command
+ for _, sub := range c.commands {
+ if !sub.IsAdditionalHelpTopicCommand() {
+ return false
+ }
+ }
+
+ // the command either has no sub commands, or no non-help sub commands
+ return true
+}
+
+// HasHelpSubCommands determines if a command has any available 'help' sub commands
+// that need to be shown in the usage/help default template under 'additional help
+// topics'.
+func (c *Command) HasHelpSubCommands() bool {
+ // return true on the first found available 'help' sub command
+ for _, sub := range c.commands {
+ if sub.IsAdditionalHelpTopicCommand() {
+ return true
+ }
+ }
+
+ // the command either has no sub commands, or no available 'help' sub commands
+ return false
+}
+
+// HasAvailableSubCommands determines if a command has available sub commands that
+// need to be shown in the usage/help default template under 'available commands'.
+func (c *Command) HasAvailableSubCommands() bool {
+ // return true on the first found available (non deprecated/help/hidden)
+ // sub command
+ for _, sub := range c.commands {
+ if sub.IsAvailableCommand() {
+ return true
+ }
+ }
+
+ // the command either has no sub commands, or no available (non deprecated/help/hidden)
+ // sub commands
+ return false
+}
+
+// HasParent determines if the command is a child command.
+func (c *Command) HasParent() bool {
+ return c.parent != nil
+}
+
+// GlobalNormalizationFunc returns the global normalization function or nil if it doesn't exist.
+func (c *Command) GlobalNormalizationFunc() func(f *flag.FlagSet, name string) flag.NormalizedName {
+ return c.globNormFunc
+}
+
+// Flags returns the complete FlagSet that applies
+// to this command (local and persistent declared here and by all parents).
+func (c *Command) Flags() *flag.FlagSet {
+ if c.flags == nil {
+ c.flags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ if c.flagErrorBuf == nil {
+ c.flagErrorBuf = new(bytes.Buffer)
+ }
+ c.flags.SetOutput(c.flagErrorBuf)
+ }
+
+ return c.flags
+}
+
+// LocalNonPersistentFlags are flags specific to this command which will NOT persist to subcommands.
+func (c *Command) LocalNonPersistentFlags() *flag.FlagSet {
+ persistentFlags := c.PersistentFlags()
+
+ out := flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ c.LocalFlags().VisitAll(func(f *flag.Flag) {
+ if persistentFlags.Lookup(f.Name) == nil {
+ out.AddFlag(f)
+ }
+ })
+ return out
+}
+
+// LocalFlags returns the local FlagSet specifically set in the current command.
+func (c *Command) LocalFlags() *flag.FlagSet {
+ c.mergePersistentFlags()
+
+ if c.lflags == nil {
+ c.lflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ if c.flagErrorBuf == nil {
+ c.flagErrorBuf = new(bytes.Buffer)
+ }
+ c.lflags.SetOutput(c.flagErrorBuf)
+ }
+ c.lflags.SortFlags = c.Flags().SortFlags
+ if c.globNormFunc != nil {
+ c.lflags.SetNormalizeFunc(c.globNormFunc)
+ }
+
+ addToLocal := func(f *flag.Flag) {
+ if c.lflags.Lookup(f.Name) == nil && c.parentsPflags.Lookup(f.Name) == nil {
+ c.lflags.AddFlag(f)
+ }
+ }
+ c.Flags().VisitAll(addToLocal)
+ c.PersistentFlags().VisitAll(addToLocal)
+ return c.lflags
+}
+
+// InheritedFlags returns all flags which were inherited from parents commands.
+func (c *Command) InheritedFlags() *flag.FlagSet {
+ c.mergePersistentFlags()
+
+ if c.iflags == nil {
+ c.iflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ if c.flagErrorBuf == nil {
+ c.flagErrorBuf = new(bytes.Buffer)
+ }
+ c.iflags.SetOutput(c.flagErrorBuf)
+ }
+
+ local := c.LocalFlags()
+ if c.globNormFunc != nil {
+ c.iflags.SetNormalizeFunc(c.globNormFunc)
+ }
+
+ c.parentsPflags.VisitAll(func(f *flag.Flag) {
+ if c.iflags.Lookup(f.Name) == nil && local.Lookup(f.Name) == nil {
+ c.iflags.AddFlag(f)
+ }
+ })
+ return c.iflags
+}
+
+// NonInheritedFlags returns all flags which were not inherited from parent commands.
+func (c *Command) NonInheritedFlags() *flag.FlagSet {
+ return c.LocalFlags()
+}
+
+// PersistentFlags returns the persistent FlagSet specifically set in the current command.
+func (c *Command) PersistentFlags() *flag.FlagSet {
+ if c.pflags == nil {
+ c.pflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ if c.flagErrorBuf == nil {
+ c.flagErrorBuf = new(bytes.Buffer)
+ }
+ c.pflags.SetOutput(c.flagErrorBuf)
+ }
+ return c.pflags
+}
+
+// ResetFlags deletes all flags from command.
+func (c *Command) ResetFlags() {
+ c.flagErrorBuf = new(bytes.Buffer)
+ c.flagErrorBuf.Reset()
+ c.flags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ c.flags.SetOutput(c.flagErrorBuf)
+ c.pflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ c.pflags.SetOutput(c.flagErrorBuf)
+
+ c.lflags = nil
+ c.iflags = nil
+ c.parentsPflags = nil
+}
+
+// HasFlags checks if the command contains any flags (local plus persistent from the entire structure).
+func (c *Command) HasFlags() bool {
+ return c.Flags().HasFlags()
+}
+
+// HasPersistentFlags checks if the command contains persistent flags.
+func (c *Command) HasPersistentFlags() bool {
+ return c.PersistentFlags().HasFlags()
+}
+
+// HasLocalFlags checks if the command has flags specifically declared locally.
+func (c *Command) HasLocalFlags() bool {
+ return c.LocalFlags().HasFlags()
+}
+
+// HasInheritedFlags checks if the command has flags inherited from its parent command.
+func (c *Command) HasInheritedFlags() bool {
+ return c.InheritedFlags().HasFlags()
+}
+
+// HasAvailableFlags checks if the command contains any flags (local plus persistent from the entire
+// structure) which are not hidden or deprecated.
+func (c *Command) HasAvailableFlags() bool {
+ return c.Flags().HasAvailableFlags()
+}
+
+// HasAvailablePersistentFlags checks if the command contains persistent flags which are not hidden or deprecated.
+func (c *Command) HasAvailablePersistentFlags() bool {
+ return c.PersistentFlags().HasAvailableFlags()
+}
+
+// HasAvailableLocalFlags checks if the command has flags specifically declared locally which are not hidden
+// or deprecated.
+func (c *Command) HasAvailableLocalFlags() bool {
+ return c.LocalFlags().HasAvailableFlags()
+}
+
+// HasAvailableInheritedFlags checks if the command has flags inherited from its parent command which are
+// not hidden or deprecated.
+func (c *Command) HasAvailableInheritedFlags() bool {
+ return c.InheritedFlags().HasAvailableFlags()
+}
+
+// Flag climbs up the command tree looking for matching flag.
+func (c *Command) Flag(name string) (flag *flag.Flag) {
+ flag = c.Flags().Lookup(name)
+
+ if flag == nil {
+ flag = c.persistentFlag(name)
+ }
+
+ return
+}
+
+// Recursively find matching persistent flag.
+func (c *Command) persistentFlag(name string) (flag *flag.Flag) {
+ if c.HasPersistentFlags() {
+ flag = c.PersistentFlags().Lookup(name)
+ }
+
+ if flag == nil {
+ c.updateParentsPflags()
+ flag = c.parentsPflags.Lookup(name)
+ }
+ return
+}
+
+// ParseFlags parses persistent flag tree and local flags.
+func (c *Command) ParseFlags(args []string) error {
+ if c.DisableFlagParsing {
+ return nil
+ }
+
+ if c.flagErrorBuf == nil {
+ c.flagErrorBuf = new(bytes.Buffer)
+ }
+ beforeErrorBufLen := c.flagErrorBuf.Len()
+ c.mergePersistentFlags()
+ err := c.Flags().Parse(args)
+ // Print warnings if they occurred (e.g. deprecated flag messages).
+ if c.flagErrorBuf.Len()-beforeErrorBufLen > 0 && err == nil {
+ c.Print(c.flagErrorBuf.String())
+ }
+
+ return err
+}
+
+// Parent returns a commands parent command.
+func (c *Command) Parent() *Command {
+ return c.parent
+}
+
+// mergePersistentFlags merges c.PersistentFlags() to c.Flags()
+// and adds missing persistent flags of all parents.
+func (c *Command) mergePersistentFlags() {
+ c.updateParentsPflags()
+ c.Flags().AddFlagSet(c.PersistentFlags())
+ c.Flags().AddFlagSet(c.parentsPflags)
+}
+
+// updateParentsPflags updates c.parentsPflags by adding
+// new persistent flags of all parents.
+// If c.parentsPflags == nil, it makes new.
+func (c *Command) updateParentsPflags() {
+ if c.parentsPflags == nil {
+ c.parentsPflags = flag.NewFlagSet(c.Name(), flag.ContinueOnError)
+ c.parentsPflags.SetOutput(c.flagErrorBuf)
+ c.parentsPflags.SortFlags = false
+ }
+
+ if c.globNormFunc != nil {
+ c.parentsPflags.SetNormalizeFunc(c.globNormFunc)
+ }
+
+ c.Root().PersistentFlags().AddFlagSet(flag.CommandLine)
+
+ c.VisitParents(func(parent *Command) {
+ c.parentsPflags.AddFlagSet(parent.PersistentFlags())
+ })
+}
diff --git a/vendor/github.com/spf13/cobra/command_notwin.go b/vendor/github.com/spf13/cobra/command_notwin.go
new file mode 100644
index 00000000000..6159c1cc19d
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/command_notwin.go
@@ -0,0 +1,5 @@
+// +build !windows
+
+package cobra
+
+var preExecHookFn func(*Command)
diff --git a/vendor/github.com/spf13/cobra/command_win.go b/vendor/github.com/spf13/cobra/command_win.go
new file mode 100644
index 00000000000..edec728e4f5
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/command_win.go
@@ -0,0 +1,20 @@
+// +build windows
+
+package cobra
+
+import (
+ "os"
+ "time"
+
+ "github.com/inconshreveable/mousetrap"
+)
+
+var preExecHookFn = preExecHook
+
+func preExecHook(c *Command) {
+ if MousetrapHelpText != "" && mousetrap.StartedByExplorer() {
+ c.Print(MousetrapHelpText)
+ time.Sleep(5 * time.Second)
+ os.Exit(1)
+ }
+}
diff --git a/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/spf13/cobra/zsh_completions.go
new file mode 100644
index 00000000000..889c22e273c
--- /dev/null
+++ b/vendor/github.com/spf13/cobra/zsh_completions.go
@@ -0,0 +1,126 @@
+package cobra
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "os"
+ "strings"
+)
+
+// GenZshCompletionFile generates zsh completion file.
+func (c *Command) GenZshCompletionFile(filename string) error {
+ outFile, err := os.Create(filename)
+ if err != nil {
+ return err
+ }
+ defer outFile.Close()
+
+ return c.GenZshCompletion(outFile)
+}
+
+// GenZshCompletion generates a zsh completion file and writes to the passed writer.
+func (c *Command) GenZshCompletion(w io.Writer) error {
+ buf := new(bytes.Buffer)
+
+ writeHeader(buf, c)
+ maxDepth := maxDepth(c)
+ writeLevelMapping(buf, maxDepth)
+ writeLevelCases(buf, maxDepth, c)
+
+ _, err := buf.WriteTo(w)
+ return err
+}
+
+func writeHeader(w io.Writer, cmd *Command) {
+ fmt.Fprintf(w, "#compdef %s\n\n", cmd.Name())
+}
+
+func maxDepth(c *Command) int {
+ if len(c.Commands()) == 0 {
+ return 0
+ }
+ maxDepthSub := 0
+ for _, s := range c.Commands() {
+ subDepth := maxDepth(s)
+ if subDepth > maxDepthSub {
+ maxDepthSub = subDepth
+ }
+ }
+ return 1 + maxDepthSub
+}
+
+func writeLevelMapping(w io.Writer, numLevels int) {
+ fmt.Fprintln(w, `_arguments \`)
+ for i := 1; i <= numLevels; i++ {
+ fmt.Fprintf(w, ` '%d: :->level%d' \`, i, i)
+ fmt.Fprintln(w)
+ }
+ fmt.Fprintf(w, ` '%d: :%s'`, numLevels+1, "_files")
+ fmt.Fprintln(w)
+}
+
+func writeLevelCases(w io.Writer, maxDepth int, root *Command) {
+ fmt.Fprintln(w, "case $state in")
+ defer fmt.Fprintln(w, "esac")
+
+ for i := 1; i <= maxDepth; i++ {
+ fmt.Fprintf(w, " level%d)\n", i)
+ writeLevel(w, root, i)
+ fmt.Fprintln(w, " ;;")
+ }
+ fmt.Fprintln(w, " *)")
+ fmt.Fprintln(w, " _arguments '*: :_files'")
+ fmt.Fprintln(w, " ;;")
+}
+
+func writeLevel(w io.Writer, root *Command, i int) {
+ fmt.Fprintf(w, " case $words[%d] in\n", i)
+ defer fmt.Fprintln(w, " esac")
+
+ commands := filterByLevel(root, i)
+ byParent := groupByParent(commands)
+
+ for p, c := range byParent {
+ names := names(c)
+ fmt.Fprintf(w, " %s)\n", p)
+ fmt.Fprintf(w, " _arguments '%d: :(%s)'\n", i, strings.Join(names, " "))
+ fmt.Fprintln(w, " ;;")
+ }
+ fmt.Fprintln(w, " *)")
+ fmt.Fprintln(w, " _arguments '*: :_files'")
+ fmt.Fprintln(w, " ;;")
+
+}
+
+func filterByLevel(c *Command, l int) []*Command {
+ cs := make([]*Command, 0)
+ if l == 0 {
+ cs = append(cs, c)
+ return cs
+ }
+ for _, s := range c.Commands() {
+ cs = append(cs, filterByLevel(s, l-1)...)
+ }
+ return cs
+}
+
+func groupByParent(commands []*Command) map[string][]*Command {
+ m := make(map[string][]*Command)
+ for _, c := range commands {
+ parent := c.Parent()
+ if parent == nil {
+ continue
+ }
+ m[parent.Name()] = append(m[parent.Name()], c)
+ }
+ return m
+}
+
+func names(commands []*Command) []string {
+ ns := make([]string, len(commands))
+ for i, c := range commands {
+ ns[i] = c.Name()
+ }
+ return ns
+}
diff --git a/vendor/github.com/spf13/jwalterweatherman/.gitignore b/vendor/github.com/spf13/jwalterweatherman/.gitignore
new file mode 100644
index 00000000000..00268614f04
--- /dev/null
+++ b/vendor/github.com/spf13/jwalterweatherman/.gitignore
@@ -0,0 +1,22 @@
+# 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
diff --git a/vendor/github.com/spf13/jwalterweatherman/LICENSE b/vendor/github.com/spf13/jwalterweatherman/LICENSE
new file mode 100644
index 00000000000..4527efb9c06
--- /dev/null
+++ b/vendor/github.com/spf13/jwalterweatherman/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Steve Francia
+
+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.
\ No newline at end of file
diff --git a/vendor/github.com/spf13/jwalterweatherman/README.md b/vendor/github.com/spf13/jwalterweatherman/README.md
new file mode 100644
index 00000000000..d8cfd27ab93
--- /dev/null
+++ b/vendor/github.com/spf13/jwalterweatherman/README.md
@@ -0,0 +1,148 @@
+jWalterWeatherman
+=================
+
+Seamless printing to the terminal (stdout) and logging to a io.Writer
+(file) that’s as easy to use as fmt.Println.
+
+![and_that__s_why_you_always_leave_a_note_by_jonnyetc-d57q7um](https://cloud.githubusercontent.com/assets/173412/11002937/ccd01654-847d-11e5-828e-12ebaf582eaf.jpg)
+Graphic by [JonnyEtc](http://jonnyetc.deviantart.com/art/And-That-s-Why-You-Always-Leave-a-Note-315311422)
+
+JWW is primarily a wrapper around the excellent standard log library. It
+provides a few advantages over using the standard log library alone.
+
+1. Ready to go out of the box.
+2. One library for both printing to the terminal and logging (to files).
+3. Really easy to log to either a temp file or a file you specify.
+
+
+I really wanted a very straightforward library that could seamlessly do
+the following things.
+
+1. Replace all the println, printf, etc statements thought my code with
+ something more useful
+2. Allow the user to easily control what levels are printed to stdout
+3. Allow the user to easily control what levels are logged
+4. Provide an easy mechanism (like fmt.Println) to print info to the user
+ which can be easily logged as well
+5. Due to 2 & 3 provide easy verbose mode for output and logs
+6. Not have any unnecessary initialization cruft. Just use it.
+
+# Usage
+
+## Step 1. Use it
+Put calls throughout your source based on type of feedback.
+No initialization or setup needs to happen. Just start calling things.
+
+Available Loggers are:
+
+ * TRACE
+ * DEBUG
+ * INFO
+ * WARN
+ * ERROR
+ * CRITICAL
+ * FATAL
+
+These each are loggers based on the log standard library and follow the
+standard usage. Eg.
+
+```go
+ import (
+ jww "github.com/spf13/jwalterweatherman"
+ )
+
+ ...
+
+ if err != nil {
+
+ // This is a pretty serious error and the user should know about
+ // it. It will be printed to the terminal as well as logged under the
+ // default thresholds.
+
+ jww.ERROR.Println(err)
+ }
+
+ if err2 != nil {
+ // This error isn’t going to materially change the behavior of the
+ // application, but it’s something that may not be what the user
+ // expects. Under the default thresholds, Warn will be logged, but
+ // not printed to the terminal.
+
+ jww.WARN.Println(err2)
+ }
+
+ // Information that’s relevant to what’s happening, but not very
+ // important for the user. Under the default thresholds this will be
+ // discarded.
+
+ jww.INFO.Printf("information %q", response)
+
+```
+
+NOTE: You can also use the library in a non-global setting by creating an instance of a Notebook:
+
+```go
+notepad = jww.NewNotepad(jww.LevelInfo, jww.LevelTrace, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime)
+notepad.WARN.Println("Some warning"")
+```
+
+_Why 7 levels?_
+
+Maybe you think that 7 levels are too much for any application... and you
+are probably correct. Just because there are seven levels doesn’t mean
+that you should be using all 7 levels. Pick the right set for your needs.
+Remember they only have to mean something to your project.
+
+## Step 2. Optionally configure JWW
+
+Under the default thresholds :
+
+ * Debug, Trace & Info goto /dev/null
+ * Warn and above is logged (when a log file/io.Writer is provided)
+ * Error and above is printed to the terminal (stdout)
+
+### Changing the thresholds
+
+The threshold can be changed at any time, but will only affect calls that
+execute after the change was made.
+
+This is very useful if your application has a verbose mode. Of course you
+can decide what verbose means to you or even have multiple levels of
+verbosity.
+
+
+```go
+ import (
+ jww "github.com/spf13/jwalterweatherman"
+ )
+
+ if Verbose {
+ jww.SetLogThreshold(jww.LevelTrace)
+ jww.SetStdoutThreshold(jww.LevelInfo)
+ }
+```
+
+Note that JWW's own internal output uses log levels as well, so set the log
+level before making any other calls if you want to see what it's up to.
+
+
+### Setting a log file
+
+JWW can log to any `io.Writer`:
+
+
+```go
+
+ jww.SetLogOutput(customWriter)
+
+```
+
+
+# More information
+
+This is an early release. I’ve been using it for a while and this is the
+third interface I’ve tried. I like this one pretty well, but no guarantees
+that it won’t change a bit.
+
+I wrote this for use in [hugo](https://gohugo.io). If you are looking
+for a static website engine that’s super fast please checkout Hugo.
diff --git a/vendor/github.com/spf13/jwalterweatherman/default_notepad.go b/vendor/github.com/spf13/jwalterweatherman/default_notepad.go
new file mode 100644
index 00000000000..bcb763403c2
--- /dev/null
+++ b/vendor/github.com/spf13/jwalterweatherman/default_notepad.go
@@ -0,0 +1,113 @@
+// Copyright © 2016 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+package jwalterweatherman
+
+import (
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+)
+
+var (
+ TRACE *log.Logger
+ DEBUG *log.Logger
+ INFO *log.Logger
+ WARN *log.Logger
+ ERROR *log.Logger
+ CRITICAL *log.Logger
+ FATAL *log.Logger
+
+ LOG *log.Logger
+ FEEDBACK *Feedback
+
+ defaultNotepad *Notepad
+)
+
+func reloadDefaultNotepad() {
+ TRACE = defaultNotepad.TRACE
+ DEBUG = defaultNotepad.DEBUG
+ INFO = defaultNotepad.INFO
+ WARN = defaultNotepad.WARN
+ ERROR = defaultNotepad.ERROR
+ CRITICAL = defaultNotepad.CRITICAL
+ FATAL = defaultNotepad.FATAL
+
+ LOG = defaultNotepad.LOG
+ FEEDBACK = defaultNotepad.FEEDBACK
+}
+
+func init() {
+ defaultNotepad = NewNotepad(LevelError, LevelWarn, os.Stdout, ioutil.Discard, "", log.Ldate|log.Ltime)
+ reloadDefaultNotepad()
+}
+
+// SetLogThreshold set the log threshold for the default notepad. Trace by default.
+func SetLogThreshold(threshold Threshold) {
+ defaultNotepad.SetLogThreshold(threshold)
+ reloadDefaultNotepad()
+}
+
+// SetLogOutput set the log output for the default notepad. Discarded by default.
+func SetLogOutput(handle io.Writer) {
+ defaultNotepad.SetLogOutput(handle)
+ reloadDefaultNotepad()
+}
+
+// SetStdoutThreshold set the standard output threshold for the default notepad.
+// Info by default.
+func SetStdoutThreshold(threshold Threshold) {
+ defaultNotepad.SetStdoutThreshold(threshold)
+ reloadDefaultNotepad()
+}
+
+// SetPrefix set the prefix for the default logger. Empty by default.
+func SetPrefix(prefix string) {
+ defaultNotepad.SetPrefix(prefix)
+ reloadDefaultNotepad()
+}
+
+// SetFlags set the flags for the default logger. "log.Ldate | log.Ltime" by default.
+func SetFlags(flags int) {
+ defaultNotepad.SetFlags(flags)
+ reloadDefaultNotepad()
+}
+
+// Level returns the current global log threshold.
+func LogThreshold() Threshold {
+ return defaultNotepad.logThreshold
+}
+
+// Level returns the current global output threshold.
+func StdoutThreshold() Threshold {
+ return defaultNotepad.stdoutThreshold
+}
+
+// GetStdoutThreshold returns the defined Treshold for the log logger.
+func GetLogThreshold() Threshold {
+ return defaultNotepad.GetLogThreshold()
+}
+
+// GetStdoutThreshold returns the Treshold for the stdout logger.
+func GetStdoutThreshold() Threshold {
+ return defaultNotepad.GetStdoutThreshold()
+}
+
+// LogCountForLevel returns the number of log invocations for a given threshold.
+func LogCountForLevel(l Threshold) uint64 {
+ return defaultNotepad.LogCountForLevel(l)
+}
+
+// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations
+// greater than or equal to a given threshold.
+func LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 {
+ return defaultNotepad.LogCountForLevelsGreaterThanorEqualTo(threshold)
+}
+
+// ResetLogCounters resets the invocation counters for all levels.
+func ResetLogCounters() {
+ defaultNotepad.ResetLogCounters()
+}
diff --git a/vendor/github.com/spf13/jwalterweatherman/log_counter.go b/vendor/github.com/spf13/jwalterweatherman/log_counter.go
new file mode 100644
index 00000000000..11423ac41e1
--- /dev/null
+++ b/vendor/github.com/spf13/jwalterweatherman/log_counter.go
@@ -0,0 +1,55 @@
+// Copyright © 2016 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+package jwalterweatherman
+
+import (
+ "sync/atomic"
+)
+
+type logCounter struct {
+ counter uint64
+}
+
+func (c *logCounter) incr() {
+ atomic.AddUint64(&c.counter, 1)
+}
+
+func (c *logCounter) resetCounter() {
+ atomic.StoreUint64(&c.counter, 0)
+}
+
+func (c *logCounter) getCount() uint64 {
+ return atomic.LoadUint64(&c.counter)
+}
+
+func (c *logCounter) Write(p []byte) (n int, err error) {
+ c.incr()
+ return len(p), nil
+}
+
+// LogCountForLevel returns the number of log invocations for a given threshold.
+func (n *Notepad) LogCountForLevel(l Threshold) uint64 {
+ return n.logCounters[l].getCount()
+}
+
+// LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations
+// greater than or equal to a given threshold.
+func (n *Notepad) LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 {
+ var cnt uint64
+
+ for i := int(threshold); i < len(n.logCounters); i++ {
+ cnt += n.LogCountForLevel(Threshold(i))
+ }
+
+ return cnt
+}
+
+// ResetLogCounters resets the invocation counters for all levels.
+func (n *Notepad) ResetLogCounters() {
+ for _, np := range n.logCounters {
+ np.resetCounter()
+ }
+}
diff --git a/vendor/github.com/spf13/jwalterweatherman/notepad.go b/vendor/github.com/spf13/jwalterweatherman/notepad.go
new file mode 100644
index 00000000000..ae5aaf7114a
--- /dev/null
+++ b/vendor/github.com/spf13/jwalterweatherman/notepad.go
@@ -0,0 +1,194 @@
+// Copyright © 2016 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+package jwalterweatherman
+
+import (
+ "fmt"
+ "io"
+ "log"
+)
+
+type Threshold int
+
+func (t Threshold) String() string {
+ return prefixes[t]
+}
+
+const (
+ LevelTrace Threshold = iota
+ LevelDebug
+ LevelInfo
+ LevelWarn
+ LevelError
+ LevelCritical
+ LevelFatal
+)
+
+var prefixes map[Threshold]string = map[Threshold]string{
+ LevelTrace: "TRACE",
+ LevelDebug: "DEBUG",
+ LevelInfo: "INFO",
+ LevelWarn: "WARN",
+ LevelError: "ERROR",
+ LevelCritical: "CRITICAL",
+ LevelFatal: "FATAL",
+}
+
+// Notepad is where you leave a note!
+type Notepad struct {
+ TRACE *log.Logger
+ DEBUG *log.Logger
+ INFO *log.Logger
+ WARN *log.Logger
+ ERROR *log.Logger
+ CRITICAL *log.Logger
+ FATAL *log.Logger
+
+ LOG *log.Logger
+ FEEDBACK *Feedback
+
+ loggers [7]**log.Logger
+ logHandle io.Writer
+ outHandle io.Writer
+ logThreshold Threshold
+ stdoutThreshold Threshold
+ prefix string
+ flags int
+
+ // One per Threshold
+ logCounters [7]*logCounter
+}
+
+// NewNotepad create a new notepad.
+func NewNotepad(outThreshold Threshold, logThreshold Threshold, outHandle, logHandle io.Writer, prefix string, flags int) *Notepad {
+ n := &Notepad{}
+
+ n.loggers = [7]**log.Logger{&n.TRACE, &n.DEBUG, &n.INFO, &n.WARN, &n.ERROR, &n.CRITICAL, &n.FATAL}
+ n.outHandle = outHandle
+ n.logHandle = logHandle
+ n.stdoutThreshold = outThreshold
+ n.logThreshold = logThreshold
+
+ if len(prefix) != 0 {
+ n.prefix = "[" + prefix + "] "
+ } else {
+ n.prefix = ""
+ }
+
+ n.flags = flags
+
+ n.LOG = log.New(n.logHandle,
+ "LOG: ",
+ n.flags)
+ n.FEEDBACK = &Feedback{out: log.New(outHandle, "", 0), log: n.LOG}
+
+ n.init()
+ return n
+}
+
+// init creates the loggers for each level depending on the notepad thresholds.
+func (n *Notepad) init() {
+ logAndOut := io.MultiWriter(n.outHandle, n.logHandle)
+
+ for t, logger := range n.loggers {
+ threshold := Threshold(t)
+ counter := &logCounter{}
+ n.logCounters[t] = counter
+ prefix := n.prefix + threshold.String() + " "
+
+ switch {
+ case threshold >= n.logThreshold && threshold >= n.stdoutThreshold:
+ *logger = log.New(io.MultiWriter(counter, logAndOut), prefix, n.flags)
+
+ case threshold >= n.logThreshold:
+ *logger = log.New(io.MultiWriter(counter, n.logHandle), prefix, n.flags)
+
+ case threshold >= n.stdoutThreshold:
+ *logger = log.New(io.MultiWriter(counter, n.outHandle), prefix, n.flags)
+
+ default:
+ // counter doesn't care about prefix and flags, so don't use them
+ // for performance.
+ *logger = log.New(counter, "", 0)
+ }
+ }
+}
+
+// SetLogThreshold changes the threshold above which messages are written to the
+// log file.
+func (n *Notepad) SetLogThreshold(threshold Threshold) {
+ n.logThreshold = threshold
+ n.init()
+}
+
+// SetLogOutput changes the file where log messages are written.
+func (n *Notepad) SetLogOutput(handle io.Writer) {
+ n.logHandle = handle
+ n.init()
+}
+
+// GetStdoutThreshold returns the defined Treshold for the log logger.
+func (n *Notepad) GetLogThreshold() Threshold {
+ return n.logThreshold
+}
+
+// SetStdoutThreshold changes the threshold above which messages are written to the
+// standard output.
+func (n *Notepad) SetStdoutThreshold(threshold Threshold) {
+ n.stdoutThreshold = threshold
+ n.init()
+}
+
+// GetStdoutThreshold returns the Treshold for the stdout logger.
+func (n *Notepad) GetStdoutThreshold() Threshold {
+ return n.stdoutThreshold
+}
+
+// SetPrefix changes the prefix used by the notepad. Prefixes are displayed between
+// brackets at the beginning of the line. An empty prefix won't be displayed at all.
+func (n *Notepad) SetPrefix(prefix string) {
+ if len(prefix) != 0 {
+ n.prefix = "[" + prefix + "] "
+ } else {
+ n.prefix = ""
+ }
+ n.init()
+}
+
+// SetFlags choose which flags the logger will display (after prefix and message
+// level). See the package log for more informations on this.
+func (n *Notepad) SetFlags(flags int) {
+ n.flags = flags
+ n.init()
+}
+
+// Feedback writes plainly to the outHandle while
+// logging with the standard extra information (date, file, etc).
+type Feedback struct {
+ out *log.Logger
+ log *log.Logger
+}
+
+func (fb *Feedback) Println(v ...interface{}) {
+ fb.output(fmt.Sprintln(v...))
+}
+
+func (fb *Feedback) Printf(format string, v ...interface{}) {
+ fb.output(fmt.Sprintf(format, v...))
+}
+
+func (fb *Feedback) Print(v ...interface{}) {
+ fb.output(fmt.Sprint(v...))
+}
+
+func (fb *Feedback) output(s string) {
+ if fb.out != nil {
+ fb.out.Output(2, s)
+ }
+ if fb.log != nil {
+ fb.log.Output(2, s)
+ }
+}
diff --git a/vendor/github.com/spf13/pflag/.gitignore b/vendor/github.com/spf13/pflag/.gitignore
new file mode 100644
index 00000000000..c3da2901346
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/.gitignore
@@ -0,0 +1,2 @@
+.idea/*
+
diff --git a/vendor/github.com/spf13/pflag/.travis.yml b/vendor/github.com/spf13/pflag/.travis.yml
new file mode 100644
index 00000000000..f8a63b308ba
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/.travis.yml
@@ -0,0 +1,21 @@
+sudo: false
+
+language: go
+
+go:
+ - 1.7.3
+ - 1.8.1
+ - tip
+
+matrix:
+ allow_failures:
+ - go: tip
+
+install:
+ - go get github.com/golang/lint/golint
+ - export PATH=$GOPATH/bin:$PATH
+ - go install ./...
+
+script:
+ - verify/all.sh -v
+ - go test ./...
diff --git a/vendor/github.com/spf13/pflag/LICENSE b/vendor/github.com/spf13/pflag/LICENSE
new file mode 100644
index 00000000000..63ed1cfea1f
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/LICENSE
@@ -0,0 +1,28 @@
+Copyright (c) 2012 Alex Ogier. All rights reserved.
+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/spf13/pflag/README.md b/vendor/github.com/spf13/pflag/README.md
new file mode 100644
index 00000000000..b052414d129
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/README.md
@@ -0,0 +1,296 @@
+[![Build Status](https://travis-ci.org/spf13/pflag.svg?branch=master)](https://travis-ci.org/spf13/pflag)
+[![Go Report Card](https://goreportcard.com/badge/github.com/spf13/pflag)](https://goreportcard.com/report/github.com/spf13/pflag)
+[![GoDoc](https://godoc.org/github.com/spf13/pflag?status.svg)](https://godoc.org/github.com/spf13/pflag)
+
+## Description
+
+pflag is a drop-in replacement for Go's flag package, implementing
+POSIX/GNU-style --flags.
+
+pflag is compatible with the [GNU extensions to the POSIX recommendations
+for command-line options][1]. For a more precise description, see the
+"Command-line flag syntax" section below.
+
+[1]: http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
+
+pflag is available under the same style of BSD license as the Go language,
+which can be found in the LICENSE file.
+
+## Installation
+
+pflag is available using the standard `go get` command.
+
+Install by running:
+
+ go get github.com/spf13/pflag
+
+Run tests by running:
+
+ go test github.com/spf13/pflag
+
+## Usage
+
+pflag is a drop-in replacement of Go's native flag package. If you import
+pflag under the name "flag" then all code should continue to function
+with no changes.
+
+``` go
+import flag "github.com/spf13/pflag"
+```
+
+There is one exception to this: if you directly instantiate the Flag struct
+there is one more field "Shorthand" that you will need to set.
+Most code never instantiates this struct directly, and instead uses
+functions such as String(), BoolVar(), and Var(), and is therefore
+unaffected.
+
+Define flags using flag.String(), Bool(), Int(), etc.
+
+This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
+
+``` go
+var ip *int = flag.Int("flagname", 1234, "help message for flagname")
+```
+
+If you like, you can bind the flag to a variable using the Var() functions.
+
+``` go
+var flagvar int
+func init() {
+ flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
+}
+```
+
+Or you can create custom flags that satisfy the Value interface (with
+pointer receivers) and couple them to flag parsing by
+
+``` go
+flag.Var(&flagVal, "name", "help message for flagname")
+```
+
+For such flags, the default value is just the initial value of the variable.
+
+After all flags are defined, call
+
+``` go
+flag.Parse()
+```
+
+to parse the command line into the defined flags.
+
+Flags may then be used directly. If you're using the flags themselves,
+they are all pointers; if you bind to variables, they're values.
+
+``` go
+fmt.Println("ip has value ", *ip)
+fmt.Println("flagvar has value ", flagvar)
+```
+
+There are helpers function to get values later if you have the FlagSet but
+it was difficult to keep up with all of the flag pointers in your code.
+If you have a pflag.FlagSet with a flag called 'flagname' of type int you
+can use GetInt() to get the int value. But notice that 'flagname' must exist
+and it must be an int. GetString("flagname") will fail.
+
+``` go
+i, err := flagset.GetInt("flagname")
+```
+
+After parsing, the arguments after the flag are available as the
+slice flag.Args() or individually as flag.Arg(i).
+The arguments are indexed from 0 through flag.NArg()-1.
+
+The pflag package also defines some new functions that are not in flag,
+that give one-letter shorthands for flags. You can use these by appending
+'P' to the name of any function that defines a flag.
+
+``` go
+var ip = flag.IntP("flagname", "f", 1234, "help message")
+var flagvar bool
+func init() {
+ flag.BoolVarP(&flagvar, "boolname", "b", true, "help message")
+}
+flag.VarP(&flagVal, "varname", "v", "help message")
+```
+
+Shorthand letters can be used with single dashes on the command line.
+Boolean shorthand flags can be combined with other shorthand flags.
+
+The default set of command-line flags is controlled by
+top-level functions. The FlagSet type allows one to define
+independent sets of flags, such as to implement subcommands
+in a command-line interface. The methods of FlagSet are
+analogous to the top-level functions for the command-line
+flag set.
+
+## Setting no option default values for flags
+
+After you create a flag it is possible to set the pflag.NoOptDefVal for
+the given flag. Doing this changes the meaning of the flag slightly. If
+a flag has a NoOptDefVal and the flag is set on the command line without
+an option the flag will be set to the NoOptDefVal. For example given:
+
+``` go
+var ip = flag.IntP("flagname", "f", 1234, "help message")
+flag.Lookup("flagname").NoOptDefVal = "4321"
+```
+
+Would result in something like
+
+| Parsed Arguments | Resulting Value |
+| ------------- | ------------- |
+| --flagname=1357 | ip=1357 |
+| --flagname | ip=4321 |
+| [nothing] | ip=1234 |
+
+## Command line flag syntax
+
+```
+--flag // boolean flags, or flags with no option default values
+--flag x // only on flags without a default value
+--flag=x
+```
+
+Unlike the flag package, a single dash before an option means something
+different than a double dash. Single dashes signify a series of shorthand
+letters for flags. All but the last shorthand letter must be boolean flags
+or a flag with a default value
+
+```
+// boolean or flags where the 'no option default value' is set
+-f
+-f=true
+-abc
+but
+-b true is INVALID
+
+// non-boolean and flags without a 'no option default value'
+-n 1234
+-n=1234
+-n1234
+
+// mixed
+-abcs "hello"
+-absd="hello"
+-abcs1234
+```
+
+Flag parsing stops after the terminator "--". Unlike the flag package,
+flags can be interspersed with arguments anywhere on the command line
+before this terminator.
+
+Integer flags accept 1234, 0664, 0x1234 and may be negative.
+Boolean flags (in their long form) accept 1, 0, t, f, true, false,
+TRUE, FALSE, True, False.
+Duration flags accept any input valid for time.ParseDuration.
+
+## Mutating or "Normalizing" Flag names
+
+It is possible to set a custom flag name 'normalization function.' It allows flag names to be mutated both when created in the code and when used on the command line to some 'normalized' form. The 'normalized' form is used for comparison. Two examples of using the custom normalization func follow.
+
+**Example #1**: You want -, _, and . in flags to compare the same. aka --my-flag == --my_flag == --my.flag
+
+``` go
+func wordSepNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
+ from := []string{"-", "_"}
+ to := "."
+ for _, sep := range from {
+ name = strings.Replace(name, sep, to, -1)
+ }
+ return pflag.NormalizedName(name)
+}
+
+myFlagSet.SetNormalizeFunc(wordSepNormalizeFunc)
+```
+
+**Example #2**: You want to alias two flags. aka --old-flag-name == --new-flag-name
+
+``` go
+func aliasNormalizeFunc(f *pflag.FlagSet, name string) pflag.NormalizedName {
+ switch name {
+ case "old-flag-name":
+ name = "new-flag-name"
+ break
+ }
+ return pflag.NormalizedName(name)
+}
+
+myFlagSet.SetNormalizeFunc(aliasNormalizeFunc)
+```
+
+## Deprecating a flag or its shorthand
+It is possible to deprecate a flag, or just its shorthand. Deprecating a flag/shorthand hides it from help text and prints a usage message when the deprecated flag/shorthand is used.
+
+**Example #1**: You want to deprecate a flag named "badflag" as well as inform the users what flag they should use instead.
+```go
+// deprecate a flag by specifying its name and a usage message
+flags.MarkDeprecated("badflag", "please use --good-flag instead")
+```
+This hides "badflag" from help text, and prints `Flag --badflag has been deprecated, please use --good-flag instead` when "badflag" is used.
+
+**Example #2**: You want to keep a flag name "noshorthandflag" but deprecate its shortname "n".
+```go
+// deprecate a flag shorthand by specifying its flag name and a usage message
+flags.MarkShorthandDeprecated("noshorthandflag", "please use --noshorthandflag only")
+```
+This hides the shortname "n" from help text, and prints `Flag shorthand -n has been deprecated, please use --noshorthandflag only` when the shorthand "n" is used.
+
+Note that usage message is essential here, and it should not be empty.
+
+## Hidden flags
+It is possible to mark a flag as hidden, meaning it will still function as normal, however will not show up in usage/help text.
+
+**Example**: You have a flag named "secretFlag" that you need for internal use only and don't want it showing up in help text, or for its usage text to be available.
+```go
+// hide a flag by specifying its name
+flags.MarkHidden("secretFlag")
+```
+
+## Disable sorting of flags
+`pflag` allows you to disable sorting of flags for help and usage message.
+
+**Example**:
+```go
+flags.BoolP("verbose", "v", false, "verbose output")
+flags.String("coolflag", "yeaah", "it's really cool flag")
+flags.Int("usefulflag", 777, "sometimes it's very useful")
+flags.SortFlags = false
+flags.PrintDefaults()
+```
+**Output**:
+```
+ -v, --verbose verbose output
+ --coolflag string it's really cool flag (default "yeaah")
+ --usefulflag int sometimes it's very useful (default 777)
+```
+
+
+## Supporting Go flags when using pflag
+In order to support flags defined using Go's `flag` package, they must be added to the `pflag` flagset. This is usually necessary
+to support flags defined by third-party dependencies (e.g. `golang/glog`).
+
+**Example**: You want to add the Go flags to the `CommandLine` flagset
+```go
+import (
+ goflag "flag"
+ flag "github.com/spf13/pflag"
+)
+
+var ip *int = flag.Int("flagname", 1234, "help message for flagname")
+
+func main() {
+ flag.CommandLine.AddGoFlagSet(goflag.CommandLine)
+ flag.Parse()
+}
+```
+
+## More info
+
+You can see the full reference documentation of the pflag package
+[at godoc.org][3], or through go's standard documentation system by
+running `godoc -http=:6060` and browsing to
+[http://localhost:6060/pkg/github.com/spf13/pflag][2] after
+installation.
+
+[2]: http://localhost:6060/pkg/github.com/spf13/pflag
+[3]: http://godoc.org/github.com/spf13/pflag
diff --git a/vendor/github.com/spf13/pflag/bool.go b/vendor/github.com/spf13/pflag/bool.go
new file mode 100644
index 00000000000..c4c5c0bfda0
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/bool.go
@@ -0,0 +1,94 @@
+package pflag
+
+import "strconv"
+
+// optional interface to indicate boolean flags that can be
+// supplied without "=value" text
+type boolFlag interface {
+ Value
+ IsBoolFlag() bool
+}
+
+// -- bool Value
+type boolValue bool
+
+func newBoolValue(val bool, p *bool) *boolValue {
+ *p = val
+ return (*boolValue)(p)
+}
+
+func (b *boolValue) Set(s string) error {
+ v, err := strconv.ParseBool(s)
+ *b = boolValue(v)
+ return err
+}
+
+func (b *boolValue) Type() string {
+ return "bool"
+}
+
+func (b *boolValue) String() string { return strconv.FormatBool(bool(*b)) }
+
+func (b *boolValue) IsBoolFlag() bool { return true }
+
+func boolConv(sval string) (interface{}, error) {
+ return strconv.ParseBool(sval)
+}
+
+// GetBool return the bool value of a flag with the given name
+func (f *FlagSet) GetBool(name string) (bool, error) {
+ val, err := f.getFlagType(name, "bool", boolConv)
+ if err != nil {
+ return false, err
+ }
+ return val.(bool), nil
+}
+
+// BoolVar defines a bool flag with specified name, default value, and usage string.
+// The argument p points to a bool variable in which to store the value of the flag.
+func (f *FlagSet) BoolVar(p *bool, name string, value bool, usage string) {
+ f.BoolVarP(p, name, "", value, usage)
+}
+
+// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BoolVarP(p *bool, name, shorthand string, value bool, usage string) {
+ flag := f.VarPF(newBoolValue(value, p), name, shorthand, usage)
+ flag.NoOptDefVal = "true"
+}
+
+// BoolVar defines a bool flag with specified name, default value, and usage string.
+// The argument p points to a bool variable in which to store the value of the flag.
+func BoolVar(p *bool, name string, value bool, usage string) {
+ BoolVarP(p, name, "", value, usage)
+}
+
+// BoolVarP is like BoolVar, but accepts a shorthand letter that can be used after a single dash.
+func BoolVarP(p *bool, name, shorthand string, value bool, usage string) {
+ flag := CommandLine.VarPF(newBoolValue(value, p), name, shorthand, usage)
+ flag.NoOptDefVal = "true"
+}
+
+// Bool defines a bool flag with specified name, default value, and usage string.
+// The return value is the address of a bool variable that stores the value of the flag.
+func (f *FlagSet) Bool(name string, value bool, usage string) *bool {
+ return f.BoolP(name, "", value, usage)
+}
+
+// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BoolP(name, shorthand string, value bool, usage string) *bool {
+ p := new(bool)
+ f.BoolVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Bool defines a bool flag with specified name, default value, and usage string.
+// The return value is the address of a bool variable that stores the value of the flag.
+func Bool(name string, value bool, usage string) *bool {
+ return BoolP(name, "", value, usage)
+}
+
+// BoolP is like Bool, but accepts a shorthand letter that can be used after a single dash.
+func BoolP(name, shorthand string, value bool, usage string) *bool {
+ b := CommandLine.BoolP(name, shorthand, value, usage)
+ return b
+}
diff --git a/vendor/github.com/spf13/pflag/bool_slice.go b/vendor/github.com/spf13/pflag/bool_slice.go
new file mode 100644
index 00000000000..5af02f1a75a
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/bool_slice.go
@@ -0,0 +1,147 @@
+package pflag
+
+import (
+ "io"
+ "strconv"
+ "strings"
+)
+
+// -- boolSlice Value
+type boolSliceValue struct {
+ value *[]bool
+ changed bool
+}
+
+func newBoolSliceValue(val []bool, p *[]bool) *boolSliceValue {
+ bsv := new(boolSliceValue)
+ bsv.value = p
+ *bsv.value = val
+ return bsv
+}
+
+// Set converts, and assigns, the comma-separated boolean argument string representation as the []bool value of this flag.
+// If Set is called on a flag that already has a []bool assigned, the newly converted values will be appended.
+func (s *boolSliceValue) Set(val string) error {
+
+ // remove all quote characters
+ rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "")
+
+ // read flag arguments with CSV parser
+ boolStrSlice, err := readAsCSV(rmQuote.Replace(val))
+ if err != nil && err != io.EOF {
+ return err
+ }
+
+ // parse boolean values into slice
+ out := make([]bool, 0, len(boolStrSlice))
+ for _, boolStr := range boolStrSlice {
+ b, err := strconv.ParseBool(strings.TrimSpace(boolStr))
+ if err != nil {
+ return err
+ }
+ out = append(out, b)
+ }
+
+ if !s.changed {
+ *s.value = out
+ } else {
+ *s.value = append(*s.value, out...)
+ }
+
+ s.changed = true
+
+ return nil
+}
+
+// Type returns a string that uniquely represents this flag's type.
+func (s *boolSliceValue) Type() string {
+ return "boolSlice"
+}
+
+// String defines a "native" format for this boolean slice flag value.
+func (s *boolSliceValue) String() string {
+
+ boolStrSlice := make([]string, len(*s.value))
+ for i, b := range *s.value {
+ boolStrSlice[i] = strconv.FormatBool(b)
+ }
+
+ out, _ := writeAsCSV(boolStrSlice)
+
+ return "[" + out + "]"
+}
+
+func boolSliceConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // Empty string would cause a slice with one (empty) entry
+ if len(val) == 0 {
+ return []bool{}, nil
+ }
+ ss := strings.Split(val, ",")
+ out := make([]bool, len(ss))
+ for i, t := range ss {
+ var err error
+ out[i], err = strconv.ParseBool(t)
+ if err != nil {
+ return nil, err
+ }
+ }
+ return out, nil
+}
+
+// GetBoolSlice returns the []bool value of a flag with the given name.
+func (f *FlagSet) GetBoolSlice(name string) ([]bool, error) {
+ val, err := f.getFlagType(name, "boolSlice", boolSliceConv)
+ if err != nil {
+ return []bool{}, err
+ }
+ return val.([]bool), nil
+}
+
+// BoolSliceVar defines a boolSlice flag with specified name, default value, and usage string.
+// The argument p points to a []bool variable in which to store the value of the flag.
+func (f *FlagSet) BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
+ f.VarP(newBoolSliceValue(value, p), name, "", usage)
+}
+
+// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) {
+ f.VarP(newBoolSliceValue(value, p), name, shorthand, usage)
+}
+
+// BoolSliceVar defines a []bool flag with specified name, default value, and usage string.
+// The argument p points to a []bool variable in which to store the value of the flag.
+func BoolSliceVar(p *[]bool, name string, value []bool, usage string) {
+ CommandLine.VarP(newBoolSliceValue(value, p), name, "", usage)
+}
+
+// BoolSliceVarP is like BoolSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func BoolSliceVarP(p *[]bool, name, shorthand string, value []bool, usage string) {
+ CommandLine.VarP(newBoolSliceValue(value, p), name, shorthand, usage)
+}
+
+// BoolSlice defines a []bool flag with specified name, default value, and usage string.
+// The return value is the address of a []bool variable that stores the value of the flag.
+func (f *FlagSet) BoolSlice(name string, value []bool, usage string) *[]bool {
+ p := []bool{}
+ f.BoolSliceVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool {
+ p := []bool{}
+ f.BoolSliceVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// BoolSlice defines a []bool flag with specified name, default value, and usage string.
+// The return value is the address of a []bool variable that stores the value of the flag.
+func BoolSlice(name string, value []bool, usage string) *[]bool {
+ return CommandLine.BoolSliceP(name, "", value, usage)
+}
+
+// BoolSliceP is like BoolSlice, but accepts a shorthand letter that can be used after a single dash.
+func BoolSliceP(name, shorthand string, value []bool, usage string) *[]bool {
+ return CommandLine.BoolSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/bytes.go b/vendor/github.com/spf13/pflag/bytes.go
new file mode 100644
index 00000000000..67d53045708
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/bytes.go
@@ -0,0 +1,209 @@
+package pflag
+
+import (
+ "encoding/base64"
+ "encoding/hex"
+ "fmt"
+ "strings"
+)
+
+// BytesHex adapts []byte for use as a flag. Value of flag is HEX encoded
+type bytesHexValue []byte
+
+// String implements pflag.Value.String.
+func (bytesHex bytesHexValue) String() string {
+ return fmt.Sprintf("%X", []byte(bytesHex))
+}
+
+// Set implements pflag.Value.Set.
+func (bytesHex *bytesHexValue) Set(value string) error {
+ bin, err := hex.DecodeString(strings.TrimSpace(value))
+
+ if err != nil {
+ return err
+ }
+
+ *bytesHex = bin
+
+ return nil
+}
+
+// Type implements pflag.Value.Type.
+func (*bytesHexValue) Type() string {
+ return "bytesHex"
+}
+
+func newBytesHexValue(val []byte, p *[]byte) *bytesHexValue {
+ *p = val
+ return (*bytesHexValue)(p)
+}
+
+func bytesHexConv(sval string) (interface{}, error) {
+
+ bin, err := hex.DecodeString(sval)
+
+ if err == nil {
+ return bin, nil
+ }
+
+ return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err)
+}
+
+// GetBytesHex return the []byte value of a flag with the given name
+func (f *FlagSet) GetBytesHex(name string) ([]byte, error) {
+ val, err := f.getFlagType(name, "bytesHex", bytesHexConv)
+
+ if err != nil {
+ return []byte{}, err
+ }
+
+ return val.([]byte), nil
+}
+
+// BytesHexVar defines an []byte flag with specified name, default value, and usage string.
+// The argument p points to an []byte variable in which to store the value of the flag.
+func (f *FlagSet) BytesHexVar(p *[]byte, name string, value []byte, usage string) {
+ f.VarP(newBytesHexValue(value, p), name, "", usage)
+}
+
+// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) {
+ f.VarP(newBytesHexValue(value, p), name, shorthand, usage)
+}
+
+// BytesHexVar defines an []byte flag with specified name, default value, and usage string.
+// The argument p points to an []byte variable in which to store the value of the flag.
+func BytesHexVar(p *[]byte, name string, value []byte, usage string) {
+ CommandLine.VarP(newBytesHexValue(value, p), name, "", usage)
+}
+
+// BytesHexVarP is like BytesHexVar, but accepts a shorthand letter that can be used after a single dash.
+func BytesHexVarP(p *[]byte, name, shorthand string, value []byte, usage string) {
+ CommandLine.VarP(newBytesHexValue(value, p), name, shorthand, usage)
+}
+
+// BytesHex defines an []byte flag with specified name, default value, and usage string.
+// The return value is the address of an []byte variable that stores the value of the flag.
+func (f *FlagSet) BytesHex(name string, value []byte, usage string) *[]byte {
+ p := new([]byte)
+ f.BytesHexVarP(p, name, "", value, usage)
+ return p
+}
+
+// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BytesHexP(name, shorthand string, value []byte, usage string) *[]byte {
+ p := new([]byte)
+ f.BytesHexVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// BytesHex defines an []byte flag with specified name, default value, and usage string.
+// The return value is the address of an []byte variable that stores the value of the flag.
+func BytesHex(name string, value []byte, usage string) *[]byte {
+ return CommandLine.BytesHexP(name, "", value, usage)
+}
+
+// BytesHexP is like BytesHex, but accepts a shorthand letter that can be used after a single dash.
+func BytesHexP(name, shorthand string, value []byte, usage string) *[]byte {
+ return CommandLine.BytesHexP(name, shorthand, value, usage)
+}
+
+// BytesBase64 adapts []byte for use as a flag. Value of flag is Base64 encoded
+type bytesBase64Value []byte
+
+// String implements pflag.Value.String.
+func (bytesBase64 bytesBase64Value) String() string {
+ return base64.StdEncoding.EncodeToString([]byte(bytesBase64))
+}
+
+// Set implements pflag.Value.Set.
+func (bytesBase64 *bytesBase64Value) Set(value string) error {
+ bin, err := base64.StdEncoding.DecodeString(strings.TrimSpace(value))
+
+ if err != nil {
+ return err
+ }
+
+ *bytesBase64 = bin
+
+ return nil
+}
+
+// Type implements pflag.Value.Type.
+func (*bytesBase64Value) Type() string {
+ return "bytesBase64"
+}
+
+func newBytesBase64Value(val []byte, p *[]byte) *bytesBase64Value {
+ *p = val
+ return (*bytesBase64Value)(p)
+}
+
+func bytesBase64ValueConv(sval string) (interface{}, error) {
+
+ bin, err := base64.StdEncoding.DecodeString(sval)
+ if err == nil {
+ return bin, nil
+ }
+
+ return nil, fmt.Errorf("invalid string being converted to Bytes: %s %s", sval, err)
+}
+
+// GetBytesBase64 return the []byte value of a flag with the given name
+func (f *FlagSet) GetBytesBase64(name string) ([]byte, error) {
+ val, err := f.getFlagType(name, "bytesBase64", bytesBase64ValueConv)
+
+ if err != nil {
+ return []byte{}, err
+ }
+
+ return val.([]byte), nil
+}
+
+// BytesBase64Var defines an []byte flag with specified name, default value, and usage string.
+// The argument p points to an []byte variable in which to store the value of the flag.
+func (f *FlagSet) BytesBase64Var(p *[]byte, name string, value []byte, usage string) {
+ f.VarP(newBytesBase64Value(value, p), name, "", usage)
+}
+
+// BytesBase64VarP is like BytesBase64Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, usage string) {
+ f.VarP(newBytesBase64Value(value, p), name, shorthand, usage)
+}
+
+// BytesBase64Var defines an []byte flag with specified name, default value, and usage string.
+// The argument p points to an []byte variable in which to store the value of the flag.
+func BytesBase64Var(p *[]byte, name string, value []byte, usage string) {
+ CommandLine.VarP(newBytesBase64Value(value, p), name, "", usage)
+}
+
+// BytesBase64VarP is like BytesBase64Var, but accepts a shorthand letter that can be used after a single dash.
+func BytesBase64VarP(p *[]byte, name, shorthand string, value []byte, usage string) {
+ CommandLine.VarP(newBytesBase64Value(value, p), name, shorthand, usage)
+}
+
+// BytesBase64 defines an []byte flag with specified name, default value, and usage string.
+// The return value is the address of an []byte variable that stores the value of the flag.
+func (f *FlagSet) BytesBase64(name string, value []byte, usage string) *[]byte {
+ p := new([]byte)
+ f.BytesBase64VarP(p, name, "", value, usage)
+ return p
+}
+
+// BytesBase64P is like BytesBase64, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) BytesBase64P(name, shorthand string, value []byte, usage string) *[]byte {
+ p := new([]byte)
+ f.BytesBase64VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// BytesBase64 defines an []byte flag with specified name, default value, and usage string.
+// The return value is the address of an []byte variable that stores the value of the flag.
+func BytesBase64(name string, value []byte, usage string) *[]byte {
+ return CommandLine.BytesBase64P(name, "", value, usage)
+}
+
+// BytesBase64P is like BytesBase64, but accepts a shorthand letter that can be used after a single dash.
+func BytesBase64P(name, shorthand string, value []byte, usage string) *[]byte {
+ return CommandLine.BytesBase64P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/count.go b/vendor/github.com/spf13/pflag/count.go
new file mode 100644
index 00000000000..aa126e44d1c
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/count.go
@@ -0,0 +1,96 @@
+package pflag
+
+import "strconv"
+
+// -- count Value
+type countValue int
+
+func newCountValue(val int, p *int) *countValue {
+ *p = val
+ return (*countValue)(p)
+}
+
+func (i *countValue) Set(s string) error {
+ // "+1" means that no specific value was passed, so increment
+ if s == "+1" {
+ *i = countValue(*i + 1)
+ return nil
+ }
+ v, err := strconv.ParseInt(s, 0, 0)
+ *i = countValue(v)
+ return err
+}
+
+func (i *countValue) Type() string {
+ return "count"
+}
+
+func (i *countValue) String() string { return strconv.Itoa(int(*i)) }
+
+func countConv(sval string) (interface{}, error) {
+ i, err := strconv.Atoi(sval)
+ if err != nil {
+ return nil, err
+ }
+ return i, nil
+}
+
+// GetCount return the int value of a flag with the given name
+func (f *FlagSet) GetCount(name string) (int, error) {
+ val, err := f.getFlagType(name, "count", countConv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(int), nil
+}
+
+// CountVar defines a count flag with specified name, default value, and usage string.
+// The argument p points to an int variable in which to store the value of the flag.
+// A count flag will add 1 to its value evey time it is found on the command line
+func (f *FlagSet) CountVar(p *int, name string, usage string) {
+ f.CountVarP(p, name, "", usage)
+}
+
+// CountVarP is like CountVar only take a shorthand for the flag name.
+func (f *FlagSet) CountVarP(p *int, name, shorthand string, usage string) {
+ flag := f.VarPF(newCountValue(0, p), name, shorthand, usage)
+ flag.NoOptDefVal = "+1"
+}
+
+// CountVar like CountVar only the flag is placed on the CommandLine instead of a given flag set
+func CountVar(p *int, name string, usage string) {
+ CommandLine.CountVar(p, name, usage)
+}
+
+// CountVarP is like CountVar only take a shorthand for the flag name.
+func CountVarP(p *int, name, shorthand string, usage string) {
+ CommandLine.CountVarP(p, name, shorthand, usage)
+}
+
+// Count defines a count flag with specified name, default value, and usage string.
+// The return value is the address of an int variable that stores the value of the flag.
+// A count flag will add 1 to its value evey time it is found on the command line
+func (f *FlagSet) Count(name string, usage string) *int {
+ p := new(int)
+ f.CountVarP(p, name, "", usage)
+ return p
+}
+
+// CountP is like Count only takes a shorthand for the flag name.
+func (f *FlagSet) CountP(name, shorthand string, usage string) *int {
+ p := new(int)
+ f.CountVarP(p, name, shorthand, usage)
+ return p
+}
+
+// Count defines a count flag with specified name, default value, and usage string.
+// The return value is the address of an int variable that stores the value of the flag.
+// A count flag will add 1 to its value evey time it is found on the command line
+func Count(name string, usage string) *int {
+ return CommandLine.CountP(name, "", usage)
+}
+
+// CountP is like Count only takes a shorthand for the flag name.
+func CountP(name, shorthand string, usage string) *int {
+ return CommandLine.CountP(name, shorthand, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/duration.go b/vendor/github.com/spf13/pflag/duration.go
new file mode 100644
index 00000000000..e9debef88ee
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/duration.go
@@ -0,0 +1,86 @@
+package pflag
+
+import (
+ "time"
+)
+
+// -- time.Duration Value
+type durationValue time.Duration
+
+func newDurationValue(val time.Duration, p *time.Duration) *durationValue {
+ *p = val
+ return (*durationValue)(p)
+}
+
+func (d *durationValue) Set(s string) error {
+ v, err := time.ParseDuration(s)
+ *d = durationValue(v)
+ return err
+}
+
+func (d *durationValue) Type() string {
+ return "duration"
+}
+
+func (d *durationValue) String() string { return (*time.Duration)(d).String() }
+
+func durationConv(sval string) (interface{}, error) {
+ return time.ParseDuration(sval)
+}
+
+// GetDuration return the duration value of a flag with the given name
+func (f *FlagSet) GetDuration(name string) (time.Duration, error) {
+ val, err := f.getFlagType(name, "duration", durationConv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(time.Duration), nil
+}
+
+// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
+// The argument p points to a time.Duration variable in which to store the value of the flag.
+func (f *FlagSet) DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
+ f.VarP(newDurationValue(value, p), name, "", usage)
+}
+
+// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) {
+ f.VarP(newDurationValue(value, p), name, shorthand, usage)
+}
+
+// DurationVar defines a time.Duration flag with specified name, default value, and usage string.
+// The argument p points to a time.Duration variable in which to store the value of the flag.
+func DurationVar(p *time.Duration, name string, value time.Duration, usage string) {
+ CommandLine.VarP(newDurationValue(value, p), name, "", usage)
+}
+
+// DurationVarP is like DurationVar, but accepts a shorthand letter that can be used after a single dash.
+func DurationVarP(p *time.Duration, name, shorthand string, value time.Duration, usage string) {
+ CommandLine.VarP(newDurationValue(value, p), name, shorthand, usage)
+}
+
+// Duration defines a time.Duration flag with specified name, default value, and usage string.
+// The return value is the address of a time.Duration variable that stores the value of the flag.
+func (f *FlagSet) Duration(name string, value time.Duration, usage string) *time.Duration {
+ p := new(time.Duration)
+ f.DurationVarP(p, name, "", value, usage)
+ return p
+}
+
+// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration {
+ p := new(time.Duration)
+ f.DurationVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Duration defines a time.Duration flag with specified name, default value, and usage string.
+// The return value is the address of a time.Duration variable that stores the value of the flag.
+func Duration(name string, value time.Duration, usage string) *time.Duration {
+ return CommandLine.DurationP(name, "", value, usage)
+}
+
+// DurationP is like Duration, but accepts a shorthand letter that can be used after a single dash.
+func DurationP(name, shorthand string, value time.Duration, usage string) *time.Duration {
+ return CommandLine.DurationP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/duration_slice.go b/vendor/github.com/spf13/pflag/duration_slice.go
new file mode 100644
index 00000000000..52c6b6dc104
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/duration_slice.go
@@ -0,0 +1,128 @@
+package pflag
+
+import (
+ "fmt"
+ "strings"
+ "time"
+)
+
+// -- durationSlice Value
+type durationSliceValue struct {
+ value *[]time.Duration
+ changed bool
+}
+
+func newDurationSliceValue(val []time.Duration, p *[]time.Duration) *durationSliceValue {
+ dsv := new(durationSliceValue)
+ dsv.value = p
+ *dsv.value = val
+ return dsv
+}
+
+func (s *durationSliceValue) Set(val string) error {
+ ss := strings.Split(val, ",")
+ out := make([]time.Duration, len(ss))
+ for i, d := range ss {
+ var err error
+ out[i], err = time.ParseDuration(d)
+ if err != nil {
+ return err
+ }
+
+ }
+ if !s.changed {
+ *s.value = out
+ } else {
+ *s.value = append(*s.value, out...)
+ }
+ s.changed = true
+ return nil
+}
+
+func (s *durationSliceValue) Type() string {
+ return "durationSlice"
+}
+
+func (s *durationSliceValue) String() string {
+ out := make([]string, len(*s.value))
+ for i, d := range *s.value {
+ out[i] = fmt.Sprintf("%s", d)
+ }
+ return "[" + strings.Join(out, ",") + "]"
+}
+
+func durationSliceConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // Empty string would cause a slice with one (empty) entry
+ if len(val) == 0 {
+ return []time.Duration{}, nil
+ }
+ ss := strings.Split(val, ",")
+ out := make([]time.Duration, len(ss))
+ for i, d := range ss {
+ var err error
+ out[i], err = time.ParseDuration(d)
+ if err != nil {
+ return nil, err
+ }
+
+ }
+ return out, nil
+}
+
+// GetDurationSlice returns the []time.Duration value of a flag with the given name
+func (f *FlagSet) GetDurationSlice(name string) ([]time.Duration, error) {
+ val, err := f.getFlagType(name, "durationSlice", durationSliceConv)
+ if err != nil {
+ return []time.Duration{}, err
+ }
+ return val.([]time.Duration), nil
+}
+
+// DurationSliceVar defines a durationSlice flag with specified name, default value, and usage string.
+// The argument p points to a []time.Duration variable in which to store the value of the flag.
+func (f *FlagSet) DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
+ f.VarP(newDurationSliceValue(value, p), name, "", usage)
+}
+
+// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
+ f.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
+}
+
+// DurationSliceVar defines a duration[] flag with specified name, default value, and usage string.
+// The argument p points to a duration[] variable in which to store the value of the flag.
+func DurationSliceVar(p *[]time.Duration, name string, value []time.Duration, usage string) {
+ CommandLine.VarP(newDurationSliceValue(value, p), name, "", usage)
+}
+
+// DurationSliceVarP is like DurationSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func DurationSliceVarP(p *[]time.Duration, name, shorthand string, value []time.Duration, usage string) {
+ CommandLine.VarP(newDurationSliceValue(value, p), name, shorthand, usage)
+}
+
+// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
+// The return value is the address of a []time.Duration variable that stores the value of the flag.
+func (f *FlagSet) DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
+ p := []time.Duration{}
+ f.DurationSliceVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
+ p := []time.Duration{}
+ f.DurationSliceVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// DurationSlice defines a []time.Duration flag with specified name, default value, and usage string.
+// The return value is the address of a []time.Duration variable that stores the value of the flag.
+func DurationSlice(name string, value []time.Duration, usage string) *[]time.Duration {
+ return CommandLine.DurationSliceP(name, "", value, usage)
+}
+
+// DurationSliceP is like DurationSlice, but accepts a shorthand letter that can be used after a single dash.
+func DurationSliceP(name, shorthand string, value []time.Duration, usage string) *[]time.Duration {
+ return CommandLine.DurationSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/flag.go b/vendor/github.com/spf13/pflag/flag.go
new file mode 100644
index 00000000000..9beeda8ecca
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/flag.go
@@ -0,0 +1,1227 @@
+// 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 pflag is a drop-in replacement for Go's flag package, implementing
+POSIX/GNU-style --flags.
+
+pflag is compatible with the GNU extensions to the POSIX recommendations
+for command-line options. See
+http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html
+
+Usage:
+
+pflag is a drop-in replacement of Go's native flag package. If you import
+pflag under the name "flag" then all code should continue to function
+with no changes.
+
+ import flag "github.com/spf13/pflag"
+
+There is one exception to this: if you directly instantiate the Flag struct
+there is one more field "Shorthand" that you will need to set.
+Most code never instantiates this struct directly, and instead uses
+functions such as String(), BoolVar(), and Var(), and is therefore
+unaffected.
+
+Define flags using flag.String(), Bool(), Int(), etc.
+
+This declares an integer flag, -flagname, stored in the pointer ip, with type *int.
+ var ip = flag.Int("flagname", 1234, "help message for flagname")
+If you like, you can bind the flag to a variable using the Var() functions.
+ var flagvar int
+ func init() {
+ flag.IntVar(&flagvar, "flagname", 1234, "help message for flagname")
+ }
+Or you can create custom flags that satisfy the Value interface (with
+pointer receivers) and couple them to flag parsing by
+ flag.Var(&flagVal, "name", "help message for flagname")
+For such flags, the default value is just the initial value of the variable.
+
+After all flags are defined, call
+ flag.Parse()
+to parse the command line into the defined flags.
+
+Flags may then be used directly. If you're using the flags themselves,
+they are all pointers; if you bind to variables, they're values.
+ fmt.Println("ip has value ", *ip)
+ fmt.Println("flagvar has value ", flagvar)
+
+After parsing, the arguments after the flag are available as the
+slice flag.Args() or individually as flag.Arg(i).
+The arguments are indexed from 0 through flag.NArg()-1.
+
+The pflag package also defines some new functions that are not in flag,
+that give one-letter shorthands for flags. You can use these by appending
+'P' to the name of any function that defines a flag.
+ var ip = flag.IntP("flagname", "f", 1234, "help message")
+ var flagvar bool
+ func init() {
+ flag.BoolVarP("boolname", "b", true, "help message")
+ }
+ flag.VarP(&flagVar, "varname", "v", 1234, "help message")
+Shorthand letters can be used with single dashes on the command line.
+Boolean shorthand flags can be combined with other shorthand flags.
+
+Command line flag syntax:
+ --flag // boolean flags only
+ --flag=x
+
+Unlike the flag package, a single dash before an option means something
+different than a double dash. Single dashes signify a series of shorthand
+letters for flags. All but the last shorthand letter must be boolean flags.
+ // boolean flags
+ -f
+ -abc
+ // non-boolean flags
+ -n 1234
+ -Ifile
+ // mixed
+ -abcs "hello"
+ -abcn1234
+
+Flag parsing stops after the terminator "--". Unlike the flag package,
+flags can be interspersed with arguments anywhere on the command line
+before this terminator.
+
+Integer flags accept 1234, 0664, 0x1234 and may be negative.
+Boolean flags (in their long form) accept 1, 0, t, f, true, false,
+TRUE, FALSE, True, False.
+Duration flags accept any input valid for time.ParseDuration.
+
+The default set of command-line flags is controlled by
+top-level functions. The FlagSet type allows one to define
+independent sets of flags, such as to implement subcommands
+in a command-line interface. The methods of FlagSet are
+analogous to the top-level functions for the command-line
+flag set.
+*/
+package pflag
+
+import (
+ "bytes"
+ "errors"
+ goflag "flag"
+ "fmt"
+ "io"
+ "os"
+ "sort"
+ "strings"
+)
+
+// ErrHelp is the error returned if the flag -help is invoked but no such flag is defined.
+var ErrHelp = errors.New("pflag: help requested")
+
+// ErrorHandling defines how to handle flag parsing errors.
+type ErrorHandling int
+
+const (
+ // ContinueOnError will return an err from Parse() if an error is found
+ ContinueOnError ErrorHandling = iota
+ // ExitOnError will call os.Exit(2) if an error is found when parsing
+ ExitOnError
+ // PanicOnError will panic() if an error is found when parsing flags
+ PanicOnError
+)
+
+// ParseErrorsWhitelist defines the parsing errors that can be ignored
+type ParseErrorsWhitelist struct {
+ // UnknownFlags will ignore unknown flags errors and continue parsing rest of the flags
+ UnknownFlags bool
+}
+
+// NormalizedName is a flag name that has been normalized according to rules
+// for the FlagSet (e.g. making '-' and '_' equivalent).
+type NormalizedName string
+
+// A FlagSet represents a set of defined flags.
+type FlagSet struct {
+ // Usage is the function called when an error occurs while parsing flags.
+ // The field is a function (not a method) that may be changed to point to
+ // a custom error handler.
+ Usage func()
+
+ // SortFlags is used to indicate, if user wants to have sorted flags in
+ // help/usage messages.
+ SortFlags bool
+
+ // ParseErrorsWhitelist is used to configure a whitelist of errors
+ ParseErrorsWhitelist ParseErrorsWhitelist
+
+ name string
+ parsed bool
+ actual map[NormalizedName]*Flag
+ orderedActual []*Flag
+ sortedActual []*Flag
+ formal map[NormalizedName]*Flag
+ orderedFormal []*Flag
+ sortedFormal []*Flag
+ shorthands map[byte]*Flag
+ args []string // arguments after flags
+ argsLenAtDash int // len(args) when a '--' was located when parsing, or -1 if no --
+ errorHandling ErrorHandling
+ output io.Writer // nil means stderr; use out() accessor
+ interspersed bool // allow interspersed option/non-option args
+ normalizeNameFunc func(f *FlagSet, name string) NormalizedName
+
+ addedGoFlagSets []*goflag.FlagSet
+}
+
+// A Flag represents the state of a flag.
+type Flag struct {
+ Name string // name as it appears on command line
+ Shorthand string // one-letter abbreviated flag
+ Usage string // help message
+ Value Value // value as set
+ DefValue string // default value (as text); for usage message
+ Changed bool // If the user set the value (or if left to default)
+ NoOptDefVal string // default value (as text); if the flag is on the command line without any options
+ Deprecated string // If this flag is deprecated, this string is the new or now thing to use
+ Hidden bool // used by cobra.Command to allow flags to be hidden from help/usage text
+ ShorthandDeprecated string // If the shorthand of this flag is deprecated, this string is the new or now thing to use
+ Annotations map[string][]string // used by cobra.Command bash autocomple code
+}
+
+// Value is the interface to the dynamic value stored in a flag.
+// (The default value is represented as a string.)
+type Value interface {
+ String() string
+ Set(string) error
+ Type() string
+}
+
+// sortFlags returns the flags as a slice in lexicographical sorted order.
+func sortFlags(flags map[NormalizedName]*Flag) []*Flag {
+ list := make(sort.StringSlice, len(flags))
+ i := 0
+ for k := range flags {
+ list[i] = string(k)
+ i++
+ }
+ list.Sort()
+ result := make([]*Flag, len(list))
+ for i, name := range list {
+ result[i] = flags[NormalizedName(name)]
+ }
+ return result
+}
+
+// SetNormalizeFunc allows you to add a function which can translate flag names.
+// Flags added to the FlagSet will be translated and then when anything tries to
+// look up the flag that will also be translated. So it would be possible to create
+// a flag named "getURL" and have it translated to "geturl". A user could then pass
+// "--getUrl" which may also be translated to "geturl" and everything will work.
+func (f *FlagSet) SetNormalizeFunc(n func(f *FlagSet, name string) NormalizedName) {
+ f.normalizeNameFunc = n
+ f.sortedFormal = f.sortedFormal[:0]
+ for fname, flag := range f.formal {
+ nname := f.normalizeFlagName(flag.Name)
+ if fname == nname {
+ continue
+ }
+ flag.Name = string(nname)
+ delete(f.formal, fname)
+ f.formal[nname] = flag
+ if _, set := f.actual[fname]; set {
+ delete(f.actual, fname)
+ f.actual[nname] = flag
+ }
+ }
+}
+
+// GetNormalizeFunc returns the previously set NormalizeFunc of a function which
+// does no translation, if not set previously.
+func (f *FlagSet) GetNormalizeFunc() func(f *FlagSet, name string) NormalizedName {
+ if f.normalizeNameFunc != nil {
+ return f.normalizeNameFunc
+ }
+ return func(f *FlagSet, name string) NormalizedName { return NormalizedName(name) }
+}
+
+func (f *FlagSet) normalizeFlagName(name string) NormalizedName {
+ n := f.GetNormalizeFunc()
+ return n(f, name)
+}
+
+func (f *FlagSet) out() io.Writer {
+ if f.output == nil {
+ return os.Stderr
+ }
+ return f.output
+}
+
+// SetOutput sets the destination for usage and error messages.
+// If output is nil, os.Stderr is used.
+func (f *FlagSet) SetOutput(output io.Writer) {
+ f.output = output
+}
+
+// VisitAll visits the flags in lexicographical order or
+// in primordial order if f.SortFlags is false, calling fn for each.
+// It visits all flags, even those not set.
+func (f *FlagSet) VisitAll(fn func(*Flag)) {
+ if len(f.formal) == 0 {
+ return
+ }
+
+ var flags []*Flag
+ if f.SortFlags {
+ if len(f.formal) != len(f.sortedFormal) {
+ f.sortedFormal = sortFlags(f.formal)
+ }
+ flags = f.sortedFormal
+ } else {
+ flags = f.orderedFormal
+ }
+
+ for _, flag := range flags {
+ fn(flag)
+ }
+}
+
+// HasFlags returns a bool to indicate if the FlagSet has any flags defined.
+func (f *FlagSet) HasFlags() bool {
+ return len(f.formal) > 0
+}
+
+// HasAvailableFlags returns a bool to indicate if the FlagSet has any flags
+// that are not hidden.
+func (f *FlagSet) HasAvailableFlags() bool {
+ for _, flag := range f.formal {
+ if !flag.Hidden {
+ return true
+ }
+ }
+ return false
+}
+
+// VisitAll visits the command-line flags in lexicographical order or
+// in primordial order if f.SortFlags is false, calling fn for each.
+// It visits all flags, even those not set.
+func VisitAll(fn func(*Flag)) {
+ CommandLine.VisitAll(fn)
+}
+
+// Visit visits the flags in lexicographical order or
+// in primordial order if f.SortFlags is false, calling fn for each.
+// It visits only those flags that have been set.
+func (f *FlagSet) Visit(fn func(*Flag)) {
+ if len(f.actual) == 0 {
+ return
+ }
+
+ var flags []*Flag
+ if f.SortFlags {
+ if len(f.actual) != len(f.sortedActual) {
+ f.sortedActual = sortFlags(f.actual)
+ }
+ flags = f.sortedActual
+ } else {
+ flags = f.orderedActual
+ }
+
+ for _, flag := range flags {
+ fn(flag)
+ }
+}
+
+// Visit visits the command-line flags in lexicographical order or
+// in primordial order if f.SortFlags is false, calling fn for each.
+// It visits only those flags that have been set.
+func Visit(fn func(*Flag)) {
+ CommandLine.Visit(fn)
+}
+
+// Lookup returns the Flag structure of the named flag, returning nil if none exists.
+func (f *FlagSet) Lookup(name string) *Flag {
+ return f.lookup(f.normalizeFlagName(name))
+}
+
+// ShorthandLookup returns the Flag structure of the short handed flag,
+// returning nil if none exists.
+// It panics, if len(name) > 1.
+func (f *FlagSet) ShorthandLookup(name string) *Flag {
+ if name == "" {
+ return nil
+ }
+ if len(name) > 1 {
+ msg := fmt.Sprintf("can not look up shorthand which is more than one ASCII character: %q", name)
+ fmt.Fprintf(f.out(), msg)
+ panic(msg)
+ }
+ c := name[0]
+ return f.shorthands[c]
+}
+
+// lookup returns the Flag structure of the named flag, returning nil if none exists.
+func (f *FlagSet) lookup(name NormalizedName) *Flag {
+ return f.formal[name]
+}
+
+// func to return a given type for a given flag name
+func (f *FlagSet) getFlagType(name string, ftype string, convFunc func(sval string) (interface{}, error)) (interface{}, error) {
+ flag := f.Lookup(name)
+ if flag == nil {
+ err := fmt.Errorf("flag accessed but not defined: %s", name)
+ return nil, err
+ }
+
+ if flag.Value.Type() != ftype {
+ err := fmt.Errorf("trying to get %s value of flag of type %s", ftype, flag.Value.Type())
+ return nil, err
+ }
+
+ sval := flag.Value.String()
+ result, err := convFunc(sval)
+ if err != nil {
+ return nil, err
+ }
+ return result, nil
+}
+
+// ArgsLenAtDash will return the length of f.Args at the moment when a -- was
+// found during arg parsing. This allows your program to know which args were
+// before the -- and which came after.
+func (f *FlagSet) ArgsLenAtDash() int {
+ return f.argsLenAtDash
+}
+
+// MarkDeprecated indicated that a flag is deprecated in your program. It will
+// continue to function but will not show up in help or usage messages. Using
+// this flag will also print the given usageMessage.
+func (f *FlagSet) MarkDeprecated(name string, usageMessage string) error {
+ flag := f.Lookup(name)
+ if flag == nil {
+ return fmt.Errorf("flag %q does not exist", name)
+ }
+ if usageMessage == "" {
+ return fmt.Errorf("deprecated message for flag %q must be set", name)
+ }
+ flag.Deprecated = usageMessage
+ flag.Hidden = true
+ return nil
+}
+
+// MarkShorthandDeprecated will mark the shorthand of a flag deprecated in your
+// program. It will continue to function but will not show up in help or usage
+// messages. Using this flag will also print the given usageMessage.
+func (f *FlagSet) MarkShorthandDeprecated(name string, usageMessage string) error {
+ flag := f.Lookup(name)
+ if flag == nil {
+ return fmt.Errorf("flag %q does not exist", name)
+ }
+ if usageMessage == "" {
+ return fmt.Errorf("deprecated message for flag %q must be set", name)
+ }
+ flag.ShorthandDeprecated = usageMessage
+ return nil
+}
+
+// MarkHidden sets a flag to 'hidden' in your program. It will continue to
+// function but will not show up in help or usage messages.
+func (f *FlagSet) MarkHidden(name string) error {
+ flag := f.Lookup(name)
+ if flag == nil {
+ return fmt.Errorf("flag %q does not exist", name)
+ }
+ flag.Hidden = true
+ return nil
+}
+
+// Lookup returns the Flag structure of the named command-line flag,
+// returning nil if none exists.
+func Lookup(name string) *Flag {
+ return CommandLine.Lookup(name)
+}
+
+// ShorthandLookup returns the Flag structure of the short handed flag,
+// returning nil if none exists.
+func ShorthandLookup(name string) *Flag {
+ return CommandLine.ShorthandLookup(name)
+}
+
+// Set sets the value of the named flag.
+func (f *FlagSet) Set(name, value string) error {
+ normalName := f.normalizeFlagName(name)
+ flag, ok := f.formal[normalName]
+ if !ok {
+ return fmt.Errorf("no such flag -%v", name)
+ }
+
+ err := flag.Value.Set(value)
+ if err != nil {
+ var flagName string
+ if flag.Shorthand != "" && flag.ShorthandDeprecated == "" {
+ flagName = fmt.Sprintf("-%s, --%s", flag.Shorthand, flag.Name)
+ } else {
+ flagName = fmt.Sprintf("--%s", flag.Name)
+ }
+ return fmt.Errorf("invalid argument %q for %q flag: %v", value, flagName, err)
+ }
+
+ if !flag.Changed {
+ if f.actual == nil {
+ f.actual = make(map[NormalizedName]*Flag)
+ }
+ f.actual[normalName] = flag
+ f.orderedActual = append(f.orderedActual, flag)
+
+ flag.Changed = true
+ }
+
+ if flag.Deprecated != "" {
+ fmt.Fprintf(f.out(), "Flag --%s has been deprecated, %s\n", flag.Name, flag.Deprecated)
+ }
+ return nil
+}
+
+// SetAnnotation allows one to set arbitrary annotations on a flag in the FlagSet.
+// This is sometimes used by spf13/cobra programs which want to generate additional
+// bash completion information.
+func (f *FlagSet) SetAnnotation(name, key string, values []string) error {
+ normalName := f.normalizeFlagName(name)
+ flag, ok := f.formal[normalName]
+ if !ok {
+ return fmt.Errorf("no such flag -%v", name)
+ }
+ if flag.Annotations == nil {
+ flag.Annotations = map[string][]string{}
+ }
+ flag.Annotations[key] = values
+ return nil
+}
+
+// Changed returns true if the flag was explicitly set during Parse() and false
+// otherwise
+func (f *FlagSet) Changed(name string) bool {
+ flag := f.Lookup(name)
+ // If a flag doesn't exist, it wasn't changed....
+ if flag == nil {
+ return false
+ }
+ return flag.Changed
+}
+
+// Set sets the value of the named command-line flag.
+func Set(name, value string) error {
+ return CommandLine.Set(name, value)
+}
+
+// PrintDefaults prints, to standard error unless configured
+// otherwise, the default values of all defined flags in the set.
+func (f *FlagSet) PrintDefaults() {
+ usages := f.FlagUsages()
+ fmt.Fprint(f.out(), usages)
+}
+
+// defaultIsZeroValue returns true if the default value for this flag represents
+// a zero value.
+func (f *Flag) defaultIsZeroValue() bool {
+ switch f.Value.(type) {
+ case boolFlag:
+ return f.DefValue == "false"
+ case *durationValue:
+ // Beginning in Go 1.7, duration zero values are "0s"
+ return f.DefValue == "0" || f.DefValue == "0s"
+ case *intValue, *int8Value, *int32Value, *int64Value, *uintValue, *uint8Value, *uint16Value, *uint32Value, *uint64Value, *countValue, *float32Value, *float64Value:
+ return f.DefValue == "0"
+ case *stringValue:
+ return f.DefValue == ""
+ case *ipValue, *ipMaskValue, *ipNetValue:
+ return f.DefValue == ""
+ case *intSliceValue, *stringSliceValue, *stringArrayValue:
+ return f.DefValue == "[]"
+ default:
+ switch f.Value.String() {
+ case "false":
+ return true
+ case "":
+ return true
+ case "":
+ return true
+ case "0":
+ return true
+ }
+ return false
+ }
+}
+
+// UnquoteUsage extracts a back-quoted name from the usage
+// string for a flag and returns it and the un-quoted usage.
+// Given "a `name` to show" it returns ("name", "a name to show").
+// If there are no back quotes, the name is an educated guess of the
+// type of the flag's value, or the empty string if the flag is boolean.
+func UnquoteUsage(flag *Flag) (name string, usage string) {
+ // Look for a back-quoted name, but avoid the strings package.
+ usage = flag.Usage
+ for i := 0; i < len(usage); i++ {
+ if usage[i] == '`' {
+ for j := i + 1; j < len(usage); j++ {
+ if usage[j] == '`' {
+ name = usage[i+1 : j]
+ usage = usage[:i] + name + usage[j+1:]
+ return name, usage
+ }
+ }
+ break // Only one back quote; use type name.
+ }
+ }
+
+ name = flag.Value.Type()
+ switch name {
+ case "bool":
+ name = ""
+ case "float64":
+ name = "float"
+ case "int64":
+ name = "int"
+ case "uint64":
+ name = "uint"
+ case "stringSlice":
+ name = "strings"
+ case "intSlice":
+ name = "ints"
+ case "uintSlice":
+ name = "uints"
+ case "boolSlice":
+ name = "bools"
+ }
+
+ return
+}
+
+// Splits the string `s` on whitespace into an initial substring up to
+// `i` runes in length and the remainder. Will go `slop` over `i` if
+// that encompasses the entire string (which allows the caller to
+// avoid short orphan words on the final line).
+func wrapN(i, slop int, s string) (string, string) {
+ if i+slop > len(s) {
+ return s, ""
+ }
+
+ w := strings.LastIndexAny(s[:i], " \t\n")
+ if w <= 0 {
+ return s, ""
+ }
+ nlPos := strings.LastIndex(s[:i], "\n")
+ if nlPos > 0 && nlPos < w {
+ return s[:nlPos], s[nlPos+1:]
+ }
+ return s[:w], s[w+1:]
+}
+
+// Wraps the string `s` to a maximum width `w` with leading indent
+// `i`. The first line is not indented (this is assumed to be done by
+// caller). Pass `w` == 0 to do no wrapping
+func wrap(i, w int, s string) string {
+ if w == 0 {
+ return strings.Replace(s, "\n", "\n"+strings.Repeat(" ", i), -1)
+ }
+
+ // space between indent i and end of line width w into which
+ // we should wrap the text.
+ wrap := w - i
+
+ var r, l string
+
+ // Not enough space for sensible wrapping. Wrap as a block on
+ // the next line instead.
+ if wrap < 24 {
+ i = 16
+ wrap = w - i
+ r += "\n" + strings.Repeat(" ", i)
+ }
+ // If still not enough space then don't even try to wrap.
+ if wrap < 24 {
+ return strings.Replace(s, "\n", r, -1)
+ }
+
+ // Try to avoid short orphan words on the final line, by
+ // allowing wrapN to go a bit over if that would fit in the
+ // remainder of the line.
+ slop := 5
+ wrap = wrap - slop
+
+ // Handle first line, which is indented by the caller (or the
+ // special case above)
+ l, s = wrapN(wrap, slop, s)
+ r = r + strings.Replace(l, "\n", "\n"+strings.Repeat(" ", i), -1)
+
+ // Now wrap the rest
+ for s != "" {
+ var t string
+
+ t, s = wrapN(wrap, slop, s)
+ r = r + "\n" + strings.Repeat(" ", i) + strings.Replace(t, "\n", "\n"+strings.Repeat(" ", i), -1)
+ }
+
+ return r
+
+}
+
+// FlagUsagesWrapped returns a string containing the usage information
+// for all flags in the FlagSet. Wrapped to `cols` columns (0 for no
+// wrapping)
+func (f *FlagSet) FlagUsagesWrapped(cols int) string {
+ buf := new(bytes.Buffer)
+
+ lines := make([]string, 0, len(f.formal))
+
+ maxlen := 0
+ f.VisitAll(func(flag *Flag) {
+ if flag.Hidden {
+ return
+ }
+
+ line := ""
+ if flag.Shorthand != "" && flag.ShorthandDeprecated == "" {
+ line = fmt.Sprintf(" -%s, --%s", flag.Shorthand, flag.Name)
+ } else {
+ line = fmt.Sprintf(" --%s", flag.Name)
+ }
+
+ varname, usage := UnquoteUsage(flag)
+ if varname != "" {
+ line += " " + varname
+ }
+ if flag.NoOptDefVal != "" {
+ switch flag.Value.Type() {
+ case "string":
+ line += fmt.Sprintf("[=\"%s\"]", flag.NoOptDefVal)
+ case "bool":
+ if flag.NoOptDefVal != "true" {
+ line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
+ }
+ case "count":
+ if flag.NoOptDefVal != "+1" {
+ line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
+ }
+ default:
+ line += fmt.Sprintf("[=%s]", flag.NoOptDefVal)
+ }
+ }
+
+ // This special character will be replaced with spacing once the
+ // correct alignment is calculated
+ line += "\x00"
+ if len(line) > maxlen {
+ maxlen = len(line)
+ }
+
+ line += usage
+ if !flag.defaultIsZeroValue() {
+ if flag.Value.Type() == "string" {
+ line += fmt.Sprintf(" (default %q)", flag.DefValue)
+ } else {
+ line += fmt.Sprintf(" (default %s)", flag.DefValue)
+ }
+ }
+ if len(flag.Deprecated) != 0 {
+ line += fmt.Sprintf(" (DEPRECATED: %s)", flag.Deprecated)
+ }
+
+ lines = append(lines, line)
+ })
+
+ for _, line := range lines {
+ sidx := strings.Index(line, "\x00")
+ spacing := strings.Repeat(" ", maxlen-sidx)
+ // maxlen + 2 comes from + 1 for the \x00 and + 1 for the (deliberate) off-by-one in maxlen-sidx
+ fmt.Fprintln(buf, line[:sidx], spacing, wrap(maxlen+2, cols, line[sidx+1:]))
+ }
+
+ return buf.String()
+}
+
+// FlagUsages returns a string containing the usage information for all flags in
+// the FlagSet
+func (f *FlagSet) FlagUsages() string {
+ return f.FlagUsagesWrapped(0)
+}
+
+// PrintDefaults prints to standard error the default values of all defined command-line flags.
+func PrintDefaults() {
+ CommandLine.PrintDefaults()
+}
+
+// defaultUsage is the default function to print a usage message.
+func defaultUsage(f *FlagSet) {
+ fmt.Fprintf(f.out(), "Usage of %s:\n", f.name)
+ f.PrintDefaults()
+}
+
+// NOTE: Usage is not just defaultUsage(CommandLine)
+// because it serves (via godoc flag Usage) as the example
+// for how to write your own usage function.
+
+// Usage prints to standard error a usage message documenting all defined command-line flags.
+// The function is a variable that may be changed to point to a custom function.
+// By default it prints a simple header and calls PrintDefaults; for details about the
+// format of the output and how to control it, see the documentation for PrintDefaults.
+var Usage = func() {
+ fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
+ PrintDefaults()
+}
+
+// NFlag returns the number of flags that have been set.
+func (f *FlagSet) NFlag() int { return len(f.actual) }
+
+// NFlag returns the number of command-line flags that have been set.
+func NFlag() int { return len(CommandLine.actual) }
+
+// Arg returns the i'th argument. Arg(0) is the first remaining argument
+// after flags have been processed.
+func (f *FlagSet) Arg(i int) string {
+ if i < 0 || i >= len(f.args) {
+ return ""
+ }
+ return f.args[i]
+}
+
+// Arg returns the i'th command-line argument. Arg(0) is the first remaining argument
+// after flags have been processed.
+func Arg(i int) string {
+ return CommandLine.Arg(i)
+}
+
+// NArg is the number of arguments remaining after flags have been processed.
+func (f *FlagSet) NArg() int { return len(f.args) }
+
+// NArg is the number of arguments remaining after flags have been processed.
+func NArg() int { return len(CommandLine.args) }
+
+// Args returns the non-flag arguments.
+func (f *FlagSet) Args() []string { return f.args }
+
+// Args returns the non-flag command-line arguments.
+func Args() []string { return CommandLine.args }
+
+// Var defines a flag with the specified name and usage string. The type and
+// value of the flag are represented by the first argument, of type Value, which
+// typically holds a user-defined implementation of Value. For instance, the
+// caller could create a flag that turns a comma-separated string into a slice
+// of strings by giving the slice the methods of Value; in particular, Set would
+// decompose the comma-separated string into the slice.
+func (f *FlagSet) Var(value Value, name string, usage string) {
+ f.VarP(value, name, "", usage)
+}
+
+// VarPF is like VarP, but returns the flag created
+func (f *FlagSet) VarPF(value Value, name, shorthand, usage string) *Flag {
+ // Remember the default value as a string; it won't change.
+ flag := &Flag{
+ Name: name,
+ Shorthand: shorthand,
+ Usage: usage,
+ Value: value,
+ DefValue: value.String(),
+ }
+ f.AddFlag(flag)
+ return flag
+}
+
+// VarP is like Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) VarP(value Value, name, shorthand, usage string) {
+ f.VarPF(value, name, shorthand, usage)
+}
+
+// AddFlag will add the flag to the FlagSet
+func (f *FlagSet) AddFlag(flag *Flag) {
+ normalizedFlagName := f.normalizeFlagName(flag.Name)
+
+ _, alreadyThere := f.formal[normalizedFlagName]
+ if alreadyThere {
+ msg := fmt.Sprintf("%s flag redefined: %s", f.name, flag.Name)
+ fmt.Fprintln(f.out(), msg)
+ panic(msg) // Happens only if flags are declared with identical names
+ }
+ if f.formal == nil {
+ f.formal = make(map[NormalizedName]*Flag)
+ }
+
+ flag.Name = string(normalizedFlagName)
+ f.formal[normalizedFlagName] = flag
+ f.orderedFormal = append(f.orderedFormal, flag)
+
+ if flag.Shorthand == "" {
+ return
+ }
+ if len(flag.Shorthand) > 1 {
+ msg := fmt.Sprintf("%q shorthand is more than one ASCII character", flag.Shorthand)
+ fmt.Fprintf(f.out(), msg)
+ panic(msg)
+ }
+ if f.shorthands == nil {
+ f.shorthands = make(map[byte]*Flag)
+ }
+ c := flag.Shorthand[0]
+ used, alreadyThere := f.shorthands[c]
+ if alreadyThere {
+ msg := fmt.Sprintf("unable to redefine %q shorthand in %q flagset: it's already used for %q flag", c, f.name, used.Name)
+ fmt.Fprintf(f.out(), msg)
+ panic(msg)
+ }
+ f.shorthands[c] = flag
+}
+
+// AddFlagSet adds one FlagSet to another. If a flag is already present in f
+// the flag from newSet will be ignored.
+func (f *FlagSet) AddFlagSet(newSet *FlagSet) {
+ if newSet == nil {
+ return
+ }
+ newSet.VisitAll(func(flag *Flag) {
+ if f.Lookup(flag.Name) == nil {
+ f.AddFlag(flag)
+ }
+ })
+}
+
+// Var defines a flag with the specified name and usage string. The type and
+// value of the flag are represented by the first argument, of type Value, which
+// typically holds a user-defined implementation of Value. For instance, the
+// caller could create a flag that turns a comma-separated string into a slice
+// of strings by giving the slice the methods of Value; in particular, Set would
+// decompose the comma-separated string into the slice.
+func Var(value Value, name string, usage string) {
+ CommandLine.VarP(value, name, "", usage)
+}
+
+// VarP is like Var, but accepts a shorthand letter that can be used after a single dash.
+func VarP(value Value, name, shorthand, usage string) {
+ CommandLine.VarP(value, name, shorthand, usage)
+}
+
+// failf prints to standard error a formatted error and usage message and
+// returns the error.
+func (f *FlagSet) failf(format string, a ...interface{}) error {
+ err := fmt.Errorf(format, a...)
+ if f.errorHandling != ContinueOnError {
+ fmt.Fprintln(f.out(), err)
+ f.usage()
+ }
+ return err
+}
+
+// usage calls the Usage method for the flag set, or the usage function if
+// the flag set is CommandLine.
+func (f *FlagSet) usage() {
+ if f == CommandLine {
+ Usage()
+ } else if f.Usage == nil {
+ defaultUsage(f)
+ } else {
+ f.Usage()
+ }
+}
+
+//--unknown (args will be empty)
+//--unknown --next-flag ... (args will be --next-flag ...)
+//--unknown arg ... (args will be arg ...)
+func stripUnknownFlagValue(args []string) []string {
+ if len(args) == 0 {
+ //--unknown
+ return args
+ }
+
+ first := args[0]
+ if len(first) > 0 && first[0] == '-' {
+ //--unknown --next-flag ...
+ return args
+ }
+
+ //--unknown arg ... (args will be arg ...)
+ if len(args) > 1 {
+ return args[1:]
+ }
+ return nil
+}
+
+func (f *FlagSet) parseLongArg(s string, args []string, fn parseFunc) (a []string, err error) {
+ a = args
+ name := s[2:]
+ if len(name) == 0 || name[0] == '-' || name[0] == '=' {
+ err = f.failf("bad flag syntax: %s", s)
+ return
+ }
+
+ split := strings.SplitN(name, "=", 2)
+ name = split[0]
+ flag, exists := f.formal[f.normalizeFlagName(name)]
+
+ if !exists {
+ switch {
+ case name == "help":
+ f.usage()
+ return a, ErrHelp
+ case f.ParseErrorsWhitelist.UnknownFlags:
+ // --unknown=unknownval arg ...
+ // we do not want to lose arg in this case
+ if len(split) >= 2 {
+ return a, nil
+ }
+
+ return stripUnknownFlagValue(a), nil
+ default:
+ err = f.failf("unknown flag: --%s", name)
+ return
+ }
+ }
+
+ var value string
+ if len(split) == 2 {
+ // '--flag=arg'
+ value = split[1]
+ } else if flag.NoOptDefVal != "" {
+ // '--flag' (arg was optional)
+ value = flag.NoOptDefVal
+ } else if len(a) > 0 {
+ // '--flag arg'
+ value = a[0]
+ a = a[1:]
+ } else {
+ // '--flag' (arg was required)
+ err = f.failf("flag needs an argument: %s", s)
+ return
+ }
+
+ err = fn(flag, value)
+ if err != nil {
+ f.failf(err.Error())
+ }
+ return
+}
+
+func (f *FlagSet) parseSingleShortArg(shorthands string, args []string, fn parseFunc) (outShorts string, outArgs []string, err error) {
+ outArgs = args
+
+ if strings.HasPrefix(shorthands, "test.") {
+ return
+ }
+
+ outShorts = shorthands[1:]
+ c := shorthands[0]
+
+ flag, exists := f.shorthands[c]
+ if !exists {
+ switch {
+ case c == 'h':
+ f.usage()
+ err = ErrHelp
+ return
+ case f.ParseErrorsWhitelist.UnknownFlags:
+ // '-f=arg arg ...'
+ // we do not want to lose arg in this case
+ if len(shorthands) > 2 && shorthands[1] == '=' {
+ outShorts = ""
+ return
+ }
+
+ outArgs = stripUnknownFlagValue(outArgs)
+ return
+ default:
+ err = f.failf("unknown shorthand flag: %q in -%s", c, shorthands)
+ return
+ }
+ }
+
+ var value string
+ if len(shorthands) > 2 && shorthands[1] == '=' {
+ // '-f=arg'
+ value = shorthands[2:]
+ outShorts = ""
+ } else if flag.NoOptDefVal != "" {
+ // '-f' (arg was optional)
+ value = flag.NoOptDefVal
+ } else if len(shorthands) > 1 {
+ // '-farg'
+ value = shorthands[1:]
+ outShorts = ""
+ } else if len(args) > 0 {
+ // '-f arg'
+ value = args[0]
+ outArgs = args[1:]
+ } else {
+ // '-f' (arg was required)
+ err = f.failf("flag needs an argument: %q in -%s", c, shorthands)
+ return
+ }
+
+ if flag.ShorthandDeprecated != "" {
+ fmt.Fprintf(f.out(), "Flag shorthand -%s has been deprecated, %s\n", flag.Shorthand, flag.ShorthandDeprecated)
+ }
+
+ err = fn(flag, value)
+ if err != nil {
+ f.failf(err.Error())
+ }
+ return
+}
+
+func (f *FlagSet) parseShortArg(s string, args []string, fn parseFunc) (a []string, err error) {
+ a = args
+ shorthands := s[1:]
+
+ // "shorthands" can be a series of shorthand letters of flags (e.g. "-vvv").
+ for len(shorthands) > 0 {
+ shorthands, a, err = f.parseSingleShortArg(shorthands, args, fn)
+ if err != nil {
+ return
+ }
+ }
+
+ return
+}
+
+func (f *FlagSet) parseArgs(args []string, fn parseFunc) (err error) {
+ for len(args) > 0 {
+ s := args[0]
+ args = args[1:]
+ if len(s) == 0 || s[0] != '-' || len(s) == 1 {
+ if !f.interspersed {
+ f.args = append(f.args, s)
+ f.args = append(f.args, args...)
+ return nil
+ }
+ f.args = append(f.args, s)
+ continue
+ }
+
+ if s[1] == '-' {
+ if len(s) == 2 { // "--" terminates the flags
+ f.argsLenAtDash = len(f.args)
+ f.args = append(f.args, args...)
+ break
+ }
+ args, err = f.parseLongArg(s, args, fn)
+ } else {
+ args, err = f.parseShortArg(s, args, fn)
+ }
+ if err != nil {
+ return
+ }
+ }
+ return
+}
+
+// Parse parses flag definitions from the argument list, which should not
+// include the command name. Must be called after all flags in the FlagSet
+// are defined and before flags are accessed by the program.
+// The return value will be ErrHelp if -help was set but not defined.
+func (f *FlagSet) Parse(arguments []string) error {
+ if f.addedGoFlagSets != nil {
+ for _, goFlagSet := range f.addedGoFlagSets {
+ goFlagSet.Parse(nil)
+ }
+ }
+ f.parsed = true
+
+ if len(arguments) < 0 {
+ return nil
+ }
+
+ f.args = make([]string, 0, len(arguments))
+
+ set := func(flag *Flag, value string) error {
+ return f.Set(flag.Name, value)
+ }
+
+ err := f.parseArgs(arguments, set)
+ if err != nil {
+ switch f.errorHandling {
+ case ContinueOnError:
+ return err
+ case ExitOnError:
+ fmt.Println(err)
+ os.Exit(2)
+ case PanicOnError:
+ panic(err)
+ }
+ }
+ return nil
+}
+
+type parseFunc func(flag *Flag, value string) error
+
+// ParseAll parses flag definitions from the argument list, which should not
+// include the command name. The arguments for fn are flag and value. Must be
+// called after all flags in the FlagSet are defined and before flags are
+// accessed by the program. The return value will be ErrHelp if -help was set
+// but not defined.
+func (f *FlagSet) ParseAll(arguments []string, fn func(flag *Flag, value string) error) error {
+ f.parsed = true
+ f.args = make([]string, 0, len(arguments))
+
+ err := f.parseArgs(arguments, fn)
+ if err != nil {
+ switch f.errorHandling {
+ case ContinueOnError:
+ return err
+ case ExitOnError:
+ os.Exit(2)
+ case PanicOnError:
+ panic(err)
+ }
+ }
+ return nil
+}
+
+// Parsed reports whether f.Parse has been called.
+func (f *FlagSet) Parsed() bool {
+ return f.parsed
+}
+
+// Parse parses the command-line flags from os.Args[1:]. Must be called
+// after all flags are defined and before flags are accessed by the program.
+func Parse() {
+ // Ignore errors; CommandLine is set for ExitOnError.
+ CommandLine.Parse(os.Args[1:])
+}
+
+// ParseAll parses the command-line flags from os.Args[1:] and called fn for each.
+// The arguments for fn are flag and value. Must be called after all flags are
+// defined and before flags are accessed by the program.
+func ParseAll(fn func(flag *Flag, value string) error) {
+ // Ignore errors; CommandLine is set for ExitOnError.
+ CommandLine.ParseAll(os.Args[1:], fn)
+}
+
+// SetInterspersed sets whether to support interspersed option/non-option arguments.
+func SetInterspersed(interspersed bool) {
+ CommandLine.SetInterspersed(interspersed)
+}
+
+// Parsed returns true if the command-line flags have been parsed.
+func Parsed() bool {
+ return CommandLine.Parsed()
+}
+
+// CommandLine is the default set of command-line flags, parsed from os.Args.
+var CommandLine = NewFlagSet(os.Args[0], ExitOnError)
+
+// NewFlagSet returns a new, empty flag set with the specified name,
+// error handling property and SortFlags set to true.
+func NewFlagSet(name string, errorHandling ErrorHandling) *FlagSet {
+ f := &FlagSet{
+ name: name,
+ errorHandling: errorHandling,
+ argsLenAtDash: -1,
+ interspersed: true,
+ SortFlags: true,
+ }
+ return f
+}
+
+// SetInterspersed sets whether to support interspersed option/non-option arguments.
+func (f *FlagSet) SetInterspersed(interspersed bool) {
+ f.interspersed = interspersed
+}
+
+// Init sets the name and error handling property for a flag set.
+// By default, the zero FlagSet uses an empty name and the
+// ContinueOnError error handling policy.
+func (f *FlagSet) Init(name string, errorHandling ErrorHandling) {
+ f.name = name
+ f.errorHandling = errorHandling
+ f.argsLenAtDash = -1
+}
diff --git a/vendor/github.com/spf13/pflag/float32.go b/vendor/github.com/spf13/pflag/float32.go
new file mode 100644
index 00000000000..a243f81f7fb
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/float32.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- float32 Value
+type float32Value float32
+
+func newFloat32Value(val float32, p *float32) *float32Value {
+ *p = val
+ return (*float32Value)(p)
+}
+
+func (f *float32Value) Set(s string) error {
+ v, err := strconv.ParseFloat(s, 32)
+ *f = float32Value(v)
+ return err
+}
+
+func (f *float32Value) Type() string {
+ return "float32"
+}
+
+func (f *float32Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 32) }
+
+func float32Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseFloat(sval, 32)
+ if err != nil {
+ return 0, err
+ }
+ return float32(v), nil
+}
+
+// GetFloat32 return the float32 value of a flag with the given name
+func (f *FlagSet) GetFloat32(name string) (float32, error) {
+ val, err := f.getFlagType(name, "float32", float32Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(float32), nil
+}
+
+// Float32Var defines a float32 flag with specified name, default value, and usage string.
+// The argument p points to a float32 variable in which to store the value of the flag.
+func (f *FlagSet) Float32Var(p *float32, name string, value float32, usage string) {
+ f.VarP(newFloat32Value(value, p), name, "", usage)
+}
+
+// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Float32VarP(p *float32, name, shorthand string, value float32, usage string) {
+ f.VarP(newFloat32Value(value, p), name, shorthand, usage)
+}
+
+// Float32Var defines a float32 flag with specified name, default value, and usage string.
+// The argument p points to a float32 variable in which to store the value of the flag.
+func Float32Var(p *float32, name string, value float32, usage string) {
+ CommandLine.VarP(newFloat32Value(value, p), name, "", usage)
+}
+
+// Float32VarP is like Float32Var, but accepts a shorthand letter that can be used after a single dash.
+func Float32VarP(p *float32, name, shorthand string, value float32, usage string) {
+ CommandLine.VarP(newFloat32Value(value, p), name, shorthand, usage)
+}
+
+// Float32 defines a float32 flag with specified name, default value, and usage string.
+// The return value is the address of a float32 variable that stores the value of the flag.
+func (f *FlagSet) Float32(name string, value float32, usage string) *float32 {
+ p := new(float32)
+ f.Float32VarP(p, name, "", value, usage)
+ return p
+}
+
+// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Float32P(name, shorthand string, value float32, usage string) *float32 {
+ p := new(float32)
+ f.Float32VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Float32 defines a float32 flag with specified name, default value, and usage string.
+// The return value is the address of a float32 variable that stores the value of the flag.
+func Float32(name string, value float32, usage string) *float32 {
+ return CommandLine.Float32P(name, "", value, usage)
+}
+
+// Float32P is like Float32, but accepts a shorthand letter that can be used after a single dash.
+func Float32P(name, shorthand string, value float32, usage string) *float32 {
+ return CommandLine.Float32P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/float64.go b/vendor/github.com/spf13/pflag/float64.go
new file mode 100644
index 00000000000..04b5492a7d3
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/float64.go
@@ -0,0 +1,84 @@
+package pflag
+
+import "strconv"
+
+// -- float64 Value
+type float64Value float64
+
+func newFloat64Value(val float64, p *float64) *float64Value {
+ *p = val
+ return (*float64Value)(p)
+}
+
+func (f *float64Value) Set(s string) error {
+ v, err := strconv.ParseFloat(s, 64)
+ *f = float64Value(v)
+ return err
+}
+
+func (f *float64Value) Type() string {
+ return "float64"
+}
+
+func (f *float64Value) String() string { return strconv.FormatFloat(float64(*f), 'g', -1, 64) }
+
+func float64Conv(sval string) (interface{}, error) {
+ return strconv.ParseFloat(sval, 64)
+}
+
+// GetFloat64 return the float64 value of a flag with the given name
+func (f *FlagSet) GetFloat64(name string) (float64, error) {
+ val, err := f.getFlagType(name, "float64", float64Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(float64), nil
+}
+
+// Float64Var defines a float64 flag with specified name, default value, and usage string.
+// The argument p points to a float64 variable in which to store the value of the flag.
+func (f *FlagSet) Float64Var(p *float64, name string, value float64, usage string) {
+ f.VarP(newFloat64Value(value, p), name, "", usage)
+}
+
+// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Float64VarP(p *float64, name, shorthand string, value float64, usage string) {
+ f.VarP(newFloat64Value(value, p), name, shorthand, usage)
+}
+
+// Float64Var defines a float64 flag with specified name, default value, and usage string.
+// The argument p points to a float64 variable in which to store the value of the flag.
+func Float64Var(p *float64, name string, value float64, usage string) {
+ CommandLine.VarP(newFloat64Value(value, p), name, "", usage)
+}
+
+// Float64VarP is like Float64Var, but accepts a shorthand letter that can be used after a single dash.
+func Float64VarP(p *float64, name, shorthand string, value float64, usage string) {
+ CommandLine.VarP(newFloat64Value(value, p), name, shorthand, usage)
+}
+
+// Float64 defines a float64 flag with specified name, default value, and usage string.
+// The return value is the address of a float64 variable that stores the value of the flag.
+func (f *FlagSet) Float64(name string, value float64, usage string) *float64 {
+ p := new(float64)
+ f.Float64VarP(p, name, "", value, usage)
+ return p
+}
+
+// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Float64P(name, shorthand string, value float64, usage string) *float64 {
+ p := new(float64)
+ f.Float64VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Float64 defines a float64 flag with specified name, default value, and usage string.
+// The return value is the address of a float64 variable that stores the value of the flag.
+func Float64(name string, value float64, usage string) *float64 {
+ return CommandLine.Float64P(name, "", value, usage)
+}
+
+// Float64P is like Float64, but accepts a shorthand letter that can be used after a single dash.
+func Float64P(name, shorthand string, value float64, usage string) *float64 {
+ return CommandLine.Float64P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/golangflag.go b/vendor/github.com/spf13/pflag/golangflag.go
new file mode 100644
index 00000000000..d3dd72b7fee
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/golangflag.go
@@ -0,0 +1,105 @@
+// 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 pflag
+
+import (
+ goflag "flag"
+ "reflect"
+ "strings"
+)
+
+// flagValueWrapper implements pflag.Value around a flag.Value. The main
+// difference here is the addition of the Type method that returns a string
+// name of the type. As this is generally unknown, we approximate that with
+// reflection.
+type flagValueWrapper struct {
+ inner goflag.Value
+ flagType string
+}
+
+// We are just copying the boolFlag interface out of goflag as that is what
+// they use to decide if a flag should get "true" when no arg is given.
+type goBoolFlag interface {
+ goflag.Value
+ IsBoolFlag() bool
+}
+
+func wrapFlagValue(v goflag.Value) Value {
+ // If the flag.Value happens to also be a pflag.Value, just use it directly.
+ if pv, ok := v.(Value); ok {
+ return pv
+ }
+
+ pv := &flagValueWrapper{
+ inner: v,
+ }
+
+ t := reflect.TypeOf(v)
+ if t.Kind() == reflect.Interface || t.Kind() == reflect.Ptr {
+ t = t.Elem()
+ }
+
+ pv.flagType = strings.TrimSuffix(t.Name(), "Value")
+ return pv
+}
+
+func (v *flagValueWrapper) String() string {
+ return v.inner.String()
+}
+
+func (v *flagValueWrapper) Set(s string) error {
+ return v.inner.Set(s)
+}
+
+func (v *flagValueWrapper) Type() string {
+ return v.flagType
+}
+
+// PFlagFromGoFlag will return a *pflag.Flag given a *flag.Flag
+// If the *flag.Flag.Name was a single character (ex: `v`) it will be accessiblei
+// with both `-v` and `--v` in flags. If the golang flag was more than a single
+// character (ex: `verbose`) it will only be accessible via `--verbose`
+func PFlagFromGoFlag(goflag *goflag.Flag) *Flag {
+ // Remember the default value as a string; it won't change.
+ flag := &Flag{
+ Name: goflag.Name,
+ Usage: goflag.Usage,
+ Value: wrapFlagValue(goflag.Value),
+ // Looks like golang flags don't set DefValue correctly :-(
+ //DefValue: goflag.DefValue,
+ DefValue: goflag.Value.String(),
+ }
+ // Ex: if the golang flag was -v, allow both -v and --v to work
+ if len(flag.Name) == 1 {
+ flag.Shorthand = flag.Name
+ }
+ if fv, ok := goflag.Value.(goBoolFlag); ok && fv.IsBoolFlag() {
+ flag.NoOptDefVal = "true"
+ }
+ return flag
+}
+
+// AddGoFlag will add the given *flag.Flag to the pflag.FlagSet
+func (f *FlagSet) AddGoFlag(goflag *goflag.Flag) {
+ if f.Lookup(goflag.Name) != nil {
+ return
+ }
+ newflag := PFlagFromGoFlag(goflag)
+ f.AddFlag(newflag)
+}
+
+// AddGoFlagSet will add the given *flag.FlagSet to the pflag.FlagSet
+func (f *FlagSet) AddGoFlagSet(newSet *goflag.FlagSet) {
+ if newSet == nil {
+ return
+ }
+ newSet.VisitAll(func(goflag *goflag.Flag) {
+ f.AddGoFlag(goflag)
+ })
+ if f.addedGoFlagSets == nil {
+ f.addedGoFlagSets = make([]*goflag.FlagSet, 0)
+ }
+ f.addedGoFlagSets = append(f.addedGoFlagSets, newSet)
+}
diff --git a/vendor/github.com/spf13/pflag/int.go b/vendor/github.com/spf13/pflag/int.go
new file mode 100644
index 00000000000..1474b89df66
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int.go
@@ -0,0 +1,84 @@
+package pflag
+
+import "strconv"
+
+// -- int Value
+type intValue int
+
+func newIntValue(val int, p *int) *intValue {
+ *p = val
+ return (*intValue)(p)
+}
+
+func (i *intValue) Set(s string) error {
+ v, err := strconv.ParseInt(s, 0, 64)
+ *i = intValue(v)
+ return err
+}
+
+func (i *intValue) Type() string {
+ return "int"
+}
+
+func (i *intValue) String() string { return strconv.Itoa(int(*i)) }
+
+func intConv(sval string) (interface{}, error) {
+ return strconv.Atoi(sval)
+}
+
+// GetInt return the int value of a flag with the given name
+func (f *FlagSet) GetInt(name string) (int, error) {
+ val, err := f.getFlagType(name, "int", intConv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(int), nil
+}
+
+// IntVar defines an int flag with specified name, default value, and usage string.
+// The argument p points to an int variable in which to store the value of the flag.
+func (f *FlagSet) IntVar(p *int, name string, value int, usage string) {
+ f.VarP(newIntValue(value, p), name, "", usage)
+}
+
+// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IntVarP(p *int, name, shorthand string, value int, usage string) {
+ f.VarP(newIntValue(value, p), name, shorthand, usage)
+}
+
+// IntVar defines an int flag with specified name, default value, and usage string.
+// The argument p points to an int variable in which to store the value of the flag.
+func IntVar(p *int, name string, value int, usage string) {
+ CommandLine.VarP(newIntValue(value, p), name, "", usage)
+}
+
+// IntVarP is like IntVar, but accepts a shorthand letter that can be used after a single dash.
+func IntVarP(p *int, name, shorthand string, value int, usage string) {
+ CommandLine.VarP(newIntValue(value, p), name, shorthand, usage)
+}
+
+// Int defines an int flag with specified name, default value, and usage string.
+// The return value is the address of an int variable that stores the value of the flag.
+func (f *FlagSet) Int(name string, value int, usage string) *int {
+ p := new(int)
+ f.IntVarP(p, name, "", value, usage)
+ return p
+}
+
+// IntP is like Int, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IntP(name, shorthand string, value int, usage string) *int {
+ p := new(int)
+ f.IntVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Int defines an int flag with specified name, default value, and usage string.
+// The return value is the address of an int variable that stores the value of the flag.
+func Int(name string, value int, usage string) *int {
+ return CommandLine.IntP(name, "", value, usage)
+}
+
+// IntP is like Int, but accepts a shorthand letter that can be used after a single dash.
+func IntP(name, shorthand string, value int, usage string) *int {
+ return CommandLine.IntP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/int16.go b/vendor/github.com/spf13/pflag/int16.go
new file mode 100644
index 00000000000..f1a01d05e69
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int16.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- int16 Value
+type int16Value int16
+
+func newInt16Value(val int16, p *int16) *int16Value {
+ *p = val
+ return (*int16Value)(p)
+}
+
+func (i *int16Value) Set(s string) error {
+ v, err := strconv.ParseInt(s, 0, 16)
+ *i = int16Value(v)
+ return err
+}
+
+func (i *int16Value) Type() string {
+ return "int16"
+}
+
+func (i *int16Value) String() string { return strconv.FormatInt(int64(*i), 10) }
+
+func int16Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseInt(sval, 0, 16)
+ if err != nil {
+ return 0, err
+ }
+ return int16(v), nil
+}
+
+// GetInt16 returns the int16 value of a flag with the given name
+func (f *FlagSet) GetInt16(name string) (int16, error) {
+ val, err := f.getFlagType(name, "int16", int16Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(int16), nil
+}
+
+// Int16Var defines an int16 flag with specified name, default value, and usage string.
+// The argument p points to an int16 variable in which to store the value of the flag.
+func (f *FlagSet) Int16Var(p *int16, name string, value int16, usage string) {
+ f.VarP(newInt16Value(value, p), name, "", usage)
+}
+
+// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int16VarP(p *int16, name, shorthand string, value int16, usage string) {
+ f.VarP(newInt16Value(value, p), name, shorthand, usage)
+}
+
+// Int16Var defines an int16 flag with specified name, default value, and usage string.
+// The argument p points to an int16 variable in which to store the value of the flag.
+func Int16Var(p *int16, name string, value int16, usage string) {
+ CommandLine.VarP(newInt16Value(value, p), name, "", usage)
+}
+
+// Int16VarP is like Int16Var, but accepts a shorthand letter that can be used after a single dash.
+func Int16VarP(p *int16, name, shorthand string, value int16, usage string) {
+ CommandLine.VarP(newInt16Value(value, p), name, shorthand, usage)
+}
+
+// Int16 defines an int16 flag with specified name, default value, and usage string.
+// The return value is the address of an int16 variable that stores the value of the flag.
+func (f *FlagSet) Int16(name string, value int16, usage string) *int16 {
+ p := new(int16)
+ f.Int16VarP(p, name, "", value, usage)
+ return p
+}
+
+// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int16P(name, shorthand string, value int16, usage string) *int16 {
+ p := new(int16)
+ f.Int16VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Int16 defines an int16 flag with specified name, default value, and usage string.
+// The return value is the address of an int16 variable that stores the value of the flag.
+func Int16(name string, value int16, usage string) *int16 {
+ return CommandLine.Int16P(name, "", value, usage)
+}
+
+// Int16P is like Int16, but accepts a shorthand letter that can be used after a single dash.
+func Int16P(name, shorthand string, value int16, usage string) *int16 {
+ return CommandLine.Int16P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/int32.go b/vendor/github.com/spf13/pflag/int32.go
new file mode 100644
index 00000000000..9b95944f0fe
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int32.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- int32 Value
+type int32Value int32
+
+func newInt32Value(val int32, p *int32) *int32Value {
+ *p = val
+ return (*int32Value)(p)
+}
+
+func (i *int32Value) Set(s string) error {
+ v, err := strconv.ParseInt(s, 0, 32)
+ *i = int32Value(v)
+ return err
+}
+
+func (i *int32Value) Type() string {
+ return "int32"
+}
+
+func (i *int32Value) String() string { return strconv.FormatInt(int64(*i), 10) }
+
+func int32Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseInt(sval, 0, 32)
+ if err != nil {
+ return 0, err
+ }
+ return int32(v), nil
+}
+
+// GetInt32 return the int32 value of a flag with the given name
+func (f *FlagSet) GetInt32(name string) (int32, error) {
+ val, err := f.getFlagType(name, "int32", int32Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(int32), nil
+}
+
+// Int32Var defines an int32 flag with specified name, default value, and usage string.
+// The argument p points to an int32 variable in which to store the value of the flag.
+func (f *FlagSet) Int32Var(p *int32, name string, value int32, usage string) {
+ f.VarP(newInt32Value(value, p), name, "", usage)
+}
+
+// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int32VarP(p *int32, name, shorthand string, value int32, usage string) {
+ f.VarP(newInt32Value(value, p), name, shorthand, usage)
+}
+
+// Int32Var defines an int32 flag with specified name, default value, and usage string.
+// The argument p points to an int32 variable in which to store the value of the flag.
+func Int32Var(p *int32, name string, value int32, usage string) {
+ CommandLine.VarP(newInt32Value(value, p), name, "", usage)
+}
+
+// Int32VarP is like Int32Var, but accepts a shorthand letter that can be used after a single dash.
+func Int32VarP(p *int32, name, shorthand string, value int32, usage string) {
+ CommandLine.VarP(newInt32Value(value, p), name, shorthand, usage)
+}
+
+// Int32 defines an int32 flag with specified name, default value, and usage string.
+// The return value is the address of an int32 variable that stores the value of the flag.
+func (f *FlagSet) Int32(name string, value int32, usage string) *int32 {
+ p := new(int32)
+ f.Int32VarP(p, name, "", value, usage)
+ return p
+}
+
+// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int32P(name, shorthand string, value int32, usage string) *int32 {
+ p := new(int32)
+ f.Int32VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Int32 defines an int32 flag with specified name, default value, and usage string.
+// The return value is the address of an int32 variable that stores the value of the flag.
+func Int32(name string, value int32, usage string) *int32 {
+ return CommandLine.Int32P(name, "", value, usage)
+}
+
+// Int32P is like Int32, but accepts a shorthand letter that can be used after a single dash.
+func Int32P(name, shorthand string, value int32, usage string) *int32 {
+ return CommandLine.Int32P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/int64.go b/vendor/github.com/spf13/pflag/int64.go
new file mode 100644
index 00000000000..0026d781d9f
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int64.go
@@ -0,0 +1,84 @@
+package pflag
+
+import "strconv"
+
+// -- int64 Value
+type int64Value int64
+
+func newInt64Value(val int64, p *int64) *int64Value {
+ *p = val
+ return (*int64Value)(p)
+}
+
+func (i *int64Value) Set(s string) error {
+ v, err := strconv.ParseInt(s, 0, 64)
+ *i = int64Value(v)
+ return err
+}
+
+func (i *int64Value) Type() string {
+ return "int64"
+}
+
+func (i *int64Value) String() string { return strconv.FormatInt(int64(*i), 10) }
+
+func int64Conv(sval string) (interface{}, error) {
+ return strconv.ParseInt(sval, 0, 64)
+}
+
+// GetInt64 return the int64 value of a flag with the given name
+func (f *FlagSet) GetInt64(name string) (int64, error) {
+ val, err := f.getFlagType(name, "int64", int64Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(int64), nil
+}
+
+// Int64Var defines an int64 flag with specified name, default value, and usage string.
+// The argument p points to an int64 variable in which to store the value of the flag.
+func (f *FlagSet) Int64Var(p *int64, name string, value int64, usage string) {
+ f.VarP(newInt64Value(value, p), name, "", usage)
+}
+
+// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int64VarP(p *int64, name, shorthand string, value int64, usage string) {
+ f.VarP(newInt64Value(value, p), name, shorthand, usage)
+}
+
+// Int64Var defines an int64 flag with specified name, default value, and usage string.
+// The argument p points to an int64 variable in which to store the value of the flag.
+func Int64Var(p *int64, name string, value int64, usage string) {
+ CommandLine.VarP(newInt64Value(value, p), name, "", usage)
+}
+
+// Int64VarP is like Int64Var, but accepts a shorthand letter that can be used after a single dash.
+func Int64VarP(p *int64, name, shorthand string, value int64, usage string) {
+ CommandLine.VarP(newInt64Value(value, p), name, shorthand, usage)
+}
+
+// Int64 defines an int64 flag with specified name, default value, and usage string.
+// The return value is the address of an int64 variable that stores the value of the flag.
+func (f *FlagSet) Int64(name string, value int64, usage string) *int64 {
+ p := new(int64)
+ f.Int64VarP(p, name, "", value, usage)
+ return p
+}
+
+// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int64P(name, shorthand string, value int64, usage string) *int64 {
+ p := new(int64)
+ f.Int64VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Int64 defines an int64 flag with specified name, default value, and usage string.
+// The return value is the address of an int64 variable that stores the value of the flag.
+func Int64(name string, value int64, usage string) *int64 {
+ return CommandLine.Int64P(name, "", value, usage)
+}
+
+// Int64P is like Int64, but accepts a shorthand letter that can be used after a single dash.
+func Int64P(name, shorthand string, value int64, usage string) *int64 {
+ return CommandLine.Int64P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/int8.go b/vendor/github.com/spf13/pflag/int8.go
new file mode 100644
index 00000000000..4da92228e63
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int8.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- int8 Value
+type int8Value int8
+
+func newInt8Value(val int8, p *int8) *int8Value {
+ *p = val
+ return (*int8Value)(p)
+}
+
+func (i *int8Value) Set(s string) error {
+ v, err := strconv.ParseInt(s, 0, 8)
+ *i = int8Value(v)
+ return err
+}
+
+func (i *int8Value) Type() string {
+ return "int8"
+}
+
+func (i *int8Value) String() string { return strconv.FormatInt(int64(*i), 10) }
+
+func int8Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseInt(sval, 0, 8)
+ if err != nil {
+ return 0, err
+ }
+ return int8(v), nil
+}
+
+// GetInt8 return the int8 value of a flag with the given name
+func (f *FlagSet) GetInt8(name string) (int8, error) {
+ val, err := f.getFlagType(name, "int8", int8Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(int8), nil
+}
+
+// Int8Var defines an int8 flag with specified name, default value, and usage string.
+// The argument p points to an int8 variable in which to store the value of the flag.
+func (f *FlagSet) Int8Var(p *int8, name string, value int8, usage string) {
+ f.VarP(newInt8Value(value, p), name, "", usage)
+}
+
+// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int8VarP(p *int8, name, shorthand string, value int8, usage string) {
+ f.VarP(newInt8Value(value, p), name, shorthand, usage)
+}
+
+// Int8Var defines an int8 flag with specified name, default value, and usage string.
+// The argument p points to an int8 variable in which to store the value of the flag.
+func Int8Var(p *int8, name string, value int8, usage string) {
+ CommandLine.VarP(newInt8Value(value, p), name, "", usage)
+}
+
+// Int8VarP is like Int8Var, but accepts a shorthand letter that can be used after a single dash.
+func Int8VarP(p *int8, name, shorthand string, value int8, usage string) {
+ CommandLine.VarP(newInt8Value(value, p), name, shorthand, usage)
+}
+
+// Int8 defines an int8 flag with specified name, default value, and usage string.
+// The return value is the address of an int8 variable that stores the value of the flag.
+func (f *FlagSet) Int8(name string, value int8, usage string) *int8 {
+ p := new(int8)
+ f.Int8VarP(p, name, "", value, usage)
+ return p
+}
+
+// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Int8P(name, shorthand string, value int8, usage string) *int8 {
+ p := new(int8)
+ f.Int8VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Int8 defines an int8 flag with specified name, default value, and usage string.
+// The return value is the address of an int8 variable that stores the value of the flag.
+func Int8(name string, value int8, usage string) *int8 {
+ return CommandLine.Int8P(name, "", value, usage)
+}
+
+// Int8P is like Int8, but accepts a shorthand letter that can be used after a single dash.
+func Int8P(name, shorthand string, value int8, usage string) *int8 {
+ return CommandLine.Int8P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/int_slice.go b/vendor/github.com/spf13/pflag/int_slice.go
new file mode 100644
index 00000000000..1e7c9edde95
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/int_slice.go
@@ -0,0 +1,128 @@
+package pflag
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// -- intSlice Value
+type intSliceValue struct {
+ value *[]int
+ changed bool
+}
+
+func newIntSliceValue(val []int, p *[]int) *intSliceValue {
+ isv := new(intSliceValue)
+ isv.value = p
+ *isv.value = val
+ return isv
+}
+
+func (s *intSliceValue) Set(val string) error {
+ ss := strings.Split(val, ",")
+ out := make([]int, len(ss))
+ for i, d := range ss {
+ var err error
+ out[i], err = strconv.Atoi(d)
+ if err != nil {
+ return err
+ }
+
+ }
+ if !s.changed {
+ *s.value = out
+ } else {
+ *s.value = append(*s.value, out...)
+ }
+ s.changed = true
+ return nil
+}
+
+func (s *intSliceValue) Type() string {
+ return "intSlice"
+}
+
+func (s *intSliceValue) String() string {
+ out := make([]string, len(*s.value))
+ for i, d := range *s.value {
+ out[i] = fmt.Sprintf("%d", d)
+ }
+ return "[" + strings.Join(out, ",") + "]"
+}
+
+func intSliceConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // Empty string would cause a slice with one (empty) entry
+ if len(val) == 0 {
+ return []int{}, nil
+ }
+ ss := strings.Split(val, ",")
+ out := make([]int, len(ss))
+ for i, d := range ss {
+ var err error
+ out[i], err = strconv.Atoi(d)
+ if err != nil {
+ return nil, err
+ }
+
+ }
+ return out, nil
+}
+
+// GetIntSlice return the []int value of a flag with the given name
+func (f *FlagSet) GetIntSlice(name string) ([]int, error) {
+ val, err := f.getFlagType(name, "intSlice", intSliceConv)
+ if err != nil {
+ return []int{}, err
+ }
+ return val.([]int), nil
+}
+
+// IntSliceVar defines a intSlice flag with specified name, default value, and usage string.
+// The argument p points to a []int variable in which to store the value of the flag.
+func (f *FlagSet) IntSliceVar(p *[]int, name string, value []int, usage string) {
+ f.VarP(newIntSliceValue(value, p), name, "", usage)
+}
+
+// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) {
+ f.VarP(newIntSliceValue(value, p), name, shorthand, usage)
+}
+
+// IntSliceVar defines a int[] flag with specified name, default value, and usage string.
+// The argument p points to a int[] variable in which to store the value of the flag.
+func IntSliceVar(p *[]int, name string, value []int, usage string) {
+ CommandLine.VarP(newIntSliceValue(value, p), name, "", usage)
+}
+
+// IntSliceVarP is like IntSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func IntSliceVarP(p *[]int, name, shorthand string, value []int, usage string) {
+ CommandLine.VarP(newIntSliceValue(value, p), name, shorthand, usage)
+}
+
+// IntSlice defines a []int flag with specified name, default value, and usage string.
+// The return value is the address of a []int variable that stores the value of the flag.
+func (f *FlagSet) IntSlice(name string, value []int, usage string) *[]int {
+ p := []int{}
+ f.IntSliceVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IntSliceP(name, shorthand string, value []int, usage string) *[]int {
+ p := []int{}
+ f.IntSliceVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// IntSlice defines a []int flag with specified name, default value, and usage string.
+// The return value is the address of a []int variable that stores the value of the flag.
+func IntSlice(name string, value []int, usage string) *[]int {
+ return CommandLine.IntSliceP(name, "", value, usage)
+}
+
+// IntSliceP is like IntSlice, but accepts a shorthand letter that can be used after a single dash.
+func IntSliceP(name, shorthand string, value []int, usage string) *[]int {
+ return CommandLine.IntSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/ip.go b/vendor/github.com/spf13/pflag/ip.go
new file mode 100644
index 00000000000..3d414ba69fe
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/ip.go
@@ -0,0 +1,94 @@
+package pflag
+
+import (
+ "fmt"
+ "net"
+ "strings"
+)
+
+// -- net.IP value
+type ipValue net.IP
+
+func newIPValue(val net.IP, p *net.IP) *ipValue {
+ *p = val
+ return (*ipValue)(p)
+}
+
+func (i *ipValue) String() string { return net.IP(*i).String() }
+func (i *ipValue) Set(s string) error {
+ ip := net.ParseIP(strings.TrimSpace(s))
+ if ip == nil {
+ return fmt.Errorf("failed to parse IP: %q", s)
+ }
+ *i = ipValue(ip)
+ return nil
+}
+
+func (i *ipValue) Type() string {
+ return "ip"
+}
+
+func ipConv(sval string) (interface{}, error) {
+ ip := net.ParseIP(sval)
+ if ip != nil {
+ return ip, nil
+ }
+ return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval)
+}
+
+// GetIP return the net.IP value of a flag with the given name
+func (f *FlagSet) GetIP(name string) (net.IP, error) {
+ val, err := f.getFlagType(name, "ip", ipConv)
+ if err != nil {
+ return nil, err
+ }
+ return val.(net.IP), nil
+}
+
+// IPVar defines an net.IP flag with specified name, default value, and usage string.
+// The argument p points to an net.IP variable in which to store the value of the flag.
+func (f *FlagSet) IPVar(p *net.IP, name string, value net.IP, usage string) {
+ f.VarP(newIPValue(value, p), name, "", usage)
+}
+
+// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) {
+ f.VarP(newIPValue(value, p), name, shorthand, usage)
+}
+
+// IPVar defines an net.IP flag with specified name, default value, and usage string.
+// The argument p points to an net.IP variable in which to store the value of the flag.
+func IPVar(p *net.IP, name string, value net.IP, usage string) {
+ CommandLine.VarP(newIPValue(value, p), name, "", usage)
+}
+
+// IPVarP is like IPVar, but accepts a shorthand letter that can be used after a single dash.
+func IPVarP(p *net.IP, name, shorthand string, value net.IP, usage string) {
+ CommandLine.VarP(newIPValue(value, p), name, shorthand, usage)
+}
+
+// IP defines an net.IP flag with specified name, default value, and usage string.
+// The return value is the address of an net.IP variable that stores the value of the flag.
+func (f *FlagSet) IP(name string, value net.IP, usage string) *net.IP {
+ p := new(net.IP)
+ f.IPVarP(p, name, "", value, usage)
+ return p
+}
+
+// IPP is like IP, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPP(name, shorthand string, value net.IP, usage string) *net.IP {
+ p := new(net.IP)
+ f.IPVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// IP defines an net.IP flag with specified name, default value, and usage string.
+// The return value is the address of an net.IP variable that stores the value of the flag.
+func IP(name string, value net.IP, usage string) *net.IP {
+ return CommandLine.IPP(name, "", value, usage)
+}
+
+// IPP is like IP, but accepts a shorthand letter that can be used after a single dash.
+func IPP(name, shorthand string, value net.IP, usage string) *net.IP {
+ return CommandLine.IPP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/ip_slice.go b/vendor/github.com/spf13/pflag/ip_slice.go
new file mode 100644
index 00000000000..7dd196fe3fb
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/ip_slice.go
@@ -0,0 +1,148 @@
+package pflag
+
+import (
+ "fmt"
+ "io"
+ "net"
+ "strings"
+)
+
+// -- ipSlice Value
+type ipSliceValue struct {
+ value *[]net.IP
+ changed bool
+}
+
+func newIPSliceValue(val []net.IP, p *[]net.IP) *ipSliceValue {
+ ipsv := new(ipSliceValue)
+ ipsv.value = p
+ *ipsv.value = val
+ return ipsv
+}
+
+// Set converts, and assigns, the comma-separated IP argument string representation as the []net.IP value of this flag.
+// If Set is called on a flag that already has a []net.IP assigned, the newly converted values will be appended.
+func (s *ipSliceValue) Set(val string) error {
+
+ // remove all quote characters
+ rmQuote := strings.NewReplacer(`"`, "", `'`, "", "`", "")
+
+ // read flag arguments with CSV parser
+ ipStrSlice, err := readAsCSV(rmQuote.Replace(val))
+ if err != nil && err != io.EOF {
+ return err
+ }
+
+ // parse ip values into slice
+ out := make([]net.IP, 0, len(ipStrSlice))
+ for _, ipStr := range ipStrSlice {
+ ip := net.ParseIP(strings.TrimSpace(ipStr))
+ if ip == nil {
+ return fmt.Errorf("invalid string being converted to IP address: %s", ipStr)
+ }
+ out = append(out, ip)
+ }
+
+ if !s.changed {
+ *s.value = out
+ } else {
+ *s.value = append(*s.value, out...)
+ }
+
+ s.changed = true
+
+ return nil
+}
+
+// Type returns a string that uniquely represents this flag's type.
+func (s *ipSliceValue) Type() string {
+ return "ipSlice"
+}
+
+// String defines a "native" format for this net.IP slice flag value.
+func (s *ipSliceValue) String() string {
+
+ ipStrSlice := make([]string, len(*s.value))
+ for i, ip := range *s.value {
+ ipStrSlice[i] = ip.String()
+ }
+
+ out, _ := writeAsCSV(ipStrSlice)
+
+ return "[" + out + "]"
+}
+
+func ipSliceConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // Emtpy string would cause a slice with one (empty) entry
+ if len(val) == 0 {
+ return []net.IP{}, nil
+ }
+ ss := strings.Split(val, ",")
+ out := make([]net.IP, len(ss))
+ for i, sval := range ss {
+ ip := net.ParseIP(strings.TrimSpace(sval))
+ if ip == nil {
+ return nil, fmt.Errorf("invalid string being converted to IP address: %s", sval)
+ }
+ out[i] = ip
+ }
+ return out, nil
+}
+
+// GetIPSlice returns the []net.IP value of a flag with the given name
+func (f *FlagSet) GetIPSlice(name string) ([]net.IP, error) {
+ val, err := f.getFlagType(name, "ipSlice", ipSliceConv)
+ if err != nil {
+ return []net.IP{}, err
+ }
+ return val.([]net.IP), nil
+}
+
+// IPSliceVar defines a ipSlice flag with specified name, default value, and usage string.
+// The argument p points to a []net.IP variable in which to store the value of the flag.
+func (f *FlagSet) IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) {
+ f.VarP(newIPSliceValue(value, p), name, "", usage)
+}
+
+// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) {
+ f.VarP(newIPSliceValue(value, p), name, shorthand, usage)
+}
+
+// IPSliceVar defines a []net.IP flag with specified name, default value, and usage string.
+// The argument p points to a []net.IP variable in which to store the value of the flag.
+func IPSliceVar(p *[]net.IP, name string, value []net.IP, usage string) {
+ CommandLine.VarP(newIPSliceValue(value, p), name, "", usage)
+}
+
+// IPSliceVarP is like IPSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func IPSliceVarP(p *[]net.IP, name, shorthand string, value []net.IP, usage string) {
+ CommandLine.VarP(newIPSliceValue(value, p), name, shorthand, usage)
+}
+
+// IPSlice defines a []net.IP flag with specified name, default value, and usage string.
+// The return value is the address of a []net.IP variable that stores the value of that flag.
+func (f *FlagSet) IPSlice(name string, value []net.IP, usage string) *[]net.IP {
+ p := []net.IP{}
+ f.IPSliceVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP {
+ p := []net.IP{}
+ f.IPSliceVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// IPSlice defines a []net.IP flag with specified name, default value, and usage string.
+// The return value is the address of a []net.IP variable that stores the value of the flag.
+func IPSlice(name string, value []net.IP, usage string) *[]net.IP {
+ return CommandLine.IPSliceP(name, "", value, usage)
+}
+
+// IPSliceP is like IPSlice, but accepts a shorthand letter that can be used after a single dash.
+func IPSliceP(name, shorthand string, value []net.IP, usage string) *[]net.IP {
+ return CommandLine.IPSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/ipmask.go b/vendor/github.com/spf13/pflag/ipmask.go
new file mode 100644
index 00000000000..5bd44bd21d2
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/ipmask.go
@@ -0,0 +1,122 @@
+package pflag
+
+import (
+ "fmt"
+ "net"
+ "strconv"
+)
+
+// -- net.IPMask value
+type ipMaskValue net.IPMask
+
+func newIPMaskValue(val net.IPMask, p *net.IPMask) *ipMaskValue {
+ *p = val
+ return (*ipMaskValue)(p)
+}
+
+func (i *ipMaskValue) String() string { return net.IPMask(*i).String() }
+func (i *ipMaskValue) Set(s string) error {
+ ip := ParseIPv4Mask(s)
+ if ip == nil {
+ return fmt.Errorf("failed to parse IP mask: %q", s)
+ }
+ *i = ipMaskValue(ip)
+ return nil
+}
+
+func (i *ipMaskValue) Type() string {
+ return "ipMask"
+}
+
+// ParseIPv4Mask written in IP form (e.g. 255.255.255.0).
+// This function should really belong to the net package.
+func ParseIPv4Mask(s string) net.IPMask {
+ mask := net.ParseIP(s)
+ if mask == nil {
+ if len(s) != 8 {
+ return nil
+ }
+ // net.IPMask.String() actually outputs things like ffffff00
+ // so write a horrible parser for that as well :-(
+ m := []int{}
+ for i := 0; i < 4; i++ {
+ b := "0x" + s[2*i:2*i+2]
+ d, err := strconv.ParseInt(b, 0, 0)
+ if err != nil {
+ return nil
+ }
+ m = append(m, int(d))
+ }
+ s := fmt.Sprintf("%d.%d.%d.%d", m[0], m[1], m[2], m[3])
+ mask = net.ParseIP(s)
+ if mask == nil {
+ return nil
+ }
+ }
+ return net.IPv4Mask(mask[12], mask[13], mask[14], mask[15])
+}
+
+func parseIPv4Mask(sval string) (interface{}, error) {
+ mask := ParseIPv4Mask(sval)
+ if mask == nil {
+ return nil, fmt.Errorf("unable to parse %s as net.IPMask", sval)
+ }
+ return mask, nil
+}
+
+// GetIPv4Mask return the net.IPv4Mask value of a flag with the given name
+func (f *FlagSet) GetIPv4Mask(name string) (net.IPMask, error) {
+ val, err := f.getFlagType(name, "ipMask", parseIPv4Mask)
+ if err != nil {
+ return nil, err
+ }
+ return val.(net.IPMask), nil
+}
+
+// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string.
+// The argument p points to an net.IPMask variable in which to store the value of the flag.
+func (f *FlagSet) IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) {
+ f.VarP(newIPMaskValue(value, p), name, "", usage)
+}
+
+// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) {
+ f.VarP(newIPMaskValue(value, p), name, shorthand, usage)
+}
+
+// IPMaskVar defines an net.IPMask flag with specified name, default value, and usage string.
+// The argument p points to an net.IPMask variable in which to store the value of the flag.
+func IPMaskVar(p *net.IPMask, name string, value net.IPMask, usage string) {
+ CommandLine.VarP(newIPMaskValue(value, p), name, "", usage)
+}
+
+// IPMaskVarP is like IPMaskVar, but accepts a shorthand letter that can be used after a single dash.
+func IPMaskVarP(p *net.IPMask, name, shorthand string, value net.IPMask, usage string) {
+ CommandLine.VarP(newIPMaskValue(value, p), name, shorthand, usage)
+}
+
+// IPMask defines an net.IPMask flag with specified name, default value, and usage string.
+// The return value is the address of an net.IPMask variable that stores the value of the flag.
+func (f *FlagSet) IPMask(name string, value net.IPMask, usage string) *net.IPMask {
+ p := new(net.IPMask)
+ f.IPMaskVarP(p, name, "", value, usage)
+ return p
+}
+
+// IPMaskP is like IPMask, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask {
+ p := new(net.IPMask)
+ f.IPMaskVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// IPMask defines an net.IPMask flag with specified name, default value, and usage string.
+// The return value is the address of an net.IPMask variable that stores the value of the flag.
+func IPMask(name string, value net.IPMask, usage string) *net.IPMask {
+ return CommandLine.IPMaskP(name, "", value, usage)
+}
+
+// IPMaskP is like IP, but accepts a shorthand letter that can be used after a single dash.
+func IPMaskP(name, shorthand string, value net.IPMask, usage string) *net.IPMask {
+ return CommandLine.IPMaskP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/ipnet.go b/vendor/github.com/spf13/pflag/ipnet.go
new file mode 100644
index 00000000000..e2c1b8bcd53
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/ipnet.go
@@ -0,0 +1,98 @@
+package pflag
+
+import (
+ "fmt"
+ "net"
+ "strings"
+)
+
+// IPNet adapts net.IPNet for use as a flag.
+type ipNetValue net.IPNet
+
+func (ipnet ipNetValue) String() string {
+ n := net.IPNet(ipnet)
+ return n.String()
+}
+
+func (ipnet *ipNetValue) Set(value string) error {
+ _, n, err := net.ParseCIDR(strings.TrimSpace(value))
+ if err != nil {
+ return err
+ }
+ *ipnet = ipNetValue(*n)
+ return nil
+}
+
+func (*ipNetValue) Type() string {
+ return "ipNet"
+}
+
+func newIPNetValue(val net.IPNet, p *net.IPNet) *ipNetValue {
+ *p = val
+ return (*ipNetValue)(p)
+}
+
+func ipNetConv(sval string) (interface{}, error) {
+ _, n, err := net.ParseCIDR(strings.TrimSpace(sval))
+ if err == nil {
+ return *n, nil
+ }
+ return nil, fmt.Errorf("invalid string being converted to IPNet: %s", sval)
+}
+
+// GetIPNet return the net.IPNet value of a flag with the given name
+func (f *FlagSet) GetIPNet(name string) (net.IPNet, error) {
+ val, err := f.getFlagType(name, "ipNet", ipNetConv)
+ if err != nil {
+ return net.IPNet{}, err
+ }
+ return val.(net.IPNet), nil
+}
+
+// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string.
+// The argument p points to an net.IPNet variable in which to store the value of the flag.
+func (f *FlagSet) IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) {
+ f.VarP(newIPNetValue(value, p), name, "", usage)
+}
+
+// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) {
+ f.VarP(newIPNetValue(value, p), name, shorthand, usage)
+}
+
+// IPNetVar defines an net.IPNet flag with specified name, default value, and usage string.
+// The argument p points to an net.IPNet variable in which to store the value of the flag.
+func IPNetVar(p *net.IPNet, name string, value net.IPNet, usage string) {
+ CommandLine.VarP(newIPNetValue(value, p), name, "", usage)
+}
+
+// IPNetVarP is like IPNetVar, but accepts a shorthand letter that can be used after a single dash.
+func IPNetVarP(p *net.IPNet, name, shorthand string, value net.IPNet, usage string) {
+ CommandLine.VarP(newIPNetValue(value, p), name, shorthand, usage)
+}
+
+// IPNet defines an net.IPNet flag with specified name, default value, and usage string.
+// The return value is the address of an net.IPNet variable that stores the value of the flag.
+func (f *FlagSet) IPNet(name string, value net.IPNet, usage string) *net.IPNet {
+ p := new(net.IPNet)
+ f.IPNetVarP(p, name, "", value, usage)
+ return p
+}
+
+// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet {
+ p := new(net.IPNet)
+ f.IPNetVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// IPNet defines an net.IPNet flag with specified name, default value, and usage string.
+// The return value is the address of an net.IPNet variable that stores the value of the flag.
+func IPNet(name string, value net.IPNet, usage string) *net.IPNet {
+ return CommandLine.IPNetP(name, "", value, usage)
+}
+
+// IPNetP is like IPNet, but accepts a shorthand letter that can be used after a single dash.
+func IPNetP(name, shorthand string, value net.IPNet, usage string) *net.IPNet {
+ return CommandLine.IPNetP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string.go b/vendor/github.com/spf13/pflag/string.go
new file mode 100644
index 00000000000..04e0a26ff7f
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/string.go
@@ -0,0 +1,80 @@
+package pflag
+
+// -- string Value
+type stringValue string
+
+func newStringValue(val string, p *string) *stringValue {
+ *p = val
+ return (*stringValue)(p)
+}
+
+func (s *stringValue) Set(val string) error {
+ *s = stringValue(val)
+ return nil
+}
+func (s *stringValue) Type() string {
+ return "string"
+}
+
+func (s *stringValue) String() string { return string(*s) }
+
+func stringConv(sval string) (interface{}, error) {
+ return sval, nil
+}
+
+// GetString return the string value of a flag with the given name
+func (f *FlagSet) GetString(name string) (string, error) {
+ val, err := f.getFlagType(name, "string", stringConv)
+ if err != nil {
+ return "", err
+ }
+ return val.(string), nil
+}
+
+// StringVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a string variable in which to store the value of the flag.
+func (f *FlagSet) StringVar(p *string, name string, value string, usage string) {
+ f.VarP(newStringValue(value, p), name, "", usage)
+}
+
+// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringVarP(p *string, name, shorthand string, value string, usage string) {
+ f.VarP(newStringValue(value, p), name, shorthand, usage)
+}
+
+// StringVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a string variable in which to store the value of the flag.
+func StringVar(p *string, name string, value string, usage string) {
+ CommandLine.VarP(newStringValue(value, p), name, "", usage)
+}
+
+// StringVarP is like StringVar, but accepts a shorthand letter that can be used after a single dash.
+func StringVarP(p *string, name, shorthand string, value string, usage string) {
+ CommandLine.VarP(newStringValue(value, p), name, shorthand, usage)
+}
+
+// String defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a string variable that stores the value of the flag.
+func (f *FlagSet) String(name string, value string, usage string) *string {
+ p := new(string)
+ f.StringVarP(p, name, "", value, usage)
+ return p
+}
+
+// StringP is like String, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringP(name, shorthand string, value string, usage string) *string {
+ p := new(string)
+ f.StringVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// String defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a string variable that stores the value of the flag.
+func String(name string, value string, usage string) *string {
+ return CommandLine.StringP(name, "", value, usage)
+}
+
+// StringP is like String, but accepts a shorthand letter that can be used after a single dash.
+func StringP(name, shorthand string, value string, usage string) *string {
+ return CommandLine.StringP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string_array.go b/vendor/github.com/spf13/pflag/string_array.go
new file mode 100644
index 00000000000..fa7bc60187a
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/string_array.go
@@ -0,0 +1,103 @@
+package pflag
+
+// -- stringArray Value
+type stringArrayValue struct {
+ value *[]string
+ changed bool
+}
+
+func newStringArrayValue(val []string, p *[]string) *stringArrayValue {
+ ssv := new(stringArrayValue)
+ ssv.value = p
+ *ssv.value = val
+ return ssv
+}
+
+func (s *stringArrayValue) Set(val string) error {
+ if !s.changed {
+ *s.value = []string{val}
+ s.changed = true
+ } else {
+ *s.value = append(*s.value, val)
+ }
+ return nil
+}
+
+func (s *stringArrayValue) Type() string {
+ return "stringArray"
+}
+
+func (s *stringArrayValue) String() string {
+ str, _ := writeAsCSV(*s.value)
+ return "[" + str + "]"
+}
+
+func stringArrayConv(sval string) (interface{}, error) {
+ sval = sval[1 : len(sval)-1]
+ // An empty string would cause a array with one (empty) string
+ if len(sval) == 0 {
+ return []string{}, nil
+ }
+ return readAsCSV(sval)
+}
+
+// GetStringArray return the []string value of a flag with the given name
+func (f *FlagSet) GetStringArray(name string) ([]string, error) {
+ val, err := f.getFlagType(name, "stringArray", stringArrayConv)
+ if err != nil {
+ return []string{}, err
+ }
+ return val.([]string), nil
+}
+
+// StringArrayVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a []string variable in which to store the values of the multiple flags.
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
+func (f *FlagSet) StringArrayVar(p *[]string, name string, value []string, usage string) {
+ f.VarP(newStringArrayValue(value, p), name, "", usage)
+}
+
+// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) {
+ f.VarP(newStringArrayValue(value, p), name, shorthand, usage)
+}
+
+// StringArrayVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a []string variable in which to store the value of the flag.
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
+func StringArrayVar(p *[]string, name string, value []string, usage string) {
+ CommandLine.VarP(newStringArrayValue(value, p), name, "", usage)
+}
+
+// StringArrayVarP is like StringArrayVar, but accepts a shorthand letter that can be used after a single dash.
+func StringArrayVarP(p *[]string, name, shorthand string, value []string, usage string) {
+ CommandLine.VarP(newStringArrayValue(value, p), name, shorthand, usage)
+}
+
+// StringArray defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a []string variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
+func (f *FlagSet) StringArray(name string, value []string, usage string) *[]string {
+ p := []string{}
+ f.StringArrayVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringArrayP(name, shorthand string, value []string, usage string) *[]string {
+ p := []string{}
+ f.StringArrayVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// StringArray defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a []string variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma. Use a StringSlice for that.
+func StringArray(name string, value []string, usage string) *[]string {
+ return CommandLine.StringArrayP(name, "", value, usage)
+}
+
+// StringArrayP is like StringArray, but accepts a shorthand letter that can be used after a single dash.
+func StringArrayP(name, shorthand string, value []string, usage string) *[]string {
+ return CommandLine.StringArrayP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string_slice.go b/vendor/github.com/spf13/pflag/string_slice.go
new file mode 100644
index 00000000000..0cd3ccc083e
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/string_slice.go
@@ -0,0 +1,149 @@
+package pflag
+
+import (
+ "bytes"
+ "encoding/csv"
+ "strings"
+)
+
+// -- stringSlice Value
+type stringSliceValue struct {
+ value *[]string
+ changed bool
+}
+
+func newStringSliceValue(val []string, p *[]string) *stringSliceValue {
+ ssv := new(stringSliceValue)
+ ssv.value = p
+ *ssv.value = val
+ return ssv
+}
+
+func readAsCSV(val string) ([]string, error) {
+ if val == "" {
+ return []string{}, nil
+ }
+ stringReader := strings.NewReader(val)
+ csvReader := csv.NewReader(stringReader)
+ return csvReader.Read()
+}
+
+func writeAsCSV(vals []string) (string, error) {
+ b := &bytes.Buffer{}
+ w := csv.NewWriter(b)
+ err := w.Write(vals)
+ if err != nil {
+ return "", err
+ }
+ w.Flush()
+ return strings.TrimSuffix(b.String(), "\n"), nil
+}
+
+func (s *stringSliceValue) Set(val string) error {
+ v, err := readAsCSV(val)
+ if err != nil {
+ return err
+ }
+ if !s.changed {
+ *s.value = v
+ } else {
+ *s.value = append(*s.value, v...)
+ }
+ s.changed = true
+ return nil
+}
+
+func (s *stringSliceValue) Type() string {
+ return "stringSlice"
+}
+
+func (s *stringSliceValue) String() string {
+ str, _ := writeAsCSV(*s.value)
+ return "[" + str + "]"
+}
+
+func stringSliceConv(sval string) (interface{}, error) {
+ sval = sval[1 : len(sval)-1]
+ // An empty string would cause a slice with one (empty) string
+ if len(sval) == 0 {
+ return []string{}, nil
+ }
+ return readAsCSV(sval)
+}
+
+// GetStringSlice return the []string value of a flag with the given name
+func (f *FlagSet) GetStringSlice(name string) ([]string, error) {
+ val, err := f.getFlagType(name, "stringSlice", stringSliceConv)
+ if err != nil {
+ return []string{}, err
+ }
+ return val.([]string), nil
+}
+
+// StringSliceVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a []string variable in which to store the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+// --ss="v1,v2" -ss="v3"
+// will result in
+// []string{"v1", "v2", "v3"}
+func (f *FlagSet) StringSliceVar(p *[]string, name string, value []string, usage string) {
+ f.VarP(newStringSliceValue(value, p), name, "", usage)
+}
+
+// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) {
+ f.VarP(newStringSliceValue(value, p), name, shorthand, usage)
+}
+
+// StringSliceVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a []string variable in which to store the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+// --ss="v1,v2" -ss="v3"
+// will result in
+// []string{"v1", "v2", "v3"}
+func StringSliceVar(p *[]string, name string, value []string, usage string) {
+ CommandLine.VarP(newStringSliceValue(value, p), name, "", usage)
+}
+
+// StringSliceVarP is like StringSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func StringSliceVarP(p *[]string, name, shorthand string, value []string, usage string) {
+ CommandLine.VarP(newStringSliceValue(value, p), name, shorthand, usage)
+}
+
+// StringSlice defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a []string variable that stores the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+// --ss="v1,v2" -ss="v3"
+// will result in
+// []string{"v1", "v2", "v3"}
+func (f *FlagSet) StringSlice(name string, value []string, usage string) *[]string {
+ p := []string{}
+ f.StringSliceVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringSliceP(name, shorthand string, value []string, usage string) *[]string {
+ p := []string{}
+ f.StringSliceVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// StringSlice defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a []string variable that stores the value of the flag.
+// Compared to StringArray flags, StringSlice flags take comma-separated value as arguments and split them accordingly.
+// For example:
+// --ss="v1,v2" -ss="v3"
+// will result in
+// []string{"v1", "v2", "v3"}
+func StringSlice(name string, value []string, usage string) *[]string {
+ return CommandLine.StringSliceP(name, "", value, usage)
+}
+
+// StringSliceP is like StringSlice, but accepts a shorthand letter that can be used after a single dash.
+func StringSliceP(name, shorthand string, value []string, usage string) *[]string {
+ return CommandLine.StringSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string_to_int.go b/vendor/github.com/spf13/pflag/string_to_int.go
new file mode 100644
index 00000000000..5ceda3965df
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/string_to_int.go
@@ -0,0 +1,149 @@
+package pflag
+
+import (
+ "bytes"
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// -- stringToInt Value
+type stringToIntValue struct {
+ value *map[string]int
+ changed bool
+}
+
+func newStringToIntValue(val map[string]int, p *map[string]int) *stringToIntValue {
+ ssv := new(stringToIntValue)
+ ssv.value = p
+ *ssv.value = val
+ return ssv
+}
+
+// Format: a=1,b=2
+func (s *stringToIntValue) Set(val string) error {
+ ss := strings.Split(val, ",")
+ out := make(map[string]int, len(ss))
+ for _, pair := range ss {
+ kv := strings.SplitN(pair, "=", 2)
+ if len(kv) != 2 {
+ return fmt.Errorf("%s must be formatted as key=value", pair)
+ }
+ var err error
+ out[kv[0]], err = strconv.Atoi(kv[1])
+ if err != nil {
+ return err
+ }
+ }
+ if !s.changed {
+ *s.value = out
+ } else {
+ for k, v := range out {
+ (*s.value)[k] = v
+ }
+ }
+ s.changed = true
+ return nil
+}
+
+func (s *stringToIntValue) Type() string {
+ return "stringToInt"
+}
+
+func (s *stringToIntValue) String() string {
+ var buf bytes.Buffer
+ i := 0
+ for k, v := range *s.value {
+ if i > 0 {
+ buf.WriteRune(',')
+ }
+ buf.WriteString(k)
+ buf.WriteRune('=')
+ buf.WriteString(strconv.Itoa(v))
+ i++
+ }
+ return "[" + buf.String() + "]"
+}
+
+func stringToIntConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // An empty string would cause an empty map
+ if len(val) == 0 {
+ return map[string]int{}, nil
+ }
+ ss := strings.Split(val, ",")
+ out := make(map[string]int, len(ss))
+ for _, pair := range ss {
+ kv := strings.SplitN(pair, "=", 2)
+ if len(kv) != 2 {
+ return nil, fmt.Errorf("%s must be formatted as key=value", pair)
+ }
+ var err error
+ out[kv[0]], err = strconv.Atoi(kv[1])
+ if err != nil {
+ return nil, err
+ }
+ }
+ return out, nil
+}
+
+// GetStringToInt return the map[string]int value of a flag with the given name
+func (f *FlagSet) GetStringToInt(name string) (map[string]int, error) {
+ val, err := f.getFlagType(name, "stringToInt", stringToIntConv)
+ if err != nil {
+ return map[string]int{}, err
+ }
+ return val.(map[string]int), nil
+}
+
+// StringToIntVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a map[string]int variable in which to store the values of the multiple flags.
+// The value of each argument will not try to be separated by comma
+func (f *FlagSet) StringToIntVar(p *map[string]int, name string, value map[string]int, usage string) {
+ f.VarP(newStringToIntValue(value, p), name, "", usage)
+}
+
+// StringToIntVarP is like StringToIntVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringToIntVarP(p *map[string]int, name, shorthand string, value map[string]int, usage string) {
+ f.VarP(newStringToIntValue(value, p), name, shorthand, usage)
+}
+
+// StringToIntVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a map[string]int variable in which to store the value of the flag.
+// The value of each argument will not try to be separated by comma
+func StringToIntVar(p *map[string]int, name string, value map[string]int, usage string) {
+ CommandLine.VarP(newStringToIntValue(value, p), name, "", usage)
+}
+
+// StringToIntVarP is like StringToIntVar, but accepts a shorthand letter that can be used after a single dash.
+func StringToIntVarP(p *map[string]int, name, shorthand string, value map[string]int, usage string) {
+ CommandLine.VarP(newStringToIntValue(value, p), name, shorthand, usage)
+}
+
+// StringToInt defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a map[string]int variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma
+func (f *FlagSet) StringToInt(name string, value map[string]int, usage string) *map[string]int {
+ p := map[string]int{}
+ f.StringToIntVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// StringToIntP is like StringToInt, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringToIntP(name, shorthand string, value map[string]int, usage string) *map[string]int {
+ p := map[string]int{}
+ f.StringToIntVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// StringToInt defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a map[string]int variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma
+func StringToInt(name string, value map[string]int, usage string) *map[string]int {
+ return CommandLine.StringToIntP(name, "", value, usage)
+}
+
+// StringToIntP is like StringToInt, but accepts a shorthand letter that can be used after a single dash.
+func StringToIntP(name, shorthand string, value map[string]int, usage string) *map[string]int {
+ return CommandLine.StringToIntP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/string_to_string.go b/vendor/github.com/spf13/pflag/string_to_string.go
new file mode 100644
index 00000000000..890a01afc03
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/string_to_string.go
@@ -0,0 +1,160 @@
+package pflag
+
+import (
+ "bytes"
+ "encoding/csv"
+ "fmt"
+ "strings"
+)
+
+// -- stringToString Value
+type stringToStringValue struct {
+ value *map[string]string
+ changed bool
+}
+
+func newStringToStringValue(val map[string]string, p *map[string]string) *stringToStringValue {
+ ssv := new(stringToStringValue)
+ ssv.value = p
+ *ssv.value = val
+ return ssv
+}
+
+// Format: a=1,b=2
+func (s *stringToStringValue) Set(val string) error {
+ var ss []string
+ n := strings.Count(val, "=")
+ switch n {
+ case 0:
+ return fmt.Errorf("%s must be formatted as key=value", val)
+ case 1:
+ ss = append(ss, strings.Trim(val, `"`))
+ default:
+ r := csv.NewReader(strings.NewReader(val))
+ var err error
+ ss, err = r.Read()
+ if err != nil {
+ return err
+ }
+ }
+
+ out := make(map[string]string, len(ss))
+ for _, pair := range ss {
+ kv := strings.SplitN(pair, "=", 2)
+ if len(kv) != 2 {
+ return fmt.Errorf("%s must be formatted as key=value", pair)
+ }
+ out[kv[0]] = kv[1]
+ }
+ if !s.changed {
+ *s.value = out
+ } else {
+ for k, v := range out {
+ (*s.value)[k] = v
+ }
+ }
+ s.changed = true
+ return nil
+}
+
+func (s *stringToStringValue) Type() string {
+ return "stringToString"
+}
+
+func (s *stringToStringValue) String() string {
+ records := make([]string, 0, len(*s.value)>>1)
+ for k, v := range *s.value {
+ records = append(records, k+"="+v)
+ }
+
+ var buf bytes.Buffer
+ w := csv.NewWriter(&buf)
+ if err := w.Write(records); err != nil {
+ panic(err)
+ }
+ w.Flush()
+ return "[" + strings.TrimSpace(buf.String()) + "]"
+}
+
+func stringToStringConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // An empty string would cause an empty map
+ if len(val) == 0 {
+ return map[string]string{}, nil
+ }
+ r := csv.NewReader(strings.NewReader(val))
+ ss, err := r.Read()
+ if err != nil {
+ return nil, err
+ }
+ out := make(map[string]string, len(ss))
+ for _, pair := range ss {
+ kv := strings.SplitN(pair, "=", 2)
+ if len(kv) != 2 {
+ return nil, fmt.Errorf("%s must be formatted as key=value", pair)
+ }
+ out[kv[0]] = kv[1]
+ }
+ return out, nil
+}
+
+// GetStringToString return the map[string]string value of a flag with the given name
+func (f *FlagSet) GetStringToString(name string) (map[string]string, error) {
+ val, err := f.getFlagType(name, "stringToString", stringToStringConv)
+ if err != nil {
+ return map[string]string{}, err
+ }
+ return val.(map[string]string), nil
+}
+
+// StringToStringVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a map[string]string variable in which to store the values of the multiple flags.
+// The value of each argument will not try to be separated by comma
+func (f *FlagSet) StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) {
+ f.VarP(newStringToStringValue(value, p), name, "", usage)
+}
+
+// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) {
+ f.VarP(newStringToStringValue(value, p), name, shorthand, usage)
+}
+
+// StringToStringVar defines a string flag with specified name, default value, and usage string.
+// The argument p points to a map[string]string variable in which to store the value of the flag.
+// The value of each argument will not try to be separated by comma
+func StringToStringVar(p *map[string]string, name string, value map[string]string, usage string) {
+ CommandLine.VarP(newStringToStringValue(value, p), name, "", usage)
+}
+
+// StringToStringVarP is like StringToStringVar, but accepts a shorthand letter that can be used after a single dash.
+func StringToStringVarP(p *map[string]string, name, shorthand string, value map[string]string, usage string) {
+ CommandLine.VarP(newStringToStringValue(value, p), name, shorthand, usage)
+}
+
+// StringToString defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a map[string]string variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma
+func (f *FlagSet) StringToString(name string, value map[string]string, usage string) *map[string]string {
+ p := map[string]string{}
+ f.StringToStringVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string {
+ p := map[string]string{}
+ f.StringToStringVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// StringToString defines a string flag with specified name, default value, and usage string.
+// The return value is the address of a map[string]string variable that stores the value of the flag.
+// The value of each argument will not try to be separated by comma
+func StringToString(name string, value map[string]string, usage string) *map[string]string {
+ return CommandLine.StringToStringP(name, "", value, usage)
+}
+
+// StringToStringP is like StringToString, but accepts a shorthand letter that can be used after a single dash.
+func StringToStringP(name, shorthand string, value map[string]string, usage string) *map[string]string {
+ return CommandLine.StringToStringP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/uint.go b/vendor/github.com/spf13/pflag/uint.go
new file mode 100644
index 00000000000..dcbc2b758c3
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/uint.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- uint Value
+type uintValue uint
+
+func newUintValue(val uint, p *uint) *uintValue {
+ *p = val
+ return (*uintValue)(p)
+}
+
+func (i *uintValue) Set(s string) error {
+ v, err := strconv.ParseUint(s, 0, 64)
+ *i = uintValue(v)
+ return err
+}
+
+func (i *uintValue) Type() string {
+ return "uint"
+}
+
+func (i *uintValue) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
+func uintConv(sval string) (interface{}, error) {
+ v, err := strconv.ParseUint(sval, 0, 0)
+ if err != nil {
+ return 0, err
+ }
+ return uint(v), nil
+}
+
+// GetUint return the uint value of a flag with the given name
+func (f *FlagSet) GetUint(name string) (uint, error) {
+ val, err := f.getFlagType(name, "uint", uintConv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(uint), nil
+}
+
+// UintVar defines a uint flag with specified name, default value, and usage string.
+// The argument p points to a uint variable in which to store the value of the flag.
+func (f *FlagSet) UintVar(p *uint, name string, value uint, usage string) {
+ f.VarP(newUintValue(value, p), name, "", usage)
+}
+
+// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) UintVarP(p *uint, name, shorthand string, value uint, usage string) {
+ f.VarP(newUintValue(value, p), name, shorthand, usage)
+}
+
+// UintVar defines a uint flag with specified name, default value, and usage string.
+// The argument p points to a uint variable in which to store the value of the flag.
+func UintVar(p *uint, name string, value uint, usage string) {
+ CommandLine.VarP(newUintValue(value, p), name, "", usage)
+}
+
+// UintVarP is like UintVar, but accepts a shorthand letter that can be used after a single dash.
+func UintVarP(p *uint, name, shorthand string, value uint, usage string) {
+ CommandLine.VarP(newUintValue(value, p), name, shorthand, usage)
+}
+
+// Uint defines a uint flag with specified name, default value, and usage string.
+// The return value is the address of a uint variable that stores the value of the flag.
+func (f *FlagSet) Uint(name string, value uint, usage string) *uint {
+ p := new(uint)
+ f.UintVarP(p, name, "", value, usage)
+ return p
+}
+
+// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) UintP(name, shorthand string, value uint, usage string) *uint {
+ p := new(uint)
+ f.UintVarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Uint defines a uint flag with specified name, default value, and usage string.
+// The return value is the address of a uint variable that stores the value of the flag.
+func Uint(name string, value uint, usage string) *uint {
+ return CommandLine.UintP(name, "", value, usage)
+}
+
+// UintP is like Uint, but accepts a shorthand letter that can be used after a single dash.
+func UintP(name, shorthand string, value uint, usage string) *uint {
+ return CommandLine.UintP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/uint16.go b/vendor/github.com/spf13/pflag/uint16.go
new file mode 100644
index 00000000000..7e9914eddde
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/uint16.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- uint16 value
+type uint16Value uint16
+
+func newUint16Value(val uint16, p *uint16) *uint16Value {
+ *p = val
+ return (*uint16Value)(p)
+}
+
+func (i *uint16Value) Set(s string) error {
+ v, err := strconv.ParseUint(s, 0, 16)
+ *i = uint16Value(v)
+ return err
+}
+
+func (i *uint16Value) Type() string {
+ return "uint16"
+}
+
+func (i *uint16Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
+func uint16Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseUint(sval, 0, 16)
+ if err != nil {
+ return 0, err
+ }
+ return uint16(v), nil
+}
+
+// GetUint16 return the uint16 value of a flag with the given name
+func (f *FlagSet) GetUint16(name string) (uint16, error) {
+ val, err := f.getFlagType(name, "uint16", uint16Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(uint16), nil
+}
+
+// Uint16Var defines a uint flag with specified name, default value, and usage string.
+// The argument p points to a uint variable in which to store the value of the flag.
+func (f *FlagSet) Uint16Var(p *uint16, name string, value uint16, usage string) {
+ f.VarP(newUint16Value(value, p), name, "", usage)
+}
+
+// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) {
+ f.VarP(newUint16Value(value, p), name, shorthand, usage)
+}
+
+// Uint16Var defines a uint flag with specified name, default value, and usage string.
+// The argument p points to a uint variable in which to store the value of the flag.
+func Uint16Var(p *uint16, name string, value uint16, usage string) {
+ CommandLine.VarP(newUint16Value(value, p), name, "", usage)
+}
+
+// Uint16VarP is like Uint16Var, but accepts a shorthand letter that can be used after a single dash.
+func Uint16VarP(p *uint16, name, shorthand string, value uint16, usage string) {
+ CommandLine.VarP(newUint16Value(value, p), name, shorthand, usage)
+}
+
+// Uint16 defines a uint flag with specified name, default value, and usage string.
+// The return value is the address of a uint variable that stores the value of the flag.
+func (f *FlagSet) Uint16(name string, value uint16, usage string) *uint16 {
+ p := new(uint16)
+ f.Uint16VarP(p, name, "", value, usage)
+ return p
+}
+
+// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint16P(name, shorthand string, value uint16, usage string) *uint16 {
+ p := new(uint16)
+ f.Uint16VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Uint16 defines a uint flag with specified name, default value, and usage string.
+// The return value is the address of a uint variable that stores the value of the flag.
+func Uint16(name string, value uint16, usage string) *uint16 {
+ return CommandLine.Uint16P(name, "", value, usage)
+}
+
+// Uint16P is like Uint16, but accepts a shorthand letter that can be used after a single dash.
+func Uint16P(name, shorthand string, value uint16, usage string) *uint16 {
+ return CommandLine.Uint16P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/uint32.go b/vendor/github.com/spf13/pflag/uint32.go
new file mode 100644
index 00000000000..d8024539bf6
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/uint32.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- uint32 value
+type uint32Value uint32
+
+func newUint32Value(val uint32, p *uint32) *uint32Value {
+ *p = val
+ return (*uint32Value)(p)
+}
+
+func (i *uint32Value) Set(s string) error {
+ v, err := strconv.ParseUint(s, 0, 32)
+ *i = uint32Value(v)
+ return err
+}
+
+func (i *uint32Value) Type() string {
+ return "uint32"
+}
+
+func (i *uint32Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
+func uint32Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseUint(sval, 0, 32)
+ if err != nil {
+ return 0, err
+ }
+ return uint32(v), nil
+}
+
+// GetUint32 return the uint32 value of a flag with the given name
+func (f *FlagSet) GetUint32(name string) (uint32, error) {
+ val, err := f.getFlagType(name, "uint32", uint32Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(uint32), nil
+}
+
+// Uint32Var defines a uint32 flag with specified name, default value, and usage string.
+// The argument p points to a uint32 variable in which to store the value of the flag.
+func (f *FlagSet) Uint32Var(p *uint32, name string, value uint32, usage string) {
+ f.VarP(newUint32Value(value, p), name, "", usage)
+}
+
+// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) {
+ f.VarP(newUint32Value(value, p), name, shorthand, usage)
+}
+
+// Uint32Var defines a uint32 flag with specified name, default value, and usage string.
+// The argument p points to a uint32 variable in which to store the value of the flag.
+func Uint32Var(p *uint32, name string, value uint32, usage string) {
+ CommandLine.VarP(newUint32Value(value, p), name, "", usage)
+}
+
+// Uint32VarP is like Uint32Var, but accepts a shorthand letter that can be used after a single dash.
+func Uint32VarP(p *uint32, name, shorthand string, value uint32, usage string) {
+ CommandLine.VarP(newUint32Value(value, p), name, shorthand, usage)
+}
+
+// Uint32 defines a uint32 flag with specified name, default value, and usage string.
+// The return value is the address of a uint32 variable that stores the value of the flag.
+func (f *FlagSet) Uint32(name string, value uint32, usage string) *uint32 {
+ p := new(uint32)
+ f.Uint32VarP(p, name, "", value, usage)
+ return p
+}
+
+// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint32P(name, shorthand string, value uint32, usage string) *uint32 {
+ p := new(uint32)
+ f.Uint32VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Uint32 defines a uint32 flag with specified name, default value, and usage string.
+// The return value is the address of a uint32 variable that stores the value of the flag.
+func Uint32(name string, value uint32, usage string) *uint32 {
+ return CommandLine.Uint32P(name, "", value, usage)
+}
+
+// Uint32P is like Uint32, but accepts a shorthand letter that can be used after a single dash.
+func Uint32P(name, shorthand string, value uint32, usage string) *uint32 {
+ return CommandLine.Uint32P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/uint64.go b/vendor/github.com/spf13/pflag/uint64.go
new file mode 100644
index 00000000000..f62240f2cea
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/uint64.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- uint64 Value
+type uint64Value uint64
+
+func newUint64Value(val uint64, p *uint64) *uint64Value {
+ *p = val
+ return (*uint64Value)(p)
+}
+
+func (i *uint64Value) Set(s string) error {
+ v, err := strconv.ParseUint(s, 0, 64)
+ *i = uint64Value(v)
+ return err
+}
+
+func (i *uint64Value) Type() string {
+ return "uint64"
+}
+
+func (i *uint64Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
+func uint64Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseUint(sval, 0, 64)
+ if err != nil {
+ return 0, err
+ }
+ return uint64(v), nil
+}
+
+// GetUint64 return the uint64 value of a flag with the given name
+func (f *FlagSet) GetUint64(name string) (uint64, error) {
+ val, err := f.getFlagType(name, "uint64", uint64Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(uint64), nil
+}
+
+// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
+// The argument p points to a uint64 variable in which to store the value of the flag.
+func (f *FlagSet) Uint64Var(p *uint64, name string, value uint64, usage string) {
+ f.VarP(newUint64Value(value, p), name, "", usage)
+}
+
+// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) {
+ f.VarP(newUint64Value(value, p), name, shorthand, usage)
+}
+
+// Uint64Var defines a uint64 flag with specified name, default value, and usage string.
+// The argument p points to a uint64 variable in which to store the value of the flag.
+func Uint64Var(p *uint64, name string, value uint64, usage string) {
+ CommandLine.VarP(newUint64Value(value, p), name, "", usage)
+}
+
+// Uint64VarP is like Uint64Var, but accepts a shorthand letter that can be used after a single dash.
+func Uint64VarP(p *uint64, name, shorthand string, value uint64, usage string) {
+ CommandLine.VarP(newUint64Value(value, p), name, shorthand, usage)
+}
+
+// Uint64 defines a uint64 flag with specified name, default value, and usage string.
+// The return value is the address of a uint64 variable that stores the value of the flag.
+func (f *FlagSet) Uint64(name string, value uint64, usage string) *uint64 {
+ p := new(uint64)
+ f.Uint64VarP(p, name, "", value, usage)
+ return p
+}
+
+// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint64P(name, shorthand string, value uint64, usage string) *uint64 {
+ p := new(uint64)
+ f.Uint64VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Uint64 defines a uint64 flag with specified name, default value, and usage string.
+// The return value is the address of a uint64 variable that stores the value of the flag.
+func Uint64(name string, value uint64, usage string) *uint64 {
+ return CommandLine.Uint64P(name, "", value, usage)
+}
+
+// Uint64P is like Uint64, but accepts a shorthand letter that can be used after a single dash.
+func Uint64P(name, shorthand string, value uint64, usage string) *uint64 {
+ return CommandLine.Uint64P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/uint8.go b/vendor/github.com/spf13/pflag/uint8.go
new file mode 100644
index 00000000000..bb0e83c1f6d
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/uint8.go
@@ -0,0 +1,88 @@
+package pflag
+
+import "strconv"
+
+// -- uint8 Value
+type uint8Value uint8
+
+func newUint8Value(val uint8, p *uint8) *uint8Value {
+ *p = val
+ return (*uint8Value)(p)
+}
+
+func (i *uint8Value) Set(s string) error {
+ v, err := strconv.ParseUint(s, 0, 8)
+ *i = uint8Value(v)
+ return err
+}
+
+func (i *uint8Value) Type() string {
+ return "uint8"
+}
+
+func (i *uint8Value) String() string { return strconv.FormatUint(uint64(*i), 10) }
+
+func uint8Conv(sval string) (interface{}, error) {
+ v, err := strconv.ParseUint(sval, 0, 8)
+ if err != nil {
+ return 0, err
+ }
+ return uint8(v), nil
+}
+
+// GetUint8 return the uint8 value of a flag with the given name
+func (f *FlagSet) GetUint8(name string) (uint8, error) {
+ val, err := f.getFlagType(name, "uint8", uint8Conv)
+ if err != nil {
+ return 0, err
+ }
+ return val.(uint8), nil
+}
+
+// Uint8Var defines a uint8 flag with specified name, default value, and usage string.
+// The argument p points to a uint8 variable in which to store the value of the flag.
+func (f *FlagSet) Uint8Var(p *uint8, name string, value uint8, usage string) {
+ f.VarP(newUint8Value(value, p), name, "", usage)
+}
+
+// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) {
+ f.VarP(newUint8Value(value, p), name, shorthand, usage)
+}
+
+// Uint8Var defines a uint8 flag with specified name, default value, and usage string.
+// The argument p points to a uint8 variable in which to store the value of the flag.
+func Uint8Var(p *uint8, name string, value uint8, usage string) {
+ CommandLine.VarP(newUint8Value(value, p), name, "", usage)
+}
+
+// Uint8VarP is like Uint8Var, but accepts a shorthand letter that can be used after a single dash.
+func Uint8VarP(p *uint8, name, shorthand string, value uint8, usage string) {
+ CommandLine.VarP(newUint8Value(value, p), name, shorthand, usage)
+}
+
+// Uint8 defines a uint8 flag with specified name, default value, and usage string.
+// The return value is the address of a uint8 variable that stores the value of the flag.
+func (f *FlagSet) Uint8(name string, value uint8, usage string) *uint8 {
+ p := new(uint8)
+ f.Uint8VarP(p, name, "", value, usage)
+ return p
+}
+
+// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) Uint8P(name, shorthand string, value uint8, usage string) *uint8 {
+ p := new(uint8)
+ f.Uint8VarP(p, name, shorthand, value, usage)
+ return p
+}
+
+// Uint8 defines a uint8 flag with specified name, default value, and usage string.
+// The return value is the address of a uint8 variable that stores the value of the flag.
+func Uint8(name string, value uint8, usage string) *uint8 {
+ return CommandLine.Uint8P(name, "", value, usage)
+}
+
+// Uint8P is like Uint8, but accepts a shorthand letter that can be used after a single dash.
+func Uint8P(name, shorthand string, value uint8, usage string) *uint8 {
+ return CommandLine.Uint8P(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/pflag/uint_slice.go b/vendor/github.com/spf13/pflag/uint_slice.go
new file mode 100644
index 00000000000..edd94c600af
--- /dev/null
+++ b/vendor/github.com/spf13/pflag/uint_slice.go
@@ -0,0 +1,126 @@
+package pflag
+
+import (
+ "fmt"
+ "strconv"
+ "strings"
+)
+
+// -- uintSlice Value
+type uintSliceValue struct {
+ value *[]uint
+ changed bool
+}
+
+func newUintSliceValue(val []uint, p *[]uint) *uintSliceValue {
+ uisv := new(uintSliceValue)
+ uisv.value = p
+ *uisv.value = val
+ return uisv
+}
+
+func (s *uintSliceValue) Set(val string) error {
+ ss := strings.Split(val, ",")
+ out := make([]uint, len(ss))
+ for i, d := range ss {
+ u, err := strconv.ParseUint(d, 10, 0)
+ if err != nil {
+ return err
+ }
+ out[i] = uint(u)
+ }
+ if !s.changed {
+ *s.value = out
+ } else {
+ *s.value = append(*s.value, out...)
+ }
+ s.changed = true
+ return nil
+}
+
+func (s *uintSliceValue) Type() string {
+ return "uintSlice"
+}
+
+func (s *uintSliceValue) String() string {
+ out := make([]string, len(*s.value))
+ for i, d := range *s.value {
+ out[i] = fmt.Sprintf("%d", d)
+ }
+ return "[" + strings.Join(out, ",") + "]"
+}
+
+func uintSliceConv(val string) (interface{}, error) {
+ val = strings.Trim(val, "[]")
+ // Empty string would cause a slice with one (empty) entry
+ if len(val) == 0 {
+ return []uint{}, nil
+ }
+ ss := strings.Split(val, ",")
+ out := make([]uint, len(ss))
+ for i, d := range ss {
+ u, err := strconv.ParseUint(d, 10, 0)
+ if err != nil {
+ return nil, err
+ }
+ out[i] = uint(u)
+ }
+ return out, nil
+}
+
+// GetUintSlice returns the []uint value of a flag with the given name.
+func (f *FlagSet) GetUintSlice(name string) ([]uint, error) {
+ val, err := f.getFlagType(name, "uintSlice", uintSliceConv)
+ if err != nil {
+ return []uint{}, err
+ }
+ return val.([]uint), nil
+}
+
+// UintSliceVar defines a uintSlice flag with specified name, default value, and usage string.
+// The argument p points to a []uint variable in which to store the value of the flag.
+func (f *FlagSet) UintSliceVar(p *[]uint, name string, value []uint, usage string) {
+ f.VarP(newUintSliceValue(value, p), name, "", usage)
+}
+
+// UintSliceVarP is like UintSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) {
+ f.VarP(newUintSliceValue(value, p), name, shorthand, usage)
+}
+
+// UintSliceVar defines a uint[] flag with specified name, default value, and usage string.
+// The argument p points to a uint[] variable in which to store the value of the flag.
+func UintSliceVar(p *[]uint, name string, value []uint, usage string) {
+ CommandLine.VarP(newUintSliceValue(value, p), name, "", usage)
+}
+
+// UintSliceVarP is like the UintSliceVar, but accepts a shorthand letter that can be used after a single dash.
+func UintSliceVarP(p *[]uint, name, shorthand string, value []uint, usage string) {
+ CommandLine.VarP(newUintSliceValue(value, p), name, shorthand, usage)
+}
+
+// UintSlice defines a []uint flag with specified name, default value, and usage string.
+// The return value is the address of a []uint variable that stores the value of the flag.
+func (f *FlagSet) UintSlice(name string, value []uint, usage string) *[]uint {
+ p := []uint{}
+ f.UintSliceVarP(&p, name, "", value, usage)
+ return &p
+}
+
+// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash.
+func (f *FlagSet) UintSliceP(name, shorthand string, value []uint, usage string) *[]uint {
+ p := []uint{}
+ f.UintSliceVarP(&p, name, shorthand, value, usage)
+ return &p
+}
+
+// UintSlice defines a []uint flag with specified name, default value, and usage string.
+// The return value is the address of a []uint variable that stores the value of the flag.
+func UintSlice(name string, value []uint, usage string) *[]uint {
+ return CommandLine.UintSliceP(name, "", value, usage)
+}
+
+// UintSliceP is like UintSlice, but accepts a shorthand letter that can be used after a single dash.
+func UintSliceP(name, shorthand string, value []uint, usage string) *[]uint {
+ return CommandLine.UintSliceP(name, shorthand, value, usage)
+}
diff --git a/vendor/github.com/spf13/viper/.gitignore b/vendor/github.com/spf13/viper/.gitignore
new file mode 100644
index 00000000000..352a34a566c
--- /dev/null
+++ b/vendor/github.com/spf13/viper/.gitignore
@@ -0,0 +1,24 @@
+# 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
+*.bench
\ No newline at end of file
diff --git a/vendor/github.com/spf13/viper/.travis.yml b/vendor/github.com/spf13/viper/.travis.yml
new file mode 100644
index 00000000000..55960d11b7b
--- /dev/null
+++ b/vendor/github.com/spf13/viper/.travis.yml
@@ -0,0 +1,28 @@
+go_import_path: github.com/spf13/viper
+
+language: go
+go:
+ - 1.7.x
+ - 1.8.x
+ - 1.9.x
+ - tip
+
+os:
+ - linux
+ - osx
+
+matrix:
+ allow_failures:
+ - go: tip
+ fast_finish: true
+
+script:
+ - go install ./...
+ - diff -u <(echo -n) <(gofmt -d .)
+ - go test -v ./...
+
+after_success:
+ - go get -u -d github.com/spf13/hugo
+ - cd $GOPATH/src/github.com/spf13/hugo && make && ./hugo -s docs && cd -
+
+sudo: false
diff --git a/vendor/github.com/spf13/viper/LICENSE b/vendor/github.com/spf13/viper/LICENSE
new file mode 100644
index 00000000000..4527efb9c06
--- /dev/null
+++ b/vendor/github.com/spf13/viper/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Steve Francia
+
+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.
\ No newline at end of file
diff --git a/vendor/github.com/spf13/viper/README.md b/vendor/github.com/spf13/viper/README.md
new file mode 100644
index 00000000000..64bf4743584
--- /dev/null
+++ b/vendor/github.com/spf13/viper/README.md
@@ -0,0 +1,643 @@
+![viper logo](https://cloud.githubusercontent.com/assets/173412/10886745/998df88a-8151-11e5-9448-4736db51020d.png)
+
+Go configuration with fangs!
+
+Many Go projects are built using Viper including:
+
+* [Hugo](http://gohugo.io)
+* [EMC RexRay](http://rexray.readthedocs.org/en/stable/)
+* [Imgur’s Incus](https://github.com/Imgur/incus)
+* [Nanobox](https://github.com/nanobox-io/nanobox)/[Nanopack](https://github.com/nanopack)
+* [Docker Notary](https://github.com/docker/Notary)
+* [BloomApi](https://www.bloomapi.com/)
+* [doctl](https://github.com/digitalocean/doctl)
+* [Clairctl](https://github.com/jgsqware/clairctl)
+
+[![Build Status](https://travis-ci.org/spf13/viper.svg)](https://travis-ci.org/spf13/viper) [![Join the chat at https://gitter.im/spf13/viper](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/spf13/viper?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GoDoc](https://godoc.org/github.com/spf13/viper?status.svg)](https://godoc.org/github.com/spf13/viper)
+
+
+## What is Viper?
+
+Viper is a complete configuration solution for Go applications including 12-Factor apps. It is designed
+to work within an application, and can handle all types of configuration needs
+and formats. It supports:
+
+* setting defaults
+* reading from JSON, TOML, YAML, HCL, and Java properties config files
+* live watching and re-reading of config files (optional)
+* reading from environment variables
+* reading from remote config systems (etcd or Consul), and watching changes
+* reading from command line flags
+* reading from buffer
+* setting explicit values
+
+Viper can be thought of as a registry for all of your applications
+configuration needs.
+
+## Why Viper?
+
+When building a modern application, you don’t want to worry about
+configuration file formats; you want to focus on building awesome software.
+Viper is here to help with that.
+
+Viper does the following for you:
+
+1. Find, load, and unmarshal a configuration file in JSON, TOML, YAML, HCL, or Java properties formats.
+2. Provide a mechanism to set default values for your different
+ configuration options.
+3. Provide a mechanism to set override values for options specified through
+ command line flags.
+4. Provide an alias system to easily rename parameters without breaking existing
+ code.
+5. Make it easy to tell the difference between when a user has provided a
+ command line or config file which is the same as the default.
+
+Viper uses the following precedence order. Each item takes precedence over the
+item below it:
+
+ * explicit call to Set
+ * flag
+ * env
+ * config
+ * key/value store
+ * default
+
+Viper configuration keys are case insensitive.
+
+## Putting Values into Viper
+
+### Establishing Defaults
+
+A good configuration system will support default values. A default value is not
+required for a key, but it’s useful in the event that a key hasn’t been set via
+config file, environment variable, remote configuration or flag.
+
+Examples:
+
+```go
+viper.SetDefault("ContentDir", "content")
+viper.SetDefault("LayoutDir", "layouts")
+viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})
+```
+
+### Reading Config Files
+
+Viper requires minimal configuration so it knows where to look for config files.
+Viper supports JSON, TOML, YAML, HCL, and Java Properties files. Viper can search multiple paths, but
+currently a single Viper instance only supports a single configuration file.
+Viper does not default to any configuration search paths leaving defaults decision
+to an application.
+
+Here is an example of how to use Viper to search for and read a configuration file.
+None of the specific paths are required, but at least one path should be provided
+where a configuration file is expected.
+
+```go
+viper.SetConfigName("config") // name of config file (without extension)
+viper.AddConfigPath("/etc/appname/") // path to look for the config file in
+viper.AddConfigPath("$HOME/.appname") // call multiple times to add many search paths
+viper.AddConfigPath(".") // optionally look for config in the working directory
+err := viper.ReadInConfig() // Find and read the config file
+if err != nil { // Handle errors reading the config file
+ panic(fmt.Errorf("Fatal error config file: %s \n", err))
+}
+```
+
+### Watching and re-reading config files
+
+Viper supports the ability to have your application live read a config file while running.
+
+Gone are the days of needing to restart a server to have a config take effect,
+viper powered applications can read an update to a config file while running and
+not miss a beat.
+
+Simply tell the viper instance to watchConfig.
+Optionally you can provide a function for Viper to run each time a change occurs.
+
+**Make sure you add all of the configPaths prior to calling `WatchConfig()`**
+
+```go
+viper.WatchConfig()
+viper.OnConfigChange(func(e fsnotify.Event) {
+ fmt.Println("Config file changed:", e.Name)
+})
+```
+
+### Reading Config from io.Reader
+
+Viper predefines many configuration sources such as files, environment
+variables, flags, and remote K/V store, but you are not bound to them. You can
+also implement your own required configuration source and feed it to viper.
+
+```go
+viper.SetConfigType("yaml") // or viper.SetConfigType("YAML")
+
+// any approach to require this configuration into your program.
+var yamlExample = []byte(`
+Hacker: true
+name: steve
+hobbies:
+- skateboarding
+- snowboarding
+- go
+clothing:
+ jacket: leather
+ trousers: denim
+age: 35
+eyes : brown
+beard: true
+`)
+
+viper.ReadConfig(bytes.NewBuffer(yamlExample))
+
+viper.Get("name") // this would be "steve"
+```
+
+### Setting Overrides
+
+These could be from a command line flag, or from your own application logic.
+
+```go
+viper.Set("Verbose", true)
+viper.Set("LogFile", LogFile)
+```
+
+### Registering and Using Aliases
+
+Aliases permit a single value to be referenced by multiple keys
+
+```go
+viper.RegisterAlias("loud", "Verbose")
+
+viper.Set("verbose", true) // same result as next line
+viper.Set("loud", true) // same result as prior line
+
+viper.GetBool("loud") // true
+viper.GetBool("verbose") // true
+```
+
+### Working with Environment Variables
+
+Viper has full support for environment variables. This enables 12 factor
+applications out of the box. There are four methods that exist to aid working
+with ENV:
+
+ * `AutomaticEnv()`
+ * `BindEnv(string...) : error`
+ * `SetEnvPrefix(string)`
+ * `SetEnvKeyReplacer(string...) *strings.Replacer`
+
+_When working with ENV variables, it’s important to recognize that Viper
+treats ENV variables as case sensitive._
+
+Viper provides a mechanism to try to ensure that ENV variables are unique. By
+using `SetEnvPrefix`, you can tell Viper to use add a prefix while reading from
+the environment variables. Both `BindEnv` and `AutomaticEnv` will use this
+prefix.
+
+`BindEnv` takes one or two parameters. The first parameter is the key name, the
+second is the name of the environment variable. The name of the environment
+variable is case sensitive. If the ENV variable name is not provided, then
+Viper will automatically assume that the key name matches the ENV variable name,
+but the ENV variable is IN ALL CAPS. When you explicitly provide the ENV
+variable name, it **does not** automatically add the prefix.
+
+One important thing to recognize when working with ENV variables is that the
+value will be read each time it is accessed. Viper does not fix the value when
+the `BindEnv` is called.
+
+`AutomaticEnv` is a powerful helper especially when combined with
+`SetEnvPrefix`. When called, Viper will check for an environment variable any
+time a `viper.Get` request is made. It will apply the following rules. It will
+check for a environment variable with a name matching the key uppercased and
+prefixed with the `EnvPrefix` if set.
+
+`SetEnvKeyReplacer` allows you to use a `strings.Replacer` object to rewrite Env
+keys to an extent. This is useful if you want to use `-` or something in your
+`Get()` calls, but want your environmental variables to use `_` delimiters. An
+example of using it can be found in `viper_test.go`.
+
+#### Env example
+
+```go
+SetEnvPrefix("spf") // will be uppercased automatically
+BindEnv("id")
+
+os.Setenv("SPF_ID", "13") // typically done outside of the app
+
+id := Get("id") // 13
+```
+
+### Working with Flags
+
+Viper has the ability to bind to flags. Specifically, Viper supports `Pflags`
+as used in the [Cobra](https://github.com/spf13/cobra) library.
+
+Like `BindEnv`, the value is not set when the binding method is called, but when
+it is accessed. This means you can bind as early as you want, even in an
+`init()` function.
+
+For individual flags, the `BindPFlag()` method provides this functionality.
+
+Example:
+
+```go
+serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
+viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
+```
+
+You can also bind an existing set of pflags (pflag.FlagSet):
+
+Example:
+
+```go
+pflag.Int("flagname", 1234, "help message for flagname")
+
+pflag.Parse()
+viper.BindPFlags(pflag.CommandLine)
+
+i := viper.GetInt("flagname") // retrieve values from viper instead of pflag
+```
+
+The use of [pflag](https://github.com/spf13/pflag/) in Viper does not preclude
+the use of other packages that use the [flag](https://golang.org/pkg/flag/)
+package from the standard library. The pflag package can handle the flags
+defined for the flag package by importing these flags. This is accomplished
+by a calling a convenience function provided by the pflag package called
+AddGoFlagSet().
+
+Example:
+
+```go
+package main
+
+import (
+ "flag"
+ "github.com/spf13/pflag"
+)
+
+func main() {
+
+ // using standard library "flag" package
+ flag.Int("flagname", 1234, "help message for flagname")
+
+ pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
+ pflag.Parse()
+ viper.BindPFlags(pflag.CommandLine)
+
+ i := viper.GetInt("flagname") // retrieve value from viper
+
+ ...
+}
+```
+
+#### Flag interfaces
+
+Viper provides two Go interfaces to bind other flag systems if you don’t use `Pflags`.
+
+`FlagValue` represents a single flag. This is a very simple example on how to implement this interface:
+
+```go
+type myFlag struct {}
+func (f myFlag) HasChanged() bool { return false }
+func (f myFlag) Name() string { return "my-flag-name" }
+func (f myFlag) ValueString() string { return "my-flag-value" }
+func (f myFlag) ValueType() string { return "string" }
+```
+
+Once your flag implements this interface, you can simply tell Viper to bind it:
+
+```go
+viper.BindFlagValue("my-flag-name", myFlag{})
+```
+
+`FlagValueSet` represents a group of flags. This is a very simple example on how to implement this interface:
+
+```go
+type myFlagSet struct {
+ flags []myFlag
+}
+
+func (f myFlagSet) VisitAll(fn func(FlagValue)) {
+ for _, flag := range flags {
+ fn(flag)
+ }
+}
+```
+
+Once your flag set implements this interface, you can simply tell Viper to bind it:
+
+```go
+fSet := myFlagSet{
+ flags: []myFlag{myFlag{}, myFlag{}},
+}
+viper.BindFlagValues("my-flags", fSet)
+```
+
+### Remote Key/Value Store Support
+
+To enable remote support in Viper, do a blank import of the `viper/remote`
+package:
+
+`import _ "github.com/spf13/viper/remote"`
+
+Viper will read a config string (as JSON, TOML, YAML or HCL) retrieved from a path
+in a Key/Value store such as etcd or Consul. These values take precedence over
+default values, but are overridden by configuration values retrieved from disk,
+flags, or environment variables.
+
+Viper uses [crypt](https://github.com/xordataexchange/crypt) to retrieve
+configuration from the K/V store, which means that you can store your
+configuration values encrypted and have them automatically decrypted if you have
+the correct gpg keyring. Encryption is optional.
+
+You can use remote configuration in conjunction with local configuration, or
+independently of it.
+
+`crypt` has a command-line helper that you can use to put configurations in your
+K/V store. `crypt` defaults to etcd on http://127.0.0.1:4001.
+
+```bash
+$ go get github.com/xordataexchange/crypt/bin/crypt
+$ crypt set -plaintext /config/hugo.json /Users/hugo/settings/config.json
+```
+
+Confirm that your value was set:
+
+```bash
+$ crypt get -plaintext /config/hugo.json
+```
+
+See the `crypt` documentation for examples of how to set encrypted values, or
+how to use Consul.
+
+### Remote Key/Value Store Example - Unencrypted
+
+```go
+viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001","/config/hugo.json")
+viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop"
+err := viper.ReadRemoteConfig()
+```
+
+### Remote Key/Value Store Example - Encrypted
+
+```go
+viper.AddSecureRemoteProvider("etcd","http://127.0.0.1:4001","/config/hugo.json","/etc/secrets/mykeyring.gpg")
+viper.SetConfigType("json") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop"
+err := viper.ReadRemoteConfig()
+```
+
+### Watching Changes in etcd - Unencrypted
+
+```go
+// alternatively, you can create a new viper instance.
+var runtime_viper = viper.New()
+
+runtime_viper.AddRemoteProvider("etcd", "http://127.0.0.1:4001", "/config/hugo.yml")
+runtime_viper.SetConfigType("yaml") // because there is no file extension in a stream of bytes, supported extensions are "json", "toml", "yaml", "yml", "properties", "props", "prop"
+
+// read from remote config the first time.
+err := runtime_viper.ReadRemoteConfig()
+
+// unmarshal config
+runtime_viper.Unmarshal(&runtime_conf)
+
+// open a goroutine to watch remote changes forever
+go func(){
+ for {
+ time.Sleep(time.Second * 5) // delay after each request
+
+ // currently, only tested with etcd support
+ err := runtime_viper.WatchRemoteConfig()
+ if err != nil {
+ log.Errorf("unable to read remote config: %v", err)
+ continue
+ }
+
+ // unmarshal new config into our runtime config struct. you can also use channel
+ // to implement a signal to notify the system of the changes
+ runtime_viper.Unmarshal(&runtime_conf)
+ }
+}()
+```
+
+## Getting Values From Viper
+
+In Viper, there are a few ways to get a value depending on the value’s type.
+The following functions and methods exist:
+
+ * `Get(key string) : interface{}`
+ * `GetBool(key string) : bool`
+ * `GetFloat64(key string) : float64`
+ * `GetInt(key string) : int`
+ * `GetString(key string) : string`
+ * `GetStringMap(key string) : map[string]interface{}`
+ * `GetStringMapString(key string) : map[string]string`
+ * `GetStringSlice(key string) : []string`
+ * `GetTime(key string) : time.Time`
+ * `GetDuration(key string) : time.Duration`
+ * `IsSet(key string) : bool`
+
+One important thing to recognize is that each Get function will return a zero
+value if it’s not found. To check if a given key exists, the `IsSet()` method
+has been provided.
+
+Example:
+```go
+viper.GetString("logfile") // case-insensitive Setting & Getting
+if viper.GetBool("verbose") {
+ fmt.Println("verbose enabled")
+}
+```
+### Accessing nested keys
+
+The accessor methods also accept formatted paths to deeply nested keys. For
+example, if the following JSON file is loaded:
+
+```json
+{
+ "host": {
+ "address": "localhost",
+ "port": 5799
+ },
+ "datastore": {
+ "metric": {
+ "host": "127.0.0.1",
+ "port": 3099
+ },
+ "warehouse": {
+ "host": "198.0.0.1",
+ "port": 2112
+ }
+ }
+}
+
+```
+
+Viper can access a nested field by passing a `.` delimited path of keys:
+
+```go
+GetString("datastore.metric.host") // (returns "127.0.0.1")
+```
+
+This obeys the precedence rules established above; the search for the path
+will cascade through the remaining configuration registries until found.
+
+For example, given this configuration file, both `datastore.metric.host` and
+`datastore.metric.port` are already defined (and may be overridden). If in addition
+`datastore.metric.protocol` was defined in the defaults, Viper would also find it.
+
+However, if `datastore.metric` was overridden (by a flag, an environment variable,
+the `Set()` method, …) with an immediate value, then all sub-keys of
+`datastore.metric` become undefined, they are “shadowed” by the higher-priority
+configuration level.
+
+Lastly, if there exists a key that matches the delimited key path, its value
+will be returned instead. E.g.
+
+```json
+{
+ "datastore.metric.host": "0.0.0.0",
+ "host": {
+ "address": "localhost",
+ "port": 5799
+ },
+ "datastore": {
+ "metric": {
+ "host": "127.0.0.1",
+ "port": 3099
+ },
+ "warehouse": {
+ "host": "198.0.0.1",
+ "port": 2112
+ }
+ }
+}
+
+GetString("datastore.metric.host") // returns "0.0.0.0"
+```
+
+### Extract sub-tree
+
+Extract sub-tree from Viper.
+
+For example, `viper` represents:
+
+```json
+app:
+ cache1:
+ max-items: 100
+ item-size: 64
+ cache2:
+ max-items: 200
+ item-size: 80
+```
+
+After executing:
+
+```go
+subv := viper.Sub("app.cache1")
+```
+
+`subv` represents:
+
+```json
+max-items: 100
+item-size: 64
+```
+
+Suppose we have:
+
+```go
+func NewCache(cfg *Viper) *Cache {...}
+```
+
+which creates a cache based on config information formatted as `subv`.
+Now it’s easy to create these 2 caches separately as:
+
+```go
+cfg1 := viper.Sub("app.cache1")
+cache1 := NewCache(cfg1)
+
+cfg2 := viper.Sub("app.cache2")
+cache2 := NewCache(cfg2)
+```
+
+### Unmarshaling
+
+You also have the option of Unmarshaling all or a specific value to a struct, map,
+etc.
+
+There are two methods to do this:
+
+ * `Unmarshal(rawVal interface{}) : error`
+ * `UnmarshalKey(key string, rawVal interface{}) : error`
+
+Example:
+
+```go
+type config struct {
+ Port int
+ Name string
+ PathMap string `mapstructure:"path_map"`
+}
+
+var C config
+
+err := Unmarshal(&C)
+if err != nil {
+ t.Fatalf("unable to decode into struct, %v", err)
+}
+```
+
+## Viper or Vipers?
+
+Viper comes ready to use out of the box. There is no configuration or
+initialization needed to begin using Viper. Since most applications will want
+to use a single central repository for their configuration, the viper package
+provides this. It is similar to a singleton.
+
+In all of the examples above, they demonstrate using viper in its singleton
+style approach.
+
+### Working with multiple vipers
+
+You can also create many different vipers for use in your application. Each will
+have its own unique set of configurations and values. Each can read from a
+different config file, key value store, etc. All of the functions that viper
+package supports are mirrored as methods on a viper.
+
+Example:
+
+```go
+x := viper.New()
+y := viper.New()
+
+x.SetDefault("ContentDir", "content")
+y.SetDefault("ContentDir", "foobar")
+
+//...
+```
+
+When working with multiple vipers, it is up to the user to keep track of the
+different vipers.
+
+## Q & A
+
+Q: Why not INI files?
+
+A: Ini files are pretty awful. There’s no standard format, and they are hard to
+validate. Viper is designed to work with JSON, TOML or YAML files. If someone
+really wants to add this feature, I’d be happy to merge it. It’s easy to specify
+which formats your application will permit.
+
+Q: Why is it called “Viper”?
+
+A: Viper is designed to be a [companion](http://en.wikipedia.org/wiki/Viper_(G.I._Joe))
+to [Cobra](https://github.com/spf13/cobra). While both can operate completely
+independently, together they make a powerful pair to handle much of your
+application foundation needs.
+
+Q: Why is it called “Cobra”?
+
+A: Is there a better name for a [commander](http://en.wikipedia.org/wiki/Cobra_Commander)?
diff --git a/vendor/github.com/spf13/viper/flags.go b/vendor/github.com/spf13/viper/flags.go
new file mode 100644
index 00000000000..dd32f4e1c26
--- /dev/null
+++ b/vendor/github.com/spf13/viper/flags.go
@@ -0,0 +1,57 @@
+package viper
+
+import "github.com/spf13/pflag"
+
+// FlagValueSet is an interface that users can implement
+// to bind a set of flags to viper.
+type FlagValueSet interface {
+ VisitAll(fn func(FlagValue))
+}
+
+// FlagValue is an interface that users can implement
+// to bind different flags to viper.
+type FlagValue interface {
+ HasChanged() bool
+ Name() string
+ ValueString() string
+ ValueType() string
+}
+
+// pflagValueSet is a wrapper around *pflag.ValueSet
+// that implements FlagValueSet.
+type pflagValueSet struct {
+ flags *pflag.FlagSet
+}
+
+// VisitAll iterates over all *pflag.Flag inside the *pflag.FlagSet.
+func (p pflagValueSet) VisitAll(fn func(flag FlagValue)) {
+ p.flags.VisitAll(func(flag *pflag.Flag) {
+ fn(pflagValue{flag})
+ })
+}
+
+// pflagValue is a wrapper aroung *pflag.flag
+// that implements FlagValue
+type pflagValue struct {
+ flag *pflag.Flag
+}
+
+// HasChanges returns whether the flag has changes or not.
+func (p pflagValue) HasChanged() bool {
+ return p.flag.Changed
+}
+
+// Name returns the name of the flag.
+func (p pflagValue) Name() string {
+ return p.flag.Name
+}
+
+// ValueString returns the value of the flag as a string.
+func (p pflagValue) ValueString() string {
+ return p.flag.Value.String()
+}
+
+// ValueType returns the type of the flag as a string.
+func (p pflagValue) ValueType() string {
+ return p.flag.Value.Type()
+}
diff --git a/vendor/github.com/spf13/viper/util.go b/vendor/github.com/spf13/viper/util.go
new file mode 100644
index 00000000000..952cad44c63
--- /dev/null
+++ b/vendor/github.com/spf13/viper/util.go
@@ -0,0 +1,221 @@
+// Copyright © 2014 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+// Viper is a application configuration system.
+// It believes that applications can be configured a variety of ways
+// via flags, ENVIRONMENT variables, configuration files retrieved
+// from the file system, or a remote key/value store.
+
+package viper
+
+import (
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "strings"
+ "unicode"
+
+ "github.com/spf13/afero"
+ "github.com/spf13/cast"
+ jww "github.com/spf13/jwalterweatherman"
+)
+
+// ConfigParseError denotes failing to parse configuration file.
+type ConfigParseError struct {
+ err error
+}
+
+// Error returns the formatted configuration error.
+func (pe ConfigParseError) Error() string {
+ return fmt.Sprintf("While parsing config: %s", pe.err.Error())
+}
+
+// toCaseInsensitiveValue checks if the value is a map;
+// if so, create a copy and lower-case the keys recursively.
+func toCaseInsensitiveValue(value interface{}) interface{} {
+ switch v := value.(type) {
+ case map[interface{}]interface{}:
+ value = copyAndInsensitiviseMap(cast.ToStringMap(v))
+ case map[string]interface{}:
+ value = copyAndInsensitiviseMap(v)
+ }
+
+ return value
+}
+
+// copyAndInsensitiviseMap behaves like insensitiviseMap, but creates a copy of
+// any map it makes case insensitive.
+func copyAndInsensitiviseMap(m map[string]interface{}) map[string]interface{} {
+ nm := make(map[string]interface{})
+
+ for key, val := range m {
+ lkey := strings.ToLower(key)
+ switch v := val.(type) {
+ case map[interface{}]interface{}:
+ nm[lkey] = copyAndInsensitiviseMap(cast.ToStringMap(v))
+ case map[string]interface{}:
+ nm[lkey] = copyAndInsensitiviseMap(v)
+ default:
+ nm[lkey] = v
+ }
+ }
+
+ return nm
+}
+
+func insensitiviseMap(m map[string]interface{}) {
+ for key, val := range m {
+ switch val.(type) {
+ case map[interface{}]interface{}:
+ // nested map: cast and recursively insensitivise
+ val = cast.ToStringMap(val)
+ insensitiviseMap(val.(map[string]interface{}))
+ case map[string]interface{}:
+ // nested map: recursively insensitivise
+ insensitiviseMap(val.(map[string]interface{}))
+ }
+
+ lower := strings.ToLower(key)
+ if key != lower {
+ // remove old key (not lower-cased)
+ delete(m, key)
+ }
+ // update map
+ m[lower] = val
+ }
+}
+
+func absPathify(inPath string) string {
+ jww.INFO.Println("Trying to resolve absolute path to", inPath)
+
+ if strings.HasPrefix(inPath, "$HOME") {
+ inPath = userHomeDir() + inPath[5:]
+ }
+
+ if strings.HasPrefix(inPath, "$") {
+ end := strings.Index(inPath, string(os.PathSeparator))
+ inPath = os.Getenv(inPath[1:end]) + inPath[end:]
+ }
+
+ if filepath.IsAbs(inPath) {
+ return filepath.Clean(inPath)
+ }
+
+ p, err := filepath.Abs(inPath)
+ if err == nil {
+ return filepath.Clean(p)
+ }
+
+ jww.ERROR.Println("Couldn't discover absolute path")
+ jww.ERROR.Println(err)
+ return ""
+}
+
+// Check if File / Directory Exists
+func exists(fs afero.Fs, path string) (bool, error) {
+ _, err := fs.Stat(path)
+ if err == nil {
+ return true, nil
+ }
+ if os.IsNotExist(err) {
+ return false, nil
+ }
+ return false, err
+}
+
+func stringInSlice(a string, list []string) bool {
+ for _, b := range list {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
+
+func userHomeDir() string {
+ if runtime.GOOS == "windows" {
+ home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
+ if home == "" {
+ home = os.Getenv("USERPROFILE")
+ }
+ return home
+ }
+ return os.Getenv("HOME")
+}
+
+func safeMul(a, b uint) uint {
+ c := a * b
+ if a > 1 && b > 1 && c/b != a {
+ return 0
+ }
+ return c
+}
+
+// parseSizeInBytes converts strings like 1GB or 12 mb into an unsigned integer number of bytes
+func parseSizeInBytes(sizeStr string) uint {
+ sizeStr = strings.TrimSpace(sizeStr)
+ lastChar := len(sizeStr) - 1
+ multiplier := uint(1)
+
+ if lastChar > 0 {
+ if sizeStr[lastChar] == 'b' || sizeStr[lastChar] == 'B' {
+ if lastChar > 1 {
+ switch unicode.ToLower(rune(sizeStr[lastChar-1])) {
+ case 'k':
+ multiplier = 1 << 10
+ sizeStr = strings.TrimSpace(sizeStr[:lastChar-1])
+ case 'm':
+ multiplier = 1 << 20
+ sizeStr = strings.TrimSpace(sizeStr[:lastChar-1])
+ case 'g':
+ multiplier = 1 << 30
+ sizeStr = strings.TrimSpace(sizeStr[:lastChar-1])
+ default:
+ multiplier = 1
+ sizeStr = strings.TrimSpace(sizeStr[:lastChar])
+ }
+ }
+ }
+ }
+
+ size := cast.ToInt(sizeStr)
+ if size < 0 {
+ size = 0
+ }
+
+ return safeMul(uint(size), multiplier)
+}
+
+// deepSearch scans deep maps, following the key indexes listed in the
+// sequence "path".
+// The last value is expected to be another map, and is returned.
+//
+// In case intermediate keys do not exist, or map to a non-map value,
+// a new map is created and inserted, and the search continues from there:
+// the initial map "m" may be modified!
+func deepSearch(m map[string]interface{}, path []string) map[string]interface{} {
+ for _, k := range path {
+ m2, ok := m[k]
+ if !ok {
+ // intermediate key does not exist
+ // => create it and continue from there
+ m3 := make(map[string]interface{})
+ m[k] = m3
+ m = m3
+ continue
+ }
+ m3, ok := m2.(map[string]interface{})
+ if !ok {
+ // intermediate key is a value
+ // => replace with a new map
+ m3 = make(map[string]interface{})
+ m[k] = m3
+ }
+ // continue search from here
+ m = m3
+ }
+ return m
+}
diff --git a/vendor/github.com/spf13/viper/viper.go b/vendor/github.com/spf13/viper/viper.go
new file mode 100644
index 00000000000..e9966ba58c2
--- /dev/null
+++ b/vendor/github.com/spf13/viper/viper.go
@@ -0,0 +1,1771 @@
+// Copyright © 2014 Steve Francia .
+//
+// Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+// Viper is a application configuration system.
+// It believes that applications can be configured a variety of ways
+// via flags, ENVIRONMENT variables, configuration files retrieved
+// from the file system, or a remote key/value store.
+
+// Each item takes precedence over the item below it:
+
+// overrides
+// flag
+// env
+// config
+// key/value store
+// default
+
+package viper
+
+import (
+ "bytes"
+ "encoding/csv"
+ "encoding/json"
+ "fmt"
+ "io"
+ "log"
+ "os"
+ "path/filepath"
+ "reflect"
+ "strings"
+ "time"
+
+ yaml "gopkg.in/yaml.v2"
+
+ "github.com/fsnotify/fsnotify"
+ "github.com/hashicorp/hcl"
+ "github.com/hashicorp/hcl/hcl/printer"
+ "github.com/magiconair/properties"
+ "github.com/mitchellh/mapstructure"
+ toml "github.com/pelletier/go-toml"
+ "github.com/spf13/afero"
+ "github.com/spf13/cast"
+ jww "github.com/spf13/jwalterweatherman"
+ "github.com/spf13/pflag"
+)
+
+// ConfigMarshalError happens when failing to marshal the configuration.
+type ConfigMarshalError struct {
+ err error
+}
+
+// Error returns the formatted configuration error.
+func (e ConfigMarshalError) Error() string {
+ return fmt.Sprintf("While marshaling config: %s", e.err.Error())
+}
+
+var v *Viper
+
+type RemoteResponse struct {
+ Value []byte
+ Error error
+}
+
+func init() {
+ v = New()
+}
+
+type remoteConfigFactory interface {
+ Get(rp RemoteProvider) (io.Reader, error)
+ Watch(rp RemoteProvider) (io.Reader, error)
+ WatchChannel(rp RemoteProvider) (<-chan *RemoteResponse, chan bool)
+}
+
+// RemoteConfig is optional, see the remote package
+var RemoteConfig remoteConfigFactory
+
+// UnsupportedConfigError denotes encountering an unsupported
+// configuration filetype.
+type UnsupportedConfigError string
+
+// Error returns the formatted configuration error.
+func (str UnsupportedConfigError) Error() string {
+ return fmt.Sprintf("Unsupported Config Type %q", string(str))
+}
+
+// UnsupportedRemoteProviderError denotes encountering an unsupported remote
+// provider. Currently only etcd and Consul are supported.
+type UnsupportedRemoteProviderError string
+
+// Error returns the formatted remote provider error.
+func (str UnsupportedRemoteProviderError) Error() string {
+ return fmt.Sprintf("Unsupported Remote Provider Type %q", string(str))
+}
+
+// RemoteConfigError denotes encountering an error while trying to
+// pull the configuration from the remote provider.
+type RemoteConfigError string
+
+// Error returns the formatted remote provider error
+func (rce RemoteConfigError) Error() string {
+ return fmt.Sprintf("Remote Configurations Error: %s", string(rce))
+}
+
+// ConfigFileNotFoundError denotes failing to find configuration file.
+type ConfigFileNotFoundError struct {
+ name, locations string
+}
+
+// Error returns the formatted configuration error.
+func (fnfe ConfigFileNotFoundError) Error() string {
+ return fmt.Sprintf("Config File %q Not Found in %q", fnfe.name, fnfe.locations)
+}
+
+// Viper is a prioritized configuration registry. It
+// maintains a set of configuration sources, fetches
+// values to populate those, and provides them according
+// to the source's priority.
+// The priority of the sources is the following:
+// 1. overrides
+// 2. flags
+// 3. env. variables
+// 4. config file
+// 5. key/value store
+// 6. defaults
+//
+// For example, if values from the following sources were loaded:
+//
+// Defaults : {
+// "secret": "",
+// "user": "default",
+// "endpoint": "https://localhost"
+// }
+// Config : {
+// "user": "root"
+// "secret": "defaultsecret"
+// }
+// Env : {
+// "secret": "somesecretkey"
+// }
+//
+// The resulting config will have the following values:
+//
+// {
+// "secret": "somesecretkey",
+// "user": "root",
+// "endpoint": "https://localhost"
+// }
+type Viper struct {
+ // Delimiter that separates a list of keys
+ // used to access a nested value in one go
+ keyDelim string
+
+ // A set of paths to look for the config file in
+ configPaths []string
+
+ // The filesystem to read config from.
+ fs afero.Fs
+
+ // A set of remote providers to search for the configuration
+ remoteProviders []*defaultRemoteProvider
+
+ // Name of file to look for inside the path
+ configName string
+ configFile string
+ configType string
+ envPrefix string
+
+ automaticEnvApplied bool
+ envKeyReplacer *strings.Replacer
+
+ config map[string]interface{}
+ override map[string]interface{}
+ defaults map[string]interface{}
+ kvstore map[string]interface{}
+ pflags map[string]FlagValue
+ env map[string]string
+ aliases map[string]string
+ typeByDefValue bool
+
+ // Store read properties on the object so that we can write back in order with comments.
+ // This will only be used if the configuration read is a properties file.
+ properties *properties.Properties
+
+ onConfigChange func(fsnotify.Event)
+}
+
+// New returns an initialized Viper instance.
+func New() *Viper {
+ v := new(Viper)
+ v.keyDelim = "."
+ v.configName = "config"
+ v.fs = afero.NewOsFs()
+ v.config = make(map[string]interface{})
+ v.override = make(map[string]interface{})
+ v.defaults = make(map[string]interface{})
+ v.kvstore = make(map[string]interface{})
+ v.pflags = make(map[string]FlagValue)
+ v.env = make(map[string]string)
+ v.aliases = make(map[string]string)
+ v.typeByDefValue = false
+
+ return v
+}
+
+// Intended for testing, will reset all to default settings.
+// In the public interface for the viper package so applications
+// can use it in their testing as well.
+func Reset() {
+ v = New()
+ SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"}
+ SupportedRemoteProviders = []string{"etcd", "consul"}
+}
+
+type defaultRemoteProvider struct {
+ provider string
+ endpoint string
+ path string
+ secretKeyring string
+}
+
+func (rp defaultRemoteProvider) Provider() string {
+ return rp.provider
+}
+
+func (rp defaultRemoteProvider) Endpoint() string {
+ return rp.endpoint
+}
+
+func (rp defaultRemoteProvider) Path() string {
+ return rp.path
+}
+
+func (rp defaultRemoteProvider) SecretKeyring() string {
+ return rp.secretKeyring
+}
+
+// RemoteProvider stores the configuration necessary
+// to connect to a remote key/value store.
+// Optional secretKeyring to unencrypt encrypted values
+// can be provided.
+type RemoteProvider interface {
+ Provider() string
+ Endpoint() string
+ Path() string
+ SecretKeyring() string
+}
+
+// SupportedExts are universally supported extensions.
+var SupportedExts = []string{"json", "toml", "yaml", "yml", "properties", "props", "prop", "hcl"}
+
+// SupportedRemoteProviders are universally supported remote providers.
+var SupportedRemoteProviders = []string{"etcd", "consul"}
+
+func OnConfigChange(run func(in fsnotify.Event)) { v.OnConfigChange(run) }
+func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) {
+ v.onConfigChange = run
+}
+
+func WatchConfig() { v.WatchConfig() }
+func (v *Viper) WatchConfig() {
+ go func() {
+ watcher, err := fsnotify.NewWatcher()
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer watcher.Close()
+
+ // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way
+ filename, err := v.getConfigFile()
+ if err != nil {
+ log.Println("error:", err)
+ return
+ }
+
+ configFile := filepath.Clean(filename)
+ configDir, _ := filepath.Split(configFile)
+
+ done := make(chan bool)
+ go func() {
+ for {
+ select {
+ case event := <-watcher.Events:
+ // we only care about the config file
+ if filepath.Clean(event.Name) == configFile {
+ if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create {
+ err := v.ReadInConfig()
+ if err != nil {
+ log.Println("error:", err)
+ }
+ v.onConfigChange(event)
+ }
+ }
+ case err := <-watcher.Errors:
+ log.Println("error:", err)
+ }
+ }
+ }()
+
+ watcher.Add(configDir)
+ <-done
+ }()
+}
+
+// SetConfigFile explicitly defines the path, name and extension of the config file.
+// Viper will use this and not check any of the config paths.
+func SetConfigFile(in string) { v.SetConfigFile(in) }
+func (v *Viper) SetConfigFile(in string) {
+ if in != "" {
+ v.configFile = in
+ }
+}
+
+// SetEnvPrefix defines a prefix that ENVIRONMENT variables will use.
+// E.g. if your prefix is "spf", the env registry will look for env
+// variables that start with "SPF_".
+func SetEnvPrefix(in string) { v.SetEnvPrefix(in) }
+func (v *Viper) SetEnvPrefix(in string) {
+ if in != "" {
+ v.envPrefix = in
+ }
+}
+
+func (v *Viper) mergeWithEnvPrefix(in string) string {
+ if v.envPrefix != "" {
+ return strings.ToUpper(v.envPrefix + "_" + in)
+ }
+
+ return strings.ToUpper(in)
+}
+
+// TODO: should getEnv logic be moved into find(). Can generalize the use of
+// rewriting keys many things, Ex: Get('someKey') -> some_key
+// (camel case to snake case for JSON keys perhaps)
+
+// getEnv is a wrapper around os.Getenv which replaces characters in the original
+// key. This allows env vars which have different keys than the config object
+// keys.
+func (v *Viper) getEnv(key string) string {
+ if v.envKeyReplacer != nil {
+ key = v.envKeyReplacer.Replace(key)
+ }
+ return os.Getenv(key)
+}
+
+// ConfigFileUsed returns the file used to populate the config registry.
+func ConfigFileUsed() string { return v.ConfigFileUsed() }
+func (v *Viper) ConfigFileUsed() string { return v.configFile }
+
+// AddConfigPath adds a path for Viper to search for the config file in.
+// Can be called multiple times to define multiple search paths.
+func AddConfigPath(in string) { v.AddConfigPath(in) }
+func (v *Viper) AddConfigPath(in string) {
+ if in != "" {
+ absin := absPathify(in)
+ jww.INFO.Println("adding", absin, "to paths to search")
+ if !stringInSlice(absin, v.configPaths) {
+ v.configPaths = append(v.configPaths, absin)
+ }
+ }
+}
+
+// AddRemoteProvider adds a remote configuration source.
+// Remote Providers are searched in the order they are added.
+// provider is a string value, "etcd" or "consul" are currently supported.
+// endpoint is the url. etcd requires http://ip:port consul requires ip:port
+// path is the path in the k/v store to retrieve configuration
+// To retrieve a config file called myapp.json from /configs/myapp.json
+// you should set path to /configs and set config name (SetConfigName()) to
+// "myapp"
+func AddRemoteProvider(provider, endpoint, path string) error {
+ return v.AddRemoteProvider(provider, endpoint, path)
+}
+func (v *Viper) AddRemoteProvider(provider, endpoint, path string) error {
+ if !stringInSlice(provider, SupportedRemoteProviders) {
+ return UnsupportedRemoteProviderError(provider)
+ }
+ if provider != "" && endpoint != "" {
+ jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint)
+ rp := &defaultRemoteProvider{
+ endpoint: endpoint,
+ provider: provider,
+ path: path,
+ }
+ if !v.providerPathExists(rp) {
+ v.remoteProviders = append(v.remoteProviders, rp)
+ }
+ }
+ return nil
+}
+
+// AddSecureRemoteProvider adds a remote configuration source.
+// Secure Remote Providers are searched in the order they are added.
+// provider is a string value, "etcd" or "consul" are currently supported.
+// endpoint is the url. etcd requires http://ip:port consul requires ip:port
+// secretkeyring is the filepath to your openpgp secret keyring. e.g. /etc/secrets/myring.gpg
+// path is the path in the k/v store to retrieve configuration
+// To retrieve a config file called myapp.json from /configs/myapp.json
+// you should set path to /configs and set config name (SetConfigName()) to
+// "myapp"
+// Secure Remote Providers are implemented with github.com/xordataexchange/crypt
+func AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error {
+ return v.AddSecureRemoteProvider(provider, endpoint, path, secretkeyring)
+}
+
+func (v *Viper) AddSecureRemoteProvider(provider, endpoint, path, secretkeyring string) error {
+ if !stringInSlice(provider, SupportedRemoteProviders) {
+ return UnsupportedRemoteProviderError(provider)
+ }
+ if provider != "" && endpoint != "" {
+ jww.INFO.Printf("adding %s:%s to remote provider list", provider, endpoint)
+ rp := &defaultRemoteProvider{
+ endpoint: endpoint,
+ provider: provider,
+ path: path,
+ secretKeyring: secretkeyring,
+ }
+ if !v.providerPathExists(rp) {
+ v.remoteProviders = append(v.remoteProviders, rp)
+ }
+ }
+ return nil
+}
+
+func (v *Viper) providerPathExists(p *defaultRemoteProvider) bool {
+ for _, y := range v.remoteProviders {
+ if reflect.DeepEqual(y, p) {
+ return true
+ }
+ }
+ return false
+}
+
+// searchMap recursively searches for a value for path in source map.
+// Returns nil if not found.
+// Note: This assumes that the path entries and map keys are lower cased.
+func (v *Viper) searchMap(source map[string]interface{}, path []string) interface{} {
+ if len(path) == 0 {
+ return source
+ }
+
+ next, ok := source[path[0]]
+ if ok {
+ // Fast path
+ if len(path) == 1 {
+ return next
+ }
+
+ // Nested case
+ switch next.(type) {
+ case map[interface{}]interface{}:
+ return v.searchMap(cast.ToStringMap(next), path[1:])
+ case map[string]interface{}:
+ // Type assertion is safe here since it is only reached
+ // if the type of `next` is the same as the type being asserted
+ return v.searchMap(next.(map[string]interface{}), path[1:])
+ default:
+ // got a value but nested key expected, return "nil" for not found
+ return nil
+ }
+ }
+ return nil
+}
+
+// searchMapWithPathPrefixes recursively searches for a value for path in source map.
+//
+// While searchMap() considers each path element as a single map key, this
+// function searches for, and prioritizes, merged path elements.
+// e.g., if in the source, "foo" is defined with a sub-key "bar", and "foo.bar"
+// is also defined, this latter value is returned for path ["foo", "bar"].
+//
+// This should be useful only at config level (other maps may not contain dots
+// in their keys).
+//
+// Note: This assumes that the path entries and map keys are lower cased.
+func (v *Viper) searchMapWithPathPrefixes(source map[string]interface{}, path []string) interface{} {
+ if len(path) == 0 {
+ return source
+ }
+
+ // search for path prefixes, starting from the longest one
+ for i := len(path); i > 0; i-- {
+ prefixKey := strings.ToLower(strings.Join(path[0:i], v.keyDelim))
+
+ next, ok := source[prefixKey]
+ if ok {
+ // Fast path
+ if i == len(path) {
+ return next
+ }
+
+ // Nested case
+ var val interface{}
+ switch next.(type) {
+ case map[interface{}]interface{}:
+ val = v.searchMapWithPathPrefixes(cast.ToStringMap(next), path[i:])
+ case map[string]interface{}:
+ // Type assertion is safe here since it is only reached
+ // if the type of `next` is the same as the type being asserted
+ val = v.searchMapWithPathPrefixes(next.(map[string]interface{}), path[i:])
+ default:
+ // got a value but nested key expected, do nothing and look for next prefix
+ }
+ if val != nil {
+ return val
+ }
+ }
+ }
+
+ // not found
+ return nil
+}
+
+// isPathShadowedInDeepMap makes sure the given path is not shadowed somewhere
+// on its path in the map.
+// e.g., if "foo.bar" has a value in the given map, it “shadows”
+// "foo.bar.baz" in a lower-priority map
+func (v *Viper) isPathShadowedInDeepMap(path []string, m map[string]interface{}) string {
+ var parentVal interface{}
+ for i := 1; i < len(path); i++ {
+ parentVal = v.searchMap(m, path[0:i])
+ if parentVal == nil {
+ // not found, no need to add more path elements
+ return ""
+ }
+ switch parentVal.(type) {
+ case map[interface{}]interface{}:
+ continue
+ case map[string]interface{}:
+ continue
+ default:
+ // parentVal is a regular value which shadows "path"
+ return strings.Join(path[0:i], v.keyDelim)
+ }
+ }
+ return ""
+}
+
+// isPathShadowedInFlatMap makes sure the given path is not shadowed somewhere
+// in a sub-path of the map.
+// e.g., if "foo.bar" has a value in the given map, it “shadows”
+// "foo.bar.baz" in a lower-priority map
+func (v *Viper) isPathShadowedInFlatMap(path []string, mi interface{}) string {
+ // unify input map
+ var m map[string]interface{}
+ switch mi.(type) {
+ case map[string]string, map[string]FlagValue:
+ m = cast.ToStringMap(mi)
+ default:
+ return ""
+ }
+
+ // scan paths
+ var parentKey string
+ for i := 1; i < len(path); i++ {
+ parentKey = strings.Join(path[0:i], v.keyDelim)
+ if _, ok := m[parentKey]; ok {
+ return parentKey
+ }
+ }
+ return ""
+}
+
+// isPathShadowedInAutoEnv makes sure the given path is not shadowed somewhere
+// in the environment, when automatic env is on.
+// e.g., if "foo.bar" has a value in the environment, it “shadows”
+// "foo.bar.baz" in a lower-priority map
+func (v *Viper) isPathShadowedInAutoEnv(path []string) string {
+ var parentKey string
+ var val string
+ for i := 1; i < len(path); i++ {
+ parentKey = strings.Join(path[0:i], v.keyDelim)
+ if val = v.getEnv(v.mergeWithEnvPrefix(parentKey)); val != "" {
+ return parentKey
+ }
+ }
+ return ""
+}
+
+// SetTypeByDefaultValue enables or disables the inference of a key value's
+// type when the Get function is used based upon a key's default value as
+// opposed to the value returned based on the normal fetch logic.
+//
+// For example, if a key has a default value of []string{} and the same key
+// is set via an environment variable to "a b c", a call to the Get function
+// would return a string slice for the key if the key's type is inferred by
+// the default value and the Get function would return:
+//
+// []string {"a", "b", "c"}
+//
+// Otherwise the Get function would return:
+//
+// "a b c"
+func SetTypeByDefaultValue(enable bool) { v.SetTypeByDefaultValue(enable) }
+func (v *Viper) SetTypeByDefaultValue(enable bool) {
+ v.typeByDefValue = enable
+}
+
+// GetViper gets the global Viper instance.
+func GetViper() *Viper {
+ return v
+}
+
+// Get can retrieve any value given the key to use.
+// Get is case-insensitive for a key.
+// Get has the behavior of returning the value associated with the first
+// place from where it is set. Viper will check in the following order:
+// override, flag, env, config file, key/value store, default
+//
+// Get returns an interface. For a specific value use one of the Get____ methods.
+func Get(key string) interface{} { return v.Get(key) }
+func (v *Viper) Get(key string) interface{} {
+ lcaseKey := strings.ToLower(key)
+ val := v.find(lcaseKey)
+ if val == nil {
+ return nil
+ }
+
+ if v.typeByDefValue {
+ // TODO(bep) this branch isn't covered by a single test.
+ valType := val
+ path := strings.Split(lcaseKey, v.keyDelim)
+ defVal := v.searchMap(v.defaults, path)
+ if defVal != nil {
+ valType = defVal
+ }
+
+ switch valType.(type) {
+ case bool:
+ return cast.ToBool(val)
+ case string:
+ return cast.ToString(val)
+ case int64, int32, int16, int8, int:
+ return cast.ToInt(val)
+ case float64, float32:
+ return cast.ToFloat64(val)
+ case time.Time:
+ return cast.ToTime(val)
+ case time.Duration:
+ return cast.ToDuration(val)
+ case []string:
+ return cast.ToStringSlice(val)
+ }
+ }
+
+ return val
+}
+
+// Sub returns new Viper instance representing a sub tree of this instance.
+// Sub is case-insensitive for a key.
+func Sub(key string) *Viper { return v.Sub(key) }
+func (v *Viper) Sub(key string) *Viper {
+ subv := New()
+ data := v.Get(key)
+ if data == nil {
+ return nil
+ }
+
+ if reflect.TypeOf(data).Kind() == reflect.Map {
+ subv.config = cast.ToStringMap(data)
+ return subv
+ }
+ return nil
+}
+
+// GetString returns the value associated with the key as a string.
+func GetString(key string) string { return v.GetString(key) }
+func (v *Viper) GetString(key string) string {
+ return cast.ToString(v.Get(key))
+}
+
+// GetBool returns the value associated with the key as a boolean.
+func GetBool(key string) bool { return v.GetBool(key) }
+func (v *Viper) GetBool(key string) bool {
+ return cast.ToBool(v.Get(key))
+}
+
+// GetInt returns the value associated with the key as an integer.
+func GetInt(key string) int { return v.GetInt(key) }
+func (v *Viper) GetInt(key string) int {
+ return cast.ToInt(v.Get(key))
+}
+
+// GetInt64 returns the value associated with the key as an integer.
+func GetInt64(key string) int64 { return v.GetInt64(key) }
+func (v *Viper) GetInt64(key string) int64 {
+ return cast.ToInt64(v.Get(key))
+}
+
+// GetFloat64 returns the value associated with the key as a float64.
+func GetFloat64(key string) float64 { return v.GetFloat64(key) }
+func (v *Viper) GetFloat64(key string) float64 {
+ return cast.ToFloat64(v.Get(key))
+}
+
+// GetTime returns the value associated with the key as time.
+func GetTime(key string) time.Time { return v.GetTime(key) }
+func (v *Viper) GetTime(key string) time.Time {
+ return cast.ToTime(v.Get(key))
+}
+
+// GetDuration returns the value associated with the key as a duration.
+func GetDuration(key string) time.Duration { return v.GetDuration(key) }
+func (v *Viper) GetDuration(key string) time.Duration {
+ return cast.ToDuration(v.Get(key))
+}
+
+// GetStringSlice returns the value associated with the key as a slice of strings.
+func GetStringSlice(key string) []string { return v.GetStringSlice(key) }
+func (v *Viper) GetStringSlice(key string) []string {
+ return cast.ToStringSlice(v.Get(key))
+}
+
+// GetStringMap returns the value associated with the key as a map of interfaces.
+func GetStringMap(key string) map[string]interface{} { return v.GetStringMap(key) }
+func (v *Viper) GetStringMap(key string) map[string]interface{} {
+ return cast.ToStringMap(v.Get(key))
+}
+
+// GetStringMapString returns the value associated with the key as a map of strings.
+func GetStringMapString(key string) map[string]string { return v.GetStringMapString(key) }
+func (v *Viper) GetStringMapString(key string) map[string]string {
+ return cast.ToStringMapString(v.Get(key))
+}
+
+// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings.
+func GetStringMapStringSlice(key string) map[string][]string { return v.GetStringMapStringSlice(key) }
+func (v *Viper) GetStringMapStringSlice(key string) map[string][]string {
+ return cast.ToStringMapStringSlice(v.Get(key))
+}
+
+// GetSizeInBytes returns the size of the value associated with the given key
+// in bytes.
+func GetSizeInBytes(key string) uint { return v.GetSizeInBytes(key) }
+func (v *Viper) GetSizeInBytes(key string) uint {
+ sizeStr := cast.ToString(v.Get(key))
+ return parseSizeInBytes(sizeStr)
+}
+
+// UnmarshalKey takes a single key and unmarshals it into a Struct.
+func UnmarshalKey(key string, rawVal interface{}) error { return v.UnmarshalKey(key, rawVal) }
+func (v *Viper) UnmarshalKey(key string, rawVal interface{}) error {
+ err := decode(v.Get(key), defaultDecoderConfig(rawVal))
+
+ if err != nil {
+ return err
+ }
+
+ v.insensitiviseMaps()
+
+ return nil
+}
+
+// Unmarshal unmarshals the config into a Struct. Make sure that the tags
+// on the fields of the structure are properly set.
+func Unmarshal(rawVal interface{}) error { return v.Unmarshal(rawVal) }
+func (v *Viper) Unmarshal(rawVal interface{}) error {
+ err := decode(v.AllSettings(), defaultDecoderConfig(rawVal))
+
+ if err != nil {
+ return err
+ }
+
+ v.insensitiviseMaps()
+
+ return nil
+}
+
+// defaultDecoderConfig returns default mapsstructure.DecoderConfig with suppot
+// of time.Duration values & string slices
+func defaultDecoderConfig(output interface{}) *mapstructure.DecoderConfig {
+ return &mapstructure.DecoderConfig{
+ Metadata: nil,
+ Result: output,
+ WeaklyTypedInput: true,
+ DecodeHook: mapstructure.ComposeDecodeHookFunc(
+ mapstructure.StringToTimeDurationHookFunc(),
+ mapstructure.StringToSliceHookFunc(","),
+ ),
+ }
+}
+
+// A wrapper around mapstructure.Decode that mimics the WeakDecode functionality
+func decode(input interface{}, config *mapstructure.DecoderConfig) error {
+ decoder, err := mapstructure.NewDecoder(config)
+ if err != nil {
+ return err
+ }
+ return decoder.Decode(input)
+}
+
+// UnmarshalExact unmarshals the config into a Struct, erroring if a field is nonexistent
+// in the destination struct.
+func (v *Viper) UnmarshalExact(rawVal interface{}) error {
+ config := defaultDecoderConfig(rawVal)
+ config.ErrorUnused = true
+
+ err := decode(v.AllSettings(), config)
+
+ if err != nil {
+ return err
+ }
+
+ v.insensitiviseMaps()
+
+ return nil
+}
+
+// BindPFlags binds a full flag set to the configuration, using each flag's long
+// name as the config key.
+func BindPFlags(flags *pflag.FlagSet) error { return v.BindPFlags(flags) }
+func (v *Viper) BindPFlags(flags *pflag.FlagSet) error {
+ return v.BindFlagValues(pflagValueSet{flags})
+}
+
+// BindPFlag binds a specific key to a pflag (as used by cobra).
+// Example (where serverCmd is a Cobra instance):
+//
+// serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
+// Viper.BindPFlag("port", serverCmd.Flags().Lookup("port"))
+//
+func BindPFlag(key string, flag *pflag.Flag) error { return v.BindPFlag(key, flag) }
+func (v *Viper) BindPFlag(key string, flag *pflag.Flag) error {
+ return v.BindFlagValue(key, pflagValue{flag})
+}
+
+// BindFlagValues binds a full FlagValue set to the configuration, using each flag's long
+// name as the config key.
+func BindFlagValues(flags FlagValueSet) error { return v.BindFlagValues(flags) }
+func (v *Viper) BindFlagValues(flags FlagValueSet) (err error) {
+ flags.VisitAll(func(flag FlagValue) {
+ if err = v.BindFlagValue(flag.Name(), flag); err != nil {
+ return
+ }
+ })
+ return nil
+}
+
+// BindFlagValue binds a specific key to a FlagValue.
+// Example (where serverCmd is a Cobra instance):
+//
+// serverCmd.Flags().Int("port", 1138, "Port to run Application server on")
+// Viper.BindFlagValue("port", serverCmd.Flags().Lookup("port"))
+//
+func BindFlagValue(key string, flag FlagValue) error { return v.BindFlagValue(key, flag) }
+func (v *Viper) BindFlagValue(key string, flag FlagValue) error {
+ if flag == nil {
+ return fmt.Errorf("flag for %q is nil", key)
+ }
+ v.pflags[strings.ToLower(key)] = flag
+ return nil
+}
+
+// BindEnv binds a Viper key to a ENV variable.
+// ENV variables are case sensitive.
+// If only a key is provided, it will use the env key matching the key, uppercased.
+// EnvPrefix will be used when set when env name is not provided.
+func BindEnv(input ...string) error { return v.BindEnv(input...) }
+func (v *Viper) BindEnv(input ...string) error {
+ var key, envkey string
+ if len(input) == 0 {
+ return fmt.Errorf("BindEnv missing key to bind to")
+ }
+
+ key = strings.ToLower(input[0])
+
+ if len(input) == 1 {
+ envkey = v.mergeWithEnvPrefix(key)
+ } else {
+ envkey = input[1]
+ }
+
+ v.env[key] = envkey
+
+ return nil
+}
+
+// Given a key, find the value.
+// Viper will check in the following order:
+// flag, env, config file, key/value store, default.
+// Viper will check to see if an alias exists first.
+// Note: this assumes a lower-cased key given.
+func (v *Viper) find(lcaseKey string) interface{} {
+
+ var (
+ val interface{}
+ exists bool
+ path = strings.Split(lcaseKey, v.keyDelim)
+ nested = len(path) > 1
+ )
+
+ // compute the path through the nested maps to the nested value
+ if nested && v.isPathShadowedInDeepMap(path, castMapStringToMapInterface(v.aliases)) != "" {
+ return nil
+ }
+
+ // if the requested key is an alias, then return the proper key
+ lcaseKey = v.realKey(lcaseKey)
+ path = strings.Split(lcaseKey, v.keyDelim)
+ nested = len(path) > 1
+
+ // Set() override first
+ val = v.searchMap(v.override, path)
+ if val != nil {
+ return val
+ }
+ if nested && v.isPathShadowedInDeepMap(path, v.override) != "" {
+ return nil
+ }
+
+ // PFlag override next
+ flag, exists := v.pflags[lcaseKey]
+ if exists && flag.HasChanged() {
+ switch flag.ValueType() {
+ case "int", "int8", "int16", "int32", "int64":
+ return cast.ToInt(flag.ValueString())
+ case "bool":
+ return cast.ToBool(flag.ValueString())
+ case "stringSlice":
+ s := strings.TrimPrefix(flag.ValueString(), "[")
+ s = strings.TrimSuffix(s, "]")
+ res, _ := readAsCSV(s)
+ return res
+ default:
+ return flag.ValueString()
+ }
+ }
+ if nested && v.isPathShadowedInFlatMap(path, v.pflags) != "" {
+ return nil
+ }
+
+ // Env override next
+ if v.automaticEnvApplied {
+ // even if it hasn't been registered, if automaticEnv is used,
+ // check any Get request
+ if val = v.getEnv(v.mergeWithEnvPrefix(lcaseKey)); val != "" {
+ return val
+ }
+ if nested && v.isPathShadowedInAutoEnv(path) != "" {
+ return nil
+ }
+ }
+ envkey, exists := v.env[lcaseKey]
+ if exists {
+ if val = v.getEnv(envkey); val != "" {
+ return val
+ }
+ }
+ if nested && v.isPathShadowedInFlatMap(path, v.env) != "" {
+ return nil
+ }
+
+ // Config file next
+ val = v.searchMapWithPathPrefixes(v.config, path)
+ if val != nil {
+ return val
+ }
+ if nested && v.isPathShadowedInDeepMap(path, v.config) != "" {
+ return nil
+ }
+
+ // K/V store next
+ val = v.searchMap(v.kvstore, path)
+ if val != nil {
+ return val
+ }
+ if nested && v.isPathShadowedInDeepMap(path, v.kvstore) != "" {
+ return nil
+ }
+
+ // Default next
+ val = v.searchMap(v.defaults, path)
+ if val != nil {
+ return val
+ }
+ if nested && v.isPathShadowedInDeepMap(path, v.defaults) != "" {
+ return nil
+ }
+
+ // last chance: if no other value is returned and a flag does exist for the value,
+ // get the flag's value even if the flag's value has not changed
+ if flag, exists := v.pflags[lcaseKey]; exists {
+ switch flag.ValueType() {
+ case "int", "int8", "int16", "int32", "int64":
+ return cast.ToInt(flag.ValueString())
+ case "bool":
+ return cast.ToBool(flag.ValueString())
+ case "stringSlice":
+ s := strings.TrimPrefix(flag.ValueString(), "[")
+ s = strings.TrimSuffix(s, "]")
+ res, _ := readAsCSV(s)
+ return res
+ default:
+ return flag.ValueString()
+ }
+ }
+ // last item, no need to check shadowing
+
+ return nil
+}
+
+func readAsCSV(val string) ([]string, error) {
+ if val == "" {
+ return []string{}, nil
+ }
+ stringReader := strings.NewReader(val)
+ csvReader := csv.NewReader(stringReader)
+ return csvReader.Read()
+}
+
+// IsSet checks to see if the key has been set in any of the data locations.
+// IsSet is case-insensitive for a key.
+func IsSet(key string) bool { return v.IsSet(key) }
+func (v *Viper) IsSet(key string) bool {
+ lcaseKey := strings.ToLower(key)
+ val := v.find(lcaseKey)
+ return val != nil
+}
+
+// AutomaticEnv has Viper check ENV variables for all.
+// keys set in config, default & flags
+func AutomaticEnv() { v.AutomaticEnv() }
+func (v *Viper) AutomaticEnv() {
+ v.automaticEnvApplied = true
+}
+
+// SetEnvKeyReplacer sets the strings.Replacer on the viper object
+// Useful for mapping an environmental variable to a key that does
+// not match it.
+func SetEnvKeyReplacer(r *strings.Replacer) { v.SetEnvKeyReplacer(r) }
+func (v *Viper) SetEnvKeyReplacer(r *strings.Replacer) {
+ v.envKeyReplacer = r
+}
+
+// Aliases provide another accessor for the same key.
+// This enables one to change a name without breaking the application
+func RegisterAlias(alias string, key string) { v.RegisterAlias(alias, key) }
+func (v *Viper) RegisterAlias(alias string, key string) {
+ v.registerAlias(alias, strings.ToLower(key))
+}
+
+func (v *Viper) registerAlias(alias string, key string) {
+ alias = strings.ToLower(alias)
+ if alias != key && alias != v.realKey(key) {
+ _, exists := v.aliases[alias]
+
+ if !exists {
+ // if we alias something that exists in one of the maps to another
+ // name, we'll never be able to get that value using the original
+ // name, so move the config value to the new realkey.
+ if val, ok := v.config[alias]; ok {
+ delete(v.config, alias)
+ v.config[key] = val
+ }
+ if val, ok := v.kvstore[alias]; ok {
+ delete(v.kvstore, alias)
+ v.kvstore[key] = val
+ }
+ if val, ok := v.defaults[alias]; ok {
+ delete(v.defaults, alias)
+ v.defaults[key] = val
+ }
+ if val, ok := v.override[alias]; ok {
+ delete(v.override, alias)
+ v.override[key] = val
+ }
+ v.aliases[alias] = key
+ }
+ } else {
+ jww.WARN.Println("Creating circular reference alias", alias, key, v.realKey(key))
+ }
+}
+
+func (v *Viper) realKey(key string) string {
+ newkey, exists := v.aliases[key]
+ if exists {
+ jww.DEBUG.Println("Alias", key, "to", newkey)
+ return v.realKey(newkey)
+ }
+ return key
+}
+
+// InConfig checks to see if the given key (or an alias) is in the config file.
+func InConfig(key string) bool { return v.InConfig(key) }
+func (v *Viper) InConfig(key string) bool {
+ // if the requested key is an alias, then return the proper key
+ key = v.realKey(key)
+
+ _, exists := v.config[key]
+ return exists
+}
+
+// SetDefault sets the default value for this key.
+// SetDefault is case-insensitive for a key.
+// Default only used when no value is provided by the user via flag, config or ENV.
+func SetDefault(key string, value interface{}) { v.SetDefault(key, value) }
+func (v *Viper) SetDefault(key string, value interface{}) {
+ // If alias passed in, then set the proper default
+ key = v.realKey(strings.ToLower(key))
+ value = toCaseInsensitiveValue(value)
+
+ path := strings.Split(key, v.keyDelim)
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(v.defaults, path[0:len(path)-1])
+
+ // set innermost value
+ deepestMap[lastKey] = value
+}
+
+// Set sets the value for the key in the override regiser.
+// Set is case-insensitive for a key.
+// Will be used instead of values obtained via
+// flags, config file, ENV, default, or key/value store.
+func Set(key string, value interface{}) { v.Set(key, value) }
+func (v *Viper) Set(key string, value interface{}) {
+ // If alias passed in, then set the proper override
+ key = v.realKey(strings.ToLower(key))
+ value = toCaseInsensitiveValue(value)
+
+ path := strings.Split(key, v.keyDelim)
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(v.override, path[0:len(path)-1])
+
+ // set innermost value
+ deepestMap[lastKey] = value
+}
+
+// ReadInConfig will discover and load the configuration file from disk
+// and key/value stores, searching in one of the defined paths.
+func ReadInConfig() error { return v.ReadInConfig() }
+func (v *Viper) ReadInConfig() error {
+ jww.INFO.Println("Attempting to read in config file")
+ filename, err := v.getConfigFile()
+ if err != nil {
+ return err
+ }
+
+ if !stringInSlice(v.getConfigType(), SupportedExts) {
+ return UnsupportedConfigError(v.getConfigType())
+ }
+
+ jww.DEBUG.Println("Reading file: ", filename)
+ file, err := afero.ReadFile(v.fs, filename)
+ if err != nil {
+ return err
+ }
+
+ config := make(map[string]interface{})
+
+ err = v.unmarshalReader(bytes.NewReader(file), config)
+ if err != nil {
+ return err
+ }
+
+ v.config = config
+ return nil
+}
+
+// MergeInConfig merges a new configuration with an existing config.
+func MergeInConfig() error { return v.MergeInConfig() }
+func (v *Viper) MergeInConfig() error {
+ jww.INFO.Println("Attempting to merge in config file")
+ filename, err := v.getConfigFile()
+ if err != nil {
+ return err
+ }
+
+ if !stringInSlice(v.getConfigType(), SupportedExts) {
+ return UnsupportedConfigError(v.getConfigType())
+ }
+
+ file, err := afero.ReadFile(v.fs, filename)
+ if err != nil {
+ return err
+ }
+
+ return v.MergeConfig(bytes.NewReader(file))
+}
+
+// ReadConfig will read a configuration file, setting existing keys to nil if the
+// key does not exist in the file.
+func ReadConfig(in io.Reader) error { return v.ReadConfig(in) }
+func (v *Viper) ReadConfig(in io.Reader) error {
+ v.config = make(map[string]interface{})
+ return v.unmarshalReader(in, v.config)
+}
+
+// MergeConfig merges a new configuration with an existing config.
+func MergeConfig(in io.Reader) error { return v.MergeConfig(in) }
+func (v *Viper) MergeConfig(in io.Reader) error {
+ if v.config == nil {
+ v.config = make(map[string]interface{})
+ }
+ cfg := make(map[string]interface{})
+ if err := v.unmarshalReader(in, cfg); err != nil {
+ return err
+ }
+ mergeMaps(cfg, v.config, nil)
+ return nil
+}
+
+// WriteConfig writes the current configuration to a file.
+func WriteConfig() error { return v.WriteConfig() }
+func (v *Viper) WriteConfig() error {
+ filename, err := v.getConfigFile()
+ if err != nil {
+ return err
+ }
+ return v.writeConfig(filename, true)
+}
+
+// SafeWriteConfig writes current configuration to file only if the file does not exist.
+func SafeWriteConfig() error { return v.SafeWriteConfig() }
+func (v *Viper) SafeWriteConfig() error {
+ filename, err := v.getConfigFile()
+ if err != nil {
+ return err
+ }
+ return v.writeConfig(filename, false)
+}
+
+// WriteConfigAs writes current configuration to a given filename.
+func WriteConfigAs(filename string) error { return v.WriteConfigAs(filename) }
+func (v *Viper) WriteConfigAs(filename string) error {
+ return v.writeConfig(filename, true)
+}
+
+// SafeWriteConfigAs writes current configuration to a given filename if it does not exist.
+func SafeWriteConfigAs(filename string) error { return v.SafeWriteConfigAs(filename) }
+func (v *Viper) SafeWriteConfigAs(filename string) error {
+ return v.writeConfig(filename, false)
+}
+
+func writeConfig(filename string, force bool) error { return v.writeConfig(filename, force) }
+func (v *Viper) writeConfig(filename string, force bool) error {
+ jww.INFO.Println("Attempting to write configuration to file.")
+ ext := filepath.Ext(filename)
+ if len(ext) <= 1 {
+ return fmt.Errorf("Filename: %s requires valid extension.", filename)
+ }
+ configType := ext[1:]
+ if !stringInSlice(configType, SupportedExts) {
+ return UnsupportedConfigError(configType)
+ }
+ if v.config == nil {
+ v.config = make(map[string]interface{})
+ }
+ var flags int
+ if force == true {
+ flags = os.O_CREATE | os.O_TRUNC | os.O_WRONLY
+ } else {
+ if _, err := os.Stat(filename); os.IsNotExist(err) {
+ flags = os.O_WRONLY
+ } else {
+ return fmt.Errorf("File: %s exists. Use WriteConfig to overwrite.", filename)
+ }
+ }
+ f, err := v.fs.OpenFile(filename, flags, os.FileMode(0644))
+ if err != nil {
+ return err
+ }
+ return v.marshalWriter(f, configType)
+}
+
+// Unmarshal a Reader into a map.
+// Should probably be an unexported function.
+func unmarshalReader(in io.Reader, c map[string]interface{}) error {
+ return v.unmarshalReader(in, c)
+}
+func (v *Viper) unmarshalReader(in io.Reader, c map[string]interface{}) error {
+ buf := new(bytes.Buffer)
+ buf.ReadFrom(in)
+
+ switch strings.ToLower(v.getConfigType()) {
+ case "yaml", "yml":
+ if err := yaml.Unmarshal(buf.Bytes(), &c); err != nil {
+ return ConfigParseError{err}
+ }
+
+ case "json":
+ if err := json.Unmarshal(buf.Bytes(), &c); err != nil {
+ return ConfigParseError{err}
+ }
+
+ case "hcl":
+ obj, err := hcl.Parse(string(buf.Bytes()))
+ if err != nil {
+ return ConfigParseError{err}
+ }
+ if err = hcl.DecodeObject(&c, obj); err != nil {
+ return ConfigParseError{err}
+ }
+
+ case "toml":
+ tree, err := toml.LoadReader(buf)
+ if err != nil {
+ return ConfigParseError{err}
+ }
+ tmap := tree.ToMap()
+ for k, v := range tmap {
+ c[k] = v
+ }
+
+ case "properties", "props", "prop":
+ v.properties = properties.NewProperties()
+ var err error
+ if v.properties, err = properties.Load(buf.Bytes(), properties.UTF8); err != nil {
+ return ConfigParseError{err}
+ }
+ for _, key := range v.properties.Keys() {
+ value, _ := v.properties.Get(key)
+ // recursively build nested maps
+ path := strings.Split(key, ".")
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(c, path[0:len(path)-1])
+ // set innermost value
+ deepestMap[lastKey] = value
+ }
+ }
+
+ insensitiviseMap(c)
+ return nil
+}
+
+// Marshal a map into Writer.
+func marshalWriter(f afero.File, configType string) error {
+ return v.marshalWriter(f, configType)
+}
+func (v *Viper) marshalWriter(f afero.File, configType string) error {
+ c := v.AllSettings()
+ switch configType {
+ case "json":
+ b, err := json.MarshalIndent(c, "", " ")
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+ _, err = f.WriteString(string(b))
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+
+ case "hcl":
+ b, err := json.Marshal(c)
+ ast, err := hcl.Parse(string(b))
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+ err = printer.Fprint(f, ast.Node)
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+
+ case "prop", "props", "properties":
+ if v.properties == nil {
+ v.properties = properties.NewProperties()
+ }
+ p := v.properties
+ for _, key := range v.AllKeys() {
+ _, _, err := p.Set(key, v.GetString(key))
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+ }
+ _, err := p.WriteComment(f, "#", properties.UTF8)
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+
+ case "toml":
+ t, err := toml.TreeFromMap(c)
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+ s := t.String()
+ if _, err := f.WriteString(s); err != nil {
+ return ConfigMarshalError{err}
+ }
+
+ case "yaml", "yml":
+ b, err := yaml.Marshal(c)
+ if err != nil {
+ return ConfigMarshalError{err}
+ }
+ if _, err = f.WriteString(string(b)); err != nil {
+ return ConfigMarshalError{err}
+ }
+ }
+ return nil
+}
+
+func keyExists(k string, m map[string]interface{}) string {
+ lk := strings.ToLower(k)
+ for mk := range m {
+ lmk := strings.ToLower(mk)
+ if lmk == lk {
+ return mk
+ }
+ }
+ return ""
+}
+
+func castToMapStringInterface(
+ src map[interface{}]interface{}) map[string]interface{} {
+ tgt := map[string]interface{}{}
+ for k, v := range src {
+ tgt[fmt.Sprintf("%v", k)] = v
+ }
+ return tgt
+}
+
+func castMapStringToMapInterface(src map[string]string) map[string]interface{} {
+ tgt := map[string]interface{}{}
+ for k, v := range src {
+ tgt[k] = v
+ }
+ return tgt
+}
+
+func castMapFlagToMapInterface(src map[string]FlagValue) map[string]interface{} {
+ tgt := map[string]interface{}{}
+ for k, v := range src {
+ tgt[k] = v
+ }
+ return tgt
+}
+
+// mergeMaps merges two maps. The `itgt` parameter is for handling go-yaml's
+// insistence on parsing nested structures as `map[interface{}]interface{}`
+// instead of using a `string` as the key for nest structures beyond one level
+// deep. Both map types are supported as there is a go-yaml fork that uses
+// `map[string]interface{}` instead.
+func mergeMaps(
+ src, tgt map[string]interface{}, itgt map[interface{}]interface{}) {
+ for sk, sv := range src {
+ tk := keyExists(sk, tgt)
+ if tk == "" {
+ jww.TRACE.Printf("tk=\"\", tgt[%s]=%v", sk, sv)
+ tgt[sk] = sv
+ if itgt != nil {
+ itgt[sk] = sv
+ }
+ continue
+ }
+
+ tv, ok := tgt[tk]
+ if !ok {
+ jww.TRACE.Printf("tgt[%s] != ok, tgt[%s]=%v", tk, sk, sv)
+ tgt[sk] = sv
+ if itgt != nil {
+ itgt[sk] = sv
+ }
+ continue
+ }
+
+ svType := reflect.TypeOf(sv)
+ tvType := reflect.TypeOf(tv)
+ if svType != tvType {
+ jww.ERROR.Printf(
+ "svType != tvType; key=%s, st=%v, tt=%v, sv=%v, tv=%v",
+ sk, svType, tvType, sv, tv)
+ continue
+ }
+
+ jww.TRACE.Printf("processing key=%s, st=%v, tt=%v, sv=%v, tv=%v",
+ sk, svType, tvType, sv, tv)
+
+ switch ttv := tv.(type) {
+ case map[interface{}]interface{}:
+ jww.TRACE.Printf("merging maps (must convert)")
+ tsv := sv.(map[interface{}]interface{})
+ ssv := castToMapStringInterface(tsv)
+ stv := castToMapStringInterface(ttv)
+ mergeMaps(ssv, stv, ttv)
+ case map[string]interface{}:
+ jww.TRACE.Printf("merging maps")
+ mergeMaps(sv.(map[string]interface{}), ttv, nil)
+ default:
+ jww.TRACE.Printf("setting value")
+ tgt[tk] = sv
+ if itgt != nil {
+ itgt[tk] = sv
+ }
+ }
+ }
+}
+
+// ReadRemoteConfig attempts to get configuration from a remote source
+// and read it in the remote configuration registry.
+func ReadRemoteConfig() error { return v.ReadRemoteConfig() }
+func (v *Viper) ReadRemoteConfig() error {
+ return v.getKeyValueConfig()
+}
+
+func WatchRemoteConfig() error { return v.WatchRemoteConfig() }
+func (v *Viper) WatchRemoteConfig() error {
+ return v.watchKeyValueConfig()
+}
+
+func (v *Viper) WatchRemoteConfigOnChannel() error {
+ return v.watchKeyValueConfigOnChannel()
+}
+
+func (v *Viper) insensitiviseMaps() {
+ insensitiviseMap(v.config)
+ insensitiviseMap(v.defaults)
+ insensitiviseMap(v.override)
+ insensitiviseMap(v.kvstore)
+}
+
+// Retrieve the first found remote configuration.
+func (v *Viper) getKeyValueConfig() error {
+ if RemoteConfig == nil {
+ return RemoteConfigError("Enable the remote features by doing a blank import of the viper/remote package: '_ github.com/spf13/viper/remote'")
+ }
+
+ for _, rp := range v.remoteProviders {
+ val, err := v.getRemoteConfig(rp)
+ if err != nil {
+ continue
+ }
+ v.kvstore = val
+ return nil
+ }
+ return RemoteConfigError("No Files Found")
+}
+
+func (v *Viper) getRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) {
+ reader, err := RemoteConfig.Get(provider)
+ if err != nil {
+ return nil, err
+ }
+ err = v.unmarshalReader(reader, v.kvstore)
+ return v.kvstore, err
+}
+
+// Retrieve the first found remote configuration.
+func (v *Viper) watchKeyValueConfigOnChannel() error {
+ for _, rp := range v.remoteProviders {
+ respc, _ := RemoteConfig.WatchChannel(rp)
+ //Todo: Add quit channel
+ go func(rc <-chan *RemoteResponse) {
+ for {
+ b := <-rc
+ reader := bytes.NewReader(b.Value)
+ v.unmarshalReader(reader, v.kvstore)
+ }
+ }(respc)
+ return nil
+ }
+ return RemoteConfigError("No Files Found")
+}
+
+// Retrieve the first found remote configuration.
+func (v *Viper) watchKeyValueConfig() error {
+ for _, rp := range v.remoteProviders {
+ val, err := v.watchRemoteConfig(rp)
+ if err != nil {
+ continue
+ }
+ v.kvstore = val
+ return nil
+ }
+ return RemoteConfigError("No Files Found")
+}
+
+func (v *Viper) watchRemoteConfig(provider RemoteProvider) (map[string]interface{}, error) {
+ reader, err := RemoteConfig.Watch(provider)
+ if err != nil {
+ return nil, err
+ }
+ err = v.unmarshalReader(reader, v.kvstore)
+ return v.kvstore, err
+}
+
+// AllKeys returns all keys holding a value, regardless of where they are set.
+// Nested keys are returned with a v.keyDelim (= ".") separator
+func AllKeys() []string { return v.AllKeys() }
+func (v *Viper) AllKeys() []string {
+ m := map[string]bool{}
+ // add all paths, by order of descending priority to ensure correct shadowing
+ m = v.flattenAndMergeMap(m, castMapStringToMapInterface(v.aliases), "")
+ m = v.flattenAndMergeMap(m, v.override, "")
+ m = v.mergeFlatMap(m, castMapFlagToMapInterface(v.pflags))
+ m = v.mergeFlatMap(m, castMapStringToMapInterface(v.env))
+ m = v.flattenAndMergeMap(m, v.config, "")
+ m = v.flattenAndMergeMap(m, v.kvstore, "")
+ m = v.flattenAndMergeMap(m, v.defaults, "")
+
+ // convert set of paths to list
+ a := []string{}
+ for x := range m {
+ a = append(a, x)
+ }
+ return a
+}
+
+// flattenAndMergeMap recursively flattens the given map into a map[string]bool
+// of key paths (used as a set, easier to manipulate than a []string):
+// - each path is merged into a single key string, delimited with v.keyDelim (= ".")
+// - if a path is shadowed by an earlier value in the initial shadow map,
+// it is skipped.
+// The resulting set of paths is merged to the given shadow set at the same time.
+func (v *Viper) flattenAndMergeMap(shadow map[string]bool, m map[string]interface{}, prefix string) map[string]bool {
+ if shadow != nil && prefix != "" && shadow[prefix] {
+ // prefix is shadowed => nothing more to flatten
+ return shadow
+ }
+ if shadow == nil {
+ shadow = make(map[string]bool)
+ }
+
+ var m2 map[string]interface{}
+ if prefix != "" {
+ prefix += v.keyDelim
+ }
+ for k, val := range m {
+ fullKey := prefix + k
+ switch val.(type) {
+ case map[string]interface{}:
+ m2 = val.(map[string]interface{})
+ case map[interface{}]interface{}:
+ m2 = cast.ToStringMap(val)
+ default:
+ // immediate value
+ shadow[strings.ToLower(fullKey)] = true
+ continue
+ }
+ // recursively merge to shadow map
+ shadow = v.flattenAndMergeMap(shadow, m2, fullKey)
+ }
+ return shadow
+}
+
+// mergeFlatMap merges the given maps, excluding values of the second map
+// shadowed by values from the first map.
+func (v *Viper) mergeFlatMap(shadow map[string]bool, m map[string]interface{}) map[string]bool {
+ // scan keys
+outer:
+ for k, _ := range m {
+ path := strings.Split(k, v.keyDelim)
+ // scan intermediate paths
+ var parentKey string
+ for i := 1; i < len(path); i++ {
+ parentKey = strings.Join(path[0:i], v.keyDelim)
+ if shadow[parentKey] {
+ // path is shadowed, continue
+ continue outer
+ }
+ }
+ // add key
+ shadow[strings.ToLower(k)] = true
+ }
+ return shadow
+}
+
+// AllSettings merges all settings and returns them as a map[string]interface{}.
+func AllSettings() map[string]interface{} { return v.AllSettings() }
+func (v *Viper) AllSettings() map[string]interface{} {
+ m := map[string]interface{}{}
+ // start from the list of keys, and construct the map one value at a time
+ for _, k := range v.AllKeys() {
+ value := v.Get(k)
+ if value == nil {
+ // should not happen, since AllKeys() returns only keys holding a value,
+ // check just in case anything changes
+ continue
+ }
+ path := strings.Split(k, v.keyDelim)
+ lastKey := strings.ToLower(path[len(path)-1])
+ deepestMap := deepSearch(m, path[0:len(path)-1])
+ // set innermost value
+ deepestMap[lastKey] = value
+ }
+ return m
+}
+
+// SetFs sets the filesystem to use to read configuration.
+func SetFs(fs afero.Fs) { v.SetFs(fs) }
+func (v *Viper) SetFs(fs afero.Fs) {
+ v.fs = fs
+}
+
+// SetConfigName sets name for the config file.
+// Does not include extension.
+func SetConfigName(in string) { v.SetConfigName(in) }
+func (v *Viper) SetConfigName(in string) {
+ if in != "" {
+ v.configName = in
+ v.configFile = ""
+ }
+}
+
+// SetConfigType sets the type of the configuration returned by the
+// remote source, e.g. "json".
+func SetConfigType(in string) { v.SetConfigType(in) }
+func (v *Viper) SetConfigType(in string) {
+ if in != "" {
+ v.configType = in
+ }
+}
+
+func (v *Viper) getConfigType() string {
+ if v.configType != "" {
+ return v.configType
+ }
+
+ cf, err := v.getConfigFile()
+ if err != nil {
+ return ""
+ }
+
+ ext := filepath.Ext(cf)
+
+ if len(ext) > 1 {
+ return ext[1:]
+ }
+
+ return ""
+}
+
+func (v *Viper) getConfigFile() (string, error) {
+ if v.configFile == "" {
+ cf, err := v.findConfigFile()
+ if err != nil {
+ return "", err
+ }
+ v.configFile = cf
+ }
+ return v.configFile, nil
+}
+
+func (v *Viper) searchInPath(in string) (filename string) {
+ jww.DEBUG.Println("Searching for config in ", in)
+ for _, ext := range SupportedExts {
+ jww.DEBUG.Println("Checking for", filepath.Join(in, v.configName+"."+ext))
+ if b, _ := exists(v.fs, filepath.Join(in, v.configName+"."+ext)); b {
+ jww.DEBUG.Println("Found: ", filepath.Join(in, v.configName+"."+ext))
+ return filepath.Join(in, v.configName+"."+ext)
+ }
+ }
+
+ return ""
+}
+
+// Search all configPaths for any config file.
+// Returns the first path that exists (and is a config file).
+func (v *Viper) findConfigFile() (string, error) {
+ jww.INFO.Println("Searching for config in ", v.configPaths)
+
+ for _, cp := range v.configPaths {
+ file := v.searchInPath(cp)
+ if file != "" {
+ return file, nil
+ }
+ }
+ return "", ConfigFileNotFoundError{v.configName, fmt.Sprintf("%s", v.configPaths)}
+}
+
+// Debug prints all configuration registries for debugging
+// purposes.
+func Debug() { v.Debug() }
+func (v *Viper) Debug() {
+ fmt.Printf("Aliases:\n%#v\n", v.aliases)
+ fmt.Printf("Override:\n%#v\n", v.override)
+ fmt.Printf("PFlags:\n%#v\n", v.pflags)
+ fmt.Printf("Env:\n%#v\n", v.env)
+ fmt.Printf("Key/Value Store:\n%#v\n", v.kvstore)
+ fmt.Printf("Config:\n%#v\n", v.config)
+ fmt.Printf("Defaults:\n%#v\n", v.defaults)
+}
diff --git a/vendor/golang.org/x/crypto/ed25519/ed25519.go b/vendor/golang.org/x/crypto/ed25519/ed25519.go
index 4f26b49b6a8..a57771a1ed3 100644
--- a/vendor/golang.org/x/crypto/ed25519/ed25519.go
+++ b/vendor/golang.org/x/crypto/ed25519/ed25519.go
@@ -171,9 +171,16 @@ func Verify(publicKey PublicKey, message, sig []byte) bool {
edwards25519.ScReduce(&hReduced, &digest)
var R edwards25519.ProjectiveGroupElement
- var b [32]byte
- copy(b[:], sig[32:])
- edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &b)
+ var s [32]byte
+ copy(s[:], sig[32:])
+
+ // https://tools.ietf.org/html/rfc8032#section-5.1.7 requires that s be in
+ // the range [0, order) in order to prevent signature malleability.
+ if !edwards25519.ScMinimal(&s) {
+ return false
+ }
+
+ edwards25519.GeDoubleScalarMultVartime(&R, &hReduced, &A, &s)
var checkR [32]byte
R.ToBytes(&checkR)
diff --git a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
index 5f8b9947872..fd03c252af4 100644
--- a/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
+++ b/vendor/golang.org/x/crypto/ed25519/internal/edwards25519/edwards25519.go
@@ -4,6 +4,8 @@
package edwards25519
+import "encoding/binary"
+
// This code is a port of the public domain, “ref10” implementation of ed25519
// from SUPERCOP.
@@ -1769,3 +1771,23 @@ func ScReduce(out *[32]byte, s *[64]byte) {
out[30] = byte(s11 >> 9)
out[31] = byte(s11 >> 17)
}
+
+// order is the order of Curve25519 in little-endian form.
+var order = [4]uint64{0x5812631a5cf5d3ed, 0x14def9dea2f79cd6, 0, 0x1000000000000000}
+
+// ScMinimal returns true if the given scalar is less than the order of the
+// curve.
+func ScMinimal(scalar *[32]byte) bool {
+ for i := 3; ; i-- {
+ v := binary.LittleEndian.Uint64(scalar[i*8:])
+ if v > order[i] {
+ return false
+ } else if v < order[i] {
+ break
+ } else if i == 0 {
+ return false
+ }
+ }
+
+ return true
+}
diff --git a/vendor/golang.org/x/crypto/internal/chacha20/asm_s390x.s b/vendor/golang.org/x/crypto/internal/chacha20/asm_s390x.s
new file mode 100644
index 00000000000..98427c5e222
--- /dev/null
+++ b/vendor/golang.org/x/crypto/internal/chacha20/asm_s390x.s
@@ -0,0 +1,283 @@
+// 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.
+
+// +build s390x,!gccgo,!appengine
+
+#include "go_asm.h"
+#include "textflag.h"
+
+// This is an implementation of the ChaCha20 encryption algorithm as
+// specified in RFC 7539. It uses vector instructions to compute
+// 4 keystream blocks in parallel (256 bytes) which are then XORed
+// with the bytes in the input slice.
+
+GLOBL ·constants<>(SB), RODATA|NOPTR, $32
+// BSWAP: swap bytes in each 4-byte element
+DATA ·constants<>+0x00(SB)/4, $0x03020100
+DATA ·constants<>+0x04(SB)/4, $0x07060504
+DATA ·constants<>+0x08(SB)/4, $0x0b0a0908
+DATA ·constants<>+0x0c(SB)/4, $0x0f0e0d0c
+// J0: [j0, j1, j2, j3]
+DATA ·constants<>+0x10(SB)/4, $0x61707865
+DATA ·constants<>+0x14(SB)/4, $0x3320646e
+DATA ·constants<>+0x18(SB)/4, $0x79622d32
+DATA ·constants<>+0x1c(SB)/4, $0x6b206574
+
+// EXRL targets:
+TEXT ·mvcSrcToBuf(SB), NOFRAME|NOSPLIT, $0
+ MVC $1, (R1), (R8)
+ RET
+
+TEXT ·mvcBufToDst(SB), NOFRAME|NOSPLIT, $0
+ MVC $1, (R8), (R9)
+ RET
+
+#define BSWAP V5
+#define J0 V6
+#define KEY0 V7
+#define KEY1 V8
+#define NONCE V9
+#define CTR V10
+#define M0 V11
+#define M1 V12
+#define M2 V13
+#define M3 V14
+#define INC V15
+#define X0 V16
+#define X1 V17
+#define X2 V18
+#define X3 V19
+#define X4 V20
+#define X5 V21
+#define X6 V22
+#define X7 V23
+#define X8 V24
+#define X9 V25
+#define X10 V26
+#define X11 V27
+#define X12 V28
+#define X13 V29
+#define X14 V30
+#define X15 V31
+
+#define NUM_ROUNDS 20
+
+#define ROUND4(a0, a1, a2, a3, b0, b1, b2, b3, c0, c1, c2, c3, d0, d1, d2, d3) \
+ VAF a1, a0, a0 \
+ VAF b1, b0, b0 \
+ VAF c1, c0, c0 \
+ VAF d1, d0, d0 \
+ VX a0, a2, a2 \
+ VX b0, b2, b2 \
+ VX c0, c2, c2 \
+ VX d0, d2, d2 \
+ VERLLF $16, a2, a2 \
+ VERLLF $16, b2, b2 \
+ VERLLF $16, c2, c2 \
+ VERLLF $16, d2, d2 \
+ VAF a2, a3, a3 \
+ VAF b2, b3, b3 \
+ VAF c2, c3, c3 \
+ VAF d2, d3, d3 \
+ VX a3, a1, a1 \
+ VX b3, b1, b1 \
+ VX c3, c1, c1 \
+ VX d3, d1, d1 \
+ VERLLF $12, a1, a1 \
+ VERLLF $12, b1, b1 \
+ VERLLF $12, c1, c1 \
+ VERLLF $12, d1, d1 \
+ VAF a1, a0, a0 \
+ VAF b1, b0, b0 \
+ VAF c1, c0, c0 \
+ VAF d1, d0, d0 \
+ VX a0, a2, a2 \
+ VX b0, b2, b2 \
+ VX c0, c2, c2 \
+ VX d0, d2, d2 \
+ VERLLF $8, a2, a2 \
+ VERLLF $8, b2, b2 \
+ VERLLF $8, c2, c2 \
+ VERLLF $8, d2, d2 \
+ VAF a2, a3, a3 \
+ VAF b2, b3, b3 \
+ VAF c2, c3, c3 \
+ VAF d2, d3, d3 \
+ VX a3, a1, a1 \
+ VX b3, b1, b1 \
+ VX c3, c1, c1 \
+ VX d3, d1, d1 \
+ VERLLF $7, a1, a1 \
+ VERLLF $7, b1, b1 \
+ VERLLF $7, c1, c1 \
+ VERLLF $7, d1, d1
+
+#define PERMUTE(mask, v0, v1, v2, v3) \
+ VPERM v0, v0, mask, v0 \
+ VPERM v1, v1, mask, v1 \
+ VPERM v2, v2, mask, v2 \
+ VPERM v3, v3, mask, v3
+
+#define ADDV(x, v0, v1, v2, v3) \
+ VAF x, v0, v0 \
+ VAF x, v1, v1 \
+ VAF x, v2, v2 \
+ VAF x, v3, v3
+
+#define XORV(off, dst, src, v0, v1, v2, v3) \
+ VLM off(src), M0, M3 \
+ PERMUTE(BSWAP, v0, v1, v2, v3) \
+ VX v0, M0, M0 \
+ VX v1, M1, M1 \
+ VX v2, M2, M2 \
+ VX v3, M3, M3 \
+ VSTM M0, M3, off(dst)
+
+#define SHUFFLE(a, b, c, d, t, u, v, w) \
+ VMRHF a, c, t \ // t = {a[0], c[0], a[1], c[1]}
+ VMRHF b, d, u \ // u = {b[0], d[0], b[1], d[1]}
+ VMRLF a, c, v \ // v = {a[2], c[2], a[3], c[3]}
+ VMRLF b, d, w \ // w = {b[2], d[2], b[3], d[3]}
+ VMRHF t, u, a \ // a = {a[0], b[0], c[0], d[0]}
+ VMRLF t, u, b \ // b = {a[1], b[1], c[1], d[1]}
+ VMRHF v, w, c \ // c = {a[2], b[2], c[2], d[2]}
+ VMRLF v, w, d // d = {a[3], b[3], c[3], d[3]}
+
+// func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int)
+TEXT ·xorKeyStreamVX(SB), NOSPLIT, $0
+ MOVD $·constants<>(SB), R1
+ MOVD dst+0(FP), R2 // R2=&dst[0]
+ LMG src+24(FP), R3, R4 // R3=&src[0] R4=len(src)
+ MOVD key+48(FP), R5 // R5=key
+ MOVD nonce+56(FP), R6 // R6=nonce
+ MOVD counter+64(FP), R7 // R7=counter
+ MOVD buf+72(FP), R8 // R8=buf
+ MOVD len+80(FP), R9 // R9=len
+
+ // load BSWAP and J0
+ VLM (R1), BSWAP, J0
+
+ // set up tail buffer
+ ADD $-1, R4, R12
+ MOVBZ R12, R12
+ CMPUBEQ R12, $255, aligned
+ MOVD R4, R1
+ AND $~255, R1
+ MOVD $(R3)(R1*1), R1
+ EXRL $·mvcSrcToBuf(SB), R12
+ MOVD $255, R0
+ SUB R12, R0
+ MOVD R0, (R9) // update len
+
+aligned:
+ // setup
+ MOVD $95, R0
+ VLM (R5), KEY0, KEY1
+ VLL R0, (R6), NONCE
+ VZERO M0
+ VLEIB $7, $32, M0
+ VSRLB M0, NONCE, NONCE
+
+ // initialize counter values
+ VLREPF (R7), CTR
+ VZERO INC
+ VLEIF $1, $1, INC
+ VLEIF $2, $2, INC
+ VLEIF $3, $3, INC
+ VAF INC, CTR, CTR
+ VREPIF $4, INC
+
+chacha:
+ VREPF $0, J0, X0
+ VREPF $1, J0, X1
+ VREPF $2, J0, X2
+ VREPF $3, J0, X3
+ VREPF $0, KEY0, X4
+ VREPF $1, KEY0, X5
+ VREPF $2, KEY0, X6
+ VREPF $3, KEY0, X7
+ VREPF $0, KEY1, X8
+ VREPF $1, KEY1, X9
+ VREPF $2, KEY1, X10
+ VREPF $3, KEY1, X11
+ VLR CTR, X12
+ VREPF $1, NONCE, X13
+ VREPF $2, NONCE, X14
+ VREPF $3, NONCE, X15
+
+ MOVD $(NUM_ROUNDS/2), R1
+
+loop:
+ ROUND4(X0, X4, X12, X8, X1, X5, X13, X9, X2, X6, X14, X10, X3, X7, X15, X11)
+ ROUND4(X0, X5, X15, X10, X1, X6, X12, X11, X2, X7, X13, X8, X3, X4, X14, X9)
+
+ ADD $-1, R1
+ BNE loop
+
+ // decrement length
+ ADD $-256, R4
+ BLT tail
+
+continue:
+ // rearrange vectors
+ SHUFFLE(X0, X1, X2, X3, M0, M1, M2, M3)
+ ADDV(J0, X0, X1, X2, X3)
+ SHUFFLE(X4, X5, X6, X7, M0, M1, M2, M3)
+ ADDV(KEY0, X4, X5, X6, X7)
+ SHUFFLE(X8, X9, X10, X11, M0, M1, M2, M3)
+ ADDV(KEY1, X8, X9, X10, X11)
+ VAF CTR, X12, X12
+ SHUFFLE(X12, X13, X14, X15, M0, M1, M2, M3)
+ ADDV(NONCE, X12, X13, X14, X15)
+
+ // increment counters
+ VAF INC, CTR, CTR
+
+ // xor keystream with plaintext
+ XORV(0*64, R2, R3, X0, X4, X8, X12)
+ XORV(1*64, R2, R3, X1, X5, X9, X13)
+ XORV(2*64, R2, R3, X2, X6, X10, X14)
+ XORV(3*64, R2, R3, X3, X7, X11, X15)
+
+ // increment pointers
+ MOVD $256(R2), R2
+ MOVD $256(R3), R3
+
+ CMPBNE R4, $0, chacha
+ CMPUBEQ R12, $255, return
+ EXRL $·mvcBufToDst(SB), R12 // len was updated during setup
+
+return:
+ VSTEF $0, CTR, (R7)
+ RET
+
+tail:
+ MOVD R2, R9
+ MOVD R8, R2
+ MOVD R8, R3
+ MOVD $0, R4
+ JMP continue
+
+// func hasVectorFacility() bool
+TEXT ·hasVectorFacility(SB), NOSPLIT, $24-1
+ MOVD $x-24(SP), R1
+ XC $24, 0(R1), 0(R1) // clear the storage
+ MOVD $2, R0 // R0 is the number of double words stored -1
+ WORD $0xB2B01000 // STFLE 0(R1)
+ XOR R0, R0 // reset the value of R0
+ MOVBZ z-8(SP), R1
+ AND $0x40, R1
+ BEQ novector
+
+vectorinstalled:
+ // check if the vector instruction has been enabled
+ VLEIB $0, $0xF, V16
+ VLGVB $0, V16, R1
+ CMPBNE R1, $0xF, novector
+ MOVB $1, ret+0(FP) // have vx
+ RET
+
+novector:
+ MOVB $0, ret+0(FP) // no vx
+ RET
diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go
index 0f8efdbaa44..7ed1cd9b185 100644
--- a/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go
+++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_generic.go
@@ -2,197 +2,226 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
-// Package ChaCha20 implements the core ChaCha20 function as specified in https://tools.ietf.org/html/rfc7539#section-2.3.
+// Package ChaCha20 implements the core ChaCha20 function as specified
+// in https://tools.ietf.org/html/rfc7539#section-2.3.
package chacha20
-import "encoding/binary"
-
-const rounds = 20
-
-// core applies the ChaCha20 core function to 16-byte input in, 32-byte key k,
-// and 16-byte constant c, and puts the result into 64-byte array out.
-func core(out *[64]byte, in *[16]byte, k *[32]byte) {
- j0 := uint32(0x61707865)
- j1 := uint32(0x3320646e)
- j2 := uint32(0x79622d32)
- j3 := uint32(0x6b206574)
- j4 := binary.LittleEndian.Uint32(k[0:4])
- j5 := binary.LittleEndian.Uint32(k[4:8])
- j6 := binary.LittleEndian.Uint32(k[8:12])
- j7 := binary.LittleEndian.Uint32(k[12:16])
- j8 := binary.LittleEndian.Uint32(k[16:20])
- j9 := binary.LittleEndian.Uint32(k[20:24])
- j10 := binary.LittleEndian.Uint32(k[24:28])
- j11 := binary.LittleEndian.Uint32(k[28:32])
- j12 := binary.LittleEndian.Uint32(in[0:4])
- j13 := binary.LittleEndian.Uint32(in[4:8])
- j14 := binary.LittleEndian.Uint32(in[8:12])
- j15 := binary.LittleEndian.Uint32(in[12:16])
-
- x0, x1, x2, x3, x4, x5, x6, x7 := j0, j1, j2, j3, j4, j5, j6, j7
- x8, x9, x10, x11, x12, x13, x14, x15 := j8, j9, j10, j11, j12, j13, j14, j15
-
- for i := 0; i < rounds; i += 2 {
- x0 += x4
- x12 ^= x0
- x12 = (x12 << 16) | (x12 >> (16))
- x8 += x12
- x4 ^= x8
- x4 = (x4 << 12) | (x4 >> (20))
- x0 += x4
- x12 ^= x0
- x12 = (x12 << 8) | (x12 >> (24))
- x8 += x12
- x4 ^= x8
- x4 = (x4 << 7) | (x4 >> (25))
- x1 += x5
- x13 ^= x1
- x13 = (x13 << 16) | (x13 >> 16)
- x9 += x13
- x5 ^= x9
- x5 = (x5 << 12) | (x5 >> 20)
- x1 += x5
- x13 ^= x1
- x13 = (x13 << 8) | (x13 >> 24)
- x9 += x13
- x5 ^= x9
- x5 = (x5 << 7) | (x5 >> 25)
- x2 += x6
- x14 ^= x2
- x14 = (x14 << 16) | (x14 >> 16)
- x10 += x14
- x6 ^= x10
- x6 = (x6 << 12) | (x6 >> 20)
- x2 += x6
- x14 ^= x2
- x14 = (x14 << 8) | (x14 >> 24)
- x10 += x14
- x6 ^= x10
- x6 = (x6 << 7) | (x6 >> 25)
- x3 += x7
- x15 ^= x3
- x15 = (x15 << 16) | (x15 >> 16)
- x11 += x15
- x7 ^= x11
- x7 = (x7 << 12) | (x7 >> 20)
- x3 += x7
- x15 ^= x3
- x15 = (x15 << 8) | (x15 >> 24)
- x11 += x15
- x7 ^= x11
- x7 = (x7 << 7) | (x7 >> 25)
- x0 += x5
- x15 ^= x0
- x15 = (x15 << 16) | (x15 >> 16)
- x10 += x15
- x5 ^= x10
- x5 = (x5 << 12) | (x5 >> 20)
- x0 += x5
- x15 ^= x0
- x15 = (x15 << 8) | (x15 >> 24)
- x10 += x15
- x5 ^= x10
- x5 = (x5 << 7) | (x5 >> 25)
- x1 += x6
- x12 ^= x1
- x12 = (x12 << 16) | (x12 >> 16)
- x11 += x12
- x6 ^= x11
- x6 = (x6 << 12) | (x6 >> 20)
- x1 += x6
- x12 ^= x1
- x12 = (x12 << 8) | (x12 >> 24)
- x11 += x12
- x6 ^= x11
- x6 = (x6 << 7) | (x6 >> 25)
- x2 += x7
- x13 ^= x2
- x13 = (x13 << 16) | (x13 >> 16)
- x8 += x13
- x7 ^= x8
- x7 = (x7 << 12) | (x7 >> 20)
- x2 += x7
- x13 ^= x2
- x13 = (x13 << 8) | (x13 >> 24)
- x8 += x13
- x7 ^= x8
- x7 = (x7 << 7) | (x7 >> 25)
- x3 += x4
- x14 ^= x3
- x14 = (x14 << 16) | (x14 >> 16)
- x9 += x14
- x4 ^= x9
- x4 = (x4 << 12) | (x4 >> 20)
- x3 += x4
- x14 ^= x3
- x14 = (x14 << 8) | (x14 >> 24)
- x9 += x14
- x4 ^= x9
- x4 = (x4 << 7) | (x4 >> 25)
- }
+import (
+ "crypto/cipher"
+ "encoding/binary"
+)
+
+// assert that *Cipher implements cipher.Stream
+var _ cipher.Stream = (*Cipher)(nil)
- x0 += j0
- x1 += j1
- x2 += j2
- x3 += j3
- x4 += j4
- x5 += j5
- x6 += j6
- x7 += j7
- x8 += j8
- x9 += j9
- x10 += j10
- x11 += j11
- x12 += j12
- x13 += j13
- x14 += j14
- x15 += j15
-
- binary.LittleEndian.PutUint32(out[0:4], x0)
- binary.LittleEndian.PutUint32(out[4:8], x1)
- binary.LittleEndian.PutUint32(out[8:12], x2)
- binary.LittleEndian.PutUint32(out[12:16], x3)
- binary.LittleEndian.PutUint32(out[16:20], x4)
- binary.LittleEndian.PutUint32(out[20:24], x5)
- binary.LittleEndian.PutUint32(out[24:28], x6)
- binary.LittleEndian.PutUint32(out[28:32], x7)
- binary.LittleEndian.PutUint32(out[32:36], x8)
- binary.LittleEndian.PutUint32(out[36:40], x9)
- binary.LittleEndian.PutUint32(out[40:44], x10)
- binary.LittleEndian.PutUint32(out[44:48], x11)
- binary.LittleEndian.PutUint32(out[48:52], x12)
- binary.LittleEndian.PutUint32(out[52:56], x13)
- binary.LittleEndian.PutUint32(out[56:60], x14)
- binary.LittleEndian.PutUint32(out[60:64], x15)
+// Cipher is a stateful instance of ChaCha20 using a particular key
+// and nonce. A *Cipher implements the cipher.Stream interface.
+type Cipher struct {
+ key [8]uint32
+ counter uint32 // incremented after each block
+ nonce [3]uint32
+ buf [bufSize]byte // buffer for unused keystream bytes
+ len int // number of unused keystream bytes at end of buf
}
-// XORKeyStream crypts bytes from in to out using the given key and counters.
-// In and out must overlap entirely or not at all. Counter contains the raw
-// ChaCha20 counter bytes (i.e. block counter followed by nonce).
-func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) {
- var block [64]byte
- var counterCopy [16]byte
- copy(counterCopy[:], counter[:])
-
- for len(in) >= 64 {
- core(&block, &counterCopy, key)
- for i, x := range block {
- out[i] = in[i] ^ x
+// New creates a new ChaCha20 stream cipher with the given key and nonce.
+// The initial counter value is set to 0.
+func New(key [8]uint32, nonce [3]uint32) *Cipher {
+ return &Cipher{key: key, nonce: nonce}
+}
+
+// XORKeyStream XORs each byte in the given slice with a byte from the
+// cipher's key stream. Dst and src must overlap entirely or not at all.
+//
+// If len(dst) < len(src), XORKeyStream will panic. It is acceptable
+// to pass a dst bigger than src, and in that case, XORKeyStream will
+// only update dst[:len(src)] and will not touch the rest of dst.
+//
+// Multiple calls to XORKeyStream behave as if the concatenation of
+// the src buffers was passed in a single run. That is, Cipher
+// maintains state and does not reset at each XORKeyStream call.
+func (s *Cipher) XORKeyStream(dst, src []byte) {
+ // xor src with buffered keystream first
+ if s.len != 0 {
+ buf := s.buf[len(s.buf)-s.len:]
+ if len(src) < len(buf) {
+ buf = buf[:len(src)]
}
- u := uint32(1)
- for i := 0; i < 4; i++ {
- u += uint32(counterCopy[i])
- counterCopy[i] = byte(u)
- u >>= 8
+ td, ts := dst[:len(buf)], src[:len(buf)] // BCE hint
+ for i, b := range buf {
+ td[i] = ts[i] ^ b
}
- in = in[64:]
- out = out[64:]
+ s.len -= len(buf)
+ if s.len != 0 {
+ return
+ }
+ s.buf = [len(s.buf)]byte{} // zero the empty buffer
+ src = src[len(buf):]
+ dst = dst[len(buf):]
+ }
+
+ if len(src) == 0 {
+ return
+ }
+ if haveAsm {
+ s.xorKeyStreamAsm(dst, src)
+ return
+ }
+
+ // set up a 64-byte buffer to pad out the final block if needed
+ // (hoisted out of the main loop to avoid spills)
+ rem := len(src) % 64 // length of final block
+ fin := len(src) - rem // index of final block
+ if rem > 0 {
+ copy(s.buf[len(s.buf)-64:], src[fin:])
+ }
+
+ // qr calculates a quarter round
+ qr := func(a, b, c, d uint32) (uint32, uint32, uint32, uint32) {
+ a += b
+ d ^= a
+ d = (d << 16) | (d >> 16)
+ c += d
+ b ^= c
+ b = (b << 12) | (b >> 20)
+ a += b
+ d ^= a
+ d = (d << 8) | (d >> 24)
+ c += d
+ b ^= c
+ b = (b << 7) | (b >> 25)
+ return a, b, c, d
}
- if len(in) > 0 {
- core(&block, &counterCopy, key)
- for i, v := range in {
- out[i] = v ^ block[i]
+ // ChaCha20 constants
+ const (
+ j0 = 0x61707865
+ j1 = 0x3320646e
+ j2 = 0x79622d32
+ j3 = 0x6b206574
+ )
+
+ // pre-calculate most of the first round
+ s1, s5, s9, s13 := qr(j1, s.key[1], s.key[5], s.nonce[0])
+ s2, s6, s10, s14 := qr(j2, s.key[2], s.key[6], s.nonce[1])
+ s3, s7, s11, s15 := qr(j3, s.key[3], s.key[7], s.nonce[2])
+
+ n := len(src)
+ src, dst = src[:n:n], dst[:n:n] // BCE hint
+ for i := 0; i < n; i += 64 {
+ // calculate the remainder of the first round
+ s0, s4, s8, s12 := qr(j0, s.key[0], s.key[4], s.counter)
+
+ // execute the second round
+ x0, x5, x10, x15 := qr(s0, s5, s10, s15)
+ x1, x6, x11, x12 := qr(s1, s6, s11, s12)
+ x2, x7, x8, x13 := qr(s2, s7, s8, s13)
+ x3, x4, x9, x14 := qr(s3, s4, s9, s14)
+
+ // execute the remaining 18 rounds
+ for i := 0; i < 9; i++ {
+ x0, x4, x8, x12 = qr(x0, x4, x8, x12)
+ x1, x5, x9, x13 = qr(x1, x5, x9, x13)
+ x2, x6, x10, x14 = qr(x2, x6, x10, x14)
+ x3, x7, x11, x15 = qr(x3, x7, x11, x15)
+
+ x0, x5, x10, x15 = qr(x0, x5, x10, x15)
+ x1, x6, x11, x12 = qr(x1, x6, x11, x12)
+ x2, x7, x8, x13 = qr(x2, x7, x8, x13)
+ x3, x4, x9, x14 = qr(x3, x4, x9, x14)
+ }
+
+ x0 += j0
+ x1 += j1
+ x2 += j2
+ x3 += j3
+
+ x4 += s.key[0]
+ x5 += s.key[1]
+ x6 += s.key[2]
+ x7 += s.key[3]
+ x8 += s.key[4]
+ x9 += s.key[5]
+ x10 += s.key[6]
+ x11 += s.key[7]
+
+ x12 += s.counter
+ x13 += s.nonce[0]
+ x14 += s.nonce[1]
+ x15 += s.nonce[2]
+
+ // increment the counter
+ s.counter += 1
+ if s.counter == 0 {
+ panic("chacha20: counter overflow")
+ }
+
+ // pad to 64 bytes if needed
+ in, out := src[i:], dst[i:]
+ if i == fin {
+ // src[fin:] has already been copied into s.buf before
+ // the main loop
+ in, out = s.buf[len(s.buf)-64:], s.buf[len(s.buf)-64:]
}
+ in, out = in[:64], out[:64] // BCE hint
+
+ // XOR the key stream with the source and write out the result
+ xor(out[0:], in[0:], x0)
+ xor(out[4:], in[4:], x1)
+ xor(out[8:], in[8:], x2)
+ xor(out[12:], in[12:], x3)
+ xor(out[16:], in[16:], x4)
+ xor(out[20:], in[20:], x5)
+ xor(out[24:], in[24:], x6)
+ xor(out[28:], in[28:], x7)
+ xor(out[32:], in[32:], x8)
+ xor(out[36:], in[36:], x9)
+ xor(out[40:], in[40:], x10)
+ xor(out[44:], in[44:], x11)
+ xor(out[48:], in[48:], x12)
+ xor(out[52:], in[52:], x13)
+ xor(out[56:], in[56:], x14)
+ xor(out[60:], in[60:], x15)
+ }
+ // copy any trailing bytes out of the buffer and into dst
+ if rem != 0 {
+ s.len = 64 - rem
+ copy(dst[fin:], s.buf[len(s.buf)-64:])
+ }
+}
+
+// Advance discards bytes in the key stream until the next 64 byte block
+// boundary is reached and updates the counter accordingly. If the key
+// stream is already at a block boundary no bytes will be discarded and
+// the counter will be unchanged.
+func (s *Cipher) Advance() {
+ s.len -= s.len % 64
+ if s.len == 0 {
+ s.buf = [len(s.buf)]byte{}
+ }
+}
+
+// XORKeyStream crypts bytes from in to out using the given key and counters.
+// In and out must overlap entirely or not at all. Counter contains the raw
+// ChaCha20 counter bytes (i.e. block counter followed by nonce).
+func XORKeyStream(out, in []byte, counter *[16]byte, key *[32]byte) {
+ s := Cipher{
+ key: [8]uint32{
+ binary.LittleEndian.Uint32(key[0:4]),
+ binary.LittleEndian.Uint32(key[4:8]),
+ binary.LittleEndian.Uint32(key[8:12]),
+ binary.LittleEndian.Uint32(key[12:16]),
+ binary.LittleEndian.Uint32(key[16:20]),
+ binary.LittleEndian.Uint32(key[20:24]),
+ binary.LittleEndian.Uint32(key[24:28]),
+ binary.LittleEndian.Uint32(key[28:32]),
+ },
+ nonce: [3]uint32{
+ binary.LittleEndian.Uint32(counter[4:8]),
+ binary.LittleEndian.Uint32(counter[8:12]),
+ binary.LittleEndian.Uint32(counter[12:16]),
+ },
+ counter: binary.LittleEndian.Uint32(counter[0:4]),
}
+ s.XORKeyStream(out, in)
}
diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go
new file mode 100644
index 00000000000..91520d1de07
--- /dev/null
+++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_noasm.go
@@ -0,0 +1,16 @@
+// 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.
+
+// +build !s390x gccgo appengine
+
+package chacha20
+
+const (
+ bufSize = 64
+ haveAsm = false
+)
+
+func (*Cipher) xorKeyStreamAsm(dst, src []byte) {
+ panic("not implemented")
+}
diff --git a/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go
new file mode 100644
index 00000000000..0c1c671c40b
--- /dev/null
+++ b/vendor/golang.org/x/crypto/internal/chacha20/chacha_s390x.go
@@ -0,0 +1,30 @@
+// 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.
+
+// +build s390x,!gccgo,!appengine
+
+package chacha20
+
+var haveAsm = hasVectorFacility()
+
+const bufSize = 256
+
+// hasVectorFacility reports whether the machine supports the vector
+// facility (vx).
+// Implementation in asm_s390x.s.
+func hasVectorFacility() bool
+
+// xorKeyStreamVX is an assembly implementation of XORKeyStream. It must only
+// be called when the vector facility is available.
+// Implementation in asm_s390x.s.
+//go:noescape
+func xorKeyStreamVX(dst, src []byte, key *[8]uint32, nonce *[3]uint32, counter *uint32, buf *[256]byte, len *int)
+
+func (c *Cipher) xorKeyStreamAsm(dst, src []byte) {
+ xorKeyStreamVX(dst, src, &c.key, &c.nonce, &c.counter, &c.buf, &c.len)
+}
+
+// EXRL targets, DO NOT CALL!
+func mvcSrcToBuf()
+func mvcBufToDst()
diff --git a/vendor/golang.org/x/crypto/internal/chacha20/xor.go b/vendor/golang.org/x/crypto/internal/chacha20/xor.go
new file mode 100644
index 00000000000..9c5ba0b33ae
--- /dev/null
+++ b/vendor/golang.org/x/crypto/internal/chacha20/xor.go
@@ -0,0 +1,43 @@
+// Copyright 2018 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found src the LICENSE file.
+
+package chacha20
+
+import (
+ "runtime"
+)
+
+// Platforms that have fast unaligned 32-bit little endian accesses.
+const unaligned = runtime.GOARCH == "386" ||
+ runtime.GOARCH == "amd64" ||
+ runtime.GOARCH == "arm64" ||
+ runtime.GOARCH == "ppc64le" ||
+ runtime.GOARCH == "s390x"
+
+// xor reads a little endian uint32 from src, XORs it with u and
+// places the result in little endian byte order in dst.
+func xor(dst, src []byte, u uint32) {
+ _, _ = src[3], dst[3] // eliminate bounds checks
+ if unaligned {
+ // The compiler should optimize this code into
+ // 32-bit unaligned little endian loads and stores.
+ // TODO: delete once the compiler does a reliably
+ // good job with the generic code below.
+ // See issue #25111 for more details.
+ v := uint32(src[0])
+ v |= uint32(src[1]) << 8
+ v |= uint32(src[2]) << 16
+ v |= uint32(src[3]) << 24
+ v ^= u
+ dst[0] = byte(v)
+ dst[1] = byte(v >> 8)
+ dst[2] = byte(v >> 16)
+ dst[3] = byte(v >> 24)
+ } else {
+ dst[0] = src[0] ^ byte(u)
+ dst[1] = src[1] ^ byte(u>>8)
+ dst[2] = src[2] ^ byte(u>>16)
+ dst[3] = src[3] ^ byte(u>>24)
+ }
+}
diff --git a/vendor/golang.org/x/crypto/openpgp/keys.go b/vendor/golang.org/x/crypto/openpgp/keys.go
index 744e293febe..fd582a89c0c 100644
--- a/vendor/golang.org/x/crypto/openpgp/keys.go
+++ b/vendor/golang.org/x/crypto/openpgp/keys.go
@@ -486,7 +486,7 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err
}
isPrimaryId := true
e.Identities[uid.Id] = &Identity{
- Name: uid.Name,
+ Name: uid.Id,
UserId: uid,
SelfSignature: &packet.Signature{
CreationTime: currentTime,
@@ -507,6 +507,11 @@ func NewEntity(name, comment, email string, config *packet.Config) (*Entity, err
e.Identities[uid.Id].SelfSignature.PreferredHash = []uint8{hashToHashId(config.DefaultHash)}
}
+ // Likewise for DefaultCipher.
+ if config != nil && config.DefaultCipher != 0 {
+ e.Identities[uid.Id].SelfSignature.PreferredSymmetric = []uint8{uint8(config.DefaultCipher)}
+ }
+
e.Subkeys = make([]Subkey, 1)
e.Subkeys[0] = Subkey{
PublicKey: packet.NewRSAPublicKey(currentTime, &encryptingPriv.PublicKey),
diff --git a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
index 266840d05a3..02b372cf374 100644
--- a/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
+++ b/vendor/golang.org/x/crypto/openpgp/packet/encrypted_key.go
@@ -42,12 +42,18 @@ func (e *EncryptedKey) parse(r io.Reader) (err error) {
switch e.Algo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:
e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r)
+ if err != nil {
+ return
+ }
case PubKeyAlgoElGamal:
e.encryptedMPI1.bytes, e.encryptedMPI1.bitLength, err = readMPI(r)
if err != nil {
return
}
e.encryptedMPI2.bytes, e.encryptedMPI2.bitLength, err = readMPI(r)
+ if err != nil {
+ return
+ }
}
_, err = consumeAll(r)
return
@@ -72,7 +78,8 @@ func (e *EncryptedKey) Decrypt(priv *PrivateKey, config *Config) error {
// padding oracle attacks.
switch priv.PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSAEncryptOnly:
- b, err = rsa.DecryptPKCS1v15(config.Random(), priv.PrivateKey.(*rsa.PrivateKey), e.encryptedMPI1.bytes)
+ k := priv.PrivateKey.(*rsa.PrivateKey)
+ b, err = rsa.DecryptPKCS1v15(config.Random(), k, padToKeySize(&k.PublicKey, e.encryptedMPI1.bytes))
case PubKeyAlgoElGamal:
c1 := new(big.Int).SetBytes(e.encryptedMPI1.bytes)
c2 := new(big.Int).SetBytes(e.encryptedMPI2.bytes)
diff --git a/vendor/golang.org/x/crypto/openpgp/packet/packet.go b/vendor/golang.org/x/crypto/openpgp/packet/packet.go
index 3eded93f042..625bb5ac809 100644
--- a/vendor/golang.org/x/crypto/openpgp/packet/packet.go
+++ b/vendor/golang.org/x/crypto/openpgp/packet/packet.go
@@ -11,10 +11,12 @@ import (
"crypto/aes"
"crypto/cipher"
"crypto/des"
- "golang.org/x/crypto/cast5"
- "golang.org/x/crypto/openpgp/errors"
+ "crypto/rsa"
"io"
"math/big"
+
+ "golang.org/x/crypto/cast5"
+ "golang.org/x/crypto/openpgp/errors"
)
// readFull is the same as io.ReadFull except that reading zero bytes returns
@@ -500,19 +502,17 @@ func readMPI(r io.Reader) (mpi []byte, bitLength uint16, err error) {
numBytes := (int(bitLength) + 7) / 8
mpi = make([]byte, numBytes)
_, err = readFull(r, mpi)
- return
-}
-
-// mpiLength returns the length of the given *big.Int when serialized as an
-// MPI.
-func mpiLength(n *big.Int) (mpiLengthInBytes int) {
- mpiLengthInBytes = 2 /* MPI length */
- mpiLengthInBytes += (n.BitLen() + 7) / 8
+ // According to RFC 4880 3.2. we should check that the MPI has no leading
+ // zeroes (at least when not an encrypted MPI?), but this implementation
+ // does generate leading zeroes, so we keep accepting them.
return
}
// writeMPI serializes a big integer to w.
func writeMPI(w io.Writer, bitLength uint16, mpiBytes []byte) (err error) {
+ // Note that we can produce leading zeroes, in violation of RFC 4880 3.2.
+ // Implementations seem to be tolerant of them, and stripping them would
+ // make it complex to guarantee matching re-serialization.
_, err = w.Write([]byte{byte(bitLength >> 8), byte(bitLength)})
if err == nil {
_, err = w.Write(mpiBytes)
@@ -525,6 +525,18 @@ func writeBig(w io.Writer, i *big.Int) error {
return writeMPI(w, uint16(i.BitLen()), i.Bytes())
}
+// padToKeySize left-pads a MPI with zeroes to match the length of the
+// specified RSA public.
+func padToKeySize(pub *rsa.PublicKey, b []byte) []byte {
+ k := (pub.N.BitLen() + 7) / 8
+ if len(b) >= k {
+ return b
+ }
+ bb := make([]byte, k)
+ copy(bb[len(bb)-len(b):], b)
+ return bb
+}
+
// CompressionAlgo Represents the different compression algorithms
// supported by OpenPGP (except for BZIP2, which is not currently
// supported). See Section 9.3 of RFC 4880.
diff --git a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go
index ead26233dda..fcd5f525196 100644
--- a/vendor/golang.org/x/crypto/openpgp/packet/public_key.go
+++ b/vendor/golang.org/x/crypto/openpgp/packet/public_key.go
@@ -244,7 +244,12 @@ func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey
}
pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)
- pk.ec.p.bitLength = uint16(8 * len(pk.ec.p.bytes))
+
+ // The bit length is 3 (for the 0x04 specifying an uncompressed key)
+ // plus two field elements (for x and y), which are rounded up to the
+ // nearest byte. See https://tools.ietf.org/html/rfc6637#section-6
+ fieldBytes := (pub.Curve.Params().BitSize + 7) & ^7
+ pk.ec.p.bitLength = uint16(3 + fieldBytes + fieldBytes)
pk.setFingerPrintAndKeyId()
return pk
@@ -515,7 +520,7 @@ func (pk *PublicKey) VerifySignature(signed hash.Hash, sig *Signature) (err erro
switch pk.PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:
rsaPublicKey, _ := pk.PublicKey.(*rsa.PublicKey)
- err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes)
+ err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes))
if err != nil {
return errors.SignatureError("RSA verification failure")
}
@@ -566,7 +571,7 @@ func (pk *PublicKey) VerifySignatureV3(signed hash.Hash, sig *SignatureV3) (err
switch pk.PubKeyAlgo {
case PubKeyAlgoRSA, PubKeyAlgoRSASignOnly:
rsaPublicKey := pk.PublicKey.(*rsa.PublicKey)
- if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, sig.RSASignature.bytes); err != nil {
+ if err = rsa.VerifyPKCS1v15(rsaPublicKey, sig.Hash, hashBytes, padToKeySize(rsaPublicKey, sig.RSASignature.bytes)); err != nil {
return errors.SignatureError("RSA verification failure")
}
return
diff --git a/vendor/golang.org/x/crypto/ssh/cipher.go b/vendor/golang.org/x/crypto/ssh/cipher.go
index 30a49fdf27a..67b01261059 100644
--- a/vendor/golang.org/x/crypto/ssh/cipher.go
+++ b/vendor/golang.org/x/crypto/ssh/cipher.go
@@ -16,6 +16,7 @@ import (
"hash"
"io"
"io/ioutil"
+ "math/bits"
"golang.org/x/crypto/internal/chacha20"
"golang.org/x/crypto/poly1305"
@@ -641,8 +642,8 @@ const chacha20Poly1305ID = "chacha20-poly1305@openssh.com"
// the methods here also implement padding, which RFC4253 Section 6
// also requires of stream ciphers.
type chacha20Poly1305Cipher struct {
- lengthKey [32]byte
- contentKey [32]byte
+ lengthKey [8]uint32
+ contentKey [8]uint32
buf []byte
}
@@ -655,20 +656,21 @@ func newChaCha20Cipher(key, unusedIV, unusedMACKey []byte, unusedAlgs directionA
buf: make([]byte, 256),
}
- copy(c.contentKey[:], key[:32])
- copy(c.lengthKey[:], key[32:])
+ for i := range c.contentKey {
+ c.contentKey[i] = binary.LittleEndian.Uint32(key[i*4 : (i+1)*4])
+ }
+ for i := range c.lengthKey {
+ c.lengthKey[i] = binary.LittleEndian.Uint32(key[(i+8)*4 : (i+9)*4])
+ }
return c, nil
}
-// The Poly1305 key is obtained by encrypting 32 0-bytes.
-var chacha20PolyKeyInput [32]byte
-
func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte, error) {
- var counter [16]byte
- binary.BigEndian.PutUint64(counter[8:], uint64(seqNum))
-
+ nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)}
+ s := chacha20.New(c.contentKey, nonce)
var polyKey [32]byte
- chacha20.XORKeyStream(polyKey[:], chacha20PolyKeyInput[:], &counter, &c.contentKey)
+ s.XORKeyStream(polyKey[:], polyKey[:])
+ s.Advance() // skip next 32 bytes
encryptedLength := c.buf[:4]
if _, err := io.ReadFull(r, encryptedLength); err != nil {
@@ -676,7 +678,7 @@ func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte,
}
var lenBytes [4]byte
- chacha20.XORKeyStream(lenBytes[:], encryptedLength, &counter, &c.lengthKey)
+ chacha20.New(c.lengthKey, nonce).XORKeyStream(lenBytes[:], encryptedLength)
length := binary.BigEndian.Uint32(lenBytes[:])
if length > maxPacket {
@@ -702,10 +704,8 @@ func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte,
return nil, errors.New("ssh: MAC failure")
}
- counter[0] = 1
-
plain := c.buf[4:contentEnd]
- chacha20.XORKeyStream(plain, plain, &counter, &c.contentKey)
+ s.XORKeyStream(plain, plain)
padding := plain[0]
if padding < 4 {
@@ -724,11 +724,11 @@ func (c *chacha20Poly1305Cipher) readPacket(seqNum uint32, r io.Reader) ([]byte,
}
func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io.Reader, payload []byte) error {
- var counter [16]byte
- binary.BigEndian.PutUint64(counter[8:], uint64(seqNum))
-
+ nonce := [3]uint32{0, 0, bits.ReverseBytes32(seqNum)}
+ s := chacha20.New(c.contentKey, nonce)
var polyKey [32]byte
- chacha20.XORKeyStream(polyKey[:], chacha20PolyKeyInput[:], &counter, &c.contentKey)
+ s.XORKeyStream(polyKey[:], polyKey[:])
+ s.Advance() // skip next 32 bytes
// There is no blocksize, so fall back to multiple of 8 byte
// padding, as described in RFC 4253, Sec 6.
@@ -748,7 +748,7 @@ func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io
}
binary.BigEndian.PutUint32(c.buf, uint32(1+len(payload)+padding))
- chacha20.XORKeyStream(c.buf, c.buf[:4], &counter, &c.lengthKey)
+ chacha20.New(c.lengthKey, nonce).XORKeyStream(c.buf, c.buf[:4])
c.buf[4] = byte(padding)
copy(c.buf[5:], payload)
packetEnd := 5 + len(payload) + padding
@@ -756,8 +756,7 @@ func (c *chacha20Poly1305Cipher) writePacket(seqNum uint32, w io.Writer, rand io
return err
}
- counter[0] = 1
- chacha20.XORKeyStream(c.buf[4:], c.buf[4:packetEnd], &counter, &c.contentKey)
+ s.XORKeyStream(c.buf[4:], c.buf[4:packetEnd])
var mac [poly1305.TagSize]byte
poly1305.Sum(&mac, c.buf[:packetEnd], &polyKey)
diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go
index dadf41ab740..73697deda67 100644
--- a/vendor/golang.org/x/crypto/ssh/keys.go
+++ b/vendor/golang.org/x/crypto/ssh/keys.go
@@ -276,7 +276,8 @@ type PublicKey interface {
Type() string
// Marshal returns the serialized key data in SSH wire format,
- // with the name prefix.
+ // with the name prefix. To unmarshal the returned data, use
+ // the ParsePublicKey function.
Marshal() []byte
// Verify that sig is a signature on the given data using this
diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go
index b83d4738885..d0f48253196 100644
--- a/vendor/golang.org/x/crypto/ssh/server.go
+++ b/vendor/golang.org/x/crypto/ssh/server.go
@@ -166,6 +166,9 @@ type ServerConn struct {
// unsuccessful, it closes the connection and returns an error. The
// Request and NewChannel channels must be serviced, or the connection
// will hang.
+//
+// The returned error may be of type *ServerAuthError for
+// authentication errors.
func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewChannel, <-chan *Request, error) {
fullConf := *config
fullConf.SetDefaults()
@@ -292,12 +295,13 @@ func checkSourceAddress(addr net.Addr, sourceAddrs string) error {
return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr)
}
-// ServerAuthError implements the error interface. It appends any authentication
-// errors that may occur, and is returned if all of the authentication methods
-// provided by the user failed to authenticate.
+// ServerAuthError represents server authentication errors and is
+// sometimes returned by NewServerConn. It appends any authentication
+// errors that may occur, and is returned if all of the authentication
+// methods provided by the user failed to authenticate.
type ServerAuthError struct {
// Errors contains authentication errors returned by the authentication
- // callback methods.
+ // callback methods. The first entry is typically ErrNoAuth.
Errors []error
}
@@ -309,6 +313,13 @@ func (l ServerAuthError) Error() string {
return "[" + strings.Join(errs, ", ") + "]"
}
+// ErrNoAuth is the error value returned if no
+// authentication method has been passed yet. This happens as a normal
+// part of the authentication loop, since the client first tries
+// 'none' authentication to discover available methods.
+// It is returned in ServerAuthError.Errors from NewServerConn.
+var ErrNoAuth = errors.New("ssh: no auth passed yet")
+
func (s *connection) serverAuthenticate(config *ServerConfig) (*Permissions, error) {
sessionID := s.transport.getSessionID()
var cache pubKeyCache
@@ -363,7 +374,7 @@ userAuthLoop:
}
perms = nil
- authErr := errors.New("no auth passed yet")
+ authErr := ErrNoAuth
switch userAuthReq.Method {
case "none":
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/terminal.go b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go
new file mode 100644
index 00000000000..9a887598ff4
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/terminal.go
@@ -0,0 +1,951 @@
+// 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 terminal
+
+import (
+ "bytes"
+ "io"
+ "sync"
+ "unicode/utf8"
+)
+
+// EscapeCodes contains escape sequences that can be written to the terminal in
+// order to achieve different styles of text.
+type EscapeCodes struct {
+ // Foreground colors
+ Black, Red, Green, Yellow, Blue, Magenta, Cyan, White []byte
+
+ // Reset all attributes
+ Reset []byte
+}
+
+var vt100EscapeCodes = EscapeCodes{
+ Black: []byte{keyEscape, '[', '3', '0', 'm'},
+ Red: []byte{keyEscape, '[', '3', '1', 'm'},
+ Green: []byte{keyEscape, '[', '3', '2', 'm'},
+ Yellow: []byte{keyEscape, '[', '3', '3', 'm'},
+ Blue: []byte{keyEscape, '[', '3', '4', 'm'},
+ Magenta: []byte{keyEscape, '[', '3', '5', 'm'},
+ Cyan: []byte{keyEscape, '[', '3', '6', 'm'},
+ White: []byte{keyEscape, '[', '3', '7', 'm'},
+
+ Reset: []byte{keyEscape, '[', '0', 'm'},
+}
+
+// Terminal contains the state for running a VT100 terminal that is capable of
+// reading lines of input.
+type Terminal struct {
+ // AutoCompleteCallback, if non-null, is called for each keypress with
+ // the full input line and the current position of the cursor (in
+ // bytes, as an index into |line|). If it returns ok=false, the key
+ // press is processed normally. Otherwise it returns a replacement line
+ // and the new cursor position.
+ AutoCompleteCallback func(line string, pos int, key rune) (newLine string, newPos int, ok bool)
+
+ // Escape contains a pointer to the escape codes for this terminal.
+ // It's always a valid pointer, although the escape codes themselves
+ // may be empty if the terminal doesn't support them.
+ Escape *EscapeCodes
+
+ // lock protects the terminal and the state in this object from
+ // concurrent processing of a key press and a Write() call.
+ lock sync.Mutex
+
+ c io.ReadWriter
+ prompt []rune
+
+ // line is the current line being entered.
+ line []rune
+ // pos is the logical position of the cursor in line
+ pos int
+ // echo is true if local echo is enabled
+ echo bool
+ // pasteActive is true iff there is a bracketed paste operation in
+ // progress.
+ pasteActive bool
+
+ // cursorX contains the current X value of the cursor where the left
+ // edge is 0. cursorY contains the row number where the first row of
+ // the current line is 0.
+ cursorX, cursorY int
+ // maxLine is the greatest value of cursorY so far.
+ maxLine int
+
+ termWidth, termHeight int
+
+ // outBuf contains the terminal data to be sent.
+ outBuf []byte
+ // remainder contains the remainder of any partial key sequences after
+ // a read. It aliases into inBuf.
+ remainder []byte
+ inBuf [256]byte
+
+ // history contains previously entered commands so that they can be
+ // accessed with the up and down keys.
+ history stRingBuffer
+ // historyIndex stores the currently accessed history entry, where zero
+ // means the immediately previous entry.
+ historyIndex int
+ // When navigating up and down the history it's possible to return to
+ // the incomplete, initial line. That value is stored in
+ // historyPending.
+ historyPending string
+}
+
+// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
+// a local terminal, that terminal must first have been put into raw mode.
+// prompt is a string that is written at the start of each input line (i.e.
+// "> ").
+func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
+ return &Terminal{
+ Escape: &vt100EscapeCodes,
+ c: c,
+ prompt: []rune(prompt),
+ termWidth: 80,
+ termHeight: 24,
+ echo: true,
+ historyIndex: -1,
+ }
+}
+
+const (
+ keyCtrlD = 4
+ keyCtrlU = 21
+ keyEnter = '\r'
+ keyEscape = 27
+ keyBackspace = 127
+ keyUnknown = 0xd800 /* UTF-16 surrogate area */ + iota
+ keyUp
+ keyDown
+ keyLeft
+ keyRight
+ keyAltLeft
+ keyAltRight
+ keyHome
+ keyEnd
+ keyDeleteWord
+ keyDeleteLine
+ keyClearScreen
+ keyPasteStart
+ keyPasteEnd
+)
+
+var (
+ crlf = []byte{'\r', '\n'}
+ pasteStart = []byte{keyEscape, '[', '2', '0', '0', '~'}
+ pasteEnd = []byte{keyEscape, '[', '2', '0', '1', '~'}
+)
+
+// bytesToKey tries to parse a key sequence from b. If successful, it returns
+// the key and the remainder of the input. Otherwise it returns utf8.RuneError.
+func bytesToKey(b []byte, pasteActive bool) (rune, []byte) {
+ if len(b) == 0 {
+ return utf8.RuneError, nil
+ }
+
+ if !pasteActive {
+ switch b[0] {
+ case 1: // ^A
+ return keyHome, b[1:]
+ case 5: // ^E
+ return keyEnd, b[1:]
+ case 8: // ^H
+ return keyBackspace, b[1:]
+ case 11: // ^K
+ return keyDeleteLine, b[1:]
+ case 12: // ^L
+ return keyClearScreen, b[1:]
+ case 23: // ^W
+ return keyDeleteWord, b[1:]
+ }
+ }
+
+ if b[0] != keyEscape {
+ if !utf8.FullRune(b) {
+ return utf8.RuneError, b
+ }
+ r, l := utf8.DecodeRune(b)
+ return r, b[l:]
+ }
+
+ if !pasteActive && len(b) >= 3 && b[0] == keyEscape && b[1] == '[' {
+ switch b[2] {
+ case 'A':
+ return keyUp, b[3:]
+ case 'B':
+ return keyDown, b[3:]
+ case 'C':
+ return keyRight, b[3:]
+ case 'D':
+ return keyLeft, b[3:]
+ case 'H':
+ return keyHome, b[3:]
+ case 'F':
+ return keyEnd, b[3:]
+ }
+ }
+
+ if !pasteActive && len(b) >= 6 && b[0] == keyEscape && b[1] == '[' && b[2] == '1' && b[3] == ';' && b[4] == '3' {
+ switch b[5] {
+ case 'C':
+ return keyAltRight, b[6:]
+ case 'D':
+ return keyAltLeft, b[6:]
+ }
+ }
+
+ if !pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteStart) {
+ return keyPasteStart, b[6:]
+ }
+
+ if pasteActive && len(b) >= 6 && bytes.Equal(b[:6], pasteEnd) {
+ return keyPasteEnd, b[6:]
+ }
+
+ // If we get here then we have a key that we don't recognise, or a
+ // partial sequence. It's not clear how one should find the end of a
+ // sequence without knowing them all, but it seems that [a-zA-Z~] only
+ // appears at the end of a sequence.
+ for i, c := range b[0:] {
+ if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '~' {
+ return keyUnknown, b[i+1:]
+ }
+ }
+
+ return utf8.RuneError, b
+}
+
+// queue appends data to the end of t.outBuf
+func (t *Terminal) queue(data []rune) {
+ t.outBuf = append(t.outBuf, []byte(string(data))...)
+}
+
+var eraseUnderCursor = []rune{' ', keyEscape, '[', 'D'}
+var space = []rune{' '}
+
+func isPrintable(key rune) bool {
+ isInSurrogateArea := key >= 0xd800 && key <= 0xdbff
+ return key >= 32 && !isInSurrogateArea
+}
+
+// moveCursorToPos appends data to t.outBuf which will move the cursor to the
+// given, logical position in the text.
+func (t *Terminal) moveCursorToPos(pos int) {
+ if !t.echo {
+ return
+ }
+
+ x := visualLength(t.prompt) + pos
+ y := x / t.termWidth
+ x = x % t.termWidth
+
+ up := 0
+ if y < t.cursorY {
+ up = t.cursorY - y
+ }
+
+ down := 0
+ if y > t.cursorY {
+ down = y - t.cursorY
+ }
+
+ left := 0
+ if x < t.cursorX {
+ left = t.cursorX - x
+ }
+
+ right := 0
+ if x > t.cursorX {
+ right = x - t.cursorX
+ }
+
+ t.cursorX = x
+ t.cursorY = y
+ t.move(up, down, left, right)
+}
+
+func (t *Terminal) move(up, down, left, right int) {
+ movement := make([]rune, 3*(up+down+left+right))
+ m := movement
+ for i := 0; i < up; i++ {
+ m[0] = keyEscape
+ m[1] = '['
+ m[2] = 'A'
+ m = m[3:]
+ }
+ for i := 0; i < down; i++ {
+ m[0] = keyEscape
+ m[1] = '['
+ m[2] = 'B'
+ m = m[3:]
+ }
+ for i := 0; i < left; i++ {
+ m[0] = keyEscape
+ m[1] = '['
+ m[2] = 'D'
+ m = m[3:]
+ }
+ for i := 0; i < right; i++ {
+ m[0] = keyEscape
+ m[1] = '['
+ m[2] = 'C'
+ m = m[3:]
+ }
+
+ t.queue(movement)
+}
+
+func (t *Terminal) clearLineToRight() {
+ op := []rune{keyEscape, '[', 'K'}
+ t.queue(op)
+}
+
+const maxLineLength = 4096
+
+func (t *Terminal) setLine(newLine []rune, newPos int) {
+ if t.echo {
+ t.moveCursorToPos(0)
+ t.writeLine(newLine)
+ for i := len(newLine); i < len(t.line); i++ {
+ t.writeLine(space)
+ }
+ t.moveCursorToPos(newPos)
+ }
+ t.line = newLine
+ t.pos = newPos
+}
+
+func (t *Terminal) advanceCursor(places int) {
+ t.cursorX += places
+ t.cursorY += t.cursorX / t.termWidth
+ if t.cursorY > t.maxLine {
+ t.maxLine = t.cursorY
+ }
+ t.cursorX = t.cursorX % t.termWidth
+
+ if places > 0 && t.cursorX == 0 {
+ // Normally terminals will advance the current position
+ // when writing a character. But that doesn't happen
+ // for the last character in a line. However, when
+ // writing a character (except a new line) that causes
+ // a line wrap, the position will be advanced two
+ // places.
+ //
+ // So, if we are stopping at the end of a line, we
+ // need to write a newline so that our cursor can be
+ // advanced to the next line.
+ t.outBuf = append(t.outBuf, '\r', '\n')
+ }
+}
+
+func (t *Terminal) eraseNPreviousChars(n int) {
+ if n == 0 {
+ return
+ }
+
+ if t.pos < n {
+ n = t.pos
+ }
+ t.pos -= n
+ t.moveCursorToPos(t.pos)
+
+ copy(t.line[t.pos:], t.line[n+t.pos:])
+ t.line = t.line[:len(t.line)-n]
+ if t.echo {
+ t.writeLine(t.line[t.pos:])
+ for i := 0; i < n; i++ {
+ t.queue(space)
+ }
+ t.advanceCursor(n)
+ t.moveCursorToPos(t.pos)
+ }
+}
+
+// countToLeftWord returns then number of characters from the cursor to the
+// start of the previous word.
+func (t *Terminal) countToLeftWord() int {
+ if t.pos == 0 {
+ return 0
+ }
+
+ pos := t.pos - 1
+ for pos > 0 {
+ if t.line[pos] != ' ' {
+ break
+ }
+ pos--
+ }
+ for pos > 0 {
+ if t.line[pos] == ' ' {
+ pos++
+ break
+ }
+ pos--
+ }
+
+ return t.pos - pos
+}
+
+// countToRightWord returns then number of characters from the cursor to the
+// start of the next word.
+func (t *Terminal) countToRightWord() int {
+ pos := t.pos
+ for pos < len(t.line) {
+ if t.line[pos] == ' ' {
+ break
+ }
+ pos++
+ }
+ for pos < len(t.line) {
+ if t.line[pos] != ' ' {
+ break
+ }
+ pos++
+ }
+ return pos - t.pos
+}
+
+// visualLength returns the number of visible glyphs in s.
+func visualLength(runes []rune) int {
+ inEscapeSeq := false
+ length := 0
+
+ for _, r := range runes {
+ switch {
+ case inEscapeSeq:
+ if (r >= 'a' && r <= 'z') || (r >= 'A' && r <= 'Z') {
+ inEscapeSeq = false
+ }
+ case r == '\x1b':
+ inEscapeSeq = true
+ default:
+ length++
+ }
+ }
+
+ return length
+}
+
+// handleKey processes the given key and, optionally, returns a line of text
+// that the user has entered.
+func (t *Terminal) handleKey(key rune) (line string, ok bool) {
+ if t.pasteActive && key != keyEnter {
+ t.addKeyToLine(key)
+ return
+ }
+
+ switch key {
+ case keyBackspace:
+ if t.pos == 0 {
+ return
+ }
+ t.eraseNPreviousChars(1)
+ case keyAltLeft:
+ // move left by a word.
+ t.pos -= t.countToLeftWord()
+ t.moveCursorToPos(t.pos)
+ case keyAltRight:
+ // move right by a word.
+ t.pos += t.countToRightWord()
+ t.moveCursorToPos(t.pos)
+ case keyLeft:
+ if t.pos == 0 {
+ return
+ }
+ t.pos--
+ t.moveCursorToPos(t.pos)
+ case keyRight:
+ if t.pos == len(t.line) {
+ return
+ }
+ t.pos++
+ t.moveCursorToPos(t.pos)
+ case keyHome:
+ if t.pos == 0 {
+ return
+ }
+ t.pos = 0
+ t.moveCursorToPos(t.pos)
+ case keyEnd:
+ if t.pos == len(t.line) {
+ return
+ }
+ t.pos = len(t.line)
+ t.moveCursorToPos(t.pos)
+ case keyUp:
+ entry, ok := t.history.NthPreviousEntry(t.historyIndex + 1)
+ if !ok {
+ return "", false
+ }
+ if t.historyIndex == -1 {
+ t.historyPending = string(t.line)
+ }
+ t.historyIndex++
+ runes := []rune(entry)
+ t.setLine(runes, len(runes))
+ case keyDown:
+ switch t.historyIndex {
+ case -1:
+ return
+ case 0:
+ runes := []rune(t.historyPending)
+ t.setLine(runes, len(runes))
+ t.historyIndex--
+ default:
+ entry, ok := t.history.NthPreviousEntry(t.historyIndex - 1)
+ if ok {
+ t.historyIndex--
+ runes := []rune(entry)
+ t.setLine(runes, len(runes))
+ }
+ }
+ case keyEnter:
+ t.moveCursorToPos(len(t.line))
+ t.queue([]rune("\r\n"))
+ line = string(t.line)
+ ok = true
+ t.line = t.line[:0]
+ t.pos = 0
+ t.cursorX = 0
+ t.cursorY = 0
+ t.maxLine = 0
+ case keyDeleteWord:
+ // Delete zero or more spaces and then one or more characters.
+ t.eraseNPreviousChars(t.countToLeftWord())
+ case keyDeleteLine:
+ // Delete everything from the current cursor position to the
+ // end of line.
+ for i := t.pos; i < len(t.line); i++ {
+ t.queue(space)
+ t.advanceCursor(1)
+ }
+ t.line = t.line[:t.pos]
+ t.moveCursorToPos(t.pos)
+ case keyCtrlD:
+ // Erase the character under the current position.
+ // The EOF case when the line is empty is handled in
+ // readLine().
+ if t.pos < len(t.line) {
+ t.pos++
+ t.eraseNPreviousChars(1)
+ }
+ case keyCtrlU:
+ t.eraseNPreviousChars(t.pos)
+ case keyClearScreen:
+ // Erases the screen and moves the cursor to the home position.
+ t.queue([]rune("\x1b[2J\x1b[H"))
+ t.queue(t.prompt)
+ t.cursorX, t.cursorY = 0, 0
+ t.advanceCursor(visualLength(t.prompt))
+ t.setLine(t.line, t.pos)
+ default:
+ if t.AutoCompleteCallback != nil {
+ prefix := string(t.line[:t.pos])
+ suffix := string(t.line[t.pos:])
+
+ t.lock.Unlock()
+ newLine, newPos, completeOk := t.AutoCompleteCallback(prefix+suffix, len(prefix), key)
+ t.lock.Lock()
+
+ if completeOk {
+ t.setLine([]rune(newLine), utf8.RuneCount([]byte(newLine)[:newPos]))
+ return
+ }
+ }
+ if !isPrintable(key) {
+ return
+ }
+ if len(t.line) == maxLineLength {
+ return
+ }
+ t.addKeyToLine(key)
+ }
+ return
+}
+
+// addKeyToLine inserts the given key at the current position in the current
+// line.
+func (t *Terminal) addKeyToLine(key rune) {
+ if len(t.line) == cap(t.line) {
+ newLine := make([]rune, len(t.line), 2*(1+len(t.line)))
+ copy(newLine, t.line)
+ t.line = newLine
+ }
+ t.line = t.line[:len(t.line)+1]
+ copy(t.line[t.pos+1:], t.line[t.pos:])
+ t.line[t.pos] = key
+ if t.echo {
+ t.writeLine(t.line[t.pos:])
+ }
+ t.pos++
+ t.moveCursorToPos(t.pos)
+}
+
+func (t *Terminal) writeLine(line []rune) {
+ for len(line) != 0 {
+ remainingOnLine := t.termWidth - t.cursorX
+ todo := len(line)
+ if todo > remainingOnLine {
+ todo = remainingOnLine
+ }
+ t.queue(line[:todo])
+ t.advanceCursor(visualLength(line[:todo]))
+ line = line[todo:]
+ }
+}
+
+// writeWithCRLF writes buf to w but replaces all occurrences of \n with \r\n.
+func writeWithCRLF(w io.Writer, buf []byte) (n int, err error) {
+ for len(buf) > 0 {
+ i := bytes.IndexByte(buf, '\n')
+ todo := len(buf)
+ if i >= 0 {
+ todo = i
+ }
+
+ var nn int
+ nn, err = w.Write(buf[:todo])
+ n += nn
+ if err != nil {
+ return n, err
+ }
+ buf = buf[todo:]
+
+ if i >= 0 {
+ if _, err = w.Write(crlf); err != nil {
+ return n, err
+ }
+ n++
+ buf = buf[1:]
+ }
+ }
+
+ return n, nil
+}
+
+func (t *Terminal) Write(buf []byte) (n int, err error) {
+ t.lock.Lock()
+ defer t.lock.Unlock()
+
+ if t.cursorX == 0 && t.cursorY == 0 {
+ // This is the easy case: there's nothing on the screen that we
+ // have to move out of the way.
+ return writeWithCRLF(t.c, buf)
+ }
+
+ // We have a prompt and possibly user input on the screen. We
+ // have to clear it first.
+ t.move(0 /* up */, 0 /* down */, t.cursorX /* left */, 0 /* right */)
+ t.cursorX = 0
+ t.clearLineToRight()
+
+ for t.cursorY > 0 {
+ t.move(1 /* up */, 0, 0, 0)
+ t.cursorY--
+ t.clearLineToRight()
+ }
+
+ if _, err = t.c.Write(t.outBuf); err != nil {
+ return
+ }
+ t.outBuf = t.outBuf[:0]
+
+ if n, err = writeWithCRLF(t.c, buf); err != nil {
+ return
+ }
+
+ t.writeLine(t.prompt)
+ if t.echo {
+ t.writeLine(t.line)
+ }
+
+ t.moveCursorToPos(t.pos)
+
+ if _, err = t.c.Write(t.outBuf); err != nil {
+ return
+ }
+ t.outBuf = t.outBuf[:0]
+ return
+}
+
+// ReadPassword temporarily changes the prompt and reads a password, without
+// echo, from the terminal.
+func (t *Terminal) ReadPassword(prompt string) (line string, err error) {
+ t.lock.Lock()
+ defer t.lock.Unlock()
+
+ oldPrompt := t.prompt
+ t.prompt = []rune(prompt)
+ t.echo = false
+
+ line, err = t.readLine()
+
+ t.prompt = oldPrompt
+ t.echo = true
+
+ return
+}
+
+// ReadLine returns a line of input from the terminal.
+func (t *Terminal) ReadLine() (line string, err error) {
+ t.lock.Lock()
+ defer t.lock.Unlock()
+
+ return t.readLine()
+}
+
+func (t *Terminal) readLine() (line string, err error) {
+ // t.lock must be held at this point
+
+ if t.cursorX == 0 && t.cursorY == 0 {
+ t.writeLine(t.prompt)
+ t.c.Write(t.outBuf)
+ t.outBuf = t.outBuf[:0]
+ }
+
+ lineIsPasted := t.pasteActive
+
+ for {
+ rest := t.remainder
+ lineOk := false
+ for !lineOk {
+ var key rune
+ key, rest = bytesToKey(rest, t.pasteActive)
+ if key == utf8.RuneError {
+ break
+ }
+ if !t.pasteActive {
+ if key == keyCtrlD {
+ if len(t.line) == 0 {
+ return "", io.EOF
+ }
+ }
+ if key == keyPasteStart {
+ t.pasteActive = true
+ if len(t.line) == 0 {
+ lineIsPasted = true
+ }
+ continue
+ }
+ } else if key == keyPasteEnd {
+ t.pasteActive = false
+ continue
+ }
+ if !t.pasteActive {
+ lineIsPasted = false
+ }
+ line, lineOk = t.handleKey(key)
+ }
+ if len(rest) > 0 {
+ n := copy(t.inBuf[:], rest)
+ t.remainder = t.inBuf[:n]
+ } else {
+ t.remainder = nil
+ }
+ t.c.Write(t.outBuf)
+ t.outBuf = t.outBuf[:0]
+ if lineOk {
+ if t.echo {
+ t.historyIndex = -1
+ t.history.Add(line)
+ }
+ if lineIsPasted {
+ err = ErrPasteIndicator
+ }
+ return
+ }
+
+ // t.remainder is a slice at the beginning of t.inBuf
+ // containing a partial key sequence
+ readBuf := t.inBuf[len(t.remainder):]
+ var n int
+
+ t.lock.Unlock()
+ n, err = t.c.Read(readBuf)
+ t.lock.Lock()
+
+ if err != nil {
+ return
+ }
+
+ t.remainder = t.inBuf[:n+len(t.remainder)]
+ }
+}
+
+// SetPrompt sets the prompt to be used when reading subsequent lines.
+func (t *Terminal) SetPrompt(prompt string) {
+ t.lock.Lock()
+ defer t.lock.Unlock()
+
+ t.prompt = []rune(prompt)
+}
+
+func (t *Terminal) clearAndRepaintLinePlusNPrevious(numPrevLines int) {
+ // Move cursor to column zero at the start of the line.
+ t.move(t.cursorY, 0, t.cursorX, 0)
+ t.cursorX, t.cursorY = 0, 0
+ t.clearLineToRight()
+ for t.cursorY < numPrevLines {
+ // Move down a line
+ t.move(0, 1, 0, 0)
+ t.cursorY++
+ t.clearLineToRight()
+ }
+ // Move back to beginning.
+ t.move(t.cursorY, 0, 0, 0)
+ t.cursorX, t.cursorY = 0, 0
+
+ t.queue(t.prompt)
+ t.advanceCursor(visualLength(t.prompt))
+ t.writeLine(t.line)
+ t.moveCursorToPos(t.pos)
+}
+
+func (t *Terminal) SetSize(width, height int) error {
+ t.lock.Lock()
+ defer t.lock.Unlock()
+
+ if width == 0 {
+ width = 1
+ }
+
+ oldWidth := t.termWidth
+ t.termWidth, t.termHeight = width, height
+
+ switch {
+ case width == oldWidth:
+ // If the width didn't change then nothing else needs to be
+ // done.
+ return nil
+ case len(t.line) == 0 && t.cursorX == 0 && t.cursorY == 0:
+ // If there is nothing on current line and no prompt printed,
+ // just do nothing
+ return nil
+ case width < oldWidth:
+ // Some terminals (e.g. xterm) will truncate lines that were
+ // too long when shinking. Others, (e.g. gnome-terminal) will
+ // attempt to wrap them. For the former, repainting t.maxLine
+ // works great, but that behaviour goes badly wrong in the case
+ // of the latter because they have doubled every full line.
+
+ // We assume that we are working on a terminal that wraps lines
+ // and adjust the cursor position based on every previous line
+ // wrapping and turning into two. This causes the prompt on
+ // xterms to move upwards, which isn't great, but it avoids a
+ // huge mess with gnome-terminal.
+ if t.cursorX >= t.termWidth {
+ t.cursorX = t.termWidth - 1
+ }
+ t.cursorY *= 2
+ t.clearAndRepaintLinePlusNPrevious(t.maxLine * 2)
+ case width > oldWidth:
+ // If the terminal expands then our position calculations will
+ // be wrong in the future because we think the cursor is
+ // |t.pos| chars into the string, but there will be a gap at
+ // the end of any wrapped line.
+ //
+ // But the position will actually be correct until we move, so
+ // we can move back to the beginning and repaint everything.
+ t.clearAndRepaintLinePlusNPrevious(t.maxLine)
+ }
+
+ _, err := t.c.Write(t.outBuf)
+ t.outBuf = t.outBuf[:0]
+ return err
+}
+
+type pasteIndicatorError struct{}
+
+func (pasteIndicatorError) Error() string {
+ return "terminal: ErrPasteIndicator not correctly handled"
+}
+
+// ErrPasteIndicator may be returned from ReadLine as the error, in addition
+// to valid line data. It indicates that bracketed paste mode is enabled and
+// that the returned line consists only of pasted data. Programs may wish to
+// interpret pasted data more literally than typed data.
+var ErrPasteIndicator = pasteIndicatorError{}
+
+// SetBracketedPasteMode requests that the terminal bracket paste operations
+// with markers. Not all terminals support this but, if it is supported, then
+// enabling this mode will stop any autocomplete callback from running due to
+// pastes. Additionally, any lines that are completely pasted will be returned
+// from ReadLine with the error set to ErrPasteIndicator.
+func (t *Terminal) SetBracketedPasteMode(on bool) {
+ if on {
+ io.WriteString(t.c, "\x1b[?2004h")
+ } else {
+ io.WriteString(t.c, "\x1b[?2004l")
+ }
+}
+
+// stRingBuffer is a ring buffer of strings.
+type stRingBuffer struct {
+ // entries contains max elements.
+ entries []string
+ max int
+ // head contains the index of the element most recently added to the ring.
+ head int
+ // size contains the number of elements in the ring.
+ size int
+}
+
+func (s *stRingBuffer) Add(a string) {
+ if s.entries == nil {
+ const defaultNumEntries = 100
+ s.entries = make([]string, defaultNumEntries)
+ s.max = defaultNumEntries
+ }
+
+ s.head = (s.head + 1) % s.max
+ s.entries[s.head] = a
+ if s.size < s.max {
+ s.size++
+ }
+}
+
+// NthPreviousEntry returns the value passed to the nth previous call to Add.
+// If n is zero then the immediately prior value is returned, if one, then the
+// next most recent, and so on. If such an element doesn't exist then ok is
+// false.
+func (s *stRingBuffer) NthPreviousEntry(n int) (value string, ok bool) {
+ if n >= s.size {
+ return "", false
+ }
+ index := s.head - n
+ if index < 0 {
+ index += s.max
+ }
+ return s.entries[index], true
+}
+
+// readPasswordLine reads from reader until it finds \n or io.EOF.
+// The slice returned does not include the \n.
+// readPasswordLine also ignores any \r it finds.
+func readPasswordLine(reader io.Reader) ([]byte, error) {
+ var buf [1]byte
+ var ret []byte
+
+ for {
+ n, err := reader.Read(buf[:])
+ if n > 0 {
+ switch buf[0] {
+ case '\n':
+ return ret, nil
+ case '\r':
+ // remove \r from passwords on Windows
+ default:
+ ret = append(ret, buf[0])
+ }
+ continue
+ }
+ if err != nil {
+ if err == io.EOF && len(ret) > 0 {
+ return ret, nil
+ }
+ return ret, err
+ }
+ }
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util.go b/vendor/golang.org/x/crypto/ssh/terminal/util.go
new file mode 100644
index 00000000000..731c89a284a
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util.go
@@ -0,0 +1,114 @@
+// 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.
+
+// +build darwin dragonfly freebsd linux,!appengine netbsd openbsd
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+// oldState, err := terminal.MakeRaw(0)
+// if err != nil {
+// panic(err)
+// }
+// defer terminal.Restore(0, oldState)
+package terminal // import "golang.org/x/crypto/ssh/terminal"
+
+import (
+ "golang.org/x/sys/unix"
+)
+
+// State contains the state of a terminal.
+type State struct {
+ termios unix.Termios
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+ _, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
+ return err == nil
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+ termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
+ if err != nil {
+ return nil, err
+ }
+
+ oldState := State{termios: *termios}
+
+ // This attempts to replicate the behaviour documented for cfmakeraw in
+ // the termios(3) manpage.
+ termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
+ termios.Oflag &^= unix.OPOST
+ termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
+ termios.Cflag &^= unix.CSIZE | unix.PARENB
+ termios.Cflag |= unix.CS8
+ termios.Cc[unix.VMIN] = 1
+ termios.Cc[unix.VTIME] = 0
+ if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, termios); err != nil {
+ return nil, err
+ }
+
+ return &oldState, nil
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+ termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
+ if err != nil {
+ return nil, err
+ }
+
+ return &State{termios: *termios}, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+ return unix.IoctlSetTermios(fd, ioctlWriteTermios, &state.termios)
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+ ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
+ if err != nil {
+ return -1, -1, err
+ }
+ return int(ws.Col), int(ws.Row), nil
+}
+
+// passwordReader is an io.Reader that reads from a specific file descriptor.
+type passwordReader int
+
+func (r passwordReader) Read(buf []byte) (int, error) {
+ return unix.Read(int(r), buf)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo. This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+ termios, err := unix.IoctlGetTermios(fd, ioctlReadTermios)
+ if err != nil {
+ return nil, err
+ }
+
+ newState := *termios
+ newState.Lflag &^= unix.ECHO
+ newState.Lflag |= unix.ICANON | unix.ISIG
+ newState.Iflag |= unix.ICRNL
+ if err := unix.IoctlSetTermios(fd, ioctlWriteTermios, &newState); err != nil {
+ return nil, err
+ }
+
+ defer unix.IoctlSetTermios(fd, ioctlWriteTermios, termios)
+
+ return readPasswordLine(passwordReader(fd))
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
new file mode 100644
index 00000000000..cb23a590494
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go
@@ -0,0 +1,12 @@
+// 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.
+
+// +build darwin dragonfly freebsd netbsd openbsd
+
+package terminal
+
+import "golang.org/x/sys/unix"
+
+const ioctlReadTermios = unix.TIOCGETA
+const ioctlWriteTermios = unix.TIOCSETA
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
new file mode 100644
index 00000000000..5fadfe8a1d5
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util_linux.go
@@ -0,0 +1,10 @@
+// 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 terminal
+
+import "golang.org/x/sys/unix"
+
+const ioctlReadTermios = unix.TCGETS
+const ioctlWriteTermios = unix.TCSETS
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
new file mode 100644
index 00000000000..799f049f04e
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go
@@ -0,0 +1,58 @@
+// Copyright 2016 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 terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+// oldState, err := terminal.MakeRaw(0)
+// if err != nil {
+// panic(err)
+// }
+// defer terminal.Restore(0, oldState)
+package terminal
+
+import (
+ "fmt"
+ "runtime"
+)
+
+type State struct{}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+ return false
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+ return nil, fmt.Errorf("terminal: MakeRaw not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+ return nil, fmt.Errorf("terminal: GetState not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+ return fmt.Errorf("terminal: Restore not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+ return 0, 0, fmt.Errorf("terminal: GetSize not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
+
+// ReadPassword reads a line of input from a terminal without local echo. This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+ return nil, fmt.Errorf("terminal: ReadPassword not implemented on %s/%s", runtime.GOOS, runtime.GOARCH)
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
new file mode 100644
index 00000000000..9e41b9f43f0
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go
@@ -0,0 +1,124 @@
+// 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.
+
+// +build solaris
+
+package terminal // import "golang.org/x/crypto/ssh/terminal"
+
+import (
+ "golang.org/x/sys/unix"
+ "io"
+ "syscall"
+)
+
+// State contains the state of a terminal.
+type State struct {
+ termios unix.Termios
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+ _, err := unix.IoctlGetTermio(fd, unix.TCGETA)
+ return err == nil
+}
+
+// ReadPassword reads a line of input from a terminal without local echo. This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+ // see also: http://src.illumos.org/source/xref/illumos-gate/usr/src/lib/libast/common/uwin/getpass.c
+ val, err := unix.IoctlGetTermios(fd, unix.TCGETS)
+ if err != nil {
+ return nil, err
+ }
+ oldState := *val
+
+ newState := oldState
+ newState.Lflag &^= syscall.ECHO
+ newState.Lflag |= syscall.ICANON | syscall.ISIG
+ newState.Iflag |= syscall.ICRNL
+ err = unix.IoctlSetTermios(fd, unix.TCSETS, &newState)
+ if err != nil {
+ return nil, err
+ }
+
+ defer unix.IoctlSetTermios(fd, unix.TCSETS, &oldState)
+
+ var buf [16]byte
+ var ret []byte
+ for {
+ n, err := syscall.Read(fd, buf[:])
+ if err != nil {
+ return nil, err
+ }
+ if n == 0 {
+ if len(ret) == 0 {
+ return nil, io.EOF
+ }
+ break
+ }
+ if buf[n-1] == '\n' {
+ n--
+ }
+ ret = append(ret, buf[:n]...)
+ if n < len(buf) {
+ break
+ }
+ }
+
+ return ret, nil
+}
+
+// MakeRaw puts the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+// see http://cr.illumos.org/~webrev/andy_js/1060/
+func MakeRaw(fd int) (*State, error) {
+ termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
+ if err != nil {
+ return nil, err
+ }
+
+ oldState := State{termios: *termios}
+
+ termios.Iflag &^= unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON
+ termios.Oflag &^= unix.OPOST
+ termios.Lflag &^= unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN
+ termios.Cflag &^= unix.CSIZE | unix.PARENB
+ termios.Cflag |= unix.CS8
+ termios.Cc[unix.VMIN] = 1
+ termios.Cc[unix.VTIME] = 0
+
+ if err := unix.IoctlSetTermios(fd, unix.TCSETS, termios); err != nil {
+ return nil, err
+ }
+
+ return &oldState, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, oldState *State) error {
+ return unix.IoctlSetTermios(fd, unix.TCSETS, &oldState.termios)
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+ termios, err := unix.IoctlGetTermios(fd, unix.TCGETS)
+ if err != nil {
+ return nil, err
+ }
+
+ return &State{termios: *termios}, nil
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+ ws, err := unix.IoctlGetWinsize(fd, unix.TIOCGWINSZ)
+ if err != nil {
+ return 0, 0, err
+ }
+ return int(ws.Col), int(ws.Row), nil
+}
diff --git a/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
new file mode 100644
index 00000000000..8618955df73
--- /dev/null
+++ b/vendor/golang.org/x/crypto/ssh/terminal/util_windows.go
@@ -0,0 +1,103 @@
+// 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.
+
+// +build windows
+
+// Package terminal provides support functions for dealing with terminals, as
+// commonly found on UNIX systems.
+//
+// Putting a terminal into raw mode is the most common requirement:
+//
+// oldState, err := terminal.MakeRaw(0)
+// if err != nil {
+// panic(err)
+// }
+// defer terminal.Restore(0, oldState)
+package terminal
+
+import (
+ "os"
+
+ "golang.org/x/sys/windows"
+)
+
+type State struct {
+ mode uint32
+}
+
+// IsTerminal returns true if the given file descriptor is a terminal.
+func IsTerminal(fd int) bool {
+ var st uint32
+ err := windows.GetConsoleMode(windows.Handle(fd), &st)
+ return err == nil
+}
+
+// MakeRaw put the terminal connected to the given file descriptor into raw
+// mode and returns the previous state of the terminal so that it can be
+// restored.
+func MakeRaw(fd int) (*State, error) {
+ var st uint32
+ if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
+ return nil, err
+ }
+ raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
+ if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil {
+ return nil, err
+ }
+ return &State{st}, nil
+}
+
+// GetState returns the current state of a terminal which may be useful to
+// restore the terminal after a signal.
+func GetState(fd int) (*State, error) {
+ var st uint32
+ if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
+ return nil, err
+ }
+ return &State{st}, nil
+}
+
+// Restore restores the terminal connected to the given file descriptor to a
+// previous state.
+func Restore(fd int, state *State) error {
+ return windows.SetConsoleMode(windows.Handle(fd), state.mode)
+}
+
+// GetSize returns the dimensions of the given terminal.
+func GetSize(fd int) (width, height int, err error) {
+ var info windows.ConsoleScreenBufferInfo
+ if err := windows.GetConsoleScreenBufferInfo(windows.Handle(fd), &info); err != nil {
+ return 0, 0, err
+ }
+ return int(info.Size.X), int(info.Size.Y), nil
+}
+
+// ReadPassword reads a line of input from a terminal without local echo. This
+// is commonly used for inputting passwords and other sensitive data. The slice
+// returned does not include the \n.
+func ReadPassword(fd int) ([]byte, error) {
+ var st uint32
+ if err := windows.GetConsoleMode(windows.Handle(fd), &st); err != nil {
+ return nil, err
+ }
+ old := st
+
+ st &^= (windows.ENABLE_ECHO_INPUT)
+ st |= (windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT)
+ if err := windows.SetConsoleMode(windows.Handle(fd), st); err != nil {
+ return nil, err
+ }
+
+ defer windows.SetConsoleMode(windows.Handle(fd), old)
+
+ var h windows.Handle
+ p, _ := windows.GetCurrentProcess()
+ if err := windows.DuplicateHandle(p, windows.Handle(fd), p, &h, 0, false, windows.DUPLICATE_SAME_ACCESS); err != nil {
+ return nil, err
+ }
+
+ f := os.NewFile(uintptr(h), "stdin")
+ defer f.Close()
+ return readPasswordLine(f)
+}
diff --git a/vendor/golang.org/x/sys/windows/aliases.go b/vendor/golang.org/x/sys/windows/aliases.go
new file mode 100644
index 00000000000..af3af60db97
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/aliases.go
@@ -0,0 +1,13 @@
+// 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.
+
+// +build windows
+// +build go1.9
+
+package windows
+
+import "syscall"
+
+type Errno = syscall.Errno
+type SysProcAttr = syscall.SysProcAttr
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_386.s b/vendor/golang.org/x/sys/windows/asm_windows_386.s
new file mode 100644
index 00000000000..21d994d318a
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/asm_windows_386.s
@@ -0,0 +1,13 @@
+// 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.
+
+//
+// System calls for 386, Windows are implemented in runtime/syscall_windows.goc
+//
+
+TEXT ·getprocaddress(SB), 7, $0-16
+ JMP syscall·getprocaddress(SB)
+
+TEXT ·loadlibrary(SB), 7, $0-12
+ JMP syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_amd64.s b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
new file mode 100644
index 00000000000..5bfdf797414
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/asm_windows_amd64.s
@@ -0,0 +1,13 @@
+// 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.
+
+//
+// System calls for amd64, Windows are implemented in runtime/syscall_windows.goc
+//
+
+TEXT ·getprocaddress(SB), 7, $0-32
+ JMP syscall·getprocaddress(SB)
+
+TEXT ·loadlibrary(SB), 7, $0-24
+ JMP syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/asm_windows_arm.s b/vendor/golang.org/x/sys/windows/asm_windows_arm.s
new file mode 100644
index 00000000000..55d8b91a286
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/asm_windows_arm.s
@@ -0,0 +1,11 @@
+// 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.
+
+#include "textflag.h"
+
+TEXT ·getprocaddress(SB),NOSPLIT,$0
+ B syscall·getprocaddress(SB)
+
+TEXT ·loadlibrary(SB),NOSPLIT,$0
+ B syscall·loadlibrary(SB)
diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go
new file mode 100644
index 00000000000..e92c05b213c
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/dll_windows.go
@@ -0,0 +1,378 @@
+// 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 windows
+
+import (
+ "sync"
+ "sync/atomic"
+ "syscall"
+ "unsafe"
+)
+
+// DLLError describes reasons for DLL load failures.
+type DLLError struct {
+ Err error
+ ObjName string
+ Msg string
+}
+
+func (e *DLLError) Error() string { return e.Msg }
+
+// Implemented in runtime/syscall_windows.goc; we provide jumps to them in our assembly file.
+func loadlibrary(filename *uint16) (handle uintptr, err syscall.Errno)
+func getprocaddress(handle uintptr, procname *uint8) (proc uintptr, err syscall.Errno)
+
+// A DLL implements access to a single DLL.
+type DLL struct {
+ Name string
+ Handle Handle
+}
+
+// LoadDLL loads DLL file into memory.
+//
+// Warning: using LoadDLL without an absolute path name is subject to
+// DLL preloading attacks. To safely load a system DLL, use LazyDLL
+// with System set to true, or use LoadLibraryEx directly.
+func LoadDLL(name string) (dll *DLL, err error) {
+ namep, err := UTF16PtrFromString(name)
+ if err != nil {
+ return nil, err
+ }
+ h, e := loadlibrary(namep)
+ if e != 0 {
+ return nil, &DLLError{
+ Err: e,
+ ObjName: name,
+ Msg: "Failed to load " + name + ": " + e.Error(),
+ }
+ }
+ d := &DLL{
+ Name: name,
+ Handle: Handle(h),
+ }
+ return d, nil
+}
+
+// MustLoadDLL is like LoadDLL but panics if load operation failes.
+func MustLoadDLL(name string) *DLL {
+ d, e := LoadDLL(name)
+ if e != nil {
+ panic(e)
+ }
+ return d
+}
+
+// FindProc searches DLL d for procedure named name and returns *Proc
+// if found. It returns an error if search fails.
+func (d *DLL) FindProc(name string) (proc *Proc, err error) {
+ namep, err := BytePtrFromString(name)
+ if err != nil {
+ return nil, err
+ }
+ a, e := getprocaddress(uintptr(d.Handle), namep)
+ if e != 0 {
+ return nil, &DLLError{
+ Err: e,
+ ObjName: name,
+ Msg: "Failed to find " + name + " procedure in " + d.Name + ": " + e.Error(),
+ }
+ }
+ p := &Proc{
+ Dll: d,
+ Name: name,
+ addr: a,
+ }
+ return p, nil
+}
+
+// MustFindProc is like FindProc but panics if search fails.
+func (d *DLL) MustFindProc(name string) *Proc {
+ p, e := d.FindProc(name)
+ if e != nil {
+ panic(e)
+ }
+ return p
+}
+
+// Release unloads DLL d from memory.
+func (d *DLL) Release() (err error) {
+ return FreeLibrary(d.Handle)
+}
+
+// A Proc implements access to a procedure inside a DLL.
+type Proc struct {
+ Dll *DLL
+ Name string
+ addr uintptr
+}
+
+// Addr returns the address of the procedure represented by p.
+// The return value can be passed to Syscall to run the procedure.
+func (p *Proc) Addr() uintptr {
+ return p.addr
+}
+
+//go:uintptrescapes
+
+// Call executes procedure p with arguments a. It will panic, if more than 15 arguments
+// are supplied.
+//
+// The returned error is always non-nil, constructed from the result of GetLastError.
+// Callers must inspect the primary return value to decide whether an error occurred
+// (according to the semantics of the specific function being called) before consulting
+// the error. The error will be guaranteed to contain windows.Errno.
+func (p *Proc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
+ switch len(a) {
+ case 0:
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), 0, 0, 0)
+ case 1:
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], 0, 0)
+ case 2:
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], 0)
+ case 3:
+ return syscall.Syscall(p.Addr(), uintptr(len(a)), a[0], a[1], a[2])
+ case 4:
+ return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], 0, 0)
+ case 5:
+ return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], 0)
+ case 6:
+ return syscall.Syscall6(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5])
+ case 7:
+ return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], 0, 0)
+ case 8:
+ return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], 0)
+ case 9:
+ return syscall.Syscall9(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8])
+ case 10:
+ return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], 0, 0)
+ case 11:
+ return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], 0)
+ case 12:
+ return syscall.Syscall12(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11])
+ case 13:
+ return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], 0, 0)
+ case 14:
+ return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], 0)
+ case 15:
+ return syscall.Syscall15(p.Addr(), uintptr(len(a)), a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10], a[11], a[12], a[13], a[14])
+ default:
+ panic("Call " + p.Name + " with too many arguments " + itoa(len(a)) + ".")
+ }
+}
+
+// A LazyDLL implements access to a single DLL.
+// It will delay the load of the DLL until the first
+// call to its Handle method or to one of its
+// LazyProc's Addr method.
+type LazyDLL struct {
+ Name string
+
+ // System determines whether the DLL must be loaded from the
+ // Windows System directory, bypassing the normal DLL search
+ // path.
+ System bool
+
+ mu sync.Mutex
+ dll *DLL // non nil once DLL is loaded
+}
+
+// Load loads DLL file d.Name into memory. It returns an error if fails.
+// Load will not try to load DLL, if it is already loaded into memory.
+func (d *LazyDLL) Load() error {
+ // Non-racy version of:
+ // if d.dll != nil {
+ if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll))) != nil {
+ return nil
+ }
+ d.mu.Lock()
+ defer d.mu.Unlock()
+ if d.dll != nil {
+ return nil
+ }
+
+ // kernel32.dll is special, since it's where LoadLibraryEx comes from.
+ // The kernel already special-cases its name, so it's always
+ // loaded from system32.
+ var dll *DLL
+ var err error
+ if d.Name == "kernel32.dll" {
+ dll, err = LoadDLL(d.Name)
+ } else {
+ dll, err = loadLibraryEx(d.Name, d.System)
+ }
+ if err != nil {
+ return err
+ }
+
+ // Non-racy version of:
+ // d.dll = dll
+ atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&d.dll)), unsafe.Pointer(dll))
+ return nil
+}
+
+// mustLoad is like Load but panics if search fails.
+func (d *LazyDLL) mustLoad() {
+ e := d.Load()
+ if e != nil {
+ panic(e)
+ }
+}
+
+// Handle returns d's module handle.
+func (d *LazyDLL) Handle() uintptr {
+ d.mustLoad()
+ return uintptr(d.dll.Handle)
+}
+
+// NewProc returns a LazyProc for accessing the named procedure in the DLL d.
+func (d *LazyDLL) NewProc(name string) *LazyProc {
+ return &LazyProc{l: d, Name: name}
+}
+
+// NewLazyDLL creates new LazyDLL associated with DLL file.
+func NewLazyDLL(name string) *LazyDLL {
+ return &LazyDLL{Name: name}
+}
+
+// NewLazySystemDLL is like NewLazyDLL, but will only
+// search Windows System directory for the DLL if name is
+// a base name (like "advapi32.dll").
+func NewLazySystemDLL(name string) *LazyDLL {
+ return &LazyDLL{Name: name, System: true}
+}
+
+// A LazyProc implements access to a procedure inside a LazyDLL.
+// It delays the lookup until the Addr method is called.
+type LazyProc struct {
+ Name string
+
+ mu sync.Mutex
+ l *LazyDLL
+ proc *Proc
+}
+
+// Find searches DLL for procedure named p.Name. It returns
+// an error if search fails. Find will not search procedure,
+// if it is already found and loaded into memory.
+func (p *LazyProc) Find() error {
+ // Non-racy version of:
+ // if p.proc == nil {
+ if atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc))) == nil {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+ if p.proc == nil {
+ e := p.l.Load()
+ if e != nil {
+ return e
+ }
+ proc, e := p.l.dll.FindProc(p.Name)
+ if e != nil {
+ return e
+ }
+ // Non-racy version of:
+ // p.proc = proc
+ atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(&p.proc)), unsafe.Pointer(proc))
+ }
+ }
+ return nil
+}
+
+// mustFind is like Find but panics if search fails.
+func (p *LazyProc) mustFind() {
+ e := p.Find()
+ if e != nil {
+ panic(e)
+ }
+}
+
+// Addr returns the address of the procedure represented by p.
+// The return value can be passed to Syscall to run the procedure.
+// It will panic if the procedure cannot be found.
+func (p *LazyProc) Addr() uintptr {
+ p.mustFind()
+ return p.proc.Addr()
+}
+
+//go:uintptrescapes
+
+// Call executes procedure p with arguments a. It will panic, if more than 15 arguments
+// are supplied. It will also panic if the procedure cannot be found.
+//
+// The returned error is always non-nil, constructed from the result of GetLastError.
+// Callers must inspect the primary return value to decide whether an error occurred
+// (according to the semantics of the specific function being called) before consulting
+// the error. The error will be guaranteed to contain windows.Errno.
+func (p *LazyProc) Call(a ...uintptr) (r1, r2 uintptr, lastErr error) {
+ p.mustFind()
+ return p.proc.Call(a...)
+}
+
+var canDoSearchSystem32Once struct {
+ sync.Once
+ v bool
+}
+
+func initCanDoSearchSystem32() {
+ // https://msdn.microsoft.com/en-us/library/ms684179(v=vs.85).aspx says:
+ // "Windows 7, Windows Server 2008 R2, Windows Vista, and Windows
+ // Server 2008: The LOAD_LIBRARY_SEARCH_* flags are available on
+ // systems that have KB2533623 installed. To determine whether the
+ // flags are available, use GetProcAddress to get the address of the
+ // AddDllDirectory, RemoveDllDirectory, or SetDefaultDllDirectories
+ // function. If GetProcAddress succeeds, the LOAD_LIBRARY_SEARCH_*
+ // flags can be used with LoadLibraryEx."
+ canDoSearchSystem32Once.v = (modkernel32.NewProc("AddDllDirectory").Find() == nil)
+}
+
+func canDoSearchSystem32() bool {
+ canDoSearchSystem32Once.Do(initCanDoSearchSystem32)
+ return canDoSearchSystem32Once.v
+}
+
+func isBaseName(name string) bool {
+ for _, c := range name {
+ if c == ':' || c == '/' || c == '\\' {
+ return false
+ }
+ }
+ return true
+}
+
+// loadLibraryEx wraps the Windows LoadLibraryEx function.
+//
+// See https://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
+//
+// If name is not an absolute path, LoadLibraryEx searches for the DLL
+// in a variety of automatic locations unless constrained by flags.
+// See: https://msdn.microsoft.com/en-us/library/ff919712%28VS.85%29.aspx
+func loadLibraryEx(name string, system bool) (*DLL, error) {
+ loadDLL := name
+ var flags uintptr
+ if system {
+ if canDoSearchSystem32() {
+ const LOAD_LIBRARY_SEARCH_SYSTEM32 = 0x00000800
+ flags = LOAD_LIBRARY_SEARCH_SYSTEM32
+ } else if isBaseName(name) {
+ // WindowsXP or unpatched Windows machine
+ // trying to load "foo.dll" out of the system
+ // folder, but LoadLibraryEx doesn't support
+ // that yet on their system, so emulate it.
+ windir, _ := Getenv("WINDIR") // old var; apparently works on XP
+ if windir == "" {
+ return nil, errString("%WINDIR% not defined")
+ }
+ loadDLL = windir + "\\System32\\" + name
+ }
+ }
+ h, err := LoadLibraryEx(loadDLL, 0, flags)
+ if err != nil {
+ return nil, err
+ }
+ return &DLL{Name: name, Handle: h}, nil
+}
+
+type errString string
+
+func (s errString) Error() string { return string(s) }
diff --git a/vendor/golang.org/x/sys/windows/env_windows.go b/vendor/golang.org/x/sys/windows/env_windows.go
new file mode 100644
index 00000000000..bdc71e241e0
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/env_windows.go
@@ -0,0 +1,29 @@
+// 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.
+
+// Windows environment variables.
+
+package windows
+
+import "syscall"
+
+func Getenv(key string) (value string, found bool) {
+ return syscall.Getenv(key)
+}
+
+func Setenv(key, value string) error {
+ return syscall.Setenv(key, value)
+}
+
+func Clearenv() {
+ syscall.Clearenv()
+}
+
+func Environ() []string {
+ return syscall.Environ()
+}
+
+func Unsetenv(key string) error {
+ return syscall.Unsetenv(key)
+}
diff --git a/vendor/golang.org/x/sys/windows/eventlog.go b/vendor/golang.org/x/sys/windows/eventlog.go
new file mode 100644
index 00000000000..40af946e162
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/eventlog.go
@@ -0,0 +1,20 @@
+// Copyright 2012 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
+
+package windows
+
+const (
+ EVENTLOG_SUCCESS = 0
+ EVENTLOG_ERROR_TYPE = 1
+ EVENTLOG_WARNING_TYPE = 2
+ EVENTLOG_INFORMATION_TYPE = 4
+ EVENTLOG_AUDIT_SUCCESS = 8
+ EVENTLOG_AUDIT_FAILURE = 16
+)
+
+//sys RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) [failretval==0] = advapi32.RegisterEventSourceW
+//sys DeregisterEventSource(handle Handle) (err error) = advapi32.DeregisterEventSource
+//sys ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) = advapi32.ReportEventW
diff --git a/vendor/golang.org/x/sys/windows/exec_windows.go b/vendor/golang.org/x/sys/windows/exec_windows.go
new file mode 100644
index 00000000000..3606c3a8b36
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/exec_windows.go
@@ -0,0 +1,97 @@
+// 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.
+
+// Fork, exec, wait, etc.
+
+package windows
+
+// EscapeArg rewrites command line argument s as prescribed
+// in http://msdn.microsoft.com/en-us/library/ms880421.
+// This function returns "" (2 double quotes) if s is empty.
+// Alternatively, these transformations are done:
+// - every back slash (\) is doubled, but only if immediately
+// followed by double quote (");
+// - every double quote (") is escaped by back slash (\);
+// - finally, s is wrapped with double quotes (arg -> "arg"),
+// but only if there is space or tab inside s.
+func EscapeArg(s string) string {
+ if len(s) == 0 {
+ return "\"\""
+ }
+ n := len(s)
+ hasSpace := false
+ for i := 0; i < len(s); i++ {
+ switch s[i] {
+ case '"', '\\':
+ n++
+ case ' ', '\t':
+ hasSpace = true
+ }
+ }
+ if hasSpace {
+ n += 2
+ }
+ if n == len(s) {
+ return s
+ }
+
+ qs := make([]byte, n)
+ j := 0
+ if hasSpace {
+ qs[j] = '"'
+ j++
+ }
+ slashes := 0
+ for i := 0; i < len(s); i++ {
+ switch s[i] {
+ default:
+ slashes = 0
+ qs[j] = s[i]
+ case '\\':
+ slashes++
+ qs[j] = s[i]
+ case '"':
+ for ; slashes > 0; slashes-- {
+ qs[j] = '\\'
+ j++
+ }
+ qs[j] = '\\'
+ j++
+ qs[j] = s[i]
+ }
+ j++
+ }
+ if hasSpace {
+ for ; slashes > 0; slashes-- {
+ qs[j] = '\\'
+ j++
+ }
+ qs[j] = '"'
+ j++
+ }
+ return string(qs[:j])
+}
+
+func CloseOnExec(fd Handle) {
+ SetHandleInformation(Handle(fd), HANDLE_FLAG_INHERIT, 0)
+}
+
+// FullPath retrieves the full path of the specified file.
+func FullPath(name string) (path string, err error) {
+ p, err := UTF16PtrFromString(name)
+ if err != nil {
+ return "", err
+ }
+ n := uint32(100)
+ for {
+ buf := make([]uint16, n)
+ n, err = GetFullPathName(p, uint32(len(buf)), &buf[0], nil)
+ if err != nil {
+ return "", err
+ }
+ if n <= uint32(len(buf)) {
+ return UTF16ToString(buf[:n]), nil
+ }
+ }
+}
diff --git a/vendor/golang.org/x/sys/windows/memory_windows.go b/vendor/golang.org/x/sys/windows/memory_windows.go
new file mode 100644
index 00000000000..f80a4204f09
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/memory_windows.go
@@ -0,0 +1,26 @@
+// 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 windows
+
+const (
+ MEM_COMMIT = 0x00001000
+ MEM_RESERVE = 0x00002000
+ MEM_DECOMMIT = 0x00004000
+ MEM_RELEASE = 0x00008000
+ MEM_RESET = 0x00080000
+ MEM_TOP_DOWN = 0x00100000
+ MEM_WRITE_WATCH = 0x00200000
+ MEM_PHYSICAL = 0x00400000
+ MEM_RESET_UNDO = 0x01000000
+ MEM_LARGE_PAGES = 0x20000000
+
+ PAGE_NOACCESS = 0x01
+ PAGE_READONLY = 0x02
+ PAGE_READWRITE = 0x04
+ PAGE_WRITECOPY = 0x08
+ PAGE_EXECUTE_READ = 0x20
+ PAGE_EXECUTE_READWRITE = 0x40
+ PAGE_EXECUTE_WRITECOPY = 0x80
+)
diff --git a/vendor/golang.org/x/sys/windows/mksyscall.go b/vendor/golang.org/x/sys/windows/mksyscall.go
new file mode 100644
index 00000000000..fb7db0ef8d4
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/mksyscall.go
@@ -0,0 +1,7 @@
+// 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 windows
+
+//go:generate go run $GOROOT/src/syscall/mksyscall_windows.go -output zsyscall_windows.go eventlog.go service.go syscall_windows.go security_windows.go
diff --git a/vendor/golang.org/x/sys/windows/race.go b/vendor/golang.org/x/sys/windows/race.go
new file mode 100644
index 00000000000..a74e3e24b55
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/race.go
@@ -0,0 +1,30 @@
+// Copyright 2012 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,race
+
+package windows
+
+import (
+ "runtime"
+ "unsafe"
+)
+
+const raceenabled = true
+
+func raceAcquire(addr unsafe.Pointer) {
+ runtime.RaceAcquire(addr)
+}
+
+func raceReleaseMerge(addr unsafe.Pointer) {
+ runtime.RaceReleaseMerge(addr)
+}
+
+func raceReadRange(addr unsafe.Pointer, len int) {
+ runtime.RaceReadRange(addr, len)
+}
+
+func raceWriteRange(addr unsafe.Pointer, len int) {
+ runtime.RaceWriteRange(addr, len)
+}
diff --git a/vendor/golang.org/x/sys/windows/race0.go b/vendor/golang.org/x/sys/windows/race0.go
new file mode 100644
index 00000000000..e44a3cbf679
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/race0.go
@@ -0,0 +1,25 @@
+// Copyright 2012 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,!race
+
+package windows
+
+import (
+ "unsafe"
+)
+
+const raceenabled = false
+
+func raceAcquire(addr unsafe.Pointer) {
+}
+
+func raceReleaseMerge(addr unsafe.Pointer) {
+}
+
+func raceReadRange(addr unsafe.Pointer, len int) {
+}
+
+func raceWriteRange(addr unsafe.Pointer, len int) {
+}
diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go
new file mode 100644
index 00000000000..4f17a3331fd
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/security_windows.go
@@ -0,0 +1,478 @@
+// Copyright 2012 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 windows
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+const (
+ STANDARD_RIGHTS_REQUIRED = 0xf0000
+ STANDARD_RIGHTS_READ = 0x20000
+ STANDARD_RIGHTS_WRITE = 0x20000
+ STANDARD_RIGHTS_EXECUTE = 0x20000
+ STANDARD_RIGHTS_ALL = 0x1F0000
+)
+
+const (
+ NameUnknown = 0
+ NameFullyQualifiedDN = 1
+ NameSamCompatible = 2
+ NameDisplay = 3
+ NameUniqueId = 6
+ NameCanonical = 7
+ NameUserPrincipal = 8
+ NameCanonicalEx = 9
+ NameServicePrincipal = 10
+ NameDnsDomain = 12
+)
+
+// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
+// http://blogs.msdn.com/b/drnick/archive/2007/12/19/windows-and-upn-format-credentials.aspx
+//sys TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.TranslateNameW
+//sys GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) [failretval&0xff==0] = secur32.GetUserNameExW
+
+// TranslateAccountName converts a directory service
+// object name from one format to another.
+func TranslateAccountName(username string, from, to uint32, initSize int) (string, error) {
+ u, e := UTF16PtrFromString(username)
+ if e != nil {
+ return "", e
+ }
+ n := uint32(50)
+ for {
+ b := make([]uint16, n)
+ e = TranslateName(u, from, to, &b[0], &n)
+ if e == nil {
+ return UTF16ToString(b[:n]), nil
+ }
+ if e != ERROR_INSUFFICIENT_BUFFER {
+ return "", e
+ }
+ if n <= uint32(len(b)) {
+ return "", e
+ }
+ }
+}
+
+const (
+ // do not reorder
+ NetSetupUnknownStatus = iota
+ NetSetupUnjoined
+ NetSetupWorkgroupName
+ NetSetupDomainName
+)
+
+type UserInfo10 struct {
+ Name *uint16
+ Comment *uint16
+ UsrComment *uint16
+ FullName *uint16
+}
+
+//sys NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) = netapi32.NetUserGetInfo
+//sys NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) = netapi32.NetGetJoinInformation
+//sys NetApiBufferFree(buf *byte) (neterr error) = netapi32.NetApiBufferFree
+
+const (
+ // do not reorder
+ SidTypeUser = 1 + iota
+ SidTypeGroup
+ SidTypeDomain
+ SidTypeAlias
+ SidTypeWellKnownGroup
+ SidTypeDeletedAccount
+ SidTypeInvalid
+ SidTypeUnknown
+ SidTypeComputer
+ SidTypeLabel
+)
+
+type SidIdentifierAuthority struct {
+ Value [6]byte
+}
+
+var (
+ SECURITY_NULL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 0}}
+ SECURITY_WORLD_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 1}}
+ SECURITY_LOCAL_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 2}}
+ SECURITY_CREATOR_SID_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 3}}
+ SECURITY_NON_UNIQUE_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 4}}
+ SECURITY_NT_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 5}}
+ SECURITY_MANDATORY_LABEL_AUTHORITY = SidIdentifierAuthority{[6]byte{0, 0, 0, 0, 0, 16}}
+)
+
+const (
+ SECURITY_NULL_RID = 0
+ SECURITY_WORLD_RID = 0
+ SECURITY_LOCAL_RID = 0
+ SECURITY_CREATOR_OWNER_RID = 0
+ SECURITY_CREATOR_GROUP_RID = 1
+ SECURITY_DIALUP_RID = 1
+ SECURITY_NETWORK_RID = 2
+ SECURITY_BATCH_RID = 3
+ SECURITY_INTERACTIVE_RID = 4
+ SECURITY_LOGON_IDS_RID = 5
+ SECURITY_SERVICE_RID = 6
+ SECURITY_LOCAL_SYSTEM_RID = 18
+ SECURITY_BUILTIN_DOMAIN_RID = 32
+ SECURITY_PRINCIPAL_SELF_RID = 10
+ SECURITY_CREATOR_OWNER_SERVER_RID = 0x2
+ SECURITY_CREATOR_GROUP_SERVER_RID = 0x3
+ SECURITY_LOGON_IDS_RID_COUNT = 0x3
+ SECURITY_ANONYMOUS_LOGON_RID = 0x7
+ SECURITY_PROXY_RID = 0x8
+ SECURITY_ENTERPRISE_CONTROLLERS_RID = 0x9
+ SECURITY_SERVER_LOGON_RID = SECURITY_ENTERPRISE_CONTROLLERS_RID
+ SECURITY_AUTHENTICATED_USER_RID = 0xb
+ SECURITY_RESTRICTED_CODE_RID = 0xc
+ SECURITY_NT_NON_UNIQUE_RID = 0x15
+)
+
+// Predefined domain-relative RIDs for local groups.
+// See https://msdn.microsoft.com/en-us/library/windows/desktop/aa379649(v=vs.85).aspx
+const (
+ DOMAIN_ALIAS_RID_ADMINS = 0x220
+ DOMAIN_ALIAS_RID_USERS = 0x221
+ DOMAIN_ALIAS_RID_GUESTS = 0x222
+ DOMAIN_ALIAS_RID_POWER_USERS = 0x223
+ DOMAIN_ALIAS_RID_ACCOUNT_OPS = 0x224
+ DOMAIN_ALIAS_RID_SYSTEM_OPS = 0x225
+ DOMAIN_ALIAS_RID_PRINT_OPS = 0x226
+ DOMAIN_ALIAS_RID_BACKUP_OPS = 0x227
+ DOMAIN_ALIAS_RID_REPLICATOR = 0x228
+ DOMAIN_ALIAS_RID_RAS_SERVERS = 0x229
+ DOMAIN_ALIAS_RID_PREW2KCOMPACCESS = 0x22a
+ DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS = 0x22b
+ DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS = 0x22c
+ DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS = 0x22d
+ DOMAIN_ALIAS_RID_MONITORING_USERS = 0X22e
+ DOMAIN_ALIAS_RID_LOGGING_USERS = 0x22f
+ DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS = 0x230
+ DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS = 0x231
+ DOMAIN_ALIAS_RID_DCOM_USERS = 0x232
+ DOMAIN_ALIAS_RID_IUSERS = 0x238
+ DOMAIN_ALIAS_RID_CRYPTO_OPERATORS = 0x239
+ DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP = 0x23b
+ DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP = 0x23c
+ DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP = 0x23d
+ DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP = 0x23e
+)
+
+//sys LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountSidW
+//sys LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) = advapi32.LookupAccountNameW
+//sys ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) = advapi32.ConvertSidToStringSidW
+//sys ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) = advapi32.ConvertStringSidToSidW
+//sys GetLengthSid(sid *SID) (len uint32) = advapi32.GetLengthSid
+//sys CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) = advapi32.CopySid
+//sys AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) = advapi32.AllocateAndInitializeSid
+//sys FreeSid(sid *SID) (err error) [failretval!=0] = advapi32.FreeSid
+//sys EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) = advapi32.EqualSid
+
+// The security identifier (SID) structure is a variable-length
+// structure used to uniquely identify users or groups.
+type SID struct{}
+
+// StringToSid converts a string-format security identifier
+// sid into a valid, functional sid.
+func StringToSid(s string) (*SID, error) {
+ var sid *SID
+ p, e := UTF16PtrFromString(s)
+ if e != nil {
+ return nil, e
+ }
+ e = ConvertStringSidToSid(p, &sid)
+ if e != nil {
+ return nil, e
+ }
+ defer LocalFree((Handle)(unsafe.Pointer(sid)))
+ return sid.Copy()
+}
+
+// LookupSID retrieves a security identifier sid for the account
+// and the name of the domain on which the account was found.
+// System specify target computer to search.
+func LookupSID(system, account string) (sid *SID, domain string, accType uint32, err error) {
+ if len(account) == 0 {
+ return nil, "", 0, syscall.EINVAL
+ }
+ acc, e := UTF16PtrFromString(account)
+ if e != nil {
+ return nil, "", 0, e
+ }
+ var sys *uint16
+ if len(system) > 0 {
+ sys, e = UTF16PtrFromString(system)
+ if e != nil {
+ return nil, "", 0, e
+ }
+ }
+ n := uint32(50)
+ dn := uint32(50)
+ for {
+ b := make([]byte, n)
+ db := make([]uint16, dn)
+ sid = (*SID)(unsafe.Pointer(&b[0]))
+ e = LookupAccountName(sys, acc, sid, &n, &db[0], &dn, &accType)
+ if e == nil {
+ return sid, UTF16ToString(db), accType, nil
+ }
+ if e != ERROR_INSUFFICIENT_BUFFER {
+ return nil, "", 0, e
+ }
+ if n <= uint32(len(b)) {
+ return nil, "", 0, e
+ }
+ }
+}
+
+// String converts sid to a string format
+// suitable for display, storage, or transmission.
+func (sid *SID) String() (string, error) {
+ var s *uint16
+ e := ConvertSidToStringSid(sid, &s)
+ if e != nil {
+ return "", e
+ }
+ defer LocalFree((Handle)(unsafe.Pointer(s)))
+ return UTF16ToString((*[256]uint16)(unsafe.Pointer(s))[:]), nil
+}
+
+// Len returns the length, in bytes, of a valid security identifier sid.
+func (sid *SID) Len() int {
+ return int(GetLengthSid(sid))
+}
+
+// Copy creates a duplicate of security identifier sid.
+func (sid *SID) Copy() (*SID, error) {
+ b := make([]byte, sid.Len())
+ sid2 := (*SID)(unsafe.Pointer(&b[0]))
+ e := CopySid(uint32(len(b)), sid2, sid)
+ if e != nil {
+ return nil, e
+ }
+ return sid2, nil
+}
+
+// LookupAccount retrieves the name of the account for this sid
+// and the name of the first domain on which this sid is found.
+// System specify target computer to search for.
+func (sid *SID) LookupAccount(system string) (account, domain string, accType uint32, err error) {
+ var sys *uint16
+ if len(system) > 0 {
+ sys, err = UTF16PtrFromString(system)
+ if err != nil {
+ return "", "", 0, err
+ }
+ }
+ n := uint32(50)
+ dn := uint32(50)
+ for {
+ b := make([]uint16, n)
+ db := make([]uint16, dn)
+ e := LookupAccountSid(sys, sid, &b[0], &n, &db[0], &dn, &accType)
+ if e == nil {
+ return UTF16ToString(b), UTF16ToString(db), accType, nil
+ }
+ if e != ERROR_INSUFFICIENT_BUFFER {
+ return "", "", 0, e
+ }
+ if n <= uint32(len(b)) {
+ return "", "", 0, e
+ }
+ }
+}
+
+const (
+ // do not reorder
+ TOKEN_ASSIGN_PRIMARY = 1 << iota
+ TOKEN_DUPLICATE
+ TOKEN_IMPERSONATE
+ TOKEN_QUERY
+ TOKEN_QUERY_SOURCE
+ TOKEN_ADJUST_PRIVILEGES
+ TOKEN_ADJUST_GROUPS
+ TOKEN_ADJUST_DEFAULT
+ TOKEN_ADJUST_SESSIONID
+
+ TOKEN_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
+ TOKEN_ASSIGN_PRIMARY |
+ TOKEN_DUPLICATE |
+ TOKEN_IMPERSONATE |
+ TOKEN_QUERY |
+ TOKEN_QUERY_SOURCE |
+ TOKEN_ADJUST_PRIVILEGES |
+ TOKEN_ADJUST_GROUPS |
+ TOKEN_ADJUST_DEFAULT |
+ TOKEN_ADJUST_SESSIONID
+ TOKEN_READ = STANDARD_RIGHTS_READ | TOKEN_QUERY
+ TOKEN_WRITE = STANDARD_RIGHTS_WRITE |
+ TOKEN_ADJUST_PRIVILEGES |
+ TOKEN_ADJUST_GROUPS |
+ TOKEN_ADJUST_DEFAULT
+ TOKEN_EXECUTE = STANDARD_RIGHTS_EXECUTE
+)
+
+const (
+ // do not reorder
+ TokenUser = 1 + iota
+ TokenGroups
+ TokenPrivileges
+ TokenOwner
+ TokenPrimaryGroup
+ TokenDefaultDacl
+ TokenSource
+ TokenType
+ TokenImpersonationLevel
+ TokenStatistics
+ TokenRestrictedSids
+ TokenSessionId
+ TokenGroupsAndPrivileges
+ TokenSessionReference
+ TokenSandBoxInert
+ TokenAuditPolicy
+ TokenOrigin
+ TokenElevationType
+ TokenLinkedToken
+ TokenElevation
+ TokenHasRestrictions
+ TokenAccessInformation
+ TokenVirtualizationAllowed
+ TokenVirtualizationEnabled
+ TokenIntegrityLevel
+ TokenUIAccess
+ TokenMandatoryPolicy
+ TokenLogonSid
+ MaxTokenInfoClass
+)
+
+type SIDAndAttributes struct {
+ Sid *SID
+ Attributes uint32
+}
+
+type Tokenuser struct {
+ User SIDAndAttributes
+}
+
+type Tokenprimarygroup struct {
+ PrimaryGroup *SID
+}
+
+type Tokengroups struct {
+ GroupCount uint32
+ Groups [1]SIDAndAttributes
+}
+
+// Authorization Functions
+//sys checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) = advapi32.CheckTokenMembership
+//sys OpenProcessToken(h Handle, access uint32, token *Token) (err error) = advapi32.OpenProcessToken
+//sys GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) = advapi32.GetTokenInformation
+//sys GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) = userenv.GetUserProfileDirectoryW
+
+// An access token contains the security information for a logon session.
+// The system creates an access token when a user logs on, and every
+// process executed on behalf of the user has a copy of the token.
+// The token identifies the user, the user's groups, and the user's
+// privileges. The system uses the token to control access to securable
+// objects and to control the ability of the user to perform various
+// system-related operations on the local computer.
+type Token Handle
+
+// OpenCurrentProcessToken opens the access token
+// associated with current process.
+func OpenCurrentProcessToken() (Token, error) {
+ p, e := GetCurrentProcess()
+ if e != nil {
+ return 0, e
+ }
+ var t Token
+ e = OpenProcessToken(p, TOKEN_QUERY, &t)
+ if e != nil {
+ return 0, e
+ }
+ return t, nil
+}
+
+// Close releases access to access token.
+func (t Token) Close() error {
+ return CloseHandle(Handle(t))
+}
+
+// getInfo retrieves a specified type of information about an access token.
+func (t Token) getInfo(class uint32, initSize int) (unsafe.Pointer, error) {
+ n := uint32(initSize)
+ for {
+ b := make([]byte, n)
+ e := GetTokenInformation(t, class, &b[0], uint32(len(b)), &n)
+ if e == nil {
+ return unsafe.Pointer(&b[0]), nil
+ }
+ if e != ERROR_INSUFFICIENT_BUFFER {
+ return nil, e
+ }
+ if n <= uint32(len(b)) {
+ return nil, e
+ }
+ }
+}
+
+// GetTokenUser retrieves access token t user account information.
+func (t Token) GetTokenUser() (*Tokenuser, error) {
+ i, e := t.getInfo(TokenUser, 50)
+ if e != nil {
+ return nil, e
+ }
+ return (*Tokenuser)(i), nil
+}
+
+// GetTokenGroups retrieves group accounts associated with access token t.
+func (t Token) GetTokenGroups() (*Tokengroups, error) {
+ i, e := t.getInfo(TokenGroups, 50)
+ if e != nil {
+ return nil, e
+ }
+ return (*Tokengroups)(i), nil
+}
+
+// GetTokenPrimaryGroup retrieves access token t primary group information.
+// A pointer to a SID structure representing a group that will become
+// the primary group of any objects created by a process using this access token.
+func (t Token) GetTokenPrimaryGroup() (*Tokenprimarygroup, error) {
+ i, e := t.getInfo(TokenPrimaryGroup, 50)
+ if e != nil {
+ return nil, e
+ }
+ return (*Tokenprimarygroup)(i), nil
+}
+
+// GetUserProfileDirectory retrieves path to the
+// root directory of the access token t user's profile.
+func (t Token) GetUserProfileDirectory() (string, error) {
+ n := uint32(100)
+ for {
+ b := make([]uint16, n)
+ e := GetUserProfileDirectory(t, &b[0], &n)
+ if e == nil {
+ return UTF16ToString(b), nil
+ }
+ if e != ERROR_INSUFFICIENT_BUFFER {
+ return "", e
+ }
+ if n <= uint32(len(b)) {
+ return "", e
+ }
+ }
+}
+
+// IsMember reports whether the access token t is a member of the provided SID.
+func (t Token) IsMember(sid *SID) (bool, error) {
+ var b int32
+ if e := checkTokenMembership(t, sid, &b); e != nil {
+ return false, e
+ }
+ return b != 0, nil
+}
diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go
new file mode 100644
index 00000000000..62fc31b40bd
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/service.go
@@ -0,0 +1,183 @@
+// Copyright 2012 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
+
+package windows
+
+const (
+ SC_MANAGER_CONNECT = 1
+ SC_MANAGER_CREATE_SERVICE = 2
+ SC_MANAGER_ENUMERATE_SERVICE = 4
+ SC_MANAGER_LOCK = 8
+ SC_MANAGER_QUERY_LOCK_STATUS = 16
+ SC_MANAGER_MODIFY_BOOT_CONFIG = 32
+ SC_MANAGER_ALL_ACCESS = 0xf003f
+)
+
+//sys OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenSCManagerW
+
+const (
+ SERVICE_KERNEL_DRIVER = 1
+ SERVICE_FILE_SYSTEM_DRIVER = 2
+ SERVICE_ADAPTER = 4
+ SERVICE_RECOGNIZER_DRIVER = 8
+ SERVICE_WIN32_OWN_PROCESS = 16
+ SERVICE_WIN32_SHARE_PROCESS = 32
+ SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
+ SERVICE_INTERACTIVE_PROCESS = 256
+ SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
+ SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
+
+ SERVICE_BOOT_START = 0
+ SERVICE_SYSTEM_START = 1
+ SERVICE_AUTO_START = 2
+ SERVICE_DEMAND_START = 3
+ SERVICE_DISABLED = 4
+
+ SERVICE_ERROR_IGNORE = 0
+ SERVICE_ERROR_NORMAL = 1
+ SERVICE_ERROR_SEVERE = 2
+ SERVICE_ERROR_CRITICAL = 3
+
+ SC_STATUS_PROCESS_INFO = 0
+
+ SC_ACTION_NONE = 0
+ SC_ACTION_RESTART = 1
+ SC_ACTION_REBOOT = 2
+ SC_ACTION_RUN_COMMAND = 3
+
+ SERVICE_STOPPED = 1
+ SERVICE_START_PENDING = 2
+ SERVICE_STOP_PENDING = 3
+ SERVICE_RUNNING = 4
+ SERVICE_CONTINUE_PENDING = 5
+ SERVICE_PAUSE_PENDING = 6
+ SERVICE_PAUSED = 7
+ SERVICE_NO_CHANGE = 0xffffffff
+
+ SERVICE_ACCEPT_STOP = 1
+ SERVICE_ACCEPT_PAUSE_CONTINUE = 2
+ SERVICE_ACCEPT_SHUTDOWN = 4
+ SERVICE_ACCEPT_PARAMCHANGE = 8
+ SERVICE_ACCEPT_NETBINDCHANGE = 16
+ SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 32
+ SERVICE_ACCEPT_POWEREVENT = 64
+ SERVICE_ACCEPT_SESSIONCHANGE = 128
+
+ SERVICE_CONTROL_STOP = 1
+ SERVICE_CONTROL_PAUSE = 2
+ SERVICE_CONTROL_CONTINUE = 3
+ SERVICE_CONTROL_INTERROGATE = 4
+ SERVICE_CONTROL_SHUTDOWN = 5
+ SERVICE_CONTROL_PARAMCHANGE = 6
+ SERVICE_CONTROL_NETBINDADD = 7
+ SERVICE_CONTROL_NETBINDREMOVE = 8
+ SERVICE_CONTROL_NETBINDENABLE = 9
+ SERVICE_CONTROL_NETBINDDISABLE = 10
+ SERVICE_CONTROL_DEVICEEVENT = 11
+ SERVICE_CONTROL_HARDWAREPROFILECHANGE = 12
+ SERVICE_CONTROL_POWEREVENT = 13
+ SERVICE_CONTROL_SESSIONCHANGE = 14
+
+ SERVICE_ACTIVE = 1
+ SERVICE_INACTIVE = 2
+ SERVICE_STATE_ALL = 3
+
+ SERVICE_QUERY_CONFIG = 1
+ SERVICE_CHANGE_CONFIG = 2
+ SERVICE_QUERY_STATUS = 4
+ SERVICE_ENUMERATE_DEPENDENTS = 8
+ SERVICE_START = 16
+ SERVICE_STOP = 32
+ SERVICE_PAUSE_CONTINUE = 64
+ SERVICE_INTERROGATE = 128
+ SERVICE_USER_DEFINED_CONTROL = 256
+ SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SERVICE_QUERY_CONFIG | SERVICE_CHANGE_CONFIG | SERVICE_QUERY_STATUS | SERVICE_ENUMERATE_DEPENDENTS | SERVICE_START | SERVICE_STOP | SERVICE_PAUSE_CONTINUE | SERVICE_INTERROGATE | SERVICE_USER_DEFINED_CONTROL
+ SERVICE_RUNS_IN_SYSTEM_PROCESS = 1
+ SERVICE_CONFIG_DESCRIPTION = 1
+ SERVICE_CONFIG_FAILURE_ACTIONS = 2
+
+ NO_ERROR = 0
+
+ SC_ENUM_PROCESS_INFO = 0
+)
+
+type SERVICE_STATUS struct {
+ ServiceType uint32
+ CurrentState uint32
+ ControlsAccepted uint32
+ Win32ExitCode uint32
+ ServiceSpecificExitCode uint32
+ CheckPoint uint32
+ WaitHint uint32
+}
+
+type SERVICE_TABLE_ENTRY struct {
+ ServiceName *uint16
+ ServiceProc uintptr
+}
+
+type QUERY_SERVICE_CONFIG struct {
+ ServiceType uint32
+ StartType uint32
+ ErrorControl uint32
+ BinaryPathName *uint16
+ LoadOrderGroup *uint16
+ TagId uint32
+ Dependencies *uint16
+ ServiceStartName *uint16
+ DisplayName *uint16
+}
+
+type SERVICE_DESCRIPTION struct {
+ Description *uint16
+}
+
+type SERVICE_STATUS_PROCESS struct {
+ ServiceType uint32
+ CurrentState uint32
+ ControlsAccepted uint32
+ Win32ExitCode uint32
+ ServiceSpecificExitCode uint32
+ CheckPoint uint32
+ WaitHint uint32
+ ProcessId uint32
+ ServiceFlags uint32
+}
+
+type ENUM_SERVICE_STATUS_PROCESS struct {
+ ServiceName *uint16
+ DisplayName *uint16
+ ServiceStatusProcess SERVICE_STATUS_PROCESS
+}
+
+type SERVICE_FAILURE_ACTIONS struct {
+ ResetPeriod uint32
+ RebootMsg *uint16
+ Command *uint16
+ ActionsCount uint32
+ Actions *SC_ACTION
+}
+
+type SC_ACTION struct {
+ Type uint32
+ Delay uint32
+}
+
+//sys CloseServiceHandle(handle Handle) (err error) = advapi32.CloseServiceHandle
+//sys CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) [failretval==0] = advapi32.CreateServiceW
+//sys OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) [failretval==0] = advapi32.OpenServiceW
+//sys DeleteService(service Handle) (err error) = advapi32.DeleteService
+//sys StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) = advapi32.StartServiceW
+//sys QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) = advapi32.QueryServiceStatus
+//sys ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) = advapi32.ControlService
+//sys StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) = advapi32.StartServiceCtrlDispatcherW
+//sys SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) = advapi32.SetServiceStatus
+//sys ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) = advapi32.ChangeServiceConfigW
+//sys QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfigW
+//sys ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) = advapi32.ChangeServiceConfig2W
+//sys QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceConfig2W
+//sys EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) = advapi32.EnumServicesStatusExW
+//sys QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) = advapi32.QueryServiceStatusEx
diff --git a/vendor/golang.org/x/sys/windows/str.go b/vendor/golang.org/x/sys/windows/str.go
new file mode 100644
index 00000000000..917cc2aae4e
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/str.go
@@ -0,0 +1,22 @@
+// 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.
+
+// +build windows
+
+package windows
+
+func itoa(val int) string { // do it here rather than with fmt to avoid dependency
+ if val < 0 {
+ return "-" + itoa(-val)
+ }
+ var buf [32]byte // big enough for int64
+ i := len(buf) - 1
+ for val >= 10 {
+ buf[i] = byte(val%10 + '0')
+ i--
+ val /= 10
+ }
+ buf[i] = byte(val + '0')
+ return string(buf[i:])
+}
diff --git a/vendor/golang.org/x/sys/windows/syscall.go b/vendor/golang.org/x/sys/windows/syscall.go
new file mode 100644
index 00000000000..af828a91bcf
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/syscall.go
@@ -0,0 +1,74 @@
+// 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.
+
+// +build windows
+
+// Package windows contains an interface to the low-level operating system
+// primitives. OS details vary depending on the underlying system, and
+// by default, godoc will display the OS-specific documentation for the current
+// system. If you want godoc to display syscall documentation for another
+// system, set $GOOS and $GOARCH to the desired system. For example, if
+// you want to view documentation for freebsd/arm on linux/amd64, set $GOOS
+// to freebsd and $GOARCH to arm.
+//
+// The primary use of this package is inside other packages that provide a more
+// portable interface to the system, such as "os", "time" and "net". Use
+// those packages rather than this one if you can.
+//
+// For details of the functions and data types in this package consult
+// the manuals for the appropriate operating system.
+//
+// These calls return err == nil to indicate success; otherwise
+// err represents an operating system error describing the failure and
+// holds a value of type syscall.Errno.
+package windows // import "golang.org/x/sys/windows"
+
+import (
+ "syscall"
+)
+
+// ByteSliceFromString returns a NUL-terminated slice of bytes
+// containing the text of s. If s contains a NUL byte at any
+// location, it returns (nil, syscall.EINVAL).
+func ByteSliceFromString(s string) ([]byte, error) {
+ for i := 0; i < len(s); i++ {
+ if s[i] == 0 {
+ return nil, syscall.EINVAL
+ }
+ }
+ a := make([]byte, len(s)+1)
+ copy(a, s)
+ return a, nil
+}
+
+// BytePtrFromString returns a pointer to a NUL-terminated array of
+// bytes containing the text of s. If s contains a NUL byte at any
+// location, it returns (nil, syscall.EINVAL).
+func BytePtrFromString(s string) (*byte, error) {
+ a, err := ByteSliceFromString(s)
+ if err != nil {
+ return nil, err
+ }
+ return &a[0], nil
+}
+
+// Single-word zero for use when we need a valid pointer to 0 bytes.
+// See mksyscall.pl.
+var _zero uintptr
+
+func (ts *Timespec) Unix() (sec int64, nsec int64) {
+ return int64(ts.Sec), int64(ts.Nsec)
+}
+
+func (tv *Timeval) Unix() (sec int64, nsec int64) {
+ return int64(tv.Sec), int64(tv.Usec) * 1000
+}
+
+func (ts *Timespec) Nano() int64 {
+ return int64(ts.Sec)*1e9 + int64(ts.Nsec)
+}
+
+func (tv *Timeval) Nano() int64 {
+ return int64(tv.Sec)*1e9 + int64(tv.Usec)*1000
+}
diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go
new file mode 100644
index 00000000000..8a00b71f1d1
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/syscall_windows.go
@@ -0,0 +1,1205 @@
+// 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.
+
+// Windows system calls.
+
+package windows
+
+import (
+ errorspkg "errors"
+ "sync"
+ "syscall"
+ "unicode/utf16"
+ "unsafe"
+)
+
+type Handle uintptr
+
+const (
+ InvalidHandle = ^Handle(0)
+
+ // Flags for DefineDosDevice.
+ DDD_EXACT_MATCH_ON_REMOVE = 0x00000004
+ DDD_NO_BROADCAST_SYSTEM = 0x00000008
+ DDD_RAW_TARGET_PATH = 0x00000001
+ DDD_REMOVE_DEFINITION = 0x00000002
+
+ // Return values for GetDriveType.
+ DRIVE_UNKNOWN = 0
+ DRIVE_NO_ROOT_DIR = 1
+ DRIVE_REMOVABLE = 2
+ DRIVE_FIXED = 3
+ DRIVE_REMOTE = 4
+ DRIVE_CDROM = 5
+ DRIVE_RAMDISK = 6
+
+ // File system flags from GetVolumeInformation and GetVolumeInformationByHandle.
+ FILE_CASE_SENSITIVE_SEARCH = 0x00000001
+ FILE_CASE_PRESERVED_NAMES = 0x00000002
+ FILE_FILE_COMPRESSION = 0x00000010
+ FILE_DAX_VOLUME = 0x20000000
+ FILE_NAMED_STREAMS = 0x00040000
+ FILE_PERSISTENT_ACLS = 0x00000008
+ FILE_READ_ONLY_VOLUME = 0x00080000
+ FILE_SEQUENTIAL_WRITE_ONCE = 0x00100000
+ FILE_SUPPORTS_ENCRYPTION = 0x00020000
+ FILE_SUPPORTS_EXTENDED_ATTRIBUTES = 0x00800000
+ FILE_SUPPORTS_HARD_LINKS = 0x00400000
+ FILE_SUPPORTS_OBJECT_IDS = 0x00010000
+ FILE_SUPPORTS_OPEN_BY_FILE_ID = 0x01000000
+ FILE_SUPPORTS_REPARSE_POINTS = 0x00000080
+ FILE_SUPPORTS_SPARSE_FILES = 0x00000040
+ FILE_SUPPORTS_TRANSACTIONS = 0x00200000
+ FILE_SUPPORTS_USN_JOURNAL = 0x02000000
+ FILE_UNICODE_ON_DISK = 0x00000004
+ FILE_VOLUME_IS_COMPRESSED = 0x00008000
+ FILE_VOLUME_QUOTAS = 0x00000020
+)
+
+// StringToUTF16 is deprecated. Use UTF16FromString instead.
+// If s contains a NUL byte this function panics instead of
+// returning an error.
+func StringToUTF16(s string) []uint16 {
+ a, err := UTF16FromString(s)
+ if err != nil {
+ panic("windows: string with NUL passed to StringToUTF16")
+ }
+ return a
+}
+
+// UTF16FromString returns the UTF-16 encoding of the UTF-8 string
+// s, with a terminating NUL added. If s contains a NUL byte at any
+// location, it returns (nil, syscall.EINVAL).
+func UTF16FromString(s string) ([]uint16, error) {
+ for i := 0; i < len(s); i++ {
+ if s[i] == 0 {
+ return nil, syscall.EINVAL
+ }
+ }
+ return utf16.Encode([]rune(s + "\x00")), nil
+}
+
+// UTF16ToString returns the UTF-8 encoding of the UTF-16 sequence s,
+// with a terminating NUL removed.
+func UTF16ToString(s []uint16) string {
+ for i, v := range s {
+ if v == 0 {
+ s = s[0:i]
+ break
+ }
+ }
+ return string(utf16.Decode(s))
+}
+
+// StringToUTF16Ptr is deprecated. Use UTF16PtrFromString instead.
+// If s contains a NUL byte this function panics instead of
+// returning an error.
+func StringToUTF16Ptr(s string) *uint16 { return &StringToUTF16(s)[0] }
+
+// UTF16PtrFromString returns pointer to the UTF-16 encoding of
+// the UTF-8 string s, with a terminating NUL added. If s
+// contains a NUL byte at any location, it returns (nil, syscall.EINVAL).
+func UTF16PtrFromString(s string) (*uint16, error) {
+ a, err := UTF16FromString(s)
+ if err != nil {
+ return nil, err
+ }
+ return &a[0], nil
+}
+
+func Getpagesize() int { return 4096 }
+
+// NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention.
+// This is useful when interoperating with Windows code requiring callbacks.
+// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
+func NewCallback(fn interface{}) uintptr {
+ return syscall.NewCallback(fn)
+}
+
+// NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention.
+// This is useful when interoperating with Windows code requiring callbacks.
+// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr.
+func NewCallbackCDecl(fn interface{}) uintptr {
+ return syscall.NewCallbackCDecl(fn)
+}
+
+// windows api calls
+
+//sys GetLastError() (lasterr error)
+//sys LoadLibrary(libname string) (handle Handle, err error) = LoadLibraryW
+//sys LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) = LoadLibraryExW
+//sys FreeLibrary(handle Handle) (err error)
+//sys GetProcAddress(module Handle, procname string) (proc uintptr, err error)
+//sys GetVersion() (ver uint32, err error)
+//sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW
+//sys ExitProcess(exitcode uint32)
+//sys CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) [failretval==InvalidHandle] = CreateFileW
+//sys ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
+//sys WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error)
+//sys SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) [failretval==0xffffffff]
+//sys CloseHandle(handle Handle) (err error)
+//sys GetStdHandle(stdhandle uint32) (handle Handle, err error) [failretval==InvalidHandle]
+//sys SetStdHandle(stdhandle uint32, handle Handle) (err error)
+//sys findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstFileW
+//sys findNextFile1(handle Handle, data *win32finddata1) (err error) = FindNextFileW
+//sys FindClose(handle Handle) (err error)
+//sys GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error)
+//sys GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) = GetCurrentDirectoryW
+//sys SetCurrentDirectory(path *uint16) (err error) = SetCurrentDirectoryW
+//sys CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) = CreateDirectoryW
+//sys RemoveDirectory(path *uint16) (err error) = RemoveDirectoryW
+//sys DeleteFile(path *uint16) (err error) = DeleteFileW
+//sys MoveFile(from *uint16, to *uint16) (err error) = MoveFileW
+//sys MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) = MoveFileExW
+//sys GetComputerName(buf *uint16, n *uint32) (err error) = GetComputerNameW
+//sys GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) = GetComputerNameExW
+//sys SetEndOfFile(handle Handle) (err error)
+//sys GetSystemTimeAsFileTime(time *Filetime)
+//sys GetSystemTimePreciseAsFileTime(time *Filetime)
+//sys GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) [failretval==0xffffffff]
+//sys CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error)
+//sys GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error)
+//sys PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error)
+//sys CancelIo(s Handle) (err error)
+//sys CancelIoEx(s Handle, o *Overlapped) (err error)
+//sys CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) = CreateProcessW
+//sys OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error)
+//sys TerminateProcess(handle Handle, exitcode uint32) (err error)
+//sys GetExitCodeProcess(handle Handle, exitcode *uint32) (err error)
+//sys GetStartupInfo(startupInfo *StartupInfo) (err error) = GetStartupInfoW
+//sys GetCurrentProcess() (pseudoHandle Handle, err error)
+//sys GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error)
+//sys DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error)
+//sys WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) [failretval==0xffffffff]
+//sys GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) = GetTempPathW
+//sys CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error)
+//sys GetFileType(filehandle Handle) (n uint32, err error)
+//sys CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) = advapi32.CryptAcquireContextW
+//sys CryptReleaseContext(provhandle Handle, flags uint32) (err error) = advapi32.CryptReleaseContext
+//sys CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) = advapi32.CryptGenRandom
+//sys GetEnvironmentStrings() (envs *uint16, err error) [failretval==nil] = kernel32.GetEnvironmentStringsW
+//sys FreeEnvironmentStrings(envs *uint16) (err error) = kernel32.FreeEnvironmentStringsW
+//sys GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) = kernel32.GetEnvironmentVariableW
+//sys SetEnvironmentVariable(name *uint16, value *uint16) (err error) = kernel32.SetEnvironmentVariableW
+//sys SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error)
+//sys GetFileAttributes(name *uint16) (attrs uint32, err error) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
+//sys SetFileAttributes(name *uint16, attrs uint32) (err error) = kernel32.SetFileAttributesW
+//sys GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) = kernel32.GetFileAttributesExW
+//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
+//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) [failretval==nil] = shell32.CommandLineToArgvW
+//sys LocalFree(hmem Handle) (handle Handle, err error) [failretval!=0]
+//sys SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error)
+//sys FlushFileBuffers(handle Handle) (err error)
+//sys GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) = kernel32.GetFullPathNameW
+//sys GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) = kernel32.GetLongPathNameW
+//sys GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) = kernel32.GetShortPathNameW
+//sys CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) = kernel32.CreateFileMappingW
+//sys MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error)
+//sys UnmapViewOfFile(addr uintptr) (err error)
+//sys FlushViewOfFile(addr uintptr, length uintptr) (err error)
+//sys VirtualLock(addr uintptr, length uintptr) (err error)
+//sys VirtualUnlock(addr uintptr, length uintptr) (err error)
+//sys VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) = kernel32.VirtualAlloc
+//sys VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) = kernel32.VirtualFree
+//sys VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) = kernel32.VirtualProtect
+//sys TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) = mswsock.TransmitFile
+//sys ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) = kernel32.ReadDirectoryChangesW
+//sys CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) = crypt32.CertOpenSystemStoreW
+//sys CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) [failretval==InvalidHandle] = crypt32.CertOpenStore
+//sys CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) [failretval==nil] = crypt32.CertEnumCertificatesInStore
+//sys CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) = crypt32.CertAddCertificateContextToStore
+//sys CertCloseStore(store Handle, flags uint32) (err error) = crypt32.CertCloseStore
+//sys CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) = crypt32.CertGetCertificateChain
+//sys CertFreeCertificateChain(ctx *CertChainContext) = crypt32.CertFreeCertificateChain
+//sys CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) [failretval==nil] = crypt32.CertCreateCertificateContext
+//sys CertFreeCertificateContext(ctx *CertContext) (err error) = crypt32.CertFreeCertificateContext
+//sys CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) = crypt32.CertVerifyCertificateChainPolicy
+//sys RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) = advapi32.RegOpenKeyExW
+//sys RegCloseKey(key Handle) (regerrno error) = advapi32.RegCloseKey
+//sys RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegQueryInfoKeyW
+//sys RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) = advapi32.RegEnumKeyExW
+//sys RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) = advapi32.RegQueryValueExW
+//sys getCurrentProcessId() (pid uint32) = kernel32.GetCurrentProcessId
+//sys GetConsoleMode(console Handle, mode *uint32) (err error) = kernel32.GetConsoleMode
+//sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode
+//sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo
+//sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW
+//sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW
+//sys CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) [failretval==InvalidHandle] = kernel32.CreateToolhelp32Snapshot
+//sys Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32FirstW
+//sys Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) = kernel32.Process32NextW
+//sys DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error)
+// This function returns 1 byte BOOLEAN rather than the 4 byte BOOL.
+//sys CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) [failretval&0xff==0] = CreateSymbolicLinkW
+//sys CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) [failretval&0xff==0] = CreateHardLinkW
+//sys GetCurrentThreadId() (id uint32)
+//sys CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) = kernel32.CreateEventW
+//sys CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) = kernel32.CreateEventExW
+//sys OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) = kernel32.OpenEventW
+//sys SetEvent(event Handle) (err error) = kernel32.SetEvent
+//sys ResetEvent(event Handle) (err error) = kernel32.ResetEvent
+//sys PulseEvent(event Handle) (err error) = kernel32.PulseEvent
+
+// Volume Management Functions
+//sys DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) = DefineDosDeviceW
+//sys DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) = DeleteVolumeMountPointW
+//sys FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeW
+//sys FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) [failretval==InvalidHandle] = FindFirstVolumeMountPointW
+//sys FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) = FindNextVolumeW
+//sys FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) = FindNextVolumeMountPointW
+//sys FindVolumeClose(findVolume Handle) (err error)
+//sys FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error)
+//sys GetDriveType(rootPathName *uint16) (driveType uint32) = GetDriveTypeW
+//sys GetLogicalDrives() (drivesBitMask uint32, err error) [failretval==0]
+//sys GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) [failretval==0] = GetLogicalDriveStringsW
+//sys GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationW
+//sys GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) = GetVolumeInformationByHandleW
+//sys GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) = GetVolumeNameForVolumeMountPointW
+//sys GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) = GetVolumePathNameW
+//sys GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) = GetVolumePathNamesForVolumeNameW
+//sys QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) [failretval==0] = QueryDosDeviceW
+//sys SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) = SetVolumeLabelW
+//sys SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) = SetVolumeMountPointW
+
+// syscall interface implementation for other packages
+
+// GetProcAddressByOrdinal retrieves the address of the exported
+// function from module by ordinal.
+func GetProcAddressByOrdinal(module Handle, ordinal uintptr) (proc uintptr, err error) {
+ r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), ordinal, 0)
+ proc = uintptr(r0)
+ if proc == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Exit(code int) { ExitProcess(uint32(code)) }
+
+func makeInheritSa() *SecurityAttributes {
+ var sa SecurityAttributes
+ sa.Length = uint32(unsafe.Sizeof(sa))
+ sa.InheritHandle = 1
+ return &sa
+}
+
+func Open(path string, mode int, perm uint32) (fd Handle, err error) {
+ if len(path) == 0 {
+ return InvalidHandle, ERROR_FILE_NOT_FOUND
+ }
+ pathp, err := UTF16PtrFromString(path)
+ if err != nil {
+ return InvalidHandle, err
+ }
+ var access uint32
+ switch mode & (O_RDONLY | O_WRONLY | O_RDWR) {
+ case O_RDONLY:
+ access = GENERIC_READ
+ case O_WRONLY:
+ access = GENERIC_WRITE
+ case O_RDWR:
+ access = GENERIC_READ | GENERIC_WRITE
+ }
+ if mode&O_CREAT != 0 {
+ access |= GENERIC_WRITE
+ }
+ if mode&O_APPEND != 0 {
+ access &^= GENERIC_WRITE
+ access |= FILE_APPEND_DATA
+ }
+ sharemode := uint32(FILE_SHARE_READ | FILE_SHARE_WRITE)
+ var sa *SecurityAttributes
+ if mode&O_CLOEXEC == 0 {
+ sa = makeInheritSa()
+ }
+ var createmode uint32
+ switch {
+ case mode&(O_CREAT|O_EXCL) == (O_CREAT | O_EXCL):
+ createmode = CREATE_NEW
+ case mode&(O_CREAT|O_TRUNC) == (O_CREAT | O_TRUNC):
+ createmode = CREATE_ALWAYS
+ case mode&O_CREAT == O_CREAT:
+ createmode = OPEN_ALWAYS
+ case mode&O_TRUNC == O_TRUNC:
+ createmode = TRUNCATE_EXISTING
+ default:
+ createmode = OPEN_EXISTING
+ }
+ h, e := CreateFile(pathp, access, sharemode, sa, createmode, FILE_ATTRIBUTE_NORMAL, 0)
+ return h, e
+}
+
+func Read(fd Handle, p []byte) (n int, err error) {
+ var done uint32
+ e := ReadFile(fd, p, &done, nil)
+ if e != nil {
+ if e == ERROR_BROKEN_PIPE {
+ // NOTE(brainman): work around ERROR_BROKEN_PIPE is returned on reading EOF from stdin
+ return 0, nil
+ }
+ return 0, e
+ }
+ if raceenabled {
+ if done > 0 {
+ raceWriteRange(unsafe.Pointer(&p[0]), int(done))
+ }
+ raceAcquire(unsafe.Pointer(&ioSync))
+ }
+ return int(done), nil
+}
+
+func Write(fd Handle, p []byte) (n int, err error) {
+ if raceenabled {
+ raceReleaseMerge(unsafe.Pointer(&ioSync))
+ }
+ var done uint32
+ e := WriteFile(fd, p, &done, nil)
+ if e != nil {
+ return 0, e
+ }
+ if raceenabled && done > 0 {
+ raceReadRange(unsafe.Pointer(&p[0]), int(done))
+ }
+ return int(done), nil
+}
+
+var ioSync int64
+
+func Seek(fd Handle, offset int64, whence int) (newoffset int64, err error) {
+ var w uint32
+ switch whence {
+ case 0:
+ w = FILE_BEGIN
+ case 1:
+ w = FILE_CURRENT
+ case 2:
+ w = FILE_END
+ }
+ hi := int32(offset >> 32)
+ lo := int32(offset)
+ // use GetFileType to check pipe, pipe can't do seek
+ ft, _ := GetFileType(fd)
+ if ft == FILE_TYPE_PIPE {
+ return 0, syscall.EPIPE
+ }
+ rlo, e := SetFilePointer(fd, lo, &hi, w)
+ if e != nil {
+ return 0, e
+ }
+ return int64(hi)<<32 + int64(rlo), nil
+}
+
+func Close(fd Handle) (err error) {
+ return CloseHandle(fd)
+}
+
+var (
+ Stdin = getStdHandle(STD_INPUT_HANDLE)
+ Stdout = getStdHandle(STD_OUTPUT_HANDLE)
+ Stderr = getStdHandle(STD_ERROR_HANDLE)
+)
+
+func getStdHandle(stdhandle uint32) (fd Handle) {
+ r, _ := GetStdHandle(stdhandle)
+ CloseOnExec(r)
+ return r
+}
+
+const ImplementsGetwd = true
+
+func Getwd() (wd string, err error) {
+ b := make([]uint16, 300)
+ n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
+ if e != nil {
+ return "", e
+ }
+ return string(utf16.Decode(b[0:n])), nil
+}
+
+func Chdir(path string) (err error) {
+ pathp, err := UTF16PtrFromString(path)
+ if err != nil {
+ return err
+ }
+ return SetCurrentDirectory(pathp)
+}
+
+func Mkdir(path string, mode uint32) (err error) {
+ pathp, err := UTF16PtrFromString(path)
+ if err != nil {
+ return err
+ }
+ return CreateDirectory(pathp, nil)
+}
+
+func Rmdir(path string) (err error) {
+ pathp, err := UTF16PtrFromString(path)
+ if err != nil {
+ return err
+ }
+ return RemoveDirectory(pathp)
+}
+
+func Unlink(path string) (err error) {
+ pathp, err := UTF16PtrFromString(path)
+ if err != nil {
+ return err
+ }
+ return DeleteFile(pathp)
+}
+
+func Rename(oldpath, newpath string) (err error) {
+ from, err := UTF16PtrFromString(oldpath)
+ if err != nil {
+ return err
+ }
+ to, err := UTF16PtrFromString(newpath)
+ if err != nil {
+ return err
+ }
+ return MoveFileEx(from, to, MOVEFILE_REPLACE_EXISTING)
+}
+
+func ComputerName() (name string, err error) {
+ var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
+ b := make([]uint16, n)
+ e := GetComputerName(&b[0], &n)
+ if e != nil {
+ return "", e
+ }
+ return string(utf16.Decode(b[0:n])), nil
+}
+
+func Ftruncate(fd Handle, length int64) (err error) {
+ curoffset, e := Seek(fd, 0, 1)
+ if e != nil {
+ return e
+ }
+ defer Seek(fd, curoffset, 0)
+ _, e = Seek(fd, length, 0)
+ if e != nil {
+ return e
+ }
+ e = SetEndOfFile(fd)
+ if e != nil {
+ return e
+ }
+ return nil
+}
+
+func Gettimeofday(tv *Timeval) (err error) {
+ var ft Filetime
+ GetSystemTimeAsFileTime(&ft)
+ *tv = NsecToTimeval(ft.Nanoseconds())
+ return nil
+}
+
+func Pipe(p []Handle) (err error) {
+ if len(p) != 2 {
+ return syscall.EINVAL
+ }
+ var r, w Handle
+ e := CreatePipe(&r, &w, makeInheritSa(), 0)
+ if e != nil {
+ return e
+ }
+ p[0] = r
+ p[1] = w
+ return nil
+}
+
+func Utimes(path string, tv []Timeval) (err error) {
+ if len(tv) != 2 {
+ return syscall.EINVAL
+ }
+ pathp, e := UTF16PtrFromString(path)
+ if e != nil {
+ return e
+ }
+ h, e := CreateFile(pathp,
+ FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
+ if e != nil {
+ return e
+ }
+ defer Close(h)
+ a := NsecToFiletime(tv[0].Nanoseconds())
+ w := NsecToFiletime(tv[1].Nanoseconds())
+ return SetFileTime(h, nil, &a, &w)
+}
+
+func UtimesNano(path string, ts []Timespec) (err error) {
+ if len(ts) != 2 {
+ return syscall.EINVAL
+ }
+ pathp, e := UTF16PtrFromString(path)
+ if e != nil {
+ return e
+ }
+ h, e := CreateFile(pathp,
+ FILE_WRITE_ATTRIBUTES, FILE_SHARE_WRITE, nil,
+ OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0)
+ if e != nil {
+ return e
+ }
+ defer Close(h)
+ a := NsecToFiletime(TimespecToNsec(ts[0]))
+ w := NsecToFiletime(TimespecToNsec(ts[1]))
+ return SetFileTime(h, nil, &a, &w)
+}
+
+func Fsync(fd Handle) (err error) {
+ return FlushFileBuffers(fd)
+}
+
+func Chmod(path string, mode uint32) (err error) {
+ if mode == 0 {
+ return syscall.EINVAL
+ }
+ p, e := UTF16PtrFromString(path)
+ if e != nil {
+ return e
+ }
+ attrs, e := GetFileAttributes(p)
+ if e != nil {
+ return e
+ }
+ if mode&S_IWRITE != 0 {
+ attrs &^= FILE_ATTRIBUTE_READONLY
+ } else {
+ attrs |= FILE_ATTRIBUTE_READONLY
+ }
+ return SetFileAttributes(p, attrs)
+}
+
+func LoadGetSystemTimePreciseAsFileTime() error {
+ return procGetSystemTimePreciseAsFileTime.Find()
+}
+
+func LoadCancelIoEx() error {
+ return procCancelIoEx.Find()
+}
+
+func LoadSetFileCompletionNotificationModes() error {
+ return procSetFileCompletionNotificationModes.Find()
+}
+
+// net api calls
+
+const socket_error = uintptr(^uint32(0))
+
+//sys WSAStartup(verreq uint32, data *WSAData) (sockerr error) = ws2_32.WSAStartup
+//sys WSACleanup() (err error) [failretval==socket_error] = ws2_32.WSACleanup
+//sys WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) [failretval==socket_error] = ws2_32.WSAIoctl
+//sys socket(af int32, typ int32, protocol int32) (handle Handle, err error) [failretval==InvalidHandle] = ws2_32.socket
+//sys Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) [failretval==socket_error] = ws2_32.setsockopt
+//sys Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockopt
+//sys bind(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.bind
+//sys connect(s Handle, name unsafe.Pointer, namelen int32) (err error) [failretval==socket_error] = ws2_32.connect
+//sys getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getsockname
+//sys getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) [failretval==socket_error] = ws2_32.getpeername
+//sys listen(s Handle, backlog int32) (err error) [failretval==socket_error] = ws2_32.listen
+//sys shutdown(s Handle, how int32) (err error) [failretval==socket_error] = ws2_32.shutdown
+//sys Closesocket(s Handle) (err error) [failretval==socket_error] = ws2_32.closesocket
+//sys AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) = mswsock.AcceptEx
+//sys GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) = mswsock.GetAcceptExSockaddrs
+//sys WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecv
+//sys WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASend
+//sys WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSARecvFrom
+//sys WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) [failretval==socket_error] = ws2_32.WSASendTo
+//sys GetHostByName(name string) (h *Hostent, err error) [failretval==nil] = ws2_32.gethostbyname
+//sys GetServByName(name string, proto string) (s *Servent, err error) [failretval==nil] = ws2_32.getservbyname
+//sys Ntohs(netshort uint16) (u uint16) = ws2_32.ntohs
+//sys GetProtoByName(name string) (p *Protoent, err error) [failretval==nil] = ws2_32.getprotobyname
+//sys DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) = dnsapi.DnsQuery_W
+//sys DnsRecordListFree(rl *DNSRecord, freetype uint32) = dnsapi.DnsRecordListFree
+//sys DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) = dnsapi.DnsNameCompare_W
+//sys GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) = ws2_32.GetAddrInfoW
+//sys FreeAddrInfoW(addrinfo *AddrinfoW) = ws2_32.FreeAddrInfoW
+//sys GetIfEntry(pIfRow *MibIfRow) (errcode error) = iphlpapi.GetIfEntry
+//sys GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) = iphlpapi.GetAdaptersInfo
+//sys SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) = kernel32.SetFileCompletionNotificationModes
+//sys WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) [failretval==-1] = ws2_32.WSAEnumProtocolsW
+//sys GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) = iphlpapi.GetAdaptersAddresses
+//sys GetACP() (acp uint32) = kernel32.GetACP
+//sys MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) = kernel32.MultiByteToWideChar
+
+// For testing: clients can set this flag to force
+// creation of IPv6 sockets to return EAFNOSUPPORT.
+var SocketDisableIPv6 bool
+
+type RawSockaddrInet4 struct {
+ Family uint16
+ Port uint16
+ Addr [4]byte /* in_addr */
+ Zero [8]uint8
+}
+
+type RawSockaddrInet6 struct {
+ Family uint16
+ Port uint16
+ Flowinfo uint32
+ Addr [16]byte /* in6_addr */
+ Scope_id uint32
+}
+
+type RawSockaddr struct {
+ Family uint16
+ Data [14]int8
+}
+
+type RawSockaddrAny struct {
+ Addr RawSockaddr
+ Pad [100]int8
+}
+
+type Sockaddr interface {
+ sockaddr() (ptr unsafe.Pointer, len int32, err error) // lowercase; only we can define Sockaddrs
+}
+
+type SockaddrInet4 struct {
+ Port int
+ Addr [4]byte
+ raw RawSockaddrInet4
+}
+
+func (sa *SockaddrInet4) sockaddr() (unsafe.Pointer, int32, error) {
+ if sa.Port < 0 || sa.Port > 0xFFFF {
+ return nil, 0, syscall.EINVAL
+ }
+ sa.raw.Family = AF_INET
+ p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
+ p[0] = byte(sa.Port >> 8)
+ p[1] = byte(sa.Port)
+ for i := 0; i < len(sa.Addr); i++ {
+ sa.raw.Addr[i] = sa.Addr[i]
+ }
+ return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
+}
+
+type SockaddrInet6 struct {
+ Port int
+ ZoneId uint32
+ Addr [16]byte
+ raw RawSockaddrInet6
+}
+
+func (sa *SockaddrInet6) sockaddr() (unsafe.Pointer, int32, error) {
+ if sa.Port < 0 || sa.Port > 0xFFFF {
+ return nil, 0, syscall.EINVAL
+ }
+ sa.raw.Family = AF_INET6
+ p := (*[2]byte)(unsafe.Pointer(&sa.raw.Port))
+ p[0] = byte(sa.Port >> 8)
+ p[1] = byte(sa.Port)
+ sa.raw.Scope_id = sa.ZoneId
+ for i := 0; i < len(sa.Addr); i++ {
+ sa.raw.Addr[i] = sa.Addr[i]
+ }
+ return unsafe.Pointer(&sa.raw), int32(unsafe.Sizeof(sa.raw)), nil
+}
+
+type RawSockaddrUnix struct {
+ Family uint16
+ Path [UNIX_PATH_MAX]int8
+}
+
+type SockaddrUnix struct {
+ Name string
+ raw RawSockaddrUnix
+}
+
+func (sa *SockaddrUnix) sockaddr() (unsafe.Pointer, int32, error) {
+ name := sa.Name
+ n := len(name)
+ if n > len(sa.raw.Path) {
+ return nil, 0, syscall.EINVAL
+ }
+ if n == len(sa.raw.Path) && name[0] != '@' {
+ return nil, 0, syscall.EINVAL
+ }
+ sa.raw.Family = AF_UNIX
+ for i := 0; i < n; i++ {
+ sa.raw.Path[i] = int8(name[i])
+ }
+ // length is family (uint16), name, NUL.
+ sl := int32(2)
+ if n > 0 {
+ sl += int32(n) + 1
+ }
+ if sa.raw.Path[0] == '@' {
+ sa.raw.Path[0] = 0
+ // Don't count trailing NUL for abstract address.
+ sl--
+ }
+
+ return unsafe.Pointer(&sa.raw), sl, nil
+}
+
+func (rsa *RawSockaddrAny) Sockaddr() (Sockaddr, error) {
+ switch rsa.Addr.Family {
+ case AF_UNIX:
+ pp := (*RawSockaddrUnix)(unsafe.Pointer(rsa))
+ sa := new(SockaddrUnix)
+ if pp.Path[0] == 0 {
+ // "Abstract" Unix domain socket.
+ // Rewrite leading NUL as @ for textual display.
+ // (This is the standard convention.)
+ // Not friendly to overwrite in place,
+ // but the callers below don't care.
+ pp.Path[0] = '@'
+ }
+
+ // Assume path ends at NUL.
+ // This is not technically the Linux semantics for
+ // abstract Unix domain sockets--they are supposed
+ // to be uninterpreted fixed-size binary blobs--but
+ // everyone uses this convention.
+ n := 0
+ for n < len(pp.Path) && pp.Path[n] != 0 {
+ n++
+ }
+ bytes := (*[10000]byte)(unsafe.Pointer(&pp.Path[0]))[0:n]
+ sa.Name = string(bytes)
+ return sa, nil
+
+ case AF_INET:
+ pp := (*RawSockaddrInet4)(unsafe.Pointer(rsa))
+ sa := new(SockaddrInet4)
+ p := (*[2]byte)(unsafe.Pointer(&pp.Port))
+ sa.Port = int(p[0])<<8 + int(p[1])
+ for i := 0; i < len(sa.Addr); i++ {
+ sa.Addr[i] = pp.Addr[i]
+ }
+ return sa, nil
+
+ case AF_INET6:
+ pp := (*RawSockaddrInet6)(unsafe.Pointer(rsa))
+ sa := new(SockaddrInet6)
+ p := (*[2]byte)(unsafe.Pointer(&pp.Port))
+ sa.Port = int(p[0])<<8 + int(p[1])
+ sa.ZoneId = pp.Scope_id
+ for i := 0; i < len(sa.Addr); i++ {
+ sa.Addr[i] = pp.Addr[i]
+ }
+ return sa, nil
+ }
+ return nil, syscall.EAFNOSUPPORT
+}
+
+func Socket(domain, typ, proto int) (fd Handle, err error) {
+ if domain == AF_INET6 && SocketDisableIPv6 {
+ return InvalidHandle, syscall.EAFNOSUPPORT
+ }
+ return socket(int32(domain), int32(typ), int32(proto))
+}
+
+func SetsockoptInt(fd Handle, level, opt int, value int) (err error) {
+ v := int32(value)
+ return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&v)), int32(unsafe.Sizeof(v)))
+}
+
+func Bind(fd Handle, sa Sockaddr) (err error) {
+ ptr, n, err := sa.sockaddr()
+ if err != nil {
+ return err
+ }
+ return bind(fd, ptr, n)
+}
+
+func Connect(fd Handle, sa Sockaddr) (err error) {
+ ptr, n, err := sa.sockaddr()
+ if err != nil {
+ return err
+ }
+ return connect(fd, ptr, n)
+}
+
+func Getsockname(fd Handle) (sa Sockaddr, err error) {
+ var rsa RawSockaddrAny
+ l := int32(unsafe.Sizeof(rsa))
+ if err = getsockname(fd, &rsa, &l); err != nil {
+ return
+ }
+ return rsa.Sockaddr()
+}
+
+func Getpeername(fd Handle) (sa Sockaddr, err error) {
+ var rsa RawSockaddrAny
+ l := int32(unsafe.Sizeof(rsa))
+ if err = getpeername(fd, &rsa, &l); err != nil {
+ return
+ }
+ return rsa.Sockaddr()
+}
+
+func Listen(s Handle, n int) (err error) {
+ return listen(s, int32(n))
+}
+
+func Shutdown(fd Handle, how int) (err error) {
+ return shutdown(fd, int32(how))
+}
+
+func WSASendto(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to Sockaddr, overlapped *Overlapped, croutine *byte) (err error) {
+ rsa, l, err := to.sockaddr()
+ if err != nil {
+ return err
+ }
+ return WSASendTo(s, bufs, bufcnt, sent, flags, (*RawSockaddrAny)(unsafe.Pointer(rsa)), l, overlapped, croutine)
+}
+
+func LoadGetAddrInfo() error {
+ return procGetAddrInfoW.Find()
+}
+
+var connectExFunc struct {
+ once sync.Once
+ addr uintptr
+ err error
+}
+
+func LoadConnectEx() error {
+ connectExFunc.once.Do(func() {
+ var s Handle
+ s, connectExFunc.err = Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
+ if connectExFunc.err != nil {
+ return
+ }
+ defer CloseHandle(s)
+ var n uint32
+ connectExFunc.err = WSAIoctl(s,
+ SIO_GET_EXTENSION_FUNCTION_POINTER,
+ (*byte)(unsafe.Pointer(&WSAID_CONNECTEX)),
+ uint32(unsafe.Sizeof(WSAID_CONNECTEX)),
+ (*byte)(unsafe.Pointer(&connectExFunc.addr)),
+ uint32(unsafe.Sizeof(connectExFunc.addr)),
+ &n, nil, 0)
+ })
+ return connectExFunc.err
+}
+
+func connectEx(s Handle, name unsafe.Pointer, namelen int32, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) (err error) {
+ r1, _, e1 := syscall.Syscall9(connectExFunc.addr, 7, uintptr(s), uintptr(name), uintptr(namelen), uintptr(unsafe.Pointer(sendBuf)), uintptr(sendDataLen), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = error(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ConnectEx(fd Handle, sa Sockaddr, sendBuf *byte, sendDataLen uint32, bytesSent *uint32, overlapped *Overlapped) error {
+ err := LoadConnectEx()
+ if err != nil {
+ return errorspkg.New("failed to find ConnectEx: " + err.Error())
+ }
+ ptr, n, err := sa.sockaddr()
+ if err != nil {
+ return err
+ }
+ return connectEx(fd, ptr, n, sendBuf, sendDataLen, bytesSent, overlapped)
+}
+
+var sendRecvMsgFunc struct {
+ once sync.Once
+ sendAddr uintptr
+ recvAddr uintptr
+ err error
+}
+
+func loadWSASendRecvMsg() error {
+ sendRecvMsgFunc.once.Do(func() {
+ var s Handle
+ s, sendRecvMsgFunc.err = Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)
+ if sendRecvMsgFunc.err != nil {
+ return
+ }
+ defer CloseHandle(s)
+ var n uint32
+ sendRecvMsgFunc.err = WSAIoctl(s,
+ SIO_GET_EXTENSION_FUNCTION_POINTER,
+ (*byte)(unsafe.Pointer(&WSAID_WSARECVMSG)),
+ uint32(unsafe.Sizeof(WSAID_WSARECVMSG)),
+ (*byte)(unsafe.Pointer(&sendRecvMsgFunc.recvAddr)),
+ uint32(unsafe.Sizeof(sendRecvMsgFunc.recvAddr)),
+ &n, nil, 0)
+ if sendRecvMsgFunc.err != nil {
+ return
+ }
+ sendRecvMsgFunc.err = WSAIoctl(s,
+ SIO_GET_EXTENSION_FUNCTION_POINTER,
+ (*byte)(unsafe.Pointer(&WSAID_WSASENDMSG)),
+ uint32(unsafe.Sizeof(WSAID_WSASENDMSG)),
+ (*byte)(unsafe.Pointer(&sendRecvMsgFunc.sendAddr)),
+ uint32(unsafe.Sizeof(sendRecvMsgFunc.sendAddr)),
+ &n, nil, 0)
+ })
+ return sendRecvMsgFunc.err
+}
+
+func WSASendMsg(fd Handle, msg *WSAMsg, flags uint32, bytesSent *uint32, overlapped *Overlapped, croutine *byte) error {
+ err := loadWSASendRecvMsg()
+ if err != nil {
+ return err
+ }
+ r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.sendAddr, 6, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(flags), uintptr(unsafe.Pointer(bytesSent)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return err
+}
+
+func WSARecvMsg(fd Handle, msg *WSAMsg, bytesReceived *uint32, overlapped *Overlapped, croutine *byte) error {
+ err := loadWSASendRecvMsg()
+ if err != nil {
+ return err
+ }
+ r1, _, e1 := syscall.Syscall6(sendRecvMsgFunc.recvAddr, 5, uintptr(fd), uintptr(unsafe.Pointer(msg)), uintptr(unsafe.Pointer(bytesReceived)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return err
+}
+
+// Invented structures to support what package os expects.
+type Rusage struct {
+ CreationTime Filetime
+ ExitTime Filetime
+ KernelTime Filetime
+ UserTime Filetime
+}
+
+type WaitStatus struct {
+ ExitCode uint32
+}
+
+func (w WaitStatus) Exited() bool { return true }
+
+func (w WaitStatus) ExitStatus() int { return int(w.ExitCode) }
+
+func (w WaitStatus) Signal() Signal { return -1 }
+
+func (w WaitStatus) CoreDump() bool { return false }
+
+func (w WaitStatus) Stopped() bool { return false }
+
+func (w WaitStatus) Continued() bool { return false }
+
+func (w WaitStatus) StopSignal() Signal { return -1 }
+
+func (w WaitStatus) Signaled() bool { return false }
+
+func (w WaitStatus) TrapCause() int { return -1 }
+
+// Timespec is an invented structure on Windows, but here for
+// consistency with the corresponding package for other operating systems.
+type Timespec struct {
+ Sec int64
+ Nsec int64
+}
+
+func TimespecToNsec(ts Timespec) int64 { return int64(ts.Sec)*1e9 + int64(ts.Nsec) }
+
+func NsecToTimespec(nsec int64) (ts Timespec) {
+ ts.Sec = nsec / 1e9
+ ts.Nsec = nsec % 1e9
+ return
+}
+
+// TODO(brainman): fix all needed for net
+
+func Accept(fd Handle) (nfd Handle, sa Sockaddr, err error) { return 0, nil, syscall.EWINDOWS }
+func Recvfrom(fd Handle, p []byte, flags int) (n int, from Sockaddr, err error) {
+ return 0, nil, syscall.EWINDOWS
+}
+func Sendto(fd Handle, p []byte, flags int, to Sockaddr) (err error) { return syscall.EWINDOWS }
+func SetsockoptTimeval(fd Handle, level, opt int, tv *Timeval) (err error) { return syscall.EWINDOWS }
+
+// The Linger struct is wrong but we only noticed after Go 1.
+// sysLinger is the real system call structure.
+
+// BUG(brainman): The definition of Linger is not appropriate for direct use
+// with Setsockopt and Getsockopt.
+// Use SetsockoptLinger instead.
+
+type Linger struct {
+ Onoff int32
+ Linger int32
+}
+
+type sysLinger struct {
+ Onoff uint16
+ Linger uint16
+}
+
+type IPMreq struct {
+ Multiaddr [4]byte /* in_addr */
+ Interface [4]byte /* in_addr */
+}
+
+type IPv6Mreq struct {
+ Multiaddr [16]byte /* in6_addr */
+ Interface uint32
+}
+
+func GetsockoptInt(fd Handle, level, opt int) (int, error) { return -1, syscall.EWINDOWS }
+
+func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) {
+ sys := sysLinger{Onoff: uint16(l.Onoff), Linger: uint16(l.Linger)}
+ return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&sys)), int32(unsafe.Sizeof(sys)))
+}
+
+func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) {
+ return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4)
+}
+func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) {
+ return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq)))
+}
+func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) {
+ return syscall.EWINDOWS
+}
+
+func Getpid() (pid int) { return int(getCurrentProcessId()) }
+
+func FindFirstFile(name *uint16, data *Win32finddata) (handle Handle, err error) {
+ // NOTE(rsc): The Win32finddata struct is wrong for the system call:
+ // the two paths are each one uint16 short. Use the correct struct,
+ // a win32finddata1, and then copy the results out.
+ // There is no loss of expressivity here, because the final
+ // uint16, if it is used, is supposed to be a NUL, and Go doesn't need that.
+ // For Go 1.1, we might avoid the allocation of win32finddata1 here
+ // by adding a final Bug [2]uint16 field to the struct and then
+ // adjusting the fields in the result directly.
+ var data1 win32finddata1
+ handle, err = findFirstFile1(name, &data1)
+ if err == nil {
+ copyFindData(data, &data1)
+ }
+ return
+}
+
+func FindNextFile(handle Handle, data *Win32finddata) (err error) {
+ var data1 win32finddata1
+ err = findNextFile1(handle, &data1)
+ if err == nil {
+ copyFindData(data, &data1)
+ }
+ return
+}
+
+func getProcessEntry(pid int) (*ProcessEntry32, error) {
+ snapshot, err := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
+ if err != nil {
+ return nil, err
+ }
+ defer CloseHandle(snapshot)
+ var procEntry ProcessEntry32
+ procEntry.Size = uint32(unsafe.Sizeof(procEntry))
+ if err = Process32First(snapshot, &procEntry); err != nil {
+ return nil, err
+ }
+ for {
+ if procEntry.ProcessID == uint32(pid) {
+ return &procEntry, nil
+ }
+ err = Process32Next(snapshot, &procEntry)
+ if err != nil {
+ return nil, err
+ }
+ }
+}
+
+func Getppid() (ppid int) {
+ pe, err := getProcessEntry(Getpid())
+ if err != nil {
+ return -1
+ }
+ return int(pe.ParentProcessID)
+}
+
+// TODO(brainman): fix all needed for os
+func Fchdir(fd Handle) (err error) { return syscall.EWINDOWS }
+func Link(oldpath, newpath string) (err error) { return syscall.EWINDOWS }
+func Symlink(path, link string) (err error) { return syscall.EWINDOWS }
+
+func Fchmod(fd Handle, mode uint32) (err error) { return syscall.EWINDOWS }
+func Chown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
+func Lchown(path string, uid int, gid int) (err error) { return syscall.EWINDOWS }
+func Fchown(fd Handle, uid int, gid int) (err error) { return syscall.EWINDOWS }
+
+func Getuid() (uid int) { return -1 }
+func Geteuid() (euid int) { return -1 }
+func Getgid() (gid int) { return -1 }
+func Getegid() (egid int) { return -1 }
+func Getgroups() (gids []int, err error) { return nil, syscall.EWINDOWS }
+
+type Signal int
+
+func (s Signal) Signal() {}
+
+func (s Signal) String() string {
+ if 0 <= s && int(s) < len(signals) {
+ str := signals[s]
+ if str != "" {
+ return str
+ }
+ }
+ return "signal " + itoa(int(s))
+}
+
+func LoadCreateSymbolicLink() error {
+ return procCreateSymbolicLinkW.Find()
+}
+
+// Readlink returns the destination of the named symbolic link.
+func Readlink(path string, buf []byte) (n int, err error) {
+ fd, err := CreateFile(StringToUTF16Ptr(path), GENERIC_READ, 0, nil, OPEN_EXISTING,
+ FILE_FLAG_OPEN_REPARSE_POINT|FILE_FLAG_BACKUP_SEMANTICS, 0)
+ if err != nil {
+ return -1, err
+ }
+ defer CloseHandle(fd)
+
+ rdbbuf := make([]byte, MAXIMUM_REPARSE_DATA_BUFFER_SIZE)
+ var bytesReturned uint32
+ err = DeviceIoControl(fd, FSCTL_GET_REPARSE_POINT, nil, 0, &rdbbuf[0], uint32(len(rdbbuf)), &bytesReturned, nil)
+ if err != nil {
+ return -1, err
+ }
+
+ rdb := (*reparseDataBuffer)(unsafe.Pointer(&rdbbuf[0]))
+ var s string
+ switch rdb.ReparseTag {
+ case IO_REPARSE_TAG_SYMLINK:
+ data := (*symbolicLinkReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
+ p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
+ s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
+ case IO_REPARSE_TAG_MOUNT_POINT:
+ data := (*mountPointReparseBuffer)(unsafe.Pointer(&rdb.reparseBuffer))
+ p := (*[0xffff]uint16)(unsafe.Pointer(&data.PathBuffer[0]))
+ s = UTF16ToString(p[data.PrintNameOffset/2 : (data.PrintNameLength-data.PrintNameOffset)/2])
+ default:
+ // the path is not a symlink or junction but another type of reparse
+ // point
+ return -1, syscall.ENOENT
+ }
+ n = copy(buf, []byte(s))
+
+ return n, nil
+}
diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go
new file mode 100644
index 00000000000..141ca81bd74
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/types_windows.go
@@ -0,0 +1,1469 @@
+// 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 windows
+
+import "syscall"
+
+const (
+ // Windows errors.
+ ERROR_FILE_NOT_FOUND syscall.Errno = 2
+ ERROR_PATH_NOT_FOUND syscall.Errno = 3
+ ERROR_ACCESS_DENIED syscall.Errno = 5
+ ERROR_NO_MORE_FILES syscall.Errno = 18
+ ERROR_HANDLE_EOF syscall.Errno = 38
+ ERROR_NETNAME_DELETED syscall.Errno = 64
+ ERROR_FILE_EXISTS syscall.Errno = 80
+ ERROR_BROKEN_PIPE syscall.Errno = 109
+ ERROR_BUFFER_OVERFLOW syscall.Errno = 111
+ ERROR_INSUFFICIENT_BUFFER syscall.Errno = 122
+ ERROR_MOD_NOT_FOUND syscall.Errno = 126
+ ERROR_PROC_NOT_FOUND syscall.Errno = 127
+ ERROR_ALREADY_EXISTS syscall.Errno = 183
+ ERROR_ENVVAR_NOT_FOUND syscall.Errno = 203
+ ERROR_MORE_DATA syscall.Errno = 234
+ ERROR_OPERATION_ABORTED syscall.Errno = 995
+ ERROR_IO_PENDING syscall.Errno = 997
+ ERROR_SERVICE_SPECIFIC_ERROR syscall.Errno = 1066
+ ERROR_NOT_FOUND syscall.Errno = 1168
+ ERROR_PRIVILEGE_NOT_HELD syscall.Errno = 1314
+ WSAEACCES syscall.Errno = 10013
+ WSAEMSGSIZE syscall.Errno = 10040
+ WSAECONNRESET syscall.Errno = 10054
+)
+
+const (
+ // Invented values to support what package os expects.
+ O_RDONLY = 0x00000
+ O_WRONLY = 0x00001
+ O_RDWR = 0x00002
+ O_CREAT = 0x00040
+ O_EXCL = 0x00080
+ O_NOCTTY = 0x00100
+ O_TRUNC = 0x00200
+ O_NONBLOCK = 0x00800
+ O_APPEND = 0x00400
+ O_SYNC = 0x01000
+ O_ASYNC = 0x02000
+ O_CLOEXEC = 0x80000
+)
+
+const (
+ // More invented values for signals
+ SIGHUP = Signal(0x1)
+ SIGINT = Signal(0x2)
+ SIGQUIT = Signal(0x3)
+ SIGILL = Signal(0x4)
+ SIGTRAP = Signal(0x5)
+ SIGABRT = Signal(0x6)
+ SIGBUS = Signal(0x7)
+ SIGFPE = Signal(0x8)
+ SIGKILL = Signal(0x9)
+ SIGSEGV = Signal(0xb)
+ SIGPIPE = Signal(0xd)
+ SIGALRM = Signal(0xe)
+ SIGTERM = Signal(0xf)
+)
+
+var signals = [...]string{
+ 1: "hangup",
+ 2: "interrupt",
+ 3: "quit",
+ 4: "illegal instruction",
+ 5: "trace/breakpoint trap",
+ 6: "aborted",
+ 7: "bus error",
+ 8: "floating point exception",
+ 9: "killed",
+ 10: "user defined signal 1",
+ 11: "segmentation fault",
+ 12: "user defined signal 2",
+ 13: "broken pipe",
+ 14: "alarm clock",
+ 15: "terminated",
+}
+
+const (
+ GENERIC_READ = 0x80000000
+ GENERIC_WRITE = 0x40000000
+ GENERIC_EXECUTE = 0x20000000
+ GENERIC_ALL = 0x10000000
+
+ FILE_LIST_DIRECTORY = 0x00000001
+ FILE_APPEND_DATA = 0x00000004
+ FILE_WRITE_ATTRIBUTES = 0x00000100
+
+ FILE_SHARE_READ = 0x00000001
+ FILE_SHARE_WRITE = 0x00000002
+ FILE_SHARE_DELETE = 0x00000004
+
+ FILE_ATTRIBUTE_READONLY = 0x00000001
+ FILE_ATTRIBUTE_HIDDEN = 0x00000002
+ FILE_ATTRIBUTE_SYSTEM = 0x00000004
+ FILE_ATTRIBUTE_DIRECTORY = 0x00000010
+ FILE_ATTRIBUTE_ARCHIVE = 0x00000020
+ FILE_ATTRIBUTE_DEVICE = 0x00000040
+ FILE_ATTRIBUTE_NORMAL = 0x00000080
+ FILE_ATTRIBUTE_TEMPORARY = 0x00000100
+ FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200
+ FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400
+ FILE_ATTRIBUTE_COMPRESSED = 0x00000800
+ FILE_ATTRIBUTE_OFFLINE = 0x00001000
+ FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000
+ FILE_ATTRIBUTE_ENCRYPTED = 0x00004000
+ FILE_ATTRIBUTE_INTEGRITY_STREAM = 0x00008000
+ FILE_ATTRIBUTE_VIRTUAL = 0x00010000
+ FILE_ATTRIBUTE_NO_SCRUB_DATA = 0x00020000
+ FILE_ATTRIBUTE_RECALL_ON_OPEN = 0x00040000
+ FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS = 0x00400000
+
+ INVALID_FILE_ATTRIBUTES = 0xffffffff
+
+ CREATE_NEW = 1
+ CREATE_ALWAYS = 2
+ OPEN_EXISTING = 3
+ OPEN_ALWAYS = 4
+ TRUNCATE_EXISTING = 5
+
+ FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000
+ FILE_FLAG_BACKUP_SEMANTICS = 0x02000000
+ FILE_FLAG_OVERLAPPED = 0x40000000
+
+ HANDLE_FLAG_INHERIT = 0x00000001
+ STARTF_USESTDHANDLES = 0x00000100
+ STARTF_USESHOWWINDOW = 0x00000001
+ DUPLICATE_CLOSE_SOURCE = 0x00000001
+ DUPLICATE_SAME_ACCESS = 0x00000002
+
+ STD_INPUT_HANDLE = -10 & (1<<32 - 1)
+ STD_OUTPUT_HANDLE = -11 & (1<<32 - 1)
+ STD_ERROR_HANDLE = -12 & (1<<32 - 1)
+
+ FILE_BEGIN = 0
+ FILE_CURRENT = 1
+ FILE_END = 2
+
+ LANG_ENGLISH = 0x09
+ SUBLANG_ENGLISH_US = 0x01
+
+ FORMAT_MESSAGE_ALLOCATE_BUFFER = 256
+ FORMAT_MESSAGE_IGNORE_INSERTS = 512
+ FORMAT_MESSAGE_FROM_STRING = 1024
+ FORMAT_MESSAGE_FROM_HMODULE = 2048
+ FORMAT_MESSAGE_FROM_SYSTEM = 4096
+ FORMAT_MESSAGE_ARGUMENT_ARRAY = 8192
+ FORMAT_MESSAGE_MAX_WIDTH_MASK = 255
+
+ MAX_PATH = 260
+ MAX_LONG_PATH = 32768
+
+ MAX_COMPUTERNAME_LENGTH = 15
+
+ TIME_ZONE_ID_UNKNOWN = 0
+ TIME_ZONE_ID_STANDARD = 1
+
+ TIME_ZONE_ID_DAYLIGHT = 2
+ IGNORE = 0
+ INFINITE = 0xffffffff
+
+ WAIT_TIMEOUT = 258
+ WAIT_ABANDONED = 0x00000080
+ WAIT_OBJECT_0 = 0x00000000
+ WAIT_FAILED = 0xFFFFFFFF
+
+ PROCESS_TERMINATE = 1
+ PROCESS_QUERY_INFORMATION = 0x00000400
+ SYNCHRONIZE = 0x00100000
+
+ FILE_MAP_COPY = 0x01
+ FILE_MAP_WRITE = 0x02
+ FILE_MAP_READ = 0x04
+ FILE_MAP_EXECUTE = 0x20
+
+ CTRL_C_EVENT = 0
+ CTRL_BREAK_EVENT = 1
+
+ // Windows reserves errors >= 1<<29 for application use.
+ APPLICATION_ERROR = 1 << 29
+)
+
+const (
+ // Process creation flags.
+ CREATE_BREAKAWAY_FROM_JOB = 0x01000000
+ CREATE_DEFAULT_ERROR_MODE = 0x04000000
+ CREATE_NEW_CONSOLE = 0x00000010
+ CREATE_NEW_PROCESS_GROUP = 0x00000200
+ CREATE_NO_WINDOW = 0x08000000
+ CREATE_PROTECTED_PROCESS = 0x00040000
+ CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000
+ CREATE_SEPARATE_WOW_VDM = 0x00000800
+ CREATE_SHARED_WOW_VDM = 0x00001000
+ CREATE_SUSPENDED = 0x00000004
+ CREATE_UNICODE_ENVIRONMENT = 0x00000400
+ DEBUG_ONLY_THIS_PROCESS = 0x00000002
+ DEBUG_PROCESS = 0x00000001
+ DETACHED_PROCESS = 0x00000008
+ EXTENDED_STARTUPINFO_PRESENT = 0x00080000
+ INHERIT_PARENT_AFFINITY = 0x00010000
+)
+
+const (
+ // flags for CreateToolhelp32Snapshot
+ TH32CS_SNAPHEAPLIST = 0x01
+ TH32CS_SNAPPROCESS = 0x02
+ TH32CS_SNAPTHREAD = 0x04
+ TH32CS_SNAPMODULE = 0x08
+ TH32CS_SNAPMODULE32 = 0x10
+ TH32CS_SNAPALL = TH32CS_SNAPHEAPLIST | TH32CS_SNAPMODULE | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD
+ TH32CS_INHERIT = 0x80000000
+)
+
+const (
+ // filters for ReadDirectoryChangesW
+ FILE_NOTIFY_CHANGE_FILE_NAME = 0x001
+ FILE_NOTIFY_CHANGE_DIR_NAME = 0x002
+ FILE_NOTIFY_CHANGE_ATTRIBUTES = 0x004
+ FILE_NOTIFY_CHANGE_SIZE = 0x008
+ FILE_NOTIFY_CHANGE_LAST_WRITE = 0x010
+ FILE_NOTIFY_CHANGE_LAST_ACCESS = 0x020
+ FILE_NOTIFY_CHANGE_CREATION = 0x040
+ FILE_NOTIFY_CHANGE_SECURITY = 0x100
+)
+
+const (
+ // do not reorder
+ FILE_ACTION_ADDED = iota + 1
+ FILE_ACTION_REMOVED
+ FILE_ACTION_MODIFIED
+ FILE_ACTION_RENAMED_OLD_NAME
+ FILE_ACTION_RENAMED_NEW_NAME
+)
+
+const (
+ // wincrypt.h
+ PROV_RSA_FULL = 1
+ PROV_RSA_SIG = 2
+ PROV_DSS = 3
+ PROV_FORTEZZA = 4
+ PROV_MS_EXCHANGE = 5
+ PROV_SSL = 6
+ PROV_RSA_SCHANNEL = 12
+ PROV_DSS_DH = 13
+ PROV_EC_ECDSA_SIG = 14
+ PROV_EC_ECNRA_SIG = 15
+ PROV_EC_ECDSA_FULL = 16
+ PROV_EC_ECNRA_FULL = 17
+ PROV_DH_SCHANNEL = 18
+ PROV_SPYRUS_LYNKS = 20
+ PROV_RNG = 21
+ PROV_INTEL_SEC = 22
+ PROV_REPLACE_OWF = 23
+ PROV_RSA_AES = 24
+ CRYPT_VERIFYCONTEXT = 0xF0000000
+ CRYPT_NEWKEYSET = 0x00000008
+ CRYPT_DELETEKEYSET = 0x00000010
+ CRYPT_MACHINE_KEYSET = 0x00000020
+ CRYPT_SILENT = 0x00000040
+ CRYPT_DEFAULT_CONTAINER_OPTIONAL = 0x00000080
+
+ USAGE_MATCH_TYPE_AND = 0
+ USAGE_MATCH_TYPE_OR = 1
+
+ /* msgAndCertEncodingType values for CertOpenStore function */
+ X509_ASN_ENCODING = 0x00000001
+ PKCS_7_ASN_ENCODING = 0x00010000
+
+ /* storeProvider values for CertOpenStore function */
+ CERT_STORE_PROV_MSG = 1
+ CERT_STORE_PROV_MEMORY = 2
+ CERT_STORE_PROV_FILE = 3
+ CERT_STORE_PROV_REG = 4
+ CERT_STORE_PROV_PKCS7 = 5
+ CERT_STORE_PROV_SERIALIZED = 6
+ CERT_STORE_PROV_FILENAME_A = 7
+ CERT_STORE_PROV_FILENAME_W = 8
+ CERT_STORE_PROV_FILENAME = CERT_STORE_PROV_FILENAME_W
+ CERT_STORE_PROV_SYSTEM_A = 9
+ CERT_STORE_PROV_SYSTEM_W = 10
+ CERT_STORE_PROV_SYSTEM = CERT_STORE_PROV_SYSTEM_W
+ CERT_STORE_PROV_COLLECTION = 11
+ CERT_STORE_PROV_SYSTEM_REGISTRY_A = 12
+ CERT_STORE_PROV_SYSTEM_REGISTRY_W = 13
+ CERT_STORE_PROV_SYSTEM_REGISTRY = CERT_STORE_PROV_SYSTEM_REGISTRY_W
+ CERT_STORE_PROV_PHYSICAL_W = 14
+ CERT_STORE_PROV_PHYSICAL = CERT_STORE_PROV_PHYSICAL_W
+ CERT_STORE_PROV_SMART_CARD_W = 15
+ CERT_STORE_PROV_SMART_CARD = CERT_STORE_PROV_SMART_CARD_W
+ CERT_STORE_PROV_LDAP_W = 16
+ CERT_STORE_PROV_LDAP = CERT_STORE_PROV_LDAP_W
+ CERT_STORE_PROV_PKCS12 = 17
+
+ /* store characteristics (low WORD of flag) for CertOpenStore function */
+ CERT_STORE_NO_CRYPT_RELEASE_FLAG = 0x00000001
+ CERT_STORE_SET_LOCALIZED_NAME_FLAG = 0x00000002
+ CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG = 0x00000004
+ CERT_STORE_DELETE_FLAG = 0x00000010
+ CERT_STORE_UNSAFE_PHYSICAL_FLAG = 0x00000020
+ CERT_STORE_SHARE_STORE_FLAG = 0x00000040
+ CERT_STORE_SHARE_CONTEXT_FLAG = 0x00000080
+ CERT_STORE_MANIFOLD_FLAG = 0x00000100
+ CERT_STORE_ENUM_ARCHIVED_FLAG = 0x00000200
+ CERT_STORE_UPDATE_KEYID_FLAG = 0x00000400
+ CERT_STORE_BACKUP_RESTORE_FLAG = 0x00000800
+ CERT_STORE_MAXIMUM_ALLOWED_FLAG = 0x00001000
+ CERT_STORE_CREATE_NEW_FLAG = 0x00002000
+ CERT_STORE_OPEN_EXISTING_FLAG = 0x00004000
+ CERT_STORE_READONLY_FLAG = 0x00008000
+
+ /* store locations (high WORD of flag) for CertOpenStore function */
+ CERT_SYSTEM_STORE_CURRENT_USER = 0x00010000
+ CERT_SYSTEM_STORE_LOCAL_MACHINE = 0x00020000
+ CERT_SYSTEM_STORE_CURRENT_SERVICE = 0x00040000
+ CERT_SYSTEM_STORE_SERVICES = 0x00050000
+ CERT_SYSTEM_STORE_USERS = 0x00060000
+ CERT_SYSTEM_STORE_CURRENT_USER_GROUP_POLICY = 0x00070000
+ CERT_SYSTEM_STORE_LOCAL_MACHINE_GROUP_POLICY = 0x00080000
+ CERT_SYSTEM_STORE_LOCAL_MACHINE_ENTERPRISE = 0x00090000
+ CERT_SYSTEM_STORE_UNPROTECTED_FLAG = 0x40000000
+ CERT_SYSTEM_STORE_RELOCATE_FLAG = 0x80000000
+
+ /* Miscellaneous high-WORD flags for CertOpenStore function */
+ CERT_REGISTRY_STORE_REMOTE_FLAG = 0x00010000
+ CERT_REGISTRY_STORE_SERIALIZED_FLAG = 0x00020000
+ CERT_REGISTRY_STORE_ROAMING_FLAG = 0x00040000
+ CERT_REGISTRY_STORE_MY_IE_DIRTY_FLAG = 0x00080000
+ CERT_REGISTRY_STORE_LM_GPT_FLAG = 0x01000000
+ CERT_REGISTRY_STORE_CLIENT_GPT_FLAG = 0x80000000
+ CERT_FILE_STORE_COMMIT_ENABLE_FLAG = 0x00010000
+ CERT_LDAP_STORE_SIGN_FLAG = 0x00010000
+ CERT_LDAP_STORE_AREC_EXCLUSIVE_FLAG = 0x00020000
+ CERT_LDAP_STORE_OPENED_FLAG = 0x00040000
+ CERT_LDAP_STORE_UNBIND_FLAG = 0x00080000
+
+ /* addDisposition values for CertAddCertificateContextToStore function */
+ CERT_STORE_ADD_NEW = 1
+ CERT_STORE_ADD_USE_EXISTING = 2
+ CERT_STORE_ADD_REPLACE_EXISTING = 3
+ CERT_STORE_ADD_ALWAYS = 4
+ CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5
+ CERT_STORE_ADD_NEWER = 6
+ CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7
+
+ /* ErrorStatus values for CertTrustStatus struct */
+ CERT_TRUST_NO_ERROR = 0x00000000
+ CERT_TRUST_IS_NOT_TIME_VALID = 0x00000001
+ CERT_TRUST_IS_REVOKED = 0x00000004
+ CERT_TRUST_IS_NOT_SIGNATURE_VALID = 0x00000008
+ CERT_TRUST_IS_NOT_VALID_FOR_USAGE = 0x00000010
+ CERT_TRUST_IS_UNTRUSTED_ROOT = 0x00000020
+ CERT_TRUST_REVOCATION_STATUS_UNKNOWN = 0x00000040
+ CERT_TRUST_IS_CYCLIC = 0x00000080
+ CERT_TRUST_INVALID_EXTENSION = 0x00000100
+ CERT_TRUST_INVALID_POLICY_CONSTRAINTS = 0x00000200
+ CERT_TRUST_INVALID_BASIC_CONSTRAINTS = 0x00000400
+ CERT_TRUST_INVALID_NAME_CONSTRAINTS = 0x00000800
+ CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT = 0x00001000
+ CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT = 0x00002000
+ CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT = 0x00004000
+ CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT = 0x00008000
+ CERT_TRUST_IS_PARTIAL_CHAIN = 0x00010000
+ CERT_TRUST_CTL_IS_NOT_TIME_VALID = 0x00020000
+ CERT_TRUST_CTL_IS_NOT_SIGNATURE_VALID = 0x00040000
+ CERT_TRUST_CTL_IS_NOT_VALID_FOR_USAGE = 0x00080000
+ CERT_TRUST_HAS_WEAK_SIGNATURE = 0x00100000
+ CERT_TRUST_IS_OFFLINE_REVOCATION = 0x01000000
+ CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY = 0x02000000
+ CERT_TRUST_IS_EXPLICIT_DISTRUST = 0x04000000
+ CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT = 0x08000000
+
+ /* InfoStatus values for CertTrustStatus struct */
+ CERT_TRUST_HAS_EXACT_MATCH_ISSUER = 0x00000001
+ CERT_TRUST_HAS_KEY_MATCH_ISSUER = 0x00000002
+ CERT_TRUST_HAS_NAME_MATCH_ISSUER = 0x00000004
+ CERT_TRUST_IS_SELF_SIGNED = 0x00000008
+ CERT_TRUST_HAS_PREFERRED_ISSUER = 0x00000100
+ CERT_TRUST_HAS_ISSUANCE_CHAIN_POLICY = 0x00000400
+ CERT_TRUST_HAS_VALID_NAME_CONSTRAINTS = 0x00000400
+ CERT_TRUST_IS_PEER_TRUSTED = 0x00000800
+ CERT_TRUST_HAS_CRL_VALIDITY_EXTENDED = 0x00001000
+ CERT_TRUST_IS_FROM_EXCLUSIVE_TRUST_STORE = 0x00002000
+ CERT_TRUST_IS_CA_TRUSTED = 0x00004000
+ CERT_TRUST_IS_COMPLEX_CHAIN = 0x00010000
+
+ /* policyOID values for CertVerifyCertificateChainPolicy function */
+ CERT_CHAIN_POLICY_BASE = 1
+ CERT_CHAIN_POLICY_AUTHENTICODE = 2
+ CERT_CHAIN_POLICY_AUTHENTICODE_TS = 3
+ CERT_CHAIN_POLICY_SSL = 4
+ CERT_CHAIN_POLICY_BASIC_CONSTRAINTS = 5
+ CERT_CHAIN_POLICY_NT_AUTH = 6
+ CERT_CHAIN_POLICY_MICROSOFT_ROOT = 7
+ CERT_CHAIN_POLICY_EV = 8
+ CERT_CHAIN_POLICY_SSL_F12 = 9
+
+ CERT_E_EXPIRED = 0x800B0101
+ CERT_E_ROLE = 0x800B0103
+ CERT_E_PURPOSE = 0x800B0106
+ CERT_E_UNTRUSTEDROOT = 0x800B0109
+ CERT_E_CN_NO_MATCH = 0x800B010F
+
+ /* AuthType values for SSLExtraCertChainPolicyPara struct */
+ AUTHTYPE_CLIENT = 1
+ AUTHTYPE_SERVER = 2
+
+ /* Checks values for SSLExtraCertChainPolicyPara struct */
+ SECURITY_FLAG_IGNORE_REVOCATION = 0x00000080
+ SECURITY_FLAG_IGNORE_UNKNOWN_CA = 0x00000100
+ SECURITY_FLAG_IGNORE_WRONG_USAGE = 0x00000200
+ SECURITY_FLAG_IGNORE_CERT_CN_INVALID = 0x00001000
+ SECURITY_FLAG_IGNORE_CERT_DATE_INVALID = 0x00002000
+)
+
+var (
+ OID_PKIX_KP_SERVER_AUTH = []byte("1.3.6.1.5.5.7.3.1\x00")
+ OID_SERVER_GATED_CRYPTO = []byte("1.3.6.1.4.1.311.10.3.3\x00")
+ OID_SGC_NETSCAPE = []byte("2.16.840.1.113730.4.1\x00")
+)
+
+// Pointer represents a pointer to an arbitrary Windows type.
+//
+// Pointer-typed fields may point to one of many different types. It's
+// up to the caller to provide a pointer to the appropriate type, cast
+// to Pointer. The caller must obey the unsafe.Pointer rules while
+// doing so.
+type Pointer *struct{}
+
+// Invented values to support what package os expects.
+type Timeval struct {
+ Sec int32
+ Usec int32
+}
+
+func (tv *Timeval) Nanoseconds() int64 {
+ return (int64(tv.Sec)*1e6 + int64(tv.Usec)) * 1e3
+}
+
+func NsecToTimeval(nsec int64) (tv Timeval) {
+ tv.Sec = int32(nsec / 1e9)
+ tv.Usec = int32(nsec % 1e9 / 1e3)
+ return
+}
+
+type SecurityAttributes struct {
+ Length uint32
+ SecurityDescriptor uintptr
+ InheritHandle uint32
+}
+
+type Overlapped struct {
+ Internal uintptr
+ InternalHigh uintptr
+ Offset uint32
+ OffsetHigh uint32
+ HEvent Handle
+}
+
+type FileNotifyInformation struct {
+ NextEntryOffset uint32
+ Action uint32
+ FileNameLength uint32
+ FileName uint16
+}
+
+type Filetime struct {
+ LowDateTime uint32
+ HighDateTime uint32
+}
+
+// Nanoseconds returns Filetime ft in nanoseconds
+// since Epoch (00:00:00 UTC, January 1, 1970).
+func (ft *Filetime) Nanoseconds() int64 {
+ // 100-nanosecond intervals since January 1, 1601
+ nsec := int64(ft.HighDateTime)<<32 + int64(ft.LowDateTime)
+ // change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
+ nsec -= 116444736000000000
+ // convert into nanoseconds
+ nsec *= 100
+ return nsec
+}
+
+func NsecToFiletime(nsec int64) (ft Filetime) {
+ // convert into 100-nanosecond
+ nsec /= 100
+ // change starting time to January 1, 1601
+ nsec += 116444736000000000
+ // split into high / low
+ ft.LowDateTime = uint32(nsec & 0xffffffff)
+ ft.HighDateTime = uint32(nsec >> 32 & 0xffffffff)
+ return ft
+}
+
+type Win32finddata struct {
+ FileAttributes uint32
+ CreationTime Filetime
+ LastAccessTime Filetime
+ LastWriteTime Filetime
+ FileSizeHigh uint32
+ FileSizeLow uint32
+ Reserved0 uint32
+ Reserved1 uint32
+ FileName [MAX_PATH - 1]uint16
+ AlternateFileName [13]uint16
+}
+
+// This is the actual system call structure.
+// Win32finddata is what we committed to in Go 1.
+type win32finddata1 struct {
+ FileAttributes uint32
+ CreationTime Filetime
+ LastAccessTime Filetime
+ LastWriteTime Filetime
+ FileSizeHigh uint32
+ FileSizeLow uint32
+ Reserved0 uint32
+ Reserved1 uint32
+ FileName [MAX_PATH]uint16
+ AlternateFileName [14]uint16
+}
+
+func copyFindData(dst *Win32finddata, src *win32finddata1) {
+ dst.FileAttributes = src.FileAttributes
+ dst.CreationTime = src.CreationTime
+ dst.LastAccessTime = src.LastAccessTime
+ dst.LastWriteTime = src.LastWriteTime
+ dst.FileSizeHigh = src.FileSizeHigh
+ dst.FileSizeLow = src.FileSizeLow
+ dst.Reserved0 = src.Reserved0
+ dst.Reserved1 = src.Reserved1
+
+ // The src is 1 element bigger than dst, but it must be NUL.
+ copy(dst.FileName[:], src.FileName[:])
+ copy(dst.AlternateFileName[:], src.AlternateFileName[:])
+}
+
+type ByHandleFileInformation struct {
+ FileAttributes uint32
+ CreationTime Filetime
+ LastAccessTime Filetime
+ LastWriteTime Filetime
+ VolumeSerialNumber uint32
+ FileSizeHigh uint32
+ FileSizeLow uint32
+ NumberOfLinks uint32
+ FileIndexHigh uint32
+ FileIndexLow uint32
+}
+
+const (
+ GetFileExInfoStandard = 0
+ GetFileExMaxInfoLevel = 1
+)
+
+type Win32FileAttributeData struct {
+ FileAttributes uint32
+ CreationTime Filetime
+ LastAccessTime Filetime
+ LastWriteTime Filetime
+ FileSizeHigh uint32
+ FileSizeLow uint32
+}
+
+// ShowWindow constants
+const (
+ // winuser.h
+ SW_HIDE = 0
+ SW_NORMAL = 1
+ SW_SHOWNORMAL = 1
+ SW_SHOWMINIMIZED = 2
+ SW_SHOWMAXIMIZED = 3
+ SW_MAXIMIZE = 3
+ SW_SHOWNOACTIVATE = 4
+ SW_SHOW = 5
+ SW_MINIMIZE = 6
+ SW_SHOWMINNOACTIVE = 7
+ SW_SHOWNA = 8
+ SW_RESTORE = 9
+ SW_SHOWDEFAULT = 10
+ SW_FORCEMINIMIZE = 11
+)
+
+type StartupInfo struct {
+ Cb uint32
+ _ *uint16
+ Desktop *uint16
+ Title *uint16
+ X uint32
+ Y uint32
+ XSize uint32
+ YSize uint32
+ XCountChars uint32
+ YCountChars uint32
+ FillAttribute uint32
+ Flags uint32
+ ShowWindow uint16
+ _ uint16
+ _ *byte
+ StdInput Handle
+ StdOutput Handle
+ StdErr Handle
+}
+
+type ProcessInformation struct {
+ Process Handle
+ Thread Handle
+ ProcessId uint32
+ ThreadId uint32
+}
+
+type ProcessEntry32 struct {
+ Size uint32
+ Usage uint32
+ ProcessID uint32
+ DefaultHeapID uintptr
+ ModuleID uint32
+ Threads uint32
+ ParentProcessID uint32
+ PriClassBase int32
+ Flags uint32
+ ExeFile [MAX_PATH]uint16
+}
+
+type Systemtime struct {
+ Year uint16
+ Month uint16
+ DayOfWeek uint16
+ Day uint16
+ Hour uint16
+ Minute uint16
+ Second uint16
+ Milliseconds uint16
+}
+
+type Timezoneinformation struct {
+ Bias int32
+ StandardName [32]uint16
+ StandardDate Systemtime
+ StandardBias int32
+ DaylightName [32]uint16
+ DaylightDate Systemtime
+ DaylightBias int32
+}
+
+// Socket related.
+
+const (
+ AF_UNSPEC = 0
+ AF_UNIX = 1
+ AF_INET = 2
+ AF_INET6 = 23
+ AF_NETBIOS = 17
+
+ SOCK_STREAM = 1
+ SOCK_DGRAM = 2
+ SOCK_RAW = 3
+ SOCK_SEQPACKET = 5
+
+ IPPROTO_IP = 0
+ IPPROTO_IPV6 = 0x29
+ IPPROTO_TCP = 6
+ IPPROTO_UDP = 17
+
+ SOL_SOCKET = 0xffff
+ SO_REUSEADDR = 4
+ SO_KEEPALIVE = 8
+ SO_DONTROUTE = 16
+ SO_BROADCAST = 32
+ SO_LINGER = 128
+ SO_RCVBUF = 0x1002
+ SO_SNDBUF = 0x1001
+ SO_UPDATE_ACCEPT_CONTEXT = 0x700b
+ SO_UPDATE_CONNECT_CONTEXT = 0x7010
+
+ IOC_OUT = 0x40000000
+ IOC_IN = 0x80000000
+ IOC_VENDOR = 0x18000000
+ IOC_INOUT = IOC_IN | IOC_OUT
+ IOC_WS2 = 0x08000000
+ SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6
+ SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4
+ SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12
+
+ // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460
+
+ IP_TOS = 0x3
+ IP_TTL = 0x4
+ IP_MULTICAST_IF = 0x9
+ IP_MULTICAST_TTL = 0xa
+ IP_MULTICAST_LOOP = 0xb
+ IP_ADD_MEMBERSHIP = 0xc
+ IP_DROP_MEMBERSHIP = 0xd
+
+ IPV6_V6ONLY = 0x1b
+ IPV6_UNICAST_HOPS = 0x4
+ IPV6_MULTICAST_IF = 0x9
+ IPV6_MULTICAST_HOPS = 0xa
+ IPV6_MULTICAST_LOOP = 0xb
+ IPV6_JOIN_GROUP = 0xc
+ IPV6_LEAVE_GROUP = 0xd
+
+ MSG_OOB = 0x1
+ MSG_PEEK = 0x2
+ MSG_DONTROUTE = 0x4
+ MSG_WAITALL = 0x8
+
+ MSG_TRUNC = 0x0100
+ MSG_CTRUNC = 0x0200
+ MSG_BCAST = 0x0400
+ MSG_MCAST = 0x0800
+
+ SOMAXCONN = 0x7fffffff
+
+ TCP_NODELAY = 1
+
+ SHUT_RD = 0
+ SHUT_WR = 1
+ SHUT_RDWR = 2
+
+ WSADESCRIPTION_LEN = 256
+ WSASYS_STATUS_LEN = 128
+)
+
+type WSABuf struct {
+ Len uint32
+ Buf *byte
+}
+
+type WSAMsg struct {
+ Name *syscall.RawSockaddrAny
+ Namelen int32
+ Buffers *WSABuf
+ BufferCount uint32
+ Control WSABuf
+ Flags uint32
+}
+
+// Invented values to support what package os expects.
+const (
+ S_IFMT = 0x1f000
+ S_IFIFO = 0x1000
+ S_IFCHR = 0x2000
+ S_IFDIR = 0x4000
+ S_IFBLK = 0x6000
+ S_IFREG = 0x8000
+ S_IFLNK = 0xa000
+ S_IFSOCK = 0xc000
+ S_ISUID = 0x800
+ S_ISGID = 0x400
+ S_ISVTX = 0x200
+ S_IRUSR = 0x100
+ S_IWRITE = 0x80
+ S_IWUSR = 0x80
+ S_IXUSR = 0x40
+)
+
+const (
+ FILE_TYPE_CHAR = 0x0002
+ FILE_TYPE_DISK = 0x0001
+ FILE_TYPE_PIPE = 0x0003
+ FILE_TYPE_REMOTE = 0x8000
+ FILE_TYPE_UNKNOWN = 0x0000
+)
+
+type Hostent struct {
+ Name *byte
+ Aliases **byte
+ AddrType uint16
+ Length uint16
+ AddrList **byte
+}
+
+type Protoent struct {
+ Name *byte
+ Aliases **byte
+ Proto uint16
+}
+
+const (
+ DNS_TYPE_A = 0x0001
+ DNS_TYPE_NS = 0x0002
+ DNS_TYPE_MD = 0x0003
+ DNS_TYPE_MF = 0x0004
+ DNS_TYPE_CNAME = 0x0005
+ DNS_TYPE_SOA = 0x0006
+ DNS_TYPE_MB = 0x0007
+ DNS_TYPE_MG = 0x0008
+ DNS_TYPE_MR = 0x0009
+ DNS_TYPE_NULL = 0x000a
+ DNS_TYPE_WKS = 0x000b
+ DNS_TYPE_PTR = 0x000c
+ DNS_TYPE_HINFO = 0x000d
+ DNS_TYPE_MINFO = 0x000e
+ DNS_TYPE_MX = 0x000f
+ DNS_TYPE_TEXT = 0x0010
+ DNS_TYPE_RP = 0x0011
+ DNS_TYPE_AFSDB = 0x0012
+ DNS_TYPE_X25 = 0x0013
+ DNS_TYPE_ISDN = 0x0014
+ DNS_TYPE_RT = 0x0015
+ DNS_TYPE_NSAP = 0x0016
+ DNS_TYPE_NSAPPTR = 0x0017
+ DNS_TYPE_SIG = 0x0018
+ DNS_TYPE_KEY = 0x0019
+ DNS_TYPE_PX = 0x001a
+ DNS_TYPE_GPOS = 0x001b
+ DNS_TYPE_AAAA = 0x001c
+ DNS_TYPE_LOC = 0x001d
+ DNS_TYPE_NXT = 0x001e
+ DNS_TYPE_EID = 0x001f
+ DNS_TYPE_NIMLOC = 0x0020
+ DNS_TYPE_SRV = 0x0021
+ DNS_TYPE_ATMA = 0x0022
+ DNS_TYPE_NAPTR = 0x0023
+ DNS_TYPE_KX = 0x0024
+ DNS_TYPE_CERT = 0x0025
+ DNS_TYPE_A6 = 0x0026
+ DNS_TYPE_DNAME = 0x0027
+ DNS_TYPE_SINK = 0x0028
+ DNS_TYPE_OPT = 0x0029
+ DNS_TYPE_DS = 0x002B
+ DNS_TYPE_RRSIG = 0x002E
+ DNS_TYPE_NSEC = 0x002F
+ DNS_TYPE_DNSKEY = 0x0030
+ DNS_TYPE_DHCID = 0x0031
+ DNS_TYPE_UINFO = 0x0064
+ DNS_TYPE_UID = 0x0065
+ DNS_TYPE_GID = 0x0066
+ DNS_TYPE_UNSPEC = 0x0067
+ DNS_TYPE_ADDRS = 0x00f8
+ DNS_TYPE_TKEY = 0x00f9
+ DNS_TYPE_TSIG = 0x00fa
+ DNS_TYPE_IXFR = 0x00fb
+ DNS_TYPE_AXFR = 0x00fc
+ DNS_TYPE_MAILB = 0x00fd
+ DNS_TYPE_MAILA = 0x00fe
+ DNS_TYPE_ALL = 0x00ff
+ DNS_TYPE_ANY = 0x00ff
+ DNS_TYPE_WINS = 0xff01
+ DNS_TYPE_WINSR = 0xff02
+ DNS_TYPE_NBSTAT = 0xff01
+)
+
+const (
+ DNS_INFO_NO_RECORDS = 0x251D
+)
+
+const (
+ // flags inside DNSRecord.Dw
+ DnsSectionQuestion = 0x0000
+ DnsSectionAnswer = 0x0001
+ DnsSectionAuthority = 0x0002
+ DnsSectionAdditional = 0x0003
+)
+
+type DNSSRVData struct {
+ Target *uint16
+ Priority uint16
+ Weight uint16
+ Port uint16
+ Pad uint16
+}
+
+type DNSPTRData struct {
+ Host *uint16
+}
+
+type DNSMXData struct {
+ NameExchange *uint16
+ Preference uint16
+ Pad uint16
+}
+
+type DNSTXTData struct {
+ StringCount uint16
+ StringArray [1]*uint16
+}
+
+type DNSRecord struct {
+ Next *DNSRecord
+ Name *uint16
+ Type uint16
+ Length uint16
+ Dw uint32
+ Ttl uint32
+ Reserved uint32
+ Data [40]byte
+}
+
+const (
+ TF_DISCONNECT = 1
+ TF_REUSE_SOCKET = 2
+ TF_WRITE_BEHIND = 4
+ TF_USE_DEFAULT_WORKER = 0
+ TF_USE_SYSTEM_THREAD = 16
+ TF_USE_KERNEL_APC = 32
+)
+
+type TransmitFileBuffers struct {
+ Head uintptr
+ HeadLength uint32
+ Tail uintptr
+ TailLength uint32
+}
+
+const (
+ IFF_UP = 1
+ IFF_BROADCAST = 2
+ IFF_LOOPBACK = 4
+ IFF_POINTTOPOINT = 8
+ IFF_MULTICAST = 16
+)
+
+const SIO_GET_INTERFACE_LIST = 0x4004747F
+
+// TODO(mattn): SockaddrGen is union of sockaddr/sockaddr_in/sockaddr_in6_old.
+// will be fixed to change variable type as suitable.
+
+type SockaddrGen [24]byte
+
+type InterfaceInfo struct {
+ Flags uint32
+ Address SockaddrGen
+ BroadcastAddress SockaddrGen
+ Netmask SockaddrGen
+}
+
+type IpAddressString struct {
+ String [16]byte
+}
+
+type IpMaskString IpAddressString
+
+type IpAddrString struct {
+ Next *IpAddrString
+ IpAddress IpAddressString
+ IpMask IpMaskString
+ Context uint32
+}
+
+const MAX_ADAPTER_NAME_LENGTH = 256
+const MAX_ADAPTER_DESCRIPTION_LENGTH = 128
+const MAX_ADAPTER_ADDRESS_LENGTH = 8
+
+type IpAdapterInfo struct {
+ Next *IpAdapterInfo
+ ComboIndex uint32
+ AdapterName [MAX_ADAPTER_NAME_LENGTH + 4]byte
+ Description [MAX_ADAPTER_DESCRIPTION_LENGTH + 4]byte
+ AddressLength uint32
+ Address [MAX_ADAPTER_ADDRESS_LENGTH]byte
+ Index uint32
+ Type uint32
+ DhcpEnabled uint32
+ CurrentIpAddress *IpAddrString
+ IpAddressList IpAddrString
+ GatewayList IpAddrString
+ DhcpServer IpAddrString
+ HaveWins bool
+ PrimaryWinsServer IpAddrString
+ SecondaryWinsServer IpAddrString
+ LeaseObtained int64
+ LeaseExpires int64
+}
+
+const MAXLEN_PHYSADDR = 8
+const MAX_INTERFACE_NAME_LEN = 256
+const MAXLEN_IFDESCR = 256
+
+type MibIfRow struct {
+ Name [MAX_INTERFACE_NAME_LEN]uint16
+ Index uint32
+ Type uint32
+ Mtu uint32
+ Speed uint32
+ PhysAddrLen uint32
+ PhysAddr [MAXLEN_PHYSADDR]byte
+ AdminStatus uint32
+ OperStatus uint32
+ LastChange uint32
+ InOctets uint32
+ InUcastPkts uint32
+ InNUcastPkts uint32
+ InDiscards uint32
+ InErrors uint32
+ InUnknownProtos uint32
+ OutOctets uint32
+ OutUcastPkts uint32
+ OutNUcastPkts uint32
+ OutDiscards uint32
+ OutErrors uint32
+ OutQLen uint32
+ DescrLen uint32
+ Descr [MAXLEN_IFDESCR]byte
+}
+
+type CertInfo struct {
+ // Not implemented
+}
+
+type CertContext struct {
+ EncodingType uint32
+ EncodedCert *byte
+ Length uint32
+ CertInfo *CertInfo
+ Store Handle
+}
+
+type CertChainContext struct {
+ Size uint32
+ TrustStatus CertTrustStatus
+ ChainCount uint32
+ Chains **CertSimpleChain
+ LowerQualityChainCount uint32
+ LowerQualityChains **CertChainContext
+ HasRevocationFreshnessTime uint32
+ RevocationFreshnessTime uint32
+}
+
+type CertTrustListInfo struct {
+ // Not implemented
+}
+
+type CertSimpleChain struct {
+ Size uint32
+ TrustStatus CertTrustStatus
+ NumElements uint32
+ Elements **CertChainElement
+ TrustListInfo *CertTrustListInfo
+ HasRevocationFreshnessTime uint32
+ RevocationFreshnessTime uint32
+}
+
+type CertChainElement struct {
+ Size uint32
+ CertContext *CertContext
+ TrustStatus CertTrustStatus
+ RevocationInfo *CertRevocationInfo
+ IssuanceUsage *CertEnhKeyUsage
+ ApplicationUsage *CertEnhKeyUsage
+ ExtendedErrorInfo *uint16
+}
+
+type CertRevocationCrlInfo struct {
+ // Not implemented
+}
+
+type CertRevocationInfo struct {
+ Size uint32
+ RevocationResult uint32
+ RevocationOid *byte
+ OidSpecificInfo Pointer
+ HasFreshnessTime uint32
+ FreshnessTime uint32
+ CrlInfo *CertRevocationCrlInfo
+}
+
+type CertTrustStatus struct {
+ ErrorStatus uint32
+ InfoStatus uint32
+}
+
+type CertUsageMatch struct {
+ Type uint32
+ Usage CertEnhKeyUsage
+}
+
+type CertEnhKeyUsage struct {
+ Length uint32
+ UsageIdentifiers **byte
+}
+
+type CertChainPara struct {
+ Size uint32
+ RequestedUsage CertUsageMatch
+ RequstedIssuancePolicy CertUsageMatch
+ URLRetrievalTimeout uint32
+ CheckRevocationFreshnessTime uint32
+ RevocationFreshnessTime uint32
+ CacheResync *Filetime
+}
+
+type CertChainPolicyPara struct {
+ Size uint32
+ Flags uint32
+ ExtraPolicyPara Pointer
+}
+
+type SSLExtraCertChainPolicyPara struct {
+ Size uint32
+ AuthType uint32
+ Checks uint32
+ ServerName *uint16
+}
+
+type CertChainPolicyStatus struct {
+ Size uint32
+ Error uint32
+ ChainIndex uint32
+ ElementIndex uint32
+ ExtraPolicyStatus Pointer
+}
+
+const (
+ // do not reorder
+ HKEY_CLASSES_ROOT = 0x80000000 + iota
+ HKEY_CURRENT_USER
+ HKEY_LOCAL_MACHINE
+ HKEY_USERS
+ HKEY_PERFORMANCE_DATA
+ HKEY_CURRENT_CONFIG
+ HKEY_DYN_DATA
+
+ KEY_QUERY_VALUE = 1
+ KEY_SET_VALUE = 2
+ KEY_CREATE_SUB_KEY = 4
+ KEY_ENUMERATE_SUB_KEYS = 8
+ KEY_NOTIFY = 16
+ KEY_CREATE_LINK = 32
+ KEY_WRITE = 0x20006
+ KEY_EXECUTE = 0x20019
+ KEY_READ = 0x20019
+ KEY_WOW64_64KEY = 0x0100
+ KEY_WOW64_32KEY = 0x0200
+ KEY_ALL_ACCESS = 0xf003f
+)
+
+const (
+ // do not reorder
+ REG_NONE = iota
+ REG_SZ
+ REG_EXPAND_SZ
+ REG_BINARY
+ REG_DWORD_LITTLE_ENDIAN
+ REG_DWORD_BIG_ENDIAN
+ REG_LINK
+ REG_MULTI_SZ
+ REG_RESOURCE_LIST
+ REG_FULL_RESOURCE_DESCRIPTOR
+ REG_RESOURCE_REQUIREMENTS_LIST
+ REG_QWORD_LITTLE_ENDIAN
+ REG_DWORD = REG_DWORD_LITTLE_ENDIAN
+ REG_QWORD = REG_QWORD_LITTLE_ENDIAN
+)
+
+type AddrinfoW struct {
+ Flags int32
+ Family int32
+ Socktype int32
+ Protocol int32
+ Addrlen uintptr
+ Canonname *uint16
+ Addr uintptr
+ Next *AddrinfoW
+}
+
+const (
+ AI_PASSIVE = 1
+ AI_CANONNAME = 2
+ AI_NUMERICHOST = 4
+)
+
+type GUID struct {
+ Data1 uint32
+ Data2 uint16
+ Data3 uint16
+ Data4 [8]byte
+}
+
+var WSAID_CONNECTEX = GUID{
+ 0x25a207b9,
+ 0xddf3,
+ 0x4660,
+ [8]byte{0x8e, 0xe9, 0x76, 0xe5, 0x8c, 0x74, 0x06, 0x3e},
+}
+
+var WSAID_WSASENDMSG = GUID{
+ 0xa441e712,
+ 0x754f,
+ 0x43ca,
+ [8]byte{0x84, 0xa7, 0x0d, 0xee, 0x44, 0xcf, 0x60, 0x6d},
+}
+
+var WSAID_WSARECVMSG = GUID{
+ 0xf689d7c8,
+ 0x6f1f,
+ 0x436b,
+ [8]byte{0x8a, 0x53, 0xe5, 0x4f, 0xe3, 0x51, 0xc3, 0x22},
+}
+
+const (
+ FILE_SKIP_COMPLETION_PORT_ON_SUCCESS = 1
+ FILE_SKIP_SET_EVENT_ON_HANDLE = 2
+)
+
+const (
+ WSAPROTOCOL_LEN = 255
+ MAX_PROTOCOL_CHAIN = 7
+ BASE_PROTOCOL = 1
+ LAYERED_PROTOCOL = 0
+
+ XP1_CONNECTIONLESS = 0x00000001
+ XP1_GUARANTEED_DELIVERY = 0x00000002
+ XP1_GUARANTEED_ORDER = 0x00000004
+ XP1_MESSAGE_ORIENTED = 0x00000008
+ XP1_PSEUDO_STREAM = 0x00000010
+ XP1_GRACEFUL_CLOSE = 0x00000020
+ XP1_EXPEDITED_DATA = 0x00000040
+ XP1_CONNECT_DATA = 0x00000080
+ XP1_DISCONNECT_DATA = 0x00000100
+ XP1_SUPPORT_BROADCAST = 0x00000200
+ XP1_SUPPORT_MULTIPOINT = 0x00000400
+ XP1_MULTIPOINT_CONTROL_PLANE = 0x00000800
+ XP1_MULTIPOINT_DATA_PLANE = 0x00001000
+ XP1_QOS_SUPPORTED = 0x00002000
+ XP1_UNI_SEND = 0x00008000
+ XP1_UNI_RECV = 0x00010000
+ XP1_IFS_HANDLES = 0x00020000
+ XP1_PARTIAL_MESSAGE = 0x00040000
+ XP1_SAN_SUPPORT_SDP = 0x00080000
+
+ PFL_MULTIPLE_PROTO_ENTRIES = 0x00000001
+ PFL_RECOMMENDED_PROTO_ENTRY = 0x00000002
+ PFL_HIDDEN = 0x00000004
+ PFL_MATCHES_PROTOCOL_ZERO = 0x00000008
+ PFL_NETWORKDIRECT_PROVIDER = 0x00000010
+)
+
+type WSAProtocolInfo struct {
+ ServiceFlags1 uint32
+ ServiceFlags2 uint32
+ ServiceFlags3 uint32
+ ServiceFlags4 uint32
+ ProviderFlags uint32
+ ProviderId GUID
+ CatalogEntryId uint32
+ ProtocolChain WSAProtocolChain
+ Version int32
+ AddressFamily int32
+ MaxSockAddr int32
+ MinSockAddr int32
+ SocketType int32
+ Protocol int32
+ ProtocolMaxOffset int32
+ NetworkByteOrder int32
+ SecurityScheme int32
+ MessageSize uint32
+ ProviderReserved uint32
+ ProtocolName [WSAPROTOCOL_LEN + 1]uint16
+}
+
+type WSAProtocolChain struct {
+ ChainLen int32
+ ChainEntries [MAX_PROTOCOL_CHAIN]uint32
+}
+
+type TCPKeepalive struct {
+ OnOff uint32
+ Time uint32
+ Interval uint32
+}
+
+type symbolicLinkReparseBuffer struct {
+ SubstituteNameOffset uint16
+ SubstituteNameLength uint16
+ PrintNameOffset uint16
+ PrintNameLength uint16
+ Flags uint32
+ PathBuffer [1]uint16
+}
+
+type mountPointReparseBuffer struct {
+ SubstituteNameOffset uint16
+ SubstituteNameLength uint16
+ PrintNameOffset uint16
+ PrintNameLength uint16
+ PathBuffer [1]uint16
+}
+
+type reparseDataBuffer struct {
+ ReparseTag uint32
+ ReparseDataLength uint16
+ Reserved uint16
+
+ // GenericReparseBuffer
+ reparseBuffer byte
+}
+
+const (
+ FSCTL_GET_REPARSE_POINT = 0x900A8
+ MAXIMUM_REPARSE_DATA_BUFFER_SIZE = 16 * 1024
+ IO_REPARSE_TAG_MOUNT_POINT = 0xA0000003
+ IO_REPARSE_TAG_SYMLINK = 0xA000000C
+ SYMBOLIC_LINK_FLAG_DIRECTORY = 0x1
+)
+
+const (
+ ComputerNameNetBIOS = 0
+ ComputerNameDnsHostname = 1
+ ComputerNameDnsDomain = 2
+ ComputerNameDnsFullyQualified = 3
+ ComputerNamePhysicalNetBIOS = 4
+ ComputerNamePhysicalDnsHostname = 5
+ ComputerNamePhysicalDnsDomain = 6
+ ComputerNamePhysicalDnsFullyQualified = 7
+ ComputerNameMax = 8
+)
+
+const (
+ MOVEFILE_REPLACE_EXISTING = 0x1
+ MOVEFILE_COPY_ALLOWED = 0x2
+ MOVEFILE_DELAY_UNTIL_REBOOT = 0x4
+ MOVEFILE_WRITE_THROUGH = 0x8
+ MOVEFILE_CREATE_HARDLINK = 0x10
+ MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20
+)
+
+const GAA_FLAG_INCLUDE_PREFIX = 0x00000010
+
+const (
+ IF_TYPE_OTHER = 1
+ IF_TYPE_ETHERNET_CSMACD = 6
+ IF_TYPE_ISO88025_TOKENRING = 9
+ IF_TYPE_PPP = 23
+ IF_TYPE_SOFTWARE_LOOPBACK = 24
+ IF_TYPE_ATM = 37
+ IF_TYPE_IEEE80211 = 71
+ IF_TYPE_TUNNEL = 131
+ IF_TYPE_IEEE1394 = 144
+)
+
+type SocketAddress struct {
+ Sockaddr *syscall.RawSockaddrAny
+ SockaddrLength int32
+}
+
+type IpAdapterUnicastAddress struct {
+ Length uint32
+ Flags uint32
+ Next *IpAdapterUnicastAddress
+ Address SocketAddress
+ PrefixOrigin int32
+ SuffixOrigin int32
+ DadState int32
+ ValidLifetime uint32
+ PreferredLifetime uint32
+ LeaseLifetime uint32
+ OnLinkPrefixLength uint8
+}
+
+type IpAdapterAnycastAddress struct {
+ Length uint32
+ Flags uint32
+ Next *IpAdapterAnycastAddress
+ Address SocketAddress
+}
+
+type IpAdapterMulticastAddress struct {
+ Length uint32
+ Flags uint32
+ Next *IpAdapterMulticastAddress
+ Address SocketAddress
+}
+
+type IpAdapterDnsServerAdapter struct {
+ Length uint32
+ Reserved uint32
+ Next *IpAdapterDnsServerAdapter
+ Address SocketAddress
+}
+
+type IpAdapterPrefix struct {
+ Length uint32
+ Flags uint32
+ Next *IpAdapterPrefix
+ Address SocketAddress
+ PrefixLength uint32
+}
+
+type IpAdapterAddresses struct {
+ Length uint32
+ IfIndex uint32
+ Next *IpAdapterAddresses
+ AdapterName *byte
+ FirstUnicastAddress *IpAdapterUnicastAddress
+ FirstAnycastAddress *IpAdapterAnycastAddress
+ FirstMulticastAddress *IpAdapterMulticastAddress
+ FirstDnsServerAddress *IpAdapterDnsServerAdapter
+ DnsSuffix *uint16
+ Description *uint16
+ FriendlyName *uint16
+ PhysicalAddress [syscall.MAX_ADAPTER_ADDRESS_LENGTH]byte
+ PhysicalAddressLength uint32
+ Flags uint32
+ Mtu uint32
+ IfType uint32
+ OperStatus uint32
+ Ipv6IfIndex uint32
+ ZoneIndices [16]uint32
+ FirstPrefix *IpAdapterPrefix
+ /* more fields might be present here. */
+}
+
+const (
+ IfOperStatusUp = 1
+ IfOperStatusDown = 2
+ IfOperStatusTesting = 3
+ IfOperStatusUnknown = 4
+ IfOperStatusDormant = 5
+ IfOperStatusNotPresent = 6
+ IfOperStatusLowerLayerDown = 7
+)
+
+// Console related constants used for the mode parameter to SetConsoleMode. See
+// https://docs.microsoft.com/en-us/windows/console/setconsolemode for details.
+
+const (
+ ENABLE_PROCESSED_INPUT = 0x1
+ ENABLE_LINE_INPUT = 0x2
+ ENABLE_ECHO_INPUT = 0x4
+ ENABLE_WINDOW_INPUT = 0x8
+ ENABLE_MOUSE_INPUT = 0x10
+ ENABLE_INSERT_MODE = 0x20
+ ENABLE_QUICK_EDIT_MODE = 0x40
+ ENABLE_EXTENDED_FLAGS = 0x80
+ ENABLE_AUTO_POSITION = 0x100
+ ENABLE_VIRTUAL_TERMINAL_INPUT = 0x200
+
+ ENABLE_PROCESSED_OUTPUT = 0x1
+ ENABLE_WRAP_AT_EOL_OUTPUT = 0x2
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x4
+ DISABLE_NEWLINE_AUTO_RETURN = 0x8
+ ENABLE_LVB_GRID_WORLDWIDE = 0x10
+)
+
+type Coord struct {
+ X int16
+ Y int16
+}
+
+type SmallRect struct {
+ Left int16
+ Top int16
+ Right int16
+ Bottom int16
+}
+
+// Used with GetConsoleScreenBuffer to retrieve information about a console
+// screen buffer. See
+// https://docs.microsoft.com/en-us/windows/console/console-screen-buffer-info-str
+// for details.
+
+type ConsoleScreenBufferInfo struct {
+ Size Coord
+ CursorPosition Coord
+ Attributes uint16
+ Window SmallRect
+ MaximumWindowSize Coord
+}
+
+const UNIX_PATH_MAX = 108 // defined in afunix.h
diff --git a/vendor/golang.org/x/sys/windows/types_windows_386.go b/vendor/golang.org/x/sys/windows/types_windows_386.go
new file mode 100644
index 00000000000..fe0ddd03160
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/types_windows_386.go
@@ -0,0 +1,22 @@
+// 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 windows
+
+type WSAData struct {
+ Version uint16
+ HighVersion uint16
+ Description [WSADESCRIPTION_LEN + 1]byte
+ SystemStatus [WSASYS_STATUS_LEN + 1]byte
+ MaxSockets uint16
+ MaxUdpDg uint16
+ VendorInfo *byte
+}
+
+type Servent struct {
+ Name *byte
+ Aliases **byte
+ Port uint16
+ Proto *byte
+}
diff --git a/vendor/golang.org/x/sys/windows/types_windows_amd64.go b/vendor/golang.org/x/sys/windows/types_windows_amd64.go
new file mode 100644
index 00000000000..7e154c2df2d
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/types_windows_amd64.go
@@ -0,0 +1,22 @@
+// 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 windows
+
+type WSAData struct {
+ Version uint16
+ HighVersion uint16
+ MaxSockets uint16
+ MaxUdpDg uint16
+ VendorInfo *byte
+ Description [WSADESCRIPTION_LEN + 1]byte
+ SystemStatus [WSASYS_STATUS_LEN + 1]byte
+}
+
+type Servent struct {
+ Name *byte
+ Aliases **byte
+ Proto *byte
+ Port uint16
+}
diff --git a/vendor/golang.org/x/sys/windows/types_windows_arm.go b/vendor/golang.org/x/sys/windows/types_windows_arm.go
new file mode 100644
index 00000000000..74571e3600b
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/types_windows_arm.go
@@ -0,0 +1,22 @@
+// 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 windows
+
+type WSAData struct {
+ Version uint16
+ HighVersion uint16
+ Description [WSADESCRIPTION_LEN + 1]byte
+ SystemStatus [WSASYS_STATUS_LEN + 1]byte
+ MaxSockets uint16
+ MaxUdpDg uint16
+ VendorInfo *byte
+}
+
+type Servent struct {
+ Name *byte
+ Aliases **byte
+ Port uint16
+ Proto *byte
+}
diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
new file mode 100644
index 00000000000..fc56aec035b
--- /dev/null
+++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go
@@ -0,0 +1,2700 @@
+// Code generated by 'go generate'; DO NOT EDIT.
+
+package windows
+
+import (
+ "syscall"
+ "unsafe"
+)
+
+var _ unsafe.Pointer
+
+// Do the interface allocations only once for common
+// Errno values.
+const (
+ errnoERROR_IO_PENDING = 997
+)
+
+var (
+ errERROR_IO_PENDING error = syscall.Errno(errnoERROR_IO_PENDING)
+)
+
+// errnoErr returns common boxed Errno values, to prevent
+// allocations at runtime.
+func errnoErr(e syscall.Errno) error {
+ switch e {
+ case 0:
+ return nil
+ case errnoERROR_IO_PENDING:
+ return errERROR_IO_PENDING
+ }
+ // TODO: add more here, after collecting data on the common
+ // error values see on Windows. (perhaps when running
+ // all.bat?)
+ return e
+}
+
+var (
+ modadvapi32 = NewLazySystemDLL("advapi32.dll")
+ modkernel32 = NewLazySystemDLL("kernel32.dll")
+ modshell32 = NewLazySystemDLL("shell32.dll")
+ modmswsock = NewLazySystemDLL("mswsock.dll")
+ modcrypt32 = NewLazySystemDLL("crypt32.dll")
+ modws2_32 = NewLazySystemDLL("ws2_32.dll")
+ moddnsapi = NewLazySystemDLL("dnsapi.dll")
+ modiphlpapi = NewLazySystemDLL("iphlpapi.dll")
+ modsecur32 = NewLazySystemDLL("secur32.dll")
+ modnetapi32 = NewLazySystemDLL("netapi32.dll")
+ moduserenv = NewLazySystemDLL("userenv.dll")
+
+ procRegisterEventSourceW = modadvapi32.NewProc("RegisterEventSourceW")
+ procDeregisterEventSource = modadvapi32.NewProc("DeregisterEventSource")
+ procReportEventW = modadvapi32.NewProc("ReportEventW")
+ procOpenSCManagerW = modadvapi32.NewProc("OpenSCManagerW")
+ procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle")
+ procCreateServiceW = modadvapi32.NewProc("CreateServiceW")
+ procOpenServiceW = modadvapi32.NewProc("OpenServiceW")
+ procDeleteService = modadvapi32.NewProc("DeleteService")
+ procStartServiceW = modadvapi32.NewProc("StartServiceW")
+ procQueryServiceStatus = modadvapi32.NewProc("QueryServiceStatus")
+ procControlService = modadvapi32.NewProc("ControlService")
+ procStartServiceCtrlDispatcherW = modadvapi32.NewProc("StartServiceCtrlDispatcherW")
+ procSetServiceStatus = modadvapi32.NewProc("SetServiceStatus")
+ procChangeServiceConfigW = modadvapi32.NewProc("ChangeServiceConfigW")
+ procQueryServiceConfigW = modadvapi32.NewProc("QueryServiceConfigW")
+ procChangeServiceConfig2W = modadvapi32.NewProc("ChangeServiceConfig2W")
+ procQueryServiceConfig2W = modadvapi32.NewProc("QueryServiceConfig2W")
+ procEnumServicesStatusExW = modadvapi32.NewProc("EnumServicesStatusExW")
+ procQueryServiceStatusEx = modadvapi32.NewProc("QueryServiceStatusEx")
+ procGetLastError = modkernel32.NewProc("GetLastError")
+ procLoadLibraryW = modkernel32.NewProc("LoadLibraryW")
+ procLoadLibraryExW = modkernel32.NewProc("LoadLibraryExW")
+ procFreeLibrary = modkernel32.NewProc("FreeLibrary")
+ procGetProcAddress = modkernel32.NewProc("GetProcAddress")
+ procGetVersion = modkernel32.NewProc("GetVersion")
+ procFormatMessageW = modkernel32.NewProc("FormatMessageW")
+ procExitProcess = modkernel32.NewProc("ExitProcess")
+ procCreateFileW = modkernel32.NewProc("CreateFileW")
+ procReadFile = modkernel32.NewProc("ReadFile")
+ procWriteFile = modkernel32.NewProc("WriteFile")
+ procSetFilePointer = modkernel32.NewProc("SetFilePointer")
+ procCloseHandle = modkernel32.NewProc("CloseHandle")
+ procGetStdHandle = modkernel32.NewProc("GetStdHandle")
+ procSetStdHandle = modkernel32.NewProc("SetStdHandle")
+ procFindFirstFileW = modkernel32.NewProc("FindFirstFileW")
+ procFindNextFileW = modkernel32.NewProc("FindNextFileW")
+ procFindClose = modkernel32.NewProc("FindClose")
+ procGetFileInformationByHandle = modkernel32.NewProc("GetFileInformationByHandle")
+ procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW")
+ procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW")
+ procCreateDirectoryW = modkernel32.NewProc("CreateDirectoryW")
+ procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW")
+ procDeleteFileW = modkernel32.NewProc("DeleteFileW")
+ procMoveFileW = modkernel32.NewProc("MoveFileW")
+ procMoveFileExW = modkernel32.NewProc("MoveFileExW")
+ procGetComputerNameW = modkernel32.NewProc("GetComputerNameW")
+ procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW")
+ procSetEndOfFile = modkernel32.NewProc("SetEndOfFile")
+ procGetSystemTimeAsFileTime = modkernel32.NewProc("GetSystemTimeAsFileTime")
+ procGetSystemTimePreciseAsFileTime = modkernel32.NewProc("GetSystemTimePreciseAsFileTime")
+ procGetTimeZoneInformation = modkernel32.NewProc("GetTimeZoneInformation")
+ procCreateIoCompletionPort = modkernel32.NewProc("CreateIoCompletionPort")
+ procGetQueuedCompletionStatus = modkernel32.NewProc("GetQueuedCompletionStatus")
+ procPostQueuedCompletionStatus = modkernel32.NewProc("PostQueuedCompletionStatus")
+ procCancelIo = modkernel32.NewProc("CancelIo")
+ procCancelIoEx = modkernel32.NewProc("CancelIoEx")
+ procCreateProcessW = modkernel32.NewProc("CreateProcessW")
+ procOpenProcess = modkernel32.NewProc("OpenProcess")
+ procTerminateProcess = modkernel32.NewProc("TerminateProcess")
+ procGetExitCodeProcess = modkernel32.NewProc("GetExitCodeProcess")
+ procGetStartupInfoW = modkernel32.NewProc("GetStartupInfoW")
+ procGetCurrentProcess = modkernel32.NewProc("GetCurrentProcess")
+ procGetProcessTimes = modkernel32.NewProc("GetProcessTimes")
+ procDuplicateHandle = modkernel32.NewProc("DuplicateHandle")
+ procWaitForSingleObject = modkernel32.NewProc("WaitForSingleObject")
+ procGetTempPathW = modkernel32.NewProc("GetTempPathW")
+ procCreatePipe = modkernel32.NewProc("CreatePipe")
+ procGetFileType = modkernel32.NewProc("GetFileType")
+ procCryptAcquireContextW = modadvapi32.NewProc("CryptAcquireContextW")
+ procCryptReleaseContext = modadvapi32.NewProc("CryptReleaseContext")
+ procCryptGenRandom = modadvapi32.NewProc("CryptGenRandom")
+ procGetEnvironmentStringsW = modkernel32.NewProc("GetEnvironmentStringsW")
+ procFreeEnvironmentStringsW = modkernel32.NewProc("FreeEnvironmentStringsW")
+ procGetEnvironmentVariableW = modkernel32.NewProc("GetEnvironmentVariableW")
+ procSetEnvironmentVariableW = modkernel32.NewProc("SetEnvironmentVariableW")
+ procSetFileTime = modkernel32.NewProc("SetFileTime")
+ procGetFileAttributesW = modkernel32.NewProc("GetFileAttributesW")
+ procSetFileAttributesW = modkernel32.NewProc("SetFileAttributesW")
+ procGetFileAttributesExW = modkernel32.NewProc("GetFileAttributesExW")
+ procGetCommandLineW = modkernel32.NewProc("GetCommandLineW")
+ procCommandLineToArgvW = modshell32.NewProc("CommandLineToArgvW")
+ procLocalFree = modkernel32.NewProc("LocalFree")
+ procSetHandleInformation = modkernel32.NewProc("SetHandleInformation")
+ procFlushFileBuffers = modkernel32.NewProc("FlushFileBuffers")
+ procGetFullPathNameW = modkernel32.NewProc("GetFullPathNameW")
+ procGetLongPathNameW = modkernel32.NewProc("GetLongPathNameW")
+ procGetShortPathNameW = modkernel32.NewProc("GetShortPathNameW")
+ procCreateFileMappingW = modkernel32.NewProc("CreateFileMappingW")
+ procMapViewOfFile = modkernel32.NewProc("MapViewOfFile")
+ procUnmapViewOfFile = modkernel32.NewProc("UnmapViewOfFile")
+ procFlushViewOfFile = modkernel32.NewProc("FlushViewOfFile")
+ procVirtualLock = modkernel32.NewProc("VirtualLock")
+ procVirtualUnlock = modkernel32.NewProc("VirtualUnlock")
+ procVirtualAlloc = modkernel32.NewProc("VirtualAlloc")
+ procVirtualFree = modkernel32.NewProc("VirtualFree")
+ procVirtualProtect = modkernel32.NewProc("VirtualProtect")
+ procTransmitFile = modmswsock.NewProc("TransmitFile")
+ procReadDirectoryChangesW = modkernel32.NewProc("ReadDirectoryChangesW")
+ procCertOpenSystemStoreW = modcrypt32.NewProc("CertOpenSystemStoreW")
+ procCertOpenStore = modcrypt32.NewProc("CertOpenStore")
+ procCertEnumCertificatesInStore = modcrypt32.NewProc("CertEnumCertificatesInStore")
+ procCertAddCertificateContextToStore = modcrypt32.NewProc("CertAddCertificateContextToStore")
+ procCertCloseStore = modcrypt32.NewProc("CertCloseStore")
+ procCertGetCertificateChain = modcrypt32.NewProc("CertGetCertificateChain")
+ procCertFreeCertificateChain = modcrypt32.NewProc("CertFreeCertificateChain")
+ procCertCreateCertificateContext = modcrypt32.NewProc("CertCreateCertificateContext")
+ procCertFreeCertificateContext = modcrypt32.NewProc("CertFreeCertificateContext")
+ procCertVerifyCertificateChainPolicy = modcrypt32.NewProc("CertVerifyCertificateChainPolicy")
+ procRegOpenKeyExW = modadvapi32.NewProc("RegOpenKeyExW")
+ procRegCloseKey = modadvapi32.NewProc("RegCloseKey")
+ procRegQueryInfoKeyW = modadvapi32.NewProc("RegQueryInfoKeyW")
+ procRegEnumKeyExW = modadvapi32.NewProc("RegEnumKeyExW")
+ procRegQueryValueExW = modadvapi32.NewProc("RegQueryValueExW")
+ procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId")
+ procGetConsoleMode = modkernel32.NewProc("GetConsoleMode")
+ procSetConsoleMode = modkernel32.NewProc("SetConsoleMode")
+ procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
+ procWriteConsoleW = modkernel32.NewProc("WriteConsoleW")
+ procReadConsoleW = modkernel32.NewProc("ReadConsoleW")
+ procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
+ procProcess32FirstW = modkernel32.NewProc("Process32FirstW")
+ procProcess32NextW = modkernel32.NewProc("Process32NextW")
+ procDeviceIoControl = modkernel32.NewProc("DeviceIoControl")
+ procCreateSymbolicLinkW = modkernel32.NewProc("CreateSymbolicLinkW")
+ procCreateHardLinkW = modkernel32.NewProc("CreateHardLinkW")
+ procGetCurrentThreadId = modkernel32.NewProc("GetCurrentThreadId")
+ procCreateEventW = modkernel32.NewProc("CreateEventW")
+ procCreateEventExW = modkernel32.NewProc("CreateEventExW")
+ procOpenEventW = modkernel32.NewProc("OpenEventW")
+ procSetEvent = modkernel32.NewProc("SetEvent")
+ procResetEvent = modkernel32.NewProc("ResetEvent")
+ procPulseEvent = modkernel32.NewProc("PulseEvent")
+ procDefineDosDeviceW = modkernel32.NewProc("DefineDosDeviceW")
+ procDeleteVolumeMountPointW = modkernel32.NewProc("DeleteVolumeMountPointW")
+ procFindFirstVolumeW = modkernel32.NewProc("FindFirstVolumeW")
+ procFindFirstVolumeMountPointW = modkernel32.NewProc("FindFirstVolumeMountPointW")
+ procFindNextVolumeW = modkernel32.NewProc("FindNextVolumeW")
+ procFindNextVolumeMountPointW = modkernel32.NewProc("FindNextVolumeMountPointW")
+ procFindVolumeClose = modkernel32.NewProc("FindVolumeClose")
+ procFindVolumeMountPointClose = modkernel32.NewProc("FindVolumeMountPointClose")
+ procGetDriveTypeW = modkernel32.NewProc("GetDriveTypeW")
+ procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
+ procGetLogicalDriveStringsW = modkernel32.NewProc("GetLogicalDriveStringsW")
+ procGetVolumeInformationW = modkernel32.NewProc("GetVolumeInformationW")
+ procGetVolumeInformationByHandleW = modkernel32.NewProc("GetVolumeInformationByHandleW")
+ procGetVolumeNameForVolumeMountPointW = modkernel32.NewProc("GetVolumeNameForVolumeMountPointW")
+ procGetVolumePathNameW = modkernel32.NewProc("GetVolumePathNameW")
+ procGetVolumePathNamesForVolumeNameW = modkernel32.NewProc("GetVolumePathNamesForVolumeNameW")
+ procQueryDosDeviceW = modkernel32.NewProc("QueryDosDeviceW")
+ procSetVolumeLabelW = modkernel32.NewProc("SetVolumeLabelW")
+ procSetVolumeMountPointW = modkernel32.NewProc("SetVolumeMountPointW")
+ procWSAStartup = modws2_32.NewProc("WSAStartup")
+ procWSACleanup = modws2_32.NewProc("WSACleanup")
+ procWSAIoctl = modws2_32.NewProc("WSAIoctl")
+ procsocket = modws2_32.NewProc("socket")
+ procsetsockopt = modws2_32.NewProc("setsockopt")
+ procgetsockopt = modws2_32.NewProc("getsockopt")
+ procbind = modws2_32.NewProc("bind")
+ procconnect = modws2_32.NewProc("connect")
+ procgetsockname = modws2_32.NewProc("getsockname")
+ procgetpeername = modws2_32.NewProc("getpeername")
+ proclisten = modws2_32.NewProc("listen")
+ procshutdown = modws2_32.NewProc("shutdown")
+ procclosesocket = modws2_32.NewProc("closesocket")
+ procAcceptEx = modmswsock.NewProc("AcceptEx")
+ procGetAcceptExSockaddrs = modmswsock.NewProc("GetAcceptExSockaddrs")
+ procWSARecv = modws2_32.NewProc("WSARecv")
+ procWSASend = modws2_32.NewProc("WSASend")
+ procWSARecvFrom = modws2_32.NewProc("WSARecvFrom")
+ procWSASendTo = modws2_32.NewProc("WSASendTo")
+ procgethostbyname = modws2_32.NewProc("gethostbyname")
+ procgetservbyname = modws2_32.NewProc("getservbyname")
+ procntohs = modws2_32.NewProc("ntohs")
+ procgetprotobyname = modws2_32.NewProc("getprotobyname")
+ procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W")
+ procDnsRecordListFree = moddnsapi.NewProc("DnsRecordListFree")
+ procDnsNameCompare_W = moddnsapi.NewProc("DnsNameCompare_W")
+ procGetAddrInfoW = modws2_32.NewProc("GetAddrInfoW")
+ procFreeAddrInfoW = modws2_32.NewProc("FreeAddrInfoW")
+ procGetIfEntry = modiphlpapi.NewProc("GetIfEntry")
+ procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo")
+ procSetFileCompletionNotificationModes = modkernel32.NewProc("SetFileCompletionNotificationModes")
+ procWSAEnumProtocolsW = modws2_32.NewProc("WSAEnumProtocolsW")
+ procGetAdaptersAddresses = modiphlpapi.NewProc("GetAdaptersAddresses")
+ procGetACP = modkernel32.NewProc("GetACP")
+ procMultiByteToWideChar = modkernel32.NewProc("MultiByteToWideChar")
+ procTranslateNameW = modsecur32.NewProc("TranslateNameW")
+ procGetUserNameExW = modsecur32.NewProc("GetUserNameExW")
+ procNetUserGetInfo = modnetapi32.NewProc("NetUserGetInfo")
+ procNetGetJoinInformation = modnetapi32.NewProc("NetGetJoinInformation")
+ procNetApiBufferFree = modnetapi32.NewProc("NetApiBufferFree")
+ procLookupAccountSidW = modadvapi32.NewProc("LookupAccountSidW")
+ procLookupAccountNameW = modadvapi32.NewProc("LookupAccountNameW")
+ procConvertSidToStringSidW = modadvapi32.NewProc("ConvertSidToStringSidW")
+ procConvertStringSidToSidW = modadvapi32.NewProc("ConvertStringSidToSidW")
+ procGetLengthSid = modadvapi32.NewProc("GetLengthSid")
+ procCopySid = modadvapi32.NewProc("CopySid")
+ procAllocateAndInitializeSid = modadvapi32.NewProc("AllocateAndInitializeSid")
+ procFreeSid = modadvapi32.NewProc("FreeSid")
+ procEqualSid = modadvapi32.NewProc("EqualSid")
+ procCheckTokenMembership = modadvapi32.NewProc("CheckTokenMembership")
+ procOpenProcessToken = modadvapi32.NewProc("OpenProcessToken")
+ procGetTokenInformation = modadvapi32.NewProc("GetTokenInformation")
+ procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW")
+)
+
+func RegisterEventSource(uncServerName *uint16, sourceName *uint16) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procRegisterEventSourceW.Addr(), 2, uintptr(unsafe.Pointer(uncServerName)), uintptr(unsafe.Pointer(sourceName)), 0)
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DeregisterEventSource(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procDeregisterEventSource.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ReportEvent(log Handle, etype uint16, category uint16, eventId uint32, usrSId uintptr, numStrings uint16, dataSize uint32, strings **uint16, rawData *byte) (err error) {
+ r1, _, e1 := syscall.Syscall9(procReportEventW.Addr(), 9, uintptr(log), uintptr(etype), uintptr(category), uintptr(eventId), uintptr(usrSId), uintptr(numStrings), uintptr(dataSize), uintptr(unsafe.Pointer(strings)), uintptr(unsafe.Pointer(rawData)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func OpenSCManager(machineName *uint16, databaseName *uint16, access uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procOpenSCManagerW.Addr(), 3, uintptr(unsafe.Pointer(machineName)), uintptr(unsafe.Pointer(databaseName)), uintptr(access))
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CloseServiceHandle(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procCloseServiceHandle.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateService(mgr Handle, serviceName *uint16, displayName *uint16, access uint32, srvType uint32, startType uint32, errCtl uint32, pathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall15(procCreateServiceW.Addr(), 13, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(unsafe.Pointer(displayName)), uintptr(access), uintptr(srvType), uintptr(startType), uintptr(errCtl), uintptr(unsafe.Pointer(pathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), 0, 0)
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func OpenService(mgr Handle, serviceName *uint16, access uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procOpenServiceW.Addr(), 3, uintptr(mgr), uintptr(unsafe.Pointer(serviceName)), uintptr(access))
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DeleteService(service Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procDeleteService.Addr(), 1, uintptr(service), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func StartService(service Handle, numArgs uint32, argVectors **uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procStartServiceW.Addr(), 3, uintptr(service), uintptr(numArgs), uintptr(unsafe.Pointer(argVectors)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func QueryServiceStatus(service Handle, status *SERVICE_STATUS) (err error) {
+ r1, _, e1 := syscall.Syscall(procQueryServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(status)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ControlService(service Handle, control uint32, status *SERVICE_STATUS) (err error) {
+ r1, _, e1 := syscall.Syscall(procControlService.Addr(), 3, uintptr(service), uintptr(control), uintptr(unsafe.Pointer(status)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func StartServiceCtrlDispatcher(serviceTable *SERVICE_TABLE_ENTRY) (err error) {
+ r1, _, e1 := syscall.Syscall(procStartServiceCtrlDispatcherW.Addr(), 1, uintptr(unsafe.Pointer(serviceTable)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetServiceStatus(service Handle, serviceStatus *SERVICE_STATUS) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetServiceStatus.Addr(), 2, uintptr(service), uintptr(unsafe.Pointer(serviceStatus)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ChangeServiceConfig(service Handle, serviceType uint32, startType uint32, errorControl uint32, binaryPathName *uint16, loadOrderGroup *uint16, tagId *uint32, dependencies *uint16, serviceStartName *uint16, password *uint16, displayName *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall12(procChangeServiceConfigW.Addr(), 11, uintptr(service), uintptr(serviceType), uintptr(startType), uintptr(errorControl), uintptr(unsafe.Pointer(binaryPathName)), uintptr(unsafe.Pointer(loadOrderGroup)), uintptr(unsafe.Pointer(tagId)), uintptr(unsafe.Pointer(dependencies)), uintptr(unsafe.Pointer(serviceStartName)), uintptr(unsafe.Pointer(password)), uintptr(unsafe.Pointer(displayName)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func QueryServiceConfig(service Handle, serviceConfig *QUERY_SERVICE_CONFIG, bufSize uint32, bytesNeeded *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procQueryServiceConfigW.Addr(), 4, uintptr(service), uintptr(unsafe.Pointer(serviceConfig)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ChangeServiceConfig2(service Handle, infoLevel uint32, info *byte) (err error) {
+ r1, _, e1 := syscall.Syscall(procChangeServiceConfig2W.Addr(), 3, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(info)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func QueryServiceConfig2(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procQueryServiceConfig2W.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func EnumServicesStatusEx(mgr Handle, infoLevel uint32, serviceType uint32, serviceState uint32, services *byte, bufSize uint32, bytesNeeded *uint32, servicesReturned *uint32, resumeHandle *uint32, groupName *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall12(procEnumServicesStatusExW.Addr(), 10, uintptr(mgr), uintptr(infoLevel), uintptr(serviceType), uintptr(serviceState), uintptr(unsafe.Pointer(services)), uintptr(bufSize), uintptr(unsafe.Pointer(bytesNeeded)), uintptr(unsafe.Pointer(servicesReturned)), uintptr(unsafe.Pointer(resumeHandle)), uintptr(unsafe.Pointer(groupName)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func QueryServiceStatusEx(service Handle, infoLevel uint32, buff *byte, buffSize uint32, bytesNeeded *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procQueryServiceStatusEx.Addr(), 5, uintptr(service), uintptr(infoLevel), uintptr(unsafe.Pointer(buff)), uintptr(buffSize), uintptr(unsafe.Pointer(bytesNeeded)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetLastError() (lasterr error) {
+ r0, _, _ := syscall.Syscall(procGetLastError.Addr(), 0, 0, 0, 0)
+ if r0 != 0 {
+ lasterr = syscall.Errno(r0)
+ }
+ return
+}
+
+func LoadLibrary(libname string) (handle Handle, err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(libname)
+ if err != nil {
+ return
+ }
+ return _LoadLibrary(_p0)
+}
+
+func _LoadLibrary(libname *uint16) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procLoadLibraryW.Addr(), 1, uintptr(unsafe.Pointer(libname)), 0, 0)
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func LoadLibraryEx(libname string, zero Handle, flags uintptr) (handle Handle, err error) {
+ var _p0 *uint16
+ _p0, err = syscall.UTF16PtrFromString(libname)
+ if err != nil {
+ return
+ }
+ return _LoadLibraryEx(_p0, zero, flags)
+}
+
+func _LoadLibraryEx(libname *uint16, zero Handle, flags uintptr) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procLoadLibraryExW.Addr(), 3, uintptr(unsafe.Pointer(libname)), uintptr(zero), uintptr(flags))
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FreeLibrary(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procFreeLibrary.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetProcAddress(module Handle, procname string) (proc uintptr, err error) {
+ var _p0 *byte
+ _p0, err = syscall.BytePtrFromString(procname)
+ if err != nil {
+ return
+ }
+ return _GetProcAddress(module, _p0)
+}
+
+func _GetProcAddress(module Handle, procname *byte) (proc uintptr, err error) {
+ r0, _, e1 := syscall.Syscall(procGetProcAddress.Addr(), 2, uintptr(module), uintptr(unsafe.Pointer(procname)), 0)
+ proc = uintptr(r0)
+ if proc == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetVersion() (ver uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetVersion.Addr(), 0, 0, 0, 0)
+ ver = uint32(r0)
+ if ver == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) {
+ var _p0 *uint16
+ if len(buf) > 0 {
+ _p0 = &buf[0]
+ }
+ r0, _, e1 := syscall.Syscall9(procFormatMessageW.Addr(), 7, uintptr(flags), uintptr(msgsrc), uintptr(msgid), uintptr(langid), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(args)), 0, 0)
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ExitProcess(exitcode uint32) {
+ syscall.Syscall(procExitProcess.Addr(), 1, uintptr(exitcode), 0, 0)
+ return
+}
+
+func CreateFile(name *uint16, access uint32, mode uint32, sa *SecurityAttributes, createmode uint32, attrs uint32, templatefile int32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall9(procCreateFileW.Addr(), 7, uintptr(unsafe.Pointer(name)), uintptr(access), uintptr(mode), uintptr(unsafe.Pointer(sa)), uintptr(createmode), uintptr(attrs), uintptr(templatefile), 0, 0)
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ReadFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) {
+ var _p0 *byte
+ if len(buf) > 0 {
+ _p0 = &buf[0]
+ }
+ r1, _, e1 := syscall.Syscall6(procReadFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WriteFile(handle Handle, buf []byte, done *uint32, overlapped *Overlapped) (err error) {
+ var _p0 *byte
+ if len(buf) > 0 {
+ _p0 = &buf[0]
+ }
+ r1, _, e1 := syscall.Syscall6(procWriteFile.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(_p0)), uintptr(len(buf)), uintptr(unsafe.Pointer(done)), uintptr(unsafe.Pointer(overlapped)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetFilePointer(handle Handle, lowoffset int32, highoffsetptr *int32, whence uint32) (newlowoffset uint32, err error) {
+ r0, _, e1 := syscall.Syscall6(procSetFilePointer.Addr(), 4, uintptr(handle), uintptr(lowoffset), uintptr(unsafe.Pointer(highoffsetptr)), uintptr(whence), 0, 0)
+ newlowoffset = uint32(r0)
+ if newlowoffset == 0xffffffff {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CloseHandle(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procCloseHandle.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetStdHandle(stdhandle uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procGetStdHandle.Addr(), 1, uintptr(stdhandle), 0, 0)
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetStdHandle(stdhandle uint32, handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func findFirstFile1(name *uint16, data *win32finddata1) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procFindFirstFileW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(data)), 0)
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func findNextFile1(handle Handle, data *win32finddata1) (err error) {
+ r1, _, e1 := syscall.Syscall(procFindNextFileW.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindClose(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procFindClose.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetFileInformationByHandle(handle Handle, data *ByHandleFileInformation) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetFileInformationByHandle.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetCurrentDirectoryW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetCurrentDirectory(path *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateDirectory(path *uint16, sa *SecurityAttributes) (err error) {
+ r1, _, e1 := syscall.Syscall(procCreateDirectoryW.Addr(), 2, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func RemoveDirectory(path *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procRemoveDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DeleteFile(path *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procDeleteFileW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func MoveFile(from *uint16, to *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procMoveFileW.Addr(), 2, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func MoveFileEx(from *uint16, to *uint16, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetComputerName(buf *uint16, n *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetComputerNameW.Addr(), 2, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetComputerNameEx(nametype uint32, buf *uint16, n *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetComputerNameExW.Addr(), 3, uintptr(nametype), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetEndOfFile(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetEndOfFile.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetSystemTimeAsFileTime(time *Filetime) {
+ syscall.Syscall(procGetSystemTimeAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0)
+ return
+}
+
+func GetSystemTimePreciseAsFileTime(time *Filetime) {
+ syscall.Syscall(procGetSystemTimePreciseAsFileTime.Addr(), 1, uintptr(unsafe.Pointer(time)), 0, 0)
+ return
+}
+
+func GetTimeZoneInformation(tzi *Timezoneinformation) (rc uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetTimeZoneInformation.Addr(), 1, uintptr(unsafe.Pointer(tzi)), 0, 0)
+ rc = uint32(r0)
+ if rc == 0xffffffff {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateIoCompletionPort(filehandle Handle, cphandle Handle, key uint32, threadcnt uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall6(procCreateIoCompletionPort.Addr(), 4, uintptr(filehandle), uintptr(cphandle), uintptr(key), uintptr(threadcnt), 0, 0)
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetQueuedCompletionStatus(cphandle Handle, qty *uint32, key *uint32, overlapped **Overlapped, timeout uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procGetQueuedCompletionStatus.Addr(), 5, uintptr(cphandle), uintptr(unsafe.Pointer(qty)), uintptr(unsafe.Pointer(key)), uintptr(unsafe.Pointer(overlapped)), uintptr(timeout), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func PostQueuedCompletionStatus(cphandle Handle, qty uint32, key uint32, overlapped *Overlapped) (err error) {
+ r1, _, e1 := syscall.Syscall6(procPostQueuedCompletionStatus.Addr(), 4, uintptr(cphandle), uintptr(qty), uintptr(key), uintptr(unsafe.Pointer(overlapped)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CancelIo(s Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procCancelIo.Addr(), 1, uintptr(s), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CancelIoEx(s Handle, o *Overlapped) (err error) {
+ r1, _, e1 := syscall.Syscall(procCancelIoEx.Addr(), 2, uintptr(s), uintptr(unsafe.Pointer(o)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateProcess(appName *uint16, commandLine *uint16, procSecurity *SecurityAttributes, threadSecurity *SecurityAttributes, inheritHandles bool, creationFlags uint32, env *uint16, currentDir *uint16, startupInfo *StartupInfo, outProcInfo *ProcessInformation) (err error) {
+ var _p0 uint32
+ if inheritHandles {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r1, _, e1 := syscall.Syscall12(procCreateProcessW.Addr(), 10, uintptr(unsafe.Pointer(appName)), uintptr(unsafe.Pointer(commandLine)), uintptr(unsafe.Pointer(procSecurity)), uintptr(unsafe.Pointer(threadSecurity)), uintptr(_p0), uintptr(creationFlags), uintptr(unsafe.Pointer(env)), uintptr(unsafe.Pointer(currentDir)), uintptr(unsafe.Pointer(startupInfo)), uintptr(unsafe.Pointer(outProcInfo)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func OpenProcess(da uint32, inheritHandle bool, pid uint32) (handle Handle, err error) {
+ var _p0 uint32
+ if inheritHandle {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r0, _, e1 := syscall.Syscall(procOpenProcess.Addr(), 3, uintptr(da), uintptr(_p0), uintptr(pid))
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func TerminateProcess(handle Handle, exitcode uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procTerminateProcess.Addr(), 2, uintptr(handle), uintptr(exitcode), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetExitCodeProcess(handle Handle, exitcode *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetExitCodeProcess.Addr(), 2, uintptr(handle), uintptr(unsafe.Pointer(exitcode)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetStartupInfo(startupInfo *StartupInfo) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetStartupInfoW.Addr(), 1, uintptr(unsafe.Pointer(startupInfo)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetCurrentProcess() (pseudoHandle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procGetCurrentProcess.Addr(), 0, 0, 0, 0)
+ pseudoHandle = Handle(r0)
+ if pseudoHandle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetProcessTimes(handle Handle, creationTime *Filetime, exitTime *Filetime, kernelTime *Filetime, userTime *Filetime) (err error) {
+ r1, _, e1 := syscall.Syscall6(procGetProcessTimes.Addr(), 5, uintptr(handle), uintptr(unsafe.Pointer(creationTime)), uintptr(unsafe.Pointer(exitTime)), uintptr(unsafe.Pointer(kernelTime)), uintptr(unsafe.Pointer(userTime)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DuplicateHandle(hSourceProcessHandle Handle, hSourceHandle Handle, hTargetProcessHandle Handle, lpTargetHandle *Handle, dwDesiredAccess uint32, bInheritHandle bool, dwOptions uint32) (err error) {
+ var _p0 uint32
+ if bInheritHandle {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r1, _, e1 := syscall.Syscall9(procDuplicateHandle.Addr(), 7, uintptr(hSourceProcessHandle), uintptr(hSourceHandle), uintptr(hTargetProcessHandle), uintptr(unsafe.Pointer(lpTargetHandle)), uintptr(dwDesiredAccess), uintptr(_p0), uintptr(dwOptions), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WaitForSingleObject(handle Handle, waitMilliseconds uint32) (event uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procWaitForSingleObject.Addr(), 2, uintptr(handle), uintptr(waitMilliseconds), 0)
+ event = uint32(r0)
+ if event == 0xffffffff {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetTempPath(buflen uint32, buf *uint16) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetTempPathW.Addr(), 2, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreatePipe(readhandle *Handle, writehandle *Handle, sa *SecurityAttributes, size uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procCreatePipe.Addr(), 4, uintptr(unsafe.Pointer(readhandle)), uintptr(unsafe.Pointer(writehandle)), uintptr(unsafe.Pointer(sa)), uintptr(size), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetFileType(filehandle Handle) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetFileType.Addr(), 1, uintptr(filehandle), 0, 0)
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CryptAcquireContext(provhandle *Handle, container *uint16, provider *uint16, provtype uint32, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procCryptAcquireContextW.Addr(), 5, uintptr(unsafe.Pointer(provhandle)), uintptr(unsafe.Pointer(container)), uintptr(unsafe.Pointer(provider)), uintptr(provtype), uintptr(flags), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CryptReleaseContext(provhandle Handle, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procCryptReleaseContext.Addr(), 2, uintptr(provhandle), uintptr(flags), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CryptGenRandom(provhandle Handle, buflen uint32, buf *byte) (err error) {
+ r1, _, e1 := syscall.Syscall(procCryptGenRandom.Addr(), 3, uintptr(provhandle), uintptr(buflen), uintptr(unsafe.Pointer(buf)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetEnvironmentStrings() (envs *uint16, err error) {
+ r0, _, e1 := syscall.Syscall(procGetEnvironmentStringsW.Addr(), 0, 0, 0, 0)
+ envs = (*uint16)(unsafe.Pointer(r0))
+ if envs == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FreeEnvironmentStrings(envs *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procFreeEnvironmentStringsW.Addr(), 1, uintptr(unsafe.Pointer(envs)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetEnvironmentVariable(name *uint16, buffer *uint16, size uint32) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetEnvironmentVariableW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(buffer)), uintptr(size))
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetEnvironmentVariable(name *uint16, value *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetEnvironmentVariableW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(value)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetFileTime(handle Handle, ctime *Filetime, atime *Filetime, wtime *Filetime) (err error) {
+ r1, _, e1 := syscall.Syscall6(procSetFileTime.Addr(), 4, uintptr(handle), uintptr(unsafe.Pointer(ctime)), uintptr(unsafe.Pointer(atime)), uintptr(unsafe.Pointer(wtime)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetFileAttributes(name *uint16) (attrs uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetFileAttributesW.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)
+ attrs = uint32(r0)
+ if attrs == INVALID_FILE_ATTRIBUTES {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetFileAttributes(name *uint16, attrs uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetFileAttributesW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetFileAttributesEx(name *uint16, level uint32, info *byte) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetFileAttributesExW.Addr(), 3, uintptr(unsafe.Pointer(name)), uintptr(level), uintptr(unsafe.Pointer(info)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetCommandLine() (cmd *uint16) {
+ r0, _, _ := syscall.Syscall(procGetCommandLineW.Addr(), 0, 0, 0, 0)
+ cmd = (*uint16)(unsafe.Pointer(r0))
+ return
+}
+
+func CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, err error) {
+ r0, _, e1 := syscall.Syscall(procCommandLineToArgvW.Addr(), 2, uintptr(unsafe.Pointer(cmd)), uintptr(unsafe.Pointer(argc)), 0)
+ argv = (*[8192]*[8192]uint16)(unsafe.Pointer(r0))
+ if argv == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func LocalFree(hmem Handle) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procLocalFree.Addr(), 1, uintptr(hmem), 0, 0)
+ handle = Handle(r0)
+ if handle != 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetHandleInformation(handle Handle, mask uint32, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetHandleInformation.Addr(), 3, uintptr(handle), uintptr(mask), uintptr(flags))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FlushFileBuffers(handle Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procFlushFileBuffers.Addr(), 1, uintptr(handle), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetFullPathName(path *uint16, buflen uint32, buf *uint16, fname **uint16) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall6(procGetFullPathNameW.Addr(), 4, uintptr(unsafe.Pointer(path)), uintptr(buflen), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(fname)), 0, 0)
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetLongPathName(path *uint16, buf *uint16, buflen uint32) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetLongPathNameW.Addr(), 3, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(buf)), uintptr(buflen))
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetShortPathName(longpath *uint16, shortpath *uint16, buflen uint32) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetShortPathNameW.Addr(), 3, uintptr(unsafe.Pointer(longpath)), uintptr(unsafe.Pointer(shortpath)), uintptr(buflen))
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateFileMapping(fhandle Handle, sa *SecurityAttributes, prot uint32, maxSizeHigh uint32, maxSizeLow uint32, name *uint16) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall6(procCreateFileMappingW.Addr(), 6, uintptr(fhandle), uintptr(unsafe.Pointer(sa)), uintptr(prot), uintptr(maxSizeHigh), uintptr(maxSizeLow), uintptr(unsafe.Pointer(name)))
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func MapViewOfFile(handle Handle, access uint32, offsetHigh uint32, offsetLow uint32, length uintptr) (addr uintptr, err error) {
+ r0, _, e1 := syscall.Syscall6(procMapViewOfFile.Addr(), 5, uintptr(handle), uintptr(access), uintptr(offsetHigh), uintptr(offsetLow), uintptr(length), 0)
+ addr = uintptr(r0)
+ if addr == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func UnmapViewOfFile(addr uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall(procUnmapViewOfFile.Addr(), 1, uintptr(addr), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FlushViewOfFile(addr uintptr, length uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall(procFlushViewOfFile.Addr(), 2, uintptr(addr), uintptr(length), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func VirtualLock(addr uintptr, length uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall(procVirtualLock.Addr(), 2, uintptr(addr), uintptr(length), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func VirtualUnlock(addr uintptr, length uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall(procVirtualUnlock.Addr(), 2, uintptr(addr), uintptr(length), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func VirtualAlloc(address uintptr, size uintptr, alloctype uint32, protect uint32) (value uintptr, err error) {
+ r0, _, e1 := syscall.Syscall6(procVirtualAlloc.Addr(), 4, uintptr(address), uintptr(size), uintptr(alloctype), uintptr(protect), 0, 0)
+ value = uintptr(r0)
+ if value == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func VirtualFree(address uintptr, size uintptr, freetype uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procVirtualFree.Addr(), 3, uintptr(address), uintptr(size), uintptr(freetype))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func VirtualProtect(address uintptr, size uintptr, newprotect uint32, oldprotect *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procVirtualProtect.Addr(), 4, uintptr(address), uintptr(size), uintptr(newprotect), uintptr(unsafe.Pointer(oldprotect)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func TransmitFile(s Handle, handle Handle, bytesToWrite uint32, bytsPerSend uint32, overlapped *Overlapped, transmitFileBuf *TransmitFileBuffers, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall9(procTransmitFile.Addr(), 7, uintptr(s), uintptr(handle), uintptr(bytesToWrite), uintptr(bytsPerSend), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(transmitFileBuf)), uintptr(flags), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ReadDirectoryChanges(handle Handle, buf *byte, buflen uint32, watchSubTree bool, mask uint32, retlen *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) {
+ var _p0 uint32
+ if watchSubTree {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r1, _, e1 := syscall.Syscall9(procReadDirectoryChangesW.Addr(), 8, uintptr(handle), uintptr(unsafe.Pointer(buf)), uintptr(buflen), uintptr(_p0), uintptr(mask), uintptr(unsafe.Pointer(retlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertOpenSystemStore(hprov Handle, name *uint16) (store Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procCertOpenSystemStoreW.Addr(), 2, uintptr(hprov), uintptr(unsafe.Pointer(name)), 0)
+ store = Handle(r0)
+ if store == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertOpenStore(storeProvider uintptr, msgAndCertEncodingType uint32, cryptProv uintptr, flags uint32, para uintptr) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall6(procCertOpenStore.Addr(), 5, uintptr(storeProvider), uintptr(msgAndCertEncodingType), uintptr(cryptProv), uintptr(flags), uintptr(para), 0)
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertEnumCertificatesInStore(store Handle, prevContext *CertContext) (context *CertContext, err error) {
+ r0, _, e1 := syscall.Syscall(procCertEnumCertificatesInStore.Addr(), 2, uintptr(store), uintptr(unsafe.Pointer(prevContext)), 0)
+ context = (*CertContext)(unsafe.Pointer(r0))
+ if context == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertAddCertificateContextToStore(store Handle, certContext *CertContext, addDisposition uint32, storeContext **CertContext) (err error) {
+ r1, _, e1 := syscall.Syscall6(procCertAddCertificateContextToStore.Addr(), 4, uintptr(store), uintptr(unsafe.Pointer(certContext)), uintptr(addDisposition), uintptr(unsafe.Pointer(storeContext)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertCloseStore(store Handle, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procCertCloseStore.Addr(), 2, uintptr(store), uintptr(flags), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertGetCertificateChain(engine Handle, leaf *CertContext, time *Filetime, additionalStore Handle, para *CertChainPara, flags uint32, reserved uintptr, chainCtx **CertChainContext) (err error) {
+ r1, _, e1 := syscall.Syscall9(procCertGetCertificateChain.Addr(), 8, uintptr(engine), uintptr(unsafe.Pointer(leaf)), uintptr(unsafe.Pointer(time)), uintptr(additionalStore), uintptr(unsafe.Pointer(para)), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(chainCtx)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertFreeCertificateChain(ctx *CertChainContext) {
+ syscall.Syscall(procCertFreeCertificateChain.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)
+ return
+}
+
+func CertCreateCertificateContext(certEncodingType uint32, certEncoded *byte, encodedLen uint32) (context *CertContext, err error) {
+ r0, _, e1 := syscall.Syscall(procCertCreateCertificateContext.Addr(), 3, uintptr(certEncodingType), uintptr(unsafe.Pointer(certEncoded)), uintptr(encodedLen))
+ context = (*CertContext)(unsafe.Pointer(r0))
+ if context == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertFreeCertificateContext(ctx *CertContext) (err error) {
+ r1, _, e1 := syscall.Syscall(procCertFreeCertificateContext.Addr(), 1, uintptr(unsafe.Pointer(ctx)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CertVerifyCertificateChainPolicy(policyOID uintptr, chain *CertChainContext, para *CertChainPolicyPara, status *CertChainPolicyStatus) (err error) {
+ r1, _, e1 := syscall.Syscall6(procCertVerifyCertificateChainPolicy.Addr(), 4, uintptr(policyOID), uintptr(unsafe.Pointer(chain)), uintptr(unsafe.Pointer(para)), uintptr(unsafe.Pointer(status)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func RegOpenKeyEx(key Handle, subkey *uint16, options uint32, desiredAccess uint32, result *Handle) (regerrno error) {
+ r0, _, _ := syscall.Syscall6(procRegOpenKeyExW.Addr(), 5, uintptr(key), uintptr(unsafe.Pointer(subkey)), uintptr(options), uintptr(desiredAccess), uintptr(unsafe.Pointer(result)), 0)
+ if r0 != 0 {
+ regerrno = syscall.Errno(r0)
+ }
+ return
+}
+
+func RegCloseKey(key Handle) (regerrno error) {
+ r0, _, _ := syscall.Syscall(procRegCloseKey.Addr(), 1, uintptr(key), 0, 0)
+ if r0 != 0 {
+ regerrno = syscall.Errno(r0)
+ }
+ return
+}
+
+func RegQueryInfoKey(key Handle, class *uint16, classLen *uint32, reserved *uint32, subkeysLen *uint32, maxSubkeyLen *uint32, maxClassLen *uint32, valuesLen *uint32, maxValueNameLen *uint32, maxValueLen *uint32, saLen *uint32, lastWriteTime *Filetime) (regerrno error) {
+ r0, _, _ := syscall.Syscall12(procRegQueryInfoKeyW.Addr(), 12, uintptr(key), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(subkeysLen)), uintptr(unsafe.Pointer(maxSubkeyLen)), uintptr(unsafe.Pointer(maxClassLen)), uintptr(unsafe.Pointer(valuesLen)), uintptr(unsafe.Pointer(maxValueNameLen)), uintptr(unsafe.Pointer(maxValueLen)), uintptr(unsafe.Pointer(saLen)), uintptr(unsafe.Pointer(lastWriteTime)))
+ if r0 != 0 {
+ regerrno = syscall.Errno(r0)
+ }
+ return
+}
+
+func RegEnumKeyEx(key Handle, index uint32, name *uint16, nameLen *uint32, reserved *uint32, class *uint16, classLen *uint32, lastWriteTime *Filetime) (regerrno error) {
+ r0, _, _ := syscall.Syscall9(procRegEnumKeyExW.Addr(), 8, uintptr(key), uintptr(index), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(class)), uintptr(unsafe.Pointer(classLen)), uintptr(unsafe.Pointer(lastWriteTime)), 0)
+ if r0 != 0 {
+ regerrno = syscall.Errno(r0)
+ }
+ return
+}
+
+func RegQueryValueEx(key Handle, name *uint16, reserved *uint32, valtype *uint32, buf *byte, buflen *uint32) (regerrno error) {
+ r0, _, _ := syscall.Syscall6(procRegQueryValueExW.Addr(), 6, uintptr(key), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(reserved)), uintptr(unsafe.Pointer(valtype)), uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(buflen)))
+ if r0 != 0 {
+ regerrno = syscall.Errno(r0)
+ }
+ return
+}
+
+func getCurrentProcessId() (pid uint32) {
+ r0, _, _ := syscall.Syscall(procGetCurrentProcessId.Addr(), 0, 0, 0, 0)
+ pid = uint32(r0)
+ return
+}
+
+func GetConsoleMode(console Handle, mode *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetConsoleMode(console Handle, mode uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetConsoleMode.Addr(), 2, uintptr(console), uintptr(mode), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) {
+ r1, _, e1 := syscall.Syscall6(procWriteConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(towrite), uintptr(unsafe.Pointer(written)), uintptr(unsafe.Pointer(reserved)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) {
+ r1, _, e1 := syscall.Syscall6(procReadConsoleW.Addr(), 5, uintptr(console), uintptr(unsafe.Pointer(buf)), uintptr(toread), uintptr(unsafe.Pointer(read)), uintptr(unsafe.Pointer(inputControl)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateToolhelp32Snapshot(flags uint32, processId uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procCreateToolhelp32Snapshot.Addr(), 2, uintptr(flags), uintptr(processId), 0)
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Process32First(snapshot Handle, procEntry *ProcessEntry32) (err error) {
+ r1, _, e1 := syscall.Syscall(procProcess32FirstW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Process32Next(snapshot Handle, procEntry *ProcessEntry32) (err error) {
+ r1, _, e1 := syscall.Syscall(procProcess32NextW.Addr(), 2, uintptr(snapshot), uintptr(unsafe.Pointer(procEntry)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DeviceIoControl(handle Handle, ioControlCode uint32, inBuffer *byte, inBufferSize uint32, outBuffer *byte, outBufferSize uint32, bytesReturned *uint32, overlapped *Overlapped) (err error) {
+ r1, _, e1 := syscall.Syscall9(procDeviceIoControl.Addr(), 8, uintptr(handle), uintptr(ioControlCode), uintptr(unsafe.Pointer(inBuffer)), uintptr(inBufferSize), uintptr(unsafe.Pointer(outBuffer)), uintptr(outBufferSize), uintptr(unsafe.Pointer(bytesReturned)), uintptr(unsafe.Pointer(overlapped)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateSymbolicLink(symlinkfilename *uint16, targetfilename *uint16, flags uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procCreateSymbolicLinkW.Addr(), 3, uintptr(unsafe.Pointer(symlinkfilename)), uintptr(unsafe.Pointer(targetfilename)), uintptr(flags))
+ if r1&0xff == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateHardLink(filename *uint16, existingfilename *uint16, reserved uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall(procCreateHardLinkW.Addr(), 3, uintptr(unsafe.Pointer(filename)), uintptr(unsafe.Pointer(existingfilename)), uintptr(reserved))
+ if r1&0xff == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetCurrentThreadId() (id uint32) {
+ r0, _, _ := syscall.Syscall(procGetCurrentThreadId.Addr(), 0, 0, 0, 0)
+ id = uint32(r0)
+ return
+}
+
+func CreateEvent(eventAttrs *SecurityAttributes, manualReset uint32, initialState uint32, name *uint16) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall6(procCreateEventW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(manualReset), uintptr(initialState), uintptr(unsafe.Pointer(name)), 0, 0)
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func CreateEventEx(eventAttrs *SecurityAttributes, name *uint16, flags uint32, desiredAccess uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall6(procCreateEventExW.Addr(), 4, uintptr(unsafe.Pointer(eventAttrs)), uintptr(unsafe.Pointer(name)), uintptr(flags), uintptr(desiredAccess), 0, 0)
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func OpenEvent(desiredAccess uint32, inheritHandle bool, name *uint16) (handle Handle, err error) {
+ var _p0 uint32
+ if inheritHandle {
+ _p0 = 1
+ } else {
+ _p0 = 0
+ }
+ r0, _, e1 := syscall.Syscall(procOpenEventW.Addr(), 3, uintptr(desiredAccess), uintptr(_p0), uintptr(unsafe.Pointer(name)))
+ handle = Handle(r0)
+ if handle == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetEvent(event Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetEvent.Addr(), 1, uintptr(event), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ResetEvent(event Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func PulseEvent(event Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procPulseEvent.Addr(), 1, uintptr(event), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DefineDosDevice(flags uint32, deviceName *uint16, targetPath *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procDefineDosDeviceW.Addr(), 3, uintptr(flags), uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DeleteVolumeMountPoint(volumeMountPoint *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procDeleteVolumeMountPointW.Addr(), 1, uintptr(unsafe.Pointer(volumeMountPoint)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindFirstVolume(volumeName *uint16, bufferLength uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procFindFirstVolumeW.Addr(), 2, uintptr(unsafe.Pointer(volumeName)), uintptr(bufferLength), 0)
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindFirstVolumeMountPoint(rootPathName *uint16, volumeMountPoint *uint16, bufferLength uint32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procFindFirstVolumeMountPointW.Addr(), 3, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(bufferLength))
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindNextVolume(findVolume Handle, volumeName *uint16, bufferLength uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procFindNextVolumeW.Addr(), 3, uintptr(findVolume), uintptr(unsafe.Pointer(volumeName)), uintptr(bufferLength))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindNextVolumeMountPoint(findVolumeMountPoint Handle, volumeMountPoint *uint16, bufferLength uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procFindNextVolumeMountPointW.Addr(), 3, uintptr(findVolumeMountPoint), uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(bufferLength))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindVolumeClose(findVolume Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procFindVolumeClose.Addr(), 1, uintptr(findVolume), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FindVolumeMountPointClose(findVolumeMountPoint Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procFindVolumeMountPointClose.Addr(), 1, uintptr(findVolumeMountPoint), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetDriveType(rootPathName *uint16) (driveType uint32) {
+ r0, _, _ := syscall.Syscall(procGetDriveTypeW.Addr(), 1, uintptr(unsafe.Pointer(rootPathName)), 0, 0)
+ driveType = uint32(r0)
+ return
+}
+
+func GetLogicalDrives() (drivesBitMask uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetLogicalDrives.Addr(), 0, 0, 0, 0)
+ drivesBitMask = uint32(r0)
+ if drivesBitMask == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetLogicalDriveStrings(bufferLength uint32, buffer *uint16) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procGetLogicalDriveStringsW.Addr(), 2, uintptr(bufferLength), uintptr(unsafe.Pointer(buffer)), 0)
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetVolumeInformation(rootPathName *uint16, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) {
+ r1, _, e1 := syscall.Syscall9(procGetVolumeInformationW.Addr(), 8, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeNameBuffer)), uintptr(volumeNameSize), uintptr(unsafe.Pointer(volumeNameSerialNumber)), uintptr(unsafe.Pointer(maximumComponentLength)), uintptr(unsafe.Pointer(fileSystemFlags)), uintptr(unsafe.Pointer(fileSystemNameBuffer)), uintptr(fileSystemNameSize), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetVolumeInformationByHandle(file Handle, volumeNameBuffer *uint16, volumeNameSize uint32, volumeNameSerialNumber *uint32, maximumComponentLength *uint32, fileSystemFlags *uint32, fileSystemNameBuffer *uint16, fileSystemNameSize uint32) (err error) {
+ r1, _, e1 := syscall.Syscall9(procGetVolumeInformationByHandleW.Addr(), 8, uintptr(file), uintptr(unsafe.Pointer(volumeNameBuffer)), uintptr(volumeNameSize), uintptr(unsafe.Pointer(volumeNameSerialNumber)), uintptr(unsafe.Pointer(maximumComponentLength)), uintptr(unsafe.Pointer(fileSystemFlags)), uintptr(unsafe.Pointer(fileSystemNameBuffer)), uintptr(fileSystemNameSize), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetVolumeNameForVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16, bufferlength uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetVolumeNameForVolumeMountPointW.Addr(), 3, uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(unsafe.Pointer(volumeName)), uintptr(bufferlength))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetVolumePathName(fileName *uint16, volumePathName *uint16, bufferLength uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetVolumePathNameW.Addr(), 3, uintptr(unsafe.Pointer(fileName)), uintptr(unsafe.Pointer(volumePathName)), uintptr(bufferLength))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetVolumePathNamesForVolumeName(volumeName *uint16, volumePathNames *uint16, bufferLength uint32, returnLength *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procGetVolumePathNamesForVolumeNameW.Addr(), 4, uintptr(unsafe.Pointer(volumeName)), uintptr(unsafe.Pointer(volumePathNames)), uintptr(bufferLength), uintptr(unsafe.Pointer(returnLength)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func QueryDosDevice(deviceName *uint16, targetPath *uint16, max uint32) (n uint32, err error) {
+ r0, _, e1 := syscall.Syscall(procQueryDosDeviceW.Addr(), 3, uintptr(unsafe.Pointer(deviceName)), uintptr(unsafe.Pointer(targetPath)), uintptr(max))
+ n = uint32(r0)
+ if n == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetVolumeLabel(rootPathName *uint16, volumeName *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetVolumeLabelW.Addr(), 2, uintptr(unsafe.Pointer(rootPathName)), uintptr(unsafe.Pointer(volumeName)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func SetVolumeMountPoint(volumeMountPoint *uint16, volumeName *uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetVolumeMountPointW.Addr(), 2, uintptr(unsafe.Pointer(volumeMountPoint)), uintptr(unsafe.Pointer(volumeName)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WSAStartup(verreq uint32, data *WSAData) (sockerr error) {
+ r0, _, _ := syscall.Syscall(procWSAStartup.Addr(), 2, uintptr(verreq), uintptr(unsafe.Pointer(data)), 0)
+ if r0 != 0 {
+ sockerr = syscall.Errno(r0)
+ }
+ return
+}
+
+func WSACleanup() (err error) {
+ r1, _, e1 := syscall.Syscall(procWSACleanup.Addr(), 0, 0, 0, 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WSAIoctl(s Handle, iocc uint32, inbuf *byte, cbif uint32, outbuf *byte, cbob uint32, cbbr *uint32, overlapped *Overlapped, completionRoutine uintptr) (err error) {
+ r1, _, e1 := syscall.Syscall9(procWSAIoctl.Addr(), 9, uintptr(s), uintptr(iocc), uintptr(unsafe.Pointer(inbuf)), uintptr(cbif), uintptr(unsafe.Pointer(outbuf)), uintptr(cbob), uintptr(unsafe.Pointer(cbbr)), uintptr(unsafe.Pointer(overlapped)), uintptr(completionRoutine))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func socket(af int32, typ int32, protocol int32) (handle Handle, err error) {
+ r0, _, e1 := syscall.Syscall(procsocket.Addr(), 3, uintptr(af), uintptr(typ), uintptr(protocol))
+ handle = Handle(r0)
+ if handle == InvalidHandle {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Setsockopt(s Handle, level int32, optname int32, optval *byte, optlen int32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procsetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(optlen), 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Getsockopt(s Handle, level int32, optname int32, optval *byte, optlen *int32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procgetsockopt.Addr(), 5, uintptr(s), uintptr(level), uintptr(optname), uintptr(unsafe.Pointer(optval)), uintptr(unsafe.Pointer(optlen)), 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func bind(s Handle, name unsafe.Pointer, namelen int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procbind.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func connect(s Handle, name unsafe.Pointer, namelen int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procconnect.Addr(), 3, uintptr(s), uintptr(name), uintptr(namelen))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func getsockname(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procgetsockname.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func getpeername(s Handle, rsa *RawSockaddrAny, addrlen *int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procgetpeername.Addr(), 3, uintptr(s), uintptr(unsafe.Pointer(rsa)), uintptr(unsafe.Pointer(addrlen)))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func listen(s Handle, backlog int32) (err error) {
+ r1, _, e1 := syscall.Syscall(proclisten.Addr(), 2, uintptr(s), uintptr(backlog), 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func shutdown(s Handle, how int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procshutdown.Addr(), 2, uintptr(s), uintptr(how), 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Closesocket(s Handle) (err error) {
+ r1, _, e1 := syscall.Syscall(procclosesocket.Addr(), 1, uintptr(s), 0, 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func AcceptEx(ls Handle, as Handle, buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, recvd *uint32, overlapped *Overlapped) (err error) {
+ r1, _, e1 := syscall.Syscall9(procAcceptEx.Addr(), 8, uintptr(ls), uintptr(as), uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(overlapped)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetAcceptExSockaddrs(buf *byte, rxdatalen uint32, laddrlen uint32, raddrlen uint32, lrsa **RawSockaddrAny, lrsalen *int32, rrsa **RawSockaddrAny, rrsalen *int32) {
+ syscall.Syscall9(procGetAcceptExSockaddrs.Addr(), 8, uintptr(unsafe.Pointer(buf)), uintptr(rxdatalen), uintptr(laddrlen), uintptr(raddrlen), uintptr(unsafe.Pointer(lrsa)), uintptr(unsafe.Pointer(lrsalen)), uintptr(unsafe.Pointer(rrsa)), uintptr(unsafe.Pointer(rrsalen)), 0)
+ return
+}
+
+func WSARecv(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, overlapped *Overlapped, croutine *byte) (err error) {
+ r1, _, e1 := syscall.Syscall9(procWSARecv.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WSASend(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, overlapped *Overlapped, croutine *byte) (err error) {
+ r1, _, e1 := syscall.Syscall9(procWSASend.Addr(), 7, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)), 0, 0)
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WSARecvFrom(s Handle, bufs *WSABuf, bufcnt uint32, recvd *uint32, flags *uint32, from *RawSockaddrAny, fromlen *int32, overlapped *Overlapped, croutine *byte) (err error) {
+ r1, _, e1 := syscall.Syscall9(procWSARecvFrom.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(recvd)), uintptr(unsafe.Pointer(flags)), uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(fromlen)), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WSASendTo(s Handle, bufs *WSABuf, bufcnt uint32, sent *uint32, flags uint32, to *RawSockaddrAny, tolen int32, overlapped *Overlapped, croutine *byte) (err error) {
+ r1, _, e1 := syscall.Syscall9(procWSASendTo.Addr(), 9, uintptr(s), uintptr(unsafe.Pointer(bufs)), uintptr(bufcnt), uintptr(unsafe.Pointer(sent)), uintptr(flags), uintptr(unsafe.Pointer(to)), uintptr(tolen), uintptr(unsafe.Pointer(overlapped)), uintptr(unsafe.Pointer(croutine)))
+ if r1 == socket_error {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetHostByName(name string) (h *Hostent, err error) {
+ var _p0 *byte
+ _p0, err = syscall.BytePtrFromString(name)
+ if err != nil {
+ return
+ }
+ return _GetHostByName(_p0)
+}
+
+func _GetHostByName(name *byte) (h *Hostent, err error) {
+ r0, _, e1 := syscall.Syscall(procgethostbyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)
+ h = (*Hostent)(unsafe.Pointer(r0))
+ if h == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetServByName(name string, proto string) (s *Servent, err error) {
+ var _p0 *byte
+ _p0, err = syscall.BytePtrFromString(name)
+ if err != nil {
+ return
+ }
+ var _p1 *byte
+ _p1, err = syscall.BytePtrFromString(proto)
+ if err != nil {
+ return
+ }
+ return _GetServByName(_p0, _p1)
+}
+
+func _GetServByName(name *byte, proto *byte) (s *Servent, err error) {
+ r0, _, e1 := syscall.Syscall(procgetservbyname.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(proto)), 0)
+ s = (*Servent)(unsafe.Pointer(r0))
+ if s == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func Ntohs(netshort uint16) (u uint16) {
+ r0, _, _ := syscall.Syscall(procntohs.Addr(), 1, uintptr(netshort), 0, 0)
+ u = uint16(r0)
+ return
+}
+
+func GetProtoByName(name string) (p *Protoent, err error) {
+ var _p0 *byte
+ _p0, err = syscall.BytePtrFromString(name)
+ if err != nil {
+ return
+ }
+ return _GetProtoByName(_p0)
+}
+
+func _GetProtoByName(name *byte) (p *Protoent, err error) {
+ r0, _, e1 := syscall.Syscall(procgetprotobyname.Addr(), 1, uintptr(unsafe.Pointer(name)), 0, 0)
+ p = (*Protoent)(unsafe.Pointer(r0))
+ if p == nil {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func DnsQuery(name string, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {
+ var _p0 *uint16
+ _p0, status = syscall.UTF16PtrFromString(name)
+ if status != nil {
+ return
+ }
+ return _DnsQuery(_p0, qtype, options, extra, qrs, pr)
+}
+
+func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {
+ r0, _, _ := syscall.Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr)))
+ if r0 != 0 {
+ status = syscall.Errno(r0)
+ }
+ return
+}
+
+func DnsRecordListFree(rl *DNSRecord, freetype uint32) {
+ syscall.Syscall(procDnsRecordListFree.Addr(), 2, uintptr(unsafe.Pointer(rl)), uintptr(freetype), 0)
+ return
+}
+
+func DnsNameCompare(name1 *uint16, name2 *uint16) (same bool) {
+ r0, _, _ := syscall.Syscall(procDnsNameCompare_W.Addr(), 2, uintptr(unsafe.Pointer(name1)), uintptr(unsafe.Pointer(name2)), 0)
+ same = r0 != 0
+ return
+}
+
+func GetAddrInfoW(nodename *uint16, servicename *uint16, hints *AddrinfoW, result **AddrinfoW) (sockerr error) {
+ r0, _, _ := syscall.Syscall6(procGetAddrInfoW.Addr(), 4, uintptr(unsafe.Pointer(nodename)), uintptr(unsafe.Pointer(servicename)), uintptr(unsafe.Pointer(hints)), uintptr(unsafe.Pointer(result)), 0, 0)
+ if r0 != 0 {
+ sockerr = syscall.Errno(r0)
+ }
+ return
+}
+
+func FreeAddrInfoW(addrinfo *AddrinfoW) {
+ syscall.Syscall(procFreeAddrInfoW.Addr(), 1, uintptr(unsafe.Pointer(addrinfo)), 0, 0)
+ return
+}
+
+func GetIfEntry(pIfRow *MibIfRow) (errcode error) {
+ r0, _, _ := syscall.Syscall(procGetIfEntry.Addr(), 1, uintptr(unsafe.Pointer(pIfRow)), 0, 0)
+ if r0 != 0 {
+ errcode = syscall.Errno(r0)
+ }
+ return
+}
+
+func GetAdaptersInfo(ai *IpAdapterInfo, ol *uint32) (errcode error) {
+ r0, _, _ := syscall.Syscall(procGetAdaptersInfo.Addr(), 2, uintptr(unsafe.Pointer(ai)), uintptr(unsafe.Pointer(ol)), 0)
+ if r0 != 0 {
+ errcode = syscall.Errno(r0)
+ }
+ return
+}
+
+func SetFileCompletionNotificationModes(handle Handle, flags uint8) (err error) {
+ r1, _, e1 := syscall.Syscall(procSetFileCompletionNotificationModes.Addr(), 2, uintptr(handle), uintptr(flags), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func WSAEnumProtocols(protocols *int32, protocolBuffer *WSAProtocolInfo, bufferLength *uint32) (n int32, err error) {
+ r0, _, e1 := syscall.Syscall(procWSAEnumProtocolsW.Addr(), 3, uintptr(unsafe.Pointer(protocols)), uintptr(unsafe.Pointer(protocolBuffer)), uintptr(unsafe.Pointer(bufferLength)))
+ n = int32(r0)
+ if n == -1 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetAdaptersAddresses(family uint32, flags uint32, reserved uintptr, adapterAddresses *IpAdapterAddresses, sizePointer *uint32) (errcode error) {
+ r0, _, _ := syscall.Syscall6(procGetAdaptersAddresses.Addr(), 5, uintptr(family), uintptr(flags), uintptr(reserved), uintptr(unsafe.Pointer(adapterAddresses)), uintptr(unsafe.Pointer(sizePointer)), 0)
+ if r0 != 0 {
+ errcode = syscall.Errno(r0)
+ }
+ return
+}
+
+func GetACP() (acp uint32) {
+ r0, _, _ := syscall.Syscall(procGetACP.Addr(), 0, 0, 0, 0)
+ acp = uint32(r0)
+ return
+}
+
+func MultiByteToWideChar(codePage uint32, dwFlags uint32, str *byte, nstr int32, wchar *uint16, nwchar int32) (nwrite int32, err error) {
+ r0, _, e1 := syscall.Syscall6(procMultiByteToWideChar.Addr(), 6, uintptr(codePage), uintptr(dwFlags), uintptr(unsafe.Pointer(str)), uintptr(nstr), uintptr(unsafe.Pointer(wchar)), uintptr(nwchar))
+ nwrite = int32(r0)
+ if nwrite == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func TranslateName(accName *uint16, accNameFormat uint32, desiredNameFormat uint32, translatedName *uint16, nSize *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procTranslateNameW.Addr(), 5, uintptr(unsafe.Pointer(accName)), uintptr(accNameFormat), uintptr(desiredNameFormat), uintptr(unsafe.Pointer(translatedName)), uintptr(unsafe.Pointer(nSize)), 0)
+ if r1&0xff == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetUserNameEx(nameFormat uint32, nameBuffre *uint16, nSize *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetUserNameExW.Addr(), 3, uintptr(nameFormat), uintptr(unsafe.Pointer(nameBuffre)), uintptr(unsafe.Pointer(nSize)))
+ if r1&0xff == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func NetUserGetInfo(serverName *uint16, userName *uint16, level uint32, buf **byte) (neterr error) {
+ r0, _, _ := syscall.Syscall6(procNetUserGetInfo.Addr(), 4, uintptr(unsafe.Pointer(serverName)), uintptr(unsafe.Pointer(userName)), uintptr(level), uintptr(unsafe.Pointer(buf)), 0, 0)
+ if r0 != 0 {
+ neterr = syscall.Errno(r0)
+ }
+ return
+}
+
+func NetGetJoinInformation(server *uint16, name **uint16, bufType *uint32) (neterr error) {
+ r0, _, _ := syscall.Syscall(procNetGetJoinInformation.Addr(), 3, uintptr(unsafe.Pointer(server)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(bufType)))
+ if r0 != 0 {
+ neterr = syscall.Errno(r0)
+ }
+ return
+}
+
+func NetApiBufferFree(buf *byte) (neterr error) {
+ r0, _, _ := syscall.Syscall(procNetApiBufferFree.Addr(), 1, uintptr(unsafe.Pointer(buf)), 0, 0)
+ if r0 != 0 {
+ neterr = syscall.Errno(r0)
+ }
+ return
+}
+
+func LookupAccountSid(systemName *uint16, sid *SID, name *uint16, nameLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall9(procLookupAccountSidW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(name)), uintptr(unsafe.Pointer(nameLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func LookupAccountName(systemName *uint16, accountName *uint16, sid *SID, sidLen *uint32, refdDomainName *uint16, refdDomainNameLen *uint32, use *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall9(procLookupAccountNameW.Addr(), 7, uintptr(unsafe.Pointer(systemName)), uintptr(unsafe.Pointer(accountName)), uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(sidLen)), uintptr(unsafe.Pointer(refdDomainName)), uintptr(unsafe.Pointer(refdDomainNameLen)), uintptr(unsafe.Pointer(use)), 0, 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ConvertSidToStringSid(sid *SID, stringSid **uint16) (err error) {
+ r1, _, e1 := syscall.Syscall(procConvertSidToStringSidW.Addr(), 2, uintptr(unsafe.Pointer(sid)), uintptr(unsafe.Pointer(stringSid)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func ConvertStringSidToSid(stringSid *uint16, sid **SID) (err error) {
+ r1, _, e1 := syscall.Syscall(procConvertStringSidToSidW.Addr(), 2, uintptr(unsafe.Pointer(stringSid)), uintptr(unsafe.Pointer(sid)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetLengthSid(sid *SID) (len uint32) {
+ r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0)
+ len = uint32(r0)
+ return
+}
+
+func CopySid(destSidLen uint32, destSid *SID, srcSid *SID) (err error) {
+ r1, _, e1 := syscall.Syscall(procCopySid.Addr(), 3, uintptr(destSidLen), uintptr(unsafe.Pointer(destSid)), uintptr(unsafe.Pointer(srcSid)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func AllocateAndInitializeSid(identAuth *SidIdentifierAuthority, subAuth byte, subAuth0 uint32, subAuth1 uint32, subAuth2 uint32, subAuth3 uint32, subAuth4 uint32, subAuth5 uint32, subAuth6 uint32, subAuth7 uint32, sid **SID) (err error) {
+ r1, _, e1 := syscall.Syscall12(procAllocateAndInitializeSid.Addr(), 11, uintptr(unsafe.Pointer(identAuth)), uintptr(subAuth), uintptr(subAuth0), uintptr(subAuth1), uintptr(subAuth2), uintptr(subAuth3), uintptr(subAuth4), uintptr(subAuth5), uintptr(subAuth6), uintptr(subAuth7), uintptr(unsafe.Pointer(sid)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func FreeSid(sid *SID) (err error) {
+ r1, _, e1 := syscall.Syscall(procFreeSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0)
+ if r1 != 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func EqualSid(sid1 *SID, sid2 *SID) (isEqual bool) {
+ r0, _, _ := syscall.Syscall(procEqualSid.Addr(), 2, uintptr(unsafe.Pointer(sid1)), uintptr(unsafe.Pointer(sid2)), 0)
+ isEqual = r0 != 0
+ return
+}
+
+func checkTokenMembership(tokenHandle Token, sidToCheck *SID, isMember *int32) (err error) {
+ r1, _, e1 := syscall.Syscall(procCheckTokenMembership.Addr(), 3, uintptr(tokenHandle), uintptr(unsafe.Pointer(sidToCheck)), uintptr(unsafe.Pointer(isMember)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func OpenProcessToken(h Handle, access uint32, token *Token) (err error) {
+ r1, _, e1 := syscall.Syscall(procOpenProcessToken.Addr(), 3, uintptr(h), uintptr(access), uintptr(unsafe.Pointer(token)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetTokenInformation(t Token, infoClass uint32, info *byte, infoLen uint32, returnedLen *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall6(procGetTokenInformation.Addr(), 5, uintptr(t), uintptr(infoClass), uintptr(unsafe.Pointer(info)), uintptr(infoLen), uintptr(unsafe.Pointer(returnedLen)), 0)
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
+
+func GetUserProfileDirectory(t Token, dir *uint16, dirLen *uint32) (err error) {
+ r1, _, e1 := syscall.Syscall(procGetUserProfileDirectoryW.Addr(), 3, uintptr(t), uintptr(unsafe.Pointer(dir)), uintptr(unsafe.Pointer(dirLen)))
+ if r1 == 0 {
+ if e1 != 0 {
+ err = errnoErr(e1)
+ } else {
+ err = syscall.EINVAL
+ }
+ }
+ return
+}
diff --git a/vendor/golang.org/x/text/width/gen.go b/vendor/golang.org/x/text/width/gen.go
new file mode 100644
index 00000000000..092277e1f64
--- /dev/null
+++ b/vendor/golang.org/x/text/width/gen.go
@@ -0,0 +1,115 @@
+// 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.
+
+// +build ignore
+
+// This program generates the trie for width operations. The generated table
+// includes width category information as well as the normalization mappings.
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "log"
+ "math"
+ "unicode/utf8"
+
+ "golang.org/x/text/internal/gen"
+ "golang.org/x/text/internal/triegen"
+)
+
+// See gen_common.go for flags.
+
+func main() {
+ gen.Init()
+ genTables()
+ genTests()
+ gen.Repackage("gen_trieval.go", "trieval.go", "width")
+ gen.Repackage("gen_common.go", "common_test.go", "width")
+}
+
+func genTables() {
+ t := triegen.NewTrie("width")
+ // fold and inverse mappings. See mapComment for a description of the format
+ // of each entry. Add dummy value to make an index of 0 mean no mapping.
+ inverse := [][4]byte{{}}
+ mapping := map[[4]byte]int{[4]byte{}: 0}
+
+ getWidthData(func(r rune, tag elem, alt rune) {
+ idx := 0
+ if alt != 0 {
+ var buf [4]byte
+ buf[0] = byte(utf8.EncodeRune(buf[1:], alt))
+ s := string(r)
+ buf[buf[0]] ^= s[len(s)-1]
+ var ok bool
+ if idx, ok = mapping[buf]; !ok {
+ idx = len(mapping)
+ if idx > math.MaxUint8 {
+ log.Fatalf("Index %d does not fit in a byte.", idx)
+ }
+ mapping[buf] = idx
+ inverse = append(inverse, buf)
+ }
+ }
+ t.Insert(r, uint64(tag|elem(idx)))
+ })
+
+ w := &bytes.Buffer{}
+ gen.WriteUnicodeVersion(w)
+
+ sz, err := t.Gen(w)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ sz += writeMappings(w, inverse)
+
+ fmt.Fprintf(w, "// Total table size %d bytes (%dKiB)\n", sz, sz/1024)
+
+ gen.WriteVersionedGoFile(*outputFile, "width", w.Bytes())
+}
+
+const inverseDataComment = `
+// inverseData contains 4-byte entries of the following format:
+// <0 padding>
+// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the
+// UTF-8 encoding of the original rune. Mappings often have the following
+// pattern:
+// A -> A (U+FF21 -> U+0041)
+// B -> B (U+FF22 -> U+0042)
+// ...
+// By xor-ing the last byte the same entry can be shared by many mappings. This
+// reduces the total number of distinct entries by about two thirds.
+// The resulting entry for the aforementioned mappings is
+// { 0x01, 0xE0, 0x00, 0x00 }
+// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get
+// E0 ^ A1 = 41.
+// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get
+// E0 ^ A2 = 42.
+// Note that because of the xor-ing, the byte sequence stored in the entry is
+// not valid UTF-8.`
+
+func writeMappings(w io.Writer, data [][4]byte) int {
+ fmt.Fprintln(w, inverseDataComment)
+ fmt.Fprintf(w, "var inverseData = [%d][4]byte{\n", len(data))
+ for _, x := range data {
+ fmt.Fprintf(w, "{ 0x%02x, 0x%02x, 0x%02x, 0x%02x },\n", x[0], x[1], x[2], x[3])
+ }
+ fmt.Fprintln(w, "}")
+ return len(data) * 4
+}
+
+func genTests() {
+ w := &bytes.Buffer{}
+ fmt.Fprintf(w, "\nvar mapRunes = map[rune]struct{r rune; e elem}{\n")
+ getWidthData(func(r rune, tag elem, alt rune) {
+ if alt != 0 {
+ fmt.Fprintf(w, "\t0x%X: {0x%X, 0x%X},\n", r, alt, tag)
+ }
+ })
+ fmt.Fprintln(w, "}")
+ gen.WriteGoFile("runes_test.go", "width", w.Bytes())
+}
diff --git a/vendor/golang.org/x/text/width/gen_common.go b/vendor/golang.org/x/text/width/gen_common.go
new file mode 100644
index 00000000000..601e7526843
--- /dev/null
+++ b/vendor/golang.org/x/text/width/gen_common.go
@@ -0,0 +1,96 @@
+// 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.
+
+// +build ignore
+
+package main
+
+// This code is shared between the main code generator and the test code.
+
+import (
+ "flag"
+ "log"
+ "strconv"
+ "strings"
+
+ "golang.org/x/text/internal/gen"
+ "golang.org/x/text/internal/ucd"
+)
+
+var (
+ outputFile = flag.String("out", "tables.go", "output file")
+)
+
+var typeMap = map[string]elem{
+ "A": tagAmbiguous,
+ "N": tagNeutral,
+ "Na": tagNarrow,
+ "W": tagWide,
+ "F": tagFullwidth,
+ "H": tagHalfwidth,
+}
+
+// getWidthData calls f for every entry for which it is defined.
+//
+// f may be called multiple times for the same rune. The last call to f is the
+// correct value. f is not called for all runes. The default tag type is
+// Neutral.
+func getWidthData(f func(r rune, tag elem, alt rune)) {
+ // Set the default values for Unified Ideographs. In line with Annex 11,
+ // we encode full ranges instead of the defined runes in Unified_Ideograph.
+ for _, b := range []struct{ lo, hi rune }{
+ {0x4E00, 0x9FFF}, // the CJK Unified Ideographs block,
+ {0x3400, 0x4DBF}, // the CJK Unified Ideographs Externsion A block,
+ {0xF900, 0xFAFF}, // the CJK Compatibility Ideographs block,
+ {0x20000, 0x2FFFF}, // the Supplementary Ideographic Plane,
+ {0x30000, 0x3FFFF}, // the Tertiary Ideographic Plane,
+ } {
+ for r := b.lo; r <= b.hi; r++ {
+ f(r, tagWide, 0)
+ }
+ }
+
+ inverse := map[rune]rune{}
+ maps := map[string]bool{
+ "": true,
+ "": true,
+ }
+
+ // We cannot reuse package norm's decomposition, as we need an unexpanded
+ // decomposition. We make use of the opportunity to verify that the
+ // decomposition type is as expected.
+ ucd.Parse(gen.OpenUCDFile("UnicodeData.txt"), func(p *ucd.Parser) {
+ r := p.Rune(0)
+ s := strings.SplitN(p.String(ucd.DecompMapping), " ", 2)
+ if !maps[s[0]] {
+ return
+ }
+ x, err := strconv.ParseUint(s[1], 16, 32)
+ if err != nil {
+ log.Fatalf("Error parsing rune %q", s[1])
+ }
+ if inverse[r] != 0 || inverse[rune(x)] != 0 {
+ log.Fatalf("Circular dependency in mapping between %U and %U", r, x)
+ }
+ inverse[r] = rune(x)
+ inverse[rune(x)] = r
+ })
+
+ // ;
+ ucd.Parse(gen.OpenUCDFile("EastAsianWidth.txt"), func(p *ucd.Parser) {
+ tag, ok := typeMap[p.String(1)]
+ if !ok {
+ log.Fatalf("Unknown width type %q", p.String(1))
+ }
+ r := p.Rune(0)
+ alt, ok := inverse[r]
+ if tag == tagFullwidth || tag == tagHalfwidth && r != wonSign {
+ tag |= tagNeedsFold
+ if !ok {
+ log.Fatalf("Narrow or wide rune %U has no decomposition", r)
+ }
+ }
+ f(r, tag, alt)
+ })
+}
diff --git a/vendor/golang.org/x/text/width/gen_trieval.go b/vendor/golang.org/x/text/width/gen_trieval.go
new file mode 100644
index 00000000000..c17334aa618
--- /dev/null
+++ b/vendor/golang.org/x/text/width/gen_trieval.go
@@ -0,0 +1,34 @@
+// 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.
+
+// +build ignore
+
+package main
+
+// elem is an entry of the width trie. The high byte is used to encode the type
+// of the rune. The low byte is used to store the index to a mapping entry in
+// the inverseData array.
+type elem uint16
+
+const (
+ tagNeutral elem = iota << typeShift
+ tagAmbiguous
+ tagWide
+ tagNarrow
+ tagFullwidth
+ tagHalfwidth
+)
+
+const (
+ numTypeBits = 3
+ typeShift = 16 - numTypeBits
+
+ // tagNeedsFold is true for all fullwidth and halfwidth runes except for
+ // the Won sign U+20A9.
+ tagNeedsFold = 0x1000
+
+ // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide
+ // variant.
+ wonSign rune = 0x20A9
+)
diff --git a/vendor/golang.org/x/text/width/kind_string.go b/vendor/golang.org/x/text/width/kind_string.go
new file mode 100644
index 00000000000..49bfbf72683
--- /dev/null
+++ b/vendor/golang.org/x/text/width/kind_string.go
@@ -0,0 +1,16 @@
+// Code generated by "stringer -type=Kind"; DO NOT EDIT.
+
+package width
+
+import "fmt"
+
+const _Kind_name = "NeutralEastAsianAmbiguousEastAsianWideEastAsianNarrowEastAsianFullwidthEastAsianHalfwidth"
+
+var _Kind_index = [...]uint8{0, 7, 25, 38, 53, 71, 89}
+
+func (i Kind) String() string {
+ if i < 0 || i >= Kind(len(_Kind_index)-1) {
+ return fmt.Sprintf("Kind(%d)", i)
+ }
+ return _Kind_name[_Kind_index[i]:_Kind_index[i+1]]
+}
diff --git a/vendor/golang.org/x/text/width/tables10.0.0.go b/vendor/golang.org/x/text/width/tables10.0.0.go
new file mode 100644
index 00000000000..f4988626731
--- /dev/null
+++ b/vendor/golang.org/x/text/width/tables10.0.0.go
@@ -0,0 +1,1318 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build go1.10
+
+package width
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "10.0.0"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *widthTrie) lookup(s []byte) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return widthValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = widthIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *widthTrie) lookupUnsafe(s []byte) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return widthValues[c0]
+ }
+ i := widthIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *widthTrie) lookupString(s string) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return widthValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = widthIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *widthTrie) lookupStringUnsafe(s string) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return widthValues[c0]
+ }
+ i := widthIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// widthTrie. Total size: 14336 bytes (14.00 KiB). Checksum: c59df54630d3dc4a.
+type widthTrie struct{}
+
+func newWidthTrie(i int) *widthTrie {
+ return &widthTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *widthTrie) lookupValue(n uint32, b byte) uint16 {
+ switch {
+ default:
+ return uint16(widthValues[n<<6+uint32(b)])
+ }
+}
+
+// widthValues: 101 blocks, 6464 entries, 12928 bytes
+// The third block is the zero block.
+var widthValues = [6464]uint16{
+ // Block 0x0, offset 0x0
+ 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002,
+ 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002,
+ 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002,
+ 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002,
+ 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002,
+ 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002,
+ // Block 0x1, offset 0x40
+ 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003,
+ 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003,
+ 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003,
+ 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003,
+ 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003,
+ 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004,
+ 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004,
+ 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004,
+ 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004,
+ 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004,
+ 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005,
+ 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000,
+ 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008,
+ 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000,
+ 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000,
+ 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000,
+ // Block 0x4, offset 0x100
+ 0x106: 0x2000,
+ 0x110: 0x2000,
+ 0x117: 0x2000,
+ 0x118: 0x2000,
+ 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000,
+ 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000,
+ 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000,
+ 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000,
+ 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000,
+ 0x13c: 0x2000, 0x13e: 0x2000,
+ // Block 0x5, offset 0x140
+ 0x141: 0x2000,
+ 0x151: 0x2000,
+ 0x153: 0x2000,
+ 0x15b: 0x2000,
+ 0x166: 0x2000, 0x167: 0x2000,
+ 0x16b: 0x2000,
+ 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000,
+ 0x178: 0x2000,
+ 0x17f: 0x2000,
+ // Block 0x6, offset 0x180
+ 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000,
+ 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000,
+ 0x18d: 0x2000,
+ 0x192: 0x2000, 0x193: 0x2000,
+ 0x1a6: 0x2000, 0x1a7: 0x2000,
+ 0x1ab: 0x2000,
+ // Block 0x7, offset 0x1c0
+ 0x1ce: 0x2000, 0x1d0: 0x2000,
+ 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000,
+ 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000,
+ // Block 0x8, offset 0x200
+ 0x211: 0x2000,
+ 0x221: 0x2000,
+ // Block 0x9, offset 0x240
+ 0x244: 0x2000,
+ 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000,
+ 0x24d: 0x2000, 0x250: 0x2000,
+ 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000,
+ 0x25f: 0x2000,
+ // Block 0xa, offset 0x280
+ 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000,
+ 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000,
+ 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000,
+ 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000,
+ 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000,
+ 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000,
+ 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000,
+ 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000,
+ 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000,
+ 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000,
+ 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000,
+ 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000,
+ 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000,
+ 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000,
+ 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000,
+ 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000,
+ 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000,
+ 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000,
+ // Block 0xc, offset 0x300
+ 0x311: 0x2000,
+ 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000,
+ 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000,
+ 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000,
+ 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000,
+ 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000,
+ 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000,
+ 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000,
+ // Block 0xd, offset 0x340
+ 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000,
+ 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000,
+ // Block 0xe, offset 0x380
+ 0x381: 0x2000,
+ 0x390: 0x2000, 0x391: 0x2000,
+ 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000,
+ 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000,
+ 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000,
+ 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000,
+ 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000,
+ 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000,
+ 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000,
+ 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000,
+ 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000,
+ 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000,
+ // Block 0x10, offset 0x400
+ 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000,
+ 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000,
+ 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000,
+ 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000,
+ 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000,
+ 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000,
+ 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000,
+ 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000,
+ 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000,
+ 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000,
+ 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000,
+ // Block 0x11, offset 0x440
+ 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000,
+ 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000,
+ 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000,
+ 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000,
+ 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000,
+ 0x45e: 0x4000, 0x45f: 0x4000,
+ // Block 0x12, offset 0x480
+ 0x490: 0x2000,
+ 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000,
+ 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000,
+ 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000,
+ 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000,
+ 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000,
+ 0x4bb: 0x2000,
+ 0x4be: 0x2000,
+ // Block 0x13, offset 0x4c0
+ 0x4f4: 0x2000,
+ 0x4ff: 0x2000,
+ // Block 0x14, offset 0x500
+ 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000,
+ 0x529: 0xa009,
+ 0x52c: 0x2000,
+ // Block 0x15, offset 0x540
+ 0x543: 0x2000, 0x545: 0x2000,
+ 0x549: 0x2000,
+ 0x553: 0x2000, 0x556: 0x2000,
+ 0x561: 0x2000, 0x562: 0x2000,
+ 0x566: 0x2000,
+ 0x56b: 0x2000,
+ // Block 0x16, offset 0x580
+ 0x593: 0x2000, 0x594: 0x2000,
+ 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000,
+ 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000,
+ 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000,
+ 0x5aa: 0x2000, 0x5ab: 0x2000,
+ 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000,
+ 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000,
+ // Block 0x17, offset 0x5c0
+ 0x5c9: 0x2000,
+ 0x5d0: 0x200a, 0x5d1: 0x200b,
+ 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000,
+ 0x5d8: 0x2000, 0x5d9: 0x2000,
+ 0x5f8: 0x2000, 0x5f9: 0x2000,
+ // Block 0x18, offset 0x600
+ 0x612: 0x2000, 0x614: 0x2000,
+ 0x627: 0x2000,
+ // Block 0x19, offset 0x640
+ 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000,
+ 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000,
+ 0x64f: 0x2000, 0x651: 0x2000,
+ 0x655: 0x2000,
+ 0x65a: 0x2000, 0x65d: 0x2000,
+ 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000,
+ 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000,
+ 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000,
+ 0x674: 0x2000, 0x675: 0x2000,
+ 0x676: 0x2000, 0x677: 0x2000,
+ 0x67c: 0x2000, 0x67d: 0x2000,
+ // Block 0x1a, offset 0x680
+ 0x688: 0x2000,
+ 0x68c: 0x2000,
+ 0x692: 0x2000,
+ 0x6a0: 0x2000, 0x6a1: 0x2000,
+ 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000,
+ 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000,
+ // Block 0x1b, offset 0x6c0
+ 0x6c2: 0x2000, 0x6c3: 0x2000,
+ 0x6c6: 0x2000, 0x6c7: 0x2000,
+ 0x6d5: 0x2000,
+ 0x6d9: 0x2000,
+ 0x6e5: 0x2000,
+ 0x6ff: 0x2000,
+ // Block 0x1c, offset 0x700
+ 0x712: 0x2000,
+ 0x71a: 0x4000, 0x71b: 0x4000,
+ 0x729: 0x4000,
+ 0x72a: 0x4000,
+ // Block 0x1d, offset 0x740
+ 0x769: 0x4000,
+ 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000,
+ 0x770: 0x4000, 0x773: 0x4000,
+ // Block 0x1e, offset 0x780
+ 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000,
+ 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000,
+ 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000,
+ 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000,
+ 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000,
+ 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000,
+ // Block 0x1f, offset 0x7c0
+ 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000,
+ 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000,
+ 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000,
+ 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000,
+ 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000,
+ 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000,
+ 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000,
+ 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000,
+ 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000,
+ 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000,
+ 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000,
+ // Block 0x20, offset 0x800
+ 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000,
+ 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000,
+ 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000,
+ 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000,
+ 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000,
+ 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000,
+ 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000,
+ 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000,
+ 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000,
+ 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000,
+ 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000,
+ // Block 0x21, offset 0x840
+ 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000,
+ 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000,
+ 0x850: 0x2000, 0x851: 0x2000,
+ 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000,
+ 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000,
+ 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000,
+ 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000,
+ 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000,
+ 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000,
+ // Block 0x22, offset 0x880
+ 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000,
+ 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000,
+ 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000,
+ 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000,
+ 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000,
+ 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000,
+ 0x8b2: 0x2000, 0x8b3: 0x2000,
+ 0x8b6: 0x2000, 0x8b7: 0x2000,
+ 0x8bc: 0x2000, 0x8bd: 0x2000,
+ // Block 0x23, offset 0x8c0
+ 0x8c0: 0x2000, 0x8c1: 0x2000,
+ 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f,
+ 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000,
+ 0x8e2: 0x2000, 0x8e3: 0x2000,
+ 0x8e4: 0x2000, 0x8e5: 0x2000,
+ 0x8ef: 0x2000,
+ 0x8fd: 0x4000, 0x8fe: 0x4000,
+ // Block 0x24, offset 0x900
+ 0x905: 0x2000,
+ 0x906: 0x2000, 0x909: 0x2000,
+ 0x90e: 0x2000, 0x90f: 0x2000,
+ 0x914: 0x4000, 0x915: 0x4000,
+ 0x91c: 0x2000,
+ 0x91e: 0x2000,
+ // Block 0x25, offset 0x940
+ 0x940: 0x2000, 0x942: 0x2000,
+ 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000,
+ 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000,
+ 0x952: 0x4000, 0x953: 0x4000,
+ 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000,
+ 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000,
+ 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000,
+ 0x97f: 0x4000,
+ // Block 0x26, offset 0x980
+ 0x993: 0x4000,
+ 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000,
+ 0x9aa: 0x4000, 0x9ab: 0x4000,
+ 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000,
+ // Block 0x27, offset 0x9c0
+ 0x9c4: 0x4000, 0x9c5: 0x4000,
+ 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000,
+ 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000,
+ 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000,
+ 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000,
+ 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000,
+ 0x9e8: 0x2000, 0x9e9: 0x2000,
+ 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000,
+ 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000,
+ 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000,
+ 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000,
+ // Block 0x28, offset 0xa00
+ 0xa05: 0x4000,
+ 0xa0a: 0x4000, 0xa0b: 0x4000,
+ 0xa28: 0x4000,
+ 0xa3d: 0x2000,
+ // Block 0x29, offset 0xa40
+ 0xa4c: 0x4000, 0xa4e: 0x4000,
+ 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000,
+ 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000,
+ 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000,
+ // Block 0x2a, offset 0xa80
+ 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000,
+ 0xab0: 0x4000,
+ 0xabf: 0x4000,
+ // Block 0x2b, offset 0xac0
+ 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000,
+ 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000,
+ // Block 0x2c, offset 0xb00
+ 0xb05: 0x6010,
+ 0xb06: 0x6011,
+ // Block 0x2d, offset 0xb40
+ 0xb5b: 0x4000, 0xb5c: 0x4000,
+ // Block 0x2e, offset 0xb80
+ 0xb90: 0x4000,
+ 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000,
+ 0xb98: 0x2000, 0xb99: 0x2000,
+ // Block 0x2f, offset 0xbc0
+ 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000,
+ 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000,
+ 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000,
+ 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000,
+ 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000,
+ 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000,
+ 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000,
+ 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000,
+ 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000,
+ 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000,
+ 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000,
+ // Block 0x30, offset 0xc00
+ 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000,
+ 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000,
+ 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000,
+ 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000,
+ 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000,
+ 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000,
+ 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000,
+ 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000,
+ 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000,
+ // Block 0x31, offset 0xc40
+ 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000,
+ 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000,
+ 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000,
+ 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000,
+ 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000,
+ 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000,
+ // Block 0x32, offset 0xc80
+ 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000,
+ 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000,
+ 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000,
+ 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000,
+ 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000,
+ 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000,
+ 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000,
+ 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000,
+ 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000,
+ 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000,
+ 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000,
+ // Block 0x33, offset 0xcc0
+ 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000,
+ 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000,
+ 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000,
+ 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000,
+ 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000,
+ 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000,
+ 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000,
+ 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000,
+ 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000,
+ 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000,
+ 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000,
+ // Block 0x34, offset 0xd00
+ 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000,
+ 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000,
+ 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000,
+ 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000,
+ 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000,
+ 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a,
+ 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020,
+ 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023,
+ 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026,
+ 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028,
+ 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029,
+ // Block 0x35, offset 0xd40
+ 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000,
+ 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f,
+ 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000,
+ 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000,
+ 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000,
+ 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036,
+ 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038,
+ 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035,
+ 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000,
+ 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d,
+ 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000,
+ // Block 0x36, offset 0xd80
+ 0xd85: 0x4000,
+ 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000,
+ 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000,
+ 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000,
+ 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000,
+ 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000,
+ 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000,
+ 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000, 0xdae: 0x4000,
+ 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e,
+ 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e,
+ 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e,
+ // Block 0x37, offset 0xdc0
+ 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037,
+ 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037,
+ 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040,
+ 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044,
+ 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045,
+ 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c,
+ 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000,
+ 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000,
+ 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000,
+ 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000,
+ 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000,
+ // Block 0x38, offset 0xe00
+ 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000,
+ 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000,
+ 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000,
+ 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000,
+ 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000,
+ 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000,
+ 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000,
+ 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000,
+ 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000,
+ 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000,
+ // Block 0x39, offset 0xe40
+ 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000,
+ 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000,
+ 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000,
+ 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000,
+ 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000,
+ 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000,
+ 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000,
+ 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000,
+ 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000,
+ // Block 0x3a, offset 0xe80
+ 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000,
+ 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000,
+ 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000,
+ 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000,
+ 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000,
+ 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000,
+ 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000,
+ 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000,
+ 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000,
+ 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000,
+ 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000,
+ // Block 0x3b, offset 0xec0
+ 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000,
+ 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000,
+ 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000,
+ 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000,
+ 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000,
+ 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000,
+ 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000,
+ 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000,
+ 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000,
+ 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000,
+ 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000,
+ // Block 0x3c, offset 0xf00
+ 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000,
+ 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000,
+ 0xf0c: 0x4000, 0xf0d: 0x4000, 0xf0e: 0x4000, 0xf0f: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000,
+ 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000,
+ 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000,
+ 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000,
+ 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000,
+ 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000,
+ 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000,
+ 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000,
+ 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000,
+ // Block 0x3d, offset 0xf40
+ 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000,
+ 0xf46: 0x4000, 0xf47: 0x4000, 0xf48: 0x4000, 0xf49: 0x4000, 0xf4a: 0x4000, 0xf4b: 0x4000,
+ 0xf4c: 0x4000, 0xf50: 0x4000, 0xf51: 0x4000,
+ 0xf52: 0x4000, 0xf53: 0x4000, 0xf54: 0x4000, 0xf55: 0x4000, 0xf56: 0x4000, 0xf57: 0x4000,
+ 0xf58: 0x4000, 0xf59: 0x4000, 0xf5a: 0x4000, 0xf5b: 0x4000, 0xf5c: 0x4000, 0xf5d: 0x4000,
+ 0xf5e: 0x4000, 0xf5f: 0x4000, 0xf60: 0x4000, 0xf61: 0x4000, 0xf62: 0x4000, 0xf63: 0x4000,
+ 0xf64: 0x4000, 0xf65: 0x4000, 0xf66: 0x4000, 0xf67: 0x4000, 0xf68: 0x4000, 0xf69: 0x4000,
+ 0xf6a: 0x4000, 0xf6b: 0x4000, 0xf6c: 0x4000, 0xf6d: 0x4000, 0xf6e: 0x4000, 0xf6f: 0x4000,
+ 0xf70: 0x4000, 0xf71: 0x4000, 0xf72: 0x4000, 0xf73: 0x4000, 0xf74: 0x4000, 0xf75: 0x4000,
+ 0xf76: 0x4000, 0xf77: 0x4000, 0xf78: 0x4000, 0xf79: 0x4000, 0xf7a: 0x4000, 0xf7b: 0x4000,
+ 0xf7c: 0x4000, 0xf7d: 0x4000, 0xf7e: 0x4000, 0xf7f: 0x4000,
+ // Block 0x3e, offset 0xf80
+ 0xf80: 0x4000, 0xf81: 0x4000, 0xf82: 0x4000, 0xf83: 0x4000, 0xf84: 0x4000, 0xf85: 0x4000,
+ 0xf86: 0x4000,
+ // Block 0x3f, offset 0xfc0
+ 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000,
+ 0xfe4: 0x4000, 0xfe5: 0x4000, 0xfe6: 0x4000, 0xfe7: 0x4000, 0xfe8: 0x4000, 0xfe9: 0x4000,
+ 0xfea: 0x4000, 0xfeb: 0x4000, 0xfec: 0x4000, 0xfed: 0x4000, 0xfee: 0x4000, 0xfef: 0x4000,
+ 0xff0: 0x4000, 0xff1: 0x4000, 0xff2: 0x4000, 0xff3: 0x4000, 0xff4: 0x4000, 0xff5: 0x4000,
+ 0xff6: 0x4000, 0xff7: 0x4000, 0xff8: 0x4000, 0xff9: 0x4000, 0xffa: 0x4000, 0xffb: 0x4000,
+ 0xffc: 0x4000,
+ // Block 0x40, offset 0x1000
+ 0x1000: 0x4000, 0x1001: 0x4000, 0x1002: 0x4000, 0x1003: 0x4000, 0x1004: 0x4000, 0x1005: 0x4000,
+ 0x1006: 0x4000, 0x1007: 0x4000, 0x1008: 0x4000, 0x1009: 0x4000, 0x100a: 0x4000, 0x100b: 0x4000,
+ 0x100c: 0x4000, 0x100d: 0x4000, 0x100e: 0x4000, 0x100f: 0x4000, 0x1010: 0x4000, 0x1011: 0x4000,
+ 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000,
+ 0x1018: 0x4000, 0x1019: 0x4000, 0x101a: 0x4000, 0x101b: 0x4000, 0x101c: 0x4000, 0x101d: 0x4000,
+ 0x101e: 0x4000, 0x101f: 0x4000, 0x1020: 0x4000, 0x1021: 0x4000, 0x1022: 0x4000, 0x1023: 0x4000,
+ // Block 0x41, offset 0x1040
+ 0x1040: 0x2000, 0x1041: 0x2000, 0x1042: 0x2000, 0x1043: 0x2000, 0x1044: 0x2000, 0x1045: 0x2000,
+ 0x1046: 0x2000, 0x1047: 0x2000, 0x1048: 0x2000, 0x1049: 0x2000, 0x104a: 0x2000, 0x104b: 0x2000,
+ 0x104c: 0x2000, 0x104d: 0x2000, 0x104e: 0x2000, 0x104f: 0x2000, 0x1050: 0x4000, 0x1051: 0x4000,
+ 0x1052: 0x4000, 0x1053: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000,
+ 0x1058: 0x4000, 0x1059: 0x4000,
+ 0x1070: 0x4000, 0x1071: 0x4000, 0x1072: 0x4000, 0x1073: 0x4000, 0x1074: 0x4000, 0x1075: 0x4000,
+ 0x1076: 0x4000, 0x1077: 0x4000, 0x1078: 0x4000, 0x1079: 0x4000, 0x107a: 0x4000, 0x107b: 0x4000,
+ 0x107c: 0x4000, 0x107d: 0x4000, 0x107e: 0x4000, 0x107f: 0x4000,
+ // Block 0x42, offset 0x1080
+ 0x1080: 0x4000, 0x1081: 0x4000, 0x1082: 0x4000, 0x1083: 0x4000, 0x1084: 0x4000, 0x1085: 0x4000,
+ 0x1086: 0x4000, 0x1087: 0x4000, 0x1088: 0x4000, 0x1089: 0x4000, 0x108a: 0x4000, 0x108b: 0x4000,
+ 0x108c: 0x4000, 0x108d: 0x4000, 0x108e: 0x4000, 0x108f: 0x4000, 0x1090: 0x4000, 0x1091: 0x4000,
+ 0x1092: 0x4000, 0x1094: 0x4000, 0x1095: 0x4000, 0x1096: 0x4000, 0x1097: 0x4000,
+ 0x1098: 0x4000, 0x1099: 0x4000, 0x109a: 0x4000, 0x109b: 0x4000, 0x109c: 0x4000, 0x109d: 0x4000,
+ 0x109e: 0x4000, 0x109f: 0x4000, 0x10a0: 0x4000, 0x10a1: 0x4000, 0x10a2: 0x4000, 0x10a3: 0x4000,
+ 0x10a4: 0x4000, 0x10a5: 0x4000, 0x10a6: 0x4000, 0x10a8: 0x4000, 0x10a9: 0x4000,
+ 0x10aa: 0x4000, 0x10ab: 0x4000,
+ // Block 0x43, offset 0x10c0
+ 0x10c1: 0x9012, 0x10c2: 0x9012, 0x10c3: 0x9012, 0x10c4: 0x9012, 0x10c5: 0x9012,
+ 0x10c6: 0x9012, 0x10c7: 0x9012, 0x10c8: 0x9012, 0x10c9: 0x9012, 0x10ca: 0x9012, 0x10cb: 0x9012,
+ 0x10cc: 0x9012, 0x10cd: 0x9012, 0x10ce: 0x9012, 0x10cf: 0x9012, 0x10d0: 0x9012, 0x10d1: 0x9012,
+ 0x10d2: 0x9012, 0x10d3: 0x9012, 0x10d4: 0x9012, 0x10d5: 0x9012, 0x10d6: 0x9012, 0x10d7: 0x9012,
+ 0x10d8: 0x9012, 0x10d9: 0x9012, 0x10da: 0x9012, 0x10db: 0x9012, 0x10dc: 0x9012, 0x10dd: 0x9012,
+ 0x10de: 0x9012, 0x10df: 0x9012, 0x10e0: 0x9049, 0x10e1: 0x9049, 0x10e2: 0x9049, 0x10e3: 0x9049,
+ 0x10e4: 0x9049, 0x10e5: 0x9049, 0x10e6: 0x9049, 0x10e7: 0x9049, 0x10e8: 0x9049, 0x10e9: 0x9049,
+ 0x10ea: 0x9049, 0x10eb: 0x9049, 0x10ec: 0x9049, 0x10ed: 0x9049, 0x10ee: 0x9049, 0x10ef: 0x9049,
+ 0x10f0: 0x9049, 0x10f1: 0x9049, 0x10f2: 0x9049, 0x10f3: 0x9049, 0x10f4: 0x9049, 0x10f5: 0x9049,
+ 0x10f6: 0x9049, 0x10f7: 0x9049, 0x10f8: 0x9049, 0x10f9: 0x9049, 0x10fa: 0x9049, 0x10fb: 0x9049,
+ 0x10fc: 0x9049, 0x10fd: 0x9049, 0x10fe: 0x9049, 0x10ff: 0x9049,
+ // Block 0x44, offset 0x1100
+ 0x1100: 0x9049, 0x1101: 0x9049, 0x1102: 0x9049, 0x1103: 0x9049, 0x1104: 0x9049, 0x1105: 0x9049,
+ 0x1106: 0x9049, 0x1107: 0x9049, 0x1108: 0x9049, 0x1109: 0x9049, 0x110a: 0x9049, 0x110b: 0x9049,
+ 0x110c: 0x9049, 0x110d: 0x9049, 0x110e: 0x9049, 0x110f: 0x9049, 0x1110: 0x9049, 0x1111: 0x9049,
+ 0x1112: 0x9049, 0x1113: 0x9049, 0x1114: 0x9049, 0x1115: 0x9049, 0x1116: 0x9049, 0x1117: 0x9049,
+ 0x1118: 0x9049, 0x1119: 0x9049, 0x111a: 0x9049, 0x111b: 0x9049, 0x111c: 0x9049, 0x111d: 0x9049,
+ 0x111e: 0x9049, 0x111f: 0x904a, 0x1120: 0x904b, 0x1121: 0xb04c, 0x1122: 0xb04d, 0x1123: 0xb04d,
+ 0x1124: 0xb04e, 0x1125: 0xb04f, 0x1126: 0xb050, 0x1127: 0xb051, 0x1128: 0xb052, 0x1129: 0xb053,
+ 0x112a: 0xb054, 0x112b: 0xb055, 0x112c: 0xb056, 0x112d: 0xb057, 0x112e: 0xb058, 0x112f: 0xb059,
+ 0x1130: 0xb05a, 0x1131: 0xb05b, 0x1132: 0xb05c, 0x1133: 0xb05d, 0x1134: 0xb05e, 0x1135: 0xb05f,
+ 0x1136: 0xb060, 0x1137: 0xb061, 0x1138: 0xb062, 0x1139: 0xb063, 0x113a: 0xb064, 0x113b: 0xb065,
+ 0x113c: 0xb052, 0x113d: 0xb066, 0x113e: 0xb067, 0x113f: 0xb055,
+ // Block 0x45, offset 0x1140
+ 0x1140: 0xb068, 0x1141: 0xb069, 0x1142: 0xb06a, 0x1143: 0xb06b, 0x1144: 0xb05a, 0x1145: 0xb056,
+ 0x1146: 0xb06c, 0x1147: 0xb06d, 0x1148: 0xb06b, 0x1149: 0xb06e, 0x114a: 0xb06b, 0x114b: 0xb06f,
+ 0x114c: 0xb06f, 0x114d: 0xb070, 0x114e: 0xb070, 0x114f: 0xb071, 0x1150: 0xb056, 0x1151: 0xb072,
+ 0x1152: 0xb073, 0x1153: 0xb072, 0x1154: 0xb074, 0x1155: 0xb073, 0x1156: 0xb075, 0x1157: 0xb075,
+ 0x1158: 0xb076, 0x1159: 0xb076, 0x115a: 0xb077, 0x115b: 0xb077, 0x115c: 0xb073, 0x115d: 0xb078,
+ 0x115e: 0xb079, 0x115f: 0xb067, 0x1160: 0xb07a, 0x1161: 0xb07b, 0x1162: 0xb07b, 0x1163: 0xb07b,
+ 0x1164: 0xb07b, 0x1165: 0xb07b, 0x1166: 0xb07b, 0x1167: 0xb07b, 0x1168: 0xb07b, 0x1169: 0xb07b,
+ 0x116a: 0xb07b, 0x116b: 0xb07b, 0x116c: 0xb07b, 0x116d: 0xb07b, 0x116e: 0xb07b, 0x116f: 0xb07b,
+ 0x1170: 0xb07c, 0x1171: 0xb07c, 0x1172: 0xb07c, 0x1173: 0xb07c, 0x1174: 0xb07c, 0x1175: 0xb07c,
+ 0x1176: 0xb07c, 0x1177: 0xb07c, 0x1178: 0xb07c, 0x1179: 0xb07c, 0x117a: 0xb07c, 0x117b: 0xb07c,
+ 0x117c: 0xb07c, 0x117d: 0xb07c, 0x117e: 0xb07c,
+ // Block 0x46, offset 0x1180
+ 0x1182: 0xb07d, 0x1183: 0xb07e, 0x1184: 0xb07f, 0x1185: 0xb080,
+ 0x1186: 0xb07f, 0x1187: 0xb07e, 0x118a: 0xb081, 0x118b: 0xb082,
+ 0x118c: 0xb083, 0x118d: 0xb07f, 0x118e: 0xb080, 0x118f: 0xb07f,
+ 0x1192: 0xb084, 0x1193: 0xb085, 0x1194: 0xb084, 0x1195: 0xb086, 0x1196: 0xb084, 0x1197: 0xb087,
+ 0x119a: 0xb088, 0x119b: 0xb089, 0x119c: 0xb08a,
+ 0x11a0: 0x908b, 0x11a1: 0x908b, 0x11a2: 0x908c, 0x11a3: 0x908d,
+ 0x11a4: 0x908b, 0x11a5: 0x908e, 0x11a6: 0x908f, 0x11a8: 0xb090, 0x11a9: 0xb091,
+ 0x11aa: 0xb092, 0x11ab: 0xb091, 0x11ac: 0xb093, 0x11ad: 0xb094, 0x11ae: 0xb095,
+ 0x11bd: 0x2000,
+ // Block 0x47, offset 0x11c0
+ 0x11e0: 0x4000, 0x11e1: 0x4000,
+ // Block 0x48, offset 0x1200
+ 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000,
+ 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000,
+ 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000,
+ 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, 0x1216: 0x4000, 0x1217: 0x4000,
+ 0x1218: 0x4000, 0x1219: 0x4000, 0x121a: 0x4000, 0x121b: 0x4000, 0x121c: 0x4000, 0x121d: 0x4000,
+ 0x121e: 0x4000, 0x121f: 0x4000, 0x1220: 0x4000, 0x1221: 0x4000, 0x1222: 0x4000, 0x1223: 0x4000,
+ 0x1224: 0x4000, 0x1225: 0x4000, 0x1226: 0x4000, 0x1227: 0x4000, 0x1228: 0x4000, 0x1229: 0x4000,
+ 0x122a: 0x4000, 0x122b: 0x4000, 0x122c: 0x4000,
+ // Block 0x49, offset 0x1240
+ 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000,
+ 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, 0x1249: 0x4000, 0x124a: 0x4000, 0x124b: 0x4000,
+ 0x124c: 0x4000, 0x124d: 0x4000, 0x124e: 0x4000, 0x124f: 0x4000, 0x1250: 0x4000, 0x1251: 0x4000,
+ 0x1252: 0x4000, 0x1253: 0x4000, 0x1254: 0x4000, 0x1255: 0x4000, 0x1256: 0x4000, 0x1257: 0x4000,
+ 0x1258: 0x4000, 0x1259: 0x4000, 0x125a: 0x4000, 0x125b: 0x4000, 0x125c: 0x4000, 0x125d: 0x4000,
+ 0x125e: 0x4000, 0x125f: 0x4000, 0x1260: 0x4000, 0x1261: 0x4000, 0x1262: 0x4000, 0x1263: 0x4000,
+ 0x1264: 0x4000, 0x1265: 0x4000, 0x1266: 0x4000, 0x1267: 0x4000, 0x1268: 0x4000, 0x1269: 0x4000,
+ 0x126a: 0x4000, 0x126b: 0x4000, 0x126c: 0x4000, 0x126d: 0x4000, 0x126e: 0x4000, 0x126f: 0x4000,
+ 0x1270: 0x4000, 0x1271: 0x4000, 0x1272: 0x4000,
+ // Block 0x4a, offset 0x1280
+ 0x1280: 0x4000, 0x1281: 0x4000, 0x1282: 0x4000, 0x1283: 0x4000, 0x1284: 0x4000, 0x1285: 0x4000,
+ 0x1286: 0x4000, 0x1287: 0x4000, 0x1288: 0x4000, 0x1289: 0x4000, 0x128a: 0x4000, 0x128b: 0x4000,
+ 0x128c: 0x4000, 0x128d: 0x4000, 0x128e: 0x4000, 0x128f: 0x4000, 0x1290: 0x4000, 0x1291: 0x4000,
+ 0x1292: 0x4000, 0x1293: 0x4000, 0x1294: 0x4000, 0x1295: 0x4000, 0x1296: 0x4000, 0x1297: 0x4000,
+ 0x1298: 0x4000, 0x1299: 0x4000, 0x129a: 0x4000, 0x129b: 0x4000, 0x129c: 0x4000, 0x129d: 0x4000,
+ 0x129e: 0x4000,
+ // Block 0x4b, offset 0x12c0
+ 0x12f0: 0x4000, 0x12f1: 0x4000, 0x12f2: 0x4000, 0x12f3: 0x4000, 0x12f4: 0x4000, 0x12f5: 0x4000,
+ 0x12f6: 0x4000, 0x12f7: 0x4000, 0x12f8: 0x4000, 0x12f9: 0x4000, 0x12fa: 0x4000, 0x12fb: 0x4000,
+ 0x12fc: 0x4000, 0x12fd: 0x4000, 0x12fe: 0x4000, 0x12ff: 0x4000,
+ // Block 0x4c, offset 0x1300
+ 0x1300: 0x4000, 0x1301: 0x4000, 0x1302: 0x4000, 0x1303: 0x4000, 0x1304: 0x4000, 0x1305: 0x4000,
+ 0x1306: 0x4000, 0x1307: 0x4000, 0x1308: 0x4000, 0x1309: 0x4000, 0x130a: 0x4000, 0x130b: 0x4000,
+ 0x130c: 0x4000, 0x130d: 0x4000, 0x130e: 0x4000, 0x130f: 0x4000, 0x1310: 0x4000, 0x1311: 0x4000,
+ 0x1312: 0x4000, 0x1313: 0x4000, 0x1314: 0x4000, 0x1315: 0x4000, 0x1316: 0x4000, 0x1317: 0x4000,
+ 0x1318: 0x4000, 0x1319: 0x4000, 0x131a: 0x4000, 0x131b: 0x4000, 0x131c: 0x4000, 0x131d: 0x4000,
+ 0x131e: 0x4000, 0x131f: 0x4000, 0x1320: 0x4000, 0x1321: 0x4000, 0x1322: 0x4000, 0x1323: 0x4000,
+ 0x1324: 0x4000, 0x1325: 0x4000, 0x1326: 0x4000, 0x1327: 0x4000, 0x1328: 0x4000, 0x1329: 0x4000,
+ 0x132a: 0x4000, 0x132b: 0x4000, 0x132c: 0x4000, 0x132d: 0x4000, 0x132e: 0x4000, 0x132f: 0x4000,
+ 0x1330: 0x4000, 0x1331: 0x4000, 0x1332: 0x4000, 0x1333: 0x4000, 0x1334: 0x4000, 0x1335: 0x4000,
+ 0x1336: 0x4000, 0x1337: 0x4000, 0x1338: 0x4000, 0x1339: 0x4000, 0x133a: 0x4000, 0x133b: 0x4000,
+ // Block 0x4d, offset 0x1340
+ 0x1344: 0x4000,
+ // Block 0x4e, offset 0x1380
+ 0x138f: 0x4000,
+ // Block 0x4f, offset 0x13c0
+ 0x13c0: 0x2000, 0x13c1: 0x2000, 0x13c2: 0x2000, 0x13c3: 0x2000, 0x13c4: 0x2000, 0x13c5: 0x2000,
+ 0x13c6: 0x2000, 0x13c7: 0x2000, 0x13c8: 0x2000, 0x13c9: 0x2000, 0x13ca: 0x2000,
+ 0x13d0: 0x2000, 0x13d1: 0x2000,
+ 0x13d2: 0x2000, 0x13d3: 0x2000, 0x13d4: 0x2000, 0x13d5: 0x2000, 0x13d6: 0x2000, 0x13d7: 0x2000,
+ 0x13d8: 0x2000, 0x13d9: 0x2000, 0x13da: 0x2000, 0x13db: 0x2000, 0x13dc: 0x2000, 0x13dd: 0x2000,
+ 0x13de: 0x2000, 0x13df: 0x2000, 0x13e0: 0x2000, 0x13e1: 0x2000, 0x13e2: 0x2000, 0x13e3: 0x2000,
+ 0x13e4: 0x2000, 0x13e5: 0x2000, 0x13e6: 0x2000, 0x13e7: 0x2000, 0x13e8: 0x2000, 0x13e9: 0x2000,
+ 0x13ea: 0x2000, 0x13eb: 0x2000, 0x13ec: 0x2000, 0x13ed: 0x2000,
+ 0x13f0: 0x2000, 0x13f1: 0x2000, 0x13f2: 0x2000, 0x13f3: 0x2000, 0x13f4: 0x2000, 0x13f5: 0x2000,
+ 0x13f6: 0x2000, 0x13f7: 0x2000, 0x13f8: 0x2000, 0x13f9: 0x2000, 0x13fa: 0x2000, 0x13fb: 0x2000,
+ 0x13fc: 0x2000, 0x13fd: 0x2000, 0x13fe: 0x2000, 0x13ff: 0x2000,
+ // Block 0x50, offset 0x1400
+ 0x1400: 0x2000, 0x1401: 0x2000, 0x1402: 0x2000, 0x1403: 0x2000, 0x1404: 0x2000, 0x1405: 0x2000,
+ 0x1406: 0x2000, 0x1407: 0x2000, 0x1408: 0x2000, 0x1409: 0x2000, 0x140a: 0x2000, 0x140b: 0x2000,
+ 0x140c: 0x2000, 0x140d: 0x2000, 0x140e: 0x2000, 0x140f: 0x2000, 0x1410: 0x2000, 0x1411: 0x2000,
+ 0x1412: 0x2000, 0x1413: 0x2000, 0x1414: 0x2000, 0x1415: 0x2000, 0x1416: 0x2000, 0x1417: 0x2000,
+ 0x1418: 0x2000, 0x1419: 0x2000, 0x141a: 0x2000, 0x141b: 0x2000, 0x141c: 0x2000, 0x141d: 0x2000,
+ 0x141e: 0x2000, 0x141f: 0x2000, 0x1420: 0x2000, 0x1421: 0x2000, 0x1422: 0x2000, 0x1423: 0x2000,
+ 0x1424: 0x2000, 0x1425: 0x2000, 0x1426: 0x2000, 0x1427: 0x2000, 0x1428: 0x2000, 0x1429: 0x2000,
+ 0x1430: 0x2000, 0x1431: 0x2000, 0x1432: 0x2000, 0x1433: 0x2000, 0x1434: 0x2000, 0x1435: 0x2000,
+ 0x1436: 0x2000, 0x1437: 0x2000, 0x1438: 0x2000, 0x1439: 0x2000, 0x143a: 0x2000, 0x143b: 0x2000,
+ 0x143c: 0x2000, 0x143d: 0x2000, 0x143e: 0x2000, 0x143f: 0x2000,
+ // Block 0x51, offset 0x1440
+ 0x1440: 0x2000, 0x1441: 0x2000, 0x1442: 0x2000, 0x1443: 0x2000, 0x1444: 0x2000, 0x1445: 0x2000,
+ 0x1446: 0x2000, 0x1447: 0x2000, 0x1448: 0x2000, 0x1449: 0x2000, 0x144a: 0x2000, 0x144b: 0x2000,
+ 0x144c: 0x2000, 0x144d: 0x2000, 0x144e: 0x4000, 0x144f: 0x2000, 0x1450: 0x2000, 0x1451: 0x4000,
+ 0x1452: 0x4000, 0x1453: 0x4000, 0x1454: 0x4000, 0x1455: 0x4000, 0x1456: 0x4000, 0x1457: 0x4000,
+ 0x1458: 0x4000, 0x1459: 0x4000, 0x145a: 0x4000, 0x145b: 0x2000, 0x145c: 0x2000, 0x145d: 0x2000,
+ 0x145e: 0x2000, 0x145f: 0x2000, 0x1460: 0x2000, 0x1461: 0x2000, 0x1462: 0x2000, 0x1463: 0x2000,
+ 0x1464: 0x2000, 0x1465: 0x2000, 0x1466: 0x2000, 0x1467: 0x2000, 0x1468: 0x2000, 0x1469: 0x2000,
+ 0x146a: 0x2000, 0x146b: 0x2000, 0x146c: 0x2000,
+ // Block 0x52, offset 0x1480
+ 0x1480: 0x4000, 0x1481: 0x4000, 0x1482: 0x4000,
+ 0x1490: 0x4000, 0x1491: 0x4000,
+ 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000,
+ 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x4000, 0x149c: 0x4000, 0x149d: 0x4000,
+ 0x149e: 0x4000, 0x149f: 0x4000, 0x14a0: 0x4000, 0x14a1: 0x4000, 0x14a2: 0x4000, 0x14a3: 0x4000,
+ 0x14a4: 0x4000, 0x14a5: 0x4000, 0x14a6: 0x4000, 0x14a7: 0x4000, 0x14a8: 0x4000, 0x14a9: 0x4000,
+ 0x14aa: 0x4000, 0x14ab: 0x4000, 0x14ac: 0x4000, 0x14ad: 0x4000, 0x14ae: 0x4000, 0x14af: 0x4000,
+ 0x14b0: 0x4000, 0x14b1: 0x4000, 0x14b2: 0x4000, 0x14b3: 0x4000, 0x14b4: 0x4000, 0x14b5: 0x4000,
+ 0x14b6: 0x4000, 0x14b7: 0x4000, 0x14b8: 0x4000, 0x14b9: 0x4000, 0x14ba: 0x4000, 0x14bb: 0x4000,
+ // Block 0x53, offset 0x14c0
+ 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, 0x14c3: 0x4000, 0x14c4: 0x4000, 0x14c5: 0x4000,
+ 0x14c6: 0x4000, 0x14c7: 0x4000, 0x14c8: 0x4000,
+ 0x14d0: 0x4000, 0x14d1: 0x4000,
+ 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000,
+ 0x14e4: 0x4000, 0x14e5: 0x4000,
+ // Block 0x54, offset 0x1500
+ 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000,
+ 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, 0x1509: 0x4000, 0x150a: 0x4000, 0x150b: 0x4000,
+ 0x150c: 0x4000, 0x150d: 0x4000, 0x150e: 0x4000, 0x150f: 0x4000, 0x1510: 0x4000, 0x1511: 0x4000,
+ 0x1512: 0x4000, 0x1513: 0x4000, 0x1514: 0x4000, 0x1515: 0x4000, 0x1516: 0x4000, 0x1517: 0x4000,
+ 0x1518: 0x4000, 0x1519: 0x4000, 0x151a: 0x4000, 0x151b: 0x4000, 0x151c: 0x4000, 0x151d: 0x4000,
+ 0x151e: 0x4000, 0x151f: 0x4000, 0x1520: 0x4000,
+ 0x152d: 0x4000, 0x152e: 0x4000, 0x152f: 0x4000,
+ 0x1530: 0x4000, 0x1531: 0x4000, 0x1532: 0x4000, 0x1533: 0x4000, 0x1534: 0x4000, 0x1535: 0x4000,
+ 0x1537: 0x4000, 0x1538: 0x4000, 0x1539: 0x4000, 0x153a: 0x4000, 0x153b: 0x4000,
+ 0x153c: 0x4000, 0x153d: 0x4000, 0x153e: 0x4000, 0x153f: 0x4000,
+ // Block 0x55, offset 0x1540
+ 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000,
+ 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000, 0x154b: 0x4000,
+ 0x154c: 0x4000, 0x154d: 0x4000, 0x154e: 0x4000, 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000,
+ 0x1552: 0x4000, 0x1553: 0x4000, 0x1554: 0x4000, 0x1555: 0x4000, 0x1556: 0x4000, 0x1557: 0x4000,
+ 0x1558: 0x4000, 0x1559: 0x4000, 0x155a: 0x4000, 0x155b: 0x4000, 0x155c: 0x4000, 0x155d: 0x4000,
+ 0x155e: 0x4000, 0x155f: 0x4000, 0x1560: 0x4000, 0x1561: 0x4000, 0x1562: 0x4000, 0x1563: 0x4000,
+ 0x1564: 0x4000, 0x1565: 0x4000, 0x1566: 0x4000, 0x1567: 0x4000, 0x1568: 0x4000, 0x1569: 0x4000,
+ 0x156a: 0x4000, 0x156b: 0x4000, 0x156c: 0x4000, 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000,
+ 0x1570: 0x4000, 0x1571: 0x4000, 0x1572: 0x4000, 0x1573: 0x4000, 0x1574: 0x4000, 0x1575: 0x4000,
+ 0x1576: 0x4000, 0x1577: 0x4000, 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000,
+ 0x157c: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000,
+ // Block 0x56, offset 0x1580
+ 0x1580: 0x4000, 0x1581: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000,
+ 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000,
+ 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000,
+ 0x1592: 0x4000, 0x1593: 0x4000,
+ 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000,
+ 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000,
+ 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000,
+ 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000,
+ 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000,
+ 0x15bc: 0x4000, 0x15bd: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000,
+ // Block 0x57, offset 0x15c0
+ 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000,
+ 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000,
+ 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000,
+ 0x15d2: 0x4000, 0x15d3: 0x4000,
+ 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000,
+ 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000,
+ 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000,
+ 0x15f0: 0x4000, 0x15f4: 0x4000,
+ 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000,
+ 0x15fc: 0x4000, 0x15fd: 0x4000, 0x15fe: 0x4000, 0x15ff: 0x4000,
+ // Block 0x58, offset 0x1600
+ 0x1600: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000,
+ 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, 0x160b: 0x4000,
+ 0x160c: 0x4000, 0x160d: 0x4000, 0x160e: 0x4000, 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000,
+ 0x1612: 0x4000, 0x1613: 0x4000, 0x1614: 0x4000, 0x1615: 0x4000, 0x1616: 0x4000, 0x1617: 0x4000,
+ 0x1618: 0x4000, 0x1619: 0x4000, 0x161a: 0x4000, 0x161b: 0x4000, 0x161c: 0x4000, 0x161d: 0x4000,
+ 0x161e: 0x4000, 0x161f: 0x4000, 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000,
+ 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000,
+ 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000,
+ 0x1630: 0x4000, 0x1631: 0x4000, 0x1632: 0x4000, 0x1633: 0x4000, 0x1634: 0x4000, 0x1635: 0x4000,
+ 0x1636: 0x4000, 0x1637: 0x4000, 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000,
+ 0x163c: 0x4000, 0x163d: 0x4000, 0x163e: 0x4000, 0x163f: 0x4000,
+ // Block 0x59, offset 0x1640
+ 0x1640: 0x4000, 0x1641: 0x4000, 0x1642: 0x4000, 0x1643: 0x4000, 0x1644: 0x4000, 0x1645: 0x4000,
+ 0x1646: 0x4000, 0x1647: 0x4000, 0x1648: 0x4000, 0x1649: 0x4000, 0x164a: 0x4000, 0x164b: 0x4000,
+ 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x164f: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000,
+ 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000,
+ 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000,
+ 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000,
+ 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000, 0x1668: 0x4000, 0x1669: 0x4000,
+ 0x166a: 0x4000, 0x166b: 0x4000, 0x166c: 0x4000, 0x166d: 0x4000, 0x166e: 0x4000, 0x166f: 0x4000,
+ 0x1670: 0x4000, 0x1671: 0x4000, 0x1672: 0x4000, 0x1673: 0x4000, 0x1674: 0x4000, 0x1675: 0x4000,
+ 0x1676: 0x4000, 0x1677: 0x4000, 0x1678: 0x4000, 0x1679: 0x4000, 0x167a: 0x4000, 0x167b: 0x4000,
+ 0x167c: 0x4000, 0x167f: 0x4000,
+ // Block 0x5a, offset 0x1680
+ 0x1680: 0x4000, 0x1681: 0x4000, 0x1682: 0x4000, 0x1683: 0x4000, 0x1684: 0x4000, 0x1685: 0x4000,
+ 0x1686: 0x4000, 0x1687: 0x4000, 0x1688: 0x4000, 0x1689: 0x4000, 0x168a: 0x4000, 0x168b: 0x4000,
+ 0x168c: 0x4000, 0x168d: 0x4000, 0x168e: 0x4000, 0x168f: 0x4000, 0x1690: 0x4000, 0x1691: 0x4000,
+ 0x1692: 0x4000, 0x1693: 0x4000, 0x1694: 0x4000, 0x1695: 0x4000, 0x1696: 0x4000, 0x1697: 0x4000,
+ 0x1698: 0x4000, 0x1699: 0x4000, 0x169a: 0x4000, 0x169b: 0x4000, 0x169c: 0x4000, 0x169d: 0x4000,
+ 0x169e: 0x4000, 0x169f: 0x4000, 0x16a0: 0x4000, 0x16a1: 0x4000, 0x16a2: 0x4000, 0x16a3: 0x4000,
+ 0x16a4: 0x4000, 0x16a5: 0x4000, 0x16a6: 0x4000, 0x16a7: 0x4000, 0x16a8: 0x4000, 0x16a9: 0x4000,
+ 0x16aa: 0x4000, 0x16ab: 0x4000, 0x16ac: 0x4000, 0x16ad: 0x4000, 0x16ae: 0x4000, 0x16af: 0x4000,
+ 0x16b0: 0x4000, 0x16b1: 0x4000, 0x16b2: 0x4000, 0x16b3: 0x4000, 0x16b4: 0x4000, 0x16b5: 0x4000,
+ 0x16b6: 0x4000, 0x16b7: 0x4000, 0x16b8: 0x4000, 0x16b9: 0x4000, 0x16ba: 0x4000, 0x16bb: 0x4000,
+ 0x16bc: 0x4000, 0x16bd: 0x4000,
+ // Block 0x5b, offset 0x16c0
+ 0x16cb: 0x4000,
+ 0x16cc: 0x4000, 0x16cd: 0x4000, 0x16ce: 0x4000, 0x16d0: 0x4000, 0x16d1: 0x4000,
+ 0x16d2: 0x4000, 0x16d3: 0x4000, 0x16d4: 0x4000, 0x16d5: 0x4000, 0x16d6: 0x4000, 0x16d7: 0x4000,
+ 0x16d8: 0x4000, 0x16d9: 0x4000, 0x16da: 0x4000, 0x16db: 0x4000, 0x16dc: 0x4000, 0x16dd: 0x4000,
+ 0x16de: 0x4000, 0x16df: 0x4000, 0x16e0: 0x4000, 0x16e1: 0x4000, 0x16e2: 0x4000, 0x16e3: 0x4000,
+ 0x16e4: 0x4000, 0x16e5: 0x4000, 0x16e6: 0x4000, 0x16e7: 0x4000,
+ 0x16fa: 0x4000,
+ // Block 0x5c, offset 0x1700
+ 0x1715: 0x4000, 0x1716: 0x4000,
+ 0x1724: 0x4000,
+ // Block 0x5d, offset 0x1740
+ 0x177b: 0x4000,
+ 0x177c: 0x4000, 0x177d: 0x4000, 0x177e: 0x4000, 0x177f: 0x4000,
+ // Block 0x5e, offset 0x1780
+ 0x1780: 0x4000, 0x1781: 0x4000, 0x1782: 0x4000, 0x1783: 0x4000, 0x1784: 0x4000, 0x1785: 0x4000,
+ 0x1786: 0x4000, 0x1787: 0x4000, 0x1788: 0x4000, 0x1789: 0x4000, 0x178a: 0x4000, 0x178b: 0x4000,
+ 0x178c: 0x4000, 0x178d: 0x4000, 0x178e: 0x4000, 0x178f: 0x4000,
+ // Block 0x5f, offset 0x17c0
+ 0x17c0: 0x4000, 0x17c1: 0x4000, 0x17c2: 0x4000, 0x17c3: 0x4000, 0x17c4: 0x4000, 0x17c5: 0x4000,
+ 0x17cc: 0x4000, 0x17d0: 0x4000, 0x17d1: 0x4000,
+ 0x17d2: 0x4000,
+ 0x17eb: 0x4000, 0x17ec: 0x4000,
+ 0x17f4: 0x4000, 0x17f5: 0x4000,
+ 0x17f6: 0x4000, 0x17f7: 0x4000, 0x17f8: 0x4000,
+ // Block 0x60, offset 0x1800
+ 0x1810: 0x4000, 0x1811: 0x4000,
+ 0x1812: 0x4000, 0x1813: 0x4000, 0x1814: 0x4000, 0x1815: 0x4000, 0x1816: 0x4000, 0x1817: 0x4000,
+ 0x1818: 0x4000, 0x1819: 0x4000, 0x181a: 0x4000, 0x181b: 0x4000, 0x181c: 0x4000, 0x181d: 0x4000,
+ 0x181e: 0x4000, 0x181f: 0x4000, 0x1820: 0x4000, 0x1821: 0x4000, 0x1822: 0x4000, 0x1823: 0x4000,
+ 0x1824: 0x4000, 0x1825: 0x4000, 0x1826: 0x4000, 0x1827: 0x4000, 0x1828: 0x4000, 0x1829: 0x4000,
+ 0x182a: 0x4000, 0x182b: 0x4000, 0x182c: 0x4000, 0x182d: 0x4000, 0x182e: 0x4000, 0x182f: 0x4000,
+ 0x1830: 0x4000, 0x1831: 0x4000, 0x1832: 0x4000, 0x1833: 0x4000, 0x1834: 0x4000, 0x1835: 0x4000,
+ 0x1836: 0x4000, 0x1837: 0x4000, 0x1838: 0x4000, 0x1839: 0x4000, 0x183a: 0x4000, 0x183b: 0x4000,
+ 0x183c: 0x4000, 0x183d: 0x4000, 0x183e: 0x4000,
+ // Block 0x61, offset 0x1840
+ 0x1840: 0x4000, 0x1841: 0x4000, 0x1842: 0x4000, 0x1843: 0x4000, 0x1844: 0x4000, 0x1845: 0x4000,
+ 0x1846: 0x4000, 0x1847: 0x4000, 0x1848: 0x4000, 0x1849: 0x4000, 0x184a: 0x4000, 0x184b: 0x4000,
+ 0x184c: 0x4000, 0x1850: 0x4000, 0x1851: 0x4000,
+ 0x1852: 0x4000, 0x1853: 0x4000, 0x1854: 0x4000, 0x1855: 0x4000, 0x1856: 0x4000, 0x1857: 0x4000,
+ 0x1858: 0x4000, 0x1859: 0x4000, 0x185a: 0x4000, 0x185b: 0x4000, 0x185c: 0x4000, 0x185d: 0x4000,
+ 0x185e: 0x4000, 0x185f: 0x4000, 0x1860: 0x4000, 0x1861: 0x4000, 0x1862: 0x4000, 0x1863: 0x4000,
+ 0x1864: 0x4000, 0x1865: 0x4000, 0x1866: 0x4000, 0x1867: 0x4000, 0x1868: 0x4000, 0x1869: 0x4000,
+ 0x186a: 0x4000, 0x186b: 0x4000,
+ // Block 0x62, offset 0x1880
+ 0x1880: 0x4000, 0x1881: 0x4000, 0x1882: 0x4000, 0x1883: 0x4000, 0x1884: 0x4000, 0x1885: 0x4000,
+ 0x1886: 0x4000, 0x1887: 0x4000, 0x1888: 0x4000, 0x1889: 0x4000, 0x188a: 0x4000, 0x188b: 0x4000,
+ 0x188c: 0x4000, 0x188d: 0x4000, 0x188e: 0x4000, 0x188f: 0x4000, 0x1890: 0x4000, 0x1891: 0x4000,
+ 0x1892: 0x4000, 0x1893: 0x4000, 0x1894: 0x4000, 0x1895: 0x4000, 0x1896: 0x4000, 0x1897: 0x4000,
+ // Block 0x63, offset 0x18c0
+ 0x18c0: 0x4000,
+ 0x18d0: 0x4000, 0x18d1: 0x4000,
+ 0x18d2: 0x4000, 0x18d3: 0x4000, 0x18d4: 0x4000, 0x18d5: 0x4000, 0x18d6: 0x4000, 0x18d7: 0x4000,
+ 0x18d8: 0x4000, 0x18d9: 0x4000, 0x18da: 0x4000, 0x18db: 0x4000, 0x18dc: 0x4000, 0x18dd: 0x4000,
+ 0x18de: 0x4000, 0x18df: 0x4000, 0x18e0: 0x4000, 0x18e1: 0x4000, 0x18e2: 0x4000, 0x18e3: 0x4000,
+ 0x18e4: 0x4000, 0x18e5: 0x4000, 0x18e6: 0x4000,
+ // Block 0x64, offset 0x1900
+ 0x1900: 0x2000, 0x1901: 0x2000, 0x1902: 0x2000, 0x1903: 0x2000, 0x1904: 0x2000, 0x1905: 0x2000,
+ 0x1906: 0x2000, 0x1907: 0x2000, 0x1908: 0x2000, 0x1909: 0x2000, 0x190a: 0x2000, 0x190b: 0x2000,
+ 0x190c: 0x2000, 0x190d: 0x2000, 0x190e: 0x2000, 0x190f: 0x2000, 0x1910: 0x2000, 0x1911: 0x2000,
+ 0x1912: 0x2000, 0x1913: 0x2000, 0x1914: 0x2000, 0x1915: 0x2000, 0x1916: 0x2000, 0x1917: 0x2000,
+ 0x1918: 0x2000, 0x1919: 0x2000, 0x191a: 0x2000, 0x191b: 0x2000, 0x191c: 0x2000, 0x191d: 0x2000,
+ 0x191e: 0x2000, 0x191f: 0x2000, 0x1920: 0x2000, 0x1921: 0x2000, 0x1922: 0x2000, 0x1923: 0x2000,
+ 0x1924: 0x2000, 0x1925: 0x2000, 0x1926: 0x2000, 0x1927: 0x2000, 0x1928: 0x2000, 0x1929: 0x2000,
+ 0x192a: 0x2000, 0x192b: 0x2000, 0x192c: 0x2000, 0x192d: 0x2000, 0x192e: 0x2000, 0x192f: 0x2000,
+ 0x1930: 0x2000, 0x1931: 0x2000, 0x1932: 0x2000, 0x1933: 0x2000, 0x1934: 0x2000, 0x1935: 0x2000,
+ 0x1936: 0x2000, 0x1937: 0x2000, 0x1938: 0x2000, 0x1939: 0x2000, 0x193a: 0x2000, 0x193b: 0x2000,
+ 0x193c: 0x2000, 0x193d: 0x2000,
+}
+
+// widthIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var widthIndex = [1408]uint8{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05,
+ 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b,
+ 0xd0: 0x0c, 0xd1: 0x0d,
+ 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06,
+ 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a,
+ 0xf0: 0x0f, 0xf3: 0x12, 0xf4: 0x13,
+ // Block 0x4, offset 0x100
+ 0x104: 0x0e, 0x105: 0x0f,
+ // Block 0x5, offset 0x140
+ 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16,
+ 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b,
+ 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21,
+ 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29,
+ 0x166: 0x2a,
+ 0x16c: 0x2b, 0x16d: 0x2c,
+ 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f,
+ // Block 0x6, offset 0x180
+ 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37,
+ 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x3a, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e,
+ 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e,
+ 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e,
+ 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e,
+ 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e,
+ 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e,
+ 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e,
+ 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e,
+ 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e,
+ 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e,
+ 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e,
+ 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e,
+ 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e,
+ 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e,
+ // Block 0x8, offset 0x200
+ 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e,
+ 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e,
+ 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e,
+ 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e,
+ 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e,
+ 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e,
+ 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e,
+ 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e,
+ // Block 0x9, offset 0x240
+ 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e,
+ 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e,
+ 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3b, 0x253: 0x3c,
+ 0x265: 0x3d,
+ 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e,
+ 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e,
+ // Block 0xa, offset 0x280
+ 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e,
+ 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e,
+ 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e,
+ 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3e,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08,
+ 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08,
+ 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08,
+ 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08,
+ 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08,
+ 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08,
+ 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08,
+ 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08,
+ // Block 0xc, offset 0x300
+ 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08,
+ 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08,
+ 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08,
+ 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08,
+ 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e,
+ 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e,
+ 0x338: 0x3f, 0x339: 0x40, 0x33c: 0x41, 0x33d: 0x42, 0x33e: 0x43, 0x33f: 0x44,
+ // Block 0xd, offset 0x340
+ 0x37f: 0x45,
+ // Block 0xe, offset 0x380
+ 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e,
+ 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e,
+ 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e,
+ 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x46,
+ 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e,
+ 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x47,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x0e, 0x3c1: 0x0e, 0x3c2: 0x0e, 0x3c3: 0x0e, 0x3c4: 0x48, 0x3c5: 0x49, 0x3c6: 0x0e, 0x3c7: 0x0e,
+ 0x3c8: 0x0e, 0x3c9: 0x0e, 0x3ca: 0x0e, 0x3cb: 0x4a,
+ // Block 0x10, offset 0x400
+ 0x400: 0x4b, 0x403: 0x4c, 0x404: 0x4d, 0x405: 0x4e, 0x406: 0x4f,
+ 0x408: 0x50, 0x409: 0x51, 0x40c: 0x52, 0x40d: 0x53, 0x40e: 0x54, 0x40f: 0x55,
+ 0x410: 0x3a, 0x411: 0x56, 0x412: 0x0e, 0x413: 0x57, 0x414: 0x58, 0x415: 0x59, 0x416: 0x5a, 0x417: 0x5b,
+ 0x418: 0x0e, 0x419: 0x5c, 0x41a: 0x0e, 0x41b: 0x5d,
+ 0x424: 0x5e, 0x425: 0x5f, 0x426: 0x60, 0x427: 0x61,
+ // Block 0x11, offset 0x440
+ 0x456: 0x0b, 0x457: 0x06,
+ 0x458: 0x0c, 0x45b: 0x0d, 0x45f: 0x0e,
+ 0x460: 0x06, 0x461: 0x06, 0x462: 0x06, 0x463: 0x06, 0x464: 0x06, 0x465: 0x06, 0x466: 0x06, 0x467: 0x06,
+ 0x468: 0x06, 0x469: 0x06, 0x46a: 0x06, 0x46b: 0x06, 0x46c: 0x06, 0x46d: 0x06, 0x46e: 0x06, 0x46f: 0x06,
+ 0x470: 0x06, 0x471: 0x06, 0x472: 0x06, 0x473: 0x06, 0x474: 0x06, 0x475: 0x06, 0x476: 0x06, 0x477: 0x06,
+ 0x478: 0x06, 0x479: 0x06, 0x47a: 0x06, 0x47b: 0x06, 0x47c: 0x06, 0x47d: 0x06, 0x47e: 0x06, 0x47f: 0x06,
+ // Block 0x12, offset 0x480
+ 0x484: 0x08, 0x485: 0x08, 0x486: 0x08, 0x487: 0x09,
+ // Block 0x13, offset 0x4c0
+ 0x4c0: 0x08, 0x4c1: 0x08, 0x4c2: 0x08, 0x4c3: 0x08, 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x08,
+ 0x4c8: 0x08, 0x4c9: 0x08, 0x4ca: 0x08, 0x4cb: 0x08, 0x4cc: 0x08, 0x4cd: 0x08, 0x4ce: 0x08, 0x4cf: 0x08,
+ 0x4d0: 0x08, 0x4d1: 0x08, 0x4d2: 0x08, 0x4d3: 0x08, 0x4d4: 0x08, 0x4d5: 0x08, 0x4d6: 0x08, 0x4d7: 0x08,
+ 0x4d8: 0x08, 0x4d9: 0x08, 0x4da: 0x08, 0x4db: 0x08, 0x4dc: 0x08, 0x4dd: 0x08, 0x4de: 0x08, 0x4df: 0x08,
+ 0x4e0: 0x08, 0x4e1: 0x08, 0x4e2: 0x08, 0x4e3: 0x08, 0x4e4: 0x08, 0x4e5: 0x08, 0x4e6: 0x08, 0x4e7: 0x08,
+ 0x4e8: 0x08, 0x4e9: 0x08, 0x4ea: 0x08, 0x4eb: 0x08, 0x4ec: 0x08, 0x4ed: 0x08, 0x4ee: 0x08, 0x4ef: 0x08,
+ 0x4f0: 0x08, 0x4f1: 0x08, 0x4f2: 0x08, 0x4f3: 0x08, 0x4f4: 0x08, 0x4f5: 0x08, 0x4f6: 0x08, 0x4f7: 0x08,
+ 0x4f8: 0x08, 0x4f9: 0x08, 0x4fa: 0x08, 0x4fb: 0x08, 0x4fc: 0x08, 0x4fd: 0x08, 0x4fe: 0x08, 0x4ff: 0x62,
+ // Block 0x14, offset 0x500
+ 0x520: 0x10,
+ 0x530: 0x09, 0x531: 0x09, 0x532: 0x09, 0x533: 0x09, 0x534: 0x09, 0x535: 0x09, 0x536: 0x09, 0x537: 0x09,
+ 0x538: 0x09, 0x539: 0x09, 0x53a: 0x09, 0x53b: 0x09, 0x53c: 0x09, 0x53d: 0x09, 0x53e: 0x09, 0x53f: 0x11,
+ // Block 0x15, offset 0x540
+ 0x540: 0x09, 0x541: 0x09, 0x542: 0x09, 0x543: 0x09, 0x544: 0x09, 0x545: 0x09, 0x546: 0x09, 0x547: 0x09,
+ 0x548: 0x09, 0x549: 0x09, 0x54a: 0x09, 0x54b: 0x09, 0x54c: 0x09, 0x54d: 0x09, 0x54e: 0x09, 0x54f: 0x11,
+}
+
+// inverseData contains 4-byte entries of the following format:
+// <0 padding>
+// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the
+// UTF-8 encoding of the original rune. Mappings often have the following
+// pattern:
+// A -> A (U+FF21 -> U+0041)
+// B -> B (U+FF22 -> U+0042)
+// ...
+// By xor-ing the last byte the same entry can be shared by many mappings. This
+// reduces the total number of distinct entries by about two thirds.
+// The resulting entry for the aforementioned mappings is
+// { 0x01, 0xE0, 0x00, 0x00 }
+// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get
+// E0 ^ A1 = 41.
+// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get
+// E0 ^ A2 = 42.
+// Note that because of the xor-ing, the byte sequence stored in the entry is
+// not valid UTF-8.
+var inverseData = [150][4]byte{
+ {0x00, 0x00, 0x00, 0x00},
+ {0x03, 0xe3, 0x80, 0xa0},
+ {0x03, 0xef, 0xbc, 0xa0},
+ {0x03, 0xef, 0xbc, 0xe0},
+ {0x03, 0xef, 0xbd, 0xe0},
+ {0x03, 0xef, 0xbf, 0x02},
+ {0x03, 0xef, 0xbf, 0x00},
+ {0x03, 0xef, 0xbf, 0x0e},
+ {0x03, 0xef, 0xbf, 0x0c},
+ {0x03, 0xef, 0xbf, 0x0f},
+ {0x03, 0xef, 0xbf, 0x39},
+ {0x03, 0xef, 0xbf, 0x3b},
+ {0x03, 0xef, 0xbf, 0x3f},
+ {0x03, 0xef, 0xbf, 0x2a},
+ {0x03, 0xef, 0xbf, 0x0d},
+ {0x03, 0xef, 0xbf, 0x25},
+ {0x03, 0xef, 0xbd, 0x1a},
+ {0x03, 0xef, 0xbd, 0x26},
+ {0x01, 0xa0, 0x00, 0x00},
+ {0x03, 0xef, 0xbd, 0x25},
+ {0x03, 0xef, 0xbd, 0x23},
+ {0x03, 0xef, 0xbd, 0x2e},
+ {0x03, 0xef, 0xbe, 0x07},
+ {0x03, 0xef, 0xbe, 0x05},
+ {0x03, 0xef, 0xbd, 0x06},
+ {0x03, 0xef, 0xbd, 0x13},
+ {0x03, 0xef, 0xbd, 0x0b},
+ {0x03, 0xef, 0xbd, 0x16},
+ {0x03, 0xef, 0xbd, 0x0c},
+ {0x03, 0xef, 0xbd, 0x15},
+ {0x03, 0xef, 0xbd, 0x0d},
+ {0x03, 0xef, 0xbd, 0x1c},
+ {0x03, 0xef, 0xbd, 0x02},
+ {0x03, 0xef, 0xbd, 0x1f},
+ {0x03, 0xef, 0xbd, 0x1d},
+ {0x03, 0xef, 0xbd, 0x17},
+ {0x03, 0xef, 0xbd, 0x08},
+ {0x03, 0xef, 0xbd, 0x09},
+ {0x03, 0xef, 0xbd, 0x0e},
+ {0x03, 0xef, 0xbd, 0x04},
+ {0x03, 0xef, 0xbd, 0x05},
+ {0x03, 0xef, 0xbe, 0x3f},
+ {0x03, 0xef, 0xbe, 0x00},
+ {0x03, 0xef, 0xbd, 0x2c},
+ {0x03, 0xef, 0xbe, 0x06},
+ {0x03, 0xef, 0xbe, 0x0c},
+ {0x03, 0xef, 0xbe, 0x0f},
+ {0x03, 0xef, 0xbe, 0x0d},
+ {0x03, 0xef, 0xbe, 0x0b},
+ {0x03, 0xef, 0xbe, 0x19},
+ {0x03, 0xef, 0xbe, 0x15},
+ {0x03, 0xef, 0xbe, 0x11},
+ {0x03, 0xef, 0xbe, 0x31},
+ {0x03, 0xef, 0xbe, 0x33},
+ {0x03, 0xef, 0xbd, 0x0f},
+ {0x03, 0xef, 0xbe, 0x30},
+ {0x03, 0xef, 0xbe, 0x3e},
+ {0x03, 0xef, 0xbe, 0x32},
+ {0x03, 0xef, 0xbe, 0x36},
+ {0x03, 0xef, 0xbd, 0x14},
+ {0x03, 0xef, 0xbe, 0x2e},
+ {0x03, 0xef, 0xbd, 0x1e},
+ {0x03, 0xef, 0xbe, 0x10},
+ {0x03, 0xef, 0xbf, 0x13},
+ {0x03, 0xef, 0xbf, 0x15},
+ {0x03, 0xef, 0xbf, 0x17},
+ {0x03, 0xef, 0xbf, 0x1f},
+ {0x03, 0xef, 0xbf, 0x1d},
+ {0x03, 0xef, 0xbf, 0x1b},
+ {0x03, 0xef, 0xbf, 0x09},
+ {0x03, 0xef, 0xbf, 0x0b},
+ {0x03, 0xef, 0xbf, 0x37},
+ {0x03, 0xef, 0xbe, 0x04},
+ {0x01, 0xe0, 0x00, 0x00},
+ {0x03, 0xe2, 0xa6, 0x1a},
+ {0x03, 0xe2, 0xa6, 0x26},
+ {0x03, 0xe3, 0x80, 0x23},
+ {0x03, 0xe3, 0x80, 0x2e},
+ {0x03, 0xe3, 0x80, 0x25},
+ {0x03, 0xe3, 0x83, 0x1e},
+ {0x03, 0xe3, 0x83, 0x14},
+ {0x03, 0xe3, 0x82, 0x06},
+ {0x03, 0xe3, 0x82, 0x0b},
+ {0x03, 0xe3, 0x82, 0x0c},
+ {0x03, 0xe3, 0x82, 0x0d},
+ {0x03, 0xe3, 0x82, 0x02},
+ {0x03, 0xe3, 0x83, 0x0f},
+ {0x03, 0xe3, 0x83, 0x08},
+ {0x03, 0xe3, 0x83, 0x09},
+ {0x03, 0xe3, 0x83, 0x2c},
+ {0x03, 0xe3, 0x83, 0x0c},
+ {0x03, 0xe3, 0x82, 0x13},
+ {0x03, 0xe3, 0x82, 0x16},
+ {0x03, 0xe3, 0x82, 0x15},
+ {0x03, 0xe3, 0x82, 0x1c},
+ {0x03, 0xe3, 0x82, 0x1f},
+ {0x03, 0xe3, 0x82, 0x1d},
+ {0x03, 0xe3, 0x82, 0x1a},
+ {0x03, 0xe3, 0x82, 0x17},
+ {0x03, 0xe3, 0x82, 0x08},
+ {0x03, 0xe3, 0x82, 0x09},
+ {0x03, 0xe3, 0x82, 0x0e},
+ {0x03, 0xe3, 0x82, 0x04},
+ {0x03, 0xe3, 0x82, 0x05},
+ {0x03, 0xe3, 0x82, 0x3f},
+ {0x03, 0xe3, 0x83, 0x00},
+ {0x03, 0xe3, 0x83, 0x06},
+ {0x03, 0xe3, 0x83, 0x05},
+ {0x03, 0xe3, 0x83, 0x0d},
+ {0x03, 0xe3, 0x83, 0x0b},
+ {0x03, 0xe3, 0x83, 0x07},
+ {0x03, 0xe3, 0x83, 0x19},
+ {0x03, 0xe3, 0x83, 0x15},
+ {0x03, 0xe3, 0x83, 0x11},
+ {0x03, 0xe3, 0x83, 0x31},
+ {0x03, 0xe3, 0x83, 0x33},
+ {0x03, 0xe3, 0x83, 0x30},
+ {0x03, 0xe3, 0x83, 0x3e},
+ {0x03, 0xe3, 0x83, 0x32},
+ {0x03, 0xe3, 0x83, 0x36},
+ {0x03, 0xe3, 0x83, 0x2e},
+ {0x03, 0xe3, 0x82, 0x07},
+ {0x03, 0xe3, 0x85, 0x04},
+ {0x03, 0xe3, 0x84, 0x10},
+ {0x03, 0xe3, 0x85, 0x30},
+ {0x03, 0xe3, 0x85, 0x0d},
+ {0x03, 0xe3, 0x85, 0x13},
+ {0x03, 0xe3, 0x85, 0x15},
+ {0x03, 0xe3, 0x85, 0x17},
+ {0x03, 0xe3, 0x85, 0x1f},
+ {0x03, 0xe3, 0x85, 0x1d},
+ {0x03, 0xe3, 0x85, 0x1b},
+ {0x03, 0xe3, 0x85, 0x09},
+ {0x03, 0xe3, 0x85, 0x0f},
+ {0x03, 0xe3, 0x85, 0x0b},
+ {0x03, 0xe3, 0x85, 0x37},
+ {0x03, 0xe3, 0x85, 0x3b},
+ {0x03, 0xe3, 0x85, 0x39},
+ {0x03, 0xe3, 0x85, 0x3f},
+ {0x02, 0xc2, 0x02, 0x00},
+ {0x02, 0xc2, 0x0e, 0x00},
+ {0x02, 0xc2, 0x0c, 0x00},
+ {0x02, 0xc2, 0x00, 0x00},
+ {0x03, 0xe2, 0x82, 0x0f},
+ {0x03, 0xe2, 0x94, 0x2a},
+ {0x03, 0xe2, 0x86, 0x39},
+ {0x03, 0xe2, 0x86, 0x3b},
+ {0x03, 0xe2, 0x86, 0x3f},
+ {0x03, 0xe2, 0x96, 0x0d},
+ {0x03, 0xe2, 0x97, 0x25},
+}
+
+// Total table size 14936 bytes (14KiB)
diff --git a/vendor/golang.org/x/text/width/tables9.0.0.go b/vendor/golang.org/x/text/width/tables9.0.0.go
new file mode 100644
index 00000000000..7069e26345b
--- /dev/null
+++ b/vendor/golang.org/x/text/width/tables9.0.0.go
@@ -0,0 +1,1286 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+// +build !go1.10
+
+package width
+
+// UnicodeVersion is the Unicode version from which the tables in this package are derived.
+const UnicodeVersion = "9.0.0"
+
+// lookup returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *widthTrie) lookup(s []byte) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return widthValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = widthIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *widthTrie) lookupUnsafe(s []byte) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return widthValues[c0]
+ }
+ i := widthIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// lookupString returns the trie value for the first UTF-8 encoding in s and
+// the width in bytes of this encoding. The size will be 0 if s does not
+// hold enough bytes to complete the encoding. len(s) must be greater than 0.
+func (t *widthTrie) lookupString(s string) (v uint16, sz int) {
+ c0 := s[0]
+ switch {
+ case c0 < 0x80: // is ASCII
+ return widthValues[c0], 1
+ case c0 < 0xC2:
+ return 0, 1 // Illegal UTF-8: not a starter, not ASCII.
+ case c0 < 0xE0: // 2-byte UTF-8
+ if len(s) < 2 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c1), 2
+ case c0 < 0xF0: // 3-byte UTF-8
+ if len(s) < 3 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c2), 3
+ case c0 < 0xF8: // 4-byte UTF-8
+ if len(s) < 4 {
+ return 0, 0
+ }
+ i := widthIndex[c0]
+ c1 := s[1]
+ if c1 < 0x80 || 0xC0 <= c1 {
+ return 0, 1 // Illegal UTF-8: not a continuation byte.
+ }
+ o := uint32(i)<<6 + uint32(c1)
+ i = widthIndex[o]
+ c2 := s[2]
+ if c2 < 0x80 || 0xC0 <= c2 {
+ return 0, 2 // Illegal UTF-8: not a continuation byte.
+ }
+ o = uint32(i)<<6 + uint32(c2)
+ i = widthIndex[o]
+ c3 := s[3]
+ if c3 < 0x80 || 0xC0 <= c3 {
+ return 0, 3 // Illegal UTF-8: not a continuation byte.
+ }
+ return t.lookupValue(uint32(i), c3), 4
+ }
+ // Illegal rune
+ return 0, 1
+}
+
+// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s.
+// s must start with a full and valid UTF-8 encoded rune.
+func (t *widthTrie) lookupStringUnsafe(s string) uint16 {
+ c0 := s[0]
+ if c0 < 0x80 { // is ASCII
+ return widthValues[c0]
+ }
+ i := widthIndex[c0]
+ if c0 < 0xE0 { // 2-byte UTF-8
+ return t.lookupValue(uint32(i), s[1])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[1])]
+ if c0 < 0xF0 { // 3-byte UTF-8
+ return t.lookupValue(uint32(i), s[2])
+ }
+ i = widthIndex[uint32(i)<<6+uint32(s[2])]
+ if c0 < 0xF8 { // 4-byte UTF-8
+ return t.lookupValue(uint32(i), s[3])
+ }
+ return 0
+}
+
+// widthTrie. Total size: 14080 bytes (13.75 KiB). Checksum: 3b8aeb3dc03667a3.
+type widthTrie struct{}
+
+func newWidthTrie(i int) *widthTrie {
+ return &widthTrie{}
+}
+
+// lookupValue determines the type of block n and looks up the value for b.
+func (t *widthTrie) lookupValue(n uint32, b byte) uint16 {
+ switch {
+ default:
+ return uint16(widthValues[n<<6+uint32(b)])
+ }
+}
+
+// widthValues: 99 blocks, 6336 entries, 12672 bytes
+// The third block is the zero block.
+var widthValues = [6336]uint16{
+ // Block 0x0, offset 0x0
+ 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002,
+ 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002,
+ 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002,
+ 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002,
+ 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002,
+ 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002,
+ // Block 0x1, offset 0x40
+ 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003,
+ 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003,
+ 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003,
+ 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003,
+ 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003,
+ 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004,
+ 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004,
+ 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004,
+ 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004,
+ 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004,
+ 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004,
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005,
+ 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000,
+ 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008,
+ 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000,
+ 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000,
+ 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000,
+ // Block 0x4, offset 0x100
+ 0x106: 0x2000,
+ 0x110: 0x2000,
+ 0x117: 0x2000,
+ 0x118: 0x2000,
+ 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000,
+ 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000,
+ 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000,
+ 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000,
+ 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000,
+ 0x13c: 0x2000, 0x13e: 0x2000,
+ // Block 0x5, offset 0x140
+ 0x141: 0x2000,
+ 0x151: 0x2000,
+ 0x153: 0x2000,
+ 0x15b: 0x2000,
+ 0x166: 0x2000, 0x167: 0x2000,
+ 0x16b: 0x2000,
+ 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000,
+ 0x178: 0x2000,
+ 0x17f: 0x2000,
+ // Block 0x6, offset 0x180
+ 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000,
+ 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000,
+ 0x18d: 0x2000,
+ 0x192: 0x2000, 0x193: 0x2000,
+ 0x1a6: 0x2000, 0x1a7: 0x2000,
+ 0x1ab: 0x2000,
+ // Block 0x7, offset 0x1c0
+ 0x1ce: 0x2000, 0x1d0: 0x2000,
+ 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000,
+ 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000,
+ // Block 0x8, offset 0x200
+ 0x211: 0x2000,
+ 0x221: 0x2000,
+ // Block 0x9, offset 0x240
+ 0x244: 0x2000,
+ 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000,
+ 0x24d: 0x2000, 0x250: 0x2000,
+ 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000,
+ 0x25f: 0x2000,
+ // Block 0xa, offset 0x280
+ 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000,
+ 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000,
+ 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000,
+ 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000,
+ 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000,
+ 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000,
+ 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000,
+ 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000,
+ 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000,
+ 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000,
+ 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000,
+ 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000,
+ 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000,
+ 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000,
+ 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000,
+ 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000,
+ 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000,
+ 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000,
+ // Block 0xc, offset 0x300
+ 0x311: 0x2000,
+ 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000,
+ 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000,
+ 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000,
+ 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000,
+ 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000,
+ 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000,
+ 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000,
+ // Block 0xd, offset 0x340
+ 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000,
+ 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000,
+ // Block 0xe, offset 0x380
+ 0x381: 0x2000,
+ 0x390: 0x2000, 0x391: 0x2000,
+ 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000,
+ 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000,
+ 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000,
+ 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000,
+ 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000,
+ 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000,
+ 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000,
+ 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000,
+ 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000,
+ 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000,
+ // Block 0x10, offset 0x400
+ 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000,
+ 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000,
+ 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000,
+ 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000,
+ 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000,
+ 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000,
+ 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000,
+ 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000,
+ 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000,
+ 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000,
+ 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000,
+ // Block 0x11, offset 0x440
+ 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000,
+ 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000,
+ 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000,
+ 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000,
+ 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000,
+ 0x45e: 0x4000, 0x45f: 0x4000,
+ // Block 0x12, offset 0x480
+ 0x490: 0x2000,
+ 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000,
+ 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000,
+ 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000,
+ 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000,
+ 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000,
+ 0x4bb: 0x2000,
+ 0x4be: 0x2000,
+ // Block 0x13, offset 0x4c0
+ 0x4f4: 0x2000,
+ 0x4ff: 0x2000,
+ // Block 0x14, offset 0x500
+ 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000,
+ 0x529: 0xa009,
+ 0x52c: 0x2000,
+ // Block 0x15, offset 0x540
+ 0x543: 0x2000, 0x545: 0x2000,
+ 0x549: 0x2000,
+ 0x553: 0x2000, 0x556: 0x2000,
+ 0x561: 0x2000, 0x562: 0x2000,
+ 0x566: 0x2000,
+ 0x56b: 0x2000,
+ // Block 0x16, offset 0x580
+ 0x593: 0x2000, 0x594: 0x2000,
+ 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000,
+ 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000,
+ 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000,
+ 0x5aa: 0x2000, 0x5ab: 0x2000,
+ 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000,
+ 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000,
+ // Block 0x17, offset 0x5c0
+ 0x5c9: 0x2000,
+ 0x5d0: 0x200a, 0x5d1: 0x200b,
+ 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000,
+ 0x5d8: 0x2000, 0x5d9: 0x2000,
+ 0x5f8: 0x2000, 0x5f9: 0x2000,
+ // Block 0x18, offset 0x600
+ 0x612: 0x2000, 0x614: 0x2000,
+ 0x627: 0x2000,
+ // Block 0x19, offset 0x640
+ 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000,
+ 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000,
+ 0x64f: 0x2000, 0x651: 0x2000,
+ 0x655: 0x2000,
+ 0x65a: 0x2000, 0x65d: 0x2000,
+ 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000,
+ 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000,
+ 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000,
+ 0x674: 0x2000, 0x675: 0x2000,
+ 0x676: 0x2000, 0x677: 0x2000,
+ 0x67c: 0x2000, 0x67d: 0x2000,
+ // Block 0x1a, offset 0x680
+ 0x688: 0x2000,
+ 0x68c: 0x2000,
+ 0x692: 0x2000,
+ 0x6a0: 0x2000, 0x6a1: 0x2000,
+ 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000,
+ 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000,
+ // Block 0x1b, offset 0x6c0
+ 0x6c2: 0x2000, 0x6c3: 0x2000,
+ 0x6c6: 0x2000, 0x6c7: 0x2000,
+ 0x6d5: 0x2000,
+ 0x6d9: 0x2000,
+ 0x6e5: 0x2000,
+ 0x6ff: 0x2000,
+ // Block 0x1c, offset 0x700
+ 0x712: 0x2000,
+ 0x71a: 0x4000, 0x71b: 0x4000,
+ 0x729: 0x4000,
+ 0x72a: 0x4000,
+ // Block 0x1d, offset 0x740
+ 0x769: 0x4000,
+ 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000,
+ 0x770: 0x4000, 0x773: 0x4000,
+ // Block 0x1e, offset 0x780
+ 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000,
+ 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000,
+ 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000,
+ 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000,
+ 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000,
+ 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000,
+ // Block 0x1f, offset 0x7c0
+ 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000,
+ 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000,
+ 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000,
+ 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000,
+ 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000,
+ 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000,
+ 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000,
+ 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000,
+ 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000,
+ 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000,
+ 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000,
+ // Block 0x20, offset 0x800
+ 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000,
+ 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000,
+ 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000,
+ 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000,
+ 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000,
+ 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000,
+ 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000,
+ 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000,
+ 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000,
+ 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000,
+ 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000,
+ // Block 0x21, offset 0x840
+ 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000,
+ 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000,
+ 0x850: 0x2000, 0x851: 0x2000,
+ 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000,
+ 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000,
+ 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000,
+ 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000,
+ 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000,
+ 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000,
+ // Block 0x22, offset 0x880
+ 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000,
+ 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000,
+ 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000,
+ 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000,
+ 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000,
+ 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000,
+ 0x8b2: 0x2000, 0x8b3: 0x2000,
+ 0x8b6: 0x2000, 0x8b7: 0x2000,
+ 0x8bc: 0x2000, 0x8bd: 0x2000,
+ // Block 0x23, offset 0x8c0
+ 0x8c0: 0x2000, 0x8c1: 0x2000,
+ 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f,
+ 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000,
+ 0x8e2: 0x2000, 0x8e3: 0x2000,
+ 0x8e4: 0x2000, 0x8e5: 0x2000,
+ 0x8ef: 0x2000,
+ 0x8fd: 0x4000, 0x8fe: 0x4000,
+ // Block 0x24, offset 0x900
+ 0x905: 0x2000,
+ 0x906: 0x2000, 0x909: 0x2000,
+ 0x90e: 0x2000, 0x90f: 0x2000,
+ 0x914: 0x4000, 0x915: 0x4000,
+ 0x91c: 0x2000,
+ 0x91e: 0x2000,
+ // Block 0x25, offset 0x940
+ 0x940: 0x2000, 0x942: 0x2000,
+ 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000,
+ 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000,
+ 0x952: 0x4000, 0x953: 0x4000,
+ 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000,
+ 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000,
+ 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000,
+ 0x97f: 0x4000,
+ // Block 0x26, offset 0x980
+ 0x993: 0x4000,
+ 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000,
+ 0x9aa: 0x4000, 0x9ab: 0x4000,
+ 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000,
+ // Block 0x27, offset 0x9c0
+ 0x9c4: 0x4000, 0x9c5: 0x4000,
+ 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000,
+ 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000,
+ 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000,
+ 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000,
+ 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000,
+ 0x9e8: 0x2000, 0x9e9: 0x2000,
+ 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000,
+ 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000,
+ 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000,
+ 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000,
+ // Block 0x28, offset 0xa00
+ 0xa05: 0x4000,
+ 0xa0a: 0x4000, 0xa0b: 0x4000,
+ 0xa28: 0x4000,
+ 0xa3d: 0x2000,
+ // Block 0x29, offset 0xa40
+ 0xa4c: 0x4000, 0xa4e: 0x4000,
+ 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000,
+ 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000,
+ 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000,
+ // Block 0x2a, offset 0xa80
+ 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000,
+ 0xab0: 0x4000,
+ 0xabf: 0x4000,
+ // Block 0x2b, offset 0xac0
+ 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000,
+ 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000,
+ // Block 0x2c, offset 0xb00
+ 0xb05: 0x6010,
+ 0xb06: 0x6011,
+ // Block 0x2d, offset 0xb40
+ 0xb5b: 0x4000, 0xb5c: 0x4000,
+ // Block 0x2e, offset 0xb80
+ 0xb90: 0x4000,
+ 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000,
+ 0xb98: 0x2000, 0xb99: 0x2000,
+ // Block 0x2f, offset 0xbc0
+ 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000,
+ 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000,
+ 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000,
+ 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000,
+ 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000,
+ 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000,
+ 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000,
+ 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000,
+ 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000,
+ 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000,
+ 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000,
+ // Block 0x30, offset 0xc00
+ 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000,
+ 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000,
+ 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000,
+ 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000,
+ 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000,
+ 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000,
+ 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000,
+ 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000,
+ 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000,
+ // Block 0x31, offset 0xc40
+ 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000,
+ 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000,
+ 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000,
+ 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000,
+ 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000,
+ 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000,
+ // Block 0x32, offset 0xc80
+ 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000,
+ 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000,
+ 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000,
+ 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000,
+ 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000,
+ 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000,
+ 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000,
+ 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000,
+ 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000,
+ 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000,
+ 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000,
+ // Block 0x33, offset 0xcc0
+ 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000,
+ 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000,
+ 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000,
+ 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000,
+ 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000,
+ 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000,
+ 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000,
+ 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000,
+ 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000,
+ 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000,
+ 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000,
+ // Block 0x34, offset 0xd00
+ 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000,
+ 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000,
+ 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000,
+ 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000,
+ 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000,
+ 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a,
+ 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020,
+ 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023,
+ 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026,
+ 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028,
+ 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029,
+ // Block 0x35, offset 0xd40
+ 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000,
+ 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f,
+ 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000,
+ 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000,
+ 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000,
+ 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036,
+ 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038,
+ 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035,
+ 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000,
+ 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d,
+ 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000,
+ // Block 0x36, offset 0xd80
+ 0xd85: 0x4000,
+ 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000,
+ 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000,
+ 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000,
+ 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000,
+ 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000,
+ 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000,
+ 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000,
+ 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e,
+ 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e,
+ 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e,
+ // Block 0x37, offset 0xdc0
+ 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037,
+ 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037,
+ 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040,
+ 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044,
+ 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045,
+ 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c,
+ 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000,
+ 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000,
+ 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000,
+ 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000,
+ 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000,
+ // Block 0x38, offset 0xe00
+ 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000,
+ 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000,
+ 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000,
+ 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000,
+ 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000,
+ 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000,
+ 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000,
+ 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000,
+ 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000,
+ 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000,
+ // Block 0x39, offset 0xe40
+ 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000,
+ 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000,
+ 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000,
+ 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000,
+ 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000,
+ 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000,
+ 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000,
+ 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000,
+ 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000,
+ // Block 0x3a, offset 0xe80
+ 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000,
+ 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000,
+ 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000,
+ 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000,
+ 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000,
+ 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000,
+ 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000,
+ 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000,
+ 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000,
+ 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000,
+ 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000,
+ // Block 0x3b, offset 0xec0
+ 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000,
+ 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000,
+ 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000,
+ 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000,
+ 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000,
+ 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000,
+ 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000,
+ 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000,
+ 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000,
+ 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000,
+ 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000,
+ // Block 0x3c, offset 0xf00
+ 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000,
+ 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000,
+ 0xf0c: 0x4000, 0xf0d: 0x4000, 0xf0e: 0x4000, 0xf0f: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000,
+ 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000,
+ 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000,
+ 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000,
+ 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000,
+ 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000,
+ 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000,
+ 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000,
+ 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000,
+ // Block 0x3d, offset 0xf40
+ 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000,
+ 0xf46: 0x4000, 0xf47: 0x4000, 0xf48: 0x4000, 0xf49: 0x4000, 0xf4a: 0x4000, 0xf4b: 0x4000,
+ 0xf4c: 0x4000, 0xf50: 0x4000, 0xf51: 0x4000,
+ 0xf52: 0x4000, 0xf53: 0x4000, 0xf54: 0x4000, 0xf55: 0x4000, 0xf56: 0x4000, 0xf57: 0x4000,
+ 0xf58: 0x4000, 0xf59: 0x4000, 0xf5a: 0x4000, 0xf5b: 0x4000, 0xf5c: 0x4000, 0xf5d: 0x4000,
+ 0xf5e: 0x4000, 0xf5f: 0x4000, 0xf60: 0x4000, 0xf61: 0x4000, 0xf62: 0x4000, 0xf63: 0x4000,
+ 0xf64: 0x4000, 0xf65: 0x4000, 0xf66: 0x4000, 0xf67: 0x4000, 0xf68: 0x4000, 0xf69: 0x4000,
+ 0xf6a: 0x4000, 0xf6b: 0x4000, 0xf6c: 0x4000, 0xf6d: 0x4000, 0xf6e: 0x4000, 0xf6f: 0x4000,
+ 0xf70: 0x4000, 0xf71: 0x4000, 0xf72: 0x4000, 0xf73: 0x4000, 0xf74: 0x4000, 0xf75: 0x4000,
+ 0xf76: 0x4000, 0xf77: 0x4000, 0xf78: 0x4000, 0xf79: 0x4000, 0xf7a: 0x4000, 0xf7b: 0x4000,
+ 0xf7c: 0x4000, 0xf7d: 0x4000, 0xf7e: 0x4000, 0xf7f: 0x4000,
+ // Block 0x3e, offset 0xf80
+ 0xf80: 0x4000, 0xf81: 0x4000, 0xf82: 0x4000, 0xf83: 0x4000, 0xf84: 0x4000, 0xf85: 0x4000,
+ 0xf86: 0x4000,
+ // Block 0x3f, offset 0xfc0
+ 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000,
+ 0xfe4: 0x4000, 0xfe5: 0x4000, 0xfe6: 0x4000, 0xfe7: 0x4000, 0xfe8: 0x4000, 0xfe9: 0x4000,
+ 0xfea: 0x4000, 0xfeb: 0x4000, 0xfec: 0x4000, 0xfed: 0x4000, 0xfee: 0x4000, 0xfef: 0x4000,
+ 0xff0: 0x4000, 0xff1: 0x4000, 0xff2: 0x4000, 0xff3: 0x4000, 0xff4: 0x4000, 0xff5: 0x4000,
+ 0xff6: 0x4000, 0xff7: 0x4000, 0xff8: 0x4000, 0xff9: 0x4000, 0xffa: 0x4000, 0xffb: 0x4000,
+ 0xffc: 0x4000,
+ // Block 0x40, offset 0x1000
+ 0x1000: 0x4000, 0x1001: 0x4000, 0x1002: 0x4000, 0x1003: 0x4000, 0x1004: 0x4000, 0x1005: 0x4000,
+ 0x1006: 0x4000, 0x1007: 0x4000, 0x1008: 0x4000, 0x1009: 0x4000, 0x100a: 0x4000, 0x100b: 0x4000,
+ 0x100c: 0x4000, 0x100d: 0x4000, 0x100e: 0x4000, 0x100f: 0x4000, 0x1010: 0x4000, 0x1011: 0x4000,
+ 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000,
+ 0x1018: 0x4000, 0x1019: 0x4000, 0x101a: 0x4000, 0x101b: 0x4000, 0x101c: 0x4000, 0x101d: 0x4000,
+ 0x101e: 0x4000, 0x101f: 0x4000, 0x1020: 0x4000, 0x1021: 0x4000, 0x1022: 0x4000, 0x1023: 0x4000,
+ // Block 0x41, offset 0x1040
+ 0x1040: 0x2000, 0x1041: 0x2000, 0x1042: 0x2000, 0x1043: 0x2000, 0x1044: 0x2000, 0x1045: 0x2000,
+ 0x1046: 0x2000, 0x1047: 0x2000, 0x1048: 0x2000, 0x1049: 0x2000, 0x104a: 0x2000, 0x104b: 0x2000,
+ 0x104c: 0x2000, 0x104d: 0x2000, 0x104e: 0x2000, 0x104f: 0x2000, 0x1050: 0x4000, 0x1051: 0x4000,
+ 0x1052: 0x4000, 0x1053: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000,
+ 0x1058: 0x4000, 0x1059: 0x4000,
+ 0x1070: 0x4000, 0x1071: 0x4000, 0x1072: 0x4000, 0x1073: 0x4000, 0x1074: 0x4000, 0x1075: 0x4000,
+ 0x1076: 0x4000, 0x1077: 0x4000, 0x1078: 0x4000, 0x1079: 0x4000, 0x107a: 0x4000, 0x107b: 0x4000,
+ 0x107c: 0x4000, 0x107d: 0x4000, 0x107e: 0x4000, 0x107f: 0x4000,
+ // Block 0x42, offset 0x1080
+ 0x1080: 0x4000, 0x1081: 0x4000, 0x1082: 0x4000, 0x1083: 0x4000, 0x1084: 0x4000, 0x1085: 0x4000,
+ 0x1086: 0x4000, 0x1087: 0x4000, 0x1088: 0x4000, 0x1089: 0x4000, 0x108a: 0x4000, 0x108b: 0x4000,
+ 0x108c: 0x4000, 0x108d: 0x4000, 0x108e: 0x4000, 0x108f: 0x4000, 0x1090: 0x4000, 0x1091: 0x4000,
+ 0x1092: 0x4000, 0x1094: 0x4000, 0x1095: 0x4000, 0x1096: 0x4000, 0x1097: 0x4000,
+ 0x1098: 0x4000, 0x1099: 0x4000, 0x109a: 0x4000, 0x109b: 0x4000, 0x109c: 0x4000, 0x109d: 0x4000,
+ 0x109e: 0x4000, 0x109f: 0x4000, 0x10a0: 0x4000, 0x10a1: 0x4000, 0x10a2: 0x4000, 0x10a3: 0x4000,
+ 0x10a4: 0x4000, 0x10a5: 0x4000, 0x10a6: 0x4000, 0x10a8: 0x4000, 0x10a9: 0x4000,
+ 0x10aa: 0x4000, 0x10ab: 0x4000,
+ // Block 0x43, offset 0x10c0
+ 0x10c1: 0x9012, 0x10c2: 0x9012, 0x10c3: 0x9012, 0x10c4: 0x9012, 0x10c5: 0x9012,
+ 0x10c6: 0x9012, 0x10c7: 0x9012, 0x10c8: 0x9012, 0x10c9: 0x9012, 0x10ca: 0x9012, 0x10cb: 0x9012,
+ 0x10cc: 0x9012, 0x10cd: 0x9012, 0x10ce: 0x9012, 0x10cf: 0x9012, 0x10d0: 0x9012, 0x10d1: 0x9012,
+ 0x10d2: 0x9012, 0x10d3: 0x9012, 0x10d4: 0x9012, 0x10d5: 0x9012, 0x10d6: 0x9012, 0x10d7: 0x9012,
+ 0x10d8: 0x9012, 0x10d9: 0x9012, 0x10da: 0x9012, 0x10db: 0x9012, 0x10dc: 0x9012, 0x10dd: 0x9012,
+ 0x10de: 0x9012, 0x10df: 0x9012, 0x10e0: 0x9049, 0x10e1: 0x9049, 0x10e2: 0x9049, 0x10e3: 0x9049,
+ 0x10e4: 0x9049, 0x10e5: 0x9049, 0x10e6: 0x9049, 0x10e7: 0x9049, 0x10e8: 0x9049, 0x10e9: 0x9049,
+ 0x10ea: 0x9049, 0x10eb: 0x9049, 0x10ec: 0x9049, 0x10ed: 0x9049, 0x10ee: 0x9049, 0x10ef: 0x9049,
+ 0x10f0: 0x9049, 0x10f1: 0x9049, 0x10f2: 0x9049, 0x10f3: 0x9049, 0x10f4: 0x9049, 0x10f5: 0x9049,
+ 0x10f6: 0x9049, 0x10f7: 0x9049, 0x10f8: 0x9049, 0x10f9: 0x9049, 0x10fa: 0x9049, 0x10fb: 0x9049,
+ 0x10fc: 0x9049, 0x10fd: 0x9049, 0x10fe: 0x9049, 0x10ff: 0x9049,
+ // Block 0x44, offset 0x1100
+ 0x1100: 0x9049, 0x1101: 0x9049, 0x1102: 0x9049, 0x1103: 0x9049, 0x1104: 0x9049, 0x1105: 0x9049,
+ 0x1106: 0x9049, 0x1107: 0x9049, 0x1108: 0x9049, 0x1109: 0x9049, 0x110a: 0x9049, 0x110b: 0x9049,
+ 0x110c: 0x9049, 0x110d: 0x9049, 0x110e: 0x9049, 0x110f: 0x9049, 0x1110: 0x9049, 0x1111: 0x9049,
+ 0x1112: 0x9049, 0x1113: 0x9049, 0x1114: 0x9049, 0x1115: 0x9049, 0x1116: 0x9049, 0x1117: 0x9049,
+ 0x1118: 0x9049, 0x1119: 0x9049, 0x111a: 0x9049, 0x111b: 0x9049, 0x111c: 0x9049, 0x111d: 0x9049,
+ 0x111e: 0x9049, 0x111f: 0x904a, 0x1120: 0x904b, 0x1121: 0xb04c, 0x1122: 0xb04d, 0x1123: 0xb04d,
+ 0x1124: 0xb04e, 0x1125: 0xb04f, 0x1126: 0xb050, 0x1127: 0xb051, 0x1128: 0xb052, 0x1129: 0xb053,
+ 0x112a: 0xb054, 0x112b: 0xb055, 0x112c: 0xb056, 0x112d: 0xb057, 0x112e: 0xb058, 0x112f: 0xb059,
+ 0x1130: 0xb05a, 0x1131: 0xb05b, 0x1132: 0xb05c, 0x1133: 0xb05d, 0x1134: 0xb05e, 0x1135: 0xb05f,
+ 0x1136: 0xb060, 0x1137: 0xb061, 0x1138: 0xb062, 0x1139: 0xb063, 0x113a: 0xb064, 0x113b: 0xb065,
+ 0x113c: 0xb052, 0x113d: 0xb066, 0x113e: 0xb067, 0x113f: 0xb055,
+ // Block 0x45, offset 0x1140
+ 0x1140: 0xb068, 0x1141: 0xb069, 0x1142: 0xb06a, 0x1143: 0xb06b, 0x1144: 0xb05a, 0x1145: 0xb056,
+ 0x1146: 0xb06c, 0x1147: 0xb06d, 0x1148: 0xb06b, 0x1149: 0xb06e, 0x114a: 0xb06b, 0x114b: 0xb06f,
+ 0x114c: 0xb06f, 0x114d: 0xb070, 0x114e: 0xb070, 0x114f: 0xb071, 0x1150: 0xb056, 0x1151: 0xb072,
+ 0x1152: 0xb073, 0x1153: 0xb072, 0x1154: 0xb074, 0x1155: 0xb073, 0x1156: 0xb075, 0x1157: 0xb075,
+ 0x1158: 0xb076, 0x1159: 0xb076, 0x115a: 0xb077, 0x115b: 0xb077, 0x115c: 0xb073, 0x115d: 0xb078,
+ 0x115e: 0xb079, 0x115f: 0xb067, 0x1160: 0xb07a, 0x1161: 0xb07b, 0x1162: 0xb07b, 0x1163: 0xb07b,
+ 0x1164: 0xb07b, 0x1165: 0xb07b, 0x1166: 0xb07b, 0x1167: 0xb07b, 0x1168: 0xb07b, 0x1169: 0xb07b,
+ 0x116a: 0xb07b, 0x116b: 0xb07b, 0x116c: 0xb07b, 0x116d: 0xb07b, 0x116e: 0xb07b, 0x116f: 0xb07b,
+ 0x1170: 0xb07c, 0x1171: 0xb07c, 0x1172: 0xb07c, 0x1173: 0xb07c, 0x1174: 0xb07c, 0x1175: 0xb07c,
+ 0x1176: 0xb07c, 0x1177: 0xb07c, 0x1178: 0xb07c, 0x1179: 0xb07c, 0x117a: 0xb07c, 0x117b: 0xb07c,
+ 0x117c: 0xb07c, 0x117d: 0xb07c, 0x117e: 0xb07c,
+ // Block 0x46, offset 0x1180
+ 0x1182: 0xb07d, 0x1183: 0xb07e, 0x1184: 0xb07f, 0x1185: 0xb080,
+ 0x1186: 0xb07f, 0x1187: 0xb07e, 0x118a: 0xb081, 0x118b: 0xb082,
+ 0x118c: 0xb083, 0x118d: 0xb07f, 0x118e: 0xb080, 0x118f: 0xb07f,
+ 0x1192: 0xb084, 0x1193: 0xb085, 0x1194: 0xb084, 0x1195: 0xb086, 0x1196: 0xb084, 0x1197: 0xb087,
+ 0x119a: 0xb088, 0x119b: 0xb089, 0x119c: 0xb08a,
+ 0x11a0: 0x908b, 0x11a1: 0x908b, 0x11a2: 0x908c, 0x11a3: 0x908d,
+ 0x11a4: 0x908b, 0x11a5: 0x908e, 0x11a6: 0x908f, 0x11a8: 0xb090, 0x11a9: 0xb091,
+ 0x11aa: 0xb092, 0x11ab: 0xb091, 0x11ac: 0xb093, 0x11ad: 0xb094, 0x11ae: 0xb095,
+ 0x11bd: 0x2000,
+ // Block 0x47, offset 0x11c0
+ 0x11e0: 0x4000,
+ // Block 0x48, offset 0x1200
+ 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000,
+ 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000,
+ 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000,
+ 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, 0x1216: 0x4000, 0x1217: 0x4000,
+ 0x1218: 0x4000, 0x1219: 0x4000, 0x121a: 0x4000, 0x121b: 0x4000, 0x121c: 0x4000, 0x121d: 0x4000,
+ 0x121e: 0x4000, 0x121f: 0x4000, 0x1220: 0x4000, 0x1221: 0x4000, 0x1222: 0x4000, 0x1223: 0x4000,
+ 0x1224: 0x4000, 0x1225: 0x4000, 0x1226: 0x4000, 0x1227: 0x4000, 0x1228: 0x4000, 0x1229: 0x4000,
+ 0x122a: 0x4000, 0x122b: 0x4000, 0x122c: 0x4000,
+ // Block 0x49, offset 0x1240
+ 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000,
+ 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, 0x1249: 0x4000, 0x124a: 0x4000, 0x124b: 0x4000,
+ 0x124c: 0x4000, 0x124d: 0x4000, 0x124e: 0x4000, 0x124f: 0x4000, 0x1250: 0x4000, 0x1251: 0x4000,
+ 0x1252: 0x4000, 0x1253: 0x4000, 0x1254: 0x4000, 0x1255: 0x4000, 0x1256: 0x4000, 0x1257: 0x4000,
+ 0x1258: 0x4000, 0x1259: 0x4000, 0x125a: 0x4000, 0x125b: 0x4000, 0x125c: 0x4000, 0x125d: 0x4000,
+ 0x125e: 0x4000, 0x125f: 0x4000, 0x1260: 0x4000, 0x1261: 0x4000, 0x1262: 0x4000, 0x1263: 0x4000,
+ 0x1264: 0x4000, 0x1265: 0x4000, 0x1266: 0x4000, 0x1267: 0x4000, 0x1268: 0x4000, 0x1269: 0x4000,
+ 0x126a: 0x4000, 0x126b: 0x4000, 0x126c: 0x4000, 0x126d: 0x4000, 0x126e: 0x4000, 0x126f: 0x4000,
+ 0x1270: 0x4000, 0x1271: 0x4000, 0x1272: 0x4000,
+ // Block 0x4a, offset 0x1280
+ 0x1280: 0x4000, 0x1281: 0x4000,
+ // Block 0x4b, offset 0x12c0
+ 0x12c4: 0x4000,
+ // Block 0x4c, offset 0x1300
+ 0x130f: 0x4000,
+ // Block 0x4d, offset 0x1340
+ 0x1340: 0x2000, 0x1341: 0x2000, 0x1342: 0x2000, 0x1343: 0x2000, 0x1344: 0x2000, 0x1345: 0x2000,
+ 0x1346: 0x2000, 0x1347: 0x2000, 0x1348: 0x2000, 0x1349: 0x2000, 0x134a: 0x2000,
+ 0x1350: 0x2000, 0x1351: 0x2000,
+ 0x1352: 0x2000, 0x1353: 0x2000, 0x1354: 0x2000, 0x1355: 0x2000, 0x1356: 0x2000, 0x1357: 0x2000,
+ 0x1358: 0x2000, 0x1359: 0x2000, 0x135a: 0x2000, 0x135b: 0x2000, 0x135c: 0x2000, 0x135d: 0x2000,
+ 0x135e: 0x2000, 0x135f: 0x2000, 0x1360: 0x2000, 0x1361: 0x2000, 0x1362: 0x2000, 0x1363: 0x2000,
+ 0x1364: 0x2000, 0x1365: 0x2000, 0x1366: 0x2000, 0x1367: 0x2000, 0x1368: 0x2000, 0x1369: 0x2000,
+ 0x136a: 0x2000, 0x136b: 0x2000, 0x136c: 0x2000, 0x136d: 0x2000,
+ 0x1370: 0x2000, 0x1371: 0x2000, 0x1372: 0x2000, 0x1373: 0x2000, 0x1374: 0x2000, 0x1375: 0x2000,
+ 0x1376: 0x2000, 0x1377: 0x2000, 0x1378: 0x2000, 0x1379: 0x2000, 0x137a: 0x2000, 0x137b: 0x2000,
+ 0x137c: 0x2000, 0x137d: 0x2000, 0x137e: 0x2000, 0x137f: 0x2000,
+ // Block 0x4e, offset 0x1380
+ 0x1380: 0x2000, 0x1381: 0x2000, 0x1382: 0x2000, 0x1383: 0x2000, 0x1384: 0x2000, 0x1385: 0x2000,
+ 0x1386: 0x2000, 0x1387: 0x2000, 0x1388: 0x2000, 0x1389: 0x2000, 0x138a: 0x2000, 0x138b: 0x2000,
+ 0x138c: 0x2000, 0x138d: 0x2000, 0x138e: 0x2000, 0x138f: 0x2000, 0x1390: 0x2000, 0x1391: 0x2000,
+ 0x1392: 0x2000, 0x1393: 0x2000, 0x1394: 0x2000, 0x1395: 0x2000, 0x1396: 0x2000, 0x1397: 0x2000,
+ 0x1398: 0x2000, 0x1399: 0x2000, 0x139a: 0x2000, 0x139b: 0x2000, 0x139c: 0x2000, 0x139d: 0x2000,
+ 0x139e: 0x2000, 0x139f: 0x2000, 0x13a0: 0x2000, 0x13a1: 0x2000, 0x13a2: 0x2000, 0x13a3: 0x2000,
+ 0x13a4: 0x2000, 0x13a5: 0x2000, 0x13a6: 0x2000, 0x13a7: 0x2000, 0x13a8: 0x2000, 0x13a9: 0x2000,
+ 0x13b0: 0x2000, 0x13b1: 0x2000, 0x13b2: 0x2000, 0x13b3: 0x2000, 0x13b4: 0x2000, 0x13b5: 0x2000,
+ 0x13b6: 0x2000, 0x13b7: 0x2000, 0x13b8: 0x2000, 0x13b9: 0x2000, 0x13ba: 0x2000, 0x13bb: 0x2000,
+ 0x13bc: 0x2000, 0x13bd: 0x2000, 0x13be: 0x2000, 0x13bf: 0x2000,
+ // Block 0x4f, offset 0x13c0
+ 0x13c0: 0x2000, 0x13c1: 0x2000, 0x13c2: 0x2000, 0x13c3: 0x2000, 0x13c4: 0x2000, 0x13c5: 0x2000,
+ 0x13c6: 0x2000, 0x13c7: 0x2000, 0x13c8: 0x2000, 0x13c9: 0x2000, 0x13ca: 0x2000, 0x13cb: 0x2000,
+ 0x13cc: 0x2000, 0x13cd: 0x2000, 0x13ce: 0x4000, 0x13cf: 0x2000, 0x13d0: 0x2000, 0x13d1: 0x4000,
+ 0x13d2: 0x4000, 0x13d3: 0x4000, 0x13d4: 0x4000, 0x13d5: 0x4000, 0x13d6: 0x4000, 0x13d7: 0x4000,
+ 0x13d8: 0x4000, 0x13d9: 0x4000, 0x13da: 0x4000, 0x13db: 0x2000, 0x13dc: 0x2000, 0x13dd: 0x2000,
+ 0x13de: 0x2000, 0x13df: 0x2000, 0x13e0: 0x2000, 0x13e1: 0x2000, 0x13e2: 0x2000, 0x13e3: 0x2000,
+ 0x13e4: 0x2000, 0x13e5: 0x2000, 0x13e6: 0x2000, 0x13e7: 0x2000, 0x13e8: 0x2000, 0x13e9: 0x2000,
+ 0x13ea: 0x2000, 0x13eb: 0x2000, 0x13ec: 0x2000,
+ // Block 0x50, offset 0x1400
+ 0x1400: 0x4000, 0x1401: 0x4000, 0x1402: 0x4000,
+ 0x1410: 0x4000, 0x1411: 0x4000,
+ 0x1412: 0x4000, 0x1413: 0x4000, 0x1414: 0x4000, 0x1415: 0x4000, 0x1416: 0x4000, 0x1417: 0x4000,
+ 0x1418: 0x4000, 0x1419: 0x4000, 0x141a: 0x4000, 0x141b: 0x4000, 0x141c: 0x4000, 0x141d: 0x4000,
+ 0x141e: 0x4000, 0x141f: 0x4000, 0x1420: 0x4000, 0x1421: 0x4000, 0x1422: 0x4000, 0x1423: 0x4000,
+ 0x1424: 0x4000, 0x1425: 0x4000, 0x1426: 0x4000, 0x1427: 0x4000, 0x1428: 0x4000, 0x1429: 0x4000,
+ 0x142a: 0x4000, 0x142b: 0x4000, 0x142c: 0x4000, 0x142d: 0x4000, 0x142e: 0x4000, 0x142f: 0x4000,
+ 0x1430: 0x4000, 0x1431: 0x4000, 0x1432: 0x4000, 0x1433: 0x4000, 0x1434: 0x4000, 0x1435: 0x4000,
+ 0x1436: 0x4000, 0x1437: 0x4000, 0x1438: 0x4000, 0x1439: 0x4000, 0x143a: 0x4000, 0x143b: 0x4000,
+ // Block 0x51, offset 0x1440
+ 0x1440: 0x4000, 0x1441: 0x4000, 0x1442: 0x4000, 0x1443: 0x4000, 0x1444: 0x4000, 0x1445: 0x4000,
+ 0x1446: 0x4000, 0x1447: 0x4000, 0x1448: 0x4000,
+ 0x1450: 0x4000, 0x1451: 0x4000,
+ // Block 0x52, offset 0x1480
+ 0x1480: 0x4000, 0x1481: 0x4000, 0x1482: 0x4000, 0x1483: 0x4000, 0x1484: 0x4000, 0x1485: 0x4000,
+ 0x1486: 0x4000, 0x1487: 0x4000, 0x1488: 0x4000, 0x1489: 0x4000, 0x148a: 0x4000, 0x148b: 0x4000,
+ 0x148c: 0x4000, 0x148d: 0x4000, 0x148e: 0x4000, 0x148f: 0x4000, 0x1490: 0x4000, 0x1491: 0x4000,
+ 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000,
+ 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x4000, 0x149c: 0x4000, 0x149d: 0x4000,
+ 0x149e: 0x4000, 0x149f: 0x4000, 0x14a0: 0x4000,
+ 0x14ad: 0x4000, 0x14ae: 0x4000, 0x14af: 0x4000,
+ 0x14b0: 0x4000, 0x14b1: 0x4000, 0x14b2: 0x4000, 0x14b3: 0x4000, 0x14b4: 0x4000, 0x14b5: 0x4000,
+ 0x14b7: 0x4000, 0x14b8: 0x4000, 0x14b9: 0x4000, 0x14ba: 0x4000, 0x14bb: 0x4000,
+ 0x14bc: 0x4000, 0x14bd: 0x4000, 0x14be: 0x4000, 0x14bf: 0x4000,
+ // Block 0x53, offset 0x14c0
+ 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, 0x14c3: 0x4000, 0x14c4: 0x4000, 0x14c5: 0x4000,
+ 0x14c6: 0x4000, 0x14c7: 0x4000, 0x14c8: 0x4000, 0x14c9: 0x4000, 0x14ca: 0x4000, 0x14cb: 0x4000,
+ 0x14cc: 0x4000, 0x14cd: 0x4000, 0x14ce: 0x4000, 0x14cf: 0x4000, 0x14d0: 0x4000, 0x14d1: 0x4000,
+ 0x14d2: 0x4000, 0x14d3: 0x4000, 0x14d4: 0x4000, 0x14d5: 0x4000, 0x14d6: 0x4000, 0x14d7: 0x4000,
+ 0x14d8: 0x4000, 0x14d9: 0x4000, 0x14da: 0x4000, 0x14db: 0x4000, 0x14dc: 0x4000, 0x14dd: 0x4000,
+ 0x14de: 0x4000, 0x14df: 0x4000, 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000,
+ 0x14e4: 0x4000, 0x14e5: 0x4000, 0x14e6: 0x4000, 0x14e7: 0x4000, 0x14e8: 0x4000, 0x14e9: 0x4000,
+ 0x14ea: 0x4000, 0x14eb: 0x4000, 0x14ec: 0x4000, 0x14ed: 0x4000, 0x14ee: 0x4000, 0x14ef: 0x4000,
+ 0x14f0: 0x4000, 0x14f1: 0x4000, 0x14f2: 0x4000, 0x14f3: 0x4000, 0x14f4: 0x4000, 0x14f5: 0x4000,
+ 0x14f6: 0x4000, 0x14f7: 0x4000, 0x14f8: 0x4000, 0x14f9: 0x4000, 0x14fa: 0x4000, 0x14fb: 0x4000,
+ 0x14fc: 0x4000, 0x14fe: 0x4000, 0x14ff: 0x4000,
+ // Block 0x54, offset 0x1500
+ 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000,
+ 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, 0x1509: 0x4000, 0x150a: 0x4000, 0x150b: 0x4000,
+ 0x150c: 0x4000, 0x150d: 0x4000, 0x150e: 0x4000, 0x150f: 0x4000, 0x1510: 0x4000, 0x1511: 0x4000,
+ 0x1512: 0x4000, 0x1513: 0x4000,
+ 0x1520: 0x4000, 0x1521: 0x4000, 0x1522: 0x4000, 0x1523: 0x4000,
+ 0x1524: 0x4000, 0x1525: 0x4000, 0x1526: 0x4000, 0x1527: 0x4000, 0x1528: 0x4000, 0x1529: 0x4000,
+ 0x152a: 0x4000, 0x152b: 0x4000, 0x152c: 0x4000, 0x152d: 0x4000, 0x152e: 0x4000, 0x152f: 0x4000,
+ 0x1530: 0x4000, 0x1531: 0x4000, 0x1532: 0x4000, 0x1533: 0x4000, 0x1534: 0x4000, 0x1535: 0x4000,
+ 0x1536: 0x4000, 0x1537: 0x4000, 0x1538: 0x4000, 0x1539: 0x4000, 0x153a: 0x4000, 0x153b: 0x4000,
+ 0x153c: 0x4000, 0x153d: 0x4000, 0x153e: 0x4000, 0x153f: 0x4000,
+ // Block 0x55, offset 0x1540
+ 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000,
+ 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000,
+ 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000,
+ 0x1552: 0x4000, 0x1553: 0x4000,
+ 0x1560: 0x4000, 0x1561: 0x4000, 0x1562: 0x4000, 0x1563: 0x4000,
+ 0x1564: 0x4000, 0x1565: 0x4000, 0x1566: 0x4000, 0x1567: 0x4000, 0x1568: 0x4000, 0x1569: 0x4000,
+ 0x156a: 0x4000, 0x156b: 0x4000, 0x156c: 0x4000, 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000,
+ 0x1570: 0x4000, 0x1574: 0x4000,
+ 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000,
+ 0x157c: 0x4000, 0x157d: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000,
+ // Block 0x56, offset 0x1580
+ 0x1580: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000,
+ 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000,
+ 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000,
+ 0x1592: 0x4000, 0x1593: 0x4000, 0x1594: 0x4000, 0x1595: 0x4000, 0x1596: 0x4000, 0x1597: 0x4000,
+ 0x1598: 0x4000, 0x1599: 0x4000, 0x159a: 0x4000, 0x159b: 0x4000, 0x159c: 0x4000, 0x159d: 0x4000,
+ 0x159e: 0x4000, 0x159f: 0x4000, 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000,
+ 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000,
+ 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000,
+ 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000,
+ 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000,
+ 0x15bc: 0x4000, 0x15bd: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000,
+ // Block 0x57, offset 0x15c0
+ 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000,
+ 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000, 0x15cb: 0x4000,
+ 0x15cc: 0x4000, 0x15cd: 0x4000, 0x15ce: 0x4000, 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000,
+ 0x15d2: 0x4000, 0x15d3: 0x4000, 0x15d4: 0x4000, 0x15d5: 0x4000, 0x15d6: 0x4000, 0x15d7: 0x4000,
+ 0x15d8: 0x4000, 0x15d9: 0x4000, 0x15da: 0x4000, 0x15db: 0x4000, 0x15dc: 0x4000, 0x15dd: 0x4000,
+ 0x15de: 0x4000, 0x15df: 0x4000, 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000,
+ 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000,
+ 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000,
+ 0x15f0: 0x4000, 0x15f1: 0x4000, 0x15f2: 0x4000, 0x15f3: 0x4000, 0x15f4: 0x4000, 0x15f5: 0x4000,
+ 0x15f6: 0x4000, 0x15f7: 0x4000, 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000,
+ 0x15fc: 0x4000, 0x15ff: 0x4000,
+ // Block 0x58, offset 0x1600
+ 0x1600: 0x4000, 0x1601: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000,
+ 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, 0x160b: 0x4000,
+ 0x160c: 0x4000, 0x160d: 0x4000, 0x160e: 0x4000, 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000,
+ 0x1612: 0x4000, 0x1613: 0x4000, 0x1614: 0x4000, 0x1615: 0x4000, 0x1616: 0x4000, 0x1617: 0x4000,
+ 0x1618: 0x4000, 0x1619: 0x4000, 0x161a: 0x4000, 0x161b: 0x4000, 0x161c: 0x4000, 0x161d: 0x4000,
+ 0x161e: 0x4000, 0x161f: 0x4000, 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000,
+ 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000,
+ 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000,
+ 0x1630: 0x4000, 0x1631: 0x4000, 0x1632: 0x4000, 0x1633: 0x4000, 0x1634: 0x4000, 0x1635: 0x4000,
+ 0x1636: 0x4000, 0x1637: 0x4000, 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000,
+ 0x163c: 0x4000, 0x163d: 0x4000,
+ // Block 0x59, offset 0x1640
+ 0x164b: 0x4000,
+ 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000,
+ 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000,
+ 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000,
+ 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000,
+ 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000,
+ 0x167a: 0x4000,
+ // Block 0x5a, offset 0x1680
+ 0x1695: 0x4000, 0x1696: 0x4000,
+ 0x16a4: 0x4000,
+ // Block 0x5b, offset 0x16c0
+ 0x16fb: 0x4000,
+ 0x16fc: 0x4000, 0x16fd: 0x4000, 0x16fe: 0x4000, 0x16ff: 0x4000,
+ // Block 0x5c, offset 0x1700
+ 0x1700: 0x4000, 0x1701: 0x4000, 0x1702: 0x4000, 0x1703: 0x4000, 0x1704: 0x4000, 0x1705: 0x4000,
+ 0x1706: 0x4000, 0x1707: 0x4000, 0x1708: 0x4000, 0x1709: 0x4000, 0x170a: 0x4000, 0x170b: 0x4000,
+ 0x170c: 0x4000, 0x170d: 0x4000, 0x170e: 0x4000, 0x170f: 0x4000,
+ // Block 0x5d, offset 0x1740
+ 0x1740: 0x4000, 0x1741: 0x4000, 0x1742: 0x4000, 0x1743: 0x4000, 0x1744: 0x4000, 0x1745: 0x4000,
+ 0x174c: 0x4000, 0x1750: 0x4000, 0x1751: 0x4000,
+ 0x1752: 0x4000,
+ 0x176b: 0x4000, 0x176c: 0x4000,
+ 0x1774: 0x4000, 0x1775: 0x4000,
+ 0x1776: 0x4000,
+ // Block 0x5e, offset 0x1780
+ 0x1790: 0x4000, 0x1791: 0x4000,
+ 0x1792: 0x4000, 0x1793: 0x4000, 0x1794: 0x4000, 0x1795: 0x4000, 0x1796: 0x4000, 0x1797: 0x4000,
+ 0x1798: 0x4000, 0x1799: 0x4000, 0x179a: 0x4000, 0x179b: 0x4000, 0x179c: 0x4000, 0x179d: 0x4000,
+ 0x179e: 0x4000, 0x17a0: 0x4000, 0x17a1: 0x4000, 0x17a2: 0x4000, 0x17a3: 0x4000,
+ 0x17a4: 0x4000, 0x17a5: 0x4000, 0x17a6: 0x4000, 0x17a7: 0x4000,
+ 0x17b0: 0x4000, 0x17b3: 0x4000, 0x17b4: 0x4000, 0x17b5: 0x4000,
+ 0x17b6: 0x4000, 0x17b7: 0x4000, 0x17b8: 0x4000, 0x17b9: 0x4000, 0x17ba: 0x4000, 0x17bb: 0x4000,
+ 0x17bc: 0x4000, 0x17bd: 0x4000, 0x17be: 0x4000,
+ // Block 0x5f, offset 0x17c0
+ 0x17c0: 0x4000, 0x17c1: 0x4000, 0x17c2: 0x4000, 0x17c3: 0x4000, 0x17c4: 0x4000, 0x17c5: 0x4000,
+ 0x17c6: 0x4000, 0x17c7: 0x4000, 0x17c8: 0x4000, 0x17c9: 0x4000, 0x17ca: 0x4000, 0x17cb: 0x4000,
+ 0x17d0: 0x4000, 0x17d1: 0x4000,
+ 0x17d2: 0x4000, 0x17d3: 0x4000, 0x17d4: 0x4000, 0x17d5: 0x4000, 0x17d6: 0x4000, 0x17d7: 0x4000,
+ 0x17d8: 0x4000, 0x17d9: 0x4000, 0x17da: 0x4000, 0x17db: 0x4000, 0x17dc: 0x4000, 0x17dd: 0x4000,
+ 0x17de: 0x4000,
+ // Block 0x60, offset 0x1800
+ 0x1800: 0x4000, 0x1801: 0x4000, 0x1802: 0x4000, 0x1803: 0x4000, 0x1804: 0x4000, 0x1805: 0x4000,
+ 0x1806: 0x4000, 0x1807: 0x4000, 0x1808: 0x4000, 0x1809: 0x4000, 0x180a: 0x4000, 0x180b: 0x4000,
+ 0x180c: 0x4000, 0x180d: 0x4000, 0x180e: 0x4000, 0x180f: 0x4000, 0x1810: 0x4000, 0x1811: 0x4000,
+ // Block 0x61, offset 0x1840
+ 0x1840: 0x4000,
+ // Block 0x62, offset 0x1880
+ 0x1880: 0x2000, 0x1881: 0x2000, 0x1882: 0x2000, 0x1883: 0x2000, 0x1884: 0x2000, 0x1885: 0x2000,
+ 0x1886: 0x2000, 0x1887: 0x2000, 0x1888: 0x2000, 0x1889: 0x2000, 0x188a: 0x2000, 0x188b: 0x2000,
+ 0x188c: 0x2000, 0x188d: 0x2000, 0x188e: 0x2000, 0x188f: 0x2000, 0x1890: 0x2000, 0x1891: 0x2000,
+ 0x1892: 0x2000, 0x1893: 0x2000, 0x1894: 0x2000, 0x1895: 0x2000, 0x1896: 0x2000, 0x1897: 0x2000,
+ 0x1898: 0x2000, 0x1899: 0x2000, 0x189a: 0x2000, 0x189b: 0x2000, 0x189c: 0x2000, 0x189d: 0x2000,
+ 0x189e: 0x2000, 0x189f: 0x2000, 0x18a0: 0x2000, 0x18a1: 0x2000, 0x18a2: 0x2000, 0x18a3: 0x2000,
+ 0x18a4: 0x2000, 0x18a5: 0x2000, 0x18a6: 0x2000, 0x18a7: 0x2000, 0x18a8: 0x2000, 0x18a9: 0x2000,
+ 0x18aa: 0x2000, 0x18ab: 0x2000, 0x18ac: 0x2000, 0x18ad: 0x2000, 0x18ae: 0x2000, 0x18af: 0x2000,
+ 0x18b0: 0x2000, 0x18b1: 0x2000, 0x18b2: 0x2000, 0x18b3: 0x2000, 0x18b4: 0x2000, 0x18b5: 0x2000,
+ 0x18b6: 0x2000, 0x18b7: 0x2000, 0x18b8: 0x2000, 0x18b9: 0x2000, 0x18ba: 0x2000, 0x18bb: 0x2000,
+ 0x18bc: 0x2000, 0x18bd: 0x2000,
+}
+
+// widthIndex: 22 blocks, 1408 entries, 1408 bytes
+// Block 0 is the zero block.
+var widthIndex = [1408]uint8{
+ // Block 0x0, offset 0x0
+ // Block 0x1, offset 0x40
+ // Block 0x2, offset 0x80
+ // Block 0x3, offset 0xc0
+ 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05,
+ 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b,
+ 0xd0: 0x0c, 0xd1: 0x0d,
+ 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06,
+ 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a,
+ 0xf0: 0x0f, 0xf3: 0x12, 0xf4: 0x13,
+ // Block 0x4, offset 0x100
+ 0x104: 0x0e, 0x105: 0x0f,
+ // Block 0x5, offset 0x140
+ 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16,
+ 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b,
+ 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21,
+ 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29,
+ 0x166: 0x2a,
+ 0x16c: 0x2b, 0x16d: 0x2c,
+ 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f,
+ // Block 0x6, offset 0x180
+ 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37,
+ 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x3a, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e,
+ 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e,
+ 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e,
+ 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e,
+ 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e,
+ 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e,
+ 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e,
+ // Block 0x7, offset 0x1c0
+ 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e,
+ 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e,
+ 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e,
+ 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e,
+ 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e,
+ 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e,
+ 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e,
+ 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e,
+ // Block 0x8, offset 0x200
+ 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e,
+ 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e,
+ 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e,
+ 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e,
+ 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e,
+ 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e,
+ 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e,
+ 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e,
+ // Block 0x9, offset 0x240
+ 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e,
+ 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e,
+ 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3b, 0x253: 0x3c,
+ 0x265: 0x3d,
+ 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e,
+ 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e,
+ // Block 0xa, offset 0x280
+ 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e,
+ 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e,
+ 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e,
+ 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3e,
+ // Block 0xb, offset 0x2c0
+ 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08,
+ 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08,
+ 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08,
+ 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08,
+ 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08,
+ 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08,
+ 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08,
+ 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08,
+ // Block 0xc, offset 0x300
+ 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08,
+ 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08,
+ 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08,
+ 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08,
+ 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e,
+ 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e,
+ 0x338: 0x3f, 0x339: 0x40, 0x33c: 0x41, 0x33d: 0x42, 0x33e: 0x43, 0x33f: 0x44,
+ // Block 0xd, offset 0x340
+ 0x37f: 0x45,
+ // Block 0xe, offset 0x380
+ 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e,
+ 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e,
+ 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e,
+ 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x46,
+ 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e,
+ 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x47,
+ // Block 0xf, offset 0x3c0
+ 0x3c0: 0x48,
+ // Block 0x10, offset 0x400
+ 0x400: 0x49, 0x403: 0x4a, 0x404: 0x4b, 0x405: 0x4c, 0x406: 0x4d,
+ 0x408: 0x4e, 0x409: 0x4f, 0x40c: 0x50, 0x40d: 0x51, 0x40e: 0x52, 0x40f: 0x53,
+ 0x410: 0x3a, 0x411: 0x54, 0x412: 0x0e, 0x413: 0x55, 0x414: 0x56, 0x415: 0x57, 0x416: 0x58, 0x417: 0x59,
+ 0x418: 0x0e, 0x419: 0x5a, 0x41a: 0x0e, 0x41b: 0x5b,
+ 0x424: 0x5c, 0x425: 0x5d, 0x426: 0x5e, 0x427: 0x5f,
+ // Block 0x11, offset 0x440
+ 0x456: 0x0b, 0x457: 0x06,
+ 0x458: 0x0c, 0x45b: 0x0d, 0x45f: 0x0e,
+ 0x460: 0x06, 0x461: 0x06, 0x462: 0x06, 0x463: 0x06, 0x464: 0x06, 0x465: 0x06, 0x466: 0x06, 0x467: 0x06,
+ 0x468: 0x06, 0x469: 0x06, 0x46a: 0x06, 0x46b: 0x06, 0x46c: 0x06, 0x46d: 0x06, 0x46e: 0x06, 0x46f: 0x06,
+ 0x470: 0x06, 0x471: 0x06, 0x472: 0x06, 0x473: 0x06, 0x474: 0x06, 0x475: 0x06, 0x476: 0x06, 0x477: 0x06,
+ 0x478: 0x06, 0x479: 0x06, 0x47a: 0x06, 0x47b: 0x06, 0x47c: 0x06, 0x47d: 0x06, 0x47e: 0x06, 0x47f: 0x06,
+ // Block 0x12, offset 0x480
+ 0x484: 0x08, 0x485: 0x08, 0x486: 0x08, 0x487: 0x09,
+ // Block 0x13, offset 0x4c0
+ 0x4c0: 0x08, 0x4c1: 0x08, 0x4c2: 0x08, 0x4c3: 0x08, 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x08,
+ 0x4c8: 0x08, 0x4c9: 0x08, 0x4ca: 0x08, 0x4cb: 0x08, 0x4cc: 0x08, 0x4cd: 0x08, 0x4ce: 0x08, 0x4cf: 0x08,
+ 0x4d0: 0x08, 0x4d1: 0x08, 0x4d2: 0x08, 0x4d3: 0x08, 0x4d4: 0x08, 0x4d5: 0x08, 0x4d6: 0x08, 0x4d7: 0x08,
+ 0x4d8: 0x08, 0x4d9: 0x08, 0x4da: 0x08, 0x4db: 0x08, 0x4dc: 0x08, 0x4dd: 0x08, 0x4de: 0x08, 0x4df: 0x08,
+ 0x4e0: 0x08, 0x4e1: 0x08, 0x4e2: 0x08, 0x4e3: 0x08, 0x4e4: 0x08, 0x4e5: 0x08, 0x4e6: 0x08, 0x4e7: 0x08,
+ 0x4e8: 0x08, 0x4e9: 0x08, 0x4ea: 0x08, 0x4eb: 0x08, 0x4ec: 0x08, 0x4ed: 0x08, 0x4ee: 0x08, 0x4ef: 0x08,
+ 0x4f0: 0x08, 0x4f1: 0x08, 0x4f2: 0x08, 0x4f3: 0x08, 0x4f4: 0x08, 0x4f5: 0x08, 0x4f6: 0x08, 0x4f7: 0x08,
+ 0x4f8: 0x08, 0x4f9: 0x08, 0x4fa: 0x08, 0x4fb: 0x08, 0x4fc: 0x08, 0x4fd: 0x08, 0x4fe: 0x08, 0x4ff: 0x60,
+ // Block 0x14, offset 0x500
+ 0x520: 0x10,
+ 0x530: 0x09, 0x531: 0x09, 0x532: 0x09, 0x533: 0x09, 0x534: 0x09, 0x535: 0x09, 0x536: 0x09, 0x537: 0x09,
+ 0x538: 0x09, 0x539: 0x09, 0x53a: 0x09, 0x53b: 0x09, 0x53c: 0x09, 0x53d: 0x09, 0x53e: 0x09, 0x53f: 0x11,
+ // Block 0x15, offset 0x540
+ 0x540: 0x09, 0x541: 0x09, 0x542: 0x09, 0x543: 0x09, 0x544: 0x09, 0x545: 0x09, 0x546: 0x09, 0x547: 0x09,
+ 0x548: 0x09, 0x549: 0x09, 0x54a: 0x09, 0x54b: 0x09, 0x54c: 0x09, 0x54d: 0x09, 0x54e: 0x09, 0x54f: 0x11,
+}
+
+// inverseData contains 4-byte entries of the following format:
+// <0 padding>
+// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the
+// UTF-8 encoding of the original rune. Mappings often have the following
+// pattern:
+// A -> A (U+FF21 -> U+0041)
+// B -> B (U+FF22 -> U+0042)
+// ...
+// By xor-ing the last byte the same entry can be shared by many mappings. This
+// reduces the total number of distinct entries by about two thirds.
+// The resulting entry for the aforementioned mappings is
+// { 0x01, 0xE0, 0x00, 0x00 }
+// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get
+// E0 ^ A1 = 41.
+// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get
+// E0 ^ A2 = 42.
+// Note that because of the xor-ing, the byte sequence stored in the entry is
+// not valid UTF-8.
+var inverseData = [150][4]byte{
+ {0x00, 0x00, 0x00, 0x00},
+ {0x03, 0xe3, 0x80, 0xa0},
+ {0x03, 0xef, 0xbc, 0xa0},
+ {0x03, 0xef, 0xbc, 0xe0},
+ {0x03, 0xef, 0xbd, 0xe0},
+ {0x03, 0xef, 0xbf, 0x02},
+ {0x03, 0xef, 0xbf, 0x00},
+ {0x03, 0xef, 0xbf, 0x0e},
+ {0x03, 0xef, 0xbf, 0x0c},
+ {0x03, 0xef, 0xbf, 0x0f},
+ {0x03, 0xef, 0xbf, 0x39},
+ {0x03, 0xef, 0xbf, 0x3b},
+ {0x03, 0xef, 0xbf, 0x3f},
+ {0x03, 0xef, 0xbf, 0x2a},
+ {0x03, 0xef, 0xbf, 0x0d},
+ {0x03, 0xef, 0xbf, 0x25},
+ {0x03, 0xef, 0xbd, 0x1a},
+ {0x03, 0xef, 0xbd, 0x26},
+ {0x01, 0xa0, 0x00, 0x00},
+ {0x03, 0xef, 0xbd, 0x25},
+ {0x03, 0xef, 0xbd, 0x23},
+ {0x03, 0xef, 0xbd, 0x2e},
+ {0x03, 0xef, 0xbe, 0x07},
+ {0x03, 0xef, 0xbe, 0x05},
+ {0x03, 0xef, 0xbd, 0x06},
+ {0x03, 0xef, 0xbd, 0x13},
+ {0x03, 0xef, 0xbd, 0x0b},
+ {0x03, 0xef, 0xbd, 0x16},
+ {0x03, 0xef, 0xbd, 0x0c},
+ {0x03, 0xef, 0xbd, 0x15},
+ {0x03, 0xef, 0xbd, 0x0d},
+ {0x03, 0xef, 0xbd, 0x1c},
+ {0x03, 0xef, 0xbd, 0x02},
+ {0x03, 0xef, 0xbd, 0x1f},
+ {0x03, 0xef, 0xbd, 0x1d},
+ {0x03, 0xef, 0xbd, 0x17},
+ {0x03, 0xef, 0xbd, 0x08},
+ {0x03, 0xef, 0xbd, 0x09},
+ {0x03, 0xef, 0xbd, 0x0e},
+ {0x03, 0xef, 0xbd, 0x04},
+ {0x03, 0xef, 0xbd, 0x05},
+ {0x03, 0xef, 0xbe, 0x3f},
+ {0x03, 0xef, 0xbe, 0x00},
+ {0x03, 0xef, 0xbd, 0x2c},
+ {0x03, 0xef, 0xbe, 0x06},
+ {0x03, 0xef, 0xbe, 0x0c},
+ {0x03, 0xef, 0xbe, 0x0f},
+ {0x03, 0xef, 0xbe, 0x0d},
+ {0x03, 0xef, 0xbe, 0x0b},
+ {0x03, 0xef, 0xbe, 0x19},
+ {0x03, 0xef, 0xbe, 0x15},
+ {0x03, 0xef, 0xbe, 0x11},
+ {0x03, 0xef, 0xbe, 0x31},
+ {0x03, 0xef, 0xbe, 0x33},
+ {0x03, 0xef, 0xbd, 0x0f},
+ {0x03, 0xef, 0xbe, 0x30},
+ {0x03, 0xef, 0xbe, 0x3e},
+ {0x03, 0xef, 0xbe, 0x32},
+ {0x03, 0xef, 0xbe, 0x36},
+ {0x03, 0xef, 0xbd, 0x14},
+ {0x03, 0xef, 0xbe, 0x2e},
+ {0x03, 0xef, 0xbd, 0x1e},
+ {0x03, 0xef, 0xbe, 0x10},
+ {0x03, 0xef, 0xbf, 0x13},
+ {0x03, 0xef, 0xbf, 0x15},
+ {0x03, 0xef, 0xbf, 0x17},
+ {0x03, 0xef, 0xbf, 0x1f},
+ {0x03, 0xef, 0xbf, 0x1d},
+ {0x03, 0xef, 0xbf, 0x1b},
+ {0x03, 0xef, 0xbf, 0x09},
+ {0x03, 0xef, 0xbf, 0x0b},
+ {0x03, 0xef, 0xbf, 0x37},
+ {0x03, 0xef, 0xbe, 0x04},
+ {0x01, 0xe0, 0x00, 0x00},
+ {0x03, 0xe2, 0xa6, 0x1a},
+ {0x03, 0xe2, 0xa6, 0x26},
+ {0x03, 0xe3, 0x80, 0x23},
+ {0x03, 0xe3, 0x80, 0x2e},
+ {0x03, 0xe3, 0x80, 0x25},
+ {0x03, 0xe3, 0x83, 0x1e},
+ {0x03, 0xe3, 0x83, 0x14},
+ {0x03, 0xe3, 0x82, 0x06},
+ {0x03, 0xe3, 0x82, 0x0b},
+ {0x03, 0xe3, 0x82, 0x0c},
+ {0x03, 0xe3, 0x82, 0x0d},
+ {0x03, 0xe3, 0x82, 0x02},
+ {0x03, 0xe3, 0x83, 0x0f},
+ {0x03, 0xe3, 0x83, 0x08},
+ {0x03, 0xe3, 0x83, 0x09},
+ {0x03, 0xe3, 0x83, 0x2c},
+ {0x03, 0xe3, 0x83, 0x0c},
+ {0x03, 0xe3, 0x82, 0x13},
+ {0x03, 0xe3, 0x82, 0x16},
+ {0x03, 0xe3, 0x82, 0x15},
+ {0x03, 0xe3, 0x82, 0x1c},
+ {0x03, 0xe3, 0x82, 0x1f},
+ {0x03, 0xe3, 0x82, 0x1d},
+ {0x03, 0xe3, 0x82, 0x1a},
+ {0x03, 0xe3, 0x82, 0x17},
+ {0x03, 0xe3, 0x82, 0x08},
+ {0x03, 0xe3, 0x82, 0x09},
+ {0x03, 0xe3, 0x82, 0x0e},
+ {0x03, 0xe3, 0x82, 0x04},
+ {0x03, 0xe3, 0x82, 0x05},
+ {0x03, 0xe3, 0x82, 0x3f},
+ {0x03, 0xe3, 0x83, 0x00},
+ {0x03, 0xe3, 0x83, 0x06},
+ {0x03, 0xe3, 0x83, 0x05},
+ {0x03, 0xe3, 0x83, 0x0d},
+ {0x03, 0xe3, 0x83, 0x0b},
+ {0x03, 0xe3, 0x83, 0x07},
+ {0x03, 0xe3, 0x83, 0x19},
+ {0x03, 0xe3, 0x83, 0x15},
+ {0x03, 0xe3, 0x83, 0x11},
+ {0x03, 0xe3, 0x83, 0x31},
+ {0x03, 0xe3, 0x83, 0x33},
+ {0x03, 0xe3, 0x83, 0x30},
+ {0x03, 0xe3, 0x83, 0x3e},
+ {0x03, 0xe3, 0x83, 0x32},
+ {0x03, 0xe3, 0x83, 0x36},
+ {0x03, 0xe3, 0x83, 0x2e},
+ {0x03, 0xe3, 0x82, 0x07},
+ {0x03, 0xe3, 0x85, 0x04},
+ {0x03, 0xe3, 0x84, 0x10},
+ {0x03, 0xe3, 0x85, 0x30},
+ {0x03, 0xe3, 0x85, 0x0d},
+ {0x03, 0xe3, 0x85, 0x13},
+ {0x03, 0xe3, 0x85, 0x15},
+ {0x03, 0xe3, 0x85, 0x17},
+ {0x03, 0xe3, 0x85, 0x1f},
+ {0x03, 0xe3, 0x85, 0x1d},
+ {0x03, 0xe3, 0x85, 0x1b},
+ {0x03, 0xe3, 0x85, 0x09},
+ {0x03, 0xe3, 0x85, 0x0f},
+ {0x03, 0xe3, 0x85, 0x0b},
+ {0x03, 0xe3, 0x85, 0x37},
+ {0x03, 0xe3, 0x85, 0x3b},
+ {0x03, 0xe3, 0x85, 0x39},
+ {0x03, 0xe3, 0x85, 0x3f},
+ {0x02, 0xc2, 0x02, 0x00},
+ {0x02, 0xc2, 0x0e, 0x00},
+ {0x02, 0xc2, 0x0c, 0x00},
+ {0x02, 0xc2, 0x00, 0x00},
+ {0x03, 0xe2, 0x82, 0x0f},
+ {0x03, 0xe2, 0x94, 0x2a},
+ {0x03, 0xe2, 0x86, 0x39},
+ {0x03, 0xe2, 0x86, 0x3b},
+ {0x03, 0xe2, 0x86, 0x3f},
+ {0x03, 0xe2, 0x96, 0x0d},
+ {0x03, 0xe2, 0x97, 0x25},
+}
+
+// Total table size 14680 bytes (14KiB)
diff --git a/vendor/golang.org/x/text/width/transform.go b/vendor/golang.org/x/text/width/transform.go
new file mode 100644
index 00000000000..0049f700a2f
--- /dev/null
+++ b/vendor/golang.org/x/text/width/transform.go
@@ -0,0 +1,239 @@
+// 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.
+
+package width
+
+import (
+ "unicode/utf8"
+
+ "golang.org/x/text/transform"
+)
+
+type foldTransform struct {
+ transform.NopResetter
+}
+
+func (foldTransform) Span(src []byte, atEOF bool) (n int, err error) {
+ for n < len(src) {
+ if src[n] < utf8.RuneSelf {
+ // ASCII fast path.
+ for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ {
+ }
+ continue
+ }
+ v, size := trie.lookup(src[n:])
+ if size == 0 { // incomplete UTF-8 encoding
+ if !atEOF {
+ err = transform.ErrShortSrc
+ } else {
+ n = len(src)
+ }
+ break
+ }
+ if elem(v)&tagNeedsFold != 0 {
+ err = transform.ErrEndOfSpan
+ break
+ }
+ n += size
+ }
+ return n, err
+}
+
+func (foldTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ for nSrc < len(src) {
+ if src[nSrc] < utf8.RuneSelf {
+ // ASCII fast path.
+ start, end := nSrc, len(src)
+ if d := len(dst) - nDst; d < end-start {
+ end = nSrc + d
+ }
+ for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ {
+ }
+ n := copy(dst[nDst:], src[start:nSrc])
+ if nDst += n; nDst == len(dst) {
+ nSrc = start + n
+ if nSrc == len(src) {
+ return nDst, nSrc, nil
+ }
+ if src[nSrc] < utf8.RuneSelf {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ }
+ continue
+ }
+ v, size := trie.lookup(src[nSrc:])
+ if size == 0 { // incomplete UTF-8 encoding
+ if !atEOF {
+ return nDst, nSrc, transform.ErrShortSrc
+ }
+ size = 1 // gobble 1 byte
+ }
+ if elem(v)&tagNeedsFold == 0 {
+ if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ nDst += size
+ } else {
+ data := inverseData[byte(v)]
+ if len(dst)-nDst < int(data[0]) {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ i := 1
+ for end := int(data[0]); i < end; i++ {
+ dst[nDst] = data[i]
+ nDst++
+ }
+ dst[nDst] = data[i] ^ src[nSrc+size-1]
+ nDst++
+ }
+ nSrc += size
+ }
+ return nDst, nSrc, nil
+}
+
+type narrowTransform struct {
+ transform.NopResetter
+}
+
+func (narrowTransform) Span(src []byte, atEOF bool) (n int, err error) {
+ for n < len(src) {
+ if src[n] < utf8.RuneSelf {
+ // ASCII fast path.
+ for n++; n < len(src) && src[n] < utf8.RuneSelf; n++ {
+ }
+ continue
+ }
+ v, size := trie.lookup(src[n:])
+ if size == 0 { // incomplete UTF-8 encoding
+ if !atEOF {
+ err = transform.ErrShortSrc
+ } else {
+ n = len(src)
+ }
+ break
+ }
+ if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous {
+ } else {
+ err = transform.ErrEndOfSpan
+ break
+ }
+ n += size
+ }
+ return n, err
+}
+
+func (narrowTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ for nSrc < len(src) {
+ if src[nSrc] < utf8.RuneSelf {
+ // ASCII fast path.
+ start, end := nSrc, len(src)
+ if d := len(dst) - nDst; d < end-start {
+ end = nSrc + d
+ }
+ for nSrc++; nSrc < end && src[nSrc] < utf8.RuneSelf; nSrc++ {
+ }
+ n := copy(dst[nDst:], src[start:nSrc])
+ if nDst += n; nDst == len(dst) {
+ nSrc = start + n
+ if nSrc == len(src) {
+ return nDst, nSrc, nil
+ }
+ if src[nSrc] < utf8.RuneSelf {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ }
+ continue
+ }
+ v, size := trie.lookup(src[nSrc:])
+ if size == 0 { // incomplete UTF-8 encoding
+ if !atEOF {
+ return nDst, nSrc, transform.ErrShortSrc
+ }
+ size = 1 // gobble 1 byte
+ }
+ if k := elem(v).kind(); byte(v) == 0 || k != EastAsianFullwidth && k != EastAsianWide && k != EastAsianAmbiguous {
+ if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ nDst += size
+ } else {
+ data := inverseData[byte(v)]
+ if len(dst)-nDst < int(data[0]) {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ i := 1
+ for end := int(data[0]); i < end; i++ {
+ dst[nDst] = data[i]
+ nDst++
+ }
+ dst[nDst] = data[i] ^ src[nSrc+size-1]
+ nDst++
+ }
+ nSrc += size
+ }
+ return nDst, nSrc, nil
+}
+
+type wideTransform struct {
+ transform.NopResetter
+}
+
+func (wideTransform) Span(src []byte, atEOF bool) (n int, err error) {
+ for n < len(src) {
+ // TODO: Consider ASCII fast path. Special-casing ASCII handling can
+ // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably
+ // not enough to warrant the extra code and complexity.
+ v, size := trie.lookup(src[n:])
+ if size == 0 { // incomplete UTF-8 encoding
+ if !atEOF {
+ err = transform.ErrShortSrc
+ } else {
+ n = len(src)
+ }
+ break
+ }
+ if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow {
+ } else {
+ err = transform.ErrEndOfSpan
+ break
+ }
+ n += size
+ }
+ return n, err
+}
+
+func (wideTransform) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ for nSrc < len(src) {
+ // TODO: Consider ASCII fast path. Special-casing ASCII handling can
+ // reduce the ns/op of BenchmarkWideASCII by about 30%. This is probably
+ // not enough to warrant the extra code and complexity.
+ v, size := trie.lookup(src[nSrc:])
+ if size == 0 { // incomplete UTF-8 encoding
+ if !atEOF {
+ return nDst, nSrc, transform.ErrShortSrc
+ }
+ size = 1 // gobble 1 byte
+ }
+ if k := elem(v).kind(); byte(v) == 0 || k != EastAsianHalfwidth && k != EastAsianNarrow {
+ if size != copy(dst[nDst:], src[nSrc:nSrc+size]) {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ nDst += size
+ } else {
+ data := inverseData[byte(v)]
+ if len(dst)-nDst < int(data[0]) {
+ return nDst, nSrc, transform.ErrShortDst
+ }
+ i := 1
+ for end := int(data[0]); i < end; i++ {
+ dst[nDst] = data[i]
+ nDst++
+ }
+ dst[nDst] = data[i] ^ src[nSrc+size-1]
+ nDst++
+ }
+ nSrc += size
+ }
+ return nDst, nSrc, nil
+}
diff --git a/vendor/golang.org/x/text/width/trieval.go b/vendor/golang.org/x/text/width/trieval.go
new file mode 100644
index 00000000000..ca8e45fd19e
--- /dev/null
+++ b/vendor/golang.org/x/text/width/trieval.go
@@ -0,0 +1,30 @@
+// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT.
+
+package width
+
+// elem is an entry of the width trie. The high byte is used to encode the type
+// of the rune. The low byte is used to store the index to a mapping entry in
+// the inverseData array.
+type elem uint16
+
+const (
+ tagNeutral elem = iota << typeShift
+ tagAmbiguous
+ tagWide
+ tagNarrow
+ tagFullwidth
+ tagHalfwidth
+)
+
+const (
+ numTypeBits = 3
+ typeShift = 16 - numTypeBits
+
+ // tagNeedsFold is true for all fullwidth and halfwidth runes except for
+ // the Won sign U+20A9.
+ tagNeedsFold = 0x1000
+
+ // The Korean Won sign is halfwidth, but SHOULD NOT be mapped to a wide
+ // variant.
+ wonSign rune = 0x20A9
+)
diff --git a/vendor/golang.org/x/text/width/width.go b/vendor/golang.org/x/text/width/width.go
new file mode 100644
index 00000000000..f1639ca68af
--- /dev/null
+++ b/vendor/golang.org/x/text/width/width.go
@@ -0,0 +1,206 @@
+// 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.
+
+//go:generate stringer -type=Kind
+//go:generate go run gen.go gen_common.go gen_trieval.go
+
+// Package width provides functionality for handling different widths in text.
+//
+// Wide characters behave like ideographs; they tend to allow line breaks after
+// each character and remain upright in vertical text layout. Narrow characters
+// are kept together in words or runs that are rotated sideways in vertical text
+// layout.
+//
+// For more information, see http://unicode.org/reports/tr11/.
+package width // import "golang.org/x/text/width"
+
+import (
+ "unicode/utf8"
+
+ "golang.org/x/text/transform"
+)
+
+// TODO
+// 1) Reduce table size by compressing blocks.
+// 2) API proposition for computing display length
+// (approximation, fixed pitch only).
+// 3) Implement display length.
+
+// Kind indicates the type of width property as defined in http://unicode.org/reports/tr11/.
+type Kind int
+
+const (
+ // Neutral characters do not occur in legacy East Asian character sets.
+ Neutral Kind = iota
+
+ // EastAsianAmbiguous characters that can be sometimes wide and sometimes
+ // narrow and require additional information not contained in the character
+ // code to further resolve their width.
+ EastAsianAmbiguous
+
+ // EastAsianWide characters are wide in its usual form. They occur only in
+ // the context of East Asian typography. These runes may have explicit
+ // halfwidth counterparts.
+ EastAsianWide
+
+ // EastAsianNarrow characters are narrow in its usual form. They often have
+ // fullwidth counterparts.
+ EastAsianNarrow
+
+ // Note: there exist Narrow runes that do not have fullwidth or wide
+ // counterparts, despite what the definition says (e.g. U+27E6).
+
+ // EastAsianFullwidth characters have a compatibility decompositions of type
+ // wide that map to a narrow counterpart.
+ EastAsianFullwidth
+
+ // EastAsianHalfwidth characters have a compatibility decomposition of type
+ // narrow that map to a wide or ambiguous counterpart, plus U+20A9 ₩ WON
+ // SIGN.
+ EastAsianHalfwidth
+
+ // Note: there exist runes that have a halfwidth counterparts but that are
+ // classified as Ambiguous, rather than wide (e.g. U+2190).
+)
+
+// TODO: the generated tries need to return size 1 for invalid runes for the
+// width to be computed correctly (each byte should render width 1)
+
+var trie = newWidthTrie(0)
+
+// Lookup reports the Properties of the first rune in b and the number of bytes
+// of its UTF-8 encoding.
+func Lookup(b []byte) (p Properties, size int) {
+ v, sz := trie.lookup(b)
+ return Properties{elem(v), b[sz-1]}, sz
+}
+
+// LookupString reports the Properties of the first rune in s and the number of
+// bytes of its UTF-8 encoding.
+func LookupString(s string) (p Properties, size int) {
+ v, sz := trie.lookupString(s)
+ return Properties{elem(v), s[sz-1]}, sz
+}
+
+// LookupRune reports the Properties of rune r.
+func LookupRune(r rune) Properties {
+ var buf [4]byte
+ n := utf8.EncodeRune(buf[:], r)
+ v, _ := trie.lookup(buf[:n])
+ last := byte(r)
+ if r >= utf8.RuneSelf {
+ last = 0x80 + byte(r&0x3f)
+ }
+ return Properties{elem(v), last}
+}
+
+// Properties provides access to width properties of a rune.
+type Properties struct {
+ elem elem
+ last byte
+}
+
+func (e elem) kind() Kind {
+ return Kind(e >> typeShift)
+}
+
+// Kind returns the Kind of a rune as defined in Unicode TR #11.
+// See http://unicode.org/reports/tr11/ for more details.
+func (p Properties) Kind() Kind {
+ return p.elem.kind()
+}
+
+// Folded returns the folded variant of a rune or 0 if the rune is canonical.
+func (p Properties) Folded() rune {
+ if p.elem&tagNeedsFold != 0 {
+ buf := inverseData[byte(p.elem)]
+ buf[buf[0]] ^= p.last
+ r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]])
+ return r
+ }
+ return 0
+}
+
+// Narrow returns the narrow variant of a rune or 0 if the rune is already
+// narrow or doesn't have a narrow variant.
+func (p Properties) Narrow() rune {
+ if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianFullwidth || k == EastAsianWide || k == EastAsianAmbiguous) {
+ buf := inverseData[byte(p.elem)]
+ buf[buf[0]] ^= p.last
+ r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]])
+ return r
+ }
+ return 0
+}
+
+// Wide returns the wide variant of a rune or 0 if the rune is already
+// wide or doesn't have a wide variant.
+func (p Properties) Wide() rune {
+ if k := p.elem.kind(); byte(p.elem) != 0 && (k == EastAsianHalfwidth || k == EastAsianNarrow) {
+ buf := inverseData[byte(p.elem)]
+ buf[buf[0]] ^= p.last
+ r, _ := utf8.DecodeRune(buf[1 : 1+buf[0]])
+ return r
+ }
+ return 0
+}
+
+// TODO for Properties:
+// - Add Fullwidth/Halfwidth or Inverted methods for computing variants
+// mapping.
+// - Add width information (including information on non-spacing runes).
+
+// Transformer implements the transform.Transformer interface.
+type Transformer struct {
+ t transform.SpanningTransformer
+}
+
+// Reset implements the transform.Transformer interface.
+func (t Transformer) Reset() { t.t.Reset() }
+
+// Transform implements the transform.Transformer interface.
+func (t Transformer) Transform(dst, src []byte, atEOF bool) (nDst, nSrc int, err error) {
+ return t.t.Transform(dst, src, atEOF)
+}
+
+// Span implements the transform.SpanningTransformer interface.
+func (t Transformer) Span(src []byte, atEOF bool) (n int, err error) {
+ return t.t.Span(src, atEOF)
+}
+
+// Bytes returns a new byte slice with the result of applying t to b.
+func (t Transformer) Bytes(b []byte) []byte {
+ b, _, _ = transform.Bytes(t, b)
+ return b
+}
+
+// String returns a string with the result of applying t to s.
+func (t Transformer) String(s string) string {
+ s, _, _ = transform.String(t, s)
+ return s
+}
+
+var (
+ // Fold is a transform that maps all runes to their canonical width.
+ //
+ // Note that the NFKC and NFKD transforms in golang.org/x/text/unicode/norm
+ // provide a more generic folding mechanism.
+ Fold Transformer = Transformer{foldTransform{}}
+
+ // Widen is a transform that maps runes to their wide variant, if
+ // available.
+ Widen Transformer = Transformer{wideTransform{}}
+
+ // Narrow is a transform that maps runes to their narrow variant, if
+ // available.
+ Narrow Transformer = Transformer{narrowTransform{}}
+)
+
+// TODO: Consider the following options:
+// - Treat Ambiguous runes that have a halfwidth counterpart as wide, or some
+// generalized variant of this.
+// - Consider a wide Won character to be the default width (or some generalized
+// variant of this).
+// - Filter the set of characters that gets converted (the preferred approach is
+// to allow applying filters to transforms).
diff --git a/vendor/golang.org/x/tools/AUTHORS b/vendor/golang.org/x/tools/AUTHORS
new file mode 100644
index 00000000000..15167cd746c
--- /dev/null
+++ b/vendor/golang.org/x/tools/AUTHORS
@@ -0,0 +1,3 @@
+# This source code refers to The Go Authors for copyright purposes.
+# The master list of authors is in the main Go distribution,
+# visible at http://tip.golang.org/AUTHORS.
diff --git a/vendor/golang.org/x/tools/CONTRIBUTORS b/vendor/golang.org/x/tools/CONTRIBUTORS
new file mode 100644
index 00000000000..1c4577e9680
--- /dev/null
+++ b/vendor/golang.org/x/tools/CONTRIBUTORS
@@ -0,0 +1,3 @@
+# This source code was written by the Go contributors.
+# The master list of contributors is in the main Go distribution,
+# visible at http://tip.golang.org/CONTRIBUTORS.
diff --git a/vendor/golang.org/x/tools/LICENSE b/vendor/golang.org/x/tools/LICENSE
new file mode 100644
index 00000000000..6a66aea5eaf
--- /dev/null
+++ b/vendor/golang.org/x/tools/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/golang.org/x/tools/PATENTS b/vendor/golang.org/x/tools/PATENTS
new file mode 100644
index 00000000000..733099041f8
--- /dev/null
+++ b/vendor/golang.org/x/tools/PATENTS
@@ -0,0 +1,22 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Go project.
+
+Google 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,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Go, where such license applies only to those patent
+claims, both currently owned or controlled by Google and acquired in
+the future, licensable by Google that are necessarily infringed by this
+implementation of Go. This grant does not include claims that would be
+infringed only as a consequence of further modification of this
+implementation. If you or your agent or exclusive licensee institute or
+order or agree to the institution of patent litigation against any
+entity (including a cross-claim or counterclaim in a lawsuit) alleging
+that this implementation of Go or any code incorporated within this
+implementation of Go constitutes direct or contributory patent
+infringement, or inducement of patent infringement, then any patent
+rights granted to you under this License for this implementation of Go
+shall terminate as of the date such litigation is filed.
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go
new file mode 100644
index 00000000000..6b7052b892c
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ast/astutil/enclosing.go
@@ -0,0 +1,627 @@
+// 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 astutil
+
+// This file defines utilities for working with source positions.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "sort"
+)
+
+// PathEnclosingInterval returns the node that encloses the source
+// interval [start, end), and all its ancestors up to the AST root.
+//
+// The definition of "enclosing" used by this function considers
+// additional whitespace abutting a node to be enclosed by it.
+// In this example:
+//
+// z := x + y // add them
+// <-A->
+// <----B----->
+//
+// the ast.BinaryExpr(+) node is considered to enclose interval B
+// even though its [Pos()..End()) is actually only interval A.
+// This behaviour makes user interfaces more tolerant of imperfect
+// input.
+//
+// This function treats tokens as nodes, though they are not included
+// in the result. e.g. PathEnclosingInterval("+") returns the
+// enclosing ast.BinaryExpr("x + y").
+//
+// If start==end, the 1-char interval following start is used instead.
+//
+// The 'exact' result is true if the interval contains only path[0]
+// and perhaps some adjacent whitespace. It is false if the interval
+// overlaps multiple children of path[0], or if it contains only
+// interior whitespace of path[0].
+// In this example:
+//
+// z := x + y // add them
+// <--C--> <---E-->
+// ^
+// D
+//
+// intervals C, D and E are inexact. C is contained by the
+// z-assignment statement, because it spans three of its children (:=,
+// x, +). So too is the 1-char interval D, because it contains only
+// interior whitespace of the assignment. E is considered interior
+// whitespace of the BlockStmt containing the assignment.
+//
+// Precondition: [start, end) both lie within the same file as root.
+// TODO(adonovan): return (nil, false) in this case and remove precond.
+// Requires FileSet; see loader.tokenFileContainsPos.
+//
+// Postcondition: path is never nil; it always contains at least 'root'.
+//
+func PathEnclosingInterval(root *ast.File, start, end token.Pos) (path []ast.Node, exact bool) {
+ // fmt.Printf("EnclosingInterval %d %d\n", start, end) // debugging
+
+ // Precondition: node.[Pos..End) and adjoining whitespace contain [start, end).
+ var visit func(node ast.Node) bool
+ visit = func(node ast.Node) bool {
+ path = append(path, node)
+
+ nodePos := node.Pos()
+ nodeEnd := node.End()
+
+ // fmt.Printf("visit(%T, %d, %d)\n", node, nodePos, nodeEnd) // debugging
+
+ // Intersect [start, end) with interval of node.
+ if start < nodePos {
+ start = nodePos
+ }
+ if end > nodeEnd {
+ end = nodeEnd
+ }
+
+ // Find sole child that contains [start, end).
+ children := childrenOf(node)
+ l := len(children)
+ for i, child := range children {
+ // [childPos, childEnd) is unaugmented interval of child.
+ childPos := child.Pos()
+ childEnd := child.End()
+
+ // [augPos, augEnd) is whitespace-augmented interval of child.
+ augPos := childPos
+ augEnd := childEnd
+ if i > 0 {
+ augPos = children[i-1].End() // start of preceding whitespace
+ }
+ if i < l-1 {
+ nextChildPos := children[i+1].Pos()
+ // Does [start, end) lie between child and next child?
+ if start >= augEnd && end <= nextChildPos {
+ return false // inexact match
+ }
+ augEnd = nextChildPos // end of following whitespace
+ }
+
+ // fmt.Printf("\tchild %d: [%d..%d)\tcontains interval [%d..%d)?\n",
+ // i, augPos, augEnd, start, end) // debugging
+
+ // Does augmented child strictly contain [start, end)?
+ if augPos <= start && end <= augEnd {
+ _, isToken := child.(tokenNode)
+ return isToken || visit(child)
+ }
+
+ // Does [start, end) overlap multiple children?
+ // i.e. left-augmented child contains start
+ // but LR-augmented child does not contain end.
+ if start < childEnd && end > augEnd {
+ break
+ }
+ }
+
+ // No single child contained [start, end),
+ // so node is the result. Is it exact?
+
+ // (It's tempting to put this condition before the
+ // child loop, but it gives the wrong result in the
+ // case where a node (e.g. ExprStmt) and its sole
+ // child have equal intervals.)
+ if start == nodePos && end == nodeEnd {
+ return true // exact match
+ }
+
+ return false // inexact: overlaps multiple children
+ }
+
+ if start > end {
+ start, end = end, start
+ }
+
+ if start < root.End() && end > root.Pos() {
+ if start == end {
+ end = start + 1 // empty interval => interval of size 1
+ }
+ exact = visit(root)
+
+ // Reverse the path:
+ for i, l := 0, len(path); i < l/2; i++ {
+ path[i], path[l-1-i] = path[l-1-i], path[i]
+ }
+ } else {
+ // Selection lies within whitespace preceding the
+ // first (or following the last) declaration in the file.
+ // The result nonetheless always includes the ast.File.
+ path = append(path, root)
+ }
+
+ return
+}
+
+// tokenNode is a dummy implementation of ast.Node for a single token.
+// They are used transiently by PathEnclosingInterval but never escape
+// this package.
+//
+type tokenNode struct {
+ pos token.Pos
+ end token.Pos
+}
+
+func (n tokenNode) Pos() token.Pos {
+ return n.pos
+}
+
+func (n tokenNode) End() token.Pos {
+ return n.end
+}
+
+func tok(pos token.Pos, len int) ast.Node {
+ return tokenNode{pos, pos + token.Pos(len)}
+}
+
+// childrenOf returns the direct non-nil children of ast.Node n.
+// It may include fake ast.Node implementations for bare tokens.
+// it is not safe to call (e.g.) ast.Walk on such nodes.
+//
+func childrenOf(n ast.Node) []ast.Node {
+ var children []ast.Node
+
+ // First add nodes for all true subtrees.
+ ast.Inspect(n, func(node ast.Node) bool {
+ if node == n { // push n
+ return true // recur
+ }
+ if node != nil { // push child
+ children = append(children, node)
+ }
+ return false // no recursion
+ })
+
+ // Then add fake Nodes for bare tokens.
+ switch n := n.(type) {
+ case *ast.ArrayType:
+ children = append(children,
+ tok(n.Lbrack, len("[")),
+ tok(n.Elt.End(), len("]")))
+
+ case *ast.AssignStmt:
+ children = append(children,
+ tok(n.TokPos, len(n.Tok.String())))
+
+ case *ast.BasicLit:
+ children = append(children,
+ tok(n.ValuePos, len(n.Value)))
+
+ case *ast.BinaryExpr:
+ children = append(children, tok(n.OpPos, len(n.Op.String())))
+
+ case *ast.BlockStmt:
+ children = append(children,
+ tok(n.Lbrace, len("{")),
+ tok(n.Rbrace, len("}")))
+
+ case *ast.BranchStmt:
+ children = append(children,
+ tok(n.TokPos, len(n.Tok.String())))
+
+ case *ast.CallExpr:
+ children = append(children,
+ tok(n.Lparen, len("(")),
+ tok(n.Rparen, len(")")))
+ if n.Ellipsis != 0 {
+ children = append(children, tok(n.Ellipsis, len("...")))
+ }
+
+ case *ast.CaseClause:
+ if n.List == nil {
+ children = append(children,
+ tok(n.Case, len("default")))
+ } else {
+ children = append(children,
+ tok(n.Case, len("case")))
+ }
+ children = append(children, tok(n.Colon, len(":")))
+
+ case *ast.ChanType:
+ switch n.Dir {
+ case ast.RECV:
+ children = append(children, tok(n.Begin, len("<-chan")))
+ case ast.SEND:
+ children = append(children, tok(n.Begin, len("chan<-")))
+ case ast.RECV | ast.SEND:
+ children = append(children, tok(n.Begin, len("chan")))
+ }
+
+ case *ast.CommClause:
+ if n.Comm == nil {
+ children = append(children,
+ tok(n.Case, len("default")))
+ } else {
+ children = append(children,
+ tok(n.Case, len("case")))
+ }
+ children = append(children, tok(n.Colon, len(":")))
+
+ case *ast.Comment:
+ // nop
+
+ case *ast.CommentGroup:
+ // nop
+
+ case *ast.CompositeLit:
+ children = append(children,
+ tok(n.Lbrace, len("{")),
+ tok(n.Rbrace, len("{")))
+
+ case *ast.DeclStmt:
+ // nop
+
+ case *ast.DeferStmt:
+ children = append(children,
+ tok(n.Defer, len("defer")))
+
+ case *ast.Ellipsis:
+ children = append(children,
+ tok(n.Ellipsis, len("...")))
+
+ case *ast.EmptyStmt:
+ // nop
+
+ case *ast.ExprStmt:
+ // nop
+
+ case *ast.Field:
+ // TODO(adonovan): Field.{Doc,Comment,Tag}?
+
+ case *ast.FieldList:
+ children = append(children,
+ tok(n.Opening, len("(")),
+ tok(n.Closing, len(")")))
+
+ case *ast.File:
+ // TODO test: Doc
+ children = append(children,
+ tok(n.Package, len("package")))
+
+ case *ast.ForStmt:
+ children = append(children,
+ tok(n.For, len("for")))
+
+ case *ast.FuncDecl:
+ // TODO(adonovan): FuncDecl.Comment?
+
+ // Uniquely, FuncDecl breaks the invariant that
+ // preorder traversal yields tokens in lexical order:
+ // in fact, FuncDecl.Recv precedes FuncDecl.Type.Func.
+ //
+ // As a workaround, we inline the case for FuncType
+ // here and order things correctly.
+ //
+ children = nil // discard ast.Walk(FuncDecl) info subtrees
+ children = append(children, tok(n.Type.Func, len("func")))
+ if n.Recv != nil {
+ children = append(children, n.Recv)
+ }
+ children = append(children, n.Name)
+ if n.Type.Params != nil {
+ children = append(children, n.Type.Params)
+ }
+ if n.Type.Results != nil {
+ children = append(children, n.Type.Results)
+ }
+ if n.Body != nil {
+ children = append(children, n.Body)
+ }
+
+ case *ast.FuncLit:
+ // nop
+
+ case *ast.FuncType:
+ if n.Func != 0 {
+ children = append(children,
+ tok(n.Func, len("func")))
+ }
+
+ case *ast.GenDecl:
+ children = append(children,
+ tok(n.TokPos, len(n.Tok.String())))
+ if n.Lparen != 0 {
+ children = append(children,
+ tok(n.Lparen, len("(")),
+ tok(n.Rparen, len(")")))
+ }
+
+ case *ast.GoStmt:
+ children = append(children,
+ tok(n.Go, len("go")))
+
+ case *ast.Ident:
+ children = append(children,
+ tok(n.NamePos, len(n.Name)))
+
+ case *ast.IfStmt:
+ children = append(children,
+ tok(n.If, len("if")))
+
+ case *ast.ImportSpec:
+ // TODO(adonovan): ImportSpec.{Doc,EndPos}?
+
+ case *ast.IncDecStmt:
+ children = append(children,
+ tok(n.TokPos, len(n.Tok.String())))
+
+ case *ast.IndexExpr:
+ children = append(children,
+ tok(n.Lbrack, len("{")),
+ tok(n.Rbrack, len("}")))
+
+ case *ast.InterfaceType:
+ children = append(children,
+ tok(n.Interface, len("interface")))
+
+ case *ast.KeyValueExpr:
+ children = append(children,
+ tok(n.Colon, len(":")))
+
+ case *ast.LabeledStmt:
+ children = append(children,
+ tok(n.Colon, len(":")))
+
+ case *ast.MapType:
+ children = append(children,
+ tok(n.Map, len("map")))
+
+ case *ast.ParenExpr:
+ children = append(children,
+ tok(n.Lparen, len("(")),
+ tok(n.Rparen, len(")")))
+
+ case *ast.RangeStmt:
+ children = append(children,
+ tok(n.For, len("for")),
+ tok(n.TokPos, len(n.Tok.String())))
+
+ case *ast.ReturnStmt:
+ children = append(children,
+ tok(n.Return, len("return")))
+
+ case *ast.SelectStmt:
+ children = append(children,
+ tok(n.Select, len("select")))
+
+ case *ast.SelectorExpr:
+ // nop
+
+ case *ast.SendStmt:
+ children = append(children,
+ tok(n.Arrow, len("<-")))
+
+ case *ast.SliceExpr:
+ children = append(children,
+ tok(n.Lbrack, len("[")),
+ tok(n.Rbrack, len("]")))
+
+ case *ast.StarExpr:
+ children = append(children, tok(n.Star, len("*")))
+
+ case *ast.StructType:
+ children = append(children, tok(n.Struct, len("struct")))
+
+ case *ast.SwitchStmt:
+ children = append(children, tok(n.Switch, len("switch")))
+
+ case *ast.TypeAssertExpr:
+ children = append(children,
+ tok(n.Lparen-1, len(".")),
+ tok(n.Lparen, len("(")),
+ tok(n.Rparen, len(")")))
+
+ case *ast.TypeSpec:
+ // TODO(adonovan): TypeSpec.{Doc,Comment}?
+
+ case *ast.TypeSwitchStmt:
+ children = append(children, tok(n.Switch, len("switch")))
+
+ case *ast.UnaryExpr:
+ children = append(children, tok(n.OpPos, len(n.Op.String())))
+
+ case *ast.ValueSpec:
+ // TODO(adonovan): ValueSpec.{Doc,Comment}?
+
+ case *ast.BadDecl, *ast.BadExpr, *ast.BadStmt:
+ // nop
+ }
+
+ // TODO(adonovan): opt: merge the logic of ast.Inspect() into
+ // the switch above so we can make interleaved callbacks for
+ // both Nodes and Tokens in the right order and avoid the need
+ // to sort.
+ sort.Sort(byPos(children))
+
+ return children
+}
+
+type byPos []ast.Node
+
+func (sl byPos) Len() int {
+ return len(sl)
+}
+func (sl byPos) Less(i, j int) bool {
+ return sl[i].Pos() < sl[j].Pos()
+}
+func (sl byPos) Swap(i, j int) {
+ sl[i], sl[j] = sl[j], sl[i]
+}
+
+// NodeDescription returns a description of the concrete type of n suitable
+// for a user interface.
+//
+// TODO(adonovan): in some cases (e.g. Field, FieldList, Ident,
+// StarExpr) we could be much more specific given the path to the AST
+// root. Perhaps we should do that.
+//
+func NodeDescription(n ast.Node) string {
+ switch n := n.(type) {
+ case *ast.ArrayType:
+ return "array type"
+ case *ast.AssignStmt:
+ return "assignment"
+ case *ast.BadDecl:
+ return "bad declaration"
+ case *ast.BadExpr:
+ return "bad expression"
+ case *ast.BadStmt:
+ return "bad statement"
+ case *ast.BasicLit:
+ return "basic literal"
+ case *ast.BinaryExpr:
+ return fmt.Sprintf("binary %s operation", n.Op)
+ case *ast.BlockStmt:
+ return "block"
+ case *ast.BranchStmt:
+ switch n.Tok {
+ case token.BREAK:
+ return "break statement"
+ case token.CONTINUE:
+ return "continue statement"
+ case token.GOTO:
+ return "goto statement"
+ case token.FALLTHROUGH:
+ return "fall-through statement"
+ }
+ case *ast.CallExpr:
+ if len(n.Args) == 1 && !n.Ellipsis.IsValid() {
+ return "function call (or conversion)"
+ }
+ return "function call"
+ case *ast.CaseClause:
+ return "case clause"
+ case *ast.ChanType:
+ return "channel type"
+ case *ast.CommClause:
+ return "communication clause"
+ case *ast.Comment:
+ return "comment"
+ case *ast.CommentGroup:
+ return "comment group"
+ case *ast.CompositeLit:
+ return "composite literal"
+ case *ast.DeclStmt:
+ return NodeDescription(n.Decl) + " statement"
+ case *ast.DeferStmt:
+ return "defer statement"
+ case *ast.Ellipsis:
+ return "ellipsis"
+ case *ast.EmptyStmt:
+ return "empty statement"
+ case *ast.ExprStmt:
+ return "expression statement"
+ case *ast.Field:
+ // Can be any of these:
+ // struct {x, y int} -- struct field(s)
+ // struct {T} -- anon struct field
+ // interface {I} -- interface embedding
+ // interface {f()} -- interface method
+ // func (A) func(B) C -- receiver, param(s), result(s)
+ return "field/method/parameter"
+ case *ast.FieldList:
+ return "field/method/parameter list"
+ case *ast.File:
+ return "source file"
+ case *ast.ForStmt:
+ return "for loop"
+ case *ast.FuncDecl:
+ return "function declaration"
+ case *ast.FuncLit:
+ return "function literal"
+ case *ast.FuncType:
+ return "function type"
+ case *ast.GenDecl:
+ switch n.Tok {
+ case token.IMPORT:
+ return "import declaration"
+ case token.CONST:
+ return "constant declaration"
+ case token.TYPE:
+ return "type declaration"
+ case token.VAR:
+ return "variable declaration"
+ }
+ case *ast.GoStmt:
+ return "go statement"
+ case *ast.Ident:
+ return "identifier"
+ case *ast.IfStmt:
+ return "if statement"
+ case *ast.ImportSpec:
+ return "import specification"
+ case *ast.IncDecStmt:
+ if n.Tok == token.INC {
+ return "increment statement"
+ }
+ return "decrement statement"
+ case *ast.IndexExpr:
+ return "index expression"
+ case *ast.InterfaceType:
+ return "interface type"
+ case *ast.KeyValueExpr:
+ return "key/value association"
+ case *ast.LabeledStmt:
+ return "statement label"
+ case *ast.MapType:
+ return "map type"
+ case *ast.Package:
+ return "package"
+ case *ast.ParenExpr:
+ return "parenthesized " + NodeDescription(n.X)
+ case *ast.RangeStmt:
+ return "range loop"
+ case *ast.ReturnStmt:
+ return "return statement"
+ case *ast.SelectStmt:
+ return "select statement"
+ case *ast.SelectorExpr:
+ return "selector"
+ case *ast.SendStmt:
+ return "channel send"
+ case *ast.SliceExpr:
+ return "slice expression"
+ case *ast.StarExpr:
+ return "*-operation" // load/store expr or pointer type
+ case *ast.StructType:
+ return "struct type"
+ case *ast.SwitchStmt:
+ return "switch statement"
+ case *ast.TypeAssertExpr:
+ return "type assertion"
+ case *ast.TypeSpec:
+ return "type specification"
+ case *ast.TypeSwitchStmt:
+ return "type switch"
+ case *ast.UnaryExpr:
+ return fmt.Sprintf("unary %s operation", n.Op)
+ case *ast.ValueSpec:
+ return "value specification"
+
+ }
+ panic(fmt.Sprintf("unexpected node type: %T", n))
+}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/imports.go b/vendor/golang.org/x/tools/go/ast/astutil/imports.go
new file mode 100644
index 00000000000..3e4b195368b
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ast/astutil/imports.go
@@ -0,0 +1,481 @@
+// 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 astutil contains common utilities for working with the Go AST.
+package astutil // import "golang.org/x/tools/go/ast/astutil"
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "strconv"
+ "strings"
+)
+
+// AddImport adds the import path to the file f, if absent.
+func AddImport(fset *token.FileSet, f *ast.File, path string) (added bool) {
+ return AddNamedImport(fset, f, "", path)
+}
+
+// AddNamedImport adds the import with the given name and path to the file f, if absent.
+// If name is not empty, it is used to rename the import.
+//
+// For example, calling
+// AddNamedImport(fset, f, "pathpkg", "path")
+// adds
+// import pathpkg "path"
+func AddNamedImport(fset *token.FileSet, f *ast.File, name, path string) (added bool) {
+ if imports(f, name, path) {
+ return false
+ }
+
+ newImport := &ast.ImportSpec{
+ Path: &ast.BasicLit{
+ Kind: token.STRING,
+ Value: strconv.Quote(path),
+ },
+ }
+ if name != "" {
+ newImport.Name = &ast.Ident{Name: name}
+ }
+
+ // Find an import decl to add to.
+ // The goal is to find an existing import
+ // whose import path has the longest shared
+ // prefix with path.
+ var (
+ bestMatch = -1 // length of longest shared prefix
+ lastImport = -1 // index in f.Decls of the file's final import decl
+ impDecl *ast.GenDecl // import decl containing the best match
+ impIndex = -1 // spec index in impDecl containing the best match
+
+ isThirdPartyPath = isThirdParty(path)
+ )
+ for i, decl := range f.Decls {
+ gen, ok := decl.(*ast.GenDecl)
+ if ok && gen.Tok == token.IMPORT {
+ lastImport = i
+ // Do not add to import "C", to avoid disrupting the
+ // association with its doc comment, breaking cgo.
+ if declImports(gen, "C") {
+ continue
+ }
+
+ // Match an empty import decl if that's all that is available.
+ if len(gen.Specs) == 0 && bestMatch == -1 {
+ impDecl = gen
+ }
+
+ // Compute longest shared prefix with imports in this group and find best
+ // matched import spec.
+ // 1. Always prefer import spec with longest shared prefix.
+ // 2. While match length is 0,
+ // - for stdlib package: prefer first import spec.
+ // - for third party package: prefer first third party import spec.
+ // We cannot use last import spec as best match for third party package
+ // because grouped imports are usually placed last by goimports -local
+ // flag.
+ // See issue #19190.
+ seenAnyThirdParty := false
+ for j, spec := range gen.Specs {
+ impspec := spec.(*ast.ImportSpec)
+ p := importPath(impspec)
+ n := matchLen(p, path)
+ if n > bestMatch || (bestMatch == 0 && !seenAnyThirdParty && isThirdPartyPath) {
+ bestMatch = n
+ impDecl = gen
+ impIndex = j
+ }
+ seenAnyThirdParty = seenAnyThirdParty || isThirdParty(p)
+ }
+ }
+ }
+
+ // If no import decl found, add one after the last import.
+ if impDecl == nil {
+ impDecl = &ast.GenDecl{
+ Tok: token.IMPORT,
+ }
+ if lastImport >= 0 {
+ impDecl.TokPos = f.Decls[lastImport].End()
+ } else {
+ // There are no existing imports.
+ // Our new import, preceded by a blank line, goes after the package declaration
+ // and after the comment, if any, that starts on the same line as the
+ // package declaration.
+ impDecl.TokPos = f.Package
+
+ file := fset.File(f.Package)
+ pkgLine := file.Line(f.Package)
+ for _, c := range f.Comments {
+ if file.Line(c.Pos()) > pkgLine {
+ break
+ }
+ // +2 for a blank line
+ impDecl.TokPos = c.End() + 2
+ }
+ }
+ f.Decls = append(f.Decls, nil)
+ copy(f.Decls[lastImport+2:], f.Decls[lastImport+1:])
+ f.Decls[lastImport+1] = impDecl
+ }
+
+ // Insert new import at insertAt.
+ insertAt := 0
+ if impIndex >= 0 {
+ // insert after the found import
+ insertAt = impIndex + 1
+ }
+ impDecl.Specs = append(impDecl.Specs, nil)
+ copy(impDecl.Specs[insertAt+1:], impDecl.Specs[insertAt:])
+ impDecl.Specs[insertAt] = newImport
+ pos := impDecl.Pos()
+ if insertAt > 0 {
+ // If there is a comment after an existing import, preserve the comment
+ // position by adding the new import after the comment.
+ if spec, ok := impDecl.Specs[insertAt-1].(*ast.ImportSpec); ok && spec.Comment != nil {
+ pos = spec.Comment.End()
+ } else {
+ // Assign same position as the previous import,
+ // so that the sorter sees it as being in the same block.
+ pos = impDecl.Specs[insertAt-1].Pos()
+ }
+ }
+ if newImport.Name != nil {
+ newImport.Name.NamePos = pos
+ }
+ newImport.Path.ValuePos = pos
+ newImport.EndPos = pos
+
+ // Clean up parens. impDecl contains at least one spec.
+ if len(impDecl.Specs) == 1 {
+ // Remove unneeded parens.
+ impDecl.Lparen = token.NoPos
+ } else if !impDecl.Lparen.IsValid() {
+ // impDecl needs parens added.
+ impDecl.Lparen = impDecl.Specs[0].Pos()
+ }
+
+ f.Imports = append(f.Imports, newImport)
+
+ if len(f.Decls) <= 1 {
+ return true
+ }
+
+ // Merge all the import declarations into the first one.
+ var first *ast.GenDecl
+ for i := 0; i < len(f.Decls); i++ {
+ decl := f.Decls[i]
+ gen, ok := decl.(*ast.GenDecl)
+ if !ok || gen.Tok != token.IMPORT || declImports(gen, "C") {
+ continue
+ }
+ if first == nil {
+ first = gen
+ continue // Don't touch the first one.
+ }
+ // We now know there is more than one package in this import
+ // declaration. Ensure that it ends up parenthesized.
+ first.Lparen = first.Pos()
+ // Move the imports of the other import declaration to the first one.
+ for _, spec := range gen.Specs {
+ spec.(*ast.ImportSpec).Path.ValuePos = first.Pos()
+ first.Specs = append(first.Specs, spec)
+ }
+ f.Decls = append(f.Decls[:i], f.Decls[i+1:]...)
+ i--
+ }
+
+ return true
+}
+
+func isThirdParty(importPath string) bool {
+ // Third party package import path usually contains "." (".com", ".org", ...)
+ // This logic is taken from golang.org/x/tools/imports package.
+ return strings.Contains(importPath, ".")
+}
+
+// DeleteImport deletes the import path from the file f, if present.
+// If there are duplicate import declarations, all matching ones are deleted.
+func DeleteImport(fset *token.FileSet, f *ast.File, path string) (deleted bool) {
+ return DeleteNamedImport(fset, f, "", path)
+}
+
+// DeleteNamedImport deletes the import with the given name and path from the file f, if present.
+// If there are duplicate import declarations, all matching ones are deleted.
+func DeleteNamedImport(fset *token.FileSet, f *ast.File, name, path string) (deleted bool) {
+ var delspecs []*ast.ImportSpec
+ var delcomments []*ast.CommentGroup
+
+ // Find the import nodes that import path, if any.
+ for i := 0; i < len(f.Decls); i++ {
+ decl := f.Decls[i]
+ gen, ok := decl.(*ast.GenDecl)
+ if !ok || gen.Tok != token.IMPORT {
+ continue
+ }
+ for j := 0; j < len(gen.Specs); j++ {
+ spec := gen.Specs[j]
+ impspec := spec.(*ast.ImportSpec)
+ if importName(impspec) != name || importPath(impspec) != path {
+ continue
+ }
+
+ // We found an import spec that imports path.
+ // Delete it.
+ delspecs = append(delspecs, impspec)
+ deleted = true
+ copy(gen.Specs[j:], gen.Specs[j+1:])
+ gen.Specs = gen.Specs[:len(gen.Specs)-1]
+
+ // If this was the last import spec in this decl,
+ // delete the decl, too.
+ if len(gen.Specs) == 0 {
+ copy(f.Decls[i:], f.Decls[i+1:])
+ f.Decls = f.Decls[:len(f.Decls)-1]
+ i--
+ break
+ } else if len(gen.Specs) == 1 {
+ if impspec.Doc != nil {
+ delcomments = append(delcomments, impspec.Doc)
+ }
+ if impspec.Comment != nil {
+ delcomments = append(delcomments, impspec.Comment)
+ }
+ for _, cg := range f.Comments {
+ // Found comment on the same line as the import spec.
+ if cg.End() < impspec.Pos() && fset.Position(cg.End()).Line == fset.Position(impspec.Pos()).Line {
+ delcomments = append(delcomments, cg)
+ break
+ }
+ }
+
+ spec := gen.Specs[0].(*ast.ImportSpec)
+
+ // Move the documentation right after the import decl.
+ if spec.Doc != nil {
+ for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Doc.Pos()).Line {
+ fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)
+ }
+ }
+ for _, cg := range f.Comments {
+ if cg.End() < spec.Pos() && fset.Position(cg.End()).Line == fset.Position(spec.Pos()).Line {
+ for fset.Position(gen.TokPos).Line+1 < fset.Position(spec.Pos()).Line {
+ fset.File(gen.TokPos).MergeLine(fset.Position(gen.TokPos).Line)
+ }
+ break
+ }
+ }
+ }
+ if j > 0 {
+ lastImpspec := gen.Specs[j-1].(*ast.ImportSpec)
+ lastLine := fset.Position(lastImpspec.Path.ValuePos).Line
+ line := fset.Position(impspec.Path.ValuePos).Line
+
+ // We deleted an entry but now there may be
+ // a blank line-sized hole where the import was.
+ if line-lastLine > 1 {
+ // There was a blank line immediately preceding the deleted import,
+ // so there's no need to close the hole.
+ // Do nothing.
+ } else if line != fset.File(gen.Rparen).LineCount() {
+ // There was no blank line. Close the hole.
+ fset.File(gen.Rparen).MergeLine(line)
+ }
+ }
+ j--
+ }
+ }
+
+ // Delete imports from f.Imports.
+ for i := 0; i < len(f.Imports); i++ {
+ imp := f.Imports[i]
+ for j, del := range delspecs {
+ if imp == del {
+ copy(f.Imports[i:], f.Imports[i+1:])
+ f.Imports = f.Imports[:len(f.Imports)-1]
+ copy(delspecs[j:], delspecs[j+1:])
+ delspecs = delspecs[:len(delspecs)-1]
+ i--
+ break
+ }
+ }
+ }
+
+ // Delete comments from f.Comments.
+ for i := 0; i < len(f.Comments); i++ {
+ cg := f.Comments[i]
+ for j, del := range delcomments {
+ if cg == del {
+ copy(f.Comments[i:], f.Comments[i+1:])
+ f.Comments = f.Comments[:len(f.Comments)-1]
+ copy(delcomments[j:], delcomments[j+1:])
+ delcomments = delcomments[:len(delcomments)-1]
+ i--
+ break
+ }
+ }
+ }
+
+ if len(delspecs) > 0 {
+ panic(fmt.Sprintf("deleted specs from Decls but not Imports: %v", delspecs))
+ }
+
+ return
+}
+
+// RewriteImport rewrites any import of path oldPath to path newPath.
+func RewriteImport(fset *token.FileSet, f *ast.File, oldPath, newPath string) (rewrote bool) {
+ for _, imp := range f.Imports {
+ if importPath(imp) == oldPath {
+ rewrote = true
+ // record old End, because the default is to compute
+ // it using the length of imp.Path.Value.
+ imp.EndPos = imp.End()
+ imp.Path.Value = strconv.Quote(newPath)
+ }
+ }
+ return
+}
+
+// UsesImport reports whether a given import is used.
+func UsesImport(f *ast.File, path string) (used bool) {
+ spec := importSpec(f, path)
+ if spec == nil {
+ return
+ }
+
+ name := spec.Name.String()
+ switch name {
+ case "":
+ // If the package name is not explicitly specified,
+ // make an educated guess. This is not guaranteed to be correct.
+ lastSlash := strings.LastIndex(path, "/")
+ if lastSlash == -1 {
+ name = path
+ } else {
+ name = path[lastSlash+1:]
+ }
+ case "_", ".":
+ // Not sure if this import is used - err on the side of caution.
+ return true
+ }
+
+ ast.Walk(visitFn(func(n ast.Node) {
+ sel, ok := n.(*ast.SelectorExpr)
+ if ok && isTopName(sel.X, name) {
+ used = true
+ }
+ }), f)
+
+ return
+}
+
+type visitFn func(node ast.Node)
+
+func (fn visitFn) Visit(node ast.Node) ast.Visitor {
+ fn(node)
+ return fn
+}
+
+// imports reports whether f has an import with the specified name and path.
+func imports(f *ast.File, name, path string) bool {
+ for _, s := range f.Imports {
+ if importName(s) == name && importPath(s) == path {
+ return true
+ }
+ }
+ return false
+}
+
+// importSpec returns the import spec if f imports path,
+// or nil otherwise.
+func importSpec(f *ast.File, path string) *ast.ImportSpec {
+ for _, s := range f.Imports {
+ if importPath(s) == path {
+ return s
+ }
+ }
+ return nil
+}
+
+// importName returns the name of s,
+// or "" if the import is not named.
+func importName(s *ast.ImportSpec) string {
+ if s.Name == nil {
+ return ""
+ }
+ return s.Name.Name
+}
+
+// importPath returns the unquoted import path of s,
+// or "" if the path is not properly quoted.
+func importPath(s *ast.ImportSpec) string {
+ t, err := strconv.Unquote(s.Path.Value)
+ if err != nil {
+ return ""
+ }
+ return t
+}
+
+// declImports reports whether gen contains an import of path.
+func declImports(gen *ast.GenDecl, path string) bool {
+ if gen.Tok != token.IMPORT {
+ return false
+ }
+ for _, spec := range gen.Specs {
+ impspec := spec.(*ast.ImportSpec)
+ if importPath(impspec) == path {
+ return true
+ }
+ }
+ return false
+}
+
+// matchLen returns the length of the longest path segment prefix shared by x and y.
+func matchLen(x, y string) int {
+ n := 0
+ for i := 0; i < len(x) && i < len(y) && x[i] == y[i]; i++ {
+ if x[i] == '/' {
+ n++
+ }
+ }
+ return n
+}
+
+// isTopName returns true if n is a top-level unresolved identifier with the given name.
+func isTopName(n ast.Expr, name string) bool {
+ id, ok := n.(*ast.Ident)
+ return ok && id.Name == name && id.Obj == nil
+}
+
+// Imports returns the file imports grouped by paragraph.
+func Imports(fset *token.FileSet, f *ast.File) [][]*ast.ImportSpec {
+ var groups [][]*ast.ImportSpec
+
+ for _, decl := range f.Decls {
+ genDecl, ok := decl.(*ast.GenDecl)
+ if !ok || genDecl.Tok != token.IMPORT {
+ break
+ }
+
+ group := []*ast.ImportSpec{}
+
+ var lastLine int
+ for _, spec := range genDecl.Specs {
+ importSpec := spec.(*ast.ImportSpec)
+ pos := importSpec.Path.ValuePos
+ line := fset.Position(pos).Line
+ if lastLine > 0 && pos > 0 && line-lastLine > 1 {
+ groups = append(groups, group)
+ group = []*ast.ImportSpec{}
+ }
+ group = append(group, importSpec)
+ lastLine = line
+ }
+ groups = append(groups, group)
+ }
+
+ return groups
+}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go
new file mode 100644
index 00000000000..cf72ea990bd
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ast/astutil/rewrite.go
@@ -0,0 +1,477 @@
+// 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 astutil
+
+import (
+ "fmt"
+ "go/ast"
+ "reflect"
+ "sort"
+)
+
+// An ApplyFunc is invoked by Apply for each node n, even if n is nil,
+// before and/or after the node's children, using a Cursor describing
+// the current node and providing operations on it.
+//
+// The return value of ApplyFunc controls the syntax tree traversal.
+// See Apply for details.
+type ApplyFunc func(*Cursor) bool
+
+// Apply traverses a syntax tree recursively, starting with root,
+// and calling pre and post for each node as described below.
+// Apply returns the syntax tree, possibly modified.
+//
+// If pre is not nil, it is called for each node before the node's
+// children are traversed (pre-order). If pre returns false, no
+// children are traversed, and post is not called for that node.
+//
+// If post is not nil, and a prior call of pre didn't return false,
+// post is called for each node after its children are traversed
+// (post-order). If post returns false, traversal is terminated and
+// Apply returns immediately.
+//
+// Only fields that refer to AST nodes are considered children;
+// i.e., token.Pos, Scopes, Objects, and fields of basic types
+// (strings, etc.) are ignored.
+//
+// Children are traversed in the order in which they appear in the
+// respective node's struct definition. A package's files are
+// traversed in the filenames' alphabetical order.
+//
+func Apply(root ast.Node, pre, post ApplyFunc) (result ast.Node) {
+ parent := &struct{ ast.Node }{root}
+ defer func() {
+ if r := recover(); r != nil && r != abort {
+ panic(r)
+ }
+ result = parent.Node
+ }()
+ a := &application{pre: pre, post: post}
+ a.apply(parent, "Node", nil, root)
+ return
+}
+
+var abort = new(int) // singleton, to signal termination of Apply
+
+// A Cursor describes a node encountered during Apply.
+// Information about the node and its parent is available
+// from the Node, Parent, Name, and Index methods.
+//
+// If p is a variable of type and value of the current parent node
+// c.Parent(), and f is the field identifier with name c.Name(),
+// the following invariants hold:
+//
+// p.f == c.Node() if c.Index() < 0
+// p.f[c.Index()] == c.Node() if c.Index() >= 0
+//
+// The methods Replace, Delete, InsertBefore, and InsertAfter
+// can be used to change the AST without disrupting Apply.
+type Cursor struct {
+ parent ast.Node
+ name string
+ iter *iterator // valid if non-nil
+ node ast.Node
+}
+
+// Node returns the current Node.
+func (c *Cursor) Node() ast.Node { return c.node }
+
+// Parent returns the parent of the current Node.
+func (c *Cursor) Parent() ast.Node { return c.parent }
+
+// Name returns the name of the parent Node field that contains the current Node.
+// If the parent is a *ast.Package and the current Node is a *ast.File, Name returns
+// the filename for the current Node.
+func (c *Cursor) Name() string { return c.name }
+
+// Index reports the index >= 0 of the current Node in the slice of Nodes that
+// contains it, or a value < 0 if the current Node is not part of a slice.
+// The index of the current node changes if InsertBefore is called while
+// processing the current node.
+func (c *Cursor) Index() int {
+ if c.iter != nil {
+ return c.iter.index
+ }
+ return -1
+}
+
+// field returns the current node's parent field value.
+func (c *Cursor) field() reflect.Value {
+ return reflect.Indirect(reflect.ValueOf(c.parent)).FieldByName(c.name)
+}
+
+// Replace replaces the current Node with n.
+// The replacement node is not walked by Apply.
+func (c *Cursor) Replace(n ast.Node) {
+ if _, ok := c.node.(*ast.File); ok {
+ file, ok := n.(*ast.File)
+ if !ok {
+ panic("attempt to replace *ast.File with non-*ast.File")
+ }
+ c.parent.(*ast.Package).Files[c.name] = file
+ return
+ }
+
+ v := c.field()
+ if i := c.Index(); i >= 0 {
+ v = v.Index(i)
+ }
+ v.Set(reflect.ValueOf(n))
+}
+
+// Delete deletes the current Node from its containing slice.
+// If the current Node is not part of a slice, Delete panics.
+// As a special case, if the current node is a package file,
+// Delete removes it from the package's Files map.
+func (c *Cursor) Delete() {
+ if _, ok := c.node.(*ast.File); ok {
+ delete(c.parent.(*ast.Package).Files, c.name)
+ return
+ }
+
+ i := c.Index()
+ if i < 0 {
+ panic("Delete node not contained in slice")
+ }
+ v := c.field()
+ l := v.Len()
+ reflect.Copy(v.Slice(i, l), v.Slice(i+1, l))
+ v.Index(l - 1).Set(reflect.Zero(v.Type().Elem()))
+ v.SetLen(l - 1)
+ c.iter.step--
+}
+
+// InsertAfter inserts n after the current Node in its containing slice.
+// If the current Node is not part of a slice, InsertAfter panics.
+// Apply does not walk n.
+func (c *Cursor) InsertAfter(n ast.Node) {
+ i := c.Index()
+ if i < 0 {
+ panic("InsertAfter node not contained in slice")
+ }
+ v := c.field()
+ v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
+ l := v.Len()
+ reflect.Copy(v.Slice(i+2, l), v.Slice(i+1, l))
+ v.Index(i + 1).Set(reflect.ValueOf(n))
+ c.iter.step++
+}
+
+// InsertBefore inserts n before the current Node in its containing slice.
+// If the current Node is not part of a slice, InsertBefore panics.
+// Apply will not walk n.
+func (c *Cursor) InsertBefore(n ast.Node) {
+ i := c.Index()
+ if i < 0 {
+ panic("InsertBefore node not contained in slice")
+ }
+ v := c.field()
+ v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
+ l := v.Len()
+ reflect.Copy(v.Slice(i+1, l), v.Slice(i, l))
+ v.Index(i).Set(reflect.ValueOf(n))
+ c.iter.index++
+}
+
+// application carries all the shared data so we can pass it around cheaply.
+type application struct {
+ pre, post ApplyFunc
+ cursor Cursor
+ iter iterator
+}
+
+func (a *application) apply(parent ast.Node, name string, iter *iterator, n ast.Node) {
+ // convert typed nil into untyped nil
+ if v := reflect.ValueOf(n); v.Kind() == reflect.Ptr && v.IsNil() {
+ n = nil
+ }
+
+ // avoid heap-allocating a new cursor for each apply call; reuse a.cursor instead
+ saved := a.cursor
+ a.cursor.parent = parent
+ a.cursor.name = name
+ a.cursor.iter = iter
+ a.cursor.node = n
+
+ if a.pre != nil && !a.pre(&a.cursor) {
+ a.cursor = saved
+ return
+ }
+
+ // walk children
+ // (the order of the cases matches the order of the corresponding node types in go/ast)
+ switch n := n.(type) {
+ case nil:
+ // nothing to do
+
+ // Comments and fields
+ case *ast.Comment:
+ // nothing to do
+
+ case *ast.CommentGroup:
+ if n != nil {
+ a.applyList(n, "List")
+ }
+
+ case *ast.Field:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.applyList(n, "Names")
+ a.apply(n, "Type", nil, n.Type)
+ a.apply(n, "Tag", nil, n.Tag)
+ a.apply(n, "Comment", nil, n.Comment)
+
+ case *ast.FieldList:
+ a.applyList(n, "List")
+
+ // Expressions
+ case *ast.BadExpr, *ast.Ident, *ast.BasicLit:
+ // nothing to do
+
+ case *ast.Ellipsis:
+ a.apply(n, "Elt", nil, n.Elt)
+
+ case *ast.FuncLit:
+ a.apply(n, "Type", nil, n.Type)
+ a.apply(n, "Body", nil, n.Body)
+
+ case *ast.CompositeLit:
+ a.apply(n, "Type", nil, n.Type)
+ a.applyList(n, "Elts")
+
+ case *ast.ParenExpr:
+ a.apply(n, "X", nil, n.X)
+
+ case *ast.SelectorExpr:
+ a.apply(n, "X", nil, n.X)
+ a.apply(n, "Sel", nil, n.Sel)
+
+ case *ast.IndexExpr:
+ a.apply(n, "X", nil, n.X)
+ a.apply(n, "Index", nil, n.Index)
+
+ case *ast.SliceExpr:
+ a.apply(n, "X", nil, n.X)
+ a.apply(n, "Low", nil, n.Low)
+ a.apply(n, "High", nil, n.High)
+ a.apply(n, "Max", nil, n.Max)
+
+ case *ast.TypeAssertExpr:
+ a.apply(n, "X", nil, n.X)
+ a.apply(n, "Type", nil, n.Type)
+
+ case *ast.CallExpr:
+ a.apply(n, "Fun", nil, n.Fun)
+ a.applyList(n, "Args")
+
+ case *ast.StarExpr:
+ a.apply(n, "X", nil, n.X)
+
+ case *ast.UnaryExpr:
+ a.apply(n, "X", nil, n.X)
+
+ case *ast.BinaryExpr:
+ a.apply(n, "X", nil, n.X)
+ a.apply(n, "Y", nil, n.Y)
+
+ case *ast.KeyValueExpr:
+ a.apply(n, "Key", nil, n.Key)
+ a.apply(n, "Value", nil, n.Value)
+
+ // Types
+ case *ast.ArrayType:
+ a.apply(n, "Len", nil, n.Len)
+ a.apply(n, "Elt", nil, n.Elt)
+
+ case *ast.StructType:
+ a.apply(n, "Fields", nil, n.Fields)
+
+ case *ast.FuncType:
+ a.apply(n, "Params", nil, n.Params)
+ a.apply(n, "Results", nil, n.Results)
+
+ case *ast.InterfaceType:
+ a.apply(n, "Methods", nil, n.Methods)
+
+ case *ast.MapType:
+ a.apply(n, "Key", nil, n.Key)
+ a.apply(n, "Value", nil, n.Value)
+
+ case *ast.ChanType:
+ a.apply(n, "Value", nil, n.Value)
+
+ // Statements
+ case *ast.BadStmt:
+ // nothing to do
+
+ case *ast.DeclStmt:
+ a.apply(n, "Decl", nil, n.Decl)
+
+ case *ast.EmptyStmt:
+ // nothing to do
+
+ case *ast.LabeledStmt:
+ a.apply(n, "Label", nil, n.Label)
+ a.apply(n, "Stmt", nil, n.Stmt)
+
+ case *ast.ExprStmt:
+ a.apply(n, "X", nil, n.X)
+
+ case *ast.SendStmt:
+ a.apply(n, "Chan", nil, n.Chan)
+ a.apply(n, "Value", nil, n.Value)
+
+ case *ast.IncDecStmt:
+ a.apply(n, "X", nil, n.X)
+
+ case *ast.AssignStmt:
+ a.applyList(n, "Lhs")
+ a.applyList(n, "Rhs")
+
+ case *ast.GoStmt:
+ a.apply(n, "Call", nil, n.Call)
+
+ case *ast.DeferStmt:
+ a.apply(n, "Call", nil, n.Call)
+
+ case *ast.ReturnStmt:
+ a.applyList(n, "Results")
+
+ case *ast.BranchStmt:
+ a.apply(n, "Label", nil, n.Label)
+
+ case *ast.BlockStmt:
+ a.applyList(n, "List")
+
+ case *ast.IfStmt:
+ a.apply(n, "Init", nil, n.Init)
+ a.apply(n, "Cond", nil, n.Cond)
+ a.apply(n, "Body", nil, n.Body)
+ a.apply(n, "Else", nil, n.Else)
+
+ case *ast.CaseClause:
+ a.applyList(n, "List")
+ a.applyList(n, "Body")
+
+ case *ast.SwitchStmt:
+ a.apply(n, "Init", nil, n.Init)
+ a.apply(n, "Tag", nil, n.Tag)
+ a.apply(n, "Body", nil, n.Body)
+
+ case *ast.TypeSwitchStmt:
+ a.apply(n, "Init", nil, n.Init)
+ a.apply(n, "Assign", nil, n.Assign)
+ a.apply(n, "Body", nil, n.Body)
+
+ case *ast.CommClause:
+ a.apply(n, "Comm", nil, n.Comm)
+ a.applyList(n, "Body")
+
+ case *ast.SelectStmt:
+ a.apply(n, "Body", nil, n.Body)
+
+ case *ast.ForStmt:
+ a.apply(n, "Init", nil, n.Init)
+ a.apply(n, "Cond", nil, n.Cond)
+ a.apply(n, "Post", nil, n.Post)
+ a.apply(n, "Body", nil, n.Body)
+
+ case *ast.RangeStmt:
+ a.apply(n, "Key", nil, n.Key)
+ a.apply(n, "Value", nil, n.Value)
+ a.apply(n, "X", nil, n.X)
+ a.apply(n, "Body", nil, n.Body)
+
+ // Declarations
+ case *ast.ImportSpec:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.apply(n, "Name", nil, n.Name)
+ a.apply(n, "Path", nil, n.Path)
+ a.apply(n, "Comment", nil, n.Comment)
+
+ case *ast.ValueSpec:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.applyList(n, "Names")
+ a.apply(n, "Type", nil, n.Type)
+ a.applyList(n, "Values")
+ a.apply(n, "Comment", nil, n.Comment)
+
+ case *ast.TypeSpec:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.apply(n, "Name", nil, n.Name)
+ a.apply(n, "Type", nil, n.Type)
+ a.apply(n, "Comment", nil, n.Comment)
+
+ case *ast.BadDecl:
+ // nothing to do
+
+ case *ast.GenDecl:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.applyList(n, "Specs")
+
+ case *ast.FuncDecl:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.apply(n, "Recv", nil, n.Recv)
+ a.apply(n, "Name", nil, n.Name)
+ a.apply(n, "Type", nil, n.Type)
+ a.apply(n, "Body", nil, n.Body)
+
+ // Files and packages
+ case *ast.File:
+ a.apply(n, "Doc", nil, n.Doc)
+ a.apply(n, "Name", nil, n.Name)
+ a.applyList(n, "Decls")
+ // Don't walk n.Comments; they have either been walked already if
+ // they are Doc comments, or they can be easily walked explicitly.
+
+ case *ast.Package:
+ // collect and sort names for reproducible behavior
+ var names []string
+ for name := range n.Files {
+ names = append(names, name)
+ }
+ sort.Strings(names)
+ for _, name := range names {
+ a.apply(n, name, nil, n.Files[name])
+ }
+
+ default:
+ panic(fmt.Sprintf("Apply: unexpected node type %T", n))
+ }
+
+ if a.post != nil && !a.post(&a.cursor) {
+ panic(abort)
+ }
+
+ a.cursor = saved
+}
+
+// An iterator controls iteration over a slice of nodes.
+type iterator struct {
+ index, step int
+}
+
+func (a *application) applyList(parent ast.Node, name string) {
+ // avoid heap-allocating a new iterator for each applyList call; reuse a.iter instead
+ saved := a.iter
+ a.iter.index = 0
+ for {
+ // must reload parent.name each time, since cursor modifications might change it
+ v := reflect.Indirect(reflect.ValueOf(parent)).FieldByName(name)
+ if a.iter.index >= v.Len() {
+ break
+ }
+
+ // element x may be nil in a bad AST - be cautious
+ var x ast.Node
+ if e := v.Index(a.iter.index); e.IsValid() {
+ x = e.Interface().(ast.Node)
+ }
+
+ a.iter.step = 1
+ a.apply(parent, name, &a.iter, x)
+ a.iter.index += a.iter.step
+ }
+ a.iter = saved
+}
diff --git a/vendor/golang.org/x/tools/go/ast/astutil/util.go b/vendor/golang.org/x/tools/go/ast/astutil/util.go
new file mode 100644
index 00000000000..7630629824a
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ast/astutil/util.go
@@ -0,0 +1,14 @@
+package astutil
+
+import "go/ast"
+
+// Unparen returns e with any enclosing parentheses stripped.
+func Unparen(e ast.Expr) ast.Expr {
+ for {
+ p, ok := e.(*ast.ParenExpr)
+ if !ok {
+ return e
+ }
+ e = p.X
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/buildutil/allpackages.go b/vendor/golang.org/x/tools/go/buildutil/allpackages.go
new file mode 100644
index 00000000000..c0cb03e7bee
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/buildutil/allpackages.go
@@ -0,0 +1,198 @@
+// Copyright 2014 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 buildutil provides utilities related to the go/build
+// package in the standard library.
+//
+// All I/O is done via the build.Context file system interface, which must
+// be concurrency-safe.
+package buildutil // import "golang.org/x/tools/go/buildutil"
+
+import (
+ "go/build"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "sync"
+)
+
+// AllPackages returns the package path of each Go package in any source
+// directory of the specified build context (e.g. $GOROOT or an element
+// of $GOPATH). Errors are ignored. The results are sorted.
+// All package paths are canonical, and thus may contain "/vendor/".
+//
+// The result may include import paths for directories that contain no
+// *.go files, such as "archive" (in $GOROOT/src).
+//
+// All I/O is done via the build.Context file system interface,
+// which must be concurrency-safe.
+//
+func AllPackages(ctxt *build.Context) []string {
+ var list []string
+ ForEachPackage(ctxt, func(pkg string, _ error) {
+ list = append(list, pkg)
+ })
+ sort.Strings(list)
+ return list
+}
+
+// ForEachPackage calls the found function with the package path of
+// each Go package it finds in any source directory of the specified
+// build context (e.g. $GOROOT or an element of $GOPATH).
+// All package paths are canonical, and thus may contain "/vendor/".
+//
+// If the package directory exists but could not be read, the second
+// argument to the found function provides the error.
+//
+// All I/O is done via the build.Context file system interface,
+// which must be concurrency-safe.
+//
+func ForEachPackage(ctxt *build.Context, found func(importPath string, err error)) {
+ ch := make(chan item)
+
+ var wg sync.WaitGroup
+ for _, root := range ctxt.SrcDirs() {
+ root := root
+ wg.Add(1)
+ go func() {
+ allPackages(ctxt, root, ch)
+ wg.Done()
+ }()
+ }
+ go func() {
+ wg.Wait()
+ close(ch)
+ }()
+
+ // All calls to found occur in the caller's goroutine.
+ for i := range ch {
+ found(i.importPath, i.err)
+ }
+}
+
+type item struct {
+ importPath string
+ err error // (optional)
+}
+
+// We use a process-wide counting semaphore to limit
+// the number of parallel calls to ReadDir.
+var ioLimit = make(chan bool, 20)
+
+func allPackages(ctxt *build.Context, root string, ch chan<- item) {
+ root = filepath.Clean(root) + string(os.PathSeparator)
+
+ var wg sync.WaitGroup
+
+ var walkDir func(dir string)
+ walkDir = func(dir string) {
+ // Avoid .foo, _foo, and testdata directory trees.
+ base := filepath.Base(dir)
+ if base == "" || base[0] == '.' || base[0] == '_' || base == "testdata" {
+ return
+ }
+
+ pkg := filepath.ToSlash(strings.TrimPrefix(dir, root))
+
+ // Prune search if we encounter any of these import paths.
+ switch pkg {
+ case "builtin":
+ return
+ }
+
+ ioLimit <- true
+ files, err := ReadDir(ctxt, dir)
+ <-ioLimit
+ if pkg != "" || err != nil {
+ ch <- item{pkg, err}
+ }
+ for _, fi := range files {
+ fi := fi
+ if fi.IsDir() {
+ wg.Add(1)
+ go func() {
+ walkDir(filepath.Join(dir, fi.Name()))
+ wg.Done()
+ }()
+ }
+ }
+ }
+
+ walkDir(root)
+ wg.Wait()
+}
+
+// ExpandPatterns returns the set of packages matched by patterns,
+// which may have the following forms:
+//
+// golang.org/x/tools/cmd/guru # a single package
+// golang.org/x/tools/... # all packages beneath dir
+// ... # the entire workspace.
+//
+// Order is significant: a pattern preceded by '-' removes matching
+// packages from the set. For example, these patterns match all encoding
+// packages except encoding/xml:
+//
+// encoding/... -encoding/xml
+//
+// A trailing slash in a pattern is ignored. (Path components of Go
+// package names are separated by slash, not the platform's path separator.)
+//
+func ExpandPatterns(ctxt *build.Context, patterns []string) map[string]bool {
+ // TODO(adonovan): support other features of 'go list':
+ // - "std"/"cmd"/"all" meta-packages
+ // - "..." not at the end of a pattern
+ // - relative patterns using "./" or "../" prefix
+
+ pkgs := make(map[string]bool)
+ doPkg := func(pkg string, neg bool) {
+ if neg {
+ delete(pkgs, pkg)
+ } else {
+ pkgs[pkg] = true
+ }
+ }
+
+ // Scan entire workspace if wildcards are present.
+ // TODO(adonovan): opt: scan only the necessary subtrees of the workspace.
+ var all []string
+ for _, arg := range patterns {
+ if strings.HasSuffix(arg, "...") {
+ all = AllPackages(ctxt)
+ break
+ }
+ }
+
+ for _, arg := range patterns {
+ if arg == "" {
+ continue
+ }
+
+ neg := arg[0] == '-'
+ if neg {
+ arg = arg[1:]
+ }
+
+ if arg == "..." {
+ // ... matches all packages
+ for _, pkg := range all {
+ doPkg(pkg, neg)
+ }
+ } else if dir := strings.TrimSuffix(arg, "/..."); dir != arg {
+ // dir/... matches all packages beneath dir
+ for _, pkg := range all {
+ if strings.HasPrefix(pkg, dir) &&
+ (len(pkg) == len(dir) || pkg[len(dir)] == '/') {
+ doPkg(pkg, neg)
+ }
+ }
+ } else {
+ // single package
+ doPkg(strings.TrimSuffix(arg, "/"), neg)
+ }
+ }
+
+ return pkgs
+}
diff --git a/vendor/golang.org/x/tools/go/buildutil/fakecontext.go b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go
new file mode 100644
index 00000000000..8b7f066739f
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/buildutil/fakecontext.go
@@ -0,0 +1,109 @@
+package buildutil
+
+import (
+ "fmt"
+ "go/build"
+ "io"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+ "sort"
+ "strings"
+ "time"
+)
+
+// FakeContext returns a build.Context for the fake file tree specified
+// by pkgs, which maps package import paths to a mapping from file base
+// names to contents.
+//
+// The fake Context has a GOROOT of "/go" and no GOPATH, and overrides
+// the necessary file access methods to read from memory instead of the
+// real file system.
+//
+// Unlike a real file tree, the fake one has only two levels---packages
+// and files---so ReadDir("/go/src/") returns all packages under
+// /go/src/ including, for instance, "math" and "math/big".
+// ReadDir("/go/src/math/big") would return all the files in the
+// "math/big" package.
+//
+func FakeContext(pkgs map[string]map[string]string) *build.Context {
+ clean := func(filename string) string {
+ f := path.Clean(filepath.ToSlash(filename))
+ // Removing "/go/src" while respecting segment
+ // boundaries has this unfortunate corner case:
+ if f == "/go/src" {
+ return ""
+ }
+ return strings.TrimPrefix(f, "/go/src/")
+ }
+
+ ctxt := build.Default // copy
+ ctxt.GOROOT = "/go"
+ ctxt.GOPATH = ""
+ ctxt.Compiler = "gc"
+ ctxt.IsDir = func(dir string) bool {
+ dir = clean(dir)
+ if dir == "" {
+ return true // needed by (*build.Context).SrcDirs
+ }
+ return pkgs[dir] != nil
+ }
+ ctxt.ReadDir = func(dir string) ([]os.FileInfo, error) {
+ dir = clean(dir)
+ var fis []os.FileInfo
+ if dir == "" {
+ // enumerate packages
+ for importPath := range pkgs {
+ fis = append(fis, fakeDirInfo(importPath))
+ }
+ } else {
+ // enumerate files of package
+ for basename := range pkgs[dir] {
+ fis = append(fis, fakeFileInfo(basename))
+ }
+ }
+ sort.Sort(byName(fis))
+ return fis, nil
+ }
+ ctxt.OpenFile = func(filename string) (io.ReadCloser, error) {
+ filename = clean(filename)
+ dir, base := path.Split(filename)
+ content, ok := pkgs[path.Clean(dir)][base]
+ if !ok {
+ return nil, fmt.Errorf("file not found: %s", filename)
+ }
+ return ioutil.NopCloser(strings.NewReader(content)), nil
+ }
+ ctxt.IsAbsPath = func(path string) bool {
+ path = filepath.ToSlash(path)
+ // Don't rely on the default (filepath.Path) since on
+ // Windows, it reports virtual paths as non-absolute.
+ return strings.HasPrefix(path, "/")
+ }
+ return &ctxt
+}
+
+type byName []os.FileInfo
+
+func (s byName) Len() int { return len(s) }
+func (s byName) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+func (s byName) Less(i, j int) bool { return s[i].Name() < s[j].Name() }
+
+type fakeFileInfo string
+
+func (fi fakeFileInfo) Name() string { return string(fi) }
+func (fakeFileInfo) Sys() interface{} { return nil }
+func (fakeFileInfo) ModTime() time.Time { return time.Time{} }
+func (fakeFileInfo) IsDir() bool { return false }
+func (fakeFileInfo) Size() int64 { return 0 }
+func (fakeFileInfo) Mode() os.FileMode { return 0644 }
+
+type fakeDirInfo string
+
+func (fd fakeDirInfo) Name() string { return string(fd) }
+func (fakeDirInfo) Sys() interface{} { return nil }
+func (fakeDirInfo) ModTime() time.Time { return time.Time{} }
+func (fakeDirInfo) IsDir() bool { return true }
+func (fakeDirInfo) Size() int64 { return 0 }
+func (fakeDirInfo) Mode() os.FileMode { return 0755 }
diff --git a/vendor/golang.org/x/tools/go/buildutil/overlay.go b/vendor/golang.org/x/tools/go/buildutil/overlay.go
new file mode 100644
index 00000000000..3f71c4fef75
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/buildutil/overlay.go
@@ -0,0 +1,103 @@
+// Copyright 2016 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 buildutil
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "go/build"
+ "io"
+ "io/ioutil"
+ "path/filepath"
+ "strconv"
+ "strings"
+)
+
+// OverlayContext overlays a build.Context with additional files from
+// a map. Files in the map take precedence over other files.
+//
+// In addition to plain string comparison, two file names are
+// considered equal if their base names match and their directory
+// components point at the same directory on the file system. That is,
+// symbolic links are followed for directories, but not files.
+//
+// A common use case for OverlayContext is to allow editors to pass in
+// a set of unsaved, modified files.
+//
+// Currently, only the Context.OpenFile function will respect the
+// overlay. This may change in the future.
+func OverlayContext(orig *build.Context, overlay map[string][]byte) *build.Context {
+ // TODO(dominikh): Implement IsDir, HasSubdir and ReadDir
+
+ rc := func(data []byte) (io.ReadCloser, error) {
+ return ioutil.NopCloser(bytes.NewBuffer(data)), nil
+ }
+
+ copy := *orig // make a copy
+ ctxt := ©
+ ctxt.OpenFile = func(path string) (io.ReadCloser, error) {
+ // Fast path: names match exactly.
+ if content, ok := overlay[path]; ok {
+ return rc(content)
+ }
+
+ // Slow path: check for same file under a different
+ // alias, perhaps due to a symbolic link.
+ for filename, content := range overlay {
+ if sameFile(path, filename) {
+ return rc(content)
+ }
+ }
+
+ return OpenFile(orig, path)
+ }
+ return ctxt
+}
+
+// ParseOverlayArchive parses an archive containing Go files and their
+// contents. The result is intended to be used with OverlayContext.
+//
+//
+// Archive format
+//
+// The archive consists of a series of files. Each file consists of a
+// name, a decimal file size and the file contents, separated by
+// newlinews. No newline follows after the file contents.
+func ParseOverlayArchive(archive io.Reader) (map[string][]byte, error) {
+ overlay := make(map[string][]byte)
+ r := bufio.NewReader(archive)
+ for {
+ // Read file name.
+ filename, err := r.ReadString('\n')
+ if err != nil {
+ if err == io.EOF {
+ break // OK
+ }
+ return nil, fmt.Errorf("reading archive file name: %v", err)
+ }
+ filename = filepath.Clean(strings.TrimSpace(filename))
+
+ // Read file size.
+ sz, err := r.ReadString('\n')
+ if err != nil {
+ return nil, fmt.Errorf("reading size of archive file %s: %v", filename, err)
+ }
+ sz = strings.TrimSpace(sz)
+ size, err := strconv.ParseUint(sz, 10, 32)
+ if err != nil {
+ return nil, fmt.Errorf("parsing size of archive file %s: %v", filename, err)
+ }
+
+ // Read file content.
+ content := make([]byte, size)
+ if _, err := io.ReadFull(r, content); err != nil {
+ return nil, fmt.Errorf("reading archive file %s: %v", filename, err)
+ }
+ overlay[filename] = content
+ }
+
+ return overlay, nil
+}
diff --git a/vendor/golang.org/x/tools/go/buildutil/tags.go b/vendor/golang.org/x/tools/go/buildutil/tags.go
new file mode 100644
index 00000000000..486606f3768
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/buildutil/tags.go
@@ -0,0 +1,75 @@
+package buildutil
+
+// This logic was copied from stringsFlag from $GOROOT/src/cmd/go/build.go.
+
+import "fmt"
+
+const TagsFlagDoc = "a list of `build tags` to consider satisfied during the build. " +
+ "For more information about build tags, see the description of " +
+ "build constraints in the documentation for the go/build package"
+
+// TagsFlag is an implementation of the flag.Value and flag.Getter interfaces that parses
+// a flag value in the same manner as go build's -tags flag and
+// populates a []string slice.
+//
+// See $GOROOT/src/go/build/doc.go for description of build tags.
+// See $GOROOT/src/cmd/go/doc.go for description of 'go build -tags' flag.
+//
+// Example:
+// flag.Var((*buildutil.TagsFlag)(&build.Default.BuildTags), "tags", buildutil.TagsFlagDoc)
+type TagsFlag []string
+
+func (v *TagsFlag) Set(s string) error {
+ var err error
+ *v, err = splitQuotedFields(s)
+ if *v == nil {
+ *v = []string{}
+ }
+ return err
+}
+
+func (v *TagsFlag) Get() interface{} { return *v }
+
+func splitQuotedFields(s string) ([]string, error) {
+ // Split fields allowing '' or "" around elements.
+ // Quotes further inside the string do not count.
+ var f []string
+ for len(s) > 0 {
+ for len(s) > 0 && isSpaceByte(s[0]) {
+ s = s[1:]
+ }
+ if len(s) == 0 {
+ break
+ }
+ // Accepted quoted string. No unescaping inside.
+ if s[0] == '"' || s[0] == '\'' {
+ quote := s[0]
+ s = s[1:]
+ i := 0
+ for i < len(s) && s[i] != quote {
+ i++
+ }
+ if i >= len(s) {
+ return nil, fmt.Errorf("unterminated %c string", quote)
+ }
+ f = append(f, s[:i])
+ s = s[i+1:]
+ continue
+ }
+ i := 0
+ for i < len(s) && !isSpaceByte(s[i]) {
+ i++
+ }
+ f = append(f, s[:i])
+ s = s[i:]
+ }
+ return f, nil
+}
+
+func (v *TagsFlag) String() string {
+ return ""
+}
+
+func isSpaceByte(c byte) bool {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r'
+}
diff --git a/vendor/golang.org/x/tools/go/buildutil/util.go b/vendor/golang.org/x/tools/go/buildutil/util.go
new file mode 100644
index 00000000000..fc923d7a702
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/buildutil/util.go
@@ -0,0 +1,212 @@
+// Copyright 2014 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 buildutil
+
+import (
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "io"
+ "io/ioutil"
+ "os"
+ "path"
+ "path/filepath"
+ "strings"
+)
+
+// ParseFile behaves like parser.ParseFile,
+// but uses the build context's file system interface, if any.
+//
+// If file is not absolute (as defined by IsAbsPath), the (dir, file)
+// components are joined using JoinPath; dir must be absolute.
+//
+// The displayPath function, if provided, is used to transform the
+// filename that will be attached to the ASTs.
+//
+// TODO(adonovan): call this from go/loader.parseFiles when the tree thaws.
+//
+func ParseFile(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, file string, mode parser.Mode) (*ast.File, error) {
+ if !IsAbsPath(ctxt, file) {
+ file = JoinPath(ctxt, dir, file)
+ }
+ rd, err := OpenFile(ctxt, file)
+ if err != nil {
+ return nil, err
+ }
+ defer rd.Close() // ignore error
+ if displayPath != nil {
+ file = displayPath(file)
+ }
+ return parser.ParseFile(fset, file, rd, mode)
+}
+
+// ContainingPackage returns the package containing filename.
+//
+// If filename is not absolute, it is interpreted relative to working directory dir.
+// All I/O is via the build context's file system interface, if any.
+//
+// The '...Files []string' fields of the resulting build.Package are not
+// populated (build.FindOnly mode).
+//
+func ContainingPackage(ctxt *build.Context, dir, filename string) (*build.Package, error) {
+ if !IsAbsPath(ctxt, filename) {
+ filename = JoinPath(ctxt, dir, filename)
+ }
+
+ // We must not assume the file tree uses
+ // "/" always,
+ // `\` always,
+ // or os.PathSeparator (which varies by platform),
+ // but to make any progress, we are forced to assume that
+ // paths will not use `\` unless the PathSeparator
+ // is also `\`, thus we can rely on filepath.ToSlash for some sanity.
+
+ dirSlash := path.Dir(filepath.ToSlash(filename)) + "/"
+
+ // We assume that no source root (GOPATH[i] or GOROOT) contains any other.
+ for _, srcdir := range ctxt.SrcDirs() {
+ srcdirSlash := filepath.ToSlash(srcdir) + "/"
+ if importPath, ok := HasSubdir(ctxt, srcdirSlash, dirSlash); ok {
+ return ctxt.Import(importPath, dir, build.FindOnly)
+ }
+ }
+
+ return nil, fmt.Errorf("can't find package containing %s", filename)
+}
+
+// -- Effective methods of file system interface -------------------------
+
+// (go/build.Context defines these as methods, but does not export them.)
+
+// hasSubdir calls ctxt.HasSubdir (if not nil) or else uses
+// the local file system to answer the question.
+func HasSubdir(ctxt *build.Context, root, dir string) (rel string, ok bool) {
+ if f := ctxt.HasSubdir; f != nil {
+ return f(root, dir)
+ }
+
+ // Try using paths we received.
+ if rel, ok = hasSubdir(root, dir); ok {
+ return
+ }
+
+ // Try expanding symlinks and comparing
+ // expanded against unexpanded and
+ // expanded against expanded.
+ rootSym, _ := filepath.EvalSymlinks(root)
+ dirSym, _ := filepath.EvalSymlinks(dir)
+
+ if rel, ok = hasSubdir(rootSym, dir); ok {
+ return
+ }
+ if rel, ok = hasSubdir(root, dirSym); ok {
+ return
+ }
+ return hasSubdir(rootSym, dirSym)
+}
+
+func hasSubdir(root, dir string) (rel string, ok bool) {
+ const sep = string(filepath.Separator)
+ root = filepath.Clean(root)
+ if !strings.HasSuffix(root, sep) {
+ root += sep
+ }
+
+ dir = filepath.Clean(dir)
+ if !strings.HasPrefix(dir, root) {
+ return "", false
+ }
+
+ return filepath.ToSlash(dir[len(root):]), true
+}
+
+// FileExists returns true if the specified file exists,
+// using the build context's file system interface.
+func FileExists(ctxt *build.Context, path string) bool {
+ if ctxt.OpenFile != nil {
+ r, err := ctxt.OpenFile(path)
+ if err != nil {
+ return false
+ }
+ r.Close() // ignore error
+ return true
+ }
+ _, err := os.Stat(path)
+ return err == nil
+}
+
+// OpenFile behaves like os.Open,
+// but uses the build context's file system interface, if any.
+func OpenFile(ctxt *build.Context, path string) (io.ReadCloser, error) {
+ if ctxt.OpenFile != nil {
+ return ctxt.OpenFile(path)
+ }
+ return os.Open(path)
+}
+
+// IsAbsPath behaves like filepath.IsAbs,
+// but uses the build context's file system interface, if any.
+func IsAbsPath(ctxt *build.Context, path string) bool {
+ if ctxt.IsAbsPath != nil {
+ return ctxt.IsAbsPath(path)
+ }
+ return filepath.IsAbs(path)
+}
+
+// JoinPath behaves like filepath.Join,
+// but uses the build context's file system interface, if any.
+func JoinPath(ctxt *build.Context, path ...string) string {
+ if ctxt.JoinPath != nil {
+ return ctxt.JoinPath(path...)
+ }
+ return filepath.Join(path...)
+}
+
+// IsDir behaves like os.Stat plus IsDir,
+// but uses the build context's file system interface, if any.
+func IsDir(ctxt *build.Context, path string) bool {
+ if ctxt.IsDir != nil {
+ return ctxt.IsDir(path)
+ }
+ fi, err := os.Stat(path)
+ return err == nil && fi.IsDir()
+}
+
+// ReadDir behaves like ioutil.ReadDir,
+// but uses the build context's file system interface, if any.
+func ReadDir(ctxt *build.Context, path string) ([]os.FileInfo, error) {
+ if ctxt.ReadDir != nil {
+ return ctxt.ReadDir(path)
+ }
+ return ioutil.ReadDir(path)
+}
+
+// SplitPathList behaves like filepath.SplitList,
+// but uses the build context's file system interface, if any.
+func SplitPathList(ctxt *build.Context, s string) []string {
+ if ctxt.SplitPathList != nil {
+ return ctxt.SplitPathList(s)
+ }
+ return filepath.SplitList(s)
+}
+
+// sameFile returns true if x and y have the same basename and denote
+// the same file.
+//
+func sameFile(x, y string) bool {
+ if path.Clean(x) == path.Clean(y) {
+ return true
+ }
+ if filepath.Base(x) == filepath.Base(y) { // (optimisation)
+ if xi, err := os.Stat(x); err == nil {
+ if yi, err := os.Stat(y); err == nil {
+ return os.SameFile(xi, yi)
+ }
+ }
+ }
+ return false
+}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
new file mode 100644
index 00000000000..98b3987b974
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go
@@ -0,0 +1,109 @@
+// Copyright 2016 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 gcexportdata provides functions for locating, reading, and
+// writing export data files containing type information produced by the
+// gc compiler. This package supports go1.7 export data format and all
+// later versions.
+//
+// Although it might seem convenient for this package to live alongside
+// go/types in the standard library, this would cause version skew
+// problems for developer tools that use it, since they must be able to
+// consume the outputs of the gc compiler both before and after a Go
+// update such as from Go 1.7 to Go 1.8. Because this package lives in
+// golang.org/x/tools, sites can update their version of this repo some
+// time before the Go 1.8 release and rebuild and redeploy their
+// developer tools, which will then be able to consume both Go 1.7 and
+// Go 1.8 export data files, so they will work before and after the
+// Go update. (See discussion at https://golang.org/issue/15651.)
+//
+package gcexportdata // import "golang.org/x/tools/go/gcexportdata"
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "go/token"
+ "go/types"
+ "io"
+ "io/ioutil"
+
+ "golang.org/x/tools/go/internal/gcimporter"
+)
+
+// Find returns the name of an object (.o) or archive (.a) file
+// containing type information for the specified import path,
+// using the workspace layout conventions of go/build.
+// If no file was found, an empty filename is returned.
+//
+// A relative srcDir is interpreted relative to the current working directory.
+//
+// Find also returns the package's resolved (canonical) import path,
+// reflecting the effects of srcDir and vendoring on importPath.
+func Find(importPath, srcDir string) (filename, path string) {
+ return gcimporter.FindPkg(importPath, srcDir)
+}
+
+// NewReader returns a reader for the export data section of an object
+// (.o) or archive (.a) file read from r. The new reader may provide
+// additional trailing data beyond the end of the export data.
+func NewReader(r io.Reader) (io.Reader, error) {
+ buf := bufio.NewReader(r)
+ _, err := gcimporter.FindExportData(buf)
+ // If we ever switch to a zip-like archive format with the ToC
+ // at the end, we can return the correct portion of export data,
+ // but for now we must return the entire rest of the file.
+ return buf, err
+}
+
+// Read reads export data from in, decodes it, and returns type
+// information for the package.
+// The package name is specified by path.
+// File position information is added to fset.
+//
+// Read may inspect and add to the imports map to ensure that references
+// within the export data to other packages are consistent. The caller
+// must ensure that imports[path] does not exist, or exists but is
+// incomplete (see types.Package.Complete), and Read inserts the
+// resulting package into this map entry.
+//
+// On return, the state of the reader is undefined.
+func Read(in io.Reader, fset *token.FileSet, imports map[string]*types.Package, path string) (*types.Package, error) {
+ data, err := ioutil.ReadAll(in)
+ if err != nil {
+ return nil, fmt.Errorf("reading export data for %q: %v", path, err)
+ }
+
+ if bytes.HasPrefix(data, []byte("!")) {
+ return nil, fmt.Errorf("can't read export data for %q directly from an archive file (call gcexportdata.NewReader first to extract export data)", path)
+ }
+
+ // The App Engine Go runtime v1.6 uses the old export data format.
+ // TODO(adonovan): delete once v1.7 has been around for a while.
+ if bytes.HasPrefix(data, []byte("package ")) {
+ return gcimporter.ImportData(imports, path, path, bytes.NewReader(data))
+ }
+
+ // The indexed export format starts with an 'i'; the older
+ // binary export format starts with a 'c', 'd', or 'v'
+ // (from "version"). Select appropriate importer.
+ if len(data) > 0 && data[0] == 'i' {
+ _, pkg, err := gcimporter.IImportData(fset, imports, data[1:], path)
+ return pkg, err
+ }
+
+ _, pkg, err := gcimporter.BImportData(fset, imports, data, path)
+ return pkg, err
+}
+
+// Write writes encoded type information for the specified package to out.
+// The FileSet provides file position information for named objects.
+func Write(out io.Writer, fset *token.FileSet, pkg *types.Package) error {
+ b, err := gcimporter.BExportData(fset, pkg)
+ if err != nil {
+ return err
+ }
+ _, err = out.Write(b)
+ return err
+}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/importer.go b/vendor/golang.org/x/tools/go/gcexportdata/importer.go
new file mode 100644
index 00000000000..efe221e7e14
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/gcexportdata/importer.go
@@ -0,0 +1,73 @@
+// Copyright 2016 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 gcexportdata
+
+import (
+ "fmt"
+ "go/token"
+ "go/types"
+ "os"
+)
+
+// NewImporter returns a new instance of the types.Importer interface
+// that reads type information from export data files written by gc.
+// The Importer also satisfies types.ImporterFrom.
+//
+// Export data files are located using "go build" workspace conventions
+// and the build.Default context.
+//
+// Use this importer instead of go/importer.For("gc", ...) to avoid the
+// version-skew problems described in the documentation of this package,
+// or to control the FileSet or access the imports map populated during
+// package loading.
+//
+func NewImporter(fset *token.FileSet, imports map[string]*types.Package) types.ImporterFrom {
+ return importer{fset, imports}
+}
+
+type importer struct {
+ fset *token.FileSet
+ imports map[string]*types.Package
+}
+
+func (imp importer) Import(importPath string) (*types.Package, error) {
+ return imp.ImportFrom(importPath, "", 0)
+}
+
+func (imp importer) ImportFrom(importPath, srcDir string, mode types.ImportMode) (_ *types.Package, err error) {
+ filename, path := Find(importPath, srcDir)
+ if filename == "" {
+ if importPath == "unsafe" {
+ // Even for unsafe, call Find first in case
+ // the package was vendored.
+ return types.Unsafe, nil
+ }
+ return nil, fmt.Errorf("can't find import: %s", importPath)
+ }
+
+ if pkg, ok := imp.imports[path]; ok && pkg.Complete() {
+ return pkg, nil // cache hit
+ }
+
+ // open file
+ f, err := os.Open(filename)
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ f.Close()
+ if err != nil {
+ // add file name to error
+ err = fmt.Errorf("reading export data: %s: %v", filename, err)
+ }
+ }()
+
+ r, err := NewReader(f)
+ if err != nil {
+ return nil, err
+ }
+
+ return Read(r, imp.fset, imp.imports, path)
+}
diff --git a/vendor/golang.org/x/tools/go/gcexportdata/main.go b/vendor/golang.org/x/tools/go/gcexportdata/main.go
new file mode 100644
index 00000000000..2713dce64a9
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/gcexportdata/main.go
@@ -0,0 +1,99 @@
+// 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.
+
+// +build ignore
+
+// The gcexportdata command is a diagnostic tool that displays the
+// contents of gc export data files.
+package main
+
+import (
+ "flag"
+ "fmt"
+ "go/token"
+ "go/types"
+ "log"
+ "os"
+
+ "golang.org/x/tools/go/gcexportdata"
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+var packageFlag = flag.String("package", "", "alternative package to print")
+
+func main() {
+ log.SetPrefix("gcexportdata: ")
+ log.SetFlags(0)
+ flag.Usage = func() {
+ fmt.Fprintln(os.Stderr, "usage: gcexportdata [-package path] file.a")
+ }
+ flag.Parse()
+ if flag.NArg() != 1 {
+ flag.Usage()
+ os.Exit(2)
+ }
+ filename := flag.Args()[0]
+
+ f, err := os.Open(filename)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ r, err := gcexportdata.NewReader(f)
+ if err != nil {
+ log.Fatalf("%s: %s", filename, err)
+ }
+
+ // Decode the package.
+ const primary = ""
+ imports := make(map[string]*types.Package)
+ fset := token.NewFileSet()
+ pkg, err := gcexportdata.Read(r, fset, imports, primary)
+ if err != nil {
+ log.Fatalf("%s: %s", filename, err)
+ }
+
+ // Optionally select an indirectly mentioned package.
+ if *packageFlag != "" {
+ pkg = imports[*packageFlag]
+ if pkg == nil {
+ fmt.Fprintf(os.Stderr, "export data file %s does not mention %s; has:\n",
+ filename, *packageFlag)
+ for p := range imports {
+ if p != primary {
+ fmt.Fprintf(os.Stderr, "\t%s\n", p)
+ }
+ }
+ os.Exit(1)
+ }
+ }
+
+ // Print all package-level declarations, including non-exported ones.
+ fmt.Printf("package %s\n", pkg.Name())
+ for _, imp := range pkg.Imports() {
+ fmt.Printf("import %q\n", imp.Path())
+ }
+ qual := func(p *types.Package) string {
+ if pkg == p {
+ return ""
+ }
+ return p.Name()
+ }
+ scope := pkg.Scope()
+ for _, name := range scope.Names() {
+ obj := scope.Lookup(name)
+ fmt.Printf("%s: %s\n",
+ fset.Position(obj.Pos()),
+ types.ObjectString(obj, qual))
+
+ // For types, print each method.
+ if _, ok := obj.(*types.TypeName); ok {
+ for _, method := range typeutil.IntuitiveMethodSet(obj.Type(), nil) {
+ fmt.Printf("%s: %s\n",
+ fset.Position(method.Obj().Pos()),
+ types.SelectionString(method, qual))
+ }
+ }
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/internal/cgo/cgo.go b/vendor/golang.org/x/tools/go/internal/cgo/cgo.go
new file mode 100644
index 00000000000..0f652ea6fb5
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/cgo/cgo.go
@@ -0,0 +1,220 @@
+// 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 cgo
+
+// This file handles cgo preprocessing of files containing `import "C"`.
+//
+// DESIGN
+//
+// The approach taken is to run the cgo processor on the package's
+// CgoFiles and parse the output, faking the filenames of the
+// resulting ASTs so that the synthetic file containing the C types is
+// called "C" (e.g. "~/go/src/net/C") and the preprocessed files
+// have their original names (e.g. "~/go/src/net/cgo_unix.go"),
+// not the names of the actual temporary files.
+//
+// The advantage of this approach is its fidelity to 'go build'. The
+// downside is that the token.Position.Offset for each AST node is
+// incorrect, being an offset within the temporary file. Line numbers
+// should still be correct because of the //line comments.
+//
+// The logic of this file is mostly plundered from the 'go build'
+// tool, which also invokes the cgo preprocessor.
+//
+//
+// REJECTED ALTERNATIVE
+//
+// An alternative approach that we explored is to extend go/types'
+// Importer mechanism to provide the identity of the importing package
+// so that each time `import "C"` appears it resolves to a different
+// synthetic package containing just the objects needed in that case.
+// The loader would invoke cgo but parse only the cgo_types.go file
+// defining the package-level objects, discarding the other files
+// resulting from preprocessing.
+//
+// The benefit of this approach would have been that source-level
+// syntax information would correspond exactly to the original cgo
+// file, with no preprocessing involved, making source tools like
+// godoc, guru, and eg happy. However, the approach was rejected
+// due to the additional complexity it would impose on go/types. (It
+// made for a beautiful demo, though.)
+//
+// cgo files, despite their *.go extension, are not legal Go source
+// files per the specification since they may refer to unexported
+// members of package "C" such as C.int. Also, a function such as
+// C.getpwent has in effect two types, one matching its C type and one
+// which additionally returns (errno C.int). The cgo preprocessor
+// uses name mangling to distinguish these two functions in the
+// processed code, but go/types would need to duplicate this logic in
+// its handling of function calls, analogous to the treatment of map
+// lookups in which y=m[k] and y,ok=m[k] are both legal.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "regexp"
+ "strings"
+)
+
+// ProcessFiles invokes the cgo preprocessor on bp.CgoFiles, parses
+// the output and returns the resulting ASTs.
+//
+func ProcessFiles(bp *build.Package, fset *token.FileSet, DisplayPath func(path string) string, mode parser.Mode) ([]*ast.File, error) {
+ tmpdir, err := ioutil.TempDir("", strings.Replace(bp.ImportPath, "/", "_", -1)+"_C")
+ if err != nil {
+ return nil, err
+ }
+ defer os.RemoveAll(tmpdir)
+
+ pkgdir := bp.Dir
+ if DisplayPath != nil {
+ pkgdir = DisplayPath(pkgdir)
+ }
+
+ cgoFiles, cgoDisplayFiles, err := Run(bp, pkgdir, tmpdir, false)
+ if err != nil {
+ return nil, err
+ }
+ var files []*ast.File
+ for i := range cgoFiles {
+ rd, err := os.Open(cgoFiles[i])
+ if err != nil {
+ return nil, err
+ }
+ display := filepath.Join(bp.Dir, cgoDisplayFiles[i])
+ f, err := parser.ParseFile(fset, display, rd, mode)
+ rd.Close()
+ if err != nil {
+ return nil, err
+ }
+ files = append(files, f)
+ }
+ return files, nil
+}
+
+var cgoRe = regexp.MustCompile(`[/\\:]`)
+
+// Run invokes the cgo preprocessor on bp.CgoFiles and returns two
+// lists of files: the resulting processed files (in temporary
+// directory tmpdir) and the corresponding names of the unprocessed files.
+//
+// Run is adapted from (*builder).cgo in
+// $GOROOT/src/cmd/go/build.go, but these features are unsupported:
+// Objective C, CGOPKGPATH, CGO_FLAGS.
+//
+// If useabs is set to true, absolute paths of the bp.CgoFiles will be passed in
+// to the cgo preprocessor. This in turn will set the // line comments
+// referring to those files to use absolute paths. This is needed for
+// go/packages using the legacy go list support so it is able to find
+// the original files.
+func Run(bp *build.Package, pkgdir, tmpdir string, useabs bool) (files, displayFiles []string, err error) {
+ cgoCPPFLAGS, _, _, _ := cflags(bp, true)
+ _, cgoexeCFLAGS, _, _ := cflags(bp, false)
+
+ if len(bp.CgoPkgConfig) > 0 {
+ pcCFLAGS, err := pkgConfigFlags(bp)
+ if err != nil {
+ return nil, nil, err
+ }
+ cgoCPPFLAGS = append(cgoCPPFLAGS, pcCFLAGS...)
+ }
+
+ // Allows including _cgo_export.h from .[ch] files in the package.
+ cgoCPPFLAGS = append(cgoCPPFLAGS, "-I", tmpdir)
+
+ // _cgo_gotypes.go (displayed "C") contains the type definitions.
+ files = append(files, filepath.Join(tmpdir, "_cgo_gotypes.go"))
+ displayFiles = append(displayFiles, "C")
+ for _, fn := range bp.CgoFiles {
+ // "foo.cgo1.go" (displayed "foo.go") is the processed Go source.
+ f := cgoRe.ReplaceAllString(fn[:len(fn)-len("go")], "_")
+ files = append(files, filepath.Join(tmpdir, f+"cgo1.go"))
+ displayFiles = append(displayFiles, fn)
+ }
+
+ var cgoflags []string
+ if bp.Goroot && bp.ImportPath == "runtime/cgo" {
+ cgoflags = append(cgoflags, "-import_runtime_cgo=false")
+ }
+ if bp.Goroot && bp.ImportPath == "runtime/race" || bp.ImportPath == "runtime/cgo" {
+ cgoflags = append(cgoflags, "-import_syscall=false")
+ }
+
+ var cgoFiles []string = bp.CgoFiles
+ if useabs {
+ cgoFiles = make([]string, len(bp.CgoFiles))
+ for i := range cgoFiles {
+ cgoFiles[i] = filepath.Join(pkgdir, bp.CgoFiles[i])
+ }
+ }
+
+ args := stringList(
+ "go", "tool", "cgo", "-objdir", tmpdir, cgoflags, "--",
+ cgoCPPFLAGS, cgoexeCFLAGS, cgoFiles,
+ )
+ if false {
+ log.Printf("Running cgo for package %q: %s (dir=%s)", bp.ImportPath, args, pkgdir)
+ }
+ cmd := exec.Command(args[0], args[1:]...)
+ cmd.Dir = pkgdir
+ cmd.Stdout = os.Stderr
+ cmd.Stderr = os.Stderr
+ if err := cmd.Run(); err != nil {
+ return nil, nil, fmt.Errorf("cgo failed: %s: %s", args, err)
+ }
+
+ return files, displayFiles, nil
+}
+
+// -- unmodified from 'go build' ---------------------------------------
+
+// Return the flags to use when invoking the C or C++ compilers, or cgo.
+func cflags(p *build.Package, def bool) (cppflags, cflags, cxxflags, ldflags []string) {
+ var defaults string
+ if def {
+ defaults = "-g -O2"
+ }
+
+ cppflags = stringList(envList("CGO_CPPFLAGS", ""), p.CgoCPPFLAGS)
+ cflags = stringList(envList("CGO_CFLAGS", defaults), p.CgoCFLAGS)
+ cxxflags = stringList(envList("CGO_CXXFLAGS", defaults), p.CgoCXXFLAGS)
+ ldflags = stringList(envList("CGO_LDFLAGS", defaults), p.CgoLDFLAGS)
+ return
+}
+
+// envList returns the value of the given environment variable broken
+// into fields, using the default value when the variable is empty.
+func envList(key, def string) []string {
+ v := os.Getenv(key)
+ if v == "" {
+ v = def
+ }
+ return strings.Fields(v)
+}
+
+// stringList's arguments should be a sequence of string or []string values.
+// stringList flattens them into a single []string.
+func stringList(args ...interface{}) []string {
+ var x []string
+ for _, arg := range args {
+ switch arg := arg.(type) {
+ case []string:
+ x = append(x, arg...)
+ case string:
+ x = append(x, arg)
+ default:
+ panic("stringList: invalid argument")
+ }
+ }
+ return x
+}
diff --git a/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go b/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go
new file mode 100644
index 00000000000..b5bb95a63e5
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/cgo/cgo_pkgconfig.go
@@ -0,0 +1,39 @@
+// 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 cgo
+
+import (
+ "errors"
+ "fmt"
+ "go/build"
+ "os/exec"
+ "strings"
+)
+
+// pkgConfig runs pkg-config with the specified arguments and returns the flags it prints.
+func pkgConfig(mode string, pkgs []string) (flags []string, err error) {
+ cmd := exec.Command("pkg-config", append([]string{mode}, pkgs...)...)
+ out, err := cmd.CombinedOutput()
+ if err != nil {
+ s := fmt.Sprintf("%s failed: %v", strings.Join(cmd.Args, " "), err)
+ if len(out) > 0 {
+ s = fmt.Sprintf("%s: %s", s, out)
+ }
+ return nil, errors.New(s)
+ }
+ if len(out) > 0 {
+ flags = strings.Fields(string(out))
+ }
+ return
+}
+
+// pkgConfigFlags calls pkg-config if needed and returns the cflags
+// needed to build the package.
+func pkgConfigFlags(p *build.Package) (cflags []string, err error) {
+ if len(p.CgoPkgConfig) == 0 {
+ return nil, nil
+ }
+ return pkgConfig("--cflags", p.CgoPkgConfig)
+}
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go
new file mode 100644
index 00000000000..a807d0aaa28
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/bexport.go
@@ -0,0 +1,852 @@
+// Copyright 2016 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.
+
+// Binary package export.
+// This file was derived from $GOROOT/src/cmd/compile/internal/gc/bexport.go;
+// see that file for specification of the format.
+
+package gcimporter
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "math"
+ "math/big"
+ "sort"
+ "strings"
+)
+
+// If debugFormat is set, each integer and string value is preceded by a marker
+// and position information in the encoding. This mechanism permits an importer
+// to recognize immediately when it is out of sync. The importer recognizes this
+// mode automatically (i.e., it can import export data produced with debugging
+// support even if debugFormat is not set at the time of import). This mode will
+// lead to massively larger export data (by a factor of 2 to 3) and should only
+// be enabled during development and debugging.
+//
+// NOTE: This flag is the first flag to enable if importing dies because of
+// (suspected) format errors, and whenever a change is made to the format.
+const debugFormat = false // default: false
+
+// If trace is set, debugging output is printed to std out.
+const trace = false // default: false
+
+// Current export format version. Increase with each format change.
+// Note: The latest binary (non-indexed) export format is at version 6.
+// This exporter is still at level 4, but it doesn't matter since
+// the binary importer can handle older versions just fine.
+// 6: package height (CL 105038) -- NOT IMPLEMENTED HERE
+// 5: improved position encoding efficiency (issue 20080, CL 41619) -- NOT IMPLEMEMTED HERE
+// 4: type name objects support type aliases, uses aliasTag
+// 3: Go1.8 encoding (same as version 2, aliasTag defined but never used)
+// 2: removed unused bool in ODCL export (compiler only)
+// 1: header format change (more regular), export package for _ struct fields
+// 0: Go1.7 encoding
+const exportVersion = 4
+
+// trackAllTypes enables cycle tracking for all types, not just named
+// types. The existing compiler invariants assume that unnamed types
+// that are not completely set up are not used, or else there are spurious
+// errors.
+// If disabled, only named types are tracked, possibly leading to slightly
+// less efficient encoding in rare cases. It also prevents the export of
+// some corner-case type declarations (but those are not handled correctly
+// with with the textual export format either).
+// TODO(gri) enable and remove once issues caused by it are fixed
+const trackAllTypes = false
+
+type exporter struct {
+ fset *token.FileSet
+ out bytes.Buffer
+
+ // object -> index maps, indexed in order of serialization
+ strIndex map[string]int
+ pkgIndex map[*types.Package]int
+ typIndex map[types.Type]int
+
+ // position encoding
+ posInfoFormat bool
+ prevFile string
+ prevLine int
+
+ // debugging support
+ written int // bytes written
+ indent int // for trace
+}
+
+// internalError represents an error generated inside this package.
+type internalError string
+
+func (e internalError) Error() string { return "gcimporter: " + string(e) }
+
+func internalErrorf(format string, args ...interface{}) error {
+ return internalError(fmt.Sprintf(format, args...))
+}
+
+// BExportData returns binary export data for pkg.
+// If no file set is provided, position info will be missing.
+func BExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) {
+ defer func() {
+ if e := recover(); e != nil {
+ if ierr, ok := e.(internalError); ok {
+ err = ierr
+ return
+ }
+ // Not an internal error; panic again.
+ panic(e)
+ }
+ }()
+
+ p := exporter{
+ fset: fset,
+ strIndex: map[string]int{"": 0}, // empty string is mapped to 0
+ pkgIndex: make(map[*types.Package]int),
+ typIndex: make(map[types.Type]int),
+ posInfoFormat: true, // TODO(gri) might become a flag, eventually
+ }
+
+ // write version info
+ // The version string must start with "version %d" where %d is the version
+ // number. Additional debugging information may follow after a blank; that
+ // text is ignored by the importer.
+ p.rawStringln(fmt.Sprintf("version %d", exportVersion))
+ var debug string
+ if debugFormat {
+ debug = "debug"
+ }
+ p.rawStringln(debug) // cannot use p.bool since it's affected by debugFormat; also want to see this clearly
+ p.bool(trackAllTypes)
+ p.bool(p.posInfoFormat)
+
+ // --- generic export data ---
+
+ // populate type map with predeclared "known" types
+ for index, typ := range predeclared() {
+ p.typIndex[typ] = index
+ }
+ if len(p.typIndex) != len(predeclared()) {
+ return nil, internalError("duplicate entries in type map?")
+ }
+
+ // write package data
+ p.pkg(pkg, true)
+ if trace {
+ p.tracef("\n")
+ }
+
+ // write objects
+ objcount := 0
+ scope := pkg.Scope()
+ for _, name := range scope.Names() {
+ if !ast.IsExported(name) {
+ continue
+ }
+ if trace {
+ p.tracef("\n")
+ }
+ p.obj(scope.Lookup(name))
+ objcount++
+ }
+
+ // indicate end of list
+ if trace {
+ p.tracef("\n")
+ }
+ p.tag(endTag)
+
+ // for self-verification only (redundant)
+ p.int(objcount)
+
+ if trace {
+ p.tracef("\n")
+ }
+
+ // --- end of export data ---
+
+ return p.out.Bytes(), nil
+}
+
+func (p *exporter) pkg(pkg *types.Package, emptypath bool) {
+ if pkg == nil {
+ panic(internalError("unexpected nil pkg"))
+ }
+
+ // if we saw the package before, write its index (>= 0)
+ if i, ok := p.pkgIndex[pkg]; ok {
+ p.index('P', i)
+ return
+ }
+
+ // otherwise, remember the package, write the package tag (< 0) and package data
+ if trace {
+ p.tracef("P%d = { ", len(p.pkgIndex))
+ defer p.tracef("} ")
+ }
+ p.pkgIndex[pkg] = len(p.pkgIndex)
+
+ p.tag(packageTag)
+ p.string(pkg.Name())
+ if emptypath {
+ p.string("")
+ } else {
+ p.string(pkg.Path())
+ }
+}
+
+func (p *exporter) obj(obj types.Object) {
+ switch obj := obj.(type) {
+ case *types.Const:
+ p.tag(constTag)
+ p.pos(obj)
+ p.qualifiedName(obj)
+ p.typ(obj.Type())
+ p.value(obj.Val())
+
+ case *types.TypeName:
+ if obj.IsAlias() {
+ p.tag(aliasTag)
+ p.pos(obj)
+ p.qualifiedName(obj)
+ } else {
+ p.tag(typeTag)
+ }
+ p.typ(obj.Type())
+
+ case *types.Var:
+ p.tag(varTag)
+ p.pos(obj)
+ p.qualifiedName(obj)
+ p.typ(obj.Type())
+
+ case *types.Func:
+ p.tag(funcTag)
+ p.pos(obj)
+ p.qualifiedName(obj)
+ sig := obj.Type().(*types.Signature)
+ p.paramList(sig.Params(), sig.Variadic())
+ p.paramList(sig.Results(), false)
+
+ default:
+ panic(internalErrorf("unexpected object %v (%T)", obj, obj))
+ }
+}
+
+func (p *exporter) pos(obj types.Object) {
+ if !p.posInfoFormat {
+ return
+ }
+
+ file, line := p.fileLine(obj)
+ if file == p.prevFile {
+ // common case: write line delta
+ // delta == 0 means different file or no line change
+ delta := line - p.prevLine
+ p.int(delta)
+ if delta == 0 {
+ p.int(-1) // -1 means no file change
+ }
+ } else {
+ // different file
+ p.int(0)
+ // Encode filename as length of common prefix with previous
+ // filename, followed by (possibly empty) suffix. Filenames
+ // frequently share path prefixes, so this can save a lot
+ // of space and make export data size less dependent on file
+ // path length. The suffix is unlikely to be empty because
+ // file names tend to end in ".go".
+ n := commonPrefixLen(p.prevFile, file)
+ p.int(n) // n >= 0
+ p.string(file[n:]) // write suffix only
+ p.prevFile = file
+ p.int(line)
+ }
+ p.prevLine = line
+}
+
+func (p *exporter) fileLine(obj types.Object) (file string, line int) {
+ if p.fset != nil {
+ pos := p.fset.Position(obj.Pos())
+ file = pos.Filename
+ line = pos.Line
+ }
+ return
+}
+
+func commonPrefixLen(a, b string) int {
+ if len(a) > len(b) {
+ a, b = b, a
+ }
+ // len(a) <= len(b)
+ i := 0
+ for i < len(a) && a[i] == b[i] {
+ i++
+ }
+ return i
+}
+
+func (p *exporter) qualifiedName(obj types.Object) {
+ p.string(obj.Name())
+ p.pkg(obj.Pkg(), false)
+}
+
+func (p *exporter) typ(t types.Type) {
+ if t == nil {
+ panic(internalError("nil type"))
+ }
+
+ // Possible optimization: Anonymous pointer types *T where
+ // T is a named type are common. We could canonicalize all
+ // such types *T to a single type PT = *T. This would lead
+ // to at most one *T entry in typIndex, and all future *T's
+ // would be encoded as the respective index directly. Would
+ // save 1 byte (pointerTag) per *T and reduce the typIndex
+ // size (at the cost of a canonicalization map). We can do
+ // this later, without encoding format change.
+
+ // if we saw the type before, write its index (>= 0)
+ if i, ok := p.typIndex[t]; ok {
+ p.index('T', i)
+ return
+ }
+
+ // otherwise, remember the type, write the type tag (< 0) and type data
+ if trackAllTypes {
+ if trace {
+ p.tracef("T%d = {>\n", len(p.typIndex))
+ defer p.tracef("<\n} ")
+ }
+ p.typIndex[t] = len(p.typIndex)
+ }
+
+ switch t := t.(type) {
+ case *types.Named:
+ if !trackAllTypes {
+ // if we don't track all types, track named types now
+ p.typIndex[t] = len(p.typIndex)
+ }
+
+ p.tag(namedTag)
+ p.pos(t.Obj())
+ p.qualifiedName(t.Obj())
+ p.typ(t.Underlying())
+ if !types.IsInterface(t) {
+ p.assocMethods(t)
+ }
+
+ case *types.Array:
+ p.tag(arrayTag)
+ p.int64(t.Len())
+ p.typ(t.Elem())
+
+ case *types.Slice:
+ p.tag(sliceTag)
+ p.typ(t.Elem())
+
+ case *dddSlice:
+ p.tag(dddTag)
+ p.typ(t.elem)
+
+ case *types.Struct:
+ p.tag(structTag)
+ p.fieldList(t)
+
+ case *types.Pointer:
+ p.tag(pointerTag)
+ p.typ(t.Elem())
+
+ case *types.Signature:
+ p.tag(signatureTag)
+ p.paramList(t.Params(), t.Variadic())
+ p.paramList(t.Results(), false)
+
+ case *types.Interface:
+ p.tag(interfaceTag)
+ p.iface(t)
+
+ case *types.Map:
+ p.tag(mapTag)
+ p.typ(t.Key())
+ p.typ(t.Elem())
+
+ case *types.Chan:
+ p.tag(chanTag)
+ p.int(int(3 - t.Dir())) // hack
+ p.typ(t.Elem())
+
+ default:
+ panic(internalErrorf("unexpected type %T: %s", t, t))
+ }
+}
+
+func (p *exporter) assocMethods(named *types.Named) {
+ // Sort methods (for determinism).
+ var methods []*types.Func
+ for i := 0; i < named.NumMethods(); i++ {
+ methods = append(methods, named.Method(i))
+ }
+ sort.Sort(methodsByName(methods))
+
+ p.int(len(methods))
+
+ if trace && methods != nil {
+ p.tracef("associated methods {>\n")
+ }
+
+ for i, m := range methods {
+ if trace && i > 0 {
+ p.tracef("\n")
+ }
+
+ p.pos(m)
+ name := m.Name()
+ p.string(name)
+ if !exported(name) {
+ p.pkg(m.Pkg(), false)
+ }
+
+ sig := m.Type().(*types.Signature)
+ p.paramList(types.NewTuple(sig.Recv()), false)
+ p.paramList(sig.Params(), sig.Variadic())
+ p.paramList(sig.Results(), false)
+ p.int(0) // dummy value for go:nointerface pragma - ignored by importer
+ }
+
+ if trace && methods != nil {
+ p.tracef("<\n} ")
+ }
+}
+
+type methodsByName []*types.Func
+
+func (x methodsByName) Len() int { return len(x) }
+func (x methodsByName) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
+func (x methodsByName) Less(i, j int) bool { return x[i].Name() < x[j].Name() }
+
+func (p *exporter) fieldList(t *types.Struct) {
+ if trace && t.NumFields() > 0 {
+ p.tracef("fields {>\n")
+ defer p.tracef("<\n} ")
+ }
+
+ p.int(t.NumFields())
+ for i := 0; i < t.NumFields(); i++ {
+ if trace && i > 0 {
+ p.tracef("\n")
+ }
+ p.field(t.Field(i))
+ p.string(t.Tag(i))
+ }
+}
+
+func (p *exporter) field(f *types.Var) {
+ if !f.IsField() {
+ panic(internalError("field expected"))
+ }
+
+ p.pos(f)
+ p.fieldName(f)
+ p.typ(f.Type())
+}
+
+func (p *exporter) iface(t *types.Interface) {
+ // TODO(gri): enable importer to load embedded interfaces,
+ // then emit Embeddeds and ExplicitMethods separately here.
+ p.int(0)
+
+ n := t.NumMethods()
+ if trace && n > 0 {
+ p.tracef("methods {>\n")
+ defer p.tracef("<\n} ")
+ }
+ p.int(n)
+ for i := 0; i < n; i++ {
+ if trace && i > 0 {
+ p.tracef("\n")
+ }
+ p.method(t.Method(i))
+ }
+}
+
+func (p *exporter) method(m *types.Func) {
+ sig := m.Type().(*types.Signature)
+ if sig.Recv() == nil {
+ panic(internalError("method expected"))
+ }
+
+ p.pos(m)
+ p.string(m.Name())
+ if m.Name() != "_" && !ast.IsExported(m.Name()) {
+ p.pkg(m.Pkg(), false)
+ }
+
+ // interface method; no need to encode receiver.
+ p.paramList(sig.Params(), sig.Variadic())
+ p.paramList(sig.Results(), false)
+}
+
+func (p *exporter) fieldName(f *types.Var) {
+ name := f.Name()
+
+ if f.Anonymous() {
+ // anonymous field - we distinguish between 3 cases:
+ // 1) field name matches base type name and is exported
+ // 2) field name matches base type name and is not exported
+ // 3) field name doesn't match base type name (alias name)
+ bname := basetypeName(f.Type())
+ if name == bname {
+ if ast.IsExported(name) {
+ name = "" // 1) we don't need to know the field name or package
+ } else {
+ name = "?" // 2) use unexported name "?" to force package export
+ }
+ } else {
+ // 3) indicate alias and export name as is
+ // (this requires an extra "@" but this is a rare case)
+ p.string("@")
+ }
+ }
+
+ p.string(name)
+ if name != "" && !ast.IsExported(name) {
+ p.pkg(f.Pkg(), false)
+ }
+}
+
+func basetypeName(typ types.Type) string {
+ switch typ := deref(typ).(type) {
+ case *types.Basic:
+ return typ.Name()
+ case *types.Named:
+ return typ.Obj().Name()
+ default:
+ return "" // unnamed type
+ }
+}
+
+func (p *exporter) paramList(params *types.Tuple, variadic bool) {
+ // use negative length to indicate unnamed parameters
+ // (look at the first parameter only since either all
+ // names are present or all are absent)
+ n := params.Len()
+ if n > 0 && params.At(0).Name() == "" {
+ n = -n
+ }
+ p.int(n)
+ for i := 0; i < params.Len(); i++ {
+ q := params.At(i)
+ t := q.Type()
+ if variadic && i == params.Len()-1 {
+ t = &dddSlice{t.(*types.Slice).Elem()}
+ }
+ p.typ(t)
+ if n > 0 {
+ name := q.Name()
+ p.string(name)
+ if name != "_" {
+ p.pkg(q.Pkg(), false)
+ }
+ }
+ p.string("") // no compiler-specific info
+ }
+}
+
+func (p *exporter) value(x constant.Value) {
+ if trace {
+ p.tracef("= ")
+ }
+
+ switch x.Kind() {
+ case constant.Bool:
+ tag := falseTag
+ if constant.BoolVal(x) {
+ tag = trueTag
+ }
+ p.tag(tag)
+
+ case constant.Int:
+ if v, exact := constant.Int64Val(x); exact {
+ // common case: x fits into an int64 - use compact encoding
+ p.tag(int64Tag)
+ p.int64(v)
+ return
+ }
+ // uncommon case: large x - use float encoding
+ // (powers of 2 will be encoded efficiently with exponent)
+ p.tag(floatTag)
+ p.float(constant.ToFloat(x))
+
+ case constant.Float:
+ p.tag(floatTag)
+ p.float(x)
+
+ case constant.Complex:
+ p.tag(complexTag)
+ p.float(constant.Real(x))
+ p.float(constant.Imag(x))
+
+ case constant.String:
+ p.tag(stringTag)
+ p.string(constant.StringVal(x))
+
+ case constant.Unknown:
+ // package contains type errors
+ p.tag(unknownTag)
+
+ default:
+ panic(internalErrorf("unexpected value %v (%T)", x, x))
+ }
+}
+
+func (p *exporter) float(x constant.Value) {
+ if x.Kind() != constant.Float {
+ panic(internalErrorf("unexpected constant %v, want float", x))
+ }
+ // extract sign (there is no -0)
+ sign := constant.Sign(x)
+ if sign == 0 {
+ // x == 0
+ p.int(0)
+ return
+ }
+ // x != 0
+
+ var f big.Float
+ if v, exact := constant.Float64Val(x); exact {
+ // float64
+ f.SetFloat64(v)
+ } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int {
+ // TODO(gri): add big.Rat accessor to constant.Value.
+ r := valueToRat(num)
+ f.SetRat(r.Quo(r, valueToRat(denom)))
+ } else {
+ // Value too large to represent as a fraction => inaccessible.
+ // TODO(gri): add big.Float accessor to constant.Value.
+ f.SetFloat64(math.MaxFloat64) // FIXME
+ }
+
+ // extract exponent such that 0.5 <= m < 1.0
+ var m big.Float
+ exp := f.MantExp(&m)
+
+ // extract mantissa as *big.Int
+ // - set exponent large enough so mant satisfies mant.IsInt()
+ // - get *big.Int from mant
+ m.SetMantExp(&m, int(m.MinPrec()))
+ mant, acc := m.Int(nil)
+ if acc != big.Exact {
+ panic(internalError("internal error"))
+ }
+
+ p.int(sign)
+ p.int(exp)
+ p.string(string(mant.Bytes()))
+}
+
+func valueToRat(x constant.Value) *big.Rat {
+ // Convert little-endian to big-endian.
+ // I can't believe this is necessary.
+ bytes := constant.Bytes(x)
+ for i := 0; i < len(bytes)/2; i++ {
+ bytes[i], bytes[len(bytes)-1-i] = bytes[len(bytes)-1-i], bytes[i]
+ }
+ return new(big.Rat).SetInt(new(big.Int).SetBytes(bytes))
+}
+
+func (p *exporter) bool(b bool) bool {
+ if trace {
+ p.tracef("[")
+ defer p.tracef("= %v] ", b)
+ }
+
+ x := 0
+ if b {
+ x = 1
+ }
+ p.int(x)
+ return b
+}
+
+// ----------------------------------------------------------------------------
+// Low-level encoders
+
+func (p *exporter) index(marker byte, index int) {
+ if index < 0 {
+ panic(internalError("invalid index < 0"))
+ }
+ if debugFormat {
+ p.marker('t')
+ }
+ if trace {
+ p.tracef("%c%d ", marker, index)
+ }
+ p.rawInt64(int64(index))
+}
+
+func (p *exporter) tag(tag int) {
+ if tag >= 0 {
+ panic(internalError("invalid tag >= 0"))
+ }
+ if debugFormat {
+ p.marker('t')
+ }
+ if trace {
+ p.tracef("%s ", tagString[-tag])
+ }
+ p.rawInt64(int64(tag))
+}
+
+func (p *exporter) int(x int) {
+ p.int64(int64(x))
+}
+
+func (p *exporter) int64(x int64) {
+ if debugFormat {
+ p.marker('i')
+ }
+ if trace {
+ p.tracef("%d ", x)
+ }
+ p.rawInt64(x)
+}
+
+func (p *exporter) string(s string) {
+ if debugFormat {
+ p.marker('s')
+ }
+ if trace {
+ p.tracef("%q ", s)
+ }
+ // if we saw the string before, write its index (>= 0)
+ // (the empty string is mapped to 0)
+ if i, ok := p.strIndex[s]; ok {
+ p.rawInt64(int64(i))
+ return
+ }
+ // otherwise, remember string and write its negative length and bytes
+ p.strIndex[s] = len(p.strIndex)
+ p.rawInt64(-int64(len(s)))
+ for i := 0; i < len(s); i++ {
+ p.rawByte(s[i])
+ }
+}
+
+// marker emits a marker byte and position information which makes
+// it easy for a reader to detect if it is "out of sync". Used for
+// debugFormat format only.
+func (p *exporter) marker(m byte) {
+ p.rawByte(m)
+ // Enable this for help tracking down the location
+ // of an incorrect marker when running in debugFormat.
+ if false && trace {
+ p.tracef("#%d ", p.written)
+ }
+ p.rawInt64(int64(p.written))
+}
+
+// rawInt64 should only be used by low-level encoders.
+func (p *exporter) rawInt64(x int64) {
+ var tmp [binary.MaxVarintLen64]byte
+ n := binary.PutVarint(tmp[:], x)
+ for i := 0; i < n; i++ {
+ p.rawByte(tmp[i])
+ }
+}
+
+// rawStringln should only be used to emit the initial version string.
+func (p *exporter) rawStringln(s string) {
+ for i := 0; i < len(s); i++ {
+ p.rawByte(s[i])
+ }
+ p.rawByte('\n')
+}
+
+// rawByte is the bottleneck interface to write to p.out.
+// rawByte escapes b as follows (any encoding does that
+// hides '$'):
+//
+// '$' => '|' 'S'
+// '|' => '|' '|'
+//
+// Necessary so other tools can find the end of the
+// export data by searching for "$$".
+// rawByte should only be used by low-level encoders.
+func (p *exporter) rawByte(b byte) {
+ switch b {
+ case '$':
+ // write '$' as '|' 'S'
+ b = 'S'
+ fallthrough
+ case '|':
+ // write '|' as '|' '|'
+ p.out.WriteByte('|')
+ p.written++
+ }
+ p.out.WriteByte(b)
+ p.written++
+}
+
+// tracef is like fmt.Printf but it rewrites the format string
+// to take care of indentation.
+func (p *exporter) tracef(format string, args ...interface{}) {
+ if strings.ContainsAny(format, "<>\n") {
+ var buf bytes.Buffer
+ for i := 0; i < len(format); i++ {
+ // no need to deal with runes
+ ch := format[i]
+ switch ch {
+ case '>':
+ p.indent++
+ continue
+ case '<':
+ p.indent--
+ continue
+ }
+ buf.WriteByte(ch)
+ if ch == '\n' {
+ for j := p.indent; j > 0; j-- {
+ buf.WriteString(". ")
+ }
+ }
+ }
+ format = buf.String()
+ }
+ fmt.Printf(format, args...)
+}
+
+// Debugging support.
+// (tagString is only used when tracing is enabled)
+var tagString = [...]string{
+ // Packages
+ -packageTag: "package",
+
+ // Types
+ -namedTag: "named type",
+ -arrayTag: "array",
+ -sliceTag: "slice",
+ -dddTag: "ddd",
+ -structTag: "struct",
+ -pointerTag: "pointer",
+ -signatureTag: "signature",
+ -interfaceTag: "interface",
+ -mapTag: "map",
+ -chanTag: "chan",
+
+ // Values
+ -falseTag: "false",
+ -trueTag: "true",
+ -int64Tag: "int64",
+ -floatTag: "float",
+ -fractionTag: "fraction",
+ -complexTag: "complex",
+ -stringTag: "string",
+ -unknownTag: "unknown",
+
+ // Type aliases
+ -aliasTag: "alias",
+}
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go
new file mode 100644
index 00000000000..e3c31078251
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/bimport.go
@@ -0,0 +1,1036 @@
+// 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.
+
+// This file is a copy of $GOROOT/src/go/internal/gcimporter/bimport.go.
+
+package gcimporter
+
+import (
+ "encoding/binary"
+ "fmt"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ "unicode"
+ "unicode/utf8"
+)
+
+type importer struct {
+ imports map[string]*types.Package
+ data []byte
+ importpath string
+ buf []byte // for reading strings
+ version int // export format version
+
+ // object lists
+ strList []string // in order of appearance
+ pathList []string // in order of appearance
+ pkgList []*types.Package // in order of appearance
+ typList []types.Type // in order of appearance
+ interfaceList []*types.Interface // for delayed completion only
+ trackAllTypes bool
+
+ // position encoding
+ posInfoFormat bool
+ prevFile string
+ prevLine int
+ fake fakeFileSet
+
+ // debugging support
+ debugFormat bool
+ read int // bytes read
+}
+
+// BImportData imports a package from the serialized package data
+// and returns the number of bytes consumed and a reference to the package.
+// If the export data version is not recognized or the format is otherwise
+// compromised, an error is returned.
+func BImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) {
+ // catch panics and return them as errors
+ const currentVersion = 6
+ version := -1 // unknown version
+ defer func() {
+ if e := recover(); e != nil {
+ // Return a (possibly nil or incomplete) package unchanged (see #16088).
+ if version > currentVersion {
+ err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e)
+ } else {
+ err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e)
+ }
+ }
+ }()
+
+ p := importer{
+ imports: imports,
+ data: data,
+ importpath: path,
+ version: version,
+ strList: []string{""}, // empty string is mapped to 0
+ pathList: []string{""}, // empty string is mapped to 0
+ fake: fakeFileSet{
+ fset: fset,
+ files: make(map[string]*token.File),
+ },
+ }
+
+ // read version info
+ var versionstr string
+ if b := p.rawByte(); b == 'c' || b == 'd' {
+ // Go1.7 encoding; first byte encodes low-level
+ // encoding format (compact vs debug).
+ // For backward-compatibility only (avoid problems with
+ // old installed packages). Newly compiled packages use
+ // the extensible format string.
+ // TODO(gri) Remove this support eventually; after Go1.8.
+ if b == 'd' {
+ p.debugFormat = true
+ }
+ p.trackAllTypes = p.rawByte() == 'a'
+ p.posInfoFormat = p.int() != 0
+ versionstr = p.string()
+ if versionstr == "v1" {
+ version = 0
+ }
+ } else {
+ // Go1.8 extensible encoding
+ // read version string and extract version number (ignore anything after the version number)
+ versionstr = p.rawStringln(b)
+ if s := strings.SplitN(versionstr, " ", 3); len(s) >= 2 && s[0] == "version" {
+ if v, err := strconv.Atoi(s[1]); err == nil && v > 0 {
+ version = v
+ }
+ }
+ }
+ p.version = version
+
+ // read version specific flags - extend as necessary
+ switch p.version {
+ // case currentVersion:
+ // ...
+ // fallthrough
+ case currentVersion, 5, 4, 3, 2, 1:
+ p.debugFormat = p.rawStringln(p.rawByte()) == "debug"
+ p.trackAllTypes = p.int() != 0
+ p.posInfoFormat = p.int() != 0
+ case 0:
+ // Go1.7 encoding format - nothing to do here
+ default:
+ errorf("unknown bexport format version %d (%q)", p.version, versionstr)
+ }
+
+ // --- generic export data ---
+
+ // populate typList with predeclared "known" types
+ p.typList = append(p.typList, predeclared()...)
+
+ // read package data
+ pkg = p.pkg()
+
+ // read objects of phase 1 only (see cmd/compile/internal/gc/bexport.go)
+ objcount := 0
+ for {
+ tag := p.tagOrIndex()
+ if tag == endTag {
+ break
+ }
+ p.obj(tag)
+ objcount++
+ }
+
+ // self-verification
+ if count := p.int(); count != objcount {
+ errorf("got %d objects; want %d", objcount, count)
+ }
+
+ // ignore compiler-specific import data
+
+ // complete interfaces
+ // TODO(gri) re-investigate if we still need to do this in a delayed fashion
+ for _, typ := range p.interfaceList {
+ typ.Complete()
+ }
+
+ // record all referenced packages as imports
+ list := append(([]*types.Package)(nil), p.pkgList[1:]...)
+ sort.Sort(byPath(list))
+ pkg.SetImports(list)
+
+ // package was imported completely and without errors
+ pkg.MarkComplete()
+
+ return p.read, pkg, nil
+}
+
+func errorf(format string, args ...interface{}) {
+ panic(fmt.Sprintf(format, args...))
+}
+
+func (p *importer) pkg() *types.Package {
+ // if the package was seen before, i is its index (>= 0)
+ i := p.tagOrIndex()
+ if i >= 0 {
+ return p.pkgList[i]
+ }
+
+ // otherwise, i is the package tag (< 0)
+ if i != packageTag {
+ errorf("unexpected package tag %d version %d", i, p.version)
+ }
+
+ // read package data
+ name := p.string()
+ var path string
+ if p.version >= 5 {
+ path = p.path()
+ } else {
+ path = p.string()
+ }
+ if p.version >= 6 {
+ p.int() // package height; unused by go/types
+ }
+
+ // we should never see an empty package name
+ if name == "" {
+ errorf("empty package name in import")
+ }
+
+ // an empty path denotes the package we are currently importing;
+ // it must be the first package we see
+ if (path == "") != (len(p.pkgList) == 0) {
+ errorf("package path %q for pkg index %d", path, len(p.pkgList))
+ }
+
+ // if the package was imported before, use that one; otherwise create a new one
+ if path == "" {
+ path = p.importpath
+ }
+ pkg := p.imports[path]
+ if pkg == nil {
+ pkg = types.NewPackage(path, name)
+ p.imports[path] = pkg
+ } else if pkg.Name() != name {
+ errorf("conflicting names %s and %s for package %q", pkg.Name(), name, path)
+ }
+ p.pkgList = append(p.pkgList, pkg)
+
+ return pkg
+}
+
+// objTag returns the tag value for each object kind.
+func objTag(obj types.Object) int {
+ switch obj.(type) {
+ case *types.Const:
+ return constTag
+ case *types.TypeName:
+ return typeTag
+ case *types.Var:
+ return varTag
+ case *types.Func:
+ return funcTag
+ default:
+ errorf("unexpected object: %v (%T)", obj, obj) // panics
+ panic("unreachable")
+ }
+}
+
+func sameObj(a, b types.Object) bool {
+ // Because unnamed types are not canonicalized, we cannot simply compare types for
+ // (pointer) identity.
+ // Ideally we'd check equality of constant values as well, but this is good enough.
+ return objTag(a) == objTag(b) && types.Identical(a.Type(), b.Type())
+}
+
+func (p *importer) declare(obj types.Object) {
+ pkg := obj.Pkg()
+ if alt := pkg.Scope().Insert(obj); alt != nil {
+ // This can only trigger if we import a (non-type) object a second time.
+ // Excluding type aliases, this cannot happen because 1) we only import a package
+ // once; and b) we ignore compiler-specific export data which may contain
+ // functions whose inlined function bodies refer to other functions that
+ // were already imported.
+ // However, type aliases require reexporting the original type, so we need
+ // to allow it (see also the comment in cmd/compile/internal/gc/bimport.go,
+ // method importer.obj, switch case importing functions).
+ // TODO(gri) review/update this comment once the gc compiler handles type aliases.
+ if !sameObj(obj, alt) {
+ errorf("inconsistent import:\n\t%v\npreviously imported as:\n\t%v\n", obj, alt)
+ }
+ }
+}
+
+func (p *importer) obj(tag int) {
+ switch tag {
+ case constTag:
+ pos := p.pos()
+ pkg, name := p.qualifiedName()
+ typ := p.typ(nil, nil)
+ val := p.value()
+ p.declare(types.NewConst(pos, pkg, name, typ, val))
+
+ case aliasTag:
+ // TODO(gri) verify type alias hookup is correct
+ pos := p.pos()
+ pkg, name := p.qualifiedName()
+ typ := p.typ(nil, nil)
+ p.declare(types.NewTypeName(pos, pkg, name, typ))
+
+ case typeTag:
+ p.typ(nil, nil)
+
+ case varTag:
+ pos := p.pos()
+ pkg, name := p.qualifiedName()
+ typ := p.typ(nil, nil)
+ p.declare(types.NewVar(pos, pkg, name, typ))
+
+ case funcTag:
+ pos := p.pos()
+ pkg, name := p.qualifiedName()
+ params, isddd := p.paramList()
+ result, _ := p.paramList()
+ sig := types.NewSignature(nil, params, result, isddd)
+ p.declare(types.NewFunc(pos, pkg, name, sig))
+
+ default:
+ errorf("unexpected object tag %d", tag)
+ }
+}
+
+const deltaNewFile = -64 // see cmd/compile/internal/gc/bexport.go
+
+func (p *importer) pos() token.Pos {
+ if !p.posInfoFormat {
+ return token.NoPos
+ }
+
+ file := p.prevFile
+ line := p.prevLine
+ delta := p.int()
+ line += delta
+ if p.version >= 5 {
+ if delta == deltaNewFile {
+ if n := p.int(); n >= 0 {
+ // file changed
+ file = p.path()
+ line = n
+ }
+ }
+ } else {
+ if delta == 0 {
+ if n := p.int(); n >= 0 {
+ // file changed
+ file = p.prevFile[:n] + p.string()
+ line = p.int()
+ }
+ }
+ }
+ p.prevFile = file
+ p.prevLine = line
+
+ return p.fake.pos(file, line)
+}
+
+// Synthesize a token.Pos
+type fakeFileSet struct {
+ fset *token.FileSet
+ files map[string]*token.File
+}
+
+func (s *fakeFileSet) pos(file string, line int) token.Pos {
+ // Since we don't know the set of needed file positions, we
+ // reserve maxlines positions per file.
+ const maxlines = 64 * 1024
+ f := s.files[file]
+ if f == nil {
+ f = s.fset.AddFile(file, -1, maxlines)
+ s.files[file] = f
+ // Allocate the fake linebreak indices on first use.
+ // TODO(adonovan): opt: save ~512KB using a more complex scheme?
+ fakeLinesOnce.Do(func() {
+ fakeLines = make([]int, maxlines)
+ for i := range fakeLines {
+ fakeLines[i] = i
+ }
+ })
+ f.SetLines(fakeLines)
+ }
+
+ if line > maxlines {
+ line = 1
+ }
+
+ // Treat the file as if it contained only newlines
+ // and column=1: use the line number as the offset.
+ return f.Pos(line - 1)
+}
+
+var (
+ fakeLines []int
+ fakeLinesOnce sync.Once
+)
+
+func (p *importer) qualifiedName() (pkg *types.Package, name string) {
+ name = p.string()
+ pkg = p.pkg()
+ return
+}
+
+func (p *importer) record(t types.Type) {
+ p.typList = append(p.typList, t)
+}
+
+// A dddSlice is a types.Type representing ...T parameters.
+// It only appears for parameter types and does not escape
+// the importer.
+type dddSlice struct {
+ elem types.Type
+}
+
+func (t *dddSlice) Underlying() types.Type { return t }
+func (t *dddSlice) String() string { return "..." + t.elem.String() }
+
+// parent is the package which declared the type; parent == nil means
+// the package currently imported. The parent package is needed for
+// exported struct fields and interface methods which don't contain
+// explicit package information in the export data.
+//
+// A non-nil tname is used as the "owner" of the result type; i.e.,
+// the result type is the underlying type of tname. tname is used
+// to give interface methods a named receiver type where possible.
+func (p *importer) typ(parent *types.Package, tname *types.Named) types.Type {
+ // if the type was seen before, i is its index (>= 0)
+ i := p.tagOrIndex()
+ if i >= 0 {
+ return p.typList[i]
+ }
+
+ // otherwise, i is the type tag (< 0)
+ switch i {
+ case namedTag:
+ // read type object
+ pos := p.pos()
+ parent, name := p.qualifiedName()
+ scope := parent.Scope()
+ obj := scope.Lookup(name)
+
+ // if the object doesn't exist yet, create and insert it
+ if obj == nil {
+ obj = types.NewTypeName(pos, parent, name, nil)
+ scope.Insert(obj)
+ }
+
+ if _, ok := obj.(*types.TypeName); !ok {
+ errorf("pkg = %s, name = %s => %s", parent, name, obj)
+ }
+
+ // associate new named type with obj if it doesn't exist yet
+ t0 := types.NewNamed(obj.(*types.TypeName), nil, nil)
+
+ // but record the existing type, if any
+ tname := obj.Type().(*types.Named) // tname is either t0 or the existing type
+ p.record(tname)
+
+ // read underlying type
+ t0.SetUnderlying(p.typ(parent, t0))
+
+ // interfaces don't have associated methods
+ if types.IsInterface(t0) {
+ return tname
+ }
+
+ // read associated methods
+ for i := p.int(); i > 0; i-- {
+ // TODO(gri) replace this with something closer to fieldName
+ pos := p.pos()
+ name := p.string()
+ if !exported(name) {
+ p.pkg()
+ }
+
+ recv, _ := p.paramList() // TODO(gri) do we need a full param list for the receiver?
+ params, isddd := p.paramList()
+ result, _ := p.paramList()
+ p.int() // go:nointerface pragma - discarded
+
+ sig := types.NewSignature(recv.At(0), params, result, isddd)
+ t0.AddMethod(types.NewFunc(pos, parent, name, sig))
+ }
+
+ return tname
+
+ case arrayTag:
+ t := new(types.Array)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ n := p.int64()
+ *t = *types.NewArray(p.typ(parent, nil), n)
+ return t
+
+ case sliceTag:
+ t := new(types.Slice)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ *t = *types.NewSlice(p.typ(parent, nil))
+ return t
+
+ case dddTag:
+ t := new(dddSlice)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ t.elem = p.typ(parent, nil)
+ return t
+
+ case structTag:
+ t := new(types.Struct)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ *t = *types.NewStruct(p.fieldList(parent))
+ return t
+
+ case pointerTag:
+ t := new(types.Pointer)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ *t = *types.NewPointer(p.typ(parent, nil))
+ return t
+
+ case signatureTag:
+ t := new(types.Signature)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ params, isddd := p.paramList()
+ result, _ := p.paramList()
+ *t = *types.NewSignature(nil, params, result, isddd)
+ return t
+
+ case interfaceTag:
+ // Create a dummy entry in the type list. This is safe because we
+ // cannot expect the interface type to appear in a cycle, as any
+ // such cycle must contain a named type which would have been
+ // first defined earlier.
+ // TODO(gri) Is this still true now that we have type aliases?
+ // See issue #23225.
+ n := len(p.typList)
+ if p.trackAllTypes {
+ p.record(nil)
+ }
+
+ var embeddeds []types.Type
+ for n := p.int(); n > 0; n-- {
+ p.pos()
+ embeddeds = append(embeddeds, p.typ(parent, nil))
+ }
+
+ t := newInterface(p.methodList(parent, tname), embeddeds)
+ p.interfaceList = append(p.interfaceList, t)
+ if p.trackAllTypes {
+ p.typList[n] = t
+ }
+ return t
+
+ case mapTag:
+ t := new(types.Map)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ key := p.typ(parent, nil)
+ val := p.typ(parent, nil)
+ *t = *types.NewMap(key, val)
+ return t
+
+ case chanTag:
+ t := new(types.Chan)
+ if p.trackAllTypes {
+ p.record(t)
+ }
+
+ dir := chanDir(p.int())
+ val := p.typ(parent, nil)
+ *t = *types.NewChan(dir, val)
+ return t
+
+ default:
+ errorf("unexpected type tag %d", i) // panics
+ panic("unreachable")
+ }
+}
+
+func chanDir(d int) types.ChanDir {
+ // tag values must match the constants in cmd/compile/internal/gc/go.go
+ switch d {
+ case 1 /* Crecv */ :
+ return types.RecvOnly
+ case 2 /* Csend */ :
+ return types.SendOnly
+ case 3 /* Cboth */ :
+ return types.SendRecv
+ default:
+ errorf("unexpected channel dir %d", d)
+ return 0
+ }
+}
+
+func (p *importer) fieldList(parent *types.Package) (fields []*types.Var, tags []string) {
+ if n := p.int(); n > 0 {
+ fields = make([]*types.Var, n)
+ tags = make([]string, n)
+ for i := range fields {
+ fields[i], tags[i] = p.field(parent)
+ }
+ }
+ return
+}
+
+func (p *importer) field(parent *types.Package) (*types.Var, string) {
+ pos := p.pos()
+ pkg, name, alias := p.fieldName(parent)
+ typ := p.typ(parent, nil)
+ tag := p.string()
+
+ anonymous := false
+ if name == "" {
+ // anonymous field - typ must be T or *T and T must be a type name
+ switch typ := deref(typ).(type) {
+ case *types.Basic: // basic types are named types
+ pkg = nil // // objects defined in Universe scope have no package
+ name = typ.Name()
+ case *types.Named:
+ name = typ.Obj().Name()
+ default:
+ errorf("named base type expected")
+ }
+ anonymous = true
+ } else if alias {
+ // anonymous field: we have an explicit name because it's an alias
+ anonymous = true
+ }
+
+ return types.NewField(pos, pkg, name, typ, anonymous), tag
+}
+
+func (p *importer) methodList(parent *types.Package, baseType *types.Named) (methods []*types.Func) {
+ if n := p.int(); n > 0 {
+ methods = make([]*types.Func, n)
+ for i := range methods {
+ methods[i] = p.method(parent, baseType)
+ }
+ }
+ return
+}
+
+func (p *importer) method(parent *types.Package, baseType *types.Named) *types.Func {
+ pos := p.pos()
+ pkg, name, _ := p.fieldName(parent)
+ // If we don't have a baseType, use a nil receiver.
+ // A receiver using the actual interface type (which
+ // we don't know yet) will be filled in when we call
+ // types.Interface.Complete.
+ var recv *types.Var
+ if baseType != nil {
+ recv = types.NewVar(token.NoPos, parent, "", baseType)
+ }
+ params, isddd := p.paramList()
+ result, _ := p.paramList()
+ sig := types.NewSignature(recv, params, result, isddd)
+ return types.NewFunc(pos, pkg, name, sig)
+}
+
+func (p *importer) fieldName(parent *types.Package) (pkg *types.Package, name string, alias bool) {
+ name = p.string()
+ pkg = parent
+ if pkg == nil {
+ // use the imported package instead
+ pkg = p.pkgList[0]
+ }
+ if p.version == 0 && name == "_" {
+ // version 0 didn't export a package for _ fields
+ return
+ }
+ switch name {
+ case "":
+ // 1) field name matches base type name and is exported: nothing to do
+ case "?":
+ // 2) field name matches base type name and is not exported: need package
+ name = ""
+ pkg = p.pkg()
+ case "@":
+ // 3) field name doesn't match type name (alias)
+ name = p.string()
+ alias = true
+ fallthrough
+ default:
+ if !exported(name) {
+ pkg = p.pkg()
+ }
+ }
+ return
+}
+
+func (p *importer) paramList() (*types.Tuple, bool) {
+ n := p.int()
+ if n == 0 {
+ return nil, false
+ }
+ // negative length indicates unnamed parameters
+ named := true
+ if n < 0 {
+ n = -n
+ named = false
+ }
+ // n > 0
+ params := make([]*types.Var, n)
+ isddd := false
+ for i := range params {
+ params[i], isddd = p.param(named)
+ }
+ return types.NewTuple(params...), isddd
+}
+
+func (p *importer) param(named bool) (*types.Var, bool) {
+ t := p.typ(nil, nil)
+ td, isddd := t.(*dddSlice)
+ if isddd {
+ t = types.NewSlice(td.elem)
+ }
+
+ var pkg *types.Package
+ var name string
+ if named {
+ name = p.string()
+ if name == "" {
+ errorf("expected named parameter")
+ }
+ if name != "_" {
+ pkg = p.pkg()
+ }
+ if i := strings.Index(name, "·"); i > 0 {
+ name = name[:i] // cut off gc-specific parameter numbering
+ }
+ }
+
+ // read and discard compiler-specific info
+ p.string()
+
+ return types.NewVar(token.NoPos, pkg, name, t), isddd
+}
+
+func exported(name string) bool {
+ ch, _ := utf8.DecodeRuneInString(name)
+ return unicode.IsUpper(ch)
+}
+
+func (p *importer) value() constant.Value {
+ switch tag := p.tagOrIndex(); tag {
+ case falseTag:
+ return constant.MakeBool(false)
+ case trueTag:
+ return constant.MakeBool(true)
+ case int64Tag:
+ return constant.MakeInt64(p.int64())
+ case floatTag:
+ return p.float()
+ case complexTag:
+ re := p.float()
+ im := p.float()
+ return constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
+ case stringTag:
+ return constant.MakeString(p.string())
+ case unknownTag:
+ return constant.MakeUnknown()
+ default:
+ errorf("unexpected value tag %d", tag) // panics
+ panic("unreachable")
+ }
+}
+
+func (p *importer) float() constant.Value {
+ sign := p.int()
+ if sign == 0 {
+ return constant.MakeInt64(0)
+ }
+
+ exp := p.int()
+ mant := []byte(p.string()) // big endian
+
+ // remove leading 0's if any
+ for len(mant) > 0 && mant[0] == 0 {
+ mant = mant[1:]
+ }
+
+ // convert to little endian
+ // TODO(gri) go/constant should have a more direct conversion function
+ // (e.g., once it supports a big.Float based implementation)
+ for i, j := 0, len(mant)-1; i < j; i, j = i+1, j-1 {
+ mant[i], mant[j] = mant[j], mant[i]
+ }
+
+ // adjust exponent (constant.MakeFromBytes creates an integer value,
+ // but mant represents the mantissa bits such that 0.5 <= mant < 1.0)
+ exp -= len(mant) << 3
+ if len(mant) > 0 {
+ for msd := mant[len(mant)-1]; msd&0x80 == 0; msd <<= 1 {
+ exp++
+ }
+ }
+
+ x := constant.MakeFromBytes(mant)
+ switch {
+ case exp < 0:
+ d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp))
+ x = constant.BinaryOp(x, token.QUO, d)
+ case exp > 0:
+ x = constant.Shift(x, token.SHL, uint(exp))
+ }
+
+ if sign < 0 {
+ x = constant.UnaryOp(token.SUB, x, 0)
+ }
+ return x
+}
+
+// ----------------------------------------------------------------------------
+// Low-level decoders
+
+func (p *importer) tagOrIndex() int {
+ if p.debugFormat {
+ p.marker('t')
+ }
+
+ return int(p.rawInt64())
+}
+
+func (p *importer) int() int {
+ x := p.int64()
+ if int64(int(x)) != x {
+ errorf("exported integer too large")
+ }
+ return int(x)
+}
+
+func (p *importer) int64() int64 {
+ if p.debugFormat {
+ p.marker('i')
+ }
+
+ return p.rawInt64()
+}
+
+func (p *importer) path() string {
+ if p.debugFormat {
+ p.marker('p')
+ }
+ // if the path was seen before, i is its index (>= 0)
+ // (the empty string is at index 0)
+ i := p.rawInt64()
+ if i >= 0 {
+ return p.pathList[i]
+ }
+ // otherwise, i is the negative path length (< 0)
+ a := make([]string, -i)
+ for n := range a {
+ a[n] = p.string()
+ }
+ s := strings.Join(a, "/")
+ p.pathList = append(p.pathList, s)
+ return s
+}
+
+func (p *importer) string() string {
+ if p.debugFormat {
+ p.marker('s')
+ }
+ // if the string was seen before, i is its index (>= 0)
+ // (the empty string is at index 0)
+ i := p.rawInt64()
+ if i >= 0 {
+ return p.strList[i]
+ }
+ // otherwise, i is the negative string length (< 0)
+ if n := int(-i); n <= cap(p.buf) {
+ p.buf = p.buf[:n]
+ } else {
+ p.buf = make([]byte, n)
+ }
+ for i := range p.buf {
+ p.buf[i] = p.rawByte()
+ }
+ s := string(p.buf)
+ p.strList = append(p.strList, s)
+ return s
+}
+
+func (p *importer) marker(want byte) {
+ if got := p.rawByte(); got != want {
+ errorf("incorrect marker: got %c; want %c (pos = %d)", got, want, p.read)
+ }
+
+ pos := p.read
+ if n := int(p.rawInt64()); n != pos {
+ errorf("incorrect position: got %d; want %d", n, pos)
+ }
+}
+
+// rawInt64 should only be used by low-level decoders.
+func (p *importer) rawInt64() int64 {
+ i, err := binary.ReadVarint(p)
+ if err != nil {
+ errorf("read error: %v", err)
+ }
+ return i
+}
+
+// rawStringln should only be used to read the initial version string.
+func (p *importer) rawStringln(b byte) string {
+ p.buf = p.buf[:0]
+ for b != '\n' {
+ p.buf = append(p.buf, b)
+ b = p.rawByte()
+ }
+ return string(p.buf)
+}
+
+// needed for binary.ReadVarint in rawInt64
+func (p *importer) ReadByte() (byte, error) {
+ return p.rawByte(), nil
+}
+
+// byte is the bottleneck interface for reading p.data.
+// It unescapes '|' 'S' to '$' and '|' '|' to '|'.
+// rawByte should only be used by low-level decoders.
+func (p *importer) rawByte() byte {
+ b := p.data[0]
+ r := 1
+ if b == '|' {
+ b = p.data[1]
+ r = 2
+ switch b {
+ case 'S':
+ b = '$'
+ case '|':
+ // nothing to do
+ default:
+ errorf("unexpected escape sequence in export data")
+ }
+ }
+ p.data = p.data[r:]
+ p.read += r
+ return b
+
+}
+
+// ----------------------------------------------------------------------------
+// Export format
+
+// Tags. Must be < 0.
+const (
+ // Objects
+ packageTag = -(iota + 1)
+ constTag
+ typeTag
+ varTag
+ funcTag
+ endTag
+
+ // Types
+ namedTag
+ arrayTag
+ sliceTag
+ dddTag
+ structTag
+ pointerTag
+ signatureTag
+ interfaceTag
+ mapTag
+ chanTag
+
+ // Values
+ falseTag
+ trueTag
+ int64Tag
+ floatTag
+ fractionTag // not used by gc
+ complexTag
+ stringTag
+ nilTag // only used by gc (appears in exported inlined function bodies)
+ unknownTag // not used by gc (only appears in packages with errors)
+
+ // Type aliases
+ aliasTag
+)
+
+var predecl []types.Type // initialized lazily
+
+func predeclared() []types.Type {
+ if predecl == nil {
+ // initialize lazily to be sure that all
+ // elements have been initialized before
+ predecl = []types.Type{ // basic types
+ types.Typ[types.Bool],
+ types.Typ[types.Int],
+ types.Typ[types.Int8],
+ types.Typ[types.Int16],
+ types.Typ[types.Int32],
+ types.Typ[types.Int64],
+ types.Typ[types.Uint],
+ types.Typ[types.Uint8],
+ types.Typ[types.Uint16],
+ types.Typ[types.Uint32],
+ types.Typ[types.Uint64],
+ types.Typ[types.Uintptr],
+ types.Typ[types.Float32],
+ types.Typ[types.Float64],
+ types.Typ[types.Complex64],
+ types.Typ[types.Complex128],
+ types.Typ[types.String],
+
+ // basic type aliases
+ types.Universe.Lookup("byte").Type(),
+ types.Universe.Lookup("rune").Type(),
+
+ // error
+ types.Universe.Lookup("error").Type(),
+
+ // untyped types
+ types.Typ[types.UntypedBool],
+ types.Typ[types.UntypedInt],
+ types.Typ[types.UntypedRune],
+ types.Typ[types.UntypedFloat],
+ types.Typ[types.UntypedComplex],
+ types.Typ[types.UntypedString],
+ types.Typ[types.UntypedNil],
+
+ // package unsafe
+ types.Typ[types.UnsafePointer],
+
+ // invalid type
+ types.Typ[types.Invalid], // only appears in packages with errors
+
+ // used internally by gc; never used by this package or in .a files
+ anyType{},
+ }
+ }
+ return predecl
+}
+
+type anyType struct{}
+
+func (t anyType) Underlying() types.Type { return t }
+func (t anyType) String() string { return "any" }
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go b/vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go
new file mode 100644
index 00000000000..f33dc5613e7
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/exportdata.go
@@ -0,0 +1,93 @@
+// 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.
+
+// This file is a copy of $GOROOT/src/go/internal/gcimporter/exportdata.go.
+
+// This file implements FindExportData.
+
+package gcimporter
+
+import (
+ "bufio"
+ "fmt"
+ "io"
+ "strconv"
+ "strings"
+)
+
+func readGopackHeader(r *bufio.Reader) (name string, size int, err error) {
+ // See $GOROOT/include/ar.h.
+ hdr := make([]byte, 16+12+6+6+8+10+2)
+ _, err = io.ReadFull(r, hdr)
+ if err != nil {
+ return
+ }
+ // leave for debugging
+ if false {
+ fmt.Printf("header: %s", hdr)
+ }
+ s := strings.TrimSpace(string(hdr[16+12+6+6+8:][:10]))
+ size, err = strconv.Atoi(s)
+ if err != nil || hdr[len(hdr)-2] != '`' || hdr[len(hdr)-1] != '\n' {
+ err = fmt.Errorf("invalid archive header")
+ return
+ }
+ name = strings.TrimSpace(string(hdr[:16]))
+ return
+}
+
+// FindExportData positions the reader r at the beginning of the
+// export data section of an underlying GC-created object/archive
+// file by reading from it. The reader must be positioned at the
+// start of the file before calling this function. The hdr result
+// is the string before the export data, either "$$" or "$$B".
+//
+func FindExportData(r *bufio.Reader) (hdr string, err error) {
+ // Read first line to make sure this is an object file.
+ line, err := r.ReadSlice('\n')
+ if err != nil {
+ err = fmt.Errorf("can't find export data (%v)", err)
+ return
+ }
+
+ if string(line) == "!\n" {
+ // Archive file. Scan to __.PKGDEF.
+ var name string
+ if name, _, err = readGopackHeader(r); err != nil {
+ return
+ }
+
+ // First entry should be __.PKGDEF.
+ if name != "__.PKGDEF" {
+ err = fmt.Errorf("go archive is missing __.PKGDEF")
+ return
+ }
+
+ // Read first line of __.PKGDEF data, so that line
+ // is once again the first line of the input.
+ if line, err = r.ReadSlice('\n'); err != nil {
+ err = fmt.Errorf("can't find export data (%v)", err)
+ return
+ }
+ }
+
+ // Now at __.PKGDEF in archive or still at beginning of file.
+ // Either way, line should begin with "go object ".
+ if !strings.HasPrefix(string(line), "go object ") {
+ err = fmt.Errorf("not a Go object file")
+ return
+ }
+
+ // Skip over object header to export data.
+ // Begins after first line starting with $$.
+ for line[0] != '$' {
+ if line, err = r.ReadSlice('\n'); err != nil {
+ err = fmt.Errorf("can't find export data (%v)", err)
+ return
+ }
+ }
+ hdr = string(line)
+
+ return
+}
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go
new file mode 100644
index 00000000000..9cf186605f6
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/gcimporter.go
@@ -0,0 +1,1078 @@
+// 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.
+
+// This file is a modified copy of $GOROOT/src/go/internal/gcimporter/gcimporter.go,
+// but it also contains the original source-based importer code for Go1.6.
+// Once we stop supporting 1.6, we can remove that code.
+
+// Package gcimporter provides various functions for reading
+// gc-generated object files that can be used to implement the
+// Importer interface defined by the Go 1.5 standard library package.
+package gcimporter // import "golang.org/x/tools/go/internal/gcimporter"
+
+import (
+ "bufio"
+ "errors"
+ "fmt"
+ "go/build"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "io"
+ "io/ioutil"
+ "os"
+ "path/filepath"
+ "sort"
+ "strconv"
+ "strings"
+ "text/scanner"
+)
+
+// debugging/development support
+const debug = false
+
+var pkgExts = [...]string{".a", ".o"}
+
+// FindPkg returns the filename and unique package id for an import
+// path based on package information provided by build.Import (using
+// the build.Default build.Context). A relative srcDir is interpreted
+// relative to the current working directory.
+// If no file was found, an empty filename is returned.
+//
+func FindPkg(path, srcDir string) (filename, id string) {
+ if path == "" {
+ return
+ }
+
+ var noext string
+ switch {
+ default:
+ // "x" -> "$GOPATH/pkg/$GOOS_$GOARCH/x.ext", "x"
+ // Don't require the source files to be present.
+ if abs, err := filepath.Abs(srcDir); err == nil { // see issue 14282
+ srcDir = abs
+ }
+ bp, _ := build.Import(path, srcDir, build.FindOnly|build.AllowBinary)
+ if bp.PkgObj == "" {
+ id = path // make sure we have an id to print in error message
+ return
+ }
+ noext = strings.TrimSuffix(bp.PkgObj, ".a")
+ id = bp.ImportPath
+
+ case build.IsLocalImport(path):
+ // "./x" -> "/this/directory/x.ext", "/this/directory/x"
+ noext = filepath.Join(srcDir, path)
+ id = noext
+
+ case filepath.IsAbs(path):
+ // for completeness only - go/build.Import
+ // does not support absolute imports
+ // "/x" -> "/x.ext", "/x"
+ noext = path
+ id = path
+ }
+
+ if false { // for debugging
+ if path != id {
+ fmt.Printf("%s -> %s\n", path, id)
+ }
+ }
+
+ // try extensions
+ for _, ext := range pkgExts {
+ filename = noext + ext
+ if f, err := os.Stat(filename); err == nil && !f.IsDir() {
+ return
+ }
+ }
+
+ filename = "" // not found
+ return
+}
+
+// ImportData imports a package by reading the gc-generated export data,
+// adds the corresponding package object to the packages map indexed by id,
+// and returns the object.
+//
+// The packages map must contains all packages already imported. The data
+// reader position must be the beginning of the export data section. The
+// filename is only used in error messages.
+//
+// If packages[id] contains the completely imported package, that package
+// can be used directly, and there is no need to call this function (but
+// there is also no harm but for extra time used).
+//
+func ImportData(packages map[string]*types.Package, filename, id string, data io.Reader) (pkg *types.Package, err error) {
+ // support for parser error handling
+ defer func() {
+ switch r := recover().(type) {
+ case nil:
+ // nothing to do
+ case importError:
+ err = r
+ default:
+ panic(r) // internal error
+ }
+ }()
+
+ var p parser
+ p.init(filename, id, data, packages)
+ pkg = p.parseExport()
+
+ return
+}
+
+// Import imports a gc-generated package given its import path and srcDir, adds
+// the corresponding package object to the packages map, and returns the object.
+// The packages map must contain all packages already imported.
+//
+func Import(packages map[string]*types.Package, path, srcDir string, lookup func(path string) (io.ReadCloser, error)) (pkg *types.Package, err error) {
+ var rc io.ReadCloser
+ var filename, id string
+ if lookup != nil {
+ // With custom lookup specified, assume that caller has
+ // converted path to a canonical import path for use in the map.
+ if path == "unsafe" {
+ return types.Unsafe, nil
+ }
+ id = path
+
+ // No need to re-import if the package was imported completely before.
+ if pkg = packages[id]; pkg != nil && pkg.Complete() {
+ return
+ }
+ f, err := lookup(path)
+ if err != nil {
+ return nil, err
+ }
+ rc = f
+ } else {
+ filename, id = FindPkg(path, srcDir)
+ if filename == "" {
+ if path == "unsafe" {
+ return types.Unsafe, nil
+ }
+ return nil, fmt.Errorf("can't find import: %q", id)
+ }
+
+ // no need to re-import if the package was imported completely before
+ if pkg = packages[id]; pkg != nil && pkg.Complete() {
+ return
+ }
+
+ // open file
+ f, err := os.Open(filename)
+ if err != nil {
+ return nil, err
+ }
+ defer func() {
+ if err != nil {
+ // add file name to error
+ err = fmt.Errorf("%s: %v", filename, err)
+ }
+ }()
+ rc = f
+ }
+ defer rc.Close()
+
+ var hdr string
+ buf := bufio.NewReader(rc)
+ if hdr, err = FindExportData(buf); err != nil {
+ return
+ }
+
+ switch hdr {
+ case "$$\n":
+ // Work-around if we don't have a filename; happens only if lookup != nil.
+ // Either way, the filename is only needed for importer error messages, so
+ // this is fine.
+ if filename == "" {
+ filename = path
+ }
+ return ImportData(packages, filename, id, buf)
+
+ case "$$B\n":
+ var data []byte
+ data, err = ioutil.ReadAll(buf)
+ if err != nil {
+ break
+ }
+
+ // TODO(gri): allow clients of go/importer to provide a FileSet.
+ // Or, define a new standard go/types/gcexportdata package.
+ fset := token.NewFileSet()
+
+ // The indexed export format starts with an 'i'; the older
+ // binary export format starts with a 'c', 'd', or 'v'
+ // (from "version"). Select appropriate importer.
+ if len(data) > 0 && data[0] == 'i' {
+ _, pkg, err = IImportData(fset, packages, data[1:], id)
+ } else {
+ _, pkg, err = BImportData(fset, packages, data, id)
+ }
+
+ default:
+ err = fmt.Errorf("unknown export data header: %q", hdr)
+ }
+
+ return
+}
+
+// ----------------------------------------------------------------------------
+// Parser
+
+// TODO(gri) Imported objects don't have position information.
+// Ideally use the debug table line info; alternatively
+// create some fake position (or the position of the
+// import). That way error messages referring to imported
+// objects can print meaningful information.
+
+// parser parses the exports inside a gc compiler-produced
+// object/archive file and populates its scope with the results.
+type parser struct {
+ scanner scanner.Scanner
+ tok rune // current token
+ lit string // literal string; only valid for Ident, Int, String tokens
+ id string // package id of imported package
+ sharedPkgs map[string]*types.Package // package id -> package object (across importer)
+ localPkgs map[string]*types.Package // package id -> package object (just this package)
+}
+
+func (p *parser) init(filename, id string, src io.Reader, packages map[string]*types.Package) {
+ p.scanner.Init(src)
+ p.scanner.Error = func(_ *scanner.Scanner, msg string) { p.error(msg) }
+ p.scanner.Mode = scanner.ScanIdents | scanner.ScanInts | scanner.ScanChars | scanner.ScanStrings | scanner.ScanComments | scanner.SkipComments
+ p.scanner.Whitespace = 1<<'\t' | 1<<' '
+ p.scanner.Filename = filename // for good error messages
+ p.next()
+ p.id = id
+ p.sharedPkgs = packages
+ if debug {
+ // check consistency of packages map
+ for _, pkg := range packages {
+ if pkg.Name() == "" {
+ fmt.Printf("no package name for %s\n", pkg.Path())
+ }
+ }
+ }
+}
+
+func (p *parser) next() {
+ p.tok = p.scanner.Scan()
+ switch p.tok {
+ case scanner.Ident, scanner.Int, scanner.Char, scanner.String, '·':
+ p.lit = p.scanner.TokenText()
+ default:
+ p.lit = ""
+ }
+ if debug {
+ fmt.Printf("%s: %q -> %q\n", scanner.TokenString(p.tok), p.scanner.TokenText(), p.lit)
+ }
+}
+
+func declTypeName(pkg *types.Package, name string) *types.TypeName {
+ scope := pkg.Scope()
+ if obj := scope.Lookup(name); obj != nil {
+ return obj.(*types.TypeName)
+ }
+ obj := types.NewTypeName(token.NoPos, pkg, name, nil)
+ // a named type may be referred to before the underlying type
+ // is known - set it up
+ types.NewNamed(obj, nil, nil)
+ scope.Insert(obj)
+ return obj
+}
+
+// ----------------------------------------------------------------------------
+// Error handling
+
+// Internal errors are boxed as importErrors.
+type importError struct {
+ pos scanner.Position
+ err error
+}
+
+func (e importError) Error() string {
+ return fmt.Sprintf("import error %s (byte offset = %d): %s", e.pos, e.pos.Offset, e.err)
+}
+
+func (p *parser) error(err interface{}) {
+ if s, ok := err.(string); ok {
+ err = errors.New(s)
+ }
+ // panic with a runtime.Error if err is not an error
+ panic(importError{p.scanner.Pos(), err.(error)})
+}
+
+func (p *parser) errorf(format string, args ...interface{}) {
+ p.error(fmt.Sprintf(format, args...))
+}
+
+func (p *parser) expect(tok rune) string {
+ lit := p.lit
+ if p.tok != tok {
+ p.errorf("expected %s, got %s (%s)", scanner.TokenString(tok), scanner.TokenString(p.tok), lit)
+ }
+ p.next()
+ return lit
+}
+
+func (p *parser) expectSpecial(tok string) {
+ sep := 'x' // not white space
+ i := 0
+ for i < len(tok) && p.tok == rune(tok[i]) && sep > ' ' {
+ sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
+ p.next()
+ i++
+ }
+ if i < len(tok) {
+ p.errorf("expected %q, got %q", tok, tok[0:i])
+ }
+}
+
+func (p *parser) expectKeyword(keyword string) {
+ lit := p.expect(scanner.Ident)
+ if lit != keyword {
+ p.errorf("expected keyword %s, got %q", keyword, lit)
+ }
+}
+
+// ----------------------------------------------------------------------------
+// Qualified and unqualified names
+
+// PackageId = string_lit .
+//
+func (p *parser) parsePackageId() string {
+ id, err := strconv.Unquote(p.expect(scanner.String))
+ if err != nil {
+ p.error(err)
+ }
+ // id == "" stands for the imported package id
+ // (only known at time of package installation)
+ if id == "" {
+ id = p.id
+ }
+ return id
+}
+
+// PackageName = ident .
+//
+func (p *parser) parsePackageName() string {
+ return p.expect(scanner.Ident)
+}
+
+// dotIdentifier = ( ident | '·' ) { ident | int | '·' } .
+func (p *parser) parseDotIdent() string {
+ ident := ""
+ if p.tok != scanner.Int {
+ sep := 'x' // not white space
+ for (p.tok == scanner.Ident || p.tok == scanner.Int || p.tok == '·') && sep > ' ' {
+ ident += p.lit
+ sep = p.scanner.Peek() // if sep <= ' ', there is white space before the next token
+ p.next()
+ }
+ }
+ if ident == "" {
+ p.expect(scanner.Ident) // use expect() for error handling
+ }
+ return ident
+}
+
+// QualifiedName = "@" PackageId "." ( "?" | dotIdentifier ) .
+//
+func (p *parser) parseQualifiedName() (id, name string) {
+ p.expect('@')
+ id = p.parsePackageId()
+ p.expect('.')
+ // Per rev f280b8a485fd (10/2/2013), qualified names may be used for anonymous fields.
+ if p.tok == '?' {
+ p.next()
+ } else {
+ name = p.parseDotIdent()
+ }
+ return
+}
+
+// getPkg returns the package for a given id. If the package is
+// not found, create the package and add it to the p.localPkgs
+// and p.sharedPkgs maps. name is the (expected) name of the
+// package. If name == "", the package name is expected to be
+// set later via an import clause in the export data.
+//
+// id identifies a package, usually by a canonical package path like
+// "encoding/json" but possibly by a non-canonical import path like
+// "./json".
+//
+func (p *parser) getPkg(id, name string) *types.Package {
+ // package unsafe is not in the packages maps - handle explicitly
+ if id == "unsafe" {
+ return types.Unsafe
+ }
+
+ pkg := p.localPkgs[id]
+ if pkg == nil {
+ // first import of id from this package
+ pkg = p.sharedPkgs[id]
+ if pkg == nil {
+ // first import of id by this importer;
+ // add (possibly unnamed) pkg to shared packages
+ pkg = types.NewPackage(id, name)
+ p.sharedPkgs[id] = pkg
+ }
+ // add (possibly unnamed) pkg to local packages
+ if p.localPkgs == nil {
+ p.localPkgs = make(map[string]*types.Package)
+ }
+ p.localPkgs[id] = pkg
+ } else if name != "" {
+ // package exists already and we have an expected package name;
+ // make sure names match or set package name if necessary
+ if pname := pkg.Name(); pname == "" {
+ pkg.SetName(name)
+ } else if pname != name {
+ p.errorf("%s package name mismatch: %s (given) vs %s (expected)", id, pname, name)
+ }
+ }
+ return pkg
+}
+
+// parseExportedName is like parseQualifiedName, but
+// the package id is resolved to an imported *types.Package.
+//
+func (p *parser) parseExportedName() (pkg *types.Package, name string) {
+ id, name := p.parseQualifiedName()
+ pkg = p.getPkg(id, "")
+ return
+}
+
+// ----------------------------------------------------------------------------
+// Types
+
+// BasicType = identifier .
+//
+func (p *parser) parseBasicType() types.Type {
+ id := p.expect(scanner.Ident)
+ obj := types.Universe.Lookup(id)
+ if obj, ok := obj.(*types.TypeName); ok {
+ return obj.Type()
+ }
+ p.errorf("not a basic type: %s", id)
+ return nil
+}
+
+// ArrayType = "[" int_lit "]" Type .
+//
+func (p *parser) parseArrayType(parent *types.Package) types.Type {
+ // "[" already consumed and lookahead known not to be "]"
+ lit := p.expect(scanner.Int)
+ p.expect(']')
+ elem := p.parseType(parent)
+ n, err := strconv.ParseInt(lit, 10, 64)
+ if err != nil {
+ p.error(err)
+ }
+ return types.NewArray(elem, n)
+}
+
+// MapType = "map" "[" Type "]" Type .
+//
+func (p *parser) parseMapType(parent *types.Package) types.Type {
+ p.expectKeyword("map")
+ p.expect('[')
+ key := p.parseType(parent)
+ p.expect(']')
+ elem := p.parseType(parent)
+ return types.NewMap(key, elem)
+}
+
+// Name = identifier | "?" | QualifiedName .
+//
+// For unqualified and anonymous names, the returned package is the parent
+// package unless parent == nil, in which case the returned package is the
+// package being imported. (The parent package is not nil if the the name
+// is an unqualified struct field or interface method name belonging to a
+// type declared in another package.)
+//
+// For qualified names, the returned package is nil (and not created if
+// it doesn't exist yet) unless materializePkg is set (which creates an
+// unnamed package with valid package path). In the latter case, a
+// subsequent import clause is expected to provide a name for the package.
+//
+func (p *parser) parseName(parent *types.Package, materializePkg bool) (pkg *types.Package, name string) {
+ pkg = parent
+ if pkg == nil {
+ pkg = p.sharedPkgs[p.id]
+ }
+ switch p.tok {
+ case scanner.Ident:
+ name = p.lit
+ p.next()
+ case '?':
+ // anonymous
+ p.next()
+ case '@':
+ // exported name prefixed with package path
+ pkg = nil
+ var id string
+ id, name = p.parseQualifiedName()
+ if materializePkg {
+ pkg = p.getPkg(id, "")
+ }
+ default:
+ p.error("name expected")
+ }
+ return
+}
+
+func deref(typ types.Type) types.Type {
+ if p, _ := typ.(*types.Pointer); p != nil {
+ return p.Elem()
+ }
+ return typ
+}
+
+// Field = Name Type [ string_lit ] .
+//
+func (p *parser) parseField(parent *types.Package) (*types.Var, string) {
+ pkg, name := p.parseName(parent, true)
+
+ if name == "_" {
+ // Blank fields should be package-qualified because they
+ // are unexported identifiers, but gc does not qualify them.
+ // Assuming that the ident belongs to the current package
+ // causes types to change during re-exporting, leading
+ // to spurious "can't assign A to B" errors from go/types.
+ // As a workaround, pretend all blank fields belong
+ // to the same unique dummy package.
+ const blankpkg = "<_>"
+ pkg = p.getPkg(blankpkg, blankpkg)
+ }
+
+ typ := p.parseType(parent)
+ anonymous := false
+ if name == "" {
+ // anonymous field - typ must be T or *T and T must be a type name
+ switch typ := deref(typ).(type) {
+ case *types.Basic: // basic types are named types
+ pkg = nil // objects defined in Universe scope have no package
+ name = typ.Name()
+ case *types.Named:
+ name = typ.Obj().Name()
+ default:
+ p.errorf("anonymous field expected")
+ }
+ anonymous = true
+ }
+ tag := ""
+ if p.tok == scanner.String {
+ s := p.expect(scanner.String)
+ var err error
+ tag, err = strconv.Unquote(s)
+ if err != nil {
+ p.errorf("invalid struct tag %s: %s", s, err)
+ }
+ }
+ return types.NewField(token.NoPos, pkg, name, typ, anonymous), tag
+}
+
+// StructType = "struct" "{" [ FieldList ] "}" .
+// FieldList = Field { ";" Field } .
+//
+func (p *parser) parseStructType(parent *types.Package) types.Type {
+ var fields []*types.Var
+ var tags []string
+
+ p.expectKeyword("struct")
+ p.expect('{')
+ for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
+ if i > 0 {
+ p.expect(';')
+ }
+ fld, tag := p.parseField(parent)
+ if tag != "" && tags == nil {
+ tags = make([]string, i)
+ }
+ if tags != nil {
+ tags = append(tags, tag)
+ }
+ fields = append(fields, fld)
+ }
+ p.expect('}')
+
+ return types.NewStruct(fields, tags)
+}
+
+// Parameter = ( identifier | "?" ) [ "..." ] Type [ string_lit ] .
+//
+func (p *parser) parseParameter() (par *types.Var, isVariadic bool) {
+ _, name := p.parseName(nil, false)
+ // remove gc-specific parameter numbering
+ if i := strings.Index(name, "·"); i >= 0 {
+ name = name[:i]
+ }
+ if p.tok == '.' {
+ p.expectSpecial("...")
+ isVariadic = true
+ }
+ typ := p.parseType(nil)
+ if isVariadic {
+ typ = types.NewSlice(typ)
+ }
+ // ignore argument tag (e.g. "noescape")
+ if p.tok == scanner.String {
+ p.next()
+ }
+ // TODO(gri) should we provide a package?
+ par = types.NewVar(token.NoPos, nil, name, typ)
+ return
+}
+
+// Parameters = "(" [ ParameterList ] ")" .
+// ParameterList = { Parameter "," } Parameter .
+//
+func (p *parser) parseParameters() (list []*types.Var, isVariadic bool) {
+ p.expect('(')
+ for p.tok != ')' && p.tok != scanner.EOF {
+ if len(list) > 0 {
+ p.expect(',')
+ }
+ par, variadic := p.parseParameter()
+ list = append(list, par)
+ if variadic {
+ if isVariadic {
+ p.error("... not on final argument")
+ }
+ isVariadic = true
+ }
+ }
+ p.expect(')')
+
+ return
+}
+
+// Signature = Parameters [ Result ] .
+// Result = Type | Parameters .
+//
+func (p *parser) parseSignature(recv *types.Var) *types.Signature {
+ params, isVariadic := p.parseParameters()
+
+ // optional result type
+ var results []*types.Var
+ if p.tok == '(' {
+ var variadic bool
+ results, variadic = p.parseParameters()
+ if variadic {
+ p.error("... not permitted on result type")
+ }
+ }
+
+ return types.NewSignature(recv, types.NewTuple(params...), types.NewTuple(results...), isVariadic)
+}
+
+// InterfaceType = "interface" "{" [ MethodList ] "}" .
+// MethodList = Method { ";" Method } .
+// Method = Name Signature .
+//
+// The methods of embedded interfaces are always "inlined"
+// by the compiler and thus embedded interfaces are never
+// visible in the export data.
+//
+func (p *parser) parseInterfaceType(parent *types.Package) types.Type {
+ var methods []*types.Func
+
+ p.expectKeyword("interface")
+ p.expect('{')
+ for i := 0; p.tok != '}' && p.tok != scanner.EOF; i++ {
+ if i > 0 {
+ p.expect(';')
+ }
+ pkg, name := p.parseName(parent, true)
+ sig := p.parseSignature(nil)
+ methods = append(methods, types.NewFunc(token.NoPos, pkg, name, sig))
+ }
+ p.expect('}')
+
+ // Complete requires the type's embedded interfaces to be fully defined,
+ // but we do not define any
+ return types.NewInterface(methods, nil).Complete()
+}
+
+// ChanType = ( "chan" [ "<-" ] | "<-" "chan" ) Type .
+//
+func (p *parser) parseChanType(parent *types.Package) types.Type {
+ dir := types.SendRecv
+ if p.tok == scanner.Ident {
+ p.expectKeyword("chan")
+ if p.tok == '<' {
+ p.expectSpecial("<-")
+ dir = types.SendOnly
+ }
+ } else {
+ p.expectSpecial("<-")
+ p.expectKeyword("chan")
+ dir = types.RecvOnly
+ }
+ elem := p.parseType(parent)
+ return types.NewChan(dir, elem)
+}
+
+// Type =
+// BasicType | TypeName | ArrayType | SliceType | StructType |
+// PointerType | FuncType | InterfaceType | MapType | ChanType |
+// "(" Type ")" .
+//
+// BasicType = ident .
+// TypeName = ExportedName .
+// SliceType = "[" "]" Type .
+// PointerType = "*" Type .
+// FuncType = "func" Signature .
+//
+func (p *parser) parseType(parent *types.Package) types.Type {
+ switch p.tok {
+ case scanner.Ident:
+ switch p.lit {
+ default:
+ return p.parseBasicType()
+ case "struct":
+ return p.parseStructType(parent)
+ case "func":
+ // FuncType
+ p.next()
+ return p.parseSignature(nil)
+ case "interface":
+ return p.parseInterfaceType(parent)
+ case "map":
+ return p.parseMapType(parent)
+ case "chan":
+ return p.parseChanType(parent)
+ }
+ case '@':
+ // TypeName
+ pkg, name := p.parseExportedName()
+ return declTypeName(pkg, name).Type()
+ case '[':
+ p.next() // look ahead
+ if p.tok == ']' {
+ // SliceType
+ p.next()
+ return types.NewSlice(p.parseType(parent))
+ }
+ return p.parseArrayType(parent)
+ case '*':
+ // PointerType
+ p.next()
+ return types.NewPointer(p.parseType(parent))
+ case '<':
+ return p.parseChanType(parent)
+ case '(':
+ // "(" Type ")"
+ p.next()
+ typ := p.parseType(parent)
+ p.expect(')')
+ return typ
+ }
+ p.errorf("expected type, got %s (%q)", scanner.TokenString(p.tok), p.lit)
+ return nil
+}
+
+// ----------------------------------------------------------------------------
+// Declarations
+
+// ImportDecl = "import" PackageName PackageId .
+//
+func (p *parser) parseImportDecl() {
+ p.expectKeyword("import")
+ name := p.parsePackageName()
+ p.getPkg(p.parsePackageId(), name)
+}
+
+// int_lit = [ "+" | "-" ] { "0" ... "9" } .
+//
+func (p *parser) parseInt() string {
+ s := ""
+ switch p.tok {
+ case '-':
+ s = "-"
+ p.next()
+ case '+':
+ p.next()
+ }
+ return s + p.expect(scanner.Int)
+}
+
+// number = int_lit [ "p" int_lit ] .
+//
+func (p *parser) parseNumber() (typ *types.Basic, val constant.Value) {
+ // mantissa
+ mant := constant.MakeFromLiteral(p.parseInt(), token.INT, 0)
+ if mant == nil {
+ panic("invalid mantissa")
+ }
+
+ if p.lit == "p" {
+ // exponent (base 2)
+ p.next()
+ exp, err := strconv.ParseInt(p.parseInt(), 10, 0)
+ if err != nil {
+ p.error(err)
+ }
+ if exp < 0 {
+ denom := constant.MakeInt64(1)
+ denom = constant.Shift(denom, token.SHL, uint(-exp))
+ typ = types.Typ[types.UntypedFloat]
+ val = constant.BinaryOp(mant, token.QUO, denom)
+ return
+ }
+ if exp > 0 {
+ mant = constant.Shift(mant, token.SHL, uint(exp))
+ }
+ typ = types.Typ[types.UntypedFloat]
+ val = mant
+ return
+ }
+
+ typ = types.Typ[types.UntypedInt]
+ val = mant
+ return
+}
+
+// ConstDecl = "const" ExportedName [ Type ] "=" Literal .
+// Literal = bool_lit | int_lit | float_lit | complex_lit | rune_lit | string_lit .
+// bool_lit = "true" | "false" .
+// complex_lit = "(" float_lit "+" float_lit "i" ")" .
+// rune_lit = "(" int_lit "+" int_lit ")" .
+// string_lit = `"` { unicode_char } `"` .
+//
+func (p *parser) parseConstDecl() {
+ p.expectKeyword("const")
+ pkg, name := p.parseExportedName()
+
+ var typ0 types.Type
+ if p.tok != '=' {
+ // constant types are never structured - no need for parent type
+ typ0 = p.parseType(nil)
+ }
+
+ p.expect('=')
+ var typ types.Type
+ var val constant.Value
+ switch p.tok {
+ case scanner.Ident:
+ // bool_lit
+ if p.lit != "true" && p.lit != "false" {
+ p.error("expected true or false")
+ }
+ typ = types.Typ[types.UntypedBool]
+ val = constant.MakeBool(p.lit == "true")
+ p.next()
+
+ case '-', scanner.Int:
+ // int_lit
+ typ, val = p.parseNumber()
+
+ case '(':
+ // complex_lit or rune_lit
+ p.next()
+ if p.tok == scanner.Char {
+ p.next()
+ p.expect('+')
+ typ = types.Typ[types.UntypedRune]
+ _, val = p.parseNumber()
+ p.expect(')')
+ break
+ }
+ _, re := p.parseNumber()
+ p.expect('+')
+ _, im := p.parseNumber()
+ p.expectKeyword("i")
+ p.expect(')')
+ typ = types.Typ[types.UntypedComplex]
+ val = constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
+
+ case scanner.Char:
+ // rune_lit
+ typ = types.Typ[types.UntypedRune]
+ val = constant.MakeFromLiteral(p.lit, token.CHAR, 0)
+ p.next()
+
+ case scanner.String:
+ // string_lit
+ typ = types.Typ[types.UntypedString]
+ val = constant.MakeFromLiteral(p.lit, token.STRING, 0)
+ p.next()
+
+ default:
+ p.errorf("expected literal got %s", scanner.TokenString(p.tok))
+ }
+
+ if typ0 == nil {
+ typ0 = typ
+ }
+
+ pkg.Scope().Insert(types.NewConst(token.NoPos, pkg, name, typ0, val))
+}
+
+// TypeDecl = "type" ExportedName Type .
+//
+func (p *parser) parseTypeDecl() {
+ p.expectKeyword("type")
+ pkg, name := p.parseExportedName()
+ obj := declTypeName(pkg, name)
+
+ // The type object may have been imported before and thus already
+ // have a type associated with it. We still need to parse the type
+ // structure, but throw it away if the object already has a type.
+ // This ensures that all imports refer to the same type object for
+ // a given type declaration.
+ typ := p.parseType(pkg)
+
+ if name := obj.Type().(*types.Named); name.Underlying() == nil {
+ name.SetUnderlying(typ)
+ }
+}
+
+// VarDecl = "var" ExportedName Type .
+//
+func (p *parser) parseVarDecl() {
+ p.expectKeyword("var")
+ pkg, name := p.parseExportedName()
+ typ := p.parseType(pkg)
+ pkg.Scope().Insert(types.NewVar(token.NoPos, pkg, name, typ))
+}
+
+// Func = Signature [ Body ] .
+// Body = "{" ... "}" .
+//
+func (p *parser) parseFunc(recv *types.Var) *types.Signature {
+ sig := p.parseSignature(recv)
+ if p.tok == '{' {
+ p.next()
+ for i := 1; i > 0; p.next() {
+ switch p.tok {
+ case '{':
+ i++
+ case '}':
+ i--
+ }
+ }
+ }
+ return sig
+}
+
+// MethodDecl = "func" Receiver Name Func .
+// Receiver = "(" ( identifier | "?" ) [ "*" ] ExportedName ")" .
+//
+func (p *parser) parseMethodDecl() {
+ // "func" already consumed
+ p.expect('(')
+ recv, _ := p.parseParameter() // receiver
+ p.expect(')')
+
+ // determine receiver base type object
+ base := deref(recv.Type()).(*types.Named)
+
+ // parse method name, signature, and possibly inlined body
+ _, name := p.parseName(nil, false)
+ sig := p.parseFunc(recv)
+
+ // methods always belong to the same package as the base type object
+ pkg := base.Obj().Pkg()
+
+ // add method to type unless type was imported before
+ // and method exists already
+ // TODO(gri) This leads to a quadratic algorithm - ok for now because method counts are small.
+ base.AddMethod(types.NewFunc(token.NoPos, pkg, name, sig))
+}
+
+// FuncDecl = "func" ExportedName Func .
+//
+func (p *parser) parseFuncDecl() {
+ // "func" already consumed
+ pkg, name := p.parseExportedName()
+ typ := p.parseFunc(nil)
+ pkg.Scope().Insert(types.NewFunc(token.NoPos, pkg, name, typ))
+}
+
+// Decl = [ ImportDecl | ConstDecl | TypeDecl | VarDecl | FuncDecl | MethodDecl ] "\n" .
+//
+func (p *parser) parseDecl() {
+ if p.tok == scanner.Ident {
+ switch p.lit {
+ case "import":
+ p.parseImportDecl()
+ case "const":
+ p.parseConstDecl()
+ case "type":
+ p.parseTypeDecl()
+ case "var":
+ p.parseVarDecl()
+ case "func":
+ p.next() // look ahead
+ if p.tok == '(' {
+ p.parseMethodDecl()
+ } else {
+ p.parseFuncDecl()
+ }
+ }
+ }
+ p.expect('\n')
+}
+
+// ----------------------------------------------------------------------------
+// Export
+
+// Export = "PackageClause { Decl } "$$" .
+// PackageClause = "package" PackageName [ "safe" ] "\n" .
+//
+func (p *parser) parseExport() *types.Package {
+ p.expectKeyword("package")
+ name := p.parsePackageName()
+ if p.tok == scanner.Ident && p.lit == "safe" {
+ // package was compiled with -u option - ignore
+ p.next()
+ }
+ p.expect('\n')
+
+ pkg := p.getPkg(p.id, name)
+
+ for p.tok != '$' && p.tok != scanner.EOF {
+ p.parseDecl()
+ }
+
+ if ch := p.scanner.Peek(); p.tok != '$' || ch != '$' {
+ // don't call next()/expect() since reading past the
+ // export data may cause scanner errors (e.g. NUL chars)
+ p.errorf("expected '$$', got %s %c", scanner.TokenString(p.tok), ch)
+ }
+
+ if n := p.scanner.ErrorCount; n != 0 {
+ p.errorf("expected no scanner errors, got %d", n)
+ }
+
+ // Record all locally referenced packages as imports.
+ var imports []*types.Package
+ for id, pkg2 := range p.localPkgs {
+ if pkg2.Name() == "" {
+ p.errorf("%s package has no name", id)
+ }
+ if id == p.id {
+ continue // avoid self-edge
+ }
+ imports = append(imports, pkg2)
+ }
+ sort.Sort(byPath(imports))
+ pkg.SetImports(imports)
+
+ // package was imported completely and without errors
+ pkg.MarkComplete()
+
+ return pkg
+}
+
+type byPath []*types.Package
+
+func (a byPath) Len() int { return len(a) }
+func (a byPath) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a byPath) Less(i, j int) bool { return a[i].Path() < a[j].Path() }
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go
new file mode 100644
index 00000000000..be671c79b70
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/iexport.go
@@ -0,0 +1,723 @@
+// 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.
+
+// Indexed binary package export.
+// This file was derived from $GOROOT/src/cmd/compile/internal/gc/iexport.go;
+// see that file for specification of the format.
+
+// +build go1.11
+
+package gcimporter
+
+import (
+ "bytes"
+ "encoding/binary"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "io"
+ "math/big"
+ "reflect"
+ "sort"
+)
+
+// Current indexed export format version. Increase with each format change.
+// 0: Go1.11 encoding
+const iexportVersion = 0
+
+// IExportData returns the binary export data for pkg.
+// If no file set is provided, position info will be missing.
+func IExportData(fset *token.FileSet, pkg *types.Package) (b []byte, err error) {
+ defer func() {
+ if e := recover(); e != nil {
+ if ierr, ok := e.(internalError); ok {
+ err = ierr
+ return
+ }
+ // Not an internal error; panic again.
+ panic(e)
+ }
+ }()
+
+ p := iexporter{
+ out: bytes.NewBuffer(nil),
+ fset: fset,
+ allPkgs: map[*types.Package]bool{},
+ stringIndex: map[string]uint64{},
+ declIndex: map[types.Object]uint64{},
+ typIndex: map[types.Type]uint64{},
+ }
+
+ for i, pt := range predeclared() {
+ p.typIndex[pt] = uint64(i)
+ }
+ if len(p.typIndex) > predeclReserved {
+ panic(internalErrorf("too many predeclared types: %d > %d", len(p.typIndex), predeclReserved))
+ }
+
+ // Initialize work queue with exported declarations.
+ scope := pkg.Scope()
+ for _, name := range scope.Names() {
+ if ast.IsExported(name) {
+ p.pushDecl(scope.Lookup(name))
+ }
+ }
+
+ // Loop until no more work.
+ for !p.declTodo.empty() {
+ p.doDecl(p.declTodo.popHead())
+ }
+
+ // Append indices to data0 section.
+ dataLen := uint64(p.data0.Len())
+ w := p.newWriter()
+ w.writeIndex(p.declIndex, pkg)
+ w.flush()
+
+ // Assemble header.
+ var hdr intWriter
+ hdr.WriteByte('i')
+ hdr.uint64(iexportVersion)
+ hdr.uint64(uint64(p.strings.Len()))
+ hdr.uint64(dataLen)
+
+ // Flush output.
+ io.Copy(p.out, &hdr)
+ io.Copy(p.out, &p.strings)
+ io.Copy(p.out, &p.data0)
+
+ return p.out.Bytes(), nil
+}
+
+// writeIndex writes out an object index. mainIndex indicates whether
+// we're writing out the main index, which is also read by
+// non-compiler tools and includes a complete package description
+// (i.e., name and height).
+func (w *exportWriter) writeIndex(index map[types.Object]uint64, localpkg *types.Package) {
+ // Build a map from packages to objects from that package.
+ pkgObjs := map[*types.Package][]types.Object{}
+
+ // For the main index, make sure to include every package that
+ // we reference, even if we're not exporting (or reexporting)
+ // any symbols from it.
+ pkgObjs[localpkg] = nil
+ for pkg := range w.p.allPkgs {
+ pkgObjs[pkg] = nil
+ }
+
+ for obj := range index {
+ pkgObjs[obj.Pkg()] = append(pkgObjs[obj.Pkg()], obj)
+ }
+
+ var pkgs []*types.Package
+ for pkg, objs := range pkgObjs {
+ pkgs = append(pkgs, pkg)
+
+ sort.Slice(objs, func(i, j int) bool {
+ return objs[i].Name() < objs[j].Name()
+ })
+ }
+
+ sort.Slice(pkgs, func(i, j int) bool {
+ return pkgs[i].Path() < pkgs[j].Path()
+ })
+
+ w.uint64(uint64(len(pkgs)))
+ for _, pkg := range pkgs {
+ w.string(pkg.Path())
+ w.string(pkg.Name())
+ w.uint64(uint64(0)) // package height is not needed for go/types
+
+ objs := pkgObjs[pkg]
+ w.uint64(uint64(len(objs)))
+ for _, obj := range objs {
+ w.string(obj.Name())
+ w.uint64(index[obj])
+ }
+ }
+}
+
+type iexporter struct {
+ fset *token.FileSet
+ out *bytes.Buffer
+
+ // allPkgs tracks all packages that have been referenced by
+ // the export data, so we can ensure to include them in the
+ // main index.
+ allPkgs map[*types.Package]bool
+
+ declTodo objQueue
+
+ strings intWriter
+ stringIndex map[string]uint64
+
+ data0 intWriter
+ declIndex map[types.Object]uint64
+ typIndex map[types.Type]uint64
+}
+
+// stringOff returns the offset of s within the string section.
+// If not already present, it's added to the end.
+func (p *iexporter) stringOff(s string) uint64 {
+ off, ok := p.stringIndex[s]
+ if !ok {
+ off = uint64(p.strings.Len())
+ p.stringIndex[s] = off
+
+ p.strings.uint64(uint64(len(s)))
+ p.strings.WriteString(s)
+ }
+ return off
+}
+
+// pushDecl adds n to the declaration work queue, if not already present.
+func (p *iexporter) pushDecl(obj types.Object) {
+ // Package unsafe is known to the compiler and predeclared.
+ assert(obj.Pkg() != types.Unsafe)
+
+ if _, ok := p.declIndex[obj]; ok {
+ return
+ }
+
+ p.declIndex[obj] = ^uint64(0) // mark n present in work queue
+ p.declTodo.pushTail(obj)
+}
+
+// exportWriter handles writing out individual data section chunks.
+type exportWriter struct {
+ p *iexporter
+
+ data intWriter
+ currPkg *types.Package
+ prevFile string
+ prevLine int64
+}
+
+func (p *iexporter) doDecl(obj types.Object) {
+ w := p.newWriter()
+ w.setPkg(obj.Pkg(), false)
+
+ switch obj := obj.(type) {
+ case *types.Var:
+ w.tag('V')
+ w.pos(obj.Pos())
+ w.typ(obj.Type(), obj.Pkg())
+
+ case *types.Func:
+ sig, _ := obj.Type().(*types.Signature)
+ if sig.Recv() != nil {
+ panic(internalErrorf("unexpected method: %v", sig))
+ }
+ w.tag('F')
+ w.pos(obj.Pos())
+ w.signature(sig)
+
+ case *types.Const:
+ w.tag('C')
+ w.pos(obj.Pos())
+ w.value(obj.Type(), obj.Val())
+
+ case *types.TypeName:
+ if obj.IsAlias() {
+ w.tag('A')
+ w.pos(obj.Pos())
+ w.typ(obj.Type(), obj.Pkg())
+ break
+ }
+
+ // Defined type.
+ w.tag('T')
+ w.pos(obj.Pos())
+
+ underlying := obj.Type().Underlying()
+ w.typ(underlying, obj.Pkg())
+
+ t := obj.Type()
+ if types.IsInterface(t) {
+ break
+ }
+
+ named, ok := t.(*types.Named)
+ if !ok {
+ panic(internalErrorf("%s is not a defined type", t))
+ }
+
+ n := named.NumMethods()
+ w.uint64(uint64(n))
+ for i := 0; i < n; i++ {
+ m := named.Method(i)
+ w.pos(m.Pos())
+ w.string(m.Name())
+ sig, _ := m.Type().(*types.Signature)
+ w.param(sig.Recv())
+ w.signature(sig)
+ }
+
+ default:
+ panic(internalErrorf("unexpected object: %v", obj))
+ }
+
+ p.declIndex[obj] = w.flush()
+}
+
+func (w *exportWriter) tag(tag byte) {
+ w.data.WriteByte(tag)
+}
+
+func (w *exportWriter) pos(pos token.Pos) {
+ p := w.p.fset.Position(pos)
+ file := p.Filename
+ line := int64(p.Line)
+
+ // When file is the same as the last position (common case),
+ // we can save a few bytes by delta encoding just the line
+ // number.
+ //
+ // Note: Because data objects may be read out of order (or not
+ // at all), we can only apply delta encoding within a single
+ // object. This is handled implicitly by tracking prevFile and
+ // prevLine as fields of exportWriter.
+
+ if file == w.prevFile {
+ delta := line - w.prevLine
+ w.int64(delta)
+ if delta == deltaNewFile {
+ w.int64(-1)
+ }
+ } else {
+ w.int64(deltaNewFile)
+ w.int64(line) // line >= 0
+ w.string(file)
+ w.prevFile = file
+ }
+ w.prevLine = line
+}
+
+func (w *exportWriter) pkg(pkg *types.Package) {
+ // Ensure any referenced packages are declared in the main index.
+ w.p.allPkgs[pkg] = true
+
+ w.string(pkg.Path())
+}
+
+func (w *exportWriter) qualifiedIdent(obj types.Object) {
+ // Ensure any referenced declarations are written out too.
+ w.p.pushDecl(obj)
+
+ w.string(obj.Name())
+ w.pkg(obj.Pkg())
+}
+
+func (w *exportWriter) typ(t types.Type, pkg *types.Package) {
+ w.data.uint64(w.p.typOff(t, pkg))
+}
+
+func (p *iexporter) newWriter() *exportWriter {
+ return &exportWriter{p: p}
+}
+
+func (w *exportWriter) flush() uint64 {
+ off := uint64(w.p.data0.Len())
+ io.Copy(&w.p.data0, &w.data)
+ return off
+}
+
+func (p *iexporter) typOff(t types.Type, pkg *types.Package) uint64 {
+ off, ok := p.typIndex[t]
+ if !ok {
+ w := p.newWriter()
+ w.doTyp(t, pkg)
+ off = predeclReserved + w.flush()
+ p.typIndex[t] = off
+ }
+ return off
+}
+
+func (w *exportWriter) startType(k itag) {
+ w.data.uint64(uint64(k))
+}
+
+func (w *exportWriter) doTyp(t types.Type, pkg *types.Package) {
+ switch t := t.(type) {
+ case *types.Named:
+ w.startType(definedType)
+ w.qualifiedIdent(t.Obj())
+
+ case *types.Pointer:
+ w.startType(pointerType)
+ w.typ(t.Elem(), pkg)
+
+ case *types.Slice:
+ w.startType(sliceType)
+ w.typ(t.Elem(), pkg)
+
+ case *types.Array:
+ w.startType(arrayType)
+ w.uint64(uint64(t.Len()))
+ w.typ(t.Elem(), pkg)
+
+ case *types.Chan:
+ w.startType(chanType)
+ // 1 RecvOnly; 2 SendOnly; 3 SendRecv
+ var dir uint64
+ switch t.Dir() {
+ case types.RecvOnly:
+ dir = 1
+ case types.SendOnly:
+ dir = 2
+ case types.SendRecv:
+ dir = 3
+ }
+ w.uint64(dir)
+ w.typ(t.Elem(), pkg)
+
+ case *types.Map:
+ w.startType(mapType)
+ w.typ(t.Key(), pkg)
+ w.typ(t.Elem(), pkg)
+
+ case *types.Signature:
+ w.startType(signatureType)
+ w.setPkg(pkg, true)
+ w.signature(t)
+
+ case *types.Struct:
+ w.startType(structType)
+ w.setPkg(pkg, true)
+
+ n := t.NumFields()
+ w.uint64(uint64(n))
+ for i := 0; i < n; i++ {
+ f := t.Field(i)
+ w.pos(f.Pos())
+ w.string(f.Name())
+ w.typ(f.Type(), pkg)
+ w.bool(f.Embedded())
+ w.string(t.Tag(i)) // note (or tag)
+ }
+
+ case *types.Interface:
+ w.startType(interfaceType)
+ w.setPkg(pkg, true)
+
+ n := t.NumEmbeddeds()
+ w.uint64(uint64(n))
+ for i := 0; i < n; i++ {
+ f := t.Embedded(i)
+ w.pos(f.Obj().Pos())
+ w.typ(f.Obj().Type(), f.Obj().Pkg())
+ }
+
+ n = t.NumExplicitMethods()
+ w.uint64(uint64(n))
+ for i := 0; i < n; i++ {
+ m := t.ExplicitMethod(i)
+ w.pos(m.Pos())
+ w.string(m.Name())
+ sig, _ := m.Type().(*types.Signature)
+ w.signature(sig)
+ }
+
+ default:
+ panic(internalErrorf("unexpected type: %v, %v", t, reflect.TypeOf(t)))
+ }
+}
+
+func (w *exportWriter) setPkg(pkg *types.Package, write bool) {
+ if write {
+ w.pkg(pkg)
+ }
+
+ w.currPkg = pkg
+}
+
+func (w *exportWriter) signature(sig *types.Signature) {
+ w.paramList(sig.Params())
+ w.paramList(sig.Results())
+ if sig.Params().Len() > 0 {
+ w.bool(sig.Variadic())
+ }
+}
+
+func (w *exportWriter) paramList(tup *types.Tuple) {
+ n := tup.Len()
+ w.uint64(uint64(n))
+ for i := 0; i < n; i++ {
+ w.param(tup.At(i))
+ }
+}
+
+func (w *exportWriter) param(obj types.Object) {
+ w.pos(obj.Pos())
+ w.localIdent(obj)
+ w.typ(obj.Type(), obj.Pkg())
+}
+
+func (w *exportWriter) value(typ types.Type, v constant.Value) {
+ w.typ(typ, nil)
+
+ switch v.Kind() {
+ case constant.Bool:
+ w.bool(constant.BoolVal(v))
+ case constant.Int:
+ var i big.Int
+ if i64, exact := constant.Int64Val(v); exact {
+ i.SetInt64(i64)
+ } else if ui64, exact := constant.Uint64Val(v); exact {
+ i.SetUint64(ui64)
+ } else {
+ i.SetString(v.ExactString(), 10)
+ }
+ w.mpint(&i, typ)
+ case constant.Float:
+ f := constantToFloat(v)
+ w.mpfloat(f, typ)
+ case constant.Complex:
+ w.mpfloat(constantToFloat(constant.Real(v)), typ)
+ w.mpfloat(constantToFloat(constant.Imag(v)), typ)
+ case constant.String:
+ w.string(constant.StringVal(v))
+ case constant.Unknown:
+ // package contains type errors
+ default:
+ panic(internalErrorf("unexpected value %v (%T)", v, v))
+ }
+}
+
+// constantToFloat converts a constant.Value with kind constant.Float to a
+// big.Float.
+func constantToFloat(x constant.Value) *big.Float {
+ assert(x.Kind() == constant.Float)
+ // Use the same floating-point precision (512) as cmd/compile
+ // (see Mpprec in cmd/compile/internal/gc/mpfloat.go).
+ const mpprec = 512
+ var f big.Float
+ f.SetPrec(mpprec)
+ if v, exact := constant.Float64Val(x); exact {
+ // float64
+ f.SetFloat64(v)
+ } else if num, denom := constant.Num(x), constant.Denom(x); num.Kind() == constant.Int {
+ // TODO(gri): add big.Rat accessor to constant.Value.
+ n := valueToRat(num)
+ d := valueToRat(denom)
+ f.SetRat(n.Quo(n, d))
+ } else {
+ // Value too large to represent as a fraction => inaccessible.
+ // TODO(gri): add big.Float accessor to constant.Value.
+ _, ok := f.SetString(x.ExactString())
+ assert(ok)
+ }
+ return &f
+}
+
+// mpint exports a multi-precision integer.
+//
+// For unsigned types, small values are written out as a single
+// byte. Larger values are written out as a length-prefixed big-endian
+// byte string, where the length prefix is encoded as its complement.
+// For example, bytes 0, 1, and 2 directly represent the integer
+// values 0, 1, and 2; while bytes 255, 254, and 253 indicate a 1-,
+// 2-, and 3-byte big-endian string follow.
+//
+// Encoding for signed types use the same general approach as for
+// unsigned types, except small values use zig-zag encoding and the
+// bottom bit of length prefix byte for large values is reserved as a
+// sign bit.
+//
+// The exact boundary between small and large encodings varies
+// according to the maximum number of bytes needed to encode a value
+// of type typ. As a special case, 8-bit types are always encoded as a
+// single byte.
+//
+// TODO(mdempsky): Is this level of complexity really worthwhile?
+func (w *exportWriter) mpint(x *big.Int, typ types.Type) {
+ basic, ok := typ.Underlying().(*types.Basic)
+ if !ok {
+ panic(internalErrorf("unexpected type %v (%T)", typ.Underlying(), typ.Underlying()))
+ }
+
+ signed, maxBytes := intSize(basic)
+
+ negative := x.Sign() < 0
+ if !signed && negative {
+ panic(internalErrorf("negative unsigned integer; type %v, value %v", typ, x))
+ }
+
+ b := x.Bytes()
+ if len(b) > 0 && b[0] == 0 {
+ panic(internalErrorf("leading zeros"))
+ }
+ if uint(len(b)) > maxBytes {
+ panic(internalErrorf("bad mpint length: %d > %d (type %v, value %v)", len(b), maxBytes, typ, x))
+ }
+
+ maxSmall := 256 - maxBytes
+ if signed {
+ maxSmall = 256 - 2*maxBytes
+ }
+ if maxBytes == 1 {
+ maxSmall = 256
+ }
+
+ // Check if x can use small value encoding.
+ if len(b) <= 1 {
+ var ux uint
+ if len(b) == 1 {
+ ux = uint(b[0])
+ }
+ if signed {
+ ux <<= 1
+ if negative {
+ ux--
+ }
+ }
+ if ux < maxSmall {
+ w.data.WriteByte(byte(ux))
+ return
+ }
+ }
+
+ n := 256 - uint(len(b))
+ if signed {
+ n = 256 - 2*uint(len(b))
+ if negative {
+ n |= 1
+ }
+ }
+ if n < maxSmall || n >= 256 {
+ panic(internalErrorf("encoding mistake: %d, %v, %v => %d", len(b), signed, negative, n))
+ }
+
+ w.data.WriteByte(byte(n))
+ w.data.Write(b)
+}
+
+// mpfloat exports a multi-precision floating point number.
+//
+// The number's value is decomposed into mantissa × 2**exponent, where
+// mantissa is an integer. The value is written out as mantissa (as a
+// multi-precision integer) and then the exponent, except exponent is
+// omitted if mantissa is zero.
+func (w *exportWriter) mpfloat(f *big.Float, typ types.Type) {
+ if f.IsInf() {
+ panic("infinite constant")
+ }
+
+ // Break into f = mant × 2**exp, with 0.5 <= mant < 1.
+ var mant big.Float
+ exp := int64(f.MantExp(&mant))
+
+ // Scale so that mant is an integer.
+ prec := mant.MinPrec()
+ mant.SetMantExp(&mant, int(prec))
+ exp -= int64(prec)
+
+ manti, acc := mant.Int(nil)
+ if acc != big.Exact {
+ panic(internalErrorf("mantissa scaling failed for %f (%s)", f, acc))
+ }
+ w.mpint(manti, typ)
+ if manti.Sign() != 0 {
+ w.int64(exp)
+ }
+}
+
+func (w *exportWriter) bool(b bool) bool {
+ var x uint64
+ if b {
+ x = 1
+ }
+ w.uint64(x)
+ return b
+}
+
+func (w *exportWriter) int64(x int64) { w.data.int64(x) }
+func (w *exportWriter) uint64(x uint64) { w.data.uint64(x) }
+func (w *exportWriter) string(s string) { w.uint64(w.p.stringOff(s)) }
+
+func (w *exportWriter) localIdent(obj types.Object) {
+ // Anonymous parameters.
+ if obj == nil {
+ w.string("")
+ return
+ }
+
+ name := obj.Name()
+ if name == "_" {
+ w.string("_")
+ return
+ }
+
+ w.string(name)
+}
+
+type intWriter struct {
+ bytes.Buffer
+}
+
+func (w *intWriter) int64(x int64) {
+ var buf [binary.MaxVarintLen64]byte
+ n := binary.PutVarint(buf[:], x)
+ w.Write(buf[:n])
+}
+
+func (w *intWriter) uint64(x uint64) {
+ var buf [binary.MaxVarintLen64]byte
+ n := binary.PutUvarint(buf[:], x)
+ w.Write(buf[:n])
+}
+
+func assert(cond bool) {
+ if !cond {
+ panic("internal error: assertion failed")
+ }
+}
+
+// The below is copied from go/src/cmd/compile/internal/gc/syntax.go.
+
+// objQueue is a FIFO queue of types.Object. The zero value of objQueue is
+// a ready-to-use empty queue.
+type objQueue struct {
+ ring []types.Object
+ head, tail int
+}
+
+// empty returns true if q contains no Nodes.
+func (q *objQueue) empty() bool {
+ return q.head == q.tail
+}
+
+// pushTail appends n to the tail of the queue.
+func (q *objQueue) pushTail(obj types.Object) {
+ if len(q.ring) == 0 {
+ q.ring = make([]types.Object, 16)
+ } else if q.head+len(q.ring) == q.tail {
+ // Grow the ring.
+ nring := make([]types.Object, len(q.ring)*2)
+ // Copy the old elements.
+ part := q.ring[q.head%len(q.ring):]
+ if q.tail-q.head <= len(part) {
+ part = part[:q.tail-q.head]
+ copy(nring, part)
+ } else {
+ pos := copy(nring, part)
+ copy(nring[pos:], q.ring[:q.tail%len(q.ring)])
+ }
+ q.ring, q.head, q.tail = nring, 0, q.tail-q.head
+ }
+
+ q.ring[q.tail%len(q.ring)] = obj
+ q.tail++
+}
+
+// popHead pops a node from the head of the queue. It panics if q is empty.
+func (q *objQueue) popHead() types.Object {
+ if q.empty() {
+ panic("dequeue empty")
+ }
+ obj := q.ring[q.head%len(q.ring)]
+ q.head++
+ return obj
+}
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go b/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go
new file mode 100644
index 00000000000..3cb7ae5b9ea
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/iimport.go
@@ -0,0 +1,606 @@
+// 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.
+
+// Indexed package import.
+// See cmd/compile/internal/gc/iexport.go for the export data format.
+
+// This file is a copy of $GOROOT/src/go/internal/gcimporter/iimport.go.
+
+package gcimporter
+
+import (
+ "bytes"
+ "encoding/binary"
+ "fmt"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "io"
+ "sort"
+)
+
+type intReader struct {
+ *bytes.Reader
+ path string
+}
+
+func (r *intReader) int64() int64 {
+ i, err := binary.ReadVarint(r.Reader)
+ if err != nil {
+ errorf("import %q: read varint error: %v", r.path, err)
+ }
+ return i
+}
+
+func (r *intReader) uint64() uint64 {
+ i, err := binary.ReadUvarint(r.Reader)
+ if err != nil {
+ errorf("import %q: read varint error: %v", r.path, err)
+ }
+ return i
+}
+
+const predeclReserved = 32
+
+type itag uint64
+
+const (
+ // Types
+ definedType itag = iota
+ pointerType
+ sliceType
+ arrayType
+ chanType
+ mapType
+ signatureType
+ structType
+ interfaceType
+)
+
+// IImportData imports a package from the serialized package data
+// and returns the number of bytes consumed and a reference to the package.
+// If the export data version is not recognized or the format is otherwise
+// compromised, an error is returned.
+func IImportData(fset *token.FileSet, imports map[string]*types.Package, data []byte, path string) (_ int, pkg *types.Package, err error) {
+ const currentVersion = 0
+ version := -1
+ defer func() {
+ if e := recover(); e != nil {
+ if version > currentVersion {
+ err = fmt.Errorf("cannot import %q (%v), export data is newer version - update tool", path, e)
+ } else {
+ err = fmt.Errorf("cannot import %q (%v), possibly version skew - reinstall package", path, e)
+ }
+ }
+ }()
+
+ r := &intReader{bytes.NewReader(data), path}
+
+ version = int(r.uint64())
+ switch version {
+ case currentVersion:
+ default:
+ errorf("unknown iexport format version %d", version)
+ }
+
+ sLen := int64(r.uint64())
+ dLen := int64(r.uint64())
+
+ whence, _ := r.Seek(0, io.SeekCurrent)
+ stringData := data[whence : whence+sLen]
+ declData := data[whence+sLen : whence+sLen+dLen]
+ r.Seek(sLen+dLen, io.SeekCurrent)
+
+ p := iimporter{
+ ipath: path,
+
+ stringData: stringData,
+ stringCache: make(map[uint64]string),
+ pkgCache: make(map[uint64]*types.Package),
+
+ declData: declData,
+ pkgIndex: make(map[*types.Package]map[string]uint64),
+ typCache: make(map[uint64]types.Type),
+
+ fake: fakeFileSet{
+ fset: fset,
+ files: make(map[string]*token.File),
+ },
+ }
+
+ for i, pt := range predeclared() {
+ p.typCache[uint64(i)] = pt
+ }
+
+ pkgList := make([]*types.Package, r.uint64())
+ for i := range pkgList {
+ pkgPathOff := r.uint64()
+ pkgPath := p.stringAt(pkgPathOff)
+ pkgName := p.stringAt(r.uint64())
+ _ = r.uint64() // package height; unused by go/types
+
+ if pkgPath == "" {
+ pkgPath = path
+ }
+ pkg := imports[pkgPath]
+ if pkg == nil {
+ pkg = types.NewPackage(pkgPath, pkgName)
+ imports[pkgPath] = pkg
+ } else if pkg.Name() != pkgName {
+ errorf("conflicting names %s and %s for package %q", pkg.Name(), pkgName, path)
+ }
+
+ p.pkgCache[pkgPathOff] = pkg
+
+ nameIndex := make(map[string]uint64)
+ for nSyms := r.uint64(); nSyms > 0; nSyms-- {
+ name := p.stringAt(r.uint64())
+ nameIndex[name] = r.uint64()
+ }
+
+ p.pkgIndex[pkg] = nameIndex
+ pkgList[i] = pkg
+ }
+ var localpkg *types.Package
+ for _, pkg := range pkgList {
+ if pkg.Path() == path {
+ localpkg = pkg
+ }
+ }
+
+ names := make([]string, 0, len(p.pkgIndex[localpkg]))
+ for name := range p.pkgIndex[localpkg] {
+ names = append(names, name)
+ }
+ sort.Strings(names)
+ for _, name := range names {
+ p.doDecl(localpkg, name)
+ }
+
+ for _, typ := range p.interfaceList {
+ typ.Complete()
+ }
+
+ // record all referenced packages as imports
+ list := append(([]*types.Package)(nil), pkgList[1:]...)
+ sort.Sort(byPath(list))
+ localpkg.SetImports(list)
+
+ // package was imported completely and without errors
+ localpkg.MarkComplete()
+
+ consumed, _ := r.Seek(0, io.SeekCurrent)
+ return int(consumed), localpkg, nil
+}
+
+type iimporter struct {
+ ipath string
+
+ stringData []byte
+ stringCache map[uint64]string
+ pkgCache map[uint64]*types.Package
+
+ declData []byte
+ pkgIndex map[*types.Package]map[string]uint64
+ typCache map[uint64]types.Type
+
+ fake fakeFileSet
+ interfaceList []*types.Interface
+}
+
+func (p *iimporter) doDecl(pkg *types.Package, name string) {
+ // See if we've already imported this declaration.
+ if obj := pkg.Scope().Lookup(name); obj != nil {
+ return
+ }
+
+ off, ok := p.pkgIndex[pkg][name]
+ if !ok {
+ errorf("%v.%v not in index", pkg, name)
+ }
+
+ r := &importReader{p: p, currPkg: pkg}
+ r.declReader.Reset(p.declData[off:])
+
+ r.obj(name)
+}
+
+func (p *iimporter) stringAt(off uint64) string {
+ if s, ok := p.stringCache[off]; ok {
+ return s
+ }
+
+ slen, n := binary.Uvarint(p.stringData[off:])
+ if n <= 0 {
+ errorf("varint failed")
+ }
+ spos := off + uint64(n)
+ s := string(p.stringData[spos : spos+slen])
+ p.stringCache[off] = s
+ return s
+}
+
+func (p *iimporter) pkgAt(off uint64) *types.Package {
+ if pkg, ok := p.pkgCache[off]; ok {
+ return pkg
+ }
+ path := p.stringAt(off)
+ errorf("missing package %q in %q", path, p.ipath)
+ return nil
+}
+
+func (p *iimporter) typAt(off uint64, base *types.Named) types.Type {
+ if t, ok := p.typCache[off]; ok && (base == nil || !isInterface(t)) {
+ return t
+ }
+
+ if off < predeclReserved {
+ errorf("predeclared type missing from cache: %v", off)
+ }
+
+ r := &importReader{p: p}
+ r.declReader.Reset(p.declData[off-predeclReserved:])
+ t := r.doType(base)
+
+ if base == nil || !isInterface(t) {
+ p.typCache[off] = t
+ }
+ return t
+}
+
+type importReader struct {
+ p *iimporter
+ declReader bytes.Reader
+ currPkg *types.Package
+ prevFile string
+ prevLine int64
+}
+
+func (r *importReader) obj(name string) {
+ tag := r.byte()
+ pos := r.pos()
+
+ switch tag {
+ case 'A':
+ typ := r.typ()
+
+ r.declare(types.NewTypeName(pos, r.currPkg, name, typ))
+
+ case 'C':
+ typ, val := r.value()
+
+ r.declare(types.NewConst(pos, r.currPkg, name, typ, val))
+
+ case 'F':
+ sig := r.signature(nil)
+
+ r.declare(types.NewFunc(pos, r.currPkg, name, sig))
+
+ case 'T':
+ // Types can be recursive. We need to setup a stub
+ // declaration before recursing.
+ obj := types.NewTypeName(pos, r.currPkg, name, nil)
+ named := types.NewNamed(obj, nil, nil)
+ r.declare(obj)
+
+ underlying := r.p.typAt(r.uint64(), named).Underlying()
+ named.SetUnderlying(underlying)
+
+ if !isInterface(underlying) {
+ for n := r.uint64(); n > 0; n-- {
+ mpos := r.pos()
+ mname := r.ident()
+ recv := r.param()
+ msig := r.signature(recv)
+
+ named.AddMethod(types.NewFunc(mpos, r.currPkg, mname, msig))
+ }
+ }
+
+ case 'V':
+ typ := r.typ()
+
+ r.declare(types.NewVar(pos, r.currPkg, name, typ))
+
+ default:
+ errorf("unexpected tag: %v", tag)
+ }
+}
+
+func (r *importReader) declare(obj types.Object) {
+ obj.Pkg().Scope().Insert(obj)
+}
+
+func (r *importReader) value() (typ types.Type, val constant.Value) {
+ typ = r.typ()
+
+ switch b := typ.Underlying().(*types.Basic); b.Info() & types.IsConstType {
+ case types.IsBoolean:
+ val = constant.MakeBool(r.bool())
+
+ case types.IsString:
+ val = constant.MakeString(r.string())
+
+ case types.IsInteger:
+ val = r.mpint(b)
+
+ case types.IsFloat:
+ val = r.mpfloat(b)
+
+ case types.IsComplex:
+ re := r.mpfloat(b)
+ im := r.mpfloat(b)
+ val = constant.BinaryOp(re, token.ADD, constant.MakeImag(im))
+
+ default:
+ if b.Kind() == types.Invalid {
+ val = constant.MakeUnknown()
+ return
+ }
+ errorf("unexpected type %v", typ) // panics
+ panic("unreachable")
+ }
+
+ return
+}
+
+func intSize(b *types.Basic) (signed bool, maxBytes uint) {
+ if (b.Info() & types.IsUntyped) != 0 {
+ return true, 64
+ }
+
+ switch b.Kind() {
+ case types.Float32, types.Complex64:
+ return true, 3
+ case types.Float64, types.Complex128:
+ return true, 7
+ }
+
+ signed = (b.Info() & types.IsUnsigned) == 0
+ switch b.Kind() {
+ case types.Int8, types.Uint8:
+ maxBytes = 1
+ case types.Int16, types.Uint16:
+ maxBytes = 2
+ case types.Int32, types.Uint32:
+ maxBytes = 4
+ default:
+ maxBytes = 8
+ }
+
+ return
+}
+
+func (r *importReader) mpint(b *types.Basic) constant.Value {
+ signed, maxBytes := intSize(b)
+
+ maxSmall := 256 - maxBytes
+ if signed {
+ maxSmall = 256 - 2*maxBytes
+ }
+ if maxBytes == 1 {
+ maxSmall = 256
+ }
+
+ n, _ := r.declReader.ReadByte()
+ if uint(n) < maxSmall {
+ v := int64(n)
+ if signed {
+ v >>= 1
+ if n&1 != 0 {
+ v = ^v
+ }
+ }
+ return constant.MakeInt64(v)
+ }
+
+ v := -n
+ if signed {
+ v = -(n &^ 1) >> 1
+ }
+ if v < 1 || uint(v) > maxBytes {
+ errorf("weird decoding: %v, %v => %v", n, signed, v)
+ }
+
+ buf := make([]byte, v)
+ io.ReadFull(&r.declReader, buf)
+
+ // convert to little endian
+ // TODO(gri) go/constant should have a more direct conversion function
+ // (e.g., once it supports a big.Float based implementation)
+ for i, j := 0, len(buf)-1; i < j; i, j = i+1, j-1 {
+ buf[i], buf[j] = buf[j], buf[i]
+ }
+
+ x := constant.MakeFromBytes(buf)
+ if signed && n&1 != 0 {
+ x = constant.UnaryOp(token.SUB, x, 0)
+ }
+ return x
+}
+
+func (r *importReader) mpfloat(b *types.Basic) constant.Value {
+ x := r.mpint(b)
+ if constant.Sign(x) == 0 {
+ return x
+ }
+
+ exp := r.int64()
+ switch {
+ case exp > 0:
+ x = constant.Shift(x, token.SHL, uint(exp))
+ case exp < 0:
+ d := constant.Shift(constant.MakeInt64(1), token.SHL, uint(-exp))
+ x = constant.BinaryOp(x, token.QUO, d)
+ }
+ return x
+}
+
+func (r *importReader) ident() string {
+ return r.string()
+}
+
+func (r *importReader) qualifiedIdent() (*types.Package, string) {
+ name := r.string()
+ pkg := r.pkg()
+ return pkg, name
+}
+
+func (r *importReader) pos() token.Pos {
+ delta := r.int64()
+ if delta != deltaNewFile {
+ r.prevLine += delta
+ } else if l := r.int64(); l == -1 {
+ r.prevLine += deltaNewFile
+ } else {
+ r.prevFile = r.string()
+ r.prevLine = l
+ }
+
+ if r.prevFile == "" && r.prevLine == 0 {
+ return token.NoPos
+ }
+
+ return r.p.fake.pos(r.prevFile, int(r.prevLine))
+}
+
+func (r *importReader) typ() types.Type {
+ return r.p.typAt(r.uint64(), nil)
+}
+
+func isInterface(t types.Type) bool {
+ _, ok := t.(*types.Interface)
+ return ok
+}
+
+func (r *importReader) pkg() *types.Package { return r.p.pkgAt(r.uint64()) }
+func (r *importReader) string() string { return r.p.stringAt(r.uint64()) }
+
+func (r *importReader) doType(base *types.Named) types.Type {
+ switch k := r.kind(); k {
+ default:
+ errorf("unexpected kind tag in %q: %v", r.p.ipath, k)
+ return nil
+
+ case definedType:
+ pkg, name := r.qualifiedIdent()
+ r.p.doDecl(pkg, name)
+ return pkg.Scope().Lookup(name).(*types.TypeName).Type()
+ case pointerType:
+ return types.NewPointer(r.typ())
+ case sliceType:
+ return types.NewSlice(r.typ())
+ case arrayType:
+ n := r.uint64()
+ return types.NewArray(r.typ(), int64(n))
+ case chanType:
+ dir := chanDir(int(r.uint64()))
+ return types.NewChan(dir, r.typ())
+ case mapType:
+ return types.NewMap(r.typ(), r.typ())
+ case signatureType:
+ r.currPkg = r.pkg()
+ return r.signature(nil)
+
+ case structType:
+ r.currPkg = r.pkg()
+
+ fields := make([]*types.Var, r.uint64())
+ tags := make([]string, len(fields))
+ for i := range fields {
+ fpos := r.pos()
+ fname := r.ident()
+ ftyp := r.typ()
+ emb := r.bool()
+ tag := r.string()
+
+ fields[i] = types.NewField(fpos, r.currPkg, fname, ftyp, emb)
+ tags[i] = tag
+ }
+ return types.NewStruct(fields, tags)
+
+ case interfaceType:
+ r.currPkg = r.pkg()
+
+ embeddeds := make([]types.Type, r.uint64())
+ for i := range embeddeds {
+ _ = r.pos()
+ embeddeds[i] = r.typ()
+ }
+
+ methods := make([]*types.Func, r.uint64())
+ for i := range methods {
+ mpos := r.pos()
+ mname := r.ident()
+
+ // TODO(mdempsky): Matches bimport.go, but I
+ // don't agree with this.
+ var recv *types.Var
+ if base != nil {
+ recv = types.NewVar(token.NoPos, r.currPkg, "", base)
+ }
+
+ msig := r.signature(recv)
+ methods[i] = types.NewFunc(mpos, r.currPkg, mname, msig)
+ }
+
+ typ := newInterface(methods, embeddeds)
+ r.p.interfaceList = append(r.p.interfaceList, typ)
+ return typ
+ }
+}
+
+func (r *importReader) kind() itag {
+ return itag(r.uint64())
+}
+
+func (r *importReader) signature(recv *types.Var) *types.Signature {
+ params := r.paramList()
+ results := r.paramList()
+ variadic := params.Len() > 0 && r.bool()
+ return types.NewSignature(recv, params, results, variadic)
+}
+
+func (r *importReader) paramList() *types.Tuple {
+ xs := make([]*types.Var, r.uint64())
+ for i := range xs {
+ xs[i] = r.param()
+ }
+ return types.NewTuple(xs...)
+}
+
+func (r *importReader) param() *types.Var {
+ pos := r.pos()
+ name := r.ident()
+ typ := r.typ()
+ return types.NewParam(pos, r.currPkg, name, typ)
+}
+
+func (r *importReader) bool() bool {
+ return r.uint64() != 0
+}
+
+func (r *importReader) int64() int64 {
+ n, err := binary.ReadVarint(&r.declReader)
+ if err != nil {
+ errorf("readVarint: %v", err)
+ }
+ return n
+}
+
+func (r *importReader) uint64() uint64 {
+ n, err := binary.ReadUvarint(&r.declReader)
+ if err != nil {
+ errorf("readUvarint: %v", err)
+ }
+ return n
+}
+
+func (r *importReader) byte() byte {
+ x, err := r.declReader.ReadByte()
+ if err != nil {
+ errorf("declReader.ReadByte: %v", err)
+ }
+ return x
+}
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go
new file mode 100644
index 00000000000..463f2522714
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface10.go
@@ -0,0 +1,21 @@
+// 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.
+
+// +build !go1.11
+
+package gcimporter
+
+import "go/types"
+
+func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
+ named := make([]*types.Named, len(embeddeds))
+ for i, e := range embeddeds {
+ var ok bool
+ named[i], ok = e.(*types.Named)
+ if !ok {
+ panic("embedding of non-defined interfaces in interfaces is not supported before Go 1.11")
+ }
+ }
+ return types.NewInterface(methods, named)
+}
diff --git a/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go
new file mode 100644
index 00000000000..ab28b95cbb8
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/gcimporter/newInterface11.go
@@ -0,0 +1,13 @@
+// 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.
+
+// +build go1.11
+
+package gcimporter
+
+import "go/types"
+
+func newInterface(methods []*types.Func, embeddeds []types.Type) *types.Interface {
+ return types.NewInterfaceType(methods, embeddeds)
+}
diff --git a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go
new file mode 100644
index 00000000000..fdc7da05689
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go
@@ -0,0 +1,160 @@
+// 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 packagesdriver fetches type sizes for go/packages and go/analysis.
+package packagesdriver
+
+import (
+ "bytes"
+ "context"
+ "encoding/json"
+ "fmt"
+ "go/types"
+ "log"
+ "os"
+ "os/exec"
+ "strings"
+ "time"
+)
+
+var debug = false
+
+// GetSizes returns the sizes used by the underlying driver with the given parameters.
+func GetSizes(ctx context.Context, buildFlags, env []string, dir string, usesExportData bool) (types.Sizes, error) {
+ // TODO(matloob): Clean this up. This code is mostly a copy of packages.findExternalDriver.
+ const toolPrefix = "GOPACKAGESDRIVER="
+ tool := ""
+ for _, env := range env {
+ if val := strings.TrimPrefix(env, toolPrefix); val != env {
+ tool = val
+ }
+ }
+
+ if tool == "" {
+ var err error
+ tool, err = exec.LookPath("gopackagesdriver")
+ if err != nil {
+ // We did not find the driver, so use "go list".
+ tool = "off"
+ }
+ }
+
+ if tool == "off" {
+ return GetSizesGolist(ctx, buildFlags, env, dir, usesExportData)
+ }
+
+ req, err := json.Marshal(struct {
+ Command string `json:"command"`
+ Env []string `json:"env"`
+ BuildFlags []string `json:"build_flags"`
+ }{
+ Command: "sizes",
+ Env: env,
+ BuildFlags: buildFlags,
+ })
+ if err != nil {
+ return nil, fmt.Errorf("failed to encode message to driver tool: %v", err)
+ }
+
+ buf := new(bytes.Buffer)
+ cmd := exec.CommandContext(ctx, tool)
+ cmd.Dir = dir
+ cmd.Env = env
+ cmd.Stdin = bytes.NewReader(req)
+ cmd.Stdout = buf
+ cmd.Stderr = new(bytes.Buffer)
+ if err := cmd.Run(); err != nil {
+ return nil, fmt.Errorf("%v: %v: %s", tool, err, cmd.Stderr)
+ }
+ var response struct {
+ // Sizes, if not nil, is the types.Sizes to use when type checking.
+ Sizes *types.StdSizes
+ }
+ if err := json.Unmarshal(buf.Bytes(), &response); err != nil {
+ return nil, err
+ }
+ return response.Sizes, nil
+}
+
+func GetSizesGolist(ctx context.Context, buildFlags, env []string, dir string, usesExportData bool) (types.Sizes, error) {
+ args := []string{"list", "-f", "{{context.GOARCH}} {{context.Compiler}}"}
+ args = append(args, buildFlags...)
+ args = append(args, "--", "unsafe")
+ stdout, err := InvokeGo(ctx, env, dir, usesExportData, args...)
+ if err != nil {
+ return nil, err
+ }
+ fields := strings.Fields(stdout.String())
+ if len(fields) < 2 {
+ return nil, fmt.Errorf("could not determine GOARCH and Go compiler")
+ }
+ goarch := fields[0]
+ compiler := fields[1]
+ return types.SizesFor(compiler, goarch), nil
+}
+
+// InvokeGo returns the stdout of a go command invocation.
+func InvokeGo(ctx context.Context, env []string, dir string, usesExportData bool, args ...string) (*bytes.Buffer, error) {
+ if debug {
+ defer func(start time.Time) { log.Printf("%s for %v", time.Since(start), cmdDebugStr(env, args...)) }(time.Now())
+ }
+ stdout := new(bytes.Buffer)
+ stderr := new(bytes.Buffer)
+ cmd := exec.CommandContext(ctx, "go", args...)
+ // On darwin the cwd gets resolved to the real path, which breaks anything that
+ // expects the working directory to keep the original path, including the
+ // go command when dealing with modules.
+ // The Go stdlib has a special feature where if the cwd and the PWD are the
+ // same node then it trusts the PWD, so by setting it in the env for the child
+ // process we fix up all the paths returned by the go command.
+ cmd.Env = append(append([]string{}, env...), "PWD="+dir)
+ cmd.Dir = dir
+ cmd.Stdout = stdout
+ cmd.Stderr = stderr
+ if err := cmd.Run(); err != nil {
+ exitErr, ok := err.(*exec.ExitError)
+ if !ok {
+ // Catastrophic error:
+ // - executable not found
+ // - context cancellation
+ return nil, fmt.Errorf("couldn't exec 'go %v': %s %T", args, err, err)
+ }
+
+ // Export mode entails a build.
+ // If that build fails, errors appear on stderr
+ // (despite the -e flag) and the Export field is blank.
+ // Do not fail in that case.
+ if !usesExportData {
+ return nil, fmt.Errorf("go %v: %s: %s", args, exitErr, stderr)
+ }
+ }
+
+ // As of writing, go list -export prints some non-fatal compilation
+ // errors to stderr, even with -e set. We would prefer that it put
+ // them in the Package.Error JSON (see https://golang.org/issue/26319).
+ // In the meantime, there's nowhere good to put them, but they can
+ // be useful for debugging. Print them if $GOPACKAGESPRINTGOLISTERRORS
+ // is set.
+ if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTGOLISTERRORS") != "" {
+ fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(env, args...), stderr)
+ }
+
+ // debugging
+ if false {
+ fmt.Fprintf(os.Stderr, "%s stdout: <<%s>>\n", cmdDebugStr(env, args...), stdout)
+ }
+
+ return stdout, nil
+}
+
+func cmdDebugStr(envlist []string, args ...string) string {
+ env := make(map[string]string)
+ for _, kv := range envlist {
+ split := strings.Split(kv, "=")
+ k, v := split[0], split[1]
+ env[k] = v
+ }
+
+ return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["PWD"], args)
+}
diff --git a/vendor/golang.org/x/tools/go/loader/doc.go b/vendor/golang.org/x/tools/go/loader/doc.go
new file mode 100644
index 00000000000..9b51c9ecde0
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/loader/doc.go
@@ -0,0 +1,205 @@
+// 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.
+
+// Package loader loads a complete Go program from source code, parsing
+// and type-checking the initial packages plus their transitive closure
+// of dependencies. The ASTs and the derived facts are retained for
+// later use.
+//
+// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
+//
+// The package defines two primary types: Config, which specifies a
+// set of initial packages to load and various other options; and
+// Program, which is the result of successfully loading the packages
+// specified by a configuration.
+//
+// The configuration can be set directly, but *Config provides various
+// convenience methods to simplify the common cases, each of which can
+// be called any number of times. Finally, these are followed by a
+// call to Load() to actually load and type-check the program.
+//
+// var conf loader.Config
+//
+// // Use the command-line arguments to specify
+// // a set of initial packages to load from source.
+// // See FromArgsUsage for help.
+// rest, err := conf.FromArgs(os.Args[1:], wantTests)
+//
+// // Parse the specified files and create an ad hoc package with path "foo".
+// // All files must have the same 'package' declaration.
+// conf.CreateFromFilenames("foo", "foo.go", "bar.go")
+//
+// // Create an ad hoc package with path "foo" from
+// // the specified already-parsed files.
+// // All ASTs must have the same 'package' declaration.
+// conf.CreateFromFiles("foo", parsedFiles)
+//
+// // Add "runtime" to the set of packages to be loaded.
+// conf.Import("runtime")
+//
+// // Adds "fmt" and "fmt_test" to the set of packages
+// // to be loaded. "fmt" will include *_test.go files.
+// conf.ImportWithTests("fmt")
+//
+// // Finally, load all the packages specified by the configuration.
+// prog, err := conf.Load()
+//
+// See examples_test.go for examples of API usage.
+//
+//
+// CONCEPTS AND TERMINOLOGY
+//
+// The WORKSPACE is the set of packages accessible to the loader. The
+// workspace is defined by Config.Build, a *build.Context. The
+// default context treats subdirectories of $GOROOT and $GOPATH as
+// packages, but this behavior may be overridden.
+//
+// An AD HOC package is one specified as a set of source files on the
+// command line. In the simplest case, it may consist of a single file
+// such as $GOROOT/src/net/http/triv.go.
+//
+// EXTERNAL TEST packages are those comprised of a set of *_test.go
+// files all with the same 'package foo_test' declaration, all in the
+// same directory. (go/build.Package calls these files XTestFiles.)
+//
+// An IMPORTABLE package is one that can be referred to by some import
+// spec. Every importable package is uniquely identified by its
+// PACKAGE PATH or just PATH, a string such as "fmt", "encoding/json",
+// or "cmd/vendor/golang.org/x/arch/x86/x86asm". A package path
+// typically denotes a subdirectory of the workspace.
+//
+// An import declaration uses an IMPORT PATH to refer to a package.
+// Most import declarations use the package path as the import path.
+//
+// Due to VENDORING (https://golang.org/s/go15vendor), the
+// interpretation of an import path may depend on the directory in which
+// it appears. To resolve an import path to a package path, go/build
+// must search the enclosing directories for a subdirectory named
+// "vendor".
+//
+// ad hoc packages and external test packages are NON-IMPORTABLE. The
+// path of an ad hoc package is inferred from the package
+// declarations of its files and is therefore not a unique package key.
+// For example, Config.CreatePkgs may specify two initial ad hoc
+// packages, both with path "main".
+//
+// An AUGMENTED package is an importable package P plus all the
+// *_test.go files with same 'package foo' declaration as P.
+// (go/build.Package calls these files TestFiles.)
+//
+// The INITIAL packages are those specified in the configuration. A
+// DEPENDENCY is a package loaded to satisfy an import in an initial
+// package or another dependency.
+//
+package loader
+
+// IMPLEMENTATION NOTES
+//
+// 'go test', in-package test files, and import cycles
+// ---------------------------------------------------
+//
+// An external test package may depend upon members of the augmented
+// package that are not in the unaugmented package, such as functions
+// that expose internals. (See bufio/export_test.go for an example.)
+// So, the loader must ensure that for each external test package
+// it loads, it also augments the corresponding non-test package.
+//
+// The import graph over n unaugmented packages must be acyclic; the
+// import graph over n-1 unaugmented packages plus one augmented
+// package must also be acyclic. ('go test' relies on this.) But the
+// import graph over n augmented packages may contain cycles.
+//
+// First, all the (unaugmented) non-test packages and their
+// dependencies are imported in the usual way; the loader reports an
+// error if it detects an import cycle.
+//
+// Then, each package P for which testing is desired is augmented by
+// the list P' of its in-package test files, by calling
+// (*types.Checker).Files. This arrangement ensures that P' may
+// reference definitions within P, but P may not reference definitions
+// within P'. Furthermore, P' may import any other package, including
+// ones that depend upon P, without an import cycle error.
+//
+// Consider two packages A and B, both of which have lists of
+// in-package test files we'll call A' and B', and which have the
+// following import graph edges:
+// B imports A
+// B' imports A
+// A' imports B
+// This last edge would be expected to create an error were it not
+// for the special type-checking discipline above.
+// Cycles of size greater than two are possible. For example:
+// compress/bzip2/bzip2_test.go (package bzip2) imports "io/ioutil"
+// io/ioutil/tempfile_test.go (package ioutil) imports "regexp"
+// regexp/exec_test.go (package regexp) imports "compress/bzip2"
+//
+//
+// Concurrency
+// -----------
+//
+// Let us define the import dependency graph as follows. Each node is a
+// list of files passed to (Checker).Files at once. Many of these lists
+// are the production code of an importable Go package, so those nodes
+// are labelled by the package's path. The remaining nodes are
+// ad hoc packages and lists of in-package *_test.go files that augment
+// an importable package; those nodes have no label.
+//
+// The edges of the graph represent import statements appearing within a
+// file. An edge connects a node (a list of files) to the node it
+// imports, which is importable and thus always labelled.
+//
+// Loading is controlled by this dependency graph.
+//
+// To reduce I/O latency, we start loading a package's dependencies
+// asynchronously as soon as we've parsed its files and enumerated its
+// imports (scanImports). This performs a preorder traversal of the
+// import dependency graph.
+//
+// To exploit hardware parallelism, we type-check unrelated packages in
+// parallel, where "unrelated" means not ordered by the partial order of
+// the import dependency graph.
+//
+// We use a concurrency-safe non-blocking cache (importer.imported) to
+// record the results of type-checking, whether success or failure. An
+// entry is created in this cache by startLoad the first time the
+// package is imported. The first goroutine to request an entry becomes
+// responsible for completing the task and broadcasting completion to
+// subsequent requestors, which block until then.
+//
+// Type checking occurs in (parallel) postorder: we cannot type-check a
+// set of files until we have loaded and type-checked all of their
+// immediate dependencies (and thus all of their transitive
+// dependencies). If the input were guaranteed free of import cycles,
+// this would be trivial: we could simply wait for completion of the
+// dependencies and then invoke the typechecker.
+//
+// But as we saw in the 'go test' section above, some cycles in the
+// import graph over packages are actually legal, so long as the
+// cycle-forming edge originates in the in-package test files that
+// augment the package. This explains why the nodes of the import
+// dependency graph are not packages, but lists of files: the unlabelled
+// nodes avoid the cycles. Consider packages A and B where B imports A
+// and A's in-package tests AT import B. The naively constructed import
+// graph over packages would contain a cycle (A+AT) --> B --> (A+AT) but
+// the graph over lists of files is AT --> B --> A, where AT is an
+// unlabelled node.
+//
+// Awaiting completion of the dependencies in a cyclic graph would
+// deadlock, so we must materialize the import dependency graph (as
+// importer.graph) and check whether each import edge forms a cycle. If
+// x imports y, and the graph already contains a path from y to x, then
+// there is an import cycle, in which case the processing of x must not
+// wait for the completion of processing of y.
+//
+// When the type-checker makes a callback (doImport) to the loader for a
+// given import edge, there are two possible cases. In the normal case,
+// the dependency has already been completely type-checked; doImport
+// does a cache lookup and returns it. In the cyclic case, the entry in
+// the cache is still necessarily incomplete, indicating a cycle. We
+// perform the cycle check again to obtain the error message, and return
+// the error.
+//
+// The result of using concurrency is about a 2.5x speedup for stdlib_test.
+
+// TODO(adonovan): overhaul the package documentation.
diff --git a/vendor/golang.org/x/tools/go/loader/loader.go b/vendor/golang.org/x/tools/go/loader/loader.go
new file mode 100644
index 00000000000..de34b809c47
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/loader/loader.go
@@ -0,0 +1,1078 @@
+// 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 loader
+
+// See doc.go for package documentation and implementation notes.
+
+import (
+ "errors"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "go/types"
+ "os"
+ "path/filepath"
+ "sort"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/tools/go/ast/astutil"
+ "golang.org/x/tools/go/internal/cgo"
+)
+
+var ignoreVendor build.ImportMode
+
+const trace = false // show timing info for type-checking
+
+// Config specifies the configuration for loading a whole program from
+// Go source code.
+// The zero value for Config is a ready-to-use default configuration.
+type Config struct {
+ // Fset is the file set for the parser to use when loading the
+ // program. If nil, it may be lazily initialized by any
+ // method of Config.
+ Fset *token.FileSet
+
+ // ParserMode specifies the mode to be used by the parser when
+ // loading source packages.
+ ParserMode parser.Mode
+
+ // TypeChecker contains options relating to the type checker.
+ //
+ // The supplied IgnoreFuncBodies is not used; the effective
+ // value comes from the TypeCheckFuncBodies func below.
+ // The supplied Import function is not used either.
+ TypeChecker types.Config
+
+ // TypeCheckFuncBodies is a predicate over package paths.
+ // A package for which the predicate is false will
+ // have its package-level declarations type checked, but not
+ // its function bodies; this can be used to quickly load
+ // dependencies from source. If nil, all func bodies are type
+ // checked.
+ TypeCheckFuncBodies func(path string) bool
+
+ // If Build is non-nil, it is used to locate source packages.
+ // Otherwise &build.Default is used.
+ //
+ // By default, cgo is invoked to preprocess Go files that
+ // import the fake package "C". This behaviour can be
+ // disabled by setting CGO_ENABLED=0 in the environment prior
+ // to startup, or by setting Build.CgoEnabled=false.
+ Build *build.Context
+
+ // The current directory, used for resolving relative package
+ // references such as "./go/loader". If empty, os.Getwd will be
+ // used instead.
+ Cwd string
+
+ // If DisplayPath is non-nil, it is used to transform each
+ // file name obtained from Build.Import(). This can be used
+ // to prevent a virtualized build.Config's file names from
+ // leaking into the user interface.
+ DisplayPath func(path string) string
+
+ // If AllowErrors is true, Load will return a Program even
+ // if some of the its packages contained I/O, parser or type
+ // errors; such errors are accessible via PackageInfo.Errors. If
+ // false, Load will fail if any package had an error.
+ AllowErrors bool
+
+ // CreatePkgs specifies a list of non-importable initial
+ // packages to create. The resulting packages will appear in
+ // the corresponding elements of the Program.Created slice.
+ CreatePkgs []PkgSpec
+
+ // ImportPkgs specifies a set of initial packages to load.
+ // The map keys are package paths.
+ //
+ // The map value indicates whether to load tests. If true, Load
+ // will add and type-check two lists of files to the package:
+ // non-test files followed by in-package *_test.go files. In
+ // addition, it will append the external test package (if any)
+ // to Program.Created.
+ ImportPkgs map[string]bool
+
+ // FindPackage is called during Load to create the build.Package
+ // for a given import path from a given directory.
+ // If FindPackage is nil, (*build.Context).Import is used.
+ // A client may use this hook to adapt to a proprietary build
+ // system that does not follow the "go build" layout
+ // conventions, for example.
+ //
+ // It must be safe to call concurrently from multiple goroutines.
+ FindPackage func(ctxt *build.Context, importPath, fromDir string, mode build.ImportMode) (*build.Package, error)
+
+ // AfterTypeCheck is called immediately after a list of files
+ // has been type-checked and appended to info.Files.
+ //
+ // This optional hook function is the earliest opportunity for
+ // the client to observe the output of the type checker,
+ // which may be useful to reduce analysis latency when loading
+ // a large program.
+ //
+ // The function is permitted to modify info.Info, for instance
+ // to clear data structures that are no longer needed, which can
+ // dramatically reduce peak memory consumption.
+ //
+ // The function may be called twice for the same PackageInfo:
+ // once for the files of the package and again for the
+ // in-package test files.
+ //
+ // It must be safe to call concurrently from multiple goroutines.
+ AfterTypeCheck func(info *PackageInfo, files []*ast.File)
+}
+
+// A PkgSpec specifies a non-importable package to be created by Load.
+// Files are processed first, but typically only one of Files and
+// Filenames is provided. The path needn't be globally unique.
+//
+// For vendoring purposes, the package's directory is the one that
+// contains the first file.
+type PkgSpec struct {
+ Path string // package path ("" => use package declaration)
+ Files []*ast.File // ASTs of already-parsed files
+ Filenames []string // names of files to be parsed
+}
+
+// A Program is a Go program loaded from source as specified by a Config.
+type Program struct {
+ Fset *token.FileSet // the file set for this program
+
+ // Created[i] contains the initial package whose ASTs or
+ // filenames were supplied by Config.CreatePkgs[i], followed by
+ // the external test package, if any, of each package in
+ // Config.ImportPkgs ordered by ImportPath.
+ //
+ // NOTE: these files must not import "C". Cgo preprocessing is
+ // only performed on imported packages, not ad hoc packages.
+ //
+ // TODO(adonovan): we need to copy and adapt the logic of
+ // goFilesPackage (from $GOROOT/src/cmd/go/build.go) and make
+ // Config.Import and Config.Create methods return the same kind
+ // of entity, essentially a build.Package.
+ // Perhaps we can even reuse that type directly.
+ Created []*PackageInfo
+
+ // Imported contains the initially imported packages,
+ // as specified by Config.ImportPkgs.
+ Imported map[string]*PackageInfo
+
+ // AllPackages contains the PackageInfo of every package
+ // encountered by Load: all initial packages and all
+ // dependencies, including incomplete ones.
+ AllPackages map[*types.Package]*PackageInfo
+
+ // importMap is the canonical mapping of package paths to
+ // packages. It contains all Imported initial packages, but not
+ // Created ones, and all imported dependencies.
+ importMap map[string]*types.Package
+}
+
+// PackageInfo holds the ASTs and facts derived by the type-checker
+// for a single package.
+//
+// Not mutated once exposed via the API.
+//
+type PackageInfo struct {
+ Pkg *types.Package
+ Importable bool // true if 'import "Pkg.Path()"' would resolve to this
+ TransitivelyErrorFree bool // true if Pkg and all its dependencies are free of errors
+ Files []*ast.File // syntax trees for the package's files
+ Errors []error // non-nil if the package had errors
+ types.Info // type-checker deductions.
+ dir string // package directory
+
+ checker *types.Checker // transient type-checker state
+ errorFunc func(error)
+}
+
+func (info *PackageInfo) String() string { return info.Pkg.Path() }
+
+func (info *PackageInfo) appendError(err error) {
+ if info.errorFunc != nil {
+ info.errorFunc(err)
+ } else {
+ fmt.Fprintln(os.Stderr, err)
+ }
+ info.Errors = append(info.Errors, err)
+}
+
+func (conf *Config) fset() *token.FileSet {
+ if conf.Fset == nil {
+ conf.Fset = token.NewFileSet()
+ }
+ return conf.Fset
+}
+
+// ParseFile is a convenience function (intended for testing) that invokes
+// the parser using the Config's FileSet, which is initialized if nil.
+//
+// src specifies the parser input as a string, []byte, or io.Reader, and
+// filename is its apparent name. If src is nil, the contents of
+// filename are read from the file system.
+//
+func (conf *Config) ParseFile(filename string, src interface{}) (*ast.File, error) {
+ // TODO(adonovan): use conf.build() etc like parseFiles does.
+ return parser.ParseFile(conf.fset(), filename, src, conf.ParserMode)
+}
+
+// FromArgsUsage is a partial usage message that applications calling
+// FromArgs may wish to include in their -help output.
+const FromArgsUsage = `
+ is a list of arguments denoting a set of initial packages.
+It may take one of two forms:
+
+1. A list of *.go source files.
+
+ All of the specified files are loaded, parsed and type-checked
+ as a single package. All the files must belong to the same directory.
+
+2. A list of import paths, each denoting a package.
+
+ The package's directory is found relative to the $GOROOT and
+ $GOPATH using similar logic to 'go build', and the *.go files in
+ that directory are loaded, parsed and type-checked as a single
+ package.
+
+ In addition, all *_test.go files in the directory are then loaded
+ and parsed. Those files whose package declaration equals that of
+ the non-*_test.go files are included in the primary package. Test
+ files whose package declaration ends with "_test" are type-checked
+ as another package, the 'external' test package, so that a single
+ import path may denote two packages. (Whether this behaviour is
+ enabled is tool-specific, and may depend on additional flags.)
+
+A '--' argument terminates the list of packages.
+`
+
+// FromArgs interprets args as a set of initial packages to load from
+// source and updates the configuration. It returns the list of
+// unconsumed arguments.
+//
+// It is intended for use in command-line interfaces that require a
+// set of initial packages to be specified; see FromArgsUsage message
+// for details.
+//
+// Only superficial errors are reported at this stage; errors dependent
+// on I/O are detected during Load.
+//
+func (conf *Config) FromArgs(args []string, xtest bool) ([]string, error) {
+ var rest []string
+ for i, arg := range args {
+ if arg == "--" {
+ rest = args[i+1:]
+ args = args[:i]
+ break // consume "--" and return the remaining args
+ }
+ }
+
+ if len(args) > 0 && strings.HasSuffix(args[0], ".go") {
+ // Assume args is a list of a *.go files
+ // denoting a single ad hoc package.
+ for _, arg := range args {
+ if !strings.HasSuffix(arg, ".go") {
+ return nil, fmt.Errorf("named files must be .go files: %s", arg)
+ }
+ }
+ conf.CreateFromFilenames("", args...)
+ } else {
+ // Assume args are directories each denoting a
+ // package and (perhaps) an external test, iff xtest.
+ for _, arg := range args {
+ if xtest {
+ conf.ImportWithTests(arg)
+ } else {
+ conf.Import(arg)
+ }
+ }
+ }
+
+ return rest, nil
+}
+
+// CreateFromFilenames is a convenience function that adds
+// a conf.CreatePkgs entry to create a package of the specified *.go
+// files.
+//
+func (conf *Config) CreateFromFilenames(path string, filenames ...string) {
+ conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Filenames: filenames})
+}
+
+// CreateFromFiles is a convenience function that adds a conf.CreatePkgs
+// entry to create package of the specified path and parsed files.
+//
+func (conf *Config) CreateFromFiles(path string, files ...*ast.File) {
+ conf.CreatePkgs = append(conf.CreatePkgs, PkgSpec{Path: path, Files: files})
+}
+
+// ImportWithTests is a convenience function that adds path to
+// ImportPkgs, the set of initial source packages located relative to
+// $GOPATH. The package will be augmented by any *_test.go files in
+// its directory that contain a "package x" (not "package x_test")
+// declaration.
+//
+// In addition, if any *_test.go files contain a "package x_test"
+// declaration, an additional package comprising just those files will
+// be added to CreatePkgs.
+//
+func (conf *Config) ImportWithTests(path string) { conf.addImport(path, true) }
+
+// Import is a convenience function that adds path to ImportPkgs, the
+// set of initial packages that will be imported from source.
+//
+func (conf *Config) Import(path string) { conf.addImport(path, false) }
+
+func (conf *Config) addImport(path string, tests bool) {
+ if path == "C" {
+ return // ignore; not a real package
+ }
+ if conf.ImportPkgs == nil {
+ conf.ImportPkgs = make(map[string]bool)
+ }
+ conf.ImportPkgs[path] = conf.ImportPkgs[path] || tests
+}
+
+// PathEnclosingInterval returns the PackageInfo and ast.Node that
+// contain source interval [start, end), and all the node's ancestors
+// up to the AST root. It searches all ast.Files of all packages in prog.
+// exact is defined as for astutil.PathEnclosingInterval.
+//
+// The zero value is returned if not found.
+//
+func (prog *Program) PathEnclosingInterval(start, end token.Pos) (pkg *PackageInfo, path []ast.Node, exact bool) {
+ for _, info := range prog.AllPackages {
+ for _, f := range info.Files {
+ if f.Pos() == token.NoPos {
+ // This can happen if the parser saw
+ // too many errors and bailed out.
+ // (Use parser.AllErrors to prevent that.)
+ continue
+ }
+ if !tokenFileContainsPos(prog.Fset.File(f.Pos()), start) {
+ continue
+ }
+ if path, exact := astutil.PathEnclosingInterval(f, start, end); path != nil {
+ return info, path, exact
+ }
+ }
+ }
+ return nil, nil, false
+}
+
+// InitialPackages returns a new slice containing the set of initial
+// packages (Created + Imported) in unspecified order.
+//
+func (prog *Program) InitialPackages() []*PackageInfo {
+ infos := make([]*PackageInfo, 0, len(prog.Created)+len(prog.Imported))
+ infos = append(infos, prog.Created...)
+ for _, info := range prog.Imported {
+ infos = append(infos, info)
+ }
+ return infos
+}
+
+// Package returns the ASTs and results of type checking for the
+// specified package.
+func (prog *Program) Package(path string) *PackageInfo {
+ if info, ok := prog.AllPackages[prog.importMap[path]]; ok {
+ return info
+ }
+ for _, info := range prog.Created {
+ if path == info.Pkg.Path() {
+ return info
+ }
+ }
+ return nil
+}
+
+// ---------- Implementation ----------
+
+// importer holds the working state of the algorithm.
+type importer struct {
+ conf *Config // the client configuration
+ start time.Time // for logging
+
+ progMu sync.Mutex // guards prog
+ prog *Program // the resulting program
+
+ // findpkg is a memoization of FindPackage.
+ findpkgMu sync.Mutex // guards findpkg
+ findpkg map[findpkgKey]*findpkgValue
+
+ importedMu sync.Mutex // guards imported
+ imported map[string]*importInfo // all imported packages (incl. failures) by import path
+
+ // import dependency graph: graph[x][y] => x imports y
+ //
+ // Since non-importable packages cannot be cyclic, we ignore
+ // their imports, thus we only need the subgraph over importable
+ // packages. Nodes are identified by their import paths.
+ graphMu sync.Mutex
+ graph map[string]map[string]bool
+}
+
+type findpkgKey struct {
+ importPath string
+ fromDir string
+ mode build.ImportMode
+}
+
+type findpkgValue struct {
+ ready chan struct{} // closed to broadcast readiness
+ bp *build.Package
+ err error
+}
+
+// importInfo tracks the success or failure of a single import.
+//
+// Upon completion, exactly one of info and err is non-nil:
+// info on successful creation of a package, err otherwise.
+// A successful package may still contain type errors.
+//
+type importInfo struct {
+ path string // import path
+ info *PackageInfo // results of typechecking (including errors)
+ complete chan struct{} // closed to broadcast that info is set.
+}
+
+// awaitCompletion blocks until ii is complete,
+// i.e. the info field is safe to inspect.
+func (ii *importInfo) awaitCompletion() {
+ <-ii.complete // wait for close
+}
+
+// Complete marks ii as complete.
+// Its info and err fields will not be subsequently updated.
+func (ii *importInfo) Complete(info *PackageInfo) {
+ if info == nil {
+ panic("info == nil")
+ }
+ ii.info = info
+ close(ii.complete)
+}
+
+type importError struct {
+ path string // import path
+ err error // reason for failure to create a package
+}
+
+// Load creates the initial packages specified by conf.{Create,Import}Pkgs,
+// loading their dependencies packages as needed.
+//
+// On success, Load returns a Program containing a PackageInfo for
+// each package. On failure, it returns an error.
+//
+// If AllowErrors is true, Load will return a Program even if some
+// packages contained I/O, parser or type errors, or if dependencies
+// were missing. (Such errors are accessible via PackageInfo.Errors. If
+// false, Load will fail if any package had an error.
+//
+// It is an error if no packages were loaded.
+//
+func (conf *Config) Load() (*Program, error) {
+ // Create a simple default error handler for parse/type errors.
+ if conf.TypeChecker.Error == nil {
+ conf.TypeChecker.Error = func(e error) { fmt.Fprintln(os.Stderr, e) }
+ }
+
+ // Set default working directory for relative package references.
+ if conf.Cwd == "" {
+ var err error
+ conf.Cwd, err = os.Getwd()
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ // Install default FindPackage hook using go/build logic.
+ if conf.FindPackage == nil {
+ conf.FindPackage = (*build.Context).Import
+ }
+
+ prog := &Program{
+ Fset: conf.fset(),
+ Imported: make(map[string]*PackageInfo),
+ importMap: make(map[string]*types.Package),
+ AllPackages: make(map[*types.Package]*PackageInfo),
+ }
+
+ imp := importer{
+ conf: conf,
+ prog: prog,
+ findpkg: make(map[findpkgKey]*findpkgValue),
+ imported: make(map[string]*importInfo),
+ start: time.Now(),
+ graph: make(map[string]map[string]bool),
+ }
+
+ // -- loading proper (concurrent phase) --------------------------------
+
+ var errpkgs []string // packages that contained errors
+
+ // Load the initially imported packages and their dependencies,
+ // in parallel.
+ // No vendor check on packages imported from the command line.
+ infos, importErrors := imp.importAll("", conf.Cwd, conf.ImportPkgs, ignoreVendor)
+ for _, ie := range importErrors {
+ conf.TypeChecker.Error(ie.err) // failed to create package
+ errpkgs = append(errpkgs, ie.path)
+ }
+ for _, info := range infos {
+ prog.Imported[info.Pkg.Path()] = info
+ }
+
+ // Augment the designated initial packages by their tests.
+ // Dependencies are loaded in parallel.
+ var xtestPkgs []*build.Package
+ for importPath, augment := range conf.ImportPkgs {
+ if !augment {
+ continue
+ }
+
+ // No vendor check on packages imported from command line.
+ bp, err := imp.findPackage(importPath, conf.Cwd, ignoreVendor)
+ if err != nil {
+ // Package not found, or can't even parse package declaration.
+ // Already reported by previous loop; ignore it.
+ continue
+ }
+
+ // Needs external test package?
+ if len(bp.XTestGoFiles) > 0 {
+ xtestPkgs = append(xtestPkgs, bp)
+ }
+
+ // Consult the cache using the canonical package path.
+ path := bp.ImportPath
+ imp.importedMu.Lock() // (unnecessary, we're sequential here)
+ ii, ok := imp.imported[path]
+ // Paranoid checks added due to issue #11012.
+ if !ok {
+ // Unreachable.
+ // The previous loop called importAll and thus
+ // startLoad for each path in ImportPkgs, which
+ // populates imp.imported[path] with a non-zero value.
+ panic(fmt.Sprintf("imported[%q] not found", path))
+ }
+ if ii == nil {
+ // Unreachable.
+ // The ii values in this loop are the same as in
+ // the previous loop, which enforced the invariant
+ // that at least one of ii.err and ii.info is non-nil.
+ panic(fmt.Sprintf("imported[%q] == nil", path))
+ }
+ if ii.info == nil {
+ // Unreachable.
+ // awaitCompletion has the postcondition
+ // ii.info != nil.
+ panic(fmt.Sprintf("imported[%q].info = nil", path))
+ }
+ info := ii.info
+ imp.importedMu.Unlock()
+
+ // Parse the in-package test files.
+ files, errs := imp.conf.parsePackageFiles(bp, 't')
+ for _, err := range errs {
+ info.appendError(err)
+ }
+
+ // The test files augmenting package P cannot be imported,
+ // but may import packages that import P,
+ // so we must disable the cycle check.
+ imp.addFiles(info, files, false)
+ }
+
+ createPkg := func(path, dir string, files []*ast.File, errs []error) {
+ info := imp.newPackageInfo(path, dir)
+ for _, err := range errs {
+ info.appendError(err)
+ }
+
+ // Ad hoc packages are non-importable,
+ // so no cycle check is needed.
+ // addFiles loads dependencies in parallel.
+ imp.addFiles(info, files, false)
+ prog.Created = append(prog.Created, info)
+ }
+
+ // Create packages specified by conf.CreatePkgs.
+ for _, cp := range conf.CreatePkgs {
+ files, errs := parseFiles(conf.fset(), conf.build(), nil, conf.Cwd, cp.Filenames, conf.ParserMode)
+ files = append(files, cp.Files...)
+
+ path := cp.Path
+ if path == "" {
+ if len(files) > 0 {
+ path = files[0].Name.Name
+ } else {
+ path = "(unnamed)"
+ }
+ }
+
+ dir := conf.Cwd
+ if len(files) > 0 && files[0].Pos().IsValid() {
+ dir = filepath.Dir(conf.fset().File(files[0].Pos()).Name())
+ }
+ createPkg(path, dir, files, errs)
+ }
+
+ // Create external test packages.
+ sort.Sort(byImportPath(xtestPkgs))
+ for _, bp := range xtestPkgs {
+ files, errs := imp.conf.parsePackageFiles(bp, 'x')
+ createPkg(bp.ImportPath+"_test", bp.Dir, files, errs)
+ }
+
+ // -- finishing up (sequential) ----------------------------------------
+
+ if len(prog.Imported)+len(prog.Created) == 0 {
+ return nil, errors.New("no initial packages were loaded")
+ }
+
+ // Create infos for indirectly imported packages.
+ // e.g. incomplete packages without syntax, loaded from export data.
+ for _, obj := range prog.importMap {
+ info := prog.AllPackages[obj]
+ if info == nil {
+ prog.AllPackages[obj] = &PackageInfo{Pkg: obj, Importable: true}
+ } else {
+ // finished
+ info.checker = nil
+ info.errorFunc = nil
+ }
+ }
+
+ if !conf.AllowErrors {
+ // Report errors in indirectly imported packages.
+ for _, info := range prog.AllPackages {
+ if len(info.Errors) > 0 {
+ errpkgs = append(errpkgs, info.Pkg.Path())
+ }
+ }
+ if errpkgs != nil {
+ var more string
+ if len(errpkgs) > 3 {
+ more = fmt.Sprintf(" and %d more", len(errpkgs)-3)
+ errpkgs = errpkgs[:3]
+ }
+ return nil, fmt.Errorf("couldn't load packages due to errors: %s%s",
+ strings.Join(errpkgs, ", "), more)
+ }
+ }
+
+ markErrorFreePackages(prog.AllPackages)
+
+ return prog, nil
+}
+
+type byImportPath []*build.Package
+
+func (b byImportPath) Len() int { return len(b) }
+func (b byImportPath) Less(i, j int) bool { return b[i].ImportPath < b[j].ImportPath }
+func (b byImportPath) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
+
+// markErrorFreePackages sets the TransitivelyErrorFree flag on all
+// applicable packages.
+func markErrorFreePackages(allPackages map[*types.Package]*PackageInfo) {
+ // Build the transpose of the import graph.
+ importedBy := make(map[*types.Package]map[*types.Package]bool)
+ for P := range allPackages {
+ for _, Q := range P.Imports() {
+ clients, ok := importedBy[Q]
+ if !ok {
+ clients = make(map[*types.Package]bool)
+ importedBy[Q] = clients
+ }
+ clients[P] = true
+ }
+ }
+
+ // Find all packages reachable from some error package.
+ reachable := make(map[*types.Package]bool)
+ var visit func(*types.Package)
+ visit = func(p *types.Package) {
+ if !reachable[p] {
+ reachable[p] = true
+ for q := range importedBy[p] {
+ visit(q)
+ }
+ }
+ }
+ for _, info := range allPackages {
+ if len(info.Errors) > 0 {
+ visit(info.Pkg)
+ }
+ }
+
+ // Mark the others as "transitively error-free".
+ for _, info := range allPackages {
+ if !reachable[info.Pkg] {
+ info.TransitivelyErrorFree = true
+ }
+ }
+}
+
+// build returns the effective build context.
+func (conf *Config) build() *build.Context {
+ if conf.Build != nil {
+ return conf.Build
+ }
+ return &build.Default
+}
+
+// parsePackageFiles enumerates the files belonging to package path,
+// then loads, parses and returns them, plus a list of I/O or parse
+// errors that were encountered.
+//
+// 'which' indicates which files to include:
+// 'g': include non-test *.go source files (GoFiles + processed CgoFiles)
+// 't': include in-package *_test.go source files (TestGoFiles)
+// 'x': include external *_test.go source files. (XTestGoFiles)
+//
+func (conf *Config) parsePackageFiles(bp *build.Package, which rune) ([]*ast.File, []error) {
+ if bp.ImportPath == "unsafe" {
+ return nil, nil
+ }
+ var filenames []string
+ switch which {
+ case 'g':
+ filenames = bp.GoFiles
+ case 't':
+ filenames = bp.TestGoFiles
+ case 'x':
+ filenames = bp.XTestGoFiles
+ default:
+ panic(which)
+ }
+
+ files, errs := parseFiles(conf.fset(), conf.build(), conf.DisplayPath, bp.Dir, filenames, conf.ParserMode)
+
+ // Preprocess CgoFiles and parse the outputs (sequentially).
+ if which == 'g' && bp.CgoFiles != nil {
+ cgofiles, err := cgo.ProcessFiles(bp, conf.fset(), conf.DisplayPath, conf.ParserMode)
+ if err != nil {
+ errs = append(errs, err)
+ } else {
+ files = append(files, cgofiles...)
+ }
+ }
+
+ return files, errs
+}
+
+// doImport imports the package denoted by path.
+// It implements the types.Importer signature.
+//
+// It returns an error if a package could not be created
+// (e.g. go/build or parse error), but type errors are reported via
+// the types.Config.Error callback (the first of which is also saved
+// in the package's PackageInfo).
+//
+// Idempotent.
+//
+func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, error) {
+ if to == "C" {
+ // This should be unreachable, but ad hoc packages are
+ // not currently subject to cgo preprocessing.
+ // See https://golang.org/issue/11627.
+ return nil, fmt.Errorf(`the loader doesn't cgo-process ad hoc packages like %q; see Go issue 11627`,
+ from.Pkg.Path())
+ }
+
+ bp, err := imp.findPackage(to, from.dir, 0)
+ if err != nil {
+ return nil, err
+ }
+
+ // The standard unsafe package is handled specially,
+ // and has no PackageInfo.
+ if bp.ImportPath == "unsafe" {
+ return types.Unsafe, nil
+ }
+
+ // Look for the package in the cache using its canonical path.
+ path := bp.ImportPath
+ imp.importedMu.Lock()
+ ii := imp.imported[path]
+ imp.importedMu.Unlock()
+ if ii == nil {
+ panic("internal error: unexpected import: " + path)
+ }
+ if ii.info != nil {
+ return ii.info.Pkg, nil
+ }
+
+ // Import of incomplete package: this indicates a cycle.
+ fromPath := from.Pkg.Path()
+ if cycle := imp.findPath(path, fromPath); cycle != nil {
+ cycle = append([]string{fromPath}, cycle...)
+ return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> "))
+ }
+
+ panic("internal error: import of incomplete (yet acyclic) package: " + fromPath)
+}
+
+// findPackage locates the package denoted by the importPath in the
+// specified directory.
+func (imp *importer) findPackage(importPath, fromDir string, mode build.ImportMode) (*build.Package, error) {
+ // We use a non-blocking duplicate-suppressing cache (gopl.io §9.7)
+ // to avoid holding the lock around FindPackage.
+ key := findpkgKey{importPath, fromDir, mode}
+ imp.findpkgMu.Lock()
+ v, ok := imp.findpkg[key]
+ if ok {
+ // cache hit
+ imp.findpkgMu.Unlock()
+
+ <-v.ready // wait for entry to become ready
+ } else {
+ // Cache miss: this goroutine becomes responsible for
+ // populating the map entry and broadcasting its readiness.
+ v = &findpkgValue{ready: make(chan struct{})}
+ imp.findpkg[key] = v
+ imp.findpkgMu.Unlock()
+
+ ioLimit <- true
+ v.bp, v.err = imp.conf.FindPackage(imp.conf.build(), importPath, fromDir, mode)
+ <-ioLimit
+
+ if _, ok := v.err.(*build.NoGoError); ok {
+ v.err = nil // empty directory is not an error
+ }
+
+ close(v.ready) // broadcast ready condition
+ }
+ return v.bp, v.err
+}
+
+// importAll loads, parses, and type-checks the specified packages in
+// parallel and returns their completed importInfos in unspecified order.
+//
+// fromPath is the package path of the importing package, if it is
+// importable, "" otherwise. It is used for cycle detection.
+//
+// fromDir is the directory containing the import declaration that
+// caused these imports.
+//
+func (imp *importer) importAll(fromPath, fromDir string, imports map[string]bool, mode build.ImportMode) (infos []*PackageInfo, errors []importError) {
+ // TODO(adonovan): opt: do the loop in parallel once
+ // findPackage is non-blocking.
+ var pending []*importInfo
+ for importPath := range imports {
+ bp, err := imp.findPackage(importPath, fromDir, mode)
+ if err != nil {
+ errors = append(errors, importError{
+ path: importPath,
+ err: err,
+ })
+ continue
+ }
+ pending = append(pending, imp.startLoad(bp))
+ }
+
+ if fromPath != "" {
+ // We're loading a set of imports.
+ //
+ // We must record graph edges from the importing package
+ // to its dependencies, and check for cycles.
+ imp.graphMu.Lock()
+ deps, ok := imp.graph[fromPath]
+ if !ok {
+ deps = make(map[string]bool)
+ imp.graph[fromPath] = deps
+ }
+ for _, ii := range pending {
+ deps[ii.path] = true
+ }
+ imp.graphMu.Unlock()
+ }
+
+ for _, ii := range pending {
+ if fromPath != "" {
+ if cycle := imp.findPath(ii.path, fromPath); cycle != nil {
+ // Cycle-forming import: we must not await its
+ // completion since it would deadlock.
+ //
+ // We don't record the error in ii since
+ // the error is really associated with the
+ // cycle-forming edge, not the package itself.
+ // (Also it would complicate the
+ // invariants of importPath completion.)
+ if trace {
+ fmt.Fprintf(os.Stderr, "import cycle: %q\n", cycle)
+ }
+ continue
+ }
+ }
+ ii.awaitCompletion()
+ infos = append(infos, ii.info)
+ }
+
+ return infos, errors
+}
+
+// findPath returns an arbitrary path from 'from' to 'to' in the import
+// graph, or nil if there was none.
+func (imp *importer) findPath(from, to string) []string {
+ imp.graphMu.Lock()
+ defer imp.graphMu.Unlock()
+
+ seen := make(map[string]bool)
+ var search func(stack []string, importPath string) []string
+ search = func(stack []string, importPath string) []string {
+ if !seen[importPath] {
+ seen[importPath] = true
+ stack = append(stack, importPath)
+ if importPath == to {
+ return stack
+ }
+ for x := range imp.graph[importPath] {
+ if p := search(stack, x); p != nil {
+ return p
+ }
+ }
+ }
+ return nil
+ }
+ return search(make([]string, 0, 20), from)
+}
+
+// startLoad initiates the loading, parsing and type-checking of the
+// specified package and its dependencies, if it has not already begun.
+//
+// It returns an importInfo, not necessarily in a completed state. The
+// caller must call awaitCompletion() before accessing its info field.
+//
+// startLoad is concurrency-safe and idempotent.
+//
+func (imp *importer) startLoad(bp *build.Package) *importInfo {
+ path := bp.ImportPath
+ imp.importedMu.Lock()
+ ii, ok := imp.imported[path]
+ if !ok {
+ ii = &importInfo{path: path, complete: make(chan struct{})}
+ imp.imported[path] = ii
+ go func() {
+ info := imp.load(bp)
+ ii.Complete(info)
+ }()
+ }
+ imp.importedMu.Unlock()
+
+ return ii
+}
+
+// load implements package loading by parsing Go source files
+// located by go/build.
+func (imp *importer) load(bp *build.Package) *PackageInfo {
+ info := imp.newPackageInfo(bp.ImportPath, bp.Dir)
+ info.Importable = true
+ files, errs := imp.conf.parsePackageFiles(bp, 'g')
+ for _, err := range errs {
+ info.appendError(err)
+ }
+
+ imp.addFiles(info, files, true)
+
+ imp.progMu.Lock()
+ imp.prog.importMap[bp.ImportPath] = info.Pkg
+ imp.progMu.Unlock()
+
+ return info
+}
+
+// addFiles adds and type-checks the specified files to info, loading
+// their dependencies if needed. The order of files determines the
+// package initialization order. It may be called multiple times on the
+// same package. Errors are appended to the info.Errors field.
+//
+// cycleCheck determines whether the imports within files create
+// dependency edges that should be checked for potential cycles.
+//
+func (imp *importer) addFiles(info *PackageInfo, files []*ast.File, cycleCheck bool) {
+ // Ensure the dependencies are loaded, in parallel.
+ var fromPath string
+ if cycleCheck {
+ fromPath = info.Pkg.Path()
+ }
+ // TODO(adonovan): opt: make the caller do scanImports.
+ // Callers with a build.Package can skip it.
+ imp.importAll(fromPath, info.dir, scanImports(files), 0)
+
+ if trace {
+ fmt.Fprintf(os.Stderr, "%s: start %q (%d)\n",
+ time.Since(imp.start), info.Pkg.Path(), len(files))
+ }
+
+ // Don't call checker.Files on Unsafe, even with zero files,
+ // because it would mutate the package, which is a global.
+ if info.Pkg == types.Unsafe {
+ if len(files) > 0 {
+ panic(`"unsafe" package contains unexpected files`)
+ }
+ } else {
+ // Ignore the returned (first) error since we
+ // already collect them all in the PackageInfo.
+ info.checker.Files(files)
+ info.Files = append(info.Files, files...)
+ }
+
+ if imp.conf.AfterTypeCheck != nil {
+ imp.conf.AfterTypeCheck(info, files)
+ }
+
+ if trace {
+ fmt.Fprintf(os.Stderr, "%s: stop %q\n",
+ time.Since(imp.start), info.Pkg.Path())
+ }
+}
+
+func (imp *importer) newPackageInfo(path, dir string) *PackageInfo {
+ var pkg *types.Package
+ if path == "unsafe" {
+ pkg = types.Unsafe
+ } else {
+ pkg = types.NewPackage(path, "")
+ }
+ info := &PackageInfo{
+ Pkg: pkg,
+ Info: 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),
+ },
+ errorFunc: imp.conf.TypeChecker.Error,
+ dir: dir,
+ }
+
+ // Copy the types.Config so we can vary it across PackageInfos.
+ tc := imp.conf.TypeChecker
+ tc.IgnoreFuncBodies = false
+ if f := imp.conf.TypeCheckFuncBodies; f != nil {
+ tc.IgnoreFuncBodies = !f(path)
+ }
+ tc.Importer = closure{imp, info}
+ tc.Error = info.appendError // appendError wraps the user's Error function
+
+ info.checker = types.NewChecker(&tc, imp.conf.fset(), pkg, &info.Info)
+ imp.progMu.Lock()
+ imp.prog.AllPackages[pkg] = info
+ imp.progMu.Unlock()
+ return info
+}
+
+type closure struct {
+ imp *importer
+ info *PackageInfo
+}
+
+func (c closure) Import(to string) (*types.Package, error) { return c.imp.doImport(c.info, to) }
diff --git a/vendor/golang.org/x/tools/go/loader/util.go b/vendor/golang.org/x/tools/go/loader/util.go
new file mode 100644
index 00000000000..7f38dd74077
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/loader/util.go
@@ -0,0 +1,124 @@
+// 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 loader
+
+import (
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "io"
+ "os"
+ "strconv"
+ "sync"
+
+ "golang.org/x/tools/go/buildutil"
+)
+
+// We use a counting semaphore to limit
+// the number of parallel I/O calls per process.
+var ioLimit = make(chan bool, 10)
+
+// parseFiles parses the Go source files within directory dir and
+// returns the ASTs of the ones that could be at least partially parsed,
+// along with a list of I/O and parse errors encountered.
+//
+// I/O is done via ctxt, which may specify a virtual file system.
+// displayPath is used to transform the filenames attached to the ASTs.
+//
+func parseFiles(fset *token.FileSet, ctxt *build.Context, displayPath func(string) string, dir string, files []string, mode parser.Mode) ([]*ast.File, []error) {
+ if displayPath == nil {
+ displayPath = func(path string) string { return path }
+ }
+ var wg sync.WaitGroup
+ n := len(files)
+ parsed := make([]*ast.File, n)
+ errors := make([]error, n)
+ for i, file := range files {
+ if !buildutil.IsAbsPath(ctxt, file) {
+ file = buildutil.JoinPath(ctxt, dir, file)
+ }
+ wg.Add(1)
+ go func(i int, file string) {
+ ioLimit <- true // wait
+ defer func() {
+ wg.Done()
+ <-ioLimit // signal
+ }()
+ var rd io.ReadCloser
+ var err error
+ if ctxt.OpenFile != nil {
+ rd, err = ctxt.OpenFile(file)
+ } else {
+ rd, err = os.Open(file)
+ }
+ if err != nil {
+ errors[i] = err // open failed
+ return
+ }
+
+ // ParseFile may return both an AST and an error.
+ parsed[i], errors[i] = parser.ParseFile(fset, displayPath(file), rd, mode)
+ rd.Close()
+ }(i, file)
+ }
+ wg.Wait()
+
+ // Eliminate nils, preserving order.
+ var o int
+ for _, f := range parsed {
+ if f != nil {
+ parsed[o] = f
+ o++
+ }
+ }
+ parsed = parsed[:o]
+
+ o = 0
+ for _, err := range errors {
+ if err != nil {
+ errors[o] = err
+ o++
+ }
+ }
+ errors = errors[:o]
+
+ return parsed, errors
+}
+
+// scanImports returns the set of all import paths from all
+// import specs in the specified files.
+func scanImports(files []*ast.File) map[string]bool {
+ imports := make(map[string]bool)
+ for _, f := range files {
+ for _, decl := range f.Decls {
+ if decl, ok := decl.(*ast.GenDecl); ok && decl.Tok == token.IMPORT {
+ for _, spec := range decl.Specs {
+ spec := spec.(*ast.ImportSpec)
+
+ // NB: do not assume the program is well-formed!
+ path, err := strconv.Unquote(spec.Path.Value)
+ if err != nil {
+ continue // quietly ignore the error
+ }
+ if path == "C" {
+ continue // skip pseudopackage
+ }
+ imports[path] = true
+ }
+ }
+ }
+ }
+ return imports
+}
+
+// ---------- Internal helpers ----------
+
+// TODO(adonovan): make this a method: func (*token.File) Contains(token.Pos)
+func tokenFileContainsPos(f *token.File, pos token.Pos) bool {
+ p := int(pos)
+ base := f.Base()
+ return base <= p && p < base+f.Size()
+}
diff --git a/vendor/golang.org/x/tools/go/packages/doc.go b/vendor/golang.org/x/tools/go/packages/doc.go
new file mode 100644
index 00000000000..3799f8ed8be
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/doc.go
@@ -0,0 +1,222 @@
+// 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 packages loads Go packages for inspection and analysis.
+
+The Load function takes as input a list of patterns and return a list of Package
+structs describing individual packages matched by those patterns.
+The LoadMode controls the amount of detail in the loaded packages.
+
+Load passes most patterns directly to the underlying build tool,
+but all patterns with the prefix "query=", where query is a
+non-empty string of letters from [a-z], are reserved and may be
+interpreted as query operators.
+
+Two query operators are currently supported: "file" and "pattern".
+
+The query "file=path/to/file.go" matches the package or packages enclosing
+the Go source file path/to/file.go. For example "file=~/go/src/fmt/print.go"
+might return the packages "fmt" and "fmt [fmt.test]".
+
+The query "pattern=string" causes "string" to be passed directly to
+the underlying build tool. In most cases this is unnecessary,
+but an application can use Load("pattern=" + x) as an escaping mechanism
+to ensure that x is not interpreted as a query operator if it contains '='.
+
+All other query operators are reserved for future use and currently
+cause Load to report an error.
+
+The Package struct provides basic information about the package, including
+
+ - ID, a unique identifier for the package in the returned set;
+ - GoFiles, the names of the package's Go source files;
+ - Imports, a map from source import strings to the Packages they name;
+ - Types, the type information for the package's exported symbols;
+ - Syntax, the parsed syntax trees for the package's source code; and
+ - TypeInfo, the result of a complete type-check of the package syntax trees.
+
+(See the documentation for type Package for the complete list of fields
+and more detailed descriptions.)
+
+For example,
+
+ Load(nil, "bytes", "unicode...")
+
+returns four Package structs describing the standard library packages
+bytes, unicode, unicode/utf16, and unicode/utf8. Note that one pattern
+can match multiple packages and that a package might be matched by
+multiple patterns: in general it is not possible to determine which
+packages correspond to which patterns.
+
+Note that the list returned by Load contains only the packages matched
+by the patterns. Their dependencies can be found by walking the import
+graph using the Imports fields.
+
+The Load function can be configured by passing a pointer to a Config as
+the first argument. A nil Config is equivalent to the zero Config, which
+causes Load to run in LoadFiles mode, collecting minimal information.
+See the documentation for type Config for details.
+
+As noted earlier, the Config.Mode controls the amount of detail
+reported about the loaded packages, with each mode returning all the data of the
+previous mode with some extra added. See the documentation for type LoadMode
+for details.
+
+Most tools should pass their command-line arguments (after any flags)
+uninterpreted to the loader, so that the loader can interpret them
+according to the conventions of the underlying build system.
+See the Example function for typical usage.
+
+*/
+package packages // import "golang.org/x/tools/go/packages"
+
+/*
+
+Motivation and design considerations
+
+The new package's design solves problems addressed by two existing
+packages: go/build, which locates and describes packages, and
+golang.org/x/tools/go/loader, which loads, parses and type-checks them.
+The go/build.Package structure encodes too much of the 'go build' way
+of organizing projects, leaving us in need of a data type that describes a
+package of Go source code independent of the underlying build system.
+We wanted something that works equally well with go build and vgo, and
+also other build systems such as Bazel and Blaze, making it possible to
+construct analysis tools that work in all these environments.
+Tools such as errcheck and staticcheck were essentially unavailable to
+the Go community at Google, and some of Google's internal tools for Go
+are unavailable externally.
+This new package provides a uniform way to obtain package metadata by
+querying each of these build systems, optionally supporting their
+preferred command-line notations for packages, so that tools integrate
+neatly with users' build environments. The Metadata query function
+executes an external query tool appropriate to the current workspace.
+
+Loading packages always returns the complete import graph "all the way down",
+even if all you want is information about a single package, because the query
+mechanisms of all the build systems we currently support ({go,vgo} list, and
+blaze/bazel aspect-based query) cannot provide detailed information
+about one package without visiting all its dependencies too, so there is
+no additional asymptotic cost to providing transitive information.
+(This property might not be true of a hypothetical 5th build system.)
+
+In calls to TypeCheck, all initial packages, and any package that
+transitively depends on one of them, must be loaded from source.
+Consider A->B->C->D->E: if A,C are initial, A,B,C must be loaded from
+source; D may be loaded from export data, and E may not be loaded at all
+(though it's possible that D's export data mentions it, so a
+types.Package may be created for it and exposed.)
+
+The old loader had a feature to suppress type-checking of function
+bodies on a per-package basis, primarily intended to reduce the work of
+obtaining type information for imported packages. Now that imports are
+satisfied by export data, the optimization no longer seems necessary.
+
+Despite some early attempts, the old loader did not exploit export data,
+instead always using the equivalent of WholeProgram mode. This was due
+to the complexity of mixing source and export data packages (now
+resolved by the upward traversal mentioned above), and because export data
+files were nearly always missing or stale. Now that 'go build' supports
+caching, all the underlying build systems can guarantee to produce
+export data in a reasonable (amortized) time.
+
+Test "main" packages synthesized by the build system are now reported as
+first-class packages, avoiding the need for clients (such as go/ssa) to
+reinvent this generation logic.
+
+One way in which go/packages is simpler than the old loader is in its
+treatment of in-package tests. In-package tests are packages that
+consist of all the files of the library under test, plus the test files.
+The old loader constructed in-package tests by a two-phase process of
+mutation called "augmentation": first it would construct and type check
+all the ordinary library packages and type-check the packages that
+depend on them; then it would add more (test) files to the package and
+type-check again. This two-phase approach had four major problems:
+1) in processing the tests, the loader modified the library package,
+ leaving no way for a client application to see both the test
+ package and the library package; one would mutate into the other.
+2) because test files can declare additional methods on types defined in
+ the library portion of the package, the dispatch of method calls in
+ the library portion was affected by the presence of the test files.
+ This should have been a clue that the packages were logically
+ different.
+3) this model of "augmentation" assumed at most one in-package test
+ per library package, which is true of projects using 'go build',
+ but not other build systems.
+4) because of the two-phase nature of test processing, all packages that
+ import the library package had to be processed before augmentation,
+ forcing a "one-shot" API and preventing the client from calling Load
+ in several times in sequence as is now possible in WholeProgram mode.
+ (TypeCheck mode has a similar one-shot restriction for a different reason.)
+
+Early drafts of this package supported "multi-shot" operation.
+Although it allowed clients to make a sequence of calls (or concurrent
+calls) to Load, building up the graph of Packages incrementally,
+it was of marginal value: it complicated the API
+(since it allowed some options to vary across calls but not others),
+it complicated the implementation,
+it cannot be made to work in Types mode, as explained above,
+and it was less efficient than making one combined call (when this is possible).
+Among the clients we have inspected, none made multiple calls to load
+but could not be easily and satisfactorily modified to make only a single call.
+However, applications changes may be required.
+For example, the ssadump command loads the user-specified packages
+and in addition the runtime package. It is tempting to simply append
+"runtime" to the user-provided list, but that does not work if the user
+specified an ad-hoc package such as [a.go b.go].
+Instead, ssadump no longer requests the runtime package,
+but seeks it among the dependencies of the user-specified packages,
+and emits an error if it is not found.
+
+Overlays: The Overlay field in the Config allows providing alternate contents
+for Go source files, by providing a mapping from file path to contents.
+go/packages will pull in new imports added in overlay files when go/packages
+is run in LoadImports mode or greater.
+Overlay support for the go list driver isn't complete yet: if the file doesn't
+exist on disk, it will only be recognized in an overlay if it is a non-test file
+and the package would be reported even without the overlay.
+
+Questions & Tasks
+
+- Add GOARCH/GOOS?
+ They are not portable concepts, but could be made portable.
+ Our goal has been to allow users to express themselves using the conventions
+ of the underlying build system: if the build system honors GOARCH
+ during a build and during a metadata query, then so should
+ applications built atop that query mechanism.
+ Conversely, if the target architecture of the build is determined by
+ command-line flags, the application can pass the relevant
+ flags through to the build system using a command such as:
+ myapp -query_flag="--cpu=amd64" -query_flag="--os=darwin"
+ However, this approach is low-level, unwieldy, and non-portable.
+ GOOS and GOARCH seem important enough to warrant a dedicated option.
+
+- How should we handle partial failures such as a mixture of good and
+ malformed patterns, existing and non-existent packages, successful and
+ failed builds, import failures, import cycles, and so on, in a call to
+ Load?
+
+- Support bazel, blaze, and go1.10 list, not just go1.11 list.
+
+- Handle (and test) various partial success cases, e.g.
+ a mixture of good packages and:
+ invalid patterns
+ nonexistent packages
+ empty packages
+ packages with malformed package or import declarations
+ unreadable files
+ import cycles
+ other parse errors
+ type errors
+ Make sure we record errors at the correct place in the graph.
+
+- Missing packages among initial arguments are not reported.
+ Return bogus packages for them, like golist does.
+
+- "undeclared name" errors (for example) are reported out of source file
+ order. I suspect this is due to the breadth-first resolution now used
+ by go/types. Is that a bug? Discuss with gri.
+
+*/
diff --git a/vendor/golang.org/x/tools/go/packages/external.go b/vendor/golang.org/x/tools/go/packages/external.go
new file mode 100644
index 00000000000..860c3ec156d
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/external.go
@@ -0,0 +1,79 @@
+// 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.
+
+// This file enables an external tool to intercept package requests.
+// If the tool is present then its results are used in preference to
+// the go list command.
+
+package packages
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "os/exec"
+ "strings"
+)
+
+// Driver
+type driverRequest struct {
+ Command string `json "command"`
+ Mode LoadMode `json:"mode"`
+ Env []string `json:"env"`
+ BuildFlags []string `json:"build_flags"`
+ Tests bool `json:"tests"`
+ Overlay map[string][]byte `json:"overlay"`
+}
+
+// findExternalDriver returns the file path of a tool that supplies
+// the build system package structure, or "" if not found."
+// If GOPACKAGESDRIVER is set in the environment findExternalTool returns its
+// value, otherwise it searches for a binary named gopackagesdriver on the PATH.
+func findExternalDriver(cfg *Config) driver {
+ const toolPrefix = "GOPACKAGESDRIVER="
+ tool := ""
+ for _, env := range cfg.Env {
+ if val := strings.TrimPrefix(env, toolPrefix); val != env {
+ tool = val
+ }
+ }
+ if tool != "" && tool == "off" {
+ return nil
+ }
+ if tool == "" {
+ var err error
+ tool, err = exec.LookPath("gopackagesdriver")
+ if err != nil {
+ return nil
+ }
+ }
+ return func(cfg *Config, words ...string) (*driverResponse, error) {
+ req, err := json.Marshal(driverRequest{
+ Mode: cfg.Mode,
+ Env: cfg.Env,
+ BuildFlags: cfg.BuildFlags,
+ Tests: cfg.Tests,
+ Overlay: cfg.Overlay,
+ })
+ if err != nil {
+ return nil, fmt.Errorf("failed to encode message to driver tool: %v", err)
+ }
+
+ buf := new(bytes.Buffer)
+ cmd := exec.CommandContext(cfg.Context, tool, words...)
+ cmd.Dir = cfg.Dir
+ cmd.Env = cfg.Env
+ cmd.Stdin = bytes.NewReader(req)
+ cmd.Stdout = buf
+ cmd.Stderr = new(bytes.Buffer)
+ if err := cmd.Run(); err != nil {
+ return nil, fmt.Errorf("%v: %v: %s", tool, err, cmd.Stderr)
+ }
+ var response driverResponse
+ if err := json.Unmarshal(buf.Bytes(), &response); err != nil {
+ return nil, err
+ }
+ return &response, nil
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go
new file mode 100644
index 00000000000..2fee7fb1f07
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/golist.go
@@ -0,0 +1,809 @@
+// 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 packages
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "go/types"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "reflect"
+ "regexp"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/tools/go/internal/packagesdriver"
+ "golang.org/x/tools/internal/gopathwalk"
+ "golang.org/x/tools/internal/semver"
+)
+
+// debug controls verbose logging.
+var debug, _ = strconv.ParseBool(os.Getenv("GOPACKAGESDEBUG"))
+
+// A goTooOldError reports that the go command
+// found by exec.LookPath is too old to use the new go list behavior.
+type goTooOldError struct {
+ error
+}
+
+// responseDeduper wraps a driverResponse, deduplicating its contents.
+type responseDeduper struct {
+ seenRoots map[string]bool
+ seenPackages map[string]*Package
+ dr *driverResponse
+}
+
+// init fills in r with a driverResponse.
+func (r *responseDeduper) init(dr *driverResponse) {
+ r.dr = dr
+ r.seenRoots = map[string]bool{}
+ r.seenPackages = map[string]*Package{}
+ for _, pkg := range dr.Packages {
+ r.seenPackages[pkg.ID] = pkg
+ }
+ for _, root := range dr.Roots {
+ r.seenRoots[root] = true
+ }
+}
+
+func (r *responseDeduper) addPackage(p *Package) {
+ if r.seenPackages[p.ID] != nil {
+ return
+ }
+ r.seenPackages[p.ID] = p
+ r.dr.Packages = append(r.dr.Packages, p)
+}
+
+func (r *responseDeduper) addRoot(id string) {
+ if r.seenRoots[id] {
+ return
+ }
+ r.seenRoots[id] = true
+ r.dr.Roots = append(r.dr.Roots, id)
+}
+
+// goListDriver uses the go list command to interpret the patterns and produce
+// the build system package structure.
+// See driver for more details.
+func goListDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
+ var sizes types.Sizes
+ var sizeserr error
+ var sizeswg sync.WaitGroup
+ if cfg.Mode >= LoadTypes {
+ sizeswg.Add(1)
+ go func() {
+ sizes, sizeserr = getSizes(cfg)
+ sizeswg.Done()
+ }()
+ }
+
+ // Determine files requested in contains patterns
+ var containFiles []string
+ var packagesNamed []string
+ restPatterns := make([]string, 0, len(patterns))
+ // Extract file= and other [querytype]= patterns. Report an error if querytype
+ // doesn't exist.
+extractQueries:
+ for _, pattern := range patterns {
+ eqidx := strings.Index(pattern, "=")
+ if eqidx < 0 {
+ restPatterns = append(restPatterns, pattern)
+ } else {
+ query, value := pattern[:eqidx], pattern[eqidx+len("="):]
+ switch query {
+ case "file":
+ containFiles = append(containFiles, value)
+ case "pattern":
+ restPatterns = append(restPatterns, value)
+ case "iamashamedtousethedisabledqueryname":
+ packagesNamed = append(packagesNamed, value)
+ case "": // not a reserved query
+ restPatterns = append(restPatterns, pattern)
+ default:
+ for _, rune := range query {
+ if rune < 'a' || rune > 'z' { // not a reserved query
+ restPatterns = append(restPatterns, pattern)
+ continue extractQueries
+ }
+ }
+ // Reject all other patterns containing "="
+ return nil, fmt.Errorf("invalid query type %q in query pattern %q", query, pattern)
+ }
+ }
+ }
+
+ // TODO(matloob): Remove the definition of listfunc and just use golistPackages once go1.12 is released.
+ var listfunc driver
+ var isFallback bool
+ listfunc = func(cfg *Config, words ...string) (*driverResponse, error) {
+ response, err := golistDriverCurrent(cfg, words...)
+ if _, ok := err.(goTooOldError); ok {
+ isFallback = true
+ listfunc = golistDriverFallback
+ return listfunc(cfg, words...)
+ }
+ listfunc = golistDriverCurrent
+ return response, err
+ }
+
+ response := &responseDeduper{}
+ var err error
+
+ // See if we have any patterns to pass through to go list. Zero initial
+ // patterns also requires a go list call, since it's the equivalent of
+ // ".".
+ if len(restPatterns) > 0 || len(patterns) == 0 {
+ dr, err := listfunc(cfg, restPatterns...)
+ if err != nil {
+ return nil, err
+ }
+ response.init(dr)
+ } else {
+ response.init(&driverResponse{})
+ }
+
+ sizeswg.Wait()
+ if sizeserr != nil {
+ return nil, sizeserr
+ }
+ // types.SizesFor always returns nil or a *types.StdSizes
+ response.dr.Sizes, _ = sizes.(*types.StdSizes)
+
+ var containsCandidates []string
+
+ if len(containFiles) != 0 {
+ if err := runContainsQueries(cfg, listfunc, isFallback, response, containFiles); err != nil {
+ return nil, err
+ }
+ }
+
+ if len(packagesNamed) != 0 {
+ if err := runNamedQueries(cfg, listfunc, response, packagesNamed); err != nil {
+ return nil, err
+ }
+ }
+
+ modifiedPkgs, needPkgs, err := processGolistOverlay(cfg, response.dr)
+ if err != nil {
+ return nil, err
+ }
+ if len(containFiles) > 0 {
+ containsCandidates = append(containsCandidates, modifiedPkgs...)
+ containsCandidates = append(containsCandidates, needPkgs...)
+ }
+
+ if len(needPkgs) > 0 {
+ addNeededOverlayPackages(cfg, listfunc, response, needPkgs)
+ if err != nil {
+ return nil, err
+ }
+ }
+ // Check candidate packages for containFiles.
+ if len(containFiles) > 0 {
+ for _, id := range containsCandidates {
+ pkg := response.seenPackages[id]
+ for _, f := range containFiles {
+ for _, g := range pkg.GoFiles {
+ if sameFile(f, g) {
+ response.addRoot(id)
+ }
+ }
+ }
+ }
+ }
+
+ return response.dr, nil
+}
+
+func addNeededOverlayPackages(cfg *Config, driver driver, response *responseDeduper, pkgs []string) error {
+ dr, err := driver(cfg, pkgs...)
+ if err != nil {
+ return err
+ }
+ for _, pkg := range dr.Packages {
+ response.addPackage(pkg)
+ }
+ return nil
+}
+
+func runContainsQueries(cfg *Config, driver driver, isFallback bool, response *responseDeduper, queries []string) error {
+ for _, query := range queries {
+ // TODO(matloob): Do only one query per directory.
+ fdir := filepath.Dir(query)
+ // Pass absolute path of directory to go list so that it knows to treat it as a directory,
+ // not a package path.
+ pattern, err := filepath.Abs(fdir)
+ if err != nil {
+ return fmt.Errorf("could not determine absolute path of file= query path %q: %v", query, err)
+ }
+ if isFallback {
+ pattern = "."
+ cfg.Dir = fdir
+ }
+
+ dirResponse, err := driver(cfg, pattern)
+ if err != nil {
+ return err
+ }
+ isRoot := make(map[string]bool, len(dirResponse.Roots))
+ for _, root := range dirResponse.Roots {
+ isRoot[root] = true
+ }
+ for _, pkg := range dirResponse.Packages {
+ // Add any new packages to the main set
+ // We don't bother to filter packages that will be dropped by the changes of roots,
+ // that will happen anyway during graph construction outside this function.
+ // Over-reporting packages is not a problem.
+ response.addPackage(pkg)
+ // if the package was not a root one, it cannot have the file
+ if !isRoot[pkg.ID] {
+ continue
+ }
+ for _, pkgFile := range pkg.GoFiles {
+ if filepath.Base(query) == filepath.Base(pkgFile) {
+ response.addRoot(pkg.ID)
+ break
+ }
+ }
+ }
+ }
+ return nil
+}
+
+// modCacheRegexp splits a path in a module cache into module, module version, and package.
+var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`)
+
+func runNamedQueries(cfg *Config, driver driver, response *responseDeduper, queries []string) error {
+ // calling `go env` isn't free; bail out if there's nothing to do.
+ if len(queries) == 0 {
+ return nil
+ }
+ // Determine which directories are relevant to scan.
+ roots, modRoot, err := roots(cfg)
+ if err != nil {
+ return err
+ }
+
+ // Scan the selected directories. Simple matches, from GOPATH/GOROOT
+ // or the local module, can simply be "go list"ed. Matches from the
+ // module cache need special treatment.
+ var matchesMu sync.Mutex
+ var simpleMatches, modCacheMatches []string
+ add := func(root gopathwalk.Root, dir string) {
+ // Walk calls this concurrently; protect the result slices.
+ matchesMu.Lock()
+ defer matchesMu.Unlock()
+
+ path := dir
+ if dir != root.Path {
+ path = dir[len(root.Path)+1:]
+ }
+ if pathMatchesQueries(path, queries) {
+ switch root.Type {
+ case gopathwalk.RootModuleCache:
+ modCacheMatches = append(modCacheMatches, path)
+ case gopathwalk.RootCurrentModule:
+ // We'd need to read go.mod to find the full
+ // import path. Relative's easier.
+ rel, err := filepath.Rel(cfg.Dir, dir)
+ if err != nil {
+ // This ought to be impossible, since
+ // we found dir in the current module.
+ panic(err)
+ }
+ simpleMatches = append(simpleMatches, "./"+rel)
+ case gopathwalk.RootGOPATH, gopathwalk.RootGOROOT:
+ simpleMatches = append(simpleMatches, path)
+ }
+ }
+ }
+
+ startWalk := time.Now()
+ gopathwalk.Walk(roots, add, gopathwalk.Options{ModulesEnabled: modRoot != "", Debug: debug})
+ if debug {
+ log.Printf("%v for walk", time.Since(startWalk))
+ }
+
+ // Weird special case: the top-level package in a module will be in
+ // whatever directory the user checked the repository out into. It's
+ // more reasonable for that to not match the package name. So, if there
+ // are any Go files in the mod root, query it just to be safe.
+ if modRoot != "" {
+ rel, err := filepath.Rel(cfg.Dir, modRoot)
+ if err != nil {
+ panic(err) // See above.
+ }
+
+ files, err := ioutil.ReadDir(modRoot)
+ for _, f := range files {
+ if strings.HasSuffix(f.Name(), ".go") {
+ simpleMatches = append(simpleMatches, rel)
+ break
+ }
+ }
+ }
+
+ addResponse := func(r *driverResponse) {
+ for _, pkg := range r.Packages {
+ response.addPackage(pkg)
+ for _, name := range queries {
+ if pkg.Name == name {
+ response.addRoot(pkg.ID)
+ break
+ }
+ }
+ }
+ }
+
+ if len(simpleMatches) != 0 {
+ resp, err := driver(cfg, simpleMatches...)
+ if err != nil {
+ return err
+ }
+ addResponse(resp)
+ }
+
+ // Module cache matches are tricky. We want to avoid downloading new
+ // versions of things, so we need to use the ones present in the cache.
+ // go list doesn't accept version specifiers, so we have to write out a
+ // temporary module, and do the list in that module.
+ if len(modCacheMatches) != 0 {
+ // Collect all the matches, deduplicating by major version
+ // and preferring the newest.
+ type modInfo struct {
+ mod string
+ major string
+ }
+ mods := make(map[modInfo]string)
+ var imports []string
+ for _, modPath := range modCacheMatches {
+ matches := modCacheRegexp.FindStringSubmatch(modPath)
+ mod, ver := filepath.ToSlash(matches[1]), matches[2]
+ importPath := filepath.ToSlash(filepath.Join(matches[1], matches[3]))
+
+ major := semver.Major(ver)
+ if prevVer, ok := mods[modInfo{mod, major}]; !ok || semver.Compare(ver, prevVer) > 0 {
+ mods[modInfo{mod, major}] = ver
+ }
+
+ imports = append(imports, importPath)
+ }
+
+ // Build the temporary module.
+ var gomod bytes.Buffer
+ gomod.WriteString("module modquery\nrequire (\n")
+ for mod, version := range mods {
+ gomod.WriteString("\t" + mod.mod + " " + version + "\n")
+ }
+ gomod.WriteString(")\n")
+
+ tmpCfg := *cfg
+
+ // We're only trying to look at stuff in the module cache, so
+ // disable the network. This should speed things up, and has
+ // prevented errors in at least one case, #28518.
+ tmpCfg.Env = append(append([]string{"GOPROXY=off"}, cfg.Env...))
+
+ var err error
+ tmpCfg.Dir, err = ioutil.TempDir("", "gopackages-modquery")
+ if err != nil {
+ return err
+ }
+ defer os.RemoveAll(tmpCfg.Dir)
+
+ if err := ioutil.WriteFile(filepath.Join(tmpCfg.Dir, "go.mod"), gomod.Bytes(), 0777); err != nil {
+ return fmt.Errorf("writing go.mod for module cache query: %v", err)
+ }
+
+ // Run the query, using the import paths calculated from the matches above.
+ resp, err := driver(&tmpCfg, imports...)
+ if err != nil {
+ return fmt.Errorf("querying module cache matches: %v", err)
+ }
+ addResponse(resp)
+ }
+
+ return nil
+}
+
+func getSizes(cfg *Config) (types.Sizes, error) {
+ return packagesdriver.GetSizesGolist(cfg.Context, cfg.BuildFlags, cfg.Env, cfg.Dir, usesExportData(cfg))
+}
+
+// roots selects the appropriate paths to walk based on the passed-in configuration,
+// particularly the environment and the presence of a go.mod in cfg.Dir's parents.
+func roots(cfg *Config) ([]gopathwalk.Root, string, error) {
+ stdout, err := invokeGo(cfg, "env", "GOROOT", "GOPATH", "GOMOD")
+ if err != nil {
+ return nil, "", err
+ }
+
+ fields := strings.Split(stdout.String(), "\n")
+ if len(fields) != 4 || len(fields[3]) != 0 {
+ return nil, "", fmt.Errorf("go env returned unexpected output: %q", stdout.String())
+ }
+ goroot, gopath, gomod := fields[0], filepath.SplitList(fields[1]), fields[2]
+ var modDir string
+ if gomod != "" {
+ modDir = filepath.Dir(gomod)
+ }
+
+ var roots []gopathwalk.Root
+ // Always add GOROOT.
+ roots = append(roots, gopathwalk.Root{filepath.Join(goroot, "/src"), gopathwalk.RootGOROOT})
+ // If modules are enabled, scan the module dir.
+ if modDir != "" {
+ roots = append(roots, gopathwalk.Root{modDir, gopathwalk.RootCurrentModule})
+ }
+ // Add either GOPATH/src or GOPATH/pkg/mod, depending on module mode.
+ for _, p := range gopath {
+ if modDir != "" {
+ roots = append(roots, gopathwalk.Root{filepath.Join(p, "/pkg/mod"), gopathwalk.RootModuleCache})
+ } else {
+ roots = append(roots, gopathwalk.Root{filepath.Join(p, "/src"), gopathwalk.RootGOPATH})
+ }
+ }
+
+ return roots, modDir, nil
+}
+
+// These functions were copied from goimports. See further documentation there.
+
+// pathMatchesQueries is adapted from pkgIsCandidate.
+// TODO: is it reasonable to do Contains here, rather than an exact match on a path component?
+func pathMatchesQueries(path string, queries []string) bool {
+ lastTwo := lastTwoComponents(path)
+ for _, query := range queries {
+ if strings.Contains(lastTwo, query) {
+ return true
+ }
+ if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(query) {
+ lastTwo = lowerASCIIAndRemoveHyphen(lastTwo)
+ if strings.Contains(lastTwo, query) {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+// lastTwoComponents returns at most the last two path components
+// of v, using either / or \ as the path separator.
+func lastTwoComponents(v string) string {
+ nslash := 0
+ for i := len(v) - 1; i >= 0; i-- {
+ if v[i] == '/' || v[i] == '\\' {
+ nslash++
+ if nslash == 2 {
+ return v[i:]
+ }
+ }
+ }
+ return v
+}
+
+func hasHyphenOrUpperASCII(s string) bool {
+ for i := 0; i < len(s); i++ {
+ b := s[i]
+ if b == '-' || ('A' <= b && b <= 'Z') {
+ return true
+ }
+ }
+ return false
+}
+
+func lowerASCIIAndRemoveHyphen(s string) (ret string) {
+ buf := make([]byte, 0, len(s))
+ for i := 0; i < len(s); i++ {
+ b := s[i]
+ switch {
+ case b == '-':
+ continue
+ case 'A' <= b && b <= 'Z':
+ buf = append(buf, b+('a'-'A'))
+ default:
+ buf = append(buf, b)
+ }
+ }
+ return string(buf)
+}
+
+// Fields must match go list;
+// see $GOROOT/src/cmd/go/internal/load/pkg.go.
+type jsonPackage struct {
+ ImportPath string
+ Dir string
+ Name string
+ Export string
+ GoFiles []string
+ CompiledGoFiles []string
+ CFiles []string
+ CgoFiles []string
+ CXXFiles []string
+ MFiles []string
+ HFiles []string
+ FFiles []string
+ SFiles []string
+ SwigFiles []string
+ SwigCXXFiles []string
+ SysoFiles []string
+ Imports []string
+ ImportMap map[string]string
+ Deps []string
+ TestGoFiles []string
+ TestImports []string
+ XTestGoFiles []string
+ XTestImports []string
+ ForTest string // q in a "p [q.test]" package, else ""
+ DepOnly bool
+
+ Error *jsonPackageError
+}
+
+type jsonPackageError struct {
+ ImportStack []string
+ Pos string
+ Err string
+}
+
+func otherFiles(p *jsonPackage) [][]string {
+ return [][]string{p.CFiles, p.CXXFiles, p.MFiles, p.HFiles, p.FFiles, p.SFiles, p.SwigFiles, p.SwigCXXFiles, p.SysoFiles}
+}
+
+// golistDriverCurrent uses the "go list" command to expand the
+// pattern words and return metadata for the specified packages.
+// dir may be "" and env may be nil, as per os/exec.Command.
+func golistDriverCurrent(cfg *Config, words ...string) (*driverResponse, error) {
+ // go list uses the following identifiers in ImportPath and Imports:
+ //
+ // "p" -- importable package or main (command)
+ // "q.test" -- q's test executable
+ // "p [q.test]" -- variant of p as built for q's test executable
+ // "q_test [q.test]" -- q's external test package
+ //
+ // The packages p that are built differently for a test q.test
+ // are q itself, plus any helpers used by the external test q_test,
+ // typically including "testing" and all its dependencies.
+
+ // Run "go list" for complete
+ // information on the specified packages.
+ buf, err := invokeGo(cfg, golistargs(cfg, words)...)
+ if err != nil {
+ return nil, err
+ }
+ seen := make(map[string]*jsonPackage)
+ // Decode the JSON and convert it to Package form.
+ var response driverResponse
+ for dec := json.NewDecoder(buf); dec.More(); {
+ p := new(jsonPackage)
+ if err := dec.Decode(p); err != nil {
+ return nil, fmt.Errorf("JSON decoding failed: %v", err)
+ }
+
+ if p.ImportPath == "" {
+ // The documentation for go list says that “[e]rroneous packages will have
+ // a non-empty ImportPath”. If for some reason it comes back empty, we
+ // prefer to error out rather than silently discarding data or handing
+ // back a package without any way to refer to it.
+ if p.Error != nil {
+ return nil, Error{
+ Pos: p.Error.Pos,
+ Msg: p.Error.Err,
+ }
+ }
+ return nil, fmt.Errorf("package missing import path: %+v", p)
+ }
+
+ if old, found := seen[p.ImportPath]; found {
+ if !reflect.DeepEqual(p, old) {
+ return nil, fmt.Errorf("go list repeated package %v with different values", p.ImportPath)
+ }
+ // skip the duplicate
+ continue
+ }
+ seen[p.ImportPath] = p
+
+ pkg := &Package{
+ Name: p.Name,
+ ID: p.ImportPath,
+ GoFiles: absJoin(p.Dir, p.GoFiles, p.CgoFiles),
+ CompiledGoFiles: absJoin(p.Dir, p.CompiledGoFiles),
+ OtherFiles: absJoin(p.Dir, otherFiles(p)...),
+ }
+
+ // Workaround for https://golang.org/issue/28749.
+ // TODO(adonovan): delete before go1.12 release.
+ out := pkg.CompiledGoFiles[:0]
+ for _, f := range pkg.CompiledGoFiles {
+ if strings.HasSuffix(f, ".s") {
+ continue
+ }
+ out = append(out, f)
+ }
+ pkg.CompiledGoFiles = out
+
+ // Extract the PkgPath from the package's ID.
+ if i := strings.IndexByte(pkg.ID, ' '); i >= 0 {
+ pkg.PkgPath = pkg.ID[:i]
+ } else {
+ pkg.PkgPath = pkg.ID
+ }
+
+ if pkg.PkgPath == "unsafe" {
+ pkg.GoFiles = nil // ignore fake unsafe.go file
+ }
+
+ // Assume go list emits only absolute paths for Dir.
+ if p.Dir != "" && !filepath.IsAbs(p.Dir) {
+ log.Fatalf("internal error: go list returned non-absolute Package.Dir: %s", p.Dir)
+ }
+
+ if p.Export != "" && !filepath.IsAbs(p.Export) {
+ pkg.ExportFile = filepath.Join(p.Dir, p.Export)
+ } else {
+ pkg.ExportFile = p.Export
+ }
+
+ // imports
+ //
+ // Imports contains the IDs of all imported packages.
+ // ImportsMap records (path, ID) only where they differ.
+ ids := make(map[string]bool)
+ for _, id := range p.Imports {
+ ids[id] = true
+ }
+ pkg.Imports = make(map[string]*Package)
+ for path, id := range p.ImportMap {
+ pkg.Imports[path] = &Package{ID: id} // non-identity import
+ delete(ids, id)
+ }
+ for id := range ids {
+ if id == "C" {
+ continue
+ }
+
+ pkg.Imports[id] = &Package{ID: id} // identity import
+ }
+ if !p.DepOnly {
+ response.Roots = append(response.Roots, pkg.ID)
+ }
+
+ // Work around for pre-go.1.11 versions of go list.
+ // TODO(matloob): they should be handled by the fallback.
+ // Can we delete this?
+ if len(pkg.CompiledGoFiles) == 0 {
+ pkg.CompiledGoFiles = pkg.GoFiles
+ }
+
+ if p.Error != nil {
+ pkg.Errors = append(pkg.Errors, Error{
+ Pos: p.Error.Pos,
+ Msg: p.Error.Err,
+ })
+ }
+
+ response.Packages = append(response.Packages, pkg)
+ }
+
+ return &response, nil
+}
+
+// absJoin absolutizes and flattens the lists of files.
+func absJoin(dir string, fileses ...[]string) (res []string) {
+ for _, files := range fileses {
+ for _, file := range files {
+ if !filepath.IsAbs(file) {
+ file = filepath.Join(dir, file)
+ }
+ res = append(res, file)
+ }
+ }
+ return res
+}
+
+func golistargs(cfg *Config, words []string) []string {
+ fullargs := []string{
+ "list", "-e", "-json", "-compiled",
+ fmt.Sprintf("-test=%t", cfg.Tests),
+ fmt.Sprintf("-export=%t", usesExportData(cfg)),
+ fmt.Sprintf("-deps=%t", cfg.Mode >= LoadImports),
+ // go list doesn't let you pass -test and -find together,
+ // probably because you'd just get the TestMain.
+ fmt.Sprintf("-find=%t", cfg.Mode < LoadImports && !cfg.Tests),
+ }
+ fullargs = append(fullargs, cfg.BuildFlags...)
+ fullargs = append(fullargs, "--")
+ fullargs = append(fullargs, words...)
+ return fullargs
+}
+
+// invokeGo returns the stdout of a go command invocation.
+func invokeGo(cfg *Config, args ...string) (*bytes.Buffer, error) {
+ if debug {
+ defer func(start time.Time) { log.Printf("%s for %v", time.Since(start), cmdDebugStr(cfg, args...)) }(time.Now())
+ }
+ stdout := new(bytes.Buffer)
+ stderr := new(bytes.Buffer)
+ cmd := exec.CommandContext(cfg.Context, "go", args...)
+ // On darwin the cwd gets resolved to the real path, which breaks anything that
+ // expects the working directory to keep the original path, including the
+ // go command when dealing with modules.
+ // The Go stdlib has a special feature where if the cwd and the PWD are the
+ // same node then it trusts the PWD, so by setting it in the env for the child
+ // process we fix up all the paths returned by the go command.
+ cmd.Env = append(append([]string{}, cfg.Env...), "PWD="+cfg.Dir)
+ cmd.Dir = cfg.Dir
+ cmd.Stdout = stdout
+ cmd.Stderr = stderr
+ if err := cmd.Run(); err != nil {
+ exitErr, ok := err.(*exec.ExitError)
+ if !ok {
+ // Catastrophic error:
+ // - executable not found
+ // - context cancellation
+ return nil, fmt.Errorf("couldn't exec 'go %v': %s %T", args, err, err)
+ }
+
+ // Old go version?
+ if strings.Contains(stderr.String(), "flag provided but not defined") {
+ return nil, goTooOldError{fmt.Errorf("unsupported version of go: %s: %s", exitErr, stderr)}
+ }
+
+ // Export mode entails a build.
+ // If that build fails, errors appear on stderr
+ // (despite the -e flag) and the Export field is blank.
+ // Do not fail in that case.
+ // The same is true if an ad-hoc package given to go list doesn't exist.
+ // TODO(matloob): Remove these once we can depend on go list to exit with a zero status with -e even when
+ // packages don't exist or a build fails.
+ if !usesExportData(cfg) && !containsGoFile(args) {
+ return nil, fmt.Errorf("go %v: %s: %s", args, exitErr, stderr)
+ }
+ }
+
+ // As of writing, go list -export prints some non-fatal compilation
+ // errors to stderr, even with -e set. We would prefer that it put
+ // them in the Package.Error JSON (see https://golang.org/issue/26319).
+ // In the meantime, there's nowhere good to put them, but they can
+ // be useful for debugging. Print them if $GOPACKAGESPRINTGOLISTERRORS
+ // is set.
+ if len(stderr.Bytes()) != 0 && os.Getenv("GOPACKAGESPRINTGOLISTERRORS") != "" {
+ fmt.Fprintf(os.Stderr, "%s stderr: <<%s>>\n", cmdDebugStr(cfg, args...), stderr)
+ }
+
+ // debugging
+ if false {
+ fmt.Fprintf(os.Stderr, "%s stdout: <<%s>>\n", cmdDebugStr(cfg, args...), stdout)
+ }
+
+ return stdout, nil
+}
+
+func containsGoFile(s []string) bool {
+ for _, f := range s {
+ if strings.HasSuffix(f, ".go") {
+ return true
+ }
+ }
+ return false
+}
+
+func cmdDebugStr(cfg *Config, args ...string) string {
+ env := make(map[string]string)
+ for _, kv := range cfg.Env {
+ split := strings.Split(kv, "=")
+ k, v := split[0], split[1]
+ env[k] = v
+ }
+
+ return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["PWD"], args)
+}
diff --git a/vendor/golang.org/x/tools/go/packages/golist_fallback.go b/vendor/golang.org/x/tools/go/packages/golist_fallback.go
new file mode 100644
index 00000000000..141fa19ac19
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/golist_fallback.go
@@ -0,0 +1,450 @@
+// 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 packages
+
+import (
+ "encoding/json"
+ "fmt"
+ "go/build"
+ "io/ioutil"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "sort"
+ "strings"
+
+ "golang.org/x/tools/go/internal/cgo"
+)
+
+// TODO(matloob): Delete this file once Go 1.12 is released.
+
+// This file provides backwards compatibility support for
+// loading for versions of Go earlier than 1.11. This support is meant to
+// assist with migration to the Package API until there's
+// widespread adoption of these newer Go versions.
+// This support will be removed once Go 1.12 is released
+// in Q1 2019.
+
+func golistDriverFallback(cfg *Config, words ...string) (*driverResponse, error) {
+ // Turn absolute paths into GOROOT and GOPATH-relative paths to provide to go list.
+ // This will have surprising behavior if GOROOT or GOPATH contain multiple packages with the same
+ // path and a user provides an absolute path to a directory that's shadowed by an earlier
+ // directory in GOROOT or GOPATH with the same package path.
+ words = cleanAbsPaths(cfg, words)
+
+ original, deps, err := getDeps(cfg, words...)
+ if err != nil {
+ return nil, err
+ }
+
+ var tmpdir string // used for generated cgo files
+ var needsTestVariant []struct {
+ pkg, xtestPkg *Package
+ }
+
+ var response driverResponse
+ allPkgs := make(map[string]bool)
+ addPackage := func(p *jsonPackage, isRoot bool) {
+ id := p.ImportPath
+
+ if allPkgs[id] {
+ return
+ }
+ allPkgs[id] = true
+
+ pkgpath := id
+
+ if pkgpath == "unsafe" {
+ p.GoFiles = nil // ignore fake unsafe.go file
+ }
+
+ importMap := func(importlist []string) map[string]*Package {
+ importMap := make(map[string]*Package)
+ for _, id := range importlist {
+
+ if id == "C" {
+ for _, path := range []string{"unsafe", "syscall", "runtime/cgo"} {
+ if pkgpath != path && importMap[path] == nil {
+ importMap[path] = &Package{ID: path}
+ }
+ }
+ continue
+ }
+ importMap[vendorlessPath(id)] = &Package{ID: id}
+ }
+ return importMap
+ }
+ compiledGoFiles := absJoin(p.Dir, p.GoFiles)
+ // Use a function to simplify control flow. It's just a bunch of gotos.
+ var cgoErrors []error
+ var outdir string
+ getOutdir := func() (string, error) {
+ if outdir != "" {
+ return outdir, nil
+ }
+ if tmpdir == "" {
+ if tmpdir, err = ioutil.TempDir("", "gopackages"); err != nil {
+ return "", err
+ }
+ }
+ outdir = filepath.Join(tmpdir, strings.Replace(p.ImportPath, "/", "_", -1))
+ if err := os.MkdirAll(outdir, 0755); err != nil {
+ outdir = ""
+ return "", err
+ }
+ return outdir, nil
+ }
+ processCgo := func() bool {
+ // Suppress any cgo errors. Any relevant errors will show up in typechecking.
+ // TODO(matloob): Skip running cgo if Mode < LoadTypes.
+ outdir, err := getOutdir()
+ if err != nil {
+ cgoErrors = append(cgoErrors, err)
+ return false
+ }
+ files, _, err := runCgo(p.Dir, outdir, cfg.Env)
+ if err != nil {
+ cgoErrors = append(cgoErrors, err)
+ return false
+ }
+ compiledGoFiles = append(compiledGoFiles, files...)
+ return true
+ }
+ if len(p.CgoFiles) == 0 || !processCgo() {
+ compiledGoFiles = append(compiledGoFiles, absJoin(p.Dir, p.CgoFiles)...) // Punt to typechecker.
+ }
+ if isRoot {
+ response.Roots = append(response.Roots, id)
+ }
+ pkg := &Package{
+ ID: id,
+ Name: p.Name,
+ GoFiles: absJoin(p.Dir, p.GoFiles, p.CgoFiles),
+ CompiledGoFiles: compiledGoFiles,
+ OtherFiles: absJoin(p.Dir, otherFiles(p)...),
+ PkgPath: pkgpath,
+ Imports: importMap(p.Imports),
+ // TODO(matloob): set errors on the Package to cgoErrors
+ }
+ if p.Error != nil {
+ pkg.Errors = append(pkg.Errors, Error{
+ Pos: p.Error.Pos,
+ Msg: p.Error.Err,
+ })
+ }
+ response.Packages = append(response.Packages, pkg)
+ if cfg.Tests && isRoot {
+ testID := fmt.Sprintf("%s [%s.test]", id, id)
+ if len(p.TestGoFiles) > 0 || len(p.XTestGoFiles) > 0 {
+ response.Roots = append(response.Roots, testID)
+ testPkg := &Package{
+ ID: testID,
+ Name: p.Name,
+ GoFiles: absJoin(p.Dir, p.GoFiles, p.CgoFiles, p.TestGoFiles),
+ CompiledGoFiles: append(compiledGoFiles, absJoin(p.Dir, p.TestGoFiles)...),
+ OtherFiles: absJoin(p.Dir, otherFiles(p)...),
+ PkgPath: pkgpath,
+ Imports: importMap(append(p.Imports, p.TestImports...)),
+ // TODO(matloob): set errors on the Package to cgoErrors
+ }
+ response.Packages = append(response.Packages, testPkg)
+ var xtestPkg *Package
+ if len(p.XTestGoFiles) > 0 {
+ xtestID := fmt.Sprintf("%s_test [%s.test]", id, id)
+ response.Roots = append(response.Roots, xtestID)
+ // Generate test variants for all packages q where a path exists
+ // such that xtestPkg -> ... -> q -> ... -> p (where p is the package under test)
+ // and rewrite all import map entries of p to point to testPkg (the test variant of
+ // p), and of each q to point to the test variant of that q.
+ xtestPkg = &Package{
+ ID: xtestID,
+ Name: p.Name + "_test",
+ GoFiles: absJoin(p.Dir, p.XTestGoFiles),
+ CompiledGoFiles: absJoin(p.Dir, p.XTestGoFiles),
+ PkgPath: pkgpath + "_test",
+ Imports: importMap(p.XTestImports),
+ }
+ // Add to list of packages we need to rewrite imports for to refer to test variants.
+ // We may need to create a test variant of a package that hasn't been loaded yet, so
+ // the test variants need to be created later.
+ needsTestVariant = append(needsTestVariant, struct{ pkg, xtestPkg *Package }{pkg, xtestPkg})
+ response.Packages = append(response.Packages, xtestPkg)
+ }
+ // testmain package
+ testmainID := id + ".test"
+ response.Roots = append(response.Roots, testmainID)
+ imports := map[string]*Package{}
+ imports[testPkg.PkgPath] = &Package{ID: testPkg.ID}
+ if xtestPkg != nil {
+ imports[xtestPkg.PkgPath] = &Package{ID: xtestPkg.ID}
+ }
+ testmainPkg := &Package{
+ ID: testmainID,
+ Name: "main",
+ PkgPath: testmainID,
+ Imports: imports,
+ }
+ response.Packages = append(response.Packages, testmainPkg)
+ outdir, err := getOutdir()
+ if err != nil {
+ testmainPkg.Errors = append(testmainPkg.Errors, Error{
+ Pos: "-",
+ Msg: fmt.Sprintf("failed to generate testmain: %v", err),
+ Kind: ListError,
+ })
+ return
+ }
+ // Don't use a .go extension on the file, so that the tests think the file is inside GOCACHE.
+ // This allows the same test to test the pre- and post-Go 1.11 go list logic because the Go 1.11
+ // go list generates test mains in the cache, and the test code knows not to rely on paths in the
+ // cache to stay stable.
+ testmain := filepath.Join(outdir, "testmain-go")
+ extraimports, extradeps, err := generateTestmain(testmain, testPkg, xtestPkg)
+ if err != nil {
+ testmainPkg.Errors = append(testmainPkg.Errors, Error{
+ Pos: "-",
+ Msg: fmt.Sprintf("failed to generate testmain: %v", err),
+ Kind: ListError,
+ })
+ }
+ deps = append(deps, extradeps...)
+ for _, imp := range extraimports { // testing, testing/internal/testdeps, and maybe os
+ imports[imp] = &Package{ID: imp}
+ }
+ testmainPkg.GoFiles = []string{testmain}
+ testmainPkg.CompiledGoFiles = []string{testmain}
+ }
+ }
+ }
+
+ for _, pkg := range original {
+ addPackage(pkg, true)
+ }
+ if cfg.Mode < LoadImports || len(deps) == 0 {
+ return &response, nil
+ }
+
+ buf, err := invokeGo(cfg, golistArgsFallback(cfg, deps)...)
+ if err != nil {
+ return nil, err
+ }
+
+ // Decode the JSON and convert it to Package form.
+ for dec := json.NewDecoder(buf); dec.More(); {
+ p := new(jsonPackage)
+ if err := dec.Decode(p); err != nil {
+ return nil, fmt.Errorf("JSON decoding failed: %v", err)
+ }
+
+ addPackage(p, false)
+ }
+
+ for _, v := range needsTestVariant {
+ createTestVariants(&response, v.pkg, v.xtestPkg)
+ }
+
+ return &response, nil
+}
+
+func createTestVariants(response *driverResponse, pkgUnderTest, xtestPkg *Package) {
+ allPkgs := make(map[string]*Package)
+ for _, pkg := range response.Packages {
+ allPkgs[pkg.ID] = pkg
+ }
+ needsTestVariant := make(map[string]bool)
+ needsTestVariant[pkgUnderTest.ID] = true
+ var needsVariantRec func(p *Package) bool
+ needsVariantRec = func(p *Package) bool {
+ if needsTestVariant[p.ID] {
+ return true
+ }
+ for _, imp := range p.Imports {
+ if needsVariantRec(allPkgs[imp.ID]) {
+ // Don't break because we want to make sure all dependencies
+ // have been processed, and all required test variants of our dependencies
+ // exist.
+ needsTestVariant[p.ID] = true
+ }
+ }
+ if !needsTestVariant[p.ID] {
+ return false
+ }
+ // Create a clone of the package. It will share the same strings and lists of source files,
+ // but that's okay. It's only necessary for the Imports map to have a separate identity.
+ testVariant := *p
+ testVariant.ID = fmt.Sprintf("%s [%s.test]", p.ID, pkgUnderTest.ID)
+ testVariant.Imports = make(map[string]*Package)
+ for imp, pkg := range p.Imports {
+ testVariant.Imports[imp] = pkg
+ if needsTestVariant[pkg.ID] {
+ testVariant.Imports[imp] = &Package{ID: fmt.Sprintf("%s [%s.test]", pkg.ID, pkgUnderTest.ID)}
+ }
+ }
+ response.Packages = append(response.Packages, &testVariant)
+ return needsTestVariant[p.ID]
+ }
+ // finally, update the xtest package's imports
+ for imp, pkg := range xtestPkg.Imports {
+ if allPkgs[pkg.ID] == nil {
+ fmt.Printf("for %s: package %s doesn't exist\n", xtestPkg.ID, pkg.ID)
+ }
+ if needsVariantRec(allPkgs[pkg.ID]) {
+ xtestPkg.Imports[imp] = &Package{ID: fmt.Sprintf("%s [%s.test]", pkg.ID, pkgUnderTest.ID)}
+ }
+ }
+}
+
+// cleanAbsPaths replaces all absolute paths with GOPATH- and GOROOT-relative
+// paths. If an absolute path is not GOPATH- or GOROOT- relative, it is left as an
+// absolute path so an error can be returned later.
+func cleanAbsPaths(cfg *Config, words []string) []string {
+ var searchpaths []string
+ var cleaned = make([]string, len(words))
+ for i := range cleaned {
+ cleaned[i] = words[i]
+ // Ignore relative directory paths (they must already be goroot-relative) and Go source files
+ // (absolute source files are already allowed for ad-hoc packages).
+ // TODO(matloob): Can there be non-.go files in ad-hoc packages.
+ if !filepath.IsAbs(cleaned[i]) || strings.HasSuffix(cleaned[i], ".go") {
+ continue
+ }
+ // otherwise, it's an absolute path. Search GOPATH and GOROOT to find it.
+ if searchpaths == nil {
+ cmd := exec.Command("go", "env", "GOPATH", "GOROOT")
+ cmd.Env = cfg.Env
+ out, err := cmd.Output()
+ if err != nil {
+ searchpaths = []string{}
+ continue // suppress the error, it will show up again when running go list
+ }
+ lines := strings.Split(string(out), "\n")
+ if len(lines) != 3 || lines[0] == "" || lines[1] == "" || lines[2] != "" {
+ continue // suppress error
+ }
+ // first line is GOPATH
+ for _, path := range filepath.SplitList(lines[0]) {
+ searchpaths = append(searchpaths, filepath.Join(path, "src"))
+ }
+ // second line is GOROOT
+ searchpaths = append(searchpaths, filepath.Join(lines[1], "src"))
+ }
+ for _, sp := range searchpaths {
+ if strings.HasPrefix(cleaned[i], sp) {
+ cleaned[i] = strings.TrimPrefix(cleaned[i], sp)
+ cleaned[i] = strings.TrimLeft(cleaned[i], string(filepath.Separator))
+ }
+ }
+ }
+ return cleaned
+}
+
+// vendorlessPath returns the devendorized version of the import path ipath.
+// For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b".
+// Copied from golang.org/x/tools/imports/fix.go.
+func vendorlessPath(ipath string) string {
+ // Devendorize for use in import statement.
+ if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 {
+ return ipath[i+len("/vendor/"):]
+ }
+ if strings.HasPrefix(ipath, "vendor/") {
+ return ipath[len("vendor/"):]
+ }
+ return ipath
+}
+
+// getDeps runs an initial go list to determine all the dependency packages.
+func getDeps(cfg *Config, words ...string) (initial []*jsonPackage, deps []string, err error) {
+ buf, err := invokeGo(cfg, golistArgsFallback(cfg, words)...)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ depsSet := make(map[string]bool)
+ var testImports []string
+
+ // Extract deps from the JSON.
+ for dec := json.NewDecoder(buf); dec.More(); {
+ p := new(jsonPackage)
+ if err := dec.Decode(p); err != nil {
+ return nil, nil, fmt.Errorf("JSON decoding failed: %v", err)
+ }
+
+ initial = append(initial, p)
+ for _, dep := range p.Deps {
+ depsSet[dep] = true
+ }
+ if cfg.Tests {
+ // collect the additional imports of the test packages.
+ pkgTestImports := append(p.TestImports, p.XTestImports...)
+ for _, imp := range pkgTestImports {
+ if depsSet[imp] {
+ continue
+ }
+ depsSet[imp] = true
+ testImports = append(testImports, imp)
+ }
+ }
+ }
+ // Get the deps of the packages imported by tests.
+ if len(testImports) > 0 {
+ buf, err = invokeGo(cfg, golistArgsFallback(cfg, testImports)...)
+ if err != nil {
+ return nil, nil, err
+ }
+ // Extract deps from the JSON.
+ for dec := json.NewDecoder(buf); dec.More(); {
+ p := new(jsonPackage)
+ if err := dec.Decode(p); err != nil {
+ return nil, nil, fmt.Errorf("JSON decoding failed: %v", err)
+ }
+ for _, dep := range p.Deps {
+ depsSet[dep] = true
+ }
+ }
+ }
+
+ for _, orig := range initial {
+ delete(depsSet, orig.ImportPath)
+ }
+
+ deps = make([]string, 0, len(depsSet))
+ for dep := range depsSet {
+ deps = append(deps, dep)
+ }
+ sort.Strings(deps) // ensure output is deterministic
+ return initial, deps, nil
+}
+
+func golistArgsFallback(cfg *Config, words []string) []string {
+ fullargs := []string{"list", "-e", "-json"}
+ fullargs = append(fullargs, cfg.BuildFlags...)
+ fullargs = append(fullargs, "--")
+ fullargs = append(fullargs, words...)
+ return fullargs
+}
+
+func runCgo(pkgdir, tmpdir string, env []string) (files, displayfiles []string, err error) {
+ // Use go/build to open cgo files and determine the cgo flags, etc, from them.
+ // This is tricky so it's best to avoid reimplementing as much as we can, and
+ // we plan to delete this support once Go 1.12 is released anyways.
+ // TODO(matloob): This isn't completely correct because we're using the Default
+ // context. Perhaps we should more accurately fill in the context.
+ bp, err := build.ImportDir(pkgdir, build.ImportMode(0))
+ if err != nil {
+ return nil, nil, err
+ }
+ for _, ev := range env {
+ if v := strings.TrimPrefix(ev, "CGO_CPPFLAGS"); v != ev {
+ bp.CgoCPPFLAGS = append(bp.CgoCPPFLAGS, strings.Fields(v)...)
+ } else if v := strings.TrimPrefix(ev, "CGO_CFLAGS"); v != ev {
+ bp.CgoCFLAGS = append(bp.CgoCFLAGS, strings.Fields(v)...)
+ } else if v := strings.TrimPrefix(ev, "CGO_CXXFLAGS"); v != ev {
+ bp.CgoCXXFLAGS = append(bp.CgoCXXFLAGS, strings.Fields(v)...)
+ } else if v := strings.TrimPrefix(ev, "CGO_LDFLAGS"); v != ev {
+ bp.CgoLDFLAGS = append(bp.CgoLDFLAGS, strings.Fields(v)...)
+ }
+ }
+ return cgo.Run(bp, pkgdir, tmpdir, true)
+}
diff --git a/vendor/golang.org/x/tools/go/packages/golist_fallback_testmain.go b/vendor/golang.org/x/tools/go/packages/golist_fallback_testmain.go
new file mode 100644
index 00000000000..128e00e25aa
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/golist_fallback_testmain.go
@@ -0,0 +1,318 @@
+// 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.
+
+// This file is largely based on the Go 1.10-era cmd/go/internal/test/test.go
+// testmain generation code.
+
+package packages
+
+import (
+ "errors"
+ "fmt"
+ "go/ast"
+ "go/doc"
+ "go/parser"
+ "go/token"
+ "os"
+ "sort"
+ "strings"
+ "text/template"
+ "unicode"
+ "unicode/utf8"
+)
+
+// TODO(matloob): Delete this file once Go 1.12 is released.
+
+// This file complements golist_fallback.go by providing
+// support for generating testmains.
+
+func generateTestmain(out string, testPkg, xtestPkg *Package) (extraimports, extradeps []string, err error) {
+ testFuncs, err := loadTestFuncs(testPkg, xtestPkg)
+ if err != nil {
+ return nil, nil, err
+ }
+ extraimports = []string{"testing", "testing/internal/testdeps"}
+ if testFuncs.TestMain == nil {
+ extraimports = append(extraimports, "os")
+ }
+ // Transitive dependencies of ("testing", "testing/internal/testdeps").
+ // os is part of the transitive closure so it and its transitive dependencies are
+ // included regardless of whether it's imported in the template below.
+ extradeps = []string{
+ "errors",
+ "internal/cpu",
+ "unsafe",
+ "internal/bytealg",
+ "internal/race",
+ "runtime/internal/atomic",
+ "runtime/internal/sys",
+ "runtime",
+ "sync/atomic",
+ "sync",
+ "io",
+ "unicode",
+ "unicode/utf8",
+ "bytes",
+ "math",
+ "syscall",
+ "time",
+ "internal/poll",
+ "internal/syscall/unix",
+ "internal/testlog",
+ "os",
+ "math/bits",
+ "strconv",
+ "reflect",
+ "fmt",
+ "sort",
+ "strings",
+ "flag",
+ "runtime/debug",
+ "context",
+ "runtime/trace",
+ "testing",
+ "bufio",
+ "regexp/syntax",
+ "regexp",
+ "compress/flate",
+ "encoding/binary",
+ "hash",
+ "hash/crc32",
+ "compress/gzip",
+ "path/filepath",
+ "io/ioutil",
+ "text/tabwriter",
+ "runtime/pprof",
+ "testing/internal/testdeps",
+ }
+ return extraimports, extradeps, writeTestmain(out, testFuncs)
+}
+
+// The following is adapted from the cmd/go testmain generation code.
+
+// isTestFunc tells whether fn has the type of a testing function. arg
+// specifies the parameter type we look for: B, M or T.
+func isTestFunc(fn *ast.FuncDecl, arg string) bool {
+ if fn.Type.Results != nil && len(fn.Type.Results.List) > 0 ||
+ fn.Type.Params.List == nil ||
+ len(fn.Type.Params.List) != 1 ||
+ len(fn.Type.Params.List[0].Names) > 1 {
+ return false
+ }
+ ptr, ok := fn.Type.Params.List[0].Type.(*ast.StarExpr)
+ if !ok {
+ return false
+ }
+ // We can't easily check that the type is *testing.M
+ // because we don't know how testing has been imported,
+ // but at least check that it's *M or *something.M.
+ // Same applies for B and T.
+ if name, ok := ptr.X.(*ast.Ident); ok && name.Name == arg {
+ return true
+ }
+ if sel, ok := ptr.X.(*ast.SelectorExpr); ok && sel.Sel.Name == arg {
+ return true
+ }
+ return false
+}
+
+// isTest tells whether name looks like a test (or benchmark, according to prefix).
+// It is a Test (say) if there is a character after Test that is not a lower-case letter.
+// We don't want TesticularCancer.
+func isTest(name, prefix string) bool {
+ if !strings.HasPrefix(name, prefix) {
+ return false
+ }
+ if len(name) == len(prefix) { // "Test" is ok
+ return true
+ }
+ rune, _ := utf8.DecodeRuneInString(name[len(prefix):])
+ return !unicode.IsLower(rune)
+}
+
+// loadTestFuncs returns the testFuncs describing the tests that will be run.
+func loadTestFuncs(ptest, pxtest *Package) (*testFuncs, error) {
+ t := &testFuncs{
+ TestPackage: ptest,
+ XTestPackage: pxtest,
+ }
+ for _, file := range ptest.GoFiles {
+ if !strings.HasSuffix(file, "_test.go") {
+ continue
+ }
+ if err := t.load(file, "_test", &t.ImportTest, &t.NeedTest); err != nil {
+ return nil, err
+ }
+ }
+ if pxtest != nil {
+ for _, file := range pxtest.GoFiles {
+ if err := t.load(file, "_xtest", &t.ImportXtest, &t.NeedXtest); err != nil {
+ return nil, err
+ }
+ }
+ }
+ return t, nil
+}
+
+// writeTestmain writes the _testmain.go file for t to the file named out.
+func writeTestmain(out string, t *testFuncs) error {
+ f, err := os.Create(out)
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+
+ if err := testmainTmpl.Execute(f, t); err != nil {
+ return err
+ }
+
+ return nil
+}
+
+type testFuncs struct {
+ Tests []testFunc
+ Benchmarks []testFunc
+ Examples []testFunc
+ TestMain *testFunc
+ TestPackage *Package
+ XTestPackage *Package
+ ImportTest bool
+ NeedTest bool
+ ImportXtest bool
+ NeedXtest bool
+}
+
+// Tested returns the name of the package being tested.
+func (t *testFuncs) Tested() string {
+ return t.TestPackage.Name
+}
+
+type testFunc struct {
+ Package string // imported package name (_test or _xtest)
+ Name string // function name
+ Output string // output, for examples
+ Unordered bool // output is allowed to be unordered.
+}
+
+func (t *testFuncs) load(filename, pkg string, doImport, seen *bool) error {
+ var fset = token.NewFileSet()
+
+ f, err := parser.ParseFile(fset, filename, nil, parser.ParseComments)
+ if err != nil {
+ return errors.New("failed to parse test file " + filename)
+ }
+ for _, d := range f.Decls {
+ n, ok := d.(*ast.FuncDecl)
+ if !ok {
+ continue
+ }
+ if n.Recv != nil {
+ continue
+ }
+ name := n.Name.String()
+ switch {
+ case name == "TestMain":
+ if isTestFunc(n, "T") {
+ t.Tests = append(t.Tests, testFunc{pkg, name, "", false})
+ *doImport, *seen = true, true
+ continue
+ }
+ err := checkTestFunc(fset, n, "M")
+ if err != nil {
+ return err
+ }
+ if t.TestMain != nil {
+ return errors.New("multiple definitions of TestMain")
+ }
+ t.TestMain = &testFunc{pkg, name, "", false}
+ *doImport, *seen = true, true
+ case isTest(name, "Test"):
+ err := checkTestFunc(fset, n, "T")
+ if err != nil {
+ return err
+ }
+ t.Tests = append(t.Tests, testFunc{pkg, name, "", false})
+ *doImport, *seen = true, true
+ case isTest(name, "Benchmark"):
+ err := checkTestFunc(fset, n, "B")
+ if err != nil {
+ return err
+ }
+ t.Benchmarks = append(t.Benchmarks, testFunc{pkg, name, "", false})
+ *doImport, *seen = true, true
+ }
+ }
+ ex := doc.Examples(f)
+ sort.Slice(ex, func(i, j int) bool { return ex[i].Order < ex[j].Order })
+ for _, e := range ex {
+ *doImport = true // import test file whether executed or not
+ if e.Output == "" && !e.EmptyOutput {
+ // Don't run examples with no output.
+ continue
+ }
+ t.Examples = append(t.Examples, testFunc{pkg, "Example" + e.Name, e.Output, e.Unordered})
+ *seen = true
+ }
+ return nil
+}
+
+func checkTestFunc(fset *token.FileSet, fn *ast.FuncDecl, arg string) error {
+ if !isTestFunc(fn, arg) {
+ name := fn.Name.String()
+ pos := fset.Position(fn.Pos())
+ return fmt.Errorf("%s: wrong signature for %s, must be: func %s(%s *testing.%s)", pos, name, name, strings.ToLower(arg), arg)
+ }
+ return nil
+}
+
+var testmainTmpl = template.Must(template.New("main").Parse(`
+package main
+
+import (
+{{if not .TestMain}}
+ "os"
+{{end}}
+ "testing"
+ "testing/internal/testdeps"
+
+{{if .ImportTest}}
+ {{if .NeedTest}}_test{{else}}_{{end}} {{.TestPackage.PkgPath | printf "%q"}}
+{{end}}
+{{if .ImportXtest}}
+ {{if .NeedXtest}}_xtest{{else}}_{{end}} {{.XTestPackage.PkgPath | printf "%q"}}
+{{end}}
+)
+
+var tests = []testing.InternalTest{
+{{range .Tests}}
+ {"{{.Name}}", {{.Package}}.{{.Name}}},
+{{end}}
+}
+
+var benchmarks = []testing.InternalBenchmark{
+{{range .Benchmarks}}
+ {"{{.Name}}", {{.Package}}.{{.Name}}},
+{{end}}
+}
+
+var examples = []testing.InternalExample{
+{{range .Examples}}
+ {"{{.Name}}", {{.Package}}.{{.Name}}, {{.Output | printf "%q"}}, {{.Unordered}}},
+{{end}}
+}
+
+func init() {
+ testdeps.ImportPath = {{.TestPackage.PkgPath | printf "%q"}}
+}
+
+func main() {
+ m := testing.MainStart(testdeps.TestDeps{}, tests, benchmarks, examples)
+{{with .TestMain}}
+ {{.Package}}.{{.Name}}(m)
+{{else}}
+ os.Exit(m.Run())
+{{end}}
+}
+
+`))
diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go
new file mode 100644
index 00000000000..71ffcd9d55b
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go
@@ -0,0 +1,104 @@
+package packages
+
+import (
+ "go/parser"
+ "go/token"
+ "path/filepath"
+ "strconv"
+ "strings"
+)
+
+// processGolistOverlay provides rudimentary support for adding
+// files that don't exist on disk to an overlay. The results can be
+// sometimes incorrect.
+// TODO(matloob): Handle unsupported cases, including the following:
+// - test files
+// - adding test and non-test files to test variants of packages
+// - determining the correct package to add given a new import path
+// - creating packages that don't exist
+func processGolistOverlay(cfg *Config, response *driverResponse) (modifiedPkgs, needPkgs []string, err error) {
+ havePkgs := make(map[string]string) // importPath -> non-test package ID
+ needPkgsSet := make(map[string]bool)
+ modifiedPkgsSet := make(map[string]bool)
+
+ for _, pkg := range response.Packages {
+ // This is an approximation of import path to id. This can be
+ // wrong for tests, vendored packages, and a number of other cases.
+ havePkgs[pkg.PkgPath] = pkg.ID
+ }
+
+outer:
+ for path, contents := range cfg.Overlay {
+ base := filepath.Base(path)
+ if strings.HasSuffix(path, "_test.go") {
+ // Overlays don't support adding new test files yet.
+ // TODO(matloob): support adding new test files.
+ continue
+ }
+ dir := filepath.Dir(path)
+ for _, pkg := range response.Packages {
+ var dirContains, fileExists bool
+ for _, f := range pkg.GoFiles {
+ if sameFile(filepath.Dir(f), dir) {
+ dirContains = true
+ }
+ if filepath.Base(f) == base {
+ fileExists = true
+ }
+ }
+ if dirContains {
+ if !fileExists {
+ pkg.GoFiles = append(pkg.GoFiles, path) // TODO(matloob): should the file just be added to GoFiles?
+ pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, path)
+ modifiedPkgsSet[pkg.ID] = true
+ }
+ imports, err := extractImports(path, contents)
+ if err != nil {
+ // Let the parser or type checker report errors later.
+ continue outer
+ }
+ for _, imp := range imports {
+ _, found := pkg.Imports[imp]
+ if !found {
+ needPkgsSet[imp] = true
+ // TODO(matloob): Handle cases when the following block isn't correct.
+ // These include imports of test variants, imports of vendored packages, etc.
+ id, ok := havePkgs[imp]
+ if !ok {
+ id = imp
+ }
+ pkg.Imports[imp] = &Package{ID: id}
+ }
+ }
+ continue outer
+ }
+ }
+ }
+
+ needPkgs = make([]string, 0, len(needPkgsSet))
+ for pkg := range needPkgsSet {
+ needPkgs = append(needPkgs, pkg)
+ }
+ modifiedPkgs = make([]string, 0, len(modifiedPkgsSet))
+ for pkg := range modifiedPkgsSet {
+ modifiedPkgs = append(modifiedPkgs, pkg)
+ }
+ return modifiedPkgs, needPkgs, err
+}
+
+func extractImports(filename string, contents []byte) ([]string, error) {
+ f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.ImportsOnly) // TODO(matloob): reuse fileset?
+ if err != nil {
+ return nil, err
+ }
+ var res []string
+ for _, imp := range f.Imports {
+ quotedPath := imp.Path.Value
+ path, err := strconv.Unquote(quotedPath)
+ if err != nil {
+ return nil, err
+ }
+ res = append(res, path)
+ }
+ return res, nil
+}
diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go
new file mode 100644
index 00000000000..f4aac56e97b
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/packages.go
@@ -0,0 +1,955 @@
+// 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 packages
+
+// See doc.go for package documentation and implementation notes.
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/scanner"
+ "go/token"
+ "go/types"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+ "sync"
+
+ "golang.org/x/tools/go/gcexportdata"
+)
+
+// A LoadMode specifies the amount of detail to return when loading.
+// Higher-numbered modes cause Load to return more information,
+// but may be slower. Load may return more information than requested.
+type LoadMode int
+
+const (
+ // LoadFiles finds the packages and computes their source file lists.
+ // Package fields: ID, Name, Errors, GoFiles, and OtherFiles.
+ LoadFiles LoadMode = iota
+
+ // LoadImports adds import information for each package
+ // and its dependencies.
+ // Package fields added: Imports.
+ LoadImports
+
+ // LoadTypes adds type information for package-level
+ // declarations in the packages matching the patterns.
+ // Package fields added: Types, Fset, and IllTyped.
+ // This mode uses type information provided by the build system when
+ // possible, and may fill in the ExportFile field.
+ LoadTypes
+
+ // LoadSyntax adds typed syntax trees for the packages matching the patterns.
+ // Package fields added: Syntax, and TypesInfo, for direct pattern matches only.
+ LoadSyntax
+
+ // LoadAllSyntax adds typed syntax trees for the packages matching the patterns
+ // and all dependencies.
+ // Package fields added: Types, Fset, IllTyped, Syntax, and TypesInfo,
+ // for all packages in the import graph.
+ LoadAllSyntax
+)
+
+// A Config specifies details about how packages should be loaded.
+// The zero value is a valid configuration.
+// Calls to Load do not modify this struct.
+type Config struct {
+ // Mode controls the level of information returned for each package.
+ Mode LoadMode
+
+ // Context specifies the context for the load operation.
+ // If the context is cancelled, the loader may stop early
+ // and return an ErrCancelled error.
+ // If Context is nil, the load cannot be cancelled.
+ Context context.Context
+
+ // Dir is the directory in which to run the build system's query tool
+ // that provides information about the packages.
+ // If Dir is empty, the tool is run in the current directory.
+ Dir string
+
+ // Env is the environment to use when invoking the build system's query tool.
+ // If Env is nil, the current environment is used.
+ // As in os/exec's Cmd, only the last value in the slice for
+ // each environment key is used. To specify the setting of only
+ // a few variables, append to the current environment, as in:
+ //
+ // opt.Env = append(os.Environ(), "GOOS=plan9", "GOARCH=386")
+ //
+ Env []string
+
+ // BuildFlags is a list of command-line flags to be passed through to
+ // the build system's query tool.
+ BuildFlags []string
+
+ // Fset provides source position information for syntax trees and types.
+ // If Fset is nil, the loader will create a new FileSet.
+ Fset *token.FileSet
+
+ // ParseFile is called to read and parse each file
+ // when preparing a package's type-checked syntax tree.
+ // It must be safe to call ParseFile simultaneously from multiple goroutines.
+ // If ParseFile is nil, the loader will uses parser.ParseFile.
+ //
+ // ParseFile should parse the source from src and use filename only for
+ // recording position information.
+ //
+ // An application may supply a custom implementation of ParseFile
+ // to change the effective file contents or the behavior of the parser,
+ // or to modify the syntax tree. For example, selectively eliminating
+ // unwanted function bodies can significantly accelerate type checking.
+ ParseFile func(fset *token.FileSet, filename string, src []byte) (*ast.File, error)
+
+ // If Tests is set, the loader includes not just the packages
+ // matching a particular pattern but also any related test packages,
+ // including test-only variants of the package and the test executable.
+ //
+ // For example, when using the go command, loading "fmt" with Tests=true
+ // returns four packages, with IDs "fmt" (the standard package),
+ // "fmt [fmt.test]" (the package as compiled for the test),
+ // "fmt_test" (the test functions from source files in package fmt_test),
+ // and "fmt.test" (the test binary).
+ //
+ // In build systems with explicit names for tests,
+ // setting Tests may have no effect.
+ Tests bool
+
+ // Overlay provides a mapping of absolute file paths to file contents.
+ // If the file with the given path already exists, the parser will use the
+ // alternative file contents provided by the map.
+ //
+ // Overlays provide incomplete support for when a given file doesn't
+ // already exist on disk. See the package doc above for more details.
+ Overlay map[string][]byte
+}
+
+// driver is the type for functions that query the build system for the
+// packages named by the patterns.
+type driver func(cfg *Config, patterns ...string) (*driverResponse, error)
+
+// driverResponse contains the results for a driver query.
+type driverResponse struct {
+ // Sizes, if not nil, is the types.Sizes to use when type checking.
+ Sizes *types.StdSizes
+
+ // Roots is the set of package IDs that make up the root packages.
+ // We have to encode this separately because when we encode a single package
+ // we cannot know if it is one of the roots as that requires knowledge of the
+ // graph it is part of.
+ Roots []string `json:",omitempty"`
+
+ // Packages is the full set of packages in the graph.
+ // The packages are not connected into a graph.
+ // The Imports if populated will be stubs that only have their ID set.
+ // Imports will be connected and then type and syntax information added in a
+ // later pass (see refine).
+ Packages []*Package
+}
+
+// Load loads and returns the Go packages named by the given patterns.
+//
+// Config specifies loading options;
+// nil behaves the same as an empty Config.
+//
+// Load returns an error if any of the patterns was invalid
+// as defined by the underlying build system.
+// It may return an empty list of packages without an error,
+// for instance for an empty expansion of a valid wildcard.
+// Errors associated with a particular package are recorded in the
+// corresponding Package's Errors list, and do not cause Load to
+// return an error. Clients may need to handle such errors before
+// proceeding with further analysis. The PrintErrors function is
+// provided for convenient display of all errors.
+func Load(cfg *Config, patterns ...string) ([]*Package, error) {
+ l := newLoader(cfg)
+ response, err := defaultDriver(&l.Config, patterns...)
+ if err != nil {
+ return nil, err
+ }
+ l.sizes = response.Sizes
+ return l.refine(response.Roots, response.Packages...)
+}
+
+// defaultDriver is a driver that looks for an external driver binary, and if
+// it does not find it falls back to the built in go list driver.
+func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) {
+ driver := findExternalDriver(cfg)
+ if driver == nil {
+ driver = goListDriver
+ }
+ return driver(cfg, patterns...)
+}
+
+// A Package describes a loaded Go package.
+type Package struct {
+ // ID is a unique identifier for a package,
+ // in a syntax provided by the underlying build system.
+ //
+ // Because the syntax varies based on the build system,
+ // clients should treat IDs as opaque and not attempt to
+ // interpret them.
+ ID string
+
+ // Name is the package name as it appears in the package source code.
+ Name string
+
+ // PkgPath is the package path as used by the go/types package.
+ PkgPath string
+
+ // Errors contains any errors encountered querying the metadata
+ // of the package, or while parsing or type-checking its files.
+ Errors []Error
+
+ // GoFiles lists the absolute file paths of the package's Go source files.
+ GoFiles []string
+
+ // CompiledGoFiles lists the absolute file paths of the package's source
+ // files that were presented to the compiler.
+ // This may differ from GoFiles if files are processed before compilation.
+ CompiledGoFiles []string
+
+ // OtherFiles lists the absolute file paths of the package's non-Go source files,
+ // including assembly, C, C++, Fortran, Objective-C, SWIG, and so on.
+ OtherFiles []string
+
+ // ExportFile is the absolute path to a file containing type
+ // information for the package as provided by the build system.
+ ExportFile string
+
+ // Imports maps import paths appearing in the package's Go source files
+ // to corresponding loaded Packages.
+ Imports map[string]*Package
+
+ // Types provides type information for the package.
+ // Modes LoadTypes and above set this field for packages matching the
+ // patterns; type information for dependencies may be missing or incomplete.
+ // Mode LoadAllSyntax sets this field for all packages, including dependencies.
+ Types *types.Package
+
+ // Fset provides position information for Types, TypesInfo, and Syntax.
+ // It is set only when Types is set.
+ Fset *token.FileSet
+
+ // IllTyped indicates whether the package or any dependency contains errors.
+ // It is set only when Types is set.
+ IllTyped bool
+
+ // Syntax is the package's syntax trees, for the files listed in CompiledGoFiles.
+ //
+ // Mode LoadSyntax sets this field for packages matching the patterns.
+ // Mode LoadAllSyntax sets this field for all packages, including dependencies.
+ Syntax []*ast.File
+
+ // TypesInfo provides type information about the package's syntax trees.
+ // It is set only when Syntax is set.
+ TypesInfo *types.Info
+
+ // TypesSizes provides the effective size function for types in TypesInfo.
+ TypesSizes types.Sizes
+}
+
+// An Error describes a problem with a package's metadata, syntax, or types.
+type Error struct {
+ Pos string // "file:line:col" or "file:line" or "" or "-"
+ Msg string
+ Kind ErrorKind
+}
+
+// ErrorKind describes the source of the error, allowing the user to
+// differentiate between errors generated by the driver, the parser, or the
+// type-checker.
+type ErrorKind int
+
+const (
+ UnknownError ErrorKind = iota
+ ListError
+ ParseError
+ TypeError
+)
+
+func (err Error) Error() string {
+ pos := err.Pos
+ if pos == "" {
+ pos = "-" // like token.Position{}.String()
+ }
+ return pos + ": " + err.Msg
+}
+
+// flatPackage is the JSON form of Package
+// It drops all the type and syntax fields, and transforms the Imports
+//
+// TODO(adonovan): identify this struct with Package, effectively
+// publishing the JSON protocol.
+type flatPackage struct {
+ ID string
+ Name string `json:",omitempty"`
+ PkgPath string `json:",omitempty"`
+ Errors []Error `json:",omitempty"`
+ GoFiles []string `json:",omitempty"`
+ CompiledGoFiles []string `json:",omitempty"`
+ OtherFiles []string `json:",omitempty"`
+ ExportFile string `json:",omitempty"`
+ Imports map[string]string `json:",omitempty"`
+}
+
+// MarshalJSON returns the Package in its JSON form.
+// For the most part, the structure fields are written out unmodified, and
+// the type and syntax fields are skipped.
+// The imports are written out as just a map of path to package id.
+// The errors are written using a custom type that tries to preserve the
+// structure of error types we know about.
+//
+// This method exists to enable support for additional build systems. It is
+// not intended for use by clients of the API and we may change the format.
+func (p *Package) MarshalJSON() ([]byte, error) {
+ flat := &flatPackage{
+ ID: p.ID,
+ Name: p.Name,
+ PkgPath: p.PkgPath,
+ Errors: p.Errors,
+ GoFiles: p.GoFiles,
+ CompiledGoFiles: p.CompiledGoFiles,
+ OtherFiles: p.OtherFiles,
+ ExportFile: p.ExportFile,
+ }
+ if len(p.Imports) > 0 {
+ flat.Imports = make(map[string]string, len(p.Imports))
+ for path, ipkg := range p.Imports {
+ flat.Imports[path] = ipkg.ID
+ }
+ }
+ return json.Marshal(flat)
+}
+
+// UnmarshalJSON reads in a Package from its JSON format.
+// See MarshalJSON for details about the format accepted.
+func (p *Package) UnmarshalJSON(b []byte) error {
+ flat := &flatPackage{}
+ if err := json.Unmarshal(b, &flat); err != nil {
+ return err
+ }
+ *p = Package{
+ ID: flat.ID,
+ Name: flat.Name,
+ PkgPath: flat.PkgPath,
+ Errors: flat.Errors,
+ GoFiles: flat.GoFiles,
+ CompiledGoFiles: flat.CompiledGoFiles,
+ OtherFiles: flat.OtherFiles,
+ ExportFile: flat.ExportFile,
+ }
+ if len(flat.Imports) > 0 {
+ p.Imports = make(map[string]*Package, len(flat.Imports))
+ for path, id := range flat.Imports {
+ p.Imports[path] = &Package{ID: id}
+ }
+ }
+ return nil
+}
+
+func (p *Package) String() string { return p.ID }
+
+// loaderPackage augments Package with state used during the loading phase
+type loaderPackage struct {
+ *Package
+ importErrors map[string]error // maps each bad import to its error
+ loadOnce sync.Once
+ color uint8 // for cycle detection
+ needsrc bool // load from source (Mode >= LoadTypes)
+ needtypes bool // type information is either requested or depended on
+ initial bool // package was matched by a pattern
+}
+
+// loader holds the working state of a single call to load.
+type loader struct {
+ pkgs map[string]*loaderPackage
+ Config
+ sizes types.Sizes
+ exportMu sync.Mutex // enforces mutual exclusion of exportdata operations
+}
+
+func newLoader(cfg *Config) *loader {
+ ld := &loader{}
+ if cfg != nil {
+ ld.Config = *cfg
+ }
+ if ld.Config.Env == nil {
+ ld.Config.Env = os.Environ()
+ }
+ if ld.Context == nil {
+ ld.Context = context.Background()
+ }
+ if ld.Dir == "" {
+ if dir, err := os.Getwd(); err == nil {
+ ld.Dir = dir
+ }
+ }
+
+ if ld.Mode >= LoadTypes {
+ if ld.Fset == nil {
+ ld.Fset = token.NewFileSet()
+ }
+
+ // ParseFile is required even in LoadTypes mode
+ // because we load source if export data is missing.
+ if ld.ParseFile == nil {
+ ld.ParseFile = func(fset *token.FileSet, filename string, src []byte) (*ast.File, error) {
+ var isrc interface{}
+ if src != nil {
+ isrc = src
+ }
+ const mode = parser.AllErrors | parser.ParseComments
+ return parser.ParseFile(fset, filename, isrc, mode)
+ }
+ }
+ }
+ return ld
+}
+
+// refine connects the supplied packages into a graph and then adds type and
+// and syntax information as requested by the LoadMode.
+func (ld *loader) refine(roots []string, list ...*Package) ([]*Package, error) {
+ rootMap := make(map[string]int, len(roots))
+ for i, root := range roots {
+ rootMap[root] = i
+ }
+ ld.pkgs = make(map[string]*loaderPackage)
+ // first pass, fixup and build the map and roots
+ var initial = make([]*loaderPackage, len(roots))
+ for _, pkg := range list {
+ rootIndex := -1
+ if i, found := rootMap[pkg.ID]; found {
+ rootIndex = i
+ }
+ lpkg := &loaderPackage{
+ Package: pkg,
+ needtypes: ld.Mode >= LoadAllSyntax ||
+ ld.Mode >= LoadTypes && rootIndex >= 0,
+ needsrc: ld.Mode >= LoadAllSyntax ||
+ ld.Mode >= LoadSyntax && rootIndex >= 0 ||
+ len(ld.Overlay) > 0 || // Overlays can invalidate export data. TODO(matloob): make this check fine-grained based on dependencies on overlaid files
+ pkg.ExportFile == "" && pkg.PkgPath != "unsafe",
+ }
+ ld.pkgs[lpkg.ID] = lpkg
+ if rootIndex >= 0 {
+ initial[rootIndex] = lpkg
+ lpkg.initial = true
+ }
+ }
+ for i, root := range roots {
+ if initial[i] == nil {
+ return nil, fmt.Errorf("root package %v is missing", root)
+ }
+ }
+
+ // Materialize the import graph.
+
+ const (
+ white = 0 // new
+ grey = 1 // in progress
+ black = 2 // complete
+ )
+
+ // visit traverses the import graph, depth-first,
+ // and materializes the graph as Packages.Imports.
+ //
+ // Valid imports are saved in the Packages.Import map.
+ // Invalid imports (cycles and missing nodes) are saved in the importErrors map.
+ // Thus, even in the presence of both kinds of errors, the Import graph remains a DAG.
+ //
+ // visit returns whether the package needs src or has a transitive
+ // dependency on a package that does. These are the only packages
+ // for which we load source code.
+ var stack []*loaderPackage
+ var visit func(lpkg *loaderPackage) bool
+ var srcPkgs []*loaderPackage
+ visit = func(lpkg *loaderPackage) bool {
+ switch lpkg.color {
+ case black:
+ return lpkg.needsrc
+ case grey:
+ panic("internal error: grey node")
+ }
+ lpkg.color = grey
+ stack = append(stack, lpkg) // push
+ stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports
+ lpkg.Imports = make(map[string]*Package, len(stubs))
+ for importPath, ipkg := range stubs {
+ var importErr error
+ imp := ld.pkgs[ipkg.ID]
+ if imp == nil {
+ // (includes package "C" when DisableCgo)
+ importErr = fmt.Errorf("missing package: %q", ipkg.ID)
+ } else if imp.color == grey {
+ importErr = fmt.Errorf("import cycle: %s", stack)
+ }
+ if importErr != nil {
+ if lpkg.importErrors == nil {
+ lpkg.importErrors = make(map[string]error)
+ }
+ lpkg.importErrors[importPath] = importErr
+ continue
+ }
+
+ if visit(imp) {
+ lpkg.needsrc = true
+ }
+ lpkg.Imports[importPath] = imp.Package
+ }
+ if lpkg.needsrc {
+ srcPkgs = append(srcPkgs, lpkg)
+ }
+ stack = stack[:len(stack)-1] // pop
+ lpkg.color = black
+
+ return lpkg.needsrc
+ }
+
+ if ld.Mode < LoadImports {
+ //we do this to drop the stub import packages that we are not even going to try to resolve
+ for _, lpkg := range initial {
+ lpkg.Imports = nil
+ }
+ } else {
+ // For each initial package, create its import DAG.
+ for _, lpkg := range initial {
+ visit(lpkg)
+ }
+ }
+ for _, lpkg := range srcPkgs {
+ // Complete type information is required for the
+ // immediate dependencies of each source package.
+ for _, ipkg := range lpkg.Imports {
+ imp := ld.pkgs[ipkg.ID]
+ imp.needtypes = true
+ }
+ }
+ // Load type data if needed, starting at
+ // the initial packages (roots of the import DAG).
+ if ld.Mode >= LoadTypes {
+ var wg sync.WaitGroup
+ for _, lpkg := range initial {
+ wg.Add(1)
+ go func(lpkg *loaderPackage) {
+ ld.loadRecursive(lpkg)
+ wg.Done()
+ }(lpkg)
+ }
+ wg.Wait()
+ }
+
+ result := make([]*Package, len(initial))
+ for i, lpkg := range initial {
+ result[i] = lpkg.Package
+ }
+ return result, nil
+}
+
+// loadRecursive loads the specified package and its dependencies,
+// recursively, in parallel, in topological order.
+// It is atomic and idempotent.
+// Precondition: ld.Mode >= LoadTypes.
+func (ld *loader) loadRecursive(lpkg *loaderPackage) {
+ lpkg.loadOnce.Do(func() {
+ // Load the direct dependencies, in parallel.
+ var wg sync.WaitGroup
+ for _, ipkg := range lpkg.Imports {
+ imp := ld.pkgs[ipkg.ID]
+ wg.Add(1)
+ go func(imp *loaderPackage) {
+ ld.loadRecursive(imp)
+ wg.Done()
+ }(imp)
+ }
+ wg.Wait()
+
+ ld.loadPackage(lpkg)
+ })
+}
+
+// loadPackage loads the specified package.
+// It must be called only once per Package,
+// after immediate dependencies are loaded.
+// Precondition: ld.Mode >= LoadTypes.
+func (ld *loader) loadPackage(lpkg *loaderPackage) {
+ if lpkg.PkgPath == "unsafe" {
+ // Fill in the blanks to avoid surprises.
+ lpkg.Types = types.Unsafe
+ lpkg.Fset = ld.Fset
+ lpkg.Syntax = []*ast.File{}
+ lpkg.TypesInfo = new(types.Info)
+ lpkg.TypesSizes = ld.sizes
+ return
+ }
+
+ // Call NewPackage directly with explicit name.
+ // This avoids skew between golist and go/types when the files'
+ // package declarations are inconsistent.
+ lpkg.Types = types.NewPackage(lpkg.PkgPath, lpkg.Name)
+ lpkg.Fset = ld.Fset
+
+ // 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.
+ // The Diamond test exercises this case.
+ if !lpkg.needtypes {
+ return
+ }
+ if !lpkg.needsrc {
+ ld.loadFromExportData(lpkg)
+ return // not a source package, don't get syntax trees
+ }
+
+ appendError := func(err error) {
+ // Convert various error types into the one true Error.
+ var errs []Error
+ switch err := err.(type) {
+ case Error:
+ // from driver
+ errs = append(errs, err)
+
+ case *os.PathError:
+ // from parser
+ errs = append(errs, Error{
+ Pos: err.Path + ":1",
+ Msg: err.Err.Error(),
+ Kind: ParseError,
+ })
+
+ case scanner.ErrorList:
+ // from parser
+ for _, err := range err {
+ errs = append(errs, Error{
+ Pos: err.Pos.String(),
+ Msg: err.Msg,
+ Kind: ParseError,
+ })
+ }
+
+ case types.Error:
+ // from type checker
+ errs = append(errs, Error{
+ Pos: err.Fset.Position(err.Pos).String(),
+ Msg: err.Msg,
+ Kind: TypeError,
+ })
+
+ default:
+ // unexpected impoverished error from parser?
+ errs = append(errs, Error{
+ Pos: "-",
+ Msg: err.Error(),
+ Kind: UnknownError,
+ })
+
+ // If you see this error message, please file a bug.
+ log.Printf("internal error: error %q (%T) without position", err, err)
+ }
+
+ lpkg.Errors = append(lpkg.Errors, errs...)
+ }
+
+ files, errs := ld.parseFiles(lpkg.CompiledGoFiles)
+ for _, err := range errs {
+ appendError(err)
+ }
+
+ lpkg.Syntax = files
+
+ lpkg.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),
+ }
+ lpkg.TypesSizes = ld.sizes
+
+ importer := importerFunc(func(path string) (*types.Package, error) {
+ if path == "unsafe" {
+ return types.Unsafe, nil
+ }
+
+ // The imports map is keyed by import path.
+ ipkg := lpkg.Imports[path]
+ if ipkg == nil {
+ if err := lpkg.importErrors[path]; err != nil {
+ return nil, err
+ }
+ // There was skew between the metadata and the
+ // import declarations, likely due to an edit
+ // race, or because the ParseFile feature was
+ // used to supply alternative file contents.
+ return nil, fmt.Errorf("no metadata for %s", path)
+ }
+
+ if ipkg.Types != nil && ipkg.Types.Complete() {
+ return ipkg.Types, nil
+ }
+ log.Fatalf("internal error: nil Pkg importing %q from %q", path, lpkg)
+ panic("unreachable")
+ })
+
+ // type-check
+ tc := &types.Config{
+ Importer: importer,
+
+ // Type-check bodies of functions only in non-initial packages.
+ // Example: for import graph A->B->C and initial packages {A,C},
+ // we can ignore function bodies in B.
+ IgnoreFuncBodies: ld.Mode < LoadAllSyntax && !lpkg.initial,
+
+ Error: appendError,
+ Sizes: ld.sizes,
+ }
+ types.NewChecker(tc, ld.Fset, lpkg.Types, lpkg.TypesInfo).Files(lpkg.Syntax)
+
+ lpkg.importErrors = nil // no longer needed
+
+ // If !Cgo, the type-checker uses FakeImportC mode, so
+ // it doesn't invoke the importer for import "C",
+ // nor report an error for the import,
+ // or for any undefined C.f reference.
+ // We must detect this explicitly and correctly
+ // mark the package as IllTyped (by reporting an error).
+ // TODO(adonovan): if these errors are annoying,
+ // we could just set IllTyped quietly.
+ if tc.FakeImportC {
+ outer:
+ for _, f := range lpkg.Syntax {
+ for _, imp := range f.Imports {
+ if imp.Path.Value == `"C"` {
+ err := types.Error{Fset: ld.Fset, Pos: imp.Pos(), Msg: `import "C" ignored`}
+ appendError(err)
+ break outer
+ }
+ }
+ }
+ }
+
+ // Record accumulated errors.
+ illTyped := len(lpkg.Errors) > 0
+ if !illTyped {
+ for _, imp := range lpkg.Imports {
+ if imp.IllTyped {
+ illTyped = true
+ break
+ }
+ }
+ }
+ lpkg.IllTyped = illTyped
+}
+
+// An importFunc is an implementation of the single-method
+// types.Importer interface based on a function value.
+type importerFunc func(path string) (*types.Package, error)
+
+func (f importerFunc) Import(path string) (*types.Package, error) { return f(path) }
+
+// We use a counting semaphore to limit
+// the number of parallel I/O calls per process.
+var ioLimit = make(chan bool, 20)
+
+// parseFiles reads and parses the Go source files and returns the ASTs
+// of the ones that could be at least partially parsed, along with a
+// list of I/O and parse errors encountered.
+//
+// Because files are scanned in parallel, the token.Pos
+// positions of the resulting ast.Files are not ordered.
+//
+func (ld *loader) parseFiles(filenames []string) ([]*ast.File, []error) {
+ var wg sync.WaitGroup
+ n := len(filenames)
+ parsed := make([]*ast.File, n)
+ errors := make([]error, n)
+ for i, file := range filenames {
+ if ld.Config.Context.Err() != nil {
+ parsed[i] = nil
+ errors[i] = ld.Config.Context.Err()
+ continue
+ }
+ wg.Add(1)
+ go func(i int, filename string) {
+ ioLimit <- true // wait
+ // ParseFile may return both an AST and an error.
+ var src []byte
+ for f, contents := range ld.Config.Overlay {
+ if sameFile(f, filename) {
+ src = contents
+ }
+ }
+ var err error
+ if src == nil {
+ src, err = ioutil.ReadFile(filename)
+ }
+ if err != nil {
+ parsed[i], errors[i] = nil, err
+ } else {
+ parsed[i], errors[i] = ld.ParseFile(ld.Fset, filename, src)
+ }
+ <-ioLimit // signal
+ wg.Done()
+ }(i, file)
+ }
+ wg.Wait()
+
+ // Eliminate nils, preserving order.
+ var o int
+ for _, f := range parsed {
+ if f != nil {
+ parsed[o] = f
+ o++
+ }
+ }
+ parsed = parsed[:o]
+
+ o = 0
+ for _, err := range errors {
+ if err != nil {
+ errors[o] = err
+ o++
+ }
+ }
+ errors = errors[:o]
+
+ return parsed, errors
+}
+
+// sameFile returns true if x and y have the same basename and denote
+// the same file.
+//
+func sameFile(x, y string) bool {
+ if x == y {
+ // It could be the case that y doesn't exist.
+ // For instance, it may be an overlay file that
+ // hasn't been written to disk. To handle that case
+ // let x == y through. (We added the exact absolute path
+ // string to the CompiledGoFiles list, so the unwritten
+ // overlay case implies x==y.)
+ return true
+ }
+ if filepath.Base(x) == filepath.Base(y) { // (optimisation)
+ if xi, err := os.Stat(x); err == nil {
+ if yi, err := os.Stat(y); err == nil {
+ return os.SameFile(xi, yi)
+ }
+ }
+ }
+ return false
+}
+
+// loadFromExportData returns type information for the specified
+// package, loading it from an export data file on the first request.
+func (ld *loader) loadFromExportData(lpkg *loaderPackage) (*types.Package, error) {
+ if lpkg.PkgPath == "" {
+ log.Fatalf("internal error: Package %s has no PkgPath", lpkg)
+ }
+
+ // Because gcexportdata.Read has the potential to create or
+ // modify the types.Package for each node in the transitive
+ // closure of dependencies of lpkg, all exportdata operations
+ // must be sequential. (Finer-grained locking would require
+ // changes to the gcexportdata API.)
+ //
+ // The exportMu lock guards the Package.Pkg field and the
+ // types.Package it points to, for each Package in the graph.
+ //
+ // Not all accesses to Package.Pkg need to be protected by exportMu:
+ // graph ordering ensures that direct dependencies of source
+ // packages are fully loaded before the importer reads their Pkg field.
+ ld.exportMu.Lock()
+ defer ld.exportMu.Unlock()
+
+ if tpkg := lpkg.Types; tpkg != nil && tpkg.Complete() {
+ return tpkg, nil // cache hit
+ }
+
+ lpkg.IllTyped = true // fail safe
+
+ if lpkg.ExportFile == "" {
+ // Errors while building export data will have been printed to stderr.
+ return nil, fmt.Errorf("no export data file")
+ }
+ f, err := os.Open(lpkg.ExportFile)
+ if err != nil {
+ return nil, err
+ }
+ defer f.Close()
+
+ // Read gc export data.
+ //
+ // We don't currently support gccgo export data because all
+ // underlying workspaces use the gc toolchain. (Even build
+ // systems that support gccgo don't use it for workspace
+ // queries.)
+ r, err := gcexportdata.NewReader(f)
+ if err != nil {
+ return nil, fmt.Errorf("reading %s: %v", lpkg.ExportFile, err)
+ }
+
+ // Build the view.
+ //
+ // The gcexportdata machinery has no concept of package ID.
+ // It identifies packages by their PkgPath, which although not
+ // globally unique is unique within the scope of one invocation
+ // of the linker, type-checker, or gcexportdata.
+ //
+ // So, we must build a PkgPath-keyed view of the global
+ // (conceptually ID-keyed) cache of packages and pass it to
+ // gcexportdata. The view must contain every existing
+ // package that might possibly be mentioned by the
+ // current package---its transitive closure.
+ //
+ // In loadPackage, we unconditionally create a types.Package for
+ // each dependency so that export data loading does not
+ // create new ones.
+ //
+ // TODO(adonovan): it would be simpler and more efficient
+ // if the export data machinery invoked a callback to
+ // get-or-create a package instead of a map.
+ //
+ view := make(map[string]*types.Package) // view seen by gcexportdata
+ seen := make(map[*loaderPackage]bool) // all visited packages
+ var visit func(pkgs map[string]*Package)
+ visit = func(pkgs map[string]*Package) {
+ for _, p := range pkgs {
+ lpkg := ld.pkgs[p.ID]
+ if !seen[lpkg] {
+ seen[lpkg] = true
+ view[lpkg.PkgPath] = lpkg.Types
+ visit(lpkg.Imports)
+ }
+ }
+ }
+ visit(lpkg.Imports)
+
+ viewLen := len(view) + 1 // adding the self package
+ // Parse the export data.
+ // (May modify incomplete packages in view but not create new ones.)
+ tpkg, err := gcexportdata.Read(r, ld.Fset, view, lpkg.PkgPath)
+ if err != nil {
+ return nil, fmt.Errorf("reading %s: %v", lpkg.ExportFile, err)
+ }
+ if viewLen != len(view) {
+ log.Fatalf("Unexpected package creation during export data loading")
+ }
+
+ lpkg.Types = tpkg
+ lpkg.IllTyped = false
+
+ return tpkg, nil
+}
+
+func usesExportData(cfg *Config) bool {
+ return LoadTypes <= cfg.Mode && cfg.Mode < LoadAllSyntax
+}
diff --git a/vendor/golang.org/x/tools/go/packages/visit.go b/vendor/golang.org/x/tools/go/packages/visit.go
new file mode 100644
index 00000000000..b13cb081fcb
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/packages/visit.go
@@ -0,0 +1,55 @@
+package packages
+
+import (
+ "fmt"
+ "os"
+ "sort"
+)
+
+// Visit visits all the packages in the import graph whose roots are
+// pkgs, calling the optional pre function the first time each package
+// is encountered (preorder), and the optional post function after a
+// package's dependencies have been visited (postorder).
+// The boolean result of pre(pkg) determines whether
+// the imports of package pkg are visited.
+func Visit(pkgs []*Package, pre func(*Package) bool, post func(*Package)) {
+ seen := make(map[*Package]bool)
+ var visit func(*Package)
+ visit = func(pkg *Package) {
+ if !seen[pkg] {
+ seen[pkg] = true
+
+ if pre == nil || pre(pkg) {
+ paths := make([]string, 0, len(pkg.Imports))
+ for path := range pkg.Imports {
+ paths = append(paths, path)
+ }
+ sort.Strings(paths) // Imports is a map, this makes visit stable
+ for _, path := range paths {
+ visit(pkg.Imports[path])
+ }
+ }
+
+ if post != nil {
+ post(pkg)
+ }
+ }
+ }
+ for _, pkg := range pkgs {
+ visit(pkg)
+ }
+}
+
+// PrintErrors prints to os.Stderr the accumulated errors of all
+// packages in the import graph rooted at pkgs, dependencies first.
+// PrintErrors returns the number of errors printed.
+func PrintErrors(pkgs []*Package) int {
+ var n int
+ Visit(pkgs, nil, func(pkg *Package) {
+ for _, err := range pkg.Errors {
+ fmt.Fprintln(os.Stderr, err)
+ n++
+ }
+ })
+ return n
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/blockopt.go b/vendor/golang.org/x/tools/go/ssa/blockopt.go
new file mode 100644
index 00000000000..e79260a21a2
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/blockopt.go
@@ -0,0 +1,187 @@
+// 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 ssa
+
+// Simple block optimizations to simplify the control flow graph.
+
+// TODO(adonovan): opt: instead of creating several "unreachable" blocks
+// per function in the Builder, reuse a single one (e.g. at Blocks[1])
+// to reduce garbage.
+
+import (
+ "fmt"
+ "os"
+)
+
+// If true, perform sanity checking and show progress at each
+// successive iteration of optimizeBlocks. Very verbose.
+const debugBlockOpt = false
+
+// markReachable sets Index=-1 for all blocks reachable from b.
+func markReachable(b *BasicBlock) {
+ b.Index = -1
+ for _, succ := range b.Succs {
+ if succ.Index == 0 {
+ markReachable(succ)
+ }
+ }
+}
+
+// deleteUnreachableBlocks marks all reachable blocks of f and
+// eliminates (nils) all others, including possibly cyclic subgraphs.
+//
+func deleteUnreachableBlocks(f *Function) {
+ const white, black = 0, -1
+ // We borrow b.Index temporarily as the mark bit.
+ for _, b := range f.Blocks {
+ b.Index = white
+ }
+ markReachable(f.Blocks[0])
+ if f.Recover != nil {
+ markReachable(f.Recover)
+ }
+ for i, b := range f.Blocks {
+ if b.Index == white {
+ for _, c := range b.Succs {
+ if c.Index == black {
+ c.removePred(b) // delete white->black edge
+ }
+ }
+ if debugBlockOpt {
+ fmt.Fprintln(os.Stderr, "unreachable", b)
+ }
+ f.Blocks[i] = nil // delete b
+ }
+ }
+ f.removeNilBlocks()
+}
+
+// jumpThreading attempts to apply simple jump-threading to block b,
+// in which a->b->c become a->c if b is just a Jump.
+// The result is true if the optimization was applied.
+//
+func jumpThreading(f *Function, b *BasicBlock) bool {
+ if b.Index == 0 {
+ return false // don't apply to entry block
+ }
+ if b.Instrs == nil {
+ return false
+ }
+ if _, ok := b.Instrs[0].(*Jump); !ok {
+ return false // not just a jump
+ }
+ c := b.Succs[0]
+ if c == b {
+ return false // don't apply to degenerate jump-to-self.
+ }
+ if c.hasPhi() {
+ return false // not sound without more effort
+ }
+ for j, a := range b.Preds {
+ a.replaceSucc(b, c)
+
+ // If a now has two edges to c, replace its degenerate If by Jump.
+ if len(a.Succs) == 2 && a.Succs[0] == c && a.Succs[1] == c {
+ jump := new(Jump)
+ jump.setBlock(a)
+ a.Instrs[len(a.Instrs)-1] = jump
+ a.Succs = a.Succs[:1]
+ c.removePred(b)
+ } else {
+ if j == 0 {
+ c.replacePred(b, a)
+ } else {
+ c.Preds = append(c.Preds, a)
+ }
+ }
+
+ if debugBlockOpt {
+ fmt.Fprintln(os.Stderr, "jumpThreading", a, b, c)
+ }
+ }
+ f.Blocks[b.Index] = nil // delete b
+ return true
+}
+
+// fuseBlocks attempts to apply the block fusion optimization to block
+// a, in which a->b becomes ab if len(a.Succs)==len(b.Preds)==1.
+// The result is true if the optimization was applied.
+//
+func fuseBlocks(f *Function, a *BasicBlock) bool {
+ if len(a.Succs) != 1 {
+ return false
+ }
+ b := a.Succs[0]
+ if len(b.Preds) != 1 {
+ return false
+ }
+
+ // Degenerate &&/|| ops may result in a straight-line CFG
+ // containing φ-nodes. (Ideally we'd replace such them with
+ // their sole operand but that requires Referrers, built later.)
+ if b.hasPhi() {
+ return false // not sound without further effort
+ }
+
+ // Eliminate jump at end of A, then copy all of B across.
+ a.Instrs = append(a.Instrs[:len(a.Instrs)-1], b.Instrs...)
+ for _, instr := range b.Instrs {
+ instr.setBlock(a)
+ }
+
+ // A inherits B's successors
+ a.Succs = append(a.succs2[:0], b.Succs...)
+
+ // Fix up Preds links of all successors of B.
+ for _, c := range b.Succs {
+ c.replacePred(b, a)
+ }
+
+ if debugBlockOpt {
+ fmt.Fprintln(os.Stderr, "fuseBlocks", a, b)
+ }
+
+ f.Blocks[b.Index] = nil // delete b
+ return true
+}
+
+// optimizeBlocks() performs some simple block optimizations on a
+// completed function: dead block elimination, block fusion, jump
+// threading.
+//
+func optimizeBlocks(f *Function) {
+ deleteUnreachableBlocks(f)
+
+ // Loop until no further progress.
+ changed := true
+ for changed {
+ changed = false
+
+ if debugBlockOpt {
+ f.WriteTo(os.Stderr)
+ mustSanityCheck(f, nil)
+ }
+
+ for _, b := range f.Blocks {
+ // f.Blocks will temporarily contain nils to indicate
+ // deleted blocks; we remove them at the end.
+ if b == nil {
+ continue
+ }
+
+ // Fuse blocks. b->c becomes bc.
+ if fuseBlocks(f, b) {
+ changed = true
+ }
+
+ // a->b->c becomes a->c if b contains only a Jump.
+ if jumpThreading(f, b) {
+ changed = true
+ continue // (b was disconnected)
+ }
+ }
+ }
+ f.removeNilBlocks()
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/builder.go b/vendor/golang.org/x/tools/go/ssa/builder.go
new file mode 100644
index 00000000000..fb6638a406b
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/builder.go
@@ -0,0 +1,2379 @@
+// 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 ssa
+
+// This file implements the BUILD phase of SSA construction.
+//
+// SSA construction has two phases, CREATE and BUILD. In the CREATE phase
+// (create.go), all packages are constructed and type-checked and
+// definitions of all package members are created, method-sets are
+// computed, and wrapper methods are synthesized.
+// ssa.Packages are created in arbitrary order.
+//
+// In the BUILD phase (builder.go), the builder traverses the AST of
+// each Go source function and generates SSA instructions for the
+// function body. Initializer expressions for package-level variables
+// are emitted to the package's init() function in the order specified
+// by go/types.Info.InitOrder, then code for each function in the
+// package is generated in lexical order.
+// The BUILD phases for distinct packages are independent and are
+// executed in parallel.
+//
+// TODO(adonovan): indeed, building functions is now embarrassingly parallel.
+// Audit for concurrency then benchmark using more goroutines.
+//
+// The builder's and Program's indices (maps) are populated and
+// mutated during the CREATE phase, but during the BUILD phase they
+// remain constant. The sole exception is Prog.methodSets and its
+// related maps, which are protected by a dedicated mutex.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "os"
+ "sync"
+)
+
+type opaqueType struct {
+ types.Type
+ name string
+}
+
+func (t *opaqueType) String() string { return t.name }
+
+var (
+ varOk = newVar("ok", tBool)
+ varIndex = newVar("index", tInt)
+
+ // Type constants.
+ tBool = types.Typ[types.Bool]
+ tByte = types.Typ[types.Byte]
+ tInt = types.Typ[types.Int]
+ tInvalid = types.Typ[types.Invalid]
+ tString = types.Typ[types.String]
+ tUntypedNil = types.Typ[types.UntypedNil]
+ tRangeIter = &opaqueType{nil, "iter"} // the type of all "range" iterators
+ tEface = types.NewInterface(nil, nil).Complete()
+
+ // SSA Value constants.
+ vZero = intConst(0)
+ vOne = intConst(1)
+ vTrue = NewConst(constant.MakeBool(true), tBool)
+)
+
+// builder holds state associated with the package currently being built.
+// Its methods contain all the logic for AST-to-SSA conversion.
+type builder struct{}
+
+// cond emits to fn code to evaluate boolean condition e and jump
+// to t or f depending on its value, performing various simplifications.
+//
+// Postcondition: fn.currentBlock is nil.
+//
+func (b *builder) cond(fn *Function, e ast.Expr, t, f *BasicBlock) {
+ switch e := e.(type) {
+ case *ast.ParenExpr:
+ b.cond(fn, e.X, t, f)
+ return
+
+ case *ast.BinaryExpr:
+ switch e.Op {
+ case token.LAND:
+ ltrue := fn.newBasicBlock("cond.true")
+ b.cond(fn, e.X, ltrue, f)
+ fn.currentBlock = ltrue
+ b.cond(fn, e.Y, t, f)
+ return
+
+ case token.LOR:
+ lfalse := fn.newBasicBlock("cond.false")
+ b.cond(fn, e.X, t, lfalse)
+ fn.currentBlock = lfalse
+ b.cond(fn, e.Y, t, f)
+ return
+ }
+
+ case *ast.UnaryExpr:
+ if e.Op == token.NOT {
+ b.cond(fn, e.X, f, t)
+ return
+ }
+ }
+
+ // A traditional compiler would simplify "if false" (etc) here
+ // but we do not, for better fidelity to the source code.
+ //
+ // The value of a constant condition may be platform-specific,
+ // and may cause blocks that are reachable in some configuration
+ // to be hidden from subsequent analyses such as bug-finding tools.
+ emitIf(fn, b.expr(fn, e), t, f)
+}
+
+// logicalBinop emits code to fn to evaluate e, a &&- or
+// ||-expression whose reified boolean value is wanted.
+// The value is returned.
+//
+func (b *builder) logicalBinop(fn *Function, e *ast.BinaryExpr) Value {
+ rhs := fn.newBasicBlock("binop.rhs")
+ done := fn.newBasicBlock("binop.done")
+
+ // T(e) = T(e.X) = T(e.Y) after untyped constants have been
+ // eliminated.
+ // TODO(adonovan): not true; MyBool==MyBool yields UntypedBool.
+ t := fn.Pkg.typeOf(e)
+
+ var short Value // value of the short-circuit path
+ switch e.Op {
+ case token.LAND:
+ b.cond(fn, e.X, rhs, done)
+ short = NewConst(constant.MakeBool(false), t)
+
+ case token.LOR:
+ b.cond(fn, e.X, done, rhs)
+ short = NewConst(constant.MakeBool(true), t)
+ }
+
+ // Is rhs unreachable?
+ if rhs.Preds == nil {
+ // Simplify false&&y to false, true||y to true.
+ fn.currentBlock = done
+ return short
+ }
+
+ // Is done unreachable?
+ if done.Preds == nil {
+ // Simplify true&&y (or false||y) to y.
+ fn.currentBlock = rhs
+ return b.expr(fn, e.Y)
+ }
+
+ // All edges from e.X to done carry the short-circuit value.
+ var edges []Value
+ for range done.Preds {
+ edges = append(edges, short)
+ }
+
+ // The edge from e.Y to done carries the value of e.Y.
+ fn.currentBlock = rhs
+ edges = append(edges, b.expr(fn, e.Y))
+ emitJump(fn, done)
+ fn.currentBlock = done
+
+ phi := &Phi{Edges: edges, Comment: e.Op.String()}
+ phi.pos = e.OpPos
+ phi.typ = t
+ return done.emit(phi)
+}
+
+// exprN lowers a multi-result expression e to SSA form, emitting code
+// to fn and returning a single Value whose type is a *types.Tuple.
+// The caller must access the components via Extract.
+//
+// Multi-result expressions include CallExprs in a multi-value
+// assignment or return statement, and "value,ok" uses of
+// TypeAssertExpr, IndexExpr (when X is a map), and UnaryExpr (when Op
+// is token.ARROW).
+//
+func (b *builder) exprN(fn *Function, e ast.Expr) Value {
+ typ := fn.Pkg.typeOf(e).(*types.Tuple)
+ switch e := e.(type) {
+ case *ast.ParenExpr:
+ return b.exprN(fn, e.X)
+
+ case *ast.CallExpr:
+ // Currently, no built-in function nor type conversion
+ // has multiple results, so we can avoid some of the
+ // cases for single-valued CallExpr.
+ var c Call
+ b.setCall(fn, e, &c.Call)
+ c.typ = typ
+ return fn.emit(&c)
+
+ case *ast.IndexExpr:
+ mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
+ lookup := &Lookup{
+ X: b.expr(fn, e.X),
+ Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
+ CommaOk: true,
+ }
+ lookup.setType(typ)
+ lookup.setPos(e.Lbrack)
+ return fn.emit(lookup)
+
+ case *ast.TypeAssertExpr:
+ return emitTypeTest(fn, b.expr(fn, e.X), typ.At(0).Type(), e.Lparen)
+
+ case *ast.UnaryExpr: // must be receive <-
+ unop := &UnOp{
+ Op: token.ARROW,
+ X: b.expr(fn, e.X),
+ CommaOk: true,
+ }
+ unop.setType(typ)
+ unop.setPos(e.OpPos)
+ return fn.emit(unop)
+ }
+ panic(fmt.Sprintf("exprN(%T) in %s", e, fn))
+}
+
+// builtin emits to fn SSA instructions to implement a call to the
+// built-in function obj with the specified arguments
+// and return type. It returns the value defined by the result.
+//
+// The result is nil if no special handling was required; in this case
+// the caller should treat this like an ordinary library function
+// call.
+//
+func (b *builder) builtin(fn *Function, obj *types.Builtin, args []ast.Expr, typ types.Type, pos token.Pos) Value {
+ switch obj.Name() {
+ case "make":
+ switch typ.Underlying().(type) {
+ case *types.Slice:
+ n := b.expr(fn, args[1])
+ m := n
+ if len(args) == 3 {
+ m = b.expr(fn, args[2])
+ }
+ if m, ok := m.(*Const); ok {
+ // treat make([]T, n, m) as new([m]T)[:n]
+ cap := m.Int64()
+ at := types.NewArray(typ.Underlying().(*types.Slice).Elem(), cap)
+ alloc := emitNew(fn, at, pos)
+ alloc.Comment = "makeslice"
+ v := &Slice{
+ X: alloc,
+ High: n,
+ }
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+ }
+ v := &MakeSlice{
+ Len: n,
+ Cap: m,
+ }
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+
+ case *types.Map:
+ var res Value
+ if len(args) == 2 {
+ res = b.expr(fn, args[1])
+ }
+ v := &MakeMap{Reserve: res}
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+
+ case *types.Chan:
+ var sz Value = vZero
+ if len(args) == 2 {
+ sz = b.expr(fn, args[1])
+ }
+ v := &MakeChan{Size: sz}
+ v.setPos(pos)
+ v.setType(typ)
+ return fn.emit(v)
+ }
+
+ case "new":
+ alloc := emitNew(fn, deref(typ), pos)
+ alloc.Comment = "new"
+ return alloc
+
+ case "len", "cap":
+ // Special case: len or cap of an array or *array is
+ // based on the type, not the value which may be nil.
+ // We must still evaluate the value, though. (If it
+ // was side-effect free, the whole call would have
+ // been constant-folded.)
+ t := deref(fn.Pkg.typeOf(args[0])).Underlying()
+ if at, ok := t.(*types.Array); ok {
+ b.expr(fn, args[0]) // for effects only
+ return intConst(at.Len())
+ }
+ // Otherwise treat as normal.
+
+ case "panic":
+ fn.emit(&Panic{
+ X: emitConv(fn, b.expr(fn, args[0]), tEface),
+ pos: pos,
+ })
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+ return vTrue // any non-nil Value will do
+ }
+ return nil // treat all others as a regular function call
+}
+
+// addr lowers a single-result addressable expression e to SSA form,
+// emitting code to fn and returning the location (an lvalue) defined
+// by the expression.
+//
+// If escaping is true, addr marks the base variable of the
+// addressable expression e as being a potentially escaping pointer
+// value. For example, in this code:
+//
+// a := A{
+// b: [1]B{B{c: 1}}
+// }
+// return &a.b[0].c
+//
+// the application of & causes a.b[0].c to have its address taken,
+// which means that ultimately the local variable a must be
+// heap-allocated. This is a simple but very conservative escape
+// analysis.
+//
+// Operations forming potentially escaping pointers include:
+// - &x, including when implicit in method call or composite literals.
+// - a[:] iff a is an array (not *array)
+// - references to variables in lexically enclosing functions.
+//
+func (b *builder) addr(fn *Function, e ast.Expr, escaping bool) lvalue {
+ switch e := e.(type) {
+ case *ast.Ident:
+ if isBlankIdent(e) {
+ return blank{}
+ }
+ obj := fn.Pkg.objectOf(e)
+ v := fn.Prog.packageLevelValue(obj) // var (address)
+ if v == nil {
+ v = fn.lookup(obj, escaping)
+ }
+ return &address{addr: v, pos: e.Pos(), expr: e}
+
+ case *ast.CompositeLit:
+ t := deref(fn.Pkg.typeOf(e))
+ var v *Alloc
+ if escaping {
+ v = emitNew(fn, t, e.Lbrace)
+ } else {
+ v = fn.addLocal(t, e.Lbrace)
+ }
+ v.Comment = "complit"
+ var sb storebuf
+ b.compLit(fn, v, e, true, &sb)
+ sb.emit(fn)
+ return &address{addr: v, pos: e.Lbrace, expr: e}
+
+ case *ast.ParenExpr:
+ return b.addr(fn, e.X, escaping)
+
+ case *ast.SelectorExpr:
+ sel, ok := fn.Pkg.info.Selections[e]
+ if !ok {
+ // qualified identifier
+ return b.addr(fn, e.Sel, escaping)
+ }
+ if sel.Kind() != types.FieldVal {
+ panic(sel)
+ }
+ wantAddr := true
+ v := b.receiver(fn, e.X, wantAddr, escaping, sel)
+ last := len(sel.Index()) - 1
+ return &address{
+ addr: emitFieldSelection(fn, v, sel.Index()[last], true, e.Sel),
+ pos: e.Sel.Pos(),
+ expr: e.Sel,
+ }
+
+ case *ast.IndexExpr:
+ var x Value
+ var et types.Type
+ switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
+ case *types.Array:
+ x = b.addr(fn, e.X, escaping).address(fn)
+ et = types.NewPointer(t.Elem())
+ case *types.Pointer: // *array
+ x = b.expr(fn, e.X)
+ et = types.NewPointer(t.Elem().Underlying().(*types.Array).Elem())
+ case *types.Slice:
+ x = b.expr(fn, e.X)
+ et = types.NewPointer(t.Elem())
+ case *types.Map:
+ return &element{
+ m: b.expr(fn, e.X),
+ k: emitConv(fn, b.expr(fn, e.Index), t.Key()),
+ t: t.Elem(),
+ pos: e.Lbrack,
+ }
+ default:
+ panic("unexpected container type in IndexExpr: " + t.String())
+ }
+ v := &IndexAddr{
+ X: x,
+ Index: emitConv(fn, b.expr(fn, e.Index), tInt),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(et)
+ return &address{addr: fn.emit(v), pos: e.Lbrack, expr: e}
+
+ case *ast.StarExpr:
+ return &address{addr: b.expr(fn, e.X), pos: e.Star, expr: e}
+ }
+
+ panic(fmt.Sprintf("unexpected address expression: %T", e))
+}
+
+type store struct {
+ lhs lvalue
+ rhs Value
+}
+
+type storebuf struct{ stores []store }
+
+func (sb *storebuf) store(lhs lvalue, rhs Value) {
+ sb.stores = append(sb.stores, store{lhs, rhs})
+}
+
+func (sb *storebuf) emit(fn *Function) {
+ for _, s := range sb.stores {
+ s.lhs.store(fn, s.rhs)
+ }
+}
+
+// assign emits to fn code to initialize the lvalue loc with the value
+// of expression e. If isZero is true, assign assumes that loc holds
+// the zero value for its type.
+//
+// This is equivalent to loc.store(fn, b.expr(fn, e)), but may generate
+// better code in some cases, e.g., for composite literals in an
+// addressable location.
+//
+// If sb is not nil, assign generates code to evaluate expression e, but
+// not to update loc. Instead, the necessary stores are appended to the
+// storebuf sb so that they can be executed later. This allows correct
+// in-place update of existing variables when the RHS is a composite
+// literal that may reference parts of the LHS.
+//
+func (b *builder) assign(fn *Function, loc lvalue, e ast.Expr, isZero bool, sb *storebuf) {
+ // Can we initialize it in place?
+ if e, ok := unparen(e).(*ast.CompositeLit); ok {
+ // A CompositeLit never evaluates to a pointer,
+ // so if the type of the location is a pointer,
+ // an &-operation is implied.
+ if _, ok := loc.(blank); !ok { // avoid calling blank.typ()
+ if isPointer(loc.typ()) {
+ ptr := b.addr(fn, e, true).address(fn)
+ // copy address
+ if sb != nil {
+ sb.store(loc, ptr)
+ } else {
+ loc.store(fn, ptr)
+ }
+ return
+ }
+ }
+
+ if _, ok := loc.(*address); ok {
+ if isInterface(loc.typ()) {
+ // e.g. var x interface{} = T{...}
+ // Can't in-place initialize an interface value.
+ // Fall back to copying.
+ } else {
+ // x = T{...} or x := T{...}
+ addr := loc.address(fn)
+ if sb != nil {
+ b.compLit(fn, addr, e, isZero, sb)
+ } else {
+ var sb storebuf
+ b.compLit(fn, addr, e, isZero, &sb)
+ sb.emit(fn)
+ }
+
+ // Subtle: emit debug ref for aggregate types only;
+ // slice and map are handled by store ops in compLit.
+ switch loc.typ().Underlying().(type) {
+ case *types.Struct, *types.Array:
+ emitDebugRef(fn, e, addr, true)
+ }
+
+ return
+ }
+ }
+ }
+
+ // simple case: just copy
+ rhs := b.expr(fn, e)
+ if sb != nil {
+ sb.store(loc, rhs)
+ } else {
+ loc.store(fn, rhs)
+ }
+}
+
+// expr lowers a single-result expression e to SSA form, emitting code
+// to fn and returning the Value defined by the expression.
+//
+func (b *builder) expr(fn *Function, e ast.Expr) Value {
+ e = unparen(e)
+
+ tv := fn.Pkg.info.Types[e]
+
+ // Is expression a constant?
+ if tv.Value != nil {
+ return NewConst(tv.Value, tv.Type)
+ }
+
+ var v Value
+ if tv.Addressable() {
+ // Prefer pointer arithmetic ({Index,Field}Addr) followed
+ // by Load over subelement extraction (e.g. Index, Field),
+ // to avoid large copies.
+ v = b.addr(fn, e, false).load(fn)
+ } else {
+ v = b.expr0(fn, e, tv)
+ }
+ if fn.debugInfo() {
+ emitDebugRef(fn, e, v, false)
+ }
+ return v
+}
+
+func (b *builder) expr0(fn *Function, e ast.Expr, tv types.TypeAndValue) Value {
+ switch e := e.(type) {
+ case *ast.BasicLit:
+ panic("non-constant BasicLit") // unreachable
+
+ case *ast.FuncLit:
+ fn2 := &Function{
+ name: fmt.Sprintf("%s$%d", fn.Name(), 1+len(fn.AnonFuncs)),
+ Signature: fn.Pkg.typeOf(e.Type).Underlying().(*types.Signature),
+ pos: e.Type.Func,
+ parent: fn,
+ Pkg: fn.Pkg,
+ Prog: fn.Prog,
+ syntax: e,
+ }
+ fn.AnonFuncs = append(fn.AnonFuncs, fn2)
+ b.buildFunction(fn2)
+ if fn2.FreeVars == nil {
+ return fn2
+ }
+ v := &MakeClosure{Fn: fn2}
+ v.setType(tv.Type)
+ for _, fv := range fn2.FreeVars {
+ v.Bindings = append(v.Bindings, fv.outer)
+ fv.outer = nil
+ }
+ return fn.emit(v)
+
+ case *ast.TypeAssertExpr: // single-result form only
+ return emitTypeAssert(fn, b.expr(fn, e.X), tv.Type, e.Lparen)
+
+ case *ast.CallExpr:
+ if fn.Pkg.info.Types[e.Fun].IsType() {
+ // Explicit type conversion, e.g. string(x) or big.Int(x)
+ x := b.expr(fn, e.Args[0])
+ y := emitConv(fn, x, tv.Type)
+ if y != x {
+ switch y := y.(type) {
+ case *Convert:
+ y.pos = e.Lparen
+ case *ChangeType:
+ y.pos = e.Lparen
+ case *MakeInterface:
+ y.pos = e.Lparen
+ }
+ }
+ return y
+ }
+ // Call to "intrinsic" built-ins, e.g. new, make, panic.
+ if id, ok := unparen(e.Fun).(*ast.Ident); ok {
+ if obj, ok := fn.Pkg.info.Uses[id].(*types.Builtin); ok {
+ if v := b.builtin(fn, obj, e.Args, tv.Type, e.Lparen); v != nil {
+ return v
+ }
+ }
+ }
+ // Regular function call.
+ var v Call
+ b.setCall(fn, e, &v.Call)
+ v.setType(tv.Type)
+ return fn.emit(&v)
+
+ case *ast.UnaryExpr:
+ switch e.Op {
+ case token.AND: // &X --- potentially escaping.
+ addr := b.addr(fn, e.X, true)
+ if _, ok := unparen(e.X).(*ast.StarExpr); ok {
+ // &*p must panic if p is nil (http://golang.org/s/go12nil).
+ // For simplicity, we'll just (suboptimally) rely
+ // on the side effects of a load.
+ // TODO(adonovan): emit dedicated nilcheck.
+ addr.load(fn)
+ }
+ return addr.address(fn)
+ case token.ADD:
+ return b.expr(fn, e.X)
+ case token.NOT, token.ARROW, token.SUB, token.XOR: // ! <- - ^
+ v := &UnOp{
+ Op: e.Op,
+ X: b.expr(fn, e.X),
+ }
+ v.setPos(e.OpPos)
+ v.setType(tv.Type)
+ return fn.emit(v)
+ default:
+ panic(e.Op)
+ }
+
+ case *ast.BinaryExpr:
+ switch e.Op {
+ case token.LAND, token.LOR:
+ return b.logicalBinop(fn, e)
+ case token.SHL, token.SHR:
+ fallthrough
+ case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
+ return emitArith(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), tv.Type, e.OpPos)
+
+ case token.EQL, token.NEQ, token.GTR, token.LSS, token.LEQ, token.GEQ:
+ cmp := emitCompare(fn, e.Op, b.expr(fn, e.X), b.expr(fn, e.Y), e.OpPos)
+ // The type of x==y may be UntypedBool.
+ return emitConv(fn, cmp, DefaultType(tv.Type))
+ default:
+ panic("illegal op in BinaryExpr: " + e.Op.String())
+ }
+
+ case *ast.SliceExpr:
+ var low, high, max Value
+ var x Value
+ switch fn.Pkg.typeOf(e.X).Underlying().(type) {
+ case *types.Array:
+ // Potentially escaping.
+ x = b.addr(fn, e.X, true).address(fn)
+ case *types.Basic, *types.Slice, *types.Pointer: // *array
+ x = b.expr(fn, e.X)
+ default:
+ panic("unreachable")
+ }
+ if e.High != nil {
+ high = b.expr(fn, e.High)
+ }
+ if e.Low != nil {
+ low = b.expr(fn, e.Low)
+ }
+ if e.Slice3 {
+ max = b.expr(fn, e.Max)
+ }
+ v := &Slice{
+ X: x,
+ Low: low,
+ High: high,
+ Max: max,
+ }
+ v.setPos(e.Lbrack)
+ v.setType(tv.Type)
+ return fn.emit(v)
+
+ case *ast.Ident:
+ obj := fn.Pkg.info.Uses[e]
+ // Universal built-in or nil?
+ switch obj := obj.(type) {
+ case *types.Builtin:
+ return &Builtin{name: obj.Name(), sig: tv.Type.(*types.Signature)}
+ case *types.Nil:
+ return nilConst(tv.Type)
+ }
+ // Package-level func or var?
+ if v := fn.Prog.packageLevelValue(obj); v != nil {
+ if _, ok := obj.(*types.Var); ok {
+ return emitLoad(fn, v) // var (address)
+ }
+ return v // (func)
+ }
+ // Local var.
+ return emitLoad(fn, fn.lookup(obj, false)) // var (address)
+
+ case *ast.SelectorExpr:
+ sel, ok := fn.Pkg.info.Selections[e]
+ if !ok {
+ // qualified identifier
+ return b.expr(fn, e.Sel)
+ }
+ switch sel.Kind() {
+ case types.MethodExpr:
+ // (*T).f or T.f, the method f from the method-set of type T.
+ // The result is a "thunk".
+ return emitConv(fn, makeThunk(fn.Prog, sel), tv.Type)
+
+ case types.MethodVal:
+ // e.f where e is an expression and f is a method.
+ // The result is a "bound".
+ obj := sel.Obj().(*types.Func)
+ rt := recvType(obj)
+ wantAddr := isPointer(rt)
+ escaping := true
+ v := b.receiver(fn, e.X, wantAddr, escaping, sel)
+ if isInterface(rt) {
+ // If v has interface type I,
+ // we must emit a check that v is non-nil.
+ // We use: typeassert v.(I).
+ emitTypeAssert(fn, v, rt, token.NoPos)
+ }
+ c := &MakeClosure{
+ Fn: makeBound(fn.Prog, obj),
+ Bindings: []Value{v},
+ }
+ c.setPos(e.Sel.Pos())
+ c.setType(tv.Type)
+ return fn.emit(c)
+
+ case types.FieldVal:
+ indices := sel.Index()
+ last := len(indices) - 1
+ v := b.expr(fn, e.X)
+ v = emitImplicitSelections(fn, v, indices[:last])
+ v = emitFieldSelection(fn, v, indices[last], false, e.Sel)
+ return v
+ }
+
+ panic("unexpected expression-relative selector")
+
+ case *ast.IndexExpr:
+ switch t := fn.Pkg.typeOf(e.X).Underlying().(type) {
+ case *types.Array:
+ // Non-addressable array (in a register).
+ v := &Index{
+ X: b.expr(fn, e.X),
+ Index: emitConv(fn, b.expr(fn, e.Index), tInt),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(t.Elem())
+ return fn.emit(v)
+
+ case *types.Map:
+ // Maps are not addressable.
+ mapt := fn.Pkg.typeOf(e.X).Underlying().(*types.Map)
+ v := &Lookup{
+ X: b.expr(fn, e.X),
+ Index: emitConv(fn, b.expr(fn, e.Index), mapt.Key()),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(mapt.Elem())
+ return fn.emit(v)
+
+ case *types.Basic: // => string
+ // Strings are not addressable.
+ v := &Lookup{
+ X: b.expr(fn, e.X),
+ Index: b.expr(fn, e.Index),
+ }
+ v.setPos(e.Lbrack)
+ v.setType(tByte)
+ return fn.emit(v)
+
+ case *types.Slice, *types.Pointer: // *array
+ // Addressable slice/array; use IndexAddr and Load.
+ return b.addr(fn, e, false).load(fn)
+
+ default:
+ panic("unexpected container type in IndexExpr: " + t.String())
+ }
+
+ case *ast.CompositeLit, *ast.StarExpr:
+ // Addressable types (lvalues)
+ return b.addr(fn, e, false).load(fn)
+ }
+
+ panic(fmt.Sprintf("unexpected expr: %T", e))
+}
+
+// stmtList emits to fn code for all statements in list.
+func (b *builder) stmtList(fn *Function, list []ast.Stmt) {
+ for _, s := range list {
+ b.stmt(fn, s)
+ }
+}
+
+// receiver emits to fn code for expression e in the "receiver"
+// position of selection e.f (where f may be a field or a method) and
+// returns the effective receiver after applying the implicit field
+// selections of sel.
+//
+// wantAddr requests that the result is an an address. If
+// !sel.Indirect(), this may require that e be built in addr() mode; it
+// must thus be addressable.
+//
+// escaping is defined as per builder.addr().
+//
+func (b *builder) receiver(fn *Function, e ast.Expr, wantAddr, escaping bool, sel *types.Selection) Value {
+ var v Value
+ if wantAddr && !sel.Indirect() && !isPointer(fn.Pkg.typeOf(e)) {
+ v = b.addr(fn, e, escaping).address(fn)
+ } else {
+ v = b.expr(fn, e)
+ }
+
+ last := len(sel.Index()) - 1
+ v = emitImplicitSelections(fn, v, sel.Index()[:last])
+ if !wantAddr && isPointer(v.Type()) {
+ v = emitLoad(fn, v)
+ }
+ return v
+}
+
+// setCallFunc populates the function parts of a CallCommon structure
+// (Func, Method, Recv, Args[0]) based on the kind of invocation
+// occurring in e.
+//
+func (b *builder) setCallFunc(fn *Function, e *ast.CallExpr, c *CallCommon) {
+ c.pos = e.Lparen
+
+ // Is this a method call?
+ if selector, ok := unparen(e.Fun).(*ast.SelectorExpr); ok {
+ sel, ok := fn.Pkg.info.Selections[selector]
+ if ok && sel.Kind() == types.MethodVal {
+ obj := sel.Obj().(*types.Func)
+ recv := recvType(obj)
+ wantAddr := isPointer(recv)
+ escaping := true
+ v := b.receiver(fn, selector.X, wantAddr, escaping, sel)
+ if isInterface(recv) {
+ // Invoke-mode call.
+ c.Value = v
+ c.Method = obj
+ } else {
+ // "Call"-mode call.
+ c.Value = fn.Prog.declaredFunc(obj)
+ c.Args = append(c.Args, v)
+ }
+ return
+ }
+
+ // sel.Kind()==MethodExpr indicates T.f() or (*T).f():
+ // a statically dispatched call to the method f in the
+ // method-set of T or *T. T may be an interface.
+ //
+ // e.Fun would evaluate to a concrete method, interface
+ // wrapper function, or promotion wrapper.
+ //
+ // For now, we evaluate it in the usual way.
+ //
+ // TODO(adonovan): opt: inline expr() here, to make the
+ // call static and to avoid generation of wrappers.
+ // It's somewhat tricky as it may consume the first
+ // actual parameter if the call is "invoke" mode.
+ //
+ // Examples:
+ // type T struct{}; func (T) f() {} // "call" mode
+ // type T interface { f() } // "invoke" mode
+ //
+ // type S struct{ T }
+ //
+ // var s S
+ // S.f(s)
+ // (*S).f(&s)
+ //
+ // Suggested approach:
+ // - consume the first actual parameter expression
+ // and build it with b.expr().
+ // - apply implicit field selections.
+ // - use MethodVal logic to populate fields of c.
+ }
+
+ // Evaluate the function operand in the usual way.
+ c.Value = b.expr(fn, e.Fun)
+}
+
+// emitCallArgs emits to f code for the actual parameters of call e to
+// a (possibly built-in) function of effective type sig.
+// The argument values are appended to args, which is then returned.
+//
+func (b *builder) emitCallArgs(fn *Function, sig *types.Signature, e *ast.CallExpr, args []Value) []Value {
+ // f(x, y, z...): pass slice z straight through.
+ if e.Ellipsis != 0 {
+ for i, arg := range e.Args {
+ v := emitConv(fn, b.expr(fn, arg), sig.Params().At(i).Type())
+ args = append(args, v)
+ }
+ return args
+ }
+
+ offset := len(args) // 1 if call has receiver, 0 otherwise
+
+ // Evaluate actual parameter expressions.
+ //
+ // If this is a chained call of the form f(g()) where g has
+ // multiple return values (MRV), they are flattened out into
+ // args; a suffix of them may end up in a varargs slice.
+ for _, arg := range e.Args {
+ v := b.expr(fn, arg)
+ if ttuple, ok := v.Type().(*types.Tuple); ok { // MRV chain
+ for i, n := 0, ttuple.Len(); i < n; i++ {
+ args = append(args, emitExtract(fn, v, i))
+ }
+ } else {
+ args = append(args, v)
+ }
+ }
+
+ // Actual->formal assignability conversions for normal parameters.
+ np := sig.Params().Len() // number of normal parameters
+ if sig.Variadic() {
+ np--
+ }
+ for i := 0; i < np; i++ {
+ args[offset+i] = emitConv(fn, args[offset+i], sig.Params().At(i).Type())
+ }
+
+ // Actual->formal assignability conversions for variadic parameter,
+ // and construction of slice.
+ if sig.Variadic() {
+ varargs := args[offset+np:]
+ st := sig.Params().At(np).Type().(*types.Slice)
+ vt := st.Elem()
+ if len(varargs) == 0 {
+ args = append(args, nilConst(st))
+ } else {
+ // Replace a suffix of args with a slice containing it.
+ at := types.NewArray(vt, int64(len(varargs)))
+ a := emitNew(fn, at, token.NoPos)
+ a.setPos(e.Rparen)
+ a.Comment = "varargs"
+ for i, arg := range varargs {
+ iaddr := &IndexAddr{
+ X: a,
+ Index: intConst(int64(i)),
+ }
+ iaddr.setType(types.NewPointer(vt))
+ fn.emit(iaddr)
+ emitStore(fn, iaddr, arg, arg.Pos())
+ }
+ s := &Slice{X: a}
+ s.setType(st)
+ args[offset+np] = fn.emit(s)
+ args = args[:offset+np+1]
+ }
+ }
+ return args
+}
+
+// setCall emits to fn code to evaluate all the parameters of a function
+// call e, and populates *c with those values.
+//
+func (b *builder) setCall(fn *Function, e *ast.CallExpr, c *CallCommon) {
+ // First deal with the f(...) part and optional receiver.
+ b.setCallFunc(fn, e, c)
+
+ // Then append the other actual parameters.
+ sig, _ := fn.Pkg.typeOf(e.Fun).Underlying().(*types.Signature)
+ if sig == nil {
+ panic(fmt.Sprintf("no signature for call of %s", e.Fun))
+ }
+ c.Args = b.emitCallArgs(fn, sig, e, c.Args)
+}
+
+// assignOp emits to fn code to perform loc = val.
+func (b *builder) assignOp(fn *Function, loc lvalue, val Value, op token.Token, pos token.Pos) {
+ oldv := loc.load(fn)
+ loc.store(fn, emitArith(fn, op, oldv, emitConv(fn, val, oldv.Type()), loc.typ(), pos))
+}
+
+// localValueSpec emits to fn code to define all of the vars in the
+// function-local ValueSpec, spec.
+//
+func (b *builder) localValueSpec(fn *Function, spec *ast.ValueSpec) {
+ switch {
+ case len(spec.Values) == len(spec.Names):
+ // e.g. var x, y = 0, 1
+ // 1:1 assignment
+ for i, id := range spec.Names {
+ if !isBlankIdent(id) {
+ fn.addLocalForIdent(id)
+ }
+ lval := b.addr(fn, id, false) // non-escaping
+ b.assign(fn, lval, spec.Values[i], true, nil)
+ }
+
+ case len(spec.Values) == 0:
+ // e.g. var x, y int
+ // Locals are implicitly zero-initialized.
+ for _, id := range spec.Names {
+ if !isBlankIdent(id) {
+ lhs := fn.addLocalForIdent(id)
+ if fn.debugInfo() {
+ emitDebugRef(fn, id, lhs, true)
+ }
+ }
+ }
+
+ default:
+ // e.g. var x, y = pos()
+ tuple := b.exprN(fn, spec.Values[0])
+ for i, id := range spec.Names {
+ if !isBlankIdent(id) {
+ fn.addLocalForIdent(id)
+ lhs := b.addr(fn, id, false) // non-escaping
+ lhs.store(fn, emitExtract(fn, tuple, i))
+ }
+ }
+ }
+}
+
+// assignStmt emits code to fn for a parallel assignment of rhss to lhss.
+// isDef is true if this is a short variable declaration (:=).
+//
+// Note the similarity with localValueSpec.
+//
+func (b *builder) assignStmt(fn *Function, lhss, rhss []ast.Expr, isDef bool) {
+ // Side effects of all LHSs and RHSs must occur in left-to-right order.
+ lvals := make([]lvalue, len(lhss))
+ isZero := make([]bool, len(lhss))
+ for i, lhs := range lhss {
+ var lval lvalue = blank{}
+ if !isBlankIdent(lhs) {
+ if isDef {
+ if obj := fn.Pkg.info.Defs[lhs.(*ast.Ident)]; obj != nil {
+ fn.addNamedLocal(obj)
+ isZero[i] = true
+ }
+ }
+ lval = b.addr(fn, lhs, false) // non-escaping
+ }
+ lvals[i] = lval
+ }
+ if len(lhss) == len(rhss) {
+ // Simple assignment: x = f() (!isDef)
+ // Parallel assignment: x, y = f(), g() (!isDef)
+ // or short var decl: x, y := f(), g() (isDef)
+ //
+ // In all cases, the RHSs may refer to the LHSs,
+ // so we need a storebuf.
+ var sb storebuf
+ for i := range rhss {
+ b.assign(fn, lvals[i], rhss[i], isZero[i], &sb)
+ }
+ sb.emit(fn)
+ } else {
+ // e.g. x, y = pos()
+ tuple := b.exprN(fn, rhss[0])
+ emitDebugRef(fn, rhss[0], tuple, false)
+ for i, lval := range lvals {
+ lval.store(fn, emitExtract(fn, tuple, i))
+ }
+ }
+}
+
+// arrayLen returns the length of the array whose composite literal elements are elts.
+func (b *builder) arrayLen(fn *Function, elts []ast.Expr) int64 {
+ var max int64 = -1
+ var i int64 = -1
+ for _, e := range elts {
+ if kv, ok := e.(*ast.KeyValueExpr); ok {
+ i = b.expr(fn, kv.Key).(*Const).Int64()
+ } else {
+ i++
+ }
+ if i > max {
+ max = i
+ }
+ }
+ return max + 1
+}
+
+// compLit emits to fn code to initialize a composite literal e at
+// address addr with type typ.
+//
+// Nested composite literals are recursively initialized in place
+// where possible. If isZero is true, compLit assumes that addr
+// holds the zero value for typ.
+//
+// Because the elements of a composite literal may refer to the
+// variables being updated, as in the second line below,
+// x := T{a: 1}
+// x = T{a: x.a}
+// all the reads must occur before all the writes. Thus all stores to
+// loc are emitted to the storebuf sb for later execution.
+//
+// A CompositeLit may have pointer type only in the recursive (nested)
+// case when the type name is implicit. e.g. in []*T{{}}, the inner
+// literal has type *T behaves like &T{}.
+// In that case, addr must hold a T, not a *T.
+//
+func (b *builder) compLit(fn *Function, addr Value, e *ast.CompositeLit, isZero bool, sb *storebuf) {
+ typ := deref(fn.Pkg.typeOf(e))
+ switch t := typ.Underlying().(type) {
+ case *types.Struct:
+ if !isZero && len(e.Elts) != t.NumFields() {
+ // memclear
+ sb.store(&address{addr, e.Lbrace, nil},
+ zeroValue(fn, deref(addr.Type())))
+ isZero = true
+ }
+ for i, e := range e.Elts {
+ fieldIndex := i
+ pos := e.Pos()
+ if kv, ok := e.(*ast.KeyValueExpr); ok {
+ fname := kv.Key.(*ast.Ident).Name
+ for i, n := 0, t.NumFields(); i < n; i++ {
+ sf := t.Field(i)
+ if sf.Name() == fname {
+ fieldIndex = i
+ pos = kv.Colon
+ e = kv.Value
+ break
+ }
+ }
+ }
+ sf := t.Field(fieldIndex)
+ faddr := &FieldAddr{
+ X: addr,
+ Field: fieldIndex,
+ }
+ faddr.setType(types.NewPointer(sf.Type()))
+ fn.emit(faddr)
+ b.assign(fn, &address{addr: faddr, pos: pos, expr: e}, e, isZero, sb)
+ }
+
+ case *types.Array, *types.Slice:
+ var at *types.Array
+ var array Value
+ switch t := t.(type) {
+ case *types.Slice:
+ at = types.NewArray(t.Elem(), b.arrayLen(fn, e.Elts))
+ alloc := emitNew(fn, at, e.Lbrace)
+ alloc.Comment = "slicelit"
+ array = alloc
+ case *types.Array:
+ at = t
+ array = addr
+
+ if !isZero && int64(len(e.Elts)) != at.Len() {
+ // memclear
+ sb.store(&address{array, e.Lbrace, nil},
+ zeroValue(fn, deref(array.Type())))
+ }
+ }
+
+ var idx *Const
+ for _, e := range e.Elts {
+ pos := e.Pos()
+ if kv, ok := e.(*ast.KeyValueExpr); ok {
+ idx = b.expr(fn, kv.Key).(*Const)
+ pos = kv.Colon
+ e = kv.Value
+ } else {
+ var idxval int64
+ if idx != nil {
+ idxval = idx.Int64() + 1
+ }
+ idx = intConst(idxval)
+ }
+ iaddr := &IndexAddr{
+ X: array,
+ Index: idx,
+ }
+ iaddr.setType(types.NewPointer(at.Elem()))
+ fn.emit(iaddr)
+ if t != at { // slice
+ // backing array is unaliased => storebuf not needed.
+ b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, nil)
+ } else {
+ b.assign(fn, &address{addr: iaddr, pos: pos, expr: e}, e, true, sb)
+ }
+ }
+
+ if t != at { // slice
+ s := &Slice{X: array}
+ s.setPos(e.Lbrace)
+ s.setType(typ)
+ sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, fn.emit(s))
+ }
+
+ case *types.Map:
+ m := &MakeMap{Reserve: intConst(int64(len(e.Elts)))}
+ m.setPos(e.Lbrace)
+ m.setType(typ)
+ fn.emit(m)
+ for _, e := range e.Elts {
+ e := e.(*ast.KeyValueExpr)
+
+ // If a key expression in a map literal is itself a
+ // composite literal, the type may be omitted.
+ // For example:
+ // map[*struct{}]bool{{}: true}
+ // An &-operation may be implied:
+ // map[*struct{}]bool{&struct{}{}: true}
+ var key Value
+ if _, ok := unparen(e.Key).(*ast.CompositeLit); ok && isPointer(t.Key()) {
+ // A CompositeLit never evaluates to a pointer,
+ // so if the type of the location is a pointer,
+ // an &-operation is implied.
+ key = b.addr(fn, e.Key, true).address(fn)
+ } else {
+ key = b.expr(fn, e.Key)
+ }
+
+ loc := element{
+ m: m,
+ k: emitConv(fn, key, t.Key()),
+ t: t.Elem(),
+ pos: e.Colon,
+ }
+
+ // We call assign() only because it takes care
+ // of any &-operation required in the recursive
+ // case, e.g.,
+ // map[int]*struct{}{0: {}} implies &struct{}{}.
+ // In-place update is of course impossible,
+ // and no storebuf is needed.
+ b.assign(fn, &loc, e.Value, true, nil)
+ }
+ sb.store(&address{addr: addr, pos: e.Lbrace, expr: e}, m)
+
+ default:
+ panic("unexpected CompositeLit type: " + t.String())
+ }
+}
+
+// switchStmt emits to fn code for the switch statement s, optionally
+// labelled by label.
+//
+func (b *builder) switchStmt(fn *Function, s *ast.SwitchStmt, label *lblock) {
+ // We treat SwitchStmt like a sequential if-else chain.
+ // Multiway dispatch can be recovered later by ssautil.Switches()
+ // to those cases that are free of side effects.
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+ var tag Value = vTrue
+ if s.Tag != nil {
+ tag = b.expr(fn, s.Tag)
+ }
+ done := fn.newBasicBlock("switch.done")
+ if label != nil {
+ label._break = done
+ }
+ // We pull the default case (if present) down to the end.
+ // But each fallthrough label must point to the next
+ // body block in source order, so we preallocate a
+ // body block (fallthru) for the next case.
+ // Unfortunately this makes for a confusing block order.
+ var dfltBody *[]ast.Stmt
+ var dfltFallthrough *BasicBlock
+ var fallthru, dfltBlock *BasicBlock
+ ncases := len(s.Body.List)
+ for i, clause := range s.Body.List {
+ body := fallthru
+ if body == nil {
+ body = fn.newBasicBlock("switch.body") // first case only
+ }
+
+ // Preallocate body block for the next case.
+ fallthru = done
+ if i+1 < ncases {
+ fallthru = fn.newBasicBlock("switch.body")
+ }
+
+ cc := clause.(*ast.CaseClause)
+ if cc.List == nil {
+ // Default case.
+ dfltBody = &cc.Body
+ dfltFallthrough = fallthru
+ dfltBlock = body
+ continue
+ }
+
+ var nextCond *BasicBlock
+ for _, cond := range cc.List {
+ nextCond = fn.newBasicBlock("switch.next")
+ // TODO(adonovan): opt: when tag==vTrue, we'd
+ // get better code if we use b.cond(cond)
+ // instead of BinOp(EQL, tag, b.expr(cond))
+ // followed by If. Don't forget conversions
+ // though.
+ cond := emitCompare(fn, token.EQL, tag, b.expr(fn, cond), token.NoPos)
+ emitIf(fn, cond, body, nextCond)
+ fn.currentBlock = nextCond
+ }
+ fn.currentBlock = body
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _fallthrough: fallthru,
+ }
+ b.stmtList(fn, cc.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+ fn.currentBlock = nextCond
+ }
+ if dfltBlock != nil {
+ emitJump(fn, dfltBlock)
+ fn.currentBlock = dfltBlock
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _fallthrough: dfltFallthrough,
+ }
+ b.stmtList(fn, *dfltBody)
+ fn.targets = fn.targets.tail
+ }
+ emitJump(fn, done)
+ fn.currentBlock = done
+}
+
+// typeSwitchStmt emits to fn code for the type switch statement s, optionally
+// labelled by label.
+//
+func (b *builder) typeSwitchStmt(fn *Function, s *ast.TypeSwitchStmt, label *lblock) {
+ // We treat TypeSwitchStmt like a sequential if-else chain.
+ // Multiway dispatch can be recovered later by ssautil.Switches().
+
+ // Typeswitch lowering:
+ //
+ // var x X
+ // switch y := x.(type) {
+ // case T1, T2: S1 // >1 (y := x)
+ // case nil: SN // nil (y := x)
+ // default: SD // 0 types (y := x)
+ // case T3: S3 // 1 type (y := x.(T3))
+ // }
+ //
+ // ...s.Init...
+ // x := eval x
+ // .caseT1:
+ // t1, ok1 := typeswitch,ok x
+ // if ok1 then goto S1 else goto .caseT2
+ // .caseT2:
+ // t2, ok2 := typeswitch,ok x
+ // if ok2 then goto S1 else goto .caseNil
+ // .S1:
+ // y := x
+ // ...S1...
+ // goto done
+ // .caseNil:
+ // if t2, ok2 := typeswitch,ok x
+ // if x == nil then goto SN else goto .caseT3
+ // .SN:
+ // y := x
+ // ...SN...
+ // goto done
+ // .caseT3:
+ // t3, ok3 := typeswitch,ok x
+ // if ok3 then goto S3 else goto default
+ // .S3:
+ // y := t3
+ // ...S3...
+ // goto done
+ // .default:
+ // y := x
+ // ...SD...
+ // goto done
+ // .done:
+
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+
+ var x Value
+ switch ass := s.Assign.(type) {
+ case *ast.ExprStmt: // x.(type)
+ x = b.expr(fn, unparen(ass.X).(*ast.TypeAssertExpr).X)
+ case *ast.AssignStmt: // y := x.(type)
+ x = b.expr(fn, unparen(ass.Rhs[0]).(*ast.TypeAssertExpr).X)
+ }
+
+ done := fn.newBasicBlock("typeswitch.done")
+ if label != nil {
+ label._break = done
+ }
+ var default_ *ast.CaseClause
+ for _, clause := range s.Body.List {
+ cc := clause.(*ast.CaseClause)
+ if cc.List == nil {
+ default_ = cc
+ continue
+ }
+ body := fn.newBasicBlock("typeswitch.body")
+ var next *BasicBlock
+ var casetype types.Type
+ var ti Value // ti, ok := typeassert,ok x
+ for _, cond := range cc.List {
+ next = fn.newBasicBlock("typeswitch.next")
+ casetype = fn.Pkg.typeOf(cond)
+ var condv Value
+ if casetype == tUntypedNil {
+ condv = emitCompare(fn, token.EQL, x, nilConst(x.Type()), token.NoPos)
+ ti = x
+ } else {
+ yok := emitTypeTest(fn, x, casetype, cc.Case)
+ ti = emitExtract(fn, yok, 0)
+ condv = emitExtract(fn, yok, 1)
+ }
+ emitIf(fn, condv, body, next)
+ fn.currentBlock = next
+ }
+ if len(cc.List) != 1 {
+ ti = x
+ }
+ fn.currentBlock = body
+ b.typeCaseBody(fn, cc, ti, done)
+ fn.currentBlock = next
+ }
+ if default_ != nil {
+ b.typeCaseBody(fn, default_, x, done)
+ } else {
+ emitJump(fn, done)
+ }
+ fn.currentBlock = done
+}
+
+func (b *builder) typeCaseBody(fn *Function, cc *ast.CaseClause, x Value, done *BasicBlock) {
+ if obj := fn.Pkg.info.Implicits[cc]; obj != nil {
+ // In a switch y := x.(type), each case clause
+ // implicitly declares a distinct object y.
+ // In a single-type case, y has that type.
+ // In multi-type cases, 'case nil' and default,
+ // y has the same type as the interface operand.
+ emitStore(fn, fn.addNamedLocal(obj), x, obj.Pos())
+ }
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ b.stmtList(fn, cc.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+}
+
+// selectStmt emits to fn code for the select statement s, optionally
+// labelled by label.
+//
+func (b *builder) selectStmt(fn *Function, s *ast.SelectStmt, label *lblock) {
+ // A blocking select of a single case degenerates to a
+ // simple send or receive.
+ // TODO(adonovan): opt: is this optimization worth its weight?
+ if len(s.Body.List) == 1 {
+ clause := s.Body.List[0].(*ast.CommClause)
+ if clause.Comm != nil {
+ b.stmt(fn, clause.Comm)
+ done := fn.newBasicBlock("select.done")
+ if label != nil {
+ label._break = done
+ }
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ b.stmtList(fn, clause.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+ fn.currentBlock = done
+ return
+ }
+ }
+
+ // First evaluate all channels in all cases, and find
+ // the directions of each state.
+ var states []*SelectState
+ blocking := true
+ debugInfo := fn.debugInfo()
+ for _, clause := range s.Body.List {
+ var st *SelectState
+ switch comm := clause.(*ast.CommClause).Comm.(type) {
+ case nil: // default case
+ blocking = false
+ continue
+
+ case *ast.SendStmt: // ch<- i
+ ch := b.expr(fn, comm.Chan)
+ st = &SelectState{
+ Dir: types.SendOnly,
+ Chan: ch,
+ Send: emitConv(fn, b.expr(fn, comm.Value),
+ ch.Type().Underlying().(*types.Chan).Elem()),
+ Pos: comm.Arrow,
+ }
+ if debugInfo {
+ st.DebugNode = comm
+ }
+
+ case *ast.AssignStmt: // x := <-ch
+ recv := unparen(comm.Rhs[0]).(*ast.UnaryExpr)
+ st = &SelectState{
+ Dir: types.RecvOnly,
+ Chan: b.expr(fn, recv.X),
+ Pos: recv.OpPos,
+ }
+ if debugInfo {
+ st.DebugNode = recv
+ }
+
+ case *ast.ExprStmt: // <-ch
+ recv := unparen(comm.X).(*ast.UnaryExpr)
+ st = &SelectState{
+ Dir: types.RecvOnly,
+ Chan: b.expr(fn, recv.X),
+ Pos: recv.OpPos,
+ }
+ if debugInfo {
+ st.DebugNode = recv
+ }
+ }
+ states = append(states, st)
+ }
+
+ // We dispatch on the (fair) result of Select using a
+ // sequential if-else chain, in effect:
+ //
+ // idx, recvOk, r0...r_n-1 := select(...)
+ // if idx == 0 { // receive on channel 0 (first receive => r0)
+ // x, ok := r0, recvOk
+ // ...state0...
+ // } else if v == 1 { // send on channel 1
+ // ...state1...
+ // } else {
+ // ...default...
+ // }
+ sel := &Select{
+ States: states,
+ Blocking: blocking,
+ }
+ sel.setPos(s.Select)
+ var vars []*types.Var
+ vars = append(vars, varIndex, varOk)
+ for _, st := range states {
+ if st.Dir == types.RecvOnly {
+ tElem := st.Chan.Type().Underlying().(*types.Chan).Elem()
+ vars = append(vars, anonVar(tElem))
+ }
+ }
+ sel.setType(types.NewTuple(vars...))
+
+ fn.emit(sel)
+ idx := emitExtract(fn, sel, 0)
+
+ done := fn.newBasicBlock("select.done")
+ if label != nil {
+ label._break = done
+ }
+
+ var defaultBody *[]ast.Stmt
+ state := 0
+ r := 2 // index in 'sel' tuple of value; increments if st.Dir==RECV
+ for _, cc := range s.Body.List {
+ clause := cc.(*ast.CommClause)
+ if clause.Comm == nil {
+ defaultBody = &clause.Body
+ continue
+ }
+ body := fn.newBasicBlock("select.body")
+ next := fn.newBasicBlock("select.next")
+ emitIf(fn, emitCompare(fn, token.EQL, idx, intConst(int64(state)), token.NoPos), body, next)
+ fn.currentBlock = body
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ switch comm := clause.Comm.(type) {
+ case *ast.ExprStmt: // <-ch
+ if debugInfo {
+ v := emitExtract(fn, sel, r)
+ emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
+ }
+ r++
+
+ case *ast.AssignStmt: // x := <-states[state].Chan
+ if comm.Tok == token.DEFINE {
+ fn.addLocalForIdent(comm.Lhs[0].(*ast.Ident))
+ }
+ x := b.addr(fn, comm.Lhs[0], false) // non-escaping
+ v := emitExtract(fn, sel, r)
+ if debugInfo {
+ emitDebugRef(fn, states[state].DebugNode.(ast.Expr), v, false)
+ }
+ x.store(fn, v)
+
+ if len(comm.Lhs) == 2 { // x, ok := ...
+ if comm.Tok == token.DEFINE {
+ fn.addLocalForIdent(comm.Lhs[1].(*ast.Ident))
+ }
+ ok := b.addr(fn, comm.Lhs[1], false) // non-escaping
+ ok.store(fn, emitExtract(fn, sel, 1))
+ }
+ r++
+ }
+ b.stmtList(fn, clause.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, done)
+ fn.currentBlock = next
+ state++
+ }
+ if defaultBody != nil {
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ }
+ b.stmtList(fn, *defaultBody)
+ fn.targets = fn.targets.tail
+ } else {
+ // A blocking select must match some case.
+ // (This should really be a runtime.errorString, not a string.)
+ fn.emit(&Panic{
+ X: emitConv(fn, stringConst("blocking select matched no case"), tEface),
+ })
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+ }
+ emitJump(fn, done)
+ fn.currentBlock = done
+}
+
+// forStmt emits to fn code for the for statement s, optionally
+// labelled by label.
+//
+func (b *builder) forStmt(fn *Function, s *ast.ForStmt, label *lblock) {
+ // ...init...
+ // jump loop
+ // loop:
+ // if cond goto body else done
+ // body:
+ // ...body...
+ // jump post
+ // post: (target of continue)
+ // ...post...
+ // jump loop
+ // done: (target of break)
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+ body := fn.newBasicBlock("for.body")
+ done := fn.newBasicBlock("for.done") // target of 'break'
+ loop := body // target of back-edge
+ if s.Cond != nil {
+ loop = fn.newBasicBlock("for.loop")
+ }
+ cont := loop // target of 'continue'
+ if s.Post != nil {
+ cont = fn.newBasicBlock("for.post")
+ }
+ if label != nil {
+ label._break = done
+ label._continue = cont
+ }
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+ if loop != body {
+ b.cond(fn, s.Cond, body, done)
+ fn.currentBlock = body
+ }
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _continue: cont,
+ }
+ b.stmt(fn, s.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, cont)
+
+ if s.Post != nil {
+ fn.currentBlock = cont
+ b.stmt(fn, s.Post)
+ emitJump(fn, loop) // back-edge
+ }
+ fn.currentBlock = done
+}
+
+// rangeIndexed emits to fn the header for an integer-indexed loop
+// over array, *array or slice value x.
+// The v result is defined only if tv is non-nil.
+// forPos is the position of the "for" token.
+//
+func (b *builder) rangeIndexed(fn *Function, x Value, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
+ //
+ // length = len(x)
+ // index = -1
+ // loop: (target of continue)
+ // index++
+ // if index < length goto body else done
+ // body:
+ // k = index
+ // v = x[index]
+ // ...body...
+ // jump loop
+ // done: (target of break)
+
+ // Determine number of iterations.
+ var length Value
+ if arr, ok := deref(x.Type()).Underlying().(*types.Array); ok {
+ // For array or *array, the number of iterations is
+ // known statically thanks to the type. We avoid a
+ // data dependence upon x, permitting later dead-code
+ // elimination if x is pure, static unrolling, etc.
+ // Ranging over a nil *array may have >0 iterations.
+ // We still generate code for x, in case it has effects.
+ length = intConst(arr.Len())
+ } else {
+ // length = len(x).
+ var c Call
+ c.Call.Value = makeLen(x.Type())
+ c.Call.Args = []Value{x}
+ c.setType(tInt)
+ length = fn.emit(&c)
+ }
+
+ index := fn.addLocal(tInt, token.NoPos)
+ emitStore(fn, index, intConst(-1), pos)
+
+ loop = fn.newBasicBlock("rangeindex.loop")
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+
+ incr := &BinOp{
+ Op: token.ADD,
+ X: emitLoad(fn, index),
+ Y: vOne,
+ }
+ incr.setType(tInt)
+ emitStore(fn, index, fn.emit(incr), pos)
+
+ body := fn.newBasicBlock("rangeindex.body")
+ done = fn.newBasicBlock("rangeindex.done")
+ emitIf(fn, emitCompare(fn, token.LSS, incr, length, token.NoPos), body, done)
+ fn.currentBlock = body
+
+ k = emitLoad(fn, index)
+ if tv != nil {
+ switch t := x.Type().Underlying().(type) {
+ case *types.Array:
+ instr := &Index{
+ X: x,
+ Index: k,
+ }
+ instr.setType(t.Elem())
+ v = fn.emit(instr)
+
+ case *types.Pointer: // *array
+ instr := &IndexAddr{
+ X: x,
+ Index: k,
+ }
+ instr.setType(types.NewPointer(t.Elem().Underlying().(*types.Array).Elem()))
+ v = emitLoad(fn, fn.emit(instr))
+
+ case *types.Slice:
+ instr := &IndexAddr{
+ X: x,
+ Index: k,
+ }
+ instr.setType(types.NewPointer(t.Elem()))
+ v = emitLoad(fn, fn.emit(instr))
+
+ default:
+ panic("rangeIndexed x:" + t.String())
+ }
+ }
+ return
+}
+
+// rangeIter emits to fn the header for a loop using
+// Range/Next/Extract to iterate over map or string value x.
+// tk and tv are the types of the key/value results k and v, or nil
+// if the respective component is not wanted.
+//
+func (b *builder) rangeIter(fn *Function, x Value, tk, tv types.Type, pos token.Pos) (k, v Value, loop, done *BasicBlock) {
+ //
+ // it = range x
+ // loop: (target of continue)
+ // okv = next it (ok, key, value)
+ // ok = extract okv #0
+ // if ok goto body else done
+ // body:
+ // k = extract okv #1
+ // v = extract okv #2
+ // ...body...
+ // jump loop
+ // done: (target of break)
+ //
+
+ if tk == nil {
+ tk = tInvalid
+ }
+ if tv == nil {
+ tv = tInvalid
+ }
+
+ rng := &Range{X: x}
+ rng.setPos(pos)
+ rng.setType(tRangeIter)
+ it := fn.emit(rng)
+
+ loop = fn.newBasicBlock("rangeiter.loop")
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+
+ _, isString := x.Type().Underlying().(*types.Basic)
+
+ okv := &Next{
+ Iter: it,
+ IsString: isString,
+ }
+ okv.setType(types.NewTuple(
+ varOk,
+ newVar("k", tk),
+ newVar("v", tv),
+ ))
+ fn.emit(okv)
+
+ body := fn.newBasicBlock("rangeiter.body")
+ done = fn.newBasicBlock("rangeiter.done")
+ emitIf(fn, emitExtract(fn, okv, 0), body, done)
+ fn.currentBlock = body
+
+ if tk != tInvalid {
+ k = emitExtract(fn, okv, 1)
+ }
+ if tv != tInvalid {
+ v = emitExtract(fn, okv, 2)
+ }
+ return
+}
+
+// rangeChan emits to fn the header for a loop that receives from
+// channel x until it fails.
+// tk is the channel's element type, or nil if the k result is
+// not wanted
+// pos is the position of the '=' or ':=' token.
+//
+func (b *builder) rangeChan(fn *Function, x Value, tk types.Type, pos token.Pos) (k Value, loop, done *BasicBlock) {
+ //
+ // loop: (target of continue)
+ // ko = <-x (key, ok)
+ // ok = extract ko #1
+ // if ok goto body else done
+ // body:
+ // k = extract ko #0
+ // ...
+ // goto loop
+ // done: (target of break)
+
+ loop = fn.newBasicBlock("rangechan.loop")
+ emitJump(fn, loop)
+ fn.currentBlock = loop
+ recv := &UnOp{
+ Op: token.ARROW,
+ X: x,
+ CommaOk: true,
+ }
+ recv.setPos(pos)
+ recv.setType(types.NewTuple(
+ newVar("k", x.Type().Underlying().(*types.Chan).Elem()),
+ varOk,
+ ))
+ ko := fn.emit(recv)
+ body := fn.newBasicBlock("rangechan.body")
+ done = fn.newBasicBlock("rangechan.done")
+ emitIf(fn, emitExtract(fn, ko, 1), body, done)
+ fn.currentBlock = body
+ if tk != nil {
+ k = emitExtract(fn, ko, 0)
+ }
+ return
+}
+
+// rangeStmt emits to fn code for the range statement s, optionally
+// labelled by label.
+//
+func (b *builder) rangeStmt(fn *Function, s *ast.RangeStmt, label *lblock) {
+ var tk, tv types.Type
+ if s.Key != nil && !isBlankIdent(s.Key) {
+ tk = fn.Pkg.typeOf(s.Key)
+ }
+ if s.Value != nil && !isBlankIdent(s.Value) {
+ tv = fn.Pkg.typeOf(s.Value)
+ }
+
+ // If iteration variables are defined (:=), this
+ // occurs once outside the loop.
+ //
+ // Unlike a short variable declaration, a RangeStmt
+ // using := never redeclares an existing variable; it
+ // always creates a new one.
+ if s.Tok == token.DEFINE {
+ if tk != nil {
+ fn.addLocalForIdent(s.Key.(*ast.Ident))
+ }
+ if tv != nil {
+ fn.addLocalForIdent(s.Value.(*ast.Ident))
+ }
+ }
+
+ x := b.expr(fn, s.X)
+
+ var k, v Value
+ var loop, done *BasicBlock
+ switch rt := x.Type().Underlying().(type) {
+ case *types.Slice, *types.Array, *types.Pointer: // *array
+ k, v, loop, done = b.rangeIndexed(fn, x, tv, s.For)
+
+ case *types.Chan:
+ k, loop, done = b.rangeChan(fn, x, tk, s.For)
+
+ case *types.Map, *types.Basic: // string
+ k, v, loop, done = b.rangeIter(fn, x, tk, tv, s.For)
+
+ default:
+ panic("Cannot range over: " + rt.String())
+ }
+
+ // Evaluate both LHS expressions before we update either.
+ var kl, vl lvalue
+ if tk != nil {
+ kl = b.addr(fn, s.Key, false) // non-escaping
+ }
+ if tv != nil {
+ vl = b.addr(fn, s.Value, false) // non-escaping
+ }
+ if tk != nil {
+ kl.store(fn, k)
+ }
+ if tv != nil {
+ vl.store(fn, v)
+ }
+
+ if label != nil {
+ label._break = done
+ label._continue = loop
+ }
+
+ fn.targets = &targets{
+ tail: fn.targets,
+ _break: done,
+ _continue: loop,
+ }
+ b.stmt(fn, s.Body)
+ fn.targets = fn.targets.tail
+ emitJump(fn, loop) // back-edge
+ fn.currentBlock = done
+}
+
+// stmt lowers statement s to SSA form, emitting code to fn.
+func (b *builder) stmt(fn *Function, _s ast.Stmt) {
+ // The label of the current statement. If non-nil, its _goto
+ // target is always set; its _break and _continue are set only
+ // within the body of switch/typeswitch/select/for/range.
+ // It is effectively an additional default-nil parameter of stmt().
+ var label *lblock
+start:
+ switch s := _s.(type) {
+ case *ast.EmptyStmt:
+ // ignore. (Usually removed by gofmt.)
+
+ case *ast.DeclStmt: // Con, Var or Typ
+ d := s.Decl.(*ast.GenDecl)
+ if d.Tok == token.VAR {
+ for _, spec := range d.Specs {
+ if vs, ok := spec.(*ast.ValueSpec); ok {
+ b.localValueSpec(fn, vs)
+ }
+ }
+ }
+
+ case *ast.LabeledStmt:
+ label = fn.labelledBlock(s.Label)
+ emitJump(fn, label._goto)
+ fn.currentBlock = label._goto
+ _s = s.Stmt
+ goto start // effectively: tailcall stmt(fn, s.Stmt, label)
+
+ case *ast.ExprStmt:
+ b.expr(fn, s.X)
+
+ case *ast.SendStmt:
+ fn.emit(&Send{
+ Chan: b.expr(fn, s.Chan),
+ X: emitConv(fn, b.expr(fn, s.Value),
+ fn.Pkg.typeOf(s.Chan).Underlying().(*types.Chan).Elem()),
+ pos: s.Arrow,
+ })
+
+ case *ast.IncDecStmt:
+ op := token.ADD
+ if s.Tok == token.DEC {
+ op = token.SUB
+ }
+ loc := b.addr(fn, s.X, false)
+ b.assignOp(fn, loc, NewConst(constant.MakeInt64(1), loc.typ()), op, s.Pos())
+
+ case *ast.AssignStmt:
+ switch s.Tok {
+ case token.ASSIGN, token.DEFINE:
+ b.assignStmt(fn, s.Lhs, s.Rhs, s.Tok == token.DEFINE)
+
+ default: // +=, etc.
+ op := s.Tok + token.ADD - token.ADD_ASSIGN
+ b.assignOp(fn, b.addr(fn, s.Lhs[0], false), b.expr(fn, s.Rhs[0]), op, s.Pos())
+ }
+
+ case *ast.GoStmt:
+ // The "intrinsics" new/make/len/cap are forbidden here.
+ // panic is treated like an ordinary function call.
+ v := Go{pos: s.Go}
+ b.setCall(fn, s.Call, &v.Call)
+ fn.emit(&v)
+
+ case *ast.DeferStmt:
+ // The "intrinsics" new/make/len/cap are forbidden here.
+ // panic is treated like an ordinary function call.
+ v := Defer{pos: s.Defer}
+ b.setCall(fn, s.Call, &v.Call)
+ fn.emit(&v)
+
+ // A deferred call can cause recovery from panic,
+ // and control resumes at the Recover block.
+ createRecoverBlock(fn)
+
+ case *ast.ReturnStmt:
+ var results []Value
+ if len(s.Results) == 1 && fn.Signature.Results().Len() > 1 {
+ // Return of one expression in a multi-valued function.
+ tuple := b.exprN(fn, s.Results[0])
+ ttuple := tuple.Type().(*types.Tuple)
+ for i, n := 0, ttuple.Len(); i < n; i++ {
+ results = append(results,
+ emitConv(fn, emitExtract(fn, tuple, i),
+ fn.Signature.Results().At(i).Type()))
+ }
+ } else {
+ // 1:1 return, or no-arg return in non-void function.
+ for i, r := range s.Results {
+ v := emitConv(fn, b.expr(fn, r), fn.Signature.Results().At(i).Type())
+ results = append(results, v)
+ }
+ }
+ if fn.namedResults != nil {
+ // Function has named result parameters (NRPs).
+ // Perform parallel assignment of return operands to NRPs.
+ for i, r := range results {
+ emitStore(fn, fn.namedResults[i], r, s.Return)
+ }
+ }
+ // Run function calls deferred in this
+ // function when explicitly returning from it.
+ fn.emit(new(RunDefers))
+ if fn.namedResults != nil {
+ // Reload NRPs to form the result tuple.
+ results = results[:0]
+ for _, r := range fn.namedResults {
+ results = append(results, emitLoad(fn, r))
+ }
+ }
+ fn.emit(&Return{Results: results, pos: s.Return})
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+
+ case *ast.BranchStmt:
+ var block *BasicBlock
+ switch s.Tok {
+ case token.BREAK:
+ if s.Label != nil {
+ block = fn.labelledBlock(s.Label)._break
+ } else {
+ for t := fn.targets; t != nil && block == nil; t = t.tail {
+ block = t._break
+ }
+ }
+
+ case token.CONTINUE:
+ if s.Label != nil {
+ block = fn.labelledBlock(s.Label)._continue
+ } else {
+ for t := fn.targets; t != nil && block == nil; t = t.tail {
+ block = t._continue
+ }
+ }
+
+ case token.FALLTHROUGH:
+ for t := fn.targets; t != nil && block == nil; t = t.tail {
+ block = t._fallthrough
+ }
+
+ case token.GOTO:
+ block = fn.labelledBlock(s.Label)._goto
+ }
+ emitJump(fn, block)
+ fn.currentBlock = fn.newBasicBlock("unreachable")
+
+ case *ast.BlockStmt:
+ b.stmtList(fn, s.List)
+
+ case *ast.IfStmt:
+ if s.Init != nil {
+ b.stmt(fn, s.Init)
+ }
+ then := fn.newBasicBlock("if.then")
+ done := fn.newBasicBlock("if.done")
+ els := done
+ if s.Else != nil {
+ els = fn.newBasicBlock("if.else")
+ }
+ b.cond(fn, s.Cond, then, els)
+ fn.currentBlock = then
+ b.stmt(fn, s.Body)
+ emitJump(fn, done)
+
+ if s.Else != nil {
+ fn.currentBlock = els
+ b.stmt(fn, s.Else)
+ emitJump(fn, done)
+ }
+
+ fn.currentBlock = done
+
+ case *ast.SwitchStmt:
+ b.switchStmt(fn, s, label)
+
+ case *ast.TypeSwitchStmt:
+ b.typeSwitchStmt(fn, s, label)
+
+ case *ast.SelectStmt:
+ b.selectStmt(fn, s, label)
+
+ case *ast.ForStmt:
+ b.forStmt(fn, s, label)
+
+ case *ast.RangeStmt:
+ b.rangeStmt(fn, s, label)
+
+ default:
+ panic(fmt.Sprintf("unexpected statement kind: %T", s))
+ }
+}
+
+// buildFunction builds SSA code for the body of function fn. Idempotent.
+func (b *builder) buildFunction(fn *Function) {
+ if fn.Blocks != nil {
+ return // building already started
+ }
+
+ var recvField *ast.FieldList
+ var body *ast.BlockStmt
+ var functype *ast.FuncType
+ switch n := fn.syntax.(type) {
+ case nil:
+ return // not a Go source function. (Synthetic, or from object file.)
+ case *ast.FuncDecl:
+ functype = n.Type
+ recvField = n.Recv
+ body = n.Body
+ case *ast.FuncLit:
+ functype = n.Type
+ body = n.Body
+ default:
+ panic(n)
+ }
+
+ if body == nil {
+ // External function.
+ if fn.Params == nil {
+ // This condition ensures we add a non-empty
+ // params list once only, but we may attempt
+ // the degenerate empty case repeatedly.
+ // TODO(adonovan): opt: don't do that.
+
+ // We set Function.Params even though there is no body
+ // code to reference them. This simplifies clients.
+ if recv := fn.Signature.Recv(); recv != nil {
+ fn.addParamObj(recv)
+ }
+ params := fn.Signature.Params()
+ for i, n := 0, params.Len(); i < n; i++ {
+ fn.addParamObj(params.At(i))
+ }
+ }
+ return
+ }
+ if fn.Prog.mode&LogSource != 0 {
+ defer logStack("build function %s @ %s", fn, fn.Prog.Fset.Position(fn.pos))()
+ }
+ fn.startBody()
+ fn.createSyntacticParams(recvField, functype)
+ b.stmt(fn, body)
+ if cb := fn.currentBlock; cb != nil && (cb == fn.Blocks[0] || cb == fn.Recover || cb.Preds != nil) {
+ // Control fell off the end of the function's body block.
+ //
+ // Block optimizations eliminate the current block, if
+ // unreachable. It is a builder invariant that
+ // if this no-arg return is ill-typed for
+ // fn.Signature.Results, this block must be
+ // unreachable. The sanity checker checks this.
+ fn.emit(new(RunDefers))
+ fn.emit(new(Return))
+ }
+ fn.finishBody()
+}
+
+// buildFuncDecl builds SSA code for the function or method declared
+// by decl in package pkg.
+//
+func (b *builder) buildFuncDecl(pkg *Package, decl *ast.FuncDecl) {
+ id := decl.Name
+ if isBlankIdent(id) {
+ return // discard
+ }
+ fn := pkg.values[pkg.info.Defs[id]].(*Function)
+ if decl.Recv == nil && id.Name == "init" {
+ var v Call
+ v.Call.Value = fn
+ v.setType(types.NewTuple())
+ pkg.init.emit(&v)
+ }
+ b.buildFunction(fn)
+}
+
+// Build calls Package.Build for each package in prog.
+// Building occurs in parallel unless the BuildSerially mode flag was set.
+//
+// Build is intended for whole-program analysis; a typical compiler
+// need only build a single package.
+//
+// Build is idempotent and thread-safe.
+//
+func (prog *Program) Build() {
+ var wg sync.WaitGroup
+ for _, p := range prog.packages {
+ if prog.mode&BuildSerially != 0 {
+ p.Build()
+ } else {
+ wg.Add(1)
+ go func(p *Package) {
+ p.Build()
+ wg.Done()
+ }(p)
+ }
+ }
+ wg.Wait()
+}
+
+// Build builds SSA code for all functions and vars in package p.
+//
+// Precondition: CreatePackage must have been called for all of p's
+// direct imports (and hence its direct imports must have been
+// error-free).
+//
+// Build is idempotent and thread-safe.
+//
+func (p *Package) Build() { p.buildOnce.Do(p.build) }
+
+func (p *Package) build() {
+ if p.info == nil {
+ return // synthetic package, e.g. "testmain"
+ }
+
+ // Ensure we have runtime type info for all exported members.
+ // TODO(adonovan): ideally belongs in memberFromObject, but
+ // that would require package creation in topological order.
+ for name, mem := range p.Members {
+ if ast.IsExported(name) {
+ p.Prog.needMethodsOf(mem.Type())
+ }
+ }
+ if p.Prog.mode&LogSource != 0 {
+ defer logStack("build %s", p)()
+ }
+ init := p.init
+ init.startBody()
+
+ var done *BasicBlock
+
+ if p.Prog.mode&BareInits == 0 {
+ // Make init() skip if package is already initialized.
+ initguard := p.Var("init$guard")
+ doinit := init.newBasicBlock("init.start")
+ done = init.newBasicBlock("init.done")
+ emitIf(init, emitLoad(init, initguard), done, doinit)
+ init.currentBlock = doinit
+ emitStore(init, initguard, vTrue, token.NoPos)
+
+ // Call the init() function of each package we import.
+ for _, pkg := range p.Pkg.Imports() {
+ prereq := p.Prog.packages[pkg]
+ if prereq == nil {
+ panic(fmt.Sprintf("Package(%q).Build(): unsatisfied import: Program.CreatePackage(%q) was not called", p.Pkg.Path(), pkg.Path()))
+ }
+ var v Call
+ v.Call.Value = prereq.init
+ v.Call.pos = init.pos
+ v.setType(types.NewTuple())
+ init.emit(&v)
+ }
+ }
+
+ var b builder
+
+ // Initialize package-level vars in correct order.
+ for _, varinit := range p.info.InitOrder {
+ if init.Prog.mode&LogSource != 0 {
+ fmt.Fprintf(os.Stderr, "build global initializer %v @ %s\n",
+ varinit.Lhs, p.Prog.Fset.Position(varinit.Rhs.Pos()))
+ }
+ if len(varinit.Lhs) == 1 {
+ // 1:1 initialization: var x, y = a(), b()
+ var lval lvalue
+ if v := varinit.Lhs[0]; v.Name() != "_" {
+ lval = &address{addr: p.values[v].(*Global), pos: v.Pos()}
+ } else {
+ lval = blank{}
+ }
+ b.assign(init, lval, varinit.Rhs, true, nil)
+ } else {
+ // n:1 initialization: var x, y := f()
+ tuple := b.exprN(init, varinit.Rhs)
+ for i, v := range varinit.Lhs {
+ if v.Name() == "_" {
+ continue
+ }
+ emitStore(init, p.values[v].(*Global), emitExtract(init, tuple, i), v.Pos())
+ }
+ }
+ }
+
+ // Build all package-level functions, init functions
+ // and methods, including unreachable/blank ones.
+ // We build them in source order, but it's not significant.
+ for _, file := range p.files {
+ for _, decl := range file.Decls {
+ if decl, ok := decl.(*ast.FuncDecl); ok {
+ b.buildFuncDecl(p, decl)
+ }
+ }
+ }
+
+ // Finish up init().
+ if p.Prog.mode&BareInits == 0 {
+ emitJump(init, done)
+ init.currentBlock = done
+ }
+ init.emit(new(Return))
+ init.finishBody()
+
+ p.info = nil // We no longer need ASTs or go/types deductions.
+
+ if p.Prog.mode&SanityCheckFunctions != 0 {
+ sanityCheckPackage(p)
+ }
+}
+
+// Like ObjectOf, but panics instead of returning nil.
+// Only valid during p's create and build phases.
+func (p *Package) objectOf(id *ast.Ident) types.Object {
+ if o := p.info.ObjectOf(id); o != nil {
+ return o
+ }
+ panic(fmt.Sprintf("no types.Object for ast.Ident %s @ %s",
+ id.Name, p.Prog.Fset.Position(id.Pos())))
+}
+
+// Like TypeOf, but panics instead of returning nil.
+// Only valid during p's create and build phases.
+func (p *Package) typeOf(e ast.Expr) types.Type {
+ if T := p.info.TypeOf(e); T != nil {
+ return T
+ }
+ panic(fmt.Sprintf("no type for %T @ %s",
+ e, p.Prog.Fset.Position(e.Pos())))
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/const.go b/vendor/golang.org/x/tools/go/ssa/const.go
new file mode 100644
index 00000000000..f43792e7f37
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/const.go
@@ -0,0 +1,169 @@
+// 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 ssa
+
+// This file defines the Const SSA value type.
+
+import (
+ "fmt"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "strconv"
+)
+
+// NewConst returns a new constant of the specified value and type.
+// val must be valid according to the specification of Const.Value.
+//
+func NewConst(val constant.Value, typ types.Type) *Const {
+ return &Const{typ, val}
+}
+
+// intConst returns an 'int' constant that evaluates to i.
+// (i is an int64 in case the host is narrower than the target.)
+func intConst(i int64) *Const {
+ return NewConst(constant.MakeInt64(i), tInt)
+}
+
+// nilConst returns a nil constant of the specified type, which may
+// be any reference type, including interfaces.
+//
+func nilConst(typ types.Type) *Const {
+ return NewConst(nil, typ)
+}
+
+// stringConst returns a 'string' constant that evaluates to s.
+func stringConst(s string) *Const {
+ return NewConst(constant.MakeString(s), tString)
+}
+
+// zeroConst returns a new "zero" constant of the specified type,
+// which must not be an array or struct type: the zero values of
+// aggregates are well-defined but cannot be represented by Const.
+//
+func zeroConst(t types.Type) *Const {
+ switch t := t.(type) {
+ case *types.Basic:
+ switch {
+ case t.Info()&types.IsBoolean != 0:
+ return NewConst(constant.MakeBool(false), t)
+ case t.Info()&types.IsNumeric != 0:
+ return NewConst(constant.MakeInt64(0), t)
+ case t.Info()&types.IsString != 0:
+ return NewConst(constant.MakeString(""), t)
+ case t.Kind() == types.UnsafePointer:
+ fallthrough
+ case t.Kind() == types.UntypedNil:
+ return nilConst(t)
+ default:
+ panic(fmt.Sprint("zeroConst for unexpected type:", t))
+ }
+ case *types.Pointer, *types.Slice, *types.Interface, *types.Chan, *types.Map, *types.Signature:
+ return nilConst(t)
+ case *types.Named:
+ return NewConst(zeroConst(t.Underlying()).Value, t)
+ case *types.Array, *types.Struct, *types.Tuple:
+ panic(fmt.Sprint("zeroConst applied to aggregate:", t))
+ }
+ panic(fmt.Sprint("zeroConst: unexpected ", t))
+}
+
+func (c *Const) RelString(from *types.Package) string {
+ var s string
+ if c.Value == nil {
+ s = "nil"
+ } else if c.Value.Kind() == constant.String {
+ s = constant.StringVal(c.Value)
+ const max = 20
+ // TODO(adonovan): don't cut a rune in half.
+ if len(s) > max {
+ s = s[:max-3] + "..." // abbreviate
+ }
+ s = strconv.Quote(s)
+ } else {
+ s = c.Value.String()
+ }
+ return s + ":" + relType(c.Type(), from)
+}
+
+func (c *Const) Name() string {
+ return c.RelString(nil)
+}
+
+func (c *Const) String() string {
+ return c.Name()
+}
+
+func (c *Const) Type() types.Type {
+ return c.typ
+}
+
+func (c *Const) Referrers() *[]Instruction {
+ return nil
+}
+
+func (c *Const) Parent() *Function { return nil }
+
+func (c *Const) Pos() token.Pos {
+ return token.NoPos
+}
+
+// IsNil returns true if this constant represents a typed or untyped nil value.
+func (c *Const) IsNil() bool {
+ return c.Value == nil
+}
+
+// TODO(adonovan): move everything below into golang.org/x/tools/go/ssa/interp.
+
+// Int64 returns the numeric value of this constant truncated to fit
+// a signed 64-bit integer.
+//
+func (c *Const) Int64() int64 {
+ switch x := constant.ToInt(c.Value); x.Kind() {
+ case constant.Int:
+ if i, ok := constant.Int64Val(x); ok {
+ return i
+ }
+ return 0
+ case constant.Float:
+ f, _ := constant.Float64Val(x)
+ return int64(f)
+ }
+ panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
+}
+
+// Uint64 returns the numeric value of this constant truncated to fit
+// an unsigned 64-bit integer.
+//
+func (c *Const) Uint64() uint64 {
+ switch x := constant.ToInt(c.Value); x.Kind() {
+ case constant.Int:
+ if u, ok := constant.Uint64Val(x); ok {
+ return u
+ }
+ return 0
+ case constant.Float:
+ f, _ := constant.Float64Val(x)
+ return uint64(f)
+ }
+ panic(fmt.Sprintf("unexpected constant value: %T", c.Value))
+}
+
+// Float64 returns the numeric value of this constant truncated to fit
+// a float64.
+//
+func (c *Const) Float64() float64 {
+ f, _ := constant.Float64Val(c.Value)
+ return f
+}
+
+// Complex128 returns the complex value of this constant truncated to
+// fit a complex128.
+//
+func (c *Const) Complex128() complex128 {
+ re, _ := constant.Float64Val(constant.Real(c.Value))
+ im, _ := constant.Float64Val(constant.Imag(c.Value))
+ return complex(re, im)
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/create.go b/vendor/golang.org/x/tools/go/ssa/create.go
new file mode 100644
index 00000000000..85163a0c5a7
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/create.go
@@ -0,0 +1,270 @@
+// 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 ssa
+
+// This file implements the CREATE phase of SSA construction.
+// See builder.go for explanation.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "os"
+ "sync"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+// NewProgram returns a new SSA Program.
+//
+// mode controls diagnostics and checking during SSA construction.
+//
+func NewProgram(fset *token.FileSet, mode BuilderMode) *Program {
+ prog := &Program{
+ Fset: fset,
+ imported: make(map[string]*Package),
+ packages: make(map[*types.Package]*Package),
+ thunks: make(map[selectionKey]*Function),
+ bounds: make(map[*types.Func]*Function),
+ mode: mode,
+ }
+
+ h := typeutil.MakeHasher() // protected by methodsMu, in effect
+ prog.methodSets.SetHasher(h)
+ prog.canon.SetHasher(h)
+
+ return prog
+}
+
+// memberFromObject populates package pkg with a member for the
+// typechecker object obj.
+//
+// For objects from Go source code, syntax is the associated syntax
+// tree (for funcs and vars only); it will be used during the build
+// phase.
+//
+func memberFromObject(pkg *Package, obj types.Object, syntax ast.Node) {
+ name := obj.Name()
+ switch obj := obj.(type) {
+ case *types.Builtin:
+ if pkg.Pkg != types.Unsafe {
+ panic("unexpected builtin object: " + obj.String())
+ }
+
+ case *types.TypeName:
+ pkg.Members[name] = &Type{
+ object: obj,
+ pkg: pkg,
+ }
+
+ case *types.Const:
+ c := &NamedConst{
+ object: obj,
+ Value: NewConst(obj.Val(), obj.Type()),
+ pkg: pkg,
+ }
+ pkg.values[obj] = c.Value
+ pkg.Members[name] = c
+
+ case *types.Var:
+ g := &Global{
+ Pkg: pkg,
+ name: name,
+ object: obj,
+ typ: types.NewPointer(obj.Type()), // address
+ pos: obj.Pos(),
+ }
+ pkg.values[obj] = g
+ pkg.Members[name] = g
+
+ case *types.Func:
+ sig := obj.Type().(*types.Signature)
+ if sig.Recv() == nil && name == "init" {
+ pkg.ninit++
+ name = fmt.Sprintf("init#%d", pkg.ninit)
+ }
+ fn := &Function{
+ name: name,
+ object: obj,
+ Signature: sig,
+ syntax: syntax,
+ pos: obj.Pos(),
+ Pkg: pkg,
+ Prog: pkg.Prog,
+ }
+ if syntax == nil {
+ fn.Synthetic = "loaded from gc object file"
+ }
+
+ pkg.values[obj] = fn
+ if sig.Recv() == nil {
+ pkg.Members[name] = fn // package-level function
+ }
+
+ default: // (incl. *types.Package)
+ panic("unexpected Object type: " + obj.String())
+ }
+}
+
+// membersFromDecl populates package pkg with members for each
+// typechecker object (var, func, const or type) associated with the
+// specified decl.
+//
+func membersFromDecl(pkg *Package, decl ast.Decl) {
+ switch decl := decl.(type) {
+ case *ast.GenDecl: // import, const, type or var
+ switch decl.Tok {
+ case token.CONST:
+ for _, spec := range decl.Specs {
+ for _, id := range spec.(*ast.ValueSpec).Names {
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], nil)
+ }
+ }
+ }
+
+ case token.VAR:
+ for _, spec := range decl.Specs {
+ for _, id := range spec.(*ast.ValueSpec).Names {
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], spec)
+ }
+ }
+ }
+
+ case token.TYPE:
+ for _, spec := range decl.Specs {
+ id := spec.(*ast.TypeSpec).Name
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], nil)
+ }
+ }
+ }
+
+ case *ast.FuncDecl:
+ id := decl.Name
+ if !isBlankIdent(id) {
+ memberFromObject(pkg, pkg.info.Defs[id], decl)
+ }
+ }
+}
+
+// CreatePackage constructs and returns an SSA Package from the
+// specified type-checked, error-free file ASTs, and populates its
+// Members mapping.
+//
+// importable determines whether this package should be returned by a
+// subsequent call to ImportedPackage(pkg.Path()).
+//
+// The real work of building SSA form for each function is not done
+// until a subsequent call to Package.Build().
+//
+func (prog *Program) CreatePackage(pkg *types.Package, files []*ast.File, info *types.Info, importable bool) *Package {
+ p := &Package{
+ Prog: prog,
+ Members: make(map[string]Member),
+ values: make(map[types.Object]Value),
+ Pkg: pkg,
+ info: info, // transient (CREATE and BUILD phases)
+ files: files, // transient (CREATE and BUILD phases)
+ }
+
+ // Add init() function.
+ p.init = &Function{
+ name: "init",
+ Signature: new(types.Signature),
+ Synthetic: "package initializer",
+ Pkg: p,
+ Prog: prog,
+ }
+ p.Members[p.init.name] = p.init
+
+ // CREATE phase.
+ // Allocate all package members: vars, funcs, consts and types.
+ if len(files) > 0 {
+ // Go source package.
+ for _, file := range files {
+ for _, decl := range file.Decls {
+ membersFromDecl(p, decl)
+ }
+ }
+ } else {
+ // GC-compiled binary package (or "unsafe")
+ // No code.
+ // No position information.
+ scope := p.Pkg.Scope()
+ for _, name := range scope.Names() {
+ obj := scope.Lookup(name)
+ memberFromObject(p, obj, nil)
+ if obj, ok := obj.(*types.TypeName); ok {
+ if named, ok := obj.Type().(*types.Named); ok {
+ for i, n := 0, named.NumMethods(); i < n; i++ {
+ memberFromObject(p, named.Method(i), nil)
+ }
+ }
+ }
+ }
+ }
+
+ if prog.mode&BareInits == 0 {
+ // Add initializer guard variable.
+ initguard := &Global{
+ Pkg: p,
+ name: "init$guard",
+ typ: types.NewPointer(tBool),
+ }
+ p.Members[initguard.Name()] = initguard
+ }
+
+ if prog.mode&GlobalDebug != 0 {
+ p.SetDebugMode(true)
+ }
+
+ if prog.mode&PrintPackages != 0 {
+ printMu.Lock()
+ p.WriteTo(os.Stdout)
+ printMu.Unlock()
+ }
+
+ if importable {
+ prog.imported[p.Pkg.Path()] = p
+ }
+ prog.packages[p.Pkg] = p
+
+ return p
+}
+
+// printMu serializes printing of Packages/Functions to stdout.
+var printMu sync.Mutex
+
+// AllPackages returns a new slice containing all packages in the
+// program prog in unspecified order.
+//
+func (prog *Program) AllPackages() []*Package {
+ pkgs := make([]*Package, 0, len(prog.packages))
+ for _, pkg := range prog.packages {
+ pkgs = append(pkgs, pkg)
+ }
+ return pkgs
+}
+
+// ImportedPackage returns the importable Package whose PkgPath
+// is path, or nil if no such Package has been created.
+//
+// A parameter to CreatePackage determines whether a package should be
+// considered importable. For example, no import declaration can resolve
+// to the ad-hoc main package created by 'go build foo.go'.
+//
+// TODO(adonovan): rethink this function and the "importable" concept;
+// most packages are importable. This function assumes that all
+// types.Package.Path values are unique within the ssa.Program, which is
+// false---yet this function remains very convenient.
+// Clients should use (*Program).Package instead where possible.
+// SSA doesn't really need a string-keyed map of packages.
+//
+func (prog *Program) ImportedPackage(path string) *Package {
+ return prog.imported[path]
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/doc.go b/vendor/golang.org/x/tools/go/ssa/doc.go
new file mode 100644
index 00000000000..1a13640f9d5
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/doc.go
@@ -0,0 +1,125 @@
+// 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 ssa defines a representation of the elements of Go programs
+// (packages, types, functions, variables and constants) using a
+// static single-assignment (SSA) form intermediate representation
+// (IR) for the bodies of functions.
+//
+// THIS INTERFACE IS EXPERIMENTAL AND IS LIKELY TO CHANGE.
+//
+// For an introduction to SSA form, see
+// http://en.wikipedia.org/wiki/Static_single_assignment_form.
+// This page provides a broader reading list:
+// http://www.dcs.gla.ac.uk/~jsinger/ssa.html.
+//
+// The level of abstraction of the SSA form is intentionally close to
+// the source language to facilitate construction of source analysis
+// tools. It is not intended for machine code generation.
+//
+// All looping, branching and switching constructs are replaced with
+// unstructured control flow. Higher-level control flow constructs
+// such as multi-way branch can be reconstructed as needed; see
+// ssautil.Switches() for an example.
+//
+// The simplest way to create the SSA representation of a package is
+// to load typed syntax trees using golang.org/x/tools/go/packages, then
+// invoke the ssautil.Packages helper function. See ExampleLoadPackages
+// and ExampleWholeProgram for examples.
+// The resulting ssa.Program contains all the packages and their
+// members, but SSA code is not created for function bodies until a
+// subsequent call to (*Package).Build or (*Program).Build.
+//
+// The builder initially builds a naive SSA form in which all local
+// variables are addresses of stack locations with explicit loads and
+// stores. Registerisation of eligible locals and φ-node insertion
+// using dominance and dataflow are then performed as a second pass
+// called "lifting" to improve the accuracy and performance of
+// subsequent analyses; this pass can be skipped by setting the
+// NaiveForm builder flag.
+//
+// The primary interfaces of this package are:
+//
+// - Member: a named member of a Go package.
+// - Value: an expression that yields a value.
+// - Instruction: a statement that consumes values and performs computation.
+// - Node: a Value or Instruction (emphasizing its membership in the SSA value graph)
+//
+// A computation that yields a result implements both the Value and
+// Instruction interfaces. The following table shows for each
+// concrete type which of these interfaces it implements.
+//
+// Value? Instruction? Member?
+// *Alloc ✔ ✔
+// *BinOp ✔ ✔
+// *Builtin ✔
+// *Call ✔ ✔
+// *ChangeInterface ✔ ✔
+// *ChangeType ✔ ✔
+// *Const ✔
+// *Convert ✔ ✔
+// *DebugRef ✔
+// *Defer ✔
+// *Extract ✔ ✔
+// *Field ✔ ✔
+// *FieldAddr ✔ ✔
+// *FreeVar ✔
+// *Function ✔ ✔ (func)
+// *Global ✔ ✔ (var)
+// *Go ✔
+// *If ✔
+// *Index ✔ ✔
+// *IndexAddr ✔ ✔
+// *Jump ✔
+// *Lookup ✔ ✔
+// *MakeChan ✔ ✔
+// *MakeClosure ✔ ✔
+// *MakeInterface ✔ ✔
+// *MakeMap ✔ ✔
+// *MakeSlice ✔ ✔
+// *MapUpdate ✔
+// *NamedConst ✔ (const)
+// *Next ✔ ✔
+// *Panic ✔
+// *Parameter ✔
+// *Phi ✔ ✔
+// *Range ✔ ✔
+// *Return ✔
+// *RunDefers ✔
+// *Select ✔ ✔
+// *Send ✔
+// *Slice ✔ ✔
+// *Store ✔
+// *Type ✔ (type)
+// *TypeAssert ✔ ✔
+// *UnOp ✔ ✔
+//
+// Other key types in this package include: Program, Package, Function
+// and BasicBlock.
+//
+// The program representation constructed by this package is fully
+// resolved internally, i.e. it does not rely on the names of Values,
+// Packages, Functions, Types or BasicBlocks for the correct
+// interpretation of the program. Only the identities of objects and
+// the topology of the SSA and type graphs are semantically
+// significant. (There is one exception: Ids, used to identify field
+// and method names, contain strings.) Avoidance of name-based
+// operations simplifies the implementation of subsequent passes and
+// can make them very efficient. Many objects are nonetheless named
+// to aid in debugging, but it is not essential that the names be
+// either accurate or unambiguous. The public API exposes a number of
+// name-based maps for client convenience.
+//
+// The ssa/ssautil package provides various utilities that depend only
+// on the public API of this package.
+//
+// TODO(adonovan): Consider the exceptional control-flow implications
+// of defer and recover().
+//
+// TODO(adonovan): write a how-to document for all the various cases
+// of trying to determine corresponding elements across the four
+// domains of source locations, ast.Nodes, types.Objects,
+// ssa.Values/Instructions.
+//
+package ssa // import "golang.org/x/tools/go/ssa"
diff --git a/vendor/golang.org/x/tools/go/ssa/dom.go b/vendor/golang.org/x/tools/go/ssa/dom.go
new file mode 100644
index 00000000000..12ef4308f3c
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/dom.go
@@ -0,0 +1,341 @@
+// 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 ssa
+
+// This file defines algorithms related to dominance.
+
+// Dominator tree construction ----------------------------------------
+//
+// We use the algorithm described in Lengauer & Tarjan. 1979. A fast
+// algorithm for finding dominators in a flowgraph.
+// http://doi.acm.org/10.1145/357062.357071
+//
+// We also apply the optimizations to SLT described in Georgiadis et
+// al, Finding Dominators in Practice, JGAA 2006,
+// http://jgaa.info/accepted/2006/GeorgiadisTarjanWerneck2006.10.1.pdf
+// to avoid the need for buckets of size > 1.
+
+import (
+ "bytes"
+ "fmt"
+ "math/big"
+ "os"
+ "sort"
+)
+
+// Idom returns the block that immediately dominates b:
+// its parent in the dominator tree, if any.
+// Neither the entry node (b.Index==0) nor recover node
+// (b==b.Parent().Recover()) have a parent.
+//
+func (b *BasicBlock) Idom() *BasicBlock { return b.dom.idom }
+
+// Dominees returns the list of blocks that b immediately dominates:
+// its children in the dominator tree.
+//
+func (b *BasicBlock) Dominees() []*BasicBlock { return b.dom.children }
+
+// Dominates reports whether b dominates c.
+func (b *BasicBlock) Dominates(c *BasicBlock) bool {
+ return b.dom.pre <= c.dom.pre && c.dom.post <= b.dom.post
+}
+
+type byDomPreorder []*BasicBlock
+
+func (a byDomPreorder) Len() int { return len(a) }
+func (a byDomPreorder) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
+func (a byDomPreorder) Less(i, j int) bool { return a[i].dom.pre < a[j].dom.pre }
+
+// DomPreorder returns a new slice containing the blocks of f in
+// dominator tree preorder.
+//
+func (f *Function) DomPreorder() []*BasicBlock {
+ n := len(f.Blocks)
+ order := make(byDomPreorder, n, n)
+ copy(order, f.Blocks)
+ sort.Sort(order)
+ return order
+}
+
+// domInfo contains a BasicBlock's dominance information.
+type domInfo struct {
+ idom *BasicBlock // immediate dominator (parent in domtree)
+ children []*BasicBlock // nodes immediately dominated by this one
+ pre, post int32 // pre- and post-order numbering within domtree
+}
+
+// ltState holds the working state for Lengauer-Tarjan algorithm
+// (during which domInfo.pre is repurposed for CFG DFS preorder number).
+type ltState struct {
+ // Each slice is indexed by b.Index.
+ sdom []*BasicBlock // b's semidominator
+ parent []*BasicBlock // b's parent in DFS traversal of CFG
+ ancestor []*BasicBlock // b's ancestor with least sdom
+}
+
+// dfs implements the depth-first search part of the LT algorithm.
+func (lt *ltState) dfs(v *BasicBlock, i int32, preorder []*BasicBlock) int32 {
+ preorder[i] = v
+ v.dom.pre = i // For now: DFS preorder of spanning tree of CFG
+ i++
+ lt.sdom[v.Index] = v
+ lt.link(nil, v)
+ for _, w := range v.Succs {
+ if lt.sdom[w.Index] == nil {
+ lt.parent[w.Index] = v
+ i = lt.dfs(w, i, preorder)
+ }
+ }
+ return i
+}
+
+// eval implements the EVAL part of the LT algorithm.
+func (lt *ltState) eval(v *BasicBlock) *BasicBlock {
+ // TODO(adonovan): opt: do path compression per simple LT.
+ u := v
+ for ; lt.ancestor[v.Index] != nil; v = lt.ancestor[v.Index] {
+ if lt.sdom[v.Index].dom.pre < lt.sdom[u.Index].dom.pre {
+ u = v
+ }
+ }
+ return u
+}
+
+// link implements the LINK part of the LT algorithm.
+func (lt *ltState) link(v, w *BasicBlock) {
+ lt.ancestor[w.Index] = v
+}
+
+// buildDomTree computes the dominator tree of f using the LT algorithm.
+// Precondition: all blocks are reachable (e.g. optimizeBlocks has been run).
+//
+func buildDomTree(f *Function) {
+ // The step numbers refer to the original LT paper; the
+ // reordering is due to Georgiadis.
+
+ // Clear any previous domInfo.
+ for _, b := range f.Blocks {
+ b.dom = domInfo{}
+ }
+
+ n := len(f.Blocks)
+ // Allocate space for 5 contiguous [n]*BasicBlock arrays:
+ // sdom, parent, ancestor, preorder, buckets.
+ space := make([]*BasicBlock, 5*n, 5*n)
+ lt := ltState{
+ sdom: space[0:n],
+ parent: space[n : 2*n],
+ ancestor: space[2*n : 3*n],
+ }
+
+ // Step 1. Number vertices by depth-first preorder.
+ preorder := space[3*n : 4*n]
+ root := f.Blocks[0]
+ prenum := lt.dfs(root, 0, preorder)
+ recover := f.Recover
+ if recover != nil {
+ lt.dfs(recover, prenum, preorder)
+ }
+
+ buckets := space[4*n : 5*n]
+ copy(buckets, preorder)
+
+ // In reverse preorder...
+ for i := int32(n) - 1; i > 0; i-- {
+ w := preorder[i]
+
+ // Step 3. Implicitly define the immediate dominator of each node.
+ for v := buckets[i]; v != w; v = buckets[v.dom.pre] {
+ u := lt.eval(v)
+ if lt.sdom[u.Index].dom.pre < i {
+ v.dom.idom = u
+ } else {
+ v.dom.idom = w
+ }
+ }
+
+ // Step 2. Compute the semidominators of all nodes.
+ lt.sdom[w.Index] = lt.parent[w.Index]
+ for _, v := range w.Preds {
+ u := lt.eval(v)
+ if lt.sdom[u.Index].dom.pre < lt.sdom[w.Index].dom.pre {
+ lt.sdom[w.Index] = lt.sdom[u.Index]
+ }
+ }
+
+ lt.link(lt.parent[w.Index], w)
+
+ if lt.parent[w.Index] == lt.sdom[w.Index] {
+ w.dom.idom = lt.parent[w.Index]
+ } else {
+ buckets[i] = buckets[lt.sdom[w.Index].dom.pre]
+ buckets[lt.sdom[w.Index].dom.pre] = w
+ }
+ }
+
+ // The final 'Step 3' is now outside the loop.
+ for v := buckets[0]; v != root; v = buckets[v.dom.pre] {
+ v.dom.idom = root
+ }
+
+ // Step 4. Explicitly define the immediate dominator of each
+ // node, in preorder.
+ for _, w := range preorder[1:] {
+ if w == root || w == recover {
+ w.dom.idom = nil
+ } else {
+ if w.dom.idom != lt.sdom[w.Index] {
+ w.dom.idom = w.dom.idom.dom.idom
+ }
+ // Calculate Children relation as inverse of Idom.
+ w.dom.idom.dom.children = append(w.dom.idom.dom.children, w)
+ }
+ }
+
+ pre, post := numberDomTree(root, 0, 0)
+ if recover != nil {
+ numberDomTree(recover, pre, post)
+ }
+
+ // printDomTreeDot(os.Stderr, f) // debugging
+ // printDomTreeText(os.Stderr, root, 0) // debugging
+
+ if f.Prog.mode&SanityCheckFunctions != 0 {
+ sanityCheckDomTree(f)
+ }
+}
+
+// numberDomTree sets the pre- and post-order numbers of a depth-first
+// traversal of the dominator tree rooted at v. These are used to
+// answer dominance queries in constant time.
+//
+func numberDomTree(v *BasicBlock, pre, post int32) (int32, int32) {
+ v.dom.pre = pre
+ pre++
+ for _, child := range v.dom.children {
+ pre, post = numberDomTree(child, pre, post)
+ }
+ v.dom.post = post
+ post++
+ return pre, post
+}
+
+// Testing utilities ----------------------------------------
+
+// sanityCheckDomTree checks the correctness of the dominator tree
+// computed by the LT algorithm by comparing against the dominance
+// relation computed by a naive Kildall-style forward dataflow
+// analysis (Algorithm 10.16 from the "Dragon" book).
+//
+func sanityCheckDomTree(f *Function) {
+ n := len(f.Blocks)
+
+ // D[i] is the set of blocks that dominate f.Blocks[i],
+ // represented as a bit-set of block indices.
+ D := make([]big.Int, n)
+
+ one := big.NewInt(1)
+
+ // all is the set of all blocks; constant.
+ var all big.Int
+ all.Set(one).Lsh(&all, uint(n)).Sub(&all, one)
+
+ // Initialization.
+ for i, b := range f.Blocks {
+ if i == 0 || b == f.Recover {
+ // A root is dominated only by itself.
+ D[i].SetBit(&D[0], 0, 1)
+ } else {
+ // All other blocks are (initially) dominated
+ // by every block.
+ D[i].Set(&all)
+ }
+ }
+
+ // Iteration until fixed point.
+ for changed := true; changed; {
+ changed = false
+ for i, b := range f.Blocks {
+ if i == 0 || b == f.Recover {
+ continue
+ }
+ // Compute intersection across predecessors.
+ var x big.Int
+ x.Set(&all)
+ for _, pred := range b.Preds {
+ x.And(&x, &D[pred.Index])
+ }
+ x.SetBit(&x, i, 1) // a block always dominates itself.
+ if D[i].Cmp(&x) != 0 {
+ D[i].Set(&x)
+ changed = true
+ }
+ }
+ }
+
+ // Check the entire relation. O(n^2).
+ // The Recover block (if any) must be treated specially so we skip it.
+ ok := true
+ for i := 0; i < n; i++ {
+ for j := 0; j < n; j++ {
+ b, c := f.Blocks[i], f.Blocks[j]
+ if c == f.Recover {
+ continue
+ }
+ actual := b.Dominates(c)
+ expected := D[j].Bit(i) == 1
+ if actual != expected {
+ fmt.Fprintf(os.Stderr, "dominates(%s, %s)==%t, want %t\n", b, c, actual, expected)
+ ok = false
+ }
+ }
+ }
+
+ preorder := f.DomPreorder()
+ for _, b := range f.Blocks {
+ if got := preorder[b.dom.pre]; got != b {
+ fmt.Fprintf(os.Stderr, "preorder[%d]==%s, want %s\n", b.dom.pre, got, b)
+ ok = false
+ }
+ }
+
+ if !ok {
+ panic("sanityCheckDomTree failed for " + f.String())
+ }
+
+}
+
+// Printing functions ----------------------------------------
+
+// printDomTree prints the dominator tree as text, using indentation.
+func printDomTreeText(buf *bytes.Buffer, v *BasicBlock, indent int) {
+ fmt.Fprintf(buf, "%*s%s\n", 4*indent, "", v)
+ for _, child := range v.dom.children {
+ printDomTreeText(buf, child, indent+1)
+ }
+}
+
+// printDomTreeDot prints the dominator tree of f in AT&T GraphViz
+// (.dot) format.
+func printDomTreeDot(buf *bytes.Buffer, f *Function) {
+ fmt.Fprintln(buf, "//", f)
+ fmt.Fprintln(buf, "digraph domtree {")
+ for i, b := range f.Blocks {
+ v := b.dom
+ fmt.Fprintf(buf, "\tn%d [label=\"%s (%d, %d)\",shape=\"rectangle\"];\n", v.pre, b, v.pre, v.post)
+ // TODO(adonovan): improve appearance of edges
+ // belonging to both dominator tree and CFG.
+
+ // Dominator tree edge.
+ if i != 0 {
+ fmt.Fprintf(buf, "\tn%d -> n%d [style=\"solid\",weight=100];\n", v.idom.dom.pre, v.pre)
+ }
+ // CFG edges.
+ for _, pred := range b.Preds {
+ fmt.Fprintf(buf, "\tn%d -> n%d [style=\"dotted\",weight=0];\n", pred.dom.pre, v.pre)
+ }
+ }
+ fmt.Fprintln(buf, "}")
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/emit.go b/vendor/golang.org/x/tools/go/ssa/emit.go
new file mode 100644
index 00000000000..1036988adcb
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/emit.go
@@ -0,0 +1,468 @@
+// 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 ssa
+
+// Helpers for emitting SSA instructions.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// emitNew emits to f a new (heap Alloc) instruction allocating an
+// object of type typ. pos is the optional source location.
+//
+func emitNew(f *Function, typ types.Type, pos token.Pos) *Alloc {
+ v := &Alloc{Heap: true}
+ v.setType(types.NewPointer(typ))
+ v.setPos(pos)
+ f.emit(v)
+ return v
+}
+
+// emitLoad emits to f an instruction to load the address addr into a
+// new temporary, and returns the value so defined.
+//
+func emitLoad(f *Function, addr Value) *UnOp {
+ v := &UnOp{Op: token.MUL, X: addr}
+ v.setType(deref(addr.Type()))
+ f.emit(v)
+ return v
+}
+
+// emitDebugRef emits to f a DebugRef pseudo-instruction associating
+// expression e with value v.
+//
+func emitDebugRef(f *Function, e ast.Expr, v Value, isAddr bool) {
+ if !f.debugInfo() {
+ return // debugging not enabled
+ }
+ if v == nil || e == nil {
+ panic("nil")
+ }
+ var obj types.Object
+ e = unparen(e)
+ if id, ok := e.(*ast.Ident); ok {
+ if isBlankIdent(id) {
+ return
+ }
+ obj = f.Pkg.objectOf(id)
+ switch obj.(type) {
+ case *types.Nil, *types.Const, *types.Builtin:
+ return
+ }
+ }
+ f.emit(&DebugRef{
+ X: v,
+ Expr: e,
+ IsAddr: isAddr,
+ object: obj,
+ })
+}
+
+// emitArith emits to f code to compute the binary operation op(x, y)
+// where op is an eager shift, logical or arithmetic operation.
+// (Use emitCompare() for comparisons and Builder.logicalBinop() for
+// non-eager operations.)
+//
+func emitArith(f *Function, op token.Token, x, y Value, t types.Type, pos token.Pos) Value {
+ switch op {
+ case token.SHL, token.SHR:
+ x = emitConv(f, x, t)
+ // y may be signed or an 'untyped' constant.
+ // TODO(adonovan): whence signed values?
+ if b, ok := y.Type().Underlying().(*types.Basic); ok && b.Info()&types.IsUnsigned == 0 {
+ y = emitConv(f, y, types.Typ[types.Uint64])
+ }
+
+ case token.ADD, token.SUB, token.MUL, token.QUO, token.REM, token.AND, token.OR, token.XOR, token.AND_NOT:
+ x = emitConv(f, x, t)
+ y = emitConv(f, y, t)
+
+ default:
+ panic("illegal op in emitArith: " + op.String())
+
+ }
+ v := &BinOp{
+ Op: op,
+ X: x,
+ Y: y,
+ }
+ v.setPos(pos)
+ v.setType(t)
+ return f.emit(v)
+}
+
+// emitCompare emits to f code compute the boolean result of
+// comparison comparison 'x op y'.
+//
+func emitCompare(f *Function, op token.Token, x, y Value, pos token.Pos) Value {
+ xt := x.Type().Underlying()
+ yt := y.Type().Underlying()
+
+ // Special case to optimise a tagless SwitchStmt so that
+ // these are equivalent
+ // switch { case e: ...}
+ // switch true { case e: ... }
+ // if e==true { ... }
+ // even in the case when e's type is an interface.
+ // TODO(adonovan): opt: generalise to x==true, false!=y, etc.
+ if x == vTrue && op == token.EQL {
+ if yt, ok := yt.(*types.Basic); ok && yt.Info()&types.IsBoolean != 0 {
+ return y
+ }
+ }
+
+ if types.Identical(xt, yt) {
+ // no conversion necessary
+ } else if _, ok := xt.(*types.Interface); ok {
+ y = emitConv(f, y, x.Type())
+ } else if _, ok := yt.(*types.Interface); ok {
+ x = emitConv(f, x, y.Type())
+ } else if _, ok := x.(*Const); ok {
+ x = emitConv(f, x, y.Type())
+ } else if _, ok := y.(*Const); ok {
+ y = emitConv(f, y, x.Type())
+ } else {
+ // other cases, e.g. channels. No-op.
+ }
+
+ v := &BinOp{
+ Op: op,
+ X: x,
+ Y: y,
+ }
+ v.setPos(pos)
+ v.setType(tBool)
+ return f.emit(v)
+}
+
+// isValuePreserving returns true if a conversion from ut_src to
+// ut_dst is value-preserving, i.e. just a change of type.
+// Precondition: neither argument is a named type.
+//
+func isValuePreserving(ut_src, ut_dst types.Type) bool {
+ // Identical underlying types?
+ if structTypesIdentical(ut_dst, ut_src) {
+ return true
+ }
+
+ switch ut_dst.(type) {
+ case *types.Chan:
+ // Conversion between channel types?
+ _, ok := ut_src.(*types.Chan)
+ return ok
+
+ case *types.Pointer:
+ // Conversion between pointers with identical base types?
+ _, ok := ut_src.(*types.Pointer)
+ return ok
+ }
+ return false
+}
+
+// emitConv emits to f code to convert Value val to exactly type typ,
+// and returns the converted value. Implicit conversions are required
+// by language assignability rules in assignments, parameter passing,
+// etc. Conversions cannot fail dynamically.
+//
+func emitConv(f *Function, val Value, typ types.Type) Value {
+ t_src := val.Type()
+
+ // Identical types? Conversion is a no-op.
+ if types.Identical(t_src, typ) {
+ return val
+ }
+
+ ut_dst := typ.Underlying()
+ ut_src := t_src.Underlying()
+
+ // Just a change of type, but not value or representation?
+ if isValuePreserving(ut_src, ut_dst) {
+ c := &ChangeType{X: val}
+ c.setType(typ)
+ return f.emit(c)
+ }
+
+ // Conversion to, or construction of a value of, an interface type?
+ if _, ok := ut_dst.(*types.Interface); ok {
+ // Assignment from one interface type to another?
+ if _, ok := ut_src.(*types.Interface); ok {
+ c := &ChangeInterface{X: val}
+ c.setType(typ)
+ return f.emit(c)
+ }
+
+ // Untyped nil constant? Return interface-typed nil constant.
+ if ut_src == tUntypedNil {
+ return nilConst(typ)
+ }
+
+ // Convert (non-nil) "untyped" literals to their default type.
+ if t, ok := ut_src.(*types.Basic); ok && t.Info()&types.IsUntyped != 0 {
+ val = emitConv(f, val, DefaultType(ut_src))
+ }
+
+ f.Pkg.Prog.needMethodsOf(val.Type())
+ mi := &MakeInterface{X: val}
+ mi.setType(typ)
+ return f.emit(mi)
+ }
+
+ // Conversion of a compile-time constant value?
+ if c, ok := val.(*Const); ok {
+ if _, ok := ut_dst.(*types.Basic); ok || c.IsNil() {
+ // Conversion of a compile-time constant to
+ // another constant type results in a new
+ // constant of the destination type and
+ // (initially) the same abstract value.
+ // We don't truncate the value yet.
+ return NewConst(c.Value, typ)
+ }
+
+ // We're converting from constant to non-constant type,
+ // e.g. string -> []byte/[]rune.
+ }
+
+ // A representation-changing conversion?
+ // At least one of {ut_src,ut_dst} must be *Basic.
+ // (The other may be []byte or []rune.)
+ _, ok1 := ut_src.(*types.Basic)
+ _, ok2 := ut_dst.(*types.Basic)
+ if ok1 || ok2 {
+ c := &Convert{X: val}
+ c.setType(typ)
+ return f.emit(c)
+ }
+
+ panic(fmt.Sprintf("in %s: cannot convert %s (%s) to %s", f, val, val.Type(), typ))
+}
+
+// emitStore emits to f an instruction to store value val at location
+// addr, applying implicit conversions as required by assignability rules.
+//
+func emitStore(f *Function, addr, val Value, pos token.Pos) *Store {
+ s := &Store{
+ Addr: addr,
+ Val: emitConv(f, val, deref(addr.Type())),
+ pos: pos,
+ }
+ f.emit(s)
+ return s
+}
+
+// emitJump emits to f a jump to target, and updates the control-flow graph.
+// Postcondition: f.currentBlock is nil.
+//
+func emitJump(f *Function, target *BasicBlock) {
+ b := f.currentBlock
+ b.emit(new(Jump))
+ addEdge(b, target)
+ f.currentBlock = nil
+}
+
+// emitIf emits to f a conditional jump to tblock or fblock based on
+// cond, and updates the control-flow graph.
+// Postcondition: f.currentBlock is nil.
+//
+func emitIf(f *Function, cond Value, tblock, fblock *BasicBlock) {
+ b := f.currentBlock
+ b.emit(&If{Cond: cond})
+ addEdge(b, tblock)
+ addEdge(b, fblock)
+ f.currentBlock = nil
+}
+
+// emitExtract emits to f an instruction to extract the index'th
+// component of tuple. It returns the extracted value.
+//
+func emitExtract(f *Function, tuple Value, index int) Value {
+ e := &Extract{Tuple: tuple, Index: index}
+ e.setType(tuple.Type().(*types.Tuple).At(index).Type())
+ return f.emit(e)
+}
+
+// emitTypeAssert emits to f a type assertion value := x.(t) and
+// returns the value. x.Type() must be an interface.
+//
+func emitTypeAssert(f *Function, x Value, t types.Type, pos token.Pos) Value {
+ a := &TypeAssert{X: x, AssertedType: t}
+ a.setPos(pos)
+ a.setType(t)
+ return f.emit(a)
+}
+
+// emitTypeTest emits to f a type test value,ok := x.(t) and returns
+// a (value, ok) tuple. x.Type() must be an interface.
+//
+func emitTypeTest(f *Function, x Value, t types.Type, pos token.Pos) Value {
+ a := &TypeAssert{
+ X: x,
+ AssertedType: t,
+ CommaOk: true,
+ }
+ a.setPos(pos)
+ a.setType(types.NewTuple(
+ newVar("value", t),
+ varOk,
+ ))
+ return f.emit(a)
+}
+
+// emitTailCall emits to f a function call in tail position. The
+// caller is responsible for all fields of 'call' except its type.
+// Intended for wrapper methods.
+// Precondition: f does/will not use deferred procedure calls.
+// Postcondition: f.currentBlock is nil.
+//
+func emitTailCall(f *Function, call *Call) {
+ tresults := f.Signature.Results()
+ nr := tresults.Len()
+ if nr == 1 {
+ call.typ = tresults.At(0).Type()
+ } else {
+ call.typ = tresults
+ }
+ tuple := f.emit(call)
+ var ret Return
+ switch nr {
+ case 0:
+ // no-op
+ case 1:
+ ret.Results = []Value{tuple}
+ default:
+ for i := 0; i < nr; i++ {
+ v := emitExtract(f, tuple, i)
+ // TODO(adonovan): in principle, this is required:
+ // v = emitConv(f, o.Type, f.Signature.Results[i].Type)
+ // but in practice emitTailCall is only used when
+ // the types exactly match.
+ ret.Results = append(ret.Results, v)
+ }
+ }
+ f.emit(&ret)
+ f.currentBlock = nil
+}
+
+// emitImplicitSelections emits to f code to apply the sequence of
+// implicit field selections specified by indices to base value v, and
+// returns the selected value.
+//
+// If v is the address of a struct, the result will be the address of
+// a field; if it is the value of a struct, the result will be the
+// value of a field.
+//
+func emitImplicitSelections(f *Function, v Value, indices []int) Value {
+ for _, index := range indices {
+ fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
+
+ if isPointer(v.Type()) {
+ instr := &FieldAddr{
+ X: v,
+ Field: index,
+ }
+ instr.setType(types.NewPointer(fld.Type()))
+ v = f.emit(instr)
+ // Load the field's value iff indirectly embedded.
+ if isPointer(fld.Type()) {
+ v = emitLoad(f, v)
+ }
+ } else {
+ instr := &Field{
+ X: v,
+ Field: index,
+ }
+ instr.setType(fld.Type())
+ v = f.emit(instr)
+ }
+ }
+ return v
+}
+
+// emitFieldSelection emits to f code to select the index'th field of v.
+//
+// If wantAddr, the input must be a pointer-to-struct and the result
+// will be the field's address; otherwise the result will be the
+// field's value.
+// Ident id is used for position and debug info.
+//
+func emitFieldSelection(f *Function, v Value, index int, wantAddr bool, id *ast.Ident) Value {
+ fld := deref(v.Type()).Underlying().(*types.Struct).Field(index)
+ if isPointer(v.Type()) {
+ instr := &FieldAddr{
+ X: v,
+ Field: index,
+ }
+ instr.setPos(id.Pos())
+ instr.setType(types.NewPointer(fld.Type()))
+ v = f.emit(instr)
+ // Load the field's value iff we don't want its address.
+ if !wantAddr {
+ v = emitLoad(f, v)
+ }
+ } else {
+ instr := &Field{
+ X: v,
+ Field: index,
+ }
+ instr.setPos(id.Pos())
+ instr.setType(fld.Type())
+ v = f.emit(instr)
+ }
+ emitDebugRef(f, id, v, wantAddr)
+ return v
+}
+
+// zeroValue emits to f code to produce a zero value of type t,
+// and returns it.
+//
+func zeroValue(f *Function, t types.Type) Value {
+ switch t.Underlying().(type) {
+ case *types.Struct, *types.Array:
+ return emitLoad(f, f.addLocal(t, token.NoPos))
+ default:
+ return zeroConst(t)
+ }
+}
+
+// createRecoverBlock emits to f a block of code to return after a
+// recovered panic, and sets f.Recover to it.
+//
+// If f's result parameters are named, the code loads and returns
+// their current values, otherwise it returns the zero values of their
+// type.
+//
+// Idempotent.
+//
+func createRecoverBlock(f *Function) {
+ if f.Recover != nil {
+ return // already created
+ }
+ saved := f.currentBlock
+
+ f.Recover = f.newBasicBlock("recover")
+ f.currentBlock = f.Recover
+
+ var results []Value
+ if f.namedResults != nil {
+ // Reload NRPs to form value tuple.
+ for _, r := range f.namedResults {
+ results = append(results, emitLoad(f, r))
+ }
+ } else {
+ R := f.Signature.Results()
+ for i, n := 0, R.Len(); i < n; i++ {
+ T := R.At(i).Type()
+
+ // Return zero value of each result type.
+ results = append(results, zeroValue(f, T))
+ }
+ }
+ f.emit(&Return{Results: results})
+
+ f.currentBlock = saved
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/func.go b/vendor/golang.org/x/tools/go/ssa/func.go
new file mode 100644
index 00000000000..b21ff4e521e
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/func.go
@@ -0,0 +1,689 @@
+// 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 ssa
+
+// This file implements the Function and BasicBlock types.
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "io"
+ "os"
+ "strings"
+)
+
+// addEdge adds a control-flow graph edge from from to to.
+func addEdge(from, to *BasicBlock) {
+ from.Succs = append(from.Succs, to)
+ to.Preds = append(to.Preds, from)
+}
+
+// Parent returns the function that contains block b.
+func (b *BasicBlock) Parent() *Function { return b.parent }
+
+// String returns a human-readable label of this block.
+// It is not guaranteed unique within the function.
+//
+func (b *BasicBlock) String() string {
+ return fmt.Sprintf("%d", b.Index)
+}
+
+// emit appends an instruction to the current basic block.
+// If the instruction defines a Value, it is returned.
+//
+func (b *BasicBlock) emit(i Instruction) Value {
+ i.setBlock(b)
+ b.Instrs = append(b.Instrs, i)
+ v, _ := i.(Value)
+ return v
+}
+
+// predIndex returns the i such that b.Preds[i] == c or panics if
+// there is none.
+func (b *BasicBlock) predIndex(c *BasicBlock) int {
+ for i, pred := range b.Preds {
+ if pred == c {
+ return i
+ }
+ }
+ panic(fmt.Sprintf("no edge %s -> %s", c, b))
+}
+
+// hasPhi returns true if b.Instrs contains φ-nodes.
+func (b *BasicBlock) hasPhi() bool {
+ _, ok := b.Instrs[0].(*Phi)
+ return ok
+}
+
+// phis returns the prefix of b.Instrs containing all the block's φ-nodes.
+func (b *BasicBlock) phis() []Instruction {
+ for i, instr := range b.Instrs {
+ if _, ok := instr.(*Phi); !ok {
+ return b.Instrs[:i]
+ }
+ }
+ return nil // unreachable in well-formed blocks
+}
+
+// replacePred replaces all occurrences of p in b's predecessor list with q.
+// Ordinarily there should be at most one.
+//
+func (b *BasicBlock) replacePred(p, q *BasicBlock) {
+ for i, pred := range b.Preds {
+ if pred == p {
+ b.Preds[i] = q
+ }
+ }
+}
+
+// replaceSucc replaces all occurrences of p in b's successor list with q.
+// Ordinarily there should be at most one.
+//
+func (b *BasicBlock) replaceSucc(p, q *BasicBlock) {
+ for i, succ := range b.Succs {
+ if succ == p {
+ b.Succs[i] = q
+ }
+ }
+}
+
+// removePred removes all occurrences of p in b's
+// predecessor list and φ-nodes.
+// Ordinarily there should be at most one.
+//
+func (b *BasicBlock) removePred(p *BasicBlock) {
+ phis := b.phis()
+
+ // We must preserve edge order for φ-nodes.
+ j := 0
+ for i, pred := range b.Preds {
+ if pred != p {
+ b.Preds[j] = b.Preds[i]
+ // Strike out φ-edge too.
+ for _, instr := range phis {
+ phi := instr.(*Phi)
+ phi.Edges[j] = phi.Edges[i]
+ }
+ j++
+ }
+ }
+ // Nil out b.Preds[j:] and φ-edges[j:] to aid GC.
+ for i := j; i < len(b.Preds); i++ {
+ b.Preds[i] = nil
+ for _, instr := range phis {
+ instr.(*Phi).Edges[i] = nil
+ }
+ }
+ b.Preds = b.Preds[:j]
+ for _, instr := range phis {
+ phi := instr.(*Phi)
+ phi.Edges = phi.Edges[:j]
+ }
+}
+
+// Destinations associated with unlabelled for/switch/select stmts.
+// We push/pop one of these as we enter/leave each construct and for
+// each BranchStmt we scan for the innermost target of the right type.
+//
+type targets struct {
+ tail *targets // rest of stack
+ _break *BasicBlock
+ _continue *BasicBlock
+ _fallthrough *BasicBlock
+}
+
+// Destinations associated with a labelled block.
+// We populate these as labels are encountered in forward gotos or
+// labelled statements.
+//
+type lblock struct {
+ _goto *BasicBlock
+ _break *BasicBlock
+ _continue *BasicBlock
+}
+
+// labelledBlock returns the branch target associated with the
+// specified label, creating it if needed.
+//
+func (f *Function) labelledBlock(label *ast.Ident) *lblock {
+ lb := f.lblocks[label.Obj]
+ if lb == nil {
+ lb = &lblock{_goto: f.newBasicBlock(label.Name)}
+ if f.lblocks == nil {
+ f.lblocks = make(map[*ast.Object]*lblock)
+ }
+ f.lblocks[label.Obj] = lb
+ }
+ return lb
+}
+
+// addParam adds a (non-escaping) parameter to f.Params of the
+// specified name, type and source position.
+//
+func (f *Function) addParam(name string, typ types.Type, pos token.Pos) *Parameter {
+ v := &Parameter{
+ name: name,
+ typ: typ,
+ pos: pos,
+ parent: f,
+ }
+ f.Params = append(f.Params, v)
+ return v
+}
+
+func (f *Function) addParamObj(obj types.Object) *Parameter {
+ name := obj.Name()
+ if name == "" {
+ name = fmt.Sprintf("arg%d", len(f.Params))
+ }
+ param := f.addParam(name, obj.Type(), obj.Pos())
+ param.object = obj
+ return param
+}
+
+// addSpilledParam declares a parameter that is pre-spilled to the
+// stack; the function body will load/store the spilled location.
+// Subsequent lifting will eliminate spills where possible.
+//
+func (f *Function) addSpilledParam(obj types.Object) {
+ param := f.addParamObj(obj)
+ spill := &Alloc{Comment: obj.Name()}
+ spill.setType(types.NewPointer(obj.Type()))
+ spill.setPos(obj.Pos())
+ f.objects[obj] = spill
+ f.Locals = append(f.Locals, spill)
+ f.emit(spill)
+ f.emit(&Store{Addr: spill, Val: param})
+}
+
+// startBody initializes the function prior to generating SSA code for its body.
+// Precondition: f.Type() already set.
+//
+func (f *Function) startBody() {
+ f.currentBlock = f.newBasicBlock("entry")
+ f.objects = make(map[types.Object]Value) // needed for some synthetics, e.g. init
+}
+
+// createSyntacticParams populates f.Params and generates code (spills
+// and named result locals) for all the parameters declared in the
+// syntax. In addition it populates the f.objects mapping.
+//
+// Preconditions:
+// f.startBody() was called.
+// Postcondition:
+// len(f.Params) == len(f.Signature.Params) + (f.Signature.Recv() ? 1 : 0)
+//
+func (f *Function) createSyntacticParams(recv *ast.FieldList, functype *ast.FuncType) {
+ // Receiver (at most one inner iteration).
+ if recv != nil {
+ for _, field := range recv.List {
+ for _, n := range field.Names {
+ f.addSpilledParam(f.Pkg.info.Defs[n])
+ }
+ // Anonymous receiver? No need to spill.
+ if field.Names == nil {
+ f.addParamObj(f.Signature.Recv())
+ }
+ }
+ }
+
+ // Parameters.
+ if functype.Params != nil {
+ n := len(f.Params) // 1 if has recv, 0 otherwise
+ for _, field := range functype.Params.List {
+ for _, n := range field.Names {
+ f.addSpilledParam(f.Pkg.info.Defs[n])
+ }
+ // Anonymous parameter? No need to spill.
+ if field.Names == nil {
+ f.addParamObj(f.Signature.Params().At(len(f.Params) - n))
+ }
+ }
+ }
+
+ // Named results.
+ if functype.Results != nil {
+ for _, field := range functype.Results.List {
+ // Implicit "var" decl of locals for named results.
+ for _, n := range field.Names {
+ f.namedResults = append(f.namedResults, f.addLocalForIdent(n))
+ }
+ }
+ }
+}
+
+// numberRegisters assigns numbers to all SSA registers
+// (value-defining Instructions) in f, to aid debugging.
+// (Non-Instruction Values are named at construction.)
+//
+func numberRegisters(f *Function) {
+ v := 0
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ switch instr.(type) {
+ case Value:
+ instr.(interface {
+ setNum(int)
+ }).setNum(v)
+ v++
+ }
+ }
+ }
+}
+
+// buildReferrers populates the def/use information in all non-nil
+// Value.Referrers slice.
+// Precondition: all such slices are initially empty.
+func buildReferrers(f *Function) {
+ var rands []*Value
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ rands = instr.Operands(rands[:0]) // recycle storage
+ for _, rand := range rands {
+ if r := *rand; r != nil {
+ if ref := r.Referrers(); ref != nil {
+ *ref = append(*ref, instr)
+ }
+ }
+ }
+ }
+ }
+}
+
+// finishBody() finalizes the function after SSA code generation of its body.
+func (f *Function) finishBody() {
+ f.objects = nil
+ f.currentBlock = nil
+ f.lblocks = nil
+
+ // Don't pin the AST in memory (except in debug mode).
+ if n := f.syntax; n != nil && !f.debugInfo() {
+ f.syntax = extentNode{n.Pos(), n.End()}
+ }
+
+ // Remove from f.Locals any Allocs that escape to the heap.
+ j := 0
+ for _, l := range f.Locals {
+ if !l.Heap {
+ f.Locals[j] = l
+ j++
+ }
+ }
+ // Nil out f.Locals[j:] to aid GC.
+ for i := j; i < len(f.Locals); i++ {
+ f.Locals[i] = nil
+ }
+ f.Locals = f.Locals[:j]
+
+ optimizeBlocks(f)
+
+ buildReferrers(f)
+
+ buildDomTree(f)
+
+ if f.Prog.mode&NaiveForm == 0 {
+ // For debugging pre-state of lifting pass:
+ // numberRegisters(f)
+ // f.WriteTo(os.Stderr)
+ lift(f)
+ }
+
+ f.namedResults = nil // (used by lifting)
+
+ numberRegisters(f)
+
+ if f.Prog.mode&PrintFunctions != 0 {
+ printMu.Lock()
+ f.WriteTo(os.Stdout)
+ printMu.Unlock()
+ }
+
+ if f.Prog.mode&SanityCheckFunctions != 0 {
+ mustSanityCheck(f, nil)
+ }
+}
+
+// removeNilBlocks eliminates nils from f.Blocks and updates each
+// BasicBlock.Index. Use this after any pass that may delete blocks.
+//
+func (f *Function) removeNilBlocks() {
+ j := 0
+ for _, b := range f.Blocks {
+ if b != nil {
+ b.Index = j
+ f.Blocks[j] = b
+ j++
+ }
+ }
+ // Nil out f.Blocks[j:] to aid GC.
+ for i := j; i < len(f.Blocks); i++ {
+ f.Blocks[i] = nil
+ }
+ f.Blocks = f.Blocks[:j]
+}
+
+// SetDebugMode sets the debug mode for package pkg. If true, all its
+// functions will include full debug info. This greatly increases the
+// size of the instruction stream, and causes Functions to depend upon
+// the ASTs, potentially keeping them live in memory for longer.
+//
+func (pkg *Package) SetDebugMode(debug bool) {
+ // TODO(adonovan): do we want ast.File granularity?
+ pkg.debug = debug
+}
+
+// debugInfo reports whether debug info is wanted for this function.
+func (f *Function) debugInfo() bool {
+ return f.Pkg != nil && f.Pkg.debug
+}
+
+// addNamedLocal creates a local variable, adds it to function f and
+// returns it. Its name and type are taken from obj. Subsequent
+// calls to f.lookup(obj) will return the same local.
+//
+func (f *Function) addNamedLocal(obj types.Object) *Alloc {
+ l := f.addLocal(obj.Type(), obj.Pos())
+ l.Comment = obj.Name()
+ f.objects[obj] = l
+ return l
+}
+
+func (f *Function) addLocalForIdent(id *ast.Ident) *Alloc {
+ return f.addNamedLocal(f.Pkg.info.Defs[id])
+}
+
+// addLocal creates an anonymous local variable of type typ, adds it
+// to function f and returns it. pos is the optional source location.
+//
+func (f *Function) addLocal(typ types.Type, pos token.Pos) *Alloc {
+ v := &Alloc{}
+ v.setType(types.NewPointer(typ))
+ v.setPos(pos)
+ f.Locals = append(f.Locals, v)
+ f.emit(v)
+ return v
+}
+
+// lookup returns the address of the named variable identified by obj
+// that is local to function f or one of its enclosing functions.
+// If escaping, the reference comes from a potentially escaping pointer
+// expression and the referent must be heap-allocated.
+//
+func (f *Function) lookup(obj types.Object, escaping bool) Value {
+ if v, ok := f.objects[obj]; ok {
+ if alloc, ok := v.(*Alloc); ok && escaping {
+ alloc.Heap = true
+ }
+ return v // function-local var (address)
+ }
+
+ // Definition must be in an enclosing function;
+ // plumb it through intervening closures.
+ if f.parent == nil {
+ panic("no ssa.Value for " + obj.String())
+ }
+ outer := f.parent.lookup(obj, true) // escaping
+ v := &FreeVar{
+ name: obj.Name(),
+ typ: outer.Type(),
+ pos: outer.Pos(),
+ outer: outer,
+ parent: f,
+ }
+ f.objects[obj] = v
+ f.FreeVars = append(f.FreeVars, v)
+ return v
+}
+
+// emit emits the specified instruction to function f.
+func (f *Function) emit(instr Instruction) Value {
+ return f.currentBlock.emit(instr)
+}
+
+// RelString returns the full name of this function, qualified by
+// package name, receiver type, etc.
+//
+// The specific formatting rules are not guaranteed and may change.
+//
+// Examples:
+// "math.IsNaN" // a package-level function
+// "(*bytes.Buffer).Bytes" // a declared method or a wrapper
+// "(*bytes.Buffer).Bytes$thunk" // thunk (func wrapping method; receiver is param 0)
+// "(*bytes.Buffer).Bytes$bound" // bound (func wrapping method; receiver supplied by closure)
+// "main.main$1" // an anonymous function in main
+// "main.init#1" // a declared init function
+// "main.init" // the synthesized package initializer
+//
+// When these functions are referred to from within the same package
+// (i.e. from == f.Pkg.Object), they are rendered without the package path.
+// For example: "IsNaN", "(*Buffer).Bytes", etc.
+//
+// All non-synthetic functions have distinct package-qualified names.
+// (But two methods may have the same name "(T).f" if one is a synthetic
+// wrapper promoting a non-exported method "f" from another package; in
+// that case, the strings are equal but the identifiers "f" are distinct.)
+//
+func (f *Function) RelString(from *types.Package) string {
+ // Anonymous?
+ if f.parent != nil {
+ // An anonymous function's Name() looks like "parentName$1",
+ // but its String() should include the type/package/etc.
+ parent := f.parent.RelString(from)
+ for i, anon := range f.parent.AnonFuncs {
+ if anon == f {
+ return fmt.Sprintf("%s$%d", parent, 1+i)
+ }
+ }
+
+ return f.name // should never happen
+ }
+
+ // Method (declared or wrapper)?
+ if recv := f.Signature.Recv(); recv != nil {
+ return f.relMethod(from, recv.Type())
+ }
+
+ // Thunk?
+ if f.method != nil {
+ return f.relMethod(from, f.method.Recv())
+ }
+
+ // Bound?
+ if len(f.FreeVars) == 1 && strings.HasSuffix(f.name, "$bound") {
+ return f.relMethod(from, f.FreeVars[0].Type())
+ }
+
+ // Package-level function?
+ // Prefix with package name for cross-package references only.
+ if p := f.pkg(); p != nil && p != from {
+ return fmt.Sprintf("%s.%s", p.Path(), f.name)
+ }
+
+ // Unknown.
+ return f.name
+}
+
+func (f *Function) relMethod(from *types.Package, recv types.Type) string {
+ return fmt.Sprintf("(%s).%s", relType(recv, from), f.name)
+}
+
+// writeSignature writes to buf the signature sig in declaration syntax.
+func writeSignature(buf *bytes.Buffer, from *types.Package, name string, sig *types.Signature, params []*Parameter) {
+ buf.WriteString("func ")
+ if recv := sig.Recv(); recv != nil {
+ buf.WriteString("(")
+ if n := params[0].Name(); n != "" {
+ buf.WriteString(n)
+ buf.WriteString(" ")
+ }
+ types.WriteType(buf, params[0].Type(), types.RelativeTo(from))
+ buf.WriteString(") ")
+ }
+ buf.WriteString(name)
+ types.WriteSignature(buf, sig, types.RelativeTo(from))
+}
+
+func (f *Function) pkg() *types.Package {
+ if f.Pkg != nil {
+ return f.Pkg.Pkg
+ }
+ return nil
+}
+
+var _ io.WriterTo = (*Function)(nil) // *Function implements io.Writer
+
+func (f *Function) WriteTo(w io.Writer) (int64, error) {
+ var buf bytes.Buffer
+ WriteFunction(&buf, f)
+ n, err := w.Write(buf.Bytes())
+ return int64(n), err
+}
+
+// WriteFunction writes to buf a human-readable "disassembly" of f.
+func WriteFunction(buf *bytes.Buffer, f *Function) {
+ fmt.Fprintf(buf, "# Name: %s\n", f.String())
+ if f.Pkg != nil {
+ fmt.Fprintf(buf, "# Package: %s\n", f.Pkg.Pkg.Path())
+ }
+ if syn := f.Synthetic; syn != "" {
+ fmt.Fprintln(buf, "# Synthetic:", syn)
+ }
+ if pos := f.Pos(); pos.IsValid() {
+ fmt.Fprintf(buf, "# Location: %s\n", f.Prog.Fset.Position(pos))
+ }
+
+ if f.parent != nil {
+ fmt.Fprintf(buf, "# Parent: %s\n", f.parent.Name())
+ }
+
+ if f.Recover != nil {
+ fmt.Fprintf(buf, "# Recover: %s\n", f.Recover)
+ }
+
+ from := f.pkg()
+
+ if f.FreeVars != nil {
+ buf.WriteString("# Free variables:\n")
+ for i, fv := range f.FreeVars {
+ fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, fv.Name(), relType(fv.Type(), from))
+ }
+ }
+
+ if len(f.Locals) > 0 {
+ buf.WriteString("# Locals:\n")
+ for i, l := range f.Locals {
+ fmt.Fprintf(buf, "# % 3d:\t%s %s\n", i, l.Name(), relType(deref(l.Type()), from))
+ }
+ }
+ writeSignature(buf, from, f.Name(), f.Signature, f.Params)
+ buf.WriteString(":\n")
+
+ if f.Blocks == nil {
+ buf.WriteString("\t(external)\n")
+ }
+
+ // NB. column calculations are confused by non-ASCII
+ // characters and assume 8-space tabs.
+ const punchcard = 80 // for old time's sake.
+ const tabwidth = 8
+ for _, b := range f.Blocks {
+ if b == nil {
+ // Corrupt CFG.
+ fmt.Fprintf(buf, ".nil:\n")
+ continue
+ }
+ n, _ := fmt.Fprintf(buf, "%d:", b.Index)
+ bmsg := fmt.Sprintf("%s P:%d S:%d", b.Comment, len(b.Preds), len(b.Succs))
+ fmt.Fprintf(buf, "%*s%s\n", punchcard-1-n-len(bmsg), "", bmsg)
+
+ if false { // CFG debugging
+ fmt.Fprintf(buf, "\t# CFG: %s --> %s --> %s\n", b.Preds, b, b.Succs)
+ }
+ for _, instr := range b.Instrs {
+ buf.WriteString("\t")
+ switch v := instr.(type) {
+ case Value:
+ l := punchcard - tabwidth
+ // Left-align the instruction.
+ if name := v.Name(); name != "" {
+ n, _ := fmt.Fprintf(buf, "%s = ", name)
+ l -= n
+ }
+ n, _ := buf.WriteString(instr.String())
+ l -= n
+ // Right-align the type if there's space.
+ if t := v.Type(); t != nil {
+ buf.WriteByte(' ')
+ ts := relType(t, from)
+ l -= len(ts) + len(" ") // (spaces before and after type)
+ if l > 0 {
+ fmt.Fprintf(buf, "%*s", l, "")
+ }
+ buf.WriteString(ts)
+ }
+ case nil:
+ // Be robust against bad transforms.
+ buf.WriteString("")
+ default:
+ buf.WriteString(instr.String())
+ }
+ buf.WriteString("\n")
+ }
+ }
+ fmt.Fprintf(buf, "\n")
+}
+
+// newBasicBlock adds to f a new basic block and returns it. It does
+// not automatically become the current block for subsequent calls to emit.
+// comment is an optional string for more readable debugging output.
+//
+func (f *Function) newBasicBlock(comment string) *BasicBlock {
+ b := &BasicBlock{
+ Index: len(f.Blocks),
+ Comment: comment,
+ parent: f,
+ }
+ b.Succs = b.succs2[:0]
+ f.Blocks = append(f.Blocks, b)
+ return b
+}
+
+// NewFunction returns a new synthetic Function instance belonging to
+// prog, with its name and signature fields set as specified.
+//
+// The caller is responsible for initializing the remaining fields of
+// the function object, e.g. Pkg, Params, Blocks.
+//
+// It is practically impossible for clients to construct well-formed
+// SSA functions/packages/programs directly, so we assume this is the
+// job of the Builder alone. NewFunction exists to provide clients a
+// little flexibility. For example, analysis tools may wish to
+// construct fake Functions for the root of the callgraph, a fake
+// "reflect" package, etc.
+//
+// TODO(adonovan): think harder about the API here.
+//
+func (prog *Program) NewFunction(name string, sig *types.Signature, provenance string) *Function {
+ return &Function{Prog: prog, name: name, Signature: sig, Synthetic: provenance}
+}
+
+type extentNode [2]token.Pos
+
+func (n extentNode) Pos() token.Pos { return n[0] }
+func (n extentNode) End() token.Pos { return n[1] }
+
+// Syntax returns an ast.Node whose Pos/End methods provide the
+// lexical extent of the function if it was defined by Go source code
+// (f.Synthetic==""), or nil otherwise.
+//
+// If f was built with debug information (see Package.SetDebugRef),
+// the result is the *ast.FuncDecl or *ast.FuncLit that declared the
+// function. Otherwise, it is an opaque Node providing only position
+// information; this avoids pinning the AST in memory.
+//
+func (f *Function) Syntax() ast.Node { return f.syntax }
diff --git a/vendor/golang.org/x/tools/go/ssa/identical.go b/vendor/golang.org/x/tools/go/ssa/identical.go
new file mode 100644
index 00000000000..53cbee107b6
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/identical.go
@@ -0,0 +1,7 @@
+// +build go1.8
+
+package ssa
+
+import "go/types"
+
+var structTypesIdentical = types.IdenticalIgnoreTags
diff --git a/vendor/golang.org/x/tools/go/ssa/identical_17.go b/vendor/golang.org/x/tools/go/ssa/identical_17.go
new file mode 100644
index 00000000000..da89d3339a5
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/identical_17.go
@@ -0,0 +1,7 @@
+// +build !go1.8
+
+package ssa
+
+import "go/types"
+
+var structTypesIdentical = types.Identical
diff --git a/vendor/golang.org/x/tools/go/ssa/lift.go b/vendor/golang.org/x/tools/go/ssa/lift.go
new file mode 100644
index 00000000000..048e9b03260
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/lift.go
@@ -0,0 +1,653 @@
+// 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 ssa
+
+// This file defines the lifting pass which tries to "lift" Alloc
+// cells (new/local variables) into SSA registers, replacing loads
+// with the dominating stored value, eliminating loads and stores, and
+// inserting φ-nodes as needed.
+
+// Cited papers and resources:
+//
+// Ron Cytron et al. 1991. Efficiently computing SSA form...
+// http://doi.acm.org/10.1145/115372.115320
+//
+// Cooper, Harvey, Kennedy. 2001. A Simple, Fast Dominance Algorithm.
+// Software Practice and Experience 2001, 4:1-10.
+// http://www.hipersoft.rice.edu/grads/publications/dom14.pdf
+//
+// Daniel Berlin, llvmdev mailing list, 2012.
+// http://lists.cs.uiuc.edu/pipermail/llvmdev/2012-January/046638.html
+// (Be sure to expand the whole thread.)
+
+// TODO(adonovan): opt: there are many optimizations worth evaluating, and
+// the conventional wisdom for SSA construction is that a simple
+// algorithm well engineered often beats those of better asymptotic
+// complexity on all but the most egregious inputs.
+//
+// Danny Berlin suggests that the Cooper et al. algorithm for
+// computing the dominance frontier is superior to Cytron et al.
+// Furthermore he recommends that rather than computing the DF for the
+// whole function then renaming all alloc cells, it may be cheaper to
+// compute the DF for each alloc cell separately and throw it away.
+//
+// Consider exploiting liveness information to avoid creating dead
+// φ-nodes which we then immediately remove.
+//
+// Also see many other "TODO: opt" suggestions in the code.
+
+import (
+ "fmt"
+ "go/token"
+ "go/types"
+ "math/big"
+ "os"
+)
+
+// If true, show diagnostic information at each step of lifting.
+// Very verbose.
+const debugLifting = false
+
+// domFrontier maps each block to the set of blocks in its dominance
+// frontier. The outer slice is conceptually a map keyed by
+// Block.Index. The inner slice is conceptually a set, possibly
+// containing duplicates.
+//
+// TODO(adonovan): opt: measure impact of dups; consider a packed bit
+// representation, e.g. big.Int, and bitwise parallel operations for
+// the union step in the Children loop.
+//
+// domFrontier's methods mutate the slice's elements but not its
+// length, so their receivers needn't be pointers.
+//
+type domFrontier [][]*BasicBlock
+
+func (df domFrontier) add(u, v *BasicBlock) {
+ p := &df[u.Index]
+ *p = append(*p, v)
+}
+
+// build builds the dominance frontier df for the dominator (sub)tree
+// rooted at u, using the Cytron et al. algorithm.
+//
+// TODO(adonovan): opt: consider Berlin approach, computing pruned SSA
+// by pruning the entire IDF computation, rather than merely pruning
+// the DF -> IDF step.
+func (df domFrontier) build(u *BasicBlock) {
+ // Encounter each node u in postorder of dom tree.
+ for _, child := range u.dom.children {
+ df.build(child)
+ }
+ for _, vb := range u.Succs {
+ if v := vb.dom; v.idom != u {
+ df.add(u, vb)
+ }
+ }
+ for _, w := range u.dom.children {
+ for _, vb := range df[w.Index] {
+ // TODO(adonovan): opt: use word-parallel bitwise union.
+ if v := vb.dom; v.idom != u {
+ df.add(u, vb)
+ }
+ }
+ }
+}
+
+func buildDomFrontier(fn *Function) domFrontier {
+ df := make(domFrontier, len(fn.Blocks))
+ df.build(fn.Blocks[0])
+ if fn.Recover != nil {
+ df.build(fn.Recover)
+ }
+ return df
+}
+
+func removeInstr(refs []Instruction, instr Instruction) []Instruction {
+ i := 0
+ for _, ref := range refs {
+ if ref == instr {
+ continue
+ }
+ refs[i] = ref
+ i++
+ }
+ for j := i; j != len(refs); j++ {
+ refs[j] = nil // aid GC
+ }
+ return refs[:i]
+}
+
+// lift replaces local and new Allocs accessed only with
+// load/store by SSA registers, inserting φ-nodes where necessary.
+// The result is a program in classical pruned SSA form.
+//
+// Preconditions:
+// - fn has no dead blocks (blockopt has run).
+// - Def/use info (Operands and Referrers) is up-to-date.
+// - The dominator tree is up-to-date.
+//
+func lift(fn *Function) {
+ // TODO(adonovan): opt: lots of little optimizations may be
+ // worthwhile here, especially if they cause us to avoid
+ // buildDomFrontier. For example:
+ //
+ // - Alloc never loaded? Eliminate.
+ // - Alloc never stored? Replace all loads with a zero constant.
+ // - Alloc stored once? Replace loads with dominating store;
+ // don't forget that an Alloc is itself an effective store
+ // of zero.
+ // - Alloc used only within a single block?
+ // Use degenerate algorithm avoiding φ-nodes.
+ // - Consider synergy with scalar replacement of aggregates (SRA).
+ // e.g. *(&x.f) where x is an Alloc.
+ // Perhaps we'd get better results if we generated this as x.f
+ // i.e. Field(x, .f) instead of Load(FieldIndex(x, .f)).
+ // Unclear.
+ //
+ // But we will start with the simplest correct code.
+ df := buildDomFrontier(fn)
+
+ if debugLifting {
+ title := false
+ for i, blocks := range df {
+ if blocks != nil {
+ if !title {
+ fmt.Fprintf(os.Stderr, "Dominance frontier of %s:\n", fn)
+ title = true
+ }
+ fmt.Fprintf(os.Stderr, "\t%s: %s\n", fn.Blocks[i], blocks)
+ }
+ }
+ }
+
+ newPhis := make(newPhiMap)
+
+ // During this pass we will replace some BasicBlock.Instrs
+ // (allocs, loads and stores) with nil, keeping a count in
+ // BasicBlock.gaps. At the end we will reset Instrs to the
+ // concatenation of all non-dead newPhis and non-nil Instrs
+ // for the block, reusing the original array if space permits.
+
+ // While we're here, we also eliminate 'rundefers'
+ // instructions in functions that contain no 'defer'
+ // instructions.
+ usesDefer := false
+
+ // A counter used to generate ~unique ids for Phi nodes, as an
+ // aid to debugging. We use large numbers to make them highly
+ // visible. All nodes are renumbered later.
+ fresh := 1000
+
+ // Determine which allocs we can lift and number them densely.
+ // The renaming phase uses this numbering for compact maps.
+ numAllocs := 0
+ for _, b := range fn.Blocks {
+ b.gaps = 0
+ b.rundefers = 0
+ for _, instr := range b.Instrs {
+ switch instr := instr.(type) {
+ case *Alloc:
+ index := -1
+ if liftAlloc(df, instr, newPhis, &fresh) {
+ index = numAllocs
+ numAllocs++
+ }
+ instr.index = index
+ case *Defer:
+ usesDefer = true
+ case *RunDefers:
+ b.rundefers++
+ }
+ }
+ }
+
+ // renaming maps an alloc (keyed by index) to its replacement
+ // value. Initially the renaming contains nil, signifying the
+ // zero constant of the appropriate type; we construct the
+ // Const lazily at most once on each path through the domtree.
+ // TODO(adonovan): opt: cache per-function not per subtree.
+ renaming := make([]Value, numAllocs)
+
+ // Renaming.
+ rename(fn.Blocks[0], renaming, newPhis)
+
+ // Eliminate dead φ-nodes.
+ removeDeadPhis(fn.Blocks, newPhis)
+
+ // Prepend remaining live φ-nodes to each block.
+ for _, b := range fn.Blocks {
+ nps := newPhis[b]
+ j := len(nps)
+
+ rundefersToKill := b.rundefers
+ if usesDefer {
+ rundefersToKill = 0
+ }
+
+ if j+b.gaps+rundefersToKill == 0 {
+ continue // fast path: no new phis or gaps
+ }
+
+ // Compact nps + non-nil Instrs into a new slice.
+ // TODO(adonovan): opt: compact in situ (rightwards)
+ // if Instrs has sufficient space or slack.
+ dst := make([]Instruction, len(b.Instrs)+j-b.gaps-rundefersToKill)
+ for i, np := range nps {
+ dst[i] = np.phi
+ }
+ for _, instr := range b.Instrs {
+ if instr == nil {
+ continue
+ }
+ if !usesDefer {
+ if _, ok := instr.(*RunDefers); ok {
+ continue
+ }
+ }
+ dst[j] = instr
+ j++
+ }
+ b.Instrs = dst
+ }
+
+ // Remove any fn.Locals that were lifted.
+ j := 0
+ for _, l := range fn.Locals {
+ if l.index < 0 {
+ fn.Locals[j] = l
+ j++
+ }
+ }
+ // Nil out fn.Locals[j:] to aid GC.
+ for i := j; i < len(fn.Locals); i++ {
+ fn.Locals[i] = nil
+ }
+ fn.Locals = fn.Locals[:j]
+}
+
+// removeDeadPhis removes φ-nodes not transitively needed by a
+// non-Phi, non-DebugRef instruction.
+func removeDeadPhis(blocks []*BasicBlock, newPhis newPhiMap) {
+ // First pass: find the set of "live" φ-nodes: those reachable
+ // from some non-Phi instruction.
+ //
+ // We compute reachability in reverse, starting from each φ,
+ // rather than forwards, starting from each live non-Phi
+ // instruction, because this way visits much less of the
+ // Value graph.
+ livePhis := make(map[*Phi]bool)
+ for _, npList := range newPhis {
+ for _, np := range npList {
+ phi := np.phi
+ if !livePhis[phi] && phiHasDirectReferrer(phi) {
+ markLivePhi(livePhis, phi)
+ }
+ }
+ }
+
+ // Existing φ-nodes due to && and || operators
+ // are all considered live (see Go issue 19622).
+ for _, b := range blocks {
+ for _, phi := range b.phis() {
+ markLivePhi(livePhis, phi.(*Phi))
+ }
+ }
+
+ // Second pass: eliminate unused phis from newPhis.
+ for block, npList := range newPhis {
+ j := 0
+ for _, np := range npList {
+ if livePhis[np.phi] {
+ npList[j] = np
+ j++
+ } else {
+ // discard it, first removing it from referrers
+ for _, val := range np.phi.Edges {
+ if refs := val.Referrers(); refs != nil {
+ *refs = removeInstr(*refs, np.phi)
+ }
+ }
+ np.phi.block = nil
+ }
+ }
+ newPhis[block] = npList[:j]
+ }
+}
+
+// markLivePhi marks phi, and all φ-nodes transitively reachable via
+// its Operands, live.
+func markLivePhi(livePhis map[*Phi]bool, phi *Phi) {
+ livePhis[phi] = true
+ for _, rand := range phi.Operands(nil) {
+ if q, ok := (*rand).(*Phi); ok {
+ if !livePhis[q] {
+ markLivePhi(livePhis, q)
+ }
+ }
+ }
+}
+
+// phiHasDirectReferrer reports whether phi is directly referred to by
+// a non-Phi instruction. Such instructions are the
+// roots of the liveness traversal.
+func phiHasDirectReferrer(phi *Phi) bool {
+ for _, instr := range *phi.Referrers() {
+ if _, ok := instr.(*Phi); !ok {
+ return true
+ }
+ }
+ return false
+}
+
+type blockSet struct{ big.Int } // (inherit methods from Int)
+
+// add adds b to the set and returns true if the set changed.
+func (s *blockSet) add(b *BasicBlock) bool {
+ i := b.Index
+ if s.Bit(i) != 0 {
+ return false
+ }
+ s.SetBit(&s.Int, i, 1)
+ return true
+}
+
+// take removes an arbitrary element from a set s and
+// returns its index, or returns -1 if empty.
+func (s *blockSet) take() int {
+ l := s.BitLen()
+ for i := 0; i < l; i++ {
+ if s.Bit(i) == 1 {
+ s.SetBit(&s.Int, i, 0)
+ return i
+ }
+ }
+ return -1
+}
+
+// newPhi is a pair of a newly introduced φ-node and the lifted Alloc
+// it replaces.
+type newPhi struct {
+ phi *Phi
+ alloc *Alloc
+}
+
+// newPhiMap records for each basic block, the set of newPhis that
+// must be prepended to the block.
+type newPhiMap map[*BasicBlock][]newPhi
+
+// liftAlloc determines whether alloc can be lifted into registers,
+// and if so, it populates newPhis with all the φ-nodes it may require
+// and returns true.
+//
+// fresh is a source of fresh ids for phi nodes.
+//
+func liftAlloc(df domFrontier, alloc *Alloc, newPhis newPhiMap, fresh *int) bool {
+ // Don't lift aggregates into registers, because we don't have
+ // a way to express their zero-constants.
+ switch deref(alloc.Type()).Underlying().(type) {
+ case *types.Array, *types.Struct:
+ return false
+ }
+
+ // Don't lift named return values in functions that defer
+ // calls that may recover from panic.
+ if fn := alloc.Parent(); fn.Recover != nil {
+ for _, nr := range fn.namedResults {
+ if nr == alloc {
+ return false
+ }
+ }
+ }
+
+ // Compute defblocks, the set of blocks containing a
+ // definition of the alloc cell.
+ var defblocks blockSet
+ for _, instr := range *alloc.Referrers() {
+ // Bail out if we discover the alloc is not liftable;
+ // the only operations permitted to use the alloc are
+ // loads/stores into the cell, and DebugRef.
+ switch instr := instr.(type) {
+ case *Store:
+ if instr.Val == alloc {
+ return false // address used as value
+ }
+ if instr.Addr != alloc {
+ panic("Alloc.Referrers is inconsistent")
+ }
+ defblocks.add(instr.Block())
+ case *UnOp:
+ if instr.Op != token.MUL {
+ return false // not a load
+ }
+ if instr.X != alloc {
+ panic("Alloc.Referrers is inconsistent")
+ }
+ case *DebugRef:
+ // ok
+ default:
+ return false // some other instruction
+ }
+ }
+ // The Alloc itself counts as a (zero) definition of the cell.
+ defblocks.add(alloc.Block())
+
+ if debugLifting {
+ fmt.Fprintln(os.Stderr, "\tlifting ", alloc, alloc.Name())
+ }
+
+ fn := alloc.Parent()
+
+ // Φ-insertion.
+ //
+ // What follows is the body of the main loop of the insert-φ
+ // function described by Cytron et al, but instead of using
+ // counter tricks, we just reset the 'hasAlready' and 'work'
+ // sets each iteration. These are bitmaps so it's pretty cheap.
+ //
+ // TODO(adonovan): opt: recycle slice storage for W,
+ // hasAlready, defBlocks across liftAlloc calls.
+ var hasAlready blockSet
+
+ // Initialize W and work to defblocks.
+ var work blockSet = defblocks // blocks seen
+ var W blockSet // blocks to do
+ W.Set(&defblocks.Int)
+
+ // Traverse iterated dominance frontier, inserting φ-nodes.
+ for i := W.take(); i != -1; i = W.take() {
+ u := fn.Blocks[i]
+ for _, v := range df[u.Index] {
+ if hasAlready.add(v) {
+ // Create φ-node.
+ // It will be prepended to v.Instrs later, if needed.
+ phi := &Phi{
+ Edges: make([]Value, len(v.Preds)),
+ Comment: alloc.Comment,
+ }
+ // This is merely a debugging aid:
+ phi.setNum(*fresh)
+ *fresh++
+
+ phi.pos = alloc.Pos()
+ phi.setType(deref(alloc.Type()))
+ phi.block = v
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tplace %s = %s at block %s\n", phi.Name(), phi, v)
+ }
+ newPhis[v] = append(newPhis[v], newPhi{phi, alloc})
+
+ if work.add(v) {
+ W.add(v)
+ }
+ }
+ }
+ }
+
+ return true
+}
+
+// replaceAll replaces all intraprocedural uses of x with y,
+// updating x.Referrers and y.Referrers.
+// Precondition: x.Referrers() != nil, i.e. x must be local to some function.
+//
+func replaceAll(x, y Value) {
+ var rands []*Value
+ pxrefs := x.Referrers()
+ pyrefs := y.Referrers()
+ for _, instr := range *pxrefs {
+ rands = instr.Operands(rands[:0]) // recycle storage
+ for _, rand := range rands {
+ if *rand != nil {
+ if *rand == x {
+ *rand = y
+ }
+ }
+ }
+ if pyrefs != nil {
+ *pyrefs = append(*pyrefs, instr) // dups ok
+ }
+ }
+ *pxrefs = nil // x is now unreferenced
+}
+
+// renamed returns the value to which alloc is being renamed,
+// constructing it lazily if it's the implicit zero initialization.
+//
+func renamed(renaming []Value, alloc *Alloc) Value {
+ v := renaming[alloc.index]
+ if v == nil {
+ v = zeroConst(deref(alloc.Type()))
+ renaming[alloc.index] = v
+ }
+ return v
+}
+
+// rename implements the (Cytron et al) SSA renaming algorithm, a
+// preorder traversal of the dominator tree replacing all loads of
+// Alloc cells with the value stored to that cell by the dominating
+// store instruction. For lifting, we need only consider loads,
+// stores and φ-nodes.
+//
+// renaming is a map from *Alloc (keyed by index number) to its
+// dominating stored value; newPhis[x] is the set of new φ-nodes to be
+// prepended to block x.
+//
+func rename(u *BasicBlock, renaming []Value, newPhis newPhiMap) {
+ // Each φ-node becomes the new name for its associated Alloc.
+ for _, np := range newPhis[u] {
+ phi := np.phi
+ alloc := np.alloc
+ renaming[alloc.index] = phi
+ }
+
+ // Rename loads and stores of allocs.
+ for i, instr := range u.Instrs {
+ switch instr := instr.(type) {
+ case *Alloc:
+ if instr.index >= 0 { // store of zero to Alloc cell
+ // Replace dominated loads by the zero value.
+ renaming[instr.index] = nil
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tkill alloc %s\n", instr)
+ }
+ // Delete the Alloc.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+
+ case *Store:
+ if alloc, ok := instr.Addr.(*Alloc); ok && alloc.index >= 0 { // store to Alloc cell
+ // Replace dominated loads by the stored value.
+ renaming[alloc.index] = instr.Val
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tkill store %s; new value: %s\n",
+ instr, instr.Val.Name())
+ }
+ // Remove the store from the referrer list of the stored value.
+ if refs := instr.Val.Referrers(); refs != nil {
+ *refs = removeInstr(*refs, instr)
+ }
+ // Delete the Store.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+
+ case *UnOp:
+ if instr.Op == token.MUL {
+ if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // load of Alloc cell
+ newval := renamed(renaming, alloc)
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tupdate load %s = %s with %s\n",
+ instr.Name(), instr, newval.Name())
+ }
+ // Replace all references to
+ // the loaded value by the
+ // dominating stored value.
+ replaceAll(instr, newval)
+ // Delete the Load.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+ }
+
+ case *DebugRef:
+ if alloc, ok := instr.X.(*Alloc); ok && alloc.index >= 0 { // ref of Alloc cell
+ if instr.IsAddr {
+ instr.X = renamed(renaming, alloc)
+ instr.IsAddr = false
+
+ // Add DebugRef to instr.X's referrers.
+ if refs := instr.X.Referrers(); refs != nil {
+ *refs = append(*refs, instr)
+ }
+ } else {
+ // A source expression denotes the address
+ // of an Alloc that was optimized away.
+ instr.X = nil
+
+ // Delete the DebugRef.
+ u.Instrs[i] = nil
+ u.gaps++
+ }
+ }
+ }
+ }
+
+ // For each φ-node in a CFG successor, rename the edge.
+ for _, v := range u.Succs {
+ phis := newPhis[v]
+ if len(phis) == 0 {
+ continue
+ }
+ i := v.predIndex(u)
+ for _, np := range phis {
+ phi := np.phi
+ alloc := np.alloc
+ newval := renamed(renaming, alloc)
+ if debugLifting {
+ fmt.Fprintf(os.Stderr, "\tsetphi %s edge %s -> %s (#%d) (alloc=%s) := %s\n",
+ phi.Name(), u, v, i, alloc.Name(), newval.Name())
+ }
+ phi.Edges[i] = newval
+ if prefs := newval.Referrers(); prefs != nil {
+ *prefs = append(*prefs, phi)
+ }
+ }
+ }
+
+ // Continue depth-first recursion over domtree, pushing a
+ // fresh copy of the renaming map for each subtree.
+ for i, v := range u.dom.children {
+ r := renaming
+ if i < len(u.dom.children)-1 {
+ // On all but the final iteration, we must make
+ // a copy to avoid destructive update.
+ r = make([]Value, len(renaming))
+ copy(r, renaming)
+ }
+ rename(v, r, newPhis)
+ }
+
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/lvalue.go b/vendor/golang.org/x/tools/go/ssa/lvalue.go
new file mode 100644
index 00000000000..4d85be3ec78
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/lvalue.go
@@ -0,0 +1,120 @@
+// 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 ssa
+
+// lvalues are the union of addressable expressions and map-index
+// expressions.
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// An lvalue represents an assignable location that may appear on the
+// left-hand side of an assignment. This is a generalization of a
+// pointer to permit updates to elements of maps.
+//
+type lvalue interface {
+ store(fn *Function, v Value) // stores v into the location
+ load(fn *Function) Value // loads the contents of the location
+ address(fn *Function) Value // address of the location
+ typ() types.Type // returns the type of the location
+}
+
+// An address is an lvalue represented by a true pointer.
+type address struct {
+ addr Value
+ pos token.Pos // source position
+ expr ast.Expr // source syntax of the value (not address) [debug mode]
+}
+
+func (a *address) load(fn *Function) Value {
+ load := emitLoad(fn, a.addr)
+ load.pos = a.pos
+ return load
+}
+
+func (a *address) store(fn *Function, v Value) {
+ store := emitStore(fn, a.addr, v, a.pos)
+ if a.expr != nil {
+ // store.Val is v, converted for assignability.
+ emitDebugRef(fn, a.expr, store.Val, false)
+ }
+}
+
+func (a *address) address(fn *Function) Value {
+ if a.expr != nil {
+ emitDebugRef(fn, a.expr, a.addr, true)
+ }
+ return a.addr
+}
+
+func (a *address) typ() types.Type {
+ return deref(a.addr.Type())
+}
+
+// An element is an lvalue represented by m[k], the location of an
+// element of a map or string. These locations are not addressable
+// since pointers cannot be formed from them, but they do support
+// load(), and in the case of maps, store().
+//
+type element struct {
+ m, k Value // map or string
+ t types.Type // map element type or string byte type
+ pos token.Pos // source position of colon ({k:v}) or lbrack (m[k]=v)
+}
+
+func (e *element) load(fn *Function) Value {
+ l := &Lookup{
+ X: e.m,
+ Index: e.k,
+ }
+ l.setPos(e.pos)
+ l.setType(e.t)
+ return fn.emit(l)
+}
+
+func (e *element) store(fn *Function, v Value) {
+ up := &MapUpdate{
+ Map: e.m,
+ Key: e.k,
+ Value: emitConv(fn, v, e.t),
+ }
+ up.pos = e.pos
+ fn.emit(up)
+}
+
+func (e *element) address(fn *Function) Value {
+ panic("map/string elements are not addressable")
+}
+
+func (e *element) typ() types.Type {
+ return e.t
+}
+
+// A blank is a dummy variable whose name is "_".
+// It is not reified: loads are illegal and stores are ignored.
+//
+type blank struct{}
+
+func (bl blank) load(fn *Function) Value {
+ panic("blank.load is illegal")
+}
+
+func (bl blank) store(fn *Function, v Value) {
+ // no-op
+}
+
+func (bl blank) address(fn *Function) Value {
+ panic("blank var is not addressable")
+}
+
+func (bl blank) typ() types.Type {
+ // This should be the type of the blank Ident; the typechecker
+ // doesn't provide this yet, but fortunately, we don't need it
+ // yet either.
+ panic("blank.typ is unimplemented")
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/methods.go b/vendor/golang.org/x/tools/go/ssa/methods.go
new file mode 100644
index 00000000000..9cf383916bb
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/methods.go
@@ -0,0 +1,239 @@
+// 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 ssa
+
+// This file defines utilities for population of method sets.
+
+import (
+ "fmt"
+ "go/types"
+)
+
+// MethodValue returns the Function implementing method sel, building
+// wrapper methods on demand. It returns nil if sel denotes an
+// abstract (interface) method.
+//
+// Precondition: sel.Kind() == MethodVal.
+//
+// Thread-safe.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
+//
+func (prog *Program) MethodValue(sel *types.Selection) *Function {
+ if sel.Kind() != types.MethodVal {
+ panic(fmt.Sprintf("MethodValue(%s) kind != MethodVal", sel))
+ }
+ T := sel.Recv()
+ if isInterface(T) {
+ return nil // abstract method
+ }
+ if prog.mode&LogSource != 0 {
+ defer logStack("MethodValue %s %v", T, sel)()
+ }
+
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+
+ return prog.addMethod(prog.createMethodSet(T), sel)
+}
+
+// LookupMethod returns the implementation of the method of type T
+// identified by (pkg, name). It returns nil if the method exists but
+// is abstract, and panics if T has no such method.
+//
+func (prog *Program) LookupMethod(T types.Type, pkg *types.Package, name string) *Function {
+ sel := prog.MethodSets.MethodSet(T).Lookup(pkg, name)
+ if sel == nil {
+ panic(fmt.Sprintf("%s has no method %s", T, types.Id(pkg, name)))
+ }
+ return prog.MethodValue(sel)
+}
+
+// methodSet contains the (concrete) methods of a non-interface type.
+type methodSet struct {
+ mapping map[string]*Function // populated lazily
+ complete bool // mapping contains all methods
+}
+
+// Precondition: !isInterface(T).
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+func (prog *Program) createMethodSet(T types.Type) *methodSet {
+ mset, ok := prog.methodSets.At(T).(*methodSet)
+ if !ok {
+ mset = &methodSet{mapping: make(map[string]*Function)}
+ prog.methodSets.Set(T, mset)
+ }
+ return mset
+}
+
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+func (prog *Program) addMethod(mset *methodSet, sel *types.Selection) *Function {
+ if sel.Kind() == types.MethodExpr {
+ panic(sel)
+ }
+ id := sel.Obj().Id()
+ fn := mset.mapping[id]
+ if fn == nil {
+ obj := sel.Obj().(*types.Func)
+
+ needsPromotion := len(sel.Index()) > 1
+ needsIndirection := !isPointer(recvType(obj)) && isPointer(sel.Recv())
+ if needsPromotion || needsIndirection {
+ fn = makeWrapper(prog, sel)
+ } else {
+ fn = prog.declaredFunc(obj)
+ }
+ if fn.Signature.Recv() == nil {
+ panic(fn) // missing receiver
+ }
+ mset.mapping[id] = fn
+ }
+ return fn
+}
+
+// RuntimeTypes returns a new unordered slice containing all
+// concrete types in the program for which a complete (non-empty)
+// method set is required at run-time.
+//
+// Thread-safe.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
+//
+func (prog *Program) RuntimeTypes() []types.Type {
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+
+ var res []types.Type
+ prog.methodSets.Iterate(func(T types.Type, v interface{}) {
+ if v.(*methodSet).complete {
+ res = append(res, T)
+ }
+ })
+ return res
+}
+
+// declaredFunc returns the concrete function/method denoted by obj.
+// Panic ensues if there is none.
+//
+func (prog *Program) declaredFunc(obj *types.Func) *Function {
+ if v := prog.packageLevelValue(obj); v != nil {
+ return v.(*Function)
+ }
+ panic("no concrete method: " + obj.String())
+}
+
+// needMethodsOf ensures that runtime type information (including the
+// complete method set) is available for the specified type T and all
+// its subcomponents.
+//
+// needMethodsOf must be called for at least every type that is an
+// operand of some MakeInterface instruction, and for the type of
+// every exported package member.
+//
+// Precondition: T is not a method signature (*Signature with Recv()!=nil).
+//
+// Thread-safe. (Called via emitConv from multiple builder goroutines.)
+//
+// TODO(adonovan): make this faster. It accounts for 20% of SSA build time.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(prog.methodsMu)
+//
+func (prog *Program) needMethodsOf(T types.Type) {
+ prog.methodsMu.Lock()
+ prog.needMethods(T, false)
+ prog.methodsMu.Unlock()
+}
+
+// Precondition: T is not a method signature (*Signature with Recv()!=nil).
+// Recursive case: skip => don't create methods for T.
+//
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+//
+func (prog *Program) needMethods(T types.Type, skip bool) {
+ // Each package maintains its own set of types it has visited.
+ if prevSkip, ok := prog.runtimeTypes.At(T).(bool); ok {
+ // needMethods(T) was previously called
+ if !prevSkip || skip {
+ return // already seen, with same or false 'skip' value
+ }
+ }
+ prog.runtimeTypes.Set(T, skip)
+
+ tmset := prog.MethodSets.MethodSet(T)
+
+ if !skip && !isInterface(T) && tmset.Len() > 0 {
+ // Create methods of T.
+ mset := prog.createMethodSet(T)
+ if !mset.complete {
+ mset.complete = true
+ n := tmset.Len()
+ for i := 0; i < n; i++ {
+ prog.addMethod(mset, tmset.At(i))
+ }
+ }
+ }
+
+ // Recursion over signatures of each method.
+ for i := 0; i < tmset.Len(); i++ {
+ sig := tmset.At(i).Type().(*types.Signature)
+ prog.needMethods(sig.Params(), false)
+ prog.needMethods(sig.Results(), false)
+ }
+
+ switch t := T.(type) {
+ case *types.Basic:
+ // nop
+
+ case *types.Interface:
+ // nop---handled by recursion over method set.
+
+ case *types.Pointer:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Slice:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Chan:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Map:
+ prog.needMethods(t.Key(), false)
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Signature:
+ if t.Recv() != nil {
+ panic(fmt.Sprintf("Signature %s has Recv %s", t, t.Recv()))
+ }
+ prog.needMethods(t.Params(), false)
+ prog.needMethods(t.Results(), false)
+
+ case *types.Named:
+ // A pointer-to-named type can be derived from a named
+ // type via reflection. It may have methods too.
+ prog.needMethods(types.NewPointer(T), false)
+
+ // Consider 'type T struct{S}' where S has methods.
+ // Reflection provides no way to get from T to struct{S},
+ // only to S, so the method set of struct{S} is unwanted,
+ // so set 'skip' flag during recursion.
+ prog.needMethods(t.Underlying(), true)
+
+ case *types.Array:
+ prog.needMethods(t.Elem(), false)
+
+ case *types.Struct:
+ for i, n := 0, t.NumFields(); i < n; i++ {
+ prog.needMethods(t.Field(i).Type(), false)
+ }
+
+ case *types.Tuple:
+ for i, n := 0, t.Len(); i < n; i++ {
+ prog.needMethods(t.At(i).Type(), false)
+ }
+
+ default:
+ panic(T)
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/mode.go b/vendor/golang.org/x/tools/go/ssa/mode.go
new file mode 100644
index 00000000000..d2a269893a7
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/mode.go
@@ -0,0 +1,100 @@
+// 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.
+
+package ssa
+
+// This file defines the BuilderMode type and its command-line flag.
+
+import (
+ "bytes"
+ "fmt"
+)
+
+// BuilderMode is a bitmask of options for diagnostics and checking.
+//
+// *BuilderMode satisfies the flag.Value interface. Example:
+//
+// var mode = ssa.BuilderMode(0)
+// func init() { flag.Var(&mode, "build", ssa.BuilderModeDoc) }
+//
+type BuilderMode uint
+
+const (
+ PrintPackages BuilderMode = 1 << iota // Print package inventory to stdout
+ PrintFunctions // Print function SSA code to stdout
+ LogSource // Log source locations as SSA builder progresses
+ SanityCheckFunctions // Perform sanity checking of function bodies
+ NaiveForm // Build naïve SSA form: don't replace local loads/stores with registers
+ BuildSerially // Build packages serially, not in parallel.
+ GlobalDebug // Enable debug info for all packages
+ BareInits // Build init functions without guards or calls to dependent inits
+)
+
+const BuilderModeDoc = `Options controlling the SSA builder.
+The value is a sequence of zero or more of these letters:
+C perform sanity [C]hecking of the SSA form.
+D include [D]ebug info for every function.
+P print [P]ackage inventory.
+F print [F]unction SSA code.
+S log [S]ource locations as SSA builder progresses.
+L build distinct packages seria[L]ly instead of in parallel.
+N build [N]aive SSA form: don't replace local loads/stores with registers.
+I build bare [I]nit functions: no init guards or calls to dependent inits.
+`
+
+func (m BuilderMode) String() string {
+ var buf bytes.Buffer
+ if m&GlobalDebug != 0 {
+ buf.WriteByte('D')
+ }
+ if m&PrintPackages != 0 {
+ buf.WriteByte('P')
+ }
+ if m&PrintFunctions != 0 {
+ buf.WriteByte('F')
+ }
+ if m&LogSource != 0 {
+ buf.WriteByte('S')
+ }
+ if m&SanityCheckFunctions != 0 {
+ buf.WriteByte('C')
+ }
+ if m&NaiveForm != 0 {
+ buf.WriteByte('N')
+ }
+ if m&BuildSerially != 0 {
+ buf.WriteByte('L')
+ }
+ return buf.String()
+}
+
+// Set parses the flag characters in s and updates *m.
+func (m *BuilderMode) Set(s string) error {
+ var mode BuilderMode
+ for _, c := range s {
+ switch c {
+ case 'D':
+ mode |= GlobalDebug
+ case 'P':
+ mode |= PrintPackages
+ case 'F':
+ mode |= PrintFunctions
+ case 'S':
+ mode |= LogSource | BuildSerially
+ case 'C':
+ mode |= SanityCheckFunctions
+ case 'N':
+ mode |= NaiveForm
+ case 'L':
+ mode |= BuildSerially
+ default:
+ return fmt.Errorf("unknown BuilderMode option: %q", c)
+ }
+ }
+ *m = mode
+ return nil
+}
+
+// Get returns m.
+func (m BuilderMode) Get() interface{} { return m }
diff --git a/vendor/golang.org/x/tools/go/ssa/print.go b/vendor/golang.org/x/tools/go/ssa/print.go
new file mode 100644
index 00000000000..3333ba41a00
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/print.go
@@ -0,0 +1,431 @@
+// 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 ssa
+
+// This file implements the String() methods for all Value and
+// Instruction types.
+
+import (
+ "bytes"
+ "fmt"
+ "go/types"
+ "io"
+ "reflect"
+ "sort"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+// relName returns the name of v relative to i.
+// In most cases, this is identical to v.Name(), but references to
+// Functions (including methods) and Globals use RelString and
+// all types are displayed with relType, so that only cross-package
+// references are package-qualified.
+//
+func relName(v Value, i Instruction) string {
+ var from *types.Package
+ if i != nil {
+ from = i.Parent().pkg()
+ }
+ switch v := v.(type) {
+ case Member: // *Function or *Global
+ return v.RelString(from)
+ case *Const:
+ return v.RelString(from)
+ }
+ return v.Name()
+}
+
+func relType(t types.Type, from *types.Package) string {
+ return types.TypeString(t, types.RelativeTo(from))
+}
+
+func relString(m Member, from *types.Package) string {
+ // NB: not all globals have an Object (e.g. init$guard),
+ // so use Package().Object not Object.Package().
+ if pkg := m.Package().Pkg; pkg != nil && pkg != from {
+ return fmt.Sprintf("%s.%s", pkg.Path(), m.Name())
+ }
+ return m.Name()
+}
+
+// Value.String()
+//
+// This method is provided only for debugging.
+// It never appears in disassembly, which uses Value.Name().
+
+func (v *Parameter) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("parameter %s : %s", v.Name(), relType(v.Type(), from))
+}
+
+func (v *FreeVar) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("freevar %s : %s", v.Name(), relType(v.Type(), from))
+}
+
+func (v *Builtin) String() string {
+ return fmt.Sprintf("builtin %s", v.Name())
+}
+
+// Instruction.String()
+
+func (v *Alloc) String() string {
+ op := "local"
+ if v.Heap {
+ op = "new"
+ }
+ from := v.Parent().pkg()
+ return fmt.Sprintf("%s %s (%s)", op, relType(deref(v.Type()), from), v.Comment)
+}
+
+func (v *Phi) String() string {
+ var b bytes.Buffer
+ b.WriteString("phi [")
+ for i, edge := range v.Edges {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ // Be robust against malformed CFG.
+ if v.block == nil {
+ b.WriteString("??")
+ continue
+ }
+ block := -1
+ if i < len(v.block.Preds) {
+ block = v.block.Preds[i].Index
+ }
+ fmt.Fprintf(&b, "%d: ", block)
+ edgeVal := "" // be robust
+ if edge != nil {
+ edgeVal = relName(edge, v)
+ }
+ b.WriteString(edgeVal)
+ }
+ b.WriteString("]")
+ if v.Comment != "" {
+ b.WriteString(" #")
+ b.WriteString(v.Comment)
+ }
+ return b.String()
+}
+
+func printCall(v *CallCommon, prefix string, instr Instruction) string {
+ var b bytes.Buffer
+ b.WriteString(prefix)
+ if !v.IsInvoke() {
+ b.WriteString(relName(v.Value, instr))
+ } else {
+ fmt.Fprintf(&b, "invoke %s.%s", relName(v.Value, instr), v.Method.Name())
+ }
+ b.WriteString("(")
+ for i, arg := range v.Args {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ b.WriteString(relName(arg, instr))
+ }
+ if v.Signature().Variadic() {
+ b.WriteString("...")
+ }
+ b.WriteString(")")
+ return b.String()
+}
+
+func (c *CallCommon) String() string {
+ return printCall(c, "", nil)
+}
+
+func (v *Call) String() string {
+ return printCall(&v.Call, "", v)
+}
+
+func (v *BinOp) String() string {
+ return fmt.Sprintf("%s %s %s", relName(v.X, v), v.Op.String(), relName(v.Y, v))
+}
+
+func (v *UnOp) String() string {
+ return fmt.Sprintf("%s%s%s", v.Op, relName(v.X, v), commaOk(v.CommaOk))
+}
+
+func printConv(prefix string, v, x Value) string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("%s %s <- %s (%s)",
+ prefix,
+ relType(v.Type(), from),
+ relType(x.Type(), from),
+ relName(x, v.(Instruction)))
+}
+
+func (v *ChangeType) String() string { return printConv("changetype", v, v.X) }
+func (v *Convert) String() string { return printConv("convert", v, v.X) }
+func (v *ChangeInterface) String() string { return printConv("change interface", v, v.X) }
+func (v *MakeInterface) String() string { return printConv("make", v, v.X) }
+
+func (v *MakeClosure) String() string {
+ var b bytes.Buffer
+ fmt.Fprintf(&b, "make closure %s", relName(v.Fn, v))
+ if v.Bindings != nil {
+ b.WriteString(" [")
+ for i, c := range v.Bindings {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ b.WriteString(relName(c, v))
+ }
+ b.WriteString("]")
+ }
+ return b.String()
+}
+
+func (v *MakeSlice) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("make %s %s %s",
+ relType(v.Type(), from),
+ relName(v.Len, v),
+ relName(v.Cap, v))
+}
+
+func (v *Slice) String() string {
+ var b bytes.Buffer
+ b.WriteString("slice ")
+ b.WriteString(relName(v.X, v))
+ b.WriteString("[")
+ if v.Low != nil {
+ b.WriteString(relName(v.Low, v))
+ }
+ b.WriteString(":")
+ if v.High != nil {
+ b.WriteString(relName(v.High, v))
+ }
+ if v.Max != nil {
+ b.WriteString(":")
+ b.WriteString(relName(v.Max, v))
+ }
+ b.WriteString("]")
+ return b.String()
+}
+
+func (v *MakeMap) String() string {
+ res := ""
+ if v.Reserve != nil {
+ res = relName(v.Reserve, v)
+ }
+ from := v.Parent().pkg()
+ return fmt.Sprintf("make %s %s", relType(v.Type(), from), res)
+}
+
+func (v *MakeChan) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("make %s %s", relType(v.Type(), from), relName(v.Size, v))
+}
+
+func (v *FieldAddr) String() string {
+ st := deref(v.X.Type()).Underlying().(*types.Struct)
+ // Be robust against a bad index.
+ name := "?"
+ if 0 <= v.Field && v.Field < st.NumFields() {
+ name = st.Field(v.Field).Name()
+ }
+ return fmt.Sprintf("&%s.%s [#%d]", relName(v.X, v), name, v.Field)
+}
+
+func (v *Field) String() string {
+ st := v.X.Type().Underlying().(*types.Struct)
+ // Be robust against a bad index.
+ name := "?"
+ if 0 <= v.Field && v.Field < st.NumFields() {
+ name = st.Field(v.Field).Name()
+ }
+ return fmt.Sprintf("%s.%s [#%d]", relName(v.X, v), name, v.Field)
+}
+
+func (v *IndexAddr) String() string {
+ return fmt.Sprintf("&%s[%s]", relName(v.X, v), relName(v.Index, v))
+}
+
+func (v *Index) String() string {
+ return fmt.Sprintf("%s[%s]", relName(v.X, v), relName(v.Index, v))
+}
+
+func (v *Lookup) String() string {
+ return fmt.Sprintf("%s[%s]%s", relName(v.X, v), relName(v.Index, v), commaOk(v.CommaOk))
+}
+
+func (v *Range) String() string {
+ return "range " + relName(v.X, v)
+}
+
+func (v *Next) String() string {
+ return "next " + relName(v.Iter, v)
+}
+
+func (v *TypeAssert) String() string {
+ from := v.Parent().pkg()
+ return fmt.Sprintf("typeassert%s %s.(%s)", commaOk(v.CommaOk), relName(v.X, v), relType(v.AssertedType, from))
+}
+
+func (v *Extract) String() string {
+ return fmt.Sprintf("extract %s #%d", relName(v.Tuple, v), v.Index)
+}
+
+func (s *Jump) String() string {
+ // Be robust against malformed CFG.
+ block := -1
+ if s.block != nil && len(s.block.Succs) == 1 {
+ block = s.block.Succs[0].Index
+ }
+ return fmt.Sprintf("jump %d", block)
+}
+
+func (s *If) String() string {
+ // Be robust against malformed CFG.
+ tblock, fblock := -1, -1
+ if s.block != nil && len(s.block.Succs) == 2 {
+ tblock = s.block.Succs[0].Index
+ fblock = s.block.Succs[1].Index
+ }
+ return fmt.Sprintf("if %s goto %d else %d", relName(s.Cond, s), tblock, fblock)
+}
+
+func (s *Go) String() string {
+ return printCall(&s.Call, "go ", s)
+}
+
+func (s *Panic) String() string {
+ return "panic " + relName(s.X, s)
+}
+
+func (s *Return) String() string {
+ var b bytes.Buffer
+ b.WriteString("return")
+ for i, r := range s.Results {
+ if i == 0 {
+ b.WriteString(" ")
+ } else {
+ b.WriteString(", ")
+ }
+ b.WriteString(relName(r, s))
+ }
+ return b.String()
+}
+
+func (*RunDefers) String() string {
+ return "rundefers"
+}
+
+func (s *Send) String() string {
+ return fmt.Sprintf("send %s <- %s", relName(s.Chan, s), relName(s.X, s))
+}
+
+func (s *Defer) String() string {
+ return printCall(&s.Call, "defer ", s)
+}
+
+func (s *Select) String() string {
+ var b bytes.Buffer
+ for i, st := range s.States {
+ if i > 0 {
+ b.WriteString(", ")
+ }
+ if st.Dir == types.RecvOnly {
+ b.WriteString("<-")
+ b.WriteString(relName(st.Chan, s))
+ } else {
+ b.WriteString(relName(st.Chan, s))
+ b.WriteString("<-")
+ b.WriteString(relName(st.Send, s))
+ }
+ }
+ non := ""
+ if !s.Blocking {
+ non = "non"
+ }
+ return fmt.Sprintf("select %sblocking [%s]", non, b.String())
+}
+
+func (s *Store) String() string {
+ return fmt.Sprintf("*%s = %s", relName(s.Addr, s), relName(s.Val, s))
+}
+
+func (s *MapUpdate) String() string {
+ return fmt.Sprintf("%s[%s] = %s", relName(s.Map, s), relName(s.Key, s), relName(s.Value, s))
+}
+
+func (s *DebugRef) String() string {
+ p := s.Parent().Prog.Fset.Position(s.Pos())
+ var descr interface{}
+ if s.object != nil {
+ descr = s.object // e.g. "var x int"
+ } else {
+ descr = reflect.TypeOf(s.Expr) // e.g. "*ast.CallExpr"
+ }
+ var addr string
+ if s.IsAddr {
+ addr = "address of "
+ }
+ return fmt.Sprintf("; %s%s @ %d:%d is %s", addr, descr, p.Line, p.Column, s.X.Name())
+}
+
+func (p *Package) String() string {
+ return "package " + p.Pkg.Path()
+}
+
+var _ io.WriterTo = (*Package)(nil) // *Package implements io.Writer
+
+func (p *Package) WriteTo(w io.Writer) (int64, error) {
+ var buf bytes.Buffer
+ WritePackage(&buf, p)
+ n, err := w.Write(buf.Bytes())
+ return int64(n), err
+}
+
+// WritePackage writes to buf a human-readable summary of p.
+func WritePackage(buf *bytes.Buffer, p *Package) {
+ fmt.Fprintf(buf, "%s:\n", p)
+
+ var names []string
+ maxname := 0
+ for name := range p.Members {
+ if l := len(name); l > maxname {
+ maxname = l
+ }
+ names = append(names, name)
+ }
+
+ from := p.Pkg
+ sort.Strings(names)
+ for _, name := range names {
+ switch mem := p.Members[name].(type) {
+ case *NamedConst:
+ fmt.Fprintf(buf, " const %-*s %s = %s\n",
+ maxname, name, mem.Name(), mem.Value.RelString(from))
+
+ case *Function:
+ fmt.Fprintf(buf, " func %-*s %s\n",
+ maxname, name, relType(mem.Type(), from))
+
+ case *Type:
+ fmt.Fprintf(buf, " type %-*s %s\n",
+ maxname, name, relType(mem.Type().Underlying(), from))
+ for _, meth := range typeutil.IntuitiveMethodSet(mem.Type(), &p.Prog.MethodSets) {
+ fmt.Fprintf(buf, " %s\n", types.SelectionString(meth, types.RelativeTo(from)))
+ }
+
+ case *Global:
+ fmt.Fprintf(buf, " var %-*s %s\n",
+ maxname, name, relType(mem.Type().(*types.Pointer).Elem(), from))
+ }
+ }
+
+ fmt.Fprintf(buf, "\n")
+}
+
+func commaOk(x bool) string {
+ if x {
+ return ",ok"
+ }
+ return ""
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/sanity.go b/vendor/golang.org/x/tools/go/ssa/sanity.go
new file mode 100644
index 00000000000..0a7abc5e98f
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/sanity.go
@@ -0,0 +1,532 @@
+// 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 ssa
+
+// An optional pass for sanity-checking invariants of the SSA representation.
+// Currently it checks CFG invariants but little at the instruction level.
+
+import (
+ "fmt"
+ "go/types"
+ "io"
+ "os"
+ "strings"
+)
+
+type sanity struct {
+ reporter io.Writer
+ fn *Function
+ block *BasicBlock
+ instrs map[Instruction]struct{}
+ insane bool
+}
+
+// sanityCheck performs integrity checking of the SSA representation
+// of the function fn and returns true if it was valid. Diagnostics
+// are written to reporter if non-nil, os.Stderr otherwise. Some
+// diagnostics are only warnings and do not imply a negative result.
+//
+// Sanity-checking is intended to facilitate the debugging of code
+// transformation passes.
+//
+func sanityCheck(fn *Function, reporter io.Writer) bool {
+ if reporter == nil {
+ reporter = os.Stderr
+ }
+ return (&sanity{reporter: reporter}).checkFunction(fn)
+}
+
+// mustSanityCheck is like sanityCheck but panics instead of returning
+// a negative result.
+//
+func mustSanityCheck(fn *Function, reporter io.Writer) {
+ if !sanityCheck(fn, reporter) {
+ fn.WriteTo(os.Stderr)
+ panic("SanityCheck failed")
+ }
+}
+
+func (s *sanity) diagnostic(prefix, format string, args ...interface{}) {
+ fmt.Fprintf(s.reporter, "%s: function %s", prefix, s.fn)
+ if s.block != nil {
+ fmt.Fprintf(s.reporter, ", block %s", s.block)
+ }
+ io.WriteString(s.reporter, ": ")
+ fmt.Fprintf(s.reporter, format, args...)
+ io.WriteString(s.reporter, "\n")
+}
+
+func (s *sanity) errorf(format string, args ...interface{}) {
+ s.insane = true
+ s.diagnostic("Error", format, args...)
+}
+
+func (s *sanity) warnf(format string, args ...interface{}) {
+ s.diagnostic("Warning", format, args...)
+}
+
+// findDuplicate returns an arbitrary basic block that appeared more
+// than once in blocks, or nil if all were unique.
+func findDuplicate(blocks []*BasicBlock) *BasicBlock {
+ if len(blocks) < 2 {
+ return nil
+ }
+ if blocks[0] == blocks[1] {
+ return blocks[0]
+ }
+ // Slow path:
+ m := make(map[*BasicBlock]bool)
+ for _, b := range blocks {
+ if m[b] {
+ return b
+ }
+ m[b] = true
+ }
+ return nil
+}
+
+func (s *sanity) checkInstr(idx int, instr Instruction) {
+ switch instr := instr.(type) {
+ case *If, *Jump, *Return, *Panic:
+ s.errorf("control flow instruction not at end of block")
+ case *Phi:
+ if idx == 0 {
+ // It suffices to apply this check to just the first phi node.
+ if dup := findDuplicate(s.block.Preds); dup != nil {
+ s.errorf("phi node in block with duplicate predecessor %s", dup)
+ }
+ } else {
+ prev := s.block.Instrs[idx-1]
+ if _, ok := prev.(*Phi); !ok {
+ s.errorf("Phi instruction follows a non-Phi: %T", prev)
+ }
+ }
+ if ne, np := len(instr.Edges), len(s.block.Preds); ne != np {
+ s.errorf("phi node has %d edges but %d predecessors", ne, np)
+
+ } else {
+ for i, e := range instr.Edges {
+ if e == nil {
+ s.errorf("phi node '%s' has no value for edge #%d from %s", instr.Comment, i, s.block.Preds[i])
+ }
+ }
+ }
+
+ case *Alloc:
+ if !instr.Heap {
+ found := false
+ for _, l := range s.fn.Locals {
+ if l == instr {
+ found = true
+ break
+ }
+ }
+ if !found {
+ s.errorf("local alloc %s = %s does not appear in Function.Locals", instr.Name(), instr)
+ }
+ }
+
+ case *BinOp:
+ case *Call:
+ case *ChangeInterface:
+ case *ChangeType:
+ case *Convert:
+ if _, ok := instr.X.Type().Underlying().(*types.Basic); !ok {
+ if _, ok := instr.Type().Underlying().(*types.Basic); !ok {
+ s.errorf("convert %s -> %s: at least one type must be basic", instr.X.Type(), instr.Type())
+ }
+ }
+
+ case *Defer:
+ case *Extract:
+ case *Field:
+ case *FieldAddr:
+ case *Go:
+ case *Index:
+ case *IndexAddr:
+ case *Lookup:
+ case *MakeChan:
+ case *MakeClosure:
+ numFree := len(instr.Fn.(*Function).FreeVars)
+ numBind := len(instr.Bindings)
+ if numFree != numBind {
+ s.errorf("MakeClosure has %d Bindings for function %s with %d free vars",
+ numBind, instr.Fn, numFree)
+
+ }
+ if recv := instr.Type().(*types.Signature).Recv(); recv != nil {
+ s.errorf("MakeClosure's type includes receiver %s", recv.Type())
+ }
+
+ case *MakeInterface:
+ case *MakeMap:
+ case *MakeSlice:
+ case *MapUpdate:
+ case *Next:
+ case *Range:
+ case *RunDefers:
+ case *Select:
+ case *Send:
+ case *Slice:
+ case *Store:
+ case *TypeAssert:
+ case *UnOp:
+ case *DebugRef:
+ // TODO(adonovan): implement checks.
+ default:
+ panic(fmt.Sprintf("Unknown instruction type: %T", instr))
+ }
+
+ if call, ok := instr.(CallInstruction); ok {
+ if call.Common().Signature() == nil {
+ s.errorf("nil signature: %s", call)
+ }
+ }
+
+ // Check that value-defining instructions have valid types
+ // and a valid referrer list.
+ if v, ok := instr.(Value); ok {
+ t := v.Type()
+ if t == nil {
+ s.errorf("no type: %s = %s", v.Name(), v)
+ } else if t == tRangeIter {
+ // not a proper type; ignore.
+ } else if b, ok := t.Underlying().(*types.Basic); ok && b.Info()&types.IsUntyped != 0 {
+ s.errorf("instruction has 'untyped' result: %s = %s : %s", v.Name(), v, t)
+ }
+ s.checkReferrerList(v)
+ }
+
+ // Untyped constants are legal as instruction Operands(),
+ // for example:
+ // _ = "foo"[0]
+ // or:
+ // if wordsize==64 {...}
+
+ // All other non-Instruction Values can be found via their
+ // enclosing Function or Package.
+}
+
+func (s *sanity) checkFinalInstr(instr Instruction) {
+ switch instr := instr.(type) {
+ case *If:
+ if nsuccs := len(s.block.Succs); nsuccs != 2 {
+ s.errorf("If-terminated block has %d successors; expected 2", nsuccs)
+ return
+ }
+ if s.block.Succs[0] == s.block.Succs[1] {
+ s.errorf("If-instruction has same True, False target blocks: %s", s.block.Succs[0])
+ return
+ }
+
+ case *Jump:
+ if nsuccs := len(s.block.Succs); nsuccs != 1 {
+ s.errorf("Jump-terminated block has %d successors; expected 1", nsuccs)
+ return
+ }
+
+ case *Return:
+ if nsuccs := len(s.block.Succs); nsuccs != 0 {
+ s.errorf("Return-terminated block has %d successors; expected none", nsuccs)
+ return
+ }
+ if na, nf := len(instr.Results), s.fn.Signature.Results().Len(); nf != na {
+ s.errorf("%d-ary return in %d-ary function", na, nf)
+ }
+
+ case *Panic:
+ if nsuccs := len(s.block.Succs); nsuccs != 0 {
+ s.errorf("Panic-terminated block has %d successors; expected none", nsuccs)
+ return
+ }
+
+ default:
+ s.errorf("non-control flow instruction at end of block")
+ }
+}
+
+func (s *sanity) checkBlock(b *BasicBlock, index int) {
+ s.block = b
+
+ if b.Index != index {
+ s.errorf("block has incorrect Index %d", b.Index)
+ }
+ if b.parent != s.fn {
+ s.errorf("block has incorrect parent %s", b.parent)
+ }
+
+ // Check all blocks are reachable.
+ // (The entry block is always implicitly reachable,
+ // as is the Recover block, if any.)
+ if (index > 0 && b != b.parent.Recover) && len(b.Preds) == 0 {
+ s.warnf("unreachable block")
+ if b.Instrs == nil {
+ // Since this block is about to be pruned,
+ // tolerating transient problems in it
+ // simplifies other optimizations.
+ return
+ }
+ }
+
+ // Check predecessor and successor relations are dual,
+ // and that all blocks in CFG belong to same function.
+ for _, a := range b.Preds {
+ found := false
+ for _, bb := range a.Succs {
+ if bb == b {
+ found = true
+ break
+ }
+ }
+ if !found {
+ s.errorf("expected successor edge in predecessor %s; found only: %s", a, a.Succs)
+ }
+ if a.parent != s.fn {
+ s.errorf("predecessor %s belongs to different function %s", a, a.parent)
+ }
+ }
+ for _, c := range b.Succs {
+ found := false
+ for _, bb := range c.Preds {
+ if bb == b {
+ found = true
+ break
+ }
+ }
+ if !found {
+ s.errorf("expected predecessor edge in successor %s; found only: %s", c, c.Preds)
+ }
+ if c.parent != s.fn {
+ s.errorf("successor %s belongs to different function %s", c, c.parent)
+ }
+ }
+
+ // Check each instruction is sane.
+ n := len(b.Instrs)
+ if n == 0 {
+ s.errorf("basic block contains no instructions")
+ }
+ var rands [10]*Value // reuse storage
+ for j, instr := range b.Instrs {
+ if instr == nil {
+ s.errorf("nil instruction at index %d", j)
+ continue
+ }
+ if b2 := instr.Block(); b2 == nil {
+ s.errorf("nil Block() for instruction at index %d", j)
+ continue
+ } else if b2 != b {
+ s.errorf("wrong Block() (%s) for instruction at index %d ", b2, j)
+ continue
+ }
+ if j < n-1 {
+ s.checkInstr(j, instr)
+ } else {
+ s.checkFinalInstr(instr)
+ }
+
+ // Check Instruction.Operands.
+ operands:
+ for i, op := range instr.Operands(rands[:0]) {
+ if op == nil {
+ s.errorf("nil operand pointer %d of %s", i, instr)
+ continue
+ }
+ val := *op
+ if val == nil {
+ continue // a nil operand is ok
+ }
+
+ // Check that "untyped" types only appear on constant operands.
+ if _, ok := (*op).(*Const); !ok {
+ if basic, ok := (*op).Type().(*types.Basic); ok {
+ if basic.Info()&types.IsUntyped != 0 {
+ s.errorf("operand #%d of %s is untyped: %s", i, instr, basic)
+ }
+ }
+ }
+
+ // Check that Operands that are also Instructions belong to same function.
+ // TODO(adonovan): also check their block dominates block b.
+ if val, ok := val.(Instruction); ok {
+ if val.Block() == nil {
+ s.errorf("operand %d of %s is an instruction (%s) that belongs to no block", i, instr, val)
+ } else if val.Parent() != s.fn {
+ s.errorf("operand %d of %s is an instruction (%s) from function %s", i, instr, val, val.Parent())
+ }
+ }
+
+ // Check that each function-local operand of
+ // instr refers back to instr. (NB: quadratic)
+ switch val := val.(type) {
+ case *Const, *Global, *Builtin:
+ continue // not local
+ case *Function:
+ if val.parent == nil {
+ continue // only anon functions are local
+ }
+ }
+
+ // TODO(adonovan): check val.Parent() != nil <=> val.Referrers() is defined.
+
+ if refs := val.Referrers(); refs != nil {
+ for _, ref := range *refs {
+ if ref == instr {
+ continue operands
+ }
+ }
+ s.errorf("operand %d of %s (%s) does not refer to us", i, instr, val)
+ } else {
+ s.errorf("operand %d of %s (%s) has no referrers", i, instr, val)
+ }
+ }
+ }
+}
+
+func (s *sanity) checkReferrerList(v Value) {
+ refs := v.Referrers()
+ if refs == nil {
+ s.errorf("%s has missing referrer list", v.Name())
+ return
+ }
+ for i, ref := range *refs {
+ if _, ok := s.instrs[ref]; !ok {
+ s.errorf("%s.Referrers()[%d] = %s is not an instruction belonging to this function", v.Name(), i, ref)
+ }
+ }
+}
+
+func (s *sanity) checkFunction(fn *Function) bool {
+ // TODO(adonovan): check Function invariants:
+ // - check params match signature
+ // - check transient fields are nil
+ // - warn if any fn.Locals do not appear among block instructions.
+ s.fn = fn
+ if fn.Prog == nil {
+ s.errorf("nil Prog")
+ }
+
+ _ = fn.String() // must not crash
+ _ = fn.RelString(fn.pkg()) // must not crash
+
+ // All functions have a package, except delegates (which are
+ // shared across packages, or duplicated as weak symbols in a
+ // separate-compilation model), and error.Error.
+ if fn.Pkg == nil {
+ if strings.HasPrefix(fn.Synthetic, "wrapper ") ||
+ strings.HasPrefix(fn.Synthetic, "bound ") ||
+ strings.HasPrefix(fn.Synthetic, "thunk ") ||
+ strings.HasSuffix(fn.name, "Error") {
+ // ok
+ } else {
+ s.errorf("nil Pkg")
+ }
+ }
+ if src, syn := fn.Synthetic == "", fn.Syntax() != nil; src != syn {
+ s.errorf("got fromSource=%t, hasSyntax=%t; want same values", src, syn)
+ }
+ for i, l := range fn.Locals {
+ if l.Parent() != fn {
+ s.errorf("Local %s at index %d has wrong parent", l.Name(), i)
+ }
+ if l.Heap {
+ s.errorf("Local %s at index %d has Heap flag set", l.Name(), i)
+ }
+ }
+ // Build the set of valid referrers.
+ s.instrs = make(map[Instruction]struct{})
+ for _, b := range fn.Blocks {
+ for _, instr := range b.Instrs {
+ s.instrs[instr] = struct{}{}
+ }
+ }
+ for i, p := range fn.Params {
+ if p.Parent() != fn {
+ s.errorf("Param %s at index %d has wrong parent", p.Name(), i)
+ }
+ // Check common suffix of Signature and Params match type.
+ if sig := fn.Signature; sig != nil {
+ j := i - len(fn.Params) + sig.Params().Len() // index within sig.Params
+ if j < 0 {
+ continue
+ }
+ if !types.Identical(p.Type(), sig.Params().At(j).Type()) {
+ s.errorf("Param %s at index %d has wrong type (%s, versus %s in Signature)", p.Name(), i, p.Type(), sig.Params().At(j).Type())
+
+ }
+ }
+ s.checkReferrerList(p)
+ }
+ for i, fv := range fn.FreeVars {
+ if fv.Parent() != fn {
+ s.errorf("FreeVar %s at index %d has wrong parent", fv.Name(), i)
+ }
+ s.checkReferrerList(fv)
+ }
+
+ if fn.Blocks != nil && len(fn.Blocks) == 0 {
+ // Function _had_ blocks (so it's not external) but
+ // they were "optimized" away, even the entry block.
+ s.errorf("Blocks slice is non-nil but empty")
+ }
+ for i, b := range fn.Blocks {
+ if b == nil {
+ s.warnf("nil *BasicBlock at f.Blocks[%d]", i)
+ continue
+ }
+ s.checkBlock(b, i)
+ }
+ if fn.Recover != nil && fn.Blocks[fn.Recover.Index] != fn.Recover {
+ s.errorf("Recover block is not in Blocks slice")
+ }
+
+ s.block = nil
+ for i, anon := range fn.AnonFuncs {
+ if anon.Parent() != fn {
+ s.errorf("AnonFuncs[%d]=%s but %s.Parent()=%s", i, anon, anon, anon.Parent())
+ }
+ }
+ s.fn = nil
+ return !s.insane
+}
+
+// sanityCheckPackage checks invariants of packages upon creation.
+// It does not require that the package is built.
+// Unlike sanityCheck (for functions), it just panics at the first error.
+func sanityCheckPackage(pkg *Package) {
+ if pkg.Pkg == nil {
+ panic(fmt.Sprintf("Package %s has no Object", pkg))
+ }
+ _ = pkg.String() // must not crash
+
+ for name, mem := range pkg.Members {
+ if name != mem.Name() {
+ panic(fmt.Sprintf("%s: %T.Name() = %s, want %s",
+ pkg.Pkg.Path(), mem, mem.Name(), name))
+ }
+ obj := mem.Object()
+ if obj == nil {
+ // This check is sound because fields
+ // {Global,Function}.object have type
+ // types.Object. (If they were declared as
+ // *types.{Var,Func}, we'd have a non-empty
+ // interface containing a nil pointer.)
+
+ continue // not all members have typechecker objects
+ }
+ if obj.Name() != name {
+ if obj.Name() == "init" && strings.HasPrefix(mem.Name(), "init#") {
+ // Ok. The name of a declared init function varies between
+ // its types.Func ("init") and its ssa.Function ("init#%d").
+ } else {
+ panic(fmt.Sprintf("%s: %T.Object().Name() = %s, want %s",
+ pkg.Pkg.Path(), mem, obj.Name(), name))
+ }
+ }
+ if obj.Pos() != mem.Pos() {
+ panic(fmt.Sprintf("%s Pos=%d obj.Pos=%d", mem, mem.Pos(), obj.Pos()))
+ }
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/source.go b/vendor/golang.org/x/tools/go/ssa/source.go
new file mode 100644
index 00000000000..6d2223edaa3
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/source.go
@@ -0,0 +1,293 @@
+// 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 ssa
+
+// This file defines utilities for working with source positions
+// or source-level named entities ("objects").
+
+// TODO(adonovan): test that {Value,Instruction}.Pos() positions match
+// the originating syntax, as specified.
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+)
+
+// EnclosingFunction returns the function that contains the syntax
+// node denoted by path.
+//
+// Syntax associated with package-level variable specifications is
+// enclosed by the package's init() function.
+//
+// Returns nil if not found; reasons might include:
+// - the node is not enclosed by any function.
+// - the node is within an anonymous function (FuncLit) and
+// its SSA function has not been created yet
+// (pkg.Build() has not yet been called).
+//
+func EnclosingFunction(pkg *Package, path []ast.Node) *Function {
+ // Start with package-level function...
+ fn := findEnclosingPackageLevelFunction(pkg, path)
+ if fn == nil {
+ return nil // not in any function
+ }
+
+ // ...then walk down the nested anonymous functions.
+ n := len(path)
+outer:
+ for i := range path {
+ if lit, ok := path[n-1-i].(*ast.FuncLit); ok {
+ for _, anon := range fn.AnonFuncs {
+ if anon.Pos() == lit.Type.Func {
+ fn = anon
+ continue outer
+ }
+ }
+ // SSA function not found:
+ // - package not yet built, or maybe
+ // - builder skipped FuncLit in dead block
+ // (in principle; but currently the Builder
+ // generates even dead FuncLits).
+ return nil
+ }
+ }
+ return fn
+}
+
+// HasEnclosingFunction returns true if the AST node denoted by path
+// is contained within the declaration of some function or
+// package-level variable.
+//
+// Unlike EnclosingFunction, the behaviour of this function does not
+// depend on whether SSA code for pkg has been built, so it can be
+// used to quickly reject check inputs that will cause
+// EnclosingFunction to fail, prior to SSA building.
+//
+func HasEnclosingFunction(pkg *Package, path []ast.Node) bool {
+ return findEnclosingPackageLevelFunction(pkg, path) != nil
+}
+
+// findEnclosingPackageLevelFunction returns the Function
+// corresponding to the package-level function enclosing path.
+//
+func findEnclosingPackageLevelFunction(pkg *Package, path []ast.Node) *Function {
+ if n := len(path); n >= 2 { // [... {Gen,Func}Decl File]
+ switch decl := path[n-2].(type) {
+ case *ast.GenDecl:
+ if decl.Tok == token.VAR && n >= 3 {
+ // Package-level 'var' initializer.
+ return pkg.init
+ }
+
+ case *ast.FuncDecl:
+ if decl.Recv == nil && decl.Name.Name == "init" {
+ // Explicit init() function.
+ for _, b := range pkg.init.Blocks {
+ for _, instr := range b.Instrs {
+ if instr, ok := instr.(*Call); ok {
+ if callee, ok := instr.Call.Value.(*Function); ok && callee.Pkg == pkg && callee.Pos() == decl.Name.NamePos {
+ return callee
+ }
+ }
+ }
+ }
+ // Hack: return non-nil when SSA is not yet
+ // built so that HasEnclosingFunction works.
+ return pkg.init
+ }
+ // Declared function/method.
+ return findNamedFunc(pkg, decl.Name.NamePos)
+ }
+ }
+ return nil // not in any function
+}
+
+// findNamedFunc returns the named function whose FuncDecl.Ident is at
+// position pos.
+//
+func findNamedFunc(pkg *Package, pos token.Pos) *Function {
+ // Look at all package members and method sets of named types.
+ // Not very efficient.
+ for _, mem := range pkg.Members {
+ switch mem := mem.(type) {
+ case *Function:
+ if mem.Pos() == pos {
+ return mem
+ }
+ case *Type:
+ mset := pkg.Prog.MethodSets.MethodSet(types.NewPointer(mem.Type()))
+ for i, n := 0, mset.Len(); i < n; i++ {
+ // Don't call Program.Method: avoid creating wrappers.
+ obj := mset.At(i).Obj().(*types.Func)
+ if obj.Pos() == pos {
+ return pkg.values[obj].(*Function)
+ }
+ }
+ }
+ }
+ return nil
+}
+
+// ValueForExpr returns the SSA Value that corresponds to non-constant
+// expression e.
+//
+// It returns nil if no value was found, e.g.
+// - the expression is not lexically contained within f;
+// - f was not built with debug information; or
+// - e is a constant expression. (For efficiency, no debug
+// information is stored for constants. Use
+// go/types.Info.Types[e].Value instead.)
+// - e is a reference to nil or a built-in function.
+// - the value was optimised away.
+//
+// If e is an addressable expression used in an lvalue context,
+// value is the address denoted by e, and isAddr is true.
+//
+// The types of e (or &e, if isAddr) and the result are equal
+// (modulo "untyped" bools resulting from comparisons).
+//
+// (Tip: to find the ssa.Value given a source position, use
+// importer.PathEnclosingInterval to locate the ast.Node, then
+// EnclosingFunction to locate the Function, then ValueForExpr to find
+// the ssa.Value.)
+//
+func (f *Function) ValueForExpr(e ast.Expr) (value Value, isAddr bool) {
+ if f.debugInfo() { // (opt)
+ e = unparen(e)
+ for _, b := range f.Blocks {
+ for _, instr := range b.Instrs {
+ if ref, ok := instr.(*DebugRef); ok {
+ if ref.Expr == e {
+ return ref.X, ref.IsAddr
+ }
+ }
+ }
+ }
+ }
+ return
+}
+
+// --- Lookup functions for source-level named entities (types.Objects) ---
+
+// Package returns the SSA Package corresponding to the specified
+// type-checker package object.
+// It returns nil if no such SSA package has been created.
+//
+func (prog *Program) Package(obj *types.Package) *Package {
+ return prog.packages[obj]
+}
+
+// packageLevelValue returns the package-level value corresponding to
+// the specified named object, which may be a package-level const
+// (*Const), var (*Global) or func (*Function) of some package in
+// prog. It returns nil if the object is not found.
+//
+func (prog *Program) packageLevelValue(obj types.Object) Value {
+ if pkg, ok := prog.packages[obj.Pkg()]; ok {
+ return pkg.values[obj]
+ }
+ return nil
+}
+
+// FuncValue returns the concrete Function denoted by the source-level
+// named function obj, or nil if obj denotes an interface method.
+//
+// TODO(adonovan): check the invariant that obj.Type() matches the
+// result's Signature, both in the params/results and in the receiver.
+//
+func (prog *Program) FuncValue(obj *types.Func) *Function {
+ fn, _ := prog.packageLevelValue(obj).(*Function)
+ return fn
+}
+
+// ConstValue returns the SSA Value denoted by the source-level named
+// constant obj.
+//
+func (prog *Program) ConstValue(obj *types.Const) *Const {
+ // TODO(adonovan): opt: share (don't reallocate)
+ // Consts for const objects and constant ast.Exprs.
+
+ // Universal constant? {true,false,nil}
+ if obj.Parent() == types.Universe {
+ return NewConst(obj.Val(), obj.Type())
+ }
+ // Package-level named constant?
+ if v := prog.packageLevelValue(obj); v != nil {
+ return v.(*Const)
+ }
+ return NewConst(obj.Val(), obj.Type())
+}
+
+// VarValue returns the SSA Value that corresponds to a specific
+// identifier denoting the source-level named variable obj.
+//
+// VarValue returns nil if a local variable was not found, perhaps
+// because its package was not built, the debug information was not
+// requested during SSA construction, or the value was optimized away.
+//
+// ref is the path to an ast.Ident (e.g. from PathEnclosingInterval),
+// and that ident must resolve to obj.
+//
+// pkg is the package enclosing the reference. (A reference to a var
+// always occurs within a function, so we need to know where to find it.)
+//
+// If the identifier is a field selector and its base expression is
+// non-addressable, then VarValue returns the value of that field.
+// For example:
+// func f() struct {x int}
+// f().x // VarValue(x) returns a *Field instruction of type int
+//
+// All other identifiers denote addressable locations (variables).
+// For them, VarValue may return either the variable's address or its
+// value, even when the expression is evaluated only for its value; the
+// situation is reported by isAddr, the second component of the result.
+//
+// If !isAddr, the returned value is the one associated with the
+// specific identifier. For example,
+// var x int // VarValue(x) returns Const 0 here
+// x = 1 // VarValue(x) returns Const 1 here
+//
+// It is not specified whether the value or the address is returned in
+// any particular case, as it may depend upon optimizations performed
+// during SSA code generation, such as registerization, constant
+// folding, avoidance of materialization of subexpressions, etc.
+//
+func (prog *Program) VarValue(obj *types.Var, pkg *Package, ref []ast.Node) (value Value, isAddr bool) {
+ // All references to a var are local to some function, possibly init.
+ fn := EnclosingFunction(pkg, ref)
+ if fn == nil {
+ return // e.g. def of struct field; SSA not built?
+ }
+
+ id := ref[0].(*ast.Ident)
+
+ // Defining ident of a parameter?
+ if id.Pos() == obj.Pos() {
+ for _, param := range fn.Params {
+ if param.Object() == obj {
+ return param, false
+ }
+ }
+ }
+
+ // Other ident?
+ for _, b := range fn.Blocks {
+ for _, instr := range b.Instrs {
+ if dr, ok := instr.(*DebugRef); ok {
+ if dr.Pos() == id.Pos() {
+ return dr.X, dr.IsAddr
+ }
+ }
+ }
+ }
+
+ // Defining ident of package-level var?
+ if v := prog.packageLevelValue(obj); v != nil {
+ return v.(*Global), true
+ }
+
+ return // e.g. debug info not requested, or var optimized away
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssa.go b/vendor/golang.org/x/tools/go/ssa/ssa.go
new file mode 100644
index 00000000000..78272c546a1
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/ssa.go
@@ -0,0 +1,1695 @@
+// 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 ssa
+
+// This package defines a high-level intermediate representation for
+// Go programs using static single-assignment (SSA) form.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/token"
+ "go/types"
+ "sync"
+
+ "golang.org/x/tools/go/types/typeutil"
+)
+
+// A Program is a partial or complete Go program converted to SSA form.
+type Program struct {
+ Fset *token.FileSet // position information for the files of this Program
+ imported map[string]*Package // all importable Packages, keyed by import path
+ packages map[*types.Package]*Package // all loaded Packages, keyed by object
+ mode BuilderMode // set of mode bits for SSA construction
+ MethodSets typeutil.MethodSetCache // cache of type-checker's method-sets
+
+ methodsMu sync.Mutex // guards the following maps:
+ methodSets typeutil.Map // maps type to its concrete methodSet
+ runtimeTypes typeutil.Map // types for which rtypes are needed
+ canon typeutil.Map // type canonicalization map
+ bounds map[*types.Func]*Function // bounds for curried x.Method closures
+ thunks map[selectionKey]*Function // thunks for T.Method expressions
+}
+
+// A Package is a single analyzed Go package containing Members for
+// all package-level functions, variables, constants and types it
+// declares. These may be accessed directly via Members, or via the
+// type-specific accessor methods Func, Type, Var and Const.
+//
+// Members also contains entries for "init" (the synthetic package
+// initializer) and "init#%d", the nth declared init function,
+// and unspecified other things too.
+//
+type Package struct {
+ Prog *Program // the owning program
+ Pkg *types.Package // the corresponding go/types.Package
+ Members map[string]Member // all package members keyed by name (incl. init and init#%d)
+ values map[types.Object]Value // package members (incl. types and methods), keyed by object
+ init *Function // Func("init"); the package's init function
+ debug bool // include full debug info in this package
+
+ // The following fields are set transiently, then cleared
+ // after building.
+ buildOnce sync.Once // ensures package building occurs once
+ ninit int32 // number of init functions
+ info *types.Info // package type information
+ files []*ast.File // package ASTs
+}
+
+// A Member is a member of a Go package, implemented by *NamedConst,
+// *Global, *Function, or *Type; they are created by package-level
+// const, var, func and type declarations respectively.
+//
+type Member interface {
+ Name() string // declared name of the package member
+ String() string // package-qualified name of the package member
+ RelString(*types.Package) string // like String, but relative refs are unqualified
+ Object() types.Object // typechecker's object for this member, if any
+ Pos() token.Pos // position of member's declaration, if known
+ Type() types.Type // type of the package member
+ Token() token.Token // token.{VAR,FUNC,CONST,TYPE}
+ Package() *Package // the containing package
+}
+
+// A Type is a Member of a Package representing a package-level named type.
+type Type struct {
+ object *types.TypeName
+ pkg *Package
+}
+
+// A NamedConst is a Member of a Package representing a package-level
+// named constant.
+//
+// Pos() returns the position of the declaring ast.ValueSpec.Names[*]
+// identifier.
+//
+// NB: a NamedConst is not a Value; it contains a constant Value, which
+// it augments with the name and position of its 'const' declaration.
+//
+type NamedConst struct {
+ object *types.Const
+ Value *Const
+ pkg *Package
+}
+
+// A Value is an SSA value that can be referenced by an instruction.
+type Value interface {
+ // Name returns the name of this value, and determines how
+ // this Value appears when used as an operand of an
+ // Instruction.
+ //
+ // This is the same as the source name for Parameters,
+ // Builtins, Functions, FreeVars, Globals.
+ // For constants, it is a representation of the constant's value
+ // and type. For all other Values this is the name of the
+ // virtual register defined by the instruction.
+ //
+ // The name of an SSA Value is not semantically significant,
+ // and may not even be unique within a function.
+ Name() string
+
+ // If this value is an Instruction, String returns its
+ // disassembled form; otherwise it returns unspecified
+ // human-readable information about the Value, such as its
+ // kind, name and type.
+ String() string
+
+ // Type returns the type of this value. Many instructions
+ // (e.g. IndexAddr) change their behaviour depending on the
+ // types of their operands.
+ Type() types.Type
+
+ // Parent returns the function to which this Value belongs.
+ // It returns nil for named Functions, Builtin, Const and Global.
+ Parent() *Function
+
+ // Referrers returns the list of instructions that have this
+ // value as one of their operands; it may contain duplicates
+ // if an instruction has a repeated operand.
+ //
+ // Referrers actually returns a pointer through which the
+ // caller may perform mutations to the object's state.
+ //
+ // Referrers is currently only defined if Parent()!=nil,
+ // i.e. for the function-local values FreeVar, Parameter,
+ // Functions (iff anonymous) and all value-defining instructions.
+ // It returns nil for named Functions, Builtin, Const and Global.
+ //
+ // Instruction.Operands contains the inverse of this relation.
+ Referrers() *[]Instruction
+
+ // Pos returns the location of the AST token most closely
+ // associated with the operation that gave rise to this value,
+ // or token.NoPos if it was not explicit in the source.
+ //
+ // For each ast.Node type, a particular token is designated as
+ // the closest location for the expression, e.g. the Lparen
+ // for an *ast.CallExpr. This permits a compact but
+ // approximate mapping from Values to source positions for use
+ // in diagnostic messages, for example.
+ //
+ // (Do not use this position to determine which Value
+ // corresponds to an ast.Expr; use Function.ValueForExpr
+ // instead. NB: it requires that the function was built with
+ // debug information.)
+ Pos() token.Pos
+}
+
+// An Instruction is an SSA instruction that computes a new Value or
+// has some effect.
+//
+// An Instruction that defines a value (e.g. BinOp) also implements
+// the Value interface; an Instruction that only has an effect (e.g. Store)
+// does not.
+//
+type Instruction interface {
+ // String returns the disassembled form of this value.
+ //
+ // Examples of Instructions that are Values:
+ // "x + y" (BinOp)
+ // "len([])" (Call)
+ // Note that the name of the Value is not printed.
+ //
+ // Examples of Instructions that are not Values:
+ // "return x" (Return)
+ // "*y = x" (Store)
+ //
+ // (The separation Value.Name() from Value.String() is useful
+ // for some analyses which distinguish the operation from the
+ // value it defines, e.g., 'y = local int' is both an allocation
+ // of memory 'local int' and a definition of a pointer y.)
+ String() string
+
+ // Parent returns the function to which this instruction
+ // belongs.
+ Parent() *Function
+
+ // Block returns the basic block to which this instruction
+ // belongs.
+ Block() *BasicBlock
+
+ // setBlock sets the basic block to which this instruction belongs.
+ setBlock(*BasicBlock)
+
+ // Operands returns the operands of this instruction: the
+ // set of Values it references.
+ //
+ // Specifically, it appends their addresses to rands, a
+ // user-provided slice, and returns the resulting slice,
+ // permitting avoidance of memory allocation.
+ //
+ // The operands are appended in undefined order, but the order
+ // is consistent for a given Instruction; the addresses are
+ // always non-nil but may point to a nil Value. Clients may
+ // store through the pointers, e.g. to effect a value
+ // renaming.
+ //
+ // Value.Referrers is a subset of the inverse of this
+ // relation. (Referrers are not tracked for all types of
+ // Values.)
+ Operands(rands []*Value) []*Value
+
+ // Pos returns the location of the AST token most closely
+ // associated with the operation that gave rise to this
+ // instruction, or token.NoPos if it was not explicit in the
+ // source.
+ //
+ // For each ast.Node type, a particular token is designated as
+ // the closest location for the expression, e.g. the Go token
+ // for an *ast.GoStmt. This permits a compact but approximate
+ // mapping from Instructions to source positions for use in
+ // diagnostic messages, for example.
+ //
+ // (Do not use this position to determine which Instruction
+ // corresponds to an ast.Expr; see the notes for Value.Pos.
+ // This position may be used to determine which non-Value
+ // Instruction corresponds to some ast.Stmts, but not all: If
+ // and Jump instructions have no Pos(), for example.)
+ Pos() token.Pos
+}
+
+// A Node is a node in the SSA value graph. Every concrete type that
+// implements Node is also either a Value, an Instruction, or both.
+//
+// Node contains the methods common to Value and Instruction, plus the
+// Operands and Referrers methods generalized to return nil for
+// non-Instructions and non-Values, respectively.
+//
+// Node is provided to simplify SSA graph algorithms. Clients should
+// use the more specific and informative Value or Instruction
+// interfaces where appropriate.
+//
+type Node interface {
+ // Common methods:
+ String() string
+ Pos() token.Pos
+ Parent() *Function
+
+ // Partial methods:
+ Operands(rands []*Value) []*Value // nil for non-Instructions
+ Referrers() *[]Instruction // nil for non-Values
+}
+
+// Function represents the parameters, results, and code of a function
+// or method.
+//
+// If Blocks is nil, this indicates an external function for which no
+// Go source code is available. In this case, FreeVars and Locals
+// are nil too. Clients performing whole-program analysis must
+// handle external functions specially.
+//
+// Blocks contains the function's control-flow graph (CFG).
+// Blocks[0] is the function entry point; block order is not otherwise
+// semantically significant, though it may affect the readability of
+// the disassembly.
+// To iterate over the blocks in dominance order, use DomPreorder().
+//
+// Recover is an optional second entry point to which control resumes
+// after a recovered panic. The Recover block may contain only a return
+// statement, preceded by a load of the function's named return
+// parameters, if any.
+//
+// A nested function (Parent()!=nil) that refers to one or more
+// lexically enclosing local variables ("free variables") has FreeVars.
+// Such functions cannot be called directly but require a
+// value created by MakeClosure which, via its Bindings, supplies
+// values for these parameters.
+//
+// If the function is a method (Signature.Recv() != nil) then the first
+// element of Params is the receiver parameter.
+//
+// A Go package may declare many functions called "init".
+// For each one, Object().Name() returns "init" but Name() returns
+// "init#1", etc, in declaration order.
+//
+// Pos() returns the declaring ast.FuncLit.Type.Func or the position
+// of the ast.FuncDecl.Name, if the function was explicit in the
+// source. Synthetic wrappers, for which Synthetic != "", may share
+// the same position as the function they wrap.
+// Syntax.Pos() always returns the position of the declaring "func" token.
+//
+// Type() returns the function's Signature.
+//
+type Function struct {
+ name string
+ object types.Object // a declared *types.Func or one of its wrappers
+ method *types.Selection // info about provenance of synthetic methods
+ Signature *types.Signature
+ pos token.Pos
+
+ Synthetic string // provenance of synthetic function; "" for true source functions
+ syntax ast.Node // *ast.Func{Decl,Lit}; replaced with simple ast.Node after build, unless debug mode
+ parent *Function // enclosing function if anon; nil if global
+ Pkg *Package // enclosing package; nil for shared funcs (wrappers and error.Error)
+ Prog *Program // enclosing program
+ Params []*Parameter // function parameters; for methods, includes receiver
+ FreeVars []*FreeVar // free variables whose values must be supplied by closure
+ Locals []*Alloc // local variables of this function
+ Blocks []*BasicBlock // basic blocks of the function; nil => external
+ Recover *BasicBlock // optional; control transfers here after recovered panic
+ AnonFuncs []*Function // anonymous functions directly beneath this one
+ referrers []Instruction // referring instructions (iff Parent() != nil)
+
+ // The following fields are set transiently during building,
+ // then cleared.
+ currentBlock *BasicBlock // where to emit code
+ objects map[types.Object]Value // addresses of local variables
+ namedResults []*Alloc // tuple of named results
+ targets *targets // linked stack of branch targets
+ lblocks map[*ast.Object]*lblock // labelled blocks
+}
+
+// BasicBlock represents an SSA basic block.
+//
+// The final element of Instrs is always an explicit transfer of
+// control (If, Jump, Return, or Panic).
+//
+// A block may contain no Instructions only if it is unreachable,
+// i.e., Preds is nil. Empty blocks are typically pruned.
+//
+// BasicBlocks and their Preds/Succs relation form a (possibly cyclic)
+// graph independent of the SSA Value graph: the control-flow graph or
+// CFG. It is illegal for multiple edges to exist between the same
+// pair of blocks.
+//
+// Each BasicBlock is also a node in the dominator tree of the CFG.
+// The tree may be navigated using Idom()/Dominees() and queried using
+// Dominates().
+//
+// The order of Preds and Succs is significant (to Phi and If
+// instructions, respectively).
+//
+type BasicBlock struct {
+ Index int // index of this block within Parent().Blocks
+ Comment string // optional label; no semantic significance
+ parent *Function // parent function
+ Instrs []Instruction // instructions in order
+ Preds, Succs []*BasicBlock // predecessors and successors
+ succs2 [2]*BasicBlock // initial space for Succs
+ dom domInfo // dominator tree info
+ gaps int // number of nil Instrs (transient)
+ rundefers int // number of rundefers (transient)
+}
+
+// Pure values ----------------------------------------
+
+// A FreeVar represents a free variable of the function to which it
+// belongs.
+//
+// FreeVars are used to implement anonymous functions, whose free
+// variables are lexically captured in a closure formed by
+// MakeClosure. The value of such a free var is an Alloc or another
+// FreeVar and is considered a potentially escaping heap address, with
+// pointer type.
+//
+// FreeVars are also used to implement bound method closures. Such a
+// free var represents the receiver value and may be of any type that
+// has concrete methods.
+//
+// Pos() returns the position of the value that was captured, which
+// belongs to an enclosing function.
+//
+type FreeVar struct {
+ name string
+ typ types.Type
+ pos token.Pos
+ parent *Function
+ referrers []Instruction
+
+ // Transiently needed during building.
+ outer Value // the Value captured from the enclosing context.
+}
+
+// A Parameter represents an input parameter of a function.
+//
+type Parameter struct {
+ name string
+ object types.Object // a *types.Var; nil for non-source locals
+ typ types.Type
+ pos token.Pos
+ parent *Function
+ referrers []Instruction
+}
+
+// A Const represents the value of a constant expression.
+//
+// The underlying type of a constant may be any boolean, numeric, or
+// string type. In addition, a Const may represent the nil value of
+// any reference type---interface, map, channel, pointer, slice, or
+// function---but not "untyped nil".
+//
+// All source-level constant expressions are represented by a Const
+// of the same type and value.
+//
+// Value holds the value of the constant, independent of its Type(),
+// using go/constant representation, or nil for a typed nil value.
+//
+// Pos() returns token.NoPos.
+//
+// Example printed form:
+// 42:int
+// "hello":untyped string
+// 3+4i:MyComplex
+//
+type Const struct {
+ typ types.Type
+ Value constant.Value
+}
+
+// A Global is a named Value holding the address of a package-level
+// variable.
+//
+// Pos() returns the position of the ast.ValueSpec.Names[*]
+// identifier.
+//
+type Global struct {
+ name string
+ object types.Object // a *types.Var; may be nil for synthetics e.g. init$guard
+ typ types.Type
+ pos token.Pos
+
+ Pkg *Package
+}
+
+// A Builtin represents a specific use of a built-in function, e.g. len.
+//
+// Builtins are immutable values. Builtins do not have addresses.
+// Builtins can only appear in CallCommon.Func.
+//
+// Name() indicates the function: one of the built-in functions from the
+// Go spec (excluding "make" and "new") or one of these ssa-defined
+// intrinsics:
+//
+// // wrapnilchk returns ptr if non-nil, panics otherwise.
+// // (For use in indirection wrappers.)
+// func ssa:wrapnilchk(ptr *T, recvType, methodName string) *T
+//
+// Object() returns a *types.Builtin for built-ins defined by the spec,
+// nil for others.
+//
+// Type() returns a *types.Signature representing the effective
+// signature of the built-in for this call.
+//
+type Builtin struct {
+ name string
+ sig *types.Signature
+}
+
+// Value-defining instructions ----------------------------------------
+
+// The Alloc instruction reserves space for a variable of the given type,
+// zero-initializes it, and yields its address.
+//
+// Alloc values are always addresses, and have pointer types, so the
+// type of the allocated variable is actually
+// Type().Underlying().(*types.Pointer).Elem().
+//
+// If Heap is false, Alloc allocates space in the function's
+// activation record (frame); we refer to an Alloc(Heap=false) as a
+// "local" alloc. Each local Alloc returns the same address each time
+// it is executed within the same activation; the space is
+// re-initialized to zero.
+//
+// If Heap is true, Alloc allocates space in the heap; we
+// refer to an Alloc(Heap=true) as a "new" alloc. Each new Alloc
+// returns a different address each time it is executed.
+//
+// When Alloc is applied to a channel, map or slice type, it returns
+// the address of an uninitialized (nil) reference of that kind; store
+// the result of MakeSlice, MakeMap or MakeChan in that location to
+// instantiate these types.
+//
+// Pos() returns the ast.CompositeLit.Lbrace for a composite literal,
+// or the ast.CallExpr.Rparen for a call to new() or for a call that
+// allocates a varargs slice.
+//
+// Example printed form:
+// t0 = local int
+// t1 = new int
+//
+type Alloc struct {
+ register
+ Comment string
+ Heap bool
+ index int // dense numbering; for lifting
+}
+
+// The Phi instruction represents an SSA φ-node, which combines values
+// that differ across incoming control-flow edges and yields a new
+// value. Within a block, all φ-nodes must appear before all non-φ
+// nodes.
+//
+// Pos() returns the position of the && or || for short-circuit
+// control-flow joins, or that of the *Alloc for φ-nodes inserted
+// during SSA renaming.
+//
+// Example printed form:
+// t2 = phi [0: t0, 1: t1]
+//
+type Phi struct {
+ register
+ Comment string // a hint as to its purpose
+ Edges []Value // Edges[i] is value for Block().Preds[i]
+}
+
+// The Call instruction represents a function or method call.
+//
+// The Call instruction yields the function result if there is exactly
+// one. Otherwise it returns a tuple, the components of which are
+// accessed via Extract.
+//
+// See CallCommon for generic function call documentation.
+//
+// Pos() returns the ast.CallExpr.Lparen, if explicit in the source.
+//
+// Example printed form:
+// t2 = println(t0, t1)
+// t4 = t3()
+// t7 = invoke t5.Println(...t6)
+//
+type Call struct {
+ register
+ Call CallCommon
+}
+
+// The BinOp instruction yields the result of binary operation X Op Y.
+//
+// Pos() returns the ast.BinaryExpr.OpPos, if explicit in the source.
+//
+// Example printed form:
+// t1 = t0 + 1:int
+//
+type BinOp struct {
+ register
+ // One of:
+ // ADD SUB MUL QUO REM + - * / %
+ // AND OR XOR SHL SHR AND_NOT & | ^ << >> &^
+ // EQL NEQ LSS LEQ GTR GEQ == != < <= < >=
+ Op token.Token
+ X, Y Value
+}
+
+// The UnOp instruction yields the result of Op X.
+// ARROW is channel receive.
+// MUL is pointer indirection (load).
+// XOR is bitwise complement.
+// SUB is negation.
+// NOT is logical negation.
+//
+// If CommaOk and Op=ARROW, the result is a 2-tuple of the value above
+// and a boolean indicating the success of the receive. The
+// components of the tuple are accessed using Extract.
+//
+// Pos() returns the ast.UnaryExpr.OpPos, if explicit in the source.
+// For receive operations (ARROW) implicit in ranging over a channel,
+// Pos() returns the ast.RangeStmt.For.
+// For implicit memory loads (STAR), Pos() returns the position of the
+// most closely associated source-level construct; the details are not
+// specified.
+//
+// Example printed form:
+// t0 = *x
+// t2 = <-t1,ok
+//
+type UnOp struct {
+ register
+ Op token.Token // One of: NOT SUB ARROW MUL XOR ! - <- * ^
+ X Value
+ CommaOk bool
+}
+
+// The ChangeType instruction applies to X a value-preserving type
+// change to Type().
+//
+// Type changes are permitted:
+// - between a named type and its underlying type.
+// - between two named types of the same underlying type.
+// - between (possibly named) pointers to identical base types.
+// - from a bidirectional channel to a read- or write-channel,
+// optionally adding/removing a name.
+//
+// This operation cannot fail dynamically.
+//
+// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
+// from an explicit conversion in the source.
+//
+// Example printed form:
+// t1 = changetype *int <- IntPtr (t0)
+//
+type ChangeType struct {
+ register
+ X Value
+}
+
+// The Convert instruction yields the conversion of value X to type
+// Type(). One or both of those types is basic (but possibly named).
+//
+// A conversion may change the value and representation of its operand.
+// Conversions are permitted:
+// - between real numeric types.
+// - between complex numeric types.
+// - between string and []byte or []rune.
+// - between pointers and unsafe.Pointer.
+// - between unsafe.Pointer and uintptr.
+// - from (Unicode) integer to (UTF-8) string.
+// A conversion may imply a type name change also.
+//
+// This operation cannot fail dynamically.
+//
+// Conversions of untyped string/number/bool constants to a specific
+// representation are eliminated during SSA construction.
+//
+// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
+// from an explicit conversion in the source.
+//
+// Example printed form:
+// t1 = convert []byte <- string (t0)
+//
+type Convert struct {
+ register
+ X Value
+}
+
+// ChangeInterface constructs a value of one interface type from a
+// value of another interface type known to be assignable to it.
+// This operation cannot fail.
+//
+// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
+// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
+// instruction arose from an explicit e.(T) operation; or token.NoPos
+// otherwise.
+//
+// Example printed form:
+// t1 = change interface interface{} <- I (t0)
+//
+type ChangeInterface struct {
+ register
+ X Value
+}
+
+// MakeInterface constructs an instance of an interface type from a
+// value of a concrete type.
+//
+// Use Program.MethodSets.MethodSet(X.Type()) to find the method-set
+// of X, and Program.MethodValue(m) to find the implementation of a method.
+//
+// To construct the zero value of an interface type T, use:
+// NewConst(constant.MakeNil(), T, pos)
+//
+// Pos() returns the ast.CallExpr.Lparen, if the instruction arose
+// from an explicit conversion in the source.
+//
+// Example printed form:
+// t1 = make interface{} <- int (42:int)
+// t2 = make Stringer <- t0
+//
+type MakeInterface struct {
+ register
+ X Value
+}
+
+// The MakeClosure instruction yields a closure value whose code is
+// Fn and whose free variables' values are supplied by Bindings.
+//
+// Type() returns a (possibly named) *types.Signature.
+//
+// Pos() returns the ast.FuncLit.Type.Func for a function literal
+// closure or the ast.SelectorExpr.Sel for a bound method closure.
+//
+// Example printed form:
+// t0 = make closure anon@1.2 [x y z]
+// t1 = make closure bound$(main.I).add [i]
+//
+type MakeClosure struct {
+ register
+ Fn Value // always a *Function
+ Bindings []Value // values for each free variable in Fn.FreeVars
+}
+
+// The MakeMap instruction creates a new hash-table-based map object
+// and yields a value of kind map.
+//
+// Type() returns a (possibly named) *types.Map.
+//
+// Pos() returns the ast.CallExpr.Lparen, if created by make(map), or
+// the ast.CompositeLit.Lbrack if created by a literal.
+//
+// Example printed form:
+// t1 = make map[string]int t0
+// t1 = make StringIntMap t0
+//
+type MakeMap struct {
+ register
+ Reserve Value // initial space reservation; nil => default
+}
+
+// The MakeChan instruction creates a new channel object and yields a
+// value of kind chan.
+//
+// Type() returns a (possibly named) *types.Chan.
+//
+// Pos() returns the ast.CallExpr.Lparen for the make(chan) that
+// created it.
+//
+// Example printed form:
+// t0 = make chan int 0
+// t0 = make IntChan 0
+//
+type MakeChan struct {
+ register
+ Size Value // int; size of buffer; zero => synchronous.
+}
+
+// The MakeSlice instruction yields a slice of length Len backed by a
+// newly allocated array of length Cap.
+//
+// Both Len and Cap must be non-nil Values of integer type.
+//
+// (Alloc(types.Array) followed by Slice will not suffice because
+// Alloc can only create arrays of constant length.)
+//
+// Type() returns a (possibly named) *types.Slice.
+//
+// Pos() returns the ast.CallExpr.Lparen for the make([]T) that
+// created it.
+//
+// Example printed form:
+// t1 = make []string 1:int t0
+// t1 = make StringSlice 1:int t0
+//
+type MakeSlice struct {
+ register
+ Len Value
+ Cap Value
+}
+
+// The Slice instruction yields a slice of an existing string, slice
+// or *array X between optional integer bounds Low and High.
+//
+// Dynamically, this instruction panics if X evaluates to a nil *array
+// pointer.
+//
+// Type() returns string if the type of X was string, otherwise a
+// *types.Slice with the same element type as X.
+//
+// Pos() returns the ast.SliceExpr.Lbrack if created by a x[:] slice
+// operation, the ast.CompositeLit.Lbrace if created by a literal, or
+// NoPos if not explicit in the source (e.g. a variadic argument slice).
+//
+// Example printed form:
+// t1 = slice t0[1:]
+//
+type Slice struct {
+ register
+ X Value // slice, string, or *array
+ Low, High, Max Value // each may be nil
+}
+
+// The FieldAddr instruction yields the address of Field of *struct X.
+//
+// The field is identified by its index within the field list of the
+// struct type of X.
+//
+// Dynamically, this instruction panics if X evaluates to a nil
+// pointer.
+//
+// Type() returns a (possibly named) *types.Pointer.
+//
+// Pos() returns the position of the ast.SelectorExpr.Sel for the
+// field, if explicit in the source.
+//
+// Example printed form:
+// t1 = &t0.name [#1]
+//
+type FieldAddr struct {
+ register
+ X Value // *struct
+ Field int // field is X.Type().Underlying().(*types.Pointer).Elem().Underlying().(*types.Struct).Field(Field)
+}
+
+// The Field instruction yields the Field of struct X.
+//
+// The field is identified by its index within the field list of the
+// struct type of X; by using numeric indices we avoid ambiguity of
+// package-local identifiers and permit compact representations.
+//
+// Pos() returns the position of the ast.SelectorExpr.Sel for the
+// field, if explicit in the source.
+//
+// Example printed form:
+// t1 = t0.name [#1]
+//
+type Field struct {
+ register
+ X Value // struct
+ Field int // index into X.Type().(*types.Struct).Fields
+}
+
+// The IndexAddr instruction yields the address of the element at
+// index Index of collection X. Index is an integer expression.
+//
+// The elements of maps and strings are not addressable; use Lookup or
+// MapUpdate instead.
+//
+// Dynamically, this instruction panics if X evaluates to a nil *array
+// pointer.
+//
+// Type() returns a (possibly named) *types.Pointer.
+//
+// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
+// explicit in the source.
+//
+// Example printed form:
+// t2 = &t0[t1]
+//
+type IndexAddr struct {
+ register
+ X Value // slice or *array,
+ Index Value // numeric index
+}
+
+// The Index instruction yields element Index of array X.
+//
+// Pos() returns the ast.IndexExpr.Lbrack for the index operation, if
+// explicit in the source.
+//
+// Example printed form:
+// t2 = t0[t1]
+//
+type Index struct {
+ register
+ X Value // array
+ Index Value // integer index
+}
+
+// The Lookup instruction yields element Index of collection X, a map
+// or string. Index is an integer expression if X is a string or the
+// appropriate key type if X is a map.
+//
+// If CommaOk, the result is a 2-tuple of the value above and a
+// boolean indicating the result of a map membership test for the key.
+// The components of the tuple are accessed using Extract.
+//
+// Pos() returns the ast.IndexExpr.Lbrack, if explicit in the source.
+//
+// Example printed form:
+// t2 = t0[t1]
+// t5 = t3[t4],ok
+//
+type Lookup struct {
+ register
+ X Value // string or map
+ Index Value // numeric or key-typed index
+ CommaOk bool // return a value,ok pair
+}
+
+// SelectState is a helper for Select.
+// It represents one goal state and its corresponding communication.
+//
+type SelectState struct {
+ Dir types.ChanDir // direction of case (SendOnly or RecvOnly)
+ Chan Value // channel to use (for send or receive)
+ Send Value // value to send (for send)
+ Pos token.Pos // position of token.ARROW
+ DebugNode ast.Node // ast.SendStmt or ast.UnaryExpr(<-) [debug mode]
+}
+
+// The Select instruction tests whether (or blocks until) one
+// of the specified sent or received states is entered.
+//
+// Let n be the number of States for which Dir==RECV and T_i (0<=i string iterator; false => map iterator.
+}
+
+// The TypeAssert instruction tests whether interface value X has type
+// AssertedType.
+//
+// If !CommaOk, on success it returns v, the result of the conversion
+// (defined below); on failure it panics.
+//
+// If CommaOk: on success it returns a pair (v, true) where v is the
+// result of the conversion; on failure it returns (z, false) where z
+// is AssertedType's zero value. The components of the pair must be
+// accessed using the Extract instruction.
+//
+// If AssertedType is a concrete type, TypeAssert checks whether the
+// dynamic type in interface X is equal to it, and if so, the result
+// of the conversion is a copy of the value in the interface.
+//
+// If AssertedType is an interface, TypeAssert checks whether the
+// dynamic type of the interface is assignable to it, and if so, the
+// result of the conversion is a copy of the interface value X.
+// If AssertedType is a superinterface of X.Type(), the operation will
+// fail iff the operand is nil. (Contrast with ChangeInterface, which
+// performs no nil-check.)
+//
+// Type() reflects the actual type of the result, possibly a
+// 2-types.Tuple; AssertedType is the asserted type.
+//
+// Pos() returns the ast.CallExpr.Lparen if the instruction arose from
+// an explicit T(e) conversion; the ast.TypeAssertExpr.Lparen if the
+// instruction arose from an explicit e.(T) operation; or the
+// ast.CaseClause.Case if the instruction arose from a case of a
+// type-switch statement.
+//
+// Example printed form:
+// t1 = typeassert t0.(int)
+// t3 = typeassert,ok t2.(T)
+//
+type TypeAssert struct {
+ register
+ X Value
+ AssertedType types.Type
+ CommaOk bool
+}
+
+// The Extract instruction yields component Index of Tuple.
+//
+// This is used to access the results of instructions with multiple
+// return values, such as Call, TypeAssert, Next, UnOp(ARROW) and
+// IndexExpr(Map).
+//
+// Example printed form:
+// t1 = extract t0 #1
+//
+type Extract struct {
+ register
+ Tuple Value
+ Index int
+}
+
+// Instructions executed for effect. They do not yield a value. --------------------
+
+// The Jump instruction transfers control to the sole successor of its
+// owning block.
+//
+// A Jump must be the last instruction of its containing BasicBlock.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// jump done
+//
+type Jump struct {
+ anInstruction
+}
+
+// The If instruction transfers control to one of the two successors
+// of its owning block, depending on the boolean Cond: the first if
+// true, the second if false.
+//
+// An If instruction must be the last instruction of its containing
+// BasicBlock.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// if t0 goto done else body
+//
+type If struct {
+ anInstruction
+ Cond Value
+}
+
+// The Return instruction returns values and control back to the calling
+// function.
+//
+// len(Results) is always equal to the number of results in the
+// function's signature.
+//
+// If len(Results) > 1, Return returns a tuple value with the specified
+// components which the caller must access using Extract instructions.
+//
+// There is no instruction to return a ready-made tuple like those
+// returned by a "value,ok"-mode TypeAssert, Lookup or UnOp(ARROW) or
+// a tail-call to a function with multiple result parameters.
+//
+// Return must be the last instruction of its containing BasicBlock.
+// Such a block has no successors.
+//
+// Pos() returns the ast.ReturnStmt.Return, if explicit in the source.
+//
+// Example printed form:
+// return
+// return nil:I, 2:int
+//
+type Return struct {
+ anInstruction
+ Results []Value
+ pos token.Pos
+}
+
+// The RunDefers instruction pops and invokes the entire stack of
+// procedure calls pushed by Defer instructions in this function.
+//
+// It is legal to encounter multiple 'rundefers' instructions in a
+// single control-flow path through a function; this is useful in
+// the combined init() function, for example.
+//
+// Pos() returns NoPos.
+//
+// Example printed form:
+// rundefers
+//
+type RunDefers struct {
+ anInstruction
+}
+
+// The Panic instruction initiates a panic with value X.
+//
+// A Panic instruction must be the last instruction of its containing
+// BasicBlock, which must have no successors.
+//
+// NB: 'go panic(x)' and 'defer panic(x)' do not use this instruction;
+// they are treated as calls to a built-in function.
+//
+// Pos() returns the ast.CallExpr.Lparen if this panic was explicit
+// in the source.
+//
+// Example printed form:
+// panic t0
+//
+type Panic struct {
+ anInstruction
+ X Value // an interface{}
+ pos token.Pos
+}
+
+// The Go instruction creates a new goroutine and calls the specified
+// function within it.
+//
+// See CallCommon for generic function call documentation.
+//
+// Pos() returns the ast.GoStmt.Go.
+//
+// Example printed form:
+// go println(t0, t1)
+// go t3()
+// go invoke t5.Println(...t6)
+//
+type Go struct {
+ anInstruction
+ Call CallCommon
+ pos token.Pos
+}
+
+// The Defer instruction pushes the specified call onto a stack of
+// functions to be called by a RunDefers instruction or by a panic.
+//
+// See CallCommon for generic function call documentation.
+//
+// Pos() returns the ast.DeferStmt.Defer.
+//
+// Example printed form:
+// defer println(t0, t1)
+// defer t3()
+// defer invoke t5.Println(...t6)
+//
+type Defer struct {
+ anInstruction
+ Call CallCommon
+ pos token.Pos
+}
+
+// The Send instruction sends X on channel Chan.
+//
+// Pos() returns the ast.SendStmt.Arrow, if explicit in the source.
+//
+// Example printed form:
+// send t0 <- t1
+//
+type Send struct {
+ anInstruction
+ Chan, X Value
+ pos token.Pos
+}
+
+// The Store instruction stores Val at address Addr.
+// Stores can be of arbitrary types.
+//
+// Pos() returns the position of the source-level construct most closely
+// associated with the memory store operation.
+// Since implicit memory stores are numerous and varied and depend upon
+// implementation choices, the details are not specified.
+//
+// Example printed form:
+// *x = y
+//
+type Store struct {
+ anInstruction
+ Addr Value
+ Val Value
+ pos token.Pos
+}
+
+// The MapUpdate instruction updates the association of Map[Key] to
+// Value.
+//
+// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack,
+// if explicit in the source.
+//
+// Example printed form:
+// t0[t1] = t2
+//
+type MapUpdate struct {
+ anInstruction
+ Map Value
+ Key Value
+ Value Value
+ pos token.Pos
+}
+
+// A DebugRef instruction maps a source-level expression Expr to the
+// SSA value X that represents the value (!IsAddr) or address (IsAddr)
+// of that expression.
+//
+// DebugRef is a pseudo-instruction: it has no dynamic effect.
+//
+// Pos() returns Expr.Pos(), the start position of the source-level
+// expression. This is not the same as the "designated" token as
+// documented at Value.Pos(). e.g. CallExpr.Pos() does not return the
+// position of the ("designated") Lparen token.
+//
+// If Expr is an *ast.Ident denoting a var or func, Object() returns
+// the object; though this information can be obtained from the type
+// checker, including it here greatly facilitates debugging.
+// For non-Ident expressions, Object() returns nil.
+//
+// DebugRefs are generated only for functions built with debugging
+// enabled; see Package.SetDebugMode() and the GlobalDebug builder
+// mode flag.
+//
+// DebugRefs are not emitted for ast.Idents referring to constants or
+// predeclared identifiers, since they are trivial and numerous.
+// Nor are they emitted for ast.ParenExprs.
+//
+// (By representing these as instructions, rather than out-of-band,
+// consistency is maintained during transformation passes by the
+// ordinary SSA renaming machinery.)
+//
+// Example printed form:
+// ; *ast.CallExpr @ 102:9 is t5
+// ; var x float64 @ 109:72 is x
+// ; address of *ast.CompositeLit @ 216:10 is t0
+//
+type DebugRef struct {
+ anInstruction
+ Expr ast.Expr // the referring expression (never *ast.ParenExpr)
+ object types.Object // the identity of the source var/func
+ IsAddr bool // Expr is addressable and X is the address it denotes
+ X Value // the value or address of Expr
+}
+
+// Embeddable mix-ins and helpers for common parts of other structs. -----------
+
+// register is a mix-in embedded by all SSA values that are also
+// instructions, i.e. virtual registers, and provides a uniform
+// implementation of most of the Value interface: Value.Name() is a
+// numbered register (e.g. "t0"); the other methods are field accessors.
+//
+// Temporary names are automatically assigned to each register on
+// completion of building a function in SSA form.
+//
+// Clients must not assume that the 'id' value (and the Name() derived
+// from it) is unique within a function. As always in this API,
+// semantics are determined only by identity; names exist only to
+// facilitate debugging.
+//
+type register struct {
+ anInstruction
+ num int // "name" of virtual register, e.g. "t0". Not guaranteed unique.
+ typ types.Type // type of virtual register
+ pos token.Pos // position of source expression, or NoPos
+ referrers []Instruction
+}
+
+// anInstruction is a mix-in embedded by all Instructions.
+// It provides the implementations of the Block and setBlock methods.
+type anInstruction struct {
+ block *BasicBlock // the basic block of this instruction
+}
+
+// CallCommon is contained by Go, Defer and Call to hold the
+// common parts of a function or method call.
+//
+// Each CallCommon exists in one of two modes, function call and
+// interface method invocation, or "call" and "invoke" for short.
+//
+// 1. "call" mode: when Method is nil (!IsInvoke), a CallCommon
+// represents an ordinary function call of the value in Value,
+// which may be a *Builtin, a *Function or any other value of kind
+// 'func'.
+//
+// Value may be one of:
+// (a) a *Function, indicating a statically dispatched call
+// to a package-level function, an anonymous function, or
+// a method of a named type.
+// (b) a *MakeClosure, indicating an immediately applied
+// function literal with free variables.
+// (c) a *Builtin, indicating a statically dispatched call
+// to a built-in function.
+// (d) any other value, indicating a dynamically dispatched
+// function call.
+// StaticCallee returns the identity of the callee in cases
+// (a) and (b), nil otherwise.
+//
+// Args contains the arguments to the call. If Value is a method,
+// Args[0] contains the receiver parameter.
+//
+// Example printed form:
+// t2 = println(t0, t1)
+// go t3()
+// defer t5(...t6)
+//
+// 2. "invoke" mode: when Method is non-nil (IsInvoke), a CallCommon
+// represents a dynamically dispatched call to an interface method.
+// In this mode, Value is the interface value and Method is the
+// interface's abstract method. Note: an abstract method may be
+// shared by multiple interfaces due to embedding; Value.Type()
+// provides the specific interface used for this call.
+//
+// Value is implicitly supplied to the concrete method implementation
+// as the receiver parameter; in other words, Args[0] holds not the
+// receiver but the first true argument.
+//
+// Example printed form:
+// t1 = invoke t0.String()
+// go invoke t3.Run(t2)
+// defer invoke t4.Handle(...t5)
+//
+// For all calls to variadic functions (Signature().Variadic()),
+// the last element of Args is a slice.
+//
+type CallCommon struct {
+ Value Value // receiver (invoke mode) or func value (call mode)
+ Method *types.Func // abstract method (invoke mode)
+ Args []Value // actual parameters (in static method call, includes receiver)
+ pos token.Pos // position of CallExpr.Lparen, iff explicit in source
+}
+
+// IsInvoke returns true if this call has "invoke" (not "call") mode.
+func (c *CallCommon) IsInvoke() bool {
+ return c.Method != nil
+}
+
+func (c *CallCommon) Pos() token.Pos { return c.pos }
+
+// Signature returns the signature of the called function.
+//
+// For an "invoke"-mode call, the signature of the interface method is
+// returned.
+//
+// In either "call" or "invoke" mode, if the callee is a method, its
+// receiver is represented by sig.Recv, not sig.Params().At(0).
+//
+func (c *CallCommon) Signature() *types.Signature {
+ if c.Method != nil {
+ return c.Method.Type().(*types.Signature)
+ }
+ return c.Value.Type().Underlying().(*types.Signature)
+}
+
+// StaticCallee returns the callee if this is a trivially static
+// "call"-mode call to a function.
+func (c *CallCommon) StaticCallee() *Function {
+ switch fn := c.Value.(type) {
+ case *Function:
+ return fn
+ case *MakeClosure:
+ return fn.Fn.(*Function)
+ }
+ return nil
+}
+
+// Description returns a description of the mode of this call suitable
+// for a user interface, e.g., "static method call".
+func (c *CallCommon) Description() string {
+ switch fn := c.Value.(type) {
+ case *Builtin:
+ return "built-in function call"
+ case *MakeClosure:
+ return "static function closure call"
+ case *Function:
+ if fn.Signature.Recv() != nil {
+ return "static method call"
+ }
+ return "static function call"
+ }
+ if c.IsInvoke() {
+ return "dynamic method call" // ("invoke" mode)
+ }
+ return "dynamic function call"
+}
+
+// The CallInstruction interface, implemented by *Go, *Defer and *Call,
+// exposes the common parts of function-calling instructions,
+// yet provides a way back to the Value defined by *Call alone.
+//
+type CallInstruction interface {
+ Instruction
+ Common() *CallCommon // returns the common parts of the call
+ Value() *Call // returns the result value of the call (*Call) or nil (*Go, *Defer)
+}
+
+func (s *Call) Common() *CallCommon { return &s.Call }
+func (s *Defer) Common() *CallCommon { return &s.Call }
+func (s *Go) Common() *CallCommon { return &s.Call }
+
+func (s *Call) Value() *Call { return s }
+func (s *Defer) Value() *Call { return nil }
+func (s *Go) Value() *Call { return nil }
+
+func (v *Builtin) Type() types.Type { return v.sig }
+func (v *Builtin) Name() string { return v.name }
+func (*Builtin) Referrers() *[]Instruction { return nil }
+func (v *Builtin) Pos() token.Pos { return token.NoPos }
+func (v *Builtin) Object() types.Object { return types.Universe.Lookup(v.name) }
+func (v *Builtin) Parent() *Function { return nil }
+
+func (v *FreeVar) Type() types.Type { return v.typ }
+func (v *FreeVar) Name() string { return v.name }
+func (v *FreeVar) Referrers() *[]Instruction { return &v.referrers }
+func (v *FreeVar) Pos() token.Pos { return v.pos }
+func (v *FreeVar) Parent() *Function { return v.parent }
+
+func (v *Global) Type() types.Type { return v.typ }
+func (v *Global) Name() string { return v.name }
+func (v *Global) Parent() *Function { return nil }
+func (v *Global) Pos() token.Pos { return v.pos }
+func (v *Global) Referrers() *[]Instruction { return nil }
+func (v *Global) Token() token.Token { return token.VAR }
+func (v *Global) Object() types.Object { return v.object }
+func (v *Global) String() string { return v.RelString(nil) }
+func (v *Global) Package() *Package { return v.Pkg }
+func (v *Global) RelString(from *types.Package) string { return relString(v, from) }
+
+func (v *Function) Name() string { return v.name }
+func (v *Function) Type() types.Type { return v.Signature }
+func (v *Function) Pos() token.Pos { return v.pos }
+func (v *Function) Token() token.Token { return token.FUNC }
+func (v *Function) Object() types.Object { return v.object }
+func (v *Function) String() string { return v.RelString(nil) }
+func (v *Function) Package() *Package { return v.Pkg }
+func (v *Function) Parent() *Function { return v.parent }
+func (v *Function) Referrers() *[]Instruction {
+ if v.parent != nil {
+ return &v.referrers
+ }
+ return nil
+}
+
+func (v *Parameter) Type() types.Type { return v.typ }
+func (v *Parameter) Name() string { return v.name }
+func (v *Parameter) Object() types.Object { return v.object }
+func (v *Parameter) Referrers() *[]Instruction { return &v.referrers }
+func (v *Parameter) Pos() token.Pos { return v.pos }
+func (v *Parameter) Parent() *Function { return v.parent }
+
+func (v *Alloc) Type() types.Type { return v.typ }
+func (v *Alloc) Referrers() *[]Instruction { return &v.referrers }
+func (v *Alloc) Pos() token.Pos { return v.pos }
+
+func (v *register) Type() types.Type { return v.typ }
+func (v *register) setType(typ types.Type) { v.typ = typ }
+func (v *register) Name() string { return fmt.Sprintf("t%d", v.num) }
+func (v *register) setNum(num int) { v.num = num }
+func (v *register) Referrers() *[]Instruction { return &v.referrers }
+func (v *register) Pos() token.Pos { return v.pos }
+func (v *register) setPos(pos token.Pos) { v.pos = pos }
+
+func (v *anInstruction) Parent() *Function { return v.block.parent }
+func (v *anInstruction) Block() *BasicBlock { return v.block }
+func (v *anInstruction) setBlock(block *BasicBlock) { v.block = block }
+func (v *anInstruction) Referrers() *[]Instruction { return nil }
+
+func (t *Type) Name() string { return t.object.Name() }
+func (t *Type) Pos() token.Pos { return t.object.Pos() }
+func (t *Type) Type() types.Type { return t.object.Type() }
+func (t *Type) Token() token.Token { return token.TYPE }
+func (t *Type) Object() types.Object { return t.object }
+func (t *Type) String() string { return t.RelString(nil) }
+func (t *Type) Package() *Package { return t.pkg }
+func (t *Type) RelString(from *types.Package) string { return relString(t, from) }
+
+func (c *NamedConst) Name() string { return c.object.Name() }
+func (c *NamedConst) Pos() token.Pos { return c.object.Pos() }
+func (c *NamedConst) String() string { return c.RelString(nil) }
+func (c *NamedConst) Type() types.Type { return c.object.Type() }
+func (c *NamedConst) Token() token.Token { return token.CONST }
+func (c *NamedConst) Object() types.Object { return c.object }
+func (c *NamedConst) Package() *Package { return c.pkg }
+func (c *NamedConst) RelString(from *types.Package) string { return relString(c, from) }
+
+// Func returns the package-level function of the specified name,
+// or nil if not found.
+//
+func (p *Package) Func(name string) (f *Function) {
+ f, _ = p.Members[name].(*Function)
+ return
+}
+
+// Var returns the package-level variable of the specified name,
+// or nil if not found.
+//
+func (p *Package) Var(name string) (g *Global) {
+ g, _ = p.Members[name].(*Global)
+ return
+}
+
+// Const returns the package-level constant of the specified name,
+// or nil if not found.
+//
+func (p *Package) Const(name string) (c *NamedConst) {
+ c, _ = p.Members[name].(*NamedConst)
+ return
+}
+
+// Type returns the package-level type of the specified name,
+// or nil if not found.
+//
+func (p *Package) Type(name string) (t *Type) {
+ t, _ = p.Members[name].(*Type)
+ return
+}
+
+func (v *Call) Pos() token.Pos { return v.Call.pos }
+func (s *Defer) Pos() token.Pos { return s.pos }
+func (s *Go) Pos() token.Pos { return s.pos }
+func (s *MapUpdate) Pos() token.Pos { return s.pos }
+func (s *Panic) Pos() token.Pos { return s.pos }
+func (s *Return) Pos() token.Pos { return s.pos }
+func (s *Send) Pos() token.Pos { return s.pos }
+func (s *Store) Pos() token.Pos { return s.pos }
+func (s *If) Pos() token.Pos { return token.NoPos }
+func (s *Jump) Pos() token.Pos { return token.NoPos }
+func (s *RunDefers) Pos() token.Pos { return token.NoPos }
+func (s *DebugRef) Pos() token.Pos { return s.Expr.Pos() }
+
+// Operands.
+
+func (v *Alloc) Operands(rands []*Value) []*Value {
+ return rands
+}
+
+func (v *BinOp) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Y)
+}
+
+func (c *CallCommon) Operands(rands []*Value) []*Value {
+ rands = append(rands, &c.Value)
+ for i := range c.Args {
+ rands = append(rands, &c.Args[i])
+ }
+ return rands
+}
+
+func (s *Go) Operands(rands []*Value) []*Value {
+ return s.Call.Operands(rands)
+}
+
+func (s *Call) Operands(rands []*Value) []*Value {
+ return s.Call.Operands(rands)
+}
+
+func (s *Defer) Operands(rands []*Value) []*Value {
+ return s.Call.Operands(rands)
+}
+
+func (v *ChangeInterface) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *ChangeType) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *Convert) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (s *DebugRef) Operands(rands []*Value) []*Value {
+ return append(rands, &s.X)
+}
+
+func (v *Extract) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Tuple)
+}
+
+func (v *Field) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *FieldAddr) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (s *If) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Cond)
+}
+
+func (v *Index) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Index)
+}
+
+func (v *IndexAddr) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Index)
+}
+
+func (*Jump) Operands(rands []*Value) []*Value {
+ return rands
+}
+
+func (v *Lookup) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Index)
+}
+
+func (v *MakeChan) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Size)
+}
+
+func (v *MakeClosure) Operands(rands []*Value) []*Value {
+ rands = append(rands, &v.Fn)
+ for i := range v.Bindings {
+ rands = append(rands, &v.Bindings[i])
+ }
+ return rands
+}
+
+func (v *MakeInterface) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *MakeMap) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Reserve)
+}
+
+func (v *MakeSlice) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Len, &v.Cap)
+}
+
+func (v *MapUpdate) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Map, &v.Key, &v.Value)
+}
+
+func (v *Next) Operands(rands []*Value) []*Value {
+ return append(rands, &v.Iter)
+}
+
+func (s *Panic) Operands(rands []*Value) []*Value {
+ return append(rands, &s.X)
+}
+
+func (v *Phi) Operands(rands []*Value) []*Value {
+ for i := range v.Edges {
+ rands = append(rands, &v.Edges[i])
+ }
+ return rands
+}
+
+func (v *Range) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (s *Return) Operands(rands []*Value) []*Value {
+ for i := range s.Results {
+ rands = append(rands, &s.Results[i])
+ }
+ return rands
+}
+
+func (*RunDefers) Operands(rands []*Value) []*Value {
+ return rands
+}
+
+func (v *Select) Operands(rands []*Value) []*Value {
+ for i := range v.States {
+ rands = append(rands, &v.States[i].Chan, &v.States[i].Send)
+ }
+ return rands
+}
+
+func (s *Send) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Chan, &s.X)
+}
+
+func (v *Slice) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X, &v.Low, &v.High, &v.Max)
+}
+
+func (s *Store) Operands(rands []*Value) []*Value {
+ return append(rands, &s.Addr, &s.Val)
+}
+
+func (v *TypeAssert) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+func (v *UnOp) Operands(rands []*Value) []*Value {
+ return append(rands, &v.X)
+}
+
+// Non-Instruction Values:
+func (v *Builtin) Operands(rands []*Value) []*Value { return rands }
+func (v *FreeVar) Operands(rands []*Value) []*Value { return rands }
+func (v *Const) Operands(rands []*Value) []*Value { return rands }
+func (v *Function) Operands(rands []*Value) []*Value { return rands }
+func (v *Global) Operands(rands []*Value) []*Value { return rands }
+func (v *Parameter) Operands(rands []*Value) []*Value { return rands }
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/load.go b/vendor/golang.org/x/tools/go/ssa/ssautil/load.go
new file mode 100644
index 00000000000..72710becf8f
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/ssautil/load.go
@@ -0,0 +1,175 @@
+// 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.
+
+package ssautil
+
+// This file defines utility functions for constructing programs in SSA form.
+
+import (
+ "go/ast"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/loader"
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/go/ssa"
+)
+
+// Packages creates an SSA program for a set of packages.
+//
+// The packages must have been loaded from source syntax using the
+// golang.org/x/tools/go/packages.Load function in LoadSyntax or
+// LoadAllSyntax mode.
+//
+// Packages creates an SSA package for each well-typed package in the
+// initial list, plus all their dependencies. The resulting list of
+// packages corresponds to the list of initial packages, and may contain
+// a nil if SSA code could not be constructed for the corresponding initial
+// package due to type errors.
+//
+// Code for bodies of functions is not built until Build is called on
+// the resulting Program. SSA code is constructed only for the initial
+// packages with well-typed syntax trees.
+//
+// The mode parameter controls diagnostics and checking during SSA construction.
+//
+func Packages(initial []*packages.Package, mode ssa.BuilderMode) (*ssa.Program, []*ssa.Package) {
+ return doPackages(initial, mode, false)
+}
+
+// AllPackages creates an SSA program for a set of packages plus all
+// their dependencies.
+//
+// The packages must have been loaded from source syntax using the
+// golang.org/x/tools/go/packages.Load function in LoadAllSyntax mode.
+//
+// AllPackages creates an SSA package for each well-typed package in the
+// initial list, plus all their dependencies. The resulting list of
+// packages corresponds to the list of intial packages, and may contain
+// a nil if SSA code could not be constructed for the corresponding
+// initial package due to type errors.
+//
+// Code for bodies of functions is not built until Build is called on
+// the resulting Program. SSA code is constructed for all packages with
+// well-typed syntax trees.
+//
+// The mode parameter controls diagnostics and checking during SSA construction.
+//
+func AllPackages(initial []*packages.Package, mode ssa.BuilderMode) (*ssa.Program, []*ssa.Package) {
+ return doPackages(initial, mode, true)
+}
+
+func doPackages(initial []*packages.Package, mode ssa.BuilderMode, deps bool) (*ssa.Program, []*ssa.Package) {
+
+ var fset *token.FileSet
+ if len(initial) > 0 {
+ fset = initial[0].Fset
+ }
+
+ prog := ssa.NewProgram(fset, mode)
+
+ isInitial := make(map[*packages.Package]bool, len(initial))
+ for _, p := range initial {
+ isInitial[p] = true
+ }
+
+ ssamap := make(map[*packages.Package]*ssa.Package)
+ packages.Visit(initial, nil, func(p *packages.Package) {
+ if p.Types != nil && !p.IllTyped {
+ var files []*ast.File
+ if deps || isInitial[p] {
+ files = p.Syntax
+ }
+ ssamap[p] = prog.CreatePackage(p.Types, files, p.TypesInfo, true)
+ }
+ })
+
+ var ssapkgs []*ssa.Package
+ for _, p := range initial {
+ ssapkgs = append(ssapkgs, ssamap[p]) // may be nil
+ }
+ return prog, ssapkgs
+}
+
+// CreateProgram returns a new program in SSA form, given a program
+// loaded from source. An SSA package is created for each transitively
+// error-free package of lprog.
+//
+// Code for bodies of functions is not built until Build is called
+// on the result.
+//
+// The mode parameter controls diagnostics and checking during SSA construction.
+//
+// Deprecated: use golang.org/x/tools/go/packages and the Packages
+// function instead; see ssa.ExampleLoadPackages.
+//
+func CreateProgram(lprog *loader.Program, mode ssa.BuilderMode) *ssa.Program {
+ prog := ssa.NewProgram(lprog.Fset, mode)
+
+ for _, info := range lprog.AllPackages {
+ if info.TransitivelyErrorFree {
+ prog.CreatePackage(info.Pkg, info.Files, &info.Info, info.Importable)
+ }
+ }
+
+ return prog
+}
+
+// BuildPackage builds an SSA program with IR for a single package.
+//
+// It populates pkg by type-checking the specified file ASTs. All
+// dependencies are loaded using the importer specified by tc, which
+// typically loads compiler export data; SSA code cannot be built for
+// those packages. BuildPackage then constructs an ssa.Program with all
+// dependency packages created, and builds and returns the SSA package
+// corresponding to pkg.
+//
+// The caller must have set pkg.Path() to the import path.
+//
+// The operation fails if there were any type-checking or import errors.
+//
+// See ../ssa/example_test.go for an example.
+//
+func BuildPackage(tc *types.Config, fset *token.FileSet, pkg *types.Package, files []*ast.File, mode ssa.BuilderMode) (*ssa.Package, *types.Info, error) {
+ if fset == nil {
+ panic("no token.FileSet")
+ }
+ if pkg.Path() == "" {
+ panic("package has no import path")
+ }
+
+ info := &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),
+ }
+ if err := types.NewChecker(tc, fset, pkg, info).Files(files); err != nil {
+ return nil, nil, err
+ }
+
+ prog := ssa.NewProgram(fset, mode)
+
+ // Create SSA packages for all imports.
+ // Order is not significant.
+ created := make(map[*types.Package]bool)
+ var createAll func(pkgs []*types.Package)
+ createAll = func(pkgs []*types.Package) {
+ for _, p := range pkgs {
+ if !created[p] {
+ created[p] = true
+ prog.CreatePackage(p, nil, nil, true)
+ createAll(p.Imports())
+ }
+ }
+ }
+ createAll(pkg.Imports())
+
+ // Create and build the primary package.
+ ssapkg := prog.CreatePackage(pkg, files, info, false)
+ ssapkg.Build()
+ return ssapkg, info, nil
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go b/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go
new file mode 100644
index 00000000000..db03bf55590
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/ssautil/switch.go
@@ -0,0 +1,234 @@
+// 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 ssautil
+
+// This file implements discovery of switch and type-switch constructs
+// from low-level control flow.
+//
+// Many techniques exist for compiling a high-level switch with
+// constant cases to efficient machine code. The optimal choice will
+// depend on the data type, the specific case values, the code in the
+// body of each case, and the hardware.
+// Some examples:
+// - a lookup table (for a switch that maps constants to constants)
+// - a computed goto
+// - a binary tree
+// - a perfect hash
+// - a two-level switch (to partition constant strings by their first byte).
+
+import (
+ "bytes"
+ "fmt"
+ "go/token"
+ "go/types"
+
+ "golang.org/x/tools/go/ssa"
+)
+
+// A ConstCase represents a single constant comparison.
+// It is part of a Switch.
+type ConstCase struct {
+ Block *ssa.BasicBlock // block performing the comparison
+ Body *ssa.BasicBlock // body of the case
+ Value *ssa.Const // case comparand
+}
+
+// A TypeCase represents a single type assertion.
+// It is part of a Switch.
+type TypeCase struct {
+ Block *ssa.BasicBlock // block performing the type assert
+ Body *ssa.BasicBlock // body of the case
+ Type types.Type // case type
+ Binding ssa.Value // value bound by this case
+}
+
+// A Switch is a logical high-level control flow operation
+// (a multiway branch) discovered by analysis of a CFG containing
+// only if/else chains. It is not part of the ssa.Instruction set.
+//
+// One of ConstCases and TypeCases has length >= 2;
+// the other is nil.
+//
+// In a value switch, the list of cases may contain duplicate constants.
+// A type switch may contain duplicate types, or types assignable
+// to an interface type also in the list.
+// TODO(adonovan): eliminate such duplicates.
+//
+type Switch struct {
+ Start *ssa.BasicBlock // block containing start of if/else chain
+ X ssa.Value // the switch operand
+ ConstCases []ConstCase // ordered list of constant comparisons
+ TypeCases []TypeCase // ordered list of type assertions
+ Default *ssa.BasicBlock // successor if all comparisons fail
+}
+
+func (sw *Switch) String() string {
+ // We represent each block by the String() of its
+ // first Instruction, e.g. "print(42:int)".
+ var buf bytes.Buffer
+ if sw.ConstCases != nil {
+ fmt.Fprintf(&buf, "switch %s {\n", sw.X.Name())
+ for _, c := range sw.ConstCases {
+ fmt.Fprintf(&buf, "case %s: %s\n", c.Value, c.Body.Instrs[0])
+ }
+ } else {
+ fmt.Fprintf(&buf, "switch %s.(type) {\n", sw.X.Name())
+ for _, c := range sw.TypeCases {
+ fmt.Fprintf(&buf, "case %s %s: %s\n",
+ c.Binding.Name(), c.Type, c.Body.Instrs[0])
+ }
+ }
+ if sw.Default != nil {
+ fmt.Fprintf(&buf, "default: %s\n", sw.Default.Instrs[0])
+ }
+ fmt.Fprintf(&buf, "}")
+ return buf.String()
+}
+
+// Switches examines the control-flow graph of fn and returns the
+// set of inferred value and type switches. A value switch tests an
+// ssa.Value for equality against two or more compile-time constant
+// values. Switches involving link-time constants (addresses) are
+// ignored. A type switch type-asserts an ssa.Value against two or
+// more types.
+//
+// The switches are returned in dominance order.
+//
+// The resulting switches do not necessarily correspond to uses of the
+// 'switch' keyword in the source: for example, a single source-level
+// switch statement with non-constant cases may result in zero, one or
+// many Switches, one per plural sequence of constant cases.
+// Switches may even be inferred from if/else- or goto-based control flow.
+// (In general, the control flow constructs of the source program
+// cannot be faithfully reproduced from the SSA representation.)
+//
+func Switches(fn *ssa.Function) []Switch {
+ // Traverse the CFG in dominance order, so we don't
+ // enter an if/else-chain in the middle.
+ var switches []Switch
+ seen := make(map[*ssa.BasicBlock]bool) // TODO(adonovan): opt: use ssa.blockSet
+ for _, b := range fn.DomPreorder() {
+ if x, k := isComparisonBlock(b); x != nil {
+ // Block b starts a switch.
+ sw := Switch{Start: b, X: x}
+ valueSwitch(&sw, k, seen)
+ if len(sw.ConstCases) > 1 {
+ switches = append(switches, sw)
+ }
+ }
+
+ if y, x, T := isTypeAssertBlock(b); y != nil {
+ // Block b starts a type switch.
+ sw := Switch{Start: b, X: x}
+ typeSwitch(&sw, y, T, seen)
+ if len(sw.TypeCases) > 1 {
+ switches = append(switches, sw)
+ }
+ }
+ }
+ return switches
+}
+
+func valueSwitch(sw *Switch, k *ssa.Const, seen map[*ssa.BasicBlock]bool) {
+ b := sw.Start
+ x := sw.X
+ for x == sw.X {
+ if seen[b] {
+ break
+ }
+ seen[b] = true
+
+ sw.ConstCases = append(sw.ConstCases, ConstCase{
+ Block: b,
+ Body: b.Succs[0],
+ Value: k,
+ })
+ b = b.Succs[1]
+ if len(b.Instrs) > 2 {
+ // Block b contains not just 'if x == k',
+ // so it may have side effects that
+ // make it unsafe to elide.
+ break
+ }
+ if len(b.Preds) != 1 {
+ // Block b has multiple predecessors,
+ // so it cannot be treated as a case.
+ break
+ }
+ x, k = isComparisonBlock(b)
+ }
+ sw.Default = b
+}
+
+func typeSwitch(sw *Switch, y ssa.Value, T types.Type, seen map[*ssa.BasicBlock]bool) {
+ b := sw.Start
+ x := sw.X
+ for x == sw.X {
+ if seen[b] {
+ break
+ }
+ seen[b] = true
+
+ sw.TypeCases = append(sw.TypeCases, TypeCase{
+ Block: b,
+ Body: b.Succs[0],
+ Type: T,
+ Binding: y,
+ })
+ b = b.Succs[1]
+ if len(b.Instrs) > 4 {
+ // Block b contains not just
+ // {TypeAssert; Extract #0; Extract #1; If}
+ // so it may have side effects that
+ // make it unsafe to elide.
+ break
+ }
+ if len(b.Preds) != 1 {
+ // Block b has multiple predecessors,
+ // so it cannot be treated as a case.
+ break
+ }
+ y, x, T = isTypeAssertBlock(b)
+ }
+ sw.Default = b
+}
+
+// isComparisonBlock returns the operands (v, k) if a block ends with
+// a comparison v==k, where k is a compile-time constant.
+//
+func isComparisonBlock(b *ssa.BasicBlock) (v ssa.Value, k *ssa.Const) {
+ if n := len(b.Instrs); n >= 2 {
+ if i, ok := b.Instrs[n-1].(*ssa.If); ok {
+ if binop, ok := i.Cond.(*ssa.BinOp); ok && binop.Block() == b && binop.Op == token.EQL {
+ if k, ok := binop.Y.(*ssa.Const); ok {
+ return binop.X, k
+ }
+ if k, ok := binop.X.(*ssa.Const); ok {
+ return binop.Y, k
+ }
+ }
+ }
+ }
+ return
+}
+
+// isTypeAssertBlock returns the operands (y, x, T) if a block ends with
+// a type assertion "if y, ok := x.(T); ok {".
+//
+func isTypeAssertBlock(b *ssa.BasicBlock) (y, x ssa.Value, T types.Type) {
+ if n := len(b.Instrs); n >= 4 {
+ if i, ok := b.Instrs[n-1].(*ssa.If); ok {
+ if ext1, ok := i.Cond.(*ssa.Extract); ok && ext1.Block() == b && ext1.Index == 1 {
+ if ta, ok := ext1.Tuple.(*ssa.TypeAssert); ok && ta.Block() == b {
+ // hack: relies upon instruction ordering.
+ if ext0, ok := b.Instrs[n-3].(*ssa.Extract); ok {
+ return ext0, ta.X, ta.AssertedType
+ }
+ }
+ }
+ }
+ }
+ return
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go b/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go
new file mode 100644
index 00000000000..3424e8a3086
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/ssautil/visit.go
@@ -0,0 +1,79 @@
+// 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 ssautil // import "golang.org/x/tools/go/ssa/ssautil"
+
+import "golang.org/x/tools/go/ssa"
+
+// This file defines utilities for visiting the SSA representation of
+// a Program.
+//
+// TODO(adonovan): test coverage.
+
+// AllFunctions finds and returns the set of functions potentially
+// needed by program prog, as determined by a simple linker-style
+// reachability algorithm starting from the members and method-sets of
+// each package. The result may include anonymous functions and
+// synthetic wrappers.
+//
+// Precondition: all packages are built.
+//
+func AllFunctions(prog *ssa.Program) map[*ssa.Function]bool {
+ visit := visitor{
+ prog: prog,
+ seen: make(map[*ssa.Function]bool),
+ }
+ visit.program()
+ return visit.seen
+}
+
+type visitor struct {
+ prog *ssa.Program
+ seen map[*ssa.Function]bool
+}
+
+func (visit *visitor) program() {
+ for _, pkg := range visit.prog.AllPackages() {
+ for _, mem := range pkg.Members {
+ if fn, ok := mem.(*ssa.Function); ok {
+ visit.function(fn)
+ }
+ }
+ }
+ for _, T := range visit.prog.RuntimeTypes() {
+ mset := visit.prog.MethodSets.MethodSet(T)
+ for i, n := 0, mset.Len(); i < n; i++ {
+ visit.function(visit.prog.MethodValue(mset.At(i)))
+ }
+ }
+}
+
+func (visit *visitor) function(fn *ssa.Function) {
+ if !visit.seen[fn] {
+ visit.seen[fn] = true
+ var buf [10]*ssa.Value // avoid alloc in common case
+ for _, b := range fn.Blocks {
+ for _, instr := range b.Instrs {
+ for _, op := range instr.Operands(buf[:0]) {
+ if fn, ok := (*op).(*ssa.Function); ok {
+ visit.function(fn)
+ }
+ }
+ }
+ }
+ }
+}
+
+// MainPackages returns the subset of the specified packages
+// named "main" that define a main function.
+// The result may include synthetic "testmain" packages.
+func MainPackages(pkgs []*ssa.Package) []*ssa.Package {
+ var mains []*ssa.Package
+ for _, pkg := range pkgs {
+ if pkg.Pkg.Name() == "main" && pkg.Func("main") != nil {
+ mains = append(mains, pkg)
+ }
+ }
+ return mains
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/testmain.go b/vendor/golang.org/x/tools/go/ssa/testmain.go
new file mode 100644
index 00000000000..8ec15ba5051
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/testmain.go
@@ -0,0 +1,271 @@
+// 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 ssa
+
+// CreateTestMainPackage synthesizes a main package that runs all the
+// tests of the supplied packages.
+// It is closely coupled to $GOROOT/src/cmd/go/test.go and $GOROOT/src/testing.
+//
+// TODO(adonovan): throws this all away now that x/tools/go/packages
+// provides access to the actual synthetic test main files.
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/parser"
+ "go/types"
+ "log"
+ "os"
+ "strings"
+ "text/template"
+)
+
+// FindTests returns the Test, Benchmark, and Example functions
+// (as defined by "go test") defined in the specified package,
+// and its TestMain function, if any.
+//
+// Deprecated: use x/tools/go/packages to access synthetic testmain packages.
+func FindTests(pkg *Package) (tests, benchmarks, examples []*Function, main *Function) {
+ prog := pkg.Prog
+
+ // The first two of these may be nil: if the program doesn't import "testing",
+ // it can't contain any tests, but it may yet contain Examples.
+ var testSig *types.Signature // func(*testing.T)
+ var benchmarkSig *types.Signature // func(*testing.B)
+ var exampleSig = types.NewSignature(nil, nil, nil, false) // func()
+
+ // Obtain the types from the parameters of testing.MainStart.
+ if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
+ mainStart := testingPkg.Func("MainStart")
+ params := mainStart.Signature.Params()
+ testSig = funcField(params.At(1).Type())
+ benchmarkSig = funcField(params.At(2).Type())
+
+ // Does the package define this function?
+ // func TestMain(*testing.M)
+ if f := pkg.Func("TestMain"); f != nil {
+ sig := f.Type().(*types.Signature)
+ starM := mainStart.Signature.Results().At(0).Type() // *testing.M
+ if sig.Results().Len() == 0 &&
+ sig.Params().Len() == 1 &&
+ types.Identical(sig.Params().At(0).Type(), starM) {
+ main = f
+ }
+ }
+ }
+
+ // TODO(adonovan): use a stable order, e.g. lexical.
+ for _, mem := range pkg.Members {
+ if f, ok := mem.(*Function); ok &&
+ ast.IsExported(f.Name()) &&
+ strings.HasSuffix(prog.Fset.Position(f.Pos()).Filename, "_test.go") {
+
+ switch {
+ case testSig != nil && isTestSig(f, "Test", testSig):
+ tests = append(tests, f)
+ case benchmarkSig != nil && isTestSig(f, "Benchmark", benchmarkSig):
+ benchmarks = append(benchmarks, f)
+ case isTestSig(f, "Example", exampleSig):
+ examples = append(examples, f)
+ default:
+ continue
+ }
+ }
+ }
+ return
+}
+
+// Like isTest, but checks the signature too.
+func isTestSig(f *Function, prefix string, sig *types.Signature) bool {
+ return isTest(f.Name(), prefix) && types.Identical(f.Signature, sig)
+}
+
+// Given the type of one of the three slice parameters of testing.Main,
+// returns the function type.
+func funcField(slice types.Type) *types.Signature {
+ return slice.(*types.Slice).Elem().Underlying().(*types.Struct).Field(1).Type().(*types.Signature)
+}
+
+// isTest tells whether name looks like a test (or benchmark, according to prefix).
+// It is a Test (say) if there is a character after Test that is not a lower-case letter.
+// We don't want TesticularCancer.
+// Plundered from $GOROOT/src/cmd/go/test.go
+func isTest(name, prefix string) bool {
+ if !strings.HasPrefix(name, prefix) {
+ return false
+ }
+ if len(name) == len(prefix) { // "Test" is ok
+ return true
+ }
+ return ast.IsExported(name[len(prefix):])
+}
+
+// CreateTestMainPackage creates and returns a synthetic "testmain"
+// package for the specified package if it defines tests, benchmarks or
+// executable examples, or nil otherwise. The new package is named
+// "main" and provides a function named "main" that runs the tests,
+// similar to the one that would be created by the 'go test' tool.
+//
+// Subsequent calls to prog.AllPackages include the new package.
+// The package pkg must belong to the program prog.
+//
+// Deprecated: use x/tools/go/packages to access synthetic testmain packages.
+func (prog *Program) CreateTestMainPackage(pkg *Package) *Package {
+ if pkg.Prog != prog {
+ log.Fatal("Package does not belong to Program")
+ }
+
+ // Template data
+ var data struct {
+ Pkg *Package
+ Tests, Benchmarks, Examples []*Function
+ Main *Function
+ Go18 bool
+ }
+ data.Pkg = pkg
+
+ // Enumerate tests.
+ data.Tests, data.Benchmarks, data.Examples, data.Main = FindTests(pkg)
+ if data.Main == nil &&
+ data.Tests == nil && data.Benchmarks == nil && data.Examples == nil {
+ return nil
+ }
+
+ // Synthesize source for testmain package.
+ path := pkg.Pkg.Path() + "$testmain"
+ tmpl := testmainTmpl
+ if testingPkg := prog.ImportedPackage("testing"); testingPkg != nil {
+ // In Go 1.8, testing.MainStart's first argument is an interface, not a func.
+ data.Go18 = types.IsInterface(testingPkg.Func("MainStart").Signature.Params().At(0).Type())
+ } else {
+ // The program does not import "testing", but FindTests
+ // returned non-nil, which must mean there were Examples
+ // but no Test, Benchmark, or TestMain functions.
+
+ // We'll simply call them from testmain.main; this will
+ // ensure they don't panic, but will not check any
+ // "Output:" comments.
+ // (We should not execute an Example that has no
+ // "Output:" comment, but it's impossible to tell here.)
+ tmpl = examplesOnlyTmpl
+ }
+ var buf bytes.Buffer
+ if err := tmpl.Execute(&buf, data); err != nil {
+ log.Fatalf("internal error expanding template for %s: %v", path, err)
+ }
+ if false { // debugging
+ fmt.Fprintln(os.Stderr, buf.String())
+ }
+
+ // Parse and type-check the testmain package.
+ f, err := parser.ParseFile(prog.Fset, path+".go", &buf, parser.Mode(0))
+ if err != nil {
+ log.Fatalf("internal error parsing %s: %v", path, err)
+ }
+ conf := types.Config{
+ DisableUnusedImportCheck: true,
+ Importer: importer{pkg},
+ }
+ files := []*ast.File{f}
+ info := &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),
+ }
+ testmainPkg, err := conf.Check(path, prog.Fset, files, info)
+ if err != nil {
+ log.Fatalf("internal error type-checking %s: %v", path, err)
+ }
+
+ // Create and build SSA code.
+ testmain := prog.CreatePackage(testmainPkg, files, info, false)
+ testmain.SetDebugMode(false)
+ testmain.Build()
+ testmain.Func("main").Synthetic = "test main function"
+ testmain.Func("init").Synthetic = "package initializer"
+ return testmain
+}
+
+// An implementation of types.Importer for an already loaded SSA program.
+type importer struct {
+ pkg *Package // package under test; may be non-importable
+}
+
+func (imp importer) Import(path string) (*types.Package, error) {
+ if p := imp.pkg.Prog.ImportedPackage(path); p != nil {
+ return p.Pkg, nil
+ }
+ if path == imp.pkg.Pkg.Path() {
+ return imp.pkg.Pkg, nil
+ }
+ return nil, fmt.Errorf("not found") // can't happen
+}
+
+var testmainTmpl = template.Must(template.New("testmain").Parse(`
+package main
+
+import "io"
+import "os"
+import "testing"
+import p {{printf "%q" .Pkg.Pkg.Path}}
+
+{{if .Go18}}
+type deps struct{}
+
+func (deps) ImportPath() string { return "" }
+func (deps) MatchString(pat, str string) (bool, error) { return true, nil }
+func (deps) StartCPUProfile(io.Writer) error { return nil }
+func (deps) StartTestLog(io.Writer) {}
+func (deps) StopCPUProfile() {}
+func (deps) StopTestLog() error { return nil }
+func (deps) WriteHeapProfile(io.Writer) error { return nil }
+func (deps) WriteProfileTo(string, io.Writer, int) error { return nil }
+
+var match deps
+{{else}}
+func match(_, _ string) (bool, error) { return true, nil }
+{{end}}
+
+func main() {
+ tests := []testing.InternalTest{
+{{range .Tests}}
+ { {{printf "%q" .Name}}, p.{{.Name}} },
+{{end}}
+ }
+ benchmarks := []testing.InternalBenchmark{
+{{range .Benchmarks}}
+ { {{printf "%q" .Name}}, p.{{.Name}} },
+{{end}}
+ }
+ examples := []testing.InternalExample{
+{{range .Examples}}
+ {Name: {{printf "%q" .Name}}, F: p.{{.Name}}},
+{{end}}
+ }
+ m := testing.MainStart(match, tests, benchmarks, examples)
+{{with .Main}}
+ p.{{.Name}}(m)
+{{else}}
+ os.Exit(m.Run())
+{{end}}
+}
+
+`))
+
+var examplesOnlyTmpl = template.Must(template.New("examples").Parse(`
+package main
+
+import p {{printf "%q" .Pkg.Pkg.Path}}
+
+func main() {
+{{range .Examples}}
+ p.{{.Name}}()
+{{end}}
+}
+`))
diff --git a/vendor/golang.org/x/tools/go/ssa/util.go b/vendor/golang.org/x/tools/go/ssa/util.go
new file mode 100644
index 00000000000..ddb11846096
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/util.go
@@ -0,0 +1,119 @@
+// 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 ssa
+
+// This file defines a number of miscellaneous utility functions.
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "io"
+ "os"
+
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+//// AST utilities
+
+func unparen(e ast.Expr) ast.Expr { return astutil.Unparen(e) }
+
+// isBlankIdent returns true iff e is an Ident with name "_".
+// They have no associated types.Object, and thus no type.
+//
+func isBlankIdent(e ast.Expr) bool {
+ id, ok := e.(*ast.Ident)
+ return ok && id.Name == "_"
+}
+
+//// Type utilities. Some of these belong in go/types.
+
+// isPointer returns true for types whose underlying type is a pointer.
+func isPointer(typ types.Type) bool {
+ _, ok := typ.Underlying().(*types.Pointer)
+ return ok
+}
+
+func isInterface(T types.Type) bool { return types.IsInterface(T) }
+
+// deref returns a pointer's element type; otherwise it returns typ.
+func deref(typ types.Type) types.Type {
+ if p, ok := typ.Underlying().(*types.Pointer); ok {
+ return p.Elem()
+ }
+ return typ
+}
+
+// recvType returns the receiver type of method obj.
+func recvType(obj *types.Func) types.Type {
+ return obj.Type().(*types.Signature).Recv().Type()
+}
+
+// DefaultType returns the default "typed" type for an "untyped" type;
+// it returns the incoming type for all other types. The default type
+// for untyped nil is untyped nil.
+//
+// Exported to ssa/interp.
+//
+// TODO(adonovan): use go/types.DefaultType after 1.8.
+//
+func DefaultType(typ types.Type) types.Type {
+ if t, ok := typ.(*types.Basic); ok {
+ k := t.Kind()
+ switch k {
+ case types.UntypedBool:
+ k = types.Bool
+ case types.UntypedInt:
+ k = types.Int
+ case types.UntypedRune:
+ k = types.Rune
+ case types.UntypedFloat:
+ k = types.Float64
+ case types.UntypedComplex:
+ k = types.Complex128
+ case types.UntypedString:
+ k = types.String
+ }
+ typ = types.Typ[k]
+ }
+ return typ
+}
+
+// logStack prints the formatted "start" message to stderr and
+// returns a closure that prints the corresponding "end" message.
+// Call using 'defer logStack(...)()' to show builder stack on panic.
+// Don't forget trailing parens!
+//
+func logStack(format string, args ...interface{}) func() {
+ msg := fmt.Sprintf(format, args...)
+ io.WriteString(os.Stderr, msg)
+ io.WriteString(os.Stderr, "\n")
+ return func() {
+ io.WriteString(os.Stderr, msg)
+ io.WriteString(os.Stderr, " end\n")
+ }
+}
+
+// newVar creates a 'var' for use in a types.Tuple.
+func newVar(name string, typ types.Type) *types.Var {
+ return types.NewParam(token.NoPos, nil, name, typ)
+}
+
+// anonVar creates an anonymous 'var' for use in a types.Tuple.
+func anonVar(typ types.Type) *types.Var {
+ return newVar("", typ)
+}
+
+var lenResults = types.NewTuple(anonVar(tInt))
+
+// makeLen returns the len builtin specialized to type func(T)int.
+func makeLen(T types.Type) *Builtin {
+ lenParams := types.NewTuple(anonVar(T))
+ return &Builtin{
+ name: "len",
+ sig: types.NewSignature(nil, lenParams, lenResults, false),
+ }
+}
diff --git a/vendor/golang.org/x/tools/go/ssa/wrappers.go b/vendor/golang.org/x/tools/go/ssa/wrappers.go
new file mode 100644
index 00000000000..a4ae71d8cfc
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/ssa/wrappers.go
@@ -0,0 +1,290 @@
+// 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 ssa
+
+// This file defines synthesis of Functions that delegate to declared
+// methods; they come in three kinds:
+//
+// (1) wrappers: methods that wrap declared methods, performing
+// implicit pointer indirections and embedded field selections.
+//
+// (2) thunks: funcs that wrap declared methods. Like wrappers,
+// thunks perform indirections and field selections. The thunk's
+// first parameter is used as the receiver for the method call.
+//
+// (3) bounds: funcs that wrap declared methods. The bound's sole
+// free variable, supplied by a closure, is used as the receiver
+// for the method call. No indirections or field selections are
+// performed since they can be done before the call.
+
+import (
+ "fmt"
+
+ "go/types"
+)
+
+// -- wrappers -----------------------------------------------------------
+
+// makeWrapper returns a synthetic method that delegates to the
+// declared method denoted by meth.Obj(), first performing any
+// necessary pointer indirections or field selections implied by meth.
+//
+// The resulting method's receiver type is meth.Recv().
+//
+// This function is versatile but quite subtle! Consider the
+// following axes of variation when making changes:
+// - optional receiver indirection
+// - optional implicit field selections
+// - meth.Obj() may denote a concrete or an interface method
+// - the result may be a thunk or a wrapper.
+//
+// EXCLUSIVE_LOCKS_REQUIRED(prog.methodsMu)
+//
+func makeWrapper(prog *Program, sel *types.Selection) *Function {
+ obj := sel.Obj().(*types.Func) // the declared function
+ sig := sel.Type().(*types.Signature) // type of this wrapper
+
+ var recv *types.Var // wrapper's receiver or thunk's params[0]
+ name := obj.Name()
+ var description string
+ var start int // first regular param
+ if sel.Kind() == types.MethodExpr {
+ name += "$thunk"
+ description = "thunk"
+ recv = sig.Params().At(0)
+ start = 1
+ } else {
+ description = "wrapper"
+ recv = sig.Recv()
+ }
+
+ description = fmt.Sprintf("%s for %s", description, sel.Obj())
+ if prog.mode&LogSource != 0 {
+ defer logStack("make %s to (%s)", description, recv.Type())()
+ }
+ fn := &Function{
+ name: name,
+ method: sel,
+ object: obj,
+ Signature: sig,
+ Synthetic: description,
+ Prog: prog,
+ pos: obj.Pos(),
+ }
+ fn.startBody()
+ fn.addSpilledParam(recv)
+ createParams(fn, start)
+
+ indices := sel.Index()
+
+ var v Value = fn.Locals[0] // spilled receiver
+ if isPointer(sel.Recv()) {
+ v = emitLoad(fn, v)
+
+ // For simple indirection wrappers, perform an informative nil-check:
+ // "value method (T).f called using nil *T pointer"
+ if len(indices) == 1 && !isPointer(recvType(obj)) {
+ var c Call
+ c.Call.Value = &Builtin{
+ name: "ssa:wrapnilchk",
+ sig: types.NewSignature(nil,
+ types.NewTuple(anonVar(sel.Recv()), anonVar(tString), anonVar(tString)),
+ types.NewTuple(anonVar(sel.Recv())), false),
+ }
+ c.Call.Args = []Value{
+ v,
+ stringConst(deref(sel.Recv()).String()),
+ stringConst(sel.Obj().Name()),
+ }
+ c.setType(v.Type())
+ v = fn.emit(&c)
+ }
+ }
+
+ // Invariant: v is a pointer, either
+ // value of *A receiver param, or
+ // address of A spilled receiver.
+
+ // We use pointer arithmetic (FieldAddr possibly followed by
+ // Load) in preference to value extraction (Field possibly
+ // preceded by Load).
+
+ v = emitImplicitSelections(fn, v, indices[:len(indices)-1])
+
+ // Invariant: v is a pointer, either
+ // value of implicit *C field, or
+ // address of implicit C field.
+
+ var c Call
+ if r := recvType(obj); !isInterface(r) { // concrete method
+ if !isPointer(r) {
+ v = emitLoad(fn, v)
+ }
+ c.Call.Value = prog.declaredFunc(obj)
+ c.Call.Args = append(c.Call.Args, v)
+ } else {
+ c.Call.Method = obj
+ c.Call.Value = emitLoad(fn, v)
+ }
+ for _, arg := range fn.Params[1:] {
+ c.Call.Args = append(c.Call.Args, arg)
+ }
+ emitTailCall(fn, &c)
+ fn.finishBody()
+ return fn
+}
+
+// createParams creates parameters for wrapper method fn based on its
+// Signature.Params, which do not include the receiver.
+// start is the index of the first regular parameter to use.
+//
+func createParams(fn *Function, start int) {
+ tparams := fn.Signature.Params()
+ for i, n := start, tparams.Len(); i < n; i++ {
+ fn.addParamObj(tparams.At(i))
+ }
+}
+
+// -- bounds -----------------------------------------------------------
+
+// makeBound returns a bound method wrapper (or "bound"), a synthetic
+// function that delegates to a concrete or interface method denoted
+// by obj. The resulting function has no receiver, but has one free
+// variable which will be used as the method's receiver in the
+// tail-call.
+//
+// Use MakeClosure with such a wrapper to construct a bound method
+// closure. e.g.:
+//
+// type T int or: type T interface { meth() }
+// func (t T) meth()
+// var t T
+// f := t.meth
+// f() // calls t.meth()
+//
+// f is a closure of a synthetic wrapper defined as if by:
+//
+// f := func() { return t.meth() }
+//
+// Unlike makeWrapper, makeBound need perform no indirection or field
+// selections because that can be done before the closure is
+// constructed.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
+//
+func makeBound(prog *Program, obj *types.Func) *Function {
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+ fn, ok := prog.bounds[obj]
+ if !ok {
+ description := fmt.Sprintf("bound method wrapper for %s", obj)
+ if prog.mode&LogSource != 0 {
+ defer logStack("%s", description)()
+ }
+ fn = &Function{
+ name: obj.Name() + "$bound",
+ object: obj,
+ Signature: changeRecv(obj.Type().(*types.Signature), nil), // drop receiver
+ Synthetic: description,
+ Prog: prog,
+ pos: obj.Pos(),
+ }
+
+ fv := &FreeVar{name: "recv", typ: recvType(obj), parent: fn}
+ fn.FreeVars = []*FreeVar{fv}
+ fn.startBody()
+ createParams(fn, 0)
+ var c Call
+
+ if !isInterface(recvType(obj)) { // concrete
+ c.Call.Value = prog.declaredFunc(obj)
+ c.Call.Args = []Value{fv}
+ } else {
+ c.Call.Value = fv
+ c.Call.Method = obj
+ }
+ for _, arg := range fn.Params {
+ c.Call.Args = append(c.Call.Args, arg)
+ }
+ emitTailCall(fn, &c)
+ fn.finishBody()
+
+ prog.bounds[obj] = fn
+ }
+ return fn
+}
+
+// -- thunks -----------------------------------------------------------
+
+// makeThunk returns a thunk, a synthetic function that delegates to a
+// concrete or interface method denoted by sel.Obj(). The resulting
+// function has no receiver, but has an additional (first) regular
+// parameter.
+//
+// Precondition: sel.Kind() == types.MethodExpr.
+//
+// type T int or: type T interface { meth() }
+// func (t T) meth()
+// f := T.meth
+// var t T
+// f(t) // calls t.meth()
+//
+// f is a synthetic wrapper defined as if by:
+//
+// f := func(t T) { return t.meth() }
+//
+// TODO(adonovan): opt: currently the stub is created even when used
+// directly in a function call: C.f(i, 0). This is less efficient
+// than inlining the stub.
+//
+// EXCLUSIVE_LOCKS_ACQUIRED(meth.Prog.methodsMu)
+//
+func makeThunk(prog *Program, sel *types.Selection) *Function {
+ if sel.Kind() != types.MethodExpr {
+ panic(sel)
+ }
+
+ key := selectionKey{
+ kind: sel.Kind(),
+ recv: sel.Recv(),
+ obj: sel.Obj(),
+ index: fmt.Sprint(sel.Index()),
+ indirect: sel.Indirect(),
+ }
+
+ prog.methodsMu.Lock()
+ defer prog.methodsMu.Unlock()
+
+ // Canonicalize key.recv to avoid constructing duplicate thunks.
+ canonRecv, ok := prog.canon.At(key.recv).(types.Type)
+ if !ok {
+ canonRecv = key.recv
+ prog.canon.Set(key.recv, canonRecv)
+ }
+ key.recv = canonRecv
+
+ fn, ok := prog.thunks[key]
+ if !ok {
+ fn = makeWrapper(prog, sel)
+ if fn.Signature.Recv() != nil {
+ panic(fn) // unexpected receiver
+ }
+ prog.thunks[key] = fn
+ }
+ return fn
+}
+
+func changeRecv(s *types.Signature, recv *types.Var) *types.Signature {
+ return types.NewSignature(recv, s.Params(), s.Results(), s.Variadic())
+}
+
+// selectionKey is like types.Selection but a usable map key.
+type selectionKey struct {
+ kind types.SelectionKind
+ recv types.Type // canonicalized via Program.canon
+ obj types.Object
+ index string
+ indirect bool
+}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/callee.go b/vendor/golang.org/x/tools/go/types/typeutil/callee.go
new file mode 100644
index 00000000000..38f596daf9e
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/types/typeutil/callee.go
@@ -0,0 +1,46 @@
+// 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 typeutil
+
+import (
+ "go/ast"
+ "go/types"
+
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+// Callee returns the named target of a function call, if any:
+// a function, method, builtin, or variable.
+func Callee(info *types.Info, call *ast.CallExpr) types.Object {
+ var obj types.Object
+ switch fun := astutil.Unparen(call.Fun).(type) {
+ case *ast.Ident:
+ obj = info.Uses[fun] // type, var, builtin, or declared func
+ case *ast.SelectorExpr:
+ if sel, ok := info.Selections[fun]; ok {
+ obj = sel.Obj() // method or field
+ } else {
+ obj = info.Uses[fun.Sel] // qualified identifier?
+ }
+ }
+ if _, ok := obj.(*types.TypeName); ok {
+ return nil // T(x) is a conversion, not a call
+ }
+ return obj
+}
+
+// StaticCallee returns the target (function or method) of a static
+// function call, if any. It returns nil for calls to builtins.
+func StaticCallee(info *types.Info, call *ast.CallExpr) *types.Func {
+ if f, ok := Callee(info, call).(*types.Func); ok && !interfaceMethod(f) {
+ return f
+ }
+ return nil
+}
+
+func interfaceMethod(f *types.Func) bool {
+ recv := f.Type().(*types.Signature).Recv()
+ return recv != nil && types.IsInterface(recv.Type())
+}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/imports.go b/vendor/golang.org/x/tools/go/types/typeutil/imports.go
new file mode 100644
index 00000000000..9c441dba9c0
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/types/typeutil/imports.go
@@ -0,0 +1,31 @@
+// Copyright 2014 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 typeutil
+
+import "go/types"
+
+// Dependencies returns all dependencies of the specified packages.
+//
+// Dependent packages appear in topological order: if package P imports
+// package Q, Q appears earlier than P in the result.
+// The algorithm follows import statements in the order they
+// appear in the source code, so the result is a total order.
+//
+func Dependencies(pkgs ...*types.Package) []*types.Package {
+ var result []*types.Package
+ seen := make(map[*types.Package]bool)
+ var visit func(pkgs []*types.Package)
+ visit = func(pkgs []*types.Package) {
+ for _, p := range pkgs {
+ if !seen[p] {
+ seen[p] = true
+ visit(p.Imports())
+ result = append(result, p)
+ }
+ }
+ }
+ visit(pkgs)
+ return result
+}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/map.go b/vendor/golang.org/x/tools/go/types/typeutil/map.go
new file mode 100644
index 00000000000..c7f75450064
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/types/typeutil/map.go
@@ -0,0 +1,313 @@
+// Copyright 2014 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 typeutil defines various utilities for types, such as Map,
+// a mapping from types.Type to interface{} values.
+package typeutil // import "golang.org/x/tools/go/types/typeutil"
+
+import (
+ "bytes"
+ "fmt"
+ "go/types"
+ "reflect"
+)
+
+// Map is a hash-table-based mapping from types (types.Type) to
+// arbitrary interface{} values. The concrete types that implement
+// the Type interface are pointers. Since they are not canonicalized,
+// == cannot be used to check for equivalence, and thus we cannot
+// simply use a Go map.
+//
+// Just as with map[K]V, a nil *Map is a valid empty map.
+//
+// Not thread-safe.
+//
+type Map struct {
+ hasher Hasher // shared by many Maps
+ table map[uint32][]entry // maps hash to bucket; entry.key==nil means unused
+ length int // number of map entries
+}
+
+// entry is an entry (key/value association) in a hash bucket.
+type entry struct {
+ key types.Type
+ value interface{}
+}
+
+// SetHasher sets the hasher used by Map.
+//
+// All Hashers are functionally equivalent but contain internal state
+// used to cache the results of hashing previously seen types.
+//
+// A single Hasher created by MakeHasher() may be shared among many
+// Maps. This is recommended if the instances have many keys in
+// common, as it will amortize the cost of hash computation.
+//
+// A Hasher may grow without bound as new types are seen. Even when a
+// type is deleted from the map, the Hasher never shrinks, since other
+// types in the map may reference the deleted type indirectly.
+//
+// Hashers are not thread-safe, and read-only operations such as
+// Map.Lookup require updates to the hasher, so a full Mutex lock (not a
+// read-lock) is require around all Map operations if a shared
+// hasher is accessed from multiple threads.
+//
+// If SetHasher is not called, the Map will create a private hasher at
+// the first call to Insert.
+//
+func (m *Map) SetHasher(hasher Hasher) {
+ m.hasher = hasher
+}
+
+// Delete removes the entry with the given key, if any.
+// It returns true if the entry was found.
+//
+func (m *Map) Delete(key types.Type) bool {
+ if m != nil && m.table != nil {
+ hash := m.hasher.Hash(key)
+ bucket := m.table[hash]
+ for i, e := range bucket {
+ if e.key != nil && types.Identical(key, e.key) {
+ // We can't compact the bucket as it
+ // would disturb iterators.
+ bucket[i] = entry{}
+ m.length--
+ return true
+ }
+ }
+ }
+ return false
+}
+
+// At returns the map entry for the given key.
+// The result is nil if the entry is not present.
+//
+func (m *Map) At(key types.Type) interface{} {
+ if m != nil && m.table != nil {
+ for _, e := range m.table[m.hasher.Hash(key)] {
+ if e.key != nil && types.Identical(key, e.key) {
+ return e.value
+ }
+ }
+ }
+ return nil
+}
+
+// Set sets the map entry for key to val,
+// and returns the previous entry, if any.
+func (m *Map) Set(key types.Type, value interface{}) (prev interface{}) {
+ if m.table != nil {
+ hash := m.hasher.Hash(key)
+ bucket := m.table[hash]
+ var hole *entry
+ for i, e := range bucket {
+ if e.key == nil {
+ hole = &bucket[i]
+ } else if types.Identical(key, e.key) {
+ prev = e.value
+ bucket[i].value = value
+ return
+ }
+ }
+
+ if hole != nil {
+ *hole = entry{key, value} // overwrite deleted entry
+ } else {
+ m.table[hash] = append(bucket, entry{key, value})
+ }
+ } else {
+ if m.hasher.memo == nil {
+ m.hasher = MakeHasher()
+ }
+ hash := m.hasher.Hash(key)
+ m.table = map[uint32][]entry{hash: {entry{key, value}}}
+ }
+
+ m.length++
+ return
+}
+
+// Len returns the number of map entries.
+func (m *Map) Len() int {
+ if m != nil {
+ return m.length
+ }
+ return 0
+}
+
+// Iterate calls function f on each entry in the map in unspecified order.
+//
+// If f should mutate the map, Iterate provides the same guarantees as
+// Go maps: if f deletes a map entry that Iterate has not yet reached,
+// f will not be invoked for it, but if f inserts a map entry that
+// Iterate has not yet reached, whether or not f will be invoked for
+// it is unspecified.
+//
+func (m *Map) Iterate(f func(key types.Type, value interface{})) {
+ if m != nil {
+ for _, bucket := range m.table {
+ for _, e := range bucket {
+ if e.key != nil {
+ f(e.key, e.value)
+ }
+ }
+ }
+ }
+}
+
+// Keys returns a new slice containing the set of map keys.
+// The order is unspecified.
+func (m *Map) Keys() []types.Type {
+ keys := make([]types.Type, 0, m.Len())
+ m.Iterate(func(key types.Type, _ interface{}) {
+ keys = append(keys, key)
+ })
+ return keys
+}
+
+func (m *Map) toString(values bool) string {
+ if m == nil {
+ return "{}"
+ }
+ var buf bytes.Buffer
+ fmt.Fprint(&buf, "{")
+ sep := ""
+ m.Iterate(func(key types.Type, value interface{}) {
+ fmt.Fprint(&buf, sep)
+ sep = ", "
+ fmt.Fprint(&buf, key)
+ if values {
+ fmt.Fprintf(&buf, ": %q", value)
+ }
+ })
+ fmt.Fprint(&buf, "}")
+ return buf.String()
+}
+
+// String returns a string representation of the map's entries.
+// Values are printed using fmt.Sprintf("%v", v).
+// Order is unspecified.
+//
+func (m *Map) String() string {
+ return m.toString(true)
+}
+
+// KeysString returns a string representation of the map's key set.
+// Order is unspecified.
+//
+func (m *Map) KeysString() string {
+ return m.toString(false)
+}
+
+////////////////////////////////////////////////////////////////////////
+// Hasher
+
+// A Hasher maps each type to its hash value.
+// For efficiency, a hasher uses memoization; thus its memory
+// footprint grows monotonically over time.
+// Hashers are not thread-safe.
+// Hashers have reference semantics.
+// Call MakeHasher to create a Hasher.
+type Hasher struct {
+ memo map[types.Type]uint32
+}
+
+// MakeHasher returns a new Hasher instance.
+func MakeHasher() Hasher {
+ return Hasher{make(map[types.Type]uint32)}
+}
+
+// Hash computes a hash value for the given type t such that
+// Identical(t, t') => Hash(t) == Hash(t').
+func (h Hasher) Hash(t types.Type) uint32 {
+ hash, ok := h.memo[t]
+ if !ok {
+ hash = h.hashFor(t)
+ h.memo[t] = hash
+ }
+ return hash
+}
+
+// hashString computes the Fowler–Noll–Vo hash of s.
+func hashString(s string) uint32 {
+ var h uint32
+ for i := 0; i < len(s); i++ {
+ h ^= uint32(s[i])
+ h *= 16777619
+ }
+ return h
+}
+
+// hashFor computes the hash of t.
+func (h Hasher) hashFor(t types.Type) uint32 {
+ // See Identical for rationale.
+ switch t := t.(type) {
+ case *types.Basic:
+ return uint32(t.Kind())
+
+ case *types.Array:
+ return 9043 + 2*uint32(t.Len()) + 3*h.Hash(t.Elem())
+
+ case *types.Slice:
+ return 9049 + 2*h.Hash(t.Elem())
+
+ case *types.Struct:
+ var hash uint32 = 9059
+ for i, n := 0, t.NumFields(); i < n; i++ {
+ f := t.Field(i)
+ if f.Anonymous() {
+ hash += 8861
+ }
+ hash += hashString(t.Tag(i))
+ hash += hashString(f.Name()) // (ignore f.Pkg)
+ hash += h.Hash(f.Type())
+ }
+ return hash
+
+ case *types.Pointer:
+ return 9067 + 2*h.Hash(t.Elem())
+
+ case *types.Signature:
+ var hash uint32 = 9091
+ if t.Variadic() {
+ hash *= 8863
+ }
+ return hash + 3*h.hashTuple(t.Params()) + 5*h.hashTuple(t.Results())
+
+ case *types.Interface:
+ var hash uint32 = 9103
+ for i, n := 0, t.NumMethods(); i < n; i++ {
+ // See go/types.identicalMethods for rationale.
+ // Method order is not significant.
+ // Ignore m.Pkg().
+ m := t.Method(i)
+ hash += 3*hashString(m.Name()) + 5*h.Hash(m.Type())
+ }
+ return hash
+
+ case *types.Map:
+ return 9109 + 2*h.Hash(t.Key()) + 3*h.Hash(t.Elem())
+
+ case *types.Chan:
+ return 9127 + 2*uint32(t.Dir()) + 3*h.Hash(t.Elem())
+
+ case *types.Named:
+ // Not safe with a copying GC; objects may move.
+ return uint32(reflect.ValueOf(t.Obj()).Pointer())
+
+ case *types.Tuple:
+ return h.hashTuple(t)
+ }
+ panic(t)
+}
+
+func (h Hasher) hashTuple(tuple *types.Tuple) uint32 {
+ // See go/types.identicalTypes for rationale.
+ n := tuple.Len()
+ var hash uint32 = 9137 + 2*uint32(n)
+ for i := 0; i < n; i++ {
+ hash += 3 * h.Hash(tuple.At(i).Type())
+ }
+ return hash
+}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
new file mode 100644
index 00000000000..32084610f49
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/types/typeutil/methodsetcache.go
@@ -0,0 +1,72 @@
+// Copyright 2014 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.
+
+// This file implements a cache of method sets.
+
+package typeutil
+
+import (
+ "go/types"
+ "sync"
+)
+
+// A MethodSetCache records the method set of each type T for which
+// MethodSet(T) is called so that repeat queries are fast.
+// The zero value is a ready-to-use cache instance.
+type MethodSetCache struct {
+ mu sync.Mutex
+ named map[*types.Named]struct{ value, pointer *types.MethodSet } // method sets for named N and *N
+ others map[types.Type]*types.MethodSet // all other types
+}
+
+// MethodSet returns the method set of type T. It is thread-safe.
+//
+// If cache is nil, this function is equivalent to types.NewMethodSet(T).
+// Utility functions can thus expose an optional *MethodSetCache
+// parameter to clients that care about performance.
+//
+func (cache *MethodSetCache) MethodSet(T types.Type) *types.MethodSet {
+ if cache == nil {
+ return types.NewMethodSet(T)
+ }
+ cache.mu.Lock()
+ defer cache.mu.Unlock()
+
+ switch T := T.(type) {
+ case *types.Named:
+ return cache.lookupNamed(T).value
+
+ case *types.Pointer:
+ if N, ok := T.Elem().(*types.Named); ok {
+ return cache.lookupNamed(N).pointer
+ }
+ }
+
+ // all other types
+ // (The map uses pointer equivalence, not type identity.)
+ mset := cache.others[T]
+ if mset == nil {
+ mset = types.NewMethodSet(T)
+ if cache.others == nil {
+ cache.others = make(map[types.Type]*types.MethodSet)
+ }
+ cache.others[T] = mset
+ }
+ return mset
+}
+
+func (cache *MethodSetCache) lookupNamed(named *types.Named) struct{ value, pointer *types.MethodSet } {
+ if cache.named == nil {
+ cache.named = make(map[*types.Named]struct{ value, pointer *types.MethodSet })
+ }
+ // Avoid recomputing mset(*T) for each distinct Pointer
+ // instance whose underlying type is a named type.
+ msets, ok := cache.named[named]
+ if !ok {
+ msets.value = types.NewMethodSet(named)
+ msets.pointer = types.NewMethodSet(types.NewPointer(named))
+ cache.named[named] = msets
+ }
+ return msets
+}
diff --git a/vendor/golang.org/x/tools/go/types/typeutil/ui.go b/vendor/golang.org/x/tools/go/types/typeutil/ui.go
new file mode 100644
index 00000000000..9849c24cef3
--- /dev/null
+++ b/vendor/golang.org/x/tools/go/types/typeutil/ui.go
@@ -0,0 +1,52 @@
+// Copyright 2014 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 typeutil
+
+// This file defines utilities for user interfaces that display types.
+
+import "go/types"
+
+// IntuitiveMethodSet returns the intuitive method set of a type T,
+// which is the set of methods you can call on an addressable value of
+// that type.
+//
+// The result always contains MethodSet(T), and is exactly MethodSet(T)
+// for interface types and for pointer-to-concrete types.
+// For all other concrete types T, the result additionally
+// contains each method belonging to *T if there is no identically
+// named method on T itself.
+//
+// This corresponds to user intuition about method sets;
+// this function is intended only for user interfaces.
+//
+// The order of the result is as for types.MethodSet(T).
+//
+func IntuitiveMethodSet(T types.Type, msets *MethodSetCache) []*types.Selection {
+ isPointerToConcrete := func(T types.Type) bool {
+ ptr, ok := T.(*types.Pointer)
+ return ok && !types.IsInterface(ptr.Elem())
+ }
+
+ var result []*types.Selection
+ mset := msets.MethodSet(T)
+ if types.IsInterface(T) || isPointerToConcrete(T) {
+ for i, n := 0, mset.Len(); i < n; i++ {
+ result = append(result, mset.At(i))
+ }
+ } else {
+ // T is some other concrete type.
+ // Report methods of T and *T, preferring those of T.
+ pmset := msets.MethodSet(types.NewPointer(T))
+ for i, n := 0, pmset.Len(); i < n; i++ {
+ meth := pmset.At(i)
+ if m := mset.Lookup(meth.Obj().Pkg(), meth.Obj().Name()); m != nil {
+ meth = m
+ }
+ result = append(result, meth)
+ }
+
+ }
+ return result
+}
diff --git a/vendor/golang.org/x/tools/imports/fix.go b/vendor/golang.org/x/tools/imports/fix.go
new file mode 100644
index 00000000000..4c0339305db
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/fix.go
@@ -0,0 +1,1259 @@
+// 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 imports
+
+import (
+ "bytes"
+ "context"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/parser"
+ "go/token"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path"
+ "path/filepath"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+ "unicode"
+ "unicode/utf8"
+
+ "golang.org/x/tools/go/ast/astutil"
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/internal/gopathwalk"
+)
+
+// Debug controls verbose logging.
+var Debug = false
+
+// LocalPrefix is a comma-separated string of import path prefixes, which, if
+// set, instructs Process to sort the import paths with the given prefixes
+// into another group after 3rd-party packages.
+var LocalPrefix string
+
+func localPrefixes() []string {
+ if LocalPrefix != "" {
+ return strings.Split(LocalPrefix, ",")
+ }
+ return nil
+}
+
+// importToGroup is a list of functions which map from an import path to
+// a group number.
+var importToGroup = []func(importPath string) (num int, ok bool){
+ func(importPath string) (num int, ok bool) {
+ for _, p := range localPrefixes() {
+ if strings.HasPrefix(importPath, p) || strings.TrimSuffix(p, "/") == importPath {
+ return 3, true
+ }
+ }
+ return
+ },
+ func(importPath string) (num int, ok bool) {
+ if strings.HasPrefix(importPath, "appengine") {
+ return 2, true
+ }
+ return
+ },
+ func(importPath string) (num int, ok bool) {
+ if strings.Contains(importPath, ".") {
+ return 1, true
+ }
+ return
+ },
+}
+
+func importGroup(importPath string) int {
+ for _, fn := range importToGroup {
+ if n, ok := fn(importPath); ok {
+ return n
+ }
+ }
+ return 0
+}
+
+// An importInfo represents a single import statement.
+type importInfo struct {
+ importPath string // import path, e.g. "crypto/rand".
+ name string // import name, e.g. "crand", or "" if none.
+}
+
+// A packageInfo represents what's known about a package.
+type packageInfo struct {
+ name string // real package name, if known.
+ exports map[string]bool // known exports.
+}
+
+// parseOtherFiles parses all the Go files in srcDir except filename, including
+// test files if filename looks like a test.
+func parseOtherFiles(fset *token.FileSet, srcDir, filename string) []*ast.File {
+ // This could use go/packages but it doesn't buy much, and it fails
+ // with https://golang.org/issue/26296 in LoadFiles mode in some cases.
+ considerTests := strings.HasSuffix(filename, "_test.go")
+
+ fileBase := filepath.Base(filename)
+ packageFileInfos, err := ioutil.ReadDir(srcDir)
+ if err != nil {
+ return nil
+ }
+
+ var files []*ast.File
+ for _, fi := range packageFileInfos {
+ if fi.Name() == fileBase || !strings.HasSuffix(fi.Name(), ".go") {
+ continue
+ }
+ if !considerTests && strings.HasSuffix(fi.Name(), "_test.go") {
+ continue
+ }
+
+ f, err := parser.ParseFile(fset, filepath.Join(srcDir, fi.Name()), nil, 0)
+ if err != nil {
+ continue
+ }
+
+ files = append(files, f)
+ }
+
+ return files
+}
+
+// addGlobals puts the names of package vars into the provided map.
+func addGlobals(f *ast.File, globals map[string]bool) {
+ for _, decl := range f.Decls {
+ genDecl, ok := decl.(*ast.GenDecl)
+ if !ok {
+ continue
+ }
+
+ for _, spec := range genDecl.Specs {
+ valueSpec, ok := spec.(*ast.ValueSpec)
+ if !ok {
+ continue
+ }
+ globals[valueSpec.Names[0].Name] = true
+ }
+ }
+}
+
+// collectReferences builds a map of selector expressions, from
+// left hand side (X) to a set of right hand sides (Sel).
+func collectReferences(f *ast.File) references {
+ refs := references{}
+
+ var visitor visitFn
+ visitor = func(node ast.Node) ast.Visitor {
+ if node == nil {
+ return visitor
+ }
+ switch v := node.(type) {
+ case *ast.SelectorExpr:
+ xident, ok := v.X.(*ast.Ident)
+ if !ok {
+ break
+ }
+ if xident.Obj != nil {
+ // If the parser can resolve it, it's not a package ref.
+ break
+ }
+ if !ast.IsExported(v.Sel.Name) {
+ // Whatever this is, it's not exported from a package.
+ break
+ }
+ pkgName := xident.Name
+ r := refs[pkgName]
+ if r == nil {
+ r = make(map[string]bool)
+ refs[pkgName] = r
+ }
+ r[v.Sel.Name] = true
+ }
+ return visitor
+ }
+ ast.Walk(visitor, f)
+ return refs
+}
+
+// collectImports returns all the imports in f, keyed by their package name as
+// determined by pathToName. Unnamed imports (., _) and "C" are ignored.
+func collectImports(f *ast.File) []*importInfo {
+ var imports []*importInfo
+ for _, imp := range f.Imports {
+ var name string
+ if imp.Name != nil {
+ name = imp.Name.Name
+ }
+ if imp.Path.Value == `"C"` || name == "_" || name == "." {
+ continue
+ }
+ path := strings.Trim(imp.Path.Value, `"`)
+ imports = append(imports, &importInfo{
+ name: name,
+ importPath: path,
+ })
+ }
+ return imports
+}
+
+// findMissingImport searches pass's candidates for an import that provides
+// pkg, containing all of syms.
+func (p *pass) findMissingImport(pkg string, syms map[string]bool) *importInfo {
+ for _, candidate := range p.candidates {
+ pkgInfo, ok := p.knownPackages[candidate.importPath]
+ if !ok {
+ continue
+ }
+ if p.importIdentifier(candidate) != pkg {
+ continue
+ }
+
+ allFound := true
+ for right := range syms {
+ if !pkgInfo.exports[right] {
+ allFound = false
+ break
+ }
+ }
+
+ if allFound {
+ return candidate
+ }
+ }
+ return nil
+}
+
+// references is set of references found in a Go file. The first map key is the
+// left hand side of a selector expression, the second key is the right hand
+// side, and the value should always be true.
+type references map[string]map[string]bool
+
+// A pass contains all the inputs and state necessary to fix a file's imports.
+// It can be modified in some ways during use; see comments below.
+type pass struct {
+ // Inputs. These must be set before a call to load, and not modified after.
+ fset *token.FileSet // fset used to parse f and its siblings.
+ f *ast.File // the file being fixed.
+ srcDir string // the directory containing f.
+ fixEnv *fixEnv // the environment to use for go commands, etc.
+ loadRealPackageNames bool // if true, load package names from disk rather than guessing them.
+ otherFiles []*ast.File // sibling files.
+
+ // Intermediate state, generated by load.
+ existingImports map[string]*importInfo
+ allRefs references
+ missingRefs references
+
+ // Inputs to fix. These can be augmented between successive fix calls.
+ lastTry bool // indicates that this is the last call and fix should clean up as best it can.
+ candidates []*importInfo // candidate imports in priority order.
+ knownPackages map[string]*packageInfo // information about all known packages.
+}
+
+// loadPackageNames saves the package names for everything referenced by imports.
+func (p *pass) loadPackageNames(imports []*importInfo) error {
+ var unknown []string
+ for _, imp := range imports {
+ if _, ok := p.knownPackages[imp.importPath]; ok {
+ continue
+ }
+ unknown = append(unknown, imp.importPath)
+ }
+
+ names, err := p.fixEnv.getResolver().loadPackageNames(unknown, p.srcDir)
+ if err != nil {
+ return err
+ }
+
+ for path, name := range names {
+ p.knownPackages[path] = &packageInfo{
+ name: name,
+ exports: map[string]bool{},
+ }
+ }
+ return nil
+}
+
+// importIdentifier returns the identifier that imp will introduce. It will
+// guess if the package name has not been loaded, e.g. because the source
+// is not available.
+func (p *pass) importIdentifier(imp *importInfo) string {
+ if imp.name != "" {
+ return imp.name
+ }
+ known := p.knownPackages[imp.importPath]
+ if known != nil && known.name != "" {
+ return known.name
+ }
+ return importPathToAssumedName(imp.importPath)
+}
+
+// load reads in everything necessary to run a pass, and reports whether the
+// file already has all the imports it needs. It fills in p.missingRefs with the
+// file's missing symbols, if any, or removes unused imports if not.
+func (p *pass) load() bool {
+ p.knownPackages = map[string]*packageInfo{}
+ p.missingRefs = references{}
+ p.existingImports = map[string]*importInfo{}
+
+ // Load basic information about the file in question.
+ p.allRefs = collectReferences(p.f)
+
+ // Load stuff from other files in the same package:
+ // global variables so we know they don't need resolving, and imports
+ // that we might want to mimic.
+ globals := map[string]bool{}
+ for _, otherFile := range p.otherFiles {
+ // Don't load globals from files that are in the same directory
+ // but a different package. Using them to suggest imports is OK.
+ if p.f.Name.Name == otherFile.Name.Name {
+ addGlobals(otherFile, globals)
+ }
+ p.candidates = append(p.candidates, collectImports(otherFile)...)
+ }
+
+ // Resolve all the import paths we've seen to package names, and store
+ // f's imports by the identifier they introduce.
+ imports := collectImports(p.f)
+ if p.loadRealPackageNames {
+ err := p.loadPackageNames(append(imports, p.candidates...))
+ if err != nil {
+ if Debug {
+ log.Printf("loading package names: %v", err)
+ }
+ return false
+ }
+ }
+ for _, imp := range imports {
+ p.existingImports[p.importIdentifier(imp)] = imp
+ }
+
+ // Find missing references.
+ for left, rights := range p.allRefs {
+ if globals[left] {
+ continue
+ }
+ _, ok := p.existingImports[left]
+ if !ok {
+ p.missingRefs[left] = rights
+ continue
+ }
+ }
+ if len(p.missingRefs) != 0 {
+ return false
+ }
+
+ return p.fix()
+}
+
+// fix attempts to satisfy missing imports using p.candidates. If it finds
+// everything, or if p.lastTry is true, it adds the imports it found,
+// removes anything unused, and returns true.
+func (p *pass) fix() bool {
+ // Find missing imports.
+ var selected []*importInfo
+ for left, rights := range p.missingRefs {
+ if imp := p.findMissingImport(left, rights); imp != nil {
+ selected = append(selected, imp)
+ }
+ }
+
+ if !p.lastTry && len(selected) != len(p.missingRefs) {
+ return false
+ }
+
+ // Found everything, or giving up. Add the new imports and remove any unused.
+ for _, imp := range p.existingImports {
+ // We deliberately ignore globals here, because we can't be sure
+ // they're in the same package. People do things like put multiple
+ // main packages in the same directory, and we don't want to
+ // remove imports if they happen to have the same name as a var in
+ // a different package.
+ if _, ok := p.allRefs[p.importIdentifier(imp)]; !ok {
+ astutil.DeleteNamedImport(p.fset, p.f, imp.name, imp.importPath)
+ }
+ }
+
+ for _, imp := range selected {
+ astutil.AddNamedImport(p.fset, p.f, imp.name, imp.importPath)
+ }
+
+ if p.loadRealPackageNames {
+ for _, imp := range p.f.Imports {
+ if imp.Name != nil {
+ continue
+ }
+ path := strings.Trim(imp.Path.Value, `""`)
+ ident := p.importIdentifier(&importInfo{importPath: path})
+ if ident != importPathToAssumedName(path) {
+ imp.Name = &ast.Ident{Name: ident, NamePos: imp.Pos()}
+ }
+ }
+ }
+
+ return true
+}
+
+// assumeSiblingImportsValid assumes that siblings' use of packages is valid,
+// adding the exports they use.
+func (p *pass) assumeSiblingImportsValid() {
+ for _, f := range p.otherFiles {
+ refs := collectReferences(f)
+ imports := collectImports(f)
+ importsByName := map[string]*importInfo{}
+ for _, imp := range imports {
+ importsByName[p.importIdentifier(imp)] = imp
+ }
+ for left, rights := range refs {
+ if imp, ok := importsByName[left]; ok {
+ if _, ok := stdlib[imp.importPath]; ok {
+ // We have the stdlib in memory; no need to guess.
+ rights = stdlib[imp.importPath]
+ }
+ p.addCandidate(imp, &packageInfo{
+ // no name; we already know it.
+ exports: rights,
+ })
+ }
+ }
+ }
+}
+
+// addCandidate adds a candidate import to p, and merges in the information
+// in pkg.
+func (p *pass) addCandidate(imp *importInfo, pkg *packageInfo) {
+ p.candidates = append(p.candidates, imp)
+ if existing, ok := p.knownPackages[imp.importPath]; ok {
+ if existing.name == "" {
+ existing.name = pkg.name
+ }
+ for export := range pkg.exports {
+ existing.exports[export] = true
+ }
+ } else {
+ p.knownPackages[imp.importPath] = pkg
+ }
+}
+
+// fixImports adds and removes imports from f so that all its references are
+// satisfied and there are no unused imports.
+//
+// This is declared as a variable rather than a function so goimports can
+// easily be extended by adding a file with an init function.
+var fixImports = fixImportsDefault
+
+func fixImportsDefault(fset *token.FileSet, f *ast.File, filename string, env *fixEnv) error {
+ abs, err := filepath.Abs(filename)
+ if err != nil {
+ return err
+ }
+ srcDir := filepath.Dir(abs)
+ if Debug {
+ log.Printf("fixImports(filename=%q), abs=%q, srcDir=%q ...", filename, abs, srcDir)
+ }
+
+ // First pass: looking only at f, and using the naive algorithm to
+ // derive package names from import paths, see if the file is already
+ // complete. We can't add any imports yet, because we don't know
+ // if missing references are actually package vars.
+ p := &pass{fset: fset, f: f, srcDir: srcDir}
+ if p.load() {
+ return nil
+ }
+
+ otherFiles := parseOtherFiles(fset, srcDir, filename)
+
+ // Second pass: add information from other files in the same package,
+ // like their package vars and imports.
+ p.otherFiles = otherFiles
+ if p.load() {
+ return nil
+ }
+
+ // Now we can try adding imports from the stdlib.
+ p.assumeSiblingImportsValid()
+ addStdlibCandidates(p, p.missingRefs)
+ if p.fix() {
+ return nil
+ }
+
+ // Third pass: get real package names where we had previously used
+ // the naive algorithm. This is the first step that will use the
+ // environment, so we provide it here for the first time.
+ p = &pass{fset: fset, f: f, srcDir: srcDir, fixEnv: env}
+ p.loadRealPackageNames = true
+ p.otherFiles = otherFiles
+ if p.load() {
+ return nil
+ }
+
+ addStdlibCandidates(p, p.missingRefs)
+ p.assumeSiblingImportsValid()
+ if p.fix() {
+ return nil
+ }
+
+ // Go look for candidates in $GOPATH, etc. We don't necessarily load
+ // the real exports of sibling imports, so keep assuming their contents.
+ if err := addExternalCandidates(p, p.missingRefs, filename); err != nil {
+ return err
+ }
+
+ p.lastTry = true
+ p.fix()
+ return nil
+}
+
+// fixEnv contains environment variables and settings that affect the use of
+// the go command, the go/build package, etc.
+type fixEnv struct {
+ // If non-empty, these will be used instead of the
+ // process-wide values.
+ GOPATH, GOROOT, GO111MODULE, GOPROXY, GOFLAGS string
+ WorkingDir string
+
+ // If true, use go/packages regardless of the environment.
+ ForceGoPackages bool
+
+ resolver resolver
+}
+
+func (e *fixEnv) env() []string {
+ env := os.Environ()
+ add := func(k, v string) {
+ if v != "" {
+ env = append(env, k+"="+v)
+ }
+ }
+ add("GOPATH", e.GOPATH)
+ add("GOROOT", e.GOROOT)
+ add("GO111MODULE", e.GO111MODULE)
+ add("GOPROXY", e.GOPROXY)
+ add("GOFLAGS", e.GOFLAGS)
+ if e.WorkingDir != "" {
+ add("PWD", e.WorkingDir)
+ }
+ return env
+}
+
+func (e *fixEnv) getResolver() resolver {
+ if e.resolver != nil {
+ return e.resolver
+ }
+ if e.ForceGoPackages {
+ return &goPackagesResolver{env: e}
+ }
+
+ out, err := e.invokeGo("env", "GOMOD")
+ if err != nil || len(bytes.TrimSpace(out.Bytes())) == 0 {
+ return &gopathResolver{env: e}
+ }
+ return &moduleResolver{env: e}
+}
+
+func (e *fixEnv) newPackagesConfig(mode packages.LoadMode) *packages.Config {
+ return &packages.Config{
+ Mode: mode,
+ Dir: e.WorkingDir,
+ Env: e.env(),
+ }
+}
+
+func (e *fixEnv) buildContext() *build.Context {
+ ctx := build.Default
+ ctx.GOROOT = e.GOROOT
+ ctx.GOPATH = e.GOPATH
+ return &ctx
+}
+
+func (e *fixEnv) invokeGo(args ...string) (*bytes.Buffer, error) {
+ cmd := exec.Command("go", args...)
+ stdout := &bytes.Buffer{}
+ stderr := &bytes.Buffer{}
+ cmd.Stdout = stdout
+ cmd.Stderr = stderr
+ cmd.Env = e.env()
+ cmd.Dir = e.WorkingDir
+
+ if Debug {
+ defer func(start time.Time) { log.Printf("%s for %v", time.Since(start), cmdDebugStr(cmd)) }(time.Now())
+ }
+ if err := cmd.Run(); err != nil {
+ return nil, fmt.Errorf("running go: %v (stderr:\n%s)", err, stderr)
+ }
+ return stdout, nil
+}
+
+func cmdDebugStr(cmd *exec.Cmd) string {
+ env := make(map[string]string)
+ for _, kv := range cmd.Env {
+ split := strings.Split(kv, "=")
+ k, v := split[0], split[1]
+ env[k] = v
+ }
+
+ return fmt.Sprintf("GOROOT=%v GOPATH=%v GO111MODULE=%v GOPROXY=%v PWD=%v go %v", env["GOROOT"], env["GOPATH"], env["GO111MODULE"], env["GOPROXY"], env["PWD"], cmd.Args)
+}
+
+func addStdlibCandidates(pass *pass, refs references) {
+ add := func(pkg string) {
+ pass.addCandidate(
+ &importInfo{importPath: pkg},
+ &packageInfo{name: path.Base(pkg), exports: stdlib[pkg]})
+ }
+ for left := range refs {
+ if left == "rand" {
+ // Make sure we try crypto/rand before math/rand.
+ add("crypto/rand")
+ add("math/rand")
+ continue
+ }
+ for importPath := range stdlib {
+ if path.Base(importPath) == left {
+ add(importPath)
+ }
+ }
+ }
+}
+
+// A resolver does the build-system-specific parts of goimports.
+type resolver interface {
+ // loadPackageNames loads the package names in importPaths.
+ loadPackageNames(importPaths []string, srcDir string) (map[string]string, error)
+ // scan finds (at least) the packages satisfying refs. The returned slice is unordered.
+ scan(refs references) ([]*pkg, error)
+}
+
+// gopathResolver implements resolver for GOPATH and module workspaces using go/packages.
+type goPackagesResolver struct {
+ env *fixEnv
+}
+
+func (r *goPackagesResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) {
+ cfg := r.env.newPackagesConfig(packages.LoadFiles)
+ pkgs, err := packages.Load(cfg, importPaths...)
+ if err != nil {
+ return nil, err
+ }
+ names := map[string]string{}
+ for _, pkg := range pkgs {
+ names[VendorlessPath(pkg.PkgPath)] = pkg.Name
+ }
+ // We may not have found all the packages. Guess the rest.
+ for _, path := range importPaths {
+ if _, ok := names[path]; ok {
+ continue
+ }
+ names[path] = importPathToAssumedName(path)
+ }
+ return names, nil
+
+}
+
+func (r *goPackagesResolver) scan(refs references) ([]*pkg, error) {
+ var loadQueries []string
+ for pkgName := range refs {
+ loadQueries = append(loadQueries, "iamashamedtousethedisabledqueryname="+pkgName)
+ }
+ sort.Strings(loadQueries)
+ cfg := r.env.newPackagesConfig(packages.LoadFiles)
+ goPackages, err := packages.Load(cfg, loadQueries...)
+ if err != nil {
+ return nil, err
+ }
+
+ var scan []*pkg
+ for _, goPackage := range goPackages {
+ scan = append(scan, &pkg{
+ dir: filepath.Dir(goPackage.CompiledGoFiles[0]),
+ importPathShort: VendorlessPath(goPackage.PkgPath),
+ goPackage: goPackage,
+ })
+ }
+ return scan, nil
+}
+
+func addExternalCandidates(pass *pass, refs references, filename string) error {
+ dirScan, err := pass.fixEnv.getResolver().scan(refs)
+ if err != nil {
+ return err
+ }
+
+ // Search for imports matching potential package references.
+ type result struct {
+ imp *importInfo
+ pkg *packageInfo
+ }
+ results := make(chan result, len(refs))
+
+ ctx, cancel := context.WithCancel(context.TODO())
+ var wg sync.WaitGroup
+ defer func() {
+ cancel()
+ wg.Wait()
+ }()
+ var (
+ firstErr error
+ firstErrOnce sync.Once
+ )
+ for pkgName, symbols := range refs {
+ wg.Add(1)
+ go func(pkgName string, symbols map[string]bool) {
+ defer wg.Done()
+
+ found, err := findImport(ctx, pass.fixEnv, dirScan, pkgName, symbols, filename)
+
+ if err != nil {
+ firstErrOnce.Do(func() {
+ firstErr = err
+ cancel()
+ })
+ return
+ }
+
+ if found == nil {
+ return // No matching package.
+ }
+
+ imp := &importInfo{
+ importPath: found.importPathShort,
+ }
+
+ pkg := &packageInfo{
+ name: pkgName,
+ exports: symbols,
+ }
+ results <- result{imp, pkg}
+ }(pkgName, symbols)
+ }
+ go func() {
+ wg.Wait()
+ close(results)
+ }()
+
+ for result := range results {
+ pass.addCandidate(result.imp, result.pkg)
+ }
+ return firstErr
+}
+
+// notIdentifier reports whether ch is an invalid identifier character.
+func notIdentifier(ch rune) bool {
+ return !('a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' ||
+ '0' <= ch && ch <= '9' ||
+ ch == '_' ||
+ ch >= utf8.RuneSelf && (unicode.IsLetter(ch) || unicode.IsDigit(ch)))
+}
+
+// importPathToAssumedName returns the assumed package name of an import path.
+// It does this using only string parsing of the import path.
+// It picks the last element of the path that does not look like a major
+// version, and then picks the valid identifier off the start of that element.
+// It is used to determine if a local rename should be added to an import for
+// clarity.
+// This function could be moved to a standard package and exported if we want
+// for use in other tools.
+func importPathToAssumedName(importPath string) string {
+ base := path.Base(importPath)
+ if strings.HasPrefix(base, "v") {
+ if _, err := strconv.Atoi(base[1:]); err == nil {
+ dir := path.Dir(importPath)
+ if dir != "." {
+ base = path.Base(dir)
+ }
+ }
+ }
+ base = strings.TrimPrefix(base, "go-")
+ if i := strings.IndexFunc(base, notIdentifier); i >= 0 {
+ base = base[:i]
+ }
+ return base
+}
+
+// gopathResolver implements resolver for GOPATH workspaces.
+type gopathResolver struct {
+ env *fixEnv
+}
+
+func (r *gopathResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) {
+ names := map[string]string{}
+ for _, path := range importPaths {
+ names[path] = importPathToName(r.env, path, srcDir)
+ }
+ return names, nil
+}
+
+// importPathToNameGoPath finds out the actual package name, as declared in its .go files.
+// If there's a problem, it returns "".
+func importPathToName(env *fixEnv, importPath, srcDir string) (packageName string) {
+ // Fast path for standard library without going to disk.
+ if _, ok := stdlib[importPath]; ok {
+ return path.Base(importPath) // stdlib packages always match their paths.
+ }
+
+ buildPkg, err := env.buildContext().Import(importPath, srcDir, build.FindOnly)
+ if err != nil {
+ return ""
+ }
+ pkgName, err := packageDirToName(buildPkg.Dir)
+ if err != nil {
+ return ""
+ }
+ return pkgName
+}
+
+// packageDirToName is a faster version of build.Import if
+// the only thing desired is the package name. It uses build.FindOnly
+// to find the directory and then only parses one file in the package,
+// trusting that the files in the directory are consistent.
+func packageDirToName(dir string) (packageName string, err error) {
+ d, err := os.Open(dir)
+ if err != nil {
+ return "", err
+ }
+ names, err := d.Readdirnames(-1)
+ d.Close()
+ if err != nil {
+ return "", err
+ }
+ sort.Strings(names) // to have predictable behavior
+ var lastErr error
+ var nfile int
+ for _, name := range names {
+ if !strings.HasSuffix(name, ".go") {
+ continue
+ }
+ if strings.HasSuffix(name, "_test.go") {
+ continue
+ }
+ nfile++
+ fullFile := filepath.Join(dir, name)
+
+ fset := token.NewFileSet()
+ f, err := parser.ParseFile(fset, fullFile, nil, parser.PackageClauseOnly)
+ if err != nil {
+ lastErr = err
+ continue
+ }
+ pkgName := f.Name.Name
+ if pkgName == "documentation" {
+ // Special case from go/build.ImportDir, not
+ // handled by ctx.MatchFile.
+ continue
+ }
+ if pkgName == "main" {
+ // Also skip package main, assuming it's a +build ignore generator or example.
+ // Since you can't import a package main anyway, there's no harm here.
+ continue
+ }
+ return pkgName, nil
+ }
+ if lastErr != nil {
+ return "", lastErr
+ }
+ return "", fmt.Errorf("no importable package found in %d Go files", nfile)
+}
+
+type pkg struct {
+ goPackage *packages.Package
+ dir string // absolute file path to pkg directory ("/usr/lib/go/src/net/http")
+ importPathShort string // vendorless import path ("net/http", "a/b")
+}
+
+type pkgDistance struct {
+ pkg *pkg
+ distance int // relative distance to target
+}
+
+// byDistanceOrImportPathShortLength sorts by relative distance breaking ties
+// on the short import path length and then the import string itself.
+type byDistanceOrImportPathShortLength []pkgDistance
+
+func (s byDistanceOrImportPathShortLength) Len() int { return len(s) }
+func (s byDistanceOrImportPathShortLength) Less(i, j int) bool {
+ di, dj := s[i].distance, s[j].distance
+ if di == -1 {
+ return false
+ }
+ if dj == -1 {
+ return true
+ }
+ if di != dj {
+ return di < dj
+ }
+
+ vi, vj := s[i].pkg.importPathShort, s[j].pkg.importPathShort
+ if len(vi) != len(vj) {
+ return len(vi) < len(vj)
+ }
+ return vi < vj
+}
+func (s byDistanceOrImportPathShortLength) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
+
+func distance(basepath, targetpath string) int {
+ p, err := filepath.Rel(basepath, targetpath)
+ if err != nil {
+ return -1
+ }
+ if p == "." {
+ return 0
+ }
+ return strings.Count(p, string(filepath.Separator)) + 1
+}
+
+func (r *gopathResolver) scan(_ references) ([]*pkg, error) {
+ dupCheck := make(map[string]bool)
+ var result []*pkg
+
+ var mu sync.Mutex
+
+ add := func(root gopathwalk.Root, dir string) {
+ mu.Lock()
+ defer mu.Unlock()
+
+ if _, dup := dupCheck[dir]; dup {
+ return
+ }
+ dupCheck[dir] = true
+ importpath := filepath.ToSlash(dir[len(root.Path)+len("/"):])
+ result = append(result, &pkg{
+ importPathShort: VendorlessPath(importpath),
+ dir: dir,
+ })
+ }
+ gopathwalk.Walk(gopathwalk.SrcDirsRoots(r.env.buildContext()), add, gopathwalk.Options{Debug: Debug, ModulesEnabled: false})
+ return result, nil
+}
+
+// VendorlessPath returns the devendorized version of the import path ipath.
+// For example, VendorlessPath("foo/bar/vendor/a/b") returns "a/b".
+func VendorlessPath(ipath string) string {
+ // Devendorize for use in import statement.
+ if i := strings.LastIndex(ipath, "/vendor/"); i >= 0 {
+ return ipath[i+len("/vendor/"):]
+ }
+ if strings.HasPrefix(ipath, "vendor/") {
+ return ipath[len("vendor/"):]
+ }
+ return ipath
+}
+
+// loadExports returns the set of exported symbols in the package at dir.
+// It returns nil on error or if the package name in dir does not match expectPackage.
+func loadExports(ctx context.Context, env *fixEnv, expectPackage string, pkg *pkg) (map[string]bool, error) {
+ if Debug {
+ log.Printf("loading exports in dir %s (seeking package %s)", pkg.dir, expectPackage)
+ }
+ if pkg.goPackage != nil {
+ exports := map[string]bool{}
+ fset := token.NewFileSet()
+ for _, fname := range pkg.goPackage.CompiledGoFiles {
+ f, err := parser.ParseFile(fset, fname, nil, 0)
+ if err != nil {
+ return nil, fmt.Errorf("parsing %s: %v", fname, err)
+ }
+ for name := range f.Scope.Objects {
+ if ast.IsExported(name) {
+ exports[name] = true
+ }
+ }
+ }
+ return exports, nil
+ }
+
+ exports := make(map[string]bool)
+
+ // Look for non-test, buildable .go files which could provide exports.
+ all, err := ioutil.ReadDir(pkg.dir)
+ if err != nil {
+ return nil, err
+ }
+ var files []os.FileInfo
+ for _, fi := range all {
+ name := fi.Name()
+ if !strings.HasSuffix(name, ".go") || strings.HasSuffix(name, "_test.go") {
+ continue
+ }
+ match, err := env.buildContext().MatchFile(pkg.dir, fi.Name())
+ if err != nil || !match {
+ continue
+ }
+ files = append(files, fi)
+ }
+
+ if len(files) == 0 {
+ return nil, fmt.Errorf("dir %v contains no buildable, non-test .go files", pkg.dir)
+ }
+
+ fset := token.NewFileSet()
+ for _, fi := range files {
+ select {
+ case <-ctx.Done():
+ return nil, ctx.Err()
+ default:
+ }
+
+ fullFile := filepath.Join(pkg.dir, fi.Name())
+ f, err := parser.ParseFile(fset, fullFile, nil, 0)
+ if err != nil {
+ return nil, fmt.Errorf("parsing %s: %v", fullFile, err)
+ }
+ pkgName := f.Name.Name
+ if pkgName == "documentation" {
+ // Special case from go/build.ImportDir, not
+ // handled by MatchFile above.
+ continue
+ }
+ if pkgName != expectPackage {
+ return nil, fmt.Errorf("scan of dir %v is not expected package %v (actually %v)", pkg.dir, expectPackage, pkgName)
+ }
+ for name := range f.Scope.Objects {
+ if ast.IsExported(name) {
+ exports[name] = true
+ }
+ }
+ }
+
+ if Debug {
+ exportList := make([]string, 0, len(exports))
+ for k := range exports {
+ exportList = append(exportList, k)
+ }
+ sort.Strings(exportList)
+ log.Printf("loaded exports in dir %v (package %v): %v", pkg.dir, expectPackage, strings.Join(exportList, ", "))
+ }
+ return exports, nil
+}
+
+// findImport searches for a package with the given symbols.
+// If no package is found, findImport returns ("", false, nil)
+func findImport(ctx context.Context, env *fixEnv, dirScan []*pkg, pkgName string, symbols map[string]bool, filename string) (*pkg, error) {
+ pkgDir, err := filepath.Abs(filename)
+ if err != nil {
+ return nil, err
+ }
+ pkgDir = filepath.Dir(pkgDir)
+
+ // Find candidate packages, looking only at their directory names first.
+ var candidates []pkgDistance
+ for _, pkg := range dirScan {
+ if pkgIsCandidate(filename, pkgName, pkg) {
+ candidates = append(candidates, pkgDistance{
+ pkg: pkg,
+ distance: distance(pkgDir, pkg.dir),
+ })
+ }
+ }
+
+ // Sort the candidates by their import package length,
+ // assuming that shorter package names are better than long
+ // ones. Note that this sorts by the de-vendored name, so
+ // there's no "penalty" for vendoring.
+ sort.Sort(byDistanceOrImportPathShortLength(candidates))
+ if Debug {
+ for i, c := range candidates {
+ log.Printf("%s candidate %d/%d: %v in %v", pkgName, i+1, len(candidates), c.pkg.importPathShort, c.pkg.dir)
+ }
+ }
+
+ // Collect exports for packages with matching names.
+
+ rescv := make([]chan *pkg, len(candidates))
+ for i := range candidates {
+ rescv[i] = make(chan *pkg, 1)
+ }
+ const maxConcurrentPackageImport = 4
+ loadExportsSem := make(chan struct{}, maxConcurrentPackageImport)
+
+ ctx, cancel := context.WithCancel(ctx)
+ var wg sync.WaitGroup
+ defer func() {
+ cancel()
+ wg.Wait()
+ }()
+
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for i, c := range candidates {
+ select {
+ case loadExportsSem <- struct{}{}:
+ case <-ctx.Done():
+ return
+ }
+
+ wg.Add(1)
+ go func(c pkgDistance, resc chan<- *pkg) {
+ defer func() {
+ <-loadExportsSem
+ wg.Done()
+ }()
+
+ exports, err := loadExports(ctx, env, pkgName, c.pkg)
+ if err != nil {
+ if Debug {
+ log.Printf("loading exports in dir %s (seeking package %s): %v", c.pkg.dir, pkgName, err)
+ }
+ resc <- nil
+ return
+ }
+
+ // If it doesn't have the right
+ // symbols, send nil to mean no match.
+ for symbol := range symbols {
+ if !exports[symbol] {
+ resc <- nil
+ return
+ }
+ }
+ resc <- c.pkg
+ }(c, rescv[i])
+ }
+ }()
+
+ for _, resc := range rescv {
+ pkg := <-resc
+ if pkg == nil {
+ continue
+ }
+ return pkg, nil
+ }
+ return nil, nil
+}
+
+// pkgIsCandidate reports whether pkg is a candidate for satisfying the
+// finding which package pkgIdent in the file named by filename is trying
+// to refer to.
+//
+// This check is purely lexical and is meant to be as fast as possible
+// because it's run over all $GOPATH directories to filter out poor
+// candidates in order to limit the CPU and I/O later parsing the
+// exports in candidate packages.
+//
+// filename is the file being formatted.
+// pkgIdent is the package being searched for, like "client" (if
+// searching for "client.New")
+func pkgIsCandidate(filename, pkgIdent string, pkg *pkg) bool {
+ // Check "internal" and "vendor" visibility:
+ if !canUse(filename, pkg.dir) {
+ return false
+ }
+
+ // Speed optimization to minimize disk I/O:
+ // the last two components on disk must contain the
+ // package name somewhere.
+ //
+ // This permits mismatch naming like directory
+ // "go-foo" being package "foo", or "pkg.v3" being "pkg",
+ // or directory "google.golang.org/api/cloudbilling/v1"
+ // being package "cloudbilling", but doesn't
+ // permit a directory "foo" to be package
+ // "bar", which is strongly discouraged
+ // anyway. There's no reason goimports needs
+ // to be slow just to accommodate that.
+ lastTwo := lastTwoComponents(pkg.importPathShort)
+ if strings.Contains(lastTwo, pkgIdent) {
+ return true
+ }
+ if hasHyphenOrUpperASCII(lastTwo) && !hasHyphenOrUpperASCII(pkgIdent) {
+ lastTwo = lowerASCIIAndRemoveHyphen(lastTwo)
+ if strings.Contains(lastTwo, pkgIdent) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func hasHyphenOrUpperASCII(s string) bool {
+ for i := 0; i < len(s); i++ {
+ b := s[i]
+ if b == '-' || ('A' <= b && b <= 'Z') {
+ return true
+ }
+ }
+ return false
+}
+
+func lowerASCIIAndRemoveHyphen(s string) (ret string) {
+ buf := make([]byte, 0, len(s))
+ for i := 0; i < len(s); i++ {
+ b := s[i]
+ switch {
+ case b == '-':
+ continue
+ case 'A' <= b && b <= 'Z':
+ buf = append(buf, b+('a'-'A'))
+ default:
+ buf = append(buf, b)
+ }
+ }
+ return string(buf)
+}
+
+// canUse reports whether the package in dir is usable from filename,
+// respecting the Go "internal" and "vendor" visibility rules.
+func canUse(filename, dir string) bool {
+ // Fast path check, before any allocations. If it doesn't contain vendor
+ // or internal, it's not tricky:
+ // Note that this can false-negative on directories like "notinternal",
+ // but we check it correctly below. This is just a fast path.
+ if !strings.Contains(dir, "vendor") && !strings.Contains(dir, "internal") {
+ return true
+ }
+
+ dirSlash := filepath.ToSlash(dir)
+ if !strings.Contains(dirSlash, "/vendor/") && !strings.Contains(dirSlash, "/internal/") && !strings.HasSuffix(dirSlash, "/internal") {
+ return true
+ }
+ // Vendor or internal directory only visible from children of parent.
+ // That means the path from the current directory to the target directory
+ // can contain ../vendor or ../internal but not ../foo/vendor or ../foo/internal
+ // or bar/vendor or bar/internal.
+ // After stripping all the leading ../, the only okay place to see vendor or internal
+ // is at the very beginning of the path.
+ absfile, err := filepath.Abs(filename)
+ if err != nil {
+ return false
+ }
+ absdir, err := filepath.Abs(dir)
+ if err != nil {
+ return false
+ }
+ rel, err := filepath.Rel(absfile, absdir)
+ if err != nil {
+ return false
+ }
+ relSlash := filepath.ToSlash(rel)
+ if i := strings.LastIndex(relSlash, "../"); i >= 0 {
+ relSlash = relSlash[i+len("../"):]
+ }
+ return !strings.Contains(relSlash, "/vendor/") && !strings.Contains(relSlash, "/internal/") && !strings.HasSuffix(relSlash, "/internal")
+}
+
+// lastTwoComponents returns at most the last two path components
+// of v, using either / or \ as the path separator.
+func lastTwoComponents(v string) string {
+ nslash := 0
+ for i := len(v) - 1; i >= 0; i-- {
+ if v[i] == '/' || v[i] == '\\' {
+ nslash++
+ if nslash == 2 {
+ return v[i:]
+ }
+ }
+ }
+ return v
+}
+
+type visitFn func(node ast.Node) ast.Visitor
+
+func (fn visitFn) Visit(node ast.Node) ast.Visitor {
+ return fn(node)
+}
diff --git a/vendor/golang.org/x/tools/imports/imports.go b/vendor/golang.org/x/tools/imports/imports.go
new file mode 100644
index 00000000000..07101cb8048
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/imports.go
@@ -0,0 +1,315 @@
+// 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.
+
+//go:generate go run mkstdlib.go
+
+// Package imports implements a Go pretty-printer (like package "go/format")
+// that also adds or removes import statements as necessary.
+package imports // import "golang.org/x/tools/imports"
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/format"
+ "go/parser"
+ "go/printer"
+ "go/token"
+ "io"
+ "io/ioutil"
+ "regexp"
+ "strconv"
+ "strings"
+
+ "golang.org/x/tools/go/ast/astutil"
+)
+
+// Options specifies options for processing files.
+type Options struct {
+ Fragment bool // Accept fragment of a source file (no package statement)
+ AllErrors bool // Report all errors (not just the first 10 on different lines)
+
+ Comments bool // Print comments (true if nil *Options provided)
+ TabIndent bool // Use tabs for indent (true if nil *Options provided)
+ TabWidth int // Tab width (8 if nil *Options provided)
+
+ FormatOnly bool // Disable the insertion and deletion of imports
+}
+
+// Process formats and adjusts imports for the provided file.
+// If opt is nil the defaults are used.
+//
+// Note that filename's directory influences which imports can be chosen,
+// so it is important that filename be accurate.
+// To process data ``as if'' it were in filename, pass the data as a non-nil src.
+func Process(filename string, src []byte, opt *Options) ([]byte, error) {
+ env := &fixEnv{GOPATH: build.Default.GOPATH, GOROOT: build.Default.GOROOT}
+ return process(filename, src, opt, env)
+}
+
+func process(filename string, src []byte, opt *Options, env *fixEnv) ([]byte, error) {
+ if opt == nil {
+ opt = &Options{Comments: true, TabIndent: true, TabWidth: 8}
+ }
+ if src == nil {
+ b, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return nil, err
+ }
+ src = b
+ }
+
+ fileSet := token.NewFileSet()
+ file, adjust, err := parse(fileSet, filename, src, opt)
+ if err != nil {
+ return nil, err
+ }
+
+ if !opt.FormatOnly {
+ if err := fixImports(fileSet, file, filename, env); err != nil {
+ return nil, err
+ }
+ }
+
+ sortImports(fileSet, file)
+ imps := astutil.Imports(fileSet, file)
+ var spacesBefore []string // import paths we need spaces before
+ for _, impSection := range imps {
+ // Within each block of contiguous imports, see if any
+ // import lines are in different group numbers. If so,
+ // we'll need to put a space between them so it's
+ // compatible with gofmt.
+ lastGroup := -1
+ for _, importSpec := range impSection {
+ importPath, _ := strconv.Unquote(importSpec.Path.Value)
+ groupNum := importGroup(importPath)
+ if groupNum != lastGroup && lastGroup != -1 {
+ spacesBefore = append(spacesBefore, importPath)
+ }
+ lastGroup = groupNum
+ }
+
+ }
+
+ printerMode := printer.UseSpaces
+ if opt.TabIndent {
+ printerMode |= printer.TabIndent
+ }
+ printConfig := &printer.Config{Mode: printerMode, Tabwidth: opt.TabWidth}
+
+ var buf bytes.Buffer
+ err = printConfig.Fprint(&buf, fileSet, file)
+ if err != nil {
+ return nil, err
+ }
+ out := buf.Bytes()
+ if adjust != nil {
+ out = adjust(src, out)
+ }
+ if len(spacesBefore) > 0 {
+ out, err = addImportSpaces(bytes.NewReader(out), spacesBefore)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ out, err = format.Source(out)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// parse parses src, which was read from filename,
+// as a Go source file or statement list.
+func parse(fset *token.FileSet, filename string, src []byte, opt *Options) (*ast.File, func(orig, src []byte) []byte, error) {
+ parserMode := parser.Mode(0)
+ if opt.Comments {
+ parserMode |= parser.ParseComments
+ }
+ if opt.AllErrors {
+ parserMode |= parser.AllErrors
+ }
+
+ // Try as whole source file.
+ file, err := parser.ParseFile(fset, filename, src, parserMode)
+ if err == nil {
+ return file, nil, nil
+ }
+ // If the error is that the source file didn't begin with a
+ // package line and we accept fragmented input, fall through to
+ // try as a source fragment. Stop and return on any other error.
+ if !opt.Fragment || !strings.Contains(err.Error(), "expected 'package'") {
+ return nil, nil, err
+ }
+
+ // If this is a declaration list, make it a source file
+ // by inserting a package clause.
+ // Insert using a ;, not a newline, so that parse errors are on
+ // the correct line.
+ const prefix = "package main;"
+ psrc := append([]byte(prefix), src...)
+ file, err = parser.ParseFile(fset, filename, psrc, parserMode)
+ if err == nil {
+ // Gofmt will turn the ; into a \n.
+ // Do that ourselves now and update the file contents,
+ // so that positions and line numbers are correct going forward.
+ psrc[len(prefix)-1] = '\n'
+ fset.File(file.Package).SetLinesForContent(psrc)
+
+ // If a main function exists, we will assume this is a main
+ // package and leave the file.
+ if containsMainFunc(file) {
+ return file, nil, nil
+ }
+
+ adjust := func(orig, src []byte) []byte {
+ // Remove the package clause.
+ src = src[len(prefix):]
+ return matchSpace(orig, src)
+ }
+ return file, adjust, nil
+ }
+ // 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 nil, nil, err
+ }
+
+ // 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.
+ fsrc := append(append([]byte("package p; func _() {"), src...), '}')
+ file, err = parser.ParseFile(fset, filename, fsrc, parserMode)
+ if err == nil {
+ adjust := func(orig, src []byte) []byte {
+ // Remove the wrapping.
+ // Gofmt has turned the ; into a \n\n.
+ src = src[len("package p\n\nfunc _() {"):]
+ src = src[:len(src)-len("}\n")]
+ // Gofmt has also indented the function body one level.
+ // Remove that indent.
+ src = bytes.Replace(src, []byte("\n\t"), []byte("\n"), -1)
+ return matchSpace(orig, src)
+ }
+ return file, adjust, nil
+ }
+
+ // Failed, and out of options.
+ return nil, nil, err
+}
+
+// containsMainFunc checks if a file contains a function declaration with the
+// function signature 'func main()'
+func containsMainFunc(file *ast.File) bool {
+ for _, decl := range file.Decls {
+ if f, ok := decl.(*ast.FuncDecl); ok {
+ if f.Name.Name != "main" {
+ continue
+ }
+
+ if len(f.Type.Params.List) != 0 {
+ continue
+ }
+
+ if f.Type.Results != nil && len(f.Type.Results.List) != 0 {
+ continue
+ }
+
+ return true
+ }
+ }
+
+ return false
+}
+
+func cutSpace(b []byte) (before, middle, after []byte) {
+ i := 0
+ for i < len(b) && (b[i] == ' ' || b[i] == '\t' || b[i] == '\n') {
+ i++
+ }
+ j := len(b)
+ for j > 0 && (b[j-1] == ' ' || b[j-1] == '\t' || b[j-1] == '\n') {
+ j--
+ }
+ if i <= j {
+ return b[:i], b[i:j], b[j:]
+ }
+ return nil, nil, b[j:]
+}
+
+// matchSpace reformats src to use the same space context as orig.
+// 1) If orig begins with blank lines, matchSpace inserts them at the beginning of src.
+// 2) matchSpace copies the indentation of the first non-blank line in orig
+// to every non-blank line in src.
+// 3) matchSpace copies the trailing space from orig and uses it in place
+// of src's trailing space.
+func matchSpace(orig []byte, src []byte) []byte {
+ before, _, after := cutSpace(orig)
+ i := bytes.LastIndex(before, []byte{'\n'})
+ before, indent := before[:i+1], before[i+1:]
+
+ _, src, _ = cutSpace(src)
+
+ var b bytes.Buffer
+ b.Write(before)
+ for len(src) > 0 {
+ line := src
+ if i := bytes.IndexByte(line, '\n'); i >= 0 {
+ line, src = line[:i+1], line[i+1:]
+ } else {
+ src = nil
+ }
+ if len(line) > 0 && line[0] != '\n' { // not blank
+ b.Write(indent)
+ }
+ b.Write(line)
+ }
+ b.Write(after)
+ return b.Bytes()
+}
+
+var impLine = regexp.MustCompile(`^\s+(?:[\w\.]+\s+)?"(.+)"`)
+
+func addImportSpaces(r io.Reader, breaks []string) ([]byte, error) {
+ var out bytes.Buffer
+ in := bufio.NewReader(r)
+ inImports := false
+ done := false
+ for {
+ s, err := in.ReadString('\n')
+ if err == io.EOF {
+ break
+ } else if err != nil {
+ return nil, err
+ }
+
+ if !inImports && !done && strings.HasPrefix(s, "import") {
+ inImports = true
+ }
+ if inImports && (strings.HasPrefix(s, "var") ||
+ strings.HasPrefix(s, "func") ||
+ strings.HasPrefix(s, "const") ||
+ strings.HasPrefix(s, "type")) {
+ done = true
+ inImports = false
+ }
+ if inImports && len(breaks) > 0 {
+ if m := impLine.FindStringSubmatch(s); m != nil {
+ if m[1] == breaks[0] {
+ out.WriteByte('\n')
+ breaks = breaks[1:]
+ }
+ }
+ }
+
+ fmt.Fprint(&out, s)
+ }
+ return out.Bytes(), nil
+}
diff --git a/vendor/golang.org/x/tools/imports/mkindex.go b/vendor/golang.org/x/tools/imports/mkindex.go
new file mode 100644
index 00000000000..755e2394f2d
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/mkindex.go
@@ -0,0 +1,173 @@
+// +build ignore
+
+// 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.
+
+// Command mkindex creates the file "pkgindex.go" containing an index of the Go
+// standard library. The file is intended to be built as part of the imports
+// package, so that the package may be used in environments where a GOROOT is
+// not available (such as App Engine).
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/build"
+ "go/format"
+ "go/parser"
+ "go/token"
+ "io/ioutil"
+ "log"
+ "os"
+ "path"
+ "path/filepath"
+ "strings"
+)
+
+var (
+ pkgIndex = make(map[string][]pkg)
+ exports = make(map[string]map[string]bool)
+)
+
+func main() {
+ // Don't use GOPATH.
+ ctx := build.Default
+ ctx.GOPATH = ""
+
+ // Populate pkgIndex global from GOROOT.
+ for _, path := range ctx.SrcDirs() {
+ f, err := os.Open(path)
+ if err != nil {
+ log.Print(err)
+ continue
+ }
+ children, err := f.Readdir(-1)
+ f.Close()
+ if err != nil {
+ log.Print(err)
+ continue
+ }
+ for _, child := range children {
+ if child.IsDir() {
+ loadPkg(path, child.Name())
+ }
+ }
+ }
+ // Populate exports global.
+ for _, ps := range pkgIndex {
+ for _, p := range ps {
+ e := loadExports(p.dir)
+ if e != nil {
+ exports[p.dir] = e
+ }
+ }
+ }
+
+ // Construct source file.
+ var buf bytes.Buffer
+ fmt.Fprint(&buf, pkgIndexHead)
+ fmt.Fprintf(&buf, "var pkgIndexMaster = %#v\n", pkgIndex)
+ fmt.Fprintf(&buf, "var exportsMaster = %#v\n", exports)
+ src := buf.Bytes()
+
+ // Replace main.pkg type name with pkg.
+ src = bytes.Replace(src, []byte("main.pkg"), []byte("pkg"), -1)
+ // Replace actual GOROOT with "/go".
+ src = bytes.Replace(src, []byte(ctx.GOROOT), []byte("/go"), -1)
+ // Add some line wrapping.
+ src = bytes.Replace(src, []byte("}, "), []byte("},\n"), -1)
+ src = bytes.Replace(src, []byte("true, "), []byte("true,\n"), -1)
+
+ var err error
+ src, err = format.Source(src)
+ if err != nil {
+ log.Fatal(err)
+ }
+
+ // Write out source file.
+ err = ioutil.WriteFile("pkgindex.go", src, 0644)
+ if err != nil {
+ log.Fatal(err)
+ }
+}
+
+const pkgIndexHead = `package imports
+
+func init() {
+ pkgIndexOnce.Do(func() {
+ pkgIndex.m = pkgIndexMaster
+ })
+ loadExports = func(dir string) map[string]bool {
+ return exportsMaster[dir]
+ }
+}
+`
+
+type pkg struct {
+ importpath string // full pkg import path, e.g. "net/http"
+ dir string // absolute file path to pkg directory e.g. "/usr/lib/go/src/fmt"
+}
+
+var fset = token.NewFileSet()
+
+func loadPkg(root, importpath string) {
+ shortName := path.Base(importpath)
+ if shortName == "testdata" {
+ return
+ }
+
+ dir := filepath.Join(root, importpath)
+ pkgIndex[shortName] = append(pkgIndex[shortName], pkg{
+ importpath: importpath,
+ dir: dir,
+ })
+
+ pkgDir, err := os.Open(dir)
+ if err != nil {
+ return
+ }
+ children, err := pkgDir.Readdir(-1)
+ pkgDir.Close()
+ if err != nil {
+ return
+ }
+ for _, child := range children {
+ name := child.Name()
+ if name == "" {
+ continue
+ }
+ if c := name[0]; c == '.' || ('0' <= c && c <= '9') {
+ continue
+ }
+ if child.IsDir() {
+ loadPkg(root, filepath.Join(importpath, name))
+ }
+ }
+}
+
+func loadExports(dir string) map[string]bool {
+ exports := make(map[string]bool)
+ buildPkg, err := build.ImportDir(dir, 0)
+ if err != nil {
+ if strings.Contains(err.Error(), "no buildable Go source files in") {
+ return nil
+ }
+ log.Printf("could not import %q: %v", dir, err)
+ return nil
+ }
+ for _, file := range buildPkg.GoFiles {
+ f, err := parser.ParseFile(fset, filepath.Join(dir, file), nil, 0)
+ if err != nil {
+ log.Printf("could not parse %q: %v", file, err)
+ continue
+ }
+ for name := range f.Scope.Objects {
+ if ast.IsExported(name) {
+ exports[name] = true
+ }
+ }
+ }
+ return exports
+}
diff --git a/vendor/golang.org/x/tools/imports/mkstdlib.go b/vendor/golang.org/x/tools/imports/mkstdlib.go
new file mode 100644
index 00000000000..5059ad4d7d3
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/mkstdlib.go
@@ -0,0 +1,112 @@
+// +build ignore
+
+// mkstdlib generates the zstdlib.go file, containing the Go standard
+// library API symbols. It's baked into the binary to avoid scanning
+// GOPATH in the common case.
+package main
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "go/format"
+ "io"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+ "regexp"
+ "runtime"
+ "sort"
+ "strings"
+)
+
+func mustOpen(name string) io.Reader {
+ f, err := os.Open(name)
+ if err != nil {
+ log.Fatal(err)
+ }
+ return f
+}
+
+func api(base string) string {
+ return filepath.Join(runtime.GOROOT(), "api", base)
+}
+
+var sym = regexp.MustCompile(`^pkg (\S+).*?, (?:var|func|type|const) ([A-Z]\w*)`)
+
+var unsafeSyms = map[string]bool{"Alignof": true, "ArbitraryType": true, "Offsetof": true, "Pointer": true, "Sizeof": true}
+
+func main() {
+ var buf bytes.Buffer
+ outf := func(format string, args ...interface{}) {
+ fmt.Fprintf(&buf, format, args...)
+ }
+ outf("// Code generated by mkstdlib.go. DO NOT EDIT.\n\n")
+ outf("package imports\n")
+ outf("var stdlib = map[string]map[string]bool{\n")
+ f := io.MultiReader(
+ mustOpen(api("go1.txt")),
+ mustOpen(api("go1.1.txt")),
+ mustOpen(api("go1.2.txt")),
+ mustOpen(api("go1.3.txt")),
+ mustOpen(api("go1.4.txt")),
+ mustOpen(api("go1.5.txt")),
+ mustOpen(api("go1.6.txt")),
+ mustOpen(api("go1.7.txt")),
+ mustOpen(api("go1.8.txt")),
+ mustOpen(api("go1.9.txt")),
+ mustOpen(api("go1.10.txt")),
+ mustOpen(api("go1.11.txt")),
+ mustOpen(api("go1.12.txt")),
+ )
+ sc := bufio.NewScanner(f)
+
+ pkgs := map[string]map[string]bool{
+ "unsafe": unsafeSyms,
+ }
+ paths := []string{"unsafe"}
+
+ for sc.Scan() {
+ l := sc.Text()
+ has := func(v string) bool { return strings.Contains(l, v) }
+ if has("struct, ") || has("interface, ") || has(", method (") {
+ continue
+ }
+ if m := sym.FindStringSubmatch(l); m != nil {
+ path, sym := m[1], m[2]
+
+ if _, ok := pkgs[path]; !ok {
+ pkgs[path] = map[string]bool{}
+ paths = append(paths, path)
+ }
+ pkgs[path][sym] = true
+ }
+ }
+ if err := sc.Err(); err != nil {
+ log.Fatal(err)
+ }
+ sort.Strings(paths)
+ for _, path := range paths {
+ outf("\t%q: map[string]bool{\n", path)
+ pkg := pkgs[path]
+ var syms []string
+ for sym := range pkg {
+ syms = append(syms, sym)
+ }
+ sort.Strings(syms)
+ for _, sym := range syms {
+ outf("\t\t%q: true,\n", sym)
+ }
+ outf("},\n")
+ }
+ outf("}\n")
+ fmtbuf, err := format.Source(buf.Bytes())
+ if err != nil {
+ log.Fatal(err)
+ }
+ err = ioutil.WriteFile("zstdlib.go", fmtbuf, 0666)
+ if err != nil {
+ log.Fatal(err)
+ }
+}
diff --git a/vendor/golang.org/x/tools/imports/mod.go b/vendor/golang.org/x/tools/imports/mod.go
new file mode 100644
index 00000000000..ec769145cce
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/mod.go
@@ -0,0 +1,351 @@
+package imports
+
+import (
+ "bytes"
+ "encoding/json"
+ "io/ioutil"
+ "log"
+ "os"
+ "path"
+ "path/filepath"
+ "regexp"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "golang.org/x/tools/internal/gopathwalk"
+ "golang.org/x/tools/internal/module"
+)
+
+// moduleResolver implements resolver for modules using the go command as little
+// as feasible.
+type moduleResolver struct {
+ env *fixEnv
+
+ main *moduleJSON
+ modsByModPath []*moduleJSON // All modules, ordered by # of path components in module Path...
+ modsByDir []*moduleJSON // ...or Dir.
+}
+
+type moduleJSON struct {
+ Path string // module path
+ Version string // module version
+ Versions []string // available module versions (with -versions)
+ Replace *moduleJSON // replaced by this module
+ Time *time.Time // time version was created
+ Update *moduleJSON // available update, if any (with -u)
+ Main bool // is this the main module?
+ Indirect bool // is this module only an indirect dependency of main module?
+ Dir string // directory holding files for this module, if any
+ GoMod string // path to go.mod file for this module, if any
+ Error *moduleErrorJSON // error loading module
+}
+
+type moduleErrorJSON struct {
+ Err string // the error itself
+}
+
+func (r *moduleResolver) init() error {
+ if r.main != nil {
+ return nil
+ }
+ stdout, err := r.env.invokeGo("list", "-m", "-json", "...")
+ if err != nil {
+ return err
+ }
+ for dec := json.NewDecoder(stdout); dec.More(); {
+ mod := &moduleJSON{}
+ if err := dec.Decode(mod); err != nil {
+ return err
+ }
+ if mod.Dir == "" {
+ if Debug {
+ log.Printf("module %v has not been downloaded and will be ignored", mod.Path)
+ }
+ // Can't do anything with a module that's not downloaded.
+ continue
+ }
+ r.modsByModPath = append(r.modsByModPath, mod)
+ r.modsByDir = append(r.modsByDir, mod)
+ if mod.Main {
+ r.main = mod
+ }
+ }
+
+ sort.Slice(r.modsByModPath, func(i, j int) bool {
+ count := func(x int) int {
+ return strings.Count(r.modsByModPath[x].Path, "/")
+ }
+ return count(j) < count(i) // descending order
+ })
+ sort.Slice(r.modsByDir, func(i, j int) bool {
+ count := func(x int) int {
+ return strings.Count(r.modsByDir[x].Dir, "/")
+ }
+ return count(j) < count(i) // descending order
+ })
+
+ return nil
+}
+
+// findPackage returns the module and directory that contains the package at
+// the given import path, or returns nil, "" if no module is in scope.
+func (r *moduleResolver) findPackage(importPath string) (*moduleJSON, string) {
+ for _, m := range r.modsByModPath {
+ if !strings.HasPrefix(importPath, m.Path) {
+ continue
+ }
+ pathInModule := importPath[len(m.Path):]
+ pkgDir := filepath.Join(m.Dir, pathInModule)
+ if dirIsNestedModule(pkgDir, m) {
+ continue
+ }
+
+ pkgFiles, err := ioutil.ReadDir(pkgDir)
+ if err != nil {
+ continue
+ }
+
+ // A module only contains a package if it has buildable go
+ // files in that directory. If not, it could be provided by an
+ // outer module. See #29736.
+ for _, fi := range pkgFiles {
+ if ok, _ := r.env.buildContext().MatchFile(pkgDir, fi.Name()); ok {
+ return m, pkgDir
+ }
+ }
+ }
+ return nil, ""
+}
+
+// findModuleByDir returns the module that contains dir, or nil if no such
+// module is in scope.
+func (r *moduleResolver) findModuleByDir(dir string) *moduleJSON {
+ // This is quite tricky and may not be correct. dir could be:
+ // - a package in the main module.
+ // - a replace target underneath the main module's directory.
+ // - a nested module in the above.
+ // - a replace target somewhere totally random.
+ // - a nested module in the above.
+ // - in the mod cache.
+ // - in /vendor/ in -mod=vendor mode.
+ // - nested module? Dunno.
+ // Rumor has it that replace targets cannot contain other replace targets.
+ for _, m := range r.modsByDir {
+ if !strings.HasPrefix(dir, m.Dir) {
+ continue
+ }
+
+ if dirIsNestedModule(dir, m) {
+ continue
+ }
+
+ return m
+ }
+ return nil
+}
+
+// dirIsNestedModule reports if dir is contained in a nested module underneath
+// mod, not actually in mod.
+func dirIsNestedModule(dir string, mod *moduleJSON) bool {
+ if !strings.HasPrefix(dir, mod.Dir) {
+ return false
+ }
+ mf := findModFile(dir)
+ if mf == "" {
+ return false
+ }
+ return filepath.Dir(mf) != mod.Dir
+}
+
+func findModFile(dir string) string {
+ for {
+ f := filepath.Join(dir, "go.mod")
+ info, err := os.Stat(f)
+ if err == nil && !info.IsDir() {
+ return f
+ }
+ d := filepath.Dir(dir)
+ if len(d) >= len(dir) {
+ return "" // reached top of file system, no go.mod
+ }
+ dir = d
+ }
+}
+
+func (r *moduleResolver) loadPackageNames(importPaths []string, srcDir string) (map[string]string, error) {
+ if err := r.init(); err != nil {
+ return nil, err
+ }
+ names := map[string]string{}
+ for _, path := range importPaths {
+ _, packageDir := r.findPackage(path)
+ if packageDir == "" {
+ continue
+ }
+ name, err := packageDirToName(packageDir)
+ if err != nil {
+ continue
+ }
+ names[path] = name
+ }
+ return names, nil
+}
+
+func (r *moduleResolver) scan(_ references) ([]*pkg, error) {
+ if err := r.init(); err != nil {
+ return nil, err
+ }
+
+ // Walk GOROOT, GOPATH/pkg/mod, and the main module.
+ roots := []gopathwalk.Root{
+ {filepath.Join(r.env.GOROOT, "/src"), gopathwalk.RootGOROOT},
+ {r.main.Dir, gopathwalk.RootCurrentModule},
+ }
+ for _, p := range filepath.SplitList(r.env.GOPATH) {
+ roots = append(roots, gopathwalk.Root{filepath.Join(p, "/pkg/mod"), gopathwalk.RootModuleCache})
+ }
+
+ // Walk replace targets, just in case they're not in any of the above.
+ for _, mod := range r.modsByModPath {
+ if mod.Replace != nil {
+ roots = append(roots, gopathwalk.Root{mod.Dir, gopathwalk.RootOther})
+ }
+ }
+
+ var result []*pkg
+ dupCheck := make(map[string]bool)
+ var mu sync.Mutex
+
+ gopathwalk.Walk(roots, func(root gopathwalk.Root, dir string) {
+ mu.Lock()
+ defer mu.Unlock()
+
+ if _, dup := dupCheck[dir]; dup {
+ return
+ }
+
+ dupCheck[dir] = true
+
+ subdir := ""
+ if dir != root.Path {
+ subdir = dir[len(root.Path)+len("/"):]
+ }
+ importPath := filepath.ToSlash(subdir)
+ if strings.HasPrefix(importPath, "vendor/") {
+ // Ignore vendor dirs. If -mod=vendor is on, then things
+ // should mostly just work, but when it's not vendor/
+ // is a mess. There's no easy way to tell if it's on.
+ // We can still find things in the mod cache and
+ // map them into /vendor when -mod=vendor is on.
+ return
+ }
+ switch root.Type {
+ case gopathwalk.RootCurrentModule:
+ importPath = path.Join(r.main.Path, filepath.ToSlash(subdir))
+ case gopathwalk.RootModuleCache:
+ matches := modCacheRegexp.FindStringSubmatch(subdir)
+ modPath, err := module.DecodePath(filepath.ToSlash(matches[1]))
+ if err != nil {
+ if Debug {
+ log.Printf("decoding module cache path %q: %v", subdir, err)
+ }
+ return
+ }
+ importPath = path.Join(modPath, filepath.ToSlash(matches[3]))
+ case gopathwalk.RootGOROOT:
+ importPath = subdir
+ }
+
+ // Check if the directory is underneath a module that's in scope.
+ if mod := r.findModuleByDir(dir); mod != nil {
+ // It is. If dir is the target of a replace directive,
+ // our guessed import path is wrong. Use the real one.
+ if mod.Dir == dir {
+ importPath = mod.Path
+ } else {
+ dirInMod := dir[len(mod.Dir)+len("/"):]
+ importPath = path.Join(mod.Path, filepath.ToSlash(dirInMod))
+ }
+ } else {
+ // The package is in an unknown module. Check that it's
+ // not obviously impossible to import.
+ var modFile string
+ switch root.Type {
+ case gopathwalk.RootModuleCache:
+ matches := modCacheRegexp.FindStringSubmatch(subdir)
+ modFile = filepath.Join(matches[1], "@", matches[2], "go.mod")
+ default:
+ modFile = findModFile(dir)
+ }
+
+ modBytes, err := ioutil.ReadFile(modFile)
+ if err == nil && !strings.HasPrefix(importPath, modulePath(modBytes)) {
+ // The module's declared path does not match
+ // its expected path. It probably needs a
+ // replace directive we don't have.
+ return
+ }
+ }
+ // We may have discovered a package that has a different version
+ // in scope already. Canonicalize to that one if possible.
+ if _, canonicalDir := r.findPackage(importPath); canonicalDir != "" {
+ dir = canonicalDir
+ }
+
+ result = append(result, &pkg{
+ importPathShort: VendorlessPath(importPath),
+ dir: dir,
+ })
+ }, gopathwalk.Options{Debug: Debug, ModulesEnabled: true})
+ return result, nil
+}
+
+// modCacheRegexp splits a path in a module cache into module, module version, and package.
+var modCacheRegexp = regexp.MustCompile(`(.*)@([^/\\]*)(.*)`)
+
+var (
+ slashSlash = []byte("//")
+ moduleStr = []byte("module")
+)
+
+// modulePath returns the module path from the gomod file text.
+// If it cannot find a module path, it returns an empty string.
+// It is tolerant of unrelated problems in the go.mod file.
+//
+// Copied from cmd/go/internal/modfile.
+func modulePath(mod []byte) string {
+ for len(mod) > 0 {
+ line := mod
+ mod = nil
+ if i := bytes.IndexByte(line, '\n'); i >= 0 {
+ line, mod = line[:i], line[i+1:]
+ }
+ if i := bytes.Index(line, slashSlash); i >= 0 {
+ line = line[:i]
+ }
+ line = bytes.TrimSpace(line)
+ if !bytes.HasPrefix(line, moduleStr) {
+ continue
+ }
+ line = line[len(moduleStr):]
+ n := len(line)
+ line = bytes.TrimSpace(line)
+ if len(line) == n || len(line) == 0 {
+ continue
+ }
+
+ if line[0] == '"' || line[0] == '`' {
+ p, err := strconv.Unquote(string(line))
+ if err != nil {
+ return "" // malformed quoted string or multiline module path
+ }
+ return p
+ }
+
+ return string(line)
+ }
+ return "" // missing module path
+}
diff --git a/vendor/golang.org/x/tools/imports/sortimports.go b/vendor/golang.org/x/tools/imports/sortimports.go
new file mode 100644
index 00000000000..f3dd56c7a6f
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/sortimports.go
@@ -0,0 +1,230 @@
+// 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.
+
+// Hacked up copy of go/ast/import.go
+
+package imports
+
+import (
+ "go/ast"
+ "go/token"
+ "sort"
+ "strconv"
+)
+
+// sortImports sorts runs of consecutive import lines in import blocks in f.
+// It also removes duplicate imports when it is possible to do so without data loss.
+func sortImports(fset *token.FileSet, f *ast.File) {
+ for i, d := range f.Decls {
+ d, ok := d.(*ast.GenDecl)
+ if !ok || d.Tok != token.IMPORT {
+ // Not an import declaration, so we're done.
+ // Imports are always first.
+ break
+ }
+
+ if len(d.Specs) == 0 {
+ // Empty import block, remove it.
+ f.Decls = append(f.Decls[:i], f.Decls[i+1:]...)
+ }
+
+ if !d.Lparen.IsValid() {
+ // Not a block: sorted by default.
+ continue
+ }
+
+ // Identify and sort runs of specs on successive lines.
+ i := 0
+ specs := d.Specs[:0]
+ for j, s := range d.Specs {
+ if j > i && fset.Position(s.Pos()).Line > 1+fset.Position(d.Specs[j-1].End()).Line {
+ // j begins a new run. End this one.
+ specs = append(specs, sortSpecs(fset, f, d.Specs[i:j])...)
+ i = j
+ }
+ }
+ specs = append(specs, sortSpecs(fset, f, d.Specs[i:])...)
+ d.Specs = specs
+
+ // Deduping can leave a blank line before the rparen; clean that up.
+ if len(d.Specs) > 0 {
+ lastSpec := d.Specs[len(d.Specs)-1]
+ lastLine := fset.Position(lastSpec.Pos()).Line
+ if rParenLine := fset.Position(d.Rparen).Line; rParenLine > lastLine+1 {
+ fset.File(d.Rparen).MergeLine(rParenLine - 1)
+ }
+ }
+ }
+}
+
+func importPath(s ast.Spec) string {
+ t, err := strconv.Unquote(s.(*ast.ImportSpec).Path.Value)
+ if err == nil {
+ return t
+ }
+ return ""
+}
+
+func importName(s ast.Spec) string {
+ n := s.(*ast.ImportSpec).Name
+ if n == nil {
+ return ""
+ }
+ return n.Name
+}
+
+func importComment(s ast.Spec) string {
+ c := s.(*ast.ImportSpec).Comment
+ if c == nil {
+ return ""
+ }
+ return c.Text()
+}
+
+// collapse indicates whether prev may be removed, leaving only next.
+func collapse(prev, next ast.Spec) bool {
+ if importPath(next) != importPath(prev) || importName(next) != importName(prev) {
+ return false
+ }
+ return prev.(*ast.ImportSpec).Comment == nil
+}
+
+type posSpan struct {
+ Start token.Pos
+ End token.Pos
+}
+
+func sortSpecs(fset *token.FileSet, f *ast.File, specs []ast.Spec) []ast.Spec {
+ // Can't short-circuit here even if specs are already sorted,
+ // since they might yet need deduplication.
+ // A lone import, however, may be safely ignored.
+ if len(specs) <= 1 {
+ return specs
+ }
+
+ // Record positions for specs.
+ pos := make([]posSpan, len(specs))
+ for i, s := range specs {
+ pos[i] = posSpan{s.Pos(), s.End()}
+ }
+
+ // Identify comments in this range.
+ // Any comment from pos[0].Start to the final line counts.
+ lastLine := fset.Position(pos[len(pos)-1].End).Line
+ cstart := len(f.Comments)
+ cend := len(f.Comments)
+ for i, g := range f.Comments {
+ if g.Pos() < pos[0].Start {
+ continue
+ }
+ if i < cstart {
+ cstart = i
+ }
+ if fset.Position(g.End()).Line > lastLine {
+ cend = i
+ break
+ }
+ }
+ comments := f.Comments[cstart:cend]
+
+ // Assign each comment to the import spec preceding it.
+ importComment := map[*ast.ImportSpec][]*ast.CommentGroup{}
+ specIndex := 0
+ for _, g := range comments {
+ for specIndex+1 < len(specs) && pos[specIndex+1].Start <= g.Pos() {
+ specIndex++
+ }
+ s := specs[specIndex].(*ast.ImportSpec)
+ importComment[s] = append(importComment[s], g)
+ }
+
+ // Sort the import specs by import path.
+ // Remove duplicates, when possible without data loss.
+ // Reassign the import paths to have the same position sequence.
+ // Reassign each comment to abut the end of its spec.
+ // Sort the comments by new position.
+ sort.Sort(byImportSpec(specs))
+
+ // Dedup. Thanks to our sorting, we can just consider
+ // adjacent pairs of imports.
+ deduped := specs[:0]
+ for i, s := range specs {
+ if i == len(specs)-1 || !collapse(s, specs[i+1]) {
+ deduped = append(deduped, s)
+ } else {
+ p := s.Pos()
+ fset.File(p).MergeLine(fset.Position(p).Line)
+ }
+ }
+ specs = deduped
+
+ // Fix up comment positions
+ for i, s := range specs {
+ s := s.(*ast.ImportSpec)
+ if s.Name != nil {
+ s.Name.NamePos = pos[i].Start
+ }
+ s.Path.ValuePos = pos[i].Start
+ s.EndPos = pos[i].End
+ nextSpecPos := pos[i].End
+
+ for _, g := range importComment[s] {
+ for _, c := range g.List {
+ c.Slash = pos[i].End
+ nextSpecPos = c.End()
+ }
+ }
+ if i < len(specs)-1 {
+ pos[i+1].Start = nextSpecPos
+ pos[i+1].End = nextSpecPos
+ }
+ }
+
+ sort.Sort(byCommentPos(comments))
+
+ // Fixup comments can insert blank lines, because import specs are on different lines.
+ // We remove those blank lines here by merging import spec to the first import spec line.
+ firstSpecLine := fset.Position(specs[0].Pos()).Line
+ for _, s := range specs[1:] {
+ p := s.Pos()
+ line := fset.File(p).Line(p)
+ for previousLine := line - 1; previousLine >= firstSpecLine; {
+ fset.File(p).MergeLine(previousLine)
+ previousLine--
+ }
+ }
+ return specs
+}
+
+type byImportSpec []ast.Spec // slice of *ast.ImportSpec
+
+func (x byImportSpec) Len() int { return len(x) }
+func (x byImportSpec) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
+func (x byImportSpec) Less(i, j int) bool {
+ ipath := importPath(x[i])
+ jpath := importPath(x[j])
+
+ igroup := importGroup(ipath)
+ jgroup := importGroup(jpath)
+ if igroup != jgroup {
+ return igroup < jgroup
+ }
+
+ if ipath != jpath {
+ return ipath < jpath
+ }
+ iname := importName(x[i])
+ jname := importName(x[j])
+
+ if iname != jname {
+ return iname < jname
+ }
+ return importComment(x[i]) < importComment(x[j])
+}
+
+type byCommentPos []*ast.CommentGroup
+
+func (x byCommentPos) Len() int { return len(x) }
+func (x byCommentPos) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
+func (x byCommentPos) Less(i, j int) bool { return x[i].Pos() < x[j].Pos() }
diff --git a/vendor/golang.org/x/tools/imports/zstdlib.go b/vendor/golang.org/x/tools/imports/zstdlib.go
new file mode 100644
index 00000000000..c18a0095b20
--- /dev/null
+++ b/vendor/golang.org/x/tools/imports/zstdlib.go
@@ -0,0 +1,10302 @@
+// Code generated by mkstdlib.go. DO NOT EDIT.
+
+package imports
+
+var stdlib = map[string]map[string]bool{
+ "archive/tar": map[string]bool{
+ "ErrFieldTooLong": true,
+ "ErrHeader": true,
+ "ErrWriteAfterClose": true,
+ "ErrWriteTooLong": true,
+ "FileInfoHeader": true,
+ "Format": true,
+ "FormatGNU": true,
+ "FormatPAX": true,
+ "FormatUSTAR": true,
+ "FormatUnknown": true,
+ "Header": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "Reader": true,
+ "TypeBlock": true,
+ "TypeChar": true,
+ "TypeCont": true,
+ "TypeDir": true,
+ "TypeFifo": true,
+ "TypeGNULongLink": true,
+ "TypeGNULongName": true,
+ "TypeGNUSparse": true,
+ "TypeLink": true,
+ "TypeReg": true,
+ "TypeRegA": true,
+ "TypeSymlink": true,
+ "TypeXGlobalHeader": true,
+ "TypeXHeader": true,
+ "Writer": true,
+ },
+ "archive/zip": map[string]bool{
+ "Compressor": true,
+ "Decompressor": true,
+ "Deflate": true,
+ "ErrAlgorithm": true,
+ "ErrChecksum": true,
+ "ErrFormat": true,
+ "File": true,
+ "FileHeader": true,
+ "FileInfoHeader": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "OpenReader": true,
+ "ReadCloser": true,
+ "Reader": true,
+ "RegisterCompressor": true,
+ "RegisterDecompressor": true,
+ "Store": true,
+ "Writer": true,
+ },
+ "bufio": map[string]bool{
+ "ErrAdvanceTooFar": true,
+ "ErrBufferFull": true,
+ "ErrFinalToken": true,
+ "ErrInvalidUnreadByte": true,
+ "ErrInvalidUnreadRune": true,
+ "ErrNegativeAdvance": true,
+ "ErrNegativeCount": true,
+ "ErrTooLong": true,
+ "MaxScanTokenSize": true,
+ "NewReadWriter": true,
+ "NewReader": true,
+ "NewReaderSize": true,
+ "NewScanner": true,
+ "NewWriter": true,
+ "NewWriterSize": true,
+ "ReadWriter": true,
+ "Reader": true,
+ "ScanBytes": true,
+ "ScanLines": true,
+ "ScanRunes": true,
+ "ScanWords": true,
+ "Scanner": true,
+ "SplitFunc": true,
+ "Writer": true,
+ },
+ "bytes": map[string]bool{
+ "Buffer": true,
+ "Compare": true,
+ "Contains": true,
+ "ContainsAny": true,
+ "ContainsRune": true,
+ "Count": true,
+ "Equal": true,
+ "EqualFold": true,
+ "ErrTooLarge": true,
+ "Fields": true,
+ "FieldsFunc": true,
+ "HasPrefix": true,
+ "HasSuffix": true,
+ "Index": true,
+ "IndexAny": true,
+ "IndexByte": true,
+ "IndexFunc": true,
+ "IndexRune": true,
+ "Join": true,
+ "LastIndex": true,
+ "LastIndexAny": true,
+ "LastIndexByte": true,
+ "LastIndexFunc": true,
+ "Map": true,
+ "MinRead": true,
+ "NewBuffer": true,
+ "NewBufferString": true,
+ "NewReader": true,
+ "Reader": true,
+ "Repeat": true,
+ "Replace": true,
+ "ReplaceAll": true,
+ "Runes": true,
+ "Split": true,
+ "SplitAfter": true,
+ "SplitAfterN": true,
+ "SplitN": true,
+ "Title": true,
+ "ToLower": true,
+ "ToLowerSpecial": true,
+ "ToTitle": true,
+ "ToTitleSpecial": true,
+ "ToUpper": true,
+ "ToUpperSpecial": true,
+ "Trim": true,
+ "TrimFunc": true,
+ "TrimLeft": true,
+ "TrimLeftFunc": true,
+ "TrimPrefix": true,
+ "TrimRight": true,
+ "TrimRightFunc": true,
+ "TrimSpace": true,
+ "TrimSuffix": true,
+ },
+ "compress/bzip2": map[string]bool{
+ "NewReader": true,
+ "StructuralError": true,
+ },
+ "compress/flate": map[string]bool{
+ "BestCompression": true,
+ "BestSpeed": true,
+ "CorruptInputError": true,
+ "DefaultCompression": true,
+ "HuffmanOnly": true,
+ "InternalError": true,
+ "NewReader": true,
+ "NewReaderDict": true,
+ "NewWriter": true,
+ "NewWriterDict": true,
+ "NoCompression": true,
+ "ReadError": true,
+ "Reader": true,
+ "Resetter": true,
+ "WriteError": true,
+ "Writer": true,
+ },
+ "compress/gzip": map[string]bool{
+ "BestCompression": true,
+ "BestSpeed": true,
+ "DefaultCompression": true,
+ "ErrChecksum": true,
+ "ErrHeader": true,
+ "Header": true,
+ "HuffmanOnly": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "NewWriterLevel": true,
+ "NoCompression": true,
+ "Reader": true,
+ "Writer": true,
+ },
+ "compress/lzw": map[string]bool{
+ "LSB": true,
+ "MSB": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "Order": true,
+ },
+ "compress/zlib": map[string]bool{
+ "BestCompression": true,
+ "BestSpeed": true,
+ "DefaultCompression": true,
+ "ErrChecksum": true,
+ "ErrDictionary": true,
+ "ErrHeader": true,
+ "HuffmanOnly": true,
+ "NewReader": true,
+ "NewReaderDict": true,
+ "NewWriter": true,
+ "NewWriterLevel": true,
+ "NewWriterLevelDict": true,
+ "NoCompression": true,
+ "Resetter": true,
+ "Writer": true,
+ },
+ "container/heap": map[string]bool{
+ "Fix": true,
+ "Init": true,
+ "Interface": true,
+ "Pop": true,
+ "Push": true,
+ "Remove": true,
+ },
+ "container/list": map[string]bool{
+ "Element": true,
+ "List": true,
+ "New": true,
+ },
+ "container/ring": map[string]bool{
+ "New": true,
+ "Ring": true,
+ },
+ "context": map[string]bool{
+ "Background": true,
+ "CancelFunc": true,
+ "Canceled": true,
+ "Context": true,
+ "DeadlineExceeded": true,
+ "TODO": true,
+ "WithCancel": true,
+ "WithDeadline": true,
+ "WithTimeout": true,
+ "WithValue": true,
+ },
+ "crypto": map[string]bool{
+ "BLAKE2b_256": true,
+ "BLAKE2b_384": true,
+ "BLAKE2b_512": true,
+ "BLAKE2s_256": true,
+ "Decrypter": true,
+ "DecrypterOpts": true,
+ "Hash": true,
+ "MD4": true,
+ "MD5": true,
+ "MD5SHA1": true,
+ "PrivateKey": true,
+ "PublicKey": true,
+ "RIPEMD160": true,
+ "RegisterHash": true,
+ "SHA1": true,
+ "SHA224": true,
+ "SHA256": true,
+ "SHA384": true,
+ "SHA3_224": true,
+ "SHA3_256": true,
+ "SHA3_384": true,
+ "SHA3_512": true,
+ "SHA512": true,
+ "SHA512_224": true,
+ "SHA512_256": true,
+ "Signer": true,
+ "SignerOpts": true,
+ },
+ "crypto/aes": map[string]bool{
+ "BlockSize": true,
+ "KeySizeError": true,
+ "NewCipher": true,
+ },
+ "crypto/cipher": map[string]bool{
+ "AEAD": true,
+ "Block": true,
+ "BlockMode": true,
+ "NewCBCDecrypter": true,
+ "NewCBCEncrypter": true,
+ "NewCFBDecrypter": true,
+ "NewCFBEncrypter": true,
+ "NewCTR": true,
+ "NewGCM": true,
+ "NewGCMWithNonceSize": true,
+ "NewGCMWithTagSize": true,
+ "NewOFB": true,
+ "Stream": true,
+ "StreamReader": true,
+ "StreamWriter": true,
+ },
+ "crypto/des": map[string]bool{
+ "BlockSize": true,
+ "KeySizeError": true,
+ "NewCipher": true,
+ "NewTripleDESCipher": true,
+ },
+ "crypto/dsa": map[string]bool{
+ "ErrInvalidPublicKey": true,
+ "GenerateKey": true,
+ "GenerateParameters": true,
+ "L1024N160": true,
+ "L2048N224": true,
+ "L2048N256": true,
+ "L3072N256": true,
+ "ParameterSizes": true,
+ "Parameters": true,
+ "PrivateKey": true,
+ "PublicKey": true,
+ "Sign": true,
+ "Verify": true,
+ },
+ "crypto/ecdsa": map[string]bool{
+ "GenerateKey": true,
+ "PrivateKey": true,
+ "PublicKey": true,
+ "Sign": true,
+ "Verify": true,
+ },
+ "crypto/elliptic": map[string]bool{
+ "Curve": true,
+ "CurveParams": true,
+ "GenerateKey": true,
+ "Marshal": true,
+ "P224": true,
+ "P256": true,
+ "P384": true,
+ "P521": true,
+ "Unmarshal": true,
+ },
+ "crypto/hmac": map[string]bool{
+ "Equal": true,
+ "New": true,
+ },
+ "crypto/md5": map[string]bool{
+ "BlockSize": true,
+ "New": true,
+ "Size": true,
+ "Sum": true,
+ },
+ "crypto/rand": map[string]bool{
+ "Int": true,
+ "Prime": true,
+ "Read": true,
+ "Reader": true,
+ },
+ "crypto/rc4": map[string]bool{
+ "Cipher": true,
+ "KeySizeError": true,
+ "NewCipher": true,
+ },
+ "crypto/rsa": map[string]bool{
+ "CRTValue": true,
+ "DecryptOAEP": true,
+ "DecryptPKCS1v15": true,
+ "DecryptPKCS1v15SessionKey": true,
+ "EncryptOAEP": true,
+ "EncryptPKCS1v15": true,
+ "ErrDecryption": true,
+ "ErrMessageTooLong": true,
+ "ErrVerification": true,
+ "GenerateKey": true,
+ "GenerateMultiPrimeKey": true,
+ "OAEPOptions": true,
+ "PKCS1v15DecryptOptions": true,
+ "PSSOptions": true,
+ "PSSSaltLengthAuto": true,
+ "PSSSaltLengthEqualsHash": true,
+ "PrecomputedValues": true,
+ "PrivateKey": true,
+ "PublicKey": true,
+ "SignPKCS1v15": true,
+ "SignPSS": true,
+ "VerifyPKCS1v15": true,
+ "VerifyPSS": true,
+ },
+ "crypto/sha1": map[string]bool{
+ "BlockSize": true,
+ "New": true,
+ "Size": true,
+ "Sum": true,
+ },
+ "crypto/sha256": map[string]bool{
+ "BlockSize": true,
+ "New": true,
+ "New224": true,
+ "Size": true,
+ "Size224": true,
+ "Sum224": true,
+ "Sum256": true,
+ },
+ "crypto/sha512": map[string]bool{
+ "BlockSize": true,
+ "New": true,
+ "New384": true,
+ "New512_224": true,
+ "New512_256": true,
+ "Size": true,
+ "Size224": true,
+ "Size256": true,
+ "Size384": true,
+ "Sum384": true,
+ "Sum512": true,
+ "Sum512_224": true,
+ "Sum512_256": true,
+ },
+ "crypto/subtle": map[string]bool{
+ "ConstantTimeByteEq": true,
+ "ConstantTimeCompare": true,
+ "ConstantTimeCopy": true,
+ "ConstantTimeEq": true,
+ "ConstantTimeLessOrEq": true,
+ "ConstantTimeSelect": true,
+ },
+ "crypto/tls": map[string]bool{
+ "Certificate": true,
+ "CertificateRequestInfo": true,
+ "Client": true,
+ "ClientAuthType": true,
+ "ClientHelloInfo": true,
+ "ClientSessionCache": true,
+ "ClientSessionState": true,
+ "Config": true,
+ "Conn": true,
+ "ConnectionState": true,
+ "CurveID": true,
+ "CurveP256": true,
+ "CurveP384": true,
+ "CurveP521": true,
+ "Dial": true,
+ "DialWithDialer": true,
+ "ECDSAWithP256AndSHA256": true,
+ "ECDSAWithP384AndSHA384": true,
+ "ECDSAWithP521AndSHA512": true,
+ "ECDSAWithSHA1": true,
+ "Listen": true,
+ "LoadX509KeyPair": true,
+ "NewLRUClientSessionCache": true,
+ "NewListener": true,
+ "NoClientCert": true,
+ "PKCS1WithSHA1": true,
+ "PKCS1WithSHA256": true,
+ "PKCS1WithSHA384": true,
+ "PKCS1WithSHA512": true,
+ "PSSWithSHA256": true,
+ "PSSWithSHA384": true,
+ "PSSWithSHA512": true,
+ "RecordHeaderError": true,
+ "RenegotiateFreelyAsClient": true,
+ "RenegotiateNever": true,
+ "RenegotiateOnceAsClient": true,
+ "RenegotiationSupport": true,
+ "RequestClientCert": true,
+ "RequireAndVerifyClientCert": true,
+ "RequireAnyClientCert": true,
+ "Server": true,
+ "SignatureScheme": true,
+ "TLS_AES_128_GCM_SHA256": true,
+ "TLS_AES_256_GCM_SHA384": true,
+ "TLS_CHACHA20_POLY1305_SHA256": true,
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": true,
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": true,
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": true,
+ "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": true,
+ "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": true,
+ "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305": true,
+ "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA": true,
+ "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA": true,
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": true,
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256": true,
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": true,
+ "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": true,
+ "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": true,
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305": true,
+ "TLS_ECDHE_RSA_WITH_RC4_128_SHA": true,
+ "TLS_FALLBACK_SCSV": true,
+ "TLS_RSA_WITH_3DES_EDE_CBC_SHA": true,
+ "TLS_RSA_WITH_AES_128_CBC_SHA": true,
+ "TLS_RSA_WITH_AES_128_CBC_SHA256": true,
+ "TLS_RSA_WITH_AES_128_GCM_SHA256": true,
+ "TLS_RSA_WITH_AES_256_CBC_SHA": true,
+ "TLS_RSA_WITH_AES_256_GCM_SHA384": true,
+ "TLS_RSA_WITH_RC4_128_SHA": true,
+ "VerifyClientCertIfGiven": true,
+ "VersionSSL30": true,
+ "VersionTLS10": true,
+ "VersionTLS11": true,
+ "VersionTLS12": true,
+ "VersionTLS13": true,
+ "X25519": true,
+ "X509KeyPair": true,
+ },
+ "crypto/x509": map[string]bool{
+ "CANotAuthorizedForExtKeyUsage": true,
+ "CANotAuthorizedForThisName": true,
+ "CertPool": true,
+ "Certificate": true,
+ "CertificateInvalidError": true,
+ "CertificateRequest": true,
+ "ConstraintViolationError": true,
+ "CreateCertificate": true,
+ "CreateCertificateRequest": true,
+ "DSA": true,
+ "DSAWithSHA1": true,
+ "DSAWithSHA256": true,
+ "DecryptPEMBlock": true,
+ "ECDSA": true,
+ "ECDSAWithSHA1": true,
+ "ECDSAWithSHA256": true,
+ "ECDSAWithSHA384": true,
+ "ECDSAWithSHA512": true,
+ "EncryptPEMBlock": true,
+ "ErrUnsupportedAlgorithm": true,
+ "Expired": true,
+ "ExtKeyUsage": true,
+ "ExtKeyUsageAny": true,
+ "ExtKeyUsageClientAuth": true,
+ "ExtKeyUsageCodeSigning": true,
+ "ExtKeyUsageEmailProtection": true,
+ "ExtKeyUsageIPSECEndSystem": true,
+ "ExtKeyUsageIPSECTunnel": true,
+ "ExtKeyUsageIPSECUser": true,
+ "ExtKeyUsageMicrosoftCommercialCodeSigning": true,
+ "ExtKeyUsageMicrosoftKernelCodeSigning": true,
+ "ExtKeyUsageMicrosoftServerGatedCrypto": true,
+ "ExtKeyUsageNetscapeServerGatedCrypto": true,
+ "ExtKeyUsageOCSPSigning": true,
+ "ExtKeyUsageServerAuth": true,
+ "ExtKeyUsageTimeStamping": true,
+ "HostnameError": true,
+ "IncompatibleUsage": true,
+ "IncorrectPasswordError": true,
+ "InsecureAlgorithmError": true,
+ "InvalidReason": true,
+ "IsEncryptedPEMBlock": true,
+ "KeyUsage": true,
+ "KeyUsageCRLSign": true,
+ "KeyUsageCertSign": true,
+ "KeyUsageContentCommitment": true,
+ "KeyUsageDataEncipherment": true,
+ "KeyUsageDecipherOnly": true,
+ "KeyUsageDigitalSignature": true,
+ "KeyUsageEncipherOnly": true,
+ "KeyUsageKeyAgreement": true,
+ "KeyUsageKeyEncipherment": true,
+ "MD2WithRSA": true,
+ "MD5WithRSA": true,
+ "MarshalECPrivateKey": true,
+ "MarshalPKCS1PrivateKey": true,
+ "MarshalPKCS1PublicKey": true,
+ "MarshalPKCS8PrivateKey": true,
+ "MarshalPKIXPublicKey": true,
+ "NameConstraintsWithoutSANs": true,
+ "NameMismatch": true,
+ "NewCertPool": true,
+ "NotAuthorizedToSign": true,
+ "PEMCipher": true,
+ "PEMCipher3DES": true,
+ "PEMCipherAES128": true,
+ "PEMCipherAES192": true,
+ "PEMCipherAES256": true,
+ "PEMCipherDES": true,
+ "ParseCRL": true,
+ "ParseCertificate": true,
+ "ParseCertificateRequest": true,
+ "ParseCertificates": true,
+ "ParseDERCRL": true,
+ "ParseECPrivateKey": true,
+ "ParsePKCS1PrivateKey": true,
+ "ParsePKCS1PublicKey": true,
+ "ParsePKCS8PrivateKey": true,
+ "ParsePKIXPublicKey": true,
+ "PublicKeyAlgorithm": true,
+ "RSA": true,
+ "SHA1WithRSA": true,
+ "SHA256WithRSA": true,
+ "SHA256WithRSAPSS": true,
+ "SHA384WithRSA": true,
+ "SHA384WithRSAPSS": true,
+ "SHA512WithRSA": true,
+ "SHA512WithRSAPSS": true,
+ "SignatureAlgorithm": true,
+ "SystemCertPool": true,
+ "SystemRootsError": true,
+ "TooManyConstraints": true,
+ "TooManyIntermediates": true,
+ "UnconstrainedName": true,
+ "UnhandledCriticalExtension": true,
+ "UnknownAuthorityError": true,
+ "UnknownPublicKeyAlgorithm": true,
+ "UnknownSignatureAlgorithm": true,
+ "VerifyOptions": true,
+ },
+ "crypto/x509/pkix": map[string]bool{
+ "AlgorithmIdentifier": true,
+ "AttributeTypeAndValue": true,
+ "AttributeTypeAndValueSET": true,
+ "CertificateList": true,
+ "Extension": true,
+ "Name": true,
+ "RDNSequence": true,
+ "RelativeDistinguishedNameSET": true,
+ "RevokedCertificate": true,
+ "TBSCertificateList": true,
+ },
+ "database/sql": map[string]bool{
+ "ColumnType": true,
+ "Conn": true,
+ "DB": true,
+ "DBStats": true,
+ "Drivers": true,
+ "ErrConnDone": true,
+ "ErrNoRows": true,
+ "ErrTxDone": true,
+ "IsolationLevel": true,
+ "LevelDefault": true,
+ "LevelLinearizable": true,
+ "LevelReadCommitted": true,
+ "LevelReadUncommitted": true,
+ "LevelRepeatableRead": true,
+ "LevelSerializable": true,
+ "LevelSnapshot": true,
+ "LevelWriteCommitted": true,
+ "Named": true,
+ "NamedArg": true,
+ "NullBool": true,
+ "NullFloat64": true,
+ "NullInt64": true,
+ "NullString": true,
+ "Open": true,
+ "OpenDB": true,
+ "Out": true,
+ "RawBytes": true,
+ "Register": true,
+ "Result": true,
+ "Row": true,
+ "Rows": true,
+ "Scanner": true,
+ "Stmt": true,
+ "Tx": true,
+ "TxOptions": true,
+ },
+ "database/sql/driver": map[string]bool{
+ "Bool": true,
+ "ColumnConverter": true,
+ "Conn": true,
+ "ConnBeginTx": true,
+ "ConnPrepareContext": true,
+ "Connector": true,
+ "DefaultParameterConverter": true,
+ "Driver": true,
+ "DriverContext": true,
+ "ErrBadConn": true,
+ "ErrRemoveArgument": true,
+ "ErrSkip": true,
+ "Execer": true,
+ "ExecerContext": true,
+ "Int32": true,
+ "IsScanValue": true,
+ "IsValue": true,
+ "IsolationLevel": true,
+ "NamedValue": true,
+ "NamedValueChecker": true,
+ "NotNull": true,
+ "Null": true,
+ "Pinger": true,
+ "Queryer": true,
+ "QueryerContext": true,
+ "Result": true,
+ "ResultNoRows": true,
+ "Rows": true,
+ "RowsAffected": true,
+ "RowsColumnTypeDatabaseTypeName": true,
+ "RowsColumnTypeLength": true,
+ "RowsColumnTypeNullable": true,
+ "RowsColumnTypePrecisionScale": true,
+ "RowsColumnTypeScanType": true,
+ "RowsNextResultSet": true,
+ "SessionResetter": true,
+ "Stmt": true,
+ "StmtExecContext": true,
+ "StmtQueryContext": true,
+ "String": true,
+ "Tx": true,
+ "TxOptions": true,
+ "Value": true,
+ "ValueConverter": true,
+ "Valuer": true,
+ },
+ "debug/dwarf": map[string]bool{
+ "AddrType": true,
+ "ArrayType": true,
+ "Attr": true,
+ "AttrAbstractOrigin": true,
+ "AttrAccessibility": true,
+ "AttrAddrClass": true,
+ "AttrAllocated": true,
+ "AttrArtificial": true,
+ "AttrAssociated": true,
+ "AttrBaseTypes": true,
+ "AttrBitOffset": true,
+ "AttrBitSize": true,
+ "AttrByteSize": true,
+ "AttrCallColumn": true,
+ "AttrCallFile": true,
+ "AttrCallLine": true,
+ "AttrCalling": true,
+ "AttrCommonRef": true,
+ "AttrCompDir": true,
+ "AttrConstValue": true,
+ "AttrContainingType": true,
+ "AttrCount": true,
+ "AttrDataLocation": true,
+ "AttrDataMemberLoc": true,
+ "AttrDeclColumn": true,
+ "AttrDeclFile": true,
+ "AttrDeclLine": true,
+ "AttrDeclaration": true,
+ "AttrDefaultValue": true,
+ "AttrDescription": true,
+ "AttrDiscr": true,
+ "AttrDiscrList": true,
+ "AttrDiscrValue": true,
+ "AttrEncoding": true,
+ "AttrEntrypc": true,
+ "AttrExtension": true,
+ "AttrExternal": true,
+ "AttrFrameBase": true,
+ "AttrFriend": true,
+ "AttrHighpc": true,
+ "AttrIdentifierCase": true,
+ "AttrImport": true,
+ "AttrInline": true,
+ "AttrIsOptional": true,
+ "AttrLanguage": true,
+ "AttrLocation": true,
+ "AttrLowerBound": true,
+ "AttrLowpc": true,
+ "AttrMacroInfo": true,
+ "AttrName": true,
+ "AttrNamelistItem": true,
+ "AttrOrdering": true,
+ "AttrPriority": true,
+ "AttrProducer": true,
+ "AttrPrototyped": true,
+ "AttrRanges": true,
+ "AttrReturnAddr": true,
+ "AttrSegment": true,
+ "AttrSibling": true,
+ "AttrSpecification": true,
+ "AttrStartScope": true,
+ "AttrStaticLink": true,
+ "AttrStmtList": true,
+ "AttrStride": true,
+ "AttrStrideSize": true,
+ "AttrStringLength": true,
+ "AttrTrampoline": true,
+ "AttrType": true,
+ "AttrUpperBound": true,
+ "AttrUseLocation": true,
+ "AttrUseUTF8": true,
+ "AttrVarParam": true,
+ "AttrVirtuality": true,
+ "AttrVisibility": true,
+ "AttrVtableElemLoc": true,
+ "BasicType": true,
+ "BoolType": true,
+ "CharType": true,
+ "Class": true,
+ "ClassAddress": true,
+ "ClassBlock": true,
+ "ClassConstant": true,
+ "ClassExprLoc": true,
+ "ClassFlag": true,
+ "ClassLinePtr": true,
+ "ClassLocListPtr": true,
+ "ClassMacPtr": true,
+ "ClassRangeListPtr": true,
+ "ClassReference": true,
+ "ClassReferenceAlt": true,
+ "ClassReferenceSig": true,
+ "ClassString": true,
+ "ClassStringAlt": true,
+ "ClassUnknown": true,
+ "CommonType": true,
+ "ComplexType": true,
+ "Data": true,
+ "DecodeError": true,
+ "DotDotDotType": true,
+ "Entry": true,
+ "EnumType": true,
+ "EnumValue": true,
+ "ErrUnknownPC": true,
+ "Field": true,
+ "FloatType": true,
+ "FuncType": true,
+ "IntType": true,
+ "LineEntry": true,
+ "LineFile": true,
+ "LineReader": true,
+ "LineReaderPos": true,
+ "New": true,
+ "Offset": true,
+ "PtrType": true,
+ "QualType": true,
+ "Reader": true,
+ "StructField": true,
+ "StructType": true,
+ "Tag": true,
+ "TagAccessDeclaration": true,
+ "TagArrayType": true,
+ "TagBaseType": true,
+ "TagCatchDwarfBlock": true,
+ "TagClassType": true,
+ "TagCommonDwarfBlock": true,
+ "TagCommonInclusion": true,
+ "TagCompileUnit": true,
+ "TagCondition": true,
+ "TagConstType": true,
+ "TagConstant": true,
+ "TagDwarfProcedure": true,
+ "TagEntryPoint": true,
+ "TagEnumerationType": true,
+ "TagEnumerator": true,
+ "TagFileType": true,
+ "TagFormalParameter": true,
+ "TagFriend": true,
+ "TagImportedDeclaration": true,
+ "TagImportedModule": true,
+ "TagImportedUnit": true,
+ "TagInheritance": true,
+ "TagInlinedSubroutine": true,
+ "TagInterfaceType": true,
+ "TagLabel": true,
+ "TagLexDwarfBlock": true,
+ "TagMember": true,
+ "TagModule": true,
+ "TagMutableType": true,
+ "TagNamelist": true,
+ "TagNamelistItem": true,
+ "TagNamespace": true,
+ "TagPackedType": true,
+ "TagPartialUnit": true,
+ "TagPointerType": true,
+ "TagPtrToMemberType": true,
+ "TagReferenceType": true,
+ "TagRestrictType": true,
+ "TagRvalueReferenceType": true,
+ "TagSetType": true,
+ "TagSharedType": true,
+ "TagStringType": true,
+ "TagStructType": true,
+ "TagSubprogram": true,
+ "TagSubrangeType": true,
+ "TagSubroutineType": true,
+ "TagTemplateAlias": true,
+ "TagTemplateTypeParameter": true,
+ "TagTemplateValueParameter": true,
+ "TagThrownType": true,
+ "TagTryDwarfBlock": true,
+ "TagTypeUnit": true,
+ "TagTypedef": true,
+ "TagUnionType": true,
+ "TagUnspecifiedParameters": true,
+ "TagUnspecifiedType": true,
+ "TagVariable": true,
+ "TagVariant": true,
+ "TagVariantPart": true,
+ "TagVolatileType": true,
+ "TagWithStmt": true,
+ "Type": true,
+ "TypedefType": true,
+ "UcharType": true,
+ "UintType": true,
+ "UnspecifiedType": true,
+ "VoidType": true,
+ },
+ "debug/elf": map[string]bool{
+ "ARM_MAGIC_TRAMP_NUMBER": true,
+ "COMPRESS_HIOS": true,
+ "COMPRESS_HIPROC": true,
+ "COMPRESS_LOOS": true,
+ "COMPRESS_LOPROC": true,
+ "COMPRESS_ZLIB": true,
+ "Chdr32": true,
+ "Chdr64": true,
+ "Class": true,
+ "CompressionType": true,
+ "DF_BIND_NOW": true,
+ "DF_ORIGIN": true,
+ "DF_STATIC_TLS": true,
+ "DF_SYMBOLIC": true,
+ "DF_TEXTREL": true,
+ "DT_BIND_NOW": true,
+ "DT_DEBUG": true,
+ "DT_ENCODING": true,
+ "DT_FINI": true,
+ "DT_FINI_ARRAY": true,
+ "DT_FINI_ARRAYSZ": true,
+ "DT_FLAGS": true,
+ "DT_HASH": true,
+ "DT_HIOS": true,
+ "DT_HIPROC": true,
+ "DT_INIT": true,
+ "DT_INIT_ARRAY": true,
+ "DT_INIT_ARRAYSZ": true,
+ "DT_JMPREL": true,
+ "DT_LOOS": true,
+ "DT_LOPROC": true,
+ "DT_NEEDED": true,
+ "DT_NULL": true,
+ "DT_PLTGOT": true,
+ "DT_PLTREL": true,
+ "DT_PLTRELSZ": true,
+ "DT_PREINIT_ARRAY": true,
+ "DT_PREINIT_ARRAYSZ": true,
+ "DT_REL": true,
+ "DT_RELA": true,
+ "DT_RELAENT": true,
+ "DT_RELASZ": true,
+ "DT_RELENT": true,
+ "DT_RELSZ": true,
+ "DT_RPATH": true,
+ "DT_RUNPATH": true,
+ "DT_SONAME": true,
+ "DT_STRSZ": true,
+ "DT_STRTAB": true,
+ "DT_SYMBOLIC": true,
+ "DT_SYMENT": true,
+ "DT_SYMTAB": true,
+ "DT_TEXTREL": true,
+ "DT_VERNEED": true,
+ "DT_VERNEEDNUM": true,
+ "DT_VERSYM": true,
+ "Data": true,
+ "Dyn32": true,
+ "Dyn64": true,
+ "DynFlag": true,
+ "DynTag": true,
+ "EI_ABIVERSION": true,
+ "EI_CLASS": true,
+ "EI_DATA": true,
+ "EI_NIDENT": true,
+ "EI_OSABI": true,
+ "EI_PAD": true,
+ "EI_VERSION": true,
+ "ELFCLASS32": true,
+ "ELFCLASS64": true,
+ "ELFCLASSNONE": true,
+ "ELFDATA2LSB": true,
+ "ELFDATA2MSB": true,
+ "ELFDATANONE": true,
+ "ELFMAG": true,
+ "ELFOSABI_86OPEN": true,
+ "ELFOSABI_AIX": true,
+ "ELFOSABI_ARM": true,
+ "ELFOSABI_AROS": true,
+ "ELFOSABI_CLOUDABI": true,
+ "ELFOSABI_FENIXOS": true,
+ "ELFOSABI_FREEBSD": true,
+ "ELFOSABI_HPUX": true,
+ "ELFOSABI_HURD": true,
+ "ELFOSABI_IRIX": true,
+ "ELFOSABI_LINUX": true,
+ "ELFOSABI_MODESTO": true,
+ "ELFOSABI_NETBSD": true,
+ "ELFOSABI_NONE": true,
+ "ELFOSABI_NSK": true,
+ "ELFOSABI_OPENBSD": true,
+ "ELFOSABI_OPENVMS": true,
+ "ELFOSABI_SOLARIS": true,
+ "ELFOSABI_STANDALONE": true,
+ "ELFOSABI_TRU64": true,
+ "EM_386": true,
+ "EM_486": true,
+ "EM_56800EX": true,
+ "EM_68HC05": true,
+ "EM_68HC08": true,
+ "EM_68HC11": true,
+ "EM_68HC12": true,
+ "EM_68HC16": true,
+ "EM_68K": true,
+ "EM_78KOR": true,
+ "EM_8051": true,
+ "EM_860": true,
+ "EM_88K": true,
+ "EM_960": true,
+ "EM_AARCH64": true,
+ "EM_ALPHA": true,
+ "EM_ALPHA_STD": true,
+ "EM_ALTERA_NIOS2": true,
+ "EM_AMDGPU": true,
+ "EM_ARC": true,
+ "EM_ARCA": true,
+ "EM_ARC_COMPACT": true,
+ "EM_ARC_COMPACT2": true,
+ "EM_ARM": true,
+ "EM_AVR": true,
+ "EM_AVR32": true,
+ "EM_BA1": true,
+ "EM_BA2": true,
+ "EM_BLACKFIN": true,
+ "EM_BPF": true,
+ "EM_C166": true,
+ "EM_CDP": true,
+ "EM_CE": true,
+ "EM_CLOUDSHIELD": true,
+ "EM_COGE": true,
+ "EM_COLDFIRE": true,
+ "EM_COOL": true,
+ "EM_COREA_1ST": true,
+ "EM_COREA_2ND": true,
+ "EM_CR": true,
+ "EM_CR16": true,
+ "EM_CRAYNV2": true,
+ "EM_CRIS": true,
+ "EM_CRX": true,
+ "EM_CSR_KALIMBA": true,
+ "EM_CUDA": true,
+ "EM_CYPRESS_M8C": true,
+ "EM_D10V": true,
+ "EM_D30V": true,
+ "EM_DSP24": true,
+ "EM_DSPIC30F": true,
+ "EM_DXP": true,
+ "EM_ECOG1": true,
+ "EM_ECOG16": true,
+ "EM_ECOG1X": true,
+ "EM_ECOG2": true,
+ "EM_ETPU": true,
+ "EM_EXCESS": true,
+ "EM_F2MC16": true,
+ "EM_FIREPATH": true,
+ "EM_FR20": true,
+ "EM_FR30": true,
+ "EM_FT32": true,
+ "EM_FX66": true,
+ "EM_H8S": true,
+ "EM_H8_300": true,
+ "EM_H8_300H": true,
+ "EM_H8_500": true,
+ "EM_HUANY": true,
+ "EM_IA_64": true,
+ "EM_INTEL205": true,
+ "EM_INTEL206": true,
+ "EM_INTEL207": true,
+ "EM_INTEL208": true,
+ "EM_INTEL209": true,
+ "EM_IP2K": true,
+ "EM_JAVELIN": true,
+ "EM_K10M": true,
+ "EM_KM32": true,
+ "EM_KMX16": true,
+ "EM_KMX32": true,
+ "EM_KMX8": true,
+ "EM_KVARC": true,
+ "EM_L10M": true,
+ "EM_LANAI": true,
+ "EM_LATTICEMICO32": true,
+ "EM_M16C": true,
+ "EM_M32": true,
+ "EM_M32C": true,
+ "EM_M32R": true,
+ "EM_MANIK": true,
+ "EM_MAX": true,
+ "EM_MAXQ30": true,
+ "EM_MCHP_PIC": true,
+ "EM_MCST_ELBRUS": true,
+ "EM_ME16": true,
+ "EM_METAG": true,
+ "EM_MICROBLAZE": true,
+ "EM_MIPS": true,
+ "EM_MIPS_RS3_LE": true,
+ "EM_MIPS_RS4_BE": true,
+ "EM_MIPS_X": true,
+ "EM_MMA": true,
+ "EM_MMDSP_PLUS": true,
+ "EM_MMIX": true,
+ "EM_MN10200": true,
+ "EM_MN10300": true,
+ "EM_MOXIE": true,
+ "EM_MSP430": true,
+ "EM_NCPU": true,
+ "EM_NDR1": true,
+ "EM_NDS32": true,
+ "EM_NONE": true,
+ "EM_NORC": true,
+ "EM_NS32K": true,
+ "EM_OPEN8": true,
+ "EM_OPENRISC": true,
+ "EM_PARISC": true,
+ "EM_PCP": true,
+ "EM_PDP10": true,
+ "EM_PDP11": true,
+ "EM_PDSP": true,
+ "EM_PJ": true,
+ "EM_PPC": true,
+ "EM_PPC64": true,
+ "EM_PRISM": true,
+ "EM_QDSP6": true,
+ "EM_R32C": true,
+ "EM_RCE": true,
+ "EM_RH32": true,
+ "EM_RISCV": true,
+ "EM_RL78": true,
+ "EM_RS08": true,
+ "EM_RX": true,
+ "EM_S370": true,
+ "EM_S390": true,
+ "EM_SCORE7": true,
+ "EM_SEP": true,
+ "EM_SE_C17": true,
+ "EM_SE_C33": true,
+ "EM_SH": true,
+ "EM_SHARC": true,
+ "EM_SLE9X": true,
+ "EM_SNP1K": true,
+ "EM_SPARC": true,
+ "EM_SPARC32PLUS": true,
+ "EM_SPARCV9": true,
+ "EM_ST100": true,
+ "EM_ST19": true,
+ "EM_ST200": true,
+ "EM_ST7": true,
+ "EM_ST9PLUS": true,
+ "EM_STARCORE": true,
+ "EM_STM8": true,
+ "EM_STXP7X": true,
+ "EM_SVX": true,
+ "EM_TILE64": true,
+ "EM_TILEGX": true,
+ "EM_TILEPRO": true,
+ "EM_TINYJ": true,
+ "EM_TI_ARP32": true,
+ "EM_TI_C2000": true,
+ "EM_TI_C5500": true,
+ "EM_TI_C6000": true,
+ "EM_TI_PRU": true,
+ "EM_TMM_GPP": true,
+ "EM_TPC": true,
+ "EM_TRICORE": true,
+ "EM_TRIMEDIA": true,
+ "EM_TSK3000": true,
+ "EM_UNICORE": true,
+ "EM_V800": true,
+ "EM_V850": true,
+ "EM_VAX": true,
+ "EM_VIDEOCORE": true,
+ "EM_VIDEOCORE3": true,
+ "EM_VIDEOCORE5": true,
+ "EM_VISIUM": true,
+ "EM_VPP500": true,
+ "EM_X86_64": true,
+ "EM_XCORE": true,
+ "EM_XGATE": true,
+ "EM_XIMO16": true,
+ "EM_XTENSA": true,
+ "EM_Z80": true,
+ "EM_ZSP": true,
+ "ET_CORE": true,
+ "ET_DYN": true,
+ "ET_EXEC": true,
+ "ET_HIOS": true,
+ "ET_HIPROC": true,
+ "ET_LOOS": true,
+ "ET_LOPROC": true,
+ "ET_NONE": true,
+ "ET_REL": true,
+ "EV_CURRENT": true,
+ "EV_NONE": true,
+ "ErrNoSymbols": true,
+ "File": true,
+ "FileHeader": true,
+ "FormatError": true,
+ "Header32": true,
+ "Header64": true,
+ "ImportedSymbol": true,
+ "Machine": true,
+ "NT_FPREGSET": true,
+ "NT_PRPSINFO": true,
+ "NT_PRSTATUS": true,
+ "NType": true,
+ "NewFile": true,
+ "OSABI": true,
+ "Open": true,
+ "PF_MASKOS": true,
+ "PF_MASKPROC": true,
+ "PF_R": true,
+ "PF_W": true,
+ "PF_X": true,
+ "PT_DYNAMIC": true,
+ "PT_HIOS": true,
+ "PT_HIPROC": true,
+ "PT_INTERP": true,
+ "PT_LOAD": true,
+ "PT_LOOS": true,
+ "PT_LOPROC": true,
+ "PT_NOTE": true,
+ "PT_NULL": true,
+ "PT_PHDR": true,
+ "PT_SHLIB": true,
+ "PT_TLS": true,
+ "Prog": true,
+ "Prog32": true,
+ "Prog64": true,
+ "ProgFlag": true,
+ "ProgHeader": true,
+ "ProgType": true,
+ "R_386": true,
+ "R_386_16": true,
+ "R_386_32": true,
+ "R_386_32PLT": true,
+ "R_386_8": true,
+ "R_386_COPY": true,
+ "R_386_GLOB_DAT": true,
+ "R_386_GOT32": true,
+ "R_386_GOT32X": true,
+ "R_386_GOTOFF": true,
+ "R_386_GOTPC": true,
+ "R_386_IRELATIVE": true,
+ "R_386_JMP_SLOT": true,
+ "R_386_NONE": true,
+ "R_386_PC16": true,
+ "R_386_PC32": true,
+ "R_386_PC8": true,
+ "R_386_PLT32": true,
+ "R_386_RELATIVE": true,
+ "R_386_SIZE32": true,
+ "R_386_TLS_DESC": true,
+ "R_386_TLS_DESC_CALL": true,
+ "R_386_TLS_DTPMOD32": true,
+ "R_386_TLS_DTPOFF32": true,
+ "R_386_TLS_GD": true,
+ "R_386_TLS_GD_32": true,
+ "R_386_TLS_GD_CALL": true,
+ "R_386_TLS_GD_POP": true,
+ "R_386_TLS_GD_PUSH": true,
+ "R_386_TLS_GOTDESC": true,
+ "R_386_TLS_GOTIE": true,
+ "R_386_TLS_IE": true,
+ "R_386_TLS_IE_32": true,
+ "R_386_TLS_LDM": true,
+ "R_386_TLS_LDM_32": true,
+ "R_386_TLS_LDM_CALL": true,
+ "R_386_TLS_LDM_POP": true,
+ "R_386_TLS_LDM_PUSH": true,
+ "R_386_TLS_LDO_32": true,
+ "R_386_TLS_LE": true,
+ "R_386_TLS_LE_32": true,
+ "R_386_TLS_TPOFF": true,
+ "R_386_TLS_TPOFF32": true,
+ "R_390": true,
+ "R_390_12": true,
+ "R_390_16": true,
+ "R_390_20": true,
+ "R_390_32": true,
+ "R_390_64": true,
+ "R_390_8": true,
+ "R_390_COPY": true,
+ "R_390_GLOB_DAT": true,
+ "R_390_GOT12": true,
+ "R_390_GOT16": true,
+ "R_390_GOT20": true,
+ "R_390_GOT32": true,
+ "R_390_GOT64": true,
+ "R_390_GOTENT": true,
+ "R_390_GOTOFF": true,
+ "R_390_GOTOFF16": true,
+ "R_390_GOTOFF64": true,
+ "R_390_GOTPC": true,
+ "R_390_GOTPCDBL": true,
+ "R_390_GOTPLT12": true,
+ "R_390_GOTPLT16": true,
+ "R_390_GOTPLT20": true,
+ "R_390_GOTPLT32": true,
+ "R_390_GOTPLT64": true,
+ "R_390_GOTPLTENT": true,
+ "R_390_GOTPLTOFF16": true,
+ "R_390_GOTPLTOFF32": true,
+ "R_390_GOTPLTOFF64": true,
+ "R_390_JMP_SLOT": true,
+ "R_390_NONE": true,
+ "R_390_PC16": true,
+ "R_390_PC16DBL": true,
+ "R_390_PC32": true,
+ "R_390_PC32DBL": true,
+ "R_390_PC64": true,
+ "R_390_PLT16DBL": true,
+ "R_390_PLT32": true,
+ "R_390_PLT32DBL": true,
+ "R_390_PLT64": true,
+ "R_390_RELATIVE": true,
+ "R_390_TLS_DTPMOD": true,
+ "R_390_TLS_DTPOFF": true,
+ "R_390_TLS_GD32": true,
+ "R_390_TLS_GD64": true,
+ "R_390_TLS_GDCALL": true,
+ "R_390_TLS_GOTIE12": true,
+ "R_390_TLS_GOTIE20": true,
+ "R_390_TLS_GOTIE32": true,
+ "R_390_TLS_GOTIE64": true,
+ "R_390_TLS_IE32": true,
+ "R_390_TLS_IE64": true,
+ "R_390_TLS_IEENT": true,
+ "R_390_TLS_LDCALL": true,
+ "R_390_TLS_LDM32": true,
+ "R_390_TLS_LDM64": true,
+ "R_390_TLS_LDO32": true,
+ "R_390_TLS_LDO64": true,
+ "R_390_TLS_LE32": true,
+ "R_390_TLS_LE64": true,
+ "R_390_TLS_LOAD": true,
+ "R_390_TLS_TPOFF": true,
+ "R_AARCH64": true,
+ "R_AARCH64_ABS16": true,
+ "R_AARCH64_ABS32": true,
+ "R_AARCH64_ABS64": true,
+ "R_AARCH64_ADD_ABS_LO12_NC": true,
+ "R_AARCH64_ADR_GOT_PAGE": true,
+ "R_AARCH64_ADR_PREL_LO21": true,
+ "R_AARCH64_ADR_PREL_PG_HI21": true,
+ "R_AARCH64_ADR_PREL_PG_HI21_NC": true,
+ "R_AARCH64_CALL26": true,
+ "R_AARCH64_CONDBR19": true,
+ "R_AARCH64_COPY": true,
+ "R_AARCH64_GLOB_DAT": true,
+ "R_AARCH64_GOT_LD_PREL19": true,
+ "R_AARCH64_IRELATIVE": true,
+ "R_AARCH64_JUMP26": true,
+ "R_AARCH64_JUMP_SLOT": true,
+ "R_AARCH64_LD64_GOTOFF_LO15": true,
+ "R_AARCH64_LD64_GOTPAGE_LO15": true,
+ "R_AARCH64_LD64_GOT_LO12_NC": true,
+ "R_AARCH64_LDST128_ABS_LO12_NC": true,
+ "R_AARCH64_LDST16_ABS_LO12_NC": true,
+ "R_AARCH64_LDST32_ABS_LO12_NC": true,
+ "R_AARCH64_LDST64_ABS_LO12_NC": true,
+ "R_AARCH64_LDST8_ABS_LO12_NC": true,
+ "R_AARCH64_LD_PREL_LO19": true,
+ "R_AARCH64_MOVW_SABS_G0": true,
+ "R_AARCH64_MOVW_SABS_G1": true,
+ "R_AARCH64_MOVW_SABS_G2": true,
+ "R_AARCH64_MOVW_UABS_G0": true,
+ "R_AARCH64_MOVW_UABS_G0_NC": true,
+ "R_AARCH64_MOVW_UABS_G1": true,
+ "R_AARCH64_MOVW_UABS_G1_NC": true,
+ "R_AARCH64_MOVW_UABS_G2": true,
+ "R_AARCH64_MOVW_UABS_G2_NC": true,
+ "R_AARCH64_MOVW_UABS_G3": true,
+ "R_AARCH64_NONE": true,
+ "R_AARCH64_NULL": true,
+ "R_AARCH64_P32_ABS16": true,
+ "R_AARCH64_P32_ABS32": true,
+ "R_AARCH64_P32_ADD_ABS_LO12_NC": true,
+ "R_AARCH64_P32_ADR_GOT_PAGE": true,
+ "R_AARCH64_P32_ADR_PREL_LO21": true,
+ "R_AARCH64_P32_ADR_PREL_PG_HI21": true,
+ "R_AARCH64_P32_CALL26": true,
+ "R_AARCH64_P32_CONDBR19": true,
+ "R_AARCH64_P32_COPY": true,
+ "R_AARCH64_P32_GLOB_DAT": true,
+ "R_AARCH64_P32_GOT_LD_PREL19": true,
+ "R_AARCH64_P32_IRELATIVE": true,
+ "R_AARCH64_P32_JUMP26": true,
+ "R_AARCH64_P32_JUMP_SLOT": true,
+ "R_AARCH64_P32_LD32_GOT_LO12_NC": true,
+ "R_AARCH64_P32_LDST128_ABS_LO12_NC": true,
+ "R_AARCH64_P32_LDST16_ABS_LO12_NC": true,
+ "R_AARCH64_P32_LDST32_ABS_LO12_NC": true,
+ "R_AARCH64_P32_LDST64_ABS_LO12_NC": true,
+ "R_AARCH64_P32_LDST8_ABS_LO12_NC": true,
+ "R_AARCH64_P32_LD_PREL_LO19": true,
+ "R_AARCH64_P32_MOVW_SABS_G0": true,
+ "R_AARCH64_P32_MOVW_UABS_G0": true,
+ "R_AARCH64_P32_MOVW_UABS_G0_NC": true,
+ "R_AARCH64_P32_MOVW_UABS_G1": true,
+ "R_AARCH64_P32_PREL16": true,
+ "R_AARCH64_P32_PREL32": true,
+ "R_AARCH64_P32_RELATIVE": true,
+ "R_AARCH64_P32_TLSDESC": true,
+ "R_AARCH64_P32_TLSDESC_ADD_LO12_NC": true,
+ "R_AARCH64_P32_TLSDESC_ADR_PAGE21": true,
+ "R_AARCH64_P32_TLSDESC_ADR_PREL21": true,
+ "R_AARCH64_P32_TLSDESC_CALL": true,
+ "R_AARCH64_P32_TLSDESC_LD32_LO12_NC": true,
+ "R_AARCH64_P32_TLSDESC_LD_PREL19": true,
+ "R_AARCH64_P32_TLSGD_ADD_LO12_NC": true,
+ "R_AARCH64_P32_TLSGD_ADR_PAGE21": true,
+ "R_AARCH64_P32_TLSIE_ADR_GOTTPREL_PAGE21": true,
+ "R_AARCH64_P32_TLSIE_LD32_GOTTPREL_LO12_NC": true,
+ "R_AARCH64_P32_TLSIE_LD_GOTTPREL_PREL19": true,
+ "R_AARCH64_P32_TLSLE_ADD_TPREL_HI12": true,
+ "R_AARCH64_P32_TLSLE_ADD_TPREL_LO12": true,
+ "R_AARCH64_P32_TLSLE_ADD_TPREL_LO12_NC": true,
+ "R_AARCH64_P32_TLSLE_MOVW_TPREL_G0": true,
+ "R_AARCH64_P32_TLSLE_MOVW_TPREL_G0_NC": true,
+ "R_AARCH64_P32_TLSLE_MOVW_TPREL_G1": true,
+ "R_AARCH64_P32_TLS_DTPMOD": true,
+ "R_AARCH64_P32_TLS_DTPREL": true,
+ "R_AARCH64_P32_TLS_TPREL": true,
+ "R_AARCH64_P32_TSTBR14": true,
+ "R_AARCH64_PREL16": true,
+ "R_AARCH64_PREL32": true,
+ "R_AARCH64_PREL64": true,
+ "R_AARCH64_RELATIVE": true,
+ "R_AARCH64_TLSDESC": true,
+ "R_AARCH64_TLSDESC_ADD": true,
+ "R_AARCH64_TLSDESC_ADD_LO12_NC": true,
+ "R_AARCH64_TLSDESC_ADR_PAGE21": true,
+ "R_AARCH64_TLSDESC_ADR_PREL21": true,
+ "R_AARCH64_TLSDESC_CALL": true,
+ "R_AARCH64_TLSDESC_LD64_LO12_NC": true,
+ "R_AARCH64_TLSDESC_LDR": true,
+ "R_AARCH64_TLSDESC_LD_PREL19": true,
+ "R_AARCH64_TLSDESC_OFF_G0_NC": true,
+ "R_AARCH64_TLSDESC_OFF_G1": true,
+ "R_AARCH64_TLSGD_ADD_LO12_NC": true,
+ "R_AARCH64_TLSGD_ADR_PAGE21": true,
+ "R_AARCH64_TLSGD_ADR_PREL21": true,
+ "R_AARCH64_TLSGD_MOVW_G0_NC": true,
+ "R_AARCH64_TLSGD_MOVW_G1": true,
+ "R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21": true,
+ "R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC": true,
+ "R_AARCH64_TLSIE_LD_GOTTPREL_PREL19": true,
+ "R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC": true,
+ "R_AARCH64_TLSIE_MOVW_GOTTPREL_G1": true,
+ "R_AARCH64_TLSLD_ADR_PAGE21": true,
+ "R_AARCH64_TLSLD_ADR_PREL21": true,
+ "R_AARCH64_TLSLD_LDST128_DTPREL_LO12": true,
+ "R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC": true,
+ "R_AARCH64_TLSLE_ADD_TPREL_HI12": true,
+ "R_AARCH64_TLSLE_ADD_TPREL_LO12": true,
+ "R_AARCH64_TLSLE_ADD_TPREL_LO12_NC": true,
+ "R_AARCH64_TLSLE_LDST128_TPREL_LO12": true,
+ "R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC": true,
+ "R_AARCH64_TLSLE_MOVW_TPREL_G0": true,
+ "R_AARCH64_TLSLE_MOVW_TPREL_G0_NC": true,
+ "R_AARCH64_TLSLE_MOVW_TPREL_G1": true,
+ "R_AARCH64_TLSLE_MOVW_TPREL_G1_NC": true,
+ "R_AARCH64_TLSLE_MOVW_TPREL_G2": true,
+ "R_AARCH64_TLS_DTPMOD64": true,
+ "R_AARCH64_TLS_DTPREL64": true,
+ "R_AARCH64_TLS_TPREL64": true,
+ "R_AARCH64_TSTBR14": true,
+ "R_ALPHA": true,
+ "R_ALPHA_BRADDR": true,
+ "R_ALPHA_COPY": true,
+ "R_ALPHA_GLOB_DAT": true,
+ "R_ALPHA_GPDISP": true,
+ "R_ALPHA_GPREL32": true,
+ "R_ALPHA_GPRELHIGH": true,
+ "R_ALPHA_GPRELLOW": true,
+ "R_ALPHA_GPVALUE": true,
+ "R_ALPHA_HINT": true,
+ "R_ALPHA_IMMED_BR_HI32": true,
+ "R_ALPHA_IMMED_GP_16": true,
+ "R_ALPHA_IMMED_GP_HI32": true,
+ "R_ALPHA_IMMED_LO32": true,
+ "R_ALPHA_IMMED_SCN_HI32": true,
+ "R_ALPHA_JMP_SLOT": true,
+ "R_ALPHA_LITERAL": true,
+ "R_ALPHA_LITUSE": true,
+ "R_ALPHA_NONE": true,
+ "R_ALPHA_OP_PRSHIFT": true,
+ "R_ALPHA_OP_PSUB": true,
+ "R_ALPHA_OP_PUSH": true,
+ "R_ALPHA_OP_STORE": true,
+ "R_ALPHA_REFLONG": true,
+ "R_ALPHA_REFQUAD": true,
+ "R_ALPHA_RELATIVE": true,
+ "R_ALPHA_SREL16": true,
+ "R_ALPHA_SREL32": true,
+ "R_ALPHA_SREL64": true,
+ "R_ARM": true,
+ "R_ARM_ABS12": true,
+ "R_ARM_ABS16": true,
+ "R_ARM_ABS32": true,
+ "R_ARM_ABS32_NOI": true,
+ "R_ARM_ABS8": true,
+ "R_ARM_ALU_PCREL_15_8": true,
+ "R_ARM_ALU_PCREL_23_15": true,
+ "R_ARM_ALU_PCREL_7_0": true,
+ "R_ARM_ALU_PC_G0": true,
+ "R_ARM_ALU_PC_G0_NC": true,
+ "R_ARM_ALU_PC_G1": true,
+ "R_ARM_ALU_PC_G1_NC": true,
+ "R_ARM_ALU_PC_G2": true,
+ "R_ARM_ALU_SBREL_19_12_NC": true,
+ "R_ARM_ALU_SBREL_27_20_CK": true,
+ "R_ARM_ALU_SB_G0": true,
+ "R_ARM_ALU_SB_G0_NC": true,
+ "R_ARM_ALU_SB_G1": true,
+ "R_ARM_ALU_SB_G1_NC": true,
+ "R_ARM_ALU_SB_G2": true,
+ "R_ARM_AMP_VCALL9": true,
+ "R_ARM_BASE_ABS": true,
+ "R_ARM_CALL": true,
+ "R_ARM_COPY": true,
+ "R_ARM_GLOB_DAT": true,
+ "R_ARM_GNU_VTENTRY": true,
+ "R_ARM_GNU_VTINHERIT": true,
+ "R_ARM_GOT32": true,
+ "R_ARM_GOTOFF": true,
+ "R_ARM_GOTOFF12": true,
+ "R_ARM_GOTPC": true,
+ "R_ARM_GOTRELAX": true,
+ "R_ARM_GOT_ABS": true,
+ "R_ARM_GOT_BREL12": true,
+ "R_ARM_GOT_PREL": true,
+ "R_ARM_IRELATIVE": true,
+ "R_ARM_JUMP24": true,
+ "R_ARM_JUMP_SLOT": true,
+ "R_ARM_LDC_PC_G0": true,
+ "R_ARM_LDC_PC_G1": true,
+ "R_ARM_LDC_PC_G2": true,
+ "R_ARM_LDC_SB_G0": true,
+ "R_ARM_LDC_SB_G1": true,
+ "R_ARM_LDC_SB_G2": true,
+ "R_ARM_LDRS_PC_G0": true,
+ "R_ARM_LDRS_PC_G1": true,
+ "R_ARM_LDRS_PC_G2": true,
+ "R_ARM_LDRS_SB_G0": true,
+ "R_ARM_LDRS_SB_G1": true,
+ "R_ARM_LDRS_SB_G2": true,
+ "R_ARM_LDR_PC_G1": true,
+ "R_ARM_LDR_PC_G2": true,
+ "R_ARM_LDR_SBREL_11_10_NC": true,
+ "R_ARM_LDR_SB_G0": true,
+ "R_ARM_LDR_SB_G1": true,
+ "R_ARM_LDR_SB_G2": true,
+ "R_ARM_ME_TOO": true,
+ "R_ARM_MOVT_ABS": true,
+ "R_ARM_MOVT_BREL": true,
+ "R_ARM_MOVT_PREL": true,
+ "R_ARM_MOVW_ABS_NC": true,
+ "R_ARM_MOVW_BREL": true,
+ "R_ARM_MOVW_BREL_NC": true,
+ "R_ARM_MOVW_PREL_NC": true,
+ "R_ARM_NONE": true,
+ "R_ARM_PC13": true,
+ "R_ARM_PC24": true,
+ "R_ARM_PLT32": true,
+ "R_ARM_PLT32_ABS": true,
+ "R_ARM_PREL31": true,
+ "R_ARM_PRIVATE_0": true,
+ "R_ARM_PRIVATE_1": true,
+ "R_ARM_PRIVATE_10": true,
+ "R_ARM_PRIVATE_11": true,
+ "R_ARM_PRIVATE_12": true,
+ "R_ARM_PRIVATE_13": true,
+ "R_ARM_PRIVATE_14": true,
+ "R_ARM_PRIVATE_15": true,
+ "R_ARM_PRIVATE_2": true,
+ "R_ARM_PRIVATE_3": true,
+ "R_ARM_PRIVATE_4": true,
+ "R_ARM_PRIVATE_5": true,
+ "R_ARM_PRIVATE_6": true,
+ "R_ARM_PRIVATE_7": true,
+ "R_ARM_PRIVATE_8": true,
+ "R_ARM_PRIVATE_9": true,
+ "R_ARM_RABS32": true,
+ "R_ARM_RBASE": true,
+ "R_ARM_REL32": true,
+ "R_ARM_REL32_NOI": true,
+ "R_ARM_RELATIVE": true,
+ "R_ARM_RPC24": true,
+ "R_ARM_RREL32": true,
+ "R_ARM_RSBREL32": true,
+ "R_ARM_RXPC25": true,
+ "R_ARM_SBREL31": true,
+ "R_ARM_SBREL32": true,
+ "R_ARM_SWI24": true,
+ "R_ARM_TARGET1": true,
+ "R_ARM_TARGET2": true,
+ "R_ARM_THM_ABS5": true,
+ "R_ARM_THM_ALU_ABS_G0_NC": true,
+ "R_ARM_THM_ALU_ABS_G1_NC": true,
+ "R_ARM_THM_ALU_ABS_G2_NC": true,
+ "R_ARM_THM_ALU_ABS_G3": true,
+ "R_ARM_THM_ALU_PREL_11_0": true,
+ "R_ARM_THM_GOT_BREL12": true,
+ "R_ARM_THM_JUMP11": true,
+ "R_ARM_THM_JUMP19": true,
+ "R_ARM_THM_JUMP24": true,
+ "R_ARM_THM_JUMP6": true,
+ "R_ARM_THM_JUMP8": true,
+ "R_ARM_THM_MOVT_ABS": true,
+ "R_ARM_THM_MOVT_BREL": true,
+ "R_ARM_THM_MOVT_PREL": true,
+ "R_ARM_THM_MOVW_ABS_NC": true,
+ "R_ARM_THM_MOVW_BREL": true,
+ "R_ARM_THM_MOVW_BREL_NC": true,
+ "R_ARM_THM_MOVW_PREL_NC": true,
+ "R_ARM_THM_PC12": true,
+ "R_ARM_THM_PC22": true,
+ "R_ARM_THM_PC8": true,
+ "R_ARM_THM_RPC22": true,
+ "R_ARM_THM_SWI8": true,
+ "R_ARM_THM_TLS_CALL": true,
+ "R_ARM_THM_TLS_DESCSEQ16": true,
+ "R_ARM_THM_TLS_DESCSEQ32": true,
+ "R_ARM_THM_XPC22": true,
+ "R_ARM_TLS_CALL": true,
+ "R_ARM_TLS_DESCSEQ": true,
+ "R_ARM_TLS_DTPMOD32": true,
+ "R_ARM_TLS_DTPOFF32": true,
+ "R_ARM_TLS_GD32": true,
+ "R_ARM_TLS_GOTDESC": true,
+ "R_ARM_TLS_IE12GP": true,
+ "R_ARM_TLS_IE32": true,
+ "R_ARM_TLS_LDM32": true,
+ "R_ARM_TLS_LDO12": true,
+ "R_ARM_TLS_LDO32": true,
+ "R_ARM_TLS_LE12": true,
+ "R_ARM_TLS_LE32": true,
+ "R_ARM_TLS_TPOFF32": true,
+ "R_ARM_V4BX": true,
+ "R_ARM_XPC25": true,
+ "R_INFO": true,
+ "R_INFO32": true,
+ "R_MIPS": true,
+ "R_MIPS_16": true,
+ "R_MIPS_26": true,
+ "R_MIPS_32": true,
+ "R_MIPS_64": true,
+ "R_MIPS_ADD_IMMEDIATE": true,
+ "R_MIPS_CALL16": true,
+ "R_MIPS_CALL_HI16": true,
+ "R_MIPS_CALL_LO16": true,
+ "R_MIPS_DELETE": true,
+ "R_MIPS_GOT16": true,
+ "R_MIPS_GOT_DISP": true,
+ "R_MIPS_GOT_HI16": true,
+ "R_MIPS_GOT_LO16": true,
+ "R_MIPS_GOT_OFST": true,
+ "R_MIPS_GOT_PAGE": true,
+ "R_MIPS_GPREL16": true,
+ "R_MIPS_GPREL32": true,
+ "R_MIPS_HI16": true,
+ "R_MIPS_HIGHER": true,
+ "R_MIPS_HIGHEST": true,
+ "R_MIPS_INSERT_A": true,
+ "R_MIPS_INSERT_B": true,
+ "R_MIPS_JALR": true,
+ "R_MIPS_LITERAL": true,
+ "R_MIPS_LO16": true,
+ "R_MIPS_NONE": true,
+ "R_MIPS_PC16": true,
+ "R_MIPS_PJUMP": true,
+ "R_MIPS_REL16": true,
+ "R_MIPS_REL32": true,
+ "R_MIPS_RELGOT": true,
+ "R_MIPS_SCN_DISP": true,
+ "R_MIPS_SHIFT5": true,
+ "R_MIPS_SHIFT6": true,
+ "R_MIPS_SUB": true,
+ "R_MIPS_TLS_DTPMOD32": true,
+ "R_MIPS_TLS_DTPMOD64": true,
+ "R_MIPS_TLS_DTPREL32": true,
+ "R_MIPS_TLS_DTPREL64": true,
+ "R_MIPS_TLS_DTPREL_HI16": true,
+ "R_MIPS_TLS_DTPREL_LO16": true,
+ "R_MIPS_TLS_GD": true,
+ "R_MIPS_TLS_GOTTPREL": true,
+ "R_MIPS_TLS_LDM": true,
+ "R_MIPS_TLS_TPREL32": true,
+ "R_MIPS_TLS_TPREL64": true,
+ "R_MIPS_TLS_TPREL_HI16": true,
+ "R_MIPS_TLS_TPREL_LO16": true,
+ "R_PPC": true,
+ "R_PPC64": true,
+ "R_PPC64_ADDR14": true,
+ "R_PPC64_ADDR14_BRNTAKEN": true,
+ "R_PPC64_ADDR14_BRTAKEN": true,
+ "R_PPC64_ADDR16": true,
+ "R_PPC64_ADDR16_DS": true,
+ "R_PPC64_ADDR16_HA": true,
+ "R_PPC64_ADDR16_HI": true,
+ "R_PPC64_ADDR16_HIGH": true,
+ "R_PPC64_ADDR16_HIGHA": true,
+ "R_PPC64_ADDR16_HIGHER": true,
+ "R_PPC64_ADDR16_HIGHERA": true,
+ "R_PPC64_ADDR16_HIGHEST": true,
+ "R_PPC64_ADDR16_HIGHESTA": true,
+ "R_PPC64_ADDR16_LO": true,
+ "R_PPC64_ADDR16_LO_DS": true,
+ "R_PPC64_ADDR24": true,
+ "R_PPC64_ADDR32": true,
+ "R_PPC64_ADDR64": true,
+ "R_PPC64_ADDR64_LOCAL": true,
+ "R_PPC64_DTPMOD64": true,
+ "R_PPC64_DTPREL16": true,
+ "R_PPC64_DTPREL16_DS": true,
+ "R_PPC64_DTPREL16_HA": true,
+ "R_PPC64_DTPREL16_HI": true,
+ "R_PPC64_DTPREL16_HIGH": true,
+ "R_PPC64_DTPREL16_HIGHA": true,
+ "R_PPC64_DTPREL16_HIGHER": true,
+ "R_PPC64_DTPREL16_HIGHERA": true,
+ "R_PPC64_DTPREL16_HIGHEST": true,
+ "R_PPC64_DTPREL16_HIGHESTA": true,
+ "R_PPC64_DTPREL16_LO": true,
+ "R_PPC64_DTPREL16_LO_DS": true,
+ "R_PPC64_DTPREL64": true,
+ "R_PPC64_ENTRY": true,
+ "R_PPC64_GOT16": true,
+ "R_PPC64_GOT16_DS": true,
+ "R_PPC64_GOT16_HA": true,
+ "R_PPC64_GOT16_HI": true,
+ "R_PPC64_GOT16_LO": true,
+ "R_PPC64_GOT16_LO_DS": true,
+ "R_PPC64_GOT_DTPREL16_DS": true,
+ "R_PPC64_GOT_DTPREL16_HA": true,
+ "R_PPC64_GOT_DTPREL16_HI": true,
+ "R_PPC64_GOT_DTPREL16_LO_DS": true,
+ "R_PPC64_GOT_TLSGD16": true,
+ "R_PPC64_GOT_TLSGD16_HA": true,
+ "R_PPC64_GOT_TLSGD16_HI": true,
+ "R_PPC64_GOT_TLSGD16_LO": true,
+ "R_PPC64_GOT_TLSLD16": true,
+ "R_PPC64_GOT_TLSLD16_HA": true,
+ "R_PPC64_GOT_TLSLD16_HI": true,
+ "R_PPC64_GOT_TLSLD16_LO": true,
+ "R_PPC64_GOT_TPREL16_DS": true,
+ "R_PPC64_GOT_TPREL16_HA": true,
+ "R_PPC64_GOT_TPREL16_HI": true,
+ "R_PPC64_GOT_TPREL16_LO_DS": true,
+ "R_PPC64_IRELATIVE": true,
+ "R_PPC64_JMP_IREL": true,
+ "R_PPC64_JMP_SLOT": true,
+ "R_PPC64_NONE": true,
+ "R_PPC64_PLT16_LO_DS": true,
+ "R_PPC64_PLTGOT16": true,
+ "R_PPC64_PLTGOT16_DS": true,
+ "R_PPC64_PLTGOT16_HA": true,
+ "R_PPC64_PLTGOT16_HI": true,
+ "R_PPC64_PLTGOT16_LO": true,
+ "R_PPC64_PLTGOT_LO_DS": true,
+ "R_PPC64_REL14": true,
+ "R_PPC64_REL14_BRNTAKEN": true,
+ "R_PPC64_REL14_BRTAKEN": true,
+ "R_PPC64_REL16": true,
+ "R_PPC64_REL16DX_HA": true,
+ "R_PPC64_REL16_HA": true,
+ "R_PPC64_REL16_HI": true,
+ "R_PPC64_REL16_LO": true,
+ "R_PPC64_REL24": true,
+ "R_PPC64_REL24_NOTOC": true,
+ "R_PPC64_REL32": true,
+ "R_PPC64_REL64": true,
+ "R_PPC64_SECTOFF_DS": true,
+ "R_PPC64_SECTOFF_LO_DS": true,
+ "R_PPC64_TLS": true,
+ "R_PPC64_TLSGD": true,
+ "R_PPC64_TLSLD": true,
+ "R_PPC64_TOC": true,
+ "R_PPC64_TOC16": true,
+ "R_PPC64_TOC16_DS": true,
+ "R_PPC64_TOC16_HA": true,
+ "R_PPC64_TOC16_HI": true,
+ "R_PPC64_TOC16_LO": true,
+ "R_PPC64_TOC16_LO_DS": true,
+ "R_PPC64_TOCSAVE": true,
+ "R_PPC64_TPREL16": true,
+ "R_PPC64_TPREL16_DS": true,
+ "R_PPC64_TPREL16_HA": true,
+ "R_PPC64_TPREL16_HI": true,
+ "R_PPC64_TPREL16_HIGH": true,
+ "R_PPC64_TPREL16_HIGHA": true,
+ "R_PPC64_TPREL16_HIGHER": true,
+ "R_PPC64_TPREL16_HIGHERA": true,
+ "R_PPC64_TPREL16_HIGHEST": true,
+ "R_PPC64_TPREL16_HIGHESTA": true,
+ "R_PPC64_TPREL16_LO": true,
+ "R_PPC64_TPREL16_LO_DS": true,
+ "R_PPC64_TPREL64": true,
+ "R_PPC_ADDR14": true,
+ "R_PPC_ADDR14_BRNTAKEN": true,
+ "R_PPC_ADDR14_BRTAKEN": true,
+ "R_PPC_ADDR16": true,
+ "R_PPC_ADDR16_HA": true,
+ "R_PPC_ADDR16_HI": true,
+ "R_PPC_ADDR16_LO": true,
+ "R_PPC_ADDR24": true,
+ "R_PPC_ADDR32": true,
+ "R_PPC_COPY": true,
+ "R_PPC_DTPMOD32": true,
+ "R_PPC_DTPREL16": true,
+ "R_PPC_DTPREL16_HA": true,
+ "R_PPC_DTPREL16_HI": true,
+ "R_PPC_DTPREL16_LO": true,
+ "R_PPC_DTPREL32": true,
+ "R_PPC_EMB_BIT_FLD": true,
+ "R_PPC_EMB_MRKREF": true,
+ "R_PPC_EMB_NADDR16": true,
+ "R_PPC_EMB_NADDR16_HA": true,
+ "R_PPC_EMB_NADDR16_HI": true,
+ "R_PPC_EMB_NADDR16_LO": true,
+ "R_PPC_EMB_NADDR32": true,
+ "R_PPC_EMB_RELSDA": true,
+ "R_PPC_EMB_RELSEC16": true,
+ "R_PPC_EMB_RELST_HA": true,
+ "R_PPC_EMB_RELST_HI": true,
+ "R_PPC_EMB_RELST_LO": true,
+ "R_PPC_EMB_SDA21": true,
+ "R_PPC_EMB_SDA2I16": true,
+ "R_PPC_EMB_SDA2REL": true,
+ "R_PPC_EMB_SDAI16": true,
+ "R_PPC_GLOB_DAT": true,
+ "R_PPC_GOT16": true,
+ "R_PPC_GOT16_HA": true,
+ "R_PPC_GOT16_HI": true,
+ "R_PPC_GOT16_LO": true,
+ "R_PPC_GOT_TLSGD16": true,
+ "R_PPC_GOT_TLSGD16_HA": true,
+ "R_PPC_GOT_TLSGD16_HI": true,
+ "R_PPC_GOT_TLSGD16_LO": true,
+ "R_PPC_GOT_TLSLD16": true,
+ "R_PPC_GOT_TLSLD16_HA": true,
+ "R_PPC_GOT_TLSLD16_HI": true,
+ "R_PPC_GOT_TLSLD16_LO": true,
+ "R_PPC_GOT_TPREL16": true,
+ "R_PPC_GOT_TPREL16_HA": true,
+ "R_PPC_GOT_TPREL16_HI": true,
+ "R_PPC_GOT_TPREL16_LO": true,
+ "R_PPC_JMP_SLOT": true,
+ "R_PPC_LOCAL24PC": true,
+ "R_PPC_NONE": true,
+ "R_PPC_PLT16_HA": true,
+ "R_PPC_PLT16_HI": true,
+ "R_PPC_PLT16_LO": true,
+ "R_PPC_PLT32": true,
+ "R_PPC_PLTREL24": true,
+ "R_PPC_PLTREL32": true,
+ "R_PPC_REL14": true,
+ "R_PPC_REL14_BRNTAKEN": true,
+ "R_PPC_REL14_BRTAKEN": true,
+ "R_PPC_REL24": true,
+ "R_PPC_REL32": true,
+ "R_PPC_RELATIVE": true,
+ "R_PPC_SDAREL16": true,
+ "R_PPC_SECTOFF": true,
+ "R_PPC_SECTOFF_HA": true,
+ "R_PPC_SECTOFF_HI": true,
+ "R_PPC_SECTOFF_LO": true,
+ "R_PPC_TLS": true,
+ "R_PPC_TPREL16": true,
+ "R_PPC_TPREL16_HA": true,
+ "R_PPC_TPREL16_HI": true,
+ "R_PPC_TPREL16_LO": true,
+ "R_PPC_TPREL32": true,
+ "R_PPC_UADDR16": true,
+ "R_PPC_UADDR32": true,
+ "R_RISCV": true,
+ "R_RISCV_32": true,
+ "R_RISCV_32_PCREL": true,
+ "R_RISCV_64": true,
+ "R_RISCV_ADD16": true,
+ "R_RISCV_ADD32": true,
+ "R_RISCV_ADD64": true,
+ "R_RISCV_ADD8": true,
+ "R_RISCV_ALIGN": true,
+ "R_RISCV_BRANCH": true,
+ "R_RISCV_CALL": true,
+ "R_RISCV_CALL_PLT": true,
+ "R_RISCV_COPY": true,
+ "R_RISCV_GNU_VTENTRY": true,
+ "R_RISCV_GNU_VTINHERIT": true,
+ "R_RISCV_GOT_HI20": true,
+ "R_RISCV_GPREL_I": true,
+ "R_RISCV_GPREL_S": true,
+ "R_RISCV_HI20": true,
+ "R_RISCV_JAL": true,
+ "R_RISCV_JUMP_SLOT": true,
+ "R_RISCV_LO12_I": true,
+ "R_RISCV_LO12_S": true,
+ "R_RISCV_NONE": true,
+ "R_RISCV_PCREL_HI20": true,
+ "R_RISCV_PCREL_LO12_I": true,
+ "R_RISCV_PCREL_LO12_S": true,
+ "R_RISCV_RELATIVE": true,
+ "R_RISCV_RELAX": true,
+ "R_RISCV_RVC_BRANCH": true,
+ "R_RISCV_RVC_JUMP": true,
+ "R_RISCV_RVC_LUI": true,
+ "R_RISCV_SET16": true,
+ "R_RISCV_SET32": true,
+ "R_RISCV_SET6": true,
+ "R_RISCV_SET8": true,
+ "R_RISCV_SUB16": true,
+ "R_RISCV_SUB32": true,
+ "R_RISCV_SUB6": true,
+ "R_RISCV_SUB64": true,
+ "R_RISCV_SUB8": true,
+ "R_RISCV_TLS_DTPMOD32": true,
+ "R_RISCV_TLS_DTPMOD64": true,
+ "R_RISCV_TLS_DTPREL32": true,
+ "R_RISCV_TLS_DTPREL64": true,
+ "R_RISCV_TLS_GD_HI20": true,
+ "R_RISCV_TLS_GOT_HI20": true,
+ "R_RISCV_TLS_TPREL32": true,
+ "R_RISCV_TLS_TPREL64": true,
+ "R_RISCV_TPREL_ADD": true,
+ "R_RISCV_TPREL_HI20": true,
+ "R_RISCV_TPREL_I": true,
+ "R_RISCV_TPREL_LO12_I": true,
+ "R_RISCV_TPREL_LO12_S": true,
+ "R_RISCV_TPREL_S": true,
+ "R_SPARC": true,
+ "R_SPARC_10": true,
+ "R_SPARC_11": true,
+ "R_SPARC_13": true,
+ "R_SPARC_16": true,
+ "R_SPARC_22": true,
+ "R_SPARC_32": true,
+ "R_SPARC_5": true,
+ "R_SPARC_6": true,
+ "R_SPARC_64": true,
+ "R_SPARC_7": true,
+ "R_SPARC_8": true,
+ "R_SPARC_COPY": true,
+ "R_SPARC_DISP16": true,
+ "R_SPARC_DISP32": true,
+ "R_SPARC_DISP64": true,
+ "R_SPARC_DISP8": true,
+ "R_SPARC_GLOB_DAT": true,
+ "R_SPARC_GLOB_JMP": true,
+ "R_SPARC_GOT10": true,
+ "R_SPARC_GOT13": true,
+ "R_SPARC_GOT22": true,
+ "R_SPARC_H44": true,
+ "R_SPARC_HH22": true,
+ "R_SPARC_HI22": true,
+ "R_SPARC_HIPLT22": true,
+ "R_SPARC_HIX22": true,
+ "R_SPARC_HM10": true,
+ "R_SPARC_JMP_SLOT": true,
+ "R_SPARC_L44": true,
+ "R_SPARC_LM22": true,
+ "R_SPARC_LO10": true,
+ "R_SPARC_LOPLT10": true,
+ "R_SPARC_LOX10": true,
+ "R_SPARC_M44": true,
+ "R_SPARC_NONE": true,
+ "R_SPARC_OLO10": true,
+ "R_SPARC_PC10": true,
+ "R_SPARC_PC22": true,
+ "R_SPARC_PCPLT10": true,
+ "R_SPARC_PCPLT22": true,
+ "R_SPARC_PCPLT32": true,
+ "R_SPARC_PC_HH22": true,
+ "R_SPARC_PC_HM10": true,
+ "R_SPARC_PC_LM22": true,
+ "R_SPARC_PLT32": true,
+ "R_SPARC_PLT64": true,
+ "R_SPARC_REGISTER": true,
+ "R_SPARC_RELATIVE": true,
+ "R_SPARC_UA16": true,
+ "R_SPARC_UA32": true,
+ "R_SPARC_UA64": true,
+ "R_SPARC_WDISP16": true,
+ "R_SPARC_WDISP19": true,
+ "R_SPARC_WDISP22": true,
+ "R_SPARC_WDISP30": true,
+ "R_SPARC_WPLT30": true,
+ "R_SYM32": true,
+ "R_SYM64": true,
+ "R_TYPE32": true,
+ "R_TYPE64": true,
+ "R_X86_64": true,
+ "R_X86_64_16": true,
+ "R_X86_64_32": true,
+ "R_X86_64_32S": true,
+ "R_X86_64_64": true,
+ "R_X86_64_8": true,
+ "R_X86_64_COPY": true,
+ "R_X86_64_DTPMOD64": true,
+ "R_X86_64_DTPOFF32": true,
+ "R_X86_64_DTPOFF64": true,
+ "R_X86_64_GLOB_DAT": true,
+ "R_X86_64_GOT32": true,
+ "R_X86_64_GOT64": true,
+ "R_X86_64_GOTOFF64": true,
+ "R_X86_64_GOTPC32": true,
+ "R_X86_64_GOTPC32_TLSDESC": true,
+ "R_X86_64_GOTPC64": true,
+ "R_X86_64_GOTPCREL": true,
+ "R_X86_64_GOTPCREL64": true,
+ "R_X86_64_GOTPCRELX": true,
+ "R_X86_64_GOTPLT64": true,
+ "R_X86_64_GOTTPOFF": true,
+ "R_X86_64_IRELATIVE": true,
+ "R_X86_64_JMP_SLOT": true,
+ "R_X86_64_NONE": true,
+ "R_X86_64_PC16": true,
+ "R_X86_64_PC32": true,
+ "R_X86_64_PC32_BND": true,
+ "R_X86_64_PC64": true,
+ "R_X86_64_PC8": true,
+ "R_X86_64_PLT32": true,
+ "R_X86_64_PLT32_BND": true,
+ "R_X86_64_PLTOFF64": true,
+ "R_X86_64_RELATIVE": true,
+ "R_X86_64_RELATIVE64": true,
+ "R_X86_64_REX_GOTPCRELX": true,
+ "R_X86_64_SIZE32": true,
+ "R_X86_64_SIZE64": true,
+ "R_X86_64_TLSDESC": true,
+ "R_X86_64_TLSDESC_CALL": true,
+ "R_X86_64_TLSGD": true,
+ "R_X86_64_TLSLD": true,
+ "R_X86_64_TPOFF32": true,
+ "R_X86_64_TPOFF64": true,
+ "Rel32": true,
+ "Rel64": true,
+ "Rela32": true,
+ "Rela64": true,
+ "SHF_ALLOC": true,
+ "SHF_COMPRESSED": true,
+ "SHF_EXECINSTR": true,
+ "SHF_GROUP": true,
+ "SHF_INFO_LINK": true,
+ "SHF_LINK_ORDER": true,
+ "SHF_MASKOS": true,
+ "SHF_MASKPROC": true,
+ "SHF_MERGE": true,
+ "SHF_OS_NONCONFORMING": true,
+ "SHF_STRINGS": true,
+ "SHF_TLS": true,
+ "SHF_WRITE": true,
+ "SHN_ABS": true,
+ "SHN_COMMON": true,
+ "SHN_HIOS": true,
+ "SHN_HIPROC": true,
+ "SHN_HIRESERVE": true,
+ "SHN_LOOS": true,
+ "SHN_LOPROC": true,
+ "SHN_LORESERVE": true,
+ "SHN_UNDEF": true,
+ "SHN_XINDEX": true,
+ "SHT_DYNAMIC": true,
+ "SHT_DYNSYM": true,
+ "SHT_FINI_ARRAY": true,
+ "SHT_GNU_ATTRIBUTES": true,
+ "SHT_GNU_HASH": true,
+ "SHT_GNU_LIBLIST": true,
+ "SHT_GNU_VERDEF": true,
+ "SHT_GNU_VERNEED": true,
+ "SHT_GNU_VERSYM": true,
+ "SHT_GROUP": true,
+ "SHT_HASH": true,
+ "SHT_HIOS": true,
+ "SHT_HIPROC": true,
+ "SHT_HIUSER": true,
+ "SHT_INIT_ARRAY": true,
+ "SHT_LOOS": true,
+ "SHT_LOPROC": true,
+ "SHT_LOUSER": true,
+ "SHT_NOBITS": true,
+ "SHT_NOTE": true,
+ "SHT_NULL": true,
+ "SHT_PREINIT_ARRAY": true,
+ "SHT_PROGBITS": true,
+ "SHT_REL": true,
+ "SHT_RELA": true,
+ "SHT_SHLIB": true,
+ "SHT_STRTAB": true,
+ "SHT_SYMTAB": true,
+ "SHT_SYMTAB_SHNDX": true,
+ "STB_GLOBAL": true,
+ "STB_HIOS": true,
+ "STB_HIPROC": true,
+ "STB_LOCAL": true,
+ "STB_LOOS": true,
+ "STB_LOPROC": true,
+ "STB_WEAK": true,
+ "STT_COMMON": true,
+ "STT_FILE": true,
+ "STT_FUNC": true,
+ "STT_HIOS": true,
+ "STT_HIPROC": true,
+ "STT_LOOS": true,
+ "STT_LOPROC": true,
+ "STT_NOTYPE": true,
+ "STT_OBJECT": true,
+ "STT_SECTION": true,
+ "STT_TLS": true,
+ "STV_DEFAULT": true,
+ "STV_HIDDEN": true,
+ "STV_INTERNAL": true,
+ "STV_PROTECTED": true,
+ "ST_BIND": true,
+ "ST_INFO": true,
+ "ST_TYPE": true,
+ "ST_VISIBILITY": true,
+ "Section": true,
+ "Section32": true,
+ "Section64": true,
+ "SectionFlag": true,
+ "SectionHeader": true,
+ "SectionIndex": true,
+ "SectionType": true,
+ "Sym32": true,
+ "Sym32Size": true,
+ "Sym64": true,
+ "Sym64Size": true,
+ "SymBind": true,
+ "SymType": true,
+ "SymVis": true,
+ "Symbol": true,
+ "Type": true,
+ "Version": true,
+ },
+ "debug/gosym": map[string]bool{
+ "DecodingError": true,
+ "Func": true,
+ "LineTable": true,
+ "NewLineTable": true,
+ "NewTable": true,
+ "Obj": true,
+ "Sym": true,
+ "Table": true,
+ "UnknownFileError": true,
+ "UnknownLineError": true,
+ },
+ "debug/macho": map[string]bool{
+ "ARM64_RELOC_ADDEND": true,
+ "ARM64_RELOC_BRANCH26": true,
+ "ARM64_RELOC_GOT_LOAD_PAGE21": true,
+ "ARM64_RELOC_GOT_LOAD_PAGEOFF12": true,
+ "ARM64_RELOC_PAGE21": true,
+ "ARM64_RELOC_PAGEOFF12": true,
+ "ARM64_RELOC_POINTER_TO_GOT": true,
+ "ARM64_RELOC_SUBTRACTOR": true,
+ "ARM64_RELOC_TLVP_LOAD_PAGE21": true,
+ "ARM64_RELOC_TLVP_LOAD_PAGEOFF12": true,
+ "ARM64_RELOC_UNSIGNED": true,
+ "ARM_RELOC_BR24": true,
+ "ARM_RELOC_HALF": true,
+ "ARM_RELOC_HALF_SECTDIFF": true,
+ "ARM_RELOC_LOCAL_SECTDIFF": true,
+ "ARM_RELOC_PAIR": true,
+ "ARM_RELOC_PB_LA_PTR": true,
+ "ARM_RELOC_SECTDIFF": true,
+ "ARM_RELOC_VANILLA": true,
+ "ARM_THUMB_32BIT_BRANCH": true,
+ "ARM_THUMB_RELOC_BR22": true,
+ "Cpu": true,
+ "Cpu386": true,
+ "CpuAmd64": true,
+ "CpuArm": true,
+ "CpuArm64": true,
+ "CpuPpc": true,
+ "CpuPpc64": true,
+ "Dylib": true,
+ "DylibCmd": true,
+ "Dysymtab": true,
+ "DysymtabCmd": true,
+ "ErrNotFat": true,
+ "FatArch": true,
+ "FatArchHeader": true,
+ "FatFile": true,
+ "File": true,
+ "FileHeader": true,
+ "FlagAllModsBound": true,
+ "FlagAllowStackExecution": true,
+ "FlagAppExtensionSafe": true,
+ "FlagBindAtLoad": true,
+ "FlagBindsToWeak": true,
+ "FlagCanonical": true,
+ "FlagDeadStrippableDylib": true,
+ "FlagDyldLink": true,
+ "FlagForceFlat": true,
+ "FlagHasTLVDescriptors": true,
+ "FlagIncrLink": true,
+ "FlagLazyInit": true,
+ "FlagNoFixPrebinding": true,
+ "FlagNoHeapExecution": true,
+ "FlagNoMultiDefs": true,
+ "FlagNoReexportedDylibs": true,
+ "FlagNoUndefs": true,
+ "FlagPIE": true,
+ "FlagPrebindable": true,
+ "FlagPrebound": true,
+ "FlagRootSafe": true,
+ "FlagSetuidSafe": true,
+ "FlagSplitSegs": true,
+ "FlagSubsectionsViaSymbols": true,
+ "FlagTwoLevel": true,
+ "FlagWeakDefines": true,
+ "FormatError": true,
+ "GENERIC_RELOC_LOCAL_SECTDIFF": true,
+ "GENERIC_RELOC_PAIR": true,
+ "GENERIC_RELOC_PB_LA_PTR": true,
+ "GENERIC_RELOC_SECTDIFF": true,
+ "GENERIC_RELOC_TLV": true,
+ "GENERIC_RELOC_VANILLA": true,
+ "Load": true,
+ "LoadBytes": true,
+ "LoadCmd": true,
+ "LoadCmdDylib": true,
+ "LoadCmdDylinker": true,
+ "LoadCmdDysymtab": true,
+ "LoadCmdRpath": true,
+ "LoadCmdSegment": true,
+ "LoadCmdSegment64": true,
+ "LoadCmdSymtab": true,
+ "LoadCmdThread": true,
+ "LoadCmdUnixThread": true,
+ "Magic32": true,
+ "Magic64": true,
+ "MagicFat": true,
+ "NewFatFile": true,
+ "NewFile": true,
+ "Nlist32": true,
+ "Nlist64": true,
+ "Open": true,
+ "OpenFat": true,
+ "Regs386": true,
+ "RegsAMD64": true,
+ "Reloc": true,
+ "RelocTypeARM": true,
+ "RelocTypeARM64": true,
+ "RelocTypeGeneric": true,
+ "RelocTypeX86_64": true,
+ "Rpath": true,
+ "RpathCmd": true,
+ "Section": true,
+ "Section32": true,
+ "Section64": true,
+ "SectionHeader": true,
+ "Segment": true,
+ "Segment32": true,
+ "Segment64": true,
+ "SegmentHeader": true,
+ "Symbol": true,
+ "Symtab": true,
+ "SymtabCmd": true,
+ "Thread": true,
+ "Type": true,
+ "TypeBundle": true,
+ "TypeDylib": true,
+ "TypeExec": true,
+ "TypeObj": true,
+ "X86_64_RELOC_BRANCH": true,
+ "X86_64_RELOC_GOT": true,
+ "X86_64_RELOC_GOT_LOAD": true,
+ "X86_64_RELOC_SIGNED": true,
+ "X86_64_RELOC_SIGNED_1": true,
+ "X86_64_RELOC_SIGNED_2": true,
+ "X86_64_RELOC_SIGNED_4": true,
+ "X86_64_RELOC_SUBTRACTOR": true,
+ "X86_64_RELOC_TLV": true,
+ "X86_64_RELOC_UNSIGNED": true,
+ },
+ "debug/pe": map[string]bool{
+ "COFFSymbol": true,
+ "COFFSymbolSize": true,
+ "DataDirectory": true,
+ "File": true,
+ "FileHeader": true,
+ "FormatError": true,
+ "IMAGE_DIRECTORY_ENTRY_ARCHITECTURE": true,
+ "IMAGE_DIRECTORY_ENTRY_BASERELOC": true,
+ "IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT": true,
+ "IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR": true,
+ "IMAGE_DIRECTORY_ENTRY_DEBUG": true,
+ "IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT": true,
+ "IMAGE_DIRECTORY_ENTRY_EXCEPTION": true,
+ "IMAGE_DIRECTORY_ENTRY_EXPORT": true,
+ "IMAGE_DIRECTORY_ENTRY_GLOBALPTR": true,
+ "IMAGE_DIRECTORY_ENTRY_IAT": true,
+ "IMAGE_DIRECTORY_ENTRY_IMPORT": true,
+ "IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG": true,
+ "IMAGE_DIRECTORY_ENTRY_RESOURCE": true,
+ "IMAGE_DIRECTORY_ENTRY_SECURITY": true,
+ "IMAGE_DIRECTORY_ENTRY_TLS": true,
+ "IMAGE_FILE_MACHINE_AM33": true,
+ "IMAGE_FILE_MACHINE_AMD64": true,
+ "IMAGE_FILE_MACHINE_ARM": true,
+ "IMAGE_FILE_MACHINE_ARM64": true,
+ "IMAGE_FILE_MACHINE_ARMNT": true,
+ "IMAGE_FILE_MACHINE_EBC": true,
+ "IMAGE_FILE_MACHINE_I386": true,
+ "IMAGE_FILE_MACHINE_IA64": true,
+ "IMAGE_FILE_MACHINE_M32R": true,
+ "IMAGE_FILE_MACHINE_MIPS16": true,
+ "IMAGE_FILE_MACHINE_MIPSFPU": true,
+ "IMAGE_FILE_MACHINE_MIPSFPU16": true,
+ "IMAGE_FILE_MACHINE_POWERPC": true,
+ "IMAGE_FILE_MACHINE_POWERPCFP": true,
+ "IMAGE_FILE_MACHINE_R4000": true,
+ "IMAGE_FILE_MACHINE_SH3": true,
+ "IMAGE_FILE_MACHINE_SH3DSP": true,
+ "IMAGE_FILE_MACHINE_SH4": true,
+ "IMAGE_FILE_MACHINE_SH5": true,
+ "IMAGE_FILE_MACHINE_THUMB": true,
+ "IMAGE_FILE_MACHINE_UNKNOWN": true,
+ "IMAGE_FILE_MACHINE_WCEMIPSV2": true,
+ "ImportDirectory": true,
+ "NewFile": true,
+ "Open": true,
+ "OptionalHeader32": true,
+ "OptionalHeader64": true,
+ "Reloc": true,
+ "Section": true,
+ "SectionHeader": true,
+ "SectionHeader32": true,
+ "StringTable": true,
+ "Symbol": true,
+ },
+ "debug/plan9obj": map[string]bool{
+ "File": true,
+ "FileHeader": true,
+ "Magic386": true,
+ "Magic64": true,
+ "MagicAMD64": true,
+ "MagicARM": true,
+ "NewFile": true,
+ "Open": true,
+ "Section": true,
+ "SectionHeader": true,
+ "Sym": true,
+ },
+ "encoding": map[string]bool{
+ "BinaryMarshaler": true,
+ "BinaryUnmarshaler": true,
+ "TextMarshaler": true,
+ "TextUnmarshaler": true,
+ },
+ "encoding/ascii85": map[string]bool{
+ "CorruptInputError": true,
+ "Decode": true,
+ "Encode": true,
+ "MaxEncodedLen": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ },
+ "encoding/asn1": map[string]bool{
+ "BitString": true,
+ "ClassApplication": true,
+ "ClassContextSpecific": true,
+ "ClassPrivate": true,
+ "ClassUniversal": true,
+ "Enumerated": true,
+ "Flag": true,
+ "Marshal": true,
+ "MarshalWithParams": true,
+ "NullBytes": true,
+ "NullRawValue": true,
+ "ObjectIdentifier": true,
+ "RawContent": true,
+ "RawValue": true,
+ "StructuralError": true,
+ "SyntaxError": true,
+ "TagBitString": true,
+ "TagBoolean": true,
+ "TagEnum": true,
+ "TagGeneralString": true,
+ "TagGeneralizedTime": true,
+ "TagIA5String": true,
+ "TagInteger": true,
+ "TagNull": true,
+ "TagNumericString": true,
+ "TagOID": true,
+ "TagOctetString": true,
+ "TagPrintableString": true,
+ "TagSequence": true,
+ "TagSet": true,
+ "TagT61String": true,
+ "TagUTCTime": true,
+ "TagUTF8String": true,
+ "Unmarshal": true,
+ "UnmarshalWithParams": true,
+ },
+ "encoding/base32": map[string]bool{
+ "CorruptInputError": true,
+ "Encoding": true,
+ "HexEncoding": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ "NewEncoding": true,
+ "NoPadding": true,
+ "StdEncoding": true,
+ "StdPadding": true,
+ },
+ "encoding/base64": map[string]bool{
+ "CorruptInputError": true,
+ "Encoding": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ "NewEncoding": true,
+ "NoPadding": true,
+ "RawStdEncoding": true,
+ "RawURLEncoding": true,
+ "StdEncoding": true,
+ "StdPadding": true,
+ "URLEncoding": true,
+ },
+ "encoding/binary": map[string]bool{
+ "BigEndian": true,
+ "ByteOrder": true,
+ "LittleEndian": true,
+ "MaxVarintLen16": true,
+ "MaxVarintLen32": true,
+ "MaxVarintLen64": true,
+ "PutUvarint": true,
+ "PutVarint": true,
+ "Read": true,
+ "ReadUvarint": true,
+ "ReadVarint": true,
+ "Size": true,
+ "Uvarint": true,
+ "Varint": true,
+ "Write": true,
+ },
+ "encoding/csv": map[string]bool{
+ "ErrBareQuote": true,
+ "ErrFieldCount": true,
+ "ErrQuote": true,
+ "ErrTrailingComma": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "ParseError": true,
+ "Reader": true,
+ "Writer": true,
+ },
+ "encoding/gob": map[string]bool{
+ "CommonType": true,
+ "Decoder": true,
+ "Encoder": true,
+ "GobDecoder": true,
+ "GobEncoder": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ "Register": true,
+ "RegisterName": true,
+ },
+ "encoding/hex": map[string]bool{
+ "Decode": true,
+ "DecodeString": true,
+ "DecodedLen": true,
+ "Dump": true,
+ "Dumper": true,
+ "Encode": true,
+ "EncodeToString": true,
+ "EncodedLen": true,
+ "ErrLength": true,
+ "InvalidByteError": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ },
+ "encoding/json": map[string]bool{
+ "Compact": true,
+ "Decoder": true,
+ "Delim": true,
+ "Encoder": true,
+ "HTMLEscape": true,
+ "Indent": true,
+ "InvalidUTF8Error": true,
+ "InvalidUnmarshalError": true,
+ "Marshal": true,
+ "MarshalIndent": true,
+ "Marshaler": true,
+ "MarshalerError": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ "Number": true,
+ "RawMessage": true,
+ "SyntaxError": true,
+ "Token": true,
+ "Unmarshal": true,
+ "UnmarshalFieldError": true,
+ "UnmarshalTypeError": true,
+ "Unmarshaler": true,
+ "UnsupportedTypeError": true,
+ "UnsupportedValueError": true,
+ "Valid": true,
+ },
+ "encoding/pem": map[string]bool{
+ "Block": true,
+ "Decode": true,
+ "Encode": true,
+ "EncodeToMemory": true,
+ },
+ "encoding/xml": map[string]bool{
+ "Attr": true,
+ "CharData": true,
+ "Comment": true,
+ "CopyToken": true,
+ "Decoder": true,
+ "Directive": true,
+ "Encoder": true,
+ "EndElement": true,
+ "Escape": true,
+ "EscapeText": true,
+ "HTMLAutoClose": true,
+ "HTMLEntity": true,
+ "Header": true,
+ "Marshal": true,
+ "MarshalIndent": true,
+ "Marshaler": true,
+ "MarshalerAttr": true,
+ "Name": true,
+ "NewDecoder": true,
+ "NewEncoder": true,
+ "NewTokenDecoder": true,
+ "ProcInst": true,
+ "StartElement": true,
+ "SyntaxError": true,
+ "TagPathError": true,
+ "Token": true,
+ "TokenReader": true,
+ "Unmarshal": true,
+ "UnmarshalError": true,
+ "Unmarshaler": true,
+ "UnmarshalerAttr": true,
+ "UnsupportedTypeError": true,
+ },
+ "errors": map[string]bool{
+ "New": true,
+ },
+ "expvar": map[string]bool{
+ "Do": true,
+ "Float": true,
+ "Func": true,
+ "Get": true,
+ "Handler": true,
+ "Int": true,
+ "KeyValue": true,
+ "Map": true,
+ "NewFloat": true,
+ "NewInt": true,
+ "NewMap": true,
+ "NewString": true,
+ "Publish": true,
+ "String": true,
+ "Var": true,
+ },
+ "flag": map[string]bool{
+ "Arg": true,
+ "Args": true,
+ "Bool": true,
+ "BoolVar": true,
+ "CommandLine": true,
+ "ContinueOnError": true,
+ "Duration": true,
+ "DurationVar": true,
+ "ErrHelp": true,
+ "ErrorHandling": true,
+ "ExitOnError": true,
+ "Flag": true,
+ "FlagSet": true,
+ "Float64": true,
+ "Float64Var": true,
+ "Getter": true,
+ "Int": true,
+ "Int64": true,
+ "Int64Var": true,
+ "IntVar": true,
+ "Lookup": true,
+ "NArg": true,
+ "NFlag": true,
+ "NewFlagSet": true,
+ "PanicOnError": true,
+ "Parse": true,
+ "Parsed": true,
+ "PrintDefaults": true,
+ "Set": true,
+ "String": true,
+ "StringVar": true,
+ "Uint": true,
+ "Uint64": true,
+ "Uint64Var": true,
+ "UintVar": true,
+ "UnquoteUsage": true,
+ "Usage": true,
+ "Value": true,
+ "Var": true,
+ "Visit": true,
+ "VisitAll": true,
+ },
+ "fmt": map[string]bool{
+ "Errorf": true,
+ "Formatter": true,
+ "Fprint": true,
+ "Fprintf": true,
+ "Fprintln": true,
+ "Fscan": true,
+ "Fscanf": true,
+ "Fscanln": true,
+ "GoStringer": true,
+ "Print": true,
+ "Printf": true,
+ "Println": true,
+ "Scan": true,
+ "ScanState": true,
+ "Scanf": true,
+ "Scanln": true,
+ "Scanner": true,
+ "Sprint": true,
+ "Sprintf": true,
+ "Sprintln": true,
+ "Sscan": true,
+ "Sscanf": true,
+ "Sscanln": true,
+ "State": true,
+ "Stringer": true,
+ },
+ "go/ast": map[string]bool{
+ "ArrayType": true,
+ "AssignStmt": true,
+ "Bad": true,
+ "BadDecl": true,
+ "BadExpr": true,
+ "BadStmt": true,
+ "BasicLit": true,
+ "BinaryExpr": true,
+ "BlockStmt": true,
+ "BranchStmt": true,
+ "CallExpr": true,
+ "CaseClause": true,
+ "ChanDir": true,
+ "ChanType": true,
+ "CommClause": true,
+ "Comment": true,
+ "CommentGroup": true,
+ "CommentMap": true,
+ "CompositeLit": true,
+ "Con": true,
+ "DeclStmt": true,
+ "DeferStmt": true,
+ "Ellipsis": true,
+ "EmptyStmt": true,
+ "ExprStmt": true,
+ "Field": true,
+ "FieldFilter": true,
+ "FieldList": true,
+ "File": true,
+ "FileExports": true,
+ "Filter": true,
+ "FilterDecl": true,
+ "FilterFile": true,
+ "FilterFuncDuplicates": true,
+ "FilterImportDuplicates": true,
+ "FilterPackage": true,
+ "FilterUnassociatedComments": true,
+ "ForStmt": true,
+ "Fprint": true,
+ "Fun": true,
+ "FuncDecl": true,
+ "FuncLit": true,
+ "FuncType": true,
+ "GenDecl": true,
+ "GoStmt": true,
+ "Ident": true,
+ "IfStmt": true,
+ "ImportSpec": true,
+ "Importer": true,
+ "IncDecStmt": true,
+ "IndexExpr": true,
+ "Inspect": true,
+ "InterfaceType": true,
+ "IsExported": true,
+ "KeyValueExpr": true,
+ "LabeledStmt": true,
+ "Lbl": true,
+ "MapType": true,
+ "MergeMode": true,
+ "MergePackageFiles": true,
+ "NewCommentMap": true,
+ "NewIdent": true,
+ "NewObj": true,
+ "NewPackage": true,
+ "NewScope": true,
+ "Node": true,
+ "NotNilFilter": true,
+ "ObjKind": true,
+ "Object": true,
+ "Package": true,
+ "PackageExports": true,
+ "ParenExpr": true,
+ "Pkg": true,
+ "Print": true,
+ "RECV": true,
+ "RangeStmt": true,
+ "ReturnStmt": true,
+ "SEND": true,
+ "Scope": true,
+ "SelectStmt": true,
+ "SelectorExpr": true,
+ "SendStmt": true,
+ "SliceExpr": true,
+ "SortImports": true,
+ "StarExpr": true,
+ "StructType": true,
+ "SwitchStmt": true,
+ "Typ": true,
+ "TypeAssertExpr": true,
+ "TypeSpec": true,
+ "TypeSwitchStmt": true,
+ "UnaryExpr": true,
+ "ValueSpec": true,
+ "Var": true,
+ "Visitor": true,
+ "Walk": true,
+ },
+ "go/build": map[string]bool{
+ "AllowBinary": true,
+ "ArchChar": true,
+ "Context": true,
+ "Default": true,
+ "FindOnly": true,
+ "IgnoreVendor": true,
+ "Import": true,
+ "ImportComment": true,
+ "ImportDir": true,
+ "ImportMode": true,
+ "IsLocalImport": true,
+ "MultiplePackageError": true,
+ "NoGoError": true,
+ "Package": true,
+ "ToolDir": true,
+ },
+ "go/constant": map[string]bool{
+ "BinaryOp": true,
+ "BitLen": true,
+ "Bool": true,
+ "BoolVal": true,
+ "Bytes": true,
+ "Compare": true,
+ "Complex": true,
+ "Denom": true,
+ "Float": true,
+ "Float32Val": true,
+ "Float64Val": true,
+ "Imag": true,
+ "Int": true,
+ "Int64Val": true,
+ "Kind": true,
+ "MakeBool": true,
+ "MakeFloat64": true,
+ "MakeFromBytes": true,
+ "MakeFromLiteral": true,
+ "MakeImag": true,
+ "MakeInt64": true,
+ "MakeString": true,
+ "MakeUint64": true,
+ "MakeUnknown": true,
+ "Num": true,
+ "Real": true,
+ "Shift": true,
+ "Sign": true,
+ "String": true,
+ "StringVal": true,
+ "ToComplex": true,
+ "ToFloat": true,
+ "ToInt": true,
+ "Uint64Val": true,
+ "UnaryOp": true,
+ "Unknown": true,
+ },
+ "go/doc": map[string]bool{
+ "AllDecls": true,
+ "AllMethods": true,
+ "Example": true,
+ "Examples": true,
+ "Filter": true,
+ "Func": true,
+ "IllegalPrefixes": true,
+ "IsPredeclared": true,
+ "Mode": true,
+ "New": true,
+ "Note": true,
+ "Package": true,
+ "PreserveAST": true,
+ "Synopsis": true,
+ "ToHTML": true,
+ "ToText": true,
+ "Type": true,
+ "Value": true,
+ },
+ "go/format": map[string]bool{
+ "Node": true,
+ "Source": true,
+ },
+ "go/importer": map[string]bool{
+ "Default": true,
+ "For": true,
+ "ForCompiler": true,
+ "Lookup": true,
+ },
+ "go/parser": map[string]bool{
+ "AllErrors": true,
+ "DeclarationErrors": true,
+ "ImportsOnly": true,
+ "Mode": true,
+ "PackageClauseOnly": true,
+ "ParseComments": true,
+ "ParseDir": true,
+ "ParseExpr": true,
+ "ParseExprFrom": true,
+ "ParseFile": true,
+ "SpuriousErrors": true,
+ "Trace": true,
+ },
+ "go/printer": map[string]bool{
+ "CommentedNode": true,
+ "Config": true,
+ "Fprint": true,
+ "Mode": true,
+ "RawFormat": true,
+ "SourcePos": true,
+ "TabIndent": true,
+ "UseSpaces": true,
+ },
+ "go/scanner": map[string]bool{
+ "Error": true,
+ "ErrorHandler": true,
+ "ErrorList": true,
+ "Mode": true,
+ "PrintError": true,
+ "ScanComments": true,
+ "Scanner": true,
+ },
+ "go/token": map[string]bool{
+ "ADD": true,
+ "ADD_ASSIGN": true,
+ "AND": true,
+ "AND_ASSIGN": true,
+ "AND_NOT": true,
+ "AND_NOT_ASSIGN": true,
+ "ARROW": true,
+ "ASSIGN": true,
+ "BREAK": true,
+ "CASE": true,
+ "CHAN": true,
+ "CHAR": true,
+ "COLON": true,
+ "COMMA": true,
+ "COMMENT": true,
+ "CONST": true,
+ "CONTINUE": true,
+ "DEC": true,
+ "DEFAULT": true,
+ "DEFER": true,
+ "DEFINE": true,
+ "ELLIPSIS": true,
+ "ELSE": true,
+ "EOF": true,
+ "EQL": true,
+ "FALLTHROUGH": true,
+ "FLOAT": true,
+ "FOR": true,
+ "FUNC": true,
+ "File": true,
+ "FileSet": true,
+ "GEQ": true,
+ "GO": true,
+ "GOTO": true,
+ "GTR": true,
+ "HighestPrec": true,
+ "IDENT": true,
+ "IF": true,
+ "ILLEGAL": true,
+ "IMAG": true,
+ "IMPORT": true,
+ "INC": true,
+ "INT": true,
+ "INTERFACE": true,
+ "LAND": true,
+ "LBRACE": true,
+ "LBRACK": true,
+ "LEQ": true,
+ "LOR": true,
+ "LPAREN": true,
+ "LSS": true,
+ "Lookup": true,
+ "LowestPrec": true,
+ "MAP": true,
+ "MUL": true,
+ "MUL_ASSIGN": true,
+ "NEQ": true,
+ "NOT": true,
+ "NewFileSet": true,
+ "NoPos": true,
+ "OR": true,
+ "OR_ASSIGN": true,
+ "PACKAGE": true,
+ "PERIOD": true,
+ "Pos": true,
+ "Position": true,
+ "QUO": true,
+ "QUO_ASSIGN": true,
+ "RANGE": true,
+ "RBRACE": true,
+ "RBRACK": true,
+ "REM": true,
+ "REM_ASSIGN": true,
+ "RETURN": true,
+ "RPAREN": true,
+ "SELECT": true,
+ "SEMICOLON": true,
+ "SHL": true,
+ "SHL_ASSIGN": true,
+ "SHR": true,
+ "SHR_ASSIGN": true,
+ "STRING": true,
+ "STRUCT": true,
+ "SUB": true,
+ "SUB_ASSIGN": true,
+ "SWITCH": true,
+ "TYPE": true,
+ "Token": true,
+ "UnaryPrec": true,
+ "VAR": true,
+ "XOR": true,
+ "XOR_ASSIGN": true,
+ },
+ "go/types": map[string]bool{
+ "Array": true,
+ "AssertableTo": true,
+ "AssignableTo": true,
+ "Basic": true,
+ "BasicInfo": true,
+ "BasicKind": true,
+ "Bool": true,
+ "Builtin": true,
+ "Byte": true,
+ "Chan": true,
+ "ChanDir": true,
+ "Checker": true,
+ "Comparable": true,
+ "Complex128": true,
+ "Complex64": true,
+ "Config": true,
+ "Const": true,
+ "ConvertibleTo": true,
+ "DefPredeclaredTestFuncs": true,
+ "Default": true,
+ "Error": true,
+ "Eval": true,
+ "ExprString": true,
+ "FieldVal": true,
+ "Float32": true,
+ "Float64": true,
+ "Func": true,
+ "Id": true,
+ "Identical": true,
+ "IdenticalIgnoreTags": true,
+ "Implements": true,
+ "ImportMode": true,
+ "Importer": true,
+ "ImporterFrom": true,
+ "Info": true,
+ "Initializer": true,
+ "Int": true,
+ "Int16": true,
+ "Int32": true,
+ "Int64": true,
+ "Int8": true,
+ "Interface": true,
+ "Invalid": true,
+ "IsBoolean": true,
+ "IsComplex": true,
+ "IsConstType": true,
+ "IsFloat": true,
+ "IsInteger": true,
+ "IsInterface": true,
+ "IsNumeric": true,
+ "IsOrdered": true,
+ "IsString": true,
+ "IsUnsigned": true,
+ "IsUntyped": true,
+ "Label": true,
+ "LookupFieldOrMethod": true,
+ "Map": true,
+ "MethodExpr": true,
+ "MethodSet": true,
+ "MethodVal": true,
+ "MissingMethod": true,
+ "Named": true,
+ "NewArray": true,
+ "NewChan": true,
+ "NewChecker": true,
+ "NewConst": true,
+ "NewField": true,
+ "NewFunc": true,
+ "NewInterface": true,
+ "NewInterfaceType": true,
+ "NewLabel": true,
+ "NewMap": true,
+ "NewMethodSet": true,
+ "NewNamed": true,
+ "NewPackage": true,
+ "NewParam": true,
+ "NewPkgName": true,
+ "NewPointer": true,
+ "NewScope": true,
+ "NewSignature": true,
+ "NewSlice": true,
+ "NewStruct": true,
+ "NewTuple": true,
+ "NewTypeName": true,
+ "NewVar": true,
+ "Nil": true,
+ "ObjectString": true,
+ "Package": true,
+ "PkgName": true,
+ "Pointer": true,
+ "Qualifier": true,
+ "RecvOnly": true,
+ "RelativeTo": true,
+ "Rune": true,
+ "Scope": true,
+ "Selection": true,
+ "SelectionKind": true,
+ "SelectionString": true,
+ "SendOnly": true,
+ "SendRecv": true,
+ "Signature": true,
+ "Sizes": true,
+ "SizesFor": true,
+ "Slice": true,
+ "StdSizes": true,
+ "String": true,
+ "Struct": true,
+ "Tuple": true,
+ "Typ": true,
+ "Type": true,
+ "TypeAndValue": true,
+ "TypeName": true,
+ "TypeString": true,
+ "Uint": true,
+ "Uint16": true,
+ "Uint32": true,
+ "Uint64": true,
+ "Uint8": true,
+ "Uintptr": true,
+ "Universe": true,
+ "Unsafe": true,
+ "UnsafePointer": true,
+ "UntypedBool": true,
+ "UntypedComplex": true,
+ "UntypedFloat": true,
+ "UntypedInt": true,
+ "UntypedNil": true,
+ "UntypedRune": true,
+ "UntypedString": true,
+ "Var": true,
+ "WriteExpr": true,
+ "WriteSignature": true,
+ "WriteType": true,
+ },
+ "hash": map[string]bool{
+ "Hash": true,
+ "Hash32": true,
+ "Hash64": true,
+ },
+ "hash/adler32": map[string]bool{
+ "Checksum": true,
+ "New": true,
+ "Size": true,
+ },
+ "hash/crc32": map[string]bool{
+ "Castagnoli": true,
+ "Checksum": true,
+ "ChecksumIEEE": true,
+ "IEEE": true,
+ "IEEETable": true,
+ "Koopman": true,
+ "MakeTable": true,
+ "New": true,
+ "NewIEEE": true,
+ "Size": true,
+ "Table": true,
+ "Update": true,
+ },
+ "hash/crc64": map[string]bool{
+ "Checksum": true,
+ "ECMA": true,
+ "ISO": true,
+ "MakeTable": true,
+ "New": true,
+ "Size": true,
+ "Table": true,
+ "Update": true,
+ },
+ "hash/fnv": map[string]bool{
+ "New128": true,
+ "New128a": true,
+ "New32": true,
+ "New32a": true,
+ "New64": true,
+ "New64a": true,
+ },
+ "html": map[string]bool{
+ "EscapeString": true,
+ "UnescapeString": true,
+ },
+ "html/template": map[string]bool{
+ "CSS": true,
+ "ErrAmbigContext": true,
+ "ErrBadHTML": true,
+ "ErrBranchEnd": true,
+ "ErrEndContext": true,
+ "ErrNoSuchTemplate": true,
+ "ErrOutputContext": true,
+ "ErrPartialCharset": true,
+ "ErrPartialEscape": true,
+ "ErrPredefinedEscaper": true,
+ "ErrRangeLoopReentry": true,
+ "ErrSlashAmbig": true,
+ "Error": true,
+ "ErrorCode": true,
+ "FuncMap": true,
+ "HTML": true,
+ "HTMLAttr": true,
+ "HTMLEscape": true,
+ "HTMLEscapeString": true,
+ "HTMLEscaper": true,
+ "IsTrue": true,
+ "JS": true,
+ "JSEscape": true,
+ "JSEscapeString": true,
+ "JSEscaper": true,
+ "JSStr": true,
+ "Must": true,
+ "New": true,
+ "OK": true,
+ "ParseFiles": true,
+ "ParseGlob": true,
+ "Srcset": true,
+ "Template": true,
+ "URL": true,
+ "URLQueryEscaper": true,
+ },
+ "image": map[string]bool{
+ "Alpha": true,
+ "Alpha16": true,
+ "Black": true,
+ "CMYK": true,
+ "Config": true,
+ "Decode": true,
+ "DecodeConfig": true,
+ "ErrFormat": true,
+ "Gray": true,
+ "Gray16": true,
+ "Image": true,
+ "NRGBA": true,
+ "NRGBA64": true,
+ "NYCbCrA": true,
+ "NewAlpha": true,
+ "NewAlpha16": true,
+ "NewCMYK": true,
+ "NewGray": true,
+ "NewGray16": true,
+ "NewNRGBA": true,
+ "NewNRGBA64": true,
+ "NewNYCbCrA": true,
+ "NewPaletted": true,
+ "NewRGBA": true,
+ "NewRGBA64": true,
+ "NewUniform": true,
+ "NewYCbCr": true,
+ "Opaque": true,
+ "Paletted": true,
+ "PalettedImage": true,
+ "Point": true,
+ "Pt": true,
+ "RGBA": true,
+ "RGBA64": true,
+ "Rect": true,
+ "Rectangle": true,
+ "RegisterFormat": true,
+ "Transparent": true,
+ "Uniform": true,
+ "White": true,
+ "YCbCr": true,
+ "YCbCrSubsampleRatio": true,
+ "YCbCrSubsampleRatio410": true,
+ "YCbCrSubsampleRatio411": true,
+ "YCbCrSubsampleRatio420": true,
+ "YCbCrSubsampleRatio422": true,
+ "YCbCrSubsampleRatio440": true,
+ "YCbCrSubsampleRatio444": true,
+ "ZP": true,
+ "ZR": true,
+ },
+ "image/color": map[string]bool{
+ "Alpha": true,
+ "Alpha16": true,
+ "Alpha16Model": true,
+ "AlphaModel": true,
+ "Black": true,
+ "CMYK": true,
+ "CMYKModel": true,
+ "CMYKToRGB": true,
+ "Color": true,
+ "Gray": true,
+ "Gray16": true,
+ "Gray16Model": true,
+ "GrayModel": true,
+ "Model": true,
+ "ModelFunc": true,
+ "NRGBA": true,
+ "NRGBA64": true,
+ "NRGBA64Model": true,
+ "NRGBAModel": true,
+ "NYCbCrA": true,
+ "NYCbCrAModel": true,
+ "Opaque": true,
+ "Palette": true,
+ "RGBA": true,
+ "RGBA64": true,
+ "RGBA64Model": true,
+ "RGBAModel": true,
+ "RGBToCMYK": true,
+ "RGBToYCbCr": true,
+ "Transparent": true,
+ "White": true,
+ "YCbCr": true,
+ "YCbCrModel": true,
+ "YCbCrToRGB": true,
+ },
+ "image/color/palette": map[string]bool{
+ "Plan9": true,
+ "WebSafe": true,
+ },
+ "image/draw": map[string]bool{
+ "Draw": true,
+ "DrawMask": true,
+ "Drawer": true,
+ "FloydSteinberg": true,
+ "Image": true,
+ "Op": true,
+ "Over": true,
+ "Quantizer": true,
+ "Src": true,
+ },
+ "image/gif": map[string]bool{
+ "Decode": true,
+ "DecodeAll": true,
+ "DecodeConfig": true,
+ "DisposalBackground": true,
+ "DisposalNone": true,
+ "DisposalPrevious": true,
+ "Encode": true,
+ "EncodeAll": true,
+ "GIF": true,
+ "Options": true,
+ },
+ "image/jpeg": map[string]bool{
+ "Decode": true,
+ "DecodeConfig": true,
+ "DefaultQuality": true,
+ "Encode": true,
+ "FormatError": true,
+ "Options": true,
+ "Reader": true,
+ "UnsupportedError": true,
+ },
+ "image/png": map[string]bool{
+ "BestCompression": true,
+ "BestSpeed": true,
+ "CompressionLevel": true,
+ "Decode": true,
+ "DecodeConfig": true,
+ "DefaultCompression": true,
+ "Encode": true,
+ "Encoder": true,
+ "EncoderBuffer": true,
+ "EncoderBufferPool": true,
+ "FormatError": true,
+ "NoCompression": true,
+ "UnsupportedError": true,
+ },
+ "index/suffixarray": map[string]bool{
+ "Index": true,
+ "New": true,
+ },
+ "io": map[string]bool{
+ "ByteReader": true,
+ "ByteScanner": true,
+ "ByteWriter": true,
+ "Closer": true,
+ "Copy": true,
+ "CopyBuffer": true,
+ "CopyN": true,
+ "EOF": true,
+ "ErrClosedPipe": true,
+ "ErrNoProgress": true,
+ "ErrShortBuffer": true,
+ "ErrShortWrite": true,
+ "ErrUnexpectedEOF": true,
+ "LimitReader": true,
+ "LimitedReader": true,
+ "MultiReader": true,
+ "MultiWriter": true,
+ "NewSectionReader": true,
+ "Pipe": true,
+ "PipeReader": true,
+ "PipeWriter": true,
+ "ReadAtLeast": true,
+ "ReadCloser": true,
+ "ReadFull": true,
+ "ReadSeeker": true,
+ "ReadWriteCloser": true,
+ "ReadWriteSeeker": true,
+ "ReadWriter": true,
+ "Reader": true,
+ "ReaderAt": true,
+ "ReaderFrom": true,
+ "RuneReader": true,
+ "RuneScanner": true,
+ "SectionReader": true,
+ "SeekCurrent": true,
+ "SeekEnd": true,
+ "SeekStart": true,
+ "Seeker": true,
+ "StringWriter": true,
+ "TeeReader": true,
+ "WriteCloser": true,
+ "WriteSeeker": true,
+ "WriteString": true,
+ "Writer": true,
+ "WriterAt": true,
+ "WriterTo": true,
+ },
+ "io/ioutil": map[string]bool{
+ "Discard": true,
+ "NopCloser": true,
+ "ReadAll": true,
+ "ReadDir": true,
+ "ReadFile": true,
+ "TempDir": true,
+ "TempFile": true,
+ "WriteFile": true,
+ },
+ "log": map[string]bool{
+ "Fatal": true,
+ "Fatalf": true,
+ "Fatalln": true,
+ "Flags": true,
+ "LUTC": true,
+ "Ldate": true,
+ "Llongfile": true,
+ "Lmicroseconds": true,
+ "Logger": true,
+ "Lshortfile": true,
+ "LstdFlags": true,
+ "Ltime": true,
+ "New": true,
+ "Output": true,
+ "Panic": true,
+ "Panicf": true,
+ "Panicln": true,
+ "Prefix": true,
+ "Print": true,
+ "Printf": true,
+ "Println": true,
+ "SetFlags": true,
+ "SetOutput": true,
+ "SetPrefix": true,
+ },
+ "log/syslog": map[string]bool{
+ "Dial": true,
+ "LOG_ALERT": true,
+ "LOG_AUTH": true,
+ "LOG_AUTHPRIV": true,
+ "LOG_CRIT": true,
+ "LOG_CRON": true,
+ "LOG_DAEMON": true,
+ "LOG_DEBUG": true,
+ "LOG_EMERG": true,
+ "LOG_ERR": true,
+ "LOG_FTP": true,
+ "LOG_INFO": true,
+ "LOG_KERN": true,
+ "LOG_LOCAL0": true,
+ "LOG_LOCAL1": true,
+ "LOG_LOCAL2": true,
+ "LOG_LOCAL3": true,
+ "LOG_LOCAL4": true,
+ "LOG_LOCAL5": true,
+ "LOG_LOCAL6": true,
+ "LOG_LOCAL7": true,
+ "LOG_LPR": true,
+ "LOG_MAIL": true,
+ "LOG_NEWS": true,
+ "LOG_NOTICE": true,
+ "LOG_SYSLOG": true,
+ "LOG_USER": true,
+ "LOG_UUCP": true,
+ "LOG_WARNING": true,
+ "New": true,
+ "NewLogger": true,
+ "Priority": true,
+ "Writer": true,
+ },
+ "math": map[string]bool{
+ "Abs": true,
+ "Acos": true,
+ "Acosh": true,
+ "Asin": true,
+ "Asinh": true,
+ "Atan": true,
+ "Atan2": true,
+ "Atanh": true,
+ "Cbrt": true,
+ "Ceil": true,
+ "Copysign": true,
+ "Cos": true,
+ "Cosh": true,
+ "Dim": true,
+ "E": true,
+ "Erf": true,
+ "Erfc": true,
+ "Erfcinv": true,
+ "Erfinv": true,
+ "Exp": true,
+ "Exp2": true,
+ "Expm1": true,
+ "Float32bits": true,
+ "Float32frombits": true,
+ "Float64bits": true,
+ "Float64frombits": true,
+ "Floor": true,
+ "Frexp": true,
+ "Gamma": true,
+ "Hypot": true,
+ "Ilogb": true,
+ "Inf": true,
+ "IsInf": true,
+ "IsNaN": true,
+ "J0": true,
+ "J1": true,
+ "Jn": true,
+ "Ldexp": true,
+ "Lgamma": true,
+ "Ln10": true,
+ "Ln2": true,
+ "Log": true,
+ "Log10": true,
+ "Log10E": true,
+ "Log1p": true,
+ "Log2": true,
+ "Log2E": true,
+ "Logb": true,
+ "Max": true,
+ "MaxFloat32": true,
+ "MaxFloat64": true,
+ "MaxInt16": true,
+ "MaxInt32": true,
+ "MaxInt64": true,
+ "MaxInt8": true,
+ "MaxUint16": true,
+ "MaxUint32": true,
+ "MaxUint64": true,
+ "MaxUint8": true,
+ "Min": true,
+ "MinInt16": true,
+ "MinInt32": true,
+ "MinInt64": true,
+ "MinInt8": true,
+ "Mod": true,
+ "Modf": true,
+ "NaN": true,
+ "Nextafter": true,
+ "Nextafter32": true,
+ "Phi": true,
+ "Pi": true,
+ "Pow": true,
+ "Pow10": true,
+ "Remainder": true,
+ "Round": true,
+ "RoundToEven": true,
+ "Signbit": true,
+ "Sin": true,
+ "Sincos": true,
+ "Sinh": true,
+ "SmallestNonzeroFloat32": true,
+ "SmallestNonzeroFloat64": true,
+ "Sqrt": true,
+ "Sqrt2": true,
+ "SqrtE": true,
+ "SqrtPhi": true,
+ "SqrtPi": true,
+ "Tan": true,
+ "Tanh": true,
+ "Trunc": true,
+ "Y0": true,
+ "Y1": true,
+ "Yn": true,
+ },
+ "math/big": map[string]bool{
+ "Above": true,
+ "Accuracy": true,
+ "AwayFromZero": true,
+ "Below": true,
+ "ErrNaN": true,
+ "Exact": true,
+ "Float": true,
+ "Int": true,
+ "Jacobi": true,
+ "MaxBase": true,
+ "MaxExp": true,
+ "MaxPrec": true,
+ "MinExp": true,
+ "NewFloat": true,
+ "NewInt": true,
+ "NewRat": true,
+ "ParseFloat": true,
+ "Rat": true,
+ "RoundingMode": true,
+ "ToNearestAway": true,
+ "ToNearestEven": true,
+ "ToNegativeInf": true,
+ "ToPositiveInf": true,
+ "ToZero": true,
+ "Word": true,
+ },
+ "math/bits": map[string]bool{
+ "Add": true,
+ "Add32": true,
+ "Add64": true,
+ "Div": true,
+ "Div32": true,
+ "Div64": true,
+ "LeadingZeros": true,
+ "LeadingZeros16": true,
+ "LeadingZeros32": true,
+ "LeadingZeros64": true,
+ "LeadingZeros8": true,
+ "Len": true,
+ "Len16": true,
+ "Len32": true,
+ "Len64": true,
+ "Len8": true,
+ "Mul": true,
+ "Mul32": true,
+ "Mul64": true,
+ "OnesCount": true,
+ "OnesCount16": true,
+ "OnesCount32": true,
+ "OnesCount64": true,
+ "OnesCount8": true,
+ "Reverse": true,
+ "Reverse16": true,
+ "Reverse32": true,
+ "Reverse64": true,
+ "Reverse8": true,
+ "ReverseBytes": true,
+ "ReverseBytes16": true,
+ "ReverseBytes32": true,
+ "ReverseBytes64": true,
+ "RotateLeft": true,
+ "RotateLeft16": true,
+ "RotateLeft32": true,
+ "RotateLeft64": true,
+ "RotateLeft8": true,
+ "Sub": true,
+ "Sub32": true,
+ "Sub64": true,
+ "TrailingZeros": true,
+ "TrailingZeros16": true,
+ "TrailingZeros32": true,
+ "TrailingZeros64": true,
+ "TrailingZeros8": true,
+ "UintSize": true,
+ },
+ "math/cmplx": map[string]bool{
+ "Abs": true,
+ "Acos": true,
+ "Acosh": true,
+ "Asin": true,
+ "Asinh": true,
+ "Atan": true,
+ "Atanh": true,
+ "Conj": true,
+ "Cos": true,
+ "Cosh": true,
+ "Cot": true,
+ "Exp": true,
+ "Inf": true,
+ "IsInf": true,
+ "IsNaN": true,
+ "Log": true,
+ "Log10": true,
+ "NaN": true,
+ "Phase": true,
+ "Polar": true,
+ "Pow": true,
+ "Rect": true,
+ "Sin": true,
+ "Sinh": true,
+ "Sqrt": true,
+ "Tan": true,
+ "Tanh": true,
+ },
+ "math/rand": map[string]bool{
+ "ExpFloat64": true,
+ "Float32": true,
+ "Float64": true,
+ "Int": true,
+ "Int31": true,
+ "Int31n": true,
+ "Int63": true,
+ "Int63n": true,
+ "Intn": true,
+ "New": true,
+ "NewSource": true,
+ "NewZipf": true,
+ "NormFloat64": true,
+ "Perm": true,
+ "Rand": true,
+ "Read": true,
+ "Seed": true,
+ "Shuffle": true,
+ "Source": true,
+ "Source64": true,
+ "Uint32": true,
+ "Uint64": true,
+ "Zipf": true,
+ },
+ "mime": map[string]bool{
+ "AddExtensionType": true,
+ "BEncoding": true,
+ "ErrInvalidMediaParameter": true,
+ "ExtensionsByType": true,
+ "FormatMediaType": true,
+ "ParseMediaType": true,
+ "QEncoding": true,
+ "TypeByExtension": true,
+ "WordDecoder": true,
+ "WordEncoder": true,
+ },
+ "mime/multipart": map[string]bool{
+ "ErrMessageTooLarge": true,
+ "File": true,
+ "FileHeader": true,
+ "Form": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "Part": true,
+ "Reader": true,
+ "Writer": true,
+ },
+ "mime/quotedprintable": map[string]bool{
+ "NewReader": true,
+ "NewWriter": true,
+ "Reader": true,
+ "Writer": true,
+ },
+ "net": map[string]bool{
+ "Addr": true,
+ "AddrError": true,
+ "Buffers": true,
+ "CIDRMask": true,
+ "Conn": true,
+ "DNSConfigError": true,
+ "DNSError": true,
+ "DefaultResolver": true,
+ "Dial": true,
+ "DialIP": true,
+ "DialTCP": true,
+ "DialTimeout": true,
+ "DialUDP": true,
+ "DialUnix": true,
+ "Dialer": true,
+ "ErrWriteToConnected": true,
+ "Error": true,
+ "FileConn": true,
+ "FileListener": true,
+ "FilePacketConn": true,
+ "FlagBroadcast": true,
+ "FlagLoopback": true,
+ "FlagMulticast": true,
+ "FlagPointToPoint": true,
+ "FlagUp": true,
+ "Flags": true,
+ "HardwareAddr": true,
+ "IP": true,
+ "IPAddr": true,
+ "IPConn": true,
+ "IPMask": true,
+ "IPNet": true,
+ "IPv4": true,
+ "IPv4Mask": true,
+ "IPv4allrouter": true,
+ "IPv4allsys": true,
+ "IPv4bcast": true,
+ "IPv4len": true,
+ "IPv4zero": true,
+ "IPv6interfacelocalallnodes": true,
+ "IPv6len": true,
+ "IPv6linklocalallnodes": true,
+ "IPv6linklocalallrouters": true,
+ "IPv6loopback": true,
+ "IPv6unspecified": true,
+ "IPv6zero": true,
+ "Interface": true,
+ "InterfaceAddrs": true,
+ "InterfaceByIndex": true,
+ "InterfaceByName": true,
+ "Interfaces": true,
+ "InvalidAddrError": true,
+ "JoinHostPort": true,
+ "Listen": true,
+ "ListenConfig": true,
+ "ListenIP": true,
+ "ListenMulticastUDP": true,
+ "ListenPacket": true,
+ "ListenTCP": true,
+ "ListenUDP": true,
+ "ListenUnix": true,
+ "ListenUnixgram": true,
+ "Listener": true,
+ "LookupAddr": true,
+ "LookupCNAME": true,
+ "LookupHost": true,
+ "LookupIP": true,
+ "LookupMX": true,
+ "LookupNS": true,
+ "LookupPort": true,
+ "LookupSRV": true,
+ "LookupTXT": true,
+ "MX": true,
+ "NS": true,
+ "OpError": true,
+ "PacketConn": true,
+ "ParseCIDR": true,
+ "ParseError": true,
+ "ParseIP": true,
+ "ParseMAC": true,
+ "Pipe": true,
+ "ResolveIPAddr": true,
+ "ResolveTCPAddr": true,
+ "ResolveUDPAddr": true,
+ "ResolveUnixAddr": true,
+ "Resolver": true,
+ "SRV": true,
+ "SplitHostPort": true,
+ "TCPAddr": true,
+ "TCPConn": true,
+ "TCPListener": true,
+ "UDPAddr": true,
+ "UDPConn": true,
+ "UnixAddr": true,
+ "UnixConn": true,
+ "UnixListener": true,
+ "UnknownNetworkError": true,
+ },
+ "net/http": map[string]bool{
+ "CanonicalHeaderKey": true,
+ "Client": true,
+ "CloseNotifier": true,
+ "ConnState": true,
+ "Cookie": true,
+ "CookieJar": true,
+ "DefaultClient": true,
+ "DefaultMaxHeaderBytes": true,
+ "DefaultMaxIdleConnsPerHost": true,
+ "DefaultServeMux": true,
+ "DefaultTransport": true,
+ "DetectContentType": true,
+ "Dir": true,
+ "ErrAbortHandler": true,
+ "ErrBodyNotAllowed": true,
+ "ErrBodyReadAfterClose": true,
+ "ErrContentLength": true,
+ "ErrHandlerTimeout": true,
+ "ErrHeaderTooLong": true,
+ "ErrHijacked": true,
+ "ErrLineTooLong": true,
+ "ErrMissingBoundary": true,
+ "ErrMissingContentLength": true,
+ "ErrMissingFile": true,
+ "ErrNoCookie": true,
+ "ErrNoLocation": true,
+ "ErrNotMultipart": true,
+ "ErrNotSupported": true,
+ "ErrServerClosed": true,
+ "ErrShortBody": true,
+ "ErrSkipAltProtocol": true,
+ "ErrUnexpectedTrailer": true,
+ "ErrUseLastResponse": true,
+ "ErrWriteAfterFlush": true,
+ "Error": true,
+ "File": true,
+ "FileServer": true,
+ "FileSystem": true,
+ "Flusher": true,
+ "Get": true,
+ "Handle": true,
+ "HandleFunc": true,
+ "Handler": true,
+ "HandlerFunc": true,
+ "Head": true,
+ "Header": true,
+ "Hijacker": true,
+ "ListenAndServe": true,
+ "ListenAndServeTLS": true,
+ "LocalAddrContextKey": true,
+ "MaxBytesReader": true,
+ "MethodConnect": true,
+ "MethodDelete": true,
+ "MethodGet": true,
+ "MethodHead": true,
+ "MethodOptions": true,
+ "MethodPatch": true,
+ "MethodPost": true,
+ "MethodPut": true,
+ "MethodTrace": true,
+ "NewFileTransport": true,
+ "NewRequest": true,
+ "NewServeMux": true,
+ "NoBody": true,
+ "NotFound": true,
+ "NotFoundHandler": true,
+ "ParseHTTPVersion": true,
+ "ParseTime": true,
+ "Post": true,
+ "PostForm": true,
+ "ProtocolError": true,
+ "ProxyFromEnvironment": true,
+ "ProxyURL": true,
+ "PushOptions": true,
+ "Pusher": true,
+ "ReadRequest": true,
+ "ReadResponse": true,
+ "Redirect": true,
+ "RedirectHandler": true,
+ "Request": true,
+ "Response": true,
+ "ResponseWriter": true,
+ "RoundTripper": true,
+ "SameSite": true,
+ "SameSiteDefaultMode": true,
+ "SameSiteLaxMode": true,
+ "SameSiteStrictMode": true,
+ "Serve": true,
+ "ServeContent": true,
+ "ServeFile": true,
+ "ServeMux": true,
+ "ServeTLS": true,
+ "Server": true,
+ "ServerContextKey": true,
+ "SetCookie": true,
+ "StateActive": true,
+ "StateClosed": true,
+ "StateHijacked": true,
+ "StateIdle": true,
+ "StateNew": true,
+ "StatusAccepted": true,
+ "StatusAlreadyReported": true,
+ "StatusBadGateway": true,
+ "StatusBadRequest": true,
+ "StatusConflict": true,
+ "StatusContinue": true,
+ "StatusCreated": true,
+ "StatusExpectationFailed": true,
+ "StatusFailedDependency": true,
+ "StatusForbidden": true,
+ "StatusFound": true,
+ "StatusGatewayTimeout": true,
+ "StatusGone": true,
+ "StatusHTTPVersionNotSupported": true,
+ "StatusIMUsed": true,
+ "StatusInsufficientStorage": true,
+ "StatusInternalServerError": true,
+ "StatusLengthRequired": true,
+ "StatusLocked": true,
+ "StatusLoopDetected": true,
+ "StatusMethodNotAllowed": true,
+ "StatusMisdirectedRequest": true,
+ "StatusMovedPermanently": true,
+ "StatusMultiStatus": true,
+ "StatusMultipleChoices": true,
+ "StatusNetworkAuthenticationRequired": true,
+ "StatusNoContent": true,
+ "StatusNonAuthoritativeInfo": true,
+ "StatusNotAcceptable": true,
+ "StatusNotExtended": true,
+ "StatusNotFound": true,
+ "StatusNotImplemented": true,
+ "StatusNotModified": true,
+ "StatusOK": true,
+ "StatusPartialContent": true,
+ "StatusPaymentRequired": true,
+ "StatusPermanentRedirect": true,
+ "StatusPreconditionFailed": true,
+ "StatusPreconditionRequired": true,
+ "StatusProcessing": true,
+ "StatusProxyAuthRequired": true,
+ "StatusRequestEntityTooLarge": true,
+ "StatusRequestHeaderFieldsTooLarge": true,
+ "StatusRequestTimeout": true,
+ "StatusRequestURITooLong": true,
+ "StatusRequestedRangeNotSatisfiable": true,
+ "StatusResetContent": true,
+ "StatusSeeOther": true,
+ "StatusServiceUnavailable": true,
+ "StatusSwitchingProtocols": true,
+ "StatusTeapot": true,
+ "StatusTemporaryRedirect": true,
+ "StatusText": true,
+ "StatusTooEarly": true,
+ "StatusTooManyRequests": true,
+ "StatusUnauthorized": true,
+ "StatusUnavailableForLegalReasons": true,
+ "StatusUnprocessableEntity": true,
+ "StatusUnsupportedMediaType": true,
+ "StatusUpgradeRequired": true,
+ "StatusUseProxy": true,
+ "StatusVariantAlsoNegotiates": true,
+ "StripPrefix": true,
+ "TimeFormat": true,
+ "TimeoutHandler": true,
+ "TrailerPrefix": true,
+ "Transport": true,
+ },
+ "net/http/cgi": map[string]bool{
+ "Handler": true,
+ "Request": true,
+ "RequestFromMap": true,
+ "Serve": true,
+ },
+ "net/http/cookiejar": map[string]bool{
+ "Jar": true,
+ "New": true,
+ "Options": true,
+ "PublicSuffixList": true,
+ },
+ "net/http/fcgi": map[string]bool{
+ "ErrConnClosed": true,
+ "ErrRequestAborted": true,
+ "ProcessEnv": true,
+ "Serve": true,
+ },
+ "net/http/httptest": map[string]bool{
+ "DefaultRemoteAddr": true,
+ "NewRecorder": true,
+ "NewRequest": true,
+ "NewServer": true,
+ "NewTLSServer": true,
+ "NewUnstartedServer": true,
+ "ResponseRecorder": true,
+ "Server": true,
+ },
+ "net/http/httptrace": map[string]bool{
+ "ClientTrace": true,
+ "ContextClientTrace": true,
+ "DNSDoneInfo": true,
+ "DNSStartInfo": true,
+ "GotConnInfo": true,
+ "WithClientTrace": true,
+ "WroteRequestInfo": true,
+ },
+ "net/http/httputil": map[string]bool{
+ "BufferPool": true,
+ "ClientConn": true,
+ "DumpRequest": true,
+ "DumpRequestOut": true,
+ "DumpResponse": true,
+ "ErrClosed": true,
+ "ErrLineTooLong": true,
+ "ErrPersistEOF": true,
+ "ErrPipeline": true,
+ "NewChunkedReader": true,
+ "NewChunkedWriter": true,
+ "NewClientConn": true,
+ "NewProxyClientConn": true,
+ "NewServerConn": true,
+ "NewSingleHostReverseProxy": true,
+ "ReverseProxy": true,
+ "ServerConn": true,
+ },
+ "net/http/pprof": map[string]bool{
+ "Cmdline": true,
+ "Handler": true,
+ "Index": true,
+ "Profile": true,
+ "Symbol": true,
+ "Trace": true,
+ },
+ "net/mail": map[string]bool{
+ "Address": true,
+ "AddressParser": true,
+ "ErrHeaderNotPresent": true,
+ "Header": true,
+ "Message": true,
+ "ParseAddress": true,
+ "ParseAddressList": true,
+ "ParseDate": true,
+ "ReadMessage": true,
+ },
+ "net/rpc": map[string]bool{
+ "Accept": true,
+ "Call": true,
+ "Client": true,
+ "ClientCodec": true,
+ "DefaultDebugPath": true,
+ "DefaultRPCPath": true,
+ "DefaultServer": true,
+ "Dial": true,
+ "DialHTTP": true,
+ "DialHTTPPath": true,
+ "ErrShutdown": true,
+ "HandleHTTP": true,
+ "NewClient": true,
+ "NewClientWithCodec": true,
+ "NewServer": true,
+ "Register": true,
+ "RegisterName": true,
+ "Request": true,
+ "Response": true,
+ "ServeCodec": true,
+ "ServeConn": true,
+ "ServeRequest": true,
+ "Server": true,
+ "ServerCodec": true,
+ "ServerError": true,
+ },
+ "net/rpc/jsonrpc": map[string]bool{
+ "Dial": true,
+ "NewClient": true,
+ "NewClientCodec": true,
+ "NewServerCodec": true,
+ "ServeConn": true,
+ },
+ "net/smtp": map[string]bool{
+ "Auth": true,
+ "CRAMMD5Auth": true,
+ "Client": true,
+ "Dial": true,
+ "NewClient": true,
+ "PlainAuth": true,
+ "SendMail": true,
+ "ServerInfo": true,
+ },
+ "net/textproto": map[string]bool{
+ "CanonicalMIMEHeaderKey": true,
+ "Conn": true,
+ "Dial": true,
+ "Error": true,
+ "MIMEHeader": true,
+ "NewConn": true,
+ "NewReader": true,
+ "NewWriter": true,
+ "Pipeline": true,
+ "ProtocolError": true,
+ "Reader": true,
+ "TrimBytes": true,
+ "TrimString": true,
+ "Writer": true,
+ },
+ "net/url": map[string]bool{
+ "Error": true,
+ "EscapeError": true,
+ "InvalidHostError": true,
+ "Parse": true,
+ "ParseQuery": true,
+ "ParseRequestURI": true,
+ "PathEscape": true,
+ "PathUnescape": true,
+ "QueryEscape": true,
+ "QueryUnescape": true,
+ "URL": true,
+ "User": true,
+ "UserPassword": true,
+ "Userinfo": true,
+ "Values": true,
+ },
+ "os": map[string]bool{
+ "Args": true,
+ "Chdir": true,
+ "Chmod": true,
+ "Chown": true,
+ "Chtimes": true,
+ "Clearenv": true,
+ "Create": true,
+ "DevNull": true,
+ "Environ": true,
+ "ErrClosed": true,
+ "ErrExist": true,
+ "ErrInvalid": true,
+ "ErrNoDeadline": true,
+ "ErrNotExist": true,
+ "ErrPermission": true,
+ "Executable": true,
+ "Exit": true,
+ "Expand": true,
+ "ExpandEnv": true,
+ "File": true,
+ "FileInfo": true,
+ "FileMode": true,
+ "FindProcess": true,
+ "Getegid": true,
+ "Getenv": true,
+ "Geteuid": true,
+ "Getgid": true,
+ "Getgroups": true,
+ "Getpagesize": true,
+ "Getpid": true,
+ "Getppid": true,
+ "Getuid": true,
+ "Getwd": true,
+ "Hostname": true,
+ "Interrupt": true,
+ "IsExist": true,
+ "IsNotExist": true,
+ "IsPathSeparator": true,
+ "IsPermission": true,
+ "IsTimeout": true,
+ "Kill": true,
+ "Lchown": true,
+ "Link": true,
+ "LinkError": true,
+ "LookupEnv": true,
+ "Lstat": true,
+ "Mkdir": true,
+ "MkdirAll": true,
+ "ModeAppend": true,
+ "ModeCharDevice": true,
+ "ModeDevice": true,
+ "ModeDir": true,
+ "ModeExclusive": true,
+ "ModeIrregular": true,
+ "ModeNamedPipe": true,
+ "ModePerm": true,
+ "ModeSetgid": true,
+ "ModeSetuid": true,
+ "ModeSocket": true,
+ "ModeSticky": true,
+ "ModeSymlink": true,
+ "ModeTemporary": true,
+ "ModeType": true,
+ "NewFile": true,
+ "NewSyscallError": true,
+ "O_APPEND": true,
+ "O_CREATE": true,
+ "O_EXCL": true,
+ "O_RDONLY": true,
+ "O_RDWR": true,
+ "O_SYNC": true,
+ "O_TRUNC": true,
+ "O_WRONLY": true,
+ "Open": true,
+ "OpenFile": true,
+ "PathError": true,
+ "PathListSeparator": true,
+ "PathSeparator": true,
+ "Pipe": true,
+ "ProcAttr": true,
+ "Process": true,
+ "ProcessState": true,
+ "Readlink": true,
+ "Remove": true,
+ "RemoveAll": true,
+ "Rename": true,
+ "SEEK_CUR": true,
+ "SEEK_END": true,
+ "SEEK_SET": true,
+ "SameFile": true,
+ "Setenv": true,
+ "Signal": true,
+ "StartProcess": true,
+ "Stat": true,
+ "Stderr": true,
+ "Stdin": true,
+ "Stdout": true,
+ "Symlink": true,
+ "SyscallError": true,
+ "TempDir": true,
+ "Truncate": true,
+ "Unsetenv": true,
+ "UserCacheDir": true,
+ "UserHomeDir": true,
+ },
+ "os/exec": map[string]bool{
+ "Cmd": true,
+ "Command": true,
+ "CommandContext": true,
+ "ErrNotFound": true,
+ "Error": true,
+ "ExitError": true,
+ "LookPath": true,
+ },
+ "os/signal": map[string]bool{
+ "Ignore": true,
+ "Ignored": true,
+ "Notify": true,
+ "Reset": true,
+ "Stop": true,
+ },
+ "os/user": map[string]bool{
+ "Current": true,
+ "Group": true,
+ "Lookup": true,
+ "LookupGroup": true,
+ "LookupGroupId": true,
+ "LookupId": true,
+ "UnknownGroupError": true,
+ "UnknownGroupIdError": true,
+ "UnknownUserError": true,
+ "UnknownUserIdError": true,
+ "User": true,
+ },
+ "path": map[string]bool{
+ "Base": true,
+ "Clean": true,
+ "Dir": true,
+ "ErrBadPattern": true,
+ "Ext": true,
+ "IsAbs": true,
+ "Join": true,
+ "Match": true,
+ "Split": true,
+ },
+ "path/filepath": map[string]bool{
+ "Abs": true,
+ "Base": true,
+ "Clean": true,
+ "Dir": true,
+ "ErrBadPattern": true,
+ "EvalSymlinks": true,
+ "Ext": true,
+ "FromSlash": true,
+ "Glob": true,
+ "HasPrefix": true,
+ "IsAbs": true,
+ "Join": true,
+ "ListSeparator": true,
+ "Match": true,
+ "Rel": true,
+ "Separator": true,
+ "SkipDir": true,
+ "Split": true,
+ "SplitList": true,
+ "ToSlash": true,
+ "VolumeName": true,
+ "Walk": true,
+ "WalkFunc": true,
+ },
+ "plugin": map[string]bool{
+ "Open": true,
+ "Plugin": true,
+ "Symbol": true,
+ },
+ "reflect": map[string]bool{
+ "Append": true,
+ "AppendSlice": true,
+ "Array": true,
+ "ArrayOf": true,
+ "Bool": true,
+ "BothDir": true,
+ "Chan": true,
+ "ChanDir": true,
+ "ChanOf": true,
+ "Complex128": true,
+ "Complex64": true,
+ "Copy": true,
+ "DeepEqual": true,
+ "Float32": true,
+ "Float64": true,
+ "Func": true,
+ "FuncOf": true,
+ "Indirect": true,
+ "Int": true,
+ "Int16": true,
+ "Int32": true,
+ "Int64": true,
+ "Int8": true,
+ "Interface": true,
+ "Invalid": true,
+ "Kind": true,
+ "MakeChan": true,
+ "MakeFunc": true,
+ "MakeMap": true,
+ "MakeMapWithSize": true,
+ "MakeSlice": true,
+ "Map": true,
+ "MapIter": true,
+ "MapOf": true,
+ "Method": true,
+ "New": true,
+ "NewAt": true,
+ "Ptr": true,
+ "PtrTo": true,
+ "RecvDir": true,
+ "Select": true,
+ "SelectCase": true,
+ "SelectDefault": true,
+ "SelectDir": true,
+ "SelectRecv": true,
+ "SelectSend": true,
+ "SendDir": true,
+ "Slice": true,
+ "SliceHeader": true,
+ "SliceOf": true,
+ "String": true,
+ "StringHeader": true,
+ "Struct": true,
+ "StructField": true,
+ "StructOf": true,
+ "StructTag": true,
+ "Swapper": true,
+ "TypeOf": true,
+ "Uint": true,
+ "Uint16": true,
+ "Uint32": true,
+ "Uint64": true,
+ "Uint8": true,
+ "Uintptr": true,
+ "UnsafePointer": true,
+ "Value": true,
+ "ValueError": true,
+ "ValueOf": true,
+ "Zero": true,
+ },
+ "regexp": map[string]bool{
+ "Compile": true,
+ "CompilePOSIX": true,
+ "Match": true,
+ "MatchReader": true,
+ "MatchString": true,
+ "MustCompile": true,
+ "MustCompilePOSIX": true,
+ "QuoteMeta": true,
+ "Regexp": true,
+ },
+ "regexp/syntax": map[string]bool{
+ "ClassNL": true,
+ "Compile": true,
+ "DotNL": true,
+ "EmptyBeginLine": true,
+ "EmptyBeginText": true,
+ "EmptyEndLine": true,
+ "EmptyEndText": true,
+ "EmptyNoWordBoundary": true,
+ "EmptyOp": true,
+ "EmptyOpContext": true,
+ "EmptyWordBoundary": true,
+ "ErrInternalError": true,
+ "ErrInvalidCharClass": true,
+ "ErrInvalidCharRange": true,
+ "ErrInvalidEscape": true,
+ "ErrInvalidNamedCapture": true,
+ "ErrInvalidPerlOp": true,
+ "ErrInvalidRepeatOp": true,
+ "ErrInvalidRepeatSize": true,
+ "ErrInvalidUTF8": true,
+ "ErrMissingBracket": true,
+ "ErrMissingParen": true,
+ "ErrMissingRepeatArgument": true,
+ "ErrTrailingBackslash": true,
+ "ErrUnexpectedParen": true,
+ "Error": true,
+ "ErrorCode": true,
+ "Flags": true,
+ "FoldCase": true,
+ "Inst": true,
+ "InstAlt": true,
+ "InstAltMatch": true,
+ "InstCapture": true,
+ "InstEmptyWidth": true,
+ "InstFail": true,
+ "InstMatch": true,
+ "InstNop": true,
+ "InstOp": true,
+ "InstRune": true,
+ "InstRune1": true,
+ "InstRuneAny": true,
+ "InstRuneAnyNotNL": true,
+ "IsWordChar": true,
+ "Literal": true,
+ "MatchNL": true,
+ "NonGreedy": true,
+ "OneLine": true,
+ "Op": true,
+ "OpAlternate": true,
+ "OpAnyChar": true,
+ "OpAnyCharNotNL": true,
+ "OpBeginLine": true,
+ "OpBeginText": true,
+ "OpCapture": true,
+ "OpCharClass": true,
+ "OpConcat": true,
+ "OpEmptyMatch": true,
+ "OpEndLine": true,
+ "OpEndText": true,
+ "OpLiteral": true,
+ "OpNoMatch": true,
+ "OpNoWordBoundary": true,
+ "OpPlus": true,
+ "OpQuest": true,
+ "OpRepeat": true,
+ "OpStar": true,
+ "OpWordBoundary": true,
+ "POSIX": true,
+ "Parse": true,
+ "Perl": true,
+ "PerlX": true,
+ "Prog": true,
+ "Regexp": true,
+ "Simple": true,
+ "UnicodeGroups": true,
+ "WasDollar": true,
+ },
+ "runtime": map[string]bool{
+ "BlockProfile": true,
+ "BlockProfileRecord": true,
+ "Breakpoint": true,
+ "CPUProfile": true,
+ "Caller": true,
+ "Callers": true,
+ "CallersFrames": true,
+ "Compiler": true,
+ "Error": true,
+ "Frame": true,
+ "Frames": true,
+ "Func": true,
+ "FuncForPC": true,
+ "GC": true,
+ "GOARCH": true,
+ "GOMAXPROCS": true,
+ "GOOS": true,
+ "GOROOT": true,
+ "Goexit": true,
+ "GoroutineProfile": true,
+ "Gosched": true,
+ "KeepAlive": true,
+ "LockOSThread": true,
+ "MemProfile": true,
+ "MemProfileRate": true,
+ "MemProfileRecord": true,
+ "MemStats": true,
+ "MutexProfile": true,
+ "NumCPU": true,
+ "NumCgoCall": true,
+ "NumGoroutine": true,
+ "ReadMemStats": true,
+ "ReadTrace": true,
+ "SetBlockProfileRate": true,
+ "SetCPUProfileRate": true,
+ "SetCgoTraceback": true,
+ "SetFinalizer": true,
+ "SetMutexProfileFraction": true,
+ "Stack": true,
+ "StackRecord": true,
+ "StartTrace": true,
+ "StopTrace": true,
+ "ThreadCreateProfile": true,
+ "TypeAssertionError": true,
+ "UnlockOSThread": true,
+ "Version": true,
+ },
+ "runtime/debug": map[string]bool{
+ "BuildInfo": true,
+ "FreeOSMemory": true,
+ "GCStats": true,
+ "Module": true,
+ "PrintStack": true,
+ "ReadBuildInfo": true,
+ "ReadGCStats": true,
+ "SetGCPercent": true,
+ "SetMaxStack": true,
+ "SetMaxThreads": true,
+ "SetPanicOnFault": true,
+ "SetTraceback": true,
+ "Stack": true,
+ "WriteHeapDump": true,
+ },
+ "runtime/pprof": map[string]bool{
+ "Do": true,
+ "ForLabels": true,
+ "Label": true,
+ "LabelSet": true,
+ "Labels": true,
+ "Lookup": true,
+ "NewProfile": true,
+ "Profile": true,
+ "Profiles": true,
+ "SetGoroutineLabels": true,
+ "StartCPUProfile": true,
+ "StopCPUProfile": true,
+ "WithLabels": true,
+ "WriteHeapProfile": true,
+ },
+ "runtime/trace": map[string]bool{
+ "IsEnabled": true,
+ "Log": true,
+ "Logf": true,
+ "NewTask": true,
+ "Region": true,
+ "Start": true,
+ "StartRegion": true,
+ "Stop": true,
+ "Task": true,
+ "WithRegion": true,
+ },
+ "sort": map[string]bool{
+ "Float64Slice": true,
+ "Float64s": true,
+ "Float64sAreSorted": true,
+ "IntSlice": true,
+ "Interface": true,
+ "Ints": true,
+ "IntsAreSorted": true,
+ "IsSorted": true,
+ "Reverse": true,
+ "Search": true,
+ "SearchFloat64s": true,
+ "SearchInts": true,
+ "SearchStrings": true,
+ "Slice": true,
+ "SliceIsSorted": true,
+ "SliceStable": true,
+ "Sort": true,
+ "Stable": true,
+ "StringSlice": true,
+ "Strings": true,
+ "StringsAreSorted": true,
+ },
+ "strconv": map[string]bool{
+ "AppendBool": true,
+ "AppendFloat": true,
+ "AppendInt": true,
+ "AppendQuote": true,
+ "AppendQuoteRune": true,
+ "AppendQuoteRuneToASCII": true,
+ "AppendQuoteRuneToGraphic": true,
+ "AppendQuoteToASCII": true,
+ "AppendQuoteToGraphic": true,
+ "AppendUint": true,
+ "Atoi": true,
+ "CanBackquote": true,
+ "ErrRange": true,
+ "ErrSyntax": true,
+ "FormatBool": true,
+ "FormatFloat": true,
+ "FormatInt": true,
+ "FormatUint": true,
+ "IntSize": true,
+ "IsGraphic": true,
+ "IsPrint": true,
+ "Itoa": true,
+ "NumError": true,
+ "ParseBool": true,
+ "ParseFloat": true,
+ "ParseInt": true,
+ "ParseUint": true,
+ "Quote": true,
+ "QuoteRune": true,
+ "QuoteRuneToASCII": true,
+ "QuoteRuneToGraphic": true,
+ "QuoteToASCII": true,
+ "QuoteToGraphic": true,
+ "Unquote": true,
+ "UnquoteChar": true,
+ },
+ "strings": map[string]bool{
+ "Builder": true,
+ "Compare": true,
+ "Contains": true,
+ "ContainsAny": true,
+ "ContainsRune": true,
+ "Count": true,
+ "EqualFold": true,
+ "Fields": true,
+ "FieldsFunc": true,
+ "HasPrefix": true,
+ "HasSuffix": true,
+ "Index": true,
+ "IndexAny": true,
+ "IndexByte": true,
+ "IndexFunc": true,
+ "IndexRune": true,
+ "Join": true,
+ "LastIndex": true,
+ "LastIndexAny": true,
+ "LastIndexByte": true,
+ "LastIndexFunc": true,
+ "Map": true,
+ "NewReader": true,
+ "NewReplacer": true,
+ "Reader": true,
+ "Repeat": true,
+ "Replace": true,
+ "ReplaceAll": true,
+ "Replacer": true,
+ "Split": true,
+ "SplitAfter": true,
+ "SplitAfterN": true,
+ "SplitN": true,
+ "Title": true,
+ "ToLower": true,
+ "ToLowerSpecial": true,
+ "ToTitle": true,
+ "ToTitleSpecial": true,
+ "ToUpper": true,
+ "ToUpperSpecial": true,
+ "Trim": true,
+ "TrimFunc": true,
+ "TrimLeft": true,
+ "TrimLeftFunc": true,
+ "TrimPrefix": true,
+ "TrimRight": true,
+ "TrimRightFunc": true,
+ "TrimSpace": true,
+ "TrimSuffix": true,
+ },
+ "sync": map[string]bool{
+ "Cond": true,
+ "Locker": true,
+ "Map": true,
+ "Mutex": true,
+ "NewCond": true,
+ "Once": true,
+ "Pool": true,
+ "RWMutex": true,
+ "WaitGroup": true,
+ },
+ "sync/atomic": map[string]bool{
+ "AddInt32": true,
+ "AddInt64": true,
+ "AddUint32": true,
+ "AddUint64": true,
+ "AddUintptr": true,
+ "CompareAndSwapInt32": true,
+ "CompareAndSwapInt64": true,
+ "CompareAndSwapPointer": true,
+ "CompareAndSwapUint32": true,
+ "CompareAndSwapUint64": true,
+ "CompareAndSwapUintptr": true,
+ "LoadInt32": true,
+ "LoadInt64": true,
+ "LoadPointer": true,
+ "LoadUint32": true,
+ "LoadUint64": true,
+ "LoadUintptr": true,
+ "StoreInt32": true,
+ "StoreInt64": true,
+ "StorePointer": true,
+ "StoreUint32": true,
+ "StoreUint64": true,
+ "StoreUintptr": true,
+ "SwapInt32": true,
+ "SwapInt64": true,
+ "SwapPointer": true,
+ "SwapUint32": true,
+ "SwapUint64": true,
+ "SwapUintptr": true,
+ "Value": true,
+ },
+ "syscall": map[string]bool{
+ "AF_ALG": true,
+ "AF_APPLETALK": true,
+ "AF_ARP": true,
+ "AF_ASH": true,
+ "AF_ATM": true,
+ "AF_ATMPVC": true,
+ "AF_ATMSVC": true,
+ "AF_AX25": true,
+ "AF_BLUETOOTH": true,
+ "AF_BRIDGE": true,
+ "AF_CAIF": true,
+ "AF_CAN": true,
+ "AF_CCITT": true,
+ "AF_CHAOS": true,
+ "AF_CNT": true,
+ "AF_COIP": true,
+ "AF_DATAKIT": true,
+ "AF_DECnet": true,
+ "AF_DLI": true,
+ "AF_E164": true,
+ "AF_ECMA": true,
+ "AF_ECONET": true,
+ "AF_ENCAP": true,
+ "AF_FILE": true,
+ "AF_HYLINK": true,
+ "AF_IEEE80211": true,
+ "AF_IEEE802154": true,
+ "AF_IMPLINK": true,
+ "AF_INET": true,
+ "AF_INET6": true,
+ "AF_INET6_SDP": true,
+ "AF_INET_SDP": true,
+ "AF_IPX": true,
+ "AF_IRDA": true,
+ "AF_ISDN": true,
+ "AF_ISO": true,
+ "AF_IUCV": true,
+ "AF_KEY": true,
+ "AF_LAT": true,
+ "AF_LINK": true,
+ "AF_LLC": true,
+ "AF_LOCAL": true,
+ "AF_MAX": true,
+ "AF_MPLS": true,
+ "AF_NATM": true,
+ "AF_NDRV": true,
+ "AF_NETBEUI": true,
+ "AF_NETBIOS": true,
+ "AF_NETGRAPH": true,
+ "AF_NETLINK": true,
+ "AF_NETROM": true,
+ "AF_NS": true,
+ "AF_OROUTE": true,
+ "AF_OSI": true,
+ "AF_PACKET": true,
+ "AF_PHONET": true,
+ "AF_PPP": true,
+ "AF_PPPOX": true,
+ "AF_PUP": true,
+ "AF_RDS": true,
+ "AF_RESERVED_36": true,
+ "AF_ROSE": true,
+ "AF_ROUTE": true,
+ "AF_RXRPC": true,
+ "AF_SCLUSTER": true,
+ "AF_SECURITY": true,
+ "AF_SIP": true,
+ "AF_SLOW": true,
+ "AF_SNA": true,
+ "AF_SYSTEM": true,
+ "AF_TIPC": true,
+ "AF_UNIX": true,
+ "AF_UNSPEC": true,
+ "AF_VENDOR00": true,
+ "AF_VENDOR01": true,
+ "AF_VENDOR02": true,
+ "AF_VENDOR03": true,
+ "AF_VENDOR04": true,
+ "AF_VENDOR05": true,
+ "AF_VENDOR06": true,
+ "AF_VENDOR07": true,
+ "AF_VENDOR08": true,
+ "AF_VENDOR09": true,
+ "AF_VENDOR10": true,
+ "AF_VENDOR11": true,
+ "AF_VENDOR12": true,
+ "AF_VENDOR13": true,
+ "AF_VENDOR14": true,
+ "AF_VENDOR15": true,
+ "AF_VENDOR16": true,
+ "AF_VENDOR17": true,
+ "AF_VENDOR18": true,
+ "AF_VENDOR19": true,
+ "AF_VENDOR20": true,
+ "AF_VENDOR21": true,
+ "AF_VENDOR22": true,
+ "AF_VENDOR23": true,
+ "AF_VENDOR24": true,
+ "AF_VENDOR25": true,
+ "AF_VENDOR26": true,
+ "AF_VENDOR27": true,
+ "AF_VENDOR28": true,
+ "AF_VENDOR29": true,
+ "AF_VENDOR30": true,
+ "AF_VENDOR31": true,
+ "AF_VENDOR32": true,
+ "AF_VENDOR33": true,
+ "AF_VENDOR34": true,
+ "AF_VENDOR35": true,
+ "AF_VENDOR36": true,
+ "AF_VENDOR37": true,
+ "AF_VENDOR38": true,
+ "AF_VENDOR39": true,
+ "AF_VENDOR40": true,
+ "AF_VENDOR41": true,
+ "AF_VENDOR42": true,
+ "AF_VENDOR43": true,
+ "AF_VENDOR44": true,
+ "AF_VENDOR45": true,
+ "AF_VENDOR46": true,
+ "AF_VENDOR47": true,
+ "AF_WANPIPE": true,
+ "AF_X25": true,
+ "AI_CANONNAME": true,
+ "AI_NUMERICHOST": true,
+ "AI_PASSIVE": true,
+ "APPLICATION_ERROR": true,
+ "ARPHRD_ADAPT": true,
+ "ARPHRD_APPLETLK": true,
+ "ARPHRD_ARCNET": true,
+ "ARPHRD_ASH": true,
+ "ARPHRD_ATM": true,
+ "ARPHRD_AX25": true,
+ "ARPHRD_BIF": true,
+ "ARPHRD_CHAOS": true,
+ "ARPHRD_CISCO": true,
+ "ARPHRD_CSLIP": true,
+ "ARPHRD_CSLIP6": true,
+ "ARPHRD_DDCMP": true,
+ "ARPHRD_DLCI": true,
+ "ARPHRD_ECONET": true,
+ "ARPHRD_EETHER": true,
+ "ARPHRD_ETHER": true,
+ "ARPHRD_EUI64": true,
+ "ARPHRD_FCAL": true,
+ "ARPHRD_FCFABRIC": true,
+ "ARPHRD_FCPL": true,
+ "ARPHRD_FCPP": true,
+ "ARPHRD_FDDI": true,
+ "ARPHRD_FRAD": true,
+ "ARPHRD_FRELAY": true,
+ "ARPHRD_HDLC": true,
+ "ARPHRD_HIPPI": true,
+ "ARPHRD_HWX25": true,
+ "ARPHRD_IEEE1394": true,
+ "ARPHRD_IEEE802": true,
+ "ARPHRD_IEEE80211": true,
+ "ARPHRD_IEEE80211_PRISM": true,
+ "ARPHRD_IEEE80211_RADIOTAP": true,
+ "ARPHRD_IEEE802154": true,
+ "ARPHRD_IEEE802154_PHY": true,
+ "ARPHRD_IEEE802_TR": true,
+ "ARPHRD_INFINIBAND": true,
+ "ARPHRD_IPDDP": true,
+ "ARPHRD_IPGRE": true,
+ "ARPHRD_IRDA": true,
+ "ARPHRD_LAPB": true,
+ "ARPHRD_LOCALTLK": true,
+ "ARPHRD_LOOPBACK": true,
+ "ARPHRD_METRICOM": true,
+ "ARPHRD_NETROM": true,
+ "ARPHRD_NONE": true,
+ "ARPHRD_PIMREG": true,
+ "ARPHRD_PPP": true,
+ "ARPHRD_PRONET": true,
+ "ARPHRD_RAWHDLC": true,
+ "ARPHRD_ROSE": true,
+ "ARPHRD_RSRVD": true,
+ "ARPHRD_SIT": true,
+ "ARPHRD_SKIP": true,
+ "ARPHRD_SLIP": true,
+ "ARPHRD_SLIP6": true,
+ "ARPHRD_STRIP": true,
+ "ARPHRD_TUNNEL": true,
+ "ARPHRD_TUNNEL6": true,
+ "ARPHRD_VOID": true,
+ "ARPHRD_X25": true,
+ "AUTHTYPE_CLIENT": true,
+ "AUTHTYPE_SERVER": true,
+ "Accept": true,
+ "Accept4": true,
+ "AcceptEx": true,
+ "Access": true,
+ "Acct": true,
+ "AddrinfoW": true,
+ "Adjtime": true,
+ "Adjtimex": true,
+ "AttachLsf": true,
+ "B0": true,
+ "B1000000": true,
+ "B110": true,
+ "B115200": true,
+ "B1152000": true,
+ "B1200": true,
+ "B134": true,
+ "B14400": true,
+ "B150": true,
+ "B1500000": true,
+ "B1800": true,
+ "B19200": true,
+ "B200": true,
+ "B2000000": true,
+ "B230400": true,
+ "B2400": true,
+ "B2500000": true,
+ "B28800": true,
+ "B300": true,
+ "B3000000": true,
+ "B3500000": true,
+ "B38400": true,
+ "B4000000": true,
+ "B460800": true,
+ "B4800": true,
+ "B50": true,
+ "B500000": true,
+ "B57600": true,
+ "B576000": true,
+ "B600": true,
+ "B7200": true,
+ "B75": true,
+ "B76800": true,
+ "B921600": true,
+ "B9600": true,
+ "BASE_PROTOCOL": true,
+ "BIOCFEEDBACK": true,
+ "BIOCFLUSH": true,
+ "BIOCGBLEN": true,
+ "BIOCGDIRECTION": true,
+ "BIOCGDIRFILT": true,
+ "BIOCGDLT": true,
+ "BIOCGDLTLIST": true,
+ "BIOCGETBUFMODE": true,
+ "BIOCGETIF": true,
+ "BIOCGETZMAX": true,
+ "BIOCGFEEDBACK": true,
+ "BIOCGFILDROP": true,
+ "BIOCGHDRCMPLT": true,
+ "BIOCGRSIG": true,
+ "BIOCGRTIMEOUT": true,
+ "BIOCGSEESENT": true,
+ "BIOCGSTATS": true,
+ "BIOCGSTATSOLD": true,
+ "BIOCGTSTAMP": true,
+ "BIOCIMMEDIATE": true,
+ "BIOCLOCK": true,
+ "BIOCPROMISC": true,
+ "BIOCROTZBUF": true,
+ "BIOCSBLEN": true,
+ "BIOCSDIRECTION": true,
+ "BIOCSDIRFILT": true,
+ "BIOCSDLT": true,
+ "BIOCSETBUFMODE": true,
+ "BIOCSETF": true,
+ "BIOCSETFNR": true,
+ "BIOCSETIF": true,
+ "BIOCSETWF": true,
+ "BIOCSETZBUF": true,
+ "BIOCSFEEDBACK": true,
+ "BIOCSFILDROP": true,
+ "BIOCSHDRCMPLT": true,
+ "BIOCSRSIG": true,
+ "BIOCSRTIMEOUT": true,
+ "BIOCSSEESENT": true,
+ "BIOCSTCPF": true,
+ "BIOCSTSTAMP": true,
+ "BIOCSUDPF": true,
+ "BIOCVERSION": true,
+ "BPF_A": true,
+ "BPF_ABS": true,
+ "BPF_ADD": true,
+ "BPF_ALIGNMENT": true,
+ "BPF_ALIGNMENT32": true,
+ "BPF_ALU": true,
+ "BPF_AND": true,
+ "BPF_B": true,
+ "BPF_BUFMODE_BUFFER": true,
+ "BPF_BUFMODE_ZBUF": true,
+ "BPF_DFLTBUFSIZE": true,
+ "BPF_DIRECTION_IN": true,
+ "BPF_DIRECTION_OUT": true,
+ "BPF_DIV": true,
+ "BPF_H": true,
+ "BPF_IMM": true,
+ "BPF_IND": true,
+ "BPF_JA": true,
+ "BPF_JEQ": true,
+ "BPF_JGE": true,
+ "BPF_JGT": true,
+ "BPF_JMP": true,
+ "BPF_JSET": true,
+ "BPF_K": true,
+ "BPF_LD": true,
+ "BPF_LDX": true,
+ "BPF_LEN": true,
+ "BPF_LSH": true,
+ "BPF_MAJOR_VERSION": true,
+ "BPF_MAXBUFSIZE": true,
+ "BPF_MAXINSNS": true,
+ "BPF_MEM": true,
+ "BPF_MEMWORDS": true,
+ "BPF_MINBUFSIZE": true,
+ "BPF_MINOR_VERSION": true,
+ "BPF_MISC": true,
+ "BPF_MSH": true,
+ "BPF_MUL": true,
+ "BPF_NEG": true,
+ "BPF_OR": true,
+ "BPF_RELEASE": true,
+ "BPF_RET": true,
+ "BPF_RSH": true,
+ "BPF_ST": true,
+ "BPF_STX": true,
+ "BPF_SUB": true,
+ "BPF_TAX": true,
+ "BPF_TXA": true,
+ "BPF_T_BINTIME": true,
+ "BPF_T_BINTIME_FAST": true,
+ "BPF_T_BINTIME_MONOTONIC": true,
+ "BPF_T_BINTIME_MONOTONIC_FAST": true,
+ "BPF_T_FAST": true,
+ "BPF_T_FLAG_MASK": true,
+ "BPF_T_FORMAT_MASK": true,
+ "BPF_T_MICROTIME": true,
+ "BPF_T_MICROTIME_FAST": true,
+ "BPF_T_MICROTIME_MONOTONIC": true,
+ "BPF_T_MICROTIME_MONOTONIC_FAST": true,
+ "BPF_T_MONOTONIC": true,
+ "BPF_T_MONOTONIC_FAST": true,
+ "BPF_T_NANOTIME": true,
+ "BPF_T_NANOTIME_FAST": true,
+ "BPF_T_NANOTIME_MONOTONIC": true,
+ "BPF_T_NANOTIME_MONOTONIC_FAST": true,
+ "BPF_T_NONE": true,
+ "BPF_T_NORMAL": true,
+ "BPF_W": true,
+ "BPF_X": true,
+ "BRKINT": true,
+ "Bind": true,
+ "BindToDevice": true,
+ "BpfBuflen": true,
+ "BpfDatalink": true,
+ "BpfHdr": true,
+ "BpfHeadercmpl": true,
+ "BpfInsn": true,
+ "BpfInterface": true,
+ "BpfJump": true,
+ "BpfProgram": true,
+ "BpfStat": true,
+ "BpfStats": true,
+ "BpfStmt": true,
+ "BpfTimeout": true,
+ "BpfTimeval": true,
+ "BpfVersion": true,
+ "BpfZbuf": true,
+ "BpfZbufHeader": true,
+ "ByHandleFileInformation": true,
+ "BytePtrFromString": true,
+ "ByteSliceFromString": true,
+ "CCR0_FLUSH": true,
+ "CERT_CHAIN_POLICY_AUTHENTICODE": true,
+ "CERT_CHAIN_POLICY_AUTHENTICODE_TS": true,
+ "CERT_CHAIN_POLICY_BASE": true,
+ "CERT_CHAIN_POLICY_BASIC_CONSTRAINTS": true,
+ "CERT_CHAIN_POLICY_EV": true,
+ "CERT_CHAIN_POLICY_MICROSOFT_ROOT": true,
+ "CERT_CHAIN_POLICY_NT_AUTH": true,
+ "CERT_CHAIN_POLICY_SSL": true,
+ "CERT_E_CN_NO_MATCH": true,
+ "CERT_E_EXPIRED": true,
+ "CERT_E_PURPOSE": true,
+ "CERT_E_ROLE": true,
+ "CERT_E_UNTRUSTEDROOT": true,
+ "CERT_STORE_ADD_ALWAYS": true,
+ "CERT_STORE_DEFER_CLOSE_UNTIL_LAST_FREE_FLAG": true,
+ "CERT_STORE_PROV_MEMORY": true,
+ "CERT_TRUST_HAS_EXCLUDED_NAME_CONSTRAINT": true,
+ "CERT_TRUST_HAS_NOT_DEFINED_NAME_CONSTRAINT": true,
+ "CERT_TRUST_HAS_NOT_PERMITTED_NAME_CONSTRAINT": true,
+ "CERT_TRUST_HAS_NOT_SUPPORTED_CRITICAL_EXT": true,
+ "CERT_TRUST_HAS_NOT_SUPPORTED_NAME_CONSTRAINT": true,
+ "CERT_TRUST_INVALID_BASIC_CONSTRAINTS": true,
+ "CERT_TRUST_INVALID_EXTENSION": true,
+ "CERT_TRUST_INVALID_NAME_CONSTRAINTS": true,
+ "CERT_TRUST_INVALID_POLICY_CONSTRAINTS": true,
+ "CERT_TRUST_IS_CYCLIC": true,
+ "CERT_TRUST_IS_EXPLICIT_DISTRUST": true,
+ "CERT_TRUST_IS_NOT_SIGNATURE_VALID": true,
+ "CERT_TRUST_IS_NOT_TIME_VALID": true,
+ "CERT_TRUST_IS_NOT_VALID_FOR_USAGE": true,
+ "CERT_TRUST_IS_OFFLINE_REVOCATION": true,
+ "CERT_TRUST_IS_REVOKED": true,
+ "CERT_TRUST_IS_UNTRUSTED_ROOT": true,
+ "CERT_TRUST_NO_ERROR": true,
+ "CERT_TRUST_NO_ISSUANCE_CHAIN_POLICY": true,
+ "CERT_TRUST_REVOCATION_STATUS_UNKNOWN": true,
+ "CFLUSH": true,
+ "CLOCAL": true,
+ "CLONE_CHILD_CLEARTID": true,
+ "CLONE_CHILD_SETTID": true,
+ "CLONE_CSIGNAL": true,
+ "CLONE_DETACHED": true,
+ "CLONE_FILES": true,
+ "CLONE_FS": true,
+ "CLONE_IO": true,
+ "CLONE_NEWIPC": true,
+ "CLONE_NEWNET": true,
+ "CLONE_NEWNS": true,
+ "CLONE_NEWPID": true,
+ "CLONE_NEWUSER": true,
+ "CLONE_NEWUTS": true,
+ "CLONE_PARENT": true,
+ "CLONE_PARENT_SETTID": true,
+ "CLONE_PID": true,
+ "CLONE_PTRACE": true,
+ "CLONE_SETTLS": true,
+ "CLONE_SIGHAND": true,
+ "CLONE_SYSVSEM": true,
+ "CLONE_THREAD": true,
+ "CLONE_UNTRACED": true,
+ "CLONE_VFORK": true,
+ "CLONE_VM": true,
+ "CPUID_CFLUSH": true,
+ "CREAD": true,
+ "CREATE_ALWAYS": true,
+ "CREATE_NEW": true,
+ "CREATE_NEW_PROCESS_GROUP": true,
+ "CREATE_UNICODE_ENVIRONMENT": true,
+ "CRYPT_DEFAULT_CONTAINER_OPTIONAL": true,
+ "CRYPT_DELETEKEYSET": true,
+ "CRYPT_MACHINE_KEYSET": true,
+ "CRYPT_NEWKEYSET": true,
+ "CRYPT_SILENT": true,
+ "CRYPT_VERIFYCONTEXT": true,
+ "CS5": true,
+ "CS6": true,
+ "CS7": true,
+ "CS8": true,
+ "CSIZE": true,
+ "CSTART": true,
+ "CSTATUS": true,
+ "CSTOP": true,
+ "CSTOPB": true,
+ "CSUSP": true,
+ "CTL_MAXNAME": true,
+ "CTL_NET": true,
+ "CTL_QUERY": true,
+ "CTRL_BREAK_EVENT": true,
+ "CTRL_C_EVENT": true,
+ "CancelIo": true,
+ "CancelIoEx": true,
+ "CertAddCertificateContextToStore": true,
+ "CertChainContext": true,
+ "CertChainElement": true,
+ "CertChainPara": true,
+ "CertChainPolicyPara": true,
+ "CertChainPolicyStatus": true,
+ "CertCloseStore": true,
+ "CertContext": true,
+ "CertCreateCertificateContext": true,
+ "CertEnhKeyUsage": true,
+ "CertEnumCertificatesInStore": true,
+ "CertFreeCertificateChain": true,
+ "CertFreeCertificateContext": true,
+ "CertGetCertificateChain": true,
+ "CertInfo": true,
+ "CertOpenStore": true,
+ "CertOpenSystemStore": true,
+ "CertRevocationCrlInfo": true,
+ "CertRevocationInfo": true,
+ "CertSimpleChain": true,
+ "CertTrustListInfo": true,
+ "CertTrustStatus": true,
+ "CertUsageMatch": true,
+ "CertVerifyCertificateChainPolicy": true,
+ "Chdir": true,
+ "CheckBpfVersion": true,
+ "Chflags": true,
+ "Chmod": true,
+ "Chown": true,
+ "Chroot": true,
+ "Clearenv": true,
+ "Close": true,
+ "CloseHandle": true,
+ "CloseOnExec": true,
+ "Closesocket": true,
+ "CmsgLen": true,
+ "CmsgSpace": true,
+ "Cmsghdr": true,
+ "CommandLineToArgv": true,
+ "ComputerName": true,
+ "Conn": true,
+ "Connect": true,
+ "ConnectEx": true,
+ "ConvertSidToStringSid": true,
+ "ConvertStringSidToSid": true,
+ "CopySid": true,
+ "Creat": true,
+ "CreateDirectory": true,
+ "CreateFile": true,
+ "CreateFileMapping": true,
+ "CreateHardLink": true,
+ "CreateIoCompletionPort": true,
+ "CreatePipe": true,
+ "CreateProcess": true,
+ "CreateProcessAsUser": true,
+ "CreateSymbolicLink": true,
+ "CreateToolhelp32Snapshot": true,
+ "Credential": true,
+ "CryptAcquireContext": true,
+ "CryptGenRandom": true,
+ "CryptReleaseContext": true,
+ "DIOCBSFLUSH": true,
+ "DIOCOSFPFLUSH": true,
+ "DLL": true,
+ "DLLError": true,
+ "DLT_A429": true,
+ "DLT_A653_ICM": true,
+ "DLT_AIRONET_HEADER": true,
+ "DLT_AOS": true,
+ "DLT_APPLE_IP_OVER_IEEE1394": true,
+ "DLT_ARCNET": true,
+ "DLT_ARCNET_LINUX": true,
+ "DLT_ATM_CLIP": true,
+ "DLT_ATM_RFC1483": true,
+ "DLT_AURORA": true,
+ "DLT_AX25": true,
+ "DLT_AX25_KISS": true,
+ "DLT_BACNET_MS_TP": true,
+ "DLT_BLUETOOTH_HCI_H4": true,
+ "DLT_BLUETOOTH_HCI_H4_WITH_PHDR": true,
+ "DLT_CAN20B": true,
+ "DLT_CAN_SOCKETCAN": true,
+ "DLT_CHAOS": true,
+ "DLT_CHDLC": true,
+ "DLT_CISCO_IOS": true,
+ "DLT_C_HDLC": true,
+ "DLT_C_HDLC_WITH_DIR": true,
+ "DLT_DBUS": true,
+ "DLT_DECT": true,
+ "DLT_DOCSIS": true,
+ "DLT_DVB_CI": true,
+ "DLT_ECONET": true,
+ "DLT_EN10MB": true,
+ "DLT_EN3MB": true,
+ "DLT_ENC": true,
+ "DLT_ERF": true,
+ "DLT_ERF_ETH": true,
+ "DLT_ERF_POS": true,
+ "DLT_FC_2": true,
+ "DLT_FC_2_WITH_FRAME_DELIMS": true,
+ "DLT_FDDI": true,
+ "DLT_FLEXRAY": true,
+ "DLT_FRELAY": true,
+ "DLT_FRELAY_WITH_DIR": true,
+ "DLT_GCOM_SERIAL": true,
+ "DLT_GCOM_T1E1": true,
+ "DLT_GPF_F": true,
+ "DLT_GPF_T": true,
+ "DLT_GPRS_LLC": true,
+ "DLT_GSMTAP_ABIS": true,
+ "DLT_GSMTAP_UM": true,
+ "DLT_HDLC": true,
+ "DLT_HHDLC": true,
+ "DLT_HIPPI": true,
+ "DLT_IBM_SN": true,
+ "DLT_IBM_SP": true,
+ "DLT_IEEE802": true,
+ "DLT_IEEE802_11": true,
+ "DLT_IEEE802_11_RADIO": true,
+ "DLT_IEEE802_11_RADIO_AVS": true,
+ "DLT_IEEE802_15_4": true,
+ "DLT_IEEE802_15_4_LINUX": true,
+ "DLT_IEEE802_15_4_NOFCS": true,
+ "DLT_IEEE802_15_4_NONASK_PHY": true,
+ "DLT_IEEE802_16_MAC_CPS": true,
+ "DLT_IEEE802_16_MAC_CPS_RADIO": true,
+ "DLT_IPFILTER": true,
+ "DLT_IPMB": true,
+ "DLT_IPMB_LINUX": true,
+ "DLT_IPNET": true,
+ "DLT_IPOIB": true,
+ "DLT_IPV4": true,
+ "DLT_IPV6": true,
+ "DLT_IP_OVER_FC": true,
+ "DLT_JUNIPER_ATM1": true,
+ "DLT_JUNIPER_ATM2": true,
+ "DLT_JUNIPER_ATM_CEMIC": true,
+ "DLT_JUNIPER_CHDLC": true,
+ "DLT_JUNIPER_ES": true,
+ "DLT_JUNIPER_ETHER": true,
+ "DLT_JUNIPER_FIBRECHANNEL": true,
+ "DLT_JUNIPER_FRELAY": true,
+ "DLT_JUNIPER_GGSN": true,
+ "DLT_JUNIPER_ISM": true,
+ "DLT_JUNIPER_MFR": true,
+ "DLT_JUNIPER_MLFR": true,
+ "DLT_JUNIPER_MLPPP": true,
+ "DLT_JUNIPER_MONITOR": true,
+ "DLT_JUNIPER_PIC_PEER": true,
+ "DLT_JUNIPER_PPP": true,
+ "DLT_JUNIPER_PPPOE": true,
+ "DLT_JUNIPER_PPPOE_ATM": true,
+ "DLT_JUNIPER_SERVICES": true,
+ "DLT_JUNIPER_SRX_E2E": true,
+ "DLT_JUNIPER_ST": true,
+ "DLT_JUNIPER_VP": true,
+ "DLT_JUNIPER_VS": true,
+ "DLT_LAPB_WITH_DIR": true,
+ "DLT_LAPD": true,
+ "DLT_LIN": true,
+ "DLT_LINUX_EVDEV": true,
+ "DLT_LINUX_IRDA": true,
+ "DLT_LINUX_LAPD": true,
+ "DLT_LINUX_PPP_WITHDIRECTION": true,
+ "DLT_LINUX_SLL": true,
+ "DLT_LOOP": true,
+ "DLT_LTALK": true,
+ "DLT_MATCHING_MAX": true,
+ "DLT_MATCHING_MIN": true,
+ "DLT_MFR": true,
+ "DLT_MOST": true,
+ "DLT_MPEG_2_TS": true,
+ "DLT_MPLS": true,
+ "DLT_MTP2": true,
+ "DLT_MTP2_WITH_PHDR": true,
+ "DLT_MTP3": true,
+ "DLT_MUX27010": true,
+ "DLT_NETANALYZER": true,
+ "DLT_NETANALYZER_TRANSPARENT": true,
+ "DLT_NFC_LLCP": true,
+ "DLT_NFLOG": true,
+ "DLT_NG40": true,
+ "DLT_NULL": true,
+ "DLT_PCI_EXP": true,
+ "DLT_PFLOG": true,
+ "DLT_PFSYNC": true,
+ "DLT_PPI": true,
+ "DLT_PPP": true,
+ "DLT_PPP_BSDOS": true,
+ "DLT_PPP_ETHER": true,
+ "DLT_PPP_PPPD": true,
+ "DLT_PPP_SERIAL": true,
+ "DLT_PPP_WITH_DIR": true,
+ "DLT_PPP_WITH_DIRECTION": true,
+ "DLT_PRISM_HEADER": true,
+ "DLT_PRONET": true,
+ "DLT_RAIF1": true,
+ "DLT_RAW": true,
+ "DLT_RAWAF_MASK": true,
+ "DLT_RIO": true,
+ "DLT_SCCP": true,
+ "DLT_SITA": true,
+ "DLT_SLIP": true,
+ "DLT_SLIP_BSDOS": true,
+ "DLT_STANAG_5066_D_PDU": true,
+ "DLT_SUNATM": true,
+ "DLT_SYMANTEC_FIREWALL": true,
+ "DLT_TZSP": true,
+ "DLT_USB": true,
+ "DLT_USB_LINUX": true,
+ "DLT_USB_LINUX_MMAPPED": true,
+ "DLT_USER0": true,
+ "DLT_USER1": true,
+ "DLT_USER10": true,
+ "DLT_USER11": true,
+ "DLT_USER12": true,
+ "DLT_USER13": true,
+ "DLT_USER14": true,
+ "DLT_USER15": true,
+ "DLT_USER2": true,
+ "DLT_USER3": true,
+ "DLT_USER4": true,
+ "DLT_USER5": true,
+ "DLT_USER6": true,
+ "DLT_USER7": true,
+ "DLT_USER8": true,
+ "DLT_USER9": true,
+ "DLT_WIHART": true,
+ "DLT_X2E_SERIAL": true,
+ "DLT_X2E_XORAYA": true,
+ "DNSMXData": true,
+ "DNSPTRData": true,
+ "DNSRecord": true,
+ "DNSSRVData": true,
+ "DNSTXTData": true,
+ "DNS_INFO_NO_RECORDS": true,
+ "DNS_TYPE_A": true,
+ "DNS_TYPE_A6": true,
+ "DNS_TYPE_AAAA": true,
+ "DNS_TYPE_ADDRS": true,
+ "DNS_TYPE_AFSDB": true,
+ "DNS_TYPE_ALL": true,
+ "DNS_TYPE_ANY": true,
+ "DNS_TYPE_ATMA": true,
+ "DNS_TYPE_AXFR": true,
+ "DNS_TYPE_CERT": true,
+ "DNS_TYPE_CNAME": true,
+ "DNS_TYPE_DHCID": true,
+ "DNS_TYPE_DNAME": true,
+ "DNS_TYPE_DNSKEY": true,
+ "DNS_TYPE_DS": true,
+ "DNS_TYPE_EID": true,
+ "DNS_TYPE_GID": true,
+ "DNS_TYPE_GPOS": true,
+ "DNS_TYPE_HINFO": true,
+ "DNS_TYPE_ISDN": true,
+ "DNS_TYPE_IXFR": true,
+ "DNS_TYPE_KEY": true,
+ "DNS_TYPE_KX": true,
+ "DNS_TYPE_LOC": true,
+ "DNS_TYPE_MAILA": true,
+ "DNS_TYPE_MAILB": true,
+ "DNS_TYPE_MB": true,
+ "DNS_TYPE_MD": true,
+ "DNS_TYPE_MF": true,
+ "DNS_TYPE_MG": true,
+ "DNS_TYPE_MINFO": true,
+ "DNS_TYPE_MR": true,
+ "DNS_TYPE_MX": true,
+ "DNS_TYPE_NAPTR": true,
+ "DNS_TYPE_NBSTAT": true,
+ "DNS_TYPE_NIMLOC": true,
+ "DNS_TYPE_NS": true,
+ "DNS_TYPE_NSAP": true,
+ "DNS_TYPE_NSAPPTR": true,
+ "DNS_TYPE_NSEC": true,
+ "DNS_TYPE_NULL": true,
+ "DNS_TYPE_NXT": true,
+ "DNS_TYPE_OPT": true,
+ "DNS_TYPE_PTR": true,
+ "DNS_TYPE_PX": true,
+ "DNS_TYPE_RP": true,
+ "DNS_TYPE_RRSIG": true,
+ "DNS_TYPE_RT": true,
+ "DNS_TYPE_SIG": true,
+ "DNS_TYPE_SINK": true,
+ "DNS_TYPE_SOA": true,
+ "DNS_TYPE_SRV": true,
+ "DNS_TYPE_TEXT": true,
+ "DNS_TYPE_TKEY": true,
+ "DNS_TYPE_TSIG": true,
+ "DNS_TYPE_UID": true,
+ "DNS_TYPE_UINFO": true,
+ "DNS_TYPE_UNSPEC": true,
+ "DNS_TYPE_WINS": true,
+ "DNS_TYPE_WINSR": true,
+ "DNS_TYPE_WKS": true,
+ "DNS_TYPE_X25": true,
+ "DT_BLK": true,
+ "DT_CHR": true,
+ "DT_DIR": true,
+ "DT_FIFO": true,
+ "DT_LNK": true,
+ "DT_REG": true,
+ "DT_SOCK": true,
+ "DT_UNKNOWN": true,
+ "DT_WHT": true,
+ "DUPLICATE_CLOSE_SOURCE": true,
+ "DUPLICATE_SAME_ACCESS": true,
+ "DeleteFile": true,
+ "DetachLsf": true,
+ "DeviceIoControl": true,
+ "Dirent": true,
+ "DnsNameCompare": true,
+ "DnsQuery": true,
+ "DnsRecordListFree": true,
+ "DnsSectionAdditional": true,
+ "DnsSectionAnswer": true,
+ "DnsSectionAuthority": true,
+ "DnsSectionQuestion": true,
+ "Dup": true,
+ "Dup2": true,
+ "Dup3": true,
+ "DuplicateHandle": true,
+ "E2BIG": true,
+ "EACCES": true,
+ "EADDRINUSE": true,
+ "EADDRNOTAVAIL": true,
+ "EADV": true,
+ "EAFNOSUPPORT": true,
+ "EAGAIN": true,
+ "EALREADY": true,
+ "EAUTH": true,
+ "EBADARCH": true,
+ "EBADE": true,
+ "EBADEXEC": true,
+ "EBADF": true,
+ "EBADFD": true,
+ "EBADMACHO": true,
+ "EBADMSG": true,
+ "EBADR": true,
+ "EBADRPC": true,
+ "EBADRQC": true,
+ "EBADSLT": true,
+ "EBFONT": true,
+ "EBUSY": true,
+ "ECANCELED": true,
+ "ECAPMODE": true,
+ "ECHILD": true,
+ "ECHO": true,
+ "ECHOCTL": true,
+ "ECHOE": true,
+ "ECHOK": true,
+ "ECHOKE": true,
+ "ECHONL": true,
+ "ECHOPRT": true,
+ "ECHRNG": true,
+ "ECOMM": true,
+ "ECONNABORTED": true,
+ "ECONNREFUSED": true,
+ "ECONNRESET": true,
+ "EDEADLK": true,
+ "EDEADLOCK": true,
+ "EDESTADDRREQ": true,
+ "EDEVERR": true,
+ "EDOM": true,
+ "EDOOFUS": true,
+ "EDOTDOT": true,
+ "EDQUOT": true,
+ "EEXIST": true,
+ "EFAULT": true,
+ "EFBIG": true,
+ "EFER_LMA": true,
+ "EFER_LME": true,
+ "EFER_NXE": true,
+ "EFER_SCE": true,
+ "EFTYPE": true,
+ "EHOSTDOWN": true,
+ "EHOSTUNREACH": true,
+ "EHWPOISON": true,
+ "EIDRM": true,
+ "EILSEQ": true,
+ "EINPROGRESS": true,
+ "EINTR": true,
+ "EINVAL": true,
+ "EIO": true,
+ "EIPSEC": true,
+ "EISCONN": true,
+ "EISDIR": true,
+ "EISNAM": true,
+ "EKEYEXPIRED": true,
+ "EKEYREJECTED": true,
+ "EKEYREVOKED": true,
+ "EL2HLT": true,
+ "EL2NSYNC": true,
+ "EL3HLT": true,
+ "EL3RST": true,
+ "ELAST": true,
+ "ELF_NGREG": true,
+ "ELF_PRARGSZ": true,
+ "ELIBACC": true,
+ "ELIBBAD": true,
+ "ELIBEXEC": true,
+ "ELIBMAX": true,
+ "ELIBSCN": true,
+ "ELNRNG": true,
+ "ELOOP": true,
+ "EMEDIUMTYPE": true,
+ "EMFILE": true,
+ "EMLINK": true,
+ "EMSGSIZE": true,
+ "EMT_TAGOVF": true,
+ "EMULTIHOP": true,
+ "EMUL_ENABLED": true,
+ "EMUL_LINUX": true,
+ "EMUL_LINUX32": true,
+ "EMUL_MAXID": true,
+ "EMUL_NATIVE": true,
+ "ENAMETOOLONG": true,
+ "ENAVAIL": true,
+ "ENDRUNDISC": true,
+ "ENEEDAUTH": true,
+ "ENETDOWN": true,
+ "ENETRESET": true,
+ "ENETUNREACH": true,
+ "ENFILE": true,
+ "ENOANO": true,
+ "ENOATTR": true,
+ "ENOBUFS": true,
+ "ENOCSI": true,
+ "ENODATA": true,
+ "ENODEV": true,
+ "ENOENT": true,
+ "ENOEXEC": true,
+ "ENOKEY": true,
+ "ENOLCK": true,
+ "ENOLINK": true,
+ "ENOMEDIUM": true,
+ "ENOMEM": true,
+ "ENOMSG": true,
+ "ENONET": true,
+ "ENOPKG": true,
+ "ENOPOLICY": true,
+ "ENOPROTOOPT": true,
+ "ENOSPC": true,
+ "ENOSR": true,
+ "ENOSTR": true,
+ "ENOSYS": true,
+ "ENOTBLK": true,
+ "ENOTCAPABLE": true,
+ "ENOTCONN": true,
+ "ENOTDIR": true,
+ "ENOTEMPTY": true,
+ "ENOTNAM": true,
+ "ENOTRECOVERABLE": true,
+ "ENOTSOCK": true,
+ "ENOTSUP": true,
+ "ENOTTY": true,
+ "ENOTUNIQ": true,
+ "ENXIO": true,
+ "EN_SW_CTL_INF": true,
+ "EN_SW_CTL_PREC": true,
+ "EN_SW_CTL_ROUND": true,
+ "EN_SW_DATACHAIN": true,
+ "EN_SW_DENORM": true,
+ "EN_SW_INVOP": true,
+ "EN_SW_OVERFLOW": true,
+ "EN_SW_PRECLOSS": true,
+ "EN_SW_UNDERFLOW": true,
+ "EN_SW_ZERODIV": true,
+ "EOPNOTSUPP": true,
+ "EOVERFLOW": true,
+ "EOWNERDEAD": true,
+ "EPERM": true,
+ "EPFNOSUPPORT": true,
+ "EPIPE": true,
+ "EPOLLERR": true,
+ "EPOLLET": true,
+ "EPOLLHUP": true,
+ "EPOLLIN": true,
+ "EPOLLMSG": true,
+ "EPOLLONESHOT": true,
+ "EPOLLOUT": true,
+ "EPOLLPRI": true,
+ "EPOLLRDBAND": true,
+ "EPOLLRDHUP": true,
+ "EPOLLRDNORM": true,
+ "EPOLLWRBAND": true,
+ "EPOLLWRNORM": true,
+ "EPOLL_CLOEXEC": true,
+ "EPOLL_CTL_ADD": true,
+ "EPOLL_CTL_DEL": true,
+ "EPOLL_CTL_MOD": true,
+ "EPOLL_NONBLOCK": true,
+ "EPROCLIM": true,
+ "EPROCUNAVAIL": true,
+ "EPROGMISMATCH": true,
+ "EPROGUNAVAIL": true,
+ "EPROTO": true,
+ "EPROTONOSUPPORT": true,
+ "EPROTOTYPE": true,
+ "EPWROFF": true,
+ "ERANGE": true,
+ "EREMCHG": true,
+ "EREMOTE": true,
+ "EREMOTEIO": true,
+ "ERESTART": true,
+ "ERFKILL": true,
+ "EROFS": true,
+ "ERPCMISMATCH": true,
+ "ERROR_ACCESS_DENIED": true,
+ "ERROR_ALREADY_EXISTS": true,
+ "ERROR_BROKEN_PIPE": true,
+ "ERROR_BUFFER_OVERFLOW": true,
+ "ERROR_DIR_NOT_EMPTY": true,
+ "ERROR_ENVVAR_NOT_FOUND": true,
+ "ERROR_FILE_EXISTS": true,
+ "ERROR_FILE_NOT_FOUND": true,
+ "ERROR_HANDLE_EOF": true,
+ "ERROR_INSUFFICIENT_BUFFER": true,
+ "ERROR_IO_PENDING": true,
+ "ERROR_MOD_NOT_FOUND": true,
+ "ERROR_MORE_DATA": true,
+ "ERROR_NETNAME_DELETED": true,
+ "ERROR_NOT_FOUND": true,
+ "ERROR_NO_MORE_FILES": true,
+ "ERROR_OPERATION_ABORTED": true,
+ "ERROR_PATH_NOT_FOUND": true,
+ "ERROR_PRIVILEGE_NOT_HELD": true,
+ "ERROR_PROC_NOT_FOUND": true,
+ "ESHLIBVERS": true,
+ "ESHUTDOWN": true,
+ "ESOCKTNOSUPPORT": true,
+ "ESPIPE": true,
+ "ESRCH": true,
+ "ESRMNT": true,
+ "ESTALE": true,
+ "ESTRPIPE": true,
+ "ETHERCAP_JUMBO_MTU": true,
+ "ETHERCAP_VLAN_HWTAGGING": true,
+ "ETHERCAP_VLAN_MTU": true,
+ "ETHERMIN": true,
+ "ETHERMTU": true,
+ "ETHERMTU_JUMBO": true,
+ "ETHERTYPE_8023": true,
+ "ETHERTYPE_AARP": true,
+ "ETHERTYPE_ACCTON": true,
+ "ETHERTYPE_AEONIC": true,
+ "ETHERTYPE_ALPHA": true,
+ "ETHERTYPE_AMBER": true,
+ "ETHERTYPE_AMOEBA": true,
+ "ETHERTYPE_AOE": true,
+ "ETHERTYPE_APOLLO": true,
+ "ETHERTYPE_APOLLODOMAIN": true,
+ "ETHERTYPE_APPLETALK": true,
+ "ETHERTYPE_APPLITEK": true,
+ "ETHERTYPE_ARGONAUT": true,
+ "ETHERTYPE_ARP": true,
+ "ETHERTYPE_AT": true,
+ "ETHERTYPE_ATALK": true,
+ "ETHERTYPE_ATOMIC": true,
+ "ETHERTYPE_ATT": true,
+ "ETHERTYPE_ATTSTANFORD": true,
+ "ETHERTYPE_AUTOPHON": true,
+ "ETHERTYPE_AXIS": true,
+ "ETHERTYPE_BCLOOP": true,
+ "ETHERTYPE_BOFL": true,
+ "ETHERTYPE_CABLETRON": true,
+ "ETHERTYPE_CHAOS": true,
+ "ETHERTYPE_COMDESIGN": true,
+ "ETHERTYPE_COMPUGRAPHIC": true,
+ "ETHERTYPE_COUNTERPOINT": true,
+ "ETHERTYPE_CRONUS": true,
+ "ETHERTYPE_CRONUSVLN": true,
+ "ETHERTYPE_DCA": true,
+ "ETHERTYPE_DDE": true,
+ "ETHERTYPE_DEBNI": true,
+ "ETHERTYPE_DECAM": true,
+ "ETHERTYPE_DECCUST": true,
+ "ETHERTYPE_DECDIAG": true,
+ "ETHERTYPE_DECDNS": true,
+ "ETHERTYPE_DECDTS": true,
+ "ETHERTYPE_DECEXPER": true,
+ "ETHERTYPE_DECLAST": true,
+ "ETHERTYPE_DECLTM": true,
+ "ETHERTYPE_DECMUMPS": true,
+ "ETHERTYPE_DECNETBIOS": true,
+ "ETHERTYPE_DELTACON": true,
+ "ETHERTYPE_DIDDLE": true,
+ "ETHERTYPE_DLOG1": true,
+ "ETHERTYPE_DLOG2": true,
+ "ETHERTYPE_DN": true,
+ "ETHERTYPE_DOGFIGHT": true,
+ "ETHERTYPE_DSMD": true,
+ "ETHERTYPE_ECMA": true,
+ "ETHERTYPE_ENCRYPT": true,
+ "ETHERTYPE_ES": true,
+ "ETHERTYPE_EXCELAN": true,
+ "ETHERTYPE_EXPERDATA": true,
+ "ETHERTYPE_FLIP": true,
+ "ETHERTYPE_FLOWCONTROL": true,
+ "ETHERTYPE_FRARP": true,
+ "ETHERTYPE_GENDYN": true,
+ "ETHERTYPE_HAYES": true,
+ "ETHERTYPE_HIPPI_FP": true,
+ "ETHERTYPE_HITACHI": true,
+ "ETHERTYPE_HP": true,
+ "ETHERTYPE_IEEEPUP": true,
+ "ETHERTYPE_IEEEPUPAT": true,
+ "ETHERTYPE_IMLBL": true,
+ "ETHERTYPE_IMLBLDIAG": true,
+ "ETHERTYPE_IP": true,
+ "ETHERTYPE_IPAS": true,
+ "ETHERTYPE_IPV6": true,
+ "ETHERTYPE_IPX": true,
+ "ETHERTYPE_IPXNEW": true,
+ "ETHERTYPE_KALPANA": true,
+ "ETHERTYPE_LANBRIDGE": true,
+ "ETHERTYPE_LANPROBE": true,
+ "ETHERTYPE_LAT": true,
+ "ETHERTYPE_LBACK": true,
+ "ETHERTYPE_LITTLE": true,
+ "ETHERTYPE_LLDP": true,
+ "ETHERTYPE_LOGICRAFT": true,
+ "ETHERTYPE_LOOPBACK": true,
+ "ETHERTYPE_MATRA": true,
+ "ETHERTYPE_MAX": true,
+ "ETHERTYPE_MERIT": true,
+ "ETHERTYPE_MICP": true,
+ "ETHERTYPE_MOPDL": true,
+ "ETHERTYPE_MOPRC": true,
+ "ETHERTYPE_MOTOROLA": true,
+ "ETHERTYPE_MPLS": true,
+ "ETHERTYPE_MPLS_MCAST": true,
+ "ETHERTYPE_MUMPS": true,
+ "ETHERTYPE_NBPCC": true,
+ "ETHERTYPE_NBPCLAIM": true,
+ "ETHERTYPE_NBPCLREQ": true,
+ "ETHERTYPE_NBPCLRSP": true,
+ "ETHERTYPE_NBPCREQ": true,
+ "ETHERTYPE_NBPCRSP": true,
+ "ETHERTYPE_NBPDG": true,
+ "ETHERTYPE_NBPDGB": true,
+ "ETHERTYPE_NBPDLTE": true,
+ "ETHERTYPE_NBPRAR": true,
+ "ETHERTYPE_NBPRAS": true,
+ "ETHERTYPE_NBPRST": true,
+ "ETHERTYPE_NBPSCD": true,
+ "ETHERTYPE_NBPVCD": true,
+ "ETHERTYPE_NBS": true,
+ "ETHERTYPE_NCD": true,
+ "ETHERTYPE_NESTAR": true,
+ "ETHERTYPE_NETBEUI": true,
+ "ETHERTYPE_NOVELL": true,
+ "ETHERTYPE_NS": true,
+ "ETHERTYPE_NSAT": true,
+ "ETHERTYPE_NSCOMPAT": true,
+ "ETHERTYPE_NTRAILER": true,
+ "ETHERTYPE_OS9": true,
+ "ETHERTYPE_OS9NET": true,
+ "ETHERTYPE_PACER": true,
+ "ETHERTYPE_PAE": true,
+ "ETHERTYPE_PCS": true,
+ "ETHERTYPE_PLANNING": true,
+ "ETHERTYPE_PPP": true,
+ "ETHERTYPE_PPPOE": true,
+ "ETHERTYPE_PPPOEDISC": true,
+ "ETHERTYPE_PRIMENTS": true,
+ "ETHERTYPE_PUP": true,
+ "ETHERTYPE_PUPAT": true,
+ "ETHERTYPE_QINQ": true,
+ "ETHERTYPE_RACAL": true,
+ "ETHERTYPE_RATIONAL": true,
+ "ETHERTYPE_RAWFR": true,
+ "ETHERTYPE_RCL": true,
+ "ETHERTYPE_RDP": true,
+ "ETHERTYPE_RETIX": true,
+ "ETHERTYPE_REVARP": true,
+ "ETHERTYPE_SCA": true,
+ "ETHERTYPE_SECTRA": true,
+ "ETHERTYPE_SECUREDATA": true,
+ "ETHERTYPE_SGITW": true,
+ "ETHERTYPE_SG_BOUNCE": true,
+ "ETHERTYPE_SG_DIAG": true,
+ "ETHERTYPE_SG_NETGAMES": true,
+ "ETHERTYPE_SG_RESV": true,
+ "ETHERTYPE_SIMNET": true,
+ "ETHERTYPE_SLOW": true,
+ "ETHERTYPE_SLOWPROTOCOLS": true,
+ "ETHERTYPE_SNA": true,
+ "ETHERTYPE_SNMP": true,
+ "ETHERTYPE_SONIX": true,
+ "ETHERTYPE_SPIDER": true,
+ "ETHERTYPE_SPRITE": true,
+ "ETHERTYPE_STP": true,
+ "ETHERTYPE_TALARIS": true,
+ "ETHERTYPE_TALARISMC": true,
+ "ETHERTYPE_TCPCOMP": true,
+ "ETHERTYPE_TCPSM": true,
+ "ETHERTYPE_TEC": true,
+ "ETHERTYPE_TIGAN": true,
+ "ETHERTYPE_TRAIL": true,
+ "ETHERTYPE_TRANSETHER": true,
+ "ETHERTYPE_TYMSHARE": true,
+ "ETHERTYPE_UBBST": true,
+ "ETHERTYPE_UBDEBUG": true,
+ "ETHERTYPE_UBDIAGLOOP": true,
+ "ETHERTYPE_UBDL": true,
+ "ETHERTYPE_UBNIU": true,
+ "ETHERTYPE_UBNMC": true,
+ "ETHERTYPE_VALID": true,
+ "ETHERTYPE_VARIAN": true,
+ "ETHERTYPE_VAXELN": true,
+ "ETHERTYPE_VEECO": true,
+ "ETHERTYPE_VEXP": true,
+ "ETHERTYPE_VGLAB": true,
+ "ETHERTYPE_VINES": true,
+ "ETHERTYPE_VINESECHO": true,
+ "ETHERTYPE_VINESLOOP": true,
+ "ETHERTYPE_VITAL": true,
+ "ETHERTYPE_VLAN": true,
+ "ETHERTYPE_VLTLMAN": true,
+ "ETHERTYPE_VPROD": true,
+ "ETHERTYPE_VURESERVED": true,
+ "ETHERTYPE_WATERLOO": true,
+ "ETHERTYPE_WELLFLEET": true,
+ "ETHERTYPE_X25": true,
+ "ETHERTYPE_X75": true,
+ "ETHERTYPE_XNSSM": true,
+ "ETHERTYPE_XTP": true,
+ "ETHER_ADDR_LEN": true,
+ "ETHER_ALIGN": true,
+ "ETHER_CRC_LEN": true,
+ "ETHER_CRC_POLY_BE": true,
+ "ETHER_CRC_POLY_LE": true,
+ "ETHER_HDR_LEN": true,
+ "ETHER_MAX_DIX_LEN": true,
+ "ETHER_MAX_LEN": true,
+ "ETHER_MAX_LEN_JUMBO": true,
+ "ETHER_MIN_LEN": true,
+ "ETHER_PPPOE_ENCAP_LEN": true,
+ "ETHER_TYPE_LEN": true,
+ "ETHER_VLAN_ENCAP_LEN": true,
+ "ETH_P_1588": true,
+ "ETH_P_8021Q": true,
+ "ETH_P_802_2": true,
+ "ETH_P_802_3": true,
+ "ETH_P_AARP": true,
+ "ETH_P_ALL": true,
+ "ETH_P_AOE": true,
+ "ETH_P_ARCNET": true,
+ "ETH_P_ARP": true,
+ "ETH_P_ATALK": true,
+ "ETH_P_ATMFATE": true,
+ "ETH_P_ATMMPOA": true,
+ "ETH_P_AX25": true,
+ "ETH_P_BPQ": true,
+ "ETH_P_CAIF": true,
+ "ETH_P_CAN": true,
+ "ETH_P_CONTROL": true,
+ "ETH_P_CUST": true,
+ "ETH_P_DDCMP": true,
+ "ETH_P_DEC": true,
+ "ETH_P_DIAG": true,
+ "ETH_P_DNA_DL": true,
+ "ETH_P_DNA_RC": true,
+ "ETH_P_DNA_RT": true,
+ "ETH_P_DSA": true,
+ "ETH_P_ECONET": true,
+ "ETH_P_EDSA": true,
+ "ETH_P_FCOE": true,
+ "ETH_P_FIP": true,
+ "ETH_P_HDLC": true,
+ "ETH_P_IEEE802154": true,
+ "ETH_P_IEEEPUP": true,
+ "ETH_P_IEEEPUPAT": true,
+ "ETH_P_IP": true,
+ "ETH_P_IPV6": true,
+ "ETH_P_IPX": true,
+ "ETH_P_IRDA": true,
+ "ETH_P_LAT": true,
+ "ETH_P_LINK_CTL": true,
+ "ETH_P_LOCALTALK": true,
+ "ETH_P_LOOP": true,
+ "ETH_P_MOBITEX": true,
+ "ETH_P_MPLS_MC": true,
+ "ETH_P_MPLS_UC": true,
+ "ETH_P_PAE": true,
+ "ETH_P_PAUSE": true,
+ "ETH_P_PHONET": true,
+ "ETH_P_PPPTALK": true,
+ "ETH_P_PPP_DISC": true,
+ "ETH_P_PPP_MP": true,
+ "ETH_P_PPP_SES": true,
+ "ETH_P_PUP": true,
+ "ETH_P_PUPAT": true,
+ "ETH_P_RARP": true,
+ "ETH_P_SCA": true,
+ "ETH_P_SLOW": true,
+ "ETH_P_SNAP": true,
+ "ETH_P_TEB": true,
+ "ETH_P_TIPC": true,
+ "ETH_P_TRAILER": true,
+ "ETH_P_TR_802_2": true,
+ "ETH_P_WAN_PPP": true,
+ "ETH_P_WCCP": true,
+ "ETH_P_X25": true,
+ "ETIME": true,
+ "ETIMEDOUT": true,
+ "ETOOMANYREFS": true,
+ "ETXTBSY": true,
+ "EUCLEAN": true,
+ "EUNATCH": true,
+ "EUSERS": true,
+ "EVFILT_AIO": true,
+ "EVFILT_FS": true,
+ "EVFILT_LIO": true,
+ "EVFILT_MACHPORT": true,
+ "EVFILT_PROC": true,
+ "EVFILT_READ": true,
+ "EVFILT_SIGNAL": true,
+ "EVFILT_SYSCOUNT": true,
+ "EVFILT_THREADMARKER": true,
+ "EVFILT_TIMER": true,
+ "EVFILT_USER": true,
+ "EVFILT_VM": true,
+ "EVFILT_VNODE": true,
+ "EVFILT_WRITE": true,
+ "EV_ADD": true,
+ "EV_CLEAR": true,
+ "EV_DELETE": true,
+ "EV_DISABLE": true,
+ "EV_DISPATCH": true,
+ "EV_DROP": true,
+ "EV_ENABLE": true,
+ "EV_EOF": true,
+ "EV_ERROR": true,
+ "EV_FLAG0": true,
+ "EV_FLAG1": true,
+ "EV_ONESHOT": true,
+ "EV_OOBAND": true,
+ "EV_POLL": true,
+ "EV_RECEIPT": true,
+ "EV_SYSFLAGS": true,
+ "EWINDOWS": true,
+ "EWOULDBLOCK": true,
+ "EXDEV": true,
+ "EXFULL": true,
+ "EXTA": true,
+ "EXTB": true,
+ "EXTPROC": true,
+ "Environ": true,
+ "EpollCreate": true,
+ "EpollCreate1": true,
+ "EpollCtl": true,
+ "EpollEvent": true,
+ "EpollWait": true,
+ "Errno": true,
+ "EscapeArg": true,
+ "Exchangedata": true,
+ "Exec": true,
+ "Exit": true,
+ "ExitProcess": true,
+ "FD_CLOEXEC": true,
+ "FD_SETSIZE": true,
+ "FILE_ACTION_ADDED": true,
+ "FILE_ACTION_MODIFIED": true,
+ "FILE_ACTION_REMOVED": true,
+ "FILE_ACTION_RENAMED_NEW_NAME": true,
+ "FILE_ACTION_RENAMED_OLD_NAME": true,
+ "FILE_APPEND_DATA": true,
+ "FILE_ATTRIBUTE_ARCHIVE": true,
+ "FILE_ATTRIBUTE_DIRECTORY": true,
+ "FILE_ATTRIBUTE_HIDDEN": true,
+ "FILE_ATTRIBUTE_NORMAL": true,
+ "FILE_ATTRIBUTE_READONLY": true,
+ "FILE_ATTRIBUTE_REPARSE_POINT": true,
+ "FILE_ATTRIBUTE_SYSTEM": true,
+ "FILE_BEGIN": true,
+ "FILE_CURRENT": true,
+ "FILE_END": true,
+ "FILE_FLAG_BACKUP_SEMANTICS": true,
+ "FILE_FLAG_OPEN_REPARSE_POINT": true,
+ "FILE_FLAG_OVERLAPPED": true,
+ "FILE_LIST_DIRECTORY": true,
+ "FILE_MAP_COPY": true,
+ "FILE_MAP_EXECUTE": true,
+ "FILE_MAP_READ": true,
+ "FILE_MAP_WRITE": true,
+ "FILE_NOTIFY_CHANGE_ATTRIBUTES": true,
+ "FILE_NOTIFY_CHANGE_CREATION": true,
+ "FILE_NOTIFY_CHANGE_DIR_NAME": true,
+ "FILE_NOTIFY_CHANGE_FILE_NAME": true,
+ "FILE_NOTIFY_CHANGE_LAST_ACCESS": true,
+ "FILE_NOTIFY_CHANGE_LAST_WRITE": true,
+ "FILE_NOTIFY_CHANGE_SIZE": true,
+ "FILE_SHARE_DELETE": true,
+ "FILE_SHARE_READ": true,
+ "FILE_SHARE_WRITE": true,
+ "FILE_SKIP_COMPLETION_PORT_ON_SUCCESS": true,
+ "FILE_SKIP_SET_EVENT_ON_HANDLE": true,
+ "FILE_TYPE_CHAR": true,
+ "FILE_TYPE_DISK": true,
+ "FILE_TYPE_PIPE": true,
+ "FILE_TYPE_REMOTE": true,
+ "FILE_TYPE_UNKNOWN": true,
+ "FILE_WRITE_ATTRIBUTES": true,
+ "FLUSHO": true,
+ "FORMAT_MESSAGE_ALLOCATE_BUFFER": true,
+ "FORMAT_MESSAGE_ARGUMENT_ARRAY": true,
+ "FORMAT_MESSAGE_FROM_HMODULE": true,
+ "FORMAT_MESSAGE_FROM_STRING": true,
+ "FORMAT_MESSAGE_FROM_SYSTEM": true,
+ "FORMAT_MESSAGE_IGNORE_INSERTS": true,
+ "FORMAT_MESSAGE_MAX_WIDTH_MASK": true,
+ "FSCTL_GET_REPARSE_POINT": true,
+ "F_ADDFILESIGS": true,
+ "F_ADDSIGS": true,
+ "F_ALLOCATEALL": true,
+ "F_ALLOCATECONTIG": true,
+ "F_CANCEL": true,
+ "F_CHKCLEAN": true,
+ "F_CLOSEM": true,
+ "F_DUP2FD": true,
+ "F_DUP2FD_CLOEXEC": true,
+ "F_DUPFD": true,
+ "F_DUPFD_CLOEXEC": true,
+ "F_EXLCK": true,
+ "F_FLUSH_DATA": true,
+ "F_FREEZE_FS": true,
+ "F_FSCTL": true,
+ "F_FSDIRMASK": true,
+ "F_FSIN": true,
+ "F_FSINOUT": true,
+ "F_FSOUT": true,
+ "F_FSPRIV": true,
+ "F_FSVOID": true,
+ "F_FULLFSYNC": true,
+ "F_GETFD": true,
+ "F_GETFL": true,
+ "F_GETLEASE": true,
+ "F_GETLK": true,
+ "F_GETLK64": true,
+ "F_GETLKPID": true,
+ "F_GETNOSIGPIPE": true,
+ "F_GETOWN": true,
+ "F_GETOWN_EX": true,
+ "F_GETPATH": true,
+ "F_GETPATH_MTMINFO": true,
+ "F_GETPIPE_SZ": true,
+ "F_GETPROTECTIONCLASS": true,
+ "F_GETSIG": true,
+ "F_GLOBAL_NOCACHE": true,
+ "F_LOCK": true,
+ "F_LOG2PHYS": true,
+ "F_LOG2PHYS_EXT": true,
+ "F_MARKDEPENDENCY": true,
+ "F_MAXFD": true,
+ "F_NOCACHE": true,
+ "F_NODIRECT": true,
+ "F_NOTIFY": true,
+ "F_OGETLK": true,
+ "F_OK": true,
+ "F_OSETLK": true,
+ "F_OSETLKW": true,
+ "F_PARAM_MASK": true,
+ "F_PARAM_MAX": true,
+ "F_PATHPKG_CHECK": true,
+ "F_PEOFPOSMODE": true,
+ "F_PREALLOCATE": true,
+ "F_RDADVISE": true,
+ "F_RDAHEAD": true,
+ "F_RDLCK": true,
+ "F_READAHEAD": true,
+ "F_READBOOTSTRAP": true,
+ "F_SETBACKINGSTORE": true,
+ "F_SETFD": true,
+ "F_SETFL": true,
+ "F_SETLEASE": true,
+ "F_SETLK": true,
+ "F_SETLK64": true,
+ "F_SETLKW": true,
+ "F_SETLKW64": true,
+ "F_SETLK_REMOTE": true,
+ "F_SETNOSIGPIPE": true,
+ "F_SETOWN": true,
+ "F_SETOWN_EX": true,
+ "F_SETPIPE_SZ": true,
+ "F_SETPROTECTIONCLASS": true,
+ "F_SETSIG": true,
+ "F_SETSIZE": true,
+ "F_SHLCK": true,
+ "F_TEST": true,
+ "F_THAW_FS": true,
+ "F_TLOCK": true,
+ "F_ULOCK": true,
+ "F_UNLCK": true,
+ "F_UNLCKSYS": true,
+ "F_VOLPOSMODE": true,
+ "F_WRITEBOOTSTRAP": true,
+ "F_WRLCK": true,
+ "Faccessat": true,
+ "Fallocate": true,
+ "Fbootstraptransfer_t": true,
+ "Fchdir": true,
+ "Fchflags": true,
+ "Fchmod": true,
+ "Fchmodat": true,
+ "Fchown": true,
+ "Fchownat": true,
+ "FcntlFlock": true,
+ "FdSet": true,
+ "Fdatasync": true,
+ "FileNotifyInformation": true,
+ "Filetime": true,
+ "FindClose": true,
+ "FindFirstFile": true,
+ "FindNextFile": true,
+ "Flock": true,
+ "Flock_t": true,
+ "FlushBpf": true,
+ "FlushFileBuffers": true,
+ "FlushViewOfFile": true,
+ "ForkExec": true,
+ "ForkLock": true,
+ "FormatMessage": true,
+ "Fpathconf": true,
+ "FreeAddrInfoW": true,
+ "FreeEnvironmentStrings": true,
+ "FreeLibrary": true,
+ "Fsid": true,
+ "Fstat": true,
+ "Fstatat": true,
+ "Fstatfs": true,
+ "Fstore_t": true,
+ "Fsync": true,
+ "Ftruncate": true,
+ "FullPath": true,
+ "Futimes": true,
+ "Futimesat": true,
+ "GENERIC_ALL": true,
+ "GENERIC_EXECUTE": true,
+ "GENERIC_READ": true,
+ "GENERIC_WRITE": true,
+ "GUID": true,
+ "GetAcceptExSockaddrs": true,
+ "GetAdaptersInfo": true,
+ "GetAddrInfoW": true,
+ "GetCommandLine": true,
+ "GetComputerName": true,
+ "GetConsoleMode": true,
+ "GetCurrentDirectory": true,
+ "GetCurrentProcess": true,
+ "GetEnvironmentStrings": true,
+ "GetEnvironmentVariable": true,
+ "GetExitCodeProcess": true,
+ "GetFileAttributes": true,
+ "GetFileAttributesEx": true,
+ "GetFileExInfoStandard": true,
+ "GetFileExMaxInfoLevel": true,
+ "GetFileInformationByHandle": true,
+ "GetFileType": true,
+ "GetFullPathName": true,
+ "GetHostByName": true,
+ "GetIfEntry": true,
+ "GetLastError": true,
+ "GetLengthSid": true,
+ "GetLongPathName": true,
+ "GetProcAddress": true,
+ "GetProcessTimes": true,
+ "GetProtoByName": true,
+ "GetQueuedCompletionStatus": true,
+ "GetServByName": true,
+ "GetShortPathName": true,
+ "GetStartupInfo": true,
+ "GetStdHandle": true,
+ "GetSystemTimeAsFileTime": true,
+ "GetTempPath": true,
+ "GetTimeZoneInformation": true,
+ "GetTokenInformation": true,
+ "GetUserNameEx": true,
+ "GetUserProfileDirectory": true,
+ "GetVersion": true,
+ "Getcwd": true,
+ "Getdents": true,
+ "Getdirentries": true,
+ "Getdtablesize": true,
+ "Getegid": true,
+ "Getenv": true,
+ "Geteuid": true,
+ "Getfsstat": true,
+ "Getgid": true,
+ "Getgroups": true,
+ "Getpagesize": true,
+ "Getpeername": true,
+ "Getpgid": true,
+ "Getpgrp": true,
+ "Getpid": true,
+ "Getppid": true,
+ "Getpriority": true,
+ "Getrlimit": true,
+ "Getrusage": true,
+ "Getsid": true,
+ "Getsockname": true,
+ "Getsockopt": true,
+ "GetsockoptByte": true,
+ "GetsockoptICMPv6Filter": true,
+ "GetsockoptIPMreq": true,
+ "GetsockoptIPMreqn": true,
+ "GetsockoptIPv6MTUInfo": true,
+ "GetsockoptIPv6Mreq": true,
+ "GetsockoptInet4Addr": true,
+ "GetsockoptInt": true,
+ "GetsockoptUcred": true,
+ "Gettid": true,
+ "Gettimeofday": true,
+ "Getuid": true,
+ "Getwd": true,
+ "Getxattr": true,
+ "HANDLE_FLAG_INHERIT": true,
+ "HKEY_CLASSES_ROOT": true,
+ "HKEY_CURRENT_CONFIG": true,
+ "HKEY_CURRENT_USER": true,
+ "HKEY_DYN_DATA": true,
+ "HKEY_LOCAL_MACHINE": true,
+ "HKEY_PERFORMANCE_DATA": true,
+ "HKEY_USERS": true,
+ "HUPCL": true,
+ "Handle": true,
+ "Hostent": true,
+ "ICANON": true,
+ "ICMP6_FILTER": true,
+ "ICMPV6_FILTER": true,
+ "ICMPv6Filter": true,
+ "ICRNL": true,
+ "IEXTEN": true,
+ "IFAN_ARRIVAL": true,
+ "IFAN_DEPARTURE": true,
+ "IFA_ADDRESS": true,
+ "IFA_ANYCAST": true,
+ "IFA_BROADCAST": true,
+ "IFA_CACHEINFO": true,
+ "IFA_F_DADFAILED": true,
+ "IFA_F_DEPRECATED": true,
+ "IFA_F_HOMEADDRESS": true,
+ "IFA_F_NODAD": true,
+ "IFA_F_OPTIMISTIC": true,
+ "IFA_F_PERMANENT": true,
+ "IFA_F_SECONDARY": true,
+ "IFA_F_TEMPORARY": true,
+ "IFA_F_TENTATIVE": true,
+ "IFA_LABEL": true,
+ "IFA_LOCAL": true,
+ "IFA_MAX": true,
+ "IFA_MULTICAST": true,
+ "IFA_ROUTE": true,
+ "IFA_UNSPEC": true,
+ "IFF_ALLMULTI": true,
+ "IFF_ALTPHYS": true,
+ "IFF_AUTOMEDIA": true,
+ "IFF_BROADCAST": true,
+ "IFF_CANTCHANGE": true,
+ "IFF_CANTCONFIG": true,
+ "IFF_DEBUG": true,
+ "IFF_DRV_OACTIVE": true,
+ "IFF_DRV_RUNNING": true,
+ "IFF_DYING": true,
+ "IFF_DYNAMIC": true,
+ "IFF_LINK0": true,
+ "IFF_LINK1": true,
+ "IFF_LINK2": true,
+ "IFF_LOOPBACK": true,
+ "IFF_MASTER": true,
+ "IFF_MONITOR": true,
+ "IFF_MULTICAST": true,
+ "IFF_NOARP": true,
+ "IFF_NOTRAILERS": true,
+ "IFF_NO_PI": true,
+ "IFF_OACTIVE": true,
+ "IFF_ONE_QUEUE": true,
+ "IFF_POINTOPOINT": true,
+ "IFF_POINTTOPOINT": true,
+ "IFF_PORTSEL": true,
+ "IFF_PPROMISC": true,
+ "IFF_PROMISC": true,
+ "IFF_RENAMING": true,
+ "IFF_RUNNING": true,
+ "IFF_SIMPLEX": true,
+ "IFF_SLAVE": true,
+ "IFF_SMART": true,
+ "IFF_STATICARP": true,
+ "IFF_TAP": true,
+ "IFF_TUN": true,
+ "IFF_TUN_EXCL": true,
+ "IFF_UP": true,
+ "IFF_VNET_HDR": true,
+ "IFLA_ADDRESS": true,
+ "IFLA_BROADCAST": true,
+ "IFLA_COST": true,
+ "IFLA_IFALIAS": true,
+ "IFLA_IFNAME": true,
+ "IFLA_LINK": true,
+ "IFLA_LINKINFO": true,
+ "IFLA_LINKMODE": true,
+ "IFLA_MAP": true,
+ "IFLA_MASTER": true,
+ "IFLA_MAX": true,
+ "IFLA_MTU": true,
+ "IFLA_NET_NS_PID": true,
+ "IFLA_OPERSTATE": true,
+ "IFLA_PRIORITY": true,
+ "IFLA_PROTINFO": true,
+ "IFLA_QDISC": true,
+ "IFLA_STATS": true,
+ "IFLA_TXQLEN": true,
+ "IFLA_UNSPEC": true,
+ "IFLA_WEIGHT": true,
+ "IFLA_WIRELESS": true,
+ "IFNAMSIZ": true,
+ "IFT_1822": true,
+ "IFT_A12MPPSWITCH": true,
+ "IFT_AAL2": true,
+ "IFT_AAL5": true,
+ "IFT_ADSL": true,
+ "IFT_AFLANE8023": true,
+ "IFT_AFLANE8025": true,
+ "IFT_ARAP": true,
+ "IFT_ARCNET": true,
+ "IFT_ARCNETPLUS": true,
+ "IFT_ASYNC": true,
+ "IFT_ATM": true,
+ "IFT_ATMDXI": true,
+ "IFT_ATMFUNI": true,
+ "IFT_ATMIMA": true,
+ "IFT_ATMLOGICAL": true,
+ "IFT_ATMRADIO": true,
+ "IFT_ATMSUBINTERFACE": true,
+ "IFT_ATMVCIENDPT": true,
+ "IFT_ATMVIRTUAL": true,
+ "IFT_BGPPOLICYACCOUNTING": true,
+ "IFT_BLUETOOTH": true,
+ "IFT_BRIDGE": true,
+ "IFT_BSC": true,
+ "IFT_CARP": true,
+ "IFT_CCTEMUL": true,
+ "IFT_CELLULAR": true,
+ "IFT_CEPT": true,
+ "IFT_CES": true,
+ "IFT_CHANNEL": true,
+ "IFT_CNR": true,
+ "IFT_COFFEE": true,
+ "IFT_COMPOSITELINK": true,
+ "IFT_DCN": true,
+ "IFT_DIGITALPOWERLINE": true,
+ "IFT_DIGITALWRAPPEROVERHEADCHANNEL": true,
+ "IFT_DLSW": true,
+ "IFT_DOCSCABLEDOWNSTREAM": true,
+ "IFT_DOCSCABLEMACLAYER": true,
+ "IFT_DOCSCABLEUPSTREAM": true,
+ "IFT_DOCSCABLEUPSTREAMCHANNEL": true,
+ "IFT_DS0": true,
+ "IFT_DS0BUNDLE": true,
+ "IFT_DS1FDL": true,
+ "IFT_DS3": true,
+ "IFT_DTM": true,
+ "IFT_DUMMY": true,
+ "IFT_DVBASILN": true,
+ "IFT_DVBASIOUT": true,
+ "IFT_DVBRCCDOWNSTREAM": true,
+ "IFT_DVBRCCMACLAYER": true,
+ "IFT_DVBRCCUPSTREAM": true,
+ "IFT_ECONET": true,
+ "IFT_ENC": true,
+ "IFT_EON": true,
+ "IFT_EPLRS": true,
+ "IFT_ESCON": true,
+ "IFT_ETHER": true,
+ "IFT_FAITH": true,
+ "IFT_FAST": true,
+ "IFT_FASTETHER": true,
+ "IFT_FASTETHERFX": true,
+ "IFT_FDDI": true,
+ "IFT_FIBRECHANNEL": true,
+ "IFT_FRAMERELAYINTERCONNECT": true,
+ "IFT_FRAMERELAYMPI": true,
+ "IFT_FRDLCIENDPT": true,
+ "IFT_FRELAY": true,
+ "IFT_FRELAYDCE": true,
+ "IFT_FRF16MFRBUNDLE": true,
+ "IFT_FRFORWARD": true,
+ "IFT_G703AT2MB": true,
+ "IFT_G703AT64K": true,
+ "IFT_GIF": true,
+ "IFT_GIGABITETHERNET": true,
+ "IFT_GR303IDT": true,
+ "IFT_GR303RDT": true,
+ "IFT_H323GATEKEEPER": true,
+ "IFT_H323PROXY": true,
+ "IFT_HDH1822": true,
+ "IFT_HDLC": true,
+ "IFT_HDSL2": true,
+ "IFT_HIPERLAN2": true,
+ "IFT_HIPPI": true,
+ "IFT_HIPPIINTERFACE": true,
+ "IFT_HOSTPAD": true,
+ "IFT_HSSI": true,
+ "IFT_HY": true,
+ "IFT_IBM370PARCHAN": true,
+ "IFT_IDSL": true,
+ "IFT_IEEE1394": true,
+ "IFT_IEEE80211": true,
+ "IFT_IEEE80212": true,
+ "IFT_IEEE8023ADLAG": true,
+ "IFT_IFGSN": true,
+ "IFT_IMT": true,
+ "IFT_INFINIBAND": true,
+ "IFT_INTERLEAVE": true,
+ "IFT_IP": true,
+ "IFT_IPFORWARD": true,
+ "IFT_IPOVERATM": true,
+ "IFT_IPOVERCDLC": true,
+ "IFT_IPOVERCLAW": true,
+ "IFT_IPSWITCH": true,
+ "IFT_IPXIP": true,
+ "IFT_ISDN": true,
+ "IFT_ISDNBASIC": true,
+ "IFT_ISDNPRIMARY": true,
+ "IFT_ISDNS": true,
+ "IFT_ISDNU": true,
+ "IFT_ISO88022LLC": true,
+ "IFT_ISO88023": true,
+ "IFT_ISO88024": true,
+ "IFT_ISO88025": true,
+ "IFT_ISO88025CRFPINT": true,
+ "IFT_ISO88025DTR": true,
+ "IFT_ISO88025FIBER": true,
+ "IFT_ISO88026": true,
+ "IFT_ISUP": true,
+ "IFT_L2VLAN": true,
+ "IFT_L3IPVLAN": true,
+ "IFT_L3IPXVLAN": true,
+ "IFT_LAPB": true,
+ "IFT_LAPD": true,
+ "IFT_LAPF": true,
+ "IFT_LINEGROUP": true,
+ "IFT_LOCALTALK": true,
+ "IFT_LOOP": true,
+ "IFT_MEDIAMAILOVERIP": true,
+ "IFT_MFSIGLINK": true,
+ "IFT_MIOX25": true,
+ "IFT_MODEM": true,
+ "IFT_MPC": true,
+ "IFT_MPLS": true,
+ "IFT_MPLSTUNNEL": true,
+ "IFT_MSDSL": true,
+ "IFT_MVL": true,
+ "IFT_MYRINET": true,
+ "IFT_NFAS": true,
+ "IFT_NSIP": true,
+ "IFT_OPTICALCHANNEL": true,
+ "IFT_OPTICALTRANSPORT": true,
+ "IFT_OTHER": true,
+ "IFT_P10": true,
+ "IFT_P80": true,
+ "IFT_PARA": true,
+ "IFT_PDP": true,
+ "IFT_PFLOG": true,
+ "IFT_PFLOW": true,
+ "IFT_PFSYNC": true,
+ "IFT_PLC": true,
+ "IFT_PON155": true,
+ "IFT_PON622": true,
+ "IFT_POS": true,
+ "IFT_PPP": true,
+ "IFT_PPPMULTILINKBUNDLE": true,
+ "IFT_PROPATM": true,
+ "IFT_PROPBWAP2MP": true,
+ "IFT_PROPCNLS": true,
+ "IFT_PROPDOCSWIRELESSDOWNSTREAM": true,
+ "IFT_PROPDOCSWIRELESSMACLAYER": true,
+ "IFT_PROPDOCSWIRELESSUPSTREAM": true,
+ "IFT_PROPMUX": true,
+ "IFT_PROPVIRTUAL": true,
+ "IFT_PROPWIRELESSP2P": true,
+ "IFT_PTPSERIAL": true,
+ "IFT_PVC": true,
+ "IFT_Q2931": true,
+ "IFT_QLLC": true,
+ "IFT_RADIOMAC": true,
+ "IFT_RADSL": true,
+ "IFT_REACHDSL": true,
+ "IFT_RFC1483": true,
+ "IFT_RS232": true,
+ "IFT_RSRB": true,
+ "IFT_SDLC": true,
+ "IFT_SDSL": true,
+ "IFT_SHDSL": true,
+ "IFT_SIP": true,
+ "IFT_SIPSIG": true,
+ "IFT_SIPTG": true,
+ "IFT_SLIP": true,
+ "IFT_SMDSDXI": true,
+ "IFT_SMDSICIP": true,
+ "IFT_SONET": true,
+ "IFT_SONETOVERHEADCHANNEL": true,
+ "IFT_SONETPATH": true,
+ "IFT_SONETVT": true,
+ "IFT_SRP": true,
+ "IFT_SS7SIGLINK": true,
+ "IFT_STACKTOSTACK": true,
+ "IFT_STARLAN": true,
+ "IFT_STF": true,
+ "IFT_T1": true,
+ "IFT_TDLC": true,
+ "IFT_TELINK": true,
+ "IFT_TERMPAD": true,
+ "IFT_TR008": true,
+ "IFT_TRANSPHDLC": true,
+ "IFT_TUNNEL": true,
+ "IFT_ULTRA": true,
+ "IFT_USB": true,
+ "IFT_V11": true,
+ "IFT_V35": true,
+ "IFT_V36": true,
+ "IFT_V37": true,
+ "IFT_VDSL": true,
+ "IFT_VIRTUALIPADDRESS": true,
+ "IFT_VIRTUALTG": true,
+ "IFT_VOICEDID": true,
+ "IFT_VOICEEM": true,
+ "IFT_VOICEEMFGD": true,
+ "IFT_VOICEENCAP": true,
+ "IFT_VOICEFGDEANA": true,
+ "IFT_VOICEFXO": true,
+ "IFT_VOICEFXS": true,
+ "IFT_VOICEOVERATM": true,
+ "IFT_VOICEOVERCABLE": true,
+ "IFT_VOICEOVERFRAMERELAY": true,
+ "IFT_VOICEOVERIP": true,
+ "IFT_X213": true,
+ "IFT_X25": true,
+ "IFT_X25DDN": true,
+ "IFT_X25HUNTGROUP": true,
+ "IFT_X25MLP": true,
+ "IFT_X25PLE": true,
+ "IFT_XETHER": true,
+ "IGNBRK": true,
+ "IGNCR": true,
+ "IGNORE": true,
+ "IGNPAR": true,
+ "IMAXBEL": true,
+ "INFINITE": true,
+ "INLCR": true,
+ "INPCK": true,
+ "INVALID_FILE_ATTRIBUTES": true,
+ "IN_ACCESS": true,
+ "IN_ALL_EVENTS": true,
+ "IN_ATTRIB": true,
+ "IN_CLASSA_HOST": true,
+ "IN_CLASSA_MAX": true,
+ "IN_CLASSA_NET": true,
+ "IN_CLASSA_NSHIFT": true,
+ "IN_CLASSB_HOST": true,
+ "IN_CLASSB_MAX": true,
+ "IN_CLASSB_NET": true,
+ "IN_CLASSB_NSHIFT": true,
+ "IN_CLASSC_HOST": true,
+ "IN_CLASSC_NET": true,
+ "IN_CLASSC_NSHIFT": true,
+ "IN_CLASSD_HOST": true,
+ "IN_CLASSD_NET": true,
+ "IN_CLASSD_NSHIFT": true,
+ "IN_CLOEXEC": true,
+ "IN_CLOSE": true,
+ "IN_CLOSE_NOWRITE": true,
+ "IN_CLOSE_WRITE": true,
+ "IN_CREATE": true,
+ "IN_DELETE": true,
+ "IN_DELETE_SELF": true,
+ "IN_DONT_FOLLOW": true,
+ "IN_EXCL_UNLINK": true,
+ "IN_IGNORED": true,
+ "IN_ISDIR": true,
+ "IN_LINKLOCALNETNUM": true,
+ "IN_LOOPBACKNET": true,
+ "IN_MASK_ADD": true,
+ "IN_MODIFY": true,
+ "IN_MOVE": true,
+ "IN_MOVED_FROM": true,
+ "IN_MOVED_TO": true,
+ "IN_MOVE_SELF": true,
+ "IN_NONBLOCK": true,
+ "IN_ONESHOT": true,
+ "IN_ONLYDIR": true,
+ "IN_OPEN": true,
+ "IN_Q_OVERFLOW": true,
+ "IN_RFC3021_HOST": true,
+ "IN_RFC3021_MASK": true,
+ "IN_RFC3021_NET": true,
+ "IN_RFC3021_NSHIFT": true,
+ "IN_UNMOUNT": true,
+ "IOC_IN": true,
+ "IOC_INOUT": true,
+ "IOC_OUT": true,
+ "IOC_VENDOR": true,
+ "IOC_WS2": true,
+ "IO_REPARSE_TAG_SYMLINK": true,
+ "IPMreq": true,
+ "IPMreqn": true,
+ "IPPROTO_3PC": true,
+ "IPPROTO_ADFS": true,
+ "IPPROTO_AH": true,
+ "IPPROTO_AHIP": true,
+ "IPPROTO_APES": true,
+ "IPPROTO_ARGUS": true,
+ "IPPROTO_AX25": true,
+ "IPPROTO_BHA": true,
+ "IPPROTO_BLT": true,
+ "IPPROTO_BRSATMON": true,
+ "IPPROTO_CARP": true,
+ "IPPROTO_CFTP": true,
+ "IPPROTO_CHAOS": true,
+ "IPPROTO_CMTP": true,
+ "IPPROTO_COMP": true,
+ "IPPROTO_CPHB": true,
+ "IPPROTO_CPNX": true,
+ "IPPROTO_DCCP": true,
+ "IPPROTO_DDP": true,
+ "IPPROTO_DGP": true,
+ "IPPROTO_DIVERT": true,
+ "IPPROTO_DIVERT_INIT": true,
+ "IPPROTO_DIVERT_RESP": true,
+ "IPPROTO_DONE": true,
+ "IPPROTO_DSTOPTS": true,
+ "IPPROTO_EGP": true,
+ "IPPROTO_EMCON": true,
+ "IPPROTO_ENCAP": true,
+ "IPPROTO_EON": true,
+ "IPPROTO_ESP": true,
+ "IPPROTO_ETHERIP": true,
+ "IPPROTO_FRAGMENT": true,
+ "IPPROTO_GGP": true,
+ "IPPROTO_GMTP": true,
+ "IPPROTO_GRE": true,
+ "IPPROTO_HELLO": true,
+ "IPPROTO_HMP": true,
+ "IPPROTO_HOPOPTS": true,
+ "IPPROTO_ICMP": true,
+ "IPPROTO_ICMPV6": true,
+ "IPPROTO_IDP": true,
+ "IPPROTO_IDPR": true,
+ "IPPROTO_IDRP": true,
+ "IPPROTO_IGMP": true,
+ "IPPROTO_IGP": true,
+ "IPPROTO_IGRP": true,
+ "IPPROTO_IL": true,
+ "IPPROTO_INLSP": true,
+ "IPPROTO_INP": true,
+ "IPPROTO_IP": true,
+ "IPPROTO_IPCOMP": true,
+ "IPPROTO_IPCV": true,
+ "IPPROTO_IPEIP": true,
+ "IPPROTO_IPIP": true,
+ "IPPROTO_IPPC": true,
+ "IPPROTO_IPV4": true,
+ "IPPROTO_IPV6": true,
+ "IPPROTO_IPV6_ICMP": true,
+ "IPPROTO_IRTP": true,
+ "IPPROTO_KRYPTOLAN": true,
+ "IPPROTO_LARP": true,
+ "IPPROTO_LEAF1": true,
+ "IPPROTO_LEAF2": true,
+ "IPPROTO_MAX": true,
+ "IPPROTO_MAXID": true,
+ "IPPROTO_MEAS": true,
+ "IPPROTO_MH": true,
+ "IPPROTO_MHRP": true,
+ "IPPROTO_MICP": true,
+ "IPPROTO_MOBILE": true,
+ "IPPROTO_MPLS": true,
+ "IPPROTO_MTP": true,
+ "IPPROTO_MUX": true,
+ "IPPROTO_ND": true,
+ "IPPROTO_NHRP": true,
+ "IPPROTO_NONE": true,
+ "IPPROTO_NSP": true,
+ "IPPROTO_NVPII": true,
+ "IPPROTO_OLD_DIVERT": true,
+ "IPPROTO_OSPFIGP": true,
+ "IPPROTO_PFSYNC": true,
+ "IPPROTO_PGM": true,
+ "IPPROTO_PIGP": true,
+ "IPPROTO_PIM": true,
+ "IPPROTO_PRM": true,
+ "IPPROTO_PUP": true,
+ "IPPROTO_PVP": true,
+ "IPPROTO_RAW": true,
+ "IPPROTO_RCCMON": true,
+ "IPPROTO_RDP": true,
+ "IPPROTO_ROUTING": true,
+ "IPPROTO_RSVP": true,
+ "IPPROTO_RVD": true,
+ "IPPROTO_SATEXPAK": true,
+ "IPPROTO_SATMON": true,
+ "IPPROTO_SCCSP": true,
+ "IPPROTO_SCTP": true,
+ "IPPROTO_SDRP": true,
+ "IPPROTO_SEND": true,
+ "IPPROTO_SEP": true,
+ "IPPROTO_SKIP": true,
+ "IPPROTO_SPACER": true,
+ "IPPROTO_SRPC": true,
+ "IPPROTO_ST": true,
+ "IPPROTO_SVMTP": true,
+ "IPPROTO_SWIPE": true,
+ "IPPROTO_TCF": true,
+ "IPPROTO_TCP": true,
+ "IPPROTO_TLSP": true,
+ "IPPROTO_TP": true,
+ "IPPROTO_TPXX": true,
+ "IPPROTO_TRUNK1": true,
+ "IPPROTO_TRUNK2": true,
+ "IPPROTO_TTP": true,
+ "IPPROTO_UDP": true,
+ "IPPROTO_UDPLITE": true,
+ "IPPROTO_VINES": true,
+ "IPPROTO_VISA": true,
+ "IPPROTO_VMTP": true,
+ "IPPROTO_VRRP": true,
+ "IPPROTO_WBEXPAK": true,
+ "IPPROTO_WBMON": true,
+ "IPPROTO_WSN": true,
+ "IPPROTO_XNET": true,
+ "IPPROTO_XTP": true,
+ "IPV6_2292DSTOPTS": true,
+ "IPV6_2292HOPLIMIT": true,
+ "IPV6_2292HOPOPTS": true,
+ "IPV6_2292NEXTHOP": true,
+ "IPV6_2292PKTINFO": true,
+ "IPV6_2292PKTOPTIONS": true,
+ "IPV6_2292RTHDR": true,
+ "IPV6_ADDRFORM": true,
+ "IPV6_ADD_MEMBERSHIP": true,
+ "IPV6_AUTHHDR": true,
+ "IPV6_AUTH_LEVEL": true,
+ "IPV6_AUTOFLOWLABEL": true,
+ "IPV6_BINDANY": true,
+ "IPV6_BINDV6ONLY": true,
+ "IPV6_BOUND_IF": true,
+ "IPV6_CHECKSUM": true,
+ "IPV6_DEFAULT_MULTICAST_HOPS": true,
+ "IPV6_DEFAULT_MULTICAST_LOOP": true,
+ "IPV6_DEFHLIM": true,
+ "IPV6_DONTFRAG": true,
+ "IPV6_DROP_MEMBERSHIP": true,
+ "IPV6_DSTOPTS": true,
+ "IPV6_ESP_NETWORK_LEVEL": true,
+ "IPV6_ESP_TRANS_LEVEL": true,
+ "IPV6_FAITH": true,
+ "IPV6_FLOWINFO_MASK": true,
+ "IPV6_FLOWLABEL_MASK": true,
+ "IPV6_FRAGTTL": true,
+ "IPV6_FW_ADD": true,
+ "IPV6_FW_DEL": true,
+ "IPV6_FW_FLUSH": true,
+ "IPV6_FW_GET": true,
+ "IPV6_FW_ZERO": true,
+ "IPV6_HLIMDEC": true,
+ "IPV6_HOPLIMIT": true,
+ "IPV6_HOPOPTS": true,
+ "IPV6_IPCOMP_LEVEL": true,
+ "IPV6_IPSEC_POLICY": true,
+ "IPV6_JOIN_ANYCAST": true,
+ "IPV6_JOIN_GROUP": true,
+ "IPV6_LEAVE_ANYCAST": true,
+ "IPV6_LEAVE_GROUP": true,
+ "IPV6_MAXHLIM": true,
+ "IPV6_MAXOPTHDR": true,
+ "IPV6_MAXPACKET": true,
+ "IPV6_MAX_GROUP_SRC_FILTER": true,
+ "IPV6_MAX_MEMBERSHIPS": true,
+ "IPV6_MAX_SOCK_SRC_FILTER": true,
+ "IPV6_MIN_MEMBERSHIPS": true,
+ "IPV6_MMTU": true,
+ "IPV6_MSFILTER": true,
+ "IPV6_MTU": true,
+ "IPV6_MTU_DISCOVER": true,
+ "IPV6_MULTICAST_HOPS": true,
+ "IPV6_MULTICAST_IF": true,
+ "IPV6_MULTICAST_LOOP": true,
+ "IPV6_NEXTHOP": true,
+ "IPV6_OPTIONS": true,
+ "IPV6_PATHMTU": true,
+ "IPV6_PIPEX": true,
+ "IPV6_PKTINFO": true,
+ "IPV6_PMTUDISC_DO": true,
+ "IPV6_PMTUDISC_DONT": true,
+ "IPV6_PMTUDISC_PROBE": true,
+ "IPV6_PMTUDISC_WANT": true,
+ "IPV6_PORTRANGE": true,
+ "IPV6_PORTRANGE_DEFAULT": true,
+ "IPV6_PORTRANGE_HIGH": true,
+ "IPV6_PORTRANGE_LOW": true,
+ "IPV6_PREFER_TEMPADDR": true,
+ "IPV6_RECVDSTOPTS": true,
+ "IPV6_RECVDSTPORT": true,
+ "IPV6_RECVERR": true,
+ "IPV6_RECVHOPLIMIT": true,
+ "IPV6_RECVHOPOPTS": true,
+ "IPV6_RECVPATHMTU": true,
+ "IPV6_RECVPKTINFO": true,
+ "IPV6_RECVRTHDR": true,
+ "IPV6_RECVTCLASS": true,
+ "IPV6_ROUTER_ALERT": true,
+ "IPV6_RTABLE": true,
+ "IPV6_RTHDR": true,
+ "IPV6_RTHDRDSTOPTS": true,
+ "IPV6_RTHDR_LOOSE": true,
+ "IPV6_RTHDR_STRICT": true,
+ "IPV6_RTHDR_TYPE_0": true,
+ "IPV6_RXDSTOPTS": true,
+ "IPV6_RXHOPOPTS": true,
+ "IPV6_SOCKOPT_RESERVED1": true,
+ "IPV6_TCLASS": true,
+ "IPV6_UNICAST_HOPS": true,
+ "IPV6_USE_MIN_MTU": true,
+ "IPV6_V6ONLY": true,
+ "IPV6_VERSION": true,
+ "IPV6_VERSION_MASK": true,
+ "IPV6_XFRM_POLICY": true,
+ "IP_ADD_MEMBERSHIP": true,
+ "IP_ADD_SOURCE_MEMBERSHIP": true,
+ "IP_AUTH_LEVEL": true,
+ "IP_BINDANY": true,
+ "IP_BLOCK_SOURCE": true,
+ "IP_BOUND_IF": true,
+ "IP_DEFAULT_MULTICAST_LOOP": true,
+ "IP_DEFAULT_MULTICAST_TTL": true,
+ "IP_DF": true,
+ "IP_DIVERTFL": true,
+ "IP_DONTFRAG": true,
+ "IP_DROP_MEMBERSHIP": true,
+ "IP_DROP_SOURCE_MEMBERSHIP": true,
+ "IP_DUMMYNET3": true,
+ "IP_DUMMYNET_CONFIGURE": true,
+ "IP_DUMMYNET_DEL": true,
+ "IP_DUMMYNET_FLUSH": true,
+ "IP_DUMMYNET_GET": true,
+ "IP_EF": true,
+ "IP_ERRORMTU": true,
+ "IP_ESP_NETWORK_LEVEL": true,
+ "IP_ESP_TRANS_LEVEL": true,
+ "IP_FAITH": true,
+ "IP_FREEBIND": true,
+ "IP_FW3": true,
+ "IP_FW_ADD": true,
+ "IP_FW_DEL": true,
+ "IP_FW_FLUSH": true,
+ "IP_FW_GET": true,
+ "IP_FW_NAT_CFG": true,
+ "IP_FW_NAT_DEL": true,
+ "IP_FW_NAT_GET_CONFIG": true,
+ "IP_FW_NAT_GET_LOG": true,
+ "IP_FW_RESETLOG": true,
+ "IP_FW_TABLE_ADD": true,
+ "IP_FW_TABLE_DEL": true,
+ "IP_FW_TABLE_FLUSH": true,
+ "IP_FW_TABLE_GETSIZE": true,
+ "IP_FW_TABLE_LIST": true,
+ "IP_FW_ZERO": true,
+ "IP_HDRINCL": true,
+ "IP_IPCOMP_LEVEL": true,
+ "IP_IPSECFLOWINFO": true,
+ "IP_IPSEC_LOCAL_AUTH": true,
+ "IP_IPSEC_LOCAL_CRED": true,
+ "IP_IPSEC_LOCAL_ID": true,
+ "IP_IPSEC_POLICY": true,
+ "IP_IPSEC_REMOTE_AUTH": true,
+ "IP_IPSEC_REMOTE_CRED": true,
+ "IP_IPSEC_REMOTE_ID": true,
+ "IP_MAXPACKET": true,
+ "IP_MAX_GROUP_SRC_FILTER": true,
+ "IP_MAX_MEMBERSHIPS": true,
+ "IP_MAX_SOCK_MUTE_FILTER": true,
+ "IP_MAX_SOCK_SRC_FILTER": true,
+ "IP_MAX_SOURCE_FILTER": true,
+ "IP_MF": true,
+ "IP_MINFRAGSIZE": true,
+ "IP_MINTTL": true,
+ "IP_MIN_MEMBERSHIPS": true,
+ "IP_MSFILTER": true,
+ "IP_MSS": true,
+ "IP_MTU": true,
+ "IP_MTU_DISCOVER": true,
+ "IP_MULTICAST_IF": true,
+ "IP_MULTICAST_IFINDEX": true,
+ "IP_MULTICAST_LOOP": true,
+ "IP_MULTICAST_TTL": true,
+ "IP_MULTICAST_VIF": true,
+ "IP_NAT__XXX": true,
+ "IP_OFFMASK": true,
+ "IP_OLD_FW_ADD": true,
+ "IP_OLD_FW_DEL": true,
+ "IP_OLD_FW_FLUSH": true,
+ "IP_OLD_FW_GET": true,
+ "IP_OLD_FW_RESETLOG": true,
+ "IP_OLD_FW_ZERO": true,
+ "IP_ONESBCAST": true,
+ "IP_OPTIONS": true,
+ "IP_ORIGDSTADDR": true,
+ "IP_PASSSEC": true,
+ "IP_PIPEX": true,
+ "IP_PKTINFO": true,
+ "IP_PKTOPTIONS": true,
+ "IP_PMTUDISC": true,
+ "IP_PMTUDISC_DO": true,
+ "IP_PMTUDISC_DONT": true,
+ "IP_PMTUDISC_PROBE": true,
+ "IP_PMTUDISC_WANT": true,
+ "IP_PORTRANGE": true,
+ "IP_PORTRANGE_DEFAULT": true,
+ "IP_PORTRANGE_HIGH": true,
+ "IP_PORTRANGE_LOW": true,
+ "IP_RECVDSTADDR": true,
+ "IP_RECVDSTPORT": true,
+ "IP_RECVERR": true,
+ "IP_RECVIF": true,
+ "IP_RECVOPTS": true,
+ "IP_RECVORIGDSTADDR": true,
+ "IP_RECVPKTINFO": true,
+ "IP_RECVRETOPTS": true,
+ "IP_RECVRTABLE": true,
+ "IP_RECVTOS": true,
+ "IP_RECVTTL": true,
+ "IP_RETOPTS": true,
+ "IP_RF": true,
+ "IP_ROUTER_ALERT": true,
+ "IP_RSVP_OFF": true,
+ "IP_RSVP_ON": true,
+ "IP_RSVP_VIF_OFF": true,
+ "IP_RSVP_VIF_ON": true,
+ "IP_RTABLE": true,
+ "IP_SENDSRCADDR": true,
+ "IP_STRIPHDR": true,
+ "IP_TOS": true,
+ "IP_TRAFFIC_MGT_BACKGROUND": true,
+ "IP_TRANSPARENT": true,
+ "IP_TTL": true,
+ "IP_UNBLOCK_SOURCE": true,
+ "IP_XFRM_POLICY": true,
+ "IPv6MTUInfo": true,
+ "IPv6Mreq": true,
+ "ISIG": true,
+ "ISTRIP": true,
+ "IUCLC": true,
+ "IUTF8": true,
+ "IXANY": true,
+ "IXOFF": true,
+ "IXON": true,
+ "IfAddrmsg": true,
+ "IfAnnounceMsghdr": true,
+ "IfData": true,
+ "IfInfomsg": true,
+ "IfMsghdr": true,
+ "IfaMsghdr": true,
+ "IfmaMsghdr": true,
+ "IfmaMsghdr2": true,
+ "ImplementsGetwd": true,
+ "Inet4Pktinfo": true,
+ "Inet6Pktinfo": true,
+ "InotifyAddWatch": true,
+ "InotifyEvent": true,
+ "InotifyInit": true,
+ "InotifyInit1": true,
+ "InotifyRmWatch": true,
+ "InterfaceAddrMessage": true,
+ "InterfaceAnnounceMessage": true,
+ "InterfaceInfo": true,
+ "InterfaceMessage": true,
+ "InterfaceMulticastAddrMessage": true,
+ "InvalidHandle": true,
+ "Ioperm": true,
+ "Iopl": true,
+ "Iovec": true,
+ "IpAdapterInfo": true,
+ "IpAddrString": true,
+ "IpAddressString": true,
+ "IpMaskString": true,
+ "Issetugid": true,
+ "KEY_ALL_ACCESS": true,
+ "KEY_CREATE_LINK": true,
+ "KEY_CREATE_SUB_KEY": true,
+ "KEY_ENUMERATE_SUB_KEYS": true,
+ "KEY_EXECUTE": true,
+ "KEY_NOTIFY": true,
+ "KEY_QUERY_VALUE": true,
+ "KEY_READ": true,
+ "KEY_SET_VALUE": true,
+ "KEY_WOW64_32KEY": true,
+ "KEY_WOW64_64KEY": true,
+ "KEY_WRITE": true,
+ "Kevent": true,
+ "Kevent_t": true,
+ "Kill": true,
+ "Klogctl": true,
+ "Kqueue": true,
+ "LANG_ENGLISH": true,
+ "LAYERED_PROTOCOL": true,
+ "LCNT_OVERLOAD_FLUSH": true,
+ "LINUX_REBOOT_CMD_CAD_OFF": true,
+ "LINUX_REBOOT_CMD_CAD_ON": true,
+ "LINUX_REBOOT_CMD_HALT": true,
+ "LINUX_REBOOT_CMD_KEXEC": true,
+ "LINUX_REBOOT_CMD_POWER_OFF": true,
+ "LINUX_REBOOT_CMD_RESTART": true,
+ "LINUX_REBOOT_CMD_RESTART2": true,
+ "LINUX_REBOOT_CMD_SW_SUSPEND": true,
+ "LINUX_REBOOT_MAGIC1": true,
+ "LINUX_REBOOT_MAGIC2": true,
+ "LOCK_EX": true,
+ "LOCK_NB": true,
+ "LOCK_SH": true,
+ "LOCK_UN": true,
+ "LazyDLL": true,
+ "LazyProc": true,
+ "Lchown": true,
+ "Linger": true,
+ "Link": true,
+ "Listen": true,
+ "Listxattr": true,
+ "LoadCancelIoEx": true,
+ "LoadConnectEx": true,
+ "LoadCreateSymbolicLink": true,
+ "LoadDLL": true,
+ "LoadGetAddrInfo": true,
+ "LoadLibrary": true,
+ "LoadSetFileCompletionNotificationModes": true,
+ "LocalFree": true,
+ "Log2phys_t": true,
+ "LookupAccountName": true,
+ "LookupAccountSid": true,
+ "LookupSID": true,
+ "LsfJump": true,
+ "LsfSocket": true,
+ "LsfStmt": true,
+ "Lstat": true,
+ "MADV_AUTOSYNC": true,
+ "MADV_CAN_REUSE": true,
+ "MADV_CORE": true,
+ "MADV_DOFORK": true,
+ "MADV_DONTFORK": true,
+ "MADV_DONTNEED": true,
+ "MADV_FREE": true,
+ "MADV_FREE_REUSABLE": true,
+ "MADV_FREE_REUSE": true,
+ "MADV_HUGEPAGE": true,
+ "MADV_HWPOISON": true,
+ "MADV_MERGEABLE": true,
+ "MADV_NOCORE": true,
+ "MADV_NOHUGEPAGE": true,
+ "MADV_NORMAL": true,
+ "MADV_NOSYNC": true,
+ "MADV_PROTECT": true,
+ "MADV_RANDOM": true,
+ "MADV_REMOVE": true,
+ "MADV_SEQUENTIAL": true,
+ "MADV_SPACEAVAIL": true,
+ "MADV_UNMERGEABLE": true,
+ "MADV_WILLNEED": true,
+ "MADV_ZERO_WIRED_PAGES": true,
+ "MAP_32BIT": true,
+ "MAP_ALIGNED_SUPER": true,
+ "MAP_ALIGNMENT_16MB": true,
+ "MAP_ALIGNMENT_1TB": true,
+ "MAP_ALIGNMENT_256TB": true,
+ "MAP_ALIGNMENT_4GB": true,
+ "MAP_ALIGNMENT_64KB": true,
+ "MAP_ALIGNMENT_64PB": true,
+ "MAP_ALIGNMENT_MASK": true,
+ "MAP_ALIGNMENT_SHIFT": true,
+ "MAP_ANON": true,
+ "MAP_ANONYMOUS": true,
+ "MAP_COPY": true,
+ "MAP_DENYWRITE": true,
+ "MAP_EXECUTABLE": true,
+ "MAP_FILE": true,
+ "MAP_FIXED": true,
+ "MAP_FLAGMASK": true,
+ "MAP_GROWSDOWN": true,
+ "MAP_HASSEMAPHORE": true,
+ "MAP_HUGETLB": true,
+ "MAP_INHERIT": true,
+ "MAP_INHERIT_COPY": true,
+ "MAP_INHERIT_DEFAULT": true,
+ "MAP_INHERIT_DONATE_COPY": true,
+ "MAP_INHERIT_NONE": true,
+ "MAP_INHERIT_SHARE": true,
+ "MAP_JIT": true,
+ "MAP_LOCKED": true,
+ "MAP_NOCACHE": true,
+ "MAP_NOCORE": true,
+ "MAP_NOEXTEND": true,
+ "MAP_NONBLOCK": true,
+ "MAP_NORESERVE": true,
+ "MAP_NOSYNC": true,
+ "MAP_POPULATE": true,
+ "MAP_PREFAULT_READ": true,
+ "MAP_PRIVATE": true,
+ "MAP_RENAME": true,
+ "MAP_RESERVED0080": true,
+ "MAP_RESERVED0100": true,
+ "MAP_SHARED": true,
+ "MAP_STACK": true,
+ "MAP_TRYFIXED": true,
+ "MAP_TYPE": true,
+ "MAP_WIRED": true,
+ "MAXIMUM_REPARSE_DATA_BUFFER_SIZE": true,
+ "MAXLEN_IFDESCR": true,
+ "MAXLEN_PHYSADDR": true,
+ "MAX_ADAPTER_ADDRESS_LENGTH": true,
+ "MAX_ADAPTER_DESCRIPTION_LENGTH": true,
+ "MAX_ADAPTER_NAME_LENGTH": true,
+ "MAX_COMPUTERNAME_LENGTH": true,
+ "MAX_INTERFACE_NAME_LEN": true,
+ "MAX_LONG_PATH": true,
+ "MAX_PATH": true,
+ "MAX_PROTOCOL_CHAIN": true,
+ "MCL_CURRENT": true,
+ "MCL_FUTURE": true,
+ "MNT_DETACH": true,
+ "MNT_EXPIRE": true,
+ "MNT_FORCE": true,
+ "MSG_BCAST": true,
+ "MSG_CMSG_CLOEXEC": true,
+ "MSG_COMPAT": true,
+ "MSG_CONFIRM": true,
+ "MSG_CONTROLMBUF": true,
+ "MSG_CTRUNC": true,
+ "MSG_DONTROUTE": true,
+ "MSG_DONTWAIT": true,
+ "MSG_EOF": true,
+ "MSG_EOR": true,
+ "MSG_ERRQUEUE": true,
+ "MSG_FASTOPEN": true,
+ "MSG_FIN": true,
+ "MSG_FLUSH": true,
+ "MSG_HAVEMORE": true,
+ "MSG_HOLD": true,
+ "MSG_IOVUSRSPACE": true,
+ "MSG_LENUSRSPACE": true,
+ "MSG_MCAST": true,
+ "MSG_MORE": true,
+ "MSG_NAMEMBUF": true,
+ "MSG_NBIO": true,
+ "MSG_NEEDSA": true,
+ "MSG_NOSIGNAL": true,
+ "MSG_NOTIFICATION": true,
+ "MSG_OOB": true,
+ "MSG_PEEK": true,
+ "MSG_PROXY": true,
+ "MSG_RCVMORE": true,
+ "MSG_RST": true,
+ "MSG_SEND": true,
+ "MSG_SYN": true,
+ "MSG_TRUNC": true,
+ "MSG_TRYHARD": true,
+ "MSG_USERFLAGS": true,
+ "MSG_WAITALL": true,
+ "MSG_WAITFORONE": true,
+ "MSG_WAITSTREAM": true,
+ "MS_ACTIVE": true,
+ "MS_ASYNC": true,
+ "MS_BIND": true,
+ "MS_DEACTIVATE": true,
+ "MS_DIRSYNC": true,
+ "MS_INVALIDATE": true,
+ "MS_I_VERSION": true,
+ "MS_KERNMOUNT": true,
+ "MS_KILLPAGES": true,
+ "MS_MANDLOCK": true,
+ "MS_MGC_MSK": true,
+ "MS_MGC_VAL": true,
+ "MS_MOVE": true,
+ "MS_NOATIME": true,
+ "MS_NODEV": true,
+ "MS_NODIRATIME": true,
+ "MS_NOEXEC": true,
+ "MS_NOSUID": true,
+ "MS_NOUSER": true,
+ "MS_POSIXACL": true,
+ "MS_PRIVATE": true,
+ "MS_RDONLY": true,
+ "MS_REC": true,
+ "MS_RELATIME": true,
+ "MS_REMOUNT": true,
+ "MS_RMT_MASK": true,
+ "MS_SHARED": true,
+ "MS_SILENT": true,
+ "MS_SLAVE": true,
+ "MS_STRICTATIME": true,
+ "MS_SYNC": true,
+ "MS_SYNCHRONOUS": true,
+ "MS_UNBINDABLE": true,
+ "Madvise": true,
+ "MapViewOfFile": true,
+ "MaxTokenInfoClass": true,
+ "Mclpool": true,
+ "MibIfRow": true,
+ "Mkdir": true,
+ "Mkdirat": true,
+ "Mkfifo": true,
+ "Mknod": true,
+ "Mknodat": true,
+ "Mlock": true,
+ "Mlockall": true,
+ "Mmap": true,
+ "Mount": true,
+ "MoveFile": true,
+ "Mprotect": true,
+ "Msghdr": true,
+ "Munlock": true,
+ "Munlockall": true,
+ "Munmap": true,
+ "MustLoadDLL": true,
+ "NAME_MAX": true,
+ "NETLINK_ADD_MEMBERSHIP": true,
+ "NETLINK_AUDIT": true,
+ "NETLINK_BROADCAST_ERROR": true,
+ "NETLINK_CONNECTOR": true,
+ "NETLINK_DNRTMSG": true,
+ "NETLINK_DROP_MEMBERSHIP": true,
+ "NETLINK_ECRYPTFS": true,
+ "NETLINK_FIB_LOOKUP": true,
+ "NETLINK_FIREWALL": true,
+ "NETLINK_GENERIC": true,
+ "NETLINK_INET_DIAG": true,
+ "NETLINK_IP6_FW": true,
+ "NETLINK_ISCSI": true,
+ "NETLINK_KOBJECT_UEVENT": true,
+ "NETLINK_NETFILTER": true,
+ "NETLINK_NFLOG": true,
+ "NETLINK_NO_ENOBUFS": true,
+ "NETLINK_PKTINFO": true,
+ "NETLINK_RDMA": true,
+ "NETLINK_ROUTE": true,
+ "NETLINK_SCSITRANSPORT": true,
+ "NETLINK_SELINUX": true,
+ "NETLINK_UNUSED": true,
+ "NETLINK_USERSOCK": true,
+ "NETLINK_XFRM": true,
+ "NET_RT_DUMP": true,
+ "NET_RT_DUMP2": true,
+ "NET_RT_FLAGS": true,
+ "NET_RT_IFLIST": true,
+ "NET_RT_IFLIST2": true,
+ "NET_RT_IFLISTL": true,
+ "NET_RT_IFMALIST": true,
+ "NET_RT_MAXID": true,
+ "NET_RT_OIFLIST": true,
+ "NET_RT_OOIFLIST": true,
+ "NET_RT_STAT": true,
+ "NET_RT_STATS": true,
+ "NET_RT_TABLE": true,
+ "NET_RT_TRASH": true,
+ "NLA_ALIGNTO": true,
+ "NLA_F_NESTED": true,
+ "NLA_F_NET_BYTEORDER": true,
+ "NLA_HDRLEN": true,
+ "NLMSG_ALIGNTO": true,
+ "NLMSG_DONE": true,
+ "NLMSG_ERROR": true,
+ "NLMSG_HDRLEN": true,
+ "NLMSG_MIN_TYPE": true,
+ "NLMSG_NOOP": true,
+ "NLMSG_OVERRUN": true,
+ "NLM_F_ACK": true,
+ "NLM_F_APPEND": true,
+ "NLM_F_ATOMIC": true,
+ "NLM_F_CREATE": true,
+ "NLM_F_DUMP": true,
+ "NLM_F_ECHO": true,
+ "NLM_F_EXCL": true,
+ "NLM_F_MATCH": true,
+ "NLM_F_MULTI": true,
+ "NLM_F_REPLACE": true,
+ "NLM_F_REQUEST": true,
+ "NLM_F_ROOT": true,
+ "NOFLSH": true,
+ "NOTE_ABSOLUTE": true,
+ "NOTE_ATTRIB": true,
+ "NOTE_CHILD": true,
+ "NOTE_DELETE": true,
+ "NOTE_EOF": true,
+ "NOTE_EXEC": true,
+ "NOTE_EXIT": true,
+ "NOTE_EXITSTATUS": true,
+ "NOTE_EXTEND": true,
+ "NOTE_FFAND": true,
+ "NOTE_FFCOPY": true,
+ "NOTE_FFCTRLMASK": true,
+ "NOTE_FFLAGSMASK": true,
+ "NOTE_FFNOP": true,
+ "NOTE_FFOR": true,
+ "NOTE_FORK": true,
+ "NOTE_LINK": true,
+ "NOTE_LOWAT": true,
+ "NOTE_NONE": true,
+ "NOTE_NSECONDS": true,
+ "NOTE_PCTRLMASK": true,
+ "NOTE_PDATAMASK": true,
+ "NOTE_REAP": true,
+ "NOTE_RENAME": true,
+ "NOTE_RESOURCEEND": true,
+ "NOTE_REVOKE": true,
+ "NOTE_SECONDS": true,
+ "NOTE_SIGNAL": true,
+ "NOTE_TRACK": true,
+ "NOTE_TRACKERR": true,
+ "NOTE_TRIGGER": true,
+ "NOTE_TRUNCATE": true,
+ "NOTE_USECONDS": true,
+ "NOTE_VM_ERROR": true,
+ "NOTE_VM_PRESSURE": true,
+ "NOTE_VM_PRESSURE_SUDDEN_TERMINATE": true,
+ "NOTE_VM_PRESSURE_TERMINATE": true,
+ "NOTE_WRITE": true,
+ "NameCanonical": true,
+ "NameCanonicalEx": true,
+ "NameDisplay": true,
+ "NameDnsDomain": true,
+ "NameFullyQualifiedDN": true,
+ "NameSamCompatible": true,
+ "NameServicePrincipal": true,
+ "NameUniqueId": true,
+ "NameUnknown": true,
+ "NameUserPrincipal": true,
+ "Nanosleep": true,
+ "NetApiBufferFree": true,
+ "NetGetJoinInformation": true,
+ "NetSetupDomainName": true,
+ "NetSetupUnjoined": true,
+ "NetSetupUnknownStatus": true,
+ "NetSetupWorkgroupName": true,
+ "NetUserGetInfo": true,
+ "NetlinkMessage": true,
+ "NetlinkRIB": true,
+ "NetlinkRouteAttr": true,
+ "NetlinkRouteRequest": true,
+ "NewCallback": true,
+ "NewCallbackCDecl": true,
+ "NewLazyDLL": true,
+ "NlAttr": true,
+ "NlMsgerr": true,
+ "NlMsghdr": true,
+ "NsecToFiletime": true,
+ "NsecToTimespec": true,
+ "NsecToTimeval": true,
+ "Ntohs": true,
+ "OCRNL": true,
+ "OFDEL": true,
+ "OFILL": true,
+ "OFIOGETBMAP": true,
+ "OID_PKIX_KP_SERVER_AUTH": true,
+ "OID_SERVER_GATED_CRYPTO": true,
+ "OID_SGC_NETSCAPE": true,
+ "OLCUC": true,
+ "ONLCR": true,
+ "ONLRET": true,
+ "ONOCR": true,
+ "ONOEOT": true,
+ "OPEN_ALWAYS": true,
+ "OPEN_EXISTING": true,
+ "OPOST": true,
+ "O_ACCMODE": true,
+ "O_ALERT": true,
+ "O_ALT_IO": true,
+ "O_APPEND": true,
+ "O_ASYNC": true,
+ "O_CLOEXEC": true,
+ "O_CREAT": true,
+ "O_DIRECT": true,
+ "O_DIRECTORY": true,
+ "O_DSYNC": true,
+ "O_EVTONLY": true,
+ "O_EXCL": true,
+ "O_EXEC": true,
+ "O_EXLOCK": true,
+ "O_FSYNC": true,
+ "O_LARGEFILE": true,
+ "O_NDELAY": true,
+ "O_NOATIME": true,
+ "O_NOCTTY": true,
+ "O_NOFOLLOW": true,
+ "O_NONBLOCK": true,
+ "O_NOSIGPIPE": true,
+ "O_POPUP": true,
+ "O_RDONLY": true,
+ "O_RDWR": true,
+ "O_RSYNC": true,
+ "O_SHLOCK": true,
+ "O_SYMLINK": true,
+ "O_SYNC": true,
+ "O_TRUNC": true,
+ "O_TTY_INIT": true,
+ "O_WRONLY": true,
+ "Open": true,
+ "OpenCurrentProcessToken": true,
+ "OpenProcess": true,
+ "OpenProcessToken": true,
+ "Openat": true,
+ "Overlapped": true,
+ "PACKET_ADD_MEMBERSHIP": true,
+ "PACKET_BROADCAST": true,
+ "PACKET_DROP_MEMBERSHIP": true,
+ "PACKET_FASTROUTE": true,
+ "PACKET_HOST": true,
+ "PACKET_LOOPBACK": true,
+ "PACKET_MR_ALLMULTI": true,
+ "PACKET_MR_MULTICAST": true,
+ "PACKET_MR_PROMISC": true,
+ "PACKET_MULTICAST": true,
+ "PACKET_OTHERHOST": true,
+ "PACKET_OUTGOING": true,
+ "PACKET_RECV_OUTPUT": true,
+ "PACKET_RX_RING": true,
+ "PACKET_STATISTICS": true,
+ "PAGE_EXECUTE_READ": true,
+ "PAGE_EXECUTE_READWRITE": true,
+ "PAGE_EXECUTE_WRITECOPY": true,
+ "PAGE_READONLY": true,
+ "PAGE_READWRITE": true,
+ "PAGE_WRITECOPY": true,
+ "PARENB": true,
+ "PARMRK": true,
+ "PARODD": true,
+ "PENDIN": true,
+ "PFL_HIDDEN": true,
+ "PFL_MATCHES_PROTOCOL_ZERO": true,
+ "PFL_MULTIPLE_PROTO_ENTRIES": true,
+ "PFL_NETWORKDIRECT_PROVIDER": true,
+ "PFL_RECOMMENDED_PROTO_ENTRY": true,
+ "PF_FLUSH": true,
+ "PKCS_7_ASN_ENCODING": true,
+ "PMC5_PIPELINE_FLUSH": true,
+ "PRIO_PGRP": true,
+ "PRIO_PROCESS": true,
+ "PRIO_USER": true,
+ "PRI_IOFLUSH": true,
+ "PROCESS_QUERY_INFORMATION": true,
+ "PROCESS_TERMINATE": true,
+ "PROT_EXEC": true,
+ "PROT_GROWSDOWN": true,
+ "PROT_GROWSUP": true,
+ "PROT_NONE": true,
+ "PROT_READ": true,
+ "PROT_WRITE": true,
+ "PROV_DH_SCHANNEL": true,
+ "PROV_DSS": true,
+ "PROV_DSS_DH": true,
+ "PROV_EC_ECDSA_FULL": true,
+ "PROV_EC_ECDSA_SIG": true,
+ "PROV_EC_ECNRA_FULL": true,
+ "PROV_EC_ECNRA_SIG": true,
+ "PROV_FORTEZZA": true,
+ "PROV_INTEL_SEC": true,
+ "PROV_MS_EXCHANGE": true,
+ "PROV_REPLACE_OWF": true,
+ "PROV_RNG": true,
+ "PROV_RSA_AES": true,
+ "PROV_RSA_FULL": true,
+ "PROV_RSA_SCHANNEL": true,
+ "PROV_RSA_SIG": true,
+ "PROV_SPYRUS_LYNKS": true,
+ "PROV_SSL": true,
+ "PR_CAPBSET_DROP": true,
+ "PR_CAPBSET_READ": true,
+ "PR_CLEAR_SECCOMP_FILTER": true,
+ "PR_ENDIAN_BIG": true,
+ "PR_ENDIAN_LITTLE": true,
+ "PR_ENDIAN_PPC_LITTLE": true,
+ "PR_FPEMU_NOPRINT": true,
+ "PR_FPEMU_SIGFPE": true,
+ "PR_FP_EXC_ASYNC": true,
+ "PR_FP_EXC_DISABLED": true,
+ "PR_FP_EXC_DIV": true,
+ "PR_FP_EXC_INV": true,
+ "PR_FP_EXC_NONRECOV": true,
+ "PR_FP_EXC_OVF": true,
+ "PR_FP_EXC_PRECISE": true,
+ "PR_FP_EXC_RES": true,
+ "PR_FP_EXC_SW_ENABLE": true,
+ "PR_FP_EXC_UND": true,
+ "PR_GET_DUMPABLE": true,
+ "PR_GET_ENDIAN": true,
+ "PR_GET_FPEMU": true,
+ "PR_GET_FPEXC": true,
+ "PR_GET_KEEPCAPS": true,
+ "PR_GET_NAME": true,
+ "PR_GET_PDEATHSIG": true,
+ "PR_GET_SECCOMP": true,
+ "PR_GET_SECCOMP_FILTER": true,
+ "PR_GET_SECUREBITS": true,
+ "PR_GET_TIMERSLACK": true,
+ "PR_GET_TIMING": true,
+ "PR_GET_TSC": true,
+ "PR_GET_UNALIGN": true,
+ "PR_MCE_KILL": true,
+ "PR_MCE_KILL_CLEAR": true,
+ "PR_MCE_KILL_DEFAULT": true,
+ "PR_MCE_KILL_EARLY": true,
+ "PR_MCE_KILL_GET": true,
+ "PR_MCE_KILL_LATE": true,
+ "PR_MCE_KILL_SET": true,
+ "PR_SECCOMP_FILTER_EVENT": true,
+ "PR_SECCOMP_FILTER_SYSCALL": true,
+ "PR_SET_DUMPABLE": true,
+ "PR_SET_ENDIAN": true,
+ "PR_SET_FPEMU": true,
+ "PR_SET_FPEXC": true,
+ "PR_SET_KEEPCAPS": true,
+ "PR_SET_NAME": true,
+ "PR_SET_PDEATHSIG": true,
+ "PR_SET_PTRACER": true,
+ "PR_SET_SECCOMP": true,
+ "PR_SET_SECCOMP_FILTER": true,
+ "PR_SET_SECUREBITS": true,
+ "PR_SET_TIMERSLACK": true,
+ "PR_SET_TIMING": true,
+ "PR_SET_TSC": true,
+ "PR_SET_UNALIGN": true,
+ "PR_TASK_PERF_EVENTS_DISABLE": true,
+ "PR_TASK_PERF_EVENTS_ENABLE": true,
+ "PR_TIMING_STATISTICAL": true,
+ "PR_TIMING_TIMESTAMP": true,
+ "PR_TSC_ENABLE": true,
+ "PR_TSC_SIGSEGV": true,
+ "PR_UNALIGN_NOPRINT": true,
+ "PR_UNALIGN_SIGBUS": true,
+ "PTRACE_ARCH_PRCTL": true,
+ "PTRACE_ATTACH": true,
+ "PTRACE_CONT": true,
+ "PTRACE_DETACH": true,
+ "PTRACE_EVENT_CLONE": true,
+ "PTRACE_EVENT_EXEC": true,
+ "PTRACE_EVENT_EXIT": true,
+ "PTRACE_EVENT_FORK": true,
+ "PTRACE_EVENT_VFORK": true,
+ "PTRACE_EVENT_VFORK_DONE": true,
+ "PTRACE_GETCRUNCHREGS": true,
+ "PTRACE_GETEVENTMSG": true,
+ "PTRACE_GETFPREGS": true,
+ "PTRACE_GETFPXREGS": true,
+ "PTRACE_GETHBPREGS": true,
+ "PTRACE_GETREGS": true,
+ "PTRACE_GETREGSET": true,
+ "PTRACE_GETSIGINFO": true,
+ "PTRACE_GETVFPREGS": true,
+ "PTRACE_GETWMMXREGS": true,
+ "PTRACE_GET_THREAD_AREA": true,
+ "PTRACE_KILL": true,
+ "PTRACE_OLDSETOPTIONS": true,
+ "PTRACE_O_MASK": true,
+ "PTRACE_O_TRACECLONE": true,
+ "PTRACE_O_TRACEEXEC": true,
+ "PTRACE_O_TRACEEXIT": true,
+ "PTRACE_O_TRACEFORK": true,
+ "PTRACE_O_TRACESYSGOOD": true,
+ "PTRACE_O_TRACEVFORK": true,
+ "PTRACE_O_TRACEVFORKDONE": true,
+ "PTRACE_PEEKDATA": true,
+ "PTRACE_PEEKTEXT": true,
+ "PTRACE_PEEKUSR": true,
+ "PTRACE_POKEDATA": true,
+ "PTRACE_POKETEXT": true,
+ "PTRACE_POKEUSR": true,
+ "PTRACE_SETCRUNCHREGS": true,
+ "PTRACE_SETFPREGS": true,
+ "PTRACE_SETFPXREGS": true,
+ "PTRACE_SETHBPREGS": true,
+ "PTRACE_SETOPTIONS": true,
+ "PTRACE_SETREGS": true,
+ "PTRACE_SETREGSET": true,
+ "PTRACE_SETSIGINFO": true,
+ "PTRACE_SETVFPREGS": true,
+ "PTRACE_SETWMMXREGS": true,
+ "PTRACE_SET_SYSCALL": true,
+ "PTRACE_SET_THREAD_AREA": true,
+ "PTRACE_SINGLEBLOCK": true,
+ "PTRACE_SINGLESTEP": true,
+ "PTRACE_SYSCALL": true,
+ "PTRACE_SYSEMU": true,
+ "PTRACE_SYSEMU_SINGLESTEP": true,
+ "PTRACE_TRACEME": true,
+ "PT_ATTACH": true,
+ "PT_ATTACHEXC": true,
+ "PT_CONTINUE": true,
+ "PT_DATA_ADDR": true,
+ "PT_DENY_ATTACH": true,
+ "PT_DETACH": true,
+ "PT_FIRSTMACH": true,
+ "PT_FORCEQUOTA": true,
+ "PT_KILL": true,
+ "PT_MASK": true,
+ "PT_READ_D": true,
+ "PT_READ_I": true,
+ "PT_READ_U": true,
+ "PT_SIGEXC": true,
+ "PT_STEP": true,
+ "PT_TEXT_ADDR": true,
+ "PT_TEXT_END_ADDR": true,
+ "PT_THUPDATE": true,
+ "PT_TRACE_ME": true,
+ "PT_WRITE_D": true,
+ "PT_WRITE_I": true,
+ "PT_WRITE_U": true,
+ "ParseDirent": true,
+ "ParseNetlinkMessage": true,
+ "ParseNetlinkRouteAttr": true,
+ "ParseRoutingMessage": true,
+ "ParseRoutingSockaddr": true,
+ "ParseSocketControlMessage": true,
+ "ParseUnixCredentials": true,
+ "ParseUnixRights": true,
+ "PathMax": true,
+ "Pathconf": true,
+ "Pause": true,
+ "Pipe": true,
+ "Pipe2": true,
+ "PivotRoot": true,
+ "Pointer": true,
+ "PostQueuedCompletionStatus": true,
+ "Pread": true,
+ "Proc": true,
+ "ProcAttr": true,
+ "Process32First": true,
+ "Process32Next": true,
+ "ProcessEntry32": true,
+ "ProcessInformation": true,
+ "Protoent": true,
+ "PtraceAttach": true,
+ "PtraceCont": true,
+ "PtraceDetach": true,
+ "PtraceGetEventMsg": true,
+ "PtraceGetRegs": true,
+ "PtracePeekData": true,
+ "PtracePeekText": true,
+ "PtracePokeData": true,
+ "PtracePokeText": true,
+ "PtraceRegs": true,
+ "PtraceSetOptions": true,
+ "PtraceSetRegs": true,
+ "PtraceSingleStep": true,
+ "PtraceSyscall": true,
+ "Pwrite": true,
+ "REG_BINARY": true,
+ "REG_DWORD": true,
+ "REG_DWORD_BIG_ENDIAN": true,
+ "REG_DWORD_LITTLE_ENDIAN": true,
+ "REG_EXPAND_SZ": true,
+ "REG_FULL_RESOURCE_DESCRIPTOR": true,
+ "REG_LINK": true,
+ "REG_MULTI_SZ": true,
+ "REG_NONE": true,
+ "REG_QWORD": true,
+ "REG_QWORD_LITTLE_ENDIAN": true,
+ "REG_RESOURCE_LIST": true,
+ "REG_RESOURCE_REQUIREMENTS_LIST": true,
+ "REG_SZ": true,
+ "RLIMIT_AS": true,
+ "RLIMIT_CORE": true,
+ "RLIMIT_CPU": true,
+ "RLIMIT_DATA": true,
+ "RLIMIT_FSIZE": true,
+ "RLIMIT_NOFILE": true,
+ "RLIMIT_STACK": true,
+ "RLIM_INFINITY": true,
+ "RTAX_ADVMSS": true,
+ "RTAX_AUTHOR": true,
+ "RTAX_BRD": true,
+ "RTAX_CWND": true,
+ "RTAX_DST": true,
+ "RTAX_FEATURES": true,
+ "RTAX_FEATURE_ALLFRAG": true,
+ "RTAX_FEATURE_ECN": true,
+ "RTAX_FEATURE_SACK": true,
+ "RTAX_FEATURE_TIMESTAMP": true,
+ "RTAX_GATEWAY": true,
+ "RTAX_GENMASK": true,
+ "RTAX_HOPLIMIT": true,
+ "RTAX_IFA": true,
+ "RTAX_IFP": true,
+ "RTAX_INITCWND": true,
+ "RTAX_INITRWND": true,
+ "RTAX_LABEL": true,
+ "RTAX_LOCK": true,
+ "RTAX_MAX": true,
+ "RTAX_MTU": true,
+ "RTAX_NETMASK": true,
+ "RTAX_REORDERING": true,
+ "RTAX_RTO_MIN": true,
+ "RTAX_RTT": true,
+ "RTAX_RTTVAR": true,
+ "RTAX_SRC": true,
+ "RTAX_SRCMASK": true,
+ "RTAX_SSTHRESH": true,
+ "RTAX_TAG": true,
+ "RTAX_UNSPEC": true,
+ "RTAX_WINDOW": true,
+ "RTA_ALIGNTO": true,
+ "RTA_AUTHOR": true,
+ "RTA_BRD": true,
+ "RTA_CACHEINFO": true,
+ "RTA_DST": true,
+ "RTA_FLOW": true,
+ "RTA_GATEWAY": true,
+ "RTA_GENMASK": true,
+ "RTA_IFA": true,
+ "RTA_IFP": true,
+ "RTA_IIF": true,
+ "RTA_LABEL": true,
+ "RTA_MAX": true,
+ "RTA_METRICS": true,
+ "RTA_MULTIPATH": true,
+ "RTA_NETMASK": true,
+ "RTA_OIF": true,
+ "RTA_PREFSRC": true,
+ "RTA_PRIORITY": true,
+ "RTA_SRC": true,
+ "RTA_SRCMASK": true,
+ "RTA_TABLE": true,
+ "RTA_TAG": true,
+ "RTA_UNSPEC": true,
+ "RTCF_DIRECTSRC": true,
+ "RTCF_DOREDIRECT": true,
+ "RTCF_LOG": true,
+ "RTCF_MASQ": true,
+ "RTCF_NAT": true,
+ "RTCF_VALVE": true,
+ "RTF_ADDRCLASSMASK": true,
+ "RTF_ADDRCONF": true,
+ "RTF_ALLONLINK": true,
+ "RTF_ANNOUNCE": true,
+ "RTF_BLACKHOLE": true,
+ "RTF_BROADCAST": true,
+ "RTF_CACHE": true,
+ "RTF_CLONED": true,
+ "RTF_CLONING": true,
+ "RTF_CONDEMNED": true,
+ "RTF_DEFAULT": true,
+ "RTF_DELCLONE": true,
+ "RTF_DONE": true,
+ "RTF_DYNAMIC": true,
+ "RTF_FLOW": true,
+ "RTF_FMASK": true,
+ "RTF_GATEWAY": true,
+ "RTF_GWFLAG_COMPAT": true,
+ "RTF_HOST": true,
+ "RTF_IFREF": true,
+ "RTF_IFSCOPE": true,
+ "RTF_INTERFACE": true,
+ "RTF_IRTT": true,
+ "RTF_LINKRT": true,
+ "RTF_LLDATA": true,
+ "RTF_LLINFO": true,
+ "RTF_LOCAL": true,
+ "RTF_MASK": true,
+ "RTF_MODIFIED": true,
+ "RTF_MPATH": true,
+ "RTF_MPLS": true,
+ "RTF_MSS": true,
+ "RTF_MTU": true,
+ "RTF_MULTICAST": true,
+ "RTF_NAT": true,
+ "RTF_NOFORWARD": true,
+ "RTF_NONEXTHOP": true,
+ "RTF_NOPMTUDISC": true,
+ "RTF_PERMANENT_ARP": true,
+ "RTF_PINNED": true,
+ "RTF_POLICY": true,
+ "RTF_PRCLONING": true,
+ "RTF_PROTO1": true,
+ "RTF_PROTO2": true,
+ "RTF_PROTO3": true,
+ "RTF_REINSTATE": true,
+ "RTF_REJECT": true,
+ "RTF_RNH_LOCKED": true,
+ "RTF_SOURCE": true,
+ "RTF_SRC": true,
+ "RTF_STATIC": true,
+ "RTF_STICKY": true,
+ "RTF_THROW": true,
+ "RTF_TUNNEL": true,
+ "RTF_UP": true,
+ "RTF_USETRAILERS": true,
+ "RTF_WASCLONED": true,
+ "RTF_WINDOW": true,
+ "RTF_XRESOLVE": true,
+ "RTM_ADD": true,
+ "RTM_BASE": true,
+ "RTM_CHANGE": true,
+ "RTM_CHGADDR": true,
+ "RTM_DELACTION": true,
+ "RTM_DELADDR": true,
+ "RTM_DELADDRLABEL": true,
+ "RTM_DELETE": true,
+ "RTM_DELLINK": true,
+ "RTM_DELMADDR": true,
+ "RTM_DELNEIGH": true,
+ "RTM_DELQDISC": true,
+ "RTM_DELROUTE": true,
+ "RTM_DELRULE": true,
+ "RTM_DELTCLASS": true,
+ "RTM_DELTFILTER": true,
+ "RTM_DESYNC": true,
+ "RTM_F_CLONED": true,
+ "RTM_F_EQUALIZE": true,
+ "RTM_F_NOTIFY": true,
+ "RTM_F_PREFIX": true,
+ "RTM_GET": true,
+ "RTM_GET2": true,
+ "RTM_GETACTION": true,
+ "RTM_GETADDR": true,
+ "RTM_GETADDRLABEL": true,
+ "RTM_GETANYCAST": true,
+ "RTM_GETDCB": true,
+ "RTM_GETLINK": true,
+ "RTM_GETMULTICAST": true,
+ "RTM_GETNEIGH": true,
+ "RTM_GETNEIGHTBL": true,
+ "RTM_GETQDISC": true,
+ "RTM_GETROUTE": true,
+ "RTM_GETRULE": true,
+ "RTM_GETTCLASS": true,
+ "RTM_GETTFILTER": true,
+ "RTM_IEEE80211": true,
+ "RTM_IFANNOUNCE": true,
+ "RTM_IFINFO": true,
+ "RTM_IFINFO2": true,
+ "RTM_LLINFO_UPD": true,
+ "RTM_LOCK": true,
+ "RTM_LOSING": true,
+ "RTM_MAX": true,
+ "RTM_MAXSIZE": true,
+ "RTM_MISS": true,
+ "RTM_NEWACTION": true,
+ "RTM_NEWADDR": true,
+ "RTM_NEWADDRLABEL": true,
+ "RTM_NEWLINK": true,
+ "RTM_NEWMADDR": true,
+ "RTM_NEWMADDR2": true,
+ "RTM_NEWNDUSEROPT": true,
+ "RTM_NEWNEIGH": true,
+ "RTM_NEWNEIGHTBL": true,
+ "RTM_NEWPREFIX": true,
+ "RTM_NEWQDISC": true,
+ "RTM_NEWROUTE": true,
+ "RTM_NEWRULE": true,
+ "RTM_NEWTCLASS": true,
+ "RTM_NEWTFILTER": true,
+ "RTM_NR_FAMILIES": true,
+ "RTM_NR_MSGTYPES": true,
+ "RTM_OIFINFO": true,
+ "RTM_OLDADD": true,
+ "RTM_OLDDEL": true,
+ "RTM_OOIFINFO": true,
+ "RTM_REDIRECT": true,
+ "RTM_RESOLVE": true,
+ "RTM_RTTUNIT": true,
+ "RTM_SETDCB": true,
+ "RTM_SETGATE": true,
+ "RTM_SETLINK": true,
+ "RTM_SETNEIGHTBL": true,
+ "RTM_VERSION": true,
+ "RTNH_ALIGNTO": true,
+ "RTNH_F_DEAD": true,
+ "RTNH_F_ONLINK": true,
+ "RTNH_F_PERVASIVE": true,
+ "RTNLGRP_IPV4_IFADDR": true,
+ "RTNLGRP_IPV4_MROUTE": true,
+ "RTNLGRP_IPV4_ROUTE": true,
+ "RTNLGRP_IPV4_RULE": true,
+ "RTNLGRP_IPV6_IFADDR": true,
+ "RTNLGRP_IPV6_IFINFO": true,
+ "RTNLGRP_IPV6_MROUTE": true,
+ "RTNLGRP_IPV6_PREFIX": true,
+ "RTNLGRP_IPV6_ROUTE": true,
+ "RTNLGRP_IPV6_RULE": true,
+ "RTNLGRP_LINK": true,
+ "RTNLGRP_ND_USEROPT": true,
+ "RTNLGRP_NEIGH": true,
+ "RTNLGRP_NONE": true,
+ "RTNLGRP_NOTIFY": true,
+ "RTNLGRP_TC": true,
+ "RTN_ANYCAST": true,
+ "RTN_BLACKHOLE": true,
+ "RTN_BROADCAST": true,
+ "RTN_LOCAL": true,
+ "RTN_MAX": true,
+ "RTN_MULTICAST": true,
+ "RTN_NAT": true,
+ "RTN_PROHIBIT": true,
+ "RTN_THROW": true,
+ "RTN_UNICAST": true,
+ "RTN_UNREACHABLE": true,
+ "RTN_UNSPEC": true,
+ "RTN_XRESOLVE": true,
+ "RTPROT_BIRD": true,
+ "RTPROT_BOOT": true,
+ "RTPROT_DHCP": true,
+ "RTPROT_DNROUTED": true,
+ "RTPROT_GATED": true,
+ "RTPROT_KERNEL": true,
+ "RTPROT_MRT": true,
+ "RTPROT_NTK": true,
+ "RTPROT_RA": true,
+ "RTPROT_REDIRECT": true,
+ "RTPROT_STATIC": true,
+ "RTPROT_UNSPEC": true,
+ "RTPROT_XORP": true,
+ "RTPROT_ZEBRA": true,
+ "RTV_EXPIRE": true,
+ "RTV_HOPCOUNT": true,
+ "RTV_MTU": true,
+ "RTV_RPIPE": true,
+ "RTV_RTT": true,
+ "RTV_RTTVAR": true,
+ "RTV_SPIPE": true,
+ "RTV_SSTHRESH": true,
+ "RTV_WEIGHT": true,
+ "RT_CACHING_CONTEXT": true,
+ "RT_CLASS_DEFAULT": true,
+ "RT_CLASS_LOCAL": true,
+ "RT_CLASS_MAIN": true,
+ "RT_CLASS_MAX": true,
+ "RT_CLASS_UNSPEC": true,
+ "RT_DEFAULT_FIB": true,
+ "RT_NORTREF": true,
+ "RT_SCOPE_HOST": true,
+ "RT_SCOPE_LINK": true,
+ "RT_SCOPE_NOWHERE": true,
+ "RT_SCOPE_SITE": true,
+ "RT_SCOPE_UNIVERSE": true,
+ "RT_TABLEID_MAX": true,
+ "RT_TABLE_COMPAT": true,
+ "RT_TABLE_DEFAULT": true,
+ "RT_TABLE_LOCAL": true,
+ "RT_TABLE_MAIN": true,
+ "RT_TABLE_MAX": true,
+ "RT_TABLE_UNSPEC": true,
+ "RUSAGE_CHILDREN": true,
+ "RUSAGE_SELF": true,
+ "RUSAGE_THREAD": true,
+ "Radvisory_t": true,
+ "RawConn": true,
+ "RawSockaddr": true,
+ "RawSockaddrAny": true,
+ "RawSockaddrDatalink": true,
+ "RawSockaddrInet4": true,
+ "RawSockaddrInet6": true,
+ "RawSockaddrLinklayer": true,
+ "RawSockaddrNetlink": true,
+ "RawSockaddrUnix": true,
+ "RawSyscall": true,
+ "RawSyscall6": true,
+ "Read": true,
+ "ReadConsole": true,
+ "ReadDirectoryChanges": true,
+ "ReadDirent": true,
+ "ReadFile": true,
+ "Readlink": true,
+ "Reboot": true,
+ "Recvfrom": true,
+ "Recvmsg": true,
+ "RegCloseKey": true,
+ "RegEnumKeyEx": true,
+ "RegOpenKeyEx": true,
+ "RegQueryInfoKey": true,
+ "RegQueryValueEx": true,
+ "RemoveDirectory": true,
+ "Removexattr": true,
+ "Rename": true,
+ "Renameat": true,
+ "Revoke": true,
+ "Rlimit": true,
+ "Rmdir": true,
+ "RouteMessage": true,
+ "RouteRIB": true,
+ "RtAttr": true,
+ "RtGenmsg": true,
+ "RtMetrics": true,
+ "RtMsg": true,
+ "RtMsghdr": true,
+ "RtNexthop": true,
+ "Rusage": true,
+ "SCM_BINTIME": true,
+ "SCM_CREDENTIALS": true,
+ "SCM_CREDS": true,
+ "SCM_RIGHTS": true,
+ "SCM_TIMESTAMP": true,
+ "SCM_TIMESTAMPING": true,
+ "SCM_TIMESTAMPNS": true,
+ "SCM_TIMESTAMP_MONOTONIC": true,
+ "SHUT_RD": true,
+ "SHUT_RDWR": true,
+ "SHUT_WR": true,
+ "SID": true,
+ "SIDAndAttributes": true,
+ "SIGABRT": true,
+ "SIGALRM": true,
+ "SIGBUS": true,
+ "SIGCHLD": true,
+ "SIGCLD": true,
+ "SIGCONT": true,
+ "SIGEMT": true,
+ "SIGFPE": true,
+ "SIGHUP": true,
+ "SIGILL": true,
+ "SIGINFO": true,
+ "SIGINT": true,
+ "SIGIO": true,
+ "SIGIOT": true,
+ "SIGKILL": true,
+ "SIGLIBRT": true,
+ "SIGLWP": true,
+ "SIGPIPE": true,
+ "SIGPOLL": true,
+ "SIGPROF": true,
+ "SIGPWR": true,
+ "SIGQUIT": true,
+ "SIGSEGV": true,
+ "SIGSTKFLT": true,
+ "SIGSTOP": true,
+ "SIGSYS": true,
+ "SIGTERM": true,
+ "SIGTHR": true,
+ "SIGTRAP": true,
+ "SIGTSTP": true,
+ "SIGTTIN": true,
+ "SIGTTOU": true,
+ "SIGUNUSED": true,
+ "SIGURG": true,
+ "SIGUSR1": true,
+ "SIGUSR2": true,
+ "SIGVTALRM": true,
+ "SIGWINCH": true,
+ "SIGXCPU": true,
+ "SIGXFSZ": true,
+ "SIOCADDDLCI": true,
+ "SIOCADDMULTI": true,
+ "SIOCADDRT": true,
+ "SIOCAIFADDR": true,
+ "SIOCAIFGROUP": true,
+ "SIOCALIFADDR": true,
+ "SIOCARPIPLL": true,
+ "SIOCATMARK": true,
+ "SIOCAUTOADDR": true,
+ "SIOCAUTONETMASK": true,
+ "SIOCBRDGADD": true,
+ "SIOCBRDGADDS": true,
+ "SIOCBRDGARL": true,
+ "SIOCBRDGDADDR": true,
+ "SIOCBRDGDEL": true,
+ "SIOCBRDGDELS": true,
+ "SIOCBRDGFLUSH": true,
+ "SIOCBRDGFRL": true,
+ "SIOCBRDGGCACHE": true,
+ "SIOCBRDGGFD": true,
+ "SIOCBRDGGHT": true,
+ "SIOCBRDGGIFFLGS": true,
+ "SIOCBRDGGMA": true,
+ "SIOCBRDGGPARAM": true,
+ "SIOCBRDGGPRI": true,
+ "SIOCBRDGGRL": true,
+ "SIOCBRDGGSIFS": true,
+ "SIOCBRDGGTO": true,
+ "SIOCBRDGIFS": true,
+ "SIOCBRDGRTS": true,
+ "SIOCBRDGSADDR": true,
+ "SIOCBRDGSCACHE": true,
+ "SIOCBRDGSFD": true,
+ "SIOCBRDGSHT": true,
+ "SIOCBRDGSIFCOST": true,
+ "SIOCBRDGSIFFLGS": true,
+ "SIOCBRDGSIFPRIO": true,
+ "SIOCBRDGSMA": true,
+ "SIOCBRDGSPRI": true,
+ "SIOCBRDGSPROTO": true,
+ "SIOCBRDGSTO": true,
+ "SIOCBRDGSTXHC": true,
+ "SIOCDARP": true,
+ "SIOCDELDLCI": true,
+ "SIOCDELMULTI": true,
+ "SIOCDELRT": true,
+ "SIOCDEVPRIVATE": true,
+ "SIOCDIFADDR": true,
+ "SIOCDIFGROUP": true,
+ "SIOCDIFPHYADDR": true,
+ "SIOCDLIFADDR": true,
+ "SIOCDRARP": true,
+ "SIOCGARP": true,
+ "SIOCGDRVSPEC": true,
+ "SIOCGETKALIVE": true,
+ "SIOCGETLABEL": true,
+ "SIOCGETPFLOW": true,
+ "SIOCGETPFSYNC": true,
+ "SIOCGETSGCNT": true,
+ "SIOCGETVIFCNT": true,
+ "SIOCGETVLAN": true,
+ "SIOCGHIWAT": true,
+ "SIOCGIFADDR": true,
+ "SIOCGIFADDRPREF": true,
+ "SIOCGIFALIAS": true,
+ "SIOCGIFALTMTU": true,
+ "SIOCGIFASYNCMAP": true,
+ "SIOCGIFBOND": true,
+ "SIOCGIFBR": true,
+ "SIOCGIFBRDADDR": true,
+ "SIOCGIFCAP": true,
+ "SIOCGIFCONF": true,
+ "SIOCGIFCOUNT": true,
+ "SIOCGIFDATA": true,
+ "SIOCGIFDESCR": true,
+ "SIOCGIFDEVMTU": true,
+ "SIOCGIFDLT": true,
+ "SIOCGIFDSTADDR": true,
+ "SIOCGIFENCAP": true,
+ "SIOCGIFFIB": true,
+ "SIOCGIFFLAGS": true,
+ "SIOCGIFGATTR": true,
+ "SIOCGIFGENERIC": true,
+ "SIOCGIFGMEMB": true,
+ "SIOCGIFGROUP": true,
+ "SIOCGIFHARDMTU": true,
+ "SIOCGIFHWADDR": true,
+ "SIOCGIFINDEX": true,
+ "SIOCGIFKPI": true,
+ "SIOCGIFMAC": true,
+ "SIOCGIFMAP": true,
+ "SIOCGIFMEDIA": true,
+ "SIOCGIFMEM": true,
+ "SIOCGIFMETRIC": true,
+ "SIOCGIFMTU": true,
+ "SIOCGIFNAME": true,
+ "SIOCGIFNETMASK": true,
+ "SIOCGIFPDSTADDR": true,
+ "SIOCGIFPFLAGS": true,
+ "SIOCGIFPHYS": true,
+ "SIOCGIFPRIORITY": true,
+ "SIOCGIFPSRCADDR": true,
+ "SIOCGIFRDOMAIN": true,
+ "SIOCGIFRTLABEL": true,
+ "SIOCGIFSLAVE": true,
+ "SIOCGIFSTATUS": true,
+ "SIOCGIFTIMESLOT": true,
+ "SIOCGIFTXQLEN": true,
+ "SIOCGIFVLAN": true,
+ "SIOCGIFWAKEFLAGS": true,
+ "SIOCGIFXFLAGS": true,
+ "SIOCGLIFADDR": true,
+ "SIOCGLIFPHYADDR": true,
+ "SIOCGLIFPHYRTABLE": true,
+ "SIOCGLIFPHYTTL": true,
+ "SIOCGLINKSTR": true,
+ "SIOCGLOWAT": true,
+ "SIOCGPGRP": true,
+ "SIOCGPRIVATE_0": true,
+ "SIOCGPRIVATE_1": true,
+ "SIOCGRARP": true,
+ "SIOCGSPPPPARAMS": true,
+ "SIOCGSTAMP": true,
+ "SIOCGSTAMPNS": true,
+ "SIOCGVH": true,
+ "SIOCGVNETID": true,
+ "SIOCIFCREATE": true,
+ "SIOCIFCREATE2": true,
+ "SIOCIFDESTROY": true,
+ "SIOCIFGCLONERS": true,
+ "SIOCINITIFADDR": true,
+ "SIOCPROTOPRIVATE": true,
+ "SIOCRSLVMULTI": true,
+ "SIOCRTMSG": true,
+ "SIOCSARP": true,
+ "SIOCSDRVSPEC": true,
+ "SIOCSETKALIVE": true,
+ "SIOCSETLABEL": true,
+ "SIOCSETPFLOW": true,
+ "SIOCSETPFSYNC": true,
+ "SIOCSETVLAN": true,
+ "SIOCSHIWAT": true,
+ "SIOCSIFADDR": true,
+ "SIOCSIFADDRPREF": true,
+ "SIOCSIFALTMTU": true,
+ "SIOCSIFASYNCMAP": true,
+ "SIOCSIFBOND": true,
+ "SIOCSIFBR": true,
+ "SIOCSIFBRDADDR": true,
+ "SIOCSIFCAP": true,
+ "SIOCSIFDESCR": true,
+ "SIOCSIFDSTADDR": true,
+ "SIOCSIFENCAP": true,
+ "SIOCSIFFIB": true,
+ "SIOCSIFFLAGS": true,
+ "SIOCSIFGATTR": true,
+ "SIOCSIFGENERIC": true,
+ "SIOCSIFHWADDR": true,
+ "SIOCSIFHWBROADCAST": true,
+ "SIOCSIFKPI": true,
+ "SIOCSIFLINK": true,
+ "SIOCSIFLLADDR": true,
+ "SIOCSIFMAC": true,
+ "SIOCSIFMAP": true,
+ "SIOCSIFMEDIA": true,
+ "SIOCSIFMEM": true,
+ "SIOCSIFMETRIC": true,
+ "SIOCSIFMTU": true,
+ "SIOCSIFNAME": true,
+ "SIOCSIFNETMASK": true,
+ "SIOCSIFPFLAGS": true,
+ "SIOCSIFPHYADDR": true,
+ "SIOCSIFPHYS": true,
+ "SIOCSIFPRIORITY": true,
+ "SIOCSIFRDOMAIN": true,
+ "SIOCSIFRTLABEL": true,
+ "SIOCSIFRVNET": true,
+ "SIOCSIFSLAVE": true,
+ "SIOCSIFTIMESLOT": true,
+ "SIOCSIFTXQLEN": true,
+ "SIOCSIFVLAN": true,
+ "SIOCSIFVNET": true,
+ "SIOCSIFXFLAGS": true,
+ "SIOCSLIFPHYADDR": true,
+ "SIOCSLIFPHYRTABLE": true,
+ "SIOCSLIFPHYTTL": true,
+ "SIOCSLINKSTR": true,
+ "SIOCSLOWAT": true,
+ "SIOCSPGRP": true,
+ "SIOCSRARP": true,
+ "SIOCSSPPPPARAMS": true,
+ "SIOCSVH": true,
+ "SIOCSVNETID": true,
+ "SIOCZIFDATA": true,
+ "SIO_GET_EXTENSION_FUNCTION_POINTER": true,
+ "SIO_GET_INTERFACE_LIST": true,
+ "SIO_KEEPALIVE_VALS": true,
+ "SIO_UDP_CONNRESET": true,
+ "SOCK_CLOEXEC": true,
+ "SOCK_DCCP": true,
+ "SOCK_DGRAM": true,
+ "SOCK_FLAGS_MASK": true,
+ "SOCK_MAXADDRLEN": true,
+ "SOCK_NONBLOCK": true,
+ "SOCK_NOSIGPIPE": true,
+ "SOCK_PACKET": true,
+ "SOCK_RAW": true,
+ "SOCK_RDM": true,
+ "SOCK_SEQPACKET": true,
+ "SOCK_STREAM": true,
+ "SOL_AAL": true,
+ "SOL_ATM": true,
+ "SOL_DECNET": true,
+ "SOL_ICMPV6": true,
+ "SOL_IP": true,
+ "SOL_IPV6": true,
+ "SOL_IRDA": true,
+ "SOL_PACKET": true,
+ "SOL_RAW": true,
+ "SOL_SOCKET": true,
+ "SOL_TCP": true,
+ "SOL_X25": true,
+ "SOMAXCONN": true,
+ "SO_ACCEPTCONN": true,
+ "SO_ACCEPTFILTER": true,
+ "SO_ATTACH_FILTER": true,
+ "SO_BINDANY": true,
+ "SO_BINDTODEVICE": true,
+ "SO_BINTIME": true,
+ "SO_BROADCAST": true,
+ "SO_BSDCOMPAT": true,
+ "SO_DEBUG": true,
+ "SO_DETACH_FILTER": true,
+ "SO_DOMAIN": true,
+ "SO_DONTROUTE": true,
+ "SO_DONTTRUNC": true,
+ "SO_ERROR": true,
+ "SO_KEEPALIVE": true,
+ "SO_LABEL": true,
+ "SO_LINGER": true,
+ "SO_LINGER_SEC": true,
+ "SO_LISTENINCQLEN": true,
+ "SO_LISTENQLEN": true,
+ "SO_LISTENQLIMIT": true,
+ "SO_MARK": true,
+ "SO_NETPROC": true,
+ "SO_NKE": true,
+ "SO_NOADDRERR": true,
+ "SO_NOHEADER": true,
+ "SO_NOSIGPIPE": true,
+ "SO_NOTIFYCONFLICT": true,
+ "SO_NO_CHECK": true,
+ "SO_NO_DDP": true,
+ "SO_NO_OFFLOAD": true,
+ "SO_NP_EXTENSIONS": true,
+ "SO_NREAD": true,
+ "SO_NWRITE": true,
+ "SO_OOBINLINE": true,
+ "SO_OVERFLOWED": true,
+ "SO_PASSCRED": true,
+ "SO_PASSSEC": true,
+ "SO_PEERCRED": true,
+ "SO_PEERLABEL": true,
+ "SO_PEERNAME": true,
+ "SO_PEERSEC": true,
+ "SO_PRIORITY": true,
+ "SO_PROTOCOL": true,
+ "SO_PROTOTYPE": true,
+ "SO_RANDOMPORT": true,
+ "SO_RCVBUF": true,
+ "SO_RCVBUFFORCE": true,
+ "SO_RCVLOWAT": true,
+ "SO_RCVTIMEO": true,
+ "SO_RESTRICTIONS": true,
+ "SO_RESTRICT_DENYIN": true,
+ "SO_RESTRICT_DENYOUT": true,
+ "SO_RESTRICT_DENYSET": true,
+ "SO_REUSEADDR": true,
+ "SO_REUSEPORT": true,
+ "SO_REUSESHAREUID": true,
+ "SO_RTABLE": true,
+ "SO_RXQ_OVFL": true,
+ "SO_SECURITY_AUTHENTICATION": true,
+ "SO_SECURITY_ENCRYPTION_NETWORK": true,
+ "SO_SECURITY_ENCRYPTION_TRANSPORT": true,
+ "SO_SETFIB": true,
+ "SO_SNDBUF": true,
+ "SO_SNDBUFFORCE": true,
+ "SO_SNDLOWAT": true,
+ "SO_SNDTIMEO": true,
+ "SO_SPLICE": true,
+ "SO_TIMESTAMP": true,
+ "SO_TIMESTAMPING": true,
+ "SO_TIMESTAMPNS": true,
+ "SO_TIMESTAMP_MONOTONIC": true,
+ "SO_TYPE": true,
+ "SO_UPCALLCLOSEWAIT": true,
+ "SO_UPDATE_ACCEPT_CONTEXT": true,
+ "SO_UPDATE_CONNECT_CONTEXT": true,
+ "SO_USELOOPBACK": true,
+ "SO_USER_COOKIE": true,
+ "SO_VENDOR": true,
+ "SO_WANTMORE": true,
+ "SO_WANTOOBFLAG": true,
+ "SSLExtraCertChainPolicyPara": true,
+ "STANDARD_RIGHTS_ALL": true,
+ "STANDARD_RIGHTS_EXECUTE": true,
+ "STANDARD_RIGHTS_READ": true,
+ "STANDARD_RIGHTS_REQUIRED": true,
+ "STANDARD_RIGHTS_WRITE": true,
+ "STARTF_USESHOWWINDOW": true,
+ "STARTF_USESTDHANDLES": true,
+ "STD_ERROR_HANDLE": true,
+ "STD_INPUT_HANDLE": true,
+ "STD_OUTPUT_HANDLE": true,
+ "SUBLANG_ENGLISH_US": true,
+ "SW_FORCEMINIMIZE": true,
+ "SW_HIDE": true,
+ "SW_MAXIMIZE": true,
+ "SW_MINIMIZE": true,
+ "SW_NORMAL": true,
+ "SW_RESTORE": true,
+ "SW_SHOW": true,
+ "SW_SHOWDEFAULT": true,
+ "SW_SHOWMAXIMIZED": true,
+ "SW_SHOWMINIMIZED": true,
+ "SW_SHOWMINNOACTIVE": true,
+ "SW_SHOWNA": true,
+ "SW_SHOWNOACTIVATE": true,
+ "SW_SHOWNORMAL": true,
+ "SYMBOLIC_LINK_FLAG_DIRECTORY": true,
+ "SYNCHRONIZE": true,
+ "SYSCTL_VERSION": true,
+ "SYSCTL_VERS_0": true,
+ "SYSCTL_VERS_1": true,
+ "SYSCTL_VERS_MASK": true,
+ "SYS_ABORT2": true,
+ "SYS_ACCEPT": true,
+ "SYS_ACCEPT4": true,
+ "SYS_ACCEPT_NOCANCEL": true,
+ "SYS_ACCESS": true,
+ "SYS_ACCESS_EXTENDED": true,
+ "SYS_ACCT": true,
+ "SYS_ADD_KEY": true,
+ "SYS_ADD_PROFIL": true,
+ "SYS_ADJFREQ": true,
+ "SYS_ADJTIME": true,
+ "SYS_ADJTIMEX": true,
+ "SYS_AFS_SYSCALL": true,
+ "SYS_AIO_CANCEL": true,
+ "SYS_AIO_ERROR": true,
+ "SYS_AIO_FSYNC": true,
+ "SYS_AIO_READ": true,
+ "SYS_AIO_RETURN": true,
+ "SYS_AIO_SUSPEND": true,
+ "SYS_AIO_SUSPEND_NOCANCEL": true,
+ "SYS_AIO_WRITE": true,
+ "SYS_ALARM": true,
+ "SYS_ARCH_PRCTL": true,
+ "SYS_ARM_FADVISE64_64": true,
+ "SYS_ARM_SYNC_FILE_RANGE": true,
+ "SYS_ATGETMSG": true,
+ "SYS_ATPGETREQ": true,
+ "SYS_ATPGETRSP": true,
+ "SYS_ATPSNDREQ": true,
+ "SYS_ATPSNDRSP": true,
+ "SYS_ATPUTMSG": true,
+ "SYS_ATSOCKET": true,
+ "SYS_AUDIT": true,
+ "SYS_AUDITCTL": true,
+ "SYS_AUDITON": true,
+ "SYS_AUDIT_SESSION_JOIN": true,
+ "SYS_AUDIT_SESSION_PORT": true,
+ "SYS_AUDIT_SESSION_SELF": true,
+ "SYS_BDFLUSH": true,
+ "SYS_BIND": true,
+ "SYS_BINDAT": true,
+ "SYS_BREAK": true,
+ "SYS_BRK": true,
+ "SYS_BSDTHREAD_CREATE": true,
+ "SYS_BSDTHREAD_REGISTER": true,
+ "SYS_BSDTHREAD_TERMINATE": true,
+ "SYS_CAPGET": true,
+ "SYS_CAPSET": true,
+ "SYS_CAP_ENTER": true,
+ "SYS_CAP_FCNTLS_GET": true,
+ "SYS_CAP_FCNTLS_LIMIT": true,
+ "SYS_CAP_GETMODE": true,
+ "SYS_CAP_GETRIGHTS": true,
+ "SYS_CAP_IOCTLS_GET": true,
+ "SYS_CAP_IOCTLS_LIMIT": true,
+ "SYS_CAP_NEW": true,
+ "SYS_CAP_RIGHTS_GET": true,
+ "SYS_CAP_RIGHTS_LIMIT": true,
+ "SYS_CHDIR": true,
+ "SYS_CHFLAGS": true,
+ "SYS_CHFLAGSAT": true,
+ "SYS_CHMOD": true,
+ "SYS_CHMOD_EXTENDED": true,
+ "SYS_CHOWN": true,
+ "SYS_CHOWN32": true,
+ "SYS_CHROOT": true,
+ "SYS_CHUD": true,
+ "SYS_CLOCK_ADJTIME": true,
+ "SYS_CLOCK_GETCPUCLOCKID2": true,
+ "SYS_CLOCK_GETRES": true,
+ "SYS_CLOCK_GETTIME": true,
+ "SYS_CLOCK_NANOSLEEP": true,
+ "SYS_CLOCK_SETTIME": true,
+ "SYS_CLONE": true,
+ "SYS_CLOSE": true,
+ "SYS_CLOSEFROM": true,
+ "SYS_CLOSE_NOCANCEL": true,
+ "SYS_CONNECT": true,
+ "SYS_CONNECTAT": true,
+ "SYS_CONNECT_NOCANCEL": true,
+ "SYS_COPYFILE": true,
+ "SYS_CPUSET": true,
+ "SYS_CPUSET_GETAFFINITY": true,
+ "SYS_CPUSET_GETID": true,
+ "SYS_CPUSET_SETAFFINITY": true,
+ "SYS_CPUSET_SETID": true,
+ "SYS_CREAT": true,
+ "SYS_CREATE_MODULE": true,
+ "SYS_CSOPS": true,
+ "SYS_DELETE": true,
+ "SYS_DELETE_MODULE": true,
+ "SYS_DUP": true,
+ "SYS_DUP2": true,
+ "SYS_DUP3": true,
+ "SYS_EACCESS": true,
+ "SYS_EPOLL_CREATE": true,
+ "SYS_EPOLL_CREATE1": true,
+ "SYS_EPOLL_CTL": true,
+ "SYS_EPOLL_CTL_OLD": true,
+ "SYS_EPOLL_PWAIT": true,
+ "SYS_EPOLL_WAIT": true,
+ "SYS_EPOLL_WAIT_OLD": true,
+ "SYS_EVENTFD": true,
+ "SYS_EVENTFD2": true,
+ "SYS_EXCHANGEDATA": true,
+ "SYS_EXECVE": true,
+ "SYS_EXIT": true,
+ "SYS_EXIT_GROUP": true,
+ "SYS_EXTATTRCTL": true,
+ "SYS_EXTATTR_DELETE_FD": true,
+ "SYS_EXTATTR_DELETE_FILE": true,
+ "SYS_EXTATTR_DELETE_LINK": true,
+ "SYS_EXTATTR_GET_FD": true,
+ "SYS_EXTATTR_GET_FILE": true,
+ "SYS_EXTATTR_GET_LINK": true,
+ "SYS_EXTATTR_LIST_FD": true,
+ "SYS_EXTATTR_LIST_FILE": true,
+ "SYS_EXTATTR_LIST_LINK": true,
+ "SYS_EXTATTR_SET_FD": true,
+ "SYS_EXTATTR_SET_FILE": true,
+ "SYS_EXTATTR_SET_LINK": true,
+ "SYS_FACCESSAT": true,
+ "SYS_FADVISE64": true,
+ "SYS_FADVISE64_64": true,
+ "SYS_FALLOCATE": true,
+ "SYS_FANOTIFY_INIT": true,
+ "SYS_FANOTIFY_MARK": true,
+ "SYS_FCHDIR": true,
+ "SYS_FCHFLAGS": true,
+ "SYS_FCHMOD": true,
+ "SYS_FCHMODAT": true,
+ "SYS_FCHMOD_EXTENDED": true,
+ "SYS_FCHOWN": true,
+ "SYS_FCHOWN32": true,
+ "SYS_FCHOWNAT": true,
+ "SYS_FCHROOT": true,
+ "SYS_FCNTL": true,
+ "SYS_FCNTL64": true,
+ "SYS_FCNTL_NOCANCEL": true,
+ "SYS_FDATASYNC": true,
+ "SYS_FEXECVE": true,
+ "SYS_FFCLOCK_GETCOUNTER": true,
+ "SYS_FFCLOCK_GETESTIMATE": true,
+ "SYS_FFCLOCK_SETESTIMATE": true,
+ "SYS_FFSCTL": true,
+ "SYS_FGETATTRLIST": true,
+ "SYS_FGETXATTR": true,
+ "SYS_FHOPEN": true,
+ "SYS_FHSTAT": true,
+ "SYS_FHSTATFS": true,
+ "SYS_FILEPORT_MAKEFD": true,
+ "SYS_FILEPORT_MAKEPORT": true,
+ "SYS_FKTRACE": true,
+ "SYS_FLISTXATTR": true,
+ "SYS_FLOCK": true,
+ "SYS_FORK": true,
+ "SYS_FPATHCONF": true,
+ "SYS_FREEBSD6_FTRUNCATE": true,
+ "SYS_FREEBSD6_LSEEK": true,
+ "SYS_FREEBSD6_MMAP": true,
+ "SYS_FREEBSD6_PREAD": true,
+ "SYS_FREEBSD6_PWRITE": true,
+ "SYS_FREEBSD6_TRUNCATE": true,
+ "SYS_FREMOVEXATTR": true,
+ "SYS_FSCTL": true,
+ "SYS_FSETATTRLIST": true,
+ "SYS_FSETXATTR": true,
+ "SYS_FSGETPATH": true,
+ "SYS_FSTAT": true,
+ "SYS_FSTAT64": true,
+ "SYS_FSTAT64_EXTENDED": true,
+ "SYS_FSTATAT": true,
+ "SYS_FSTATAT64": true,
+ "SYS_FSTATFS": true,
+ "SYS_FSTATFS64": true,
+ "SYS_FSTATV": true,
+ "SYS_FSTATVFS1": true,
+ "SYS_FSTAT_EXTENDED": true,
+ "SYS_FSYNC": true,
+ "SYS_FSYNC_NOCANCEL": true,
+ "SYS_FSYNC_RANGE": true,
+ "SYS_FTIME": true,
+ "SYS_FTRUNCATE": true,
+ "SYS_FTRUNCATE64": true,
+ "SYS_FUTEX": true,
+ "SYS_FUTIMENS": true,
+ "SYS_FUTIMES": true,
+ "SYS_FUTIMESAT": true,
+ "SYS_GETATTRLIST": true,
+ "SYS_GETAUDIT": true,
+ "SYS_GETAUDIT_ADDR": true,
+ "SYS_GETAUID": true,
+ "SYS_GETCONTEXT": true,
+ "SYS_GETCPU": true,
+ "SYS_GETCWD": true,
+ "SYS_GETDENTS": true,
+ "SYS_GETDENTS64": true,
+ "SYS_GETDIRENTRIES": true,
+ "SYS_GETDIRENTRIES64": true,
+ "SYS_GETDIRENTRIESATTR": true,
+ "SYS_GETDTABLECOUNT": true,
+ "SYS_GETDTABLESIZE": true,
+ "SYS_GETEGID": true,
+ "SYS_GETEGID32": true,
+ "SYS_GETEUID": true,
+ "SYS_GETEUID32": true,
+ "SYS_GETFH": true,
+ "SYS_GETFSSTAT": true,
+ "SYS_GETFSSTAT64": true,
+ "SYS_GETGID": true,
+ "SYS_GETGID32": true,
+ "SYS_GETGROUPS": true,
+ "SYS_GETGROUPS32": true,
+ "SYS_GETHOSTUUID": true,
+ "SYS_GETITIMER": true,
+ "SYS_GETLCID": true,
+ "SYS_GETLOGIN": true,
+ "SYS_GETLOGINCLASS": true,
+ "SYS_GETPEERNAME": true,
+ "SYS_GETPGID": true,
+ "SYS_GETPGRP": true,
+ "SYS_GETPID": true,
+ "SYS_GETPMSG": true,
+ "SYS_GETPPID": true,
+ "SYS_GETPRIORITY": true,
+ "SYS_GETRESGID": true,
+ "SYS_GETRESGID32": true,
+ "SYS_GETRESUID": true,
+ "SYS_GETRESUID32": true,
+ "SYS_GETRLIMIT": true,
+ "SYS_GETRTABLE": true,
+ "SYS_GETRUSAGE": true,
+ "SYS_GETSGROUPS": true,
+ "SYS_GETSID": true,
+ "SYS_GETSOCKNAME": true,
+ "SYS_GETSOCKOPT": true,
+ "SYS_GETTHRID": true,
+ "SYS_GETTID": true,
+ "SYS_GETTIMEOFDAY": true,
+ "SYS_GETUID": true,
+ "SYS_GETUID32": true,
+ "SYS_GETVFSSTAT": true,
+ "SYS_GETWGROUPS": true,
+ "SYS_GETXATTR": true,
+ "SYS_GET_KERNEL_SYMS": true,
+ "SYS_GET_MEMPOLICY": true,
+ "SYS_GET_ROBUST_LIST": true,
+ "SYS_GET_THREAD_AREA": true,
+ "SYS_GTTY": true,
+ "SYS_IDENTITYSVC": true,
+ "SYS_IDLE": true,
+ "SYS_INITGROUPS": true,
+ "SYS_INIT_MODULE": true,
+ "SYS_INOTIFY_ADD_WATCH": true,
+ "SYS_INOTIFY_INIT": true,
+ "SYS_INOTIFY_INIT1": true,
+ "SYS_INOTIFY_RM_WATCH": true,
+ "SYS_IOCTL": true,
+ "SYS_IOPERM": true,
+ "SYS_IOPL": true,
+ "SYS_IOPOLICYSYS": true,
+ "SYS_IOPRIO_GET": true,
+ "SYS_IOPRIO_SET": true,
+ "SYS_IO_CANCEL": true,
+ "SYS_IO_DESTROY": true,
+ "SYS_IO_GETEVENTS": true,
+ "SYS_IO_SETUP": true,
+ "SYS_IO_SUBMIT": true,
+ "SYS_IPC": true,
+ "SYS_ISSETUGID": true,
+ "SYS_JAIL": true,
+ "SYS_JAIL_ATTACH": true,
+ "SYS_JAIL_GET": true,
+ "SYS_JAIL_REMOVE": true,
+ "SYS_JAIL_SET": true,
+ "SYS_KDEBUG_TRACE": true,
+ "SYS_KENV": true,
+ "SYS_KEVENT": true,
+ "SYS_KEVENT64": true,
+ "SYS_KEXEC_LOAD": true,
+ "SYS_KEYCTL": true,
+ "SYS_KILL": true,
+ "SYS_KLDFIND": true,
+ "SYS_KLDFIRSTMOD": true,
+ "SYS_KLDLOAD": true,
+ "SYS_KLDNEXT": true,
+ "SYS_KLDSTAT": true,
+ "SYS_KLDSYM": true,
+ "SYS_KLDUNLOAD": true,
+ "SYS_KLDUNLOADF": true,
+ "SYS_KQUEUE": true,
+ "SYS_KQUEUE1": true,
+ "SYS_KTIMER_CREATE": true,
+ "SYS_KTIMER_DELETE": true,
+ "SYS_KTIMER_GETOVERRUN": true,
+ "SYS_KTIMER_GETTIME": true,
+ "SYS_KTIMER_SETTIME": true,
+ "SYS_KTRACE": true,
+ "SYS_LCHFLAGS": true,
+ "SYS_LCHMOD": true,
+ "SYS_LCHOWN": true,
+ "SYS_LCHOWN32": true,
+ "SYS_LGETFH": true,
+ "SYS_LGETXATTR": true,
+ "SYS_LINK": true,
+ "SYS_LINKAT": true,
+ "SYS_LIO_LISTIO": true,
+ "SYS_LISTEN": true,
+ "SYS_LISTXATTR": true,
+ "SYS_LLISTXATTR": true,
+ "SYS_LOCK": true,
+ "SYS_LOOKUP_DCOOKIE": true,
+ "SYS_LPATHCONF": true,
+ "SYS_LREMOVEXATTR": true,
+ "SYS_LSEEK": true,
+ "SYS_LSETXATTR": true,
+ "SYS_LSTAT": true,
+ "SYS_LSTAT64": true,
+ "SYS_LSTAT64_EXTENDED": true,
+ "SYS_LSTATV": true,
+ "SYS_LSTAT_EXTENDED": true,
+ "SYS_LUTIMES": true,
+ "SYS_MAC_SYSCALL": true,
+ "SYS_MADVISE": true,
+ "SYS_MADVISE1": true,
+ "SYS_MAXSYSCALL": true,
+ "SYS_MBIND": true,
+ "SYS_MIGRATE_PAGES": true,
+ "SYS_MINCORE": true,
+ "SYS_MINHERIT": true,
+ "SYS_MKCOMPLEX": true,
+ "SYS_MKDIR": true,
+ "SYS_MKDIRAT": true,
+ "SYS_MKDIR_EXTENDED": true,
+ "SYS_MKFIFO": true,
+ "SYS_MKFIFOAT": true,
+ "SYS_MKFIFO_EXTENDED": true,
+ "SYS_MKNOD": true,
+ "SYS_MKNODAT": true,
+ "SYS_MLOCK": true,
+ "SYS_MLOCKALL": true,
+ "SYS_MMAP": true,
+ "SYS_MMAP2": true,
+ "SYS_MODCTL": true,
+ "SYS_MODFIND": true,
+ "SYS_MODFNEXT": true,
+ "SYS_MODIFY_LDT": true,
+ "SYS_MODNEXT": true,
+ "SYS_MODSTAT": true,
+ "SYS_MODWATCH": true,
+ "SYS_MOUNT": true,
+ "SYS_MOVE_PAGES": true,
+ "SYS_MPROTECT": true,
+ "SYS_MPX": true,
+ "SYS_MQUERY": true,
+ "SYS_MQ_GETSETATTR": true,
+ "SYS_MQ_NOTIFY": true,
+ "SYS_MQ_OPEN": true,
+ "SYS_MQ_TIMEDRECEIVE": true,
+ "SYS_MQ_TIMEDSEND": true,
+ "SYS_MQ_UNLINK": true,
+ "SYS_MREMAP": true,
+ "SYS_MSGCTL": true,
+ "SYS_MSGGET": true,
+ "SYS_MSGRCV": true,
+ "SYS_MSGRCV_NOCANCEL": true,
+ "SYS_MSGSND": true,
+ "SYS_MSGSND_NOCANCEL": true,
+ "SYS_MSGSYS": true,
+ "SYS_MSYNC": true,
+ "SYS_MSYNC_NOCANCEL": true,
+ "SYS_MUNLOCK": true,
+ "SYS_MUNLOCKALL": true,
+ "SYS_MUNMAP": true,
+ "SYS_NAME_TO_HANDLE_AT": true,
+ "SYS_NANOSLEEP": true,
+ "SYS_NEWFSTATAT": true,
+ "SYS_NFSCLNT": true,
+ "SYS_NFSSERVCTL": true,
+ "SYS_NFSSVC": true,
+ "SYS_NFSTAT": true,
+ "SYS_NICE": true,
+ "SYS_NLSTAT": true,
+ "SYS_NMOUNT": true,
+ "SYS_NSTAT": true,
+ "SYS_NTP_ADJTIME": true,
+ "SYS_NTP_GETTIME": true,
+ "SYS_OABI_SYSCALL_BASE": true,
+ "SYS_OBREAK": true,
+ "SYS_OLDFSTAT": true,
+ "SYS_OLDLSTAT": true,
+ "SYS_OLDOLDUNAME": true,
+ "SYS_OLDSTAT": true,
+ "SYS_OLDUNAME": true,
+ "SYS_OPEN": true,
+ "SYS_OPENAT": true,
+ "SYS_OPENBSD_POLL": true,
+ "SYS_OPEN_BY_HANDLE_AT": true,
+ "SYS_OPEN_EXTENDED": true,
+ "SYS_OPEN_NOCANCEL": true,
+ "SYS_OVADVISE": true,
+ "SYS_PACCEPT": true,
+ "SYS_PATHCONF": true,
+ "SYS_PAUSE": true,
+ "SYS_PCICONFIG_IOBASE": true,
+ "SYS_PCICONFIG_READ": true,
+ "SYS_PCICONFIG_WRITE": true,
+ "SYS_PDFORK": true,
+ "SYS_PDGETPID": true,
+ "SYS_PDKILL": true,
+ "SYS_PERF_EVENT_OPEN": true,
+ "SYS_PERSONALITY": true,
+ "SYS_PID_HIBERNATE": true,
+ "SYS_PID_RESUME": true,
+ "SYS_PID_SHUTDOWN_SOCKETS": true,
+ "SYS_PID_SUSPEND": true,
+ "SYS_PIPE": true,
+ "SYS_PIPE2": true,
+ "SYS_PIVOT_ROOT": true,
+ "SYS_PMC_CONTROL": true,
+ "SYS_PMC_GET_INFO": true,
+ "SYS_POLL": true,
+ "SYS_POLLTS": true,
+ "SYS_POLL_NOCANCEL": true,
+ "SYS_POSIX_FADVISE": true,
+ "SYS_POSIX_FALLOCATE": true,
+ "SYS_POSIX_OPENPT": true,
+ "SYS_POSIX_SPAWN": true,
+ "SYS_PPOLL": true,
+ "SYS_PRCTL": true,
+ "SYS_PREAD": true,
+ "SYS_PREAD64": true,
+ "SYS_PREADV": true,
+ "SYS_PREAD_NOCANCEL": true,
+ "SYS_PRLIMIT64": true,
+ "SYS_PROCCTL": true,
+ "SYS_PROCESS_POLICY": true,
+ "SYS_PROCESS_VM_READV": true,
+ "SYS_PROCESS_VM_WRITEV": true,
+ "SYS_PROC_INFO": true,
+ "SYS_PROF": true,
+ "SYS_PROFIL": true,
+ "SYS_PSELECT": true,
+ "SYS_PSELECT6": true,
+ "SYS_PSET_ASSIGN": true,
+ "SYS_PSET_CREATE": true,
+ "SYS_PSET_DESTROY": true,
+ "SYS_PSYNCH_CVBROAD": true,
+ "SYS_PSYNCH_CVCLRPREPOST": true,
+ "SYS_PSYNCH_CVSIGNAL": true,
+ "SYS_PSYNCH_CVWAIT": true,
+ "SYS_PSYNCH_MUTEXDROP": true,
+ "SYS_PSYNCH_MUTEXWAIT": true,
+ "SYS_PSYNCH_RW_DOWNGRADE": true,
+ "SYS_PSYNCH_RW_LONGRDLOCK": true,
+ "SYS_PSYNCH_RW_RDLOCK": true,
+ "SYS_PSYNCH_RW_UNLOCK": true,
+ "SYS_PSYNCH_RW_UNLOCK2": true,
+ "SYS_PSYNCH_RW_UPGRADE": true,
+ "SYS_PSYNCH_RW_WRLOCK": true,
+ "SYS_PSYNCH_RW_YIELDWRLOCK": true,
+ "SYS_PTRACE": true,
+ "SYS_PUTPMSG": true,
+ "SYS_PWRITE": true,
+ "SYS_PWRITE64": true,
+ "SYS_PWRITEV": true,
+ "SYS_PWRITE_NOCANCEL": true,
+ "SYS_QUERY_MODULE": true,
+ "SYS_QUOTACTL": true,
+ "SYS_RASCTL": true,
+ "SYS_RCTL_ADD_RULE": true,
+ "SYS_RCTL_GET_LIMITS": true,
+ "SYS_RCTL_GET_RACCT": true,
+ "SYS_RCTL_GET_RULES": true,
+ "SYS_RCTL_REMOVE_RULE": true,
+ "SYS_READ": true,
+ "SYS_READAHEAD": true,
+ "SYS_READDIR": true,
+ "SYS_READLINK": true,
+ "SYS_READLINKAT": true,
+ "SYS_READV": true,
+ "SYS_READV_NOCANCEL": true,
+ "SYS_READ_NOCANCEL": true,
+ "SYS_REBOOT": true,
+ "SYS_RECV": true,
+ "SYS_RECVFROM": true,
+ "SYS_RECVFROM_NOCANCEL": true,
+ "SYS_RECVMMSG": true,
+ "SYS_RECVMSG": true,
+ "SYS_RECVMSG_NOCANCEL": true,
+ "SYS_REMAP_FILE_PAGES": true,
+ "SYS_REMOVEXATTR": true,
+ "SYS_RENAME": true,
+ "SYS_RENAMEAT": true,
+ "SYS_REQUEST_KEY": true,
+ "SYS_RESTART_SYSCALL": true,
+ "SYS_REVOKE": true,
+ "SYS_RFORK": true,
+ "SYS_RMDIR": true,
+ "SYS_RTPRIO": true,
+ "SYS_RTPRIO_THREAD": true,
+ "SYS_RT_SIGACTION": true,
+ "SYS_RT_SIGPENDING": true,
+ "SYS_RT_SIGPROCMASK": true,
+ "SYS_RT_SIGQUEUEINFO": true,
+ "SYS_RT_SIGRETURN": true,
+ "SYS_RT_SIGSUSPEND": true,
+ "SYS_RT_SIGTIMEDWAIT": true,
+ "SYS_RT_TGSIGQUEUEINFO": true,
+ "SYS_SBRK": true,
+ "SYS_SCHED_GETAFFINITY": true,
+ "SYS_SCHED_GETPARAM": true,
+ "SYS_SCHED_GETSCHEDULER": true,
+ "SYS_SCHED_GET_PRIORITY_MAX": true,
+ "SYS_SCHED_GET_PRIORITY_MIN": true,
+ "SYS_SCHED_RR_GET_INTERVAL": true,
+ "SYS_SCHED_SETAFFINITY": true,
+ "SYS_SCHED_SETPARAM": true,
+ "SYS_SCHED_SETSCHEDULER": true,
+ "SYS_SCHED_YIELD": true,
+ "SYS_SCTP_GENERIC_RECVMSG": true,
+ "SYS_SCTP_GENERIC_SENDMSG": true,
+ "SYS_SCTP_GENERIC_SENDMSG_IOV": true,
+ "SYS_SCTP_PEELOFF": true,
+ "SYS_SEARCHFS": true,
+ "SYS_SECURITY": true,
+ "SYS_SELECT": true,
+ "SYS_SELECT_NOCANCEL": true,
+ "SYS_SEMCONFIG": true,
+ "SYS_SEMCTL": true,
+ "SYS_SEMGET": true,
+ "SYS_SEMOP": true,
+ "SYS_SEMSYS": true,
+ "SYS_SEMTIMEDOP": true,
+ "SYS_SEM_CLOSE": true,
+ "SYS_SEM_DESTROY": true,
+ "SYS_SEM_GETVALUE": true,
+ "SYS_SEM_INIT": true,
+ "SYS_SEM_OPEN": true,
+ "SYS_SEM_POST": true,
+ "SYS_SEM_TRYWAIT": true,
+ "SYS_SEM_UNLINK": true,
+ "SYS_SEM_WAIT": true,
+ "SYS_SEM_WAIT_NOCANCEL": true,
+ "SYS_SEND": true,
+ "SYS_SENDFILE": true,
+ "SYS_SENDFILE64": true,
+ "SYS_SENDMMSG": true,
+ "SYS_SENDMSG": true,
+ "SYS_SENDMSG_NOCANCEL": true,
+ "SYS_SENDTO": true,
+ "SYS_SENDTO_NOCANCEL": true,
+ "SYS_SETATTRLIST": true,
+ "SYS_SETAUDIT": true,
+ "SYS_SETAUDIT_ADDR": true,
+ "SYS_SETAUID": true,
+ "SYS_SETCONTEXT": true,
+ "SYS_SETDOMAINNAME": true,
+ "SYS_SETEGID": true,
+ "SYS_SETEUID": true,
+ "SYS_SETFIB": true,
+ "SYS_SETFSGID": true,
+ "SYS_SETFSGID32": true,
+ "SYS_SETFSUID": true,
+ "SYS_SETFSUID32": true,
+ "SYS_SETGID": true,
+ "SYS_SETGID32": true,
+ "SYS_SETGROUPS": true,
+ "SYS_SETGROUPS32": true,
+ "SYS_SETHOSTNAME": true,
+ "SYS_SETITIMER": true,
+ "SYS_SETLCID": true,
+ "SYS_SETLOGIN": true,
+ "SYS_SETLOGINCLASS": true,
+ "SYS_SETNS": true,
+ "SYS_SETPGID": true,
+ "SYS_SETPRIORITY": true,
+ "SYS_SETPRIVEXEC": true,
+ "SYS_SETREGID": true,
+ "SYS_SETREGID32": true,
+ "SYS_SETRESGID": true,
+ "SYS_SETRESGID32": true,
+ "SYS_SETRESUID": true,
+ "SYS_SETRESUID32": true,
+ "SYS_SETREUID": true,
+ "SYS_SETREUID32": true,
+ "SYS_SETRLIMIT": true,
+ "SYS_SETRTABLE": true,
+ "SYS_SETSGROUPS": true,
+ "SYS_SETSID": true,
+ "SYS_SETSOCKOPT": true,
+ "SYS_SETTID": true,
+ "SYS_SETTID_WITH_PID": true,
+ "SYS_SETTIMEOFDAY": true,
+ "SYS_SETUID": true,
+ "SYS_SETUID32": true,
+ "SYS_SETWGROUPS": true,
+ "SYS_SETXATTR": true,
+ "SYS_SET_MEMPOLICY": true,
+ "SYS_SET_ROBUST_LIST": true,
+ "SYS_SET_THREAD_AREA": true,
+ "SYS_SET_TID_ADDRESS": true,
+ "SYS_SGETMASK": true,
+ "SYS_SHARED_REGION_CHECK_NP": true,
+ "SYS_SHARED_REGION_MAP_AND_SLIDE_NP": true,
+ "SYS_SHMAT": true,
+ "SYS_SHMCTL": true,
+ "SYS_SHMDT": true,
+ "SYS_SHMGET": true,
+ "SYS_SHMSYS": true,
+ "SYS_SHM_OPEN": true,
+ "SYS_SHM_UNLINK": true,
+ "SYS_SHUTDOWN": true,
+ "SYS_SIGACTION": true,
+ "SYS_SIGALTSTACK": true,
+ "SYS_SIGNAL": true,
+ "SYS_SIGNALFD": true,
+ "SYS_SIGNALFD4": true,
+ "SYS_SIGPENDING": true,
+ "SYS_SIGPROCMASK": true,
+ "SYS_SIGQUEUE": true,
+ "SYS_SIGQUEUEINFO": true,
+ "SYS_SIGRETURN": true,
+ "SYS_SIGSUSPEND": true,
+ "SYS_SIGSUSPEND_NOCANCEL": true,
+ "SYS_SIGTIMEDWAIT": true,
+ "SYS_SIGWAIT": true,
+ "SYS_SIGWAITINFO": true,
+ "SYS_SOCKET": true,
+ "SYS_SOCKETCALL": true,
+ "SYS_SOCKETPAIR": true,
+ "SYS_SPLICE": true,
+ "SYS_SSETMASK": true,
+ "SYS_SSTK": true,
+ "SYS_STACK_SNAPSHOT": true,
+ "SYS_STAT": true,
+ "SYS_STAT64": true,
+ "SYS_STAT64_EXTENDED": true,
+ "SYS_STATFS": true,
+ "SYS_STATFS64": true,
+ "SYS_STATV": true,
+ "SYS_STATVFS1": true,
+ "SYS_STAT_EXTENDED": true,
+ "SYS_STIME": true,
+ "SYS_STTY": true,
+ "SYS_SWAPCONTEXT": true,
+ "SYS_SWAPCTL": true,
+ "SYS_SWAPOFF": true,
+ "SYS_SWAPON": true,
+ "SYS_SYMLINK": true,
+ "SYS_SYMLINKAT": true,
+ "SYS_SYNC": true,
+ "SYS_SYNCFS": true,
+ "SYS_SYNC_FILE_RANGE": true,
+ "SYS_SYSARCH": true,
+ "SYS_SYSCALL": true,
+ "SYS_SYSCALL_BASE": true,
+ "SYS_SYSFS": true,
+ "SYS_SYSINFO": true,
+ "SYS_SYSLOG": true,
+ "SYS_TEE": true,
+ "SYS_TGKILL": true,
+ "SYS_THREAD_SELFID": true,
+ "SYS_THR_CREATE": true,
+ "SYS_THR_EXIT": true,
+ "SYS_THR_KILL": true,
+ "SYS_THR_KILL2": true,
+ "SYS_THR_NEW": true,
+ "SYS_THR_SELF": true,
+ "SYS_THR_SET_NAME": true,
+ "SYS_THR_SUSPEND": true,
+ "SYS_THR_WAKE": true,
+ "SYS_TIME": true,
+ "SYS_TIMERFD_CREATE": true,
+ "SYS_TIMERFD_GETTIME": true,
+ "SYS_TIMERFD_SETTIME": true,
+ "SYS_TIMER_CREATE": true,
+ "SYS_TIMER_DELETE": true,
+ "SYS_TIMER_GETOVERRUN": true,
+ "SYS_TIMER_GETTIME": true,
+ "SYS_TIMER_SETTIME": true,
+ "SYS_TIMES": true,
+ "SYS_TKILL": true,
+ "SYS_TRUNCATE": true,
+ "SYS_TRUNCATE64": true,
+ "SYS_TUXCALL": true,
+ "SYS_UGETRLIMIT": true,
+ "SYS_ULIMIT": true,
+ "SYS_UMASK": true,
+ "SYS_UMASK_EXTENDED": true,
+ "SYS_UMOUNT": true,
+ "SYS_UMOUNT2": true,
+ "SYS_UNAME": true,
+ "SYS_UNDELETE": true,
+ "SYS_UNLINK": true,
+ "SYS_UNLINKAT": true,
+ "SYS_UNMOUNT": true,
+ "SYS_UNSHARE": true,
+ "SYS_USELIB": true,
+ "SYS_USTAT": true,
+ "SYS_UTIME": true,
+ "SYS_UTIMENSAT": true,
+ "SYS_UTIMES": true,
+ "SYS_UTRACE": true,
+ "SYS_UUIDGEN": true,
+ "SYS_VADVISE": true,
+ "SYS_VFORK": true,
+ "SYS_VHANGUP": true,
+ "SYS_VM86": true,
+ "SYS_VM86OLD": true,
+ "SYS_VMSPLICE": true,
+ "SYS_VM_PRESSURE_MONITOR": true,
+ "SYS_VSERVER": true,
+ "SYS_WAIT4": true,
+ "SYS_WAIT4_NOCANCEL": true,
+ "SYS_WAIT6": true,
+ "SYS_WAITEVENT": true,
+ "SYS_WAITID": true,
+ "SYS_WAITID_NOCANCEL": true,
+ "SYS_WAITPID": true,
+ "SYS_WATCHEVENT": true,
+ "SYS_WORKQ_KERNRETURN": true,
+ "SYS_WORKQ_OPEN": true,
+ "SYS_WRITE": true,
+ "SYS_WRITEV": true,
+ "SYS_WRITEV_NOCANCEL": true,
+ "SYS_WRITE_NOCANCEL": true,
+ "SYS_YIELD": true,
+ "SYS__LLSEEK": true,
+ "SYS__LWP_CONTINUE": true,
+ "SYS__LWP_CREATE": true,
+ "SYS__LWP_CTL": true,
+ "SYS__LWP_DETACH": true,
+ "SYS__LWP_EXIT": true,
+ "SYS__LWP_GETNAME": true,
+ "SYS__LWP_GETPRIVATE": true,
+ "SYS__LWP_KILL": true,
+ "SYS__LWP_PARK": true,
+ "SYS__LWP_SELF": true,
+ "SYS__LWP_SETNAME": true,
+ "SYS__LWP_SETPRIVATE": true,
+ "SYS__LWP_SUSPEND": true,
+ "SYS__LWP_UNPARK": true,
+ "SYS__LWP_UNPARK_ALL": true,
+ "SYS__LWP_WAIT": true,
+ "SYS__LWP_WAKEUP": true,
+ "SYS__NEWSELECT": true,
+ "SYS__PSET_BIND": true,
+ "SYS__SCHED_GETAFFINITY": true,
+ "SYS__SCHED_GETPARAM": true,
+ "SYS__SCHED_SETAFFINITY": true,
+ "SYS__SCHED_SETPARAM": true,
+ "SYS__SYSCTL": true,
+ "SYS__UMTX_LOCK": true,
+ "SYS__UMTX_OP": true,
+ "SYS__UMTX_UNLOCK": true,
+ "SYS___ACL_ACLCHECK_FD": true,
+ "SYS___ACL_ACLCHECK_FILE": true,
+ "SYS___ACL_ACLCHECK_LINK": true,
+ "SYS___ACL_DELETE_FD": true,
+ "SYS___ACL_DELETE_FILE": true,
+ "SYS___ACL_DELETE_LINK": true,
+ "SYS___ACL_GET_FD": true,
+ "SYS___ACL_GET_FILE": true,
+ "SYS___ACL_GET_LINK": true,
+ "SYS___ACL_SET_FD": true,
+ "SYS___ACL_SET_FILE": true,
+ "SYS___ACL_SET_LINK": true,
+ "SYS___CLONE": true,
+ "SYS___DISABLE_THREADSIGNAL": true,
+ "SYS___GETCWD": true,
+ "SYS___GETLOGIN": true,
+ "SYS___GET_TCB": true,
+ "SYS___MAC_EXECVE": true,
+ "SYS___MAC_GETFSSTAT": true,
+ "SYS___MAC_GET_FD": true,
+ "SYS___MAC_GET_FILE": true,
+ "SYS___MAC_GET_LCID": true,
+ "SYS___MAC_GET_LCTX": true,
+ "SYS___MAC_GET_LINK": true,
+ "SYS___MAC_GET_MOUNT": true,
+ "SYS___MAC_GET_PID": true,
+ "SYS___MAC_GET_PROC": true,
+ "SYS___MAC_MOUNT": true,
+ "SYS___MAC_SET_FD": true,
+ "SYS___MAC_SET_FILE": true,
+ "SYS___MAC_SET_LCTX": true,
+ "SYS___MAC_SET_LINK": true,
+ "SYS___MAC_SET_PROC": true,
+ "SYS___MAC_SYSCALL": true,
+ "SYS___OLD_SEMWAIT_SIGNAL": true,
+ "SYS___OLD_SEMWAIT_SIGNAL_NOCANCEL": true,
+ "SYS___POSIX_CHOWN": true,
+ "SYS___POSIX_FCHOWN": true,
+ "SYS___POSIX_LCHOWN": true,
+ "SYS___POSIX_RENAME": true,
+ "SYS___PTHREAD_CANCELED": true,
+ "SYS___PTHREAD_CHDIR": true,
+ "SYS___PTHREAD_FCHDIR": true,
+ "SYS___PTHREAD_KILL": true,
+ "SYS___PTHREAD_MARKCANCEL": true,
+ "SYS___PTHREAD_SIGMASK": true,
+ "SYS___QUOTACTL": true,
+ "SYS___SEMCTL": true,
+ "SYS___SEMWAIT_SIGNAL": true,
+ "SYS___SEMWAIT_SIGNAL_NOCANCEL": true,
+ "SYS___SETLOGIN": true,
+ "SYS___SETUGID": true,
+ "SYS___SET_TCB": true,
+ "SYS___SIGACTION_SIGTRAMP": true,
+ "SYS___SIGTIMEDWAIT": true,
+ "SYS___SIGWAIT": true,
+ "SYS___SIGWAIT_NOCANCEL": true,
+ "SYS___SYSCTL": true,
+ "SYS___TFORK": true,
+ "SYS___THREXIT": true,
+ "SYS___THRSIGDIVERT": true,
+ "SYS___THRSLEEP": true,
+ "SYS___THRWAKEUP": true,
+ "S_ARCH1": true,
+ "S_ARCH2": true,
+ "S_BLKSIZE": true,
+ "S_IEXEC": true,
+ "S_IFBLK": true,
+ "S_IFCHR": true,
+ "S_IFDIR": true,
+ "S_IFIFO": true,
+ "S_IFLNK": true,
+ "S_IFMT": true,
+ "S_IFREG": true,
+ "S_IFSOCK": true,
+ "S_IFWHT": true,
+ "S_IREAD": true,
+ "S_IRGRP": true,
+ "S_IROTH": true,
+ "S_IRUSR": true,
+ "S_IRWXG": true,
+ "S_IRWXO": true,
+ "S_IRWXU": true,
+ "S_ISGID": true,
+ "S_ISTXT": true,
+ "S_ISUID": true,
+ "S_ISVTX": true,
+ "S_IWGRP": true,
+ "S_IWOTH": true,
+ "S_IWRITE": true,
+ "S_IWUSR": true,
+ "S_IXGRP": true,
+ "S_IXOTH": true,
+ "S_IXUSR": true,
+ "S_LOGIN_SET": true,
+ "SecurityAttributes": true,
+ "Seek": true,
+ "Select": true,
+ "Sendfile": true,
+ "Sendmsg": true,
+ "SendmsgN": true,
+ "Sendto": true,
+ "Servent": true,
+ "SetBpf": true,
+ "SetBpfBuflen": true,
+ "SetBpfDatalink": true,
+ "SetBpfHeadercmpl": true,
+ "SetBpfImmediate": true,
+ "SetBpfInterface": true,
+ "SetBpfPromisc": true,
+ "SetBpfTimeout": true,
+ "SetCurrentDirectory": true,
+ "SetEndOfFile": true,
+ "SetEnvironmentVariable": true,
+ "SetFileAttributes": true,
+ "SetFileCompletionNotificationModes": true,
+ "SetFilePointer": true,
+ "SetFileTime": true,
+ "SetHandleInformation": true,
+ "SetKevent": true,
+ "SetLsfPromisc": true,
+ "SetNonblock": true,
+ "Setdomainname": true,
+ "Setegid": true,
+ "Setenv": true,
+ "Seteuid": true,
+ "Setfsgid": true,
+ "Setfsuid": true,
+ "Setgid": true,
+ "Setgroups": true,
+ "Sethostname": true,
+ "Setlogin": true,
+ "Setpgid": true,
+ "Setpriority": true,
+ "Setprivexec": true,
+ "Setregid": true,
+ "Setresgid": true,
+ "Setresuid": true,
+ "Setreuid": true,
+ "Setrlimit": true,
+ "Setsid": true,
+ "Setsockopt": true,
+ "SetsockoptByte": true,
+ "SetsockoptICMPv6Filter": true,
+ "SetsockoptIPMreq": true,
+ "SetsockoptIPMreqn": true,
+ "SetsockoptIPv6Mreq": true,
+ "SetsockoptInet4Addr": true,
+ "SetsockoptInt": true,
+ "SetsockoptLinger": true,
+ "SetsockoptString": true,
+ "SetsockoptTimeval": true,
+ "Settimeofday": true,
+ "Setuid": true,
+ "Setxattr": true,
+ "Shutdown": true,
+ "SidTypeAlias": true,
+ "SidTypeComputer": true,
+ "SidTypeDeletedAccount": true,
+ "SidTypeDomain": true,
+ "SidTypeGroup": true,
+ "SidTypeInvalid": true,
+ "SidTypeLabel": true,
+ "SidTypeUnknown": true,
+ "SidTypeUser": true,
+ "SidTypeWellKnownGroup": true,
+ "Signal": true,
+ "SizeofBpfHdr": true,
+ "SizeofBpfInsn": true,
+ "SizeofBpfProgram": true,
+ "SizeofBpfStat": true,
+ "SizeofBpfVersion": true,
+ "SizeofBpfZbuf": true,
+ "SizeofBpfZbufHeader": true,
+ "SizeofCmsghdr": true,
+ "SizeofICMPv6Filter": true,
+ "SizeofIPMreq": true,
+ "SizeofIPMreqn": true,
+ "SizeofIPv6MTUInfo": true,
+ "SizeofIPv6Mreq": true,
+ "SizeofIfAddrmsg": true,
+ "SizeofIfAnnounceMsghdr": true,
+ "SizeofIfData": true,
+ "SizeofIfInfomsg": true,
+ "SizeofIfMsghdr": true,
+ "SizeofIfaMsghdr": true,
+ "SizeofIfmaMsghdr": true,
+ "SizeofIfmaMsghdr2": true,
+ "SizeofInet4Pktinfo": true,
+ "SizeofInet6Pktinfo": true,
+ "SizeofInotifyEvent": true,
+ "SizeofLinger": true,
+ "SizeofMsghdr": true,
+ "SizeofNlAttr": true,
+ "SizeofNlMsgerr": true,
+ "SizeofNlMsghdr": true,
+ "SizeofRtAttr": true,
+ "SizeofRtGenmsg": true,
+ "SizeofRtMetrics": true,
+ "SizeofRtMsg": true,
+ "SizeofRtMsghdr": true,
+ "SizeofRtNexthop": true,
+ "SizeofSockFilter": true,
+ "SizeofSockFprog": true,
+ "SizeofSockaddrAny": true,
+ "SizeofSockaddrDatalink": true,
+ "SizeofSockaddrInet4": true,
+ "SizeofSockaddrInet6": true,
+ "SizeofSockaddrLinklayer": true,
+ "SizeofSockaddrNetlink": true,
+ "SizeofSockaddrUnix": true,
+ "SizeofTCPInfo": true,
+ "SizeofUcred": true,
+ "SlicePtrFromStrings": true,
+ "SockFilter": true,
+ "SockFprog": true,
+ "SockaddrDatalink": true,
+ "SockaddrGen": true,
+ "SockaddrInet4": true,
+ "SockaddrInet6": true,
+ "SockaddrLinklayer": true,
+ "SockaddrNetlink": true,
+ "SockaddrUnix": true,
+ "Socket": true,
+ "SocketControlMessage": true,
+ "SocketDisableIPv6": true,
+ "Socketpair": true,
+ "Splice": true,
+ "StartProcess": true,
+ "StartupInfo": true,
+ "Stat": true,
+ "Stat_t": true,
+ "Statfs": true,
+ "Statfs_t": true,
+ "Stderr": true,
+ "Stdin": true,
+ "Stdout": true,
+ "StringBytePtr": true,
+ "StringByteSlice": true,
+ "StringSlicePtr": true,
+ "StringToSid": true,
+ "StringToUTF16": true,
+ "StringToUTF16Ptr": true,
+ "Symlink": true,
+ "Sync": true,
+ "SyncFileRange": true,
+ "SysProcAttr": true,
+ "SysProcIDMap": true,
+ "Syscall": true,
+ "Syscall12": true,
+ "Syscall15": true,
+ "Syscall18": true,
+ "Syscall6": true,
+ "Syscall9": true,
+ "Sysctl": true,
+ "SysctlUint32": true,
+ "Sysctlnode": true,
+ "Sysinfo": true,
+ "Sysinfo_t": true,
+ "Systemtime": true,
+ "TCGETS": true,
+ "TCIFLUSH": true,
+ "TCIOFLUSH": true,
+ "TCOFLUSH": true,
+ "TCPInfo": true,
+ "TCPKeepalive": true,
+ "TCP_CA_NAME_MAX": true,
+ "TCP_CONGCTL": true,
+ "TCP_CONGESTION": true,
+ "TCP_CONNECTIONTIMEOUT": true,
+ "TCP_CORK": true,
+ "TCP_DEFER_ACCEPT": true,
+ "TCP_INFO": true,
+ "TCP_KEEPALIVE": true,
+ "TCP_KEEPCNT": true,
+ "TCP_KEEPIDLE": true,
+ "TCP_KEEPINIT": true,
+ "TCP_KEEPINTVL": true,
+ "TCP_LINGER2": true,
+ "TCP_MAXBURST": true,
+ "TCP_MAXHLEN": true,
+ "TCP_MAXOLEN": true,
+ "TCP_MAXSEG": true,
+ "TCP_MAXWIN": true,
+ "TCP_MAX_SACK": true,
+ "TCP_MAX_WINSHIFT": true,
+ "TCP_MD5SIG": true,
+ "TCP_MD5SIG_MAXKEYLEN": true,
+ "TCP_MINMSS": true,
+ "TCP_MINMSSOVERLOAD": true,
+ "TCP_MSS": true,
+ "TCP_NODELAY": true,
+ "TCP_NOOPT": true,
+ "TCP_NOPUSH": true,
+ "TCP_NSTATES": true,
+ "TCP_QUICKACK": true,
+ "TCP_RXT_CONNDROPTIME": true,
+ "TCP_RXT_FINDROP": true,
+ "TCP_SACK_ENABLE": true,
+ "TCP_SYNCNT": true,
+ "TCP_VENDOR": true,
+ "TCP_WINDOW_CLAMP": true,
+ "TCSAFLUSH": true,
+ "TCSETS": true,
+ "TF_DISCONNECT": true,
+ "TF_REUSE_SOCKET": true,
+ "TF_USE_DEFAULT_WORKER": true,
+ "TF_USE_KERNEL_APC": true,
+ "TF_USE_SYSTEM_THREAD": true,
+ "TF_WRITE_BEHIND": true,
+ "TH32CS_INHERIT": true,
+ "TH32CS_SNAPALL": true,
+ "TH32CS_SNAPHEAPLIST": true,
+ "TH32CS_SNAPMODULE": true,
+ "TH32CS_SNAPMODULE32": true,
+ "TH32CS_SNAPPROCESS": true,
+ "TH32CS_SNAPTHREAD": true,
+ "TIME_ZONE_ID_DAYLIGHT": true,
+ "TIME_ZONE_ID_STANDARD": true,
+ "TIME_ZONE_ID_UNKNOWN": true,
+ "TIOCCBRK": true,
+ "TIOCCDTR": true,
+ "TIOCCONS": true,
+ "TIOCDCDTIMESTAMP": true,
+ "TIOCDRAIN": true,
+ "TIOCDSIMICROCODE": true,
+ "TIOCEXCL": true,
+ "TIOCEXT": true,
+ "TIOCFLAG_CDTRCTS": true,
+ "TIOCFLAG_CLOCAL": true,
+ "TIOCFLAG_CRTSCTS": true,
+ "TIOCFLAG_MDMBUF": true,
+ "TIOCFLAG_PPS": true,
+ "TIOCFLAG_SOFTCAR": true,
+ "TIOCFLUSH": true,
+ "TIOCGDEV": true,
+ "TIOCGDRAINWAIT": true,
+ "TIOCGETA": true,
+ "TIOCGETD": true,
+ "TIOCGFLAGS": true,
+ "TIOCGICOUNT": true,
+ "TIOCGLCKTRMIOS": true,
+ "TIOCGLINED": true,
+ "TIOCGPGRP": true,
+ "TIOCGPTN": true,
+ "TIOCGQSIZE": true,
+ "TIOCGRANTPT": true,
+ "TIOCGRS485": true,
+ "TIOCGSERIAL": true,
+ "TIOCGSID": true,
+ "TIOCGSIZE": true,
+ "TIOCGSOFTCAR": true,
+ "TIOCGTSTAMP": true,
+ "TIOCGWINSZ": true,
+ "TIOCINQ": true,
+ "TIOCIXOFF": true,
+ "TIOCIXON": true,
+ "TIOCLINUX": true,
+ "TIOCMBIC": true,
+ "TIOCMBIS": true,
+ "TIOCMGDTRWAIT": true,
+ "TIOCMGET": true,
+ "TIOCMIWAIT": true,
+ "TIOCMODG": true,
+ "TIOCMODS": true,
+ "TIOCMSDTRWAIT": true,
+ "TIOCMSET": true,
+ "TIOCM_CAR": true,
+ "TIOCM_CD": true,
+ "TIOCM_CTS": true,
+ "TIOCM_DCD": true,
+ "TIOCM_DSR": true,
+ "TIOCM_DTR": true,
+ "TIOCM_LE": true,
+ "TIOCM_RI": true,
+ "TIOCM_RNG": true,
+ "TIOCM_RTS": true,
+ "TIOCM_SR": true,
+ "TIOCM_ST": true,
+ "TIOCNOTTY": true,
+ "TIOCNXCL": true,
+ "TIOCOUTQ": true,
+ "TIOCPKT": true,
+ "TIOCPKT_DATA": true,
+ "TIOCPKT_DOSTOP": true,
+ "TIOCPKT_FLUSHREAD": true,
+ "TIOCPKT_FLUSHWRITE": true,
+ "TIOCPKT_IOCTL": true,
+ "TIOCPKT_NOSTOP": true,
+ "TIOCPKT_START": true,
+ "TIOCPKT_STOP": true,
+ "TIOCPTMASTER": true,
+ "TIOCPTMGET": true,
+ "TIOCPTSNAME": true,
+ "TIOCPTYGNAME": true,
+ "TIOCPTYGRANT": true,
+ "TIOCPTYUNLK": true,
+ "TIOCRCVFRAME": true,
+ "TIOCREMOTE": true,
+ "TIOCSBRK": true,
+ "TIOCSCONS": true,
+ "TIOCSCTTY": true,
+ "TIOCSDRAINWAIT": true,
+ "TIOCSDTR": true,
+ "TIOCSERCONFIG": true,
+ "TIOCSERGETLSR": true,
+ "TIOCSERGETMULTI": true,
+ "TIOCSERGSTRUCT": true,
+ "TIOCSERGWILD": true,
+ "TIOCSERSETMULTI": true,
+ "TIOCSERSWILD": true,
+ "TIOCSER_TEMT": true,
+ "TIOCSETA": true,
+ "TIOCSETAF": true,
+ "TIOCSETAW": true,
+ "TIOCSETD": true,
+ "TIOCSFLAGS": true,
+ "TIOCSIG": true,
+ "TIOCSLCKTRMIOS": true,
+ "TIOCSLINED": true,
+ "TIOCSPGRP": true,
+ "TIOCSPTLCK": true,
+ "TIOCSQSIZE": true,
+ "TIOCSRS485": true,
+ "TIOCSSERIAL": true,
+ "TIOCSSIZE": true,
+ "TIOCSSOFTCAR": true,
+ "TIOCSTART": true,
+ "TIOCSTAT": true,
+ "TIOCSTI": true,
+ "TIOCSTOP": true,
+ "TIOCSTSTAMP": true,
+ "TIOCSWINSZ": true,
+ "TIOCTIMESTAMP": true,
+ "TIOCUCNTL": true,
+ "TIOCVHANGUP": true,
+ "TIOCXMTFRAME": true,
+ "TOKEN_ADJUST_DEFAULT": true,
+ "TOKEN_ADJUST_GROUPS": true,
+ "TOKEN_ADJUST_PRIVILEGES": true,
+ "TOKEN_ADJUST_SESSIONID": true,
+ "TOKEN_ALL_ACCESS": true,
+ "TOKEN_ASSIGN_PRIMARY": true,
+ "TOKEN_DUPLICATE": true,
+ "TOKEN_EXECUTE": true,
+ "TOKEN_IMPERSONATE": true,
+ "TOKEN_QUERY": true,
+ "TOKEN_QUERY_SOURCE": true,
+ "TOKEN_READ": true,
+ "TOKEN_WRITE": true,
+ "TOSTOP": true,
+ "TRUNCATE_EXISTING": true,
+ "TUNATTACHFILTER": true,
+ "TUNDETACHFILTER": true,
+ "TUNGETFEATURES": true,
+ "TUNGETIFF": true,
+ "TUNGETSNDBUF": true,
+ "TUNGETVNETHDRSZ": true,
+ "TUNSETDEBUG": true,
+ "TUNSETGROUP": true,
+ "TUNSETIFF": true,
+ "TUNSETLINK": true,
+ "TUNSETNOCSUM": true,
+ "TUNSETOFFLOAD": true,
+ "TUNSETOWNER": true,
+ "TUNSETPERSIST": true,
+ "TUNSETSNDBUF": true,
+ "TUNSETTXFILTER": true,
+ "TUNSETVNETHDRSZ": true,
+ "Tee": true,
+ "TerminateProcess": true,
+ "Termios": true,
+ "Tgkill": true,
+ "Time": true,
+ "Time_t": true,
+ "Times": true,
+ "Timespec": true,
+ "TimespecToNsec": true,
+ "Timeval": true,
+ "Timeval32": true,
+ "TimevalToNsec": true,
+ "Timex": true,
+ "Timezoneinformation": true,
+ "Tms": true,
+ "Token": true,
+ "TokenAccessInformation": true,
+ "TokenAuditPolicy": true,
+ "TokenDefaultDacl": true,
+ "TokenElevation": true,
+ "TokenElevationType": true,
+ "TokenGroups": true,
+ "TokenGroupsAndPrivileges": true,
+ "TokenHasRestrictions": true,
+ "TokenImpersonationLevel": true,
+ "TokenIntegrityLevel": true,
+ "TokenLinkedToken": true,
+ "TokenLogonSid": true,
+ "TokenMandatoryPolicy": true,
+ "TokenOrigin": true,
+ "TokenOwner": true,
+ "TokenPrimaryGroup": true,
+ "TokenPrivileges": true,
+ "TokenRestrictedSids": true,
+ "TokenSandBoxInert": true,
+ "TokenSessionId": true,
+ "TokenSessionReference": true,
+ "TokenSource": true,
+ "TokenStatistics": true,
+ "TokenType": true,
+ "TokenUIAccess": true,
+ "TokenUser": true,
+ "TokenVirtualizationAllowed": true,
+ "TokenVirtualizationEnabled": true,
+ "Tokenprimarygroup": true,
+ "Tokenuser": true,
+ "TranslateAccountName": true,
+ "TranslateName": true,
+ "TransmitFile": true,
+ "TransmitFileBuffers": true,
+ "Truncate": true,
+ "UNIX_PATH_MAX": true,
+ "USAGE_MATCH_TYPE_AND": true,
+ "USAGE_MATCH_TYPE_OR": true,
+ "UTF16FromString": true,
+ "UTF16PtrFromString": true,
+ "UTF16ToString": true,
+ "Ucred": true,
+ "Umask": true,
+ "Uname": true,
+ "Undelete": true,
+ "UnixCredentials": true,
+ "UnixRights": true,
+ "Unlink": true,
+ "Unlinkat": true,
+ "UnmapViewOfFile": true,
+ "Unmount": true,
+ "Unsetenv": true,
+ "Unshare": true,
+ "UserInfo10": true,
+ "Ustat": true,
+ "Ustat_t": true,
+ "Utimbuf": true,
+ "Utime": true,
+ "Utimes": true,
+ "UtimesNano": true,
+ "Utsname": true,
+ "VDISCARD": true,
+ "VDSUSP": true,
+ "VEOF": true,
+ "VEOL": true,
+ "VEOL2": true,
+ "VERASE": true,
+ "VERASE2": true,
+ "VINTR": true,
+ "VKILL": true,
+ "VLNEXT": true,
+ "VMIN": true,
+ "VQUIT": true,
+ "VREPRINT": true,
+ "VSTART": true,
+ "VSTATUS": true,
+ "VSTOP": true,
+ "VSUSP": true,
+ "VSWTC": true,
+ "VT0": true,
+ "VT1": true,
+ "VTDLY": true,
+ "VTIME": true,
+ "VWERASE": true,
+ "VirtualLock": true,
+ "VirtualUnlock": true,
+ "WAIT_ABANDONED": true,
+ "WAIT_FAILED": true,
+ "WAIT_OBJECT_0": true,
+ "WAIT_TIMEOUT": true,
+ "WALL": true,
+ "WALLSIG": true,
+ "WALTSIG": true,
+ "WCLONE": true,
+ "WCONTINUED": true,
+ "WCOREFLAG": true,
+ "WEXITED": true,
+ "WLINUXCLONE": true,
+ "WNOHANG": true,
+ "WNOTHREAD": true,
+ "WNOWAIT": true,
+ "WNOZOMBIE": true,
+ "WOPTSCHECKED": true,
+ "WORDSIZE": true,
+ "WSABuf": true,
+ "WSACleanup": true,
+ "WSADESCRIPTION_LEN": true,
+ "WSAData": true,
+ "WSAEACCES": true,
+ "WSAECONNABORTED": true,
+ "WSAECONNRESET": true,
+ "WSAEnumProtocols": true,
+ "WSAID_CONNECTEX": true,
+ "WSAIoctl": true,
+ "WSAPROTOCOL_LEN": true,
+ "WSAProtocolChain": true,
+ "WSAProtocolInfo": true,
+ "WSARecv": true,
+ "WSARecvFrom": true,
+ "WSASYS_STATUS_LEN": true,
+ "WSASend": true,
+ "WSASendTo": true,
+ "WSASendto": true,
+ "WSAStartup": true,
+ "WSTOPPED": true,
+ "WTRAPPED": true,
+ "WUNTRACED": true,
+ "Wait4": true,
+ "WaitForSingleObject": true,
+ "WaitStatus": true,
+ "Win32FileAttributeData": true,
+ "Win32finddata": true,
+ "Write": true,
+ "WriteConsole": true,
+ "WriteFile": true,
+ "X509_ASN_ENCODING": true,
+ "XCASE": true,
+ "XP1_CONNECTIONLESS": true,
+ "XP1_CONNECT_DATA": true,
+ "XP1_DISCONNECT_DATA": true,
+ "XP1_EXPEDITED_DATA": true,
+ "XP1_GRACEFUL_CLOSE": true,
+ "XP1_GUARANTEED_DELIVERY": true,
+ "XP1_GUARANTEED_ORDER": true,
+ "XP1_IFS_HANDLES": true,
+ "XP1_MESSAGE_ORIENTED": true,
+ "XP1_MULTIPOINT_CONTROL_PLANE": true,
+ "XP1_MULTIPOINT_DATA_PLANE": true,
+ "XP1_PARTIAL_MESSAGE": true,
+ "XP1_PSEUDO_STREAM": true,
+ "XP1_QOS_SUPPORTED": true,
+ "XP1_SAN_SUPPORT_SDP": true,
+ "XP1_SUPPORT_BROADCAST": true,
+ "XP1_SUPPORT_MULTIPOINT": true,
+ "XP1_UNI_RECV": true,
+ "XP1_UNI_SEND": true,
+ },
+ "testing": map[string]bool{
+ "AllocsPerRun": true,
+ "B": true,
+ "Benchmark": true,
+ "BenchmarkResult": true,
+ "Cover": true,
+ "CoverBlock": true,
+ "CoverMode": true,
+ "Coverage": true,
+ "InternalBenchmark": true,
+ "InternalExample": true,
+ "InternalTest": true,
+ "M": true,
+ "Main": true,
+ "MainStart": true,
+ "PB": true,
+ "RegisterCover": true,
+ "RunBenchmarks": true,
+ "RunExamples": true,
+ "RunTests": true,
+ "Short": true,
+ "T": true,
+ "Verbose": true,
+ },
+ "testing/iotest": map[string]bool{
+ "DataErrReader": true,
+ "ErrTimeout": true,
+ "HalfReader": true,
+ "NewReadLogger": true,
+ "NewWriteLogger": true,
+ "OneByteReader": true,
+ "TimeoutReader": true,
+ "TruncateWriter": true,
+ },
+ "testing/quick": map[string]bool{
+ "Check": true,
+ "CheckEqual": true,
+ "CheckEqualError": true,
+ "CheckError": true,
+ "Config": true,
+ "Generator": true,
+ "SetupError": true,
+ "Value": true,
+ },
+ "text/scanner": map[string]bool{
+ "Char": true,
+ "Comment": true,
+ "EOF": true,
+ "Float": true,
+ "GoTokens": true,
+ "GoWhitespace": true,
+ "Ident": true,
+ "Int": true,
+ "Position": true,
+ "RawString": true,
+ "ScanChars": true,
+ "ScanComments": true,
+ "ScanFloats": true,
+ "ScanIdents": true,
+ "ScanInts": true,
+ "ScanRawStrings": true,
+ "ScanStrings": true,
+ "Scanner": true,
+ "SkipComments": true,
+ "String": true,
+ "TokenString": true,
+ },
+ "text/tabwriter": map[string]bool{
+ "AlignRight": true,
+ "Debug": true,
+ "DiscardEmptyColumns": true,
+ "Escape": true,
+ "FilterHTML": true,
+ "NewWriter": true,
+ "StripEscape": true,
+ "TabIndent": true,
+ "Writer": true,
+ },
+ "text/template": map[string]bool{
+ "ExecError": true,
+ "FuncMap": true,
+ "HTMLEscape": true,
+ "HTMLEscapeString": true,
+ "HTMLEscaper": true,
+ "IsTrue": true,
+ "JSEscape": true,
+ "JSEscapeString": true,
+ "JSEscaper": true,
+ "Must": true,
+ "New": true,
+ "ParseFiles": true,
+ "ParseGlob": true,
+ "Template": true,
+ "URLQueryEscaper": true,
+ },
+ "text/template/parse": map[string]bool{
+ "ActionNode": true,
+ "BoolNode": true,
+ "BranchNode": true,
+ "ChainNode": true,
+ "CommandNode": true,
+ "DotNode": true,
+ "FieldNode": true,
+ "IdentifierNode": true,
+ "IfNode": true,
+ "IsEmptyTree": true,
+ "ListNode": true,
+ "New": true,
+ "NewIdentifier": true,
+ "NilNode": true,
+ "Node": true,
+ "NodeAction": true,
+ "NodeBool": true,
+ "NodeChain": true,
+ "NodeCommand": true,
+ "NodeDot": true,
+ "NodeField": true,
+ "NodeIdentifier": true,
+ "NodeIf": true,
+ "NodeList": true,
+ "NodeNil": true,
+ "NodeNumber": true,
+ "NodePipe": true,
+ "NodeRange": true,
+ "NodeString": true,
+ "NodeTemplate": true,
+ "NodeText": true,
+ "NodeType": true,
+ "NodeVariable": true,
+ "NodeWith": true,
+ "NumberNode": true,
+ "Parse": true,
+ "PipeNode": true,
+ "Pos": true,
+ "RangeNode": true,
+ "StringNode": true,
+ "TemplateNode": true,
+ "TextNode": true,
+ "Tree": true,
+ "VariableNode": true,
+ "WithNode": true,
+ },
+ "time": map[string]bool{
+ "ANSIC": true,
+ "After": true,
+ "AfterFunc": true,
+ "April": true,
+ "August": true,
+ "Date": true,
+ "December": true,
+ "Duration": true,
+ "February": true,
+ "FixedZone": true,
+ "Friday": true,
+ "Hour": true,
+ "January": true,
+ "July": true,
+ "June": true,
+ "Kitchen": true,
+ "LoadLocation": true,
+ "LoadLocationFromTZData": true,
+ "Local": true,
+ "Location": true,
+ "March": true,
+ "May": true,
+ "Microsecond": true,
+ "Millisecond": true,
+ "Minute": true,
+ "Monday": true,
+ "Month": true,
+ "Nanosecond": true,
+ "NewTicker": true,
+ "NewTimer": true,
+ "November": true,
+ "Now": true,
+ "October": true,
+ "Parse": true,
+ "ParseDuration": true,
+ "ParseError": true,
+ "ParseInLocation": true,
+ "RFC1123": true,
+ "RFC1123Z": true,
+ "RFC3339": true,
+ "RFC3339Nano": true,
+ "RFC822": true,
+ "RFC822Z": true,
+ "RFC850": true,
+ "RubyDate": true,
+ "Saturday": true,
+ "Second": true,
+ "September": true,
+ "Since": true,
+ "Sleep": true,
+ "Stamp": true,
+ "StampMicro": true,
+ "StampMilli": true,
+ "StampNano": true,
+ "Sunday": true,
+ "Thursday": true,
+ "Tick": true,
+ "Ticker": true,
+ "Time": true,
+ "Timer": true,
+ "Tuesday": true,
+ "UTC": true,
+ "Unix": true,
+ "UnixDate": true,
+ "Until": true,
+ "Wednesday": true,
+ "Weekday": true,
+ },
+ "unicode": map[string]bool{
+ "ASCII_Hex_Digit": true,
+ "Adlam": true,
+ "Ahom": true,
+ "Anatolian_Hieroglyphs": true,
+ "Arabic": true,
+ "Armenian": true,
+ "Avestan": true,
+ "AzeriCase": true,
+ "Balinese": true,
+ "Bamum": true,
+ "Bassa_Vah": true,
+ "Batak": true,
+ "Bengali": true,
+ "Bhaiksuki": true,
+ "Bidi_Control": true,
+ "Bopomofo": true,
+ "Brahmi": true,
+ "Braille": true,
+ "Buginese": true,
+ "Buhid": true,
+ "C": true,
+ "Canadian_Aboriginal": true,
+ "Carian": true,
+ "CaseRange": true,
+ "CaseRanges": true,
+ "Categories": true,
+ "Caucasian_Albanian": true,
+ "Cc": true,
+ "Cf": true,
+ "Chakma": true,
+ "Cham": true,
+ "Cherokee": true,
+ "Co": true,
+ "Common": true,
+ "Coptic": true,
+ "Cs": true,
+ "Cuneiform": true,
+ "Cypriot": true,
+ "Cyrillic": true,
+ "Dash": true,
+ "Deprecated": true,
+ "Deseret": true,
+ "Devanagari": true,
+ "Diacritic": true,
+ "Digit": true,
+ "Duployan": true,
+ "Egyptian_Hieroglyphs": true,
+ "Elbasan": true,
+ "Ethiopic": true,
+ "Extender": true,
+ "FoldCategory": true,
+ "FoldScript": true,
+ "Georgian": true,
+ "Glagolitic": true,
+ "Gothic": true,
+ "Grantha": true,
+ "GraphicRanges": true,
+ "Greek": true,
+ "Gujarati": true,
+ "Gurmukhi": true,
+ "Han": true,
+ "Hangul": true,
+ "Hanunoo": true,
+ "Hatran": true,
+ "Hebrew": true,
+ "Hex_Digit": true,
+ "Hiragana": true,
+ "Hyphen": true,
+ "IDS_Binary_Operator": true,
+ "IDS_Trinary_Operator": true,
+ "Ideographic": true,
+ "Imperial_Aramaic": true,
+ "In": true,
+ "Inherited": true,
+ "Inscriptional_Pahlavi": true,
+ "Inscriptional_Parthian": true,
+ "Is": true,
+ "IsControl": true,
+ "IsDigit": true,
+ "IsGraphic": true,
+ "IsLetter": true,
+ "IsLower": true,
+ "IsMark": true,
+ "IsNumber": true,
+ "IsOneOf": true,
+ "IsPrint": true,
+ "IsPunct": true,
+ "IsSpace": true,
+ "IsSymbol": true,
+ "IsTitle": true,
+ "IsUpper": true,
+ "Javanese": true,
+ "Join_Control": true,
+ "Kaithi": true,
+ "Kannada": true,
+ "Katakana": true,
+ "Kayah_Li": true,
+ "Kharoshthi": true,
+ "Khmer": true,
+ "Khojki": true,
+ "Khudawadi": true,
+ "L": true,
+ "Lao": true,
+ "Latin": true,
+ "Lepcha": true,
+ "Letter": true,
+ "Limbu": true,
+ "Linear_A": true,
+ "Linear_B": true,
+ "Lisu": true,
+ "Ll": true,
+ "Lm": true,
+ "Lo": true,
+ "Logical_Order_Exception": true,
+ "Lower": true,
+ "LowerCase": true,
+ "Lt": true,
+ "Lu": true,
+ "Lycian": true,
+ "Lydian": true,
+ "M": true,
+ "Mahajani": true,
+ "Malayalam": true,
+ "Mandaic": true,
+ "Manichaean": true,
+ "Marchen": true,
+ "Mark": true,
+ "Masaram_Gondi": true,
+ "MaxASCII": true,
+ "MaxCase": true,
+ "MaxLatin1": true,
+ "MaxRune": true,
+ "Mc": true,
+ "Me": true,
+ "Meetei_Mayek": true,
+ "Mende_Kikakui": true,
+ "Meroitic_Cursive": true,
+ "Meroitic_Hieroglyphs": true,
+ "Miao": true,
+ "Mn": true,
+ "Modi": true,
+ "Mongolian": true,
+ "Mro": true,
+ "Multani": true,
+ "Myanmar": true,
+ "N": true,
+ "Nabataean": true,
+ "Nd": true,
+ "New_Tai_Lue": true,
+ "Newa": true,
+ "Nko": true,
+ "Nl": true,
+ "No": true,
+ "Noncharacter_Code_Point": true,
+ "Number": true,
+ "Nushu": true,
+ "Ogham": true,
+ "Ol_Chiki": true,
+ "Old_Hungarian": true,
+ "Old_Italic": true,
+ "Old_North_Arabian": true,
+ "Old_Permic": true,
+ "Old_Persian": true,
+ "Old_South_Arabian": true,
+ "Old_Turkic": true,
+ "Oriya": true,
+ "Osage": true,
+ "Osmanya": true,
+ "Other": true,
+ "Other_Alphabetic": true,
+ "Other_Default_Ignorable_Code_Point": true,
+ "Other_Grapheme_Extend": true,
+ "Other_ID_Continue": true,
+ "Other_ID_Start": true,
+ "Other_Lowercase": true,
+ "Other_Math": true,
+ "Other_Uppercase": true,
+ "P": true,
+ "Pahawh_Hmong": true,
+ "Palmyrene": true,
+ "Pattern_Syntax": true,
+ "Pattern_White_Space": true,
+ "Pau_Cin_Hau": true,
+ "Pc": true,
+ "Pd": true,
+ "Pe": true,
+ "Pf": true,
+ "Phags_Pa": true,
+ "Phoenician": true,
+ "Pi": true,
+ "Po": true,
+ "Prepended_Concatenation_Mark": true,
+ "PrintRanges": true,
+ "Properties": true,
+ "Ps": true,
+ "Psalter_Pahlavi": true,
+ "Punct": true,
+ "Quotation_Mark": true,
+ "Radical": true,
+ "Range16": true,
+ "Range32": true,
+ "RangeTable": true,
+ "Regional_Indicator": true,
+ "Rejang": true,
+ "ReplacementChar": true,
+ "Runic": true,
+ "S": true,
+ "STerm": true,
+ "Samaritan": true,
+ "Saurashtra": true,
+ "Sc": true,
+ "Scripts": true,
+ "Sentence_Terminal": true,
+ "Sharada": true,
+ "Shavian": true,
+ "Siddham": true,
+ "SignWriting": true,
+ "SimpleFold": true,
+ "Sinhala": true,
+ "Sk": true,
+ "Sm": true,
+ "So": true,
+ "Soft_Dotted": true,
+ "Sora_Sompeng": true,
+ "Soyombo": true,
+ "Space": true,
+ "SpecialCase": true,
+ "Sundanese": true,
+ "Syloti_Nagri": true,
+ "Symbol": true,
+ "Syriac": true,
+ "Tagalog": true,
+ "Tagbanwa": true,
+ "Tai_Le": true,
+ "Tai_Tham": true,
+ "Tai_Viet": true,
+ "Takri": true,
+ "Tamil": true,
+ "Tangut": true,
+ "Telugu": true,
+ "Terminal_Punctuation": true,
+ "Thaana": true,
+ "Thai": true,
+ "Tibetan": true,
+ "Tifinagh": true,
+ "Tirhuta": true,
+ "Title": true,
+ "TitleCase": true,
+ "To": true,
+ "ToLower": true,
+ "ToTitle": true,
+ "ToUpper": true,
+ "TurkishCase": true,
+ "Ugaritic": true,
+ "Unified_Ideograph": true,
+ "Upper": true,
+ "UpperCase": true,
+ "UpperLower": true,
+ "Vai": true,
+ "Variation_Selector": true,
+ "Version": true,
+ "Warang_Citi": true,
+ "White_Space": true,
+ "Yi": true,
+ "Z": true,
+ "Zanabazar_Square": true,
+ "Zl": true,
+ "Zp": true,
+ "Zs": true,
+ },
+ "unicode/utf16": map[string]bool{
+ "Decode": true,
+ "DecodeRune": true,
+ "Encode": true,
+ "EncodeRune": true,
+ "IsSurrogate": true,
+ },
+ "unicode/utf8": map[string]bool{
+ "DecodeLastRune": true,
+ "DecodeLastRuneInString": true,
+ "DecodeRune": true,
+ "DecodeRuneInString": true,
+ "EncodeRune": true,
+ "FullRune": true,
+ "FullRuneInString": true,
+ "MaxRune": true,
+ "RuneCount": true,
+ "RuneCountInString": true,
+ "RuneError": true,
+ "RuneLen": true,
+ "RuneSelf": true,
+ "RuneStart": true,
+ "UTFMax": true,
+ "Valid": true,
+ "ValidRune": true,
+ "ValidString": true,
+ },
+ "unsafe": map[string]bool{
+ "Alignof": true,
+ "ArbitraryType": true,
+ "Offsetof": true,
+ "Pointer": true,
+ "Sizeof": true,
+ },
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go
new file mode 100644
index 00000000000..7219c8e9ff1
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk.go
@@ -0,0 +1,196 @@
+// Copyright 2016 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 fastwalk provides a faster version of filepath.Walk for file system
+// scanning tools.
+package fastwalk
+
+import (
+ "errors"
+ "os"
+ "path/filepath"
+ "runtime"
+ "sync"
+)
+
+// TraverseLink is used as a return value from WalkFuncs to indicate that the
+// symlink named in the call may be traversed.
+var TraverseLink = errors.New("fastwalk: traverse symlink, assuming target is a directory")
+
+// SkipFiles is a used as a return value from WalkFuncs to indicate that the
+// callback should not be called for any other files in the current directory.
+// Child directories will still be traversed.
+var SkipFiles = errors.New("fastwalk: skip remaining files in directory")
+
+// Walk is a faster implementation of filepath.Walk.
+//
+// filepath.Walk's design necessarily calls os.Lstat on each file,
+// even if the caller needs less info.
+// Many tools need only the type of each file.
+// On some platforms, this information is provided directly by the readdir
+// system call, avoiding the need to stat each file individually.
+// fastwalk_unix.go contains a fork of the syscall routines.
+//
+// See golang.org/issue/16399
+//
+// Walk walks the file tree rooted at root, calling walkFn for
+// each file or directory in the tree, including root.
+//
+// If fastWalk returns filepath.SkipDir, the directory is skipped.
+//
+// Unlike filepath.Walk:
+// * file stat calls must be done by the user.
+// The only provided metadata is the file type, which does not include
+// any permission bits.
+// * multiple goroutines stat the filesystem concurrently. The provided
+// walkFn must be safe for concurrent use.
+// * fastWalk can follow symlinks if walkFn returns the TraverseLink
+// sentinel error. It is the walkFn's responsibility to prevent
+// fastWalk from going into symlink cycles.
+func Walk(root string, walkFn func(path string, typ os.FileMode) error) error {
+ // TODO(bradfitz): make numWorkers configurable? We used a
+ // minimum of 4 to give the kernel more info about multiple
+ // things we want, in hopes its I/O scheduling can take
+ // advantage of that. Hopefully most are in cache. Maybe 4 is
+ // even too low of a minimum. Profile more.
+ numWorkers := 4
+ if n := runtime.NumCPU(); n > numWorkers {
+ numWorkers = n
+ }
+
+ // Make sure to wait for all workers to finish, otherwise
+ // walkFn could still be called after returning. This Wait call
+ // runs after close(e.donec) below.
+ var wg sync.WaitGroup
+ defer wg.Wait()
+
+ w := &walker{
+ fn: walkFn,
+ enqueuec: make(chan walkItem, numWorkers), // buffered for performance
+ workc: make(chan walkItem, numWorkers), // buffered for performance
+ donec: make(chan struct{}),
+
+ // buffered for correctness & not leaking goroutines:
+ resc: make(chan error, numWorkers),
+ }
+ defer close(w.donec)
+
+ for i := 0; i < numWorkers; i++ {
+ wg.Add(1)
+ go w.doWork(&wg)
+ }
+ todo := []walkItem{{dir: root}}
+ out := 0
+ for {
+ workc := w.workc
+ var workItem walkItem
+ if len(todo) == 0 {
+ workc = nil
+ } else {
+ workItem = todo[len(todo)-1]
+ }
+ select {
+ case workc <- workItem:
+ todo = todo[:len(todo)-1]
+ out++
+ case it := <-w.enqueuec:
+ todo = append(todo, it)
+ case err := <-w.resc:
+ out--
+ if err != nil {
+ return err
+ }
+ if out == 0 && len(todo) == 0 {
+ // It's safe to quit here, as long as the buffered
+ // enqueue channel isn't also readable, which might
+ // happen if the worker sends both another unit of
+ // work and its result before the other select was
+ // scheduled and both w.resc and w.enqueuec were
+ // readable.
+ select {
+ case it := <-w.enqueuec:
+ todo = append(todo, it)
+ default:
+ return nil
+ }
+ }
+ }
+ }
+}
+
+// doWork reads directories as instructed (via workc) and runs the
+// user's callback function.
+func (w *walker) doWork(wg *sync.WaitGroup) {
+ defer wg.Done()
+ for {
+ select {
+ case <-w.donec:
+ return
+ case it := <-w.workc:
+ select {
+ case <-w.donec:
+ return
+ case w.resc <- w.walk(it.dir, !it.callbackDone):
+ }
+ }
+ }
+}
+
+type walker struct {
+ fn func(path string, typ os.FileMode) error
+
+ donec chan struct{} // closed on fastWalk's return
+ workc chan walkItem // to workers
+ enqueuec chan walkItem // from workers
+ resc chan error // from workers
+}
+
+type walkItem struct {
+ dir string
+ callbackDone bool // callback already called; don't do it again
+}
+
+func (w *walker) enqueue(it walkItem) {
+ select {
+ case w.enqueuec <- it:
+ case <-w.donec:
+ }
+}
+
+func (w *walker) onDirEnt(dirName, baseName string, typ os.FileMode) error {
+ joined := dirName + string(os.PathSeparator) + baseName
+ if typ == os.ModeDir {
+ w.enqueue(walkItem{dir: joined})
+ return nil
+ }
+
+ err := w.fn(joined, typ)
+ if typ == os.ModeSymlink {
+ if err == TraverseLink {
+ // Set callbackDone so we don't call it twice for both the
+ // symlink-as-symlink and the symlink-as-directory later:
+ w.enqueue(walkItem{dir: joined, callbackDone: true})
+ return nil
+ }
+ if err == filepath.SkipDir {
+ // Permit SkipDir on symlinks too.
+ return nil
+ }
+ }
+ return err
+}
+
+func (w *walker) walk(root string, runUserCallback bool) error {
+ if runUserCallback {
+ err := w.fn(root, os.ModeDir)
+ if err == filepath.SkipDir {
+ return nil
+ }
+ if err != nil {
+ return err
+ }
+ }
+
+ return readDir(root, w.onDirEnt)
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go
new file mode 100644
index 00000000000..ccffec5adc1
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_fileno.go
@@ -0,0 +1,13 @@
+// Copyright 2016 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 freebsd openbsd netbsd
+
+package fastwalk
+
+import "syscall"
+
+func direntInode(dirent *syscall.Dirent) uint64 {
+ return uint64(dirent.Fileno)
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go
new file mode 100644
index 00000000000..ab7fbc0a9a3
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_ino.go
@@ -0,0 +1,14 @@
+// Copyright 2016 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 linux darwin
+// +build !appengine
+
+package fastwalk
+
+import "syscall"
+
+func direntInode(dirent *syscall.Dirent) uint64 {
+ return uint64(dirent.Ino)
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go
new file mode 100644
index 00000000000..a3b26a7bae0
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_bsd.go
@@ -0,0 +1,13 @@
+// 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.
+
+// +build darwin freebsd openbsd netbsd
+
+package fastwalk
+
+import "syscall"
+
+func direntNamlen(dirent *syscall.Dirent) uint64 {
+ return uint64(dirent.Namlen)
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go
new file mode 100644
index 00000000000..e880d358b13
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_dirent_namlen_linux.go
@@ -0,0 +1,29 @@
+// 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.
+
+// +build linux
+// +build !appengine
+
+package fastwalk
+
+import (
+ "bytes"
+ "syscall"
+ "unsafe"
+)
+
+func direntNamlen(dirent *syscall.Dirent) uint64 {
+ const fixedHdr = uint16(unsafe.Offsetof(syscall.Dirent{}.Name))
+ nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0]))
+ const nameBufLen = uint16(len(nameBuf))
+ limit := dirent.Reclen - fixedHdr
+ if limit > nameBufLen {
+ limit = nameBufLen
+ }
+ nameLen := bytes.IndexByte(nameBuf[:limit], 0)
+ if nameLen < 0 {
+ panic("failed to find terminating 0 byte in dirent")
+ }
+ return uint64(nameLen)
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go
new file mode 100644
index 00000000000..a906b87595b
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_portable.go
@@ -0,0 +1,37 @@
+// Copyright 2016 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 appengine !linux,!darwin,!freebsd,!openbsd,!netbsd
+
+package fastwalk
+
+import (
+ "io/ioutil"
+ "os"
+)
+
+// readDir calls fn for each directory entry in dirName.
+// It does not descend into directories or follow symlinks.
+// If fn returns a non-nil error, readDir returns with that error
+// immediately.
+func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error {
+ fis, err := ioutil.ReadDir(dirName)
+ if err != nil {
+ return err
+ }
+ skipFiles := false
+ for _, fi := range fis {
+ if fi.Mode().IsRegular() && skipFiles {
+ continue
+ }
+ if err := fn(dirName, fi.Name(), fi.Mode()&os.ModeType); err != nil {
+ if err == SkipFiles {
+ skipFiles = true
+ continue
+ }
+ return err
+ }
+ }
+ return nil
+}
diff --git a/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go
new file mode 100644
index 00000000000..3369b1a0b2d
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/fastwalk/fastwalk_unix.go
@@ -0,0 +1,127 @@
+// Copyright 2016 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 linux darwin freebsd openbsd netbsd
+// +build !appengine
+
+package fastwalk
+
+import (
+ "fmt"
+ "os"
+ "syscall"
+ "unsafe"
+)
+
+const blockSize = 8 << 10
+
+// unknownFileMode is a sentinel (and bogus) os.FileMode
+// value used to represent a syscall.DT_UNKNOWN Dirent.Type.
+const unknownFileMode os.FileMode = os.ModeNamedPipe | os.ModeSocket | os.ModeDevice
+
+func readDir(dirName string, fn func(dirName, entName string, typ os.FileMode) error) error {
+ fd, err := syscall.Open(dirName, 0, 0)
+ if err != nil {
+ return &os.PathError{Op: "open", Path: dirName, Err: err}
+ }
+ defer syscall.Close(fd)
+
+ // The buffer must be at least a block long.
+ buf := make([]byte, blockSize) // stack-allocated; doesn't escape
+ bufp := 0 // starting read position in buf
+ nbuf := 0 // end valid data in buf
+ skipFiles := false
+ for {
+ if bufp >= nbuf {
+ bufp = 0
+ nbuf, err = syscall.ReadDirent(fd, buf)
+ if err != nil {
+ return os.NewSyscallError("readdirent", err)
+ }
+ if nbuf <= 0 {
+ return nil
+ }
+ }
+ consumed, name, typ := parseDirEnt(buf[bufp:nbuf])
+ bufp += consumed
+ if name == "" || name == "." || name == ".." {
+ continue
+ }
+ // Fallback for filesystems (like old XFS) that don't
+ // support Dirent.Type and have DT_UNKNOWN (0) there
+ // instead.
+ if typ == unknownFileMode {
+ fi, err := os.Lstat(dirName + "/" + name)
+ if err != nil {
+ // It got deleted in the meantime.
+ if os.IsNotExist(err) {
+ continue
+ }
+ return err
+ }
+ typ = fi.Mode() & os.ModeType
+ }
+ if skipFiles && typ.IsRegular() {
+ continue
+ }
+ if err := fn(dirName, name, typ); err != nil {
+ if err == SkipFiles {
+ skipFiles = true
+ continue
+ }
+ return err
+ }
+ }
+}
+
+func parseDirEnt(buf []byte) (consumed int, name string, typ os.FileMode) {
+ // golang.org/issue/15653
+ dirent := (*syscall.Dirent)(unsafe.Pointer(&buf[0]))
+ if v := unsafe.Offsetof(dirent.Reclen) + unsafe.Sizeof(dirent.Reclen); uintptr(len(buf)) < v {
+ panic(fmt.Sprintf("buf size of %d smaller than dirent header size %d", len(buf), v))
+ }
+ if len(buf) < int(dirent.Reclen) {
+ panic(fmt.Sprintf("buf size %d < record length %d", len(buf), dirent.Reclen))
+ }
+ consumed = int(dirent.Reclen)
+ if direntInode(dirent) == 0 { // File absent in directory.
+ return
+ }
+ switch dirent.Type {
+ case syscall.DT_REG:
+ typ = 0
+ case syscall.DT_DIR:
+ typ = os.ModeDir
+ case syscall.DT_LNK:
+ typ = os.ModeSymlink
+ case syscall.DT_BLK:
+ typ = os.ModeDevice
+ case syscall.DT_FIFO:
+ typ = os.ModeNamedPipe
+ case syscall.DT_SOCK:
+ typ = os.ModeSocket
+ case syscall.DT_UNKNOWN:
+ typ = unknownFileMode
+ default:
+ // Skip weird things.
+ // It's probably a DT_WHT (http://lwn.net/Articles/325369/)
+ // or something. Revisit if/when this package is moved outside
+ // of goimports. goimports only cares about regular files,
+ // symlinks, and directories.
+ return
+ }
+
+ nameBuf := (*[unsafe.Sizeof(dirent.Name)]byte)(unsafe.Pointer(&dirent.Name[0]))
+ nameLen := direntNamlen(dirent)
+
+ // Special cases for common things:
+ if nameLen == 1 && nameBuf[0] == '.' {
+ name = "."
+ } else if nameLen == 2 && nameBuf[0] == '.' && nameBuf[1] == '.' {
+ name = ".."
+ } else {
+ name = string(nameBuf[:nameLen])
+ }
+ return
+}
diff --git a/vendor/golang.org/x/tools/internal/gopathwalk/walk.go b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go
new file mode 100644
index 00000000000..04bb96a3627
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/gopathwalk/walk.go
@@ -0,0 +1,250 @@
+// 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 gopathwalk is like filepath.Walk but specialized for finding Go
+// packages, particularly in $GOPATH and $GOROOT.
+package gopathwalk
+
+import (
+ "bufio"
+ "bytes"
+ "fmt"
+ "go/build"
+ "io/ioutil"
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "golang.org/x/tools/internal/fastwalk"
+)
+
+// Options controls the behavior of a Walk call.
+type Options struct {
+ Debug bool // Enable debug logging
+ ModulesEnabled bool // Search module caches. Also disables legacy goimports ignore rules.
+}
+
+// RootType indicates the type of a Root.
+type RootType int
+
+const (
+ RootUnknown RootType = iota
+ RootGOROOT
+ RootGOPATH
+ RootCurrentModule
+ RootModuleCache
+ RootOther
+)
+
+// A Root is a starting point for a Walk.
+type Root struct {
+ Path string
+ Type RootType
+}
+
+// SrcDirsRoots returns the roots from build.Default.SrcDirs(). Not modules-compatible.
+func SrcDirsRoots(ctx *build.Context) []Root {
+ var roots []Root
+ roots = append(roots, Root{filepath.Join(ctx.GOROOT, "src"), RootGOROOT})
+ for _, p := range filepath.SplitList(ctx.GOPATH) {
+ roots = append(roots, Root{filepath.Join(p, "src"), RootGOPATH})
+ }
+ return roots
+}
+
+// Walk walks Go source directories ($GOROOT, $GOPATH, etc) to find packages.
+// For each package found, add will be called (concurrently) with the absolute
+// paths of the containing source directory and the package directory.
+// add will be called concurrently.
+func Walk(roots []Root, add func(root Root, dir string), opts Options) {
+ for _, root := range roots {
+ walkDir(root, add, opts)
+ }
+}
+
+func walkDir(root Root, add func(Root, string), opts Options) {
+ if _, err := os.Stat(root.Path); os.IsNotExist(err) {
+ if opts.Debug {
+ log.Printf("skipping nonexistant directory: %v", root.Path)
+ }
+ return
+ }
+ if opts.Debug {
+ log.Printf("scanning %s", root.Path)
+ }
+ w := &walker{
+ root: root,
+ add: add,
+ opts: opts,
+ }
+ w.init()
+ if err := fastwalk.Walk(root.Path, w.walk); err != nil {
+ log.Printf("gopathwalk: scanning directory %v: %v", root.Path, err)
+ }
+
+ if opts.Debug {
+ log.Printf("scanned %s", root.Path)
+ }
+}
+
+// walker is the callback for fastwalk.Walk.
+type walker struct {
+ root Root // The source directory to scan.
+ add func(Root, string) // The callback that will be invoked for every possible Go package dir.
+ opts Options // Options passed to Walk by the user.
+
+ ignoredDirs []os.FileInfo // The ignored directories, loaded from .goimportsignore files.
+}
+
+// init initializes the walker based on its Options.
+func (w *walker) init() {
+ var ignoredPaths []string
+ if w.root.Type == RootModuleCache {
+ ignoredPaths = []string{"cache"}
+ }
+ if !w.opts.ModulesEnabled && w.root.Type == RootGOPATH {
+ ignoredPaths = w.getIgnoredDirs(w.root.Path)
+ ignoredPaths = append(ignoredPaths, "v", "mod")
+ }
+
+ for _, p := range ignoredPaths {
+ full := filepath.Join(w.root.Path, p)
+ if fi, err := os.Stat(full); err == nil {
+ w.ignoredDirs = append(w.ignoredDirs, fi)
+ if w.opts.Debug {
+ log.Printf("Directory added to ignore list: %s", full)
+ }
+ } else if w.opts.Debug {
+ log.Printf("Error statting ignored directory: %v", err)
+ }
+ }
+}
+
+// getIgnoredDirs reads an optional config file at /.goimportsignore
+// of relative directories to ignore when scanning for go files.
+// The provided path is one of the $GOPATH entries with "src" appended.
+func (w *walker) getIgnoredDirs(path string) []string {
+ file := filepath.Join(path, ".goimportsignore")
+ slurp, err := ioutil.ReadFile(file)
+ if w.opts.Debug {
+ if err != nil {
+ log.Print(err)
+ } else {
+ log.Printf("Read %s", file)
+ }
+ }
+ if err != nil {
+ return nil
+ }
+
+ var ignoredDirs []string
+ bs := bufio.NewScanner(bytes.NewReader(slurp))
+ for bs.Scan() {
+ line := strings.TrimSpace(bs.Text())
+ if line == "" || strings.HasPrefix(line, "#") {
+ continue
+ }
+ ignoredDirs = append(ignoredDirs, line)
+ }
+ return ignoredDirs
+}
+
+func (w *walker) shouldSkipDir(fi os.FileInfo) bool {
+ for _, ignoredDir := range w.ignoredDirs {
+ if os.SameFile(fi, ignoredDir) {
+ return true
+ }
+ }
+ return false
+}
+
+func (w *walker) walk(path string, typ os.FileMode) error {
+ dir := filepath.Dir(path)
+ if typ.IsRegular() {
+ if dir == w.root.Path && (w.root.Type == RootGOROOT || w.root.Type == RootGOPATH) {
+ // Doesn't make sense to have regular files
+ // directly in your $GOPATH/src or $GOROOT/src.
+ return fastwalk.SkipFiles
+ }
+ if !strings.HasSuffix(path, ".go") {
+ return nil
+ }
+
+ w.add(w.root, dir)
+ return fastwalk.SkipFiles
+ }
+ if typ == os.ModeDir {
+ base := filepath.Base(path)
+ if base == "" || base[0] == '.' || base[0] == '_' ||
+ base == "testdata" ||
+ (w.root.Type == RootGOROOT && w.opts.ModulesEnabled && base == "vendor") ||
+ (!w.opts.ModulesEnabled && base == "node_modules") {
+ return filepath.SkipDir
+ }
+ fi, err := os.Lstat(path)
+ if err == nil && w.shouldSkipDir(fi) {
+ return filepath.SkipDir
+ }
+ return nil
+ }
+ if typ == os.ModeSymlink {
+ base := filepath.Base(path)
+ if strings.HasPrefix(base, ".#") {
+ // Emacs noise.
+ return nil
+ }
+ fi, err := os.Lstat(path)
+ if err != nil {
+ // Just ignore it.
+ return nil
+ }
+ if w.shouldTraverse(dir, fi) {
+ return fastwalk.TraverseLink
+ }
+ }
+ return nil
+}
+
+// shouldTraverse reports whether the symlink fi, found in dir,
+// should be followed. It makes sure symlinks were never visited
+// before to avoid symlink loops.
+func (w *walker) shouldTraverse(dir string, fi os.FileInfo) bool {
+ path := filepath.Join(dir, fi.Name())
+ target, err := filepath.EvalSymlinks(path)
+ if err != nil {
+ return false
+ }
+ ts, err := os.Stat(target)
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err)
+ return false
+ }
+ if !ts.IsDir() {
+ return false
+ }
+ if w.shouldSkipDir(ts) {
+ return false
+ }
+ // Check for symlink loops by statting each directory component
+ // and seeing if any are the same file as ts.
+ for {
+ parent := filepath.Dir(path)
+ if parent == path {
+ // Made it to the root without seeing a cycle.
+ // Use this symlink.
+ return true
+ }
+ parentInfo, err := os.Stat(parent)
+ if err != nil {
+ return false
+ }
+ if os.SameFile(ts, parentInfo) {
+ // Cycle. Don't traverse.
+ return false
+ }
+ path = parent
+ }
+
+}
diff --git a/vendor/golang.org/x/tools/internal/module/module.go b/vendor/golang.org/x/tools/internal/module/module.go
new file mode 100644
index 00000000000..9a4edb9dec1
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/module/module.go
@@ -0,0 +1,540 @@
+// 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 module defines the module.Version type
+// along with support code.
+package module
+
+// IMPORTANT NOTE
+//
+// This file essentially defines the set of valid import paths for the go command.
+// There are many subtle considerations, including Unicode ambiguity,
+// security, network, and file system representations.
+//
+// This file also defines the set of valid module path and version combinations,
+// another topic with many subtle considerations.
+//
+// Changes to the semantics in this file require approval from rsc.
+
+import (
+ "fmt"
+ "sort"
+ "strings"
+ "unicode"
+ "unicode/utf8"
+
+ "golang.org/x/tools/internal/semver"
+)
+
+// A Version is defined by a module path and version pair.
+type Version struct {
+ Path string
+
+ // Version is usually a semantic version in canonical form.
+ // There are two exceptions to this general rule.
+ // First, the top-level target of a build has no specific version
+ // and uses Version = "".
+ // Second, during MVS calculations the version "none" is used
+ // to represent the decision to take no version of a given module.
+ Version string `json:",omitempty"`
+}
+
+// Check checks that a given module path, version pair is valid.
+// In addition to the path being a valid module path
+// and the version being a valid semantic version,
+// the two must correspond.
+// For example, the path "yaml/v2" only corresponds to
+// semantic versions beginning with "v2.".
+func Check(path, version string) error {
+ if err := CheckPath(path); err != nil {
+ return err
+ }
+ if !semver.IsValid(version) {
+ return fmt.Errorf("malformed semantic version %v", version)
+ }
+ _, pathMajor, _ := SplitPathVersion(path)
+ if !MatchPathMajor(version, pathMajor) {
+ if pathMajor == "" {
+ pathMajor = "v0 or v1"
+ }
+ if pathMajor[0] == '.' { // .v1
+ pathMajor = pathMajor[1:]
+ }
+ return fmt.Errorf("mismatched module path %v and version %v (want %v)", path, version, pathMajor)
+ }
+ return nil
+}
+
+// firstPathOK reports whether r can appear in the first element of a module path.
+// The first element of the path must be an LDH domain name, at least for now.
+// To avoid case ambiguity, the domain name must be entirely lower case.
+func firstPathOK(r rune) bool {
+ return r == '-' || r == '.' ||
+ '0' <= r && r <= '9' ||
+ 'a' <= r && r <= 'z'
+}
+
+// pathOK reports whether r can appear in an import path element.
+// Paths can be ASCII letters, ASCII digits, and limited ASCII punctuation: + - . _ and ~.
+// This matches what "go get" has historically recognized in import paths.
+// TODO(rsc): We would like to allow Unicode letters, but that requires additional
+// care in the safe encoding (see note below).
+func pathOK(r rune) bool {
+ if r < utf8.RuneSelf {
+ return r == '+' || r == '-' || r == '.' || r == '_' || r == '~' ||
+ '0' <= r && r <= '9' ||
+ 'A' <= r && r <= 'Z' ||
+ 'a' <= r && r <= 'z'
+ }
+ return false
+}
+
+// fileNameOK reports whether r can appear in a file name.
+// For now we allow all Unicode letters but otherwise limit to pathOK plus a few more punctuation characters.
+// If we expand the set of allowed characters here, we have to
+// work harder at detecting potential case-folding and normalization collisions.
+// See note about "safe encoding" below.
+func fileNameOK(r rune) bool {
+ if r < utf8.RuneSelf {
+ // Entire set of ASCII punctuation, from which we remove characters:
+ // ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~
+ // We disallow some shell special characters: " ' * < > ? ` |
+ // (Note that some of those are disallowed by the Windows file system as well.)
+ // We also disallow path separators / : and \ (fileNameOK is only called on path element characters).
+ // We allow spaces (U+0020) in file names.
+ const allowed = "!#$%&()+,-.=@[]^_{}~ "
+ if '0' <= r && r <= '9' || 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' {
+ return true
+ }
+ for i := 0; i < len(allowed); i++ {
+ if rune(allowed[i]) == r {
+ return true
+ }
+ }
+ return false
+ }
+ // It may be OK to add more ASCII punctuation here, but only carefully.
+ // For example Windows disallows < > \, and macOS disallows :, so we must not allow those.
+ return unicode.IsLetter(r)
+}
+
+// CheckPath checks that a module path is valid.
+func CheckPath(path string) error {
+ if err := checkPath(path, false); err != nil {
+ return fmt.Errorf("malformed module path %q: %v", path, err)
+ }
+ i := strings.Index(path, "/")
+ if i < 0 {
+ i = len(path)
+ }
+ if i == 0 {
+ return fmt.Errorf("malformed module path %q: leading slash", path)
+ }
+ if !strings.Contains(path[:i], ".") {
+ return fmt.Errorf("malformed module path %q: missing dot in first path element", path)
+ }
+ if path[0] == '-' {
+ return fmt.Errorf("malformed module path %q: leading dash in first path element", path)
+ }
+ for _, r := range path[:i] {
+ if !firstPathOK(r) {
+ return fmt.Errorf("malformed module path %q: invalid char %q in first path element", path, r)
+ }
+ }
+ if _, _, ok := SplitPathVersion(path); !ok {
+ return fmt.Errorf("malformed module path %q: invalid version", path)
+ }
+ return nil
+}
+
+// CheckImportPath checks that an import path is valid.
+func CheckImportPath(path string) error {
+ if err := checkPath(path, false); err != nil {
+ return fmt.Errorf("malformed import path %q: %v", path, err)
+ }
+ return nil
+}
+
+// checkPath checks that a general path is valid.
+// It returns an error describing why but not mentioning path.
+// Because these checks apply to both module paths and import paths,
+// the caller is expected to add the "malformed ___ path %q: " prefix.
+// fileName indicates whether the final element of the path is a file name
+// (as opposed to a directory name).
+func checkPath(path string, fileName bool) error {
+ if !utf8.ValidString(path) {
+ return fmt.Errorf("invalid UTF-8")
+ }
+ if path == "" {
+ return fmt.Errorf("empty string")
+ }
+ if strings.Contains(path, "..") {
+ return fmt.Errorf("double dot")
+ }
+ if strings.Contains(path, "//") {
+ return fmt.Errorf("double slash")
+ }
+ if path[len(path)-1] == '/' {
+ return fmt.Errorf("trailing slash")
+ }
+ elemStart := 0
+ for i, r := range path {
+ if r == '/' {
+ if err := checkElem(path[elemStart:i], fileName); err != nil {
+ return err
+ }
+ elemStart = i + 1
+ }
+ }
+ if err := checkElem(path[elemStart:], fileName); err != nil {
+ return err
+ }
+ return nil
+}
+
+// checkElem checks whether an individual path element is valid.
+// fileName indicates whether the element is a file name (not a directory name).
+func checkElem(elem string, fileName bool) error {
+ if elem == "" {
+ return fmt.Errorf("empty path element")
+ }
+ if strings.Count(elem, ".") == len(elem) {
+ return fmt.Errorf("invalid path element %q", elem)
+ }
+ if elem[0] == '.' && !fileName {
+ return fmt.Errorf("leading dot in path element")
+ }
+ if elem[len(elem)-1] == '.' {
+ return fmt.Errorf("trailing dot in path element")
+ }
+ charOK := pathOK
+ if fileName {
+ charOK = fileNameOK
+ }
+ for _, r := range elem {
+ if !charOK(r) {
+ return fmt.Errorf("invalid char %q", r)
+ }
+ }
+
+ // Windows disallows a bunch of path elements, sadly.
+ // See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file
+ short := elem
+ if i := strings.Index(short, "."); i >= 0 {
+ short = short[:i]
+ }
+ for _, bad := range badWindowsNames {
+ if strings.EqualFold(bad, short) {
+ return fmt.Errorf("disallowed path element %q", elem)
+ }
+ }
+ return nil
+}
+
+// CheckFilePath checks whether a slash-separated file path is valid.
+func CheckFilePath(path string) error {
+ if err := checkPath(path, true); err != nil {
+ return fmt.Errorf("malformed file path %q: %v", path, err)
+ }
+ return nil
+}
+
+// badWindowsNames are the reserved file path elements on Windows.
+// See https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file
+var badWindowsNames = []string{
+ "CON",
+ "PRN",
+ "AUX",
+ "NUL",
+ "COM1",
+ "COM2",
+ "COM3",
+ "COM4",
+ "COM5",
+ "COM6",
+ "COM7",
+ "COM8",
+ "COM9",
+ "LPT1",
+ "LPT2",
+ "LPT3",
+ "LPT4",
+ "LPT5",
+ "LPT6",
+ "LPT7",
+ "LPT8",
+ "LPT9",
+}
+
+// SplitPathVersion returns prefix and major version such that prefix+pathMajor == path
+// and version is either empty or "/vN" for N >= 2.
+// As a special case, gopkg.in paths are recognized directly;
+// they require ".vN" instead of "/vN", and for all N, not just N >= 2.
+func SplitPathVersion(path string) (prefix, pathMajor string, ok bool) {
+ if strings.HasPrefix(path, "gopkg.in/") {
+ return splitGopkgIn(path)
+ }
+
+ i := len(path)
+ dot := false
+ for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9' || path[i-1] == '.') {
+ if path[i-1] == '.' {
+ dot = true
+ }
+ i--
+ }
+ if i <= 1 || i == len(path) || path[i-1] != 'v' || path[i-2] != '/' {
+ return path, "", true
+ }
+ prefix, pathMajor = path[:i-2], path[i-2:]
+ if dot || len(pathMajor) <= 2 || pathMajor[2] == '0' || pathMajor == "/v1" {
+ return path, "", false
+ }
+ return prefix, pathMajor, true
+}
+
+// splitGopkgIn is like SplitPathVersion but only for gopkg.in paths.
+func splitGopkgIn(path string) (prefix, pathMajor string, ok bool) {
+ if !strings.HasPrefix(path, "gopkg.in/") {
+ return path, "", false
+ }
+ i := len(path)
+ if strings.HasSuffix(path, "-unstable") {
+ i -= len("-unstable")
+ }
+ for i > 0 && ('0' <= path[i-1] && path[i-1] <= '9') {
+ i--
+ }
+ if i <= 1 || path[i-1] != 'v' || path[i-2] != '.' {
+ // All gopkg.in paths must end in vN for some N.
+ return path, "", false
+ }
+ prefix, pathMajor = path[:i-2], path[i-2:]
+ if len(pathMajor) <= 2 || pathMajor[2] == '0' && pathMajor != ".v0" {
+ return path, "", false
+ }
+ return prefix, pathMajor, true
+}
+
+// MatchPathMajor reports whether the semantic version v
+// matches the path major version pathMajor.
+func MatchPathMajor(v, pathMajor string) bool {
+ if strings.HasPrefix(pathMajor, ".v") && strings.HasSuffix(pathMajor, "-unstable") {
+ pathMajor = strings.TrimSuffix(pathMajor, "-unstable")
+ }
+ if strings.HasPrefix(v, "v0.0.0-") && pathMajor == ".v1" {
+ // Allow old bug in pseudo-versions that generated v0.0.0- pseudoversion for gopkg .v1.
+ // For example, gopkg.in/yaml.v2@v2.2.1's go.mod requires gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405.
+ return true
+ }
+ m := semver.Major(v)
+ if pathMajor == "" {
+ return m == "v0" || m == "v1" || semver.Build(v) == "+incompatible"
+ }
+ return (pathMajor[0] == '/' || pathMajor[0] == '.') && m == pathMajor[1:]
+}
+
+// CanonicalVersion returns the canonical form of the version string v.
+// It is the same as semver.Canonical(v) except that it preserves the special build suffix "+incompatible".
+func CanonicalVersion(v string) string {
+ cv := semver.Canonical(v)
+ if semver.Build(v) == "+incompatible" {
+ cv += "+incompatible"
+ }
+ return cv
+}
+
+// Sort sorts the list by Path, breaking ties by comparing Versions.
+func Sort(list []Version) {
+ sort.Slice(list, func(i, j int) bool {
+ mi := list[i]
+ mj := list[j]
+ if mi.Path != mj.Path {
+ return mi.Path < mj.Path
+ }
+ // To help go.sum formatting, allow version/file.
+ // Compare semver prefix by semver rules,
+ // file by string order.
+ vi := mi.Version
+ vj := mj.Version
+ var fi, fj string
+ if k := strings.Index(vi, "/"); k >= 0 {
+ vi, fi = vi[:k], vi[k:]
+ }
+ if k := strings.Index(vj, "/"); k >= 0 {
+ vj, fj = vj[:k], vj[k:]
+ }
+ if vi != vj {
+ return semver.Compare(vi, vj) < 0
+ }
+ return fi < fj
+ })
+}
+
+// Safe encodings
+//
+// Module paths appear as substrings of file system paths
+// (in the download cache) and of web server URLs in the proxy protocol.
+// In general we cannot rely on file systems to be case-sensitive,
+// nor can we rely on web servers, since they read from file systems.
+// That is, we cannot rely on the file system to keep rsc.io/QUOTE
+// and rsc.io/quote separate. Windows and macOS don't.
+// Instead, we must never require two different casings of a file path.
+// Because we want the download cache to match the proxy protocol,
+// and because we want the proxy protocol to be possible to serve
+// from a tree of static files (which might be stored on a case-insensitive
+// file system), the proxy protocol must never require two different casings
+// of a URL path either.
+//
+// One possibility would be to make the safe encoding be the lowercase
+// hexadecimal encoding of the actual path bytes. This would avoid ever
+// needing different casings of a file path, but it would be fairly illegible
+// to most programmers when those paths appeared in the file system
+// (including in file paths in compiler errors and stack traces)
+// in web server logs, and so on. Instead, we want a safe encoding that
+// leaves most paths unaltered.
+//
+// The safe encoding is this:
+// replace every uppercase letter with an exclamation mark
+// followed by the letter's lowercase equivalent.
+//
+// For example,
+// github.com/Azure/azure-sdk-for-go -> github.com/!azure/azure-sdk-for-go.
+// github.com/GoogleCloudPlatform/cloudsql-proxy -> github.com/!google!cloud!platform/cloudsql-proxy
+// github.com/Sirupsen/logrus -> github.com/!sirupsen/logrus.
+//
+// Import paths that avoid upper-case letters are left unchanged.
+// Note that because import paths are ASCII-only and avoid various
+// problematic punctuation (like : < and >), the safe encoding is also ASCII-only
+// and avoids the same problematic punctuation.
+//
+// Import paths have never allowed exclamation marks, so there is no
+// need to define how to encode a literal !.
+//
+// Although paths are disallowed from using Unicode (see pathOK above),
+// the eventual plan is to allow Unicode letters as well, to assume that
+// file systems and URLs are Unicode-safe (storing UTF-8), and apply
+// the !-for-uppercase convention. Note however that not all runes that
+// are different but case-fold equivalent are an upper/lower pair.
+// For example, U+004B ('K'), U+006B ('k'), and U+212A ('K' for Kelvin)
+// are considered to case-fold to each other. When we do add Unicode
+// letters, we must not assume that upper/lower are the only case-equivalent pairs.
+// Perhaps the Kelvin symbol would be disallowed entirely, for example.
+// Or perhaps it would encode as "!!k", or perhaps as "(212A)".
+//
+// Also, it would be nice to allow Unicode marks as well as letters,
+// but marks include combining marks, and then we must deal not
+// only with case folding but also normalization: both U+00E9 ('é')
+// and U+0065 U+0301 ('e' followed by combining acute accent)
+// look the same on the page and are treated by some file systems
+// as the same path. If we do allow Unicode marks in paths, there
+// must be some kind of normalization to allow only one canonical
+// encoding of any character used in an import path.
+
+// EncodePath returns the safe encoding of the given module path.
+// It fails if the module path is invalid.
+func EncodePath(path string) (encoding string, err error) {
+ if err := CheckPath(path); err != nil {
+ return "", err
+ }
+
+ return encodeString(path)
+}
+
+// EncodeVersion returns the safe encoding of the given module version.
+// Versions are allowed to be in non-semver form but must be valid file names
+// and not contain exclamation marks.
+func EncodeVersion(v string) (encoding string, err error) {
+ if err := checkElem(v, true); err != nil || strings.Contains(v, "!") {
+ return "", fmt.Errorf("disallowed version string %q", v)
+ }
+ return encodeString(v)
+}
+
+func encodeString(s string) (encoding string, err error) {
+ haveUpper := false
+ for _, r := range s {
+ if r == '!' || r >= utf8.RuneSelf {
+ // This should be disallowed by CheckPath, but diagnose anyway.
+ // The correctness of the encoding loop below depends on it.
+ return "", fmt.Errorf("internal error: inconsistency in EncodePath")
+ }
+ if 'A' <= r && r <= 'Z' {
+ haveUpper = true
+ }
+ }
+
+ if !haveUpper {
+ return s, nil
+ }
+
+ var buf []byte
+ for _, r := range s {
+ if 'A' <= r && r <= 'Z' {
+ buf = append(buf, '!', byte(r+'a'-'A'))
+ } else {
+ buf = append(buf, byte(r))
+ }
+ }
+ return string(buf), nil
+}
+
+// DecodePath returns the module path of the given safe encoding.
+// It fails if the encoding is invalid or encodes an invalid path.
+func DecodePath(encoding string) (path string, err error) {
+ path, ok := decodeString(encoding)
+ if !ok {
+ return "", fmt.Errorf("invalid module path encoding %q", encoding)
+ }
+ if err := CheckPath(path); err != nil {
+ return "", fmt.Errorf("invalid module path encoding %q: %v", encoding, err)
+ }
+ return path, nil
+}
+
+// DecodeVersion returns the version string for the given safe encoding.
+// It fails if the encoding is invalid or encodes an invalid version.
+// Versions are allowed to be in non-semver form but must be valid file names
+// and not contain exclamation marks.
+func DecodeVersion(encoding string) (v string, err error) {
+ v, ok := decodeString(encoding)
+ if !ok {
+ return "", fmt.Errorf("invalid version encoding %q", encoding)
+ }
+ if err := checkElem(v, true); err != nil {
+ return "", fmt.Errorf("disallowed version string %q", v)
+ }
+ return v, nil
+}
+
+func decodeString(encoding string) (string, bool) {
+ var buf []byte
+
+ bang := false
+ for _, r := range encoding {
+ if r >= utf8.RuneSelf {
+ return "", false
+ }
+ if bang {
+ bang = false
+ if r < 'a' || 'z' < r {
+ return "", false
+ }
+ buf = append(buf, byte(r+'A'-'a'))
+ continue
+ }
+ if r == '!' {
+ bang = true
+ continue
+ }
+ if 'A' <= r && r <= 'Z' {
+ return "", false
+ }
+ buf = append(buf, byte(r))
+ }
+ if bang {
+ return "", false
+ }
+ return string(buf), true
+}
diff --git a/vendor/golang.org/x/tools/internal/semver/semver.go b/vendor/golang.org/x/tools/internal/semver/semver.go
new file mode 100644
index 00000000000..4af7118e55d
--- /dev/null
+++ b/vendor/golang.org/x/tools/internal/semver/semver.go
@@ -0,0 +1,388 @@
+// 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 semver implements comparison of semantic version strings.
+// In this package, semantic version strings must begin with a leading "v",
+// as in "v1.0.0".
+//
+// The general form of a semantic version string accepted by this package is
+//
+// vMAJOR[.MINOR[.PATCH[-PRERELEASE][+BUILD]]]
+//
+// where square brackets indicate optional parts of the syntax;
+// MAJOR, MINOR, and PATCH are decimal integers without extra leading zeros;
+// PRERELEASE and BUILD are each a series of non-empty dot-separated identifiers
+// using only alphanumeric characters and hyphens; and
+// all-numeric PRERELEASE identifiers must not have leading zeros.
+//
+// This package follows Semantic Versioning 2.0.0 (see semver.org)
+// with two exceptions. First, it requires the "v" prefix. Second, it recognizes
+// vMAJOR and vMAJOR.MINOR (with no prerelease or build suffixes)
+// as shorthands for vMAJOR.0.0 and vMAJOR.MINOR.0.
+package semver
+
+// parsed returns the parsed form of a semantic version string.
+type parsed struct {
+ major string
+ minor string
+ patch string
+ short string
+ prerelease string
+ build string
+ err string
+}
+
+// IsValid reports whether v is a valid semantic version string.
+func IsValid(v string) bool {
+ _, ok := parse(v)
+ return ok
+}
+
+// Canonical returns the canonical formatting of the semantic version v.
+// It fills in any missing .MINOR or .PATCH and discards build metadata.
+// Two semantic versions compare equal only if their canonical formattings
+// are identical strings.
+// The canonical invalid semantic version is the empty string.
+func Canonical(v string) string {
+ p, ok := parse(v)
+ if !ok {
+ return ""
+ }
+ if p.build != "" {
+ return v[:len(v)-len(p.build)]
+ }
+ if p.short != "" {
+ return v + p.short
+ }
+ return v
+}
+
+// Major returns the major version prefix of the semantic version v.
+// For example, Major("v2.1.0") == "v2".
+// If v is an invalid semantic version string, Major returns the empty string.
+func Major(v string) string {
+ pv, ok := parse(v)
+ if !ok {
+ return ""
+ }
+ return v[:1+len(pv.major)]
+}
+
+// MajorMinor returns the major.minor version prefix of the semantic version v.
+// For example, MajorMinor("v2.1.0") == "v2.1".
+// If v is an invalid semantic version string, MajorMinor returns the empty string.
+func MajorMinor(v string) string {
+ pv, ok := parse(v)
+ if !ok {
+ return ""
+ }
+ i := 1 + len(pv.major)
+ if j := i + 1 + len(pv.minor); j <= len(v) && v[i] == '.' && v[i+1:j] == pv.minor {
+ return v[:j]
+ }
+ return v[:i] + "." + pv.minor
+}
+
+// Prerelease returns the prerelease suffix of the semantic version v.
+// For example, Prerelease("v2.1.0-pre+meta") == "-pre".
+// If v is an invalid semantic version string, Prerelease returns the empty string.
+func Prerelease(v string) string {
+ pv, ok := parse(v)
+ if !ok {
+ return ""
+ }
+ return pv.prerelease
+}
+
+// Build returns the build suffix of the semantic version v.
+// For example, Build("v2.1.0+meta") == "+meta".
+// If v is an invalid semantic version string, Build returns the empty string.
+func Build(v string) string {
+ pv, ok := parse(v)
+ if !ok {
+ return ""
+ }
+ return pv.build
+}
+
+// Compare returns an integer comparing two versions according to
+// according to semantic version precedence.
+// The result will be 0 if v == w, -1 if v < w, or +1 if v > w.
+//
+// An invalid semantic version string is considered less than a valid one.
+// All invalid semantic version strings compare equal to each other.
+func Compare(v, w string) int {
+ pv, ok1 := parse(v)
+ pw, ok2 := parse(w)
+ if !ok1 && !ok2 {
+ return 0
+ }
+ if !ok1 {
+ return -1
+ }
+ if !ok2 {
+ return +1
+ }
+ if c := compareInt(pv.major, pw.major); c != 0 {
+ return c
+ }
+ if c := compareInt(pv.minor, pw.minor); c != 0 {
+ return c
+ }
+ if c := compareInt(pv.patch, pw.patch); c != 0 {
+ return c
+ }
+ return comparePrerelease(pv.prerelease, pw.prerelease)
+}
+
+// Max canonicalizes its arguments and then returns the version string
+// that compares greater.
+func Max(v, w string) string {
+ v = Canonical(v)
+ w = Canonical(w)
+ if Compare(v, w) > 0 {
+ return v
+ }
+ return w
+}
+
+func parse(v string) (p parsed, ok bool) {
+ if v == "" || v[0] != 'v' {
+ p.err = "missing v prefix"
+ return
+ }
+ p.major, v, ok = parseInt(v[1:])
+ if !ok {
+ p.err = "bad major version"
+ return
+ }
+ if v == "" {
+ p.minor = "0"
+ p.patch = "0"
+ p.short = ".0.0"
+ return
+ }
+ if v[0] != '.' {
+ p.err = "bad minor prefix"
+ ok = false
+ return
+ }
+ p.minor, v, ok = parseInt(v[1:])
+ if !ok {
+ p.err = "bad minor version"
+ return
+ }
+ if v == "" {
+ p.patch = "0"
+ p.short = ".0"
+ return
+ }
+ if v[0] != '.' {
+ p.err = "bad patch prefix"
+ ok = false
+ return
+ }
+ p.patch, v, ok = parseInt(v[1:])
+ if !ok {
+ p.err = "bad patch version"
+ return
+ }
+ if len(v) > 0 && v[0] == '-' {
+ p.prerelease, v, ok = parsePrerelease(v)
+ if !ok {
+ p.err = "bad prerelease"
+ return
+ }
+ }
+ if len(v) > 0 && v[0] == '+' {
+ p.build, v, ok = parseBuild(v)
+ if !ok {
+ p.err = "bad build"
+ return
+ }
+ }
+ if v != "" {
+ p.err = "junk on end"
+ ok = false
+ return
+ }
+ ok = true
+ return
+}
+
+func parseInt(v string) (t, rest string, ok bool) {
+ if v == "" {
+ return
+ }
+ if v[0] < '0' || '9' < v[0] {
+ return
+ }
+ i := 1
+ for i < len(v) && '0' <= v[i] && v[i] <= '9' {
+ i++
+ }
+ if v[0] == '0' && i != 1 {
+ return
+ }
+ return v[:i], v[i:], true
+}
+
+func parsePrerelease(v string) (t, rest string, ok bool) {
+ // "A pre-release version MAY be denoted by appending a hyphen and
+ // a series of dot separated identifiers immediately following the patch version.
+ // Identifiers MUST comprise only ASCII alphanumerics and hyphen [0-9A-Za-z-].
+ // Identifiers MUST NOT be empty. Numeric identifiers MUST NOT include leading zeroes."
+ if v == "" || v[0] != '-' {
+ return
+ }
+ i := 1
+ start := 1
+ for i < len(v) && v[i] != '+' {
+ if !isIdentChar(v[i]) && v[i] != '.' {
+ return
+ }
+ if v[i] == '.' {
+ if start == i || isBadNum(v[start:i]) {
+ return
+ }
+ start = i + 1
+ }
+ i++
+ }
+ if start == i || isBadNum(v[start:i]) {
+ return
+ }
+ return v[:i], v[i:], true
+}
+
+func parseBuild(v string) (t, rest string, ok bool) {
+ if v == "" || v[0] != '+' {
+ return
+ }
+ i := 1
+ start := 1
+ for i < len(v) {
+ if !isIdentChar(v[i]) {
+ return
+ }
+ if v[i] == '.' {
+ if start == i {
+ return
+ }
+ start = i + 1
+ }
+ i++
+ }
+ if start == i {
+ return
+ }
+ return v[:i], v[i:], true
+}
+
+func isIdentChar(c byte) bool {
+ return 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' || '0' <= c && c <= '9' || c == '-'
+}
+
+func isBadNum(v string) bool {
+ i := 0
+ for i < len(v) && '0' <= v[i] && v[i] <= '9' {
+ i++
+ }
+ return i == len(v) && i > 1 && v[0] == '0'
+}
+
+func isNum(v string) bool {
+ i := 0
+ for i < len(v) && '0' <= v[i] && v[i] <= '9' {
+ i++
+ }
+ return i == len(v)
+}
+
+func compareInt(x, y string) int {
+ if x == y {
+ return 0
+ }
+ if len(x) < len(y) {
+ return -1
+ }
+ if len(x) > len(y) {
+ return +1
+ }
+ if x < y {
+ return -1
+ } else {
+ return +1
+ }
+}
+
+func comparePrerelease(x, y string) int {
+ // "When major, minor, and patch are equal, a pre-release version has
+ // lower precedence than a normal version.
+ // Example: 1.0.0-alpha < 1.0.0.
+ // Precedence for two pre-release versions with the same major, minor,
+ // and patch version MUST be determined by comparing each dot separated
+ // identifier from left to right until a difference is found as follows:
+ // identifiers consisting of only digits are compared numerically and
+ // identifiers with letters or hyphens are compared lexically in ASCII
+ // sort order. Numeric identifiers always have lower precedence than
+ // non-numeric identifiers. A larger set of pre-release fields has a
+ // higher precedence than a smaller set, if all of the preceding
+ // identifiers are equal.
+ // Example: 1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta <
+ // 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0."
+ if x == y {
+ return 0
+ }
+ if x == "" {
+ return +1
+ }
+ if y == "" {
+ return -1
+ }
+ for x != "" && y != "" {
+ x = x[1:] // skip - or .
+ y = y[1:] // skip - or .
+ var dx, dy string
+ dx, x = nextIdent(x)
+ dy, y = nextIdent(y)
+ if dx != dy {
+ ix := isNum(dx)
+ iy := isNum(dy)
+ if ix != iy {
+ if ix {
+ return -1
+ } else {
+ return +1
+ }
+ }
+ if ix {
+ if len(dx) < len(dy) {
+ return -1
+ }
+ if len(dx) > len(dy) {
+ return +1
+ }
+ }
+ if dx < dy {
+ return -1
+ } else {
+ return +1
+ }
+ }
+ }
+ if x == "" {
+ return -1
+ } else {
+ return +1
+ }
+}
+
+func nextIdent(x string) (dx, rest string) {
+ i := 0
+ for i < len(x) && x[i] != '.' {
+ i++
+ }
+ return x[:i], x[i:]
+}
diff --git a/vendor/modules.txt b/vendor/modules.txt
index 7176caeecd1..dc91183cf8b 100644
--- a/vendor/modules.txt
+++ b/vendor/modules.txt
@@ -1,3 +1,7 @@
+# github.com/BurntSushi/toml v0.3.1
+github.com/BurntSushi/toml
+# github.com/OpenPeeDeeP/depguard v0.0.0-20180806142446-a69c782687b2
+github.com/OpenPeeDeeP/depguard
# github.com/agext/levenshtein v1.2.1
github.com/agext/levenshtein
# github.com/agl/ed25519 v0.0.0-20150830182803-278e1ec8e8a6
@@ -174,11 +178,49 @@ github.com/blang/semver
github.com/boombuler/barcode
github.com/boombuler/barcode/qr
github.com/boombuler/barcode/utils
+# github.com/client9/misspell v0.3.4
+github.com/client9/misspell/cmd/misspell
+github.com/client9/misspell
# github.com/davecgh/go-spew v1.1.1
github.com/davecgh/go-spew/spew
+# github.com/fatih/color v1.6.0
+github.com/fatih/color
+# github.com/fsnotify/fsnotify v1.4.7
+github.com/fsnotify/fsnotify
+# github.com/go-critic/go-critic v0.0.0-20181204210945-ee9bf5809ead
+github.com/go-critic/go-critic/checkers
+github.com/go-critic/go-critic/checkers/internal/lintutil
+# github.com/go-lintpack/lintpack v0.5.2
+github.com/go-lintpack/lintpack
+github.com/go-lintpack/lintpack/astwalk
+# github.com/go-toolsmith/astcast v0.0.0-20181028201508-b7a89ed70af1
+github.com/go-toolsmith/astcast
+# github.com/go-toolsmith/astcopy v0.0.0-20180903214859-79b422d080c4
+github.com/go-toolsmith/astcopy
+# github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6
+github.com/go-toolsmith/astequal
+# github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086
+github.com/go-toolsmith/astfmt
+# github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30
+github.com/go-toolsmith/astp
+# github.com/go-toolsmith/strparse v0.0.0-20180903215201-830b6daa1241
+github.com/go-toolsmith/strparse
+# github.com/go-toolsmith/typep v0.0.0-20181030061450-d63dc7650676
+github.com/go-toolsmith/typep
+# github.com/gobwas/glob v0.2.3
+github.com/gobwas/glob
+github.com/gobwas/glob/compiler
+github.com/gobwas/glob/syntax
+github.com/gobwas/glob/match
+github.com/gobwas/glob/syntax/ast
+github.com/gobwas/glob/util/runes
+github.com/gobwas/glob/syntax/lexer
+github.com/gobwas/glob/util/strings
# github.com/gogo/protobuf v1.2.0
github.com/gogo/protobuf/proto
github.com/gogo/protobuf/sortkeys
+# github.com/golang/mock v1.1.1
+github.com/golang/mock/gomock
# github.com/golang/protobuf v1.2.0
github.com/golang/protobuf/proto
github.com/golang/protobuf/ptypes
@@ -187,6 +229,89 @@ github.com/golang/protobuf/ptypes/duration
github.com/golang/protobuf/ptypes/timestamp
# github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db
github.com/golang/snappy
+# github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2
+github.com/golangci/check/cmd/structcheck
+github.com/golangci/check/cmd/varcheck
+# github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a
+github.com/golangci/dupl
+github.com/golangci/dupl/job
+github.com/golangci/dupl/printer
+github.com/golangci/dupl/syntax
+github.com/golangci/dupl/suffixtree
+github.com/golangci/dupl/syntax/golang
+# github.com/golangci/errcheck v0.0.0-20181003203344-ef45e06d44b6
+github.com/golangci/errcheck/golangci
+github.com/golangci/errcheck/internal/errcheck
+# github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613
+github.com/golangci/go-misc/deadcode
+# github.com/golangci/go-tools v0.0.0-20190124090046-35a9f45a5db0
+github.com/golangci/go-tools/config
+github.com/golangci/go-tools/lint
+github.com/golangci/go-tools/lint/lintutil
+github.com/golangci/go-tools/simple
+github.com/golangci/go-tools/staticcheck
+github.com/golangci/go-tools/stylecheck
+github.com/golangci/go-tools/unused
+github.com/golangci/go-tools/ssa
+github.com/golangci/go-tools/ssa/ssautil
+github.com/golangci/go-tools/lint/lintutil/format
+github.com/golangci/go-tools/version
+github.com/golangci/go-tools/arg
+github.com/golangci/go-tools/internal/sharedcheck
+github.com/golangci/go-tools/lint/lintdsl
+github.com/golangci/go-tools/deprecated
+github.com/golangci/go-tools/functions
+github.com/golangci/go-tools/ssautil
+github.com/golangci/go-tools/staticcheck/vrp
+github.com/golangci/go-tools/callgraph
+github.com/golangci/go-tools/callgraph/static
+# github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3
+github.com/golangci/goconst
+# github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee
+github.com/golangci/gocyclo/pkg/gocyclo
+# github.com/golangci/gofmt v0.0.0-20181105071733-0b8337e80d98
+github.com/golangci/gofmt/gofmt
+github.com/golangci/gofmt/goimports
+# github.com/golangci/golangci-lint v1.15.0
+github.com/golangci/golangci-lint/cmd/golangci-lint
+github.com/golangci/golangci-lint/pkg/commands
+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/goutil
+github.com/golangci/golangci-lint/pkg/lint
+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/printers
+github.com/golangci/golangci-lint/pkg/report
+github.com/golangci/golangci-lint/pkg/result
+github.com/golangci/golangci-lint/pkg/result/processors
+github.com/golangci/golangci-lint/pkg/lint/astcache
+github.com/golangci/golangci-lint/pkg/packages
+github.com/golangci/golangci-lint/pkg/timeutils
+github.com/golangci/golangci-lint/pkg/golinters
+# github.com/golangci/gosec v0.0.0-20180901114220-8afd9cbb6cfb
+github.com/golangci/gosec
+github.com/golangci/gosec/rules
+# github.com/golangci/govet v0.0.0-20180818181408-44ddbe260190
+github.com/golangci/govet
+github.com/golangci/govet/lib/cfg
+github.com/golangci/govet/lib/whitelist
+# github.com/golangci/ineffassign v0.0.0-20180808204949-2ee8f2867dde
+github.com/golangci/ineffassign
+# github.com/golangci/lint-1 v0.0.0-20180610141402-4bf9709227d1
+github.com/golangci/lint-1
+# github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca
+github.com/golangci/maligned
+# github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770
+github.com/golangci/misspell
+# github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21
+github.com/golangci/prealloc
+# github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0
+github.com/golangci/revgrep
+# github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4
+github.com/golangci/unconvert
# github.com/google/gofuzz v0.0.0-20170612174753-24818f796faf
github.com/google/gofuzz
# github.com/hashicorp/aws-sdk-go-base v0.3.0
@@ -210,12 +335,13 @@ github.com/hashicorp/go-safetemp
github.com/hashicorp/go-uuid
# github.com/hashicorp/go-version v1.0.0
github.com/hashicorp/go-version
-# github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f
+# github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce
github.com/hashicorp/hcl
github.com/hashicorp/hcl/hcl/ast
github.com/hashicorp/hcl/hcl/parser
github.com/hashicorp/hcl/hcl/token
github.com/hashicorp/hcl/json/parser
+github.com/hashicorp/hcl/hcl/printer
github.com/hashicorp/hcl/hcl/scanner
github.com/hashicorp/hcl/hcl/strconv
github.com/hashicorp/hcl/json/scanner
@@ -273,6 +399,8 @@ github.com/hashicorp/vault/helper/jsonutil
github.com/hashicorp/vault/helper/compressutil
# github.com/hashicorp/yamux v0.0.0-20160720233140-d1caa6c97c9f
github.com/hashicorp/yamux
+# github.com/inconshreveable/mousetrap v1.0.0
+github.com/inconshreveable/mousetrap
# github.com/jen20/awspolicyequivalence v1.0.0
github.com/jen20/awspolicyequivalence
# github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af
@@ -287,9 +415,16 @@ github.com/keybase/go-crypto/rsa
github.com/keybase/go-crypto/brainpool
github.com/keybase/go-crypto/cast5
github.com/keybase/go-crypto/openpgp/elgamal
+# github.com/kisielk/gotool v1.0.0
+github.com/kisielk/gotool
+github.com/kisielk/gotool/internal/load
# github.com/kubernetes-sigs/aws-iam-authenticator v0.3.1-0.20181019024009-82544ec86140
github.com/kubernetes-sigs/aws-iam-authenticator/pkg/token
github.com/kubernetes-sigs/aws-iam-authenticator/pkg/arn
+# github.com/magiconair/properties v1.7.6
+github.com/magiconair/properties
+# github.com/mattn/go-colorable v0.0.9
+github.com/mattn/go-colorable
# github.com/mattn/go-isatty v0.0.4
github.com/mattn/go-isatty
# github.com/mitchellh/cli v0.0.0-20171129193617-33edc47170b5
@@ -308,8 +443,22 @@ github.com/mitchellh/hashstructure
github.com/mitchellh/mapstructure
# github.com/mitchellh/reflectwalk v1.0.0
github.com/mitchellh/reflectwalk
+# github.com/nbutton23/zxcvbn-go v0.0.0-20171102151520-eafdab6b0663
+github.com/nbutton23/zxcvbn-go
+github.com/nbutton23/zxcvbn-go/match
+github.com/nbutton23/zxcvbn-go/matching
+github.com/nbutton23/zxcvbn-go/scoring
+github.com/nbutton23/zxcvbn-go/utils/math
+github.com/nbutton23/zxcvbn-go/adjacency
+github.com/nbutton23/zxcvbn-go/entropy
+github.com/nbutton23/zxcvbn-go/frequency
+github.com/nbutton23/zxcvbn-go/data
# github.com/oklog/run v1.0.0
github.com/oklog/run
+# github.com/pelletier/go-toml v1.1.0
+github.com/pelletier/go-toml
+# github.com/pkg/errors v0.8.0
+github.com/pkg/errors
# github.com/posener/complete v0.0.0-20171219111128-6bee943216c8
github.com/posener/complete
github.com/posener/complete/cmd/install
@@ -319,6 +468,21 @@ github.com/posener/complete/match
github.com/pquerna/otp/totp
github.com/pquerna/otp
github.com/pquerna/otp/hotp
+# github.com/sirupsen/logrus v1.0.5
+github.com/sirupsen/logrus
+# github.com/spf13/afero v1.1.0
+github.com/spf13/afero
+github.com/spf13/afero/mem
+# github.com/spf13/cast v1.2.0
+github.com/spf13/cast
+# github.com/spf13/cobra v0.0.2
+github.com/spf13/cobra
+# github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec
+github.com/spf13/jwalterweatherman
+# github.com/spf13/pflag v1.0.3
+github.com/spf13/pflag
+# github.com/spf13/viper v1.0.2
+github.com/spf13/viper
# github.com/terraform-providers/terraform-provider-template v1.0.0
github.com/terraform-providers/terraform-provider-template/template
# github.com/terraform-providers/terraform-provider-tls v1.2.0
@@ -336,7 +500,7 @@ github.com/zclconf/go-cty/cty/function/stdlib
github.com/zclconf/go-cty/cty/set
github.com/zclconf/go-cty/cty/gocty
github.com/zclconf/go-cty/cty/json
-# golang.org/x/crypto v0.0.0-20180211211603-9de5f2eaf759
+# golang.org/x/crypto v0.0.0-20180505025534-4ec37c66abab
golang.org/x/crypto/openpgp
golang.org/x/crypto/bcrypt
golang.org/x/crypto/ssh
@@ -349,6 +513,7 @@ golang.org/x/crypto/curve25519
golang.org/x/crypto/ed25519
golang.org/x/crypto/internal/chacha20
golang.org/x/crypto/poly1305
+golang.org/x/crypto/ssh/terminal
golang.org/x/crypto/cast5
golang.org/x/crypto/openpgp/elgamal
golang.org/x/crypto/ed25519/internal/edwards25519
@@ -364,11 +529,30 @@ golang.org/x/net/idna
golang.org/x/net/internal/timeseries
# golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5
golang.org/x/sys/unix
+golang.org/x/sys/windows
# golang.org/x/text v0.3.0
golang.org/x/text/unicode/norm
golang.org/x/text/transform
+golang.org/x/text/width
golang.org/x/text/secure/bidirule
golang.org/x/text/unicode/bidi
+# golang.org/x/tools v0.0.0-20190125232054-379209517ffe
+golang.org/x/tools/go/loader
+golang.org/x/tools/go/packages
+golang.org/x/tools/go/ssa
+golang.org/x/tools/go/ssa/ssautil
+golang.org/x/tools/go/ast/astutil
+golang.org/x/tools/go/buildutil
+golang.org/x/tools/go/internal/cgo
+golang.org/x/tools/go/gcexportdata
+golang.org/x/tools/go/internal/packagesdriver
+golang.org/x/tools/internal/gopathwalk
+golang.org/x/tools/internal/semver
+golang.org/x/tools/go/types/typeutil
+golang.org/x/tools/imports
+golang.org/x/tools/go/internal/gcimporter
+golang.org/x/tools/internal/fastwalk
+golang.org/x/tools/internal/module
# google.golang.org/genproto v0.0.0-20171002232614-f676e0f3ac63
google.golang.org/genproto/googleapis/rpc/status
# google.golang.org/grpc v0.0.0-20171025225919-b5eab4ccac6d
@@ -425,3 +609,13 @@ k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1
k8s.io/client-go/pkg/apis/clientauthentication
# k8s.io/klog v0.1.0
k8s.io/klog
+# mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed
+mvdan.cc/interfacer/check
+# mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b
+mvdan.cc/lint
+# mvdan.cc/unparam v0.0.0-20190124213536-fbb59629db34
+mvdan.cc/unparam/check
+# sourcegraph.com/sourcegraph/go-diff v0.5.1-0.20190210232911-dee78e514455
+sourcegraph.com/sourcegraph/go-diff/diff
+# sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4
+sourcegraph.com/sqs/pbtypes
diff --git a/vendor/mvdan.cc/interfacer/LICENSE b/vendor/mvdan.cc/interfacer/LICENSE
new file mode 100644
index 00000000000..7d71d51a5eb
--- /dev/null
+++ b/vendor/mvdan.cc/interfacer/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2015, Daniel Martí. 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 holder 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/mvdan.cc/interfacer/check/cache.go b/vendor/mvdan.cc/interfacer/check/cache.go
new file mode 100644
index 00000000000..757eca55e13
--- /dev/null
+++ b/vendor/mvdan.cc/interfacer/check/cache.go
@@ -0,0 +1,50 @@
+// Copyright (c) 2015, Daniel Martí
+// See LICENSE for licensing information
+
+package check
+
+import (
+ "go/ast"
+ "go/types"
+)
+
+type pkgTypes struct {
+ ifaces map[string]string
+ funcSigns map[string]bool
+}
+
+func (p *pkgTypes) getTypes(pkg *types.Package) {
+ p.ifaces = make(map[string]string)
+ p.funcSigns = make(map[string]bool)
+ done := make(map[*types.Package]bool)
+ addTypes := func(pkg *types.Package, top bool) {
+ if done[pkg] {
+ return
+ }
+ done[pkg] = true
+ ifs, funs := fromScope(pkg.Scope())
+ fullName := func(name string) string {
+ if !top {
+ return pkg.Path() + "." + name
+ }
+ return name
+ }
+ for iftype, name := range ifs {
+ // only suggest exported interfaces
+ if ast.IsExported(name) {
+ p.ifaces[iftype] = fullName(name)
+ }
+ }
+ for ftype := range funs {
+ // ignore non-exported func signatures too
+ p.funcSigns[ftype] = true
+ }
+ }
+ for _, imp := range pkg.Imports() {
+ addTypes(imp, false)
+ for _, imp2 := range imp.Imports() {
+ addTypes(imp2, false)
+ }
+ }
+ addTypes(pkg, true)
+}
diff --git a/vendor/mvdan.cc/interfacer/check/check.go b/vendor/mvdan.cc/interfacer/check/check.go
new file mode 100644
index 00000000000..f4d3b4037b0
--- /dev/null
+++ b/vendor/mvdan.cc/interfacer/check/check.go
@@ -0,0 +1,462 @@
+// Copyright (c) 2015, Daniel Martí
+// See LICENSE for licensing information
+
+package check // import "mvdan.cc/interfacer/check"
+
+import (
+ "fmt"
+ "go/ast"
+ "go/token"
+ "go/types"
+ "os"
+ "strings"
+
+ "golang.org/x/tools/go/loader"
+ "golang.org/x/tools/go/ssa"
+ "golang.org/x/tools/go/ssa/ssautil"
+
+ "github.com/kisielk/gotool"
+ "mvdan.cc/lint"
+)
+
+func toDiscard(usage *varUsage) bool {
+ if usage.discard {
+ return true
+ }
+ for to := range usage.assigned {
+ if toDiscard(to) {
+ return true
+ }
+ }
+ return false
+}
+
+func allCalls(usage *varUsage, all, ftypes map[string]string) {
+ for fname := range usage.calls {
+ all[fname] = ftypes[fname]
+ }
+ for to := range usage.assigned {
+ allCalls(to, all, ftypes)
+ }
+}
+
+func (c *Checker) interfaceMatching(param *types.Var, usage *varUsage) (string, string) {
+ if toDiscard(usage) {
+ return "", ""
+ }
+ ftypes := typeFuncMap(param.Type())
+ called := make(map[string]string, len(usage.calls))
+ allCalls(usage, called, ftypes)
+ s := funcMapString(called)
+ return c.ifaces[s], s
+}
+
+type varUsage struct {
+ calls map[string]struct{}
+ discard bool
+
+ assigned map[*varUsage]struct{}
+}
+
+type funcDecl struct {
+ astDecl *ast.FuncDecl
+ ssaFn *ssa.Function
+}
+
+// CheckArgs checks the packages specified by their import paths in
+// args.
+func CheckArgs(args []string) ([]string, error) {
+ paths := gotool.ImportPaths(args)
+ conf := loader.Config{}
+ conf.AllowErrors = true
+ rest, err := conf.FromArgs(paths, false)
+ if err != nil {
+ return nil, err
+ }
+ if len(rest) > 0 {
+ return nil, fmt.Errorf("unwanted extra args: %v", rest)
+ }
+ lprog, err := conf.Load()
+ if err != nil {
+ return nil, err
+ }
+ prog := ssautil.CreateProgram(lprog, 0)
+ prog.Build()
+ c := new(Checker)
+ c.Program(lprog)
+ c.ProgramSSA(prog)
+ issues, err := c.Check()
+ if err != nil {
+ return nil, err
+ }
+ wd, err := os.Getwd()
+ if err != nil {
+ return nil, err
+ }
+ lines := make([]string, len(issues))
+ for i, issue := range issues {
+ fpos := prog.Fset.Position(issue.Pos()).String()
+ if strings.HasPrefix(fpos, wd) {
+ fpos = fpos[len(wd)+1:]
+ }
+ lines[i] = fmt.Sprintf("%s: %s", fpos, issue.Message())
+ }
+ return lines, nil
+}
+
+type Checker struct {
+ lprog *loader.Program
+ prog *ssa.Program
+
+ pkgTypes
+ *loader.PackageInfo
+
+ funcs []*funcDecl
+
+ ssaByPos map[token.Pos]*ssa.Function
+
+ discardFuncs map[*types.Signature]struct{}
+
+ vars map[*types.Var]*varUsage
+}
+
+var (
+ _ lint.Checker = (*Checker)(nil)
+ _ lint.WithSSA = (*Checker)(nil)
+)
+
+func (c *Checker) Program(lprog *loader.Program) {
+ c.lprog = lprog
+}
+
+func (c *Checker) ProgramSSA(prog *ssa.Program) {
+ c.prog = prog
+}
+
+func (c *Checker) Check() ([]lint.Issue, error) {
+ var total []lint.Issue
+ c.ssaByPos = make(map[token.Pos]*ssa.Function)
+ wantPkg := make(map[*types.Package]bool)
+ for _, pinfo := range c.lprog.InitialPackages() {
+ wantPkg[pinfo.Pkg] = true
+ }
+ for fn := range ssautil.AllFunctions(c.prog) {
+ if fn.Pkg == nil { // builtin?
+ continue
+ }
+ if len(fn.Blocks) == 0 { // stub
+ continue
+ }
+ if !wantPkg[fn.Pkg.Pkg] { // not part of given pkgs
+ continue
+ }
+ c.ssaByPos[fn.Pos()] = fn
+ }
+ for _, pinfo := range c.lprog.InitialPackages() {
+ pkg := pinfo.Pkg
+ c.getTypes(pkg)
+ c.PackageInfo = c.lprog.AllPackages[pkg]
+ total = append(total, c.checkPkg()...)
+ }
+ return total, nil
+}
+
+func (c *Checker) checkPkg() []lint.Issue {
+ c.discardFuncs = make(map[*types.Signature]struct{})
+ c.vars = make(map[*types.Var]*varUsage)
+ c.funcs = c.funcs[:0]
+ findFuncs := func(node ast.Node) bool {
+ decl, ok := node.(*ast.FuncDecl)
+ if !ok {
+ return true
+ }
+ ssaFn := c.ssaByPos[decl.Name.Pos()]
+ if ssaFn == nil {
+ return true
+ }
+ fd := &funcDecl{
+ astDecl: decl,
+ ssaFn: ssaFn,
+ }
+ if c.funcSigns[signString(fd.ssaFn.Signature)] {
+ // implements interface
+ return true
+ }
+ c.funcs = append(c.funcs, fd)
+ ast.Walk(c, decl.Body)
+ return true
+ }
+ for _, f := range c.Files {
+ ast.Inspect(f, findFuncs)
+ }
+ return c.packageIssues()
+}
+
+func paramVarAndType(sign *types.Signature, i int) (*types.Var, types.Type) {
+ params := sign.Params()
+ extra := sign.Variadic() && i >= params.Len()-1
+ if !extra {
+ if i >= params.Len() {
+ // builtins with multiple signatures
+ return nil, nil
+ }
+ vr := params.At(i)
+ return vr, vr.Type()
+ }
+ last := params.At(params.Len() - 1)
+ switch x := last.Type().(type) {
+ case *types.Slice:
+ return nil, x.Elem()
+ default:
+ return nil, x
+ }
+}
+
+func (c *Checker) varUsage(e ast.Expr) *varUsage {
+ id, ok := e.(*ast.Ident)
+ if !ok {
+ return nil
+ }
+ param, ok := c.ObjectOf(id).(*types.Var)
+ if !ok {
+ // not a variable
+ return nil
+ }
+ if usage, e := c.vars[param]; e {
+ return usage
+ }
+ if !interesting(param.Type()) {
+ return nil
+ }
+ usage := &varUsage{
+ calls: make(map[string]struct{}),
+ assigned: make(map[*varUsage]struct{}),
+ }
+ c.vars[param] = usage
+ return usage
+}
+
+func (c *Checker) addUsed(e ast.Expr, as types.Type) {
+ if as == nil {
+ return
+ }
+ if usage := c.varUsage(e); usage != nil {
+ // using variable
+ iface, ok := as.Underlying().(*types.Interface)
+ if !ok {
+ usage.discard = true
+ return
+ }
+ for i := 0; i < iface.NumMethods(); i++ {
+ m := iface.Method(i)
+ usage.calls[m.Name()] = struct{}{}
+ }
+ } else if t, ok := c.TypeOf(e).(*types.Signature); ok {
+ // using func
+ c.discardFuncs[t] = struct{}{}
+ }
+}
+
+func (c *Checker) addAssign(to, from ast.Expr) {
+ pto := c.varUsage(to)
+ pfrom := c.varUsage(from)
+ if pto == nil || pfrom == nil {
+ // either isn't interesting
+ return
+ }
+ pfrom.assigned[pto] = struct{}{}
+}
+
+func (c *Checker) discard(e ast.Expr) {
+ if usage := c.varUsage(e); usage != nil {
+ usage.discard = true
+ }
+}
+
+func (c *Checker) comparedWith(e, with ast.Expr) {
+ if _, ok := with.(*ast.BasicLit); ok {
+ c.discard(e)
+ }
+}
+
+func (c *Checker) Visit(node ast.Node) ast.Visitor {
+ switch x := node.(type) {
+ case *ast.SelectorExpr:
+ if _, ok := c.TypeOf(x.Sel).(*types.Signature); !ok {
+ c.discard(x.X)
+ }
+ case *ast.StarExpr:
+ c.discard(x.X)
+ case *ast.UnaryExpr:
+ c.discard(x.X)
+ case *ast.IndexExpr:
+ c.discard(x.X)
+ case *ast.IncDecStmt:
+ c.discard(x.X)
+ case *ast.BinaryExpr:
+ switch x.Op {
+ case token.EQL, token.NEQ:
+ c.comparedWith(x.X, x.Y)
+ c.comparedWith(x.Y, x.X)
+ default:
+ c.discard(x.X)
+ c.discard(x.Y)
+ }
+ case *ast.ValueSpec:
+ for _, val := range x.Values {
+ c.addUsed(val, c.TypeOf(x.Type))
+ }
+ case *ast.AssignStmt:
+ for i, val := range x.Rhs {
+ left := x.Lhs[i]
+ if x.Tok == token.ASSIGN {
+ c.addUsed(val, c.TypeOf(left))
+ }
+ c.addAssign(left, val)
+ }
+ case *ast.CompositeLit:
+ for i, e := range x.Elts {
+ switch y := e.(type) {
+ case *ast.KeyValueExpr:
+ c.addUsed(y.Key, c.TypeOf(y.Value))
+ c.addUsed(y.Value, c.TypeOf(y.Key))
+ case *ast.Ident:
+ c.addUsed(y, compositeIdentType(c.TypeOf(x), i))
+ }
+ }
+ case *ast.CallExpr:
+ switch y := c.TypeOf(x.Fun).Underlying().(type) {
+ case *types.Signature:
+ c.onMethodCall(x, y)
+ default:
+ // type conversion
+ if len(x.Args) == 1 {
+ c.addUsed(x.Args[0], y)
+ }
+ }
+ }
+ return c
+}
+
+func compositeIdentType(t types.Type, i int) types.Type {
+ switch x := t.(type) {
+ case *types.Named:
+ return compositeIdentType(x.Underlying(), i)
+ case *types.Struct:
+ return x.Field(i).Type()
+ case *types.Array:
+ return x.Elem()
+ case *types.Slice:
+ return x.Elem()
+ }
+ return nil
+}
+
+func (c *Checker) onMethodCall(ce *ast.CallExpr, sign *types.Signature) {
+ for i, e := range ce.Args {
+ paramObj, t := paramVarAndType(sign, i)
+ // Don't if this is a parameter being re-used as itself
+ // in a recursive call
+ if id, ok := e.(*ast.Ident); ok {
+ if paramObj == c.ObjectOf(id) {
+ continue
+ }
+ }
+ c.addUsed(e, t)
+ }
+ sel, ok := ce.Fun.(*ast.SelectorExpr)
+ if !ok {
+ return
+ }
+ // receiver func call on the left side
+ if usage := c.varUsage(sel.X); usage != nil {
+ usage.calls[sel.Sel.Name] = struct{}{}
+ }
+}
+
+func (fd *funcDecl) paramGroups() [][]*types.Var {
+ astList := fd.astDecl.Type.Params.List
+ groups := make([][]*types.Var, len(astList))
+ signIndex := 0
+ for i, field := range astList {
+ group := make([]*types.Var, len(field.Names))
+ for j := range field.Names {
+ group[j] = fd.ssaFn.Signature.Params().At(signIndex)
+ signIndex++
+ }
+ groups[i] = group
+ }
+ return groups
+}
+
+func (c *Checker) packageIssues() []lint.Issue {
+ var issues []lint.Issue
+ for _, fd := range c.funcs {
+ if _, e := c.discardFuncs[fd.ssaFn.Signature]; e {
+ continue
+ }
+ for _, group := range fd.paramGroups() {
+ issues = append(issues, c.groupIssues(fd, group)...)
+ }
+ }
+ return issues
+}
+
+type Issue struct {
+ pos token.Pos
+ msg string
+}
+
+func (i Issue) Pos() token.Pos { return i.pos }
+func (i Issue) Message() string { return i.msg }
+
+func (c *Checker) groupIssues(fd *funcDecl, group []*types.Var) []lint.Issue {
+ var issues []lint.Issue
+ for _, param := range group {
+ usage := c.vars[param]
+ if usage == nil {
+ return nil
+ }
+ newType := c.paramNewType(fd.astDecl.Name.Name, param, usage)
+ if newType == "" {
+ return nil
+ }
+ issues = append(issues, Issue{
+ pos: param.Pos(),
+ msg: fmt.Sprintf("%s can be %s", param.Name(), newType),
+ })
+ }
+ return issues
+}
+
+func willAddAllocation(t types.Type) bool {
+ switch t.Underlying().(type) {
+ case *types.Pointer, *types.Interface:
+ return false
+ }
+ return true
+}
+
+func (c *Checker) paramNewType(funcName string, param *types.Var, usage *varUsage) string {
+ t := param.Type()
+ if !ast.IsExported(funcName) && willAddAllocation(t) {
+ return ""
+ }
+ if named := typeNamed(t); named != nil {
+ tname := named.Obj().Name()
+ vname := param.Name()
+ if mentionsName(funcName, tname) || mentionsName(funcName, vname) {
+ return ""
+ }
+ }
+ ifname, iftype := c.interfaceMatching(param, usage)
+ if ifname == "" {
+ return ""
+ }
+ if types.IsInterface(t.Underlying()) {
+ if have := funcMapString(typeFuncMap(t)); have == iftype {
+ return ""
+ }
+ }
+ return ifname
+}
diff --git a/vendor/mvdan.cc/interfacer/check/types.go b/vendor/mvdan.cc/interfacer/check/types.go
new file mode 100644
index 00000000000..393bb0b9fab
--- /dev/null
+++ b/vendor/mvdan.cc/interfacer/check/types.go
@@ -0,0 +1,170 @@
+// Copyright (c) 2015, Daniel Martí
+// See LICENSE for licensing information
+
+package check
+
+import (
+ "bytes"
+ "fmt"
+ "go/types"
+ "sort"
+ "strings"
+)
+
+type methoder interface {
+ NumMethods() int
+ Method(int) *types.Func
+}
+
+func methoderFuncMap(m methoder, skip bool) map[string]string {
+ ifuncs := make(map[string]string, m.NumMethods())
+ for i := 0; i < m.NumMethods(); i++ {
+ f := m.Method(i)
+ if !f.Exported() {
+ if skip {
+ continue
+ }
+ return nil
+ }
+ sign := f.Type().(*types.Signature)
+ ifuncs[f.Name()] = signString(sign)
+ }
+ return ifuncs
+}
+
+func typeFuncMap(t types.Type) map[string]string {
+ switch x := t.(type) {
+ case *types.Pointer:
+ return typeFuncMap(x.Elem())
+ case *types.Named:
+ u := x.Underlying()
+ if types.IsInterface(u) {
+ return typeFuncMap(u)
+ }
+ return methoderFuncMap(x, true)
+ case *types.Interface:
+ return methoderFuncMap(x, false)
+ default:
+ return nil
+ }
+}
+
+func funcMapString(iface map[string]string) string {
+ fnames := make([]string, 0, len(iface))
+ for fname := range iface {
+ fnames = append(fnames, fname)
+ }
+ sort.Strings(fnames)
+ var b bytes.Buffer
+ for i, fname := range fnames {
+ if i > 0 {
+ fmt.Fprint(&b, "; ")
+ }
+ fmt.Fprint(&b, fname, iface[fname])
+ }
+ return b.String()
+}
+
+func tupleJoin(buf *bytes.Buffer, t *types.Tuple) {
+ buf.WriteByte('(')
+ for i := 0; i < t.Len(); i++ {
+ if i > 0 {
+ buf.WriteString(", ")
+ }
+ buf.WriteString(t.At(i).Type().String())
+ }
+ buf.WriteByte(')')
+}
+
+// signString is similar to Signature.String(), but it ignores
+// param/result names.
+func signString(sign *types.Signature) string {
+ var buf bytes.Buffer
+ tupleJoin(&buf, sign.Params())
+ tupleJoin(&buf, sign.Results())
+ return buf.String()
+}
+
+func interesting(t types.Type) bool {
+ switch x := t.(type) {
+ case *types.Interface:
+ return x.NumMethods() > 1
+ case *types.Named:
+ if u := x.Underlying(); types.IsInterface(u) {
+ return interesting(u)
+ }
+ return x.NumMethods() >= 1
+ case *types.Pointer:
+ return interesting(x.Elem())
+ default:
+ return false
+ }
+}
+
+func anyInteresting(params *types.Tuple) bool {
+ for i := 0; i < params.Len(); i++ {
+ t := params.At(i).Type()
+ if interesting(t) {
+ return true
+ }
+ }
+ return false
+}
+
+func fromScope(scope *types.Scope) (ifaces map[string]string, funcs map[string]bool) {
+ ifaces = make(map[string]string)
+ funcs = make(map[string]bool)
+ for _, name := range scope.Names() {
+ tn, ok := scope.Lookup(name).(*types.TypeName)
+ if !ok {
+ continue
+ }
+ switch x := tn.Type().Underlying().(type) {
+ case *types.Interface:
+ iface := methoderFuncMap(x, false)
+ if len(iface) == 0 {
+ continue
+ }
+ for i := 0; i < x.NumMethods(); i++ {
+ f := x.Method(i)
+ sign := f.Type().(*types.Signature)
+ if !anyInteresting(sign.Params()) {
+ continue
+ }
+ funcs[signString(sign)] = true
+ }
+ s := funcMapString(iface)
+ if _, e := ifaces[s]; !e {
+ ifaces[s] = tn.Name()
+ }
+ case *types.Signature:
+ if !anyInteresting(x.Params()) {
+ continue
+ }
+ funcs[signString(x)] = true
+ }
+ }
+ return ifaces, funcs
+}
+
+func mentionsName(fname, name string) bool {
+ if len(name) < 2 {
+ return false
+ }
+ capit := strings.ToUpper(name[:1]) + name[1:]
+ lower := strings.ToLower(name)
+ return strings.Contains(fname, capit) || strings.HasPrefix(fname, lower)
+}
+
+func typeNamed(t types.Type) *types.Named {
+ for {
+ switch x := t.(type) {
+ case *types.Named:
+ return x
+ case *types.Pointer:
+ t = x.Elem()
+ default:
+ return nil
+ }
+ }
+}
diff --git a/vendor/mvdan.cc/lint/.travis.yml b/vendor/mvdan.cc/lint/.travis.yml
new file mode 100644
index 00000000000..2ccdeab9adf
--- /dev/null
+++ b/vendor/mvdan.cc/lint/.travis.yml
@@ -0,0 +1,7 @@
+language: go
+
+go:
+ - 1.8.x
+ - 1.9.x
+
+go_import_path: mvdan.cc/lint
diff --git a/vendor/mvdan.cc/lint/LICENSE b/vendor/mvdan.cc/lint/LICENSE
new file mode 100644
index 00000000000..a06c5ebfc88
--- /dev/null
+++ b/vendor/mvdan.cc/lint/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2017, Daniel Martí. 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 holder 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/mvdan.cc/lint/README.md b/vendor/mvdan.cc/lint/README.md
new file mode 100644
index 00000000000..8a9c8b51c3c
--- /dev/null
+++ b/vendor/mvdan.cc/lint/README.md
@@ -0,0 +1,27 @@
+# lint
+
+[![GoDoc](https://godoc.org/mvdan.cc/lint?status.svg)](https://godoc.org/mvdan.cc/lint)
+[![Build Status](https://travis-ci.org/mvdan/lint.svg?branch=master)](https://travis-ci.org/mvdan/lint)
+
+Work in progress. Its API might change before the 1.0 release.
+
+This package intends to define simple interfaces that Go code checkers
+can implement. This would simplify calling them from Go code, as well as
+running multiple linters while sharing initial loading work.
+
+### metalint
+
+ go get -u mvdan.cc/lint/cmd/metalint
+
+The start of a linter that runs many linters leveraging the common
+interface. Not stable yet.
+
+Linters included:
+
+* [unparam](https://mvdan.cc/unparam)
+* [interfacer](https://github.com/mvdan/interfacer)
+
+### Related projects
+
+* [golinters](https://github.com/thomasheller/golinters) - Report on
+ linter support
diff --git a/vendor/mvdan.cc/lint/lint.go b/vendor/mvdan.cc/lint/lint.go
new file mode 100644
index 00000000000..a16789fad56
--- /dev/null
+++ b/vendor/mvdan.cc/lint/lint.go
@@ -0,0 +1,28 @@
+// Copyright (c) 2017, Daniel Martí
+// See LICENSE for licensing information
+
+// Package lint defines common interfaces for Go code checkers.
+package lint // import "mvdan.cc/lint"
+
+import (
+ "go/token"
+
+ "golang.org/x/tools/go/loader"
+ "golang.org/x/tools/go/ssa"
+)
+
+// A Checker points out issues in a program.
+type Checker interface {
+ Program(*loader.Program)
+ Check() ([]Issue, error)
+}
+
+type WithSSA interface {
+ ProgramSSA(*ssa.Program)
+}
+
+// Issue represents an issue somewhere in a source code file.
+type Issue interface {
+ Pos() token.Pos
+ Message() string
+}
diff --git a/vendor/mvdan.cc/unparam/LICENSE b/vendor/mvdan.cc/unparam/LICENSE
new file mode 100644
index 00000000000..a06c5ebfc88
--- /dev/null
+++ b/vendor/mvdan.cc/unparam/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 2017, Daniel Martí. 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 holder 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/mvdan.cc/unparam/check/check.go b/vendor/mvdan.cc/unparam/check/check.go
new file mode 100644
index 00000000000..7e753063a0c
--- /dev/null
+++ b/vendor/mvdan.cc/unparam/check/check.go
@@ -0,0 +1,979 @@
+// Copyright (c) 2017, Daniel Martí
+// See LICENSE for licensing information
+
+// Package check implements the unparam linter. Note that its API is not
+// stable.
+package check
+
+import (
+ "bytes"
+ "fmt"
+ "go/ast"
+ "go/constant"
+ "go/parser"
+ "go/printer"
+ "go/token"
+ "go/types"
+ "io"
+ "os"
+ "path/filepath"
+ "regexp"
+ "sort"
+ "strings"
+
+ "golang.org/x/tools/go/packages"
+ "golang.org/x/tools/go/ssa"
+ "golang.org/x/tools/go/ssa/ssautil"
+)
+
+// UnusedParams returns a list of human-readable issues that point out unused
+// function parameters.
+func UnusedParams(tests bool, exported, debug bool, args ...string) ([]string, error) {
+ wd, err := os.Getwd()
+ if err != nil {
+ return nil, err
+ }
+ c := &Checker{
+ wd: wd,
+ tests: tests,
+ exported: exported,
+ }
+ if debug {
+ c.debugLog = os.Stderr
+ }
+ return c.lines(args...)
+}
+
+// Checker finds unused parameterss in a program. You probably want to use
+// UnusedParams instead, unless you want to use a *loader.Program and
+// *ssa.Program directly.
+type Checker struct {
+ pkgs []*packages.Package
+ prog *ssa.Program
+
+ wd string
+
+ tests bool
+ exported bool
+ debugLog io.Writer
+
+ issues []Issue
+
+ cachedDeclCounts map[string]map[string]int
+
+ // callByPos maps from a call site position to its CallExpr.
+ callByPos map[token.Pos]*ast.CallExpr
+
+ // funcBodyByPos maps from a function position to its body. We can't map
+ // to the declaration, as that could be either a FuncDecl or FuncLit.
+ funcBodyByPos map[token.Pos]*ast.BlockStmt
+
+ // typesImplementing records the method names that each named type needs
+ // to typecheck properly, as they're required to implement interfaces.
+ typesImplementing map[*types.Named][]string
+
+ // localCallSites is a very simple form of a callgraph, only recording
+ // direct function calls within a single package.
+ localCallSites map[*ssa.Function][]ssa.CallInstruction
+
+ // These three maps record whether an entire func's signature cannot be
+ // changed, or only its list of parameters or results.
+
+ signRequiredBy map[*ssa.Function]string
+ paramsRequiredBy map[*ssa.Function]string
+ resultsRequiredBy map[*ssa.Function]string
+}
+
+var errorType = types.Universe.Lookup("error").Type()
+
+// lines runs the checker and returns the list of readable issues.
+func (c *Checker) lines(args ...string) ([]string, error) {
+ cfg := &packages.Config{
+ Mode: packages.LoadSyntax,
+ Tests: c.tests,
+ }
+ pkgs, err := packages.Load(cfg, args...)
+ if err != nil {
+ return nil, err
+ }
+ if packages.PrintErrors(pkgs) > 0 {
+ return nil, fmt.Errorf("encountered errors")
+ }
+
+ prog, _ := ssautil.Packages(pkgs, 0)
+ prog.Build()
+ c.Packages(pkgs)
+ c.ProgramSSA(prog)
+ issues, err := c.Check()
+ if err != nil {
+ return nil, err
+ }
+ lines := make([]string, 0, len(issues))
+ prevLine := ""
+ for _, issue := range issues {
+ fpos := prog.Fset.Position(issue.Pos()).String()
+ if strings.HasPrefix(fpos, c.wd) {
+ fpos = fpos[len(c.wd)+1:]
+ }
+ line := fmt.Sprintf("%s: %s", fpos, issue.Message())
+ if line == prevLine {
+ // Deduplicate lines, since we may look at the same
+ // package multiple times if tests are involved.
+ // TODO: is there a better way to handle this?
+ continue
+ }
+ prevLine = line
+ lines = append(lines, fmt.Sprintf("%s: %s", fpos, issue.Message()))
+ }
+ return lines, nil
+}
+
+// Issue identifies a found unused parameter.
+type Issue struct {
+ pos token.Pos
+ fname string
+ msg string
+}
+
+func (i Issue) Pos() token.Pos { return i.pos }
+func (i Issue) Message() string { return i.fname + " - " + i.msg }
+
+// Program supplies Checker with the needed *loader.Program.
+func (c *Checker) Packages(pkgs []*packages.Package) {
+ c.pkgs = pkgs
+}
+
+// ProgramSSA supplies Checker with the needed *ssa.Program.
+func (c *Checker) ProgramSSA(prog *ssa.Program) {
+ c.prog = prog
+}
+
+// CheckExportedFuncs sets whether to inspect exported functions
+func (c *Checker) CheckExportedFuncs(exported bool) {
+ c.exported = exported
+}
+
+func (c *Checker) debug(format string, a ...interface{}) {
+ if c.debugLog != nil {
+ fmt.Fprintf(c.debugLog, format, a...)
+ }
+}
+
+// generatedDoc reports whether a comment text describes its file as being code
+// generated.
+func generatedDoc(text string) bool {
+ return strings.Contains(text, "Code generated") ||
+ strings.Contains(text, "DO NOT EDIT")
+}
+
+// eqlConsts reports whether two constant values, possibly nil, are equal.
+func eqlConsts(c1, c2 *ssa.Const) bool {
+ if c1 == nil || c2 == nil {
+ return c1 == c2
+ }
+ if c1.Type() != c2.Type() {
+ return false
+ }
+ if c1.Value == nil || c2.Value == nil {
+ return c1.Value == c2.Value
+ }
+ return constant.Compare(c1.Value, token.EQL, c2.Value)
+}
+
+var stdSizes = types.SizesFor("gc", "amd64")
+
+// Check runs the unused parameter check and returns the list of found issues,
+// and any error encountered.
+func (c *Checker) Check() ([]Issue, error) {
+ c.cachedDeclCounts = make(map[string]map[string]int)
+ c.callByPos = make(map[token.Pos]*ast.CallExpr)
+ c.funcBodyByPos = make(map[token.Pos]*ast.BlockStmt)
+ c.typesImplementing = make(map[*types.Named][]string)
+
+ wantPkg := make(map[*types.Package]*packages.Package)
+ genFiles := make(map[string]bool)
+ for _, pkg := range c.pkgs {
+ wantPkg[pkg.Types] = pkg
+ for _, f := range pkg.Syntax {
+ if len(f.Comments) > 0 && generatedDoc(f.Comments[0].Text()) {
+ fname := c.prog.Fset.Position(f.Pos()).Filename
+ genFiles[fname] = true
+ }
+ ast.Inspect(f, func(node ast.Node) bool {
+ switch node := node.(type) {
+ case *ast.ValueSpec:
+ if len(node.Values) == 0 || node.Type == nil ||
+ len(node.Names) != 1 || node.Names[0].Name != "_" {
+ break
+ }
+ iface, ok := pkg.TypesInfo.TypeOf(node.Type).Underlying().(*types.Interface)
+ if !ok {
+ break
+ }
+ // var _ someIface = named
+ valTyp := pkg.TypesInfo.Types[node.Values[0]].Type
+ c.addImplementing(findNamed(valTyp), iface)
+ case *ast.CallExpr:
+ c.callByPos[node.Lparen] = node
+ // ssa.Function.Pos returns the declaring
+ // FuncLit.Type.Func or the position of the
+ // FuncDecl.Name.
+ case *ast.FuncDecl:
+ c.funcBodyByPos[node.Name.Pos()] = node.Body
+ case *ast.FuncLit:
+ c.funcBodyByPos[node.Pos()] = node.Body
+ }
+ return true
+ })
+ }
+ }
+ allFuncs := ssautil.AllFunctions(c.prog)
+
+ // map from *ssa.FreeVar to *ssa.Function, to find function literals
+ // behind closure vars in the simpler scenarios.
+ freeVars := map[*ssa.FreeVar]*ssa.Function{}
+ for curFunc := range allFuncs {
+ for _, b := range curFunc.Blocks {
+ for _, instr := range b.Instrs {
+ instr, ok := instr.(*ssa.MakeClosure)
+ if !ok {
+ continue
+ }
+ fn := instr.Fn.(*ssa.Function)
+ for i, fv := range fn.FreeVars {
+ binding := instr.Bindings[i]
+ alloc, ok := binding.(*ssa.Alloc)
+ if !ok {
+ continue
+ }
+ for _, ref := range *alloc.Referrers() {
+ store, ok := ref.(*ssa.Store)
+ if !ok {
+ continue
+ }
+ if fn, ok := store.Val.(*ssa.Function); ok {
+ freeVars[fv] = fn
+ break
+ }
+ }
+ }
+ }
+ }
+ }
+
+ c.signRequiredBy = make(map[*ssa.Function]string)
+ c.paramsRequiredBy = make(map[*ssa.Function]string)
+ c.resultsRequiredBy = make(map[*ssa.Function]string)
+ c.localCallSites = make(map[*ssa.Function][]ssa.CallInstruction)
+ for curFunc := range allFuncs {
+ if strings.HasPrefix(curFunc.Synthetic, "wrapper for func") {
+ // Synthetic func wrappers are uninteresting, and can
+ // lead to false negatives.
+ continue
+ }
+ for _, b := range curFunc.Blocks {
+ for _, instr := range b.Instrs {
+ if instr, ok := instr.(ssa.CallInstruction); ok {
+ if fn := findFunction(freeVars, instr.Common().Value); fn != nil {
+ c.localCallSites[fn] = append(c.localCallSites[fn], instr)
+ }
+ fn := receivesExtractedArgs(freeVars, instr)
+ if fn != nil {
+ // fn(someFunc()) fixes params
+ c.paramsRequiredBy[fn] = "forwarded call"
+ }
+ }
+ switch instr := instr.(type) {
+ case *ssa.Call:
+ for _, arg := range instr.Call.Args {
+ if fn := findFunction(freeVars, arg); fn != nil {
+ // someFunc(fn)
+ c.signRequiredBy[fn] = "call"
+ }
+ }
+ case *ssa.Phi:
+ for _, val := range instr.Edges {
+ if fn := findFunction(freeVars, val); fn != nil {
+ // nonConstVar = fn
+ c.signRequiredBy[fn] = "phi"
+ }
+ }
+ case *ssa.Return:
+ for _, val := range instr.Results {
+ if fn := findFunction(freeVars, val); fn != nil {
+ // return fn
+ c.signRequiredBy[fn] = "result"
+ }
+ }
+ if call := callExtract(instr, instr.Results); call != nil {
+ if fn := findFunction(freeVars, call.Call.Value); fn != nil {
+ // return fn()
+ c.resultsRequiredBy[fn] = "return"
+ }
+ }
+ case *ssa.Store:
+ as := ""
+ switch instr.Addr.(type) {
+ case *ssa.FieldAddr:
+ // x.someField = fn
+ as = "field"
+ case *ssa.IndexAddr:
+ // x[someIndex] = fn
+ as = "element"
+ case *ssa.Global:
+ // someGlobal = fn
+ as = "global"
+ default:
+ continue
+ }
+ if fn := findFunction(freeVars, instr.Val); fn != nil {
+ c.signRequiredBy[fn] = as
+ }
+ case *ssa.MakeInterface:
+ // someIface(named)
+ iface := instr.Type().Underlying().(*types.Interface)
+ c.addImplementing(findNamed(instr.X.Type()), iface)
+
+ if fn := findFunction(freeVars, instr.X); fn != nil {
+ // emptyIface = fn
+ c.signRequiredBy[fn] = "interface"
+ }
+ case *ssa.ChangeType:
+ if fn := findFunction(freeVars, instr.X); fn != nil {
+ // someType(fn)
+ c.signRequiredBy[fn] = "type conversion"
+ }
+ }
+ }
+ }
+ }
+
+ for fn := range allFuncs {
+ switch {
+ case fn.Pkg == nil: // builtin?
+ continue
+ case fn.Name() == "init":
+ continue
+ case len(fn.Blocks) == 0: // stub
+ continue
+ }
+ pkg := wantPkg[fn.Pkg.Pkg]
+ if pkg == nil { // not part of given pkgs
+ continue
+ }
+ if c.exported || fn.Pkg.Pkg.Name() == "main" {
+ // we want exported funcs, or this is a main package so
+ // nothing is exported
+ } else if strings.Contains(fn.Name(), "$") {
+ // anonymous function within a possibly exported func
+ } else if ast.IsExported(fn.Name()) {
+ continue // user doesn't want to change signatures here
+ }
+ fname := c.prog.Fset.Position(fn.Pos()).Filename
+ if genFiles[fname] {
+ continue // generated file
+ }
+
+ c.checkFunc(fn, pkg)
+ }
+ sort.Slice(c.issues, func(i, j int) bool {
+ p1 := c.prog.Fset.Position(c.issues[i].Pos())
+ p2 := c.prog.Fset.Position(c.issues[j].Pos())
+ if p1.Filename == p2.Filename {
+ return p1.Offset < p2.Offset
+ }
+ return p1.Filename < p2.Filename
+ })
+ return c.issues, nil
+}
+
+func stringsContains(list []string, elem string) bool {
+ for _, e := range list {
+ if e == elem {
+ return true
+ }
+ }
+ return false
+}
+
+func (c *Checker) addImplementing(named *types.Named, iface *types.Interface) {
+ if named == nil || iface == nil {
+ return
+ }
+ list := c.typesImplementing[named]
+ for i := 0; i < iface.NumMethods(); i++ {
+ name := iface.Method(i).Name()
+ if !stringsContains(list, name) {
+ list = append(list, name)
+ }
+ }
+ c.typesImplementing[named] = list
+}
+
+func findNamed(typ types.Type) *types.Named {
+ switch typ := typ.(type) {
+ case *types.Pointer:
+ return findNamed(typ.Elem())
+ case *types.Named:
+ return typ
+ }
+ return nil
+}
+
+// findFunction returns the function that is behind a value, if any.
+func findFunction(freeVars map[*ssa.FreeVar]*ssa.Function, value ssa.Value) *ssa.Function {
+ switch value := value.(type) {
+ case *ssa.Function:
+ name := value.Name()
+ if strings.HasSuffix(name, "$thunk") || strings.HasSuffix(name, "$bound") {
+ // Method wrapper funcs contain a single block, which
+ // calls the function being wrapped, and returns. We
+ // want the function being wrapped.
+ for _, instr := range value.Blocks[0].Instrs {
+ call, ok := instr.(*ssa.Call)
+ if !ok {
+ continue
+ }
+ if callee := call.Call.StaticCallee(); callee != nil {
+ return callee
+ }
+ }
+ return nil // no static callee?
+ }
+ return value
+ case *ssa.MakeClosure:
+ // closure of a func
+ return findFunction(freeVars, value.Fn)
+ case *ssa.UnOp:
+ if value.Op != token.MUL {
+ break
+ }
+ if fv, ok := value.X.(*ssa.FreeVar); ok {
+ return freeVars[fv]
+ }
+ }
+ return nil
+}
+
+// addIssue records a newly found unused parameter.
+func (c *Checker) addIssue(fn *ssa.Function, pos token.Pos, format string, args ...interface{}) {
+ c.issues = append(c.issues, Issue{
+ pos: pos,
+ fname: fn.RelString(fn.Package().Pkg),
+ msg: fmt.Sprintf(format, args...),
+ })
+}
+
+// constValueString is cnst.Value.String() without panicking on untyped nils.
+func constValueString(cnst *ssa.Const) string {
+ if cnst.Value == nil {
+ return "nil"
+ }
+ return cnst.Value.String()
+}
+
+// checkFunc checks a single function for unused parameters.
+func (c *Checker) checkFunc(fn *ssa.Function, pkg *packages.Package) {
+ c.debug("func %s\n", fn.RelString(fn.Package().Pkg))
+ if dummyImpl(fn.Blocks[0]) { // panic implementation
+ c.debug(" skip - dummy implementation\n")
+ return
+ }
+ if by := c.signRequiredBy[fn]; by != "" {
+ c.debug(" skip - func signature required by %s\n", by)
+ return
+ }
+ if recv := fn.Signature.Recv(); recv != nil {
+ named := findNamed(recv.Type())
+ if stringsContains(c.typesImplementing[named], fn.Name()) {
+ c.debug(" skip - method required to implement an interface\n")
+ return
+ }
+ }
+ if c.multipleImpls(pkg, fn) {
+ c.debug(" skip - multiple implementations via build tags\n")
+ return
+ }
+ paramsBy := c.paramsRequiredBy[fn]
+ resultsBy := c.resultsRequiredBy[fn]
+ callSites := c.localCallSites[fn]
+
+ results := fn.Signature.Results()
+ sameConsts := make([]*ssa.Const, results.Len())
+ numRets := 0
+ allRetsExtracting := true
+ for _, block := range fn.Blocks {
+ if resultsBy != "" {
+ continue // we can't change the returns
+ }
+ last := block.Instrs[len(block.Instrs)-1]
+ ret, ok := last.(*ssa.Return)
+ if !ok {
+ continue
+ }
+ for i, val := range ret.Results {
+ if _, ok := val.(*ssa.Extract); !ok {
+ allRetsExtracting = false
+ }
+ cnst := constValue(val)
+ if numRets == 0 {
+ sameConsts[i] = cnst
+ } else if !eqlConsts(sameConsts[i], cnst) {
+ sameConsts[i] = nil
+ }
+ }
+ numRets++
+ }
+ for i, cnst := range sameConsts {
+ if cnst == nil {
+ // no consistent returned constant
+ continue
+ }
+ if cnst.Value != nil && numRets == 1 {
+ // just one return and it's not untyped nil (too many
+ // false positives)
+ continue
+ }
+ res := results.At(i)
+ name := paramDesc(i, res)
+ c.addIssue(fn, res.Pos(), "result %s is always %s", name, constValueString(cnst))
+ }
+
+resLoop:
+ for i := 0; i < results.Len(); i++ {
+ if resultsBy != "" {
+ continue // we can't change the returns
+ }
+ if allRetsExtracting {
+ continue
+ }
+ res := results.At(i)
+ if res.Type() == errorType {
+ // "error is never used" is less useful, and it's up to
+ // tools like errcheck anyway.
+ continue
+ }
+ count := 0
+ for _, site := range callSites {
+ val := site.Value()
+ if val == nil { // e.g. go statement
+ count++
+ continue
+ }
+ for _, instr := range *val.Referrers() {
+ extract, ok := instr.(*ssa.Extract)
+ if !ok {
+ continue resLoop // direct, real use
+ }
+ if extract.Index != i {
+ continue // not the same result param
+ }
+ if len(*extract.Referrers()) > 0 {
+ continue resLoop // real use after extraction
+ }
+ }
+ count++
+ }
+ if count < 2 {
+ continue // require ignoring at least twice
+ }
+ name := paramDesc(i, res)
+ c.addIssue(fn, res.Pos(), "result %s is never used", name)
+ }
+
+ for i, par := range fn.Params {
+ if paramsBy != "" {
+ continue // we can't change the params
+ }
+ if i == 0 && fn.Signature.Recv() != nil { // receiver
+ continue
+ }
+ c.debug("%s\n", par.String())
+ switch par.Object().Name() {
+ case "", "_": // unnamed
+ c.debug(" skip - unnamed\n")
+ continue
+ }
+ if stdSizes.Sizeof(par.Type()) == 0 {
+ c.debug(" skip - zero size\n")
+ continue
+ }
+ reason := "is unused"
+ constStr := c.alwaysReceivedConst(callSites, par, i)
+ if constStr != "" {
+ reason = fmt.Sprintf("always receives %s", constStr)
+ } else if c.anyRealUse(par, i, pkg) {
+ c.debug(" skip - used somewhere in the func body\n")
+ continue
+ }
+ c.addIssue(fn, par.Pos(), "%s %s", par.Name(), reason)
+ }
+}
+
+// nodeStr stringifies a syntax tree node. It is only meant for simple nodes,
+// such as short value expressions.
+func nodeStr(node ast.Node) string {
+ var buf bytes.Buffer
+ fset := token.NewFileSet()
+ if err := printer.Fprint(&buf, fset, node); err != nil {
+ panic(err)
+ }
+ return buf.String()
+}
+
+// alwaysReceivedConst checks if a function parameter always receives the same
+// constant value, given a list of inbound calls. If it does, a description of
+// the value is returned. If not, an empty string is returned.
+//
+// This function is used to recommend that the parameter be replaced by a direct
+// use of the constant. To avoid false positives, the function will return false
+// if the number of inbound calls is too low.
+func (c *Checker) alwaysReceivedConst(callSites []ssa.CallInstruction, par *ssa.Parameter, pos int) string {
+ if len(callSites) < 4 {
+ // We can't possibly receive the same constant value enough
+ // times, hence a potential false positive.
+ return ""
+ }
+ if ast.IsExported(par.Parent().Name()) {
+ // we might not have all call sites for an exported func
+ return ""
+ }
+ var seen *ssa.Const
+ origPos := pos
+ if par.Parent().Signature.Recv() != nil {
+ // go/ast's CallExpr.Args does not include the receiver, but
+ // go/ssa's equivalent does.
+ origPos--
+ }
+ seenOrig := ""
+ for _, site := range callSites {
+ call := site.Common()
+ if pos >= len(call.Args) {
+ // TODO: investigate? Weird crash in
+ // internal/x/net/http2/hpack/hpack_test.go, where we
+ // roughly do: "at := d.mustAt; at(3)".
+ return ""
+ }
+ cnst := constValue(call.Args[pos])
+ if cnst == nil {
+ return "" // not a constant
+ }
+ origArg := ""
+ origCall := c.callByPos[call.Pos()]
+ if origPos >= len(origCall.Args) {
+ // variadic parameter that wasn't given
+ } else {
+ origArg = nodeStr(origCall.Args[origPos])
+ }
+ if seen == nil {
+ seen = cnst // first constant
+ seenOrig = origArg
+ } else if !eqlConsts(seen, cnst) {
+ return "" // different constants
+ } else if origArg != seenOrig {
+ seenOrig = ""
+ }
+ }
+ seenStr := constValueString(seen)
+ if seenOrig != "" && seenStr != seenOrig {
+ return fmt.Sprintf("%s (%s)", seenOrig, seenStr)
+ }
+ return seenStr
+}
+
+func constValue(value ssa.Value) *ssa.Const {
+ switch x := value.(type) {
+ case *ssa.Const:
+ return x
+ case *ssa.MakeInterface:
+ return constValue(x.X)
+ }
+ return nil
+}
+
+// anyRealUse reports whether a parameter has any relevant use within its
+// function body. Certain uses are ignored, such as recursive calls where the
+// parameter is re-used as itself.
+func (c *Checker) anyRealUse(par *ssa.Parameter, pos int, pkg *packages.Package) bool {
+ refs := *par.Referrers()
+ if len(refs) == 0 {
+ // Look for any uses like "_ = par", which are the developer's
+ // way to tell they want to keep the parameter. SSA does not
+ // keep that kind of statement around.
+ body := c.funcBodyByPos[par.Parent().Pos()]
+ any := false
+ ast.Inspect(body, func(node ast.Node) bool {
+ if any {
+ return false
+ }
+ asgn, ok := node.(*ast.AssignStmt)
+ if !ok || asgn.Tok != token.ASSIGN || len(asgn.Lhs) != 1 || len(asgn.Rhs) != 1 {
+ return true
+ }
+ if left, ok := asgn.Lhs[0].(*ast.Ident); !ok || left.Name != "_" {
+ return true
+ }
+ if right, ok := asgn.Rhs[0].(*ast.Ident); ok {
+ obj := pkg.TypesInfo.Uses[right]
+ if obj != nil && obj.Pos() == par.Pos() {
+ any = true
+ }
+ }
+ return true
+ })
+ return any
+ }
+refLoop:
+ for _, ref := range refs {
+ switch x := ref.(type) {
+ case *ssa.Call:
+ if x.Call.Value != par.Parent() {
+ return true // not a recursive call
+ }
+ for i, arg := range x.Call.Args {
+ if arg != par {
+ continue
+ }
+ if i == pos {
+ // reused directly in a recursive call
+ continue refLoop
+ }
+ }
+ return true
+ case *ssa.Store:
+ if insertedStore(x) {
+ continue // inserted by go/ssa, not from the code
+ }
+ return true
+ default:
+ return true
+ }
+ }
+ return false
+}
+
+// insertedStore reports whether a SSA instruction was inserted by the SSA
+// building algorithm. That is, the store was not directly translated from an
+// original Go statement.
+func insertedStore(instr ssa.Instruction) bool {
+ if instr.Pos() != token.NoPos {
+ return false
+ }
+ store, ok := instr.(*ssa.Store)
+ if !ok {
+ return false
+ }
+ alloc, ok := store.Addr.(*ssa.Alloc)
+ // we want exactly one use of this alloc value for it to be
+ // inserted by ssa and dummy - the alloc instruction itself.
+ return ok && len(*alloc.Referrers()) == 1
+}
+
+// rxHarmlessCall matches all the function expression strings which are allowed
+// in a dummy implementation.
+var rxHarmlessCall = regexp.MustCompile(`(?i)\b(log(ger)?|errors)\b|\bf?print|errorf?$`)
+
+// dummyImpl reports whether a block is a dummy implementation. This is
+// true if the block will almost immediately panic, throw or return
+// constants only.
+func dummyImpl(blk *ssa.BasicBlock) bool {
+ var ops [8]*ssa.Value
+ for _, instr := range blk.Instrs {
+ if insertedStore(instr) {
+ continue // inserted by go/ssa, not from the code
+ }
+ for _, val := range instr.Operands(ops[:0]) {
+ switch x := (*val).(type) {
+ case nil, *ssa.Const, *ssa.ChangeType, *ssa.Alloc,
+ *ssa.MakeInterface, *ssa.MakeMap,
+ *ssa.Function, *ssa.Global,
+ *ssa.IndexAddr, *ssa.Slice,
+ *ssa.UnOp, *ssa.Parameter:
+ case *ssa.Call:
+ if rxHarmlessCall.MatchString(x.Call.Value.String()) {
+ continue
+ }
+ default:
+ return false
+ }
+ }
+ switch x := instr.(type) {
+ case *ssa.Alloc, *ssa.Store, *ssa.UnOp, *ssa.BinOp,
+ *ssa.MakeInterface, *ssa.MakeMap, *ssa.Extract,
+ *ssa.IndexAddr, *ssa.FieldAddr, *ssa.Slice,
+ *ssa.Lookup, *ssa.ChangeType, *ssa.TypeAssert,
+ *ssa.Convert, *ssa.ChangeInterface:
+ // non-trivial expressions in panic/log/print calls
+ case *ssa.Return, *ssa.Panic:
+ return true
+ case *ssa.Call:
+ if rxHarmlessCall.MatchString(x.Call.Value.String()) {
+ continue
+ }
+ return x.Call.Value.Name() == "throw" // runtime's panic
+ default:
+ return false
+ }
+ }
+ return false
+}
+
+// declCounts reports how many times a package's functions are declared. This is
+// used, for example, to find if a function has many implementations.
+//
+// Since this function parses all of the package's Go source files on disk, its
+// results are cached.
+func (c *Checker) declCounts(pkgDir string, pkgName string) map[string]int {
+ key := pkgDir + ":" + pkgName
+ if m, ok := c.cachedDeclCounts[key]; ok {
+ return m
+ }
+ fset := token.NewFileSet()
+ pkgs, err := parser.ParseDir(fset, pkgDir, nil, 0)
+ if err != nil {
+ // Don't panic or error here. In some part of the go/* libraries
+ // stack, we sometimes end up with a package directory that is
+ // wrong. That's not our fault, and we can't simply break the
+ // tool until we fix the underlying issue.
+ println(err.Error())
+ c.cachedDeclCounts[pkgDir] = nil
+ return nil
+ }
+ if len(pkgs) == 0 {
+ // TODO: investigate why this started happening after switching
+ // to go/packages
+ return nil
+ }
+ pkg := pkgs[pkgName]
+ count := make(map[string]int)
+ for _, file := range pkg.Files {
+ for _, decl := range file.Decls {
+ fd, ok := decl.(*ast.FuncDecl)
+ if !ok {
+ continue
+ }
+ name := recvPrefix(fd.Recv) + fd.Name.Name
+ count[name]++
+ }
+ }
+ c.cachedDeclCounts[key] = count
+ return count
+}
+
+// recvPrefix returns the string prefix for a receiver field list. Star
+// expressions are ignored, so as to conservatively assume that pointer and
+// non-pointer receivers may still implement the same function.
+//
+// For example, for "function (*Foo) Bar()", recvPrefix will return "Foo.".
+func recvPrefix(recv *ast.FieldList) string {
+ if recv == nil {
+ return ""
+ }
+ expr := recv.List[0].Type
+ for {
+ star, ok := expr.(*ast.StarExpr)
+ if !ok {
+ break
+ }
+ expr = star.X
+ }
+ id := expr.(*ast.Ident)
+ return id.Name + "."
+}
+
+// multipleImpls reports whether a function has multiple implementations in the
+// source code. For example, if there are different function bodies depending on
+// the operating system or architecture. That tends to mean that an unused
+// parameter in one implementation may not be unused in another.
+func (c *Checker) multipleImpls(pkg *packages.Package, fn *ssa.Function) bool {
+ if fn.Parent() != nil { // nested func
+ return false
+ }
+ path := c.prog.Fset.Position(fn.Pos()).Filename
+ count := c.declCounts(filepath.Dir(path), pkg.Types.Name())
+ name := fn.Name()
+ if recv := fn.Signature.Recv(); recv != nil {
+ named := findNamed(recv.Type())
+ name = named.Obj().Name() + "." + name
+ }
+ return count[name] > 1
+}
+
+// receivesExtractedArgs returns the statically called function, if its multiple
+// arguments were all received via another function call. That is, if a call to
+// function "foo" was of the form "foo(bar())". This often means that the
+// parameters in "foo" are difficult to remove, even if unused.
+func receivesExtractedArgs(freeVars map[*ssa.FreeVar]*ssa.Function, call ssa.CallInstruction) *ssa.Function {
+ comm := call.Common()
+ callee := findFunction(freeVars, comm.Value)
+ if callee == nil {
+ return nil
+ }
+ if callee.Signature.Params().Len() < 2 {
+ // there aren't multiple parameters
+ return nil
+ }
+ args := comm.Args
+ if callee.Signature.Recv() != nil {
+ // skip the receiver argument
+ args = args[1:]
+ }
+ if c := callExtract(call, args); c != nil {
+ return callee
+ }
+ return nil
+}
+
+// callExtract returns the call instruction fn(...) if it is used directly as
+// arguments to the parent instruction, such as fn2(fn(...)) or return fn(...).
+func callExtract(parent ssa.Instruction, values []ssa.Value) *ssa.Call {
+ if len(values) == 1 {
+ if call, ok := values[0].(*ssa.Call); ok {
+ return call
+ }
+ }
+ var prev *ssa.Call
+ for i, val := range values {
+ ext, ok := val.(*ssa.Extract)
+ if !ok {
+ return nil
+ }
+ if ext.Index != i {
+ return nil // not extracted in the same order
+ }
+ call, ok := ext.Tuple.(*ssa.Call)
+ if !ok {
+ return nil // not a call
+ }
+ if prev == nil {
+ prev = call
+ } else if prev != call {
+ return nil // not the same calls
+ }
+ }
+ if prev == nil {
+ return nil
+ }
+ if prev.Call.Signature().Results().Len() != len(values) {
+ return nil // not extracting all the results
+ }
+ if prev.Pos() < parent.Pos() {
+ // Of the form:
+ //
+ // a, b := fn()
+ // fn2(a, b)
+ return nil
+ }
+ return prev
+}
+
+// paramDesc returns a string describing a parameter variable. If the parameter
+// had no name, the function will fall back to describing the parameter by its
+// position within the parameter list and its type.
+func paramDesc(i int, v *types.Var) string {
+ name := v.Name()
+ if name != "" && name != "_" {
+ return name
+ }
+ return fmt.Sprintf("%d (%s)", i, v.Type().String())
+}
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/LICENSE b/vendor/sourcegraph.com/sourcegraph/go-diff/LICENSE
new file mode 100644
index 00000000000..0733b6e5f29
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/LICENSE
@@ -0,0 +1,35 @@
+Copyright (c) 2014 Sourcegraph, Inc.
+
+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.
+
+-----------------------------------------------------------------
+
+Portions adapted from python-unidiff:
+
+Copyright (c) 2012 Matias Bordese
+
+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:
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.go b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.go
new file mode 100644
index 00000000000..646602a6cfc
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.go
@@ -0,0 +1,76 @@
+package diff
+
+import "bytes"
+
+// NOTE: types are code-generated in diff.pb.go.
+
+//go:generate protoc -I../../../.. -I ../../../../github.com/gogo/protobuf/protobuf -I. --gogo_out=. diff.proto
+
+// Stat computes the number of lines added/changed/deleted in all
+// hunks in this file's diff.
+func (d *FileDiff) Stat() Stat {
+ total := Stat{}
+ for _, h := range d.Hunks {
+ total.add(h.Stat())
+ }
+ return total
+}
+
+// Stat computes the number of lines added/changed/deleted in this
+// hunk.
+func (h *Hunk) Stat() Stat {
+ lines := bytes.Split(h.Body, []byte{'\n'})
+ var last byte
+ st := Stat{}
+ for _, line := range lines {
+ if len(line) == 0 {
+ last = 0
+ continue
+ }
+ switch line[0] {
+ case '-':
+ if last == '+' {
+ st.Added--
+ st.Changed++
+ last = 0 // next line can't change this one since this is already a change
+ } else {
+ st.Deleted++
+ last = line[0]
+ }
+ case '+':
+ if last == '-' {
+ st.Deleted--
+ st.Changed++
+ last = 0 // next line can't change this one since this is already a change
+ } else {
+ st.Added++
+ last = line[0]
+ }
+ default:
+ last = 0
+ }
+ }
+ return st
+}
+
+var (
+ hunkPrefix = []byte("@@ ")
+)
+
+const hunkHeader = "@@ -%d,%d +%d,%d @@"
+
+// diffTimeParseLayout is the layout used to parse the time in unified diff file
+// header timestamps.
+// See https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html.
+const diffTimeParseLayout = "2006-01-02 15:04:05 -0700"
+
+// diffTimeFormatLayout is the layout used to format (i.e., print) the time in unified diff file
+// header timestamps.
+// See https://www.gnu.org/software/diffutils/manual/html_node/Detailed-Unified.html.
+const diffTimeFormatLayout = "2006-01-02 15:04:05.000000000 -0700"
+
+func (s *Stat) add(o Stat) {
+ s.Added += o.Added
+ s.Changed += o.Changed
+ s.Deleted += o.Deleted
+}
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.pb.go b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.pb.go
new file mode 100644
index 00000000000..2e7c27fb4d9
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.pb.go
@@ -0,0 +1,1059 @@
+// Code generated by protoc-gen-gogo.
+// source: diff.proto
+// DO NOT EDIT!
+
+/*
+ Package diff is a generated protocol buffer package.
+
+ It is generated from these files:
+ diff.proto
+
+ It has these top-level messages:
+ FileDiff
+ Hunk
+ Stat
+*/
+package diff
+
+import proto "github.com/gogo/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// discarding unused import gogoproto "github.com/gogo/protobuf/gogoproto"
+import pbtypes "sourcegraph.com/sqs/pbtypes"
+
+import io "io"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// A FileDiff represents a unified diff for a single file.
+//
+// A file unified diff has a header that resembles the following:
+//
+// --- oldname 2009-10-11 15:12:20.000000000 -0700
+// +++ newname 2009-10-11 15:12:30.000000000 -0700
+type FileDiff struct {
+ // the original name of the file
+ OrigName string `protobuf:"bytes,1,opt,name=OrigName,proto3" json:"OrigName,omitempty"`
+ // the original timestamp (nil if not present)
+ OrigTime *pbtypes.Timestamp `protobuf:"bytes,2,opt,name=OrigTime" json:"OrigTime,omitempty"`
+ // the new name of the file (often same as OrigName)
+ NewName string `protobuf:"bytes,3,opt,name=NewName,proto3" json:"NewName,omitempty"`
+ // the new timestamp (nil if not present)
+ NewTime *pbtypes.Timestamp `protobuf:"bytes,4,opt,name=NewTime" json:"NewTime,omitempty"`
+ // extended header lines (e.g., git's "new mode ", "rename from ", etc.)
+ Extended []string `protobuf:"bytes,5,rep,name=Extended" json:"Extended,omitempty"`
+ // hunks that were changed from orig to new
+ Hunks []*Hunk `protobuf:"bytes,6,rep,name=Hunks" json:"Hunks,omitempty"`
+}
+
+func (m *FileDiff) Reset() { *m = FileDiff{} }
+func (m *FileDiff) String() string { return proto.CompactTextString(m) }
+func (*FileDiff) ProtoMessage() {}
+
+// A Hunk represents a series of changes (additions or deletions) in a file's
+// unified diff.
+type Hunk struct {
+ // starting line number in original file
+ OrigStartLine int32 `protobuf:"varint,1,opt,name=OrigStartLine,proto3" json:"OrigStartLine,omitempty"`
+ // number of lines the hunk applies to in the original file
+ OrigLines int32 `protobuf:"varint,2,opt,name=OrigLines,proto3" json:"OrigLines,omitempty"`
+ // if > 0, then the original file had a 'No newline at end of file' mark at this offset
+ OrigNoNewlineAt int32 `protobuf:"varint,3,opt,name=OrigNoNewlineAt,proto3" json:"OrigNoNewlineAt,omitempty"`
+ // starting line number in new file
+ NewStartLine int32 `protobuf:"varint,4,opt,name=NewStartLine,proto3" json:"NewStartLine,omitempty"`
+ // number of lines the hunk applies to in the new file
+ NewLines int32 `protobuf:"varint,5,opt,name=NewLines,proto3" json:"NewLines,omitempty"`
+ // optional section heading
+ Section string `protobuf:"bytes,6,opt,name=Section,proto3" json:"Section,omitempty"`
+ // 0-indexed line offset in unified file diff (including section headers); this is
+ // only set when Hunks are read from entire file diff (i.e., when ReadAllHunks is
+ // called) This accounts for hunk headers, too, so the StartPosition of the first
+ // hunk will be 1.
+ StartPosition int32 `protobuf:"varint,7,opt,name=StartPosition,proto3" json:"StartPosition,omitempty"`
+ // hunk body (lines prefixed with '-', '+', or ' ')
+ Body []byte `protobuf:"bytes,8,opt,name=Body,proto3" json:"Body,omitempty"`
+}
+
+func (m *Hunk) Reset() { *m = Hunk{} }
+func (m *Hunk) String() string { return proto.CompactTextString(m) }
+func (*Hunk) ProtoMessage() {}
+
+// A Stat is a diff stat that represents the number of lines added/changed/deleted.
+type Stat struct {
+ // number of lines added
+ Added int32 `protobuf:"varint,1,opt,name=Added,proto3" json:""`
+ // number of lines changed
+ Changed int32 `protobuf:"varint,2,opt,name=Changed,proto3" json:""`
+ // number of lines deleted
+ Deleted int32 `protobuf:"varint,3,opt,name=Deleted,proto3" json:""`
+}
+
+func (m *Stat) Reset() { *m = Stat{} }
+func (m *Stat) String() string { return proto.CompactTextString(m) }
+func (*Stat) ProtoMessage() {}
+
+func (m *FileDiff) Marshal() (data []byte, err error) {
+ size := m.Size()
+ data = make([]byte, size)
+ n, err := m.MarshalTo(data)
+ if err != nil {
+ return nil, err
+ }
+ return data[:n], nil
+}
+
+func (m *FileDiff) MarshalTo(data []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ if len(m.OrigName) > 0 {
+ data[i] = 0xa
+ i++
+ i = encodeVarintDiff(data, i, uint64(len(m.OrigName)))
+ i += copy(data[i:], m.OrigName)
+ }
+ if m.OrigTime != nil {
+ data[i] = 0x12
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.OrigTime.Size()))
+ n1, err := m.OrigTime.MarshalTo(data[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n1
+ }
+ if len(m.NewName) > 0 {
+ data[i] = 0x1a
+ i++
+ i = encodeVarintDiff(data, i, uint64(len(m.NewName)))
+ i += copy(data[i:], m.NewName)
+ }
+ if m.NewTime != nil {
+ data[i] = 0x22
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.NewTime.Size()))
+ n2, err := m.NewTime.MarshalTo(data[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n2
+ }
+ if len(m.Extended) > 0 {
+ for _, s := range m.Extended {
+ data[i] = 0x2a
+ i++
+ l = len(s)
+ for l >= 1<<7 {
+ data[i] = uint8(uint64(l)&0x7f | 0x80)
+ l >>= 7
+ i++
+ }
+ data[i] = uint8(l)
+ i++
+ i += copy(data[i:], s)
+ }
+ }
+ if len(m.Hunks) > 0 {
+ for _, msg := range m.Hunks {
+ data[i] = 0x32
+ i++
+ i = encodeVarintDiff(data, i, uint64(msg.Size()))
+ n, err := msg.MarshalTo(data[i:])
+ if err != nil {
+ return 0, err
+ }
+ i += n
+ }
+ }
+ return i, nil
+}
+
+func (m *Hunk) Marshal() (data []byte, err error) {
+ size := m.Size()
+ data = make([]byte, size)
+ n, err := m.MarshalTo(data)
+ if err != nil {
+ return nil, err
+ }
+ return data[:n], nil
+}
+
+func (m *Hunk) MarshalTo(data []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ if m.OrigStartLine != 0 {
+ data[i] = 0x8
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.OrigStartLine))
+ }
+ if m.OrigLines != 0 {
+ data[i] = 0x10
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.OrigLines))
+ }
+ if m.OrigNoNewlineAt != 0 {
+ data[i] = 0x18
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.OrigNoNewlineAt))
+ }
+ if m.NewStartLine != 0 {
+ data[i] = 0x20
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.NewStartLine))
+ }
+ if m.NewLines != 0 {
+ data[i] = 0x28
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.NewLines))
+ }
+ if len(m.Section) > 0 {
+ data[i] = 0x32
+ i++
+ i = encodeVarintDiff(data, i, uint64(len(m.Section)))
+ i += copy(data[i:], m.Section)
+ }
+ if m.StartPosition != 0 {
+ data[i] = 0x38
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.StartPosition))
+ }
+ if m.Body != nil {
+ if len(m.Body) > 0 {
+ data[i] = 0x42
+ i++
+ i = encodeVarintDiff(data, i, uint64(len(m.Body)))
+ i += copy(data[i:], m.Body)
+ }
+ }
+ return i, nil
+}
+
+func (m *Stat) Marshal() (data []byte, err error) {
+ size := m.Size()
+ data = make([]byte, size)
+ n, err := m.MarshalTo(data)
+ if err != nil {
+ return nil, err
+ }
+ return data[:n], nil
+}
+
+func (m *Stat) MarshalTo(data []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ if m.Added != 0 {
+ data[i] = 0x8
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.Added))
+ }
+ if m.Changed != 0 {
+ data[i] = 0x10
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.Changed))
+ }
+ if m.Deleted != 0 {
+ data[i] = 0x18
+ i++
+ i = encodeVarintDiff(data, i, uint64(m.Deleted))
+ }
+ return i, nil
+}
+
+func encodeFixed64Diff(data []byte, offset int, v uint64) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ data[offset+4] = uint8(v >> 32)
+ data[offset+5] = uint8(v >> 40)
+ data[offset+6] = uint8(v >> 48)
+ data[offset+7] = uint8(v >> 56)
+ return offset + 8
+}
+func encodeFixed32Diff(data []byte, offset int, v uint32) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ return offset + 4
+}
+func encodeVarintDiff(data []byte, offset int, v uint64) int {
+ for v >= 1<<7 {
+ data[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ data[offset] = uint8(v)
+ return offset + 1
+}
+func (m *FileDiff) Size() (n int) {
+ var l int
+ _ = l
+ l = len(m.OrigName)
+ if l > 0 {
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ if m.OrigTime != nil {
+ l = m.OrigTime.Size()
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ l = len(m.NewName)
+ if l > 0 {
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ if m.NewTime != nil {
+ l = m.NewTime.Size()
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ if len(m.Extended) > 0 {
+ for _, s := range m.Extended {
+ l = len(s)
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ }
+ if len(m.Hunks) > 0 {
+ for _, e := range m.Hunks {
+ l = e.Size()
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ }
+ return n
+}
+
+func (m *Hunk) Size() (n int) {
+ var l int
+ _ = l
+ if m.OrigStartLine != 0 {
+ n += 1 + sovDiff(uint64(m.OrigStartLine))
+ }
+ if m.OrigLines != 0 {
+ n += 1 + sovDiff(uint64(m.OrigLines))
+ }
+ if m.OrigNoNewlineAt != 0 {
+ n += 1 + sovDiff(uint64(m.OrigNoNewlineAt))
+ }
+ if m.NewStartLine != 0 {
+ n += 1 + sovDiff(uint64(m.NewStartLine))
+ }
+ if m.NewLines != 0 {
+ n += 1 + sovDiff(uint64(m.NewLines))
+ }
+ l = len(m.Section)
+ if l > 0 {
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ if m.StartPosition != 0 {
+ n += 1 + sovDiff(uint64(m.StartPosition))
+ }
+ if m.Body != nil {
+ l = len(m.Body)
+ if l > 0 {
+ n += 1 + l + sovDiff(uint64(l))
+ }
+ }
+ return n
+}
+
+func (m *Stat) Size() (n int) {
+ var l int
+ _ = l
+ if m.Added != 0 {
+ n += 1 + sovDiff(uint64(m.Added))
+ }
+ if m.Changed != 0 {
+ n += 1 + sovDiff(uint64(m.Changed))
+ }
+ if m.Deleted != 0 {
+ n += 1 + sovDiff(uint64(m.Deleted))
+ }
+ return n
+}
+
+func sovDiff(x uint64) (n int) {
+ for {
+ n++
+ x >>= 7
+ if x == 0 {
+ break
+ }
+ }
+ return n
+}
+func sozDiff(x uint64) (n int) {
+ return sovDiff(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *FileDiff) Unmarshal(data []byte) error {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: FileDiff: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: FileDiff: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field OrigName", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ stringLen |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.OrigName = string(data[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field OrigTime", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.OrigTime == nil {
+ m.OrigTime = &pbtypes.Timestamp{}
+ }
+ if err := m.OrigTime.Unmarshal(data[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field NewName", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ stringLen |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.NewName = string(data[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 4:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field NewTime", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.NewTime == nil {
+ m.NewTime = &pbtypes.Timestamp{}
+ }
+ if err := m.NewTime.Unmarshal(data[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 5:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Extended", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ stringLen |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Extended = append(m.Extended, string(data[iNdEx:postIndex]))
+ iNdEx = postIndex
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Hunks", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ msglen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + msglen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Hunks = append(m.Hunks, &Hunk{})
+ if err := m.Hunks[len(m.Hunks)-1].Unmarshal(data[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipDiff(data[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthDiff
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Hunk) Unmarshal(data []byte) error {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Hunk: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Hunk: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field OrigStartLine", wireType)
+ }
+ m.OrigStartLine = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.OrigStartLine |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 2:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field OrigLines", wireType)
+ }
+ m.OrigLines = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.OrigLines |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 3:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field OrigNoNewlineAt", wireType)
+ }
+ m.OrigNoNewlineAt = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.OrigNoNewlineAt |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 4:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field NewStartLine", wireType)
+ }
+ m.NewStartLine = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.NewStartLine |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 5:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field NewLines", wireType)
+ }
+ m.NewLines = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.NewLines |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Section", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ stringLen |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Section = string(data[iNdEx:postIndex])
+ iNdEx = postIndex
+ case 7:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field StartPosition", wireType)
+ }
+ m.StartPosition = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.StartPosition |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 8:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Body", wireType)
+ }
+ var byteLen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ byteLen |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if byteLen < 0 {
+ return ErrInvalidLengthDiff
+ }
+ postIndex := iNdEx + byteLen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.Body = append([]byte{}, data[iNdEx:postIndex]...)
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipDiff(data[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthDiff
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func (m *Stat) Unmarshal(data []byte) error {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Stat: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Stat: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Added", wireType)
+ }
+ m.Added = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.Added |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 2:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Changed", wireType)
+ }
+ m.Changed = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.Changed |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 3:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Deleted", wireType)
+ }
+ m.Deleted = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.Deleted |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ default:
+ iNdEx = preIndex
+ skippy, err := skipDiff(data[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthDiff
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipDiff(data []byte) (n int, err error) {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if data[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ return iNdEx, nil
+ case 1:
+ iNdEx += 8
+ return iNdEx, nil
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ iNdEx += length
+ if length < 0 {
+ return 0, ErrInvalidLengthDiff
+ }
+ return iNdEx, nil
+ case 3:
+ for {
+ var innerWire uint64
+ var start int = iNdEx
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowDiff
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ innerWire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ innerWireType := int(innerWire & 0x7)
+ if innerWireType == 4 {
+ break
+ }
+ next, err := skipDiff(data[start:])
+ if err != nil {
+ return 0, err
+ }
+ iNdEx = start + next
+ }
+ return iNdEx, nil
+ case 4:
+ return iNdEx, nil
+ case 5:
+ iNdEx += 4
+ return iNdEx, nil
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ }
+ panic("unreachable")
+}
+
+var (
+ ErrInvalidLengthDiff = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowDiff = fmt.Errorf("proto: integer overflow")
+)
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.proto b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.proto
new file mode 100644
index 00000000000..8868970f6a3
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/diff.proto
@@ -0,0 +1,81 @@
+syntax = "proto3";
+package diff;
+
+import "github.com/gogo/protobuf/gogoproto/gogo.proto";
+import "sourcegraph.com/sqs/pbtypes/timestamp.proto";
+
+option (gogoproto.goproto_getters_all) = false;
+option (gogoproto.unmarshaler_all) = true;
+option (gogoproto.marshaler_all) = true;
+option (gogoproto.sizer_all) = true;
+
+// A FileDiff represents a unified diff for a single file.
+//
+// A file unified diff has a header that resembles the following:
+//
+// --- oldname 2009-10-11 15:12:20.000000000 -0700
+// +++ newname 2009-10-11 15:12:30.000000000 -0700
+message FileDiff {
+ // the original name of the file
+ string OrigName = 1;
+
+ // the original timestamp (nil if not present)
+ pbtypes.Timestamp OrigTime = 2;
+
+ // the new name of the file (often same as OrigName)
+ string NewName = 3;
+
+ // the new timestamp (nil if not present)
+ pbtypes.Timestamp NewTime = 4;
+
+ // extended header lines (e.g., git's "new mode ", "rename from ", etc.)
+ repeated string Extended = 5;
+
+ // hunks that were changed from orig to new
+ repeated Hunk Hunks = 6;
+}
+
+
+// A Hunk represents a series of changes (additions or deletions) in a file's
+// unified diff.
+message Hunk {
+ // starting line number in original file
+ int32 OrigStartLine = 1;
+
+ // number of lines the hunk applies to in the original file
+ int32 OrigLines = 2;
+
+ // if > 0, then the original file had a 'No newline at end of file' mark at this offset
+ int32 OrigNoNewlineAt = 3;
+
+ // starting line number in new file
+ int32 NewStartLine = 4;
+
+ // number of lines the hunk applies to in the new file
+ int32 NewLines = 5;
+
+ // optional section heading
+ string Section = 6;
+
+ // 0-indexed line offset in unified file diff (including section headers); this is
+ // only set when Hunks are read from entire file diff (i.e., when ReadAllHunks is
+ // called) This accounts for hunk headers, too, so the StartPosition of the first
+ // hunk will be 1.
+ int32 StartPosition = 7;
+
+ // hunk body (lines prefixed with '-', '+', or ' ')
+ bytes Body = 8;
+}
+
+// A Stat is a diff stat that represents the number of lines added/changed/deleted.
+message Stat {
+ // number of lines added
+ int32 Added = 1 [(gogoproto.jsontag) = ""];
+
+ // number of lines changed
+ int32 Changed = 2 [(gogoproto.jsontag) = ""];
+
+ // number of lines deleted
+ int32 Deleted = 3 [(gogoproto.jsontag) = ""];
+}
+
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/doc.go b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/doc.go
new file mode 100644
index 00000000000..01f06dd85cb
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/doc.go
@@ -0,0 +1,2 @@
+// Package diff provides a parser for unified diffs.
+package diff // import "sourcegraph.com/sourcegraph/go-diff/diff"
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/parse.go b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/parse.go
new file mode 100644
index 00000000000..1e77df48f5c
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/parse.go
@@ -0,0 +1,625 @@
+package diff
+
+import (
+ "bufio"
+ "bytes"
+ "errors"
+ "fmt"
+ "io"
+ "strings"
+ "time"
+
+ "sourcegraph.com/sqs/pbtypes"
+)
+
+// ParseMultiFileDiff parses a multi-file unified diff. It returns an error if parsing failed as a whole, but does its
+// best to parse as many files in the case of per-file errors. In the case of non-fatal per-file errors, the error
+// return value is null and the Errs field in the returned MultiFileDiff is set.
+func ParseMultiFileDiff(diff []byte) ([]*FileDiff, error) {
+ return NewMultiFileDiffReader(bytes.NewReader(diff)).ReadAllFiles()
+}
+
+// NewMultiFileDiffReader returns a new MultiFileDiffReader that reads
+// a multi-file unified diff from r.
+func NewMultiFileDiffReader(r io.Reader) *MultiFileDiffReader {
+ return &MultiFileDiffReader{reader: bufio.NewReader(r)}
+}
+
+// MultiFileDiffReader reads a multi-file unified diff.
+type MultiFileDiffReader struct {
+ line int
+ offset int64
+ reader *bufio.Reader
+
+ // TODO(sqs): line and offset tracking in multi-file diffs is broken; add tests and fix
+
+ // nextFileFirstLine is a line that was read by a HunksReader that
+ // was how it determined the hunk was complete. But to determine
+ // that, it needed to read the first line of the next file. We
+ // store nextFileFirstLine so we can "give the first line back" to
+ // the next file.
+ nextFileFirstLine []byte
+}
+
+// ReadFile reads the next file unified diff (including headers and
+// all hunks) from r. If there are no more files in the diff, it
+// returns error io.EOF.
+func (r *MultiFileDiffReader) ReadFile() (*FileDiff, error) {
+ fr := &FileDiffReader{
+ line: r.line,
+ offset: r.offset,
+ reader: r.reader,
+ fileHeaderLine: r.nextFileFirstLine,
+ }
+ r.nextFileFirstLine = nil
+
+ fd, err := fr.ReadAllHeaders()
+ if err != nil {
+ switch e := err.(type) {
+ case *ParseError:
+ if e.Err == ErrNoFileHeader || e.Err == ErrExtendedHeadersEOF {
+ return nil, io.EOF
+ }
+
+ case OverflowError:
+ r.nextFileFirstLine = []byte(e)
+ return fd, nil
+
+ default:
+ return nil, err
+ }
+ }
+
+ // Before reading hunks, check to see if there are any. If there
+ // aren't any, and there's another file after this file in the
+ // diff, then the hunks reader will complain ErrNoHunkHeader. It's
+ // not easy for us to tell from that error alone if that was
+ // caused by the lack of any hunks, or a malformatted hunk, so we
+ // need to perform the check here.
+ hr := fr.HunksReader()
+ line, err := readLine(r.reader)
+ if err != nil {
+ return fd, err
+ }
+ line = bytes.TrimSuffix(line, []byte{'\n'})
+ if bytes.HasPrefix(line, hunkPrefix) {
+ hr.nextHunkHeaderLine = line
+ fd.Hunks, err = hr.ReadAllHunks()
+ r.line = fr.line
+ r.offset = fr.offset
+ if err != nil {
+ if e0, ok := err.(*ParseError); ok {
+ if e, ok := e0.Err.(*ErrBadHunkLine); ok {
+ // This just means we finished reading the hunks for the
+ // current file. See the ErrBadHunkLine doc for more info.
+ r.nextFileFirstLine = e.Line
+ return fd, nil
+ }
+ }
+ return nil, err
+ }
+ } else {
+ // There weren't any hunks, so that line we peeked ahead at
+ // actually belongs to the next file. Put it back.
+ r.nextFileFirstLine = line
+ }
+
+ return fd, nil
+}
+
+// ReadAllFiles reads all file unified diffs (including headers and all
+// hunks) remaining in r.
+func (r *MultiFileDiffReader) ReadAllFiles() ([]*FileDiff, error) {
+ var ds []*FileDiff
+ for {
+ d, err := r.ReadFile()
+ if d != nil {
+ ds = append(ds, d)
+ }
+ if err == io.EOF {
+ return ds, nil
+ }
+ if err != nil {
+ return nil, err
+ }
+ }
+}
+
+// ParseFileDiff parses a file unified diff.
+func ParseFileDiff(diff []byte) (*FileDiff, error) {
+ return NewFileDiffReader(bytes.NewReader(diff)).Read()
+}
+
+// NewFileDiffReader returns a new FileDiffReader that reads a file
+// unified diff.
+func NewFileDiffReader(r io.Reader) *FileDiffReader {
+ return &FileDiffReader{reader: bufio.NewReader(r)}
+}
+
+// FileDiffReader reads a unified file diff.
+type FileDiffReader struct {
+ line int
+ offset int64
+ reader *bufio.Reader
+
+ // fileHeaderLine is the first file header line, set by:
+ //
+ // (1) ReadExtendedHeaders if it encroaches on a file header line
+ // (which it must to detect when extended headers are done); or
+ // (2) (*MultiFileDiffReader).ReadFile() if it encroaches on a
+ // file header line while reading the previous file's hunks (in a
+ // multi-file diff).
+ fileHeaderLine []byte
+}
+
+// Read reads a file unified diff, including headers and hunks, from r.
+func (r *FileDiffReader) Read() (*FileDiff, error) {
+ fd, err := r.ReadAllHeaders()
+ if err != nil {
+ return nil, err
+ }
+
+ fd.Hunks, err = r.HunksReader().ReadAllHunks()
+ if err != nil {
+ return nil, err
+ }
+
+ return fd, nil
+}
+
+// ReadAllHeaders reads the file headers and extended headers (if any)
+// from a file unified diff. It does not read hunks, and the returned
+// FileDiff's Hunks field is nil. To read the hunks, call the
+// (*FileDiffReader).HunksReader() method to get a HunksReader and
+// read hunks from that.
+func (r *FileDiffReader) ReadAllHeaders() (*FileDiff, error) {
+ var err error
+ fd := &FileDiff{}
+
+ fd.Extended, err = r.ReadExtendedHeaders()
+ if pe, ok := err.(*ParseError); ok && pe.Err == ErrExtendedHeadersEOF {
+ wasEmpty := handleEmpty(fd)
+ if wasEmpty {
+ return fd, nil
+ }
+ return fd, err
+ } else if _, ok := err.(OverflowError); ok {
+ handleEmpty(fd)
+ return fd, err
+ } else if err != nil {
+ return fd, err
+ }
+
+ var origTime, newTime *time.Time
+ fd.OrigName, fd.NewName, origTime, newTime, err = r.ReadFileHeaders()
+ if err != nil {
+ return nil, err
+ }
+ if origTime != nil {
+ ts := pbtypes.NewTimestamp(*origTime)
+ fd.OrigTime = &ts
+ }
+ if newTime != nil {
+ ts := pbtypes.NewTimestamp(*newTime)
+ fd.NewTime = &ts
+ }
+
+ return fd, nil
+}
+
+// HunksReader returns a new HunksReader that reads hunks from r. The
+// HunksReader's line and offset (used in error messages) is set to
+// start where the file diff header ended (which means errors have the
+// correct position information).
+func (r *FileDiffReader) HunksReader() *HunksReader {
+ return &HunksReader{
+ line: r.line,
+ offset: r.offset,
+ reader: r.reader,
+ }
+}
+
+// ReadFileHeaders reads the unified file diff header (the lines that
+// start with "---" and "+++" with the orig/new file names and
+// timestamps).
+func (r *FileDiffReader) ReadFileHeaders() (origName, newName string, origTimestamp, newTimestamp *time.Time, err error) {
+ origName, origTimestamp, err = r.readOneFileHeader([]byte("--- "))
+ if err != nil {
+ return "", "", nil, nil, err
+ }
+
+ newName, newTimestamp, err = r.readOneFileHeader([]byte("+++ "))
+ if err != nil {
+ return "", "", nil, nil, err
+ }
+
+ return origName, newName, origTimestamp, newTimestamp, nil
+}
+
+// readOneFileHeader reads one of the file headers (prefix should be
+// either "+++ " or "--- ").
+func (r *FileDiffReader) readOneFileHeader(prefix []byte) (filename string, timestamp *time.Time, err error) {
+ var line []byte
+
+ if r.fileHeaderLine == nil {
+ var err error
+ line, err = readLine(r.reader)
+ if err == io.EOF {
+ return "", nil, &ParseError{r.line, r.offset, ErrNoFileHeader}
+ } else if err != nil {
+ return "", nil, err
+ }
+ } else {
+ line = r.fileHeaderLine
+ r.fileHeaderLine = nil
+ }
+
+ if !bytes.HasPrefix(line, prefix) {
+ return "", nil, &ParseError{r.line, r.offset, ErrBadFileHeader}
+ }
+
+ r.offset += int64(len(line))
+ r.line++
+ line = line[len(prefix):]
+
+ trimmedLine := strings.TrimSpace(string(line)) // filenames that contain spaces may be terminated by a tab
+ parts := strings.SplitN(trimmedLine, "\t", 2)
+ filename = parts[0]
+ if len(parts) == 2 {
+ // Timestamp is optional, but this header has it.
+ ts, err := time.Parse(diffTimeParseLayout, parts[1])
+ if err != nil {
+ return "", nil, err
+ }
+ timestamp = &ts
+ }
+
+ return filename, timestamp, err
+}
+
+// OverflowError is returned when we have overflowed into the start
+// of the next file while reading extended headers.
+type OverflowError string
+
+func (e OverflowError) Error() string {
+ return fmt.Sprintf("overflowed into next file: %s", e)
+}
+
+// ReadExtendedHeaders reads the extended header lines, if any, from a
+// unified diff file (e.g., git's "diff --git a/foo.go b/foo.go", "new
+// mode ", "rename from ", etc.).
+func (r *FileDiffReader) ReadExtendedHeaders() ([]string, error) {
+ var xheaders []string
+ firstLine := true
+ for {
+ var line []byte
+ if r.fileHeaderLine == nil {
+ var err error
+ line, err = readLine(r.reader)
+ if err == io.EOF {
+ return xheaders, &ParseError{r.line, r.offset, ErrExtendedHeadersEOF}
+ } else if err != nil {
+ return xheaders, err
+ }
+ } else {
+ line = r.fileHeaderLine
+ r.fileHeaderLine = nil
+ }
+
+ if bytes.HasPrefix(line, []byte("diff --git ")) {
+ if firstLine {
+ firstLine = false
+ } else {
+ return xheaders, OverflowError(line)
+ }
+ }
+ if bytes.HasPrefix(line, []byte("--- ")) {
+ // We've reached the file header.
+ r.fileHeaderLine = line // pass to readOneFileHeader (see fileHeaderLine field doc)
+ return xheaders, nil
+ }
+
+ r.line++
+ r.offset += int64(len(line))
+ xheaders = append(xheaders, string(line))
+ }
+}
+
+// handleEmpty detects when FileDiff was an empty diff and will not have any hunks
+// that follow. It updates fd fields from the parsed extended headers.
+func handleEmpty(fd *FileDiff) (wasEmpty bool) {
+ switch {
+ case (len(fd.Extended) == 3 || len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[3], "Binary files ")) &&
+ strings.HasPrefix(fd.Extended[1], "new file mode ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
+
+ names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
+ fd.OrigName = "/dev/null"
+ fd.NewName = names[1]
+ return true
+ case (len(fd.Extended) == 3 || len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[3], "Binary files ")) &&
+ strings.HasPrefix(fd.Extended[1], "deleted file mode ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
+
+ names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
+ fd.OrigName = names[0]
+ fd.NewName = "/dev/null"
+ return true
+ case len(fd.Extended) == 4 && strings.HasPrefix(fd.Extended[2], "rename from ") && strings.HasPrefix(fd.Extended[3], "rename to ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
+ names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
+ fd.OrigName = names[0]
+ fd.NewName = names[1]
+ return true
+ case len(fd.Extended) == 3 && strings.HasPrefix(fd.Extended[2], "Binary files ") && strings.HasPrefix(fd.Extended[0], "diff --git "):
+ names := strings.SplitN(fd.Extended[0][len("diff --git "):], " ", 2)
+ fd.OrigName = names[0]
+ fd.NewName = names[1]
+ return true
+ default:
+ return false
+ }
+}
+
+var (
+ // ErrNoFileHeader is when a file unified diff has no file header
+ // (i.e., the lines that begin with "---" and "+++").
+ ErrNoFileHeader = errors.New("expected file header, got EOF")
+
+ // ErrBadFileHeader is when a file unified diff has a malformed
+ // file header (i.e., the lines that begin with "---" and "+++").
+ ErrBadFileHeader = errors.New("bad file header")
+
+ // ErrExtendedHeadersEOF is when an EOF was encountered while reading extended file headers, which means that there were no ---/+++ headers encountered before hunks (if any) began.
+ ErrExtendedHeadersEOF = errors.New("expected file header while reading extended headers, got EOF")
+)
+
+// ParseHunks parses hunks from a unified diff. The diff must consist
+// only of hunks and not include a file header; if it has a file
+// header, use ParseFileDiff.
+func ParseHunks(diff []byte) ([]*Hunk, error) {
+ r := NewHunksReader(bytes.NewReader(diff))
+ hunks, err := r.ReadAllHunks()
+ if err != nil {
+ return nil, err
+ }
+ return hunks, nil
+}
+
+// NewHunksReader returns a new HunksReader that reads unified diff hunks
+// from r.
+func NewHunksReader(r io.Reader) *HunksReader {
+ return &HunksReader{reader: bufio.NewReader(r)}
+}
+
+// A HunksReader reads hunks from a unified diff.
+type HunksReader struct {
+ line int
+ offset int64
+ hunk *Hunk
+ reader *bufio.Reader
+
+ nextHunkHeaderLine []byte
+}
+
+// ReadHunk reads one hunk from r. If there are no more hunks, it
+// returns error io.EOF.
+func (r *HunksReader) ReadHunk() (*Hunk, error) {
+ r.hunk = nil
+ lastLineFromOrig := true
+ var line []byte
+ var err error
+ for {
+ if r.nextHunkHeaderLine != nil {
+ // Use stored hunk header line that was scanned in at the
+ // completion of the previous hunk's ReadHunk.
+ line = r.nextHunkHeaderLine
+ r.nextHunkHeaderLine = nil
+ } else {
+ line, err = readLine(r.reader)
+ if err != nil {
+ if err == io.EOF && r.hunk != nil {
+ return r.hunk, nil
+ }
+ return nil, err
+ }
+ }
+
+ // Record position.
+ r.line++
+ r.offset += int64(len(line))
+
+ if r.hunk == nil {
+ // Check for presence of hunk header.
+ if !bytes.HasPrefix(line, hunkPrefix) {
+ return nil, &ParseError{r.line, r.offset, ErrNoHunkHeader}
+ }
+
+ // Parse hunk header.
+ r.hunk = &Hunk{}
+ items := []interface{}{
+ &r.hunk.OrigStartLine, &r.hunk.OrigLines,
+ &r.hunk.NewStartLine, &r.hunk.NewLines,
+ }
+ header, section, err := normalizeHeader(string(line))
+ if err != nil {
+ return nil, &ParseError{r.line, r.offset, err}
+ }
+ n, err := fmt.Sscanf(header, hunkHeader, items...)
+ if err != nil {
+ return nil, err
+ }
+ if n < len(items) {
+ return nil, &ParseError{r.line, r.offset, &ErrBadHunkHeader{header: string(line)}}
+ }
+
+ r.hunk.Section = section
+ } else {
+ // Read hunk body line.
+ if bytes.HasPrefix(line, hunkPrefix) {
+ // Saw start of new hunk, so this hunk is
+ // complete. But we've already read in the next hunk's
+ // header, so we need to be sure that the next call to
+ // ReadHunk starts with that header.
+ r.nextHunkHeaderLine = line
+
+ // Rewind position.
+ r.line--
+ r.offset -= int64(len(line))
+
+ return r.hunk, nil
+ }
+
+ if len(line) >= 1 && !linePrefix(line[0]) {
+ // Bad hunk header line. If we're reading a multi-file
+ // diff, this may be the end of the current
+ // file. Return a "rich" error that lets our caller
+ // handle that case.
+ return r.hunk, &ParseError{r.line, r.offset, &ErrBadHunkLine{Line: line}}
+ }
+ if bytes.Equal(line, []byte(noNewlineMessage)) {
+ if lastLineFromOrig {
+ // Retain the newline in the body (otherwise the
+ // diff line would be like "-a+b", where "+b" is
+ // the the next line of the new file, which is not
+ // validly formatted) but record that the orig had
+ // no newline.
+ r.hunk.OrigNoNewlineAt = int32(len(r.hunk.Body))
+ } else {
+ // Remove previous line's newline.
+ if len(r.hunk.Body) != 0 {
+ r.hunk.Body = r.hunk.Body[:len(r.hunk.Body)-1]
+ }
+ }
+ continue
+ }
+
+ if len(line) > 0 {
+ lastLineFromOrig = line[0] == '-'
+ }
+
+ r.hunk.Body = append(r.hunk.Body, line...)
+ r.hunk.Body = append(r.hunk.Body, '\n')
+ }
+ }
+}
+
+const noNewlineMessage = `\ No newline at end of file`
+
+// linePrefixes is the set of all characters a valid line in a diff
+// hunk can start with. '\' can appear in diffs when no newline is
+// present at the end of a file.
+// See: 'http://www.gnu.org/software/diffutils/manual/diffutils.html#Incomplete-Lines'
+var linePrefixes = []byte{' ', '-', '+', '\\'}
+
+// linePrefix returns true if 'c' is in 'linePrefixes'.
+func linePrefix(c byte) bool {
+ for _, p := range linePrefixes {
+ if p == c {
+ return true
+ }
+ }
+ return false
+}
+
+// normalizeHeader takes a header of the form:
+// "@@ -linestart[,chunksize] +linestart[,chunksize] @@ section"
+// and returns two strings, with the first in the form:
+// "@@ -linestart,chunksize +linestart,chunksize @@".
+// where linestart and chunksize are both integers. The second is the
+// optional section header. chunksize may be omitted from the header
+// if its value is 1. normalizeHeader returns an error if the header
+// is not in the correct format.
+func normalizeHeader(header string) (string, string, error) {
+ // Split the header into five parts: the first '@@', the two
+ // ranges, the last '@@', and the optional section.
+ pieces := strings.SplitN(header, " ", 5)
+ if len(pieces) < 4 {
+ return "", "", &ErrBadHunkHeader{header: header}
+ }
+
+ if pieces[0] != "@@" {
+ return "", "", &ErrBadHunkHeader{header: header}
+ }
+ for i := 1; i < 3; i++ {
+ if !strings.ContainsRune(pieces[i], ',') {
+ pieces[i] = pieces[i] + ",1"
+ }
+ }
+ if pieces[3] != "@@" {
+ return "", "", &ErrBadHunkHeader{header: header}
+ }
+
+ var section string
+ if len(pieces) == 5 {
+ section = pieces[4]
+ }
+ return strings.Join(pieces, " "), strings.TrimSpace(section), nil
+}
+
+// ReadAllHunks reads all remaining hunks from r. A successful call
+// returns err == nil, not err == EOF. Because ReadAllHunks is defined
+// to read until EOF, it does not treat end of file as an error to be
+// reported.
+func (r *HunksReader) ReadAllHunks() ([]*Hunk, error) {
+ var hunks []*Hunk
+ linesRead := int32(0)
+ for {
+ hunk, err := r.ReadHunk()
+ if err == io.EOF {
+ return hunks, nil
+ }
+ if hunk != nil {
+ linesRead++ // account for the hunk header line
+ hunk.StartPosition = linesRead
+ hunks = append(hunks, hunk)
+ linesRead += int32(bytes.Count(hunk.Body, []byte{'\n'}))
+ }
+ if err != nil {
+ return hunks, err
+ }
+ }
+}
+
+// A ParseError is a description of a unified diff syntax error.
+type ParseError struct {
+ Line int // Line where the error occurred
+ Offset int64 // Offset where the error occurred
+ Err error // The actual error
+}
+
+func (e *ParseError) Error() string {
+ return fmt.Sprintf("line %d, char %d: %s", e.Line, e.Offset, e.Err)
+}
+
+// ErrNoHunkHeader indicates that a unified diff hunk header was
+// expected but not found during parsing.
+var ErrNoHunkHeader = errors.New("no hunk header")
+
+// ErrBadHunkHeader indicates that a malformed unified diff hunk
+// header was encountered during parsing.
+type ErrBadHunkHeader struct {
+ header string
+}
+
+func (e *ErrBadHunkHeader) Error() string {
+ if e.header == "" {
+ return "bad hunk header"
+ }
+ return "bad hunk header: " + e.header
+}
+
+// ErrBadHunkLine is when a line not beginning with ' ', '-', '+', or
+// '\' is encountered while reading a hunk. In the context of reading
+// a single hunk or file, it is an unexpected error. In a multi-file
+// diff, however, it indicates that the current file's diff is
+// complete (and remaining diff data will describe another file
+// unified diff).
+type ErrBadHunkLine struct {
+ Line []byte
+}
+
+func (e *ErrBadHunkLine) Error() string {
+ m := "bad hunk line (does not start with ' ', '-', '+', or '\\')"
+ if len(e.Line) == 0 {
+ return m
+ }
+ return m + ": " + string(e.Line)
+}
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/print.go b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/print.go
new file mode 100644
index 00000000000..d440cb9ad1e
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/print.go
@@ -0,0 +1,140 @@
+package diff
+
+import (
+ "bytes"
+ "fmt"
+ "io"
+ "time"
+
+ "sourcegraph.com/sqs/pbtypes"
+)
+
+// PrintMultiFileDiff prints a multi-file diff in unified diff format.
+func PrintMultiFileDiff(ds []*FileDiff) ([]byte, error) {
+ var buf bytes.Buffer
+ for _, d := range ds {
+ diff, err := PrintFileDiff(d)
+ if err != nil {
+ return nil, err
+ }
+ if _, err := buf.Write(diff); err != nil {
+ return nil, err
+ }
+ }
+ return buf.Bytes(), nil
+}
+
+// PrintFileDiff prints a FileDiff in unified diff format.
+//
+// TODO(sqs): handle escaping whitespace/etc. chars in filenames
+func PrintFileDiff(d *FileDiff) ([]byte, error) {
+ var buf bytes.Buffer
+
+ for _, xheader := range d.Extended {
+ if _, err := fmt.Fprintln(&buf, xheader); err != nil {
+ return nil, err
+ }
+ }
+
+ if d.Hunks == nil {
+ return buf.Bytes(), nil
+ }
+
+ if err := printFileHeader(&buf, "--- ", d.OrigName, timePtr(d.OrigTime)); err != nil {
+ return nil, err
+ }
+ if err := printFileHeader(&buf, "+++ ", d.NewName, timePtr(d.NewTime)); err != nil {
+ return nil, err
+ }
+
+ ph, err := PrintHunks(d.Hunks)
+ if err != nil {
+ return nil, err
+ }
+
+ if _, err := buf.Write(ph); err != nil {
+ return nil, err
+ }
+ return buf.Bytes(), nil
+}
+
+func timePtr(ts *pbtypes.Timestamp) *time.Time {
+ if ts == nil {
+ return nil
+ }
+ t := ts.Time()
+ return &t
+}
+
+func printFileHeader(w io.Writer, prefix string, filename string, timestamp *time.Time) error {
+ if _, err := fmt.Fprint(w, prefix, filename); err != nil {
+ return err
+ }
+ if timestamp != nil {
+ if _, err := fmt.Fprint(w, "\t", timestamp.Format(diffTimeFormatLayout)); err != nil {
+ return err
+ }
+ }
+ if _, err := fmt.Fprintln(w); err != nil {
+ return err
+ }
+ return nil
+}
+
+// PrintHunks prints diff hunks in unified diff format.
+func PrintHunks(hunks []*Hunk) ([]byte, error) {
+ var buf bytes.Buffer
+ for _, hunk := range hunks {
+ _, err := fmt.Fprintf(&buf,
+ "@@ -%d,%d +%d,%d @@", hunk.OrigStartLine, hunk.OrigLines, hunk.NewStartLine, hunk.NewLines,
+ )
+ if err != nil {
+ return nil, err
+ }
+ if hunk.Section != "" {
+ _, err := fmt.Fprint(&buf, " ", hunk.Section)
+ if err != nil {
+ return nil, err
+ }
+ }
+ if _, err := fmt.Fprintln(&buf); err != nil {
+ return nil, err
+ }
+
+ if hunk.OrigNoNewlineAt == 0 {
+ if _, err := buf.Write(hunk.Body); err != nil {
+ return nil, err
+ }
+ } else {
+ if _, err := buf.Write(hunk.Body[:hunk.OrigNoNewlineAt]); err != nil {
+ return nil, err
+ }
+ if err := printNoNewlineMessage(&buf); err != nil {
+ return nil, err
+ }
+ if _, err := buf.Write(hunk.Body[hunk.OrigNoNewlineAt:]); err != nil {
+ return nil, err
+ }
+ }
+
+ if !bytes.HasSuffix(hunk.Body, []byte{'\n'}) {
+ if _, err := fmt.Fprintln(&buf); err != nil {
+ return nil, err
+ }
+ if err := printNoNewlineMessage(&buf); err != nil {
+ return nil, err
+ }
+ }
+ }
+ return buf.Bytes(), nil
+}
+
+func printNoNewlineMessage(w io.Writer) error {
+ if _, err := w.Write([]byte(noNewlineMessage)); err != nil {
+ return err
+ }
+ if _, err := fmt.Fprintln(w); err != nil {
+ return err
+ }
+ return nil
+}
diff --git a/vendor/sourcegraph.com/sourcegraph/go-diff/diff/reader_util.go b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/reader_util.go
new file mode 100644
index 00000000000..395fb7baf90
--- /dev/null
+++ b/vendor/sourcegraph.com/sourcegraph/go-diff/diff/reader_util.go
@@ -0,0 +1,37 @@
+package diff
+
+import (
+ "bufio"
+ "io"
+)
+
+// readLine is a helper that mimics the functionality of calling bufio.Scanner.Scan() and
+// bufio.Scanner.Bytes(), but without the token size limitation. It will read and return
+// the next line in the Reader with the trailing newline stripped. It will return an
+// io.EOF error when there is nothing left to read (at the start of the function call). It
+// will return any other errors it receives from the underlying call to ReadBytes.
+func readLine(r *bufio.Reader) ([]byte, error) {
+ line_, err := r.ReadBytes('\n')
+ if err == io.EOF {
+ if len(line_) == 0 {
+ return nil, io.EOF
+ }
+
+ // ReadBytes returned io.EOF, because it didn't find another newline, but there is
+ // still the remainder of the file to return as a line.
+ line := line_
+ return line, nil
+ } else if err != nil {
+ return nil, err
+ }
+ line := line_[0 : len(line_)-1]
+ return dropCR(line), nil
+}
+
+// dropCR drops a terminal \r from the data.
+func dropCR(data []byte) []byte {
+ if len(data) > 0 && data[len(data)-1] == '\r' {
+ return data[0 : len(data)-1]
+ }
+ return data
+}
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/LICENSE b/vendor/sourcegraph.com/sqs/pbtypes/LICENSE
new file mode 100644
index 00000000000..261eeb9e9f8
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/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/sourcegraph.com/sqs/pbtypes/README.md b/vendor/sourcegraph.com/sqs/pbtypes/README.md
new file mode 100644
index 00000000000..270f59756f9
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/README.md
@@ -0,0 +1,4 @@
+# pbtypes
+
+protobuf helper types
+
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/doc.go b/vendor/sourcegraph.com/sqs/pbtypes/doc.go
new file mode 100644
index 00000000000..8469fb7078b
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/doc.go
@@ -0,0 +1,3 @@
+// Package pbtypes contains protocol buffer types (Timestamp, Void,
+// etc.) and related helpers.
+package pbtypes // import "sourcegraph.com/sqs/pbtypes"
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/gen.go b/vendor/sourcegraph.com/sqs/pbtypes/gen.go
new file mode 100644
index 00000000000..a4d81cee64f
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/gen.go
@@ -0,0 +1,3 @@
+package pbtypes
+
+//go:generate gopathexec protoc -I$GOPATH/src -I$GOPATH/src/github.com/gogo/protobuf/protobuf -I$GOPATH/src/github.com/gengo/grpc-gateway/third_party/googleapis -I. --gogo_out=. timestamp.proto void.proto html.proto
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/html.pb.go b/vendor/sourcegraph.com/sqs/pbtypes/html.pb.go
new file mode 100644
index 00000000000..69add306874
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/html.pb.go
@@ -0,0 +1,287 @@
+// Code generated by protoc-gen-gogo.
+// source: html.proto
+// DO NOT EDIT!
+
+package pbtypes
+
+import proto "github.com/gogo/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// discarding unused import gogoproto "github.com/gogo/protobuf/gogoproto"
+
+import io "io"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// HTML is a type which marshals into {__html: "html code here"} to designate
+// that this value is sanitized HTML code, see
+// https://facebook.github.io/react/tips/dangerously-set-inner-html.html
+type HTML struct {
+ HTML string `protobuf:"bytes,1,opt,name=HTML,proto3" json:"__html"`
+}
+
+func (m *HTML) Reset() { *m = HTML{} }
+func (m *HTML) String() string { return proto.CompactTextString(m) }
+func (*HTML) ProtoMessage() {}
+
+func (m *HTML) Marshal() (data []byte, err error) {
+ size := m.Size()
+ data = make([]byte, size)
+ n, err := m.MarshalTo(data)
+ if err != nil {
+ return nil, err
+ }
+ return data[:n], nil
+}
+
+func (m *HTML) MarshalTo(data []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ if len(m.HTML) > 0 {
+ data[i] = 0xa
+ i++
+ i = encodeVarintHtml(data, i, uint64(len(m.HTML)))
+ i += copy(data[i:], m.HTML)
+ }
+ return i, nil
+}
+
+func encodeFixed64Html(data []byte, offset int, v uint64) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ data[offset+4] = uint8(v >> 32)
+ data[offset+5] = uint8(v >> 40)
+ data[offset+6] = uint8(v >> 48)
+ data[offset+7] = uint8(v >> 56)
+ return offset + 8
+}
+func encodeFixed32Html(data []byte, offset int, v uint32) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ return offset + 4
+}
+func encodeVarintHtml(data []byte, offset int, v uint64) int {
+ for v >= 1<<7 {
+ data[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ data[offset] = uint8(v)
+ return offset + 1
+}
+func (m *HTML) Size() (n int) {
+ var l int
+ _ = l
+ l = len(m.HTML)
+ if l > 0 {
+ n += 1 + l + sovHtml(uint64(l))
+ }
+ return n
+}
+
+func sovHtml(x uint64) (n int) {
+ for {
+ n++
+ x >>= 7
+ if x == 0 {
+ break
+ }
+ }
+ return n
+}
+func sozHtml(x uint64) (n int) {
+ return sovHtml(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *HTML) Unmarshal(data []byte) error {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowHtml
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: HTML: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: HTML: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field HTML", wireType)
+ }
+ var stringLen uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowHtml
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ stringLen |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ intStringLen := int(stringLen)
+ if intStringLen < 0 {
+ return ErrInvalidLengthHtml
+ }
+ postIndex := iNdEx + intStringLen
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ m.HTML = string(data[iNdEx:postIndex])
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipHtml(data[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthHtml
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipHtml(data []byte) (n int, err error) {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowHtml
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowHtml
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if data[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ return iNdEx, nil
+ case 1:
+ iNdEx += 8
+ return iNdEx, nil
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowHtml
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ iNdEx += length
+ if length < 0 {
+ return 0, ErrInvalidLengthHtml
+ }
+ return iNdEx, nil
+ case 3:
+ for {
+ var innerWire uint64
+ var start int = iNdEx
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowHtml
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ innerWire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ innerWireType := int(innerWire & 0x7)
+ if innerWireType == 4 {
+ break
+ }
+ next, err := skipHtml(data[start:])
+ if err != nil {
+ return 0, err
+ }
+ iNdEx = start + next
+ }
+ return iNdEx, nil
+ case 4:
+ return iNdEx, nil
+ case 5:
+ iNdEx += 4
+ return iNdEx, nil
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ }
+ panic("unreachable")
+}
+
+var (
+ ErrInvalidLengthHtml = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowHtml = fmt.Errorf("proto: integer overflow")
+)
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/html.proto b/vendor/sourcegraph.com/sqs/pbtypes/html.proto
new file mode 100644
index 00000000000..09be501d92d
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/html.proto
@@ -0,0 +1,16 @@
+syntax = "proto3";
+
+package pbtypes;
+
+import "github.com/gogo/protobuf/gogoproto/gogo.proto";
+
+option (gogoproto.unmarshaler_all) = true;
+option (gogoproto.marshaler_all) = true;
+option (gogoproto.sizer_all) = true;
+
+// HTML is a type which marshals into {__html: "html code here"} to designate
+// that this value is sanitized HTML code, see
+// https://facebook.github.io/react/tips/dangerously-set-inner-html.html
+message HTML {
+ string HTML = 1 [(gogoproto.jsontag) = "__html"];
+}
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/rawmessage.go b/vendor/sourcegraph.com/sqs/pbtypes/rawmessage.go
new file mode 100644
index 00000000000..625b0693013
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/rawmessage.go
@@ -0,0 +1,36 @@
+package pbtypes
+
+import "errors"
+
+// RawMessage is a raw encoded JSON object.
+// It implements json.Marshaler and json.Unmarshaler like json.RawMessage,
+// but also proto.Marshaler and proto.Unmarshaler.
+type RawMessage []byte
+
+// MarshalJSON returns *m as the JSON encoding of m.
+func (m *RawMessage) MarshalJSON() ([]byte, error) {
+ return *m, nil
+}
+
+// UnmarshalJSON sets *m to a copy of data.
+func (m *RawMessage) UnmarshalJSON(data []byte) error {
+ if m == nil {
+ return errors.New("pbtypes.RawMessage: UnmarshalJSON on nil pointer")
+ }
+ *m = append((*m)[0:0], data...)
+ return nil
+}
+
+// Marshal implements proto.Marshaler.
+func (m *RawMessage) Marshal() ([]byte, error) {
+ return *m, nil
+}
+
+// Unmarshal implements proto.Unmarshaler.
+func (m *RawMessage) Unmarshal(data []byte) error {
+ if m == nil {
+ return errors.New("pbtypes.RawMessage: Unmarshal on nil pointer")
+ }
+ *m = append((*m)[0:0], data...)
+ return nil
+}
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/timestamp.go b/vendor/sourcegraph.com/sqs/pbtypes/timestamp.go
new file mode 100644
index 00000000000..18ac6498ead
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/timestamp.go
@@ -0,0 +1,28 @@
+package pbtypes
+
+import (
+ "encoding/json"
+ "time"
+)
+
+// NewTimestamp creates a new Timestamp from a time.Time.
+func NewTimestamp(t time.Time) Timestamp {
+ return Timestamp{Seconds: t.Unix(), Nanos: int32(t.Nanosecond())}
+}
+
+func (t Timestamp) Time() time.Time {
+ return time.Unix(t.Seconds, int64(t.Nanos))
+}
+
+func (t Timestamp) MarshalJSON() ([]byte, error) {
+ return json.Marshal(t.Time())
+}
+
+func (t *Timestamp) UnmarshalJSON(data []byte) error {
+ var tm time.Time
+ if err := json.Unmarshal(data, &tm); err != nil {
+ return err
+ }
+ *t = NewTimestamp(tm)
+ return nil
+}
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/timestamp.pb.go b/vendor/sourcegraph.com/sqs/pbtypes/timestamp.pb.go
new file mode 100644
index 00000000000..d4c6bd092ff
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/timestamp.pb.go
@@ -0,0 +1,320 @@
+// Code generated by protoc-gen-gogo.
+// source: timestamp.proto
+// DO NOT EDIT!
+
+/*
+ Package pbtypes is a generated protocol buffer package.
+
+ It is generated from these files:
+ timestamp.proto
+ void.proto
+ html.proto
+
+ It has these top-level messages:
+ Timestamp
+ Void
+ HTML
+*/
+package pbtypes
+
+import proto "github.com/gogo/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// discarding unused import gogoproto "github.com/gogo/protobuf/gogoproto"
+
+import io "io"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+type Timestamp struct {
+ // Represents seconds of UTC time since Unix epoch
+ // 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
+ // 9999-12-31T23:59:59Z inclusive.
+ Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"`
+ // Non-negative fractions of a second at nanosecond resolution. Negative
+ // second values with fractions must still have non-negative nanos values
+ // that count forward in time. Must be from 0 to 999,999,999
+ // inclusive.
+ Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"`
+}
+
+func (m *Timestamp) Reset() { *m = Timestamp{} }
+func (m *Timestamp) String() string { return proto.CompactTextString(m) }
+func (*Timestamp) ProtoMessage() {}
+
+func (m *Timestamp) Marshal() (data []byte, err error) {
+ size := m.Size()
+ data = make([]byte, size)
+ n, err := m.MarshalTo(data)
+ if err != nil {
+ return nil, err
+ }
+ return data[:n], nil
+}
+
+func (m *Timestamp) MarshalTo(data []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ if m.Seconds != 0 {
+ data[i] = 0x8
+ i++
+ i = encodeVarintTimestamp(data, i, uint64(m.Seconds))
+ }
+ if m.Nanos != 0 {
+ data[i] = 0x10
+ i++
+ i = encodeVarintTimestamp(data, i, uint64(m.Nanos))
+ }
+ return i, nil
+}
+
+func encodeFixed64Timestamp(data []byte, offset int, v uint64) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ data[offset+4] = uint8(v >> 32)
+ data[offset+5] = uint8(v >> 40)
+ data[offset+6] = uint8(v >> 48)
+ data[offset+7] = uint8(v >> 56)
+ return offset + 8
+}
+func encodeFixed32Timestamp(data []byte, offset int, v uint32) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ return offset + 4
+}
+func encodeVarintTimestamp(data []byte, offset int, v uint64) int {
+ for v >= 1<<7 {
+ data[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ data[offset] = uint8(v)
+ return offset + 1
+}
+func (m *Timestamp) Size() (n int) {
+ var l int
+ _ = l
+ if m.Seconds != 0 {
+ n += 1 + sovTimestamp(uint64(m.Seconds))
+ }
+ if m.Nanos != 0 {
+ n += 1 + sovTimestamp(uint64(m.Nanos))
+ }
+ return n
+}
+
+func sovTimestamp(x uint64) (n int) {
+ for {
+ n++
+ x >>= 7
+ if x == 0 {
+ break
+ }
+ }
+ return n
+}
+func sozTimestamp(x uint64) (n int) {
+ return sovTimestamp(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *Timestamp) Unmarshal(data []byte) error {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Timestamp: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Timestamp: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Seconds", wireType)
+ }
+ m.Seconds = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.Seconds |= (int64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ case 2:
+ if wireType != 0 {
+ return fmt.Errorf("proto: wrong wireType = %d for field Nanos", wireType)
+ }
+ m.Nanos = 0
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ m.Nanos |= (int32(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ default:
+ iNdEx = preIndex
+ skippy, err := skipTimestamp(data[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthTimestamp
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipTimestamp(data []byte) (n int, err error) {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if data[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ return iNdEx, nil
+ case 1:
+ iNdEx += 8
+ return iNdEx, nil
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ iNdEx += length
+ if length < 0 {
+ return 0, ErrInvalidLengthTimestamp
+ }
+ return iNdEx, nil
+ case 3:
+ for {
+ var innerWire uint64
+ var start int = iNdEx
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowTimestamp
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ innerWire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ innerWireType := int(innerWire & 0x7)
+ if innerWireType == 4 {
+ break
+ }
+ next, err := skipTimestamp(data[start:])
+ if err != nil {
+ return 0, err
+ }
+ iNdEx = start + next
+ }
+ return iNdEx, nil
+ case 4:
+ return iNdEx, nil
+ case 5:
+ iNdEx += 4
+ return iNdEx, nil
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ }
+ panic("unreachable")
+}
+
+var (
+ ErrInvalidLengthTimestamp = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowTimestamp = fmt.Errorf("proto: integer overflow")
+)
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/timestamp.proto b/vendor/sourcegraph.com/sqs/pbtypes/timestamp.proto
new file mode 100644
index 00000000000..926aa4de6d6
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/timestamp.proto
@@ -0,0 +1,55 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// 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.
+
+// NOTE: Copied from src/google/protobuf/timestamp.proto in the
+// protobuf repository.
+
+syntax = "proto3";
+
+package pbtypes;
+
+import "github.com/gogo/protobuf/gogoproto/gogo.proto";
+
+option (gogoproto.unmarshaler_all) = true;
+option (gogoproto.marshaler_all) = true;
+option (gogoproto.sizer_all) = true;
+
+message Timestamp {
+ // Represents seconds of UTC time since Unix epoch
+ // 1970-01-01T00:00:00Z. Must be from from 0001-01-01T00:00:00Z to
+ // 9999-12-31T23:59:59Z inclusive.
+ int64 seconds = 1;
+
+ // Non-negative fractions of a second at nanosecond resolution. Negative
+ // second values with fractions must still have non-negative nanos values
+ // that count forward in time. Must be from 0 to 999,999,999
+ // inclusive.
+ int32 nanos = 2;
+}
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/void.pb.go b/vendor/sourcegraph.com/sqs/pbtypes/void.pb.go
new file mode 100644
index 00000000000..6e371dc10d7
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/void.pb.go
@@ -0,0 +1,247 @@
+// Code generated by protoc-gen-gogo.
+// source: void.proto
+// DO NOT EDIT!
+
+package pbtypes
+
+import proto "github.com/gogo/protobuf/proto"
+import fmt "fmt"
+import math "math"
+
+// discarding unused import gogoproto "github.com/gogo/protobuf/gogoproto"
+
+import io "io"
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// Void is an empty type used as the protobuf RPC method arg or result
+// for methods that take no parameters or yield no results,
+// respectively.
+type Void struct {
+}
+
+func (m *Void) Reset() { *m = Void{} }
+func (m *Void) String() string { return proto.CompactTextString(m) }
+func (*Void) ProtoMessage() {}
+
+func (m *Void) Marshal() (data []byte, err error) {
+ size := m.Size()
+ data = make([]byte, size)
+ n, err := m.MarshalTo(data)
+ if err != nil {
+ return nil, err
+ }
+ return data[:n], nil
+}
+
+func (m *Void) MarshalTo(data []byte) (int, error) {
+ var i int
+ _ = i
+ var l int
+ _ = l
+ return i, nil
+}
+
+func encodeFixed64Void(data []byte, offset int, v uint64) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ data[offset+4] = uint8(v >> 32)
+ data[offset+5] = uint8(v >> 40)
+ data[offset+6] = uint8(v >> 48)
+ data[offset+7] = uint8(v >> 56)
+ return offset + 8
+}
+func encodeFixed32Void(data []byte, offset int, v uint32) int {
+ data[offset] = uint8(v)
+ data[offset+1] = uint8(v >> 8)
+ data[offset+2] = uint8(v >> 16)
+ data[offset+3] = uint8(v >> 24)
+ return offset + 4
+}
+func encodeVarintVoid(data []byte, offset int, v uint64) int {
+ for v >= 1<<7 {
+ data[offset] = uint8(v&0x7f | 0x80)
+ v >>= 7
+ offset++
+ }
+ data[offset] = uint8(v)
+ return offset + 1
+}
+func (m *Void) Size() (n int) {
+ var l int
+ _ = l
+ return n
+}
+
+func sovVoid(x uint64) (n int) {
+ for {
+ n++
+ x >>= 7
+ if x == 0 {
+ break
+ }
+ }
+ return n
+}
+func sozVoid(x uint64) (n int) {
+ return sovVoid(uint64((x << 1) ^ uint64((int64(x) >> 63))))
+}
+func (m *Void) Unmarshal(data []byte) error {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowVoid
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: Void: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: Void: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ default:
+ iNdEx = preIndex
+ skippy, err := skipVoid(data[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if skippy < 0 {
+ return ErrInvalidLengthVoid
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
+func skipVoid(data []byte) (n int, err error) {
+ l := len(data)
+ iNdEx := 0
+ for iNdEx < l {
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowVoid
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ wire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ wireType := int(wire & 0x7)
+ switch wireType {
+ case 0:
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowVoid
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ iNdEx++
+ if data[iNdEx-1] < 0x80 {
+ break
+ }
+ }
+ return iNdEx, nil
+ case 1:
+ iNdEx += 8
+ return iNdEx, nil
+ case 2:
+ var length int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowVoid
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ length |= (int(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ iNdEx += length
+ if length < 0 {
+ return 0, ErrInvalidLengthVoid
+ }
+ return iNdEx, nil
+ case 3:
+ for {
+ var innerWire uint64
+ var start int = iNdEx
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return 0, ErrIntOverflowVoid
+ }
+ if iNdEx >= l {
+ return 0, io.ErrUnexpectedEOF
+ }
+ b := data[iNdEx]
+ iNdEx++
+ innerWire |= (uint64(b) & 0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ innerWireType := int(innerWire & 0x7)
+ if innerWireType == 4 {
+ break
+ }
+ next, err := skipVoid(data[start:])
+ if err != nil {
+ return 0, err
+ }
+ iNdEx = start + next
+ }
+ return iNdEx, nil
+ case 4:
+ return iNdEx, nil
+ case 5:
+ iNdEx += 4
+ return iNdEx, nil
+ default:
+ return 0, fmt.Errorf("proto: illegal wireType %d", wireType)
+ }
+ }
+ panic("unreachable")
+}
+
+var (
+ ErrInvalidLengthVoid = fmt.Errorf("proto: negative length found during unmarshaling")
+ ErrIntOverflowVoid = fmt.Errorf("proto: integer overflow")
+)
diff --git a/vendor/sourcegraph.com/sqs/pbtypes/void.proto b/vendor/sourcegraph.com/sqs/pbtypes/void.proto
new file mode 100644
index 00000000000..1119a98091a
--- /dev/null
+++ b/vendor/sourcegraph.com/sqs/pbtypes/void.proto
@@ -0,0 +1,14 @@
+syntax = "proto3";
+
+package pbtypes;
+
+import "github.com/gogo/protobuf/gogoproto/gogo.proto";
+
+option (gogoproto.unmarshaler_all) = true;
+option (gogoproto.marshaler_all) = true;
+option (gogoproto.sizer_all) = true;
+
+// Void is an empty type used as the protobuf RPC method arg or result
+// for methods that take no parameters or yield no results,
+// respectively.
+message Void {}