diff --git a/builder/linode/config.go b/builder/linode/config.go index fd4233827..548be2bc7 100644 --- a/builder/linode/config.go +++ b/builder/linode/config.go @@ -34,8 +34,6 @@ type Config struct { RootSSHKey string `mapstructure:"root_ssh_key"` ImageLabel string `mapstructure:"image_label"` Description string `mapstructure:"image_description"` - - interCtx interpolate.Context } func createRandomRootPassword() (string, error) { @@ -130,7 +128,7 @@ func (c *Config) Prepare(raws ...interface{}) ([]string, error) { for _, t := range c.Tags { if !tagRe.MatchString(t) { - errs = packer.MultiErrorAppend(errs, errors.New(fmt.Sprintf("invalid tag: %s", t))) + errs = packer.MultiErrorAppend(errs, fmt.Errorf("invalid tag: %s", t)) } } diff --git a/go.mod b/go.mod index 4af1d1c03..712d5ad24 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,6 @@ require ( github.com/digitalocean/go-libvirt v0.0.0-20190626172931-4d226dd6c437 // indirect github.com/digitalocean/go-qemu v0.0.0-20181112162955-dd7bb9c771b8 github.com/digitalocean/godo v1.11.1 - github.com/dnaeon/go-vcr v1.0.1 // indirect github.com/docker/docker v0.0.0-20180422163414-57142e89befe // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/dylanmei/iso8601 v0.1.0 // indirect @@ -45,6 +44,7 @@ require ( github.com/ghodss/yaml v1.0.0 // indirect github.com/go-ini/ini v1.25.4 github.com/go-ole/go-ole v1.2.4 // indirect + github.com/go-resty/resty/v2 v2.3.0 // indirect github.com/gobwas/glob v0.2.3 github.com/gocolly/colly v1.2.0 github.com/gofrs/flock v0.7.1 @@ -92,7 +92,7 @@ require ( github.com/klauspost/crc32 v0.0.0-20160114101742-999f3125931f // indirect github.com/klauspost/pgzip v0.0.0-20151221113845-47f36e165cec github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169 // indirect - github.com/linode/linodego v0.7.1 + github.com/linode/linodego v0.14.0 github.com/masterzen/azure-sdk-for-go v0.0.0-20161014135628-ee4f0065d00c // indirect github.com/masterzen/simplexml v0.0.0-20190410153822-31eea3082786 // indirect github.com/masterzen/winrm v0.0.0-20180224160350-7e40f93ae939 @@ -102,6 +102,7 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/go-testing-interface v1.0.3 // indirect github.com/mitchellh/go-vnc v0.0.0-20150629162542-723ed9867aed + github.com/mitchellh/gox v1.0.1 // indirect github.com/mitchellh/iochan v1.0.0 github.com/mitchellh/mapstructure v1.2.3 github.com/mitchellh/panicwrap v0.0.0-20170106182340-fce601fe5557 @@ -145,7 +146,7 @@ require ( github.com/zclconf/go-cty-yaml v1.0.1 golang.org/x/crypto v0.0.0-20200422194213-44a606286825 golang.org/x/mobile v0.0.0-20191130191448-5c0e7e404af8 - golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e + golang.org/x/net v0.0.0-20200602114024-627f9648deb9 golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd diff --git a/go.sum b/go.sum index 064612257..3ab49a66a 100644 --- a/go.sum +++ b/go.sum @@ -205,6 +205,10 @@ github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3I github.com/go-ldap/ldap v3.0.2+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc= github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +github.com/go-resty/resty/v2 v2.3.0 h1:JOOeAvjSlapTT92p8xiS19Zxev1neGikoHsXJeOq8So= +github.com/go-resty/resty/v2 v2.3.0/go.mod h1:UpN9CgLZNsv4e9XG50UU8xdI0F43UQ4HmxLBDwaroHU= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68= @@ -343,6 +347,7 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.1.0 h1:bPIoEKD27tNdebFGGxxYwcL4nepeY4j1QP23PFRGzg0= github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go-version v1.2.0 h1:3vNe/fWF5CBgRIguda1meWhsZHy3m8gCJ5wx+dIzX/E= @@ -429,6 +434,8 @@ github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3v github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/linode/linodego v0.7.1 h1:4WZmMpSA2NRwlPZcc0+4Gyn7rr99Evk9bnr0B3gXRKE= github.com/linode/linodego v0.7.1/go.mod h1:ga11n3ivecUrPCHN0rANxKmfWBJVkOXfLMZinAbj2sY= +github.com/linode/linodego v0.14.0 h1:0APKMjiVGyry2TTUVDiok72H6cWpFNMMrFWBFn14aFU= +github.com/linode/linodego v0.14.0/go.mod h1:2ce3S00NrDqJfp4i55ZuSlT0U3cKNELNYACWBPI8Tnw= 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-20190410153822-31eea3082786 h1:2ZKn+w/BJeL43sCxI2jhPLRv73oVVOjEKZjKkflyqxg= @@ -482,6 +489,8 @@ github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZX github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/gox v1.0.1 h1:x0jD3dcHk9a9xPSDN6YEL4xL6Qz0dvNYm8yZqui5chI= +github.com/mitchellh/gox v1.0.1/go.mod h1:ED6BioOGXMswlXa2zxfh/xdd5QhwYliBFn9V18Ap4z4= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -707,6 +716,7 @@ golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -715,6 +725,9 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e h1:3G+cUijn7XD+S4eJFddp53Pv7+slrESplyjG25HgL+k= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9 h1:pNX+40auqi2JqRfOP1akLGtYcn15TUbkhwuCO3foqqM= +golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421 h1:Wo7BWFiOk0QRFMLYMqJGFMd9CgUAcGx7V+qEg/h5IBI= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -904,6 +917,7 @@ gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.3.1 h1:SK5KegNXmKmqE342YYN2qPHEnUYeoMiXXl1poUlI+o4= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= diff --git a/vendor/gopkg.in/resty.v1/.gitignore b/vendor/github.com/go-resty/resty/v2/.gitignore similarity index 88% rename from vendor/gopkg.in/resty.v1/.gitignore rename to vendor/github.com/go-resty/resty/v2/.gitignore index 8aa2df43d..54910a04a 100644 --- a/vendor/gopkg.in/resty.v1/.gitignore +++ b/vendor/github.com/go-resty/resty/v2/.gitignore @@ -26,3 +26,6 @@ _testmain.go coverage.out coverage.txt go.sum + +# Exclude intellij IDE folders +.idea/* \ No newline at end of file diff --git a/vendor/gopkg.in/resty.v1/.travis.yml b/vendor/github.com/go-resty/resty/v2/.travis.yml similarity index 50% rename from vendor/gopkg.in/resty.v1/.travis.yml rename to vendor/github.com/go-resty/resty/v2/.travis.yml index d11002900..fa1ce907d 100644 --- a/vendor/gopkg.in/resty.v1/.travis.yml +++ b/vendor/github.com/go-resty/resty/v2/.travis.yml @@ -2,23 +2,16 @@ language: go sudo: false -go: -# - 1.3 -# - 1.4 -# - 1.5 -# - 1.6 -# - 1.7 -# - 1.8.x -# - 1.9.x - - 1.10.x - - 1.11.x +go: # use travis ci resource effectively, keep always latest 2 versions and tip :) + - 1.14.x + - 1.13.x - tip install: - go get -v -t ./... script: - - go test ./... -coverprofile=coverage.txt -covermode=atomic + - go test ./... -race -coverprofile=coverage.txt -covermode=atomic after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/gopkg.in/resty.v1/BUILD.bazel b/vendor/github.com/go-resty/resty/v2/BUILD.bazel similarity index 83% rename from vendor/gopkg.in/resty.v1/BUILD.bazel rename to vendor/github.com/go-resty/resty/v2/BUILD.bazel index 698c326c5..6c47cbbbf 100644 --- a/vendor/gopkg.in/resty.v1/BUILD.bazel +++ b/vendor/github.com/go-resty/resty/v2/BUILD.bazel @@ -6,7 +6,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") gazelle( name = "gazelle", command = "fix", - prefix = "gopkg.in/resty.v1", + prefix = "github.com/go-resty/resty/v2", ) go_library( @@ -15,7 +15,7 @@ go_library( ["*.go"], exclude = ["*_test.go"], ), - importpath = "gopkg.in/resty.v1", + importpath = "github.com/go-resty/resty/v2", visibility = ["//visibility:public"], deps = ["@org_golang_x_net//publicsuffix:go_default_library"], ) @@ -29,7 +29,7 @@ go_test( ), data = glob([".testdata/*"]), embed = [":go_default_library"], - importpath = "gopkg.in/resty.v1", + importpath = "github.com/go-resty/resty/v2", deps = [ "@org_golang_x_net//proxy:go_default_library", ], diff --git a/vendor/gopkg.in/resty.v1/LICENSE b/vendor/github.com/go-resty/resty/v2/LICENSE similarity index 94% rename from vendor/gopkg.in/resty.v1/LICENSE rename to vendor/github.com/go-resty/resty/v2/LICENSE index 5cf0a2f99..c9ae93e39 100644 --- a/vendor/gopkg.in/resty.v1/LICENSE +++ b/vendor/github.com/go-resty/resty/v2/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015-2019 Jeevanandam M., https://myjeeva.com +Copyright (c) 2015-2020 Jeevanandam M., https://myjeeva.com Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/gopkg.in/resty.v1/README.md b/vendor/github.com/go-resty/resty/v2/README.md similarity index 66% rename from vendor/gopkg.in/resty.v1/README.md rename to vendor/github.com/go-resty/resty/v2/README.md index 8305734db..4d2199150 100644 --- a/vendor/gopkg.in/resty.v1/README.md +++ b/vendor/github.com/go-resty/resty/v2/README.md @@ -4,54 +4,51 @@

Features section describes in detail about Resty capabilities

-

Build Status Code Coverage Go Report Card Release Version GoDoc License

+

Build Status Code Coverage Go Report Card Release Version GoDoc License Mentioned in Awesome Go

Resty Communication Channels

-

Chat on Gitter - Resty Community Twitter @go_resty

+

Chat on Gitter - Resty Community Twitter @go_resty

## News - * Resty `v2` development is in-progress :smile: - * v1.12.0 [released](https://github.com/go-resty/resty/releases/tag/v1.12.0) and tagged on Feb 27, 2019. - * v1.11.0 [released](https://github.com/go-resty/resty/releases/tag/v1.11.0) and tagged on Jan 06, 2019. - * v1.10.3 [released](https://github.com/go-resty/resty/releases/tag/v1.10.3) and tagged on Dec 04, 2018. + * v2.3.0 [released](https://github.com/go-resty/resty/releases/tag/v2.3.0) and tagged on May 20, 2020. + * v2.0.0 [released](https://github.com/go-resty/resty/releases/tag/v2.0.0) and tagged on Jul 16, 2019. + * v1.12.0 [released](https://github.com/go-resty/resty/releases/tag/v1.12.0) and tagged on Feb 27, 2019. * v1.0 released and tagged on Sep 25, 2017. - Resty's first version was released on Sep 15, 2015 then it grew gradually as a very handy and helpful library. Its been a two years since first release. I'm very thankful to Resty users and its [contributors](https://github.com/go-resty/resty/graphs/contributors). ## Features * GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS, etc. * Simple and chainable methods for settings and request - * Request Body can be `string`, `[]byte`, `struct`, `map`, `slice` and `io.Reader` too + * [Request](https://godoc.org/github.com/go-resty/resty#Request) Body can be `string`, `[]byte`, `struct`, `map`, `slice` and `io.Reader` too * Auto detects `Content-Type` * Buffer less processing for `io.Reader` - * [Response](https://godoc.org/gopkg.in/resty.v1#Response) object gives you more possibility + * Request Body can be read multiple times via `Request.RawRequest.GetBody()` + * [Response](https://godoc.org/github.com/go-resty/resty#Response) object gives you more possibility * Access as `[]byte` array - `response.Body()` OR Access as `string` - `response.String()` * Know your `response.Time()` and when we `response.ReceivedAt()` * Automatic marshal and unmarshal for `JSON` and `XML` content type * Default is `JSON`, if you supply `struct/map` without header `Content-Type` * For auto-unmarshal, refer to - - - Success scenario [Request.SetResult()](https://godoc.org/gopkg.in/resty.v1#Request.SetResult) and [Response.Result()](https://godoc.org/gopkg.in/resty.v1#Response.Result). - - Error scenario [Request.SetError()](https://godoc.org/gopkg.in/resty.v1#Request.SetError) and [Response.Error()](https://godoc.org/gopkg.in/resty.v1#Response.Error). + - Success scenario [Request.SetResult()](https://godoc.org/github.com/go-resty/resty#Request.SetResult) and [Response.Result()](https://godoc.org/github.com/go-resty/resty#Response.Result). + - Error scenario [Request.SetError()](https://godoc.org/github.com/go-resty/resty#Request.SetError) and [Response.Error()](https://godoc.org/github.com/go-resty/resty#Response.Error). - Supports [RFC7807](https://tools.ietf.org/html/rfc7807) - `application/problem+json` & `application/problem+xml` * Easy to upload one or more file(s) via `multipart/form-data` * Auto detects file content type - * Request URL [Path Params (aka URI Params)](https://godoc.org/gopkg.in/resty.v1#Request.SetPathParams) + * Request URL [Path Params (aka URI Params)](https://godoc.org/github.com/go-resty/resty#Request.SetPathParams) * Backoff Retry Mechanism with retry condition function [reference](retry_test.go) - * resty client HTTP & REST [Request](https://godoc.org/gopkg.in/resty.v1#Client.OnBeforeRequest) and [Response](https://godoc.org/gopkg.in/resty.v1#Client.OnAfterResponse) middlewares - * `Request.SetContext` supported `go1.7` and above + * Resty client HTTP & REST [Request](https://godoc.org/github.com/go-resty/resty#Client.OnBeforeRequest) and [Response](https://godoc.org/github.com/go-resty/resty#Client.OnAfterResponse) middlewares + * `Request.SetContext` supported * Authorization option of `BasicAuth` and `Bearer` token * Set request `ContentLength` value for all request or particular request - * Choose between HTTP and REST mode. Default is `REST` - * `HTTP` - default up to 10 redirects and no automatic response unmarshal - * `REST` - defaults to no redirects and automatic response marshal/unmarshal for `JSON` & `XML` - * Custom [Root Certificates](https://godoc.org/gopkg.in/resty.v1#Client.SetRootCertificate) and Client [Certificates](https://godoc.org/gopkg.in/resty.v1#Client.SetCertificates) - * Download/Save HTTP response directly into File, like `curl -o` flag. See [SetOutputDirectory](https://godoc.org/gopkg.in/resty.v1#Client.SetOutputDirectory) & [SetOutput](https://godoc.org/gopkg.in/resty.v1#Request.SetOutput). + * Custom [Root Certificates](https://godoc.org/github.com/go-resty/resty#Client.SetRootCertificate) and Client [Certificates](https://godoc.org/github.com/go-resty/resty#Client.SetCertificates) + * Download/Save HTTP response directly into File, like `curl -o` flag. See [SetOutputDirectory](https://godoc.org/github.com/go-resty/resty#Client.SetOutputDirectory) & [SetOutput](https://godoc.org/github.com/go-resty/resty#Request.SetOutput). * Cookies for your request and CookieJar support * SRV Record based request instead of Host URL * Client settings like `Timeout`, `RedirectPolicy`, `Proxy`, `TLSClientConfig`, `Transport`, etc. - * Optionally allows GET request with payload, see [SetAllowGetMethodPayload](https://godoc.org/gopkg.in/resty.v1#Client.SetAllowGetMethodPayload) + * Optionally allows GET request with payload, see [SetAllowGetMethodPayload](https://godoc.org/github.com/go-resty/resty#Client.SetAllowGetMethodPayload) * Supports registering external JSON library into resty, see [how to use](https://github.com/go-resty/resty/issues/76#issuecomment-314015250) * Exposes Response reader without reading response (no auto-unmarshaling) if need be, see [how to use](https://github.com/go-resty/resty/issues/87#issuecomment-322100604) * Option to specify expected `Content-Type` when response `Content-Type` header missing. Refer to [#92](https://github.com/go-resty/resty/issues/92) @@ -59,18 +56,16 @@ * Have client level settings & options and also override at Request level if you want to * Request and Response middlewares * Create Multiple clients if you want to `resty.New()` - * Supports `http.RoundTripper` implementation, see [SetTransport](https://godoc.org/gopkg.in/resty.v1#Client.SetTransport) + * Supports `http.RoundTripper` implementation, see [SetTransport](https://godoc.org/github.com/go-resty/resty#Client.SetTransport) * goroutine concurrent safe - * REST and HTTP modes + * Resty Client trace, see [Client.EnableTrace](https://godoc.org/github.com/go-resty/resty#Client.EnableTrace) and [Request.EnableTrace](https://godoc.org/github.com/go-resty/resty#Request.EnableTrace) * Debug mode - clean and informative logging presentation * Gzip - Go does it automatically also resty has fallback handling too * Works fine with `HTTP/2` and `HTTP/1.1` * [Bazel support](#bazel-support) - * Easily mock resty for testing, [for e.g.](#mocking-http-requests-using-httpmock-library) + * Easily mock Resty for testing, [for e.g.](#mocking-http-requests-using-httpmock-library) * Well tested client library -Resty works with `go1.3` and above. - ### Included Batteries * Redirect Policies - see [how to use](#redirect-policy) @@ -84,26 +79,16 @@ Resty works with `go1.3` and above. * SRV Record based request instead of Host URL [how to use](resty_test.go#L1412) * etc (upcoming - throw your idea's [here](https://github.com/go-resty/resty/issues)). -## Installation -#### Stable Version - Production Ready +#### Supported Go Versions -Please refer section [Versioning](#versioning) for detailed info. +Initially Resty started supporting `go modules` since `v1.10.0` release. -##### go.mod +Starting Resty v2 and higher versions, it fully embraces [go modules](https://github.com/golang/go/wiki/Modules) package release. It requires a Go version capable of understanding `/vN` suffixed imports: -```bash -require gopkg.in/resty.v1 v1.12.0 -``` - -##### go get -```bash -go get -u gopkg.in/resty.v1 -``` - -#### Heads up for upcoming Resty v2 - -Resty v2 release will be moving away from `gopkg.in` proxy versioning. It will completely follow and adpating Go Mod versioning recommendation. For e.g.: module definition would be `module github.com/go-resty/resty/v2`. +- 1.9.7+ +- 1.10.3+ +- 1.11+ ## It might be beneficial for your project :smile: @@ -111,58 +96,102 @@ Resty v2 release will be moving away from `gopkg.in` proxy versioning. It will c Resty author also published following projects for Go Community. * [aah framework](https://aahframework.org) - A secure, flexible, rapid Go web framework. - * [THUMBAI](https://thumbai.app), [Source Code](https://github.com/thumbai/thumbai) - Go Mod Repository, Go Vanity Service and Simple Proxy Server. + * [THUMBAI](https://thumbai.app) - Go Mod Repository, Go Vanity Service and Simple Proxy Server. * [go-model](https://github.com/jeevatkm/go-model) - Robust & Easy to use model mapper and utility methods for Go `struct`. + +## Installation + +```bash +# Go Modules +require github.com/go-resty/resty/v2 v2.3.0 +``` + ## Usage -The following samples will assist you to become as comfortable as possible with resty library. Resty comes with ready to use DefaultClient. - -Import resty into your code and refer it as `resty`. +The following samples will assist you to become as comfortable as possible with resty library. ```go -import "gopkg.in/resty.v1" +// Import resty into your code and refer it as `resty`. +import "github.com/go-resty/resty/v2" ``` #### Simple GET ```go -// GET request -resp, err := resty.R().Get("http://httpbin.org/get") +// Create a Resty Client +client := resty.New() -// explore response object -fmt.Printf("\nError: %v", err) -fmt.Printf("\nResponse Status Code: %v", resp.StatusCode()) -fmt.Printf("\nResponse Status: %v", resp.Status()) -fmt.Printf("\nResponse Time: %v", resp.Time()) -fmt.Printf("\nResponse Received At: %v", resp.ReceivedAt()) -fmt.Printf("\nResponse Body: %v", resp) // or resp.String() or string(resp.Body()) -// more... +resp, err := client.R(). + EnableTrace(). + Get("https://httpbin.org/get") + +// Explore response object +fmt.Println("Response Info:") +fmt.Println("Error :", err) +fmt.Println("Status Code:", resp.StatusCode()) +fmt.Println("Status :", resp.Status()) +fmt.Println("Proto :", resp.Proto()) +fmt.Println("Time :", resp.Time()) +fmt.Println("Received At:", resp.ReceivedAt()) +fmt.Println("Body :\n", resp) +fmt.Println() + +// Explore trace info +fmt.Println("Request Trace Info:") +ti := resp.Request.TraceInfo() +fmt.Println("DNSLookup :", ti.DNSLookup) +fmt.Println("ConnTime :", ti.ConnTime) +fmt.Println("TCPConnTime :", ti.TCPConnTime) +fmt.Println("TLSHandshake :", ti.TLSHandshake) +fmt.Println("ServerTime :", ti.ServerTime) +fmt.Println("ResponseTime :", ti.ResponseTime) +fmt.Println("TotalTime :", ti.TotalTime) +fmt.Println("IsConnReused :", ti.IsConnReused) +fmt.Println("IsConnWasIdle:", ti.IsConnWasIdle) +fmt.Println("ConnIdleTime :", ti.ConnIdleTime) /* Output -Error: -Response Status Code: 200 -Response Status: 200 OK -Response Time: 160.1151ms -Response Received At: 2018-10-16 16:28:34.8595663 -0700 PDT m=+0.166119401 -Response Body: { +Response Info: +Error : +Status Code: 200 +Status : 200 OK +Proto : HTTP/2.0 +Time : 475.611189ms +Received At: 2020-05-19 00:11:06.828188 -0700 PDT m=+0.476510773 +Body : + { "args": {}, "headers": { "Accept-Encoding": "gzip", - "Connection": "close", "Host": "httpbin.org", - "User-Agent": "go-resty/1.10.0 (https://github.com/go-resty/resty)" + "User-Agent": "go-resty/2.3.0 (https://github.com/go-resty/resty)" }, "origin": "0.0.0.0", - "url": "http://httpbin.org/get" + "url": "https://httpbin.org/get" } + +Request Trace Info: +DNSLookup : 4.870246ms +ConnTime : 393.95373ms +TCPConnTime : 78.360432ms +TLSHandshake : 310.032859ms +ServerTime : 81.648284ms +ResponseTime : 124.266µs +TotalTime : 475.611189ms +IsConnReused : false +IsConnWasIdle: false +ConnIdleTime : 0s */ ``` #### Enhanced GET ```go -resp, err := resty.R(). +// Create a Resty Client +client := resty.New() + +resp, err := client.R(). SetQueryParams(map[string]string{ "page_no": "1", "limit": "20", @@ -176,7 +205,7 @@ resp, err := resty.R(). // Sample of using Request.SetQueryString method -resp, err := resty.R(). +resp, err := client.R(). SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more"). SetHeader("Accept", "application/json"). SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F"). @@ -186,9 +215,12 @@ resp, err := resty.R(). #### Various POST method combinations ```go +// Create a Resty Client +client := resty.New() + // POST JSON string // No need to set content type, if you have client level setting -resp, err := resty.R(). +resp, err := client.R(). SetHeader("Content-Type", "application/json"). SetBody(`{"username":"testuser", "password":"testpass"}`). SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). @@ -196,21 +228,21 @@ resp, err := resty.R(). // POST []byte array // No need to set content type, if you have client level setting -resp, err := resty.R(). +resp, err := client.R(). SetHeader("Content-Type", "application/json"). SetBody([]byte(`{"username":"testuser", "password":"testpass"}`)). SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). Post("https://myapp.com/login") // POST Struct, default is JSON content type. No need to set one -resp, err := resty.R(). +resp, err := client.R(). SetBody(User{Username: "testuser", Password: "testpass"}). SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). SetError(&AuthError{}). // or SetError(AuthError{}). Post("https://myapp.com/login") // POST Map, default is JSON content type. No need to set one -resp, err := resty.R(). +resp, err := client.R(). SetBody(map[string]interface{}{"username": "testuser", "password": "testpass"}). SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}). SetError(&AuthError{}). // or SetError(AuthError{}). @@ -220,7 +252,7 @@ resp, err := resty.R(). fileBytes, _ := ioutil.ReadFile("/Users/jeeva/mydocument.pdf") // See we are not setting content-type header, since go-resty automatically detects Content-Type for you -resp, err := resty.R(). +resp, err := client.R(). SetBody(fileBytes). SetContentLength(true). // Dropbox expects this value SetAuthToken(""). @@ -239,9 +271,12 @@ You can use various combinations of `PUT` method call like demonstrated for `POS ```go // Note: This is one sample of PUT method usage, refer POST for more combination +// Create a Resty Client +client := resty.New() + // Request goes as JSON content type // No need to set auth token, error, if you have client level settings -resp, err := resty.R(). +resp, err := client.R(). SetBody(Article{ Title: "go-resty", Content: "This is my article content, oh ya!", @@ -260,9 +295,12 @@ You can use various combinations of `PATCH` method call like demonstrated for `P ```go // Note: This is one sample of PUT method usage, refer POST for more combination +// Create a Resty Client +client := resty.New() + // Request goes as JSON content type // No need to set auth token, error, if you have client level settings -resp, err := resty.R(). +resp, err := client.R(). SetBody(Article{ Tags: []string{"new tag1", "new tag2"}, }). @@ -274,16 +312,19 @@ resp, err := resty.R(). #### Sample DELETE, HEAD, OPTIONS ```go +// Create a Resty Client +client := resty.New() + // DELETE a article // No need to set auth token, error, if you have client level settings -resp, err := resty.R(). +resp, err := client.R(). SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). SetError(&Error{}). // or SetError(Error{}). Delete("https://myapp.com/articles/1234") // DELETE a articles with payload/body as a JSON string // No need to set auth token, error, if you have client level settings -resp, err := resty.R(). +resp, err := client.R(). SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). SetError(&Error{}). // or SetError(Error{}). SetHeader("Content-Type", "application/json"). @@ -292,13 +333,13 @@ resp, err := resty.R(). // HEAD of resource // No need to set auth token, if you have client level settings -resp, err := resty.R(). +resp, err := client.R(). SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). Head("https://myapp.com/videos/hi-res-video") // OPTIONS of resource // No need to set auth token, if you have client level settings -resp, err := resty.R(). +resp, err := client.R(). SetAuthToken("C6A79608-782F-4ED0-A11D-BD82FAD829CD"). Options("https://myapp.com/servers/nyc-dc-01") ``` @@ -311,7 +352,10 @@ resp, err := resty.R(). profileImgBytes, _ := ioutil.ReadFile("/Users/jeeva/test-img.png") notesBytes, _ := ioutil.ReadFile("/Users/jeeva/text-file.txt") -resp, err := resty.R(). +// Create a Resty Client +client := resty.New() + +resp, err := client.R(). SetFileReader("profile_img", "test-img.png", bytes.NewReader(profileImgBytes)). SetFileReader("notes", "text-file.txt", bytes.NewReader(notesBytes)). SetFormData(map[string]string{ @@ -324,13 +368,16 @@ resp, err := resty.R(). #### Using File directly from Path ```go +// Create a Resty Client +client := resty.New() + // Single file scenario -resp, err := resty.R(). +resp, err := client.R(). SetFile("profile_img", "/Users/jeeva/test-img.png"). Post("http://myapp.com/upload") // Multiple files scenario -resp, err := resty.R(). +resp, err := client.R(). SetFiles(map[string]string{ "profile_img": "/Users/jeeva/test-img.png", "notes": "/Users/jeeva/text-file.txt", @@ -338,7 +385,7 @@ resp, err := resty.R(). Post("http://myapp.com/upload") // Multipart of form fields and files -resp, err := resty.R(). +resp, err := client.R(). SetFiles(map[string]string{ "profile_img": "/Users/jeeva/test-img.png", "notes": "/Users/jeeva/text-file.txt", @@ -356,9 +403,12 @@ resp, err := resty.R(). #### Sample Form submission ```go +// Create a Resty Client +client := resty.New() + // just mentioning about POST as an example with simple flow // User Login -resp, err := resty.R(). +resp, err := client.R(). SetFormData(map[string]string{ "username": "jeeva", "password": "mypass", @@ -366,7 +416,7 @@ resp, err := resty.R(). Post("http://myapp.com/login") // Followed by profile update -resp, err := resty.R(). +resp, err := client.R(). SetFormData(map[string]string{ "first_name": "Jeevanandam", "last_name": "M", @@ -379,27 +429,30 @@ resp, err := resty.R(). criteria := url.Values{ "search_criteria": []string{"book", "glass", "pencil"}, } -resp, err := resty.R(). - SetMultiValueFormData(criteria). +resp, err := client.R(). + SetFormDataFromValues(criteria). Post("http://myapp.com/search") ``` #### Save HTTP Response into File ```go +// Create a Resty Client +client := resty.New() + // Setting output directory path, If directory not exists then resty creates one! // This is optional one, if you're planning using absoule path in // `Request.SetOutput` and can used together. -resty.SetOutputDirectory("/Users/jeeva/Downloads") +client.SetOutputDirectory("/Users/jeeva/Downloads") // HTTP response gets saved into file, similar to curl -o flag -_, err := resty.R(). +_, err := client.R(). SetOutput("plugin/ReplyWithHeader-v5.1-beta.zip"). Get("http://bit.ly/1LouEKr") // OR using absolute path -// Note: output directory path is not used for absoulte path -_, err := resty.R(). +// Note: output directory path is not used for absolute path +_, err := client.R(). SetOutput("/MyDownloads/plugin/ReplyWithHeader-v5.1-beta.zip"). Get("http://bit.ly/1LouEKr") ``` @@ -409,7 +462,10 @@ _, err := resty.R(). Resty provides easy to use dynamic request URL path params. Params can be set at client and request level. Client level params value can be overridden at request level. ```go -resty.R().SetPathParams(map[string]string{ +// Create a Resty Client +client := resty.New() + +client.R().SetPathParams(map[string]string{ "userId": "sample@sample.com", "subAccountId": "100002", }). @@ -424,8 +480,11 @@ Get("/v1/users/{userId}/{subAccountId}/details") Resty provides middleware ability to manipulate for Request and Response. It is more flexible than callback approach. ```go +// Create a Resty Client +client := resty.New() + // Registering Request Middleware -resty.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error { +client.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error { // Now you have access to Client and current Request object // manipulate it as per your need @@ -433,7 +492,7 @@ resty.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error { }) // Registering Response Middleware -resty.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error { +client.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error { // Now you have access to Client and current Response object // manipulate it as per your need @@ -446,11 +505,14 @@ resty.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error { Resty provides few ready to use redirect policy(s) also it supports multiple policies together. ```go +// Create a Resty Client +client := resty.New() + // Assign Client Redirect Policy. Create one as per you need -resty.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15)) +client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15)) // Wanna multiple policies such as redirect count, domain name check, etc -resty.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20), +client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20), resty.DomainCheckRedirectPolicy("host1.com", "host2.org", "host3.net")) ``` @@ -459,8 +521,11 @@ resty.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20), Implement [RedirectPolicy](redirect.go#L20) interface and register it with resty client. Have a look [redirect.go](redirect.go) for more information. ```go +// Create a Resty Client +client := resty.New() + // Using raw func into resty.SetRedirectPolicy -resty.SetRedirectPolicy(resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { +client.SetRedirectPolicy(resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error { // Implement your logic here // return nil for continue redirect otherwise return error to stop/prevent redirect @@ -482,16 +547,19 @@ func (c *CustomRedirectPolicy) Apply(req *http.Request, via []*http.Request) err } // Registering in resty -resty.SetRedirectPolicy(CustomRedirectPolicy{/* initialize variables */}) +client.SetRedirectPolicy(CustomRedirectPolicy{/* initialize variables */}) ``` #### Custom Root Certificates and Client Certificates ```go +// Create a Resty Client +client := resty.New() + // Custom Root certificates, just supply .pem file. // you can add one or more root certificates, its get appended -resty.SetRootCertificate("/path/to/root/pemFile1.pem") -resty.SetRootCertificate("/path/to/root/pemFile2.pem") +client.SetRootCertificate("/path/to/root/pemFile1.pem") +client.SetRootCertificate("/path/to/root/pemFile2.pem") // ... and so on! // Adding Client Certificates, you add one or more certificates @@ -504,7 +572,30 @@ if err != nil { // ... // You add one or more certificates -resty.SetCertificates(cert1, cert2, cert3) +client.SetCertificates(cert1, cert2, cert3) +``` + +#### Custom Root Certificates and Client Certificates from string + +```go +// Custom Root certificates from string +// You can pass you certificates throught env variables as strings +// you can add one or more root certificates, its get appended +client.SetRootCertificateFromString("-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----") +client.SetRootCertificateFromString("-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----") +// ... and so on! + +// Adding Client Certificates, you add one or more certificates +// Sample for creating certificate object +// Parsing public/private key pair from a pair of files. The files must contain PEM encoded data. +cert1, err := tls.X509KeyPair([]byte("-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----"), []byte("-----BEGIN CERTIFICATE-----content-----END CERTIFICATE-----")) +if err != nil { + log.Fatalf("ERROR client certificate: %s", err) +} +// ... + +// You add one or more certificates +client.SetCertificates(cert1, cert2, cert3) ``` #### Proxy Settings - Client as well as at Request Level @@ -515,11 +606,14 @@ Choose as per your need. **Client Level Proxy** settings applied to all the request ```go +// Create a Resty Client +client := resty.New() + // Setting a Proxy URL and Port -resty.SetProxy("http://proxyserver:8888") +client.SetProxy("http://proxyserver:8888") // Want to remove proxy setting -resty.RemoveProxy() +client.RemoveProxy() ``` #### Retries @@ -530,8 +624,11 @@ to increase retry intervals after each attempt. Usage example: ```go +// Create a Resty Client +client := resty.New() + // Retries are configured per client -resty. +client. // Set retry count to non zero to enable retries SetRetryCount(3). // You can override initial retry wait time. @@ -539,7 +636,12 @@ resty. SetRetryWaitTime(5 * time.Second). // MaxWaitTime can be overridden as well. // Default is 2 seconds. - SetRetryMaxWaitTime(20 * time.Second) + SetRetryMaxWaitTime(20 * time.Second). + // SetRetryAfter sets callback to calculate wait time between retries. + // Default (nil) implies exponential backoff with jitter + SetRetryAfter(func(client *Client, resp *Response) (time.Duration, error) { + return 0, errors.New("quota exceeded") + }) ``` Above setup will result in resty retrying requests returned non nil error up to @@ -548,12 +650,14 @@ Above setup will result in resty retrying requests returned non nil error up to You can optionally provide client with custom retry conditions: ```go -resty.AddRetryCondition( - // Condition function will be provided with *resty.Response as a - // parameter. It is expected to return (bool, error) pair. Resty will retry - // in case condition returns true or non nil error. - func(r *resty.Response) (bool, error) { - return r.StatusCode() == http.StatusTooManyRequests, nil +// Create a Resty Client +client := resty.New() + +client.AddRetryCondition( + // RetryConditionFunc type is for retry condition function + // input: non-nil Response OR request execution error + func(r *resty.Response, err error) bool { + return r.StatusCode() == http.StatusTooManyRequests }, ) ``` @@ -566,21 +670,14 @@ Multiple retry conditions can be added. It is also possible to use `resty.Backoff(...)` to get arbitrary retry scenarios implemented. [Reference](retry_test.go). -#### Choose REST or HTTP mode - -```go -// REST mode. This is Default. -resty.SetRESTMode() - -// HTTP mode -resty.SetHTTPMode() -``` - #### Allow GET request with Payload ```go +// Create a Resty Client +client := resty.New() + // Allow GET request with Payload. This is disabled by default. -resty.SetAllowGetMethodPayload(true) +client.SetAllowGetMethodPayload(true) ``` #### Wanna Multiple Clients @@ -603,40 +700,39 @@ client2.R().Head("http://httpbin.org") #### Remaining Client Settings & its Options ```go +// Create a Resty Client +client := resty.New() + // Unique settings at Client level //-------------------------------- // Enable debug mode -resty.SetDebug(true) - -// Using you custom log writer -logFile, _ := os.OpenFile("/Users/jeeva/go-resty.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) -resty.SetLogger(logFile) +client.SetDebug(true) // Assign Client TLSClientConfig // One can set custom root-certificate. Refer: http://golang.org/pkg/crypto/tls/#example_Dial -resty.SetTLSClientConfig(&tls.Config{ RootCAs: roots }) +client.SetTLSClientConfig(&tls.Config{ RootCAs: roots }) // or One can disable security check (https) -resty.SetTLSClientConfig(&tls.Config{ InsecureSkipVerify: true }) +client.SetTLSClientConfig(&tls.Config{ InsecureSkipVerify: true }) // Set client timeout as per your need -resty.SetTimeout(1 * time.Minute) +client.SetTimeout(1 * time.Minute) // You can override all below settings and options at request level if you want to //-------------------------------------------------------------------------------- // Host URL for all request. So you can use relative URL in the request -resty.SetHostURL("http://httpbin.org") +client.SetHostURL("http://httpbin.org") // Headers for all request -resty.SetHeader("Accept", "application/json") -resty.SetHeaders(map[string]string{ +client.SetHeader("Accept", "application/json") +client.SetHeaders(map[string]string{ "Content-Type": "application/json", "User-Agent": "My custom User Agent String", }) // Cookies for all request -resty.SetCookie(&http.Cookie{ +client.SetCookie(&http.Cookie{ Name:"go-resty", Value:"This is cookie value", Path: "/", @@ -645,32 +741,32 @@ resty.SetCookie(&http.Cookie{ HttpOnly: true, Secure: false, }) -resty.SetCookies(cookies) +client.SetCookies(cookies) // URL query parameters for all request -resty.SetQueryParam("user_id", "00001") -resty.SetQueryParams(map[string]string{ // sample of those who use this manner +client.SetQueryParam("user_id", "00001") +client.SetQueryParams(map[string]string{ // sample of those who use this manner "api_key": "api-key-here", "api_secert": "api-secert", }) -resty.R().SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more") +client.R().SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more") // Form data for all request. Typically used with POST and PUT -resty.SetFormData(map[string]string{ +client.SetFormData(map[string]string{ "access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F", }) // Basic Auth for all request -resty.SetBasicAuth("myuser", "mypass") +client.SetBasicAuth("myuser", "mypass") // Bearer Auth Token for all request -resty.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") +client.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") // Enabling Content length value for all request -resty.SetContentLength(true) +client.SetContentLength(true) // Registering global Error object structure for JSON/XML request -resty.SetError(&Error{}) // or resty.SetError(Error{}) +client.SetError(&Error{}) // or resty.SetError(Error{}) ``` #### Unix Socket @@ -685,12 +781,15 @@ transport := http.Transport{ }, } +// Create a Resty Client +client := resty.New() + // Set the previous transport that we created, set the scheme of the communication to the // socket and set the unixSocket as the HostURL. -r := resty.New().SetTransport(&transport).SetScheme("http").SetHostURL(unixSocket) +client.SetTransport(&transport).SetScheme("http").SetHostURL(unixSocket) // No need to write the host's URL on the request, just the path. -r.R().Get("/index.html") +client.R().Get("/index.html") ``` #### Bazel support @@ -710,16 +809,22 @@ could use the `httpmock` library. When using the default resty client, you should pass the client to the library as follow: ```go -httpmock.ActivateNonDefault(resty.DefaultClient.GetClient()) +// Create a Resty Client +client := resty.New() + +// Get the underlying HTTP Client and set it to Mock +httpmock.ActivateNonDefault(client.GetClient()) ``` More detailed example of mocking resty http requests using ginko could be found [here](https://github.com/jarcoal/httpmock#ginkgo--resty-example). ## Versioning -resty releases versions according to [Semantic Versioning](http://semver.org) +Resty releases versions according to [Semantic Versioning](http://semver.org) - * `gopkg.in/resty.vX` points to appropriate tagged versions; `X` denotes version series number and it's a stable release for production use. For e.g. `gopkg.in/resty.v0`. + * Resty v2 does not use `gopkg.in` service for library versioning. + * Resty fully adapted to `go mod` capabilities since `v1.10.0` release. + * Resty v1 series was using `gopkg.in` to provide versioning. `gopkg.in/resty.vX` points to appropriate tagged versions; `X` denotes version series number and it's a stable release for production use. For e.g. `gopkg.in/resty.v0`. * Development takes place at the master branch. Although the code in master should always compile and test successfully, it might break API's. I aim to maintain backwards compatibility, but sometimes API's and behavior might be changed to fix a bug. ## Contribution @@ -732,6 +837,10 @@ BTW, I'd like to know what you think about `Resty`. Kindly open an issue or send [Jeevanandam M.](https://github.com/jeevatkm) (jeeva@myjeeva.com) +## Core Team + +Have a look on [Members](https://github.com/orgs/go-resty/teams/core/members) page. + ## Contributors Have a look on [Contributors](https://github.com/go-resty/resty/graphs/contributors) page. diff --git a/vendor/gopkg.in/resty.v1/WORKSPACE b/vendor/github.com/go-resty/resty/v2/WORKSPACE similarity index 100% rename from vendor/gopkg.in/resty.v1/WORKSPACE rename to vendor/github.com/go-resty/resty/v2/WORKSPACE diff --git a/vendor/gopkg.in/resty.v1/client.go b/vendor/github.com/go-resty/resty/v2/client.go similarity index 55% rename from vendor/gopkg.in/resty.v1/client.go rename to vendor/github.com/go-resty/resty/v2/client.go index 68d447fa6..7b51657d2 100644 --- a/vendor/gopkg.in/resty.v1/client.go +++ b/vendor/github.com/go-resty/resty/v2/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. @@ -9,11 +9,12 @@ import ( "compress/gzip" "crypto/tls" "crypto/x509" + "encoding/json" "errors" "fmt" "io" "io/ioutil" - "log" + "math" "net/http" "net/url" "reflect" @@ -55,18 +56,38 @@ var ( hdrAuthorizationKey = http.CanonicalHeaderKey("Authorization") plainTextType = "text/plain; charset=utf-8" - jsonContentType = "application/json; charset=utf-8" + jsonContentType = "application/json" formContentType = "application/x-www-form-urlencoded" jsonCheck = regexp.MustCompile(`(?i:(application|text)/(json|.*\+json|json\-.*)(;|$))`) xmlCheck = regexp.MustCompile(`(?i:(application|text)/(xml|.*\+xml)(;|$))`) - hdrUserAgentValue = "go-resty/%s (https://github.com/go-resty/resty)" + hdrUserAgentValue = "go-resty/" + Version + " (https://github.com/go-resty/resty)" bufPool = &sync.Pool{New: func() interface{} { return &bytes.Buffer{} }} ) -// Client type is used for HTTP/RESTful global values -// for all request raised from the client +type ( + // RequestMiddleware type is for request middleware, called before a request is sent + RequestMiddleware func(*Client, *Request) error + + // ResponseMiddleware type is for response middleware, called after a response has been received + ResponseMiddleware func(*Client, *Response) error + + // PreRequestHook type is for the request hook, called right before the request is sent + PreRequestHook func(*Client, *http.Request) error + + // RequestLogCallback type is for request logs, called before the request is logged + RequestLogCallback func(*RequestLog) error + + // ResponseLogCallback type is for response logs, called before the response is logged + ResponseLogCallback func(*ResponseLog) error +) + +// Client struct is used to create Resty client with client level settings, +// these settings are applicable to all the request raised from the client. +// +// Resty also provides an options to override most of the client settings +// at request level. type Client struct { HostURL string QueryParam url.Values @@ -74,37 +95,38 @@ type Client struct { Header http.Header UserInfo *User Token string + AuthScheme string Cookies []*http.Cookie Error reflect.Type Debug bool DisableWarn bool AllowGetMethodPayload bool - Log *log.Logger RetryCount int RetryWaitTime time.Duration RetryMaxWaitTime time.Duration RetryConditions []RetryConditionFunc + RetryAfter RetryAfterFunc JSONMarshal func(v interface{}) ([]byte, error) JSONUnmarshal func(data []byte, v interface{}) error jsonEscapeHTML bool - httpClient *http.Client setContentLength bool - isHTTPMode bool - outputDirectory string - scheme string - proxyURL *url.URL closeConnection bool notParseResponse bool + trace bool debugBodySizeLimit int64 - logPrefix string + outputDirectory string + scheme string pathParams map[string]string - beforeRequest []func(*Client, *Request) error - udBeforeRequest []func(*Client, *Request) error - preReqHook func(*Client, *Request) error - afterResponse []func(*Client, *Response) error - requestLog func(*RequestLog) error - responseLog func(*ResponseLog) error + log Logger + httpClient *http.Client + proxyURL *url.URL + beforeRequest []RequestMiddleware + udBeforeRequest []RequestMiddleware + preReqHook PreRequestHook + afterResponse []ResponseMiddleware + requestLog RequestLogCallback + responseLog ResponseLogCallback } // User type is to hold an username and password information @@ -119,11 +141,10 @@ type User struct { // SetHostURL method is to set Host URL in the client instance. It will be used with request // raised from this client with relative URL // // Setting HTTP address -// resty.SetHostURL("http://myjeeva.com") +// client.SetHostURL("http://myjeeva.com") // // // Setting HTTPS address -// resty.SetHostURL("https://myjeeva.com") -// +// client.SetHostURL("https://myjeeva.com") func (c *Client) SetHostURL(url string) *Client { c.HostURL = strings.TrimRight(url, "/") return c @@ -131,15 +152,15 @@ func (c *Client) SetHostURL(url string) *Client { // SetHeader method sets a single header field and its value in the client instance. // These headers will be applied to all requests raised from this client instance. -// Also it can be overridden at request level header options, see `resty.R().SetHeader` -// or `resty.R().SetHeaders`. +// Also it can be overridden at request level header options. // -// Example: To set `Content-Type` and `Accept` as `application/json` +// See `Request.SetHeader` or `Request.SetHeaders`. // -// resty. +// For Example: To set `Content-Type` and `Accept` as `application/json` +// +// client. // SetHeader("Content-Type", "application/json"). // SetHeader("Accept", "application/json") -// func (c *Client) SetHeader(header, value string) *Client { c.Header.Set(header, value) return c @@ -147,29 +168,29 @@ func (c *Client) SetHeader(header, value string) *Client { // SetHeaders method sets multiple headers field and its values at one go in the client instance. // These headers will be applied to all requests raised from this client instance. Also it can be -// overridden at request level headers options, see `resty.R().SetHeaders` or `resty.R().SetHeader`. +// overridden at request level headers options. // -// Example: To set `Content-Type` and `Accept` as `application/json` +// See `Request.SetHeaders` or `Request.SetHeader`. // -// resty.SetHeaders(map[string]string{ +// For Example: To set `Content-Type` and `Accept` as `application/json` +// +// client.SetHeaders(map[string]string{ // "Content-Type": "application/json", // "Accept": "application/json", // }) -// func (c *Client) SetHeaders(headers map[string]string) *Client { for h, v := range headers { c.Header.Set(h, v) } - return c } // SetCookieJar method sets custom http.CookieJar in the resty client. Its way to override default. -// Example: sometimes we don't want to save cookies in api contacting, we can remove the default +// +// For Example: sometimes we don't want to save cookies in api contacting, we can remove the default // CookieJar in resty client. // -// resty.SetCookieJar(nil) -// +// client.SetCookieJar(nil) func (c *Client) SetCookieJar(jar http.CookieJar) *Client { c.httpClient.Jar = jar return c @@ -177,16 +198,10 @@ func (c *Client) SetCookieJar(jar http.CookieJar) *Client { // SetCookie method appends a single cookie in the client instance. // These cookies will be added to all the request raised from this client instance. -// resty.SetCookie(&http.Cookie{ +// client.SetCookie(&http.Cookie{ // Name:"go-resty", // Value:"This is cookie value", -// Path: "/", -// Domain: "sample.com", -// MaxAge: 36000, -// HttpOnly: true, -// Secure: false, // }) -// func (c *Client) SetCookie(hc *http.Cookie) *Client { c.Cookies = append(c.Cookies, hc) return c @@ -194,120 +209,136 @@ func (c *Client) SetCookie(hc *http.Cookie) *Client { // SetCookies method sets an array of cookies in the client instance. // These cookies will be added to all the request raised from this client instance. -// cookies := make([]*http.Cookie, 0) -// -// cookies = append(cookies, &http.Cookie{ -// Name:"go-resty-1", -// Value:"This is cookie 1 value", -// Path: "/", -// Domain: "sample.com", -// MaxAge: 36000, -// HttpOnly: true, -// Secure: false, -// }) -// -// cookies = append(cookies, &http.Cookie{ -// Name:"go-resty-2", -// Value:"This is cookie 2 value", -// Path: "/", -// Domain: "sample.com", -// MaxAge: 36000, -// HttpOnly: true, -// Secure: false, -// }) +// cookies := []*http.Cookie{ +// &http.Cookie{ +// Name:"go-resty-1", +// Value:"This is cookie 1 value", +// }, +// &http.Cookie{ +// Name:"go-resty-2", +// Value:"This is cookie 2 value", +// }, +// } // // // Setting a cookies into resty -// resty.SetCookies(cookies) -// +// client.SetCookies(cookies) func (c *Client) SetCookies(cs []*http.Cookie) *Client { c.Cookies = append(c.Cookies, cs...) return c } // SetQueryParam method sets single parameter and its value in the client instance. -// It will be formed as query string for the request. For example: `search=kitchen%20papers&size=large` +// It will be formed as query string for the request. +// +// For Example: `search=kitchen%20papers&size=large` // in the URL after `?` mark. These query params will be added to all the request raised from -// this client instance. Also it can be overridden at request level Query Param options, -// see `resty.R().SetQueryParam` or `resty.R().SetQueryParams`. -// resty. +// this client instance. Also it can be overridden at request level Query Param options. +// +// See `Request.SetQueryParam` or `Request.SetQueryParams`. +// client. // SetQueryParam("search", "kitchen papers"). // SetQueryParam("size", "large") -// func (c *Client) SetQueryParam(param, value string) *Client { c.QueryParam.Set(param, value) return c } // SetQueryParams method sets multiple parameters and their values at one go in the client instance. -// It will be formed as query string for the request. For example: `search=kitchen%20papers&size=large` +// It will be formed as query string for the request. +// +// For Example: `search=kitchen%20papers&size=large` // in the URL after `?` mark. These query params will be added to all the request raised from this -// client instance. Also it can be overridden at request level Query Param options, -// see `resty.R().SetQueryParams` or `resty.R().SetQueryParam`. -// resty.SetQueryParams(map[string]string{ +// client instance. Also it can be overridden at request level Query Param options. +// +// See `Request.SetQueryParams` or `Request.SetQueryParam`. +// client.SetQueryParams(map[string]string{ // "search": "kitchen papers", // "size": "large", // }) -// func (c *Client) SetQueryParams(params map[string]string) *Client { for p, v := range params { c.SetQueryParam(p, v) } - return c } // SetFormData method sets Form parameters and their values in the client instance. // It's applicable only HTTP method `POST` and `PUT` and requets content type would be set as // `application/x-www-form-urlencoded`. These form data will be added to all the request raised from -// this client instance. Also it can be overridden at request level form data, see `resty.R().SetFormData`. -// resty.SetFormData(map[string]string{ +// this client instance. Also it can be overridden at request level form data. +// +// See `Request.SetFormData`. +// client.SetFormData(map[string]string{ // "access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F", // "user_id": "3455454545", // }) -// func (c *Client) SetFormData(data map[string]string) *Client { for k, v := range data { c.FormData.Set(k, v) } - return c } -// SetBasicAuth method sets the basic authentication header in the HTTP request. Example: +// SetBasicAuth method sets the basic authentication header in the HTTP request. For Example: // Authorization: Basic // -// Example: To set the header for username "go-resty" and password "welcome" -// resty.SetBasicAuth("go-resty", "welcome") +// For Example: To set the header for username "go-resty" and password "welcome" +// client.SetBasicAuth("go-resty", "welcome") // // This basic auth information gets added to all the request rasied from this client instance. -// Also it can be overridden or set one at the request level is supported, see `resty.R().SetBasicAuth`. +// Also it can be overridden or set one at the request level is supported. // +// See `Request.SetBasicAuth`. func (c *Client) SetBasicAuth(username, password string) *Client { c.UserInfo = &User{Username: username, Password: password} return c } -// SetAuthToken method sets bearer auth token header in the HTTP request. Example: -// Authorization: Bearer +// SetAuthToken method sets the auth token of the `Authorization` header for all HTTP requests. +// The default auth scheme is `Bearer`, it can be customized with the method `SetAuthScheme`. For Example: +// Authorization: // -// Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F +// For Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F // -// resty.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") +// client.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") // -// This bearer auth token gets added to all the request rasied from this client instance. -// Also it can be overridden or set one at the request level is supported, see `resty.R().SetAuthToken`. +// This auth token gets added to all the requests rasied from this client instance. +// Also it can be overridden or set one at the request level is supported. // +// See `Request.SetAuthToken`. func (c *Client) SetAuthToken(token string) *Client { c.Token = token return c } -// R method creates a request instance, its used for Get, Post, Put, Delete, Patch, Head and Options. +// SetAuthScheme method sets the auth scheme type in the HTTP request. For Example: +// Authorization: +// +// For Example: To set the scheme to use OAuth +// +// client.SetAuthScheme("OAuth") +// +// This auth scheme gets added to all the requests rasied from this client instance. +// Also it can be overridden or set one at the request level is supported. +// +// Information about auth schemes can be found in RFC7235 which is linked to below +// along with the page containing the currently defined official authentication schemes: +// https://tools.ietf.org/html/rfc7235 +// https://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml#authschemes +// +// See `Request.SetAuthToken`. +func (c *Client) SetAuthScheme(scheme string) *Client { + c.AuthScheme = scheme + return c +} + +// R method creates a new request instance, its used for Get, Post, Put, Delete, Patch, Head, Options, etc. func (c *Client) R() *Request { r := &Request{ QueryParam: url.Values{}, FormData: url.Values{}, Header: http.Header{}, + Cookies: make([]*http.Cookie, 0), client: c, multipartFiles: []*File{}, @@ -315,42 +346,39 @@ func (c *Client) R() *Request { pathParams: map[string]string{}, jsonEscapeHTML: true, } - return r } -// NewRequest is an alias for R(). Creates a request instance, its used for -// Get, Post, Put, Delete, Patch, Head and Options. +// NewRequest is an alias for method `R()`. Creates a new request instance, its used for +// Get, Post, Put, Delete, Patch, Head, Options, etc. func (c *Client) NewRequest() *Request { return c.R() } // OnBeforeRequest method appends request middleware into the before request chain. -// Its gets applied after default `go-resty` request middlewares and before request -// been sent from `go-resty` to host server. -// resty.OnBeforeRequest(func(c *resty.Client, r *resty.Request) error { +// Its gets applied after default Resty request middlewares and before request +// been sent from Resty to host server. +// client.OnBeforeRequest(func(c *resty.Client, r *resty.Request) error { // // Now you have access to Client and Request instance // // manipulate it as per your need // // return nil // if its success otherwise return error // }) -// -func (c *Client) OnBeforeRequest(m func(*Client, *Request) error) *Client { +func (c *Client) OnBeforeRequest(m RequestMiddleware) *Client { c.udBeforeRequest = append(c.udBeforeRequest, m) return c } // OnAfterResponse method appends response middleware into the after response chain. -// Once we receive response from host server, default `go-resty` response middleware +// Once we receive response from host server, default Resty response middleware // gets applied and then user assigened response middlewares applied. -// resty.OnAfterResponse(func(c *resty.Client, r *resty.Response) error { +// client.OnAfterResponse(func(c *resty.Client, r *resty.Response) error { // // Now you have access to Client and Response instance // // manipulate it as per your need // // return nil // if its success otherwise return error // }) -// -func (c *Client) OnAfterResponse(m func(*Client, *Response) error) *Client { +func (c *Client) OnAfterResponse(m ResponseMiddleware) *Client { c.afterResponse = append(c.afterResponse, m) return c } @@ -358,125 +386,118 @@ func (c *Client) OnAfterResponse(m func(*Client, *Response) error) *Client { // SetPreRequestHook method sets the given pre-request function into resty client. // It is called right before the request is fired. // -// Note: Only one pre-request hook can be registered. Use `resty.OnBeforeRequest` for mutilple. -func (c *Client) SetPreRequestHook(h func(*Client, *Request) error) *Client { +// Note: Only one pre-request hook can be registered. Use `client.OnBeforeRequest` for mutilple. +func (c *Client) SetPreRequestHook(h PreRequestHook) *Client { if c.preReqHook != nil { - c.Log.Printf("Overwriting an existing pre-request hook: %s", functionName(h)) + c.log.Warnf("Overwriting an existing pre-request hook: %s", functionName(h)) } c.preReqHook = h return c } -// SetDebug method enables the debug mode on `go-resty` client. Client logs details of every request and response. +// SetDebug method enables the debug mode on Resty client. Client logs details of every request and response. // For `Request` it logs information such as HTTP verb, Relative URL path, Host, Headers, Body if it has one. // For `Response` it logs information such as Status, Response Time, Headers, Body if it has one. -// resty.SetDebug(true) -// +// client.SetDebug(true) func (c *Client) SetDebug(d bool) *Client { c.Debug = d return c } -// SetDebugBodyLimit sets the maximum size for which the response body will be logged in debug mode. -// resty.SetDebugBodyLimit(1000000) -// +// SetDebugBodyLimit sets the maximum size for which the response and request body will be logged in debug mode. +// client.SetDebugBodyLimit(1000000) func (c *Client) SetDebugBodyLimit(sl int64) *Client { c.debugBodySizeLimit = sl return c } -// OnRequestLog method used to set request log callback into resty. Registered callback gets +// OnRequestLog method used to set request log callback into Resty. Registered callback gets // called before the resty actually logs the information. -func (c *Client) OnRequestLog(rl func(*RequestLog) error) *Client { +func (c *Client) OnRequestLog(rl RequestLogCallback) *Client { if c.requestLog != nil { - c.Log.Printf("Overwriting an existing on-request-log callback from=%s to=%s", functionName(c.requestLog), functionName(rl)) + c.log.Warnf("Overwriting an existing on-request-log callback from=%s to=%s", + functionName(c.requestLog), functionName(rl)) } c.requestLog = rl return c } -// OnResponseLog method used to set response log callback into resty. Registered callback gets +// OnResponseLog method used to set response log callback into Resty. Registered callback gets // called before the resty actually logs the information. -func (c *Client) OnResponseLog(rl func(*ResponseLog) error) *Client { +func (c *Client) OnResponseLog(rl ResponseLogCallback) *Client { if c.responseLog != nil { - c.Log.Printf("Overwriting an existing on-response-log callback from=%s to=%s", functionName(c.responseLog), functionName(rl)) + c.log.Warnf("Overwriting an existing on-response-log callback from=%s to=%s", + functionName(c.responseLog), functionName(rl)) } c.responseLog = rl return c } -// SetDisableWarn method disables the warning message on `go-resty` client. -// For example: go-resty warns the user when BasicAuth used on HTTP mode. -// resty.SetDisableWarn(true) +// SetDisableWarn method disables the warning message on Resty client. // +// For Example: Resty warns the user when BasicAuth used on non-TLS mode. +// client.SetDisableWarn(true) func (c *Client) SetDisableWarn(d bool) *Client { c.DisableWarn = d return c } -// SetAllowGetMethodPayload method allows the GET method with payload on `go-resty` client. -// For example: go-resty allows the user sends request with a payload on HTTP GET method. -// resty.SetAllowGetMethodPayload(true) +// SetAllowGetMethodPayload method allows the GET method with payload on Resty client. // +// For Example: Resty allows the user sends request with a payload on HTTP GET method. +// client.SetAllowGetMethodPayload(true) func (c *Client) SetAllowGetMethodPayload(a bool) *Client { c.AllowGetMethodPayload = a return c } -// SetLogger method sets given writer for logging go-resty request and response details. -// Default is os.Stderr -// file, _ := os.OpenFile("/Users/jeeva/go-resty.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) +// SetLogger method sets given writer for logging Resty request and response details. // -// resty.SetLogger(file) -// -func (c *Client) SetLogger(w io.Writer) *Client { - c.Log = getLogger(w) +// Compliant to interface `resty.Logger`. +func (c *Client) SetLogger(l Logger) *Client { + c.log = l return c } // SetContentLength method enables the HTTP header `Content-Length` value for every request. -// By default go-resty won't set `Content-Length`. -// resty.SetContentLength(true) -// -// Also you have an option to enable for particular request. See `resty.R().SetContentLength` +// By default Resty won't set `Content-Length`. +// client.SetContentLength(true) // +// Also you have an option to enable for particular request. See `Request.SetContentLength` func (c *Client) SetContentLength(l bool) *Client { c.setContentLength = l return c } // SetTimeout method sets timeout for request raised from client. -// resty.SetTimeout(time.Duration(1 * time.Minute)) -// +// client.SetTimeout(time.Duration(1 * time.Minute)) func (c *Client) SetTimeout(timeout time.Duration) *Client { c.httpClient.Timeout = timeout return c } -// SetError method is to register the global or client common `Error` object into go-resty. +// SetError method is to register the global or client common `Error` object into Resty. // It is used for automatic unmarshalling if response status code is greater than 399 and // content type either JSON or XML. Can be pointer or non-pointer. -// resty.SetError(&Error{}) +// client.SetError(&Error{}) // // OR -// resty.SetError(Error{}) -// +// client.SetError(Error{}) func (c *Client) SetError(err interface{}) *Client { c.Error = typeOf(err) return c } -// SetRedirectPolicy method sets the client redirect poilicy. go-resty provides ready to use -// redirect policies. Wanna create one for yourself refer `redirect.go`. +// SetRedirectPolicy method sets the client redirect poilicy. Resty provides ready to use +// redirect policies. Wanna create one for yourself refer to `redirect.go`. // -// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20)) +// client.SetRedirectPolicy(FlexibleRedirectPolicy(20)) // // // Need multiple redirect policies together -// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20), DomainCheckRedirectPolicy("host1.com", "host2.net")) -// +// client.SetRedirectPolicy(FlexibleRedirectPolicy(20), DomainCheckRedirectPolicy("host1.com", "host2.net")) func (c *Client) SetRedirectPolicy(policies ...interface{}) *Client { for _, p := range policies { if _, ok := p.(RedirectPolicy); !ok { - c.Log.Printf("ERORR: %v does not implement resty.RedirectPolicy (missing Apply method)", + c.log.Errorf("%v does not implement resty.RedirectPolicy (missing Apply method)", functionName(p)) } } @@ -493,7 +514,7 @@ func (c *Client) SetRedirectPolicy(policies ...interface{}) *Client { return c } -// SetRetryCount method enables retry on `go-resty` client and allows you +// SetRetryCount method enables retry on Resty client and allows you // to set no. of retry count. Resty uses a Backoff mechanism. func (c *Client) SetRetryCount(count int) *Client { c.RetryCount = count @@ -502,6 +523,7 @@ func (c *Client) SetRetryCount(count int) *Client { // SetRetryWaitTime method sets default wait time to sleep before retrying // request. +// // Default is 100 milliseconds. func (c *Client) SetRetryWaitTime(waitTime time.Duration) *Client { c.RetryWaitTime = waitTime @@ -510,12 +532,20 @@ func (c *Client) SetRetryWaitTime(waitTime time.Duration) *Client { // SetRetryMaxWaitTime method sets max wait time to sleep before retrying // request. +// // Default is 2 seconds. func (c *Client) SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { c.RetryMaxWaitTime = maxWaitTime return c } +// SetRetryAfter sets callback to calculate wait time between retries. +// Default (nil) implies exponential backoff with jitter +func (c *Client) SetRetryAfter(callback RetryAfterFunc) *Client { + c.RetryAfter = callback + return c +} + // AddRetryCondition method adds a retry condition function to array of functions // that are checked to determine if the request is retried. The request will // retry if any of the functions return true and error is nil. @@ -524,109 +554,56 @@ func (c *Client) AddRetryCondition(condition RetryConditionFunc) *Client { return c } -// SetHTTPMode method sets go-resty mode to 'http' -func (c *Client) SetHTTPMode() *Client { - return c.SetMode("http") -} - -// SetRESTMode method sets go-resty mode to 'rest' -func (c *Client) SetRESTMode() *Client { - return c.SetMode("rest") -} - -// SetMode method sets go-resty client mode to given value such as 'http' & 'rest'. -// 'rest': -// - No Redirect -// - Automatic response unmarshal if it is JSON or XML -// 'http': -// - Up to 10 Redirects -// - No automatic unmarshall. Response will be treated as `response.String()` -// -// If you want more redirects, use FlexibleRedirectPolicy -// resty.SetRedirectPolicy(FlexibleRedirectPolicy(20)) -// -func (c *Client) SetMode(mode string) *Client { - // HTTP - if mode == "http" { - c.isHTTPMode = true - c.SetRedirectPolicy(FlexibleRedirectPolicy(10)) - c.afterResponse = []func(*Client, *Response) error{ - responseLogger, - saveResponseIntoFile, - } - return c - } - - // RESTful - c.isHTTPMode = false - c.SetRedirectPolicy(NoRedirectPolicy()) - c.afterResponse = []func(*Client, *Response) error{ - responseLogger, - parseResponseBody, - saveResponseIntoFile, - } - return c -} - -// Mode method returns the current client mode. Typically its a "http" or "rest". -// Default is "rest" -func (c *Client) Mode() string { - if c.isHTTPMode { - return "http" - } - return "rest" -} - // SetTLSClientConfig method sets TLSClientConfig for underling client Transport. // -// Example: +// For Example: // // One can set custom root-certificate. Refer: http://golang.org/pkg/crypto/tls/#example_Dial -// resty.SetTLSClientConfig(&tls.Config{ RootCAs: roots }) +// client.SetTLSClientConfig(&tls.Config{ RootCAs: roots }) // // // or One can disable security check (https) -// resty.SetTLSClientConfig(&tls.Config{ InsecureSkipVerify: true }) -// Note: This method overwrites existing `TLSClientConfig`. +// client.SetTLSClientConfig(&tls.Config{ InsecureSkipVerify: true }) // +// Note: This method overwrites existing `TLSClientConfig`. func (c *Client) SetTLSClientConfig(config *tls.Config) *Client { - transport, err := c.getTransport() + transport, err := c.transport() if err != nil { - c.Log.Printf("ERROR %v", err) + c.log.Errorf("%v", err) return c } transport.TLSClientConfig = config return c } -// SetProxy method sets the Proxy URL and Port for resty client. -// resty.SetProxy("http://proxyserver:8888") +// SetProxy method sets the Proxy URL and Port for Resty client. +// client.SetProxy("http://proxyserver:8888") // -// Alternatives: At request level proxy, see `Request.SetProxy`. OR Without this `SetProxy` method, -// you can also set Proxy via environment variable. By default `Go` uses setting from `HTTP_PROXY`. +// OR Without this `SetProxy` method, you could also set Proxy via environment variable. // +// Refer to godoc `http.ProxyFromEnvironment`. func (c *Client) SetProxy(proxyURL string) *Client { - transport, err := c.getTransport() + transport, err := c.transport() if err != nil { - c.Log.Printf("ERROR %v", err) + c.log.Errorf("%v", err) return c } - if pURL, err := url.Parse(proxyURL); err == nil { - c.proxyURL = pURL - transport.Proxy = http.ProxyURL(c.proxyURL) - } else { - c.Log.Printf("ERROR %v", err) - c.RemoveProxy() + pURL, err := url.Parse(proxyURL) + if err != nil { + c.log.Errorf("%v", err) + return c } + + c.proxyURL = pURL + transport.Proxy = http.ProxyURL(c.proxyURL) return c } -// RemoveProxy method removes the proxy configuration from resty client -// resty.RemoveProxy() -// +// RemoveProxy method removes the proxy configuration from Resty client +// client.RemoveProxy() func (c *Client) RemoveProxy() *Client { - transport, err := c.getTransport() + transport, err := c.transport() if err != nil { - c.Log.Printf("ERROR %v", err) + c.log.Errorf("%v", err) return c } c.proxyURL = nil @@ -634,31 +611,29 @@ func (c *Client) RemoveProxy() *Client { return c } -// SetCertificates method helps to set client certificates into resty conveniently. -// +// SetCertificates method helps to set client certificates into Resty conveniently. func (c *Client) SetCertificates(certs ...tls.Certificate) *Client { - config, err := c.getTLSConfig() + config, err := c.tlsConfig() if err != nil { - c.Log.Printf("ERROR %v", err) + c.log.Errorf("%v", err) return c } config.Certificates = append(config.Certificates, certs...) return c } -// SetRootCertificate method helps to add one or more root certificates into resty client -// resty.SetRootCertificate("/path/to/root/pemFile.pem") -// +// SetRootCertificate method helps to add one or more root certificates into Resty client +// client.SetRootCertificate("/path/to/root/pemFile.pem") func (c *Client) SetRootCertificate(pemFilePath string) *Client { rootPemData, err := ioutil.ReadFile(pemFilePath) if err != nil { - c.Log.Printf("ERROR %v", err) + c.log.Errorf("%v", err) return c } - config, err := c.getTLSConfig() + config, err := c.tlsConfig() if err != nil { - c.Log.Printf("ERROR %v", err) + c.log.Errorf("%v", err) return c } if config.RootCAs == nil { @@ -666,15 +641,29 @@ func (c *Client) SetRootCertificate(pemFilePath string) *Client { } config.RootCAs.AppendCertsFromPEM(rootPemData) + return c +} +// SetRootCertificateFromString method helps to add one or more root certificates into Resty client +// client.SetRootCertificateFromString("pem file content") +func (c *Client) SetRootCertificateFromString(pemContent string) *Client { + config, err := c.tlsConfig() + if err != nil { + c.log.Errorf("%v", err) + return c + } + if config.RootCAs == nil { + config.RootCAs = x509.NewCertPool() + } + + config.RootCAs.AppendCertsFromPEM([]byte(pemContent)) return c } // SetOutputDirectory method sets output directory for saving HTTP response into file. // If the output directory not exists then resty creates one. This setting is optional one, -// if you're planning using absoule path in `Request.SetOutput` and can used together. -// resty.SetOutputDirectory("/save/http/response/here") -// +// if you're planning using absolute path in `Request.SetOutput` and can used together. +// client.SetOutputDirectory("/save/http/response/here") func (c *Client) SetOutputDirectory(dirPath string) *Client { c.outputDirectory = dirPath return c @@ -683,12 +672,12 @@ func (c *Client) SetOutputDirectory(dirPath string) *Client { // SetTransport method sets custom `*http.Transport` or any `http.RoundTripper` // compatible interface implementation in the resty client. // -// NOTE: +// Note: // // - If transport is not type of `*http.Transport` then you may not be able to -// take advantage of some of the `resty` client settings. +// take advantage of some of the Resty client settings. // -// - It overwrites the resty client transport instance and it's configurations. +// - It overwrites the Resty client transport instance and it's configurations. // // transport := &http.Transport{ // // somthing like Proxying to httptest.Server, etc... @@ -697,8 +686,7 @@ func (c *Client) SetOutputDirectory(dirPath string) *Client { // }, // } // -// resty.SetTransport(transport) -// +// client.SetTransport(transport) func (c *Client) SetTransport(transport http.RoundTripper) *Client { if transport != nil { c.httpClient.Transport = transport @@ -706,14 +694,12 @@ func (c *Client) SetTransport(transport http.RoundTripper) *Client { return c } -// SetScheme method sets custom scheme in the resty client. It's way to override default. -// resty.SetScheme("http") -// +// SetScheme method sets custom scheme in the Resty client. It's way to override default. +// client.SetScheme("http") func (c *Client) SetScheme(scheme string) *Client { if !IsStringEmpty(scheme) { c.scheme = scheme } - return c } @@ -728,23 +714,16 @@ func (c *Client) SetCloseConnection(close bool) *Client { // Resty exposes the raw response body as `io.ReadCloser`. Also do not forget to close the body, // otherwise you might get into connection leaks, no connection reuse. // -// Please Note: Response middlewares are not applicable, if you use this option. Basically you have +// Note: Response middlewares are not applicable, if you use this option. Basically you have // taken over the control of response parsing from `Resty`. func (c *Client) SetDoNotParseResponse(parse bool) *Client { c.notParseResponse = parse return c } -// SetLogPrefix method sets the Resty logger prefix value. -func (c *Client) SetLogPrefix(prefix string) *Client { - c.logPrefix = prefix - c.Log.SetPrefix(prefix) - return c -} - // SetPathParams method sets multiple URL path key-value pairs at one go in the -// resty client instance. -// resty.SetPathParams(map[string]string{ +// Resty client instance. +// client.SetPathParams(map[string]string{ // "userId": "sample@sample.com", // "subAccountId": "100002", // }) @@ -763,27 +742,54 @@ func (c *Client) SetPathParams(params map[string]string) *Client { // SetJSONEscapeHTML method is to enable/disable the HTML escape on JSON marshal. // -// NOTE: This option only applicable to standard JSON Marshaller. +// Note: This option only applicable to standard JSON Marshaller. func (c *Client) SetJSONEscapeHTML(b bool) *Client { c.jsonEscapeHTML = b return c } -// IsProxySet method returns the true if proxy is set on client otherwise false. +// EnableTrace method enables the Resty client trace for the requests fired from +// the client using `httptrace.ClientTrace` and provides insights. +// +// client := resty.New().EnableTrace() +// +// resp, err := client.R().Get("https://httpbin.org/get") +// fmt.Println("Error:", err) +// fmt.Println("Trace Info:", resp.Request.TraceInfo()) +// +// Also `Request.EnableTrace` available too to get trace info for single request. +// +// Since v2.0.0 +func (c *Client) EnableTrace() *Client { + c.trace = true + return c +} + +// DisableTrace method disables the Resty client trace. Refer to `Client.EnableTrace`. +// +// Since v2.0.0 +func (c *Client) DisableTrace() *Client { + c.trace = false + return c +} + +// IsProxySet method returns the true is proxy is set from resty client otherwise +// false. By default proxy is set from environment, refer to `http.ProxyFromEnvironment`. func (c *Client) IsProxySet() bool { return c.proxyURL != nil } -// GetClient method returns the current http.Client used by the resty client. +// GetClient method returns the current `http.Client` used by the resty client. func (c *Client) GetClient() *http.Client { return c.httpClient } -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // Client Unexported methods -//___________________________________ +//_______________________________________________________________________ -// executes the given `Request` object and returns response +// Executes method executes the given `Request` object and returns response +// error. func (c *Client) execute(req *Request) (*Response, error) { defer releaseBuffer(req.bodyBuf) // Apply Request middleware @@ -793,21 +799,14 @@ func (c *Client) execute(req *Request) (*Response, error) { // to modify the *resty.Request object for _, f := range c.udBeforeRequest { if err = f(c, req); err != nil { - return nil, err + return nil, wrapNoRetryErr(err) } } // resty middlewares for _, f := range c.beforeRequest { if err = f(c, req); err != nil { - return nil, err - } - } - - // call pre-request if defined - if c.preReqHook != nil { - if err = c.preReqHook(c, req); err != nil { - return nil, err + return nil, wrapNoRetryErr(err) } } @@ -815,8 +814,15 @@ func (c *Client) execute(req *Request) (*Response, error) { req.RawRequest.Host = hostHeader } + // call pre-request if defined + if c.preReqHook != nil { + if err = c.preReqHook(c, req.RawRequest); err != nil { + return nil, wrapNoRetryErr(err) + } + } + if err = requestLogger(c, req); err != nil { - return nil, err + return nil, wrapNoRetryErr(err) } req.Time = time.Now() @@ -825,10 +831,10 @@ func (c *Client) execute(req *Request) (*Response, error) { response := &Response{ Request: req, RawResponse: resp, - receivedAt: time.Now(), } if err != nil || req.notParseResponse || c.notParseResponse { + response.setReceivedAt() return response, err } @@ -841,6 +847,7 @@ func (c *Client) execute(req *Request) (*Response, error) { if _, ok := body.(*gzip.Reader); !ok { body, err = gzip.NewReader(body) if err != nil { + response.setReceivedAt() return response, err } defer closeq(body) @@ -848,9 +855,11 @@ func (c *Client) execute(req *Request) (*Response, error) { } if response.body, err = ioutil.ReadAll(body); err != nil { + response.setReceivedAt() return response, err } + response.setReceivedAt() // after we read the body response.size = int64(len(response.body)) } @@ -861,24 +870,12 @@ func (c *Client) execute(req *Request) (*Response, error) { } } - return response, err -} - -// enables a log prefix -func (c *Client) enableLogPrefix() { - c.Log.SetFlags(log.LstdFlags) - c.Log.SetPrefix(c.logPrefix) -} - -// disables a log prefix -func (c *Client) disableLogPrefix() { - c.Log.SetFlags(0) - c.Log.SetPrefix("") + return response, wrapNoRetryErr(err) } // getting TLS client config if not exists then create one -func (c *Client) getTLSConfig() (*tls.Config, error) { - transport, err := c.getTransport() +func (c *Client) tlsConfig() (*tls.Config, error) { + transport, err := c.transport() if err != nil { return nil, err } @@ -888,24 +885,26 @@ func (c *Client) getTLSConfig() (*tls.Config, error) { return transport.TLSClientConfig, nil } -// returns `*http.Transport` currently in use or error -// in case currently used `transport` is not an `*http.Transport` -func (c *Client) getTransport() (*http.Transport, error) { - if c.httpClient.Transport == nil { - c.SetTransport(new(http.Transport)) - } - +// Transport method returns `*http.Transport` currently in use or error +// in case currently used `transport` is not a `*http.Transport`. +func (c *Client) transport() (*http.Transport, error) { if transport, ok := c.httpClient.Transport.(*http.Transport); ok { return transport, nil } return nil, errors.New("current transport is not an *http.Transport instance") } -// -// File -// +// just an internal helper method +func (c *Client) outputLogTo(w io.Writer) *Client { + c.log.(*logger).l.SetOutput(w) + return c +} -// File represent file information for multipart request +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// File struct and its methods +//_______________________________________________________________________ + +// File struct represent file information for multipart request type File struct { Name string ParamName string @@ -917,10 +916,63 @@ func (f *File) String() string { return fmt.Sprintf("ParamName: %v; FileName: %v", f.ParamName, f.Name) } -// MultipartField represent custom data part for multipart request +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// MultipartField struct +//_______________________________________________________________________ + +// MultipartField struct represent custom data part for multipart request type MultipartField struct { Param string FileName string ContentType string io.Reader } + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Unexported package methods +//_______________________________________________________________________ + +func createClient(hc *http.Client) *Client { + if hc.Transport == nil { + hc.Transport = createTransport(nil) + } + + c := &Client{ // not setting lang default values + QueryParam: url.Values{}, + FormData: url.Values{}, + Header: http.Header{}, + Cookies: make([]*http.Cookie, 0), + RetryWaitTime: defaultWaitTime, + RetryMaxWaitTime: defaultMaxWaitTime, + JSONMarshal: json.Marshal, + JSONUnmarshal: json.Unmarshal, + jsonEscapeHTML: true, + httpClient: hc, + debugBodySizeLimit: math.MaxInt32, + pathParams: make(map[string]string), + } + + // Logger + c.SetLogger(createLogger()) + + // default before request middlewares + c.beforeRequest = []RequestMiddleware{ + parseRequestURL, + parseRequestHeader, + parseRequestBody, + createHTTPRequest, + addCredentials, + } + + // user defined request middlewares + c.udBeforeRequest = []RequestMiddleware{} + + // default after response middlewares + c.afterResponse = []ResponseMiddleware{ + responseLogger, + parseResponseBody, + saveResponseIntoFile, + } + + return c +} diff --git a/vendor/github.com/go-resty/resty/v2/go.mod b/vendor/github.com/go-resty/resty/v2/go.mod new file mode 100644 index 000000000..f1faf5f1b --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/go.mod @@ -0,0 +1,5 @@ +module github.com/go-resty/resty/v2 + +require golang.org/x/net v0.0.0-20200513185701-a91f0712d120 + +go 1.11 diff --git a/vendor/gopkg.in/resty.v1/middleware.go b/vendor/github.com/go-resty/resty/v2/middleware.go similarity index 73% rename from vendor/gopkg.in/resty.v1/middleware.go rename to vendor/github.com/go-resty/resty/v2/middleware.go index 9b6f102ed..703f07c60 100644 --- a/vendor/gopkg.in/resty.v1/middleware.go +++ b/vendor/github.com/go-resty/resty/v2/middleware.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. @@ -10,6 +10,7 @@ import ( "errors" "fmt" "io" + "io/ioutil" "mime/multipart" "net/http" "net/url" @@ -20,9 +21,11 @@ import ( "time" ) -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +const debugRequestLogKey = "__restyDebugRequestLog" + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // Request Middleware(s) -//___________________________________ +//_______________________________________________________________________ func parseRequestURL(c *Client, r *Request) error { // GitHub #103 Path Params @@ -104,7 +107,7 @@ func parseRequestHeader(c *Client, r *Request) error { } if IsStringEmpty(hdr.Get(hdrUserAgentKey)) { - hdr.Set(hdrUserAgentKey, fmt.Sprintf(hdrUserAgentValue, Version)) + hdr.Set(hdrUserAgentKey, hdrUserAgentValue) } ct := hdr.Get(hdrContentTypeKey) @@ -176,19 +179,58 @@ func createHTTPRequest(c *Client, r *Request) (err error) { // Add headers into http request r.RawRequest.Header = r.Header - // Add cookies into http request + // Add cookies from client instance into http request for _, cookie := range c.Cookies { r.RawRequest.AddCookie(cookie) } + // Add cookies from request instance into http request + for _, cookie := range r.Cookies { + r.RawRequest.AddCookie(cookie) + } + // it's for non-http scheme option if r.RawRequest.URL != nil && r.RawRequest.URL.Scheme == "" { r.RawRequest.URL.Scheme = c.scheme r.RawRequest.URL.Host = r.URL } + // Enable trace + if c.trace || r.trace { + r.clientTrace = &clientTrace{} + r.ctx = r.clientTrace.createContext(r.Context()) + } + // Use context if it was specified - r.addContextIfAvailable() + if r.ctx != nil { + r.RawRequest = r.RawRequest.WithContext(r.ctx) + } + + // assign get body func for the underlying raw request instance + r.RawRequest.GetBody = func() (io.ReadCloser, error) { + // If r.bodyBuf present, return the copy + if r.bodyBuf != nil { + return ioutil.NopCloser(bytes.NewReader(r.bodyBuf.Bytes())), nil + } + + // Maybe body is `io.Reader`. + // Note: Resty user have to watchout for large body size of `io.Reader` + if r.RawRequest.Body != nil { + b, err := ioutil.ReadAll(r.RawRequest.Body) + if err != nil { + return nil, err + } + + // Restore the Body + closeq(r.RawRequest.Body) + r.RawRequest.Body = ioutil.NopCloser(bytes.NewBuffer(b)) + + // Return the Body bytes + return ioutil.NopCloser(bytes.NewBuffer(b)), nil + } + + return nil, nil + } return } @@ -206,15 +248,25 @@ func addCredentials(c *Client, r *Request) error { if !c.DisableWarn { if isBasicAuth && !strings.HasPrefix(r.URL, "https") { - c.Log.Println("WARNING - Using Basic Auth in HTTP mode is not secure.") + c.log.Warnf("Using Basic Auth in HTTP mode is not secure, use HTTPS") } } - // Token Auth + // Set the Authorization Header Scheme + var authScheme string + if !IsStringEmpty(r.AuthScheme) { + authScheme = r.AuthScheme + } else if !IsStringEmpty(c.AuthScheme) { + authScheme = c.AuthScheme + } else { + authScheme = "Bearer" + } + + // Build the Token Auth header if !IsStringEmpty(r.Token) { // takes precedence - r.RawRequest.Header.Set(hdrAuthorizationKey, "Bearer "+r.Token) + r.RawRequest.Header.Set(hdrAuthorizationKey, authScheme+" "+r.Token) } else if !IsStringEmpty(c.Token) { - r.RawRequest.Header.Set(hdrAuthorizationKey, "Bearer "+c.Token) + r.RawRequest.Header.Set(hdrAuthorizationKey, authScheme+" "+c.Token) } return nil @@ -223,30 +275,32 @@ func addCredentials(c *Client, r *Request) error { func requestLogger(c *Client, r *Request) error { if c.Debug { rr := r.RawRequest - rl := &RequestLog{Header: copyHeaders(rr.Header), Body: r.fmtBodyString()} + rl := &RequestLog{Header: copyHeaders(rr.Header), Body: r.fmtBodyString(c.debugBodySizeLimit)} if c.requestLog != nil { if err := c.requestLog(rl); err != nil { return err } } + // fmt.Sprintf("COOKIES:\n%s\n", composeCookies(c.GetClient().Jar, *rr.URL)) + - reqLog := "\n---------------------- REQUEST LOG -----------------------\n" + + reqLog := "\n==============================================================================\n" + + "~~~ REQUEST ~~~\n" + fmt.Sprintf("%s %s %s\n", r.Method, rr.URL.RequestURI(), rr.Proto) + fmt.Sprintf("HOST : %s\n", rr.URL.Host) + - fmt.Sprintf("HEADERS:\n") + - composeHeaders(rl.Header) + "\n" + + fmt.Sprintf("HEADERS:\n%s\n", composeHeaders(c, r, rl.Header)) + fmt.Sprintf("BODY :\n%v\n", rl.Body) + - "----------------------------------------------------------\n" + "------------------------------------------------------------------------------\n" - c.Log.Print(reqLog) + r.initValuesMap() + r.values[debugRequestLogKey] = reqLog } return nil } -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // Response Middleware(s) -//___________________________________ +//_______________________________________________________________________ func responseLogger(c *Client, res *Response) error { if c.Debug { @@ -257,20 +311,22 @@ func responseLogger(c *Client, res *Response) error { } } - resLog := "\n---------------------- RESPONSE LOG -----------------------\n" + - fmt.Sprintf("STATUS : %s\n", res.Status()) + - fmt.Sprintf("RECEIVED AT : %v\n", res.ReceivedAt().Format(time.RFC3339Nano)) + - fmt.Sprintf("RESPONSE TIME : %v\n", res.Time()) + - "HEADERS:\n" + - composeHeaders(rl.Header) + "\n" + debugLog := res.Request.values[debugRequestLogKey].(string) + debugLog += "~~~ RESPONSE ~~~\n" + + fmt.Sprintf("STATUS : %s\n", res.Status()) + + fmt.Sprintf("PROTO : %s\n", res.RawResponse.Proto) + + fmt.Sprintf("RECEIVED AT : %v\n", res.ReceivedAt().Format(time.RFC3339Nano)) + + fmt.Sprintf("TIME DURATION: %v\n", res.Time()) + + "HEADERS :\n" + + composeHeaders(c, res.Request, rl.Header) + "\n" if res.Request.isSaveResponse { - resLog += fmt.Sprintf("BODY :\n***** RESPONSE WRITTEN INTO FILE *****\n") + debugLog += fmt.Sprintf("BODY :\n***** RESPONSE WRITTEN INTO FILE *****\n") } else { - resLog += fmt.Sprintf("BODY :\n%v\n", rl.Body) + debugLog += fmt.Sprintf("BODY :\n%v\n", rl.Body) } - resLog += "----------------------------------------------------------\n" + debugLog += "==============================================================================\n" - c.Log.Print(resLog) + c.log.Debugf("%s", debugLog) } return nil @@ -281,10 +337,11 @@ func parseResponseBody(c *Client, res *Response) (err error) { return } // Handles only JSON or XML content type - ct := firstNonEmpty(res.Header().Get(hdrContentTypeKey), res.Request.fallbackContentType) + ct := firstNonEmpty(res.Request.forceContentType, res.Header().Get(hdrContentTypeKey), res.Request.fallbackContentType) if IsJSONType(ct) || IsXMLType(ct) { // HTTP status code > 199 and < 300, considered as Result if res.IsSuccess() { + res.Request.Error = nil if res.Request.Result != nil { err = Unmarshalc(c, ct, res.body, res.Request.Result) return @@ -398,7 +455,7 @@ func handleRequestBody(c *Client, r *Request) (err error) { r.bodyBuf = nil if reader, ok := r.Body.(io.Reader); ok { - if c.setContentLength || r.setContentLength { // keep backward compability + if c.setContentLength || r.setContentLength { // keep backward compatibility r.bodyBuf = acquireBuffer() _, err = r.bodyBuf.ReadFrom(reader) r.Body = nil diff --git a/vendor/gopkg.in/resty.v1/redirect.go b/vendor/github.com/go-resty/resty/v2/redirect.go similarity index 85% rename from vendor/gopkg.in/resty.v1/redirect.go rename to vendor/github.com/go-resty/resty/v2/redirect.go index b426134ad..2976b7c5a 100644 --- a/vendor/gopkg.in/resty.v1/redirect.go +++ b/vendor/github.com/go-resty/resty/v2/redirect.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. @@ -47,9 +47,7 @@ func FlexibleRedirectPolicy(noOfRedirect int) RedirectPolicy { if len(via) >= noOfRedirect { return fmt.Errorf("stopped after %d redirects", noOfRedirect) } - checkHostAndAddHeaders(req, via[0]) - return nil }) } @@ -74,6 +72,10 @@ func DomainCheckRedirectPolicy(hostnames ...string) RedirectPolicy { return fn } +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Package Unexported methods +//_______________________________________________________________________ + func getHostname(host string) (hostname string) { if strings.Index(host, ":") > 0 { host, _, _ = net.SplitHostPort(host) @@ -85,7 +87,7 @@ func getHostname(host string) (hostname string) { // By default Golang will not redirect request headers // after go throughing various discussion comments from thread // https://github.com/golang/go/issues/4800 -// go-resty will add all the headers during a redirect for the same host +// Resty will add all the headers during a redirect for the same host func checkHostAndAddHeaders(cur *http.Request, pre *http.Request) { curHostname := getHostname(cur.URL.Host) preHostname := getHostname(pre.URL.Host) @@ -94,6 +96,6 @@ func checkHostAndAddHeaders(cur *http.Request, pre *http.Request) { cur.Header[key] = val } } else { // only library User-Agent header is added - cur.Header.Set(hdrUserAgentKey, fmt.Sprintf(hdrUserAgentValue, Version)) + cur.Header.Set(hdrUserAgentKey, hdrUserAgentValue) } } diff --git a/vendor/gopkg.in/resty.v1/request.go b/vendor/github.com/go-resty/resty/v2/request.go similarity index 52% rename from vendor/gopkg.in/resty.v1/request.go rename to vendor/github.com/go-resty/resty/v2/request.go index c6adff3dd..3bf236fd9 100644 --- a/vendor/gopkg.in/resty.v1/request.go +++ b/vendor/github.com/go-resty/resty/v2/request.go @@ -1,66 +1,124 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. package resty import ( - "encoding/base64" + "bytes" + "context" "encoding/json" "encoding/xml" "fmt" "io" "net" + "net/http" "net/url" "reflect" "strings" + "time" ) -// SRVRecord holds the data to query the SRV record for the following service -type SRVRecord struct { - Service string - Domain string +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Request struct and methods +//_______________________________________________________________________ + +// Request struct is used to compose and fire individual request from +// resty client. Request provides an options to override client level +// settings and also an options for the request composition. +type Request struct { + URL string + Method string + Token string + AuthScheme string + QueryParam url.Values + FormData url.Values + Header http.Header + Time time.Time + Body interface{} + Result interface{} + Error interface{} + RawRequest *http.Request + SRV *SRVRecord + UserInfo *User + Cookies []*http.Cookie + + isMultiPart bool + isFormData bool + setContentLength bool + isSaveResponse bool + notParseResponse bool + jsonEscapeHTML bool + trace bool + outputFile string + fallbackContentType string + forceContentType string + ctx context.Context + pathParams map[string]string + values map[string]interface{} + client *Client + bodyBuf *bytes.Buffer + clientTrace *clientTrace + multipartFiles []*File + multipartFields []*MultipartField +} + +// Context method returns the Context if its already set in request +// otherwise it creates new one using `context.Background()`. +func (r *Request) Context() context.Context { + if r.ctx == nil { + return context.Background() + } + return r.ctx +} + +// SetContext method sets the context.Context for current Request. It allows +// to interrupt the request execution if ctx.Done() channel is closed. +// See https://blog.golang.org/context article and the "context" package +// documentation. +func (r *Request) SetContext(ctx context.Context) *Request { + r.ctx = ctx + return r } // SetHeader method is to set a single header field and its value in the current request. -// Example: To set `Content-Type` and `Accept` as `application/json`. -// resty.R(). +// +// For Example: To set `Content-Type` and `Accept` as `application/json`. +// client.R(). // SetHeader("Content-Type", "application/json"). // SetHeader("Accept", "application/json") // // Also you can override header value, which was set at client instance level. -// func (r *Request) SetHeader(header, value string) *Request { r.Header.Set(header, value) return r } // SetHeaders method sets multiple headers field and its values at one go in the current request. -// Example: To set `Content-Type` and `Accept` as `application/json` // -// resty.R(). +// For Example: To set `Content-Type` and `Accept` as `application/json` +// +// client.R(). // SetHeaders(map[string]string{ // "Content-Type": "application/json", // "Accept": "application/json", // }) // Also you can override header value, which was set at client instance level. -// func (r *Request) SetHeaders(headers map[string]string) *Request { for h, v := range headers { r.SetHeader(h, v) } - return r } // SetQueryParam method sets single parameter and its value in the current request. // It will be formed as query string for the request. -// Example: `search=kitchen%20papers&size=large` in the URL after `?` mark. -// resty.R(). +// +// For Example: `search=kitchen%20papers&size=large` in the URL after `?` mark. +// client.R(). // SetQueryParam("search", "kitchen papers"). // SetQueryParam("size", "large") -// Also you can override query params value, which was set at client instance level -// +// Also you can override query params value, which was set at client instance level. func (r *Request) SetQueryParam(param, value string) *Request { r.QueryParam.Set(param, value) return r @@ -68,47 +126,45 @@ func (r *Request) SetQueryParam(param, value string) *Request { // SetQueryParams method sets multiple parameters and its values at one go in the current request. // It will be formed as query string for the request. -// Example: `search=kitchen%20papers&size=large` in the URL after `?` mark. -// resty.R(). +// +// For Example: `search=kitchen%20papers&size=large` in the URL after `?` mark. +// client.R(). // SetQueryParams(map[string]string{ // "search": "kitchen papers", // "size": "large", // }) -// Also you can override query params value, which was set at client instance level -// +// Also you can override query params value, which was set at client instance level. func (r *Request) SetQueryParams(params map[string]string) *Request { for p, v := range params { r.SetQueryParam(p, v) } - return r } -// SetMultiValueQueryParams method appends multiple parameters with multi-value -// at one go in the current request. It will be formed as query string for the request. -// Example: `status=pending&status=approved&status=open` in the URL after `?` mark. -// resty.R(). -// SetMultiValueQueryParams(url.Values{ +// SetQueryParamsFromValues method appends multiple parameters with multi-value +// (`url.Values`) at one go in the current request. It will be formed as +// query string for the request. +// +// For Example: `status=pending&status=approved&status=open` in the URL after `?` mark. +// client.R(). +// SetQueryParamsFromValues(url.Values{ // "status": []string{"pending", "approved", "open"}, // }) -// Also you can override query params value, which was set at client instance level -// -func (r *Request) SetMultiValueQueryParams(params url.Values) *Request { +// Also you can override query params value, which was set at client instance level. +func (r *Request) SetQueryParamsFromValues(params url.Values) *Request { for p, v := range params { for _, pv := range v { r.QueryParam.Add(p, pv) } } - return r } // SetQueryString method provides ability to use string as an input to set URL query string for the request. // // Using String as an input -// resty.R(). +// client.R(). // SetQueryString("productId=232&template=fresh-sample&cat=resty&source=google&kw=buy a lot more") -// func (r *Request) SetQueryString(query string) *Request { params, err := url.ParseQuery(strings.TrimSpace(query)) if err == nil { @@ -118,7 +174,7 @@ func (r *Request) SetQueryString(query string) *Request { } } } else { - r.client.Log.Printf("ERROR %v", err) + r.client.log.Errorf("%v", err) } return r } @@ -126,36 +182,32 @@ func (r *Request) SetQueryString(query string) *Request { // SetFormData method sets Form parameters and their values in the current request. // It's applicable only HTTP method `POST` and `PUT` and requests content type would be set as // `application/x-www-form-urlencoded`. -// resty.R(). +// client.R(). // SetFormData(map[string]string{ // "access_token": "BC594900-518B-4F7E-AC75-BD37F019E08F", // "user_id": "3455454545", // }) -// Also you can override form data value, which was set at client instance level -// +// Also you can override form data value, which was set at client instance level. func (r *Request) SetFormData(data map[string]string) *Request { for k, v := range data { r.FormData.Set(k, v) } - return r } -// SetMultiValueFormData method appends multiple form parameters with multi-value -// at one go in the current request. -// resty.R(). -// SetMultiValueFormData(url.Values{ +// SetFormDataFromValues method appends multiple form parameters with multi-value +// (`url.Values`) at one go in the current request. +// client.R(). +// SetFormDataFromValues(url.Values{ // "search_criteria": []string{"book", "glass", "pencil"}, // }) -// Also you can override form data value, which was set at client instance level -// -func (r *Request) SetMultiValueFormData(params url.Values) *Request { - for k, v := range params { +// Also you can override form data value, which was set at client instance level. +func (r *Request) SetFormDataFromValues(data url.Values) *Request { + for k, v := range data { for _, kv := range v { r.FormData.Add(k, kv) } } - return r } @@ -166,17 +218,15 @@ func (r *Request) SetMultiValueFormData(params url.Values) *Request { // // Note: `io.Reader` is processed as bufferless mode while sending request. // -// Example: -// -// Struct as a body input, based on content type, it will be marshalled. -// resty.R(). +// For Example: Struct as a body input, based on content type, it will be marshalled. +// client.R(). // SetBody(User{ // Username: "jeeva@myjeeva.com", // Password: "welcome2resty", // }) // // Map as a body input, based on content type, it will be marshalled. -// resty.R(). +// client.R(). // SetBody(map[string]interface{}{ // "username": "jeeva@myjeeva.com", // "password": "welcome2resty", @@ -190,57 +240,53 @@ func (r *Request) SetMultiValueFormData(params url.Values) *Request { // }) // // String as a body input. Suitable for any need as a string input. -// resty.R(). +// client.R(). // SetBody(`{ // "username": "jeeva@getrightcare.com", // "password": "admin" // }`) // // []byte as a body input. Suitable for raw request such as file upload, serialize & deserialize, etc. -// resty.R(). +// client.R(). // SetBody([]byte("This is my raw request, sent as-is")) -// func (r *Request) SetBody(body interface{}) *Request { r.Body = body return r } -// SetResult method is to register the response `Result` object for automatic unmarshalling in the RESTful mode +// SetResult method is to register the response `Result` object for automatic unmarshalling for the request, // if response status code is between 200 and 299 and content type either JSON or XML. // // Note: Result object can be pointer or non-pointer. -// resty.R().SetResult(&AuthToken{}) +// client.R().SetResult(&AuthToken{}) // // OR -// resty.R().SetResult(AuthToken{}) +// client.R().SetResult(AuthToken{}) // -// Accessing a result value +// Accessing a result value from response instance. // response.Result().(*AuthToken) -// func (r *Request) SetResult(res interface{}) *Request { r.Result = getPointer(res) return r } -// SetError method is to register the request `Error` object for automatic unmarshalling in the RESTful mode +// SetError method is to register the request `Error` object for automatic unmarshalling for the request, // if response status code is greater than 399 and content type either JSON or XML. // // Note: Error object can be pointer or non-pointer. -// resty.R().SetError(&AuthError{}) +// client.R().SetError(&AuthError{}) // // OR -// resty.R().SetError(AuthError{}) +// client.R().SetError(AuthError{}) // -// Accessing a error value +// Accessing a error value from response instance. // response.Error().(*AuthError) -// func (r *Request) SetError(err interface{}) *Request { r.Error = getPointer(err) return r } // SetFile method is to set single file field name and its path for multipart upload. -// resty.R(). +// client.R(). // SetFile("my_file", "/Users/jeeva/Gas Bill - Sep.pdf") -// func (r *Request) SetFile(param, filePath string) *Request { r.isMultiPart = true r.FormData.Set("@"+param, filePath) @@ -248,28 +294,24 @@ func (r *Request) SetFile(param, filePath string) *Request { } // SetFiles method is to set multiple file field name and its path for multipart upload. -// resty.R(). +// client.R(). // SetFiles(map[string]string{ // "my_file1": "/Users/jeeva/Gas Bill - Sep.pdf", // "my_file2": "/Users/jeeva/Electricity Bill - Sep.pdf", // "my_file3": "/Users/jeeva/Water Bill - Sep.pdf", // }) -// func (r *Request) SetFiles(files map[string]string) *Request { r.isMultiPart = true - for f, fp := range files { r.FormData.Set("@"+f, fp) } - return r } // SetFileReader method is to set single file using io.Reader for multipart upload. -// resty.R(). +// client.R(). // SetFileReader("profile_img", "my-profile-img.png", bytes.NewReader(profileImgBytes)). // SetFileReader("notes", "user-notes.txt", bytes.NewReader(notesBytes)) -// func (r *Request) SetFileReader(param, fileName string, reader io.Reader) *Request { r.isMultiPart = true r.multipartFiles = append(r.multipartFiles, &File{ @@ -280,6 +322,15 @@ func (r *Request) SetFileReader(param, fileName string, reader io.Reader) *Reque return r } +// SetMultipartFormData method allows simple form data to be attached to the request as `multipart:form-data` +func (r *Request) SetMultipartFormData(data map[string]string) *Request { + for k, v := range data { + r = r.SetMultipartField(k, "", "", strings.NewReader(v)) + } + + return r +} + // SetMultipartField method is to set custom data using io.Reader for multipart upload. func (r *Request) SetMultipartField(param, fileName, contentType string, reader io.Reader) *Request { r.isMultiPart = true @@ -293,8 +344,9 @@ func (r *Request) SetMultipartField(param, fileName, contentType string, reader } // SetMultipartFields method is to set multiple data fields using io.Reader for multipart upload. -// Example: -// resty.R().SetMultipartFields( +// +// For Example: +// client.R().SetMultipartFields( // &resty.MultipartField{ // Param: "uploadManifest1", // FileName: "upload-file-1.json", @@ -309,7 +361,7 @@ func (r *Request) SetMultipartField(param, fileName, contentType string, reader // }) // // If you have slice already, then simply call- -// resty.R().SetMultipartFields(fields...) +// client.R().SetMultipartFields(fields...) func (r *Request) SetMultipartFields(fields ...*MultipartField) *Request { r.isMultiPart = true r.multipartFields = append(r.multipartFields, fields...) @@ -317,48 +369,69 @@ func (r *Request) SetMultipartFields(fields ...*MultipartField) *Request { } // SetContentLength method sets the HTTP header `Content-Length` value for current request. -// By default go-resty won't set `Content-Length`. Also you have an option to enable for every -// request. See `resty.SetContentLength` -// resty.R().SetContentLength(true) +// By default Resty won't set `Content-Length`. Also you have an option to enable for every +// request. // +// See `Client.SetContentLength` +// client.R().SetContentLength(true) func (r *Request) SetContentLength(l bool) *Request { r.setContentLength = true return r } // SetBasicAuth method sets the basic authentication header in the current HTTP request. -// For Header example: +// +// For Example: // Authorization: Basic // // To set the header for username "go-resty" and password "welcome" -// resty.R().SetBasicAuth("go-resty", "welcome") -// -// This method overrides the credentials set by method `resty.SetBasicAuth`. +// client.R().SetBasicAuth("go-resty", "welcome") // +// This method overrides the credentials set by method `Client.SetBasicAuth`. func (r *Request) SetBasicAuth(username, password string) *Request { r.UserInfo = &User{Username: username, Password: password} return r } -// SetAuthToken method sets bearer auth token header in the current HTTP request. Header example: +// SetAuthToken method sets the auth token header(Default Scheme: Bearer) in the current HTTP request. Header example: // Authorization: Bearer // -// Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F +// For Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F // -// resty.R().SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") -// -// This method overrides the Auth token set by method `resty.SetAuthToken`. +// client.R().SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") // +// This method overrides the Auth token set by method `Client.SetAuthToken`. func (r *Request) SetAuthToken(token string) *Request { r.Token = token return r } +// SetAuthScheme method sets the auth token scheme type in the HTTP request. For Example: +// Authorization: +// +// For Example: To set the scheme to use OAuth +// +// client.R().SetAuthScheme("OAuth") +// +// This auth header scheme gets added to all the request rasied from this client instance. +// Also it can be overridden or set one at the request level is supported. +// +// Information about Auth schemes can be found in RFC7235 which is linked to below along with the page containing +// the currently defined official authentication schemes: +// https://tools.ietf.org/html/rfc7235 +// https://www.iana.org/assignments/http-authschemes/http-authschemes.xhtml#authschemes +// +// This method overrides the Authorization scheme set by method `Client.SetAuthScheme`. +func (r *Request) SetAuthScheme(scheme string) *Request { + r.AuthScheme = scheme + return r +} + // SetOutput method sets the output file for current HTTP request. Current HTTP response will be // saved into given file. It is similar to `curl -o` flag. Absolute path or relative path can be used. // If is it relative path then output file goes under the output directory, as mentioned // in the `Client.SetOutputDirectory`. -// resty.R(). +// client.R(). // SetOutput("/Users/jeeva/Downloads/ReplyWithHeader-v5.1-beta.zip"). // Get("http://bit.ly/1LouEKr") // @@ -371,7 +444,7 @@ func (r *Request) SetOutput(file string) *Request { // SetSRV method sets the details to query the service SRV record and execute the // request. -// resty.R(). +// client.R(). // SetSRV(SRVRecord{"web", "testservice.com"}). // Get("/get") func (r *Request) SetSRV(srv *SRVRecord) *Request { @@ -383,7 +456,7 @@ func (r *Request) SetSRV(srv *SRVRecord) *Request { // Resty exposes the raw response body as `io.ReadCloser`. Also do not forget to close the body, // otherwise you might get into connection leaks, no connection reuse. // -// Please Note: Response middlewares are not applicable, if you use this option. Basically you have +// Note: Response middlewares are not applicable, if you use this option. Basically you have // taken over the control of response parsing from `Resty`. func (r *Request) SetDoNotParseResponse(parse bool) *Request { r.notParseResponse = parse @@ -391,8 +464,8 @@ func (r *Request) SetDoNotParseResponse(parse bool) *Request { } // SetPathParams method sets multiple URL path key-value pairs at one go in the -// resty current request instance. -// resty.R().SetPathParams(map[string]string{ +// Resty current request instance. +// client.R().SetPathParams(map[string]string{ // "userId": "sample@sample.com", // "subAccountId": "100002", // }) @@ -416,17 +489,122 @@ func (r *Request) ExpectContentType(contentType string) *Request { return r } +// ForceContentType method provides a strong sense of response `Content-Type` for automatic unmarshalling. +// Resty will respect it with higher priority; even response `Content-Type` response header value is available. +func (r *Request) ForceContentType(contentType string) *Request { + r.forceContentType = contentType + return r +} + // SetJSONEscapeHTML method is to enable/disable the HTML escape on JSON marshal. // -// NOTE: This option only applicable to standard JSON Marshaller. +// Note: This option only applicable to standard JSON Marshaller. func (r *Request) SetJSONEscapeHTML(b bool) *Request { r.jsonEscapeHTML = b return r } -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// SetCookie method appends a single cookie in the current request instance. +// client.R().SetCookie(&http.Cookie{ +// Name:"go-resty", +// Value:"This is cookie value", +// }) +// +// Note: Method appends the Cookie value into existing Cookie if already existing. +// +// Since v2.1.0 +func (r *Request) SetCookie(hc *http.Cookie) *Request { + r.Cookies = append(r.Cookies, hc) + return r +} + +// SetCookies method sets an array of cookies in the current request instance. +// cookies := []*http.Cookie{ +// &http.Cookie{ +// Name:"go-resty-1", +// Value:"This is cookie 1 value", +// }, +// &http.Cookie{ +// Name:"go-resty-2", +// Value:"This is cookie 2 value", +// }, +// } +// +// // Setting a cookies into resty's current request +// client.R().SetCookies(cookies) +// +// Note: Method appends the Cookie value into existing Cookie if already existing. +// +// Since v2.1.0 +func (r *Request) SetCookies(rs []*http.Cookie) *Request { + r.Cookies = append(r.Cookies, rs...) + return r +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// HTTP request tracing +//_______________________________________________________________________ + +// EnableTrace method enables trace for the current request +// using `httptrace.ClientTrace` and provides insights. +// +// client := resty.New() +// +// resp, err := client.R().EnableTrace().Get("https://httpbin.org/get") +// fmt.Println("Error:", err) +// fmt.Println("Trace Info:", resp.Request.TraceInfo()) +// +// See `Client.EnableTrace` available too to get trace info for all requests. +// +// Since v2.0.0 +func (r *Request) EnableTrace() *Request { + r.trace = true + return r +} + +// TraceInfo method returns the trace info for the request. +// If either the Client or Request EnableTrace function has not been called +// prior to the request being made, an empty TraceInfo object will be returned. +// +// Since v2.0.0 +func (r *Request) TraceInfo() TraceInfo { + ct := r.clientTrace + + if ct == nil { + return TraceInfo{} + } + + ti := TraceInfo{ + DNSLookup: ct.dnsDone.Sub(ct.dnsStart), + TLSHandshake: ct.tlsHandshakeDone.Sub(ct.tlsHandshakeStart), + ServerTime: ct.gotFirstResponseByte.Sub(ct.gotConn), + TotalTime: ct.endTime.Sub(ct.dnsStart), + IsConnReused: ct.gotConnInfo.Reused, + IsConnWasIdle: ct.gotConnInfo.WasIdle, + ConnIdleTime: ct.gotConnInfo.IdleTime, + } + + // Only calcuate on successful connections + if !ct.connectDone.IsZero() { + ti.TCPConnTime = ct.connectDone.Sub(ct.dnsDone) + } + + // Only calcuate on successful connections + if !ct.gotConn.IsZero() { + ti.ConnTime = ct.gotConn.Sub(ct.getConn) + } + + // Only calcuate on successful connections + if !ct.gotFirstResponseByte.IsZero() { + ti.ResponseTime = ct.endTime.Sub(ct.gotFirstResponseByte) + } + + return ti +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // HTTP verb method starts here -//___________________________________ +//_______________________________________________________________________ // Get method does GET HTTP request. It's defined in section 4.3.1 of RFC7231. func (r *Request) Get(url string) (*Response, error) { @@ -463,15 +641,25 @@ func (r *Request) Patch(url string) (*Response, error) { return r.Execute(MethodPatch, url) } +// Send method performs the HTTP request using the method and URL already defined +// for current `Request`. +// req := client.R() +// req.Method = resty.GET +// req.URL = "http://httpbin.org/get" +// resp, err := client.R().Send() +func (r *Request) Send() (*Response, error) { + return r.Execute(r.Method, r.URL) +} + // Execute method performs the HTTP request with given HTTP method and URL // for current `Request`. -// resp, err := resty.R().Execute(resty.GET, "http://httpbin.org/get") -// +// resp, err := client.R().Execute(resty.GET, "http://httpbin.org/get") func (r *Request) Execute(method, url string) (*Response, error) { var addrs []*net.SRV + var resp *Response var err error - if r.isMultiPart && !(method == MethodPost || method == MethodPut) { + if r.isMultiPart && !(method == MethodPost || method == MethodPut || method == MethodPatch) { return nil, fmt.Errorf("multipart content is not allowed in HTTP verb [%v]", method) } @@ -486,12 +674,12 @@ func (r *Request) Execute(method, url string) (*Response, error) { r.URL = r.selectAddr(addrs, url, 0) if r.client.RetryCount == 0 { - return r.client.execute(r) + resp, err = r.client.execute(r) + return resp, unwrapNoRetryErr(err) } - var resp *Response attempt := 0 - _ = Backoff( + err = Backoff( func() (*Response, error) { attempt++ @@ -499,12 +687,7 @@ func (r *Request) Execute(method, url string) (*Response, error) { resp, err = r.client.execute(r) if err != nil { - r.client.Log.Printf("ERROR %v, Attempt %v", err, attempt) - if r.isContextCancelledIfAvailable() { - // stop Backoff from retrying request if request has been - // canceled by context - return resp, nil - } + r.client.log.Errorf("%v, Attempt %v", err, attempt) } return resp, err @@ -515,58 +698,83 @@ func (r *Request) Execute(method, url string) (*Response, error) { RetryConditions(r.client.RetryConditions), ) - return resp, err + return resp, unwrapNoRetryErr(err) } -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// SRVRecord struct +//_______________________________________________________________________ + +// SRVRecord struct holds the data to query the SRV record for the +// following service. +type SRVRecord struct { + Service string + Domain string +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // Request Unexported methods -//___________________________________ +//_______________________________________________________________________ -func (r *Request) fmtBodyString() (body string) { +func (r *Request) fmtBodyString(sl int64) (body string) { body = "***** NO CONTENT *****" - if isPayloadSupported(r.Method, r.client.AllowGetMethodPayload) { - if _, ok := r.Body.(io.Reader); ok { - body = "***** BODY IS io.Reader *****" + if !isPayloadSupported(r.Method, r.client.AllowGetMethodPayload) { + return + } + + if _, ok := r.Body.(io.Reader); ok { + body = "***** BODY IS io.Reader *****" + return + } + + // multipart or form-data + if r.isMultiPart || r.isFormData { + bodySize := int64(r.bodyBuf.Len()) + if bodySize > sl { + body = fmt.Sprintf("***** REQUEST TOO LARGE (size - %d) *****", bodySize) return } + body = r.bodyBuf.String() + return + } - // multipart or form-data - if r.isMultiPart || r.isFormData { - body = r.bodyBuf.String() - return - } + // request body data + if r.Body == nil { + return + } + var prtBodyBytes []byte + var err error - // request body data - if r.Body == nil { - return - } - var prtBodyBytes []byte - var err error - - contentType := r.Header.Get(hdrContentTypeKey) - kind := kindOf(r.Body) - if canJSONMarshal(contentType, kind) { - prtBodyBytes, err = json.MarshalIndent(&r.Body, "", " ") - } else if IsXMLType(contentType) && (kind == reflect.Struct) { - prtBodyBytes, err = xml.MarshalIndent(&r.Body, "", " ") - } else if b, ok := r.Body.(string); ok { - if IsJSONType(contentType) { - bodyBytes := []byte(b) - out := acquireBuffer() - defer releaseBuffer(out) - if err = json.Indent(out, bodyBytes, "", " "); err == nil { - prtBodyBytes = out.Bytes() - } - } else { - body = b - return + contentType := r.Header.Get(hdrContentTypeKey) + kind := kindOf(r.Body) + if canJSONMarshal(contentType, kind) { + prtBodyBytes, err = json.MarshalIndent(&r.Body, "", " ") + } else if IsXMLType(contentType) && (kind == reflect.Struct) { + prtBodyBytes, err = xml.MarshalIndent(&r.Body, "", " ") + } else if b, ok := r.Body.(string); ok { + if IsJSONType(contentType) { + bodyBytes := []byte(b) + out := acquireBuffer() + defer releaseBuffer(out) + if err = json.Indent(out, bodyBytes, "", " "); err == nil { + prtBodyBytes = out.Bytes() } - } else if b, ok := r.Body.([]byte); ok { - body = base64.StdEncoding.EncodeToString(b) + } else { + body = b } + } else if b, ok := r.Body.([]byte); ok { + body = fmt.Sprintf("***** BODY IS byte(s) (size - %d) *****", len(b)) + return + } - if prtBodyBytes != nil && err == nil { - body = string(prtBodyBytes) + if prtBodyBytes != nil && err == nil { + body = string(prtBodyBytes) + } + + if len(body) > 0 { + bodySize := int64(len([]byte(body))) + if bodySize > sl { + body = fmt.Sprintf("***** REQUEST TOO LARGE (size - %d) *****", bodySize) } } @@ -584,3 +792,18 @@ func (r *Request) selectAddr(addrs []*net.SRV, path string, attempt int) string return fmt.Sprintf("%s://%s:%d/%s", r.client.scheme, domain, addrs[idx].Port, path) } + +func (r *Request) initValuesMap() { + if r.values == nil { + r.values = make(map[string]interface{}) + } +} + +var noescapeJSONMarshal = func(v interface{}) ([]byte, error) { + buf := acquireBuffer() + defer releaseBuffer(buf) + encoder := json.NewEncoder(buf) + encoder.SetEscapeHTML(false) + err := encoder.Encode(v) + return buf.Bytes(), err +} diff --git a/vendor/gopkg.in/resty.v1/response.go b/vendor/github.com/go-resty/resty/v2/response.go similarity index 68% rename from vendor/gopkg.in/resty.v1/response.go rename to vendor/github.com/go-resty/resty/v2/response.go index ea2a027a5..b82bce448 100644 --- a/vendor/gopkg.in/resty.v1/response.go +++ b/vendor/github.com/go-resty/resty/v2/response.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. @@ -13,7 +13,11 @@ import ( "time" ) -// Response is an object represents executed request and its values. +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Response struct and methods +//_______________________________________________________________________ + +// Response struct holds response values of executed request. type Response struct { Request *Request RawResponse *http.Response @@ -24,6 +28,7 @@ type Response struct { } // Body method returns HTTP response as []byte array for the executed request. +// // Note: `Response.Body` might be nil, if `Request.SetOutput` is used. func (r *Response) Body() []byte { if r.RawResponse == nil { @@ -38,7 +43,6 @@ func (r *Response) Status() string { if r.RawResponse == nil { return "" } - return r.RawResponse.Status } @@ -48,10 +52,17 @@ func (r *Response) StatusCode() int { if r.RawResponse == nil { return 0 } - return r.RawResponse.StatusCode } +// Proto method returns the HTTP response protocol used for the request. +func (r *Response) Proto() string { + if r.RawResponse == nil { + return "" + } + return r.RawResponse.Proto +} + // Result method returns the response value as an object if it has one func (r *Response) Result() interface{} { return r.Request.Result @@ -67,7 +78,6 @@ func (r *Response) Header() http.Header { if r.RawResponse == nil { return http.Header{} } - return r.RawResponse.Header } @@ -76,7 +86,6 @@ func (r *Response) Cookies() []*http.Cookie { if r.RawResponse == nil { return make([]*http.Cookie, 0) } - return r.RawResponse.Cookies() } @@ -85,14 +94,17 @@ func (r *Response) String() string { if r.body == nil { return "" } - return strings.TrimSpace(string(r.body)) } // Time method returns the time of HTTP response time that from request we sent and received a request. -// See `response.ReceivedAt` to know when client recevied response and see `response.Request.Time` to know +// +// See `Response.ReceivedAt` to know when client recevied response and see `Response.Request.Time` to know // when client sent a request. func (r *Response) Time() time.Duration { + if r.Request.clientTrace != nil { + return r.Request.TraceInfo().TotalTime + } return r.receivedAt.Sub(r.Request.Time) } @@ -120,16 +132,27 @@ func (r *Response) RawBody() io.ReadCloser { return r.RawResponse.Body } -// IsSuccess method returns true if HTTP status code >= 200 and <= 299 otherwise false. +// IsSuccess method returns true if HTTP status `code >= 200 and <= 299` otherwise false. func (r *Response) IsSuccess() bool { return r.StatusCode() > 199 && r.StatusCode() < 300 } -// IsError method returns true if HTTP status code >= 400 otherwise false. +// IsError method returns true if HTTP status `code >= 400` otherwise false. func (r *Response) IsError() bool { return r.StatusCode() > 399 } +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Response Unexported methods +//_______________________________________________________________________ + +func (r *Response) setReceivedAt() { + r.receivedAt = time.Now() + if r.Request.clientTrace != nil { + r.Request.clientTrace.endTime = r.receivedAt + } +} + func (r *Response) fmtBodyString(sl int64) string { if r.body != nil { if int64(len(r.body)) > sl { @@ -139,9 +162,11 @@ func (r *Response) fmtBodyString(sl int64) string { if IsJSONType(ct) { out := acquireBuffer() defer releaseBuffer(out) - if err := json.Indent(out, r.body, "", " "); err == nil { - return out.String() + err := json.Indent(out, r.body, "", " ") + if err != nil { + return fmt.Sprintf("*** Error: Unable to format response body - \"%s\" ***\n\nLog Body as-is:\n%s", err, r.String()) } + return out.String() } return r.String() } diff --git a/vendor/github.com/go-resty/resty/v2/resty.go b/vendor/github.com/go-resty/resty/v2/resty.go new file mode 100644 index 000000000..4685594b8 --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/resty.go @@ -0,0 +1,40 @@ +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +// Package resty provides Simple HTTP and REST client library for Go. +package resty + +import ( + "net" + "net/http" + "net/http/cookiejar" + + "golang.org/x/net/publicsuffix" +) + +// Version # of resty +const Version = "2.3.0" + +// New method creates a new Resty client. +func New() *Client { + cookieJar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) + return createClient(&http.Client{ + Jar: cookieJar, + }) +} + +// NewWithClient method creates a new Resty client with given `http.Client`. +func NewWithClient(hc *http.Client) *Client { + return createClient(hc) +} + +// NewWithLocalAddr method creates a new Resty client with given Local Address +// to dial from. +func NewWithLocalAddr(localAddr net.Addr) *Client { + cookieJar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) + return createClient(&http.Client{ + Jar: cookieJar, + Transport: createTransport(localAddr), + }) +} diff --git a/vendor/github.com/go-resty/resty/v2/retry.go b/vendor/github.com/go-resty/resty/v2/retry.go new file mode 100644 index 000000000..0b7c6ffe8 --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/retry.go @@ -0,0 +1,181 @@ +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "context" + "math" + "math/rand" + "time" +) + +const ( + defaultMaxRetries = 3 + defaultWaitTime = time.Duration(100) * time.Millisecond + defaultMaxWaitTime = time.Duration(2000) * time.Millisecond +) + +type ( + // Option is to create convenient retry options like wait time, max retries, etc. + Option func(*Options) + + // RetryConditionFunc type is for retry condition function + // input: non-nil Response OR request execution error + RetryConditionFunc func(*Response, error) bool + + // RetryAfterFunc returns time to wait before retry + // For example, it can parse HTTP Retry-After header + // https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html + // Non-nil error is returned if it is found that request is not retryable + // (0, nil) is a special result means 'use default algorithm' + RetryAfterFunc func(*Client, *Response) (time.Duration, error) + + // Options struct is used to hold retry settings. + Options struct { + maxRetries int + waitTime time.Duration + maxWaitTime time.Duration + retryConditions []RetryConditionFunc + } +) + +// Retries sets the max number of retries +func Retries(value int) Option { + return func(o *Options) { + o.maxRetries = value + } +} + +// WaitTime sets the default wait time to sleep between requests +func WaitTime(value time.Duration) Option { + return func(o *Options) { + o.waitTime = value + } +} + +// MaxWaitTime sets the max wait time to sleep between requests +func MaxWaitTime(value time.Duration) Option { + return func(o *Options) { + o.maxWaitTime = value + } +} + +// RetryConditions sets the conditions that will be checked for retry. +func RetryConditions(conditions []RetryConditionFunc) Option { + return func(o *Options) { + o.retryConditions = conditions + } +} + +// Backoff retries with increasing timeout duration up until X amount of retries +// (Default is 3 attempts, Override with option Retries(n)) +func Backoff(operation func() (*Response, error), options ...Option) error { + // Defaults + opts := Options{ + maxRetries: defaultMaxRetries, + waitTime: defaultWaitTime, + maxWaitTime: defaultMaxWaitTime, + retryConditions: []RetryConditionFunc{}, + } + + for _, o := range options { + o(&opts) + } + + var ( + resp *Response + err error + ) + + for attempt := 0; attempt <= opts.maxRetries; attempt++ { + resp, err = operation() + ctx := context.Background() + if resp != nil && resp.Request.ctx != nil { + ctx = resp.Request.ctx + } + if ctx.Err() != nil { + return err + } + + err1 := unwrapNoRetryErr(err) // raw error, it used for return users callback. + needsRetry := err != nil && err == err1 // retry on a few operation errors by default + + for _, condition := range opts.retryConditions { + needsRetry = condition(resp, err1) + if needsRetry { + break + } + } + + if !needsRetry { + return err + } + + waitTime, err2 := sleepDuration(resp, opts.waitTime, opts.maxWaitTime, attempt) + if err2 != nil { + if err == nil { + err = err2 + } + return err + } + + select { + case <-time.After(waitTime): + case <-ctx.Done(): + return ctx.Err() + } + } + + return err +} + +func sleepDuration(resp *Response, min, max time.Duration, attempt int) (time.Duration, error) { + const maxInt = 1<<31 - 1 // max int for arch 386 + + if max < 0 { + max = maxInt + } + + if resp == nil { + goto defaultCase + } + + // 1. Check for custom callback + if retryAfterFunc := resp.Request.client.RetryAfter; retryAfterFunc != nil { + result, err := retryAfterFunc(resp.Request.client, resp) + if err != nil { + return 0, err // i.e. 'API quota exceeded' + } + if result == 0 { + goto defaultCase + } + if result < 0 || max < result { + result = max + } + if result < min { + result = min + } + return result, nil + } + + // 2. Return capped exponential backoff with jitter + // http://www.awsarchitectureblog.com/2015/03/backoff.html +defaultCase: + base := float64(min) + capLevel := float64(max) + + temp := math.Min(capLevel, base*math.Exp2(float64(attempt))) + ri := int(temp / 2) + if ri <= 0 { + ri = maxInt // max int for arch 386 + } + result := time.Duration(math.Abs(float64(ri + rand.Intn(ri)))) + + if result < min { + result = min + } + + return result, nil +} diff --git a/vendor/github.com/go-resty/resty/v2/trace.go b/vendor/github.com/go-resty/resty/v2/trace.go new file mode 100644 index 000000000..025b7d9b5 --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/trace.go @@ -0,0 +1,122 @@ +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "context" + "crypto/tls" + "net/http/httptrace" + "time" +) + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// TraceInfo struct +//_______________________________________________________________________ + +// TraceInfo struct is used provide request trace info such as DNS lookup +// duration, Connection obtain duration, Server processing duration, etc. +// +// Since v2.0.0 +type TraceInfo struct { + // DNSLookup is a duration that transport took to perform + // DNS lookup. + DNSLookup time.Duration + + // ConnTime is a duration that took to obtain a successful connection. + ConnTime time.Duration + + // TCPConnTime is a duration that took to obtain the TCP connection. + TCPConnTime time.Duration + + // TLSHandshake is a duration that TLS handshake took place. + TLSHandshake time.Duration + + // ServerTime is a duration that server took to respond first byte. + ServerTime time.Duration + + // ResponseTime is a duration since first response byte from server to + // request completion. + ResponseTime time.Duration + + // TotalTime is a duration that total request took end-to-end. + TotalTime time.Duration + + // IsConnReused is whether this connection has been previously + // used for another HTTP request. + IsConnReused bool + + // IsConnWasIdle is whether this connection was obtained from an + // idle pool. + IsConnWasIdle bool + + // ConnIdleTime is a duration how long the connection was previously + // idle, if IsConnWasIdle is true. + ConnIdleTime time.Duration +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// CientTrace struct and its methods +//_______________________________________________________________________ + +// tracer struct maps the `httptrace.ClientTrace` hooks into Fields +// with same naming for easy understanding. Plus additional insights +// Request. +type clientTrace struct { + getConn time.Time + dnsStart time.Time + dnsDone time.Time + connectDone time.Time + tlsHandshakeStart time.Time + tlsHandshakeDone time.Time + gotConn time.Time + gotFirstResponseByte time.Time + endTime time.Time + gotConnInfo httptrace.GotConnInfo +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Trace unexported methods +//_______________________________________________________________________ + +func (t *clientTrace) createContext(ctx context.Context) context.Context { + return httptrace.WithClientTrace( + ctx, + &httptrace.ClientTrace{ + DNSStart: func(_ httptrace.DNSStartInfo) { + t.dnsStart = time.Now() + }, + DNSDone: func(_ httptrace.DNSDoneInfo) { + t.dnsDone = time.Now() + }, + ConnectStart: func(_, _ string) { + if t.dnsDone.IsZero() { + t.dnsDone = time.Now() + } + if t.dnsStart.IsZero() { + t.dnsStart = t.dnsDone + } + }, + ConnectDone: func(net, addr string, err error) { + t.connectDone = time.Now() + }, + GetConn: func(_ string) { + t.getConn = time.Now() + }, + GotConn: func(ci httptrace.GotConnInfo) { + t.gotConn = time.Now() + t.gotConnInfo = ci + }, + GotFirstResponseByte: func() { + t.gotFirstResponseByte = time.Now() + }, + TLSHandshakeStart: func() { + t.tlsHandshakeStart = time.Now() + }, + TLSHandshakeDone: func(_ tls.ConnectionState, _ error) { + t.tlsHandshakeDone = time.Now() + }, + }, + ) +} diff --git a/vendor/github.com/go-resty/resty/v2/transport.go b/vendor/github.com/go-resty/resty/v2/transport.go new file mode 100644 index 000000000..6cde29e8e --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/transport.go @@ -0,0 +1,35 @@ +// +build go1.13 + +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "net" + "net/http" + "runtime" + "time" +) + +func createTransport(localAddr net.Addr) *http.Transport { + dialer := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + } + if localAddr != nil { + dialer.LocalAddr = localAddr + } + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: dialer.DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1, + } +} diff --git a/vendor/github.com/go-resty/resty/v2/transport112.go b/vendor/github.com/go-resty/resty/v2/transport112.go new file mode 100644 index 000000000..ff7c2770c --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/transport112.go @@ -0,0 +1,34 @@ +// +build !go1.13 + +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// resty source code and usage is governed by a MIT style +// license that can be found in the LICENSE file. + +package resty + +import ( + "net" + "net/http" + "runtime" + "time" +) + +func createTransport(localAddr net.Addr) *http.Transport { + dialer := &net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + DualStack: true, + } + if localAddr != nil { + dialer.LocalAddr = localAddr + } + return &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: dialer.DialContext, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, + MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1, + } +} diff --git a/vendor/gopkg.in/resty.v1/util.go b/vendor/github.com/go-resty/resty/v2/util.go similarity index 63% rename from vendor/gopkg.in/resty.v1/util.go rename to vendor/github.com/go-resty/resty/v2/util.go index 997cd1009..aaa53c236 100644 --- a/vendor/gopkg.in/resty.v1/util.go +++ b/vendor/github.com/go-resty/resty/v2/util.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. // resty source code and usage is governed by a MIT style // license that can be found in the LICENSE file. @@ -6,7 +6,6 @@ package resty import ( "bytes" - "encoding/json" "encoding/xml" "fmt" "io" @@ -22,9 +21,52 @@ import ( "strings" ) -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +// Logger interface +//_______________________________________________________________________ + +// Logger interface is to abstract the logging from Resty. Gives control to +// the Resty users, choice of the logger. +type Logger interface { + Errorf(format string, v ...interface{}) + Warnf(format string, v ...interface{}) + Debugf(format string, v ...interface{}) +} + +func createLogger() *logger { + l := &logger{l: log.New(os.Stderr, "", log.Ldate|log.Lmicroseconds)} + return l +} + +var _ Logger = (*logger)(nil) + +type logger struct { + l *log.Logger +} + +func (l *logger) Errorf(format string, v ...interface{}) { + l.output("ERROR RESTY "+format, v...) +} + +func (l *logger) Warnf(format string, v ...interface{}) { + l.output("WARN RESTY "+format, v...) +} + +func (l *logger) Debugf(format string, v ...interface{}) { + l.output("DEBUG RESTY "+format, v...) +} + +func (l *logger) output(format string, v ...interface{}) { + if len(v) == 0 { + l.l.Print(format) + return + } + l.l.Printf(format, v...) +} + +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // Package Helper methods -//___________________________________ +//_______________________________________________________________________ // IsStringEmpty method tells whether given string is empty or not func IsStringEmpty(str string) bool { @@ -61,18 +103,6 @@ func IsXMLType(ct string) bool { return xmlCheck.MatchString(ct) } -// Unmarshal content into object from JSON or XML -// Deprecated: kept for backward compatibility -func Unmarshal(ct string, b []byte, d interface{}) (err error) { - if IsJSONType(ct) { - err = json.Unmarshal(b, d) - } else if IsXMLType(ct) { - err = xml.Unmarshal(b, d) - } - - return -} - // Unmarshalc content into object from JSON or XML func Unmarshalc(c *Client, ct string, b []byte, d interface{}) (err error) { if IsJSONType(ct) { @@ -84,9 +114,9 @@ func Unmarshalc(c *Client, ct string, b []byte, d interface{}) (err error) { return } -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // RequestLog and ResponseLog type -//___________________________________ +//_______________________________________________________________________ // RequestLog struct is used to collected information from resty request // instance for debug logging. It sent to request log callback before resty @@ -104,9 +134,9 @@ type ResponseLog struct { Body string } -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ +//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // Package Unexported methods -//___________________________________ +//_______________________________________________________________________ // way to disable the HTML escape as opt-in func jsonMarshal(c *Client, r *Request, d interface{}) ([]byte, error) { @@ -127,10 +157,6 @@ func firstNonEmpty(v ...string) string { return "" } -func getLogger(w io.Writer) *log.Logger { - return log.New(w, "RESTY ", log.LstdFlags) -} - var quoteEscaper = strings.NewReplacer("\\", "\\\\", `"`, "\\\"") func escapeQuotes(s string) string { @@ -139,9 +165,19 @@ func escapeQuotes(s string) string { func createMultipartHeader(param, fileName, contentType string) textproto.MIMEHeader { hdr := make(textproto.MIMEHeader) - hdr.Set("Content-Disposition", fmt.Sprintf(`form-data; name="%s"; filename="%s"`, - escapeQuotes(param), escapeQuotes(fileName))) - hdr.Set("Content-Type", contentType) + + var contentDispositionValue string + if IsStringEmpty(fileName) { + contentDispositionValue = fmt.Sprintf(`form-data; name="%s"`, param) + } else { + contentDispositionValue = fmt.Sprintf(`form-data; name="%s"; filename="%s"`, + param, escapeQuotes(fileName)) + } + hdr.Set("Content-Disposition", contentDispositionValue) + + if !IsStringEmpty(contentType) { + hdr.Set(hdrContentTypeKey, contentType) + } return hdr } @@ -249,22 +285,40 @@ func releaseBuffer(buf *bytes.Buffer) { func closeq(v interface{}) { if c, ok := v.(io.Closer); ok { - sliently(c.Close()) + silently(c.Close()) } } -func sliently(_ ...interface{}) {} +func silently(_ ...interface{}) {} -func composeHeaders(hdrs http.Header) string { - var str []string +func composeHeaders(c *Client, r *Request, hdrs http.Header) string { + str := make([]string, 0, len(hdrs)) for _, k := range sortHeaderKeys(hdrs) { - str = append(str, fmt.Sprintf("%25s: %s", k, strings.Join(hdrs[k], ", "))) + var v string + if k == "Cookie" { + cv := strings.TrimSpace(strings.Join(hdrs[k], ", ")) + if c.GetClient().Jar != nil { + for _, c := range c.GetClient().Jar.Cookies(r.RawRequest.URL) { + if cv != "" { + cv = cv + "; " + c.String() + } else { + cv = c.String() + } + } + } + v = strings.TrimSpace(fmt.Sprintf("%25s: %s", k, cv)) + } else { + v = strings.TrimSpace(fmt.Sprintf("%25s: %s", k, strings.Join(hdrs[k], ", "))) + } + if v != "" { + str = append(str, "\t"+v) + } } return strings.Join(str, "\n") } func sortHeaderKeys(hdrs http.Header) []string { - var keys []string + keys := make([]string, 0, len(hdrs)) for key := range hdrs { keys = append(keys, key) } @@ -279,3 +333,25 @@ func copyHeaders(hdrs http.Header) http.Header { } return nh } + +type noRetryErr struct { + err error +} + +func (e *noRetryErr) Error() string { + return e.err.Error() +} + +func wrapNoRetryErr(err error) error { + if err != nil { + err = &noRetryErr{err: err} + } + return err +} + +func unwrapNoRetryErr(err error) error { + if e, ok := err.(*noRetryErr); ok { + err = e.err + } + return err +} diff --git a/vendor/github.com/linode/linodego/.golangci.yml b/vendor/github.com/linode/linodego/.golangci.yml new file mode 100644 index 000000000..82774a287 --- /dev/null +++ b/vendor/github.com/linode/linodego/.golangci.yml @@ -0,0 +1,47 @@ +run: + tests: false + +linters-settings: + errcheck: + check-type-assertions: true + check-blank: true + + govet: + check-shadowing: true + + enable: + - atomicalign + enable-all: false + disable: + - shadow + disable-all: false + golint: + min-confidence: 0.8 + gocyclo: + min-complexity: 30 + gocognit: + min-complexity: 30 + maligned: + suggest-new: true + dupl: + threshold: 100 + +linters: + enable-all: true + disable: + - vetshadow + - gocyclo + - unparam + - nakedret + - lll + - dupl + - gosec + - gochecknoinits + - gochecknoglobals + - errcheck + - staticcheck + - stylecheck + - wsl + - interfacer + - gomnd + fast: false diff --git a/vendor/github.com/linode/linodego/.travis.yml b/vendor/github.com/linode/linodego/.travis.yml index 83fec93e3..58180008e 100644 --- a/vendor/github.com/linode/linodego/.travis.yml +++ b/vendor/github.com/linode/linodego/.travis.yml @@ -4,19 +4,18 @@ matrix: allow_failures: - go: tip -go: - - "1.10" - - tip +env: + - GO111MODULE=on -install: - - go get -u gopkg.in/alecthomas/gometalinter.v2 - - gometalinter.v2 --install +go: + - "1.13" script: - touch .env - - make test ARGS='-v -race -count=2 -coverprofile=coverage.txt -covermode=atomic ./...' - - gometalinter.v2 --enable-all --disable=vetshadow --disable=gocyclo --disable=unparam --disable=nakedret --disable=lll --disable=dupl --disable=gosec --disable=gochecknoinits --disable=gochecknoglobals --disable=test --deadline=120s - - gometalinter.v2 --disable-all --enable=vetshadow --enable=gocyclo --enable=unparam --enable=nakedret --enable=lll --enable=dupl --enable=gosec --enable=gochecknoinits --enable=gochecknoglobals --deadline=120s || true + - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(go env GOPATH)/bin v1.21.0 + - go mod download + - go mod vendor + - make test ARGS='-race -count=2 -coverprofile=coverage.txt -covermode=atomic ./...' after_success: - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/linode/linodego/API_SUPPORT.md b/vendor/github.com/linode/linodego/API_SUPPORT.md index 2fd663f4f..5eab78c60 100644 --- a/vendor/github.com/linode/linodego/API_SUPPORT.md +++ b/vendor/github.com/linode/linodego/API_SUPPORT.md @@ -1,5 +1,19 @@ # API Support +This document tracks LinodeGo support for the features of the [Linode API](https://developers.linode.com/changelog/api/). + +Endpoints are implemented as needed, by need or user-request. As new features are added (as reported in the [Linode API Changelog](https://developers.linode.com/changelog/api/)) this document should be updated to reflect any missing endpoints. New or deprecated fields should also be indicated below the affected HTTP method, for example: + +```markdown +- `/fake/endpoint` + - [x] `GET` + * 4.0.29 field X is not implemented + - [ ] `POST` + * 4.0.30 added support to create Fake things +``` + +See `template.go` and `template_test.go` for tips on adding new endpoints. + ## Linodes - `/linode/instances` @@ -68,11 +82,11 @@ ### IPs - `/linode/instances/$id/ips` - - [ ] `GET` - - [ ] `POST` + - [X] `GET` + - [X] `POST` - `/linode/instances/$id/ips/$ip_address` - - [ ] `GET` - - [ ] `PUT` + - [X] `GET` + - [X] `PUT` - [ ] `DELETE` - `/linode/instances/$id/ips/sharing` - [ ] `POST` @@ -97,9 +111,9 @@ ### Stats - `/linode/instances/$id/stats` - - [ ] `GET` + - [X] `GET` - `/linode/instances/$id/stats/$year/$month` - - [ ] `GET` + - [X] `GET` ### Types @@ -127,6 +141,27 @@ - [X] `PUT` - [X] `DELETE` +## LKE + +- `/lke/clusters` + - [X] `POST` + - [X] `GET` + - [X] `PUT` + - [X] `DELETE` +- `/lke/clusters/$id/pools` + - [X] `POST` + - [X] `GET` + - [X] `PUT` + - [X] `DELETE` +- `/lke/clusters/$id/api-endpoint` + - [X] `GET` +- `/lke/clusters/$id/kubeconfig` + - [X] `GET` +- `/lke/clusters/$id/versions` + - [X] `GET` +- `/lke/clusters/$id/versions/$id` + - [X] `GET` + ## Longview - `/longview/clients` @@ -153,6 +188,8 @@ - [X] `GET` - [X] `PUT` - [X] `DELETE` +- `/nodebalancers/$id/stats` + - [X] `GET` ### NodeBalancer Configs @@ -181,7 +218,7 @@ - [ ] `POST` - `/networking/ips/$address` - [X] `GET` - - [ ] `PUT` + - [X] `PUT` - [ ] `DELETE` ### IPv6 @@ -191,9 +228,9 @@ - `/networking/ips/$address` - [X] `GET` - [ ] `PUT` -- /networking/ipv6/ranges +- `/networking/ipv6/ranges` - [X] `GET` -- /networking/ipv6/pools +- `/networking/ipv6/pools` - [X] `GET` ## Regions @@ -255,25 +292,50 @@ ### OAuth Clients - `/account/oauth-clients` - - [ ] `GET` - - [ ] `POST` + - [X] `GET` + - [X] `POST` - `/account/oauth-clients/$id` - - [ ] `GET` - - [ ] `PUT` - - [ ] `DELETE` + - [X] `GET` + - [X] `PUT` + - [X] `DELETE` - `/account/oauth-clients/$id/reset_secret` - [ ] `POST` - `/account/oauth-clients/$id/thumbnail` - [ ] `GET` - [ ] `PUT` +### Object Storage Keys + +- `/object-storage/keys` + - [X] `GET` + - [X] `POST` +- `/object-storage/keys/$id` + - [X] `GET` + - [X] `PUT` + - [X] `DELETE` + +### Object Storage Clusters +- `/object-storage/clusters` + - [X] `GET` +- `/object-storage/clusters/$id` + - [X] `GET` + +### Object Storage Buckets + +- `/object-storage/buckets` + - [X] `GET` + - [X] `POST` +- `/object-storage/buckets/$id/$id` + - [X] `GET` + - [X] `DELETE` + ### Payments - `/account/payments` - - [ ] `GET` - - [ ] `POST` + - [X] `GET` + - [X] `POST` - `/account/payments/$id` - - [ ] `GET` + - [X] `GET` - `/account/payments/paypal` - [ ] `GET` - `/account/payments/paypal/execute` @@ -282,8 +344,8 @@ ### Settings - `/account/settings` - - [ ] `GET` - - [ ] `PUT` + - [X] `GET` + - [X] `PUT` ### Users @@ -330,7 +392,7 @@ - [x] `GET` - [x] `PUT` - [x] `DELETE` - + ### Two-Factor - `/profile/tfa-disable` diff --git a/vendor/github.com/linode/linodego/CHANGELOG.md b/vendor/github.com/linode/linodego/CHANGELOG.md index 54c176642..70bf97e87 100644 --- a/vendor/github.com/linode/linodego/CHANGELOG.md +++ b/vendor/github.com/linode/linodego/CHANGELOG.md @@ -1,239 +1 @@ -# Change Log - -## Unreleased - -### Fixes - -### Features - - - -## [v0.7.1](https://github.com/linode/linodego/compare/v0.7.0..v0.7.1) (2018-02-05) - -### Features - -* add `ClassDedicated` constant (`dedicated`) for use in `LinodeType` `Class` values - See the [Dedicated CPU Announcement](https://blog.linode.com/2019/02/05/introducing-linode-dedicated-cpu-instances/) - - - -## [v0.7.0](https://github.com/linode/linodego/compare/v0.6.2..v0.7.0) (2018-12-03) - -### Features - -* add `Tags` field in: `NodeBalancer`, `Domain`, `Volume` -* add `UpdateIPAddress` (for setting RDNS) - -### Fixes - -* invalid URL for `/v4/networking/` enpoints (IPv6 Ranges and Pools) has been correcrted - - - -## [v0.6.2](https://github.com/linode/linodego/compare/v0.6.1..v0.6.2) (2018-10-26) - -### Fixes - -* add missing `Account` fields: `address_1`, `address_2`, `phone` - - -## [v0.6.1](https://github.com/linode/linodego/compare/v0.6.0..v0.6.1) (2018-10-26) - -### Features - -* Adds support for fetching and updating basic Profile information - - -## [v0.6.0](https://github.com/linode/linodego/compare/v0.5.1..v0.6.0) (2018-10-25) - -### Fixes - -* Fixes Image date handling -* Fixes broken example code in README -* Fixes WaitForEventFinished when encountering events without entity -* Fixes ResizeInstanceDisk which was executing CloneInstanceDisk -* Fixes go-resty import path to gopkg.in version for future go module support - -### Features - -* Adds support for user account operations -* Adds support for profile tokens -* Adds support for Tags -* Adds PasswordResetInstanceDisk -* Adds DiskStatus constants -* Adds WaitForInstanceDiskStatus -* Adds SetPollDelay for configuring poll duration - - * Reduced polling time to millisecond granularity - * Change polling default to 3s to avoid 429 conditions - * Use poll delay in waitfor functions - - -## [v0.5.1](https://github.com/linode/linodego/compare/v0.5.0...v0.5.1) (2018-09-10) - -### Fixes - -* Domain.Status was not imported from API responses correctly - - -## [v0.5.0](https://github.com/linode/linodego/compare/v0.4.0...v0.5.0) (2018-09-09) - -### Breaking Changes - -* List functions return slice of thing instead of slice of pointer to thing - -### Feature - -* add SSHKeys methods to client (also affects InstanceCreate, InstanceDiskCreate) -* add RebuildNodeBalancerConfig (and CreateNodeBalancerConfig with Nodes) - -### Fixes - -* Event.TimeRemaining wouldn't parse all possible API value -* Tests no longer rely on known/special instance and volume ids - - -## [0.4.0](https://github.com/linode/linodego/compare/v0.3.0...0.4.0) (2018-08-27) - -### Breaking Changes - -Replaces bool, error results with error results, for: - -* instance\_snapshots.go: EnableInstanceBackups -* instance\_snapshots.go: CancelInstanceBackups -* instance\_snapshots.go: RestoreInstanceBackup -* instances.go: BootInstance -* instances.go: RebootInstance -* instances.go: MutateInstance -* instances.go: RescueInstance -* instances.go: ResizeInstance -* instances.go: ShutdownInstance -* volumes.go: DetachVolume -* volumes.go: ResizeVolume - - -### Docs - -* reword text about breaking changes until first tag - -### Feat - -* added MigrateInstance and InstanceResizing from 4.0.1-4.0.3 API Changelog -* added gometalinter to travis builds -* added missing function and type comments as reported by linting tools -* supply json values for all fields, useful for mocking responses using linodego types -* use context channels in WaitFor\* functions -* add LinodeTypeClass type (enum) -* add TicketStatus type (enum) -* update template thing and add a test template - -### Fix - -* TransferQuota was TransferQuote (and not parsed from the api correctly) -* stackscripts udf was not parsed correctly -* add InstanceCreateOptions.PrivateIP -* check the WaitFor timeout before sleeping to avoid extra sleep -* various linting warnings and unhandled err results as reported by linting tools -* fix GetStackscript 404 handling - - - - -## [0.3.0](https://github.com/linode/linodego/compare/v0.2.0...0.3.0) (2018-08-15) - -### Breaking Changes - -* WaitForVolumeLinodeID return fetch volume for consistency with out WaitFors -* Moved linodego from chiefy to github.com/linode. Thanks [@chiefy](https://github.com/chiefy)! - - - -## [v0.2.0](https://github.com/linode/linodego/compare/v0.1.1...v0.2.0) (2018-08-11) - -### Breaking Changes - -* WaitFor\* should be client methods - *use `client.WaitFor...` rather than `linodego.WaitFor(..., client, ...)`* - -* remove ListInstanceSnapshots (does not exist in the API) - *this never worked, so shouldn't cause a problem* - -* Changes UpdateOptions and CreateOptions and similar Options parameters to values instead of pointers - *these were never optional and the function never updated any values in the Options structures* - -* fixed various optional/zero Update and Create options - *some values are now pointers, and vice-versa* - - * Changes InstanceUpdateOptions to use pointers for optional fields Backups and Alerts - * Changes InstanceClone's Disks and Configs to ints instead of strings - -* using new enum string aliased types where appropriate - *`InstanceSnapshotStatus`, `DiskFilesystem`, `NodeMode`* - -### Feature - -* add RescueInstance and RescueInstanceOptions -* add CreateImage, UpdateImage, DeleteImage -* add EnableInstanceBackups, CancelInstanceBackups, RestoreInstanceBackup -* add WatchdogEnabled to InstanceUpdateOptions - -### Fix - -* return Volume from AttachVolume instead of bool -* add more boilerplate to template.go -* nodebalancers and domain records had no pagination support -* NodeBalancer transfer stats are not int - -### Tests - -* add fixtures and tests for NodeBalancerNodes -* fix nodebalancer tests to handle changes due to random labels -* add tests for nodebalancers and nodebalancer configs -* added tests for Backups flow -* TestListInstanceBackups fixture is hand tweaked because repeated polled events - appear to get the tests stuck - -### Deps - -* update all dependencies to latest - - - -## [v0.1.1](https://github.com/linode/linodego/compare/v0.0.1...v0.1.0) (2018-07-30) - -Adds more Domain handling - -### Fixed - -* go-resty doesnt pass errors when content-type is not set -* Domain, DomainRecords, tests and fixtures - -### Added - -* add CreateDomainRecord, UpdateDomainRecord, and DeleteDomainRecord - - - -## [v0.1.0](https://github.com/linode/linodego/compare/v0.0.1...v0.1.0) (2018-07-23) - -Deals with NewClient and context for all http requests - -### Breaking Changes - -* changed `NewClient(token, *http.RoundTripper)` to `NewClient(*http.Client)` -* changed all `Client` `Get`, `List`, `Create`, `Update`, `Delete`, and `Wait` calls to take context as the first parameter - -### Fixed - -* fixed docs should now show Examples for more functions - -### Added - -* added `Client.SetBaseURL(url string)` - - -## v0.0.1 (2018-07-20) - -### Changed - -* Initial tagged release +Release notes for this project are kept here: https://github.com/linode/linodego/releases diff --git a/vendor/github.com/linode/linodego/Gopkg.lock b/vendor/github.com/linode/linodego/Gopkg.lock deleted file mode 100644 index a7ca4f015..000000000 --- a/vendor/github.com/linode/linodego/Gopkg.lock +++ /dev/null @@ -1,111 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - digest = "1:6e1c13bc32e58ccb4afa1115a3ba4fc071d918ed897b40dfa323ffb3fcc6619d" - name = "github.com/dnaeon/go-vcr" - packages = [ - "cassette", - "recorder", - ] - pruneopts = "UT" - revision = "aafff18a5cc28fa0b2f26baf6a14472cda9b54c6" - -[[projects]] - digest = "1:97df918963298c287643883209a2c3f642e6593379f97ab400c2a2e219ab647d" - name = "github.com/golang/protobuf" - packages = ["proto"] - pruneopts = "UT" - revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5" - version = "v1.2.0" - -[[projects]] - branch = "master" - digest = "1:33b9d71d1dde2106309484a388eb7ba53cd1f67014e34a71f7b3dbc20bd186e5" - name = "golang.org/x/net" - packages = [ - "context", - "context/ctxhttp", - "idna", - "publicsuffix", - ] - pruneopts = "UT" - revision = "8a410e7b638dca158bf9e766925842f6651ff828" - -[[projects]] - branch = "master" - digest = "1:363b547c971a2b07474c598b6e9ebcb238d556d8a27f37b3895ad20cd50e7281" - name = "golang.org/x/oauth2" - packages = [ - ".", - "internal", - ] - pruneopts = "UT" - revision = "d2e6202438beef2727060aa7cabdd924d92ebfd9" - -[[projects]] - digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18" - name = "golang.org/x/text" - packages = [ - "collate", - "collate/build", - "internal/colltab", - "internal/gen", - "internal/tag", - "internal/triegen", - "internal/ucd", - "language", - "secure/bidirule", - "transform", - "unicode/bidi", - "unicode/cldr", - "unicode/norm", - "unicode/rangetable", - ] - pruneopts = "UT" - revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" - version = "v0.3.0" - -[[projects]] - digest = "1:328b5e4f197d928c444a51a75385f4b978915c0e75521f0ad6a3db976c97a7d3" - name = "google.golang.org/appengine" - packages = [ - "internal", - "internal/base", - "internal/datastore", - "internal/log", - "internal/remote_api", - "internal/urlfetch", - "urlfetch", - ] - pruneopts = "UT" - revision = "b1f26356af11148e710935ed1ac8a7f5702c7612" - version = "v1.1.0" - -[[projects]] - digest = "1:b7fc4c3fd91df516486f53cc86f4b55a0c815782dbe852c5a19cce8e6c577aac" - name = "gopkg.in/resty.v1" - packages = ["."] - pruneopts = "UT" - revision = "d4920dcf5b7689548a6db640278a9b35a5b48ec6" - version = "v1.9.1" - -[[projects]] - digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" - name = "gopkg.in/yaml.v2" - packages = ["."] - pruneopts = "UT" - revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" - version = "v2.2.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/dnaeon/go-vcr/recorder", - "golang.org/x/oauth2", - "gopkg.in/resty.v1", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/linode/linodego/Gopkg.toml b/vendor/github.com/linode/linodego/Gopkg.toml deleted file mode 100644 index 2765dc95c..000000000 --- a/vendor/github.com/linode/linodego/Gopkg.toml +++ /dev/null @@ -1,29 +0,0 @@ -# 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 - -[prune] - go-tests = true - unused-packages = true diff --git a/vendor/github.com/linode/linodego/Makefile b/vendor/github.com/linode/linodego/Makefile index e5f533d42..2e10984c7 100644 --- a/vendor/github.com/linode/linodego/Makefile +++ b/vendor/github.com/linode/linodego/Makefile @@ -1,35 +1,61 @@ -include .env +-include .env +BIN_DIR := $(GOPATH)/bin -.PHONY: vendor example refresh-fixtures clean-fixtures +GOLANGCILINT := golangci-lint +GOLANGCILINT_IMG := golangci/golangci-lint:v1.23-alpine +GOLANGCILINT_ARGS := run -.PHONY: test -test: vendor +PACKAGES := $(shell go list ./... | grep -v integration) + +SKIP_LINT ?= 0 + +.PHONY: build vet test refresh-fixtures clean-fixtures lint run_fixtures sanitize fixtures godoc testint testunit + +test: testunit testint + +citest: lint test + +testunit: build lint + go test -v $(PACKAGES) $(ARGS) + +testint: build lint @LINODE_FIXTURE_MODE="play" \ LINODE_TOKEN="awesometokenawesometokenawesometoken" \ - go test $(ARGS) + LINODE_API_VERSION="v4beta" \ + GO111MODULE="on" \ + go test -v ./test/integration $(ARGS) -$(GOPATH)/bin/dep: - @go get -u github.com/golang/dep/cmd/dep +build: vet lint + go build ./... -vendor: $(GOPATH)/bin/dep - @dep ensure +vet: + go vet ./... -example: - @go run example/main.go +lint: +ifeq ($(SKIP_LINT), 1) + @echo Skipping lint stage +else + docker run --rm -v $(shell pwd):/app -w /app $(GOLANGCILINT_IMG) $(GOLANGCILINT) run +endif clean-fixtures: @-rm fixtures/*.yaml refresh-fixtures: clean-fixtures fixtures -.PHONY: fixtures -fixtures: +run_fixtures: @echo "* Running fixtures" - @LINODE_TOKEN=$(LINODE_TOKEN) \ - LINODE_FIXTURE_MODE="record" go test $(ARGS) - @echo "* Santizing fixtures" - @for yaml in fixtures/*yaml; do \ - sed -E -i "" -e "s/$(LINODE_TOKEN)/awesometokenawesometokenawesometoken/g" \ + @LINODE_FIXTURE_MODE="record" \ + LINODE_TOKEN=$(LINODE_TOKEN) \ + LINODE_API_VERSION="v4beta" \ + GO111MODULE="on" \ + go test -timeout=60m -v ./test/integration $(ARGS) + +sanitize: + @echo "* Sanitizing fixtures" + @for yaml in test/integration/fixtures/*yaml; do \ + sed -E -i.bak \ + -e 's_stats/20[0-9]{2}/[1-9][0-2]?_stats/2018/1_g' \ -e 's/20[0-9]{2}-[01][0-9]-[0-3][0-9]T[0-2][0-9]:[0-9]{2}:[0-9]{2}/2018-01-02T03:04:05/g' \ -e 's/nb-[0-9]{1,3}-[0-9]{1,3}-[0-9]{1,3}-[0-9]{1,3}\./nb-10-20-30-40./g' \ -e 's/192\.168\.((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.)(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/192.168.030.040/g' \ @@ -37,7 +63,9 @@ fixtures: -e 's/(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/1234::5678/g' \ $$yaml; \ done + @find test/integration/fixtures -name *yaml.bak -exec rm {} \; + +fixtures: run_fixtures sanitize -.PHONY: godoc godoc: @godoc -http=:6060 diff --git a/vendor/github.com/linode/linodego/README.md b/vendor/github.com/linode/linodego/README.md index 7d0ae2bc1..234e73e88 100644 --- a/vendor/github.com/linode/linodego/README.md +++ b/vendor/github.com/linode/linodego/README.md @@ -1,6 +1,7 @@ # linodego [![Build Status](https://travis-ci.org/linode/linodego.svg?branch=master)](https://travis-ci.org/linode/linodego) +[![Release](https://img.shields.io/github/v/release/linode/linodego)](https://github.com/linode/linodego/releases/latest) [![GoDoc](https://godoc.org/github.com/linode/linodego?status.svg)](https://godoc.org/github.com/linode/linodego) [![Go Report Card](https://goreportcard.com/badge/github.com/linode/linodego)](https://goreportcard.com/report/github.com/linode/linodego) [![codecov](https://codecov.io/gh/linode/linodego/branch/master/graph/badge.svg)](https://codecov.io/gh/linode/linodego) @@ -84,7 +85,7 @@ kernels, err := linodego.ListKernels(context.Background(), nil) Or, use a page value of "0": ```go -opts := NewListOptions(0,"") +opts := linodego.NewListOptions(0,"") kernels, err := linodego.ListKernels(context.Background(), opts) // len(kernels) == 218 ``` @@ -92,8 +93,8 @@ kernels, err := linodego.ListKernels(context.Background(), opts) #### Single Page ```go -opts := NewListOptions(2,"") -// or opts := ListOptions{PageOptions: &PageOptions: {Page: 2 }} +opts := linodego.NewListOptions(2,"") +// or opts := linodego.ListOptions{PageOptions: &PageOptions: {Page: 2 }} kernels, err := linodego.ListKernels(context.Background(), opts) // len(kernels) == 100 ``` @@ -108,8 +109,8 @@ values are set in the supplied ListOptions. #### Filtering ```go -opts := ListOptions{Filter: "{\"mine\":true}"} -// or opts := NewListOptions(0, "{\"mine\":true}") +opts := linodego.ListOptions{Filter: "{\"mine\":true}"} +// or opts := linodego.NewListOptions(0, "{\"mine\":true}") stackscripts, err := linodego.ListStackscripts(context.Background(), opts) ``` @@ -118,7 +119,7 @@ stackscripts, err := linodego.ListStackscripts(context.Background(), opts) #### Getting Single Entities ```go -linode, err := linodego.GetLinode(context.Background(), 555) // any Linode ID that does not exist or is not yours +linode, err := linodego.GetInstance(context.Background(), 555) // any Linode ID that does not exist or is not yours // linode == nil: true // err.Error() == "[404] Not Found" // err.Code == "404" @@ -130,7 +131,7 @@ linode, err := linodego.GetLinode(context.Background(), 555) // any Linode ID th For lists, the list is still returned as `[]`, but `err` works the same way as on the `Get` request. ```go -linodes, err := linodego.ListLinodes(context.Background(), NewListOptions(0, "{\"foo\":bar}")) +linodes, err := linodego.ListInstances(context.Background(), linodego.NewListOptions(0, "{\"foo\":bar}")) // linodes == [] // err.Error() == "[400] [X-Filter] Cannot filter on foo" ``` @@ -138,7 +139,7 @@ linodes, err := linodego.ListLinodes(context.Background(), NewListOptions(0, "{\ Otherwise sane requests beyond the last page do not trigger an error, just an empty result: ```go -linodes, err := linodego.ListLinodes(context.Background(), NewListOptions(9999, "")) +linodes, err := linodego.ListInstances(context.Background(), linodego.NewListOptions(9999, "")) // linodes == [] // err = nil ``` @@ -153,15 +154,9 @@ When performing a `POST` or `PUT` request, multiple field related errors will be ## Tests -Run `make test` to run the unit tests. This is the same as running `go test` except that `make test` will -execute the tests while playing back API response fixtures that were recorded during a previous development build. +Run `make testunit` to run the unit tests. -`go test` can be used without the fixtures. Copy `env.sample` to `.env` and configure your persistent test -settings, including an API token. - -`go test -short` can be used to run live API tests that do not require an account token. - -This will be simplified in future versions. +Run `make testint` to run the integration tests. The integration tests use fixtures. To update the test fixtures, run `make fixtures`. This will record the API responses into the `fixtures/` directory. Be careful about committing any sensitive account details. An attempt has been made to sanitize IP addresses and diff --git a/vendor/github.com/linode/linodego/account.go b/vendor/github.com/linode/linodego/account.go index d6092f07d..75ca888c5 100644 --- a/vendor/github.com/linode/linodego/account.go +++ b/vendor/github.com/linode/linodego/account.go @@ -4,20 +4,21 @@ import "context" // Account associated with the token in use type Account struct { - FirstName string `json:"first_name"` - LastName string `json:"last_name"` - Email string `json:"email"` - Company string `json:"company"` - Address1 string `json:"address_1"` - Address2 string `json:"address_2"` - Balance float32 `json:"balance"` - City string `json:"city"` - State string `json:"state"` - Zip string `json:"zip"` - Country string `json:"country"` - TaxID string `json:"tax_id"` - Phone string `json:"phone"` - CreditCard *CreditCard `json:"credit_card"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` + Email string `json:"email"` + Company string `json:"company"` + Address1 string `json:"address_1"` + Address2 string `json:"address_2"` + Balance float32 `json:"balance"` + BalanceUninvoiced float32 `json:"balance_uninvoiced"` + City string `json:"city"` + State string `json:"state"` + Zip string `json:"zip"` + Country string `json:"country"` + TaxID string `json:"tax_id"` + Phone string `json:"phone"` + CreditCard *CreditCard `json:"credit_card"` } // CreditCard information associated with the Account. @@ -26,20 +27,18 @@ type CreditCard struct { Expiry string `json:"expiry"` } -// fixDates converts JSON timestamps to Go time.Time values -func (v *Account) fixDates() *Account { - return v -} - // GetAccount gets the contact and billing information related to the Account func (c *Client) GetAccount(ctx context.Context) (*Account, error) { e, err := c.Account.Endpoint() if err != nil { return nil, err } + r, err := coupleAPIErrors(c.R(ctx).SetResult(&Account{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*Account).fixDates(), nil + + return r.Result().(*Account), nil } diff --git a/vendor/github.com/linode/linodego/account_events.go b/vendor/github.com/linode/linodego/account_events.go index e2365c35b..4e2b26854 100644 --- a/vendor/github.com/linode/linodego/account_events.go +++ b/vendor/github.com/linode/linodego/account_events.go @@ -4,16 +4,14 @@ import ( "context" "encoding/json" "fmt" - "log" - "strconv" - "strings" "time" + + "github.com/linode/linodego/internal/duration" + "github.com/linode/linodego/internal/parseabletime" ) // Event represents an action taken on the Account. type Event struct { - CreatedStr string `json:"created"` - // The unique ID of this Event. ID int `json:"id"` @@ -36,8 +34,7 @@ type Event struct { Seen bool `json:"seen"` // The estimated time remaining until the completion of this Event. This value is only returned for in-progress events. - TimeRemainingMsg json.RawMessage `json:"time_remaining"` - TimeRemaining *int `json:"-"` + TimeRemaining *int `json:"-"` // The username of the User who caused the Event. Username string `json:"username"` @@ -45,6 +42,9 @@ type Event struct { // Detailed information about the Event's entity, including ID, type, label, and URL used to access it. Entity *EventEntity `json:"entity"` + // Detailed information about the Event's secondary or related entity, including ID, type, label, and URL used to access it. + SecondaryEntity *EventEntity `json:"secondary_entity"` + // When this Event was created. Created *time.Time `json:"-"` } @@ -54,59 +54,80 @@ type EventAction string // EventAction constants represent the actions that cause an Event. New actions may be added in the future. const ( + ActionAccountUpdate EventAction = "account_update" + ActionAccountSettingsUpdate EventAction = "account_settings_update" ActionBackupsEnable EventAction = "backups_enable" ActionBackupsCancel EventAction = "backups_cancel" ActionBackupsRestore EventAction = "backups_restore" ActionCommunityQuestionReply EventAction = "community_question_reply" + ActionCommunityLike EventAction = "community_like" ActionCreateCardUpdated EventAction = "credit_card_updated" ActionDiskCreate EventAction = "disk_create" ActionDiskDelete EventAction = "disk_delete" + ActionDiskUpdate EventAction = "disk_update" ActionDiskDuplicate EventAction = "disk_duplicate" ActionDiskImagize EventAction = "disk_imagize" ActionDiskResize EventAction = "disk_resize" ActionDNSRecordCreate EventAction = "dns_record_create" ActionDNSRecordDelete EventAction = "dns_record_delete" + ActionDNSRecordUpdate EventAction = "dns_record_update" ActionDNSZoneCreate EventAction = "dns_zone_create" ActionDNSZoneDelete EventAction = "dns_zone_delete" + ActionDNSZoneUpdate EventAction = "dns_zone_update" + ActionHostReboot EventAction = "host_reboot" ActionImageDelete EventAction = "image_delete" + ActionImageUpdate EventAction = "image_update" + ActionLassieReboot EventAction = "lassie_reboot" ActionLinodeAddIP EventAction = "linode_addip" ActionLinodeBoot EventAction = "linode_boot" ActionLinodeClone EventAction = "linode_clone" ActionLinodeCreate EventAction = "linode_create" ActionLinodeDelete EventAction = "linode_delete" + ActionLinodeUpdate EventAction = "linode_update" ActionLinodeDeleteIP EventAction = "linode_deleteip" ActionLinodeMigrate EventAction = "linode_migrate" ActionLinodeMutate EventAction = "linode_mutate" + ActionLinodeMutateCreate EventAction = "linode_mutate_create" ActionLinodeReboot EventAction = "linode_reboot" ActionLinodeRebuild EventAction = "linode_rebuild" ActionLinodeResize EventAction = "linode_resize" + ActionLinodeResizeCreate EventAction = "linode_resize_create" ActionLinodeShutdown EventAction = "linode_shutdown" ActionLinodeSnapshot EventAction = "linode_snapshot" + ActionLinodeConfigCreate EventAction = "linode_config_create" + ActionLinodeConfigDelete EventAction = "linode_config_delete" + ActionLinodeConfigUpdate EventAction = "linode_config_update" + ActionLishBoot EventAction = "lish_boot" ActionLongviewClientCreate EventAction = "longviewclient_create" ActionLongviewClientDelete EventAction = "longviewclient_delete" + ActionLongviewClientUpdate EventAction = "longviewclient_update" ActionManagedDisabled EventAction = "managed_disabled" ActionManagedEnabled EventAction = "managed_enabled" ActionManagedServiceCreate EventAction = "managed_service_create" ActionManagedServiceDelete EventAction = "managed_service_delete" ActionNodebalancerCreate EventAction = "nodebalancer_create" ActionNodebalancerDelete EventAction = "nodebalancer_delete" + ActionNodebalancerUpdate EventAction = "nodebalancer_update" ActionNodebalancerConfigCreate EventAction = "nodebalancer_config_create" ActionNodebalancerConfigDelete EventAction = "nodebalancer_config_delete" + ActionNodebalancerConfigUpdate EventAction = "nodebalancer_config_update" ActionPasswordReset EventAction = "password_reset" ActionPaymentSubmitted EventAction = "payment_submitted" ActionStackScriptCreate EventAction = "stackscript_create" ActionStackScriptDelete EventAction = "stackscript_delete" + ActionStackScriptUpdate EventAction = "stackscript_update" ActionStackScriptPublicize EventAction = "stackscript_publicize" ActionStackScriptRevise EventAction = "stackscript_revise" ActionTFADisabled EventAction = "tfa_disabled" ActionTFAEnabled EventAction = "tfa_enabled" ActionTicketAttachmentUpload EventAction = "ticket_attachment_upload" ActionTicketCreate EventAction = "ticket_create" - ActionTicketReply EventAction = "ticket_reply" + ActionTicketUpdate EventAction = "ticket_update" ActionVolumeAttach EventAction = "volume_attach" ActionVolumeClone EventAction = "volume_clone" ActionVolumeCreate EventAction = "volume_create" ActionVolumeDelte EventAction = "volume_delete" + ActionVolumeUpdate EventAction = "volume_update" ActionVolumeDetach EventAction = "volume_detach" ActionVolumeResize EventAction = "volume_resize" ) @@ -114,10 +135,12 @@ const ( // EntityType constants start with Entity and include Linode API Event Entity Types type EntityType string -// EntityType contants are the entities an Event can be related to +// EntityType contants are the entities an Event can be related to. const ( - EntityLinode EntityType = "linode" - EntityDisk EntityType = "disk" + EntityLinode EntityType = "linode" + EntityDisk EntityType = "disk" + EntityDomain EntityType = "domain" + EntityNodebalancer EntityType = "nodebalancer" ) // EventStatus constants start with Event and include Linode API Event Status values @@ -155,16 +178,41 @@ func (EventsPagedResponse) endpoint(c *Client) string { if err != nil { panic(err) } + return endpoint } +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Event) UnmarshalJSON(b []byte) error { + type Mask Event + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + TimeRemaining json.RawMessage `json:"time_remaining"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.TimeRemaining = duration.UnmarshalTimeRemaining(p.TimeRemaining) + + return nil +} + // endpointWithID gets the endpoint URL for a specific Event -func (e Event) endpointWithID(c *Client) string { +func (i Event) endpointWithID(c *Client) string { endpoint, err := c.Events.Endpoint() if err != nil { panic(err) } - endpoint = fmt.Sprintf("%s/%d", endpoint, e.ID) + + endpoint = fmt.Sprintf("%s/%d", endpoint, i.ID) + return endpoint } @@ -179,12 +227,11 @@ func (resp *EventsPagedResponse) appendData(r *EventsPagedResponse) { func (c *Client) ListEvents(ctx context.Context, opts *ListOptions) ([]Event, error) { response := EventsPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } + return response.Data, nil } @@ -194,19 +241,15 @@ func (c *Client) GetEvent(ctx context.Context, id int) (*Event, error) { if err != nil { return nil, err } + e = fmt.Sprintf("%s/%d", e, id) r, err := c.R(ctx).SetResult(&Event{}).Get(e) + if err != nil { return nil, err } - return r.Result().(*Event).fixDates(), nil -} -// fixDates converts JSON timestamps to Go time.Time values -func (e *Event) fixDates() *Event { - e.Created, _ = parseDates(e.CreatedStr) - e.TimeRemaining = unmarshalTimeRemaining(e.TimeRemainingMsg) - return e + return r.Result().(*Event), nil } // MarkEventRead marks a single Event as read. @@ -228,50 +271,3 @@ func (c *Client) MarkEventsSeen(ctx context.Context, event *Event) error { return err } - -func unmarshalTimeRemaining(m json.RawMessage) *int { - jsonBytes, err := m.MarshalJSON() - if err != nil { - panic(jsonBytes) - } - - if len(jsonBytes) == 4 && string(jsonBytes) == "null" { - return nil - } - - var timeStr string - if err := json.Unmarshal(jsonBytes, &timeStr); err == nil && len(timeStr) > 0 { - if dur, err := durationToSeconds(timeStr); err != nil { - panic(err) - } else { - return &dur - } - } else { - var intPtr int - if err := json.Unmarshal(jsonBytes, &intPtr); err == nil { - return &intPtr - } - } - - log.Println("[WARN] Unexpected unmarshalTimeRemaining value: ", jsonBytes) - return nil -} - -// durationToSeconds takes a hh:mm:ss string and returns the number of seconds -func durationToSeconds(s string) (int, error) { - multipliers := [3]int{60 * 60, 60, 1} - segs := strings.Split(s, ":") - if len(segs) > len(multipliers) { - return 0, fmt.Errorf("too many ':' separators in time duration: %s", s) - } - var d int - l := len(segs) - for i := 0; i < l; i++ { - m, err := strconv.Atoi(segs[i]) - if err != nil { - return 0, err - } - d += m * multipliers[i+len(multipliers)-l] - } - return d, nil -} diff --git a/vendor/github.com/linode/linodego/account_invoices.go b/vendor/github.com/linode/linodego/account_invoices.go index 75ca2f73d..5d68c6c1c 100644 --- a/vendor/github.com/linode/linodego/account_invoices.go +++ b/vendor/github.com/linode/linodego/account_invoices.go @@ -2,14 +2,15 @@ package linodego import ( "context" + "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // Invoice structs reflect an invoice for billable activity on the account. type Invoice struct { - DateStr string `json:"date"` - ID int `json:"id"` Label string `json:"label"` Total float32 `json:"total"` @@ -18,9 +19,6 @@ type Invoice struct { // InvoiceItem structs reflect an single billable activity associate with an Invoice type InvoiceItem struct { - FromStr string `json:"from"` - ToStr string `json:"to"` - Label string `json:"label"` Type string `json:"type"` UnitPrice int `json:"unitprice"` @@ -42,6 +40,7 @@ func (InvoicesPagedResponse) endpoint(c *Client) string { if err != nil { panic(err) } + return endpoint } @@ -54,26 +53,54 @@ func (resp *InvoicesPagedResponse) appendData(r *InvoicesPagedResponse) { func (c *Client) ListInvoices(ctx context.Context, opts *ListOptions) ([]Invoice, error) { response := InvoicesPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } + return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *Invoice) fixDates() *Invoice { - v.Date, _ = parseDates(v.DateStr) - return v +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Invoice) UnmarshalJSON(b []byte) error { + type Mask Invoice + + p := struct { + *Mask + Date *parseabletime.ParseableTime `json:"date"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Date = (*time.Time)(p.Date) + + return nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *InvoiceItem) fixDates() *InvoiceItem { - v.From, _ = parseDates(v.FromStr) - v.To, _ = parseDates(v.ToStr) - return v +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *InvoiceItem) UnmarshalJSON(b []byte) error { + type Mask InvoiceItem + + p := struct { + *Mask + From *parseabletime.ParseableTime `json:"from"` + To *parseabletime.ParseableTime `json:"to"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.From = (*time.Time)(p.From) + i.To = (*time.Time)(p.To) + + return nil } // GetInvoice gets the a single Invoice matching the provided ID @@ -85,10 +112,12 @@ func (c *Client) GetInvoice(ctx context.Context, id int) (*Invoice, error) { e = fmt.Sprintf("%s/%d", e, id) r, err := coupleAPIErrors(c.R(ctx).SetResult(&Invoice{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*Invoice).fixDates(), nil + + return r.Result().(*Invoice), nil } // InvoiceItemsPagedResponse represents a paginated Invoice Item API response @@ -103,6 +132,7 @@ func (InvoiceItemsPagedResponse) endpointWithID(c *Client, id int) string { if err != nil { panic(err) } + return endpoint } @@ -115,11 +145,10 @@ func (resp *InvoiceItemsPagedResponse) appendData(r *InvoiceItemsPagedResponse) func (c *Client) ListInvoiceItems(ctx context.Context, id int, opts *ListOptions) ([]InvoiceItem, error) { response := InvoiceItemsPagedResponse{} err := c.listHelperWithID(ctx, &response, id, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } + return response.Data, nil } diff --git a/vendor/github.com/linode/linodego/account_notifications.go b/vendor/github.com/linode/linodego/account_notifications.go index 1d2de2e62..69bb64745 100644 --- a/vendor/github.com/linode/linodego/account_notifications.go +++ b/vendor/github.com/linode/linodego/account_notifications.go @@ -2,14 +2,14 @@ package linodego import ( "context" + "encoding/json" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // Notification represents a notification on an Account type Notification struct { - UntilStr string `json:"until"` - WhenStr string `json:"when"` - Label string `json:"label"` Body *string `json:"body"` Message string `json:"message"` @@ -68,6 +68,7 @@ func (NotificationsPagedResponse) endpoint(c *Client) string { if err != nil { panic(err) } + return endpoint } @@ -84,18 +85,32 @@ func (resp *NotificationsPagedResponse) appendData(r *NotificationsPagedResponse func (c *Client) ListNotifications(ctx context.Context, opts *ListOptions) ([]Notification, error) { response := NotificationsPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } + return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *Notification) fixDates() *Notification { - v.Until, _ = parseDates(v.UntilStr) - v.When, _ = parseDates(v.WhenStr) - return v +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Notification) UnmarshalJSON(b []byte) error { + type Mask Notification + + p := struct { + *Mask + Until *parseabletime.ParseableTime `json:"until"` + When *parseabletime.ParseableTime `json:"when"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Until = (*time.Time)(p.Until) + i.When = (*time.Time)(p.When) + + return nil } diff --git a/vendor/github.com/linode/linodego/account_oauth_client.go b/vendor/github.com/linode/linodego/account_oauth_client.go new file mode 100644 index 000000000..4ef4b52f1 --- /dev/null +++ b/vendor/github.com/linode/linodego/account_oauth_client.go @@ -0,0 +1,207 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" +) + +// OAuthClientStatus constants start with OAuthClient and include Linode API Instance Status values +type OAuthClientStatus string + +// OAuthClientStatus constants reflect the current status of an OAuth Client +const ( + OAuthClientActive OAuthClientStatus = "active" + OAuthClientDisabled OAuthClientStatus = "disabled" + OAuthClientSuspended OAuthClientStatus = "suspended" +) + +// OAuthClient represents a OAuthClient object +type OAuthClient struct { + // The unique ID of this OAuth Client. + ID string `json:"id"` + + // The location a successful log in from https://login.linode.com should be redirected to for this client. The receiver of this redirect should be ready to accept an OAuth exchange code and finish the OAuth exchange. + RedirectURI string `json:"redirect_uri"` + + // The name of this application. This will be presented to users when they are asked to grant it access to their Account. + Label string `json:"label"` + + // Current status of the OAuth Client, Enum: "active" "disabled" "suspended" + Status OAuthClientStatus `json:"status"` + + // The OAuth Client secret, used in the OAuth exchange. This is returned as except when an OAuth Client is created or its secret is reset. This is a secret, and should not be shared or disclosed publicly. + Secret string `json:"secret"` + + // If this OAuth Client is public or private. + Public bool `json:"public"` + + // The URL where this client's thumbnail may be viewed, or nil if this client does not have a thumbnail set. + ThumbnailURL *string `json:"thumbnail_url"` +} + +// OAuthClientCreateOptions fields are those accepted by CreateOAuthClient +type OAuthClientCreateOptions struct { + // The location a successful log in from https://login.linode.com should be redirected to for this client. The receiver of this redirect should be ready to accept an OAuth exchange code and finish the OAuth exchange. + RedirectURI string `json:"redirect_uri"` + + // The name of this application. This will be presented to users when they are asked to grant it access to their Account. + Label string `json:"label"` + + // If this OAuth Client is public or private. + Public bool `json:"public"` +} + +// OAuthClientUpdateOptions fields are those accepted by UpdateOAuthClient +type OAuthClientUpdateOptions struct { + // The location a successful log in from https://login.linode.com should be redirected to for this client. The receiver of this redirect should be ready to accept an OAuth exchange code and finish the OAuth exchange. + RedirectURI string `json:"redirect_uri"` + + // The name of this application. This will be presented to users when they are asked to grant it access to their Account. + Label string `json:"label"` + + // If this OAuth Client is public or private. + Public bool `json:"public"` +} + +// GetCreateOptions converts a OAuthClient to OAuthClientCreateOptions for use in CreateOAuthClient +func (i OAuthClient) GetCreateOptions() (o OAuthClientCreateOptions) { + o.RedirectURI = i.RedirectURI + o.Label = i.Label + o.Public = i.Public + + return +} + +// GetUpdateOptions converts a OAuthClient to OAuthClientUpdateOptions for use in UpdateOAuthClient +func (i OAuthClient) GetUpdateOptions() (o OAuthClientUpdateOptions) { + o.RedirectURI = i.RedirectURI + o.Label = i.Label + o.Public = i.Public + + return +} + +// OAuthClientsPagedResponse represents a paginated OAuthClient API response +type OAuthClientsPagedResponse struct { + *PageOptions + Data []OAuthClient `json:"data"` +} + +// endpoint gets the endpoint URL for OAuthClient +func (OAuthClientsPagedResponse) endpoint(c *Client) string { + endpoint, err := c.OAuthClients.Endpoint() + if err != nil { + panic(err) + } + + return endpoint +} + +// appendData appends OAuthClients when processing paginated OAuthClient responses +func (resp *OAuthClientsPagedResponse) appendData(r *OAuthClientsPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListOAuthClients lists OAuthClients +func (c *Client) ListOAuthClients(ctx context.Context, opts *ListOptions) ([]OAuthClient, error) { + response := OAuthClientsPagedResponse{} + err := c.listHelper(ctx, &response, opts) + + if err != nil { + return nil, err + } + + return response.Data, nil +} + +// GetOAuthClient gets the OAuthClient with the provided ID +func (c *Client) GetOAuthClient(ctx context.Context, id string) (*OAuthClient, error) { + e, err := c.OAuthClients.Endpoint() + if err != nil { + return nil, err + } + + e = fmt.Sprintf("%s/%s", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&OAuthClient{}).Get(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*OAuthClient), nil +} + +// CreateOAuthClient creates an OAuthClient +func (c *Client) CreateOAuthClient(ctx context.Context, createOpts OAuthClientCreateOptions) (*OAuthClient, error) { + var body string + + e, err := c.OAuthClients.Endpoint() + + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&OAuthClient{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*OAuthClient), nil +} + +// UpdateOAuthClient updates the OAuthClient with the specified id +func (c *Client) UpdateOAuthClient(ctx context.Context, id string, updateOpts OAuthClientUpdateOptions) (*OAuthClient, error) { + var body string + + e, err := c.OAuthClients.Endpoint() + + if err != nil { + return nil, err + } + + e = fmt.Sprintf("%s/%s", e, id) + + req := c.R(ctx).SetResult(&OAuthClient{}) + + if bodyData, err := json.Marshal(updateOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Put(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*OAuthClient), nil +} + +// DeleteOAuthClient deletes the OAuthClient with the specified id +func (c *Client) DeleteOAuthClient(ctx context.Context, id string) error { + e, err := c.OAuthClients.Endpoint() + if err != nil { + return err + } + + e = fmt.Sprintf("%s/%s", e, id) + + _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + + return err +} diff --git a/vendor/github.com/linode/linodego/account_payments.go b/vendor/github.com/linode/linodego/account_payments.go new file mode 100644 index 000000000..fddf6702f --- /dev/null +++ b/vendor/github.com/linode/linodego/account_payments.go @@ -0,0 +1,136 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/linode/linodego/internal/parseabletime" +) + +// Payment represents a Payment object +type Payment struct { + // The unique ID of the Payment + ID int `json:"id"` + + // The amount, in US dollars, of the Payment. + USD json.Number `json:"usd,Number"` + + // When the Payment was made. + Date *time.Time `json:"-"` +} + +// PaymentCreateOptions fields are those accepted by CreatePayment +type PaymentCreateOptions struct { + // CVV (Card Verification Value) of the credit card to be used for the Payment + CVV string `json:"cvv,omitempty"` + + // The amount, in US dollars, of the Payment + USD json.Number `json:"usd,Number"` +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Payment) UnmarshalJSON(b []byte) error { + type Mask Payment + + p := struct { + *Mask + Date *parseabletime.ParseableTime `json:"date"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Date = (*time.Time)(p.Date) + + return nil +} + +// GetCreateOptions converts a Payment to PaymentCreateOptions for use in CreatePayment +func (i Payment) GetCreateOptions() (o PaymentCreateOptions) { + o.USD = i.USD + return +} + +// PaymentsPagedResponse represents a paginated Payment API response +type PaymentsPagedResponse struct { + *PageOptions + Data []Payment `json:"data"` +} + +// endpoint gets the endpoint URL for Payment +func (PaymentsPagedResponse) endpoint(c *Client) string { + endpoint, err := c.Payments.Endpoint() + if err != nil { + panic(err) + } + + return endpoint +} + +// appendData appends Payments when processing paginated Payment responses +func (resp *PaymentsPagedResponse) appendData(r *PaymentsPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListPayments lists Payments +func (c *Client) ListPayments(ctx context.Context, opts *ListOptions) ([]Payment, error) { + response := PaymentsPagedResponse{} + err := c.listHelper(ctx, &response, opts) + + if err != nil { + return nil, err + } + + return response.Data, nil +} + +// GetPayment gets the payment with the provided ID +func (c *Client) GetPayment(ctx context.Context, id int) (*Payment, error) { + e, err := c.Payments.Endpoint() + if err != nil { + return nil, err + } + + e = fmt.Sprintf("%s/%d", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&Payment{}).Get(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*Payment), nil +} + +// CreatePayment creates a Payment +func (c *Client) CreatePayment(ctx context.Context, createOpts PaymentCreateOptions) (*Payment, error) { + var body string + + e, err := c.Payments.Endpoint() + + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&Payment{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*Payment), nil +} diff --git a/vendor/github.com/linode/linodego/account_settings.go b/vendor/github.com/linode/linodego/account_settings.go new file mode 100644 index 000000000..e8bed5af7 --- /dev/null +++ b/vendor/github.com/linode/linodego/account_settings.go @@ -0,0 +1,78 @@ +package linodego + +import ( + "context" + "encoding/json" +) + +// AccountSettings are the account wide flags or plans that effect new resources +type AccountSettings struct { + // The default backups enrollment status for all new Linodes for all users on the account. When enabled, backups are mandatory per instance. + BackupsEnabled bool `json:"backups_enabled"` + + // Wether or not Linode Managed service is enabled for the account. + Managed bool `json:"managed"` + + // Wether or not the Network Helper is enabled for all new Linode Instance Configs on the account. + NetworkHelper bool `json:"network_helper"` + + // A plan name like "longview-3"..."longview-100", or a nil value for to cancel any existing subscription plan. + LongviewSubscription *string `json:"longview_subscription"` +} + +// AccountSettingsUpdateOptions are the updateable account wide flags or plans that effect new resources. +type AccountSettingsUpdateOptions struct { + // The default backups enrollment status for all new Linodes for all users on the account. When enabled, backups are mandatory per instance. + BackupsEnabled *bool `json:"backups_enabled,omitempty"` + + // A plan name like "longview-3"..."longview-100", or a nil value for to cancel any existing subscription plan. + LongviewSubscription *string `json:"longview_subscription,omitempty"` + + // The default network helper setting for all new Linodes and Linode Configs for all users on the account. + NetworkHelper *bool `json:"network_helper,omitempty"` +} + +// GetAccountSettings gets the account wide flags or plans that effect new resources +func (c *Client) GetAccountSettings(ctx context.Context) (*AccountSettings, error) { + e, err := c.AccountSettings.Endpoint() + if err != nil { + return nil, err + } + + r, err := coupleAPIErrors(c.R(ctx).SetResult(&AccountSettings{}).Get(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*AccountSettings), nil +} + +// UpdateAccountSettings updates the settings associated with the account +func (c *Client) UpdateAccountSettings(ctx context.Context, settings AccountSettingsUpdateOptions) (*AccountSettings, error) { + var body string + + e, err := c.AccountSettings.Endpoint() + + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&AccountSettings{}) + + if bodyData, err := json.Marshal(settings); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Put(e)) + + if err != nil { + return nil, err + } + + return r.Result().(*AccountSettings), nil +} diff --git a/vendor/github.com/linode/linodego/account_users.go b/vendor/github.com/linode/linodego/account_users.go index a51fbe7f1..df59eb5e2 100644 --- a/vendor/github.com/linode/linodego/account_users.go +++ b/vendor/github.com/linode/linodego/account_users.go @@ -34,6 +34,7 @@ func (i User) GetCreateOptions() (o UserCreateOptions) { o.Username = i.Username o.Email = i.Email o.Restricted = i.Restricted + return } @@ -42,6 +43,7 @@ func (i User) GetUpdateOptions() (o UserUpdateOptions) { o.Username = i.Username o.Email = i.Email o.Restricted = copyBool(&i.Restricted) + return } @@ -57,6 +59,7 @@ func (UsersPagedResponse) endpoint(c *Client) string { if err != nil { panic(err) } + return endpoint } @@ -69,18 +72,12 @@ func (resp *UsersPagedResponse) appendData(r *UsersPagedResponse) { func (c *Client) ListUsers(ctx context.Context, opts *ListOptions) ([]User, error) { response := UsersPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } - return response.Data, nil -} -// fixDates converts JSON timestamps to Go time.Time values -func (i *User) fixDates() *User { - return i + return response.Data, nil } // GetUser gets the user with the provided ID @@ -89,19 +86,24 @@ func (c *Client) GetUser(ctx context.Context, id string) (*User, error) { if err != nil { return nil, err } + e = fmt.Sprintf("%s/%s", e, id) r, err := coupleAPIErrors(c.R(ctx).SetResult(&User{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*User).fixDates(), nil + + return r.Result().(*User), nil } // CreateUser creates a User. The email address must be confirmed before the // User account can be accessed. func (c *Client) CreateUser(ctx context.Context, createOpts UserCreateOptions) (*User, error) { var body string + e, err := c.Users.Endpoint() + if err != nil { return nil, err } @@ -121,16 +123,20 @@ func (c *Client) CreateUser(ctx context.Context, createOpts UserCreateOptions) ( if err != nil { return nil, err } - return r.Result().(*User).fixDates(), nil + + return r.Result().(*User), nil } // UpdateUser updates the User with the specified id func (c *Client) UpdateUser(ctx context.Context, id string, updateOpts UserUpdateOptions) (*User, error) { var body string + e, err := c.Users.Endpoint() + if err != nil { return nil, err } + e = fmt.Sprintf("%s/%s", e, id) req := c.R(ctx).SetResult(&User{}) @@ -148,7 +154,8 @@ func (c *Client) UpdateUser(ctx context.Context, id string, updateOpts UserUpdat if err != nil { return nil, err } - return r.Result().(*User).fixDates(), nil + + return r.Result().(*User), nil } // DeleteUser deletes the User with the specified id @@ -157,8 +164,10 @@ func (c *Client) DeleteUser(ctx context.Context, id string) error { if err != nil { return err } + e = fmt.Sprintf("%s/%s", e, id) _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err } diff --git a/vendor/github.com/linode/linodego/client.go b/vendor/github.com/linode/linodego/client.go index 224a496de..b898d208f 100644 --- a/vendor/github.com/linode/linodego/client.go +++ b/vendor/github.com/linode/linodego/client.go @@ -3,28 +3,37 @@ package linodego import ( "context" "fmt" + "io/ioutil" "log" "net/http" "os" "strconv" "time" - "gopkg.in/resty.v1" + "github.com/go-resty/resty/v2" ) const ( // APIHost Linode API hostname APIHost = "api.linode.com" + // APIHostVar environment var to check for alternate API URL + APIHostVar = "LINODE_URL" + // APIHostCert environment var containing path to CA cert to validate against + APIHostCert = "LINODE_CA" // APIVersion Linode API version APIVersion = "v4" + // APIVersionVar environment var to check for alternate API Version + APIVersionVar = "LINODE_API_VERSION" // APIProto connect to API with http(s) APIProto = "https" // Version of linodego - Version = "0.7.0" + Version = "0.12.0" // APIEnvVar environment var to check for API token APIEnvVar = "LINODE_TOKEN" // APISecondsPerPoll how frequently to poll for new Events or Status in WaitFor functions APISecondsPerPoll = 3 + // Maximum wait time for retries + APIRetryMaxWaitTime = time.Duration(30) * time.Second // DefaultUserAgent is the default User-Agent sent in HTTP request headers DefaultUserAgent = "linodego " + Version + " https://github.com/linode/linodego" ) @@ -35,49 +44,62 @@ var ( // Client is a wrapper around the Resty client type Client struct { - resty *resty.Client - userAgent string - resources map[string]*Resource - debug bool + resty *resty.Client + userAgent string + resources map[string]*Resource + debug bool + retryConditionals []RetryConditional millisecondsPerPoll time.Duration - Images *Resource - InstanceDisks *Resource - InstanceConfigs *Resource - InstanceSnapshots *Resource - InstanceIPs *Resource - InstanceVolumes *Resource - Instances *Resource + Account *Resource + AccountSettings *Resource + DomainRecords *Resource + Domains *Resource + Events *Resource + Firewalls *Resource IPAddresses *Resource IPv6Pools *Resource IPv6Ranges *Resource - Regions *Resource - StackScripts *Resource - Volumes *Resource + Images *Resource + InstanceConfigs *Resource + InstanceDisks *Resource + InstanceIPs *Resource + InstanceSnapshots *Resource + InstanceStats *Resource + InstanceVolumes *Resource + Instances *Resource + InvoiceItems *Resource + Invoices *Resource Kernels *Resource - Types *Resource - Domains *Resource - DomainRecords *Resource + LKEClusters *Resource + LKEClusterPools *Resource + LKEVersions *Resource Longview *Resource LongviewClients *Resource LongviewSubscriptions *Resource - NodeBalancers *Resource + Managed *Resource NodeBalancerConfigs *Resource NodeBalancerNodes *Resource - SSHKeys *Resource - Tickets *Resource - Tokens *Resource - Token *Resource - Account *Resource - Invoices *Resource - InvoiceItems *Resource - Events *Resource + NodeBalancerStats *Resource + NodeBalancers *Resource Notifications *Resource + OAuthClients *Resource + ObjectStorageBuckets *Resource + ObjectStorageClusters *Resource + ObjectStorageKeys *Resource + Payments *Resource Profile *Resource - Managed *Resource + Regions *Resource + SSHKeys *Resource + StackScripts *Resource Tags *Resource + Tickets *Resource + Token *Resource + Tokens *Resource + Types *Resource Users *Resource + Volumes *Resource } func init() { @@ -90,7 +112,6 @@ func init() { log.Println("[WARN] LINODE_DEBUG should be an integer, 0 or 1") } } - } // SetUserAgent sets a custom user-agent for HTTP requests @@ -114,6 +135,7 @@ func (c *Client) R(ctx context.Context) *resty.Request { func (c *Client) SetDebug(debug bool) *Client { c.debug = debug c.resty.SetDebug(debug) + return c } @@ -123,10 +145,50 @@ func (c *Client) SetBaseURL(url string) *Client { return c } +// SetAPIVersion sets the version of the API to interface with +func (c *Client) SetAPIVersion(apiVersion string) *Client { + c.SetBaseURL(fmt.Sprintf("%s://%s/%s", APIProto, APIHost, apiVersion)) + return c +} + +// SetRootCertificate adds a root certificate to the underlying TLS client config +func (c *Client) SetRootCertificate(path string) *Client { + c.resty.SetRootCertificate(path) + return c +} + +// SetToken sets the API token for all requests from this client +// Only necessary if you haven't already provided an http client to NewClient() configured with the token. +func (c *Client) SetToken(token string) *Client { + c.resty.SetHeader("Authorization", fmt.Sprintf("Bearer %s", token)) + return c +} + +// SetRetries adds retry conditions for "Linode Busy." errors and 429s. +func (c *Client) SetRetries() *Client { + c. + addRetryConditional(linodeBusyRetryCondition). + addRetryConditional(tooManyRequestsRetryCondition). + SetRetryMaxWaitTime(APIRetryMaxWaitTime) + configureRetries(c) + return c +} + +func (c *Client) addRetryConditional(retryConditional RetryConditional) *Client { + c.retryConditionals = append(c.retryConditionals, retryConditional) + return c +} + +func (c *Client) SetRetryMaxWaitTime(max time.Duration) *Client { + c.resty.SetRetryMaxWaitTime(max) + return c +} + // SetPollDelay sets the number of milliseconds to wait between events or status polls. -// Affects all WaitFor* functions. +// Affects all WaitFor* functions and retries. func (c *Client) SetPollDelay(delay time.Duration) *Client { c.millisecondsPerPoll = delay + c.resty.SetRetryWaitTime(delay * time.Millisecond) return c } @@ -136,99 +198,165 @@ func (c Client) Resource(resourceName string) *Resource { if !ok { log.Fatalf("Could not find resource named '%s', exiting.", resourceName) } + return selectedResource } // NewClient factory to create new Client struct func NewClient(hc *http.Client) (client Client) { - restyClient := resty.NewWithClient(hc) - client.resty = restyClient - client.SetUserAgent(DefaultUserAgent) - client.SetBaseURL(fmt.Sprintf("%s://%s/%s", APIProto, APIHost, APIVersion)) - client.SetPollDelay(1000 * APISecondsPerPoll) + if hc != nil { + client.resty = resty.NewWithClient(hc) + } else { + client.resty = resty.New() + } + client.SetUserAgent(DefaultUserAgent) + + baseURL, baseURLExists := os.LookupEnv(APIHostVar) + + if baseURLExists { + client.SetBaseURL(baseURL) + } else { + apiVersion, apiVersionExists := os.LookupEnv(APIVersionVar) + if apiVersionExists { + client.SetAPIVersion(apiVersion) + } else { + client.SetAPIVersion(APIVersion) + } + } + + certPath, certPathExists := os.LookupEnv(APIHostCert) + + if certPathExists { + cert, err := ioutil.ReadFile(certPath) + if err != nil { + log.Fatalf("[ERROR] Error when reading cert at %s: %s\n", certPath, err.Error()) + } + + client.SetRootCertificate(certPath) + + if envDebug { + log.Printf("[DEBUG] Set API root certificate to %s with contents %s\n", certPath, cert) + } + } + + client. + SetPollDelay(1000 * APISecondsPerPoll). + SetRetries(). + SetDebug(envDebug) + + addResources(&client) + + return +} + +// nolint +func addResources(client *Client) { resources := map[string]*Resource{ - stackscriptsName: NewResource(&client, stackscriptsName, stackscriptsEndpoint, false, Stackscript{}, StackscriptsPagedResponse{}), - imagesName: NewResource(&client, imagesName, imagesEndpoint, false, Image{}, ImagesPagedResponse{}), - instancesName: NewResource(&client, instancesName, instancesEndpoint, false, Instance{}, InstancesPagedResponse{}), - instanceDisksName: NewResource(&client, instanceDisksName, instanceDisksEndpoint, true, InstanceDisk{}, InstanceDisksPagedResponse{}), - instanceConfigsName: NewResource(&client, instanceConfigsName, instanceConfigsEndpoint, true, InstanceConfig{}, InstanceConfigsPagedResponse{}), - instanceSnapshotsName: NewResource(&client, instanceSnapshotsName, instanceSnapshotsEndpoint, true, InstanceSnapshot{}, nil), - instanceIPsName: NewResource(&client, instanceIPsName, instanceIPsEndpoint, true, InstanceIP{}, nil), // really? - instanceVolumesName: NewResource(&client, instanceVolumesName, instanceVolumesEndpoint, true, nil, InstanceVolumesPagedResponse{}), // really? - ipaddressesName: NewResource(&client, ipaddressesName, ipaddressesEndpoint, false, nil, IPAddressesPagedResponse{}), // really? - ipv6poolsName: NewResource(&client, ipv6poolsName, ipv6poolsEndpoint, false, nil, IPv6PoolsPagedResponse{}), // really? - ipv6rangesName: NewResource(&client, ipv6rangesName, ipv6rangesEndpoint, false, IPv6Range{}, IPv6RangesPagedResponse{}), - regionsName: NewResource(&client, regionsName, regionsEndpoint, false, Region{}, RegionsPagedResponse{}), - volumesName: NewResource(&client, volumesName, volumesEndpoint, false, Volume{}, VolumesPagedResponse{}), - kernelsName: NewResource(&client, kernelsName, kernelsEndpoint, false, LinodeKernel{}, LinodeKernelsPagedResponse{}), - typesName: NewResource(&client, typesName, typesEndpoint, false, LinodeType{}, LinodeTypesPagedResponse{}), - domainsName: NewResource(&client, domainsName, domainsEndpoint, false, Domain{}, DomainsPagedResponse{}), - domainRecordsName: NewResource(&client, domainRecordsName, domainRecordsEndpoint, true, DomainRecord{}, DomainRecordsPagedResponse{}), - longviewName: NewResource(&client, longviewName, longviewEndpoint, false, nil, nil), // really? - longviewclientsName: NewResource(&client, longviewclientsName, longviewclientsEndpoint, false, LongviewClient{}, LongviewClientsPagedResponse{}), - longviewsubscriptionsName: NewResource(&client, longviewsubscriptionsName, longviewsubscriptionsEndpoint, false, LongviewSubscription{}, LongviewSubscriptionsPagedResponse{}), - nodebalancersName: NewResource(&client, nodebalancersName, nodebalancersEndpoint, false, NodeBalancer{}, NodeBalancerConfigsPagedResponse{}), - nodebalancerconfigsName: NewResource(&client, nodebalancerconfigsName, nodebalancerconfigsEndpoint, true, NodeBalancerConfig{}, NodeBalancerConfigsPagedResponse{}), - nodebalancernodesName: NewResource(&client, nodebalancernodesName, nodebalancernodesEndpoint, true, NodeBalancerNode{}, NodeBalancerNodesPagedResponse{}), - notificationsName: NewResource(&client, notificationsName, notificationsEndpoint, false, Notification{}, NotificationsPagedResponse{}), - sshkeysName: NewResource(&client, sshkeysName, sshkeysEndpoint, false, SSHKey{}, SSHKeysPagedResponse{}), - ticketsName: NewResource(&client, ticketsName, ticketsEndpoint, false, Ticket{}, TicketsPagedResponse{}), - tokensName: NewResource(&client, tokensName, tokensEndpoint, false, Token{}, TokensPagedResponse{}), - accountName: NewResource(&client, accountName, accountEndpoint, false, Account{}, nil), // really? - eventsName: NewResource(&client, eventsName, eventsEndpoint, false, Event{}, EventsPagedResponse{}), - invoicesName: NewResource(&client, invoicesName, invoicesEndpoint, false, Invoice{}, InvoicesPagedResponse{}), - invoiceItemsName: NewResource(&client, invoiceItemsName, invoiceItemsEndpoint, true, InvoiceItem{}, InvoiceItemsPagedResponse{}), - profileName: NewResource(&client, profileName, profileEndpoint, false, nil, nil), // really? - managedName: NewResource(&client, managedName, managedEndpoint, false, nil, nil), // really? - tagsName: NewResource(&client, tagsName, tagsEndpoint, false, Tag{}, TagsPagedResponse{}), - usersName: NewResource(&client, usersName, usersEndpoint, false, User{}, UsersPagedResponse{}), + accountName: NewResource(client, accountName, accountEndpoint, false, Account{}, nil), // really? + accountSettingsName: NewResource(client, accountSettingsName, accountSettingsEndpoint, false, AccountSettings{}, nil), // really? + domainRecordsName: NewResource(client, domainRecordsName, domainRecordsEndpoint, true, DomainRecord{}, DomainRecordsPagedResponse{}), + domainsName: NewResource(client, domainsName, domainsEndpoint, false, Domain{}, DomainsPagedResponse{}), + eventsName: NewResource(client, eventsName, eventsEndpoint, false, Event{}, EventsPagedResponse{}), + firewallsName: NewResource(client, firewallsName, firewallsEndpoint, false, Firewall{}, FirewallsPagedResponse{}), + imagesName: NewResource(client, imagesName, imagesEndpoint, false, Image{}, ImagesPagedResponse{}), + instanceConfigsName: NewResource(client, instanceConfigsName, instanceConfigsEndpoint, true, InstanceConfig{}, InstanceConfigsPagedResponse{}), + instanceDisksName: NewResource(client, instanceDisksName, instanceDisksEndpoint, true, InstanceDisk{}, InstanceDisksPagedResponse{}), + instanceIPsName: NewResource(client, instanceIPsName, instanceIPsEndpoint, true, InstanceIP{}, nil), // really? + instanceSnapshotsName: NewResource(client, instanceSnapshotsName, instanceSnapshotsEndpoint, true, InstanceSnapshot{}, nil), + instanceStatsName: NewResource(client, instanceStatsName, instanceStatsEndpoint, true, InstanceStats{}, nil), + instanceVolumesName: NewResource(client, instanceVolumesName, instanceVolumesEndpoint, true, nil, InstanceVolumesPagedResponse{}), // really? + instancesName: NewResource(client, instancesName, instancesEndpoint, false, Instance{}, InstancesPagedResponse{}), + invoiceItemsName: NewResource(client, invoiceItemsName, invoiceItemsEndpoint, true, InvoiceItem{}, InvoiceItemsPagedResponse{}), + invoicesName: NewResource(client, invoicesName, invoicesEndpoint, false, Invoice{}, InvoicesPagedResponse{}), + ipaddressesName: NewResource(client, ipaddressesName, ipaddressesEndpoint, false, nil, IPAddressesPagedResponse{}), // really? + ipv6poolsName: NewResource(client, ipv6poolsName, ipv6poolsEndpoint, false, nil, IPv6PoolsPagedResponse{}), // really? + ipv6rangesName: NewResource(client, ipv6rangesName, ipv6rangesEndpoint, false, IPv6Range{}, IPv6RangesPagedResponse{}), + kernelsName: NewResource(client, kernelsName, kernelsEndpoint, false, LinodeKernel{}, LinodeKernelsPagedResponse{}), + lkeClustersName: NewResource(client, lkeClustersName, lkeClustersEndpoint, false, LKECluster{}, LKEClustersPagedResponse{}), + lkeClusterPoolsName: NewResource(client, lkeClusterPoolsName, lkeClusterPoolsEndpoint, true, LKEClusterPool{}, LKEClusterPoolsPagedResponse{}), + lkeVersionsName: NewResource(client, lkeVersionsName, lkeVersionsEndpoint, false, LKEVersion{}, LKEVersionsPagedResponse{}), + longviewName: NewResource(client, longviewName, longviewEndpoint, false, nil, nil), // really? + longviewclientsName: NewResource(client, longviewclientsName, longviewclientsEndpoint, false, LongviewClient{}, LongviewClientsPagedResponse{}), + longviewsubscriptionsName: NewResource(client, longviewsubscriptionsName, longviewsubscriptionsEndpoint, false, LongviewSubscription{}, LongviewSubscriptionsPagedResponse{}), + managedName: NewResource(client, managedName, managedEndpoint, false, nil, nil), // really? + nodebalancerconfigsName: NewResource(client, nodebalancerconfigsName, nodebalancerconfigsEndpoint, true, NodeBalancerConfig{}, NodeBalancerConfigsPagedResponse{}), + nodebalancernodesName: NewResource(client, nodebalancernodesName, nodebalancernodesEndpoint, true, NodeBalancerNode{}, NodeBalancerNodesPagedResponse{}), + nodebalancerStatsName: NewResource(client, nodebalancerStatsName, nodebalancerStatsEndpoint, true, NodeBalancerStats{}, nil), + nodebalancersName: NewResource(client, nodebalancersName, nodebalancersEndpoint, false, NodeBalancer{}, NodeBalancerConfigsPagedResponse{}), + notificationsName: NewResource(client, notificationsName, notificationsEndpoint, false, Notification{}, NotificationsPagedResponse{}), + oauthClientsName: NewResource(client, oauthClientsName, oauthClientsEndpoint, false, OAuthClient{}, OAuthClientsPagedResponse{}), + objectStorageBucketsName: NewResource(client, objectStorageBucketsName, objectStorageBucketsEndpoint, false, ObjectStorageBucket{}, ObjectStorageBucketsPagedResponse{}), + objectStorageClustersName: NewResource(client, objectStorageClustersName, objectStorageClustersEndpoint, false, ObjectStorageCluster{}, ObjectStorageClustersPagedResponse{}), + objectStorageKeysName: NewResource(client, objectStorageKeysName, objectStorageKeysEndpoint, false, ObjectStorageKey{}, ObjectStorageKeysPagedResponse{}), + paymentsName: NewResource(client, paymentsName, paymentsEndpoint, false, Payment{}, PaymentsPagedResponse{}), + profileName: NewResource(client, profileName, profileEndpoint, false, nil, nil), // really? + regionsName: NewResource(client, regionsName, regionsEndpoint, false, Region{}, RegionsPagedResponse{}), + sshkeysName: NewResource(client, sshkeysName, sshkeysEndpoint, false, SSHKey{}, SSHKeysPagedResponse{}), + stackscriptsName: NewResource(client, stackscriptsName, stackscriptsEndpoint, false, Stackscript{}, StackscriptsPagedResponse{}), + tagsName: NewResource(client, tagsName, tagsEndpoint, false, Tag{}, TagsPagedResponse{}), + ticketsName: NewResource(client, ticketsName, ticketsEndpoint, false, Ticket{}, TicketsPagedResponse{}), + tokensName: NewResource(client, tokensName, tokensEndpoint, false, Token{}, TokensPagedResponse{}), + typesName: NewResource(client, typesName, typesEndpoint, false, LinodeType{}, LinodeTypesPagedResponse{}), + usersName: NewResource(client, usersName, usersEndpoint, false, User{}, UsersPagedResponse{}), + volumesName: NewResource(client, volumesName, volumesEndpoint, false, Volume{}, VolumesPagedResponse{}), } client.resources = resources - client.SetDebug(envDebug) - client.Images = resources[imagesName] - client.StackScripts = resources[stackscriptsName] - client.Instances = resources[instancesName] - client.Regions = resources[regionsName] - client.InstanceDisks = resources[instanceDisksName] - client.InstanceConfigs = resources[instanceConfigsName] - client.InstanceSnapshots = resources[instanceSnapshotsName] - client.InstanceIPs = resources[instanceIPsName] - client.InstanceVolumes = resources[instanceVolumesName] + client.Account = resources[accountName] + client.DomainRecords = resources[domainRecordsName] + client.Domains = resources[domainsName] + client.Events = resources[eventsName] + client.Firewalls = resources[firewallsName] client.IPAddresses = resources[ipaddressesName] client.IPv6Pools = resources[ipv6poolsName] client.IPv6Ranges = resources[ipv6rangesName] - client.Volumes = resources[volumesName] + client.Images = resources[imagesName] + client.InstanceConfigs = resources[instanceConfigsName] + client.InstanceDisks = resources[instanceDisksName] + client.InstanceIPs = resources[instanceIPsName] + client.InstanceSnapshots = resources[instanceSnapshotsName] + client.InstanceStats = resources[instanceStatsName] + client.InstanceVolumes = resources[instanceVolumesName] + client.Instances = resources[instancesName] + client.Invoices = resources[invoicesName] client.Kernels = resources[kernelsName] - client.Types = resources[typesName] - client.Domains = resources[domainsName] - client.DomainRecords = resources[domainRecordsName] + client.LKEClusters = resources[lkeClustersName] + client.LKEClusterPools = resources[lkeClusterPoolsName] + client.LKEVersions = resources[lkeVersionsName] client.Longview = resources[longviewName] client.LongviewSubscriptions = resources[longviewsubscriptionsName] - client.NodeBalancers = resources[nodebalancersName] + client.Managed = resources[managedName] client.NodeBalancerConfigs = resources[nodebalancerconfigsName] client.NodeBalancerNodes = resources[nodebalancernodesName] + client.NodeBalancerStats = resources[nodebalancerStatsName] + client.NodeBalancers = resources[nodebalancersName] client.Notifications = resources[notificationsName] + client.OAuthClients = resources[oauthClientsName] + client.ObjectStorageBuckets = resources[objectStorageBucketsName] + client.ObjectStorageClusters = resources[objectStorageClustersName] + client.ObjectStorageKeys = resources[objectStorageKeysName] + client.Payments = resources[paymentsName] + client.Profile = resources[profileName] + client.Regions = resources[regionsName] client.SSHKeys = resources[sshkeysName] + client.StackScripts = resources[stackscriptsName] + client.Tags = resources[tagsName] client.Tickets = resources[ticketsName] client.Tokens = resources[tokensName] - client.Account = resources[accountName] - client.Events = resources[eventsName] - client.Invoices = resources[invoicesName] - client.Profile = resources[profileName] - client.Managed = resources[managedName] - client.Tags = resources[tagsName] + client.Types = resources[typesName] client.Users = resources[usersName] - return + client.Volumes = resources[volumesName] } func copyBool(bPtr *bool) *bool { if bPtr == nil { return nil } + var t = *bPtr + return &t } @@ -236,7 +364,9 @@ func copyInt(iPtr *int) *int { if iPtr == nil { return nil } + var t = *iPtr + return &t } @@ -244,7 +374,9 @@ func copyString(sPtr *string) *string { if sPtr == nil { return nil } + var t = *sPtr + return &t } @@ -252,6 +384,8 @@ func copyTime(tPtr *time.Time) *time.Time { if tPtr == nil { return nil } + var t = *tPtr + return &t } diff --git a/vendor/github.com/linode/linodego/domain_records.go b/vendor/github.com/linode/linodego/domain_records.go index 215ac8004..c2ca92514 100644 --- a/vendor/github.com/linode/linodego/domain_records.go +++ b/vendor/github.com/linode/linodego/domain_records.go @@ -77,6 +77,7 @@ func (d DomainRecord) GetUpdateOptions() (du DomainRecordUpdateOptions) { du.Protocol = copyString(d.Protocol) du.TTLSec = d.TTLSec du.Tag = copyString(d.Tag) + return } @@ -92,6 +93,7 @@ func (DomainRecordsPagedResponse) endpointWithID(c *Client, id int) string { if err != nil { panic(err) } + return endpoint } @@ -104,15 +106,12 @@ func (resp *DomainRecordsPagedResponse) appendData(r *DomainRecordsPagedResponse func (c *Client) ListDomainRecords(ctx context.Context, domainID int, opts *ListOptions) ([]DomainRecord, error) { response := DomainRecordsPagedResponse{} err := c.listHelperWithID(ctx, &response, domainID, opts) + if err != nil { return nil, err } - return response.Data, nil -} -// fixDates converts JSON timestamps to Go time.Time values -func (d *DomainRecord) fixDates() *DomainRecord { - return d + return response.Data, nil } // GetDomainRecord gets the domainrecord with the provided ID @@ -121,18 +120,23 @@ func (c *Client) GetDomainRecord(ctx context.Context, domainID int, id int) (*Do if err != nil { return nil, err } + e = fmt.Sprintf("%s/%d", e, id) r, err := coupleAPIErrors(c.R(ctx).SetResult(&DomainRecord{}).Get(e)) + if err != nil { return nil, err } + return r.Result().(*DomainRecord), nil } // CreateDomainRecord creates a DomainRecord func (c *Client) CreateDomainRecord(ctx context.Context, domainID int, domainrecord DomainRecordCreateOptions) (*DomainRecord, error) { var body string + e, err := c.DomainRecords.endpointWithID(domainID) + if err != nil { return nil, err } @@ -143,6 +147,7 @@ func (c *Client) CreateDomainRecord(ctx context.Context, domainID int, domainrec if err != nil { return nil, NewError(err) } + body = string(bodyData) r, err := coupleAPIErrors(req. @@ -152,16 +157,20 @@ func (c *Client) CreateDomainRecord(ctx context.Context, domainID int, domainrec if err != nil { return nil, err } - return r.Result().(*DomainRecord).fixDates(), nil + + return r.Result().(*DomainRecord), nil } // UpdateDomainRecord updates the DomainRecord with the specified id func (c *Client) UpdateDomainRecord(ctx context.Context, domainID int, id int, domainrecord DomainRecordUpdateOptions) (*DomainRecord, error) { var body string + e, err := c.DomainRecords.endpointWithID(domainID) + if err != nil { return nil, err } + e = fmt.Sprintf("%s/%d", e, id) req := c.R(ctx).SetResult(&DomainRecord{}) @@ -179,7 +188,8 @@ func (c *Client) UpdateDomainRecord(ctx context.Context, domainID int, id int, d if err != nil { return nil, err } - return r.Result().(*DomainRecord).fixDates(), nil + + return r.Result().(*DomainRecord), nil } // DeleteDomainRecord deletes the DomainRecord with the specified id @@ -188,8 +198,10 @@ func (c *Client) DeleteDomainRecord(ctx context.Context, domainID int, id int) e if err != nil { return err } + e = fmt.Sprintf("%s/%d", e, id) _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err } diff --git a/vendor/github.com/linode/linodego/domains.go b/vendor/github.com/linode/linodego/domains.go index 43e4a65f5..59bfda246 100644 --- a/vendor/github.com/linode/linodego/domains.go +++ b/vendor/github.com/linode/linodego/domains.go @@ -177,6 +177,7 @@ func (d Domain) GetUpdateOptions() (du DomainUpdateOptions) { du.ExpireSec = d.ExpireSec du.RefreshSec = d.RefreshSec du.TTLSec = d.TTLSec + return } @@ -192,6 +193,7 @@ func (DomainsPagedResponse) endpoint(c *Client) string { if err != nil { panic(err) } + return endpoint } @@ -204,15 +206,12 @@ func (resp *DomainsPagedResponse) appendData(r *DomainsPagedResponse) { func (c *Client) ListDomains(ctx context.Context, opts *ListOptions) ([]Domain, error) { response := DomainsPagedResponse{} err := c.listHelper(ctx, &response, opts) + if err != nil { return nil, err } - return response.Data, nil -} -// fixDates converts JSON timestamps to Go time.Time values -func (d *Domain) fixDates() *Domain { - return d + return response.Data, nil } // GetDomain gets the domain with the provided ID @@ -221,18 +220,23 @@ func (c *Client) GetDomain(ctx context.Context, id int) (*Domain, error) { if err != nil { return nil, err } + e = fmt.Sprintf("%s/%d", e, id) r, err := coupleAPIErrors(c.R(ctx).SetResult(&Domain{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*Domain).fixDates(), nil + + return r.Result().(*Domain), nil } // CreateDomain creates a Domain func (c *Client) CreateDomain(ctx context.Context, domain DomainCreateOptions) (*Domain, error) { var body string + e, err := c.Domains.Endpoint() + if err != nil { return nil, err } @@ -243,6 +247,7 @@ func (c *Client) CreateDomain(ctx context.Context, domain DomainCreateOptions) ( if err != nil { return nil, NewError(err) } + body = string(bodyData) r, err := coupleAPIErrors(req. @@ -252,16 +257,20 @@ func (c *Client) CreateDomain(ctx context.Context, domain DomainCreateOptions) ( if err != nil { return nil, err } - return r.Result().(*Domain).fixDates(), nil + + return r.Result().(*Domain), nil } // UpdateDomain updates the Domain with the specified id func (c *Client) UpdateDomain(ctx context.Context, id int, domain DomainUpdateOptions) (*Domain, error) { var body string + e, err := c.Domains.Endpoint() + if err != nil { return nil, err } + e = fmt.Sprintf("%s/%d", e, id) req := c.R(ctx).SetResult(&Domain{}) @@ -279,7 +288,8 @@ func (c *Client) UpdateDomain(ctx context.Context, id int, domain DomainUpdateOp if err != nil { return nil, err } - return r.Result().(*Domain).fixDates(), nil + + return r.Result().(*Domain), nil } // DeleteDomain deletes the Domain with the specified id @@ -288,8 +298,10 @@ func (c *Client) DeleteDomain(ctx context.Context, id int) error { if err != nil { return err } + e = fmt.Sprintf("%s/%d", e, id) _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err } diff --git a/vendor/github.com/linode/linodego/errors.go b/vendor/github.com/linode/linodego/errors.go index 9ceb881a2..d36925bcb 100644 --- a/vendor/github.com/linode/linodego/errors.go +++ b/vendor/github.com/linode/linodego/errors.go @@ -6,7 +6,7 @@ import ( "net/http" "strings" - "gopkg.in/resty.v1" + "github.com/go-resty/resty/v2" ) const ( @@ -35,6 +35,7 @@ func (r APIErrorReason) Error() string { if len(r.Field) == 0 { return r.Reason } + return fmt.Sprintf("[%s] %s", r.Field, r.Reason) } @@ -49,10 +50,25 @@ func coupleAPIErrors(r *resty.Response, err error) (*resty.Response, error) { } if r.Error() != nil { + // Check that response is of the correct content-type before unmarshalling + expectedContentType := r.Request.Header.Get("Accept") + responseContentType := r.Header().Get("Content-Type") + + if responseContentType != expectedContentType { + msg := fmt.Sprintf( + "Unexpected Content-Type: Expected: %v, Received: %v", + expectedContentType, + responseContentType, + ) + + return nil, NewError(msg) + } + apiError, ok := r.Error().(*APIError) if !ok || (ok && len(apiError.Errors) == 0) { return r, nil } + return nil, NewError(r) } @@ -60,10 +76,11 @@ func coupleAPIErrors(r *resty.Response, err error) (*resty.Response, error) { } func (e APIError) Error() string { - var x []string + x := []string{} for _, msg := range e.Errors { x = append(x, msg.Error()) } + return strings.Join(x, "; ") } diff --git a/vendor/github.com/linode/linodego/firewall_rules.go b/vendor/github.com/linode/linodego/firewall_rules.go new file mode 100644 index 000000000..7dfc952ce --- /dev/null +++ b/vendor/github.com/linode/linodego/firewall_rules.go @@ -0,0 +1,30 @@ +package linodego + +// NetworkProtocol enum type +type NetworkProtocol string + +// NetworkProtocol enum values +const ( + TCP NetworkProtocol = "TCP" + UDP NetworkProtocol = "UDP" + ICMP NetworkProtocol = "ALL" +) + +// NetworkAddresses are arrays of ipv4 and v6 addresses +type NetworkAddresses struct { + IPv4 []string `json:"ipv4"` + IPv6 []string `json:"ipv6"` +} + +// A FirewallRule is a whitelist of ports, protocols, and addresses for which traffic should be allowed. +type FirewallRule struct { + Ports string `json:"ports"` + Protocol NetworkProtocol `json:"protocol"` + Addresses NetworkAddresses `json:"addresses"` +} + +// FirewallRuleSet is a pair of inbound and outbound rules that specify what network traffic should be allowed. +type FirewallRuleSet struct { + Inbound []FirewallRule `json:"inbound,omitempty"` + Outbound []FirewallRule `json:"outbound,omitempty"` +} diff --git a/vendor/github.com/linode/linodego/firewalls.go b/vendor/github.com/linode/linodego/firewalls.go new file mode 100644 index 000000000..21b4e43a9 --- /dev/null +++ b/vendor/github.com/linode/linodego/firewalls.go @@ -0,0 +1,138 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/linode/linodego/internal/parseabletime" +) + +// FirewallStatus enum type +type FirewallStatus string + +// FirewallStatus enums start with Firewall +const ( + FirewallEnabled FirewallStatus = "enabled" + FirewallDisabled FirewallStatus = "disabled" + FirewallDeleted FirewallStatus = "deleted" +) + +// A Firewall is a set of networking rules (iptables) applied to Devices with which it is associated +type Firewall struct { + ID int `json:"id"` + Label string `json:"label"` + Status FirewallStatus `json:"status"` + Tags []string `json:"tags,omitempty"` + Rules FirewallRuleSet `json:"rules"` + Created *time.Time `json:"-"` + Updated *time.Time `json:"-"` +} + +// DevicesCreationOptions fields are used when adding devices during the Firewall creation process. +type DevicesCreationOptions struct { + Linodes []string `json:"linodes,omitempty"` + NodeBalancers []string `json:"nodebalancers,omitempty"` +} + +// FirewallCreateOptions fields are those accepted by CreateFirewall +type FirewallCreateOptions struct { + Label string `json:"label,omitempty"` + Rules FirewallRuleSet `json:"rules"` + Tags []string `json:"tags,omitempty"` + Devices DevicesCreationOptions `json:"devices,omitempty"` +} + +// UnmarshalJSON for Firewall responses +func (i *Firewall) UnmarshalJSON(b []byte) error { + type Mask Firewall + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + + return nil +} + +// FirewallsPagedResponse represents a Linode API response for listing of Cloud Firewalls +type FirewallsPagedResponse struct { + *PageOptions + Data []Firewall `json:"data"` +} + +func (FirewallsPagedResponse) endpoint(c *Client) string { + endpoint, err := c.Firewalls.Endpoint() + if err != nil { + panic(err) + } + return endpoint +} + +func (resp *FirewallsPagedResponse) appendData(r *FirewallsPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListFirewalls returns a paginated list of Cloud Firewalls +func (c *Client) ListFirewalls(ctx context.Context, opts *ListOptions) ([]Firewall, error) { + response := FirewallsPagedResponse{} + + err := c.listHelper(ctx, &response, opts) + + if err != nil { + return nil, err + } + + return response.Data, nil +} + +// CreateFirewall creates a single Firewall with at least one set of inbound or outbound rules +func (c *Client) CreateFirewall(ctx context.Context, createOpts FirewallCreateOptions) (*Firewall, error) { + var body string + e, err := c.Firewalls.Endpoint() + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&Firewall{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + return r.Result().(*Firewall), nil +} + +// DeleteFirewall deletes a single Firewall with the provided ID +func (c *Client) DeleteFirewall(ctx context.Context, id int) error { + e, err := c.Firewalls.Endpoint() + if err != nil { + return err + } + + req := c.R(ctx) + + e = fmt.Sprintf("%s/%d", e, id) + _, err = coupleAPIErrors(req.Delete(e)) + return err +} diff --git a/vendor/github.com/linode/linodego/go.mod b/vendor/github.com/linode/linodego/go.mod new file mode 100644 index 000000000..15154c9a0 --- /dev/null +++ b/vendor/github.com/linode/linodego/go.mod @@ -0,0 +1,15 @@ +module github.com/linode/linodego + +require ( + github.com/dnaeon/go-vcr v1.0.1 + github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 + github.com/golang/protobuf v1.2.0 // indirect + github.com/kr/pretty v0.1.0 // indirect + golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be + golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect + google.golang.org/appengine v1.1.0 // indirect + gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect + gopkg.in/yaml.v2 v2.2.1 // indirect +) + +go 1.13 diff --git a/vendor/github.com/linode/linodego/go.sum b/vendor/github.com/linode/linodego/go.sum new file mode 100644 index 000000000..2280c87d7 --- /dev/null +++ b/vendor/github.com/linode/linodego/go.sum @@ -0,0 +1,29 @@ +github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY= +github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY= +github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= +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/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= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +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-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/linode/linodego/images.go b/vendor/github.com/linode/linodego/images.go index 979ce2ed1..10018eff4 100644 --- a/vendor/github.com/linode/linodego/images.go +++ b/vendor/github.com/linode/linodego/images.go @@ -5,24 +5,23 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // Image represents a deployable Image object for use with Linode Instances type Image struct { - CreatedStr string `json:"created"` - ExpiryStr string `json:"expiry"` - ID string `json:"id"` - CreatedBy string `json:"created_by"` - Label string `json:"label"` - Description string `json:"description"` - Type string `json:"type"` - Vendor string `json:"vendor"` - Size int `json:"size"` - IsPublic bool `json:"is_public"` - Deprecated bool `json:"deprecated"` - - Created *time.Time `json:"-"` - Expiry *time.Time `json:"-"` + ID string `json:"id"` + CreatedBy string `json:"created_by"` + Label string `json:"label"` + Description string `json:"description"` + Type string `json:"type"` + Vendor string `json:"vendor"` + Size int `json:"size"` + IsPublic bool `json:"is_public"` + Deprecated bool `json:"deprecated"` + Created *time.Time `json:"-"` + Expiry *time.Time `json:"-"` } // ImageCreateOptions fields are those accepted by CreateImage @@ -38,15 +37,26 @@ type ImageUpdateOptions struct { Description *string `json:"description,omitempty"` } -func (i *Image) fixDates() *Image { - i.Created, _ = parseDates(i.CreatedStr) +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Image) UnmarshalJSON(b []byte) error { + type Mask Image - if len(i.ExpiryStr) > 0 { - i.Expiry, _ = parseDates(i.ExpiryStr) - } else { - i.Expiry = nil + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Expiry *parseabletime.ParseableTime `json:"expiry"` + }{ + Mask: (*Mask)(i), } - return i + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Expiry = (*time.Time)(p.Expiry) + + return nil } // GetUpdateOptions converts an Image to ImageUpdateOptions for use in UpdateImage @@ -78,14 +88,11 @@ func (resp *ImagesPagedResponse) appendData(r *ImagesPagedResponse) { func (c *Client) ListImages(ctx context.Context, opts *ListOptions) ([]Image, error) { response := ImagesPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil - } // GetImage gets the Image with the provided ID @@ -94,18 +101,22 @@ func (c *Client) GetImage(ctx context.Context, id string) (*Image, error) { if err != nil { return nil, err } + e = fmt.Sprintf("%s/%s", e, id) r, err := coupleAPIErrors(c.Images.R(ctx).Get(e)) + if err != nil { return nil, err } - return r.Result().(*Image).fixDates(), nil + return r.Result().(*Image), nil } // CreateImage creates a Image func (c *Client) CreateImage(ctx context.Context, createOpts ImageCreateOptions) (*Image, error) { var body string + e, err := c.Images.Endpoint() + if err != nil { return nil, err } @@ -125,16 +136,18 @@ func (c *Client) CreateImage(ctx context.Context, createOpts ImageCreateOptions) if err != nil { return nil, err } - return r.Result().(*Image).fixDates(), nil + return r.Result().(*Image), nil } // UpdateImage updates the Image with the specified id func (c *Client) UpdateImage(ctx context.Context, id string, updateOpts ImageUpdateOptions) (*Image, error) { var body string + e, err := c.Images.Endpoint() if err != nil { return nil, err } + e = fmt.Sprintf("%s/%s", e, id) req := c.R(ctx).SetResult(&Image{}) @@ -152,7 +165,7 @@ func (c *Client) UpdateImage(ctx context.Context, id string, updateOpts ImageUpd if err != nil { return nil, err } - return r.Result().(*Image).fixDates(), nil + return r.Result().(*Image), nil } // DeleteImage deletes the Image with the specified id @@ -161,6 +174,7 @@ func (c *Client) DeleteImage(ctx context.Context, id string) error { if err != nil { return err } + e = fmt.Sprintf("%s/%s", e, id) _, err = coupleAPIErrors(c.R(ctx).Delete(e)) diff --git a/vendor/github.com/linode/linodego/instance_configs.go b/vendor/github.com/linode/linodego/instance_configs.go index 979a27495..df51e5339 100644 --- a/vendor/github.com/linode/linodego/instance_configs.go +++ b/vendor/github.com/linode/linodego/instance_configs.go @@ -5,13 +5,12 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // InstanceConfig represents all of the settings that control the boot and run configuration of a Linode Instance type InstanceConfig struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` - ID int `json:"id"` Label string `json:"label"` Comments string `json:"comments"` @@ -90,6 +89,28 @@ type InstanceConfigUpdateOptions struct { VirtMode string `json:"virt_mode,omitempty"` } +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *InstanceConfig) UnmarshalJSON(b []byte) error { + type Mask InstanceConfig + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + + return nil +} + // GetCreateOptions converts a InstanceConfig to InstanceConfigCreateOptions for use in CreateInstanceConfig func (i InstanceConfig) GetCreateOptions() InstanceConfigCreateOptions { initrd := 0 @@ -144,22 +165,13 @@ func (resp *InstanceConfigsPagedResponse) appendData(r *InstanceConfigsPagedResp func (c *Client) ListInstanceConfigs(ctx context.Context, linodeID int, opts *ListOptions) ([]InstanceConfig, error) { response := InstanceConfigsPagedResponse{} err := c.listHelperWithID(ctx, &response, linodeID, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *InstanceConfig) fixDates() *InstanceConfig { - i.Created, _ = parseDates(i.CreatedStr) - i.Updated, _ = parseDates(i.UpdatedStr) - return i -} - // GetInstanceConfig gets the template with the provided ID func (c *Client) GetInstanceConfig(ctx context.Context, linodeID int, configID int) (*InstanceConfig, error) { e, err := c.InstanceConfigs.endpointWithID(linodeID) @@ -168,16 +180,18 @@ func (c *Client) GetInstanceConfig(ctx context.Context, linodeID int, configID i } e = fmt.Sprintf("%s/%d", e, configID) r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceConfig{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*InstanceConfig).fixDates(), nil + return r.Result().(*InstanceConfig), nil } // CreateInstanceConfig creates a new InstanceConfig for the given Instance func (c *Client) CreateInstanceConfig(ctx context.Context, linodeID int, createOpts InstanceConfigCreateOptions) (*InstanceConfig, error) { var body string e, err := c.InstanceConfigs.endpointWithID(linodeID) + if err != nil { return nil, err } @@ -198,13 +212,14 @@ func (c *Client) CreateInstanceConfig(ctx context.Context, linodeID int, createO return nil, err } - return r.Result().(*InstanceConfig).fixDates(), nil + return r.Result().(*InstanceConfig), nil } // UpdateInstanceConfig update an InstanceConfig for the given Instance func (c *Client) UpdateInstanceConfig(ctx context.Context, linodeID int, configID int, updateOpts InstanceConfigUpdateOptions) (*InstanceConfig, error) { var body string e, err := c.InstanceConfigs.endpointWithID(linodeID) + if err != nil { return nil, err } @@ -225,7 +240,7 @@ func (c *Client) UpdateInstanceConfig(ctx context.Context, linodeID int, configI return nil, err } - return r.Result().(*InstanceConfig).fixDates(), nil + return r.Result().(*InstanceConfig), nil } // RenameInstanceConfig renames an InstanceConfig diff --git a/vendor/github.com/linode/linodego/instance_disks.go b/vendor/github.com/linode/linodego/instance_disks.go index 9b43d6b8d..5d8e3cb1c 100644 --- a/vendor/github.com/linode/linodego/instance_disks.go +++ b/vendor/github.com/linode/linodego/instance_disks.go @@ -5,13 +5,12 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // InstanceDisk represents an Instance Disk object type InstanceDisk struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` - ID int `json:"id"` Label string `json:"label"` Status DiskStatus `json:"status"` @@ -90,24 +89,37 @@ func (resp *InstanceDisksPagedResponse) appendData(r *InstanceDisksPagedResponse func (c *Client) ListInstanceDisks(ctx context.Context, linodeID int, opts *ListOptions) ([]InstanceDisk, error) { response := InstanceDisksPagedResponse{} err := c.listHelperWithID(ctx, &response, linodeID, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *InstanceDisk) fixDates() *InstanceDisk { - if created, err := parseDates(v.CreatedStr); err == nil { - v.Created = *created +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *InstanceDisk) UnmarshalJSON(b []byte) error { + type Mask InstanceDisk + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), } - if updated, err := parseDates(v.UpdatedStr); err == nil { - v.Updated = *updated + + if err := json.Unmarshal(b, &p); err != nil { + return err } - return v + + if p.Created != nil { + i.Created = time.Time(*p.Created) + } + if p.Updated != nil { + i.Updated = time.Time(*p.Updated) + } + + return nil } // GetInstanceDisk gets the template with the provided ID @@ -116,18 +128,21 @@ func (c *Client) GetInstanceDisk(ctx context.Context, linodeID int, configID int if err != nil { return nil, err } + e = fmt.Sprintf("%s/%d", e, configID) r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceDisk{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*InstanceDisk).fixDates(), nil + return r.Result().(*InstanceDisk), nil } // CreateInstanceDisk creates a new InstanceDisk for the given Instance func (c *Client) CreateInstanceDisk(ctx context.Context, linodeID int, createOpts InstanceDiskCreateOptions) (*InstanceDisk, error) { var body string e, err := c.InstanceDisks.endpointWithID(linodeID) + if err != nil { return nil, err } @@ -148,18 +163,19 @@ func (c *Client) CreateInstanceDisk(ctx context.Context, linodeID int, createOpt return nil, err } - return r.Result().(*InstanceDisk).fixDates(), nil + return r.Result().(*InstanceDisk), nil } // UpdateInstanceDisk creates a new InstanceDisk for the given Instance func (c *Client) UpdateInstanceDisk(ctx context.Context, linodeID int, diskID int, updateOpts InstanceDiskUpdateOptions) (*InstanceDisk, error) { var body string e, err := c.InstanceDisks.endpointWithID(linodeID) + if err != nil { return nil, err } - e = fmt.Sprintf("%s/%d", e, diskID) + e = fmt.Sprintf("%s/%d", e, diskID) req := c.R(ctx).SetResult(&InstanceDisk{}) if bodyData, err := json.Marshal(updateOpts); err == nil { @@ -176,7 +192,7 @@ func (c *Client) UpdateInstanceDisk(ctx context.Context, linodeID int, diskID in return nil, err } - return r.Result().(*InstanceDisk).fixDates(), nil + return r.Result().(*InstanceDisk), nil } // RenameInstanceDisk renames an InstanceDisk @@ -188,6 +204,7 @@ func (c *Client) RenameInstanceDisk(ctx context.Context, linodeID int, diskID in func (c *Client) ResizeInstanceDisk(ctx context.Context, linodeID int, diskID int, size int) error { var body string e, err := c.InstanceDisks.endpointWithID(linodeID) + if err != nil { return err } @@ -215,6 +232,7 @@ func (c *Client) ResizeInstanceDisk(ctx context.Context, linodeID int, diskID in func (c *Client) PasswordResetInstanceDisk(ctx context.Context, linodeID int, diskID int, password string) error { var body string e, err := c.InstanceDisks.endpointWithID(linodeID) + if err != nil { return err } diff --git a/vendor/github.com/linode/linodego/instance_ips.go b/vendor/github.com/linode/linodego/instance_ips.go index a30d04f16..eebc359f9 100644 --- a/vendor/github.com/linode/linodego/instance_ips.go +++ b/vendor/github.com/linode/linodego/instance_ips.go @@ -14,22 +14,23 @@ type InstanceIPAddressResponse struct { // InstanceIPv4Response contains the details of all IPv4 addresses associated with an Instance type InstanceIPv4Response struct { - Public []*InstanceIP `json:"public"` - Private []*InstanceIP `json:"private"` - Shared []*InstanceIP `json:"shared"` + Public []*InstanceIP `json:"public"` + Private []*InstanceIP `json:"private"` + Shared []*InstanceIP `json:"shared"` + Reserved []*InstanceIP `json:"reserved"` } // InstanceIP represents an Instance IP with additional DNS and networking details type InstanceIP struct { - Address string `json:"address"` - Gateway string `json:"gateway"` - SubnetMask string `json:"subnet_mask"` - Prefix int `json:"prefix"` - Type string `json:"type"` - Public bool `json:"public"` - RDNS string `json:"rdns"` - LinodeID int `json:"linode_id"` - Region string `json:"region"` + Address string `json:"address"` + Gateway string `json:"gateway"` + SubnetMask string `json:"subnet_mask"` + Prefix int `json:"prefix"` + Type InstanceIPType `json:"type"` + Public bool `json:"public"` + RDNS string `json:"rdns"` + LinodeID int `json:"linode_id"` + Region string `json:"region"` } // InstanceIPv6Response contains the IPv6 addresses and ranges for an Instance @@ -43,14 +44,27 @@ type InstanceIPv6Response struct { type IPv6Range struct { Range string `json:"range"` Region string `json:"region"` + Prefix int `json:"prefix"` } +// InstanceIPType constants start with IPType and include Linode Instance IP Types +type InstanceIPType string + +// InstanceIPType constants represent the IP types an Instance IP may be +const ( + IPTypeIPv4 InstanceIPType = "ipv4" + IPTypeIPv6 InstanceIPType = "ipv6" + IPTypeIPv6Pool InstanceIPType = "ipv6/pool" + IPTypeIPv6Range InstanceIPType = "ipv6/range" +) + // GetInstanceIPAddresses gets the IPAddresses for a Linode instance func (c *Client) GetInstanceIPAddresses(ctx context.Context, linodeID int) (*InstanceIPAddressResponse, error) { e, err := c.InstanceIPs.endpointWithID(linodeID) if err != nil { return nil, err } + r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceIPAddressResponse{}).Get(e)) if err != nil { return nil, err @@ -66,6 +80,7 @@ func (c *Client) GetInstanceIPAddress(ctx context.Context, linodeID int, ipaddre } e = fmt.Sprintf("%s/%s", e, ipaddress) r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceIP{}).Get(e)) + if err != nil { return nil, err } @@ -76,6 +91,7 @@ func (c *Client) GetInstanceIPAddress(ctx context.Context, linodeID int, ipaddre func (c *Client) AddInstanceIPAddress(ctx context.Context, linodeID int, public bool) (*InstanceIP, error) { var body string e, err := c.InstanceIPs.endpointWithID(linodeID) + if err != nil { return nil, err } @@ -104,3 +120,31 @@ func (c *Client) AddInstanceIPAddress(ctx context.Context, linodeID int, public return r.Result().(*InstanceIP), nil } + +// UpdateInstanceIPAddress updates the IPAddress with the specified instance id and IP address +func (c *Client) UpdateInstanceIPAddress(ctx context.Context, linodeID int, ipAddress string, updateOpts IPAddressUpdateOptions) (*InstanceIP, error) { + var body string + e, err := c.InstanceIPs.endpointWithID(linodeID) + + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%s", e, ipAddress) + + req := c.R(ctx).SetResult(&InstanceIP{}) + + if bodyData, err := json.Marshal(updateOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Put(e)) + + if err != nil { + return nil, err + } + return r.Result().(*InstanceIP), nil +} diff --git a/vendor/github.com/linode/linodego/instance_snapshots.go b/vendor/github.com/linode/linodego/instance_snapshots.go index 7933507dc..d23f8dbd4 100644 --- a/vendor/github.com/linode/linodego/instance_snapshots.go +++ b/vendor/github.com/linode/linodego/instance_snapshots.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // InstanceBackupsResponse response struct for backup snapshot @@ -27,10 +29,6 @@ type RestoreInstanceOptions struct { // InstanceSnapshot represents a linode backup snapshot type InstanceSnapshot struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` - FinishedStr string `json:"finished"` - ID int `json:"id"` Label string `json:"label"` Status InstanceSnapshotStatus `json:"status"` @@ -63,11 +61,28 @@ var ( SnapshotUserAborted InstanceSnapshotStatus = "userAborted" ) -func (l *InstanceSnapshot) fixDates() *InstanceSnapshot { - l.Created, _ = parseDates(l.CreatedStr) - l.Updated, _ = parseDates(l.UpdatedStr) - l.Finished, _ = parseDates(l.FinishedStr) - return l +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *InstanceSnapshot) UnmarshalJSON(b []byte) error { + type Mask InstanceSnapshot + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + Finished *parseabletime.ParseableTime `json:"finished"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + i.Finished = (*time.Time)(p.Finished) + + return nil } // GetInstanceSnapshot gets the snapshot with the provided ID @@ -78,10 +93,11 @@ func (c *Client) GetInstanceSnapshot(ctx context.Context, linodeID int, snapshot } e = fmt.Sprintf("%s/%d", e, snapshotID) r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceSnapshot{}).Get(e)) + if err != nil { return nil, err } - return r.Result().(*InstanceSnapshot).fixDates(), nil + return r.Result().(*InstanceSnapshot), nil } // CreateInstanceSnapshot Creates or Replaces the snapshot Backup of a Linode. If a previous snapshot exists for this Linode, it will be deleted. @@ -92,6 +108,7 @@ func (c *Client) CreateInstanceSnapshot(ctx context.Context, linodeID int, label } body := string(o) e, err := c.InstanceSnapshots.endpointWithID(linodeID) + if err != nil { return nil, err } @@ -105,7 +122,7 @@ func (c *Client) CreateInstanceSnapshot(ctx context.Context, linodeID int, label return nil, err } - return r.Result().(*InstanceSnapshot).fixDates(), nil + return r.Result().(*InstanceSnapshot), nil } // GetInstanceBackups gets the Instance's available Backups. @@ -118,10 +135,11 @@ func (c *Client) GetInstanceBackups(ctx context.Context, linodeID int) (*Instanc r, err := coupleAPIErrors(c.R(ctx). SetResult(&InstanceBackupsResponse{}). Get(e)) + if err != nil { return nil, err } - return r.Result().(*InstanceBackupsResponse).fixDates(), nil + return r.Result().(*InstanceBackupsResponse), nil } // EnableInstanceBackups Enables backups for the specified Linode. @@ -164,25 +182,4 @@ func (c *Client) RestoreInstanceBackup(ctx context.Context, linodeID int, backup _, err = coupleAPIErrors(c.R(ctx).SetBody(body).Post(e)) return err - -} - -func (l *InstanceBackupSnapshotResponse) fixDates() *InstanceBackupSnapshotResponse { - if l.Current != nil { - l.Current.fixDates() - } - if l.InProgress != nil { - l.InProgress.fixDates() - } - return l -} - -func (l *InstanceBackupsResponse) fixDates() *InstanceBackupsResponse { - for i := range l.Automatic { - l.Automatic[i].fixDates() - } - if l.Snapshot != nil { - l.Snapshot.fixDates() - } - return l } diff --git a/vendor/github.com/linode/linodego/instance_stats.go b/vendor/github.com/linode/linodego/instance_stats.go new file mode 100644 index 000000000..609b95183 --- /dev/null +++ b/vendor/github.com/linode/linodego/instance_stats.go @@ -0,0 +1,68 @@ +package linodego + +import ( + "context" + "fmt" +) + +// StatsNet represents a network stats object +type StatsNet struct { + In [][]float64 `json:"in"` + Out [][]float64 `json:"out"` + PrivateIn [][]float64 `json:"private_in"` + PrivateOut [][]float64 `json:"private_out"` +} + +// StatsIO represents an IO stats object +type StatsIO struct { + IO [][]float64 `json:"io"` + Swap [][]float64 `json:"swap"` +} + +// InstanceStatsData represents an instance stats data object +type InstanceStatsData struct { + CPU [][]float64 `json:"cpu"` + IO StatsIO `json:"io"` + NetV4 StatsNet `json:"netv4"` + NetV6 StatsNet `json:"netv6"` +} + +// InstanceStats represents an instance stats object +type InstanceStats struct { + Title string `json:"title"` + Data InstanceStatsData `json:"data"` +} + +// endpointWithIDAndDate gets the endpoint URL for InstanceStats of a given Instance and Year/Month +func endpointWithIDAndDate(c *Client, id int, year int, month int) string { + endpoint, err := c.InstanceStats.endpointWithID(id) + if err != nil { + panic(err) + } + + endpoint = fmt.Sprintf("%s/%d/%d", endpoint, year, month) + return endpoint +} + +// GetInstanceStats gets the template with the provided ID +func (c *Client) GetInstanceStats(ctx context.Context, linodeID int) (*InstanceStats, error) { + e, err := c.InstanceStats.endpointWithID(linodeID) + if err != nil { + return nil, err + } + r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceStats{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*InstanceStats), nil +} + +// GetInstanceStatsByDate gets the template with the provided ID, year, and month +func (c *Client) GetInstanceStatsByDate(ctx context.Context, linodeID int, year int, month int) (*InstanceStats, error) { + e := endpointWithIDAndDate(c, linodeID, year, month) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&InstanceStats{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*InstanceStats), nil +} diff --git a/vendor/github.com/linode/linodego/instance_volumes.go b/vendor/github.com/linode/linodego/instance_volumes.go index b6c9a9ae0..7d19d3811 100644 --- a/vendor/github.com/linode/linodego/instance_volumes.go +++ b/vendor/github.com/linode/linodego/instance_volumes.go @@ -28,9 +28,7 @@ func (resp *InstanceVolumesPagedResponse) appendData(r *InstanceVolumesPagedResp func (c *Client) ListInstanceVolumes(ctx context.Context, linodeID int, opts *ListOptions) ([]Volume, error) { response := InstanceVolumesPagedResponse{} err := c.listHelperWithID(ctx, &response, linodeID, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } diff --git a/vendor/github.com/linode/linodego/instances.go b/vendor/github.com/linode/linodego/instances.go index 85775508a..abb807fb5 100644 --- a/vendor/github.com/linode/linodego/instances.go +++ b/vendor/github.com/linode/linodego/instances.go @@ -6,6 +6,8 @@ import ( "fmt" "net" "time" + + "github.com/linode/linodego/internal/parseabletime" ) /* @@ -33,9 +35,6 @@ const ( // Instance represents a linode object type Instance struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` - ID int `json:"id"` Created *time.Time `json:"-"` Updated *time.Time `json:"-"` @@ -81,6 +80,18 @@ type InstanceBackup struct { } } +// InstanceTransfer pool stats for a Linode Instance during the current billing month +type InstanceTransfer struct { + // Bytes of transfer this instance has consumed + Used int `json:"used"` + + // GB of billable transfer this instance has consumed + Billable int `json:"billable"` + + // GB of transfer this instance adds to the Transfer pool + Quota int `json:"quota"` +} + // InstanceCreateOptions require only Region and Type type InstanceCreateOptions struct { Region string `json:"region"` @@ -113,15 +124,37 @@ type InstanceUpdateOptions struct { Tags *[]string `json:"tags,omitempty"` } +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Instance) UnmarshalJSON(b []byte) error { + type Mask Instance + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + + return nil +} + // GetUpdateOptions converts an Instance to InstanceUpdateOptions for use in UpdateInstance -func (l *Instance) GetUpdateOptions() InstanceUpdateOptions { +func (i *Instance) GetUpdateOptions() InstanceUpdateOptions { return InstanceUpdateOptions{ - Label: l.Label, - Group: l.Group, - Backups: l.Backups, - Alerts: l.Alerts, - WatchdogEnabled: &l.WatchdogEnabled, - Tags: &l.Tags, + Label: i.Label, + Group: i.Group, + Backups: i.Backups, + Alerts: i.Alerts, + WatchdogEnabled: &i.WatchdogEnabled, + Tags: &i.Tags, } } @@ -139,10 +172,12 @@ type InstanceCloneOptions struct { Configs []int `json:"configs,omitempty"` } -func (l *Instance) fixDates() *Instance { - l.Created, _ = parseDates(l.CreatedStr) - l.Updated, _ = parseDates(l.UpdatedStr) - return l +// InstanceResizeOptions is an options struct used when resizing an instance +type InstanceResizeOptions struct { + Type string `json:"type"` + + // When enabled, an instance resize will also resize a data disk if the instance has no more than one data disk and one swap disk + AllowAutoDiskResize *bool `json:"allow_auto_disk_resize,omitempty"` } // InstancesPagedResponse represents a linode API response for listing @@ -169,9 +204,7 @@ func (resp *InstancesPagedResponse) appendData(r *InstancesPagedResponse) { func (c *Client) ListInstances(ctx context.Context, opts *ListOptions) ([]Instance, error) { response := InstancesPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } @@ -191,7 +224,23 @@ func (c *Client) GetInstance(ctx context.Context, linodeID int) (*Instance, erro if err != nil { return nil, err } - return r.Result().(*Instance).fixDates(), nil + return r.Result().(*Instance), nil +} + +// GetInstanceTransfer gets the instance with the provided ID +func (c *Client) GetInstanceTransfer(ctx context.Context, linodeID int) (*InstanceTransfer, error) { + e, err := c.Instances.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d/transfer", e, linodeID) + r, err := coupleAPIErrors(c.R(ctx). + SetResult(InstanceTransfer{}). + Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*InstanceTransfer), nil } // CreateInstance creates a Linode instance @@ -217,7 +266,7 @@ func (c *Client) CreateInstance(ctx context.Context, instance InstanceCreateOpti if err != nil { return nil, err } - return r.Result().(*Instance).fixDates(), nil + return r.Result().(*Instance), nil } // UpdateInstance creates a Linode instance @@ -244,7 +293,7 @@ func (c *Client) UpdateInstance(ctx context.Context, id int, instance InstanceUp if err != nil { return nil, err } - return r.Result().(*Instance).fixDates(), nil + return r.Result().(*Instance), nil } // RenameInstance renames an Instance @@ -316,7 +365,7 @@ func (c *Client) CloneInstance(ctx context.Context, id int, options InstanceClon return nil, err } - return r.Result().(*Instance).fixDates(), nil + return r.Result().(*Instance), nil } // RebootInstance reboots a Linode instance @@ -347,20 +396,20 @@ func (c *Client) RebootInstance(ctx context.Context, id int, configID int) error return err } -// RebuildInstanceOptions is a struct representing the options to send to the rebuild linode endpoint -type RebuildInstanceOptions struct { - Image string `json:"image"` - RootPass string `json:"root_pass"` - AuthorizedKeys []string `json:"authorized_keys"` - AuthorizedUsers []string `json:"authorized_users"` - StackscriptID int `json:"stackscript_id"` - StackscriptData map[string]string `json:"stackscript_data"` - Booted bool `json:"booted"` +// InstanceRebuildOptions is a struct representing the options to send to the rebuild linode endpoint +type InstanceRebuildOptions struct { + Image string `json:"image,omitempty"` + RootPass string `json:"root_pass,omitempty"` + AuthorizedKeys []string `json:"authorized_keys,omitempty"` + AuthorizedUsers []string `json:"authorized_users,omitempty"` + StackScriptID int `json:"stackscript_id,omitempty"` + StackScriptData map[string]string `json:"stackscript_data,omitempty"` + Booted *bool `json:"booted,omitempty"` } // RebuildInstance Deletes all Disks and Configs on this Linode, // then deploys a new Image to this Linode with the given attributes. -func (c *Client) RebuildInstance(ctx context.Context, id int, opts RebuildInstanceOptions) (*Instance, error) { +func (c *Client) RebuildInstance(ctx context.Context, id int, opts InstanceRebuildOptions) (*Instance, error) { o, err := json.Marshal(opts) if err != nil { return nil, NewError(err) @@ -378,11 +427,11 @@ func (c *Client) RebuildInstance(ctx context.Context, id int, opts RebuildInstan if err != nil { return nil, err } - return r.Result().(*Instance).fixDates(), nil + return r.Result().(*Instance), nil } -// RescueInstanceOptions fields are those accepted by RescueInstance -type RescueInstanceOptions struct { +// InstanceRescueOptions fields are those accepted by RescueInstance +type InstanceRescueOptions struct { Devices InstanceConfigDeviceMap `json:"devices"` } @@ -390,7 +439,7 @@ type RescueInstanceOptions struct { // Rescue Mode is based on the Finnix recovery distribution, a self-contained and bootable Linux distribution. // You can also use Rescue Mode for tasks other than disaster recovery, such as formatting disks to use different filesystems, // copying data between disks, and downloading files from a disk via SSH and SFTP. -func (c *Client) RescueInstance(ctx context.Context, id int, opts RescueInstanceOptions) error { +func (c *Client) RescueInstance(ctx context.Context, id int, opts InstanceRescueOptions) error { o, err := json.Marshal(opts) if err != nil { return NewError(err) @@ -410,9 +459,12 @@ func (c *Client) RescueInstance(ctx context.Context, id int, opts RescueInstance } // ResizeInstance resizes an instance to new Linode type -func (c *Client) ResizeInstance(ctx context.Context, id int, linodeType string) error { - body := fmt.Sprintf("{\"type\":\"%s\"}", linodeType) - +func (c *Client) ResizeInstance(ctx context.Context, id int, opts InstanceResizeOptions) error { + o, err := json.Marshal(opts) + if err != nil { + return NewError(err) + } + body := string(o) e, err := c.Instances.Endpoint() if err != nil { return err diff --git a/vendor/github.com/linode/linodego/internal/duration/duration.go b/vendor/github.com/linode/linodego/internal/duration/duration.go new file mode 100644 index 000000000..b4049b601 --- /dev/null +++ b/vendor/github.com/linode/linodego/internal/duration/duration.go @@ -0,0 +1,63 @@ +package duration + +import ( + "encoding/json" + "fmt" + "log" + "strconv" + "strings" +) + +func UnmarshalTimeRemaining(m json.RawMessage) *int { + jsonBytes, err := m.MarshalJSON() + if err != nil { + panic(jsonBytes) + } + + if len(jsonBytes) == 4 && string(jsonBytes) == "null" { + return nil + } + + var timeStr string + if err := json.Unmarshal(jsonBytes, &timeStr); err == nil && len(timeStr) > 0 { + if dur, err := durationToSeconds(timeStr); err != nil { + panic(err) + } else { + return &dur + } + } else { + var intPtr int + if err := json.Unmarshal(jsonBytes, &intPtr); err == nil { + return &intPtr + } + } + + log.Println("[WARN] Unexpected unmarshalTimeRemaining value: ", jsonBytes) + + return nil +} + +// durationToSeconds takes a hh:mm:ss string and returns the number of seconds +func durationToSeconds(s string) (int, error) { + multipliers := [3]int{60 * 60, 60, 1} + segs := strings.Split(s, ":") + + if len(segs) > len(multipliers) { + return 0, fmt.Errorf("too many ':' separators in time duration: %s", s) + } + + var d int + + l := len(segs) + + for i := 0; i < l; i++ { + m, err := strconv.Atoi(segs[i]) + if err != nil { + return 0, err + } + + d += m * multipliers[i+len(multipliers)-l] + } + + return d, nil +} diff --git a/vendor/github.com/linode/linodego/internal/parseabletime/parseable_time.go b/vendor/github.com/linode/linodego/internal/parseabletime/parseable_time.go new file mode 100644 index 000000000..c471442db --- /dev/null +++ b/vendor/github.com/linode/linodego/internal/parseabletime/parseable_time.go @@ -0,0 +1,22 @@ +package parseabletime + +import ( + "time" +) + +const ( + dateLayout = "2006-01-02T15:04:05" +) + +type ParseableTime time.Time + +func (p *ParseableTime) UnmarshalJSON(b []byte) error { + t, err := time.Parse(`"`+dateLayout+`"`, string(b)) + if err != nil { + return err + } + + *p = ParseableTime(t) + + return nil +} diff --git a/vendor/github.com/linode/linodego/lke_cluster_pools.go b/vendor/github.com/linode/linodego/lke_cluster_pools.go new file mode 100644 index 000000000..a9d0e7905 --- /dev/null +++ b/vendor/github.com/linode/linodego/lke_cluster_pools.go @@ -0,0 +1,166 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" +) + +// LKELinodeStatus constants start with LKELinode and include +// Linode API LKEClusterPool Linode Status values +type LKELinodeStatus string + +// LKEClusterPoolStatus constants reflect the current status of an LKEClusterPool +const ( + LKELinodeReady LKELinodeStatus = "ready" + LKELinodeNotReady LKELinodeStatus = "not_ready" +) + +// LKEClusterPoolLinode represents a LKEClusterPoolLinode object +type LKEClusterPoolLinode struct { + ID string `json:"id"` + Status LKELinodeStatus `json:"status"` +} + +// LKEClusterPool represents a LKEClusterPool object +type LKEClusterPool struct { + ID int `json:"id"` + Count int `json:"count"` + Type string `json:"type"` + Linodes []LKEClusterPoolLinode `json:"nodes"` +} + +// LKEClusterPoolCreateOptions fields are those accepted by CreateLKEClusterPool +type LKEClusterPoolCreateOptions struct { + Count int `json:"count"` + Type string `json:"type"` +} + +// LKEClusterPoolUpdateOptions fields are those accepted by UpdateLKEClusterPool +type LKEClusterPoolUpdateOptions struct { + Count int `json:"count"` +} + +// GetCreateOptions converts a LKEClusterPool to LKEClusterPoolCreateOptions for +// use in CreateLKEClusterPool +func (l LKEClusterPool) GetCreateOptions() (o LKEClusterPoolCreateOptions) { + o.Count = l.Count + return +} + +// GetUpdateOptions converts a LKEClusterPool to LKEClusterPoolUpdateOptions for use in UpdateLKEClusterPool +func (l LKEClusterPool) GetUpdateOptions() (o LKEClusterPoolUpdateOptions) { + o.Count = l.Count + return +} + +// LKEClusterPoolsPagedResponse represents a paginated LKEClusterPool API response +type LKEClusterPoolsPagedResponse struct { + *PageOptions + Data []LKEClusterPool `json:"data"` +} + +// endpointWithID gets the endpoint URL for InstanceConfigs of a given Instance +func (LKEClusterPoolsPagedResponse) endpointWithID(c *Client, id int) string { + endpoint, err := c.LKEClusterPools.endpointWithID(id) + if err != nil { + panic(err) + } + return endpoint +} + +// appendData appends LKEClusterPools when processing paginated LKEClusterPool responses +func (resp *LKEClusterPoolsPagedResponse) appendData(r *LKEClusterPoolsPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListLKEClusterPools lists LKEClusterPools +func (c *Client) ListLKEClusterPools(ctx context.Context, clusterID int, opts *ListOptions) ([]LKEClusterPool, error) { + response := LKEClusterPoolsPagedResponse{} + err := c.listHelperWithID(ctx, &response, clusterID, opts) + if err != nil { + return nil, err + } + + return response.Data, nil +} + +// GetLKEClusterPool gets the lkeClusterPool with the provided ID +func (c *Client) GetLKEClusterPool(ctx context.Context, clusterID, id int) (*LKEClusterPool, error) { + e, err := c.LKEClusterPools.endpointWithID(clusterID) + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&LKEClusterPool{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*LKEClusterPool), nil +} + +// CreateLKEClusterPool creates a LKEClusterPool +func (c *Client) CreateLKEClusterPool(ctx context.Context, clusterID int, createOpts LKEClusterPoolCreateOptions) (*LKEClusterPool, error) { + var body string + e, err := c.LKEClusterPools.endpointWithID(clusterID) + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&LKEClusterPool{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + return r.Result().(*LKEClusterPool), nil +} + +// UpdateLKEClusterPool updates the LKEClusterPool with the specified id +func (c *Client) UpdateLKEClusterPool(ctx context.Context, clusterID, id int, updateOpts LKEClusterPoolUpdateOptions) (*LKEClusterPool, error) { + var body string + e, err := c.LKEClusterPools.endpointWithID(clusterID) + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d", e, id) + + req := c.R(ctx).SetResult(&LKEClusterPool{}) + + if bodyData, err := json.Marshal(updateOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Put(e)) + + if err != nil { + return nil, err + } + return r.Result().(*LKEClusterPool), nil +} + +// DeleteLKEClusterPool deletes the LKEClusterPool with the specified id +func (c *Client) DeleteLKEClusterPool(ctx context.Context, + clusterID, id int) error { + e, err := c.LKEClusterPools.endpointWithID(clusterID) + if err != nil { + return err + } + e = fmt.Sprintf("%s/%d", e, id) + + _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err +} diff --git a/vendor/github.com/linode/linodego/lke_clusters.go b/vendor/github.com/linode/linodego/lke_clusters.go new file mode 100644 index 000000000..8ca359984 --- /dev/null +++ b/vendor/github.com/linode/linodego/lke_clusters.go @@ -0,0 +1,279 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/linode/linodego/internal/parseabletime" +) + +// LKEClusterStatus represents the status of an LKECluster +type LKEClusterStatus string + +// LKEClusterStatus enums start with LKECluster +const ( + LKEClusterReady LKEClusterStatus = "ready" + LKEClusterNotReady LKEClusterStatus = "not_ready" +) + +// LKECluster represents a LKECluster object +type LKECluster struct { + ID int `json:"id"` + Created *time.Time `json:"-"` + Updated *time.Time `json:"-"` + Label string `json:"label"` + Region string `json:"region"` + Status LKEClusterStatus `json:"status"` + Version string `json:"version"` + Tags []string `json:"tags"` +} + +// LKEClusterCreateOptions fields are those accepted by CreateLKECluster +type LKEClusterCreateOptions struct { + NodePools []LKEClusterPoolCreateOptions `json:"node_pools"` + Label string `json:"label"` + Region string `json:"region"` + Version string `json:"version"` + Tags []string `json:"tags,omitempty"` +} + +// LKEClusterUpdateOptions fields are those accepted by UpdateLKECluster +type LKEClusterUpdateOptions struct { + Label string `json:"label,omitempty"` +} + +// LKEClusterAPIEndpoint fields are those returned by GetLKEClusterAPIEndpoint +type LKEClusterAPIEndpoint struct { + Endpoints []string `json:"endpoints"` +} + +// LKEClusterKubeconfig fields are those returned by GetLKEClusterKubeconfig +type LKEClusterKubeconfig struct { + KubeConfig string `json:"kubeconfig"` +} + +// LKEVersion fields are those returned by GetLKEVersion +type LKEVersion struct { + ID string `json:"id"` +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *LKECluster) UnmarshalJSON(b []byte) error { + type Mask LKECluster + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + + return nil +} + +// GetCreateOptions converts a LKECluster to LKEClusterCreateOptions for use in CreateLKECluster +func (i LKECluster) GetCreateOptions() (o LKEClusterCreateOptions) { + o.Label = i.Label + o.Region = i.Region + o.Version = i.Version + o.Tags = i.Tags + // @TODO copy NodePools? + return +} + +// GetUpdateOptions converts a LKECluster to LKEClusterUpdateOptions for use in UpdateLKECluster +func (i LKECluster) GetUpdateOptions() (o LKEClusterUpdateOptions) { + o.Label = i.Label + return +} + +// LKEClustersPagedResponse represents a paginated LKECluster API response +type LKEClustersPagedResponse struct { + *PageOptions + Data []LKECluster `json:"data"` +} + +// LKEVersionsPagedResponse represents a paginated LKEVersion API response +type LKEVersionsPagedResponse struct { + *PageOptions + Data []LKEVersion `json:"data"` +} + +// endpoint gets the endpoint URL for LKECluster +func (LKEClustersPagedResponse) endpoint(c *Client) string { + endpoint, err := c.LKEClusters.Endpoint() + if err != nil { + panic(err) + } + return endpoint +} + +// appendData appends LKEClusters when processing paginated LKECluster responses +func (resp *LKEClustersPagedResponse) appendData(r *LKEClustersPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// endpoint gets the endpoint URL for LKEVersion +func (LKEVersionsPagedResponse) endpoint(c *Client) string { + endpoint, err := c.LKEVersions.Endpoint() + if err != nil { + panic(err) + } + return endpoint +} + +// appendData appends LKEVersions when processing paginated LKEVersion responses +func (resp *LKEVersionsPagedResponse) appendData(r *LKEVersionsPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListLKEClusters lists LKEClusters +func (c *Client) ListLKEClusters(ctx context.Context, opts *ListOptions) ([]LKECluster, error) { + response := LKEClustersPagedResponse{} + err := c.listHelper(ctx, &response, opts) + if err != nil { + return nil, err + } + return response.Data, nil +} + +// GetLKECluster gets the lkeCluster with the provided ID +func (c *Client) GetLKECluster(ctx context.Context, id int) (*LKECluster, error) { + e, err := c.LKEClusters.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&LKECluster{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*LKECluster), nil +} + +// CreateLKECluster creates a LKECluster +func (c *Client) CreateLKECluster(ctx context.Context, createOpts LKEClusterCreateOptions) (*LKECluster, error) { + var body string + e, err := c.LKEClusters.Endpoint() + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&LKECluster{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + return r.Result().(*LKECluster), nil +} + +// UpdateLKECluster updates the LKECluster with the specified id +func (c *Client) UpdateLKECluster(ctx context.Context, id int, updateOpts LKEClusterUpdateOptions) (*LKECluster, error) { + var body string + e, err := c.LKEClusters.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d", e, id) + + req := c.R(ctx).SetResult(&LKECluster{}) + + if bodyData, err := json.Marshal(updateOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Put(e)) + + if err != nil { + return nil, err + } + return r.Result().(*LKECluster), nil +} + +// DeleteLKECluster deletes the LKECluster with the specified id +func (c *Client) DeleteLKECluster(ctx context.Context, id int) error { + e, err := c.LKEClusters.Endpoint() + if err != nil { + return err + } + e = fmt.Sprintf("%s/%d", e, id) + + _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err +} + +// GetLKEClusterAPIEndpoint gets the API Endpoint for the LKE Cluster specified +func (c *Client) GetLKEClusterAPIEndpoint(ctx context.Context, id int) (*LKEClusterAPIEndpoint, error) { + e, err := c.LKEClusters.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d/api-endpoint", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&LKEClusterAPIEndpoint{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*LKEClusterAPIEndpoint), nil +} + +// GetLKEClusterKubeconfig gets the Kubeconfig for the LKE Cluster specified +func (c *Client) GetLKEClusterKubeconfig(ctx context.Context, id int) (*LKEClusterKubeconfig, error) { + e, err := c.LKEClusters.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d/kubeconfig", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&LKEClusterKubeconfig{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*LKEClusterKubeconfig), nil +} + +// GetLKEVersion gets details about a specific LKE Version +func (c *Client) GetLKEVersion(ctx context.Context, version string) (*LKEVersion, error) { + e, err := c.LKEVersions.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%s", e, version) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&LKEVersion{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*LKEVersion), nil +} + +// ListLKEVersions lists the Kubernetes versions available through LKE +func (c *Client) ListLKEVersions(ctx context.Context, opts *ListOptions) ([]LKEVersion, error) { + response := LKEVersionsPagedResponse{} + err := c.listHelper(ctx, &response, opts) + if err != nil { + return nil, err + } + return response.Data, nil +} diff --git a/vendor/github.com/linode/linodego/longview.go b/vendor/github.com/linode/linodego/longview.go index 524af6776..3fc1ecdfe 100644 --- a/vendor/github.com/linode/linodego/longview.go +++ b/vendor/github.com/linode/linodego/longview.go @@ -36,22 +36,13 @@ func (resp *LongviewClientsPagedResponse) appendData(r *LongviewClientsPagedResp func (c *Client) ListLongviewClients(ctx context.Context, opts *ListOptions) ([]LongviewClient, error) { response := LongviewClientsPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *LongviewClient) fixDates() *LongviewClient { - // v.Created, _ = parseDates(v.CreatedStr) - // v.Updated, _ = parseDates(v.UpdatedStr) - return v -} - // GetLongviewClient gets the template with the provided ID func (c *Client) GetLongviewClient(ctx context.Context, id string) (*LongviewClient, error) { e, err := c.LongviewClients.Endpoint() @@ -63,5 +54,5 @@ func (c *Client) GetLongviewClient(ctx context.Context, id string) (*LongviewCli if err != nil { return nil, err } - return r.Result().(*LongviewClient).fixDates(), nil + return r.Result().(*LongviewClient), nil } diff --git a/vendor/github.com/linode/linodego/longview_subscriptions.go b/vendor/github.com/linode/linodego/longview_subscriptions.go index 253316599..a351bddc9 100644 --- a/vendor/github.com/linode/linodego/longview_subscriptions.go +++ b/vendor/github.com/linode/linodego/longview_subscriptions.go @@ -39,22 +39,13 @@ func (resp *LongviewSubscriptionsPagedResponse) appendData(r *LongviewSubscripti func (c *Client) ListLongviewSubscriptions(ctx context.Context, opts *ListOptions) ([]LongviewSubscription, error) { response := LongviewSubscriptionsPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *LongviewSubscription) fixDates() *LongviewSubscription { - // v.Created, _ = parseDates(v.CreatedStr) - // v.Updated, _ = parseDates(v.UpdatedStr) - return v -} - // GetLongviewSubscription gets the template with the provided ID func (c *Client) GetLongviewSubscription(ctx context.Context, id string) (*LongviewSubscription, error) { e, err := c.LongviewSubscriptions.Endpoint() @@ -66,5 +57,5 @@ func (c *Client) GetLongviewSubscription(ctx context.Context, id string) (*Longv if err != nil { return nil, err } - return r.Result().(*LongviewSubscription).fixDates(), nil + return r.Result().(*LongviewSubscription), nil } diff --git a/vendor/github.com/linode/linodego/nodebalancer.go b/vendor/github.com/linode/linodego/nodebalancer.go index a8d797d24..1e77c7c67 100644 --- a/vendor/github.com/linode/linodego/nodebalancer.go +++ b/vendor/github.com/linode/linodego/nodebalancer.go @@ -5,12 +5,12 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // NodeBalancer represents a NodeBalancer object type NodeBalancer struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` // This NodeBalancer's unique ID. ID int `json:"id"` // This NodeBalancer's label. These must be unique on your Account. @@ -61,6 +61,28 @@ type NodeBalancerUpdateOptions struct { Tags *[]string `json:"tags,omitempty"` } +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *NodeBalancer) UnmarshalJSON(b []byte) error { + type Mask NodeBalancer + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + + return nil +} + // GetCreateOptions converts a NodeBalancer to NodeBalancerCreateOptions for use in CreateNodeBalancer func (i NodeBalancer) GetCreateOptions() NodeBalancerCreateOptions { return NodeBalancerCreateOptions{ @@ -108,13 +130,6 @@ func (c *Client) ListNodeBalancers(ctx context.Context, opts *ListOptions) ([]No return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *NodeBalancer) fixDates() *NodeBalancer { - i.Created, _ = parseDates(i.CreatedStr) - i.Updated, _ = parseDates(i.UpdatedStr) - return i -} - // GetNodeBalancer gets the NodeBalancer with the provided ID func (c *Client) GetNodeBalancer(ctx context.Context, id int) (*NodeBalancer, error) { e, err := c.NodeBalancers.Endpoint() @@ -128,7 +143,7 @@ func (c *Client) GetNodeBalancer(ctx context.Context, id int) (*NodeBalancer, er if err != nil { return nil, err } - return r.Result().(*NodeBalancer).fixDates(), nil + return r.Result().(*NodeBalancer), nil } // CreateNodeBalancer creates a NodeBalancer @@ -155,7 +170,7 @@ func (c *Client) CreateNodeBalancer(ctx context.Context, nodebalancer NodeBalanc if err != nil { return nil, err } - return r.Result().(*NodeBalancer).fixDates(), nil + return r.Result().(*NodeBalancer), nil } // UpdateNodeBalancer updates the NodeBalancer with the specified id @@ -182,7 +197,7 @@ func (c *Client) UpdateNodeBalancer(ctx context.Context, id int, updateOpts Node if err != nil { return nil, err } - return r.Result().(*NodeBalancer).fixDates(), nil + return r.Result().(*NodeBalancer), nil } // DeleteNodeBalancer deletes the NodeBalancer with the specified id diff --git a/vendor/github.com/linode/linodego/nodebalancer_config_nodes.go b/vendor/github.com/linode/linodego/nodebalancer_config_nodes.go index e1ca55cb5..e97cc3264 100644 --- a/vendor/github.com/linode/linodego/nodebalancer_config_nodes.go +++ b/vendor/github.com/linode/linodego/nodebalancer_config_nodes.go @@ -30,6 +30,9 @@ var ( // ModeDrain is the NodeMode indicating a NodeBalancer Node is not receiving new traffic, but may continue receiving traffic from pinned connections ModeDrain NodeMode = "drain" + + // ModeBackup is the NodeMode indicating a NodeBalancer Node will only receive traffic if all "accept" Nodes are down + ModeBackup NodeMode = "backup" ) // NodeBalancerNodeCreateOptions fields are those accepted by CreateNodeBalancerNode @@ -92,20 +95,13 @@ func (resp *NodeBalancerNodesPagedResponse) appendData(r *NodeBalancerNodesPaged func (c *Client) ListNodeBalancerNodes(ctx context.Context, nodebalancerID int, configID int, opts *ListOptions) ([]NodeBalancerNode, error) { response := NodeBalancerNodesPagedResponse{} err := c.listHelperWithTwoIDs(ctx, &response, nodebalancerID, configID, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *NodeBalancerNode) fixDates() *NodeBalancerNode { - return i -} - // GetNodeBalancerNode gets the template with the provided ID func (c *Client) GetNodeBalancerNode(ctx context.Context, nodebalancerID int, configID int, nodeID int) (*NodeBalancerNode, error) { e, err := c.NodeBalancerNodes.endpointWithID(nodebalancerID, configID) @@ -117,7 +113,7 @@ func (c *Client) GetNodeBalancerNode(ctx context.Context, nodebalancerID int, co if err != nil { return nil, err } - return r.Result().(*NodeBalancerNode).fixDates(), nil + return r.Result().(*NodeBalancerNode), nil } // CreateNodeBalancerNode creates a NodeBalancerNode @@ -143,7 +139,7 @@ func (c *Client) CreateNodeBalancerNode(ctx context.Context, nodebalancerID int, if err != nil { return nil, err } - return r.Result().(*NodeBalancerNode).fixDates(), nil + return r.Result().(*NodeBalancerNode), nil } // UpdateNodeBalancerNode updates the NodeBalancerNode with the specified id @@ -170,7 +166,7 @@ func (c *Client) UpdateNodeBalancerNode(ctx context.Context, nodebalancerID int, if err != nil { return nil, err } - return r.Result().(*NodeBalancerNode).fixDates(), nil + return r.Result().(*NodeBalancerNode), nil } // DeleteNodeBalancerNode deletes the NodeBalancerNode with the specified id diff --git a/vendor/github.com/linode/linodego/nodebalancer_configs.go b/vendor/github.com/linode/linodego/nodebalancer_configs.go index aa87019c5..75954bf87 100644 --- a/vendor/github.com/linode/linodego/nodebalancer_configs.go +++ b/vendor/github.com/linode/linodego/nodebalancer_configs.go @@ -211,20 +211,13 @@ func (resp *NodeBalancerConfigsPagedResponse) appendData(r *NodeBalancerConfigsP func (c *Client) ListNodeBalancerConfigs(ctx context.Context, nodebalancerID int, opts *ListOptions) ([]NodeBalancerConfig, error) { response := NodeBalancerConfigsPagedResponse{} err := c.listHelperWithID(ctx, &response, nodebalancerID, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *NodeBalancerConfig) fixDates() *NodeBalancerConfig { - return i -} - // GetNodeBalancerConfig gets the template with the provided ID func (c *Client) GetNodeBalancerConfig(ctx context.Context, nodebalancerID int, configID int) (*NodeBalancerConfig, error) { e, err := c.NodeBalancerConfigs.endpointWithID(nodebalancerID) @@ -236,7 +229,7 @@ func (c *Client) GetNodeBalancerConfig(ctx context.Context, nodebalancerID int, if err != nil { return nil, err } - return r.Result().(*NodeBalancerConfig).fixDates(), nil + return r.Result().(*NodeBalancerConfig), nil } // CreateNodeBalancerConfig creates a NodeBalancerConfig @@ -264,7 +257,7 @@ func (c *Client) CreateNodeBalancerConfig(ctx context.Context, nodebalancerID in if err != nil { return nil, err } - return r.Result().(*NodeBalancerConfig).fixDates(), nil + return r.Result().(*NodeBalancerConfig), nil } // UpdateNodeBalancerConfig updates the NodeBalancerConfig with the specified id @@ -291,7 +284,7 @@ func (c *Client) UpdateNodeBalancerConfig(ctx context.Context, nodebalancerID in if err != nil { return nil, err } - return r.Result().(*NodeBalancerConfig).fixDates(), nil + return r.Result().(*NodeBalancerConfig), nil } // DeleteNodeBalancerConfig deletes the NodeBalancerConfig with the specified id @@ -330,5 +323,5 @@ func (c *Client) RebuildNodeBalancerConfig(ctx context.Context, nodeBalancerID i if err != nil { return nil, err } - return r.Result().(*NodeBalancerConfig).fixDates(), nil + return r.Result().(*NodeBalancerConfig), nil } diff --git a/vendor/github.com/linode/linodego/nodebalancer_stats.go b/vendor/github.com/linode/linodego/nodebalancer_stats.go new file mode 100644 index 000000000..288308109 --- /dev/null +++ b/vendor/github.com/linode/linodego/nodebalancer_stats.go @@ -0,0 +1,36 @@ +package linodego + +import ( + "context" +) + +// NodeBalancerStats represents a nodebalancer stats object +type NodeBalancerStats struct { + Title string `json:"title"` + Data NodeBalancerStatsData `json:"data"` +} + +// NodeBalancerStatsData represents a nodebalancer stats data object +type NodeBalancerStatsData struct { + Connections [][]float64 `json:"connections"` + Traffic StatsTraffic `json:"traffic"` +} + +// StatsTraffic represents a Traffic stats object +type StatsTraffic struct { + In [][]float64 `json:"in"` + Out [][]float64 `json:"out"` +} + +// GetNodeBalancerStats gets the template with the provided ID +func (c *Client) GetNodeBalancerStats(ctx context.Context, linodeID int) (*NodeBalancerStats, error) { + e, err := c.NodeBalancerStats.endpointWithID(linodeID) + if err != nil { + return nil, err + } + r, err := coupleAPIErrors(c.R(ctx).SetResult(&NodeBalancerStats{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*NodeBalancerStats), nil +} diff --git a/vendor/github.com/linode/linodego/object_storage_buckets.go b/vendor/github.com/linode/linodego/object_storage_buckets.go new file mode 100644 index 000000000..505748d2c --- /dev/null +++ b/vendor/github.com/linode/linodego/object_storage_buckets.go @@ -0,0 +1,128 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" + "time" + + "github.com/linode/linodego/internal/parseabletime" +) + +// ObjectStorageBucket represents a ObjectStorage object +type ObjectStorageBucket struct { + Label string `json:"label"` + Cluster string `json:"cluster"` + + Created *time.Time `json:"-"` + Hostname string `json:"hostname"` +} + +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *ObjectStorageBucket) UnmarshalJSON(b []byte) error { + type Mask ObjectStorageBucket + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + + return nil +} + +// ObjectStorageBucketCreateOptions fields are those accepted by CreateObjectStorageBucket +type ObjectStorageBucketCreateOptions struct { + Cluster string `json:"cluster"` + Label string `json:"label"` +} + +// ObjectStorageBucketsPagedResponse represents a paginated ObjectStorageBucket API response +type ObjectStorageBucketsPagedResponse struct { + *PageOptions + Data []ObjectStorageBucket `json:"data"` +} + +// endpoint gets the endpoint URL for ObjectStorageBucket +func (ObjectStorageBucketsPagedResponse) endpoint(c *Client) string { + endpoint, err := c.ObjectStorageBuckets.Endpoint() + if err != nil { + panic(err) + } + return endpoint +} + +// appendData appends ObjectStorageBuckets when processing paginated ObjectStorageBucket responses +func (resp *ObjectStorageBucketsPagedResponse) appendData(r *ObjectStorageBucketsPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListObjectStorageBuckets lists ObjectStorageBuckets +func (c *Client) ListObjectStorageBuckets(ctx context.Context, opts *ListOptions) ([]ObjectStorageBucket, error) { + response := ObjectStorageBucketsPagedResponse{} + err := c.listHelper(ctx, &response, opts) + + if err != nil { + return nil, err + } + return response.Data, nil +} + +// GetObjectStorageBucket gets the ObjectStorageBucket with the provided label +func (c *Client) GetObjectStorageBucket(ctx context.Context, clusterID, label string) (*ObjectStorageBucket, error) { + e, err := c.ObjectStorageBuckets.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%s/%s", e, clusterID, label) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&ObjectStorageBucket{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*ObjectStorageBucket), nil +} + +// CreateObjectStorageBucket creates an ObjectStorageBucket +func (c *Client) CreateObjectStorageBucket(ctx context.Context, createOpts ObjectStorageBucketCreateOptions) (*ObjectStorageBucket, error) { + var body string + e, err := c.ObjectStorageBuckets.Endpoint() + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&ObjectStorageBucket{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + return r.Result().(*ObjectStorageBucket), nil +} + +// DeleteObjectStorageBucket deletes the ObjectStorageBucket with the specified label +func (c *Client) DeleteObjectStorageBucket(ctx context.Context, clusterID, label string) error { + e, err := c.ObjectStorageBuckets.Endpoint() + if err != nil { + return err + } + e = fmt.Sprintf("%s/%s/%s", e, clusterID, label) + + _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err +} diff --git a/vendor/github.com/linode/linodego/object_storage_clusters.go b/vendor/github.com/linode/linodego/object_storage_clusters.go new file mode 100644 index 000000000..efc79acae --- /dev/null +++ b/vendor/github.com/linode/linodego/object_storage_clusters.go @@ -0,0 +1,59 @@ +package linodego + +import ( + "context" + "fmt" +) + +// ObjectStorageCluster represents a linode object storage cluster object +type ObjectStorageCluster struct { + ID string `json:"id"` + Domain string `json:"domain"` + Status string `json:"status"` + Region string `json:"region"` + StaticSiteDomain string `json:"static_site_domain"` +} + +// ObjectStorageClustersPagedResponse represents a linode API response for listing +type ObjectStorageClustersPagedResponse struct { + *PageOptions + Data []ObjectStorageCluster `json:"data"` +} + +// endpoint gets the endpoint URL for ObjectStorageCluster +func (ObjectStorageClustersPagedResponse) endpoint(c *Client) string { + endpoint, err := c.ObjectStorageClusters.Endpoint() + if err != nil { + panic(err) + } + return endpoint +} + +// appendData appends ObjectStorageClusters when processing paginated ObjectStorageCluster responses +func (resp *ObjectStorageClustersPagedResponse) appendData(r *ObjectStorageClustersPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListObjectStorageClusters lists ObjectStorageClusters +func (c *Client) ListObjectStorageClusters(ctx context.Context, opts *ListOptions) ([]ObjectStorageCluster, error) { + response := ObjectStorageClustersPagedResponse{} + err := c.listHelper(ctx, &response, opts) + if err != nil { + return nil, err + } + return response.Data, nil +} + +// GetObjectStorageCluster gets the template with the provided ID +func (c *Client) GetObjectStorageCluster(ctx context.Context, id string) (*ObjectStorageCluster, error) { + e, err := c.ObjectStorageClusters.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%s", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&ObjectStorageCluster{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*ObjectStorageCluster), nil +} diff --git a/vendor/github.com/linode/linodego/object_storage_keys.go b/vendor/github.com/linode/linodego/object_storage_keys.go new file mode 100644 index 000000000..9402963ff --- /dev/null +++ b/vendor/github.com/linode/linodego/object_storage_keys.go @@ -0,0 +1,134 @@ +package linodego + +import ( + "context" + "encoding/json" + "fmt" +) + +// ObjectStorageKey represents a linode object storage key object +type ObjectStorageKey struct { + ID int `json:"id"` + Label string `json:"label"` + AccessKey string `json:"access_key"` + SecretKey string `json:"secret_key"` +} + +// ObjectStorageKeyCreateOptions fields are those accepted by CreateObjectStorageKey +type ObjectStorageKeyCreateOptions struct { + Label string `json:"label"` +} + +// ObjectStorageKeyUpdateOptions fields are those accepted by UpdateObjectStorageKey +type ObjectStorageKeyUpdateOptions struct { + Label string `json:"label"` +} + +// ObjectStorageKeysPagedResponse represents a linode API response for listing +type ObjectStorageKeysPagedResponse struct { + *PageOptions + Data []ObjectStorageKey `json:"data"` +} + +// endpoint gets the endpoint URL for Object Storage keys +func (ObjectStorageKeysPagedResponse) endpoint(c *Client) string { + endpoint, err := c.ObjectStorageKeys.Endpoint() + if err != nil { + panic(err) + } + return endpoint +} + +// appendData appends ObjectStorageKeys when processing paginated Objkey responses +func (resp *ObjectStorageKeysPagedResponse) appendData(r *ObjectStorageKeysPagedResponse) { + resp.Data = append(resp.Data, r.Data...) +} + +// ListObjectStorageKeys lists ObjectStorageKeys +func (c *Client) ListObjectStorageKeys(ctx context.Context, opts *ListOptions) ([]ObjectStorageKey, error) { + response := ObjectStorageKeysPagedResponse{} + err := c.listHelper(ctx, &response, opts) + if err != nil { + return nil, err + } + return response.Data, nil +} + +// CreateObjectStorageKey creates a ObjectStorageKey +func (c *Client) CreateObjectStorageKey(ctx context.Context, createOpts ObjectStorageKeyCreateOptions) (*ObjectStorageKey, error) { + var body string + e, err := c.ObjectStorageKeys.Endpoint() + if err != nil { + return nil, err + } + + req := c.R(ctx).SetResult(&ObjectStorageKey{}) + + if bodyData, err := json.Marshal(createOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Post(e)) + + if err != nil { + return nil, err + } + return r.Result().(*ObjectStorageKey), nil +} + +// GetObjectStorageKey gets the object storage key with the provided ID +func (c *Client) GetObjectStorageKey(ctx context.Context, id int) (*ObjectStorageKey, error) { + e, err := c.ObjectStorageKeys.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d", e, id) + r, err := coupleAPIErrors(c.R(ctx).SetResult(&ObjectStorageKey{}).Get(e)) + if err != nil { + return nil, err + } + return r.Result().(*ObjectStorageKey), nil +} + +// UpdateObjectStorageKey updates the object storage key with the specified id +func (c *Client) UpdateObjectStorageKey(ctx context.Context, id int, updateOpts ObjectStorageKeyUpdateOptions) (*ObjectStorageKey, error) { + var body string + e, err := c.ObjectStorageKeys.Endpoint() + if err != nil { + return nil, err + } + e = fmt.Sprintf("%s/%d", e, id) + + req := c.R(ctx).SetResult(&ObjectStorageKey{}) + + if bodyData, err := json.Marshal(updateOpts); err == nil { + body = string(bodyData) + } else { + return nil, NewError(err) + } + + r, err := coupleAPIErrors(req. + SetBody(body). + Put(e)) + + if err != nil { + return nil, err + } + return r.Result().(*ObjectStorageKey), nil +} + +// DeleteObjectStorageKey deletes the ObjectStorageKey with the specified id +func (c *Client) DeleteObjectStorageKey(ctx context.Context, id int) error { + e, err := c.ObjectStorageKeys.Endpoint() + if err != nil { + return err + } + e = fmt.Sprintf("%s/%d", e, id) + + _, err = coupleAPIErrors(c.R(ctx).Delete(e)) + return err +} diff --git a/vendor/github.com/linode/linodego/pagination.go b/vendor/github.com/linode/linodego/pagination.go index bfe6de3b7..a07997288 100644 --- a/vendor/github.com/linode/linodego/pagination.go +++ b/vendor/github.com/linode/linodego/pagination.go @@ -10,7 +10,7 @@ import ( "log" "strconv" - "gopkg.in/resty.v1" + "github.com/go-resty/resty/v2" ) // PageOptions are the pagination parameters for List endpoints @@ -28,9 +28,8 @@ type ListOptions struct { // NewListOptions simplified construction of ListOptions using only // the two writable properties, Page and Filter -func NewListOptions(Page int, Filter string) *ListOptions { - return &ListOptions{PageOptions: &PageOptions{Page: Page}, Filter: Filter} - +func NewListOptions(page int, filter string) *ListOptions { + return &ListOptions{PageOptions: &PageOptions{Page: page}, Filter: filter} } // listHelper abstracts fetching and pagination for GET endpoints that @@ -38,6 +37,7 @@ func NewListOptions(Page int, Filter string) *ListOptions { // When opts (or opts.Page) is nil, all pages will be fetched and // returned in a single (endpoint-specific)PagedResponse // opts.results and opts.pages will be updated from the API response +// nolint func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOptions) error { req := c.R(ctx) if opts != nil && opts.PageOptions != nil && opts.Page > 0 { @@ -102,7 +102,7 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption if r, err = coupleAPIErrors(req.SetResult(DomainsPagedResponse{}).Get(v.endpoint(c))); err == nil { response, ok := r.Result().(*DomainsPagedResponse) if !ok { - return fmt.Errorf("Response is not a *DomainsPagedResponse") + return fmt.Errorf("response is not a *DomainsPagedResponse") } pages = response.Pages results = response.Results @@ -114,6 +114,24 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption results = r.Result().(*EventsPagedResponse).Results v.appendData(r.Result().(*EventsPagedResponse)) } + case *FirewallsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(FirewallsPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*FirewallsPagedResponse).Pages + results = r.Result().(*FirewallsPagedResponse).Results + v.appendData(r.Result().(*FirewallsPagedResponse)) + } + case *LKEClustersPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(LKEClustersPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*LKEClustersPagedResponse).Pages + results = r.Result().(*LKEClustersPagedResponse).Results + v.appendData(r.Result().(*LKEClustersPagedResponse)) + } + case *LKEVersionsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(LKEVersionsPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*LKEVersionsPagedResponse).Pages + results = r.Result().(*LKEVersionsPagedResponse).Results + v.appendData(r.Result().(*LKEVersionsPagedResponse)) + } case *LongviewSubscriptionsPagedResponse: if r, err = coupleAPIErrors(req.SetResult(LongviewSubscriptionsPagedResponse{}).Get(v.endpoint(c))); err == nil { pages = r.Result().(*LongviewSubscriptionsPagedResponse).Pages @@ -149,7 +167,7 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption if r, err = coupleAPIErrors(req.SetResult(SSHKeysPagedResponse{}).Get(v.endpoint(c))); err == nil { response, ok := r.Result().(*SSHKeysPagedResponse) if !ok { - return fmt.Errorf("Response is not a *SSHKeysPagedResponse") + return fmt.Errorf("response is not a *SSHKeysPagedResponse") } pages = response.Pages results = response.Results @@ -173,6 +191,18 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption results = r.Result().(*NotificationsPagedResponse).Results v.appendData(r.Result().(*NotificationsPagedResponse)) } + case *OAuthClientsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(OAuthClientsPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*OAuthClientsPagedResponse).Pages + results = r.Result().(*OAuthClientsPagedResponse).Results + v.appendData(r.Result().(*OAuthClientsPagedResponse)) + } + case *PaymentsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(PaymentsPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*PaymentsPagedResponse).Pages + results = r.Result().(*PaymentsPagedResponse).Results + v.appendData(r.Result().(*PaymentsPagedResponse)) + } case *NodeBalancersPagedResponse: if r, err = coupleAPIErrors(req.SetResult(NodeBalancersPagedResponse{}).Get(v.endpoint(c))); err == nil { pages = r.Result().(*NodeBalancersPagedResponse).Pages @@ -197,9 +227,25 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption results = r.Result().(*UsersPagedResponse).Results v.appendData(r.Result().(*UsersPagedResponse)) } + case *ObjectStorageBucketsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(ObjectStorageBucketsPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*ObjectStorageBucketsPagedResponse).Pages + results = r.Result().(*ObjectStorageBucketsPagedResponse).Results + v.appendData(r.Result().(*ObjectStorageBucketsPagedResponse)) + } + case *ObjectStorageClustersPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(ObjectStorageClustersPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*ObjectStorageClustersPagedResponse).Pages + results = r.Result().(*ObjectStorageClustersPagedResponse).Results + v.appendData(r.Result().(*ObjectStorageClustersPagedResponse)) + } + case *ObjectStorageKeysPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(ObjectStorageKeysPagedResponse{}).Get(v.endpoint(c))); err == nil { + pages = r.Result().(*ObjectStorageKeysPagedResponse).Pages + results = r.Result().(*ObjectStorageKeysPagedResponse).Results + v.appendData(r.Result().(*ObjectStorageKeysPagedResponse)) + } /** - case AccountOauthClientsPagedResponse: - case AccountPaymentsPagedResponse: case ProfileAppsPagedResponse: case ProfileWhitelistPagedResponse: case ManagedContactsPagedResponse: @@ -217,7 +263,7 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption } if opts == nil { - for page := 2; page <= pages; page = page + 1 { + for page := 2; page <= pages; page++ { if err := c.listHelper(ctx, i, &ListOptions{PageOptions: &PageOptions{Page: page}}); err != nil { return err } @@ -228,7 +274,7 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption } if opts.Page == 0 { - for page := 2; page <= pages; page = page + 1 { + for page := 2; page <= pages; page++ { opts.Page = page if err := c.listHelper(ctx, i, opts); err != nil { return err @@ -247,6 +293,7 @@ func (c *Client) listHelper(ctx context.Context, i interface{}, opts *ListOption // When opts (or opts.Page) is nil, all pages will be fetched and // returned in a single (endpoint-specific)PagedResponse // opts.results and opts.pages will be updated from the API response +// nolint func (c *Client) listHelperWithID(ctx context.Context, i interface{}, idRaw interface{}, opts *ListOptions) error { req := c.R(ctx) if opts != nil && opts.Page > 0 { @@ -267,17 +314,11 @@ func (c *Client) listHelperWithID(ctx context.Context, i interface{}, idRaw inte } switch v := i.(type) { - case *InvoiceItemsPagedResponse: - if r, err = coupleAPIErrors(req.SetResult(InvoiceItemsPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { - pages = r.Result().(*InvoiceItemsPagedResponse).Pages - results = r.Result().(*InvoiceItemsPagedResponse).Results - v.appendData(r.Result().(*InvoiceItemsPagedResponse)) - } case *DomainRecordsPagedResponse: if r, err = coupleAPIErrors(req.SetResult(DomainRecordsPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { response, ok := r.Result().(*DomainRecordsPagedResponse) if !ok { - return fmt.Errorf("Response is not a *DomainRecordsPagedResponse") + return fmt.Errorf("response is not a *DomainRecordsPagedResponse") } pages = response.Pages results = response.Results @@ -295,18 +336,30 @@ func (c *Client) listHelperWithID(ctx context.Context, i interface{}, idRaw inte results = r.Result().(*InstanceDisksPagedResponse).Results v.appendData(r.Result().(*InstanceDisksPagedResponse)) } - case *NodeBalancerConfigsPagedResponse: - if r, err = coupleAPIErrors(req.SetResult(NodeBalancerConfigsPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { - pages = r.Result().(*NodeBalancerConfigsPagedResponse).Pages - results = r.Result().(*NodeBalancerConfigsPagedResponse).Results - v.appendData(r.Result().(*NodeBalancerConfigsPagedResponse)) - } case *InstanceVolumesPagedResponse: if r, err = coupleAPIErrors(req.SetResult(InstanceVolumesPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { pages = r.Result().(*InstanceVolumesPagedResponse).Pages results = r.Result().(*InstanceVolumesPagedResponse).Results v.appendData(r.Result().(*InstanceVolumesPagedResponse)) } + case *InvoiceItemsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(InvoiceItemsPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { + pages = r.Result().(*InvoiceItemsPagedResponse).Pages + results = r.Result().(*InvoiceItemsPagedResponse).Results + v.appendData(r.Result().(*InvoiceItemsPagedResponse)) + } + case *LKEClusterPoolsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(LKEClusterPoolsPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { + pages = r.Result().(*LKEClusterPoolsPagedResponse).Pages + results = r.Result().(*LKEClusterPoolsPagedResponse).Results + v.appendData(r.Result().(*LKEClusterPoolsPagedResponse)) + } + case *NodeBalancerConfigsPagedResponse: + if r, err = coupleAPIErrors(req.SetResult(NodeBalancerConfigsPagedResponse{}).Get(v.endpointWithID(c, id))); err == nil { + pages = r.Result().(*NodeBalancerConfigsPagedResponse).Pages + results = r.Result().(*NodeBalancerConfigsPagedResponse).Results + v.appendData(r.Result().(*NodeBalancerConfigsPagedResponse)) + } case *TaggedObjectsPagedResponse: idStr := idRaw.(string) @@ -342,7 +395,7 @@ func (c *Client) listHelperWithID(ctx context.Context, i interface{}, idRaw inte } if opts == nil { - for page := 2; page <= pages; page = page + 1 { + for page := 2; page <= pages; page++ { if err := c.listHelperWithID(ctx, i, id, &ListOptions{PageOptions: &PageOptions{Page: page}}); err != nil { return err } @@ -352,7 +405,7 @@ func (c *Client) listHelperWithID(ctx context.Context, i interface{}, idRaw inte opts.PageOptions = &PageOptions{} } if opts.Page == 0 { - for page := 2; page <= pages; page = page + 1 { + for page := 2; page <= pages; page++ { opts.Page = page if err := c.listHelperWithID(ctx, i, id, opts); err != nil { return err @@ -373,6 +426,7 @@ func (c *Client) listHelperWithID(ctx context.Context, i interface{}, idRaw inte // opts.results and opts.pages will be updated from the API response func (c *Client) listHelperWithTwoIDs(ctx context.Context, i interface{}, firstID, secondID int, opts *ListOptions) error { req := c.R(ctx) + if opts != nil && opts.Page > 0 { req.SetQueryParam("page", strconv.Itoa(opts.Page)) } @@ -395,7 +449,6 @@ func (c *Client) listHelperWithTwoIDs(ctx context.Context, i interface{}, firstI results = r.Result().(*NodeBalancerNodesPagedResponse).Results v.appendData(r.Result().(*NodeBalancerNodesPagedResponse)) } - default: log.Fatalf("Unknown listHelperWithTwoIDs interface{} %T used", i) } @@ -405,7 +458,7 @@ func (c *Client) listHelperWithTwoIDs(ctx context.Context, i interface{}, firstI } if opts == nil { - for page := 2; page <= pages; page = page + 1 { + for page := 2; page <= pages; page++ { if err := c.listHelper(ctx, i, &ListOptions{PageOptions: &PageOptions{Page: page}}); err != nil { return err } @@ -415,7 +468,7 @@ func (c *Client) listHelperWithTwoIDs(ctx context.Context, i interface{}, firstI opts.PageOptions = &PageOptions{} } if opts.Page == 0 { - for page := 2; page <= pages; page = page + 1 { + for page := 2; page <= pages; page++ { opts.Page = page if err := c.listHelperWithTwoIDs(ctx, i, firstID, secondID, opts); err != nil { return err diff --git a/vendor/github.com/linode/linodego/profile.go b/vendor/github.com/linode/linodego/profile.go index 3d29b2a52..36c50b0e2 100644 --- a/vendor/github.com/linode/linodego/profile.go +++ b/vendor/github.com/linode/linodego/profile.go @@ -76,7 +76,7 @@ func (i Profile) GetUpdateOptions() (o ProfileUpdateOptions) { return } -// GetProfile gets the profile with the provided ID +// GetProfile returns the Profile of the authenticated user func (c *Client) GetProfile(ctx context.Context) (*Profile, error) { e, err := c.Profile.Endpoint() if err != nil { diff --git a/vendor/github.com/linode/linodego/profile_sshkeys.go b/vendor/github.com/linode/linodego/profile_sshkeys.go index 2ec4d4f71..cb67ceb3e 100644 --- a/vendor/github.com/linode/linodego/profile_sshkeys.go +++ b/vendor/github.com/linode/linodego/profile_sshkeys.go @@ -5,15 +5,16 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // SSHKey represents a SSHKey object type SSHKey struct { - ID int `json:"id"` - Label string `json:"label"` - SSHKey string `json:"ssh_key"` - CreatedStr string `json:"created"` - Created *time.Time `json:"-"` + ID int `json:"id"` + Label string `json:"label"` + SSHKey string `json:"ssh_key"` + Created *time.Time `json:"-"` } // SSHKeyCreateOptions fields are those accepted by CreateSSHKey @@ -27,6 +28,26 @@ type SSHKeyUpdateOptions struct { Label string `json:"label"` } +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *SSHKey) UnmarshalJSON(b []byte) error { + type Mask SSHKey + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + + return nil +} + // GetCreateOptions converts a SSHKey to SSHKeyCreateOptions for use in CreateSSHKey func (i SSHKey) GetCreateOptions() (o SSHKeyCreateOptions) { o.Label = i.Label @@ -64,21 +85,13 @@ func (resp *SSHKeysPagedResponse) appendData(r *SSHKeysPagedResponse) { func (c *Client) ListSSHKeys(ctx context.Context, opts *ListOptions) ([]SSHKey, error) { response := SSHKeysPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *SSHKey) fixDates() *SSHKey { - i.Created, _ = parseDates(i.CreatedStr) - return i -} - // GetSSHKey gets the sshkey with the provided ID func (c *Client) GetSSHKey(ctx context.Context, id int) (*SSHKey, error) { e, err := c.SSHKeys.Endpoint() @@ -90,7 +103,7 @@ func (c *Client) GetSSHKey(ctx context.Context, id int) (*SSHKey, error) { if err != nil { return nil, err } - return r.Result().(*SSHKey).fixDates(), nil + return r.Result().(*SSHKey), nil } // CreateSSHKey creates a SSHKey @@ -116,7 +129,7 @@ func (c *Client) CreateSSHKey(ctx context.Context, createOpts SSHKeyCreateOption if err != nil { return nil, err } - return r.Result().(*SSHKey).fixDates(), nil + return r.Result().(*SSHKey), nil } // UpdateSSHKey updates the SSHKey with the specified id @@ -143,7 +156,7 @@ func (c *Client) UpdateSSHKey(ctx context.Context, id int, updateOpts SSHKeyUpda if err != nil { return nil, err } - return r.Result().(*SSHKey).fixDates(), nil + return r.Result().(*SSHKey), nil } // DeleteSSHKey deletes the SSHKey with the specified id @@ -156,5 +169,4 @@ func (c *Client) DeleteSSHKey(ctx context.Context, id int) error { _, err = coupleAPIErrors(c.R(ctx).Delete(e)) return err - } diff --git a/vendor/github.com/linode/linodego/profile_tokens.go b/vendor/github.com/linode/linodego/profile_tokens.go index bd95dfe05..2b00b37dc 100644 --- a/vendor/github.com/linode/linodego/profile_tokens.go +++ b/vendor/github.com/linode/linodego/profile_tokens.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // Token represents a Token object @@ -13,6 +15,7 @@ type Token struct { ID int `json:"id"` // The scopes this token was created with. These define what parts of the Account the token can be used to access. Many command-line tools, such as the Linode CLI, require tokens with access to *. Tokens with more restrictive scopes are generally more secure. + // Valid values are "*" or a comma separated list of scopes https://developers.linode.com/api/v4/#o-auth Scopes string `json:"scopes"` // This token's label. This is for display purposes only, but can be used to more easily track what you're using each token for. (1-100 Characters) @@ -22,12 +25,10 @@ type Token struct { Token string `json:"token"` // The date and time this token was created. - Created *time.Time `json:"-"` - CreatedStr string `json:"created"` + Created *time.Time `json:"-"` // When this token will expire. Personal Access Tokens cannot be renewed, so after this time the token will be completely unusable and a new token will need to be generated. Tokens may be created with "null" as their expiry and will never expire unless revoked. - Expiry *time.Time `json:"-"` - ExpiryStr string `json:"expiry"` + Expiry *time.Time `json:"-"` } // TokenCreateOptions fields are those accepted by CreateToken @@ -48,6 +49,28 @@ type TokenUpdateOptions struct { Label string `json:"label"` } +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Token) UnmarshalJSON(b []byte) error { + type Mask Token + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Expiry *parseabletime.ParseableTime `json:"expiry"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Expiry = (*time.Time)(p.Expiry) + + return nil +} + // GetCreateOptions converts a Token to TokenCreateOptions for use in CreateToken func (i Token) GetCreateOptions() (o TokenCreateOptions) { o.Label = i.Label @@ -86,22 +109,13 @@ func (resp *TokensPagedResponse) appendData(r *TokensPagedResponse) { func (c *Client) ListTokens(ctx context.Context, opts *ListOptions) ([]Token, error) { response := TokensPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *Token) fixDates() *Token { - i.Created, _ = parseDates(i.CreatedStr) - i.Expiry, _ = parseDates(i.ExpiryStr) - return i -} - // GetToken gets the token with the provided ID func (c *Client) GetToken(ctx context.Context, id int) (*Token, error) { e, err := c.Tokens.Endpoint() @@ -113,7 +127,7 @@ func (c *Client) GetToken(ctx context.Context, id int) (*Token, error) { if err != nil { return nil, err } - return r.Result().(*Token).fixDates(), nil + return r.Result().(*Token), nil } // CreateToken creates a Token @@ -152,7 +166,7 @@ func (c *Client) CreateToken(ctx context.Context, createOpts TokenCreateOptions) if err != nil { return nil, err } - return r.Result().(*Token).fixDates(), nil + return r.Result().(*Token), nil } // UpdateToken updates the Token with the specified id @@ -179,7 +193,7 @@ func (c *Client) UpdateToken(ctx context.Context, id int, updateOpts TokenUpdate if err != nil { return nil, err } - return r.Result().(*Token).fixDates(), nil + return r.Result().(*Token), nil } // DeleteToken deletes the Token with the specified id diff --git a/vendor/github.com/linode/linodego/regions.go b/vendor/github.com/linode/linodego/regions.go index b13b996ea..ac71cf97c 100644 --- a/vendor/github.com/linode/linodego/regions.go +++ b/vendor/github.com/linode/linodego/regions.go @@ -35,20 +35,13 @@ func (resp *RegionsPagedResponse) appendData(r *RegionsPagedResponse) { func (c *Client) ListRegions(ctx context.Context, opts *ListOptions) ([]Region, error) { response := RegionsPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *Region) fixDates() *Region { - return v -} - // GetRegion gets the template with the provided ID func (c *Client) GetRegion(ctx context.Context, id string) (*Region, error) { e, err := c.Regions.Endpoint() @@ -60,5 +53,5 @@ func (c *Client) GetRegion(ctx context.Context, id string) (*Region, error) { if err != nil { return nil, err } - return r.Result().(*Region).fixDates(), nil + return r.Result().(*Region), nil } diff --git a/vendor/github.com/linode/linodego/resources.go b/vendor/github.com/linode/linodego/resources.go index fe0c258cf..ff59ceb86 100644 --- a/vendor/github.com/linode/linodego/resources.go +++ b/vendor/github.com/linode/linodego/resources.go @@ -6,86 +6,109 @@ import ( "fmt" "text/template" - "gopkg.in/resty.v1" + "github.com/go-resty/resty/v2" ) const ( - stackscriptsName = "stackscripts" + accountName = "account" + accountSettingsName = "accountsettings" + domainRecordsName = "records" + domainsName = "domains" + eventsName = "events" + firewallsName = "firewalls" imagesName = "images" - instancesName = "instances" - instanceDisksName = "disks" instanceConfigsName = "configs" + instanceDisksName = "disks" instanceIPsName = "ips" instanceSnapshotsName = "snapshots" + instanceStatsName = "instancestats" instanceVolumesName = "instancevolumes" + instancesName = "instances" + invoiceItemsName = "invoiceitems" + invoicesName = "invoices" ipaddressesName = "ipaddresses" ipv6poolsName = "ipv6pools" ipv6rangesName = "ipv6ranges" - regionsName = "regions" - volumesName = "volumes" kernelsName = "kernels" - typesName = "types" - domainsName = "domains" - domainRecordsName = "records" + lkeClustersName = "lkeclusters" + lkeClusterPoolsName = "lkeclusterpools" + lkeVersionsName = "lkeversions" longviewName = "longview" longviewclientsName = "longviewclients" longviewsubscriptionsName = "longviewsubscriptions" - nodebalancersName = "nodebalancers" + managedName = "managed" nodebalancerconfigsName = "nodebalancerconfigs" nodebalancernodesName = "nodebalancernodes" + nodebalancerStatsName = "nodebalancerstats" + nodebalancersName = "nodebalancers" notificationsName = "notifications" + oauthClientsName = "oauthClients" + objectStorageBucketsName = "objectstoragebuckets" + objectStorageClustersName = "objectstorageclusters" + objectStorageKeysName = "objectstoragekeys" + paymentsName = "payments" + profileName = "profile" + regionsName = "regions" sshkeysName = "sshkeys" + stackscriptsName = "stackscripts" + tagsName = "tags" ticketsName = "tickets" tokensName = "tokens" - accountName = "account" - eventsName = "events" - invoicesName = "invoices" - invoiceItemsName = "invoiceitems" - profileName = "profile" - managedName = "managed" - tagsName = "tags" + typesName = "types" usersName = "users" - // notificationsName = "notifications" + volumesName = "volumes" - stackscriptsEndpoint = "linode/stackscripts" + accountEndpoint = "account" + accountSettingsEndpoint = "account/settings" + domainRecordsEndpoint = "domains/{{ .ID }}/records" + domainsEndpoint = "domains" + eventsEndpoint = "account/events" + firewallsEndpoint = "networking/firewalls" imagesEndpoint = "images" - instancesEndpoint = "linode/instances" instanceConfigsEndpoint = "linode/instances/{{ .ID }}/configs" instanceDisksEndpoint = "linode/instances/{{ .ID }}/disks" - instanceSnapshotsEndpoint = "linode/instances/{{ .ID }}/backups" instanceIPsEndpoint = "linode/instances/{{ .ID }}/ips" + instanceSnapshotsEndpoint = "linode/instances/{{ .ID }}/backups" + instanceStatsEndpoint = "linode/instances/{{ .ID }}/stats" instanceVolumesEndpoint = "linode/instances/{{ .ID }}/volumes" + instancesEndpoint = "linode/instances" + invoiceItemsEndpoint = "account/invoices/{{ .ID }}/items" + invoicesEndpoint = "account/invoices" ipaddressesEndpoint = "networking/ips" ipv6poolsEndpoint = "networking/ipv6/pools" ipv6rangesEndpoint = "networking/ipv6/ranges" - regionsEndpoint = "regions" - volumesEndpoint = "volumes" kernelsEndpoint = "linode/kernels" - typesEndpoint = "linode/types" - domainsEndpoint = "domains" - domainRecordsEndpoint = "domains/{{ .ID }}/records" + lkeClustersEndpoint = "lke/clusters" + lkeClusterPoolsEndpoint = "lke/clusters/{{ .ID }}/pools" + lkeVersionsEndpoint = "lke/versions" longviewEndpoint = "longview" longviewclientsEndpoint = "longview/clients" longviewsubscriptionsEndpoint = "longview/subscriptions" - nodebalancersEndpoint = "nodebalancers" + managedEndpoint = "managed" // @TODO we can't use these nodebalancer endpoints unless we include these templated fields // The API seems inconsistent about including parent IDs in objects, (compare instance configs to nb configs) // Parent IDs would be immutable for updates and are ignored in create requests .. // Should we include these fields in CreateOpts and UpdateOpts? - nodebalancerconfigsEndpoint = "nodebalancers/{{ .ID }}/configs" - nodebalancernodesEndpoint = "nodebalancers/{{ .ID }}/configs/{{ .SecondID }}/nodes" - sshkeysEndpoint = "profile/sshkeys" - ticketsEndpoint = "support/tickets" - tokensEndpoint = "profile/tokens" - accountEndpoint = "account" - eventsEndpoint = "account/events" - invoicesEndpoint = "account/invoices" - invoiceItemsEndpoint = "account/invoices/{{ .ID }}/items" - profileEndpoint = "profile" - managedEndpoint = "managed" - tagsEndpoint = "tags" - usersEndpoint = "account/users" - notificationsEndpoint = "account/notifications" + nodebalancerconfigsEndpoint = "nodebalancers/{{ .ID }}/configs" + nodebalancernodesEndpoint = "nodebalancers/{{ .ID }}/configs/{{ .SecondID }}/nodes" + nodebalancerStatsEndpoint = "nodebalancers/{{ .ID }}/stats" + nodebalancersEndpoint = "nodebalancers" + notificationsEndpoint = "account/notifications" + oauthClientsEndpoint = "account/oauth-clients" + objectStorageBucketsEndpoint = "object-storage/buckets" + objectStorageClustersEndpoint = "object-storage/clusters" + objectStorageKeysEndpoint = "object-storage/keys" + paymentsEndpoint = "account/payments" + profileEndpoint = "profile" + regionsEndpoint = "regions" + sshkeysEndpoint = "profile/sshkeys" + stackscriptsEndpoint = "linode/stackscripts" + tagsEndpoint = "tags" + ticketsEndpoint = "support/tickets" + tokensEndpoint = "profile/tokens" + typesEndpoint = "linode/types" + usersEndpoint = "account/users" + volumesEndpoint = "volumes" ) // Resource represents a linode API resource @@ -125,16 +148,19 @@ func (r Resource) render(data ...interface{}) (string, error) { buf := bytes.NewBufferString(out) var substitutions interface{} - if len(data) == 1 { + + switch len(data) { + case 1: substitutions = struct{ ID interface{} }{data[0]} - } else if len(data) == 2 { + case 2: substitutions = struct { ID interface{} SecondID interface{} }{data[0], data[1]} - } else { + default: return "", NewError("Too many arguments to render template (expected 1 or 2)") } + if err := r.endpointTemplate.Execute(buf, substitutions); err != nil { return "", NewError(err) } @@ -147,6 +173,7 @@ func (r Resource) endpointWithID(id ...int) (string, error) { return r.endpoint, nil } data := make([]interface{}, len(id)) + for i, v := range id { data[i] = v } diff --git a/vendor/github.com/linode/linodego/retries.go b/vendor/github.com/linode/linodego/retries.go new file mode 100644 index 000000000..5ead4ec60 --- /dev/null +++ b/vendor/github.com/linode/linodego/retries.go @@ -0,0 +1,65 @@ +package linodego + +import ( + "log" + "net/http" + "strconv" + "time" + + "github.com/go-resty/resty/v2" +) + +// type RetryConditional func(r *resty.Response) (shouldRetry bool) +type RetryConditional resty.RetryConditionFunc + +// Configures resty to +// lock until enough time has passed to retry the request as determined by the Retry-After response header. +// If the Retry-After header is not set, we fall back to value of SetPollDelay. +func configureRetries(c *Client) { + c.resty. + SetRetryCount(1000). + AddRetryCondition(checkRetryConditionals(c)). + SetRetryAfter(respectRetryAfter) +} + +func checkRetryConditionals(c *Client) func(*resty.Response, error) bool { + return func(r *resty.Response, err error) bool { + for _, retryConditional := range c.retryConditionals { + retry := retryConditional(r, err) + if retry { + log.Printf("[INFO] Received error %s - Retrying", r.Error()) + return true + } + } + return false + } +} + +// SetLinodeBusyRetry configures resty to retry specifically on "Linode busy." errors +// The retry wait time is configured in SetPollDelay +func linodeBusyRetryCondition(r *resty.Response, _ error) bool { + apiError, ok := r.Error().(*APIError) + linodeBusy := ok && apiError.Error() == "Linode busy." + retry := r.StatusCode() == http.StatusBadRequest && linodeBusy + return retry +} + +func tooManyRequestsRetryCondition(r *resty.Response, _ error) bool { + return r.StatusCode() == http.StatusTooManyRequests +} + +func respectRetryAfter(client *resty.Client, resp *resty.Response) (time.Duration, error) { + retryAfterStr := resp.Header().Get("Retry-After") + if retryAfterStr == "" { + return 0, nil + } + + retryAfter, err := strconv.Atoi(retryAfterStr) + if err != nil { + return 0, err + } + + duration := time.Duration(retryAfter) * time.Second + log.Printf("[INFO] Respecting Retry-After Header of %d (%s) (max %s)", retryAfter, duration, client.RetryMaxWaitTime) + return duration, nil +} diff --git a/vendor/github.com/linode/linodego/stackscripts.go b/vendor/github.com/linode/linodego/stackscripts.go index daf339b2f..829a2eebd 100644 --- a/vendor/github.com/linode/linodego/stackscripts.go +++ b/vendor/github.com/linode/linodego/stackscripts.go @@ -5,17 +5,18 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // Stackscript represents a Linode StackScript type Stackscript struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` - ID int `json:"id"` Username string `json:"username"` Label string `json:"label"` Description string `json:"description"` + Ordinal int `json:"ordinal"` + LogoURL string `json:"logo_url"` Images []string `json:"images"` DeploymentsTotal int `json:"deployments_total"` DeploymentsActive int `json:"deployments_active"` @@ -62,6 +63,28 @@ type StackscriptCreateOptions struct { // StackscriptUpdateOptions fields are those accepted by UpdateStackscript type StackscriptUpdateOptions StackscriptCreateOptions +// UnmarshalJSON implements the json.Unmarshaler interface +func (i *Stackscript) UnmarshalJSON(b []byte) error { + type Mask Stackscript + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(i), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + i.Created = (*time.Time)(p.Created) + i.Updated = (*time.Time)(p.Updated) + + return nil +} + // GetCreateOptions converts a Stackscript to StackscriptCreateOptions for use in CreateStackscript func (i Stackscript) GetCreateOptions() StackscriptCreateOptions { return StackscriptCreateOptions{ @@ -110,22 +133,13 @@ func (resp *StackscriptsPagedResponse) appendData(r *StackscriptsPagedResponse) func (c *Client) ListStackscripts(ctx context.Context, opts *ListOptions) ([]Stackscript, error) { response := StackscriptsPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (i *Stackscript) fixDates() *Stackscript { - i.Created, _ = parseDates(i.CreatedStr) - i.Updated, _ = parseDates(i.UpdatedStr) - return i -} - // GetStackscript gets the Stackscript with the provided ID func (c *Client) GetStackscript(ctx context.Context, id int) (*Stackscript, error) { e, err := c.StackScripts.Endpoint() @@ -139,7 +153,7 @@ func (c *Client) GetStackscript(ctx context.Context, id int) (*Stackscript, erro if err != nil { return nil, err } - return r.Result().(*Stackscript).fixDates(), nil + return r.Result().(*Stackscript), nil } // CreateStackscript creates a StackScript @@ -165,7 +179,7 @@ func (c *Client) CreateStackscript(ctx context.Context, createOpts StackscriptCr if err != nil { return nil, err } - return r.Result().(*Stackscript).fixDates(), nil + return r.Result().(*Stackscript), nil } // UpdateStackscript updates the StackScript with the specified id @@ -192,7 +206,7 @@ func (c *Client) UpdateStackscript(ctx context.Context, id int, updateOpts Stack if err != nil { return nil, err } - return r.Result().(*Stackscript).fixDates(), nil + return r.Result().(*Stackscript), nil } // DeleteStackscript deletes the StackScript with the specified id diff --git a/vendor/github.com/linode/linodego/tags.go b/vendor/github.com/linode/linodego/tags.go index 2cb44272b..db641f489 100644 --- a/vendor/github.com/linode/linodego/tags.go +++ b/vendor/github.com/linode/linodego/tags.go @@ -22,6 +22,7 @@ type TaggedObject struct { // SortedObjects currently only includes Instances type SortedObjects struct { Instances []Instance + LKEClusters []LKECluster Domains []Domain Volumes []Volume NodeBalancers []NodeBalancer @@ -35,11 +36,13 @@ type TaggedObjectList []TaggedObject // TagCreateOptions fields are those accepted by CreateTag type TagCreateOptions struct { - Label string `json:"label"` - Linodes []int `json:"linodes,omitempty"` - Domains []int `json:"domains,omitempty"` - Volumes []int `json:"volumes,omitempty"` - NodeBalancers []int `json:"nodebalancers,omitempty"` + Label string `json:"label"` + Linodes []int `json:"linodes,omitempty"` + // @TODO is this implemented? + LKEClusters []int `json:"lke_clusters,omitempty"` + Domains []int `json:"domains,omitempty"` + Volumes []int `json:"volumes,omitempty"` + NodeBalancers []int `json:"nodebalancers,omitempty"` } // GetCreateOptions converts a Tag to TagCreateOptions for use in CreateTag @@ -108,6 +111,12 @@ func (i *TaggedObject) fixData() (*TaggedObject, error) { return nil, err } i.Data = obj + case "lke_cluster": + obj := LKECluster{} + if err := json.Unmarshal(i.RawData, &obj); err != nil { + return nil, err + } + i.Data = obj case "nodebalancer": obj := NodeBalancer{} if err := json.Unmarshal(i.RawData, &obj); err != nil { @@ -135,9 +144,11 @@ func (i *TaggedObject) fixData() (*TaggedObject, error) { func (c *Client) ListTaggedObjects(ctx context.Context, label string, opts *ListOptions) (TaggedObjectList, error) { response := TaggedObjectsPagedResponse{} err := c.listHelperWithID(ctx, &response, label, opts) + if err != nil { return nil, err } + for i := range response.Data { if _, err := response.Data[i].fixData(); err != nil { return nil, err @@ -149,31 +160,38 @@ func (c *Client) ListTaggedObjects(ctx context.Context, label string, opts *List // SortedObjects converts a list of TaggedObjects into a Sorted Objects struct, for easier access func (t TaggedObjectList) SortedObjects() (SortedObjects, error) { so := SortedObjects{} + for _, o := range t { switch o.Type { case "linode": if instance, ok := o.Data.(Instance); ok { so.Instances = append(so.Instances, instance) } else { - return so, errors.New("Expected an Instance when Type was \"linode\"") + return so, errors.New("expected an Instance when Type was \"linode\"") + } + case "lke_cluster": + if lkeCluster, ok := o.Data.(LKECluster); ok { + so.LKEClusters = append(so.LKEClusters, lkeCluster) + } else { + return so, errors.New("expected an LKECluster when Type was \"lke_cluster\"") } case "domain": if domain, ok := o.Data.(Domain); ok { so.Domains = append(so.Domains, domain) } else { - return so, errors.New("Expected a Domain when Type was \"domain\"") + return so, errors.New("expected a Domain when Type was \"domain\"") } case "volume": if volume, ok := o.Data.(Volume); ok { so.Volumes = append(so.Volumes, volume) } else { - return so, errors.New("Expected an Volume when Type was \"volume\"") + return so, errors.New("expected an Volume when Type was \"volume\"") } case "nodebalancer": if nodebalancer, ok := o.Data.(NodeBalancer); ok { so.NodeBalancers = append(so.NodeBalancers, nodebalancer) } else { - return so, errors.New("Expected an NodeBalancer when Type was \"nodebalancer\"") + return so, errors.New("expected an NodeBalancer when Type was \"nodebalancer\"") } } } diff --git a/vendor/github.com/linode/linodego/util.go b/vendor/github.com/linode/linodego/util.go deleted file mode 100644 index a37a304e4..000000000 --- a/vendor/github.com/linode/linodego/util.go +++ /dev/null @@ -1,15 +0,0 @@ -package linodego - -import "time" - -const ( - dateLayout = "2006-01-02T15:04:05" -) - -func parseDates(dateStr string) (*time.Time, error) { - d, err := time.Parse(dateLayout, dateStr) - if err != nil { - return nil, err - } - return &d, nil -} diff --git a/vendor/github.com/linode/linodego/volumes.go b/vendor/github.com/linode/linodego/volumes.go index 0a528b545..03a148ba6 100644 --- a/vendor/github.com/linode/linodego/volumes.go +++ b/vendor/github.com/linode/linodego/volumes.go @@ -5,6 +5,8 @@ import ( "encoding/json" "fmt" "time" + + "github.com/linode/linodego/internal/parseabletime" ) // VolumeStatus indicates the status of the Volume @@ -26,9 +28,6 @@ const ( // Volume represents a linode volume object type Volume struct { - CreatedStr string `json:"created"` - UpdatedStr string `json:"updated"` - ID int `json:"id"` Label string `json:"label"` Status VolumeStatus `json:"status"` @@ -50,7 +49,8 @@ type VolumeCreateOptions struct { // The Volume's size, in GiB. Minimum size is 10GiB, maximum size is 10240GiB. A "0" value will result in the default size. Size int `json:"size,omitempty"` // An array of tags applied to this object. Tags are for organizational purposes only. - Tags []string `json:"tags"` + Tags []string `json:"tags"` + PersistAcrossBoots *bool `json:"persist_across_boots,omitempty"` } // VolumeUpdateOptions fields are those accepted by UpdateVolume @@ -61,8 +61,9 @@ type VolumeUpdateOptions struct { // VolumeAttachOptions fields are those accepted by AttachVolume type VolumeAttachOptions struct { - LinodeID int `json:"linode_id"` - ConfigID int `json:"config_id,omitempty"` + LinodeID int `json:"linode_id"` + ConfigID int `json:"config_id,omitempty"` + PersistAcrossBoots *bool `json:"persist_across_boots,omitempty"` } // VolumesPagedResponse represents a linode API response for listing of volumes @@ -71,6 +72,28 @@ type VolumesPagedResponse struct { Data []Volume `json:"data"` } +// UnmarshalJSON implements the json.Unmarshaler interface +func (v *Volume) UnmarshalJSON(b []byte) error { + type Mask Volume + + p := struct { + *Mask + Created *parseabletime.ParseableTime `json:"created"` + Updated *parseabletime.ParseableTime `json:"updated"` + }{ + Mask: (*Mask)(v), + } + + if err := json.Unmarshal(b, &p); err != nil { + return err + } + + v.Created = time.Time(*p.Created) + v.Updated = time.Time(*p.Updated) + + return nil +} + // GetUpdateOptions converts a Volume to VolumeUpdateOptions for use in UpdateVolume func (v Volume) GetUpdateOptions() (updateOpts VolumeUpdateOptions) { updateOpts.Label = v.Label @@ -108,26 +131,13 @@ func (resp *VolumesPagedResponse) appendData(r *VolumesPagedResponse) { func (c *Client) ListVolumes(ctx context.Context, opts *ListOptions) ([]Volume, error) { response := VolumesPagedResponse{} err := c.listHelper(ctx, &response, opts) - for i := range response.Data { - response.Data[i].fixDates() - } + if err != nil { return nil, err } return response.Data, nil } -// fixDates converts JSON timestamps to Go time.Time values -func (v *Volume) fixDates() *Volume { - if parsed, err := parseDates(v.CreatedStr); err != nil { - v.Created = *parsed - } - if parsed, err := parseDates(v.UpdatedStr); err != nil { - v.Updated = *parsed - } - return v -} - // GetVolume gets the template with the provided ID func (c *Client) GetVolume(ctx context.Context, id int) (*Volume, error) { e, err := c.Volumes.Endpoint() @@ -139,7 +149,7 @@ func (c *Client) GetVolume(ctx context.Context, id int) (*Volume, error) { if err != nil { return nil, err } - return r.Result().(*Volume).fixDates(), nil + return r.Result().(*Volume), nil } // AttachVolume attaches a volume to a Linode instance @@ -166,7 +176,7 @@ func (c *Client) AttachVolume(ctx context.Context, id int, options *VolumeAttach return nil, err } - return resp.Result().(*Volume).fixDates(), nil + return resp.Result().(*Volume), nil } // CreateVolume creates a Linode Volume @@ -192,7 +202,7 @@ func (c *Client) CreateVolume(ctx context.Context, createOpts VolumeCreateOption return nil, err } - return resp.Result().(*Volume).fixDates(), nil + return resp.Result().(*Volume), nil } // RenameVolume renames the label of a Linode volume @@ -226,7 +236,7 @@ func (c *Client) UpdateVolume(ctx context.Context, id int, volume VolumeUpdateOp if err != nil { return nil, err } - return r.Result().(*Volume).fixDates(), nil + return r.Result().(*Volume), nil } // CloneVolume clones a Linode volume @@ -248,7 +258,7 @@ func (c *Client) CloneVolume(ctx context.Context, id int, label string) (*Volume return nil, err } - return resp.Result().(*Volume).fixDates(), nil + return resp.Result().(*Volume), nil } // DetachVolume detaches a Linode volume diff --git a/vendor/github.com/linode/linodego/waitfor.go b/vendor/github.com/linode/linodego/waitfor.go index 8f29a4150..45dad5922 100644 --- a/vendor/github.com/linode/linodego/waitfor.go +++ b/vendor/github.com/linode/linodego/waitfor.go @@ -18,6 +18,7 @@ func (client Client) WaitForInstanceStatus(ctx context.Context, instanceID int, ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) defer ticker.Stop() + for { select { case <-ticker.C: @@ -44,6 +45,7 @@ func (client Client) WaitForInstanceDiskStatus(ctx context.Context, instanceID i ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) defer ticker.Stop() + for { select { case <-ticker.C: @@ -53,16 +55,18 @@ func (client Client) WaitForInstanceDiskStatus(ctx context.Context, instanceID i if err != nil { return nil, err } + for _, disk := range disks { + disk := disk if disk.ID == diskID { complete := (disk.Status == status) if complete { return &disk, nil } + break } } - case <-ctx.Done(): return nil, fmt.Errorf("Error waiting for Instance %d Disk %d status %s: %s", instanceID, diskID, status, ctx.Err()) } @@ -77,6 +81,7 @@ func (client Client) WaitForVolumeStatus(ctx context.Context, volumeID int, stat ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) defer ticker.Stop() + for { select { case <-ticker.C: @@ -103,6 +108,7 @@ func (client Client) WaitForSnapshotStatus(ctx context.Context, instanceID int, ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) defer ticker.Stop() + for { select { case <-ticker.C: @@ -131,6 +137,7 @@ func (client Client) WaitForVolumeLinodeID(ctx context.Context, volumeID int, li ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) defer ticker.Stop() + for { select { case <-ticker.C: @@ -139,34 +146,54 @@ func (client Client) WaitForVolumeLinodeID(ctx context.Context, volumeID int, li return volume, err } - if linodeID == nil && volume.LinodeID == nil { + switch { + case linodeID == nil && volume.LinodeID == nil: return volume, nil - } else if linodeID == nil || volume.LinodeID == nil { + case linodeID == nil || volume.LinodeID == nil: // continue waiting - } else if *volume.LinodeID == *linodeID { + case *volume.LinodeID == *linodeID: return volume, nil } - case <-ctx.Done(): return nil, fmt.Errorf("Error waiting for Volume %d to have Instance %v: %s", volumeID, linodeID, ctx.Err()) } } } +// WaitForLKEClusterStatus waits for the LKECluster to reach the desired state +// before returning. It will timeout with an error after timeoutSeconds. +func (client Client) WaitForLKEClusterStatus(ctx context.Context, clusterID int, status LKEClusterStatus, timeoutSeconds int) (*LKECluster, error) { + ctx, cancel := context.WithTimeout(ctx, time.Duration(timeoutSeconds)*time.Second) + defer cancel() + + ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) + defer ticker.Stop() + + for { + select { + case <-ticker.C: + cluster, err := client.GetLKECluster(ctx, clusterID) + if err != nil { + return cluster, err + } + complete := (cluster.Status == status) + + if complete { + return cluster, nil + } + case <-ctx.Done(): + return nil, fmt.Errorf("Error waiting for Cluster %d status %s: %s", clusterID, status, ctx.Err()) + } + } +} + // WaitForEventFinished waits for an entity action to reach the 'finished' state // before returning. It will timeout with an error after timeoutSeconds. // If the event indicates a failure both the failed event and the error will be returned. +// nolint func (client Client) WaitForEventFinished(ctx context.Context, id interface{}, entityType EntityType, action EventAction, minStart time.Time, timeoutSeconds int) (*Event, error) { titledEntityType := strings.Title(string(entityType)) - filter, _ := json.Marshal(map[string]interface{}{ - // Entity is not filtered by the API - // Perhaps one day they will permit Entity ID/Type filtering. - // We'll have to verify these values manually, for now. - //"entity": map[string]interface{}{ - // "id": fmt.Sprintf("%v", id), - // "type": entityType, - //}, - + filterStruct := map[string]interface{}{ // Nor is action //"action": action, @@ -177,16 +204,33 @@ func (client Client) WaitForEventFinished(ctx context.Context, id interface{}, e //}, // With potentially 1000+ events coming back, we should filter on something + // Warning: This optimization has the potential to break if users are clearing + // events before we see them. "seen": false, // Float the latest events to page 1 "+order_by": "created", "+order": "desc", - }) + } // Optimistically restrict results to page 1. We should remove this when more // precise filtering options exist. - listOptions := NewListOptions(1, string(filter)) + pages := 1 + + // The API has limitted filtering support for Event ID and Event Type + // Optimize the list, if possible + switch entityType { + case EntityDisk, EntityLinode, EntityDomain, EntityNodebalancer: + // All of the filter supported types have int ids + filterableEntityID, err := strconv.Atoi(fmt.Sprintf("%v", id)) + if err != nil { + return nil, fmt.Errorf("Error parsing Entity ID %q for optimized WaitForEventFinished EventType %q: %s", id, entityType, err) + } + filterStruct["entity.id"] = filterableEntityID + filterStruct["entity.type"] = entityType + + // TODO: are we conformatable with pages = 0 with the event type and id filter? + } ctx, cancel := context.WithTimeout(ctx, time.Duration(timeoutSeconds)*time.Second) defer cancel() @@ -197,10 +241,27 @@ func (client Client) WaitForEventFinished(ctx context.Context, id interface{}, e } ticker := time.NewTicker(client.millisecondsPerPoll * time.Millisecond) + + // avoid repeating log messages + nextLog := "" + lastLog := "" + lastEventID := 0 + defer ticker.Stop() for { select { case <-ticker.C: + if lastEventID > 0 { + filterStruct["id"] = map[string]interface{}{ + "+gte": lastEventID, + } + } + + filter, err := json.Marshal(filterStruct) + if err != nil { + return nil, err + } + listOptions := NewListOptions(pages, string(filter)) events, err := client.ListEvents(ctx, listOptions) if err != nil { @@ -209,6 +270,8 @@ func (client Client) WaitForEventFinished(ctx context.Context, id interface{}, e // If there are events for this instance + action, inspect them for _, event := range events { + event := event + if event.Action != action { // log.Println("action mismatch", event.Action, action) continue @@ -220,21 +283,21 @@ func (client Client) WaitForEventFinished(ctx context.Context, id interface{}, e var entID string - switch event.Entity.ID.(type) { + switch id := event.Entity.ID.(type) { case float64, float32: - entID = fmt.Sprintf("%.f", event.Entity.ID) + entID = fmt.Sprintf("%.f", id) case int: - entID = strconv.Itoa(event.Entity.ID.(int)) + entID = strconv.Itoa(id) default: - entID = fmt.Sprintf("%v", event.Entity.ID) + entID = fmt.Sprintf("%v", id) } var findID string - switch id.(type) { + switch id := id.(type) { case float64, float32: findID = fmt.Sprintf("%.f", id) case int: - findID = strconv.Itoa(id.(int)) + findID = strconv.Itoa(id) default: findID = fmt.Sprintf("%v", id) } @@ -247,24 +310,33 @@ func (client Client) WaitForEventFinished(ctx context.Context, id interface{}, e // @TODO(displague) This event.Created check shouldn't be needed, but it appears // that the ListEvents method is not populating it correctly if event.Created == nil { - log.Printf("[WARN] event.Created is nil when API returned: %#+v", event.CreatedStr) + log.Printf("[WARN] event.Created is nil when API returned: %#+v", event.Created) } else if *event.Created != minStart && !event.Created.After(minStart) { // Not the event we were looking for // log.Println(event.Created, "is not >=", minStart) continue - } - if event.Status == EventFailed { + // This is the event we are looking for. Save our place. + if lastEventID == 0 { + lastEventID = event.ID + } + + switch event.Status { + case EventFailed: return &event, fmt.Errorf("%s %v action %s failed", titledEntityType, id, action) - } else if event.Status == EventScheduled { - log.Printf("[INFO] %s %v action %s is scheduled", titledEntityType, id, action) - } else if event.Status == EventFinished { + case EventFinished: log.Printf("[INFO] %s %v action %s is finished", titledEntityType, id, action) return &event, nil } // TODO(displague) can we bump the ticker to TimeRemaining/2 (>=1) when non-nil? - log.Printf("[INFO] %s %v action %s is %s", titledEntityType, id, action, event.Status) + nextLog = fmt.Sprintf("[INFO] %s %v action %s is %s", titledEntityType, id, action, event.Status) + } + + // de-dupe logging statements + if nextLog != lastLog { + log.Print(nextLog) + lastLog = nextLog } case <-ctx.Done(): return nil, fmt.Errorf("Error waiting for Event Status '%s' of %s %v action '%s': %s", EventFinished, titledEntityType, id, action, ctx.Err()) diff --git a/vendor/golang.org/x/net/http2/client_conn_pool.go b/vendor/golang.org/x/net/http2/client_conn_pool.go index f4d9b5ece..3a67636fe 100644 --- a/vendor/golang.org/x/net/http2/client_conn_pool.go +++ b/vendor/golang.org/x/net/http2/client_conn_pool.go @@ -107,6 +107,7 @@ func (p *clientConnPool) getClientConn(req *http.Request, addr string, dialOnMis // dialCall is an in-flight Transport dial call to a host. type dialCall struct { + _ incomparable p *clientConnPool done chan struct{} // closed when done res *ClientConn // valid after done is closed @@ -180,6 +181,7 @@ func (p *clientConnPool) addConnIfNeeded(key string, t *Transport, c *tls.Conn) } type addConnCall struct { + _ incomparable p *clientConnPool done chan struct{} // closed when done err error @@ -200,12 +202,6 @@ func (c *addConnCall) run(t *Transport, key string, tc *tls.Conn) { close(c.done) } -func (p *clientConnPool) addConn(key string, cc *ClientConn) { - p.mu.Lock() - p.addConnLocked(key, cc) - p.mu.Unlock() -} - // p.mu must be held func (p *clientConnPool) addConnLocked(key string, cc *ClientConn) { for _, v := range p.conns[key] { diff --git a/vendor/golang.org/x/net/http2/flow.go b/vendor/golang.org/x/net/http2/flow.go index cea601fcd..b51f0e0cf 100644 --- a/vendor/golang.org/x/net/http2/flow.go +++ b/vendor/golang.org/x/net/http2/flow.go @@ -8,6 +8,8 @@ package http2 // flow is the flow control window's size. type flow struct { + _ incomparable + // n is the number of DATA bytes we're allowed to send. // A flow is kept both on a conn and a per-stream. n int32 diff --git a/vendor/golang.org/x/net/http2/hpack/huffman.go b/vendor/golang.org/x/net/http2/hpack/huffman.go index b412a96c5..a1ab2f056 100644 --- a/vendor/golang.org/x/net/http2/hpack/huffman.go +++ b/vendor/golang.org/x/net/http2/hpack/huffman.go @@ -105,7 +105,14 @@ func huffmanDecode(buf *bytes.Buffer, maxLen int, v []byte) error { return nil } +// incomparable is a zero-width, non-comparable type. Adding it to a struct +// makes that struct also non-comparable, and generally doesn't add +// any size (as long as it's first). +type incomparable [0]func() + type node struct { + _ incomparable + // children is non-nil for internal nodes children *[256]*node diff --git a/vendor/golang.org/x/net/http2/http2.go b/vendor/golang.org/x/net/http2/http2.go index 27cc893cc..5571ccfd2 100644 --- a/vendor/golang.org/x/net/http2/http2.go +++ b/vendor/golang.org/x/net/http2/http2.go @@ -241,6 +241,7 @@ func (cw closeWaiter) Wait() { // Its buffered writer is lazily allocated as needed, to minimize // idle memory usage with many connections. type bufferedWriter struct { + _ incomparable w io.Writer // immutable bw *bufio.Writer // non-nil when data is buffered } @@ -313,6 +314,7 @@ func bodyAllowedForStatus(status int) bool { } type httpError struct { + _ incomparable msg string timeout bool } @@ -376,3 +378,8 @@ func (s *sorter) SortStrings(ss []string) { func validPseudoPath(v string) bool { return (len(v) > 0 && v[0] == '/') || v == "*" } + +// incomparable is a zero-width, non-comparable type. Adding it to a struct +// makes that struct also non-comparable, and generally doesn't add +// any size (as long as it's first). +type incomparable [0]func() diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index bc9e41a1b..345b7cd85 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -761,6 +761,7 @@ func (sc *serverConn) readFrames() { // frameWriteResult is the message passed from writeFrameAsync to the serve goroutine. type frameWriteResult struct { + _ incomparable wr FrameWriteRequest // what was written (or attempted) err error // result of the writeFrame call } @@ -771,7 +772,7 @@ type frameWriteResult struct { // serverConn. func (sc *serverConn) writeFrameAsync(wr FrameWriteRequest) { err := wr.write.writeFrame(sc) - sc.wroteFrameCh <- frameWriteResult{wr, err} + sc.wroteFrameCh <- frameWriteResult{wr: wr, err: err} } func (sc *serverConn) closeAllStreamsOnConnClose() { @@ -1161,7 +1162,7 @@ func (sc *serverConn) startFrameWrite(wr FrameWriteRequest) { if wr.write.staysWithinBuffer(sc.bw.Available()) { sc.writingFrameAsync = false err := wr.write.writeFrame(sc) - sc.wroteFrame(frameWriteResult{wr, err}) + sc.wroteFrame(frameWriteResult{wr: wr, err: err}) } else { sc.writingFrameAsync = true go sc.writeFrameAsync(wr) @@ -2057,7 +2058,7 @@ func (sc *serverConn) newWriterAndRequestNoBody(st *stream, rp requestParam) (*r var trailer http.Header for _, v := range rp.header["Trailer"] { for _, key := range strings.Split(v, ",") { - key = http.CanonicalHeaderKey(strings.TrimSpace(key)) + key = http.CanonicalHeaderKey(textproto.TrimString(key)) switch key { case "Transfer-Encoding", "Trailer", "Content-Length": // Bogus. (copy of http1 rules) @@ -2275,6 +2276,7 @@ func (sc *serverConn) sendWindowUpdate32(st *stream, n int32) { // requestBody is the Handler's Request.Body type. // Read and Close may be called concurrently. type requestBody struct { + _ incomparable stream *stream conn *serverConn closed bool // for use by Close only diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index e4fb02530..76a92e0ca 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -108,6 +108,19 @@ type Transport struct { // waiting for their turn. StrictMaxConcurrentStreams bool + // ReadIdleTimeout is the timeout after which a health check using ping + // frame will be carried out if no frame is received on the connection. + // Note that a ping response will is considered a received frame, so if + // there is no other traffic on the connection, the health check will + // be performed every ReadIdleTimeout interval. + // If zero, no health check is performed. + ReadIdleTimeout time.Duration + + // PingTimeout is the timeout after which the connection will be closed + // if a response to Ping is not received. + // Defaults to 15s. + PingTimeout time.Duration + // t1, if non-nil, is the standard library Transport using // this transport. Its settings are used (but not its // RoundTrip method, etc). @@ -131,6 +144,14 @@ func (t *Transport) disableCompression() bool { return t.DisableCompression || (t.t1 != nil && t.t1.DisableCompression) } +func (t *Transport) pingTimeout() time.Duration { + if t.PingTimeout == 0 { + return 15 * time.Second + } + return t.PingTimeout + +} + // ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2. // It returns an error if t1 has already been HTTP/2-enabled. func ConfigureTransport(t1 *http.Transport) error { @@ -675,6 +696,20 @@ func (t *Transport) newClientConn(c net.Conn, singleUse bool) (*ClientConn, erro return cc, nil } +func (cc *ClientConn) healthCheck() { + pingTimeout := cc.t.pingTimeout() + // We don't need to periodically ping in the health check, because the readLoop of ClientConn will + // trigger the healthCheck again if there is no frame received. + ctx, cancel := context.WithTimeout(context.Background(), pingTimeout) + defer cancel() + err := cc.Ping(ctx) + if err != nil { + cc.closeForLostPing() + cc.t.connPool().MarkDead(cc) + return + } +} + func (cc *ClientConn) setGoAway(f *GoAwayFrame) { cc.mu.Lock() defer cc.mu.Unlock() @@ -846,14 +881,12 @@ func (cc *ClientConn) sendGoAway() error { return nil } -// Close closes the client connection immediately. -// -// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead. -func (cc *ClientConn) Close() error { +// closes the client connection immediately. In-flight requests are interrupted. +// err is sent to streams. +func (cc *ClientConn) closeForError(err error) error { cc.mu.Lock() defer cc.cond.Broadcast() defer cc.mu.Unlock() - err := errors.New("http2: client connection force closed via ClientConn.Close") for id, cs := range cc.streams { select { case cs.resc <- resAndError{err: err}: @@ -866,6 +899,20 @@ func (cc *ClientConn) Close() error { return cc.tconn.Close() } +// Close closes the client connection immediately. +// +// In-flight requests are interrupted. For a graceful shutdown, use Shutdown instead. +func (cc *ClientConn) Close() error { + err := errors.New("http2: client connection force closed via ClientConn.Close") + return cc.closeForError(err) +} + +// closes the client connection immediately. In-flight requests are interrupted. +func (cc *ClientConn) closeForLostPing() error { + err := errors.New("http2: client connection lost") + return cc.closeForError(err) +} + const maxAllocFrameSize = 512 << 10 // frameBuffer returns a scratch buffer suitable for writing DATA frames. @@ -916,7 +963,7 @@ func commaSeparatedTrailers(req *http.Request) (string, error) { k = http.CanonicalHeaderKey(k) switch k { case "Transfer-Encoding", "Trailer", "Content-Length": - return "", &badStringError{"invalid Trailer key", k} + return "", fmt.Errorf("invalid Trailer key %q", k) } keys = append(keys, k) } @@ -1394,13 +1441,6 @@ func (cs *clientStream) awaitFlowControl(maxBytes int) (taken int32, err error) } } -type badStringError struct { - what string - str string -} - -func (e *badStringError) Error() string { return fmt.Sprintf("%s %q", e.what, e.str) } - // requires cc.mu be held. func (cc *ClientConn) encodeHeaders(req *http.Request, addGzipHeader bool, trailers string, contentLength int64) ([]byte, error) { cc.hbuf.Reset() @@ -1616,6 +1656,7 @@ func (cc *ClientConn) writeHeader(name, value string) { } type resAndError struct { + _ incomparable res *http.Response err error } @@ -1663,6 +1704,7 @@ func (cc *ClientConn) streamByID(id uint32, andRemove bool) *clientStream { // clientConnReadLoop is the state owned by the clientConn's frame-reading readLoop. type clientConnReadLoop struct { + _ incomparable cc *ClientConn closeWhenIdle bool } @@ -1742,8 +1784,17 @@ func (rl *clientConnReadLoop) run() error { rl.closeWhenIdle = cc.t.disableKeepAlives() || cc.singleUse gotReply := false // ever saw a HEADERS reply gotSettings := false + readIdleTimeout := cc.t.ReadIdleTimeout + var t *time.Timer + if readIdleTimeout != 0 { + t = time.AfterFunc(readIdleTimeout, cc.healthCheck) + defer t.Stop() + } for { f, err := cc.fr.ReadFrame() + if t != nil { + t.Reset(readIdleTimeout) + } if err != nil { cc.vlogf("http2: Transport readFrame error on conn %p: (%T) %v", cc, err, err) } @@ -2479,6 +2530,7 @@ func (rt erringRoundTripper) RoundTrip(*http.Request) (*http.Response, error) { // gzipReader wraps a response body so it can lazily // call gzip.NewReader on the first call to Read type gzipReader struct { + _ incomparable body io.ReadCloser // underlying Response.Body zr *gzip.Reader // lazily-initialized gzip reader zerr error // sticky error diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index 369e44656..8e1c9d3dd 100644 --- a/vendor/golang.org/x/net/publicsuffix/table.go +++ b/vendor/golang.org/x/net/publicsuffix/table.go @@ -2,7 +2,7 @@ package publicsuffix -const version = "publicsuffix.org's public_suffix_list.dat, git revision 7922d7c20e246552be418e8f72e577899fd30d99 (2020-02-18T23:18:19Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision dbe9da0a8abeab1b6257c57668d1ecb584189951 (2020-05-27T00:50:31Z)" const ( nodesBitsChildren = 10 @@ -23,488 +23,490 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1528 +const numTLD = 1525 // Text is the combined text of all labels. const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijoinvill" + - "eksvik12ix4432-balsfjordd-dnsiskinkyotobetsulikes-piedmonticello" + - "dingen4tatarantours3-ap-south-16-b-dataiji234lima-cityeatselinog" + - "radult3l3p0rtashkentatamotors3-ap-northeast-2038blackfridayuu2-l" + - "ocalhostoregontrailroadnparachutingleezebloombergbauernirasakind" + - "igenaklodzkochikushinonsenergyuzawabloxcms3-website-us-west-1blu" + - "edagestangemologicallimoliseminebmoattachments3-website-us-west-" + - "2bms5ybmweddinglitchattanooganordlandrangedalinkyard-cloudyclust" + - "erbnrwedeploybomloabathsbchernihivgubsakyotanabellunord-aurdalph" + - "a-myqnapcloudaccesscambridgestoneuesalangenishiazaindustriabondr" + - "ay-dnsupdaternopilawatchesalondonetskaruizawabonnishigohtawaramo" + - "toineppueblockbustermezparaglidingliwicebookinghostfoldnavybooml" + - "air-traffic-controlleyboschaefflerdalivornomutashinaindustrieste" + - "amfamberkeleybostikarumaifarmsteadrayddnsfreebox-osascoli-piceno" + - "rdre-landraydnsaltdalombardynaliaskimitsubatamibudejjuegoshikiho" + - "kumakogenebakkeshibechambagriculturennebugattiffanynysadoes-itve" + - "destrandrivefsnillfjordrobaknoluoktachikawakembuchikumagayagawak" + - "kanaibetsubamericanfamilydsclouderackmazerbaijan-mayen-rootaribe" + - "iraogashimadachicagoboatsaludrudupontariobranconakamuratajirivne" + - "bostonakijinsekikogentappsselfiparisor-fronishiharabotanicalgard" + - "enishiizunazukinfinitintuitjomeloyalistoragebotanicgardenishikat" + - "aketomisatomobellevuelosangelesjabbottjxfinitybotanybouncemerckm" + - "sdnipropetrovskjervoyageorgeorgiabounty-fullensakerrypropertiesa" + - "lvadordalibabalestrandabergamo-siemensncfdurbanamexnethnologybou" + - "tiquebechernivtsiciliabozen-sudtirolomzaporizhzhegurinuyamashina" + - "tsukigatakasakitaurayasudabozen-suedtirolondrinamsskoganeinvestm" + - "entsalzburglobalashovhachinohedmarkasaokamiminersamegawabplacedo" + - "gawarabikomaezakirunorddalorenskogloboavistanbulsan-sudtiroloten" + - "kawabrandywinevalleybrasiliabrindisibenikimobetsuitainaioiraseba" + - "stopologyeongnamegawafflecellclaimsamnangerbristoloseyouriparlia" + - "mentkmaxxjavald-aostarnberglogowegroweibolognagareyamakeupowiath" + - "letajimabaridagawakuyabukikonaikawachinaganoharamcoachampionship" + - "hoptobishimadridvagsoyerbritishcolumbialowiezaganishikatsuragit-" + - "reposampalacebroadcastleclerchernovtsymantechnologybroadwaybroke" + - "-itksatxn--0trq7p7nnishikawazukamisunagawabrokerbronnoysundurham" + - "burgloppenzaolbia-tempio-olbiatempioolbialystokkepnogatagajoboji" + - "nzais-a-candidatebrothermesaverdealstahaugesunderseaportsinfolld" + - "alottebrowsersafetymarketsamsclubartoweirbrumunddalottokonamegat" + - "akayamashikokuchuobrunelasticbeanstalkashibatakatoris-a-catererb" + - "russelsamsunglugmbhartipscbgminakamichiharabruxellesandnessjoeni" + - "shimerabryansklepparmatta-varjjatmparochernigovernmentoyosatoyok" + - "awabrynewjerseybuskerudinewmexicoalouvreitoyotaparsandoybuzentsu" + - "jiiebuzzwellbeingzonebwfarsundweberbzhitomirumalatvuopmicrolight" + - "ingmodellingmxn--11b4c3dynathomebuiltwithdarkashiharabzzcolumbus" + - "heycommunecommunity-prochowicecomoarekecomparemarkerryhotelsanta" + - "mariakecompute-1computerhistoryofscience-fictioncomsecuritytacti" + - "csantoandreamhostersanukis-a-cubicle-slavellinodearthachiojiyaho" + - "oguycondoshichinohealth-carereforminamidaitomanchesterconference" + - "constructionconsuladonnagatorodoyconsultanthropologyconsultingro" + - "ngausdalukowhalingrossetouchihayaakasakawaharacontactraniandriab" + - "arlettatraniandriacontagematsubaracontemporaryarteducationalchik" + - "ugodontexistmein-iservebeercontractorskenconventureshinodebalanc" + - "ertificationcookingchannelsdvrdnsfor-better-thanawassamukawatari" + - "ghtathomeftpartycooluroycooperativano-frankivskolegallocus-3cope" + - "nhagencyclopedichitosetogakushimotoganewyorkshirecifedexhibition" + - "ishinoomotegocorsicafederationcorvettemp-dnsaobernardocosenzakop" + - "anecosidnshome-webserverdalutskasuyameinforumzcostumedicinaharim" + - "alopolskanlandyndns-office-on-the-webhareidsbergentingroundhandl" + - "ingroznycouchpotatofriesaogoncarriercounciluxurycouponsaotomelda" + - "luzerncq-acranbrookuwanalyticsapporocrdyndns-picsardegnaroycredi" + - "tcardyndns-remotewdyndns-serverisigncreditunioncremonashgabadadd" + - "jaguarqcxn--12c1fe0bradescorporationrendercrewhoswhokksundyndns-" + - "webhopencraftranoycricketrzyncrimeast-kazakhstanangercrotonecrow" + - "nipasadenarashinocrsvpassagensardiniacruisesarlvivanovoldacrypto" + - "nomichigangwoncuisinellajollamericanexpressexyculturalcentertain" + - "mentransportecuneocupcakecuritibaghdadyndns-wikirkenesarpsborgrp" + - "assenger-associationcymrussiacyonabaruminamiechizencyouthruherec" + - "ipescaravantaarpatriaferrerotikagoshimalvikaszubyfetsundyndns1fg" + - "uidegreefhvalerfidoomdnstracefieldynnsarufutsunomiyawakasaikaita" + - "koelnfigueresinstaginguitarsauheradynservebbsasayamayfirstockhol" + - "mestrandyndns-workshopitsitexaskoyabearalvahkijobservableusercon" + - "tentransurlfilateliafilegear-audnedalnfilegear-deatnulminamiiser" + - "niafilegear-gbizfilegear-iefilegear-jpmorganfilegear-sgujohanama" + - "kinoharafilminamiizukamiokameokameyamatotakadafinalfinancefinear" + - "tsavannahgafinlandynufcfanfinnoyfirebaseapplinzis-a-doctorayfire" + - "nzefirestonefirmdalegoldpoint2thisamitsukefishingolffansaves-the" + - "-whalessandria-trani-barletta-andriatranibarlettaandriafitjarvod" + - "kafjordynv6fitnessettlementravelersinsurancefjalerflesbergulenfl" + - "ickragerogersavonarusawaflightsaxoflirfloginlinefloraflorenceflo" + - "ridattorelayfloripaderbornfloristanohatakaharulvikatowicefloroku" + - "nohealthcareerschoenbrunnflowerschokokekschokoladenfltrdynvpnplu" + - "s-4flynnhosting-clusterflynnhubarcelonagawalesundgcagliaricoharu" + - "ovataxihuanflfanfshostrowwlkpmgjerdrumemsettsupportcp4fndyroyrvi" + - "kingruefor-ourfor-somedizinhistorischescholarshipschoolschulefor" + - "-theaterforexrothachirogatakamoriokakudamatsueforgotdnschwarzgwa" + - "ngjuniperforli-cesena-forlicesenaforlikescandyn53forsaleikangerf" + - "orsandasuologoipaviancargodaddyn-o-saurlandeschweizfortalfortmis" + - "soulancasterfortworthadanorthwesternmutualfosnesciencecenterscie" + - "ncehistoryfotaruis-a-financialadvisor-aurdalfoxfordebianfozorafr" + - "edrikstadtvscientistordalfreeddnsgeekgalaxyfreedesktopocznore-og" + - "-uvdalfreemasonryfreesitextileirfjordfreetlscjohnsonfreiburgunma" + - "nxn--12co0c3b4evalleaostavangerfreightrentin-sud-tirolfreseniusc" + - "ountryestateofdelawareggio-calabriafribourguovdageaidnunusualper" + - "sonfriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriuli-venezia-" + - "giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giuliafriulive-g" + - "iuliafriulivegiuliafriulivenezia-giuliafriuliveneziagiuliafriuli" + - "vgiuliafrlfroganscotlandfrognfrolandfrom-akrehamnfrom-alfrom-arf" + - "rom-azimutheworkpccwiiheyakagefrom-capebretonamicrosoftbankatsus" + - "hikabeeldengeluidfrom-codyn-vpndnscrapper-sitefrom-ctrentin-sudt" + - "irolfrom-dchocolatelevisionishinoshimatsushigefrom-dedyn-berlinc" + - "olnfrom-flanderscrappingushikamifuranorth-kazakhstanfrom-gaulard" + - "alfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfrom-in-brbarc" + - "laycards3-sa-east-1from-kscrysechofunatoriginstitutemasekashiwaz" + - "akiyosatokamachintaifun-dnsdojolsterfrom-kyowariasahikawawildlif" + - "edorainfracloudfrontdoorfrom-lanciafrom-mamurogawafrom-mdfrom-me" + - "eresistancefrom-mifunefrom-mnfrom-modalenfrom-mserveirchonanbuls" + - "an-suedtirolowiczest-le-patronishiokoppegardyndns-at-homedepoten" + - "zamamidsundyndns-at-workisboringrimstadyndns-blogdnsangofrom-mtn" + - "from-nctulangevagrigentomologyeonggiehtavuoatnadexeterfrom-ndfro" + - "m-nefrom-nh-serveblogsiteleafamilycompanyminamimakis-a-geekatsuy" + - "amarugame-hostrowiechoseiroumuenchenishitosashimizunaminamibosog" + - "ndalpusercontentoyotsukaidofrom-njaworznoticiasnesoddenmarkhange" + - "lskjakdnepropetrovskiervaapsteiermarkaufenfrom-nminamiminowafrom" + - "-nvalled-aostavernfrom-nyfrom-ohkurafrom-oketogurafrom-orfrom-pa" + - "dovaksdalfrom-pratohmandalfrom-ris-a-greenfrom-schmidtre-gauldal" + - "from-sdfrom-tnfrom-txn--1ck2e1barclays3-us-east-2from-utazuerich" + - "ardlillehammerfeste-ipfizerfrom-val-daostavalleyfrom-vtrentin-su" + - "ed-tirolfrom-wafrom-wielunnerfrom-wvalledaostaobaomoriguchiharah" + - "kkeravjuedischesapeakebayernunzenfrom-wyfrosinonefrostalowa-wola" + - "wafroyahikobeardubaiduckdnserveminecraftrentin-suedtirolfstcgrou" + - "pgfoggiafujiiderafujikawaguchikonefujiminokamoenairguardiannakad" + - "omarineat-urlfujinomiyadavvenjargap-northeast-3fujiokayamangonoh" + - "ejis-a-guruslivinghistoryfujisatoshonairlinebraskauniversitychya" + - "ttorneyagawakayamagazinedre-eikerfujisawafujishiroishidakabirato" + - "ridefenseljordfujitsurugashimangyshlakasamatsudovre-eikerfujixer" + - "oxn--1ctwolominamatargivestbytemarkautokeinotteroyfujiyoshidavve" + - "siidatsunanjoburgwiddleitungsenfukayabeatservemp3fukuchiyamadaza" + - "ifudaigojomedio-campidano-mediocampidanomediofukudominichoshibuy" + - "achiyodatingripefukuis-a-hard-workerservep2pharmacienservepicser" + - "vequakefukumitsubishigakisarazurecontainerdpolicefukuokazakishiw" + - "adafukuroishikarikaturindalfukusakisofukushimaniwakuratefukuyama" + - "gatakahatakaishimogosenfunabashiriuchinadafunagatakamatsukawafun" + - "ahashikamiamakusatsumasendaisennangooglecodespotrentino-a-adigef" + - "undaciofuoiskujukuriyamannorfolkebibleirvikazoologyfuosskoczowil" + - "liamhillfurnitureggio-emilia-romagnakasatsunairportland-4-salern" + - "oboribetsuckservesarcasmatartanddesignfurubirafurudonostiaafuruk" + - "awairtelebitballooningxn--1lqs03nfusodegaurafussagamiharafutabay" + - "amaguchinomigawafutboldlygoingnowhere-for-morenakatombetsumitaka" + - "giizefuttsurugimperiafuturecmservicesevastopolefuturehostingfutu" + - "remailingfvgfylkesbiblackbaudcdn77-securebungoonord-odalwaysdata" + - "baseballangenkainanaejrietisalatinabenonicbcn-north-1fyresdalhan" + - "goutsystemscloudhannanmokuizumodenakayamapartmentsewinbarefootba" + - "llfinanzgoraustrheimatunduhrennesoyokozebinagisoccertmgretakaham" + - "alselvendrellaziobiramusementdllpages3-ap-southeast-2hannosegawa" + - "hanyuzenhapmirharstadharvestcelebrationhasamarburghasaminami-alp" + - "sharis-a-lawyerhashbanghasudahasura-appharmacysharphdfcbankddiel" + - "ddanuorrittogliattireshawaiijimaritimoduminamioguni5hasvikfhappo" + - "usrcfastly-terrariuminamifuranohatogayaitakanezawahatoyamazakita" + - "kamiizumisanofidelityhatsukaichikaiseis-a-liberalhattfjelldalhay" + - "ashimamotobungotakadancehazuminobusells-for-ustkannamilanotogawa" + - "helsinkitakatakaokalmykiahembygdsforbundhemneshellaspeziahemseda" + - "lhepforgeherokussldheroyhgtvallee-aosteroyhigashiagatsumagoiania" + - "higashichichibunkyonanaoshimageandsoundandvisionthewifiatmallorc" + - "adaqueshimojis-a-libertarianhigashihiroshimanehigashiizumozakita" + - "kyushuaiahigashikagawahigashikagurasoedahigashikawakitaaikitamih" + - "amadahigashikurumeetnedalhigashimatsushimarcheapigeelvinckhakass" + - "iahigashimatsuyamakitaakitadaitoigawahigashimurayamamotorcyclesh" + - "imokawahigashinarusells-itrentino-alto-adigehigashinehigashiomih" + - "achimanagementrentino-altoadigehigashiosakasayamanakakogawahigas" + - "hishirakawamatakarazukaluganskygearapphiladelphiaareadmyblogspot" + - "rentino-s-tirolhigashisumiyoshikawaminamiaikitamotosumy-gatewayh" + - "igashitsunoshiroomurahigashiurausukitanakagusukumodernhigashiyam" + - "atokoriyamanashifteditchyouriphilatelyhigashiyodogawahigashiyosh" + - "inogaris-a-linux-useranishiaritabashijonawatehiraizumisatohnosho" + - "ooshikamaishimodatehirakatashinagawahiranairtrafficplexus-1hirar" + - "ahiratsukagawahirayaizuwakamatsubushikusakadogawahistorichousesh" + - "imokitayamahitachiomiyagildeskaliszhitachiotagoppdalhitraeumtger" + - "adelmenhorstalbanshimonitayanagithubusercontentrentino-stirolhja" + - "rtdalhjelmelandholeckobierzyceholidayhomeiphilipsyno-dshimonosek" + - "ikawahomelinkitoolsztynsettlershimosuwalkis-a-llamarriottrentino" + - "-sud-tirolhomelinuxn--1lqs71dhomeofficehomesecuritymacaparecidah" + - "omesecuritypchoyodobashichikashukujitawaravennagasukehomesenseer" + - "inghomeunixn--1qqw23ahondahongotembaixadahonjyoitakasagotpantheo" + - "nsitehornindalhorsellsyourhomegoodshimotsukehorteneis-a-musician" + - "hospitalhoteleshimotsumahotmailhoyangerhoylandetroitskypehumanit" + - "ieshinichinanhurdalhurumajis-a-nascarfanhyllestadhyogoris-a-nurs" + - "embokukitchenhyugawarahyundaiwafuneis-very-sweetpepperis-with-th" + - "ebandoisleofmanaustdaljewelryjewishartgalleryjfkharkovalleedaost" + - "ejgorajlljmphotographysiojnjcphonefosshintomikasaharajoyentrenti" + - "noa-adigejoyokaichibalatinogiftshiojirishirifujiedajpnjprshioyan" + - "aizujurkoseis-a-personaltrainerkosherbrookegawakoshimizumakizuno" + - "kunimimatakatsukiyosemitekoshunantankhmelnitskiyamarumorimachida" + - "kosugekotohiradomainsurehabmerkotourakouhokutamakis-a-photograph" + - "erokuapphoenixn--2m4a15ekounosupplieshirakofuefukihaboromskogkou" + - "yamarylhurstjordalshalsenkouzushimasfjordenkozagawakozakis-a-pla" + - "yerkozowindmillkpnkppspdnshiranukamitsuekrasnikahokutokashikis-a" + - "-republicancerresearchaeologicaliforniakrasnodarkredstonekristia" + - "nsandcatshiraois-a-rockstarachowicekristiansundkrodsheradkroksta" + - "delvaldaostarostwodzislawindowskrakowinnershiraokamogawakryminam" + - "isanrikubetsurfastpanelblagrarchaeologyeongbuk0emmafann-arboretu" + - "mbriamallamaceiobbcg120001wwwebredirectmembers3-ap-northeast-133" + - "7kumatorinokumejimashikis-a-socialistdlibestadkumenantokigawakun" + - "isakis-a-soxfankunitachiarailwaykunitomigusukumamotoyamashikekun" + - "neppubtlshiratakahagitlaborkunstsammlungkunstunddesignkuokgroupi" + - "lotshishikuis-a-studentalkureisenkurgankurobelaudibleasingleshis" + - "ognekurogiminamiashigarakuroisoftwarendalenugkuromatsunais-a-tea" + - "cherkassyncloudkurotakikawasakis-a-techietis-a-painteractivegask" + - "vollkushirogawakustanais-a-therapistoiakusupplykutchanelkutnokuz" + - "umakis-an-accountantshinjournalismailillesandefjordkvafjordkvals" + - "undkvamlidlugolekadenagahamaroygardendoftheinternetlifyis-an-act" + - "orkvanangenkvinesdalkvinnheradkviteseidskogkvitsoykwpspectrumina" + - "mitanekzmissileluxembourgmisugitokorozawamitourismolanxesshisuif" + - "uettertdasnetzmitoyoakemiuramiyazurewebsiteshikagamiishibukawami" + - "yotamanomjondalenmlbfanmonstermontrealestatefarmequipmentrentino" + - "aadigemonza-brianzapposhitaramamonza-e-della-brianzaptokuyamatsu" + - "maebashikshacknetrentinoalto-adigemonzabrianzaramonzaebrianzamon" + - "zaedellabrianzamoonscalevangermordoviamoriyamatsumotofukemoriyos" + - "himinamiawajikis-an-engineeringmormonmouthaebaruericssongdalenvi" + - "knakatsugawamoroyamatsunomortgagemoscowioshizukuishimofusaitamat" + - "sukuris-an-entertainermoseushistorymosjoenmoskeneshizuokanagawam" + - "osshoppingmosvikhplaystationmoteginowaniihamatamakawajimansionsh" + - "oujis-bytomaritimekeepingmoviemovimientokyotangovtrentinoaltoadi" + - "gemozilla-iotrentinos-tirolmtranbymuenstermuginozawaonsenmuikami" + - "satokaizukamikitayamatsuris-certifieducatorahimeshimamateramobar" + - "amukodairamulhouseoullensvanguardmunakatanemuncienciamuosattemup" + - "imientakinouemurmansklabudhabikinokawabarthadselectrentino-aadig" + - "emurotorcraftrentinostirolmusashimurayamatsusakahoginankokubunji" + - "s-foundationmusashinoharamuseetrentinosud-tirolmuseumverenigingm" + - "usicarbonia-iglesias-carboniaiglesiascarboniamutsuzawamy-vigorge" + - "my-wanggouvichromedicaltanissettairamyactivedirectorymyasustor-e" + - "lvdalmycdn77-sslattuminamiuonumassa-carrara-massacarraramassabus" + - "inessebyklecznagasakinderoymydattolocalhistorymyddnskingmydissen" + - "trentinosudtirolmydobisshikis-gonemydroboehringerikemydshowamyef" + - "fectrentinosued-tirolmyfirewallonieruchomoscienceandindustrynmyf" + - "oruminamiyamashirokawanabelembetsukubankhmelnytskyivanylvenicemy" + - "fritzmyftpaccesshowtimelhusdecorativeartshriramsterdamnserverban" + - "iamyhome-servermyjinomykolaivaomymailermymediapchungnamdalseidfj" + - "ordyndns-ipartis-a-chefashionishiwakis-a-conservativegarsheis-a-" + - "cpadualstackhero-networkinggroupartsannanissandiegomyokohamamats" + - "udamypepinkmpspbargainstantcloudfunctionswedenvironmentalconserv" + - "ationionjukudoyamaintenancempresashibetsukuiiyamanouchikuhokuryu" + - "gasakitashiobarauthordalanddnslivelanddnss3-eu-west-1mypetsienar" + - "utolgamyphotoshibalena-devicesigdalmypictetrentinosuedtirolmypsx" + - "n--30rr7ymysecuritycamerakermyshopblocksilknx-serverrankoshigaya" + - "nagawamytis-a-bloggermytuleapioneermyvnchurcharternidyndns-mailu" + - "bindalublindesnesannohelplfinancialucaniamywirepaircraftingvollo" + - "mbardiamondsimple-urlpizzapkolobrzegersundplantsirdalplatformsha" + - "ngrilapyplazaplcube-serversaillesjcbnpparibaselburgplumbingoplur" + - "inacionalpodhalewismillerpodlasiellaktyubinskiptveterinaireadthe" + - "docscappgafannefrankfurtrentinsud-tirolpodzonepohlpoivronpokerpo" + - "krovskomaganepoliticarrdpolitiendapolkowicepoltavalle-aostathell" + - "ezajskomakiyosunndalpomorzeszowitdkomatsushimarylandponpesaro-ur" + - "bino-pesarourbinopesaromasvuotnaritakurashikis-into-animeguroros" + - "hinkamigotoyohashimototalponypordenonepornporsangerporsangugepor" + - "sgrunnanyokoshibahikariwanumatakkoebenhavnpoznanpraxis-a-bookkee" + - "perspectakashimarnardalprdpreservationpresidioprgmrprimelbournep" + - "rincipeprivatizehealthinsuranceproductionslupskomforbarreauction" + - "-webhostingjerstadotsuruokakamigaharautomotiveconomiasakuchinots" + - "uchiurakawalbrzycharitysfjordds3-eu-west-2profesionalprogressive" + - "nneslaskerrylogisticslzpromombetsurgeonshalloffameiwamasoyproper" + - "typrotectionprotonetrentinsudtirolprudentialpruszkowithgoogleapi" + - "sa-hockeynutsiracusakatamayufuelveruminanoprvcyberlevagangaviika" + - "nonjis-into-carshinshinotsurgeryprzeworskogptplusgardenpulawypup" + - "ippugliapvhagakhanamigawapvtrentinsued-tirolpwcircustomer-ocimdb" + - "ananarepublicaseihicampobassociatest-iservecounterstrikehimejibm" + - "deportevadsobetsumidatlanticasertaipeiheijiitatebayashiibajddarc" + - "hitecturealtorlandevelopmentattoobservereviewsaintlouis-a-bruins" + - "fanayorovnoceanographics3-fips-us-gov-west-1pzqhagebostadqldqpon" + - "iatowadaqslingqualifioappiszquickconnectrentinsuedtirolquicksyte" + - "stingquipelementsnoasaitoshimattelekommunikationqvcistrondheimmo" + - "bilienissayokkaichiropractichirurgiens-dentistes-en-francesuzaka" + - "nazawasuzukaneyamazoesuzukis-leetrentino-sudtirolsvalbardunloppa" + - "cificitichiryukyuragifuchungbukharaumalborkashiwarasveiosvelviko" + - "morotsukaminoyamaxunjargasvizzerasvn-reposomnarviikamishihoronob" + - "eauxartsandcraftsokndalswidnicartoonartdecologiaswidnikkokaminok" + - "awanishiaizubangeswiebodzin-butterswiftcoverswinoujscienceandhis" + - "toryswissmarterthanyousynology-diskstationsynology-dsooturystyka" + - "nmakiwientuscanytushuissier-justicetuvalle-daostaticsor-varanger" + - "tuxfamilytwmailvestfoldvestnesorfoldvestre-slidreplantationvestr" + - "e-totennishiawakuravestvagoyvevelstadvibo-valentiavibovalentiavi" + - "deovillasorocabalsan-sudtirollagdenesnaaseinet-freaksolarssonvin" + - "nicasacamdvrcampinagrandebuilderschlesischesorreisahayakawakamii" + - "chikawamisatottoris-into-cartoonshinshirovinnytsiavipsinaappitts" + - "burghofficialvirginiavirtual-userveftpiwatevirtualservervirtualu" + - "servegame-servervirtueeldomein-vigorlicevirtuelvisakegawaviterbo" + - "knowsitallvivolkenkundenvixn--32vp30haibarakitahatakanabeautysva" + - "rdoesntexisteingeekazunow-dnsevenassisicilyvlaanderenvladikavkaz" + - "imierz-dolnyvladimirvlogintoyonezawavminiserversicherungvologdan" + - "skongsbergvolvolkswagentsortlandvolyngdalvoorloperauniterois-los" + - "trolekamakurazakiwakunigamiharutwentevossevangenvotevotingvotoyo" + - "nowloclawekongsvingerwmflabsorumincomcastresindevicenzaporizhzhi" + - "awnextdirectrogstadworldworse-thandawowithyoutuberspacekitagatar" + - "getmyiphostrodawarawpdevcloudwritesthisblogsytewroclawiwatsukiyo" + - "notairestaurantroandinosaurepbodynamic-dnsopotrentoyonakagyokuto" + - "yakokonoewtcminnesotaketakazakis-an-actresshinjukumanowtvallee-d" + - "-aosteigenwtfastvps-serveronakanotoddenwuozuwzmiuwajimaxn--3oq18" + - "vl8pn36axn--3pxu8koninjambylxn--42c2d9axn--45br5cylxn--45brj9civ" + - "ilisationisshinguccircleverappsanokasukabedzin-berlindasdaburxn-" + - "-45q11civilizationiyodogawaxn--4gbriminingxn--4it168dxn--4it797k" + - "onskowolayangroupictureshirahamatonbetsurnadalxn--4pvxs4allxn--5" + - "4b7fta0ccivilwarmiastagets-itozsdeltajimidorissagaeroclubmedecin" + - "cinnationwidealerxn--55qw42gxn--55qx5dxn--5js045dxn--5rtp49clanb" + - "ibaidarmeniaxn--5rtq34konsulatrobeepilepsykkylvenetodayxn--5su34" + - "j936bgsgxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlx" + - "n--7t0a264cldmailovecollegefantasyleaguernseyxn--80adxhksoundcas" + - "tronomy-routerxn--80ao21axn--80aqecdr1axn--80asehdbarrell-of-kno" + - "wledgeiseiyoichippubetsubetsugarugbyglandroverhalla-speziautosca" + - "nadaeguambulanceobninskaracoldwarszawaukraanghkeymachinewhampshi" + - "realtydalaskanittedallasalleangaviikaascolipicenodumemergencyach" + - "ts3-ca-central-1xn--80aswgxn--80augustownproviderxn--8ltr62konyv" + - "elolipopiemontexn--8pvr4uxn--8y0a063axn--90a3academiamicaaarbort" + - "eaches-yogasawaracingxn--90aeroportalabamagasakishimabaraogakibi" + - "chuoxn--90aishobarakawagoexn--90azhytomyravendbarsycenterprisesa" + - "kikuchikuseikarugamvikarasjokarasuyamarshallstatebankaratemrhclo" + - "udiscountyombolzano-altoadigeometre-experts-comptables3-us-west-" + - "1xn--9dbhblg6dietciprianiigataishinomakinkobayashikaoirmitakehar" + - "axn--9dbq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byandexc" + - "loudxn--asky-iraxn--aurskog-hland-jnbarsyonlinewhollandiscourses" + - "3-us-west-2xn--avery-yuasakuhokkaidownloadxn--b-5gaxn--b4w605fer" + - "dxn--balsan-sdtirol-nsbsouthcarolinarvikommunexn--bck1b9a5dre4cl" + - "ickasumigaurawa-mazowszextraspace-to-rentalstomakomaibaraxn--bdd" + - "dj-mrabdxn--bearalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--b" + - "hccavuotna-k7axn--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fy" + - "aotsurreyxn--bjddar-ptarnobrzegyptianxn--blt-elabourxn--bmlo-gra" + - "ingerxn--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuacade" + - "my-firewall-gatewayxn--brnnysund-m8accident-investigation-aptibl" + - "eadpagest-mon-blogueurovision-k3southwestfalenxn--brum-voagatrom" + - "sakakinokiaxn--btsfjord-9zaxn--bulsan-sdtirol-nsbashkiriaveroyke" + - "ngerdalcesurancechirealmpmnavigationavoizumizakibigawaurskog-hol" + - "andingdyniaetnabudapest-a-la-masion-riopretobamaceratabuseating-" + - "organicasadelamonedapliernewspapereportateshinanomachimkentateya" + - "mabogadobeaemcloud66xn--c1avgxn--c2br7gxn--c3s14misakis-an-anarc" + - "historicalsocietyxn--cck2b3basicservercelliguriavocatanzarowebsp" + - "acebinordreisa-geekaragandaustevoll-o-g-i-natuurwetenschappenaum" + - "burggfarmerseine164-baltimore-og-romsdalipayboltatsunobihirosaki" + - "kamijimatsuuragrocerybnikeisenbahnaturhistorisches3-ap-southeast" + - "-1kappchizip6xn--cckwcxetdxn--cesena-forl-mcbremangerxn--cesenaf" + - "orl-i8axn--cg4bkis-not-certifiedugit-pagespeedmobilizeroticahces" + - "uoloanshintokushimaxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes" + - "-v6a2oxn--correios-e-telecomunicaes-ghc29axn--czr694basilicatani" + - "avoues3-eu-west-3utilitiesquare7xn--czrs0tromsojamisonxn--czru2d" + - "xn--czrw28basketballyngenhktjeldsundiscoveryomitanoceanographiqu" + - "eu-1xn--d1acj3batochiokinoshimaizuruhrxn--d1alfaromeoxn--d1atrus" + - "teexn--d5qv7z876clinichitachinakagawashtenawdev-myqnapcloudeitys" + - "nesandvikcoromantovalle-d-aostatic-accessanfranciscofreakunemuro" + - "rangehirnrtoyotomiyazakis-a-celticsfanishinomiyashironoxn--davve" + - "njrga-y4axn--djrs72d6uyxn--djty4kooris-a-patsfanxn--dnna-grajewo" + - "lterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4cliniquenoharaxn--ec" + - "kvdtc9dxn--efvn9sowaxn--efvy88hair-surveillancexn--ehqz56nxn--el" + - "qq16hakatanortonxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct42" + - "9kopervikhersonxn--fhbeiarnxn--finny-yuaxn--fiq228c5hspeedpartne" + - "rsolognexn--fiq64batsfjordishakotanhlfanhs3-website-ap-northeast" + - "-1xn--fiqs8spjelkavikomonowruzhgorodeoxn--fiqz9spreadbettingxn--" + - "fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-ce" + - "sena-fcbsspydebergxn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandr" + - "apidsrlxn--frna-woaraisaijosoyrovigotsukisosakitagawaxn--frya-hr" + - "axn--fzc2c9e2clintonoshoesantabarbaraxn--fzys8d69uvgmailxn--g2xx" + - "48clothingdustdataitogitsuldalucernexn--gckr3f0fauskedsmokorseta" + - "gayaseralingenoamishirasatogokasells-for-lessasebofageologyxn--g" + - "ecrj9cn-northwest-1xn--ggaviika-8ya47hakodatexn--gildeskl-g0axn-" + - "-givuotna-8yasakaiminatoyookaniepcexn--gjvik-wuaxn--gk3at1exn--g" + - "ls-elacaixaxn--gmq050is-savedunetflixilxn--gmqw5axn--h-2failxn--" + - "h1aeghakonexn--h2breg3evenesrvaporcloudxn--h2brj9c8cngroks-thisa" + - "yamanobeokakegawaxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuolo-7ya" + - "35bauhausposts-and-telecommunications3-website-ap-southeast-1xn-" + - "-hery-iraxn--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accide" + - "nt-prevention-rancherkasydneyxn--hnefoss-q1axn--hobl-iraxn--holt" + - "len-hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn" + - "--i1b6b1a6a2exn--imr513nxn--indery-fyasugivingxn--io0a7is-slickh" + - "arkivalleeaosteinkjerusalembroideryxn--j1aefbsbxn--12cfi8ixb8lxn" + - "--j1amhakubahccavuotnagaraholtalenglandxn--j6w193gxn--jlq480n2rg" + - "xn--jlq61u9w7beneventoeidsvollimanowarudaxaustinnaval-d-aosta-va" + - "lleyokosukanumazuryokoteastcoastaldefenceatonsbergjemnes3-eu-cen" + - "tral-1xn--jlster-byasuokanoyakumoldeloittenrikuzentakataiwanairf" + - "orcebetsuikidsmynasushiobaragusartstorfjordxn--jrpeland-54axn--j" + - "vr189misasaguris-an-artistgoryxn--k7yn95exn--karmy-yuaxn--kbrq7o" + - "xn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dxn" + - "--kltx9axn--klty5xn--3bst00mintelligencexn--koluokta-7ya57hakuis" + - "-a-hunterxn--kprw13dxn--kpry57dxn--kpu716fbx-osaskatchewanxn--kp" + - "ut3is-uberleetrentino-sued-tirolxn--krager-gyatomitamamuraxn--kr" + - "anghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdfa" + - "stlylbanzaicloudcontrolledekagaminombresciaustraliajudaicable-mo" + - "democraciabruzzoologicalvinklein-addrammenuorochesterimo-i-ranaa" + - "mesjevuemielno-ipifonyc66xn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-" + - "fyatsukanraxn--kvnangen-k0axn--l-1fairwindstorjdevcloudnshinyosh" + - "itomiokamitondabayashiogamagoriziaxn--l1accentureklamborghinikol" + - "aeventstpetersburgxn--laheadju-7yatsushiroxn--langevg-jxaxn--lcv" + - "r32dxn--ldingen-q1axn--leagaviika-52bentleyonagoyaxn--lesund-hua" + - "xn--lgbbat1ad8jelenia-goraxn--lgrd-poacctrvareservehalflifestyle" + - "xn--lhppi-xqaxn--linds-pramericanartrycloudflarezzoxn--lns-qlaqu" + - "ilanstreamswatch-and-clockerxn--loabt-0qaxn--lrdal-sraxn--lrensk" + - "og-54axn--lt-liacnpyatigorskodjeffersonxn--lten-granexn--lury-ir" + - "axn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2ddestudioxn--mgb9" + - "awbfbxosassaris-a-democratrapaniizaxn--mgba3a3ejtrysiljanxn--mgb" + - "a3a4f16axn--mgba3a4franamizuholdingstudynamisches-dnsolundbeckom" + - "munalforbundxn--mgba7c0bbn0axn--mgbaakc7dvfedorapeoplegnicanonoi" + - "chinomiyakexn--mgbaam7a8hakusanagochijiwadell-ogliastraderxn--mg" + - "bab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00beppublishproxyzgorzelec" + - "coffeedbackplaneapplicationcloudappspotagerxn--mgbai9azgqp6jeonn" + - "amerikawauexn--mgbayh7gpaleoxn--mgbbh1a71exn--mgbc0a9azcgxn--mgb" + - "ca7dzdoxn--mgberp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4" + - "ecexposedxn--mgbpl2fhskydivingxn--mgbqly7c0a67fbcnsantacruzsanta" + - "fedjejuifmetlifeinsurancexn--mgbqly7cvafranziskanerimaringatlant" + - "akahashimamakiryuohdattowebcampinashikiminohostre-totendofintern" + - "et-dnsaliasiaxn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2beskidyn-i" + - "p24xn--mgbx4cd0abbvieeexn--mix082fedoraprojectravelchannelxn--mi" + - "x891feiraquarelleaseeklogesaudaxn--mjndalen-64axn--mk0axin-dslgb" + - "tunesor-odalxn--mk1bu44cntrani-andria-barletta-trani-andriaxn--m" + - "kru45is-very-badajozxn--mlatvuopmi-s4axn--mli-tlarvikoryokamikaw" + - "anehonbetsurutaharaxn--mlselv-iuaxn--moreke-juaxn--mori-qsakurag" + - "awaxn--mosjen-eyawaraxn--mot-tlavagiskexn--mre-og-romsdal-qqbuse" + - "rveexchangexn--msy-ula0haldenxn--mtta-vrjjat-k7aflakstadaokagaki" + - "cks-assnasaarlandxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngb" + - "e9e0axn--ngbrxn--3ds443gxn--nit225kosaigawaxn--nmesjevuemie-tcba" + - "lsan-suedtirolkuszczytnoipirangalsacexn--nnx388axn--nodessakurai" + - "s-very-evillagexn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--nts" + - "q17gxn--nttery-byaeservehttpixolinoxn--nvuotna-hwaxn--nyqy26axn-" + - "-o1acheltenham-radio-openairbusantiquest-a-la-maisondre-landroid" + - "xn--o3cw4halsaikitahiroshimaoris-a-knightpointtohobby-sitexn--o3" + - "cyx2axn--od0algxn--od0aq3bestbuyshouses3-website-ap-southeast-2x" + - "n--ogbpf8flekkefjordxn--oppegrd-ixaxn--ostery-fyawatahamaxn--osy" + - "ro-wuaxn--otu796dxn--p1acfermochizukirovogradoyxn--p1ais-very-go" + - "odyearxn--pbt977coguchikuzenxn--pgbs0dhlxn--porsgu-sta26ferrarax" + - "n--pssu33lxn--pssy2uxn--q9jyb4collectionxn--qcka1pmckinseyxn--qq" + - "qt11misconfusedxn--qxa6axn--qxamuneustargardxn--rady-iraxn--rdal" + - "-poaxn--rde-ulavangenxn--rdy-0nabaris-very-nicexn--rennesy-v1axn" + - "--rhkkervju-01aferraris-a-designerxn--rholt-mragowoodsidemoneyxn" + - "--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeamericanan" + - "tiquestuff-4-salexn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rms" + - "kog-byaxn--rny31hammarfeastafricapetownnews-stagingxn--rovu88bet" + - "ainaboxfusejnyonagunicommbankaratsuginamikatagamilitaryoriikarel" + - "ianceu-2xn--rros-granvindafjordxn--rskog-uuaxn--rst-0naturalhist" + - "orymuseumcenterxn--rsta-francaiseharaxn--rvc1e0am3exn--ryken-vua" + - "xn--ryrvik-byaxn--s-1faithamurakamigoris-a-landscaperugiaxn--s9b" + - "rj9colognexus-2xn--sandnessjen-ogbhzcateringebuildingjesdalimite" + - "diskussionsbereichaseljeepsondriodejaneirockartuzyoshiokanzakiyo" + - "kawaraxn--sandy-yuaxn--sdtirol-n2axn--seral-lraxn--ses554gxn--sg" + - "ne-gratangenxn--skierv-utazastufftoread-booksnesolutionsokananii" + - "mihoboleslawiecitadeliveryggeexn--skjervy-v1axn--skjk-soaxn--skn" + - "it-yqaxn--sknland-fxaxn--slat-5naturalsciencesnaturellestuttgart" + - "revisohughesomaxn--slt-elabcieszynxn--smla-hraxn--smna-gratis-a-" + - "bulls-fanxn--snase-nraxn--sndre-land-0cbieigersundisrechtraining" + - "jovikariyaltakasugaincheonikonanporocpanamatsuzakindianapolis-a-" + - "anarchistoireggiocalabriaxn--snes-poaxn--snsa-roaxn--sr-aurdal-l" + - "8axn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbielawalmartjm" + - "axxxboxenapponazure-mobileu-3xn--srfold-byaxn--srreisa-q1axn--sr" + - "um-grazxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbiellaa" + - "kesvuemielecceu-4xn--stre-toten-zcbieszczadygeyachimataikikugawa" + - "ltervistaprinternationalfirearms3-website-eu-west-1xn--t60b56axn" + - "--tckweatherchannelxn--tiq49xqyjetztrentino-suedtirolxn--tjme-hr" + - "axn--tn0agrinetbankosakaerodromegallupinbarrel-of-knowledgestack" + - "arasjohkamikoaniikappuboliviajessheimetacentrumeteorappalmaserat" + - "in-the-bandain-vpncasinordkappalmspringsakerevistaples3-us-gov-w" + - "est-1xn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol" + - "-rzbievat-band-campaniaxn--trentin-sdtirol-7vbifukagawashingtond" + - "clkarlsoyukindianmarketingladefinimakanegasakiraxn--trentino-sd-" + - "tirol-c3bigv-infoodnetworkangerxn--trentino-sdtirol-szbihorology" + - "ukuhashimoichinosekigaharaxn--trentinosd-tirol-rzbikedaejeonbukl" + - "ugsmileborkdalvdalaheadjudygarlandivtasvuodnakaiwamizawatchandcl" + - "ockarmoyurihonjournalistjohninohekinannestadivttasvuotnakamagaya" + - "habahcavuotnagaivuotnagaokakyotambabydgoszczecinemagentositelema" + - "rkarpaczeladzjampagefrontappanasonicatholicaxiashorokanaievje-og" + - "-hornnes3-website-sa-east-1xn--trentinosdtirol-7vbilbaokinawashi" + - "rosatochigiessensiositecnologiaxn--trentinsd-tirol-6vbillustrati" + - "onredumbrellahppiacenzachpomorskieninomiyakonojorpelandiyusuhara" + - "xn--trentinsdtirol-nsbioddaxn--trgstad-r1axn--trna-woaxn--troms-" + - "zuaxn--tysvr-vraxn--uc0atvarggatritonxn--uc0ay4axn--uist22handso" + - "nyoursidellogliastradingxn--uisz3gxn--unjrga-rtarumizusawaxn--un" + - "up4yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbtunkomvuxn--2scrj9" + - "christmasakindlefrakkestadyndns-homednsanjotoyouraxn--valle-d-ao" + - "ste-ehbodollsusakis-into-gamessinazawaxn--valleaoste-e7axn--vall" + - "edaoste-ebbvacationsusonoxn--vard-jraxn--vegrshei-c0axn--vermgen" + - "sberater-ctbirdartcenterprisecloudcontrolapplebtimnetzlglassassi" + - "nationalheritagexn--vermgensberatung-pwbirkenesoddtangenovaranza" + - "nquanpachigasakievennodesabaerobatickets3-website-us-east-1xn--v" + - "estvgy-ixa6oxn--vg-yiabkhaziaxn--vgan-qoaxn--vgsy-qoa0jevnakersh" + - "uscultureggioemiliaromagnamsosnowiechristiansburgriwataraidyndns" + - "-freeboxosloftranakaniikawatanaguraxn--vgu402colonialwilliamsbur" + - "grondarxn--vhquvaroyxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadx" + - "n--vry-yla5gxn--vuq861birthplacexn--w4r85el8fhu5dnraxn--w4rs40lx" + - "n--wcvs22dxn--wgbh1coloradoplateaudioxn--wgbl6axn--xhq521bjarkoy" + - "usuisservehumourxn--xkc2al3hye2axn--xkc2dl3a5ee0hangglidingxn--y" + - "9a3aquariumishimasudaxn--yer-znaturbruksgymnxn--yfro4i67oxn--yga" + - "rden-p1axn--ygbi2ammxn--3e0b707exn--ystre-slidre-ujbjerkreimbamb" + - "lebesbyeniwaizumiotsukumiyamazonawsmpplanetariumemorialillyolasi" + - "tebizenakanojoetsuwanouchikujogaszkolancashirecreationavuotnaple" + - "s3-external-1xn--zbx025dxn--zf0ao64axn--zf0avxn--3hcrj9civilavia" + - "tionissedaluccapitalonewportlligatoystre-slidrettozawaxn--zfr164" + - "bjugnieznord-frontierxnbayxz" + "eksvikaracoldwarszawabogadobeaemcloud66bjarkoyusuharabjerkreimdb" + + "altimore-og-romsdalipayokozebizenakanotoddenavuotnarashinobninsk" + + "aragandaustevoll-o-g-i-naval-d-aosta-valleyboltateshinanomachimk" + + "entateyamagrocerybnikeisenbahn4tatarantours3-ap-northeast-2ix443" + + "2-balsan-suedtirolkuszczytnoipirangamvik12bjugnieznord-frontierb" + + "lackfridayusuisservehumourbloombergbauernishiazaindielddanuorrin" + + "digenamsosnowiechernihivgubs3-website-sa-east-1bloxcms3-website-" + + "us-east-1bluedaemoneyuu2-localhostoregontrailroadrayddnsfreebox-" + + "osascoli-picenordre-landraydns3-website-us-west-1bmoattachments3" + + "-website-us-west-2bms5yuzawabmwedeploybnrwegroweibolognagasakind" + + "eroybomloabathsbchernivtsiciliabondrivefsnillfjordrobaknoluoktac" + + "hikawakuyabukievennodesadoes-itvedestrandrudupontariobranconakan" + + "iikawatanagurabonnishigoddabookinghostfoldnavyboomlair-traffic-c" + + "ontrolleyboschaefflerdalivornohtawaramotoineppueblockbustermezja" + + "mpagefrontapparachutinglobalashovhachinohedmarkarpaczeladzlglobo" + + "avistanbulsan-sudtirolombardynaliaskimitsubatamibugattiffanycher" + + "novtsymantechnologybostikaruizawabostonakijinsekikogentappsselfi" + + "paraglidinglogoweirbotanicalgardenishiharabotanicgardenishiizuna" + + "zukindustriabotanynysagaeroclubmedecincinnationwidealerbouncemer" + + "ckmsdnipropetrovskjervoyageometre-experts-comptablesakyotanabell" + + "unord-aurdalpha-myqnapcloudaccesscambridgeiseiyoichippubetsubets" + + "ugarugbydgoszczecinemagentositecnologiabounty-fullensakerryprope" + + "rtiesalangenishikatakinoueboutiquebechirurgiens-dentistes-en-fra" + + "ncebozen-sudtirolomzaporizhzhegurindustriesteamfamberkeleybozen-" + + "suedtirolondrinapleskarumaifarmsteadurbanamexhibitionishikatsura" + + "git-reposalondonetskasaokamiminersaltdalorenskogloppenzaolbia-te" + + "mpio-olbiatempioolbialystokkepnogatagajobojinfinitintelligencebp" + + "lacedogawarabikomaezakirunorddalotenkawabrandywinevalleybrasilia" + + "brindisibenikindlebtimnetzparisor-fronishikawazukamisunagawabris" + + "toloseyouriparliamentjomeloyalistoragebritishcolumbialowiezagani" + + "shimerabroadcastleclerchiryukyuragifuchungbukharavennagatorodoyb" + + "roadwaybroke-itjxfinitybrokerbronnoysundurhamburglugmbhartipscbg" + + "minakamichiharabrothermesaverdealstahaugesunderseaportsinfolldal" + + "ottebrowsersafetymarketsaludweberbrumunddalottokonamegatakazakin" + + "ternationalfirearmsalvadordalibabalena-devicesalzburgmodellingmx" + + "javald-aostarnbergretakanabeautysvardoesntexisteingeekashibataka" + + "tsukiyosatokamachintaifun-dnsdojolsterbrunelastxn--0trq7p7nnishi" + + "nomiyashironomutashinaintuitkmaxxn--11b4c3dynathomebuiltwithdark" + + "ashiharabrusselsamegawabruxellesamnangerbryansklepparmattelekomm" + + "unikationishinoomotegobrynewhollandyndns-at-homedepotenzamamidsu" + + "ndyndns-at-workisboringrimstadyndns-blogdnsampalacebuskerudinewj" + + "erseybuzentsujiiebuzzwellbeingzonebwfarsundyndns-freeboxosloftra" + + "nakanojoetsuwanouchikujogaszkolancashirecreationishinoshimatsuur" + + "abzhitomirumalatvuopmicrolightingripebzzcommunexus-2community-pr" + + "ochowicecomoarekecomparemarkerryhotelsantacruzsantafedjejuifmetl" + + "ifeinsurancecompute-1computerhistoryofscience-fictioncomsecurity" + + "tacticsantamariakecondoshichinohealth-carereformitakeharaconfere" + + "nceconstructionconsuladonnaharimalopolskanlandyndns-remotewdyndn" + + "s-serverisignconsultanthropologyconsultingrpartycontactozsdeltaj" + + "irittogliattis-a-caterercontagematsubaracontemporaryarteducation" + + "alchikugodontexistmein-iservebeercontractorskenconventureshinode" + + "arthruherecipescaravantaacookingchannelsdvrdnsfor-better-thanawa" + + "tchandclockasukabedzin-berlindasdaburcooluroycooperativano-frank" + + "ivskolefrakkestadyndns-webhopencraftrani-andria-barletta-trani-a" + + "ndriacopenhagencyclopedichofunatoriginstitutemasekashiwaracoprod" + + "uctionsantoandreamhostersanukis-a-celticsfancorsicagliaricoharuo" + + "vatraniandriabarlettatraniandriacorvettemp-dnsaobernardocosenzak" + + "opanecosidnshome-webserverdalutskasumigaurawa-mazowszexnetnedalu" + + "xurycostumedicinakaiwamizawatchesaogoncartoonartdecologiacouchpo" + + "tatofriesaotomeldaluzerncouklugsmilegallocus-3councilvivanovolda" + + "couponsapporocq-acranbrookuwanalyticsardegnarusawacrdyndns-wikir" + + "kenesardiniacreditcardyndns-workshopitsitexaskoyabearalvahkikuch" + + "ikuseikarugalsacecreditunioncremonashgabadaddjaguarqcxn--12cfi8i" + + "xb8lcrewildlifedorainfracloudfrontdoorcricketrzyncrimeast-kazakh" + + "stanangercrotonecrownipasadenaritakurashikis-a-chefashioncrsvpas" + + "sagensarlcruisesarpsborgruecryptonomichigangwoncuisinellajollame" + + "ricanexpressexyculturalcentertainmentranoycuneocupcakecuritiback" + + "yardsarufutsunomiyawakasaikaitakofuefukihaboromskoguidegreecurva" + + "lled-aostaverncymrussiacyonabaruminamidaitomanchestercyouthachio" + + "jiyahooguyfetsundynnsasayamafgujohanamakinoharafhvalerfidoomdnst" + + "racefieldynservebbsasebofagemologicallyngenfigueresinstagingulen" + + "filateliafilegear-audnedalnfilegear-deatnulvikatowicefilegear-gb" + + "izfilegear-iefilegear-jpmorganfilegear-sgunmanxn--1ck2e1bananare" + + "publicasertairaumalborkarasjohkamikoaniikappuboliviajessheimemor" + + "ialaziobserverevistaples3-external-1filminamifuranofinalfinancef" + + "ineartsavonarutomobellevuelosangelesjabbottransurlfinlandynufcfa" + + "nfinnoyfirebaseappatriafirenzefirestonefirmdalegoldpoint2thisami" + + "tsukefishingolffansaxofitjarvodkafjordynv6fitnessettlementrapani" + + "izafjalerflesberguovdageaidnunusualpersonflickragerogerschoenbru" + + "nnflightschokokekschokoladenflirfloginlinefloraflorencefloridats" + + "unanjoburgushikamifuranorth-kazakhstanfloripaderbornfloristanoha" + + "takaharunzenflorokunohealthcareerscholarshipschoolschulezajskats" + + "ushikabeeldengeluidynvpnplus-4flowerschulserverfltravelchannelfl" + + "ynnhosting-clusterfndyroyrvikinguitarsaskatchewanfor-ourfor-some" + + "dizinhistorischeschwarzgwangjuniperfor-theaterforexrothachirogat" + + "akanezawaforgotdnschweizforli-cesena-forlicesenaforlillehammerfe" + + "ste-ipaviancarrdforsaleikangerforsandasuologoipfizerfortalfortmi" + + "ssoulancasterfortworthadanorthwesternmutualfosnesciencecentersci" + + "encehistoryfotaruis-a-cubicle-slavellinodeobjectscientistordalfo" + + "xfordebianfozorafredrikstadtvscjohnsonfreeddnsgeekgalaxyfreedesk" + + "topocznore-og-uvdalfreemasonryfreesitextileirfjordfreetlscotland" + + "freiburgwiddleitungsenfreseniuscountryestateofdelawareggio-calab" + + "riafribourgxn--1ctwolominamatarnobrzegyptianfriuli-v-giuliafriul" + + "i-ve-giuliafriuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiu" + + "liafriuli-vgiuliafriuliv-giuliafriulive-giuliafriulivegiuliafriu" + + "livenezia-giuliafriuliveneziagiuliafriulivgiuliafrlfroganscrappe" + + "r-sitefrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azfrom-capetow" + + "nnews-stagingfrom-coffeedbackplaneapplinzis-a-democratravelersin" + + "surancefrom-ctrdfrom-dchonanbulsan-suedtirolowiczest-le-patronis" + + "hitosashimizunaminamibosogndalpusercontentoyotapartsandnessjoeni" + + "shiwakinvestmentsandoyfrom-dedyn-berlincolnfrom-flanderscrapping" + + "from-gaulardalfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfr" + + "om-in-brbanzaicloudcontrolledekagaminombresciaustraliamusementdl" + + "lpages3-ap-south-1kappchizip6116-b-dataiji234lima-cityeatselinog" + + "radult3l3p0rtatamotors3-ap-northeast-1337from-kscrysechoseiroumu" + + "enchenissandiegofrom-kyowariasahikawafrom-lanciafrom-mamurogawaf" + + "rom-mdfrom-meeresistancefrom-mifunefrom-mnfrom-modalenfrom-mserv" + + "eirchoshibuyachiyodapliernewspaperfrom-mtnfrom-nctulangevagrigen" + + "tomologyeonggiehtavuoatnagahamaroyerfrom-ndfrom-nefrom-nh-serveb" + + "logsiteleafamilycompanyanagawafflecellclaimserveminecraftrentin-" + + "sud-tirolfrom-njaworznoticiasnesoddenmarkhangelskjakdnepropetrov" + + "skiervaapsteiermarkatsuyamarugame-hostrowiechoyodobashichikashuk" + + "ujitawarafrom-nminamiiserniafrom-nvalledaostargetmyiphostrodawar" + + "afrom-nyfrom-ohkurafrom-oketogurafrom-orfrom-padovaksdalfrom-pra" + + "tohmandalfrom-ris-a-designerfrom-schmidtre-gauldalfrom-sdfrom-tn" + + "from-txn--1lqs03nfrom-utsiracusaikisarazurecontainerdpolicefrom-" + + "val-daostavalleyfrom-vtrentin-sudtirolfrom-wafrom-wielunnerfrom-" + + "wvallee-aosteroyfrom-wyfrosinonefrostalowa-wolawafroyahikobierzy" + + "cefstcgroupgfoggiafujiiderafujikawaguchikonefujiminokamoenairlin" + + "edre-eikerfujinomiyadattowebcampinashikiminohostre-totendofinter" + + "net-dnsaliasiafujiokayamangonohejis-a-doctorayfujisatoshonairpor" + + "tland-4-salernoboribetsuckservemp3fujisawafujishiroishidakabirat" + + "oridefenseljordfujitsurugashimangyshlakasamatsudovre-eikerfujixe" + + "roxn--1lqs71dfujiyoshidavvenjargap-northeast-3fukayabeatservep2p" + + "harmacienservepicservequakefukuchiyamadavvesiidappnodebalancerti" + + "ficationfukudominichristiansburgrondarfukuis-a-financialadvisor-" + + "aurdalfukumitsubishigakishiwadazaifudaigojomedio-campidano-medio" + + "campidanomediofukuokazakisofukushimaniwakuratefukuroishikarikatu" + + "rindalfukusakisosakitagawafukuyamagatakahatakaishimoichinosekiga" + + "harafunabashiriuchinadafunagatakamatsukawafunahashikamiamakusats" + + "umasendaisennangooglecodespotrentin-sued-tirolfundaciofuoiskujuk" + + "uriyamannorfolkebibleirvikaufenfuosskoczowilliamhillfurnitureggi" + + "o-emilia-romagnakatombetsumitakagiizefurubirafurudonostiaafuruka" + + "wairtelebitbridgestonekobayashikshacknetcimbarcelonagawalmartatt" + + "oolforgehimejiitatebayashijonawatempresashibetsukuiiyamanouchiku" + + "hokuryugasakitaurayasudaustrheimatunduhrennesoyokosukanumazuryok" + + "oteastcoastaldefenceatonsbergjerdrumemergencyachts3-ca-central-1" + + "fusodegaurafussaintlouis-a-anarchistoireggiocalabriafutabayamagu" + + "chinomigawafutboldlygoingnowhere-for-morenakatsugawafuttsurugimp" + + "eriafuturecmservesarcasmatartanddesignfuturehostingfuturemailing" + + "fvgfylkesbiblackbaudcdn77-securebungoonord-odalfyresdalhangoutsy" + + "stemscloudhannanmokuizumodenaklodzkochikushinonsenergyhannosegaw" + + "ahanyuzenhapmircloudharstadharvestcelebrationhasamarburghasamina" + + "mi-alpsharis-a-hunterhashbanghasudahasura-appharmacysharphdfcban" + + "kazoologyhasvikazunow-dnshawaiijimaritimoduminamimakis-a-knightp" + + "ointtohobby-sitehatogayaitakaokalmykiahatoyamazakitakamiizumisan" + + "ofidelityhatsukaichikaiseiheijis-a-landscaperugiahattfjelldalhay" + + "ashimamotobungotakadagestangeorgeorgiahazuminobusells-for-usrcfa" + + "stlylbamblebesbyglandroverhalla-speziaustinnavigationavoizumizak" + + "ibigawajudaicable-modemocraciabruzzoologicalvinklein-addrammenuo" + + "rochesterimo-i-ranaamesjevuemielno-ipifonyaaarborteaches-yogasaw" + + "aracingdyniaetnabudapest-a-la-masion-riopretobamaceratabuseating" + + "-organic66helsinkitakatakarazukaluganskygearapphiladelphiaareadm" + + "yblogspotrentino-a-adigehembygdsforbundhemneshellaspeziahemsedal" + + "hepforgeherokussldheroyhgtvallee-d-aosteigenhidorahigashiagatsum" + + "agoianiahigashichichibunkyonanaoshimageandsoundandvisionthewifia" + + "tmallorcadaqueshimokawahigashihiroshimanehigashiizumozakitakyush" + + "uaiahigashikagawahigashikagurasoedahigashikawakitaaikitamihamada" + + "higashikurumeetrentino-aadigehigashimatsushimarcheapigeelvinckdd" + + "iethnologyhigashimatsuyamakitaakitadaitoigawahigashimurayamamoto" + + "rcycleshimokitayamahigashinarusells-itrentino-alto-adigehigashin" + + "ehigashiomihachimanagementrentino-altoadigehigashiosakasayamanak" + + "akogawahigashishirakawamatakasagoppdalhigashisumiyoshikawaminami" + + "aikitamotosumy-gatewayhigashitsunoshiroomurahigashiurausukitanak" + + "agusukumodernhigashiyamatokoriyamanashiibahccavuotnagareyamainte" + + "nancehigashiyodogawahigashiyoshinogaris-a-lawyerhiraizumisatohno" + + "shoooshikamaishimofusartshimonitayanagithubusercontentrentino-s-" + + "tirolhirakatashinagawahiranairtrafficplexus-1hirarahiratsukagawa" + + "hirayaizuwakamatsubushikusakadogawahistorichouseshimonosekikawah" + + "itachiomiyagildeskaliszhitachiotagotembaixadahitraeumtgeradelmen" + + "horstalbanshimosuwalkis-a-liberalhjartdalhjelmelandholeckodairah" + + "olidayhomeiphilatelyhomelinkitoolsztynsettlershimotsukehomelinux" + + "n--1qqw23ahomeofficehomesecuritymacaparecidahomesecuritypchristm" + + "aseratiresandvikcoromantovalle-d-aostatic-accessanfranciscofreak" + + "unemurorangehirnrtoyotomiyazakinzais-a-candidatehomesenseeringho" + + "meunixn--2m4a15ehondahongotpantheonsitehonjyoitakasakitashiobara" + + "hornindalhorsellsyourhomegoodshimotsumahorteneis-a-libertarianho" + + "spitalhoteleshinichinanhotmailhoyangerhoylandetroitskypehumaniti" + + "eshinjournalismailillesandefjordhurdalhurumajis-a-linux-useranis" + + "hiaritabashikaoirminamiminowahyllestadhyogoris-a-llamarriottrent" + + "ino-stirolhyugawarahyundaiwafuneis-very-badajozis-very-evillagei" + + "s-very-goodyearis-very-niceis-very-sweetpepperis-with-thebandois" + + "leofmanaustdaljevnakershuscultureggioemiliaromagnamsskoganeis-a-" + + "nascarfanjewelryjewishartgalleryjfkharkivalleedaostejgorajlljls-" + + "sto1jmphotographysiojnjcphonefosshintomikasaharajoyentrentino-su" + + "edtiroljoyokaichibajddarchitecturealtorlandjpnjprshiojirishirifu" + + "jiedajurkosherbrookegawakoshimizumakizunokunimimatakayamarylandk" + + "oshunantankhersonkosugekotohiradomainsurehabmerkotourakouhokutam" + + "akis-a-patsfankounosupplieshirakokaminokawanishiaizubangekouyama" + + "shikekouzushimashikis-a-personaltrainerkozagawakozakis-a-photogr" + + "apherokuapphilipsyno-dshinjukumanowtvalleeaosteinkjerusalembroid" + + "erykozowindmillkpnkppspdnshiranukamitsuekrasnikahokutokashikis-a" + + "-playershifteditchyouriphoenixn--2scrj9chromedicaltanissettaishi" + + "nomakinkobeardubaiduckdnsangokrasnodarkredstonekristiansandcatsh" + + "iraois-a-republicancerresearchaeologicaliforniakristiansundkrods" + + "heradkrokstadelvaldaostarostwodzislawindowskrakowinnershiraokamo" + + "gawakryminamioguni5kumatorinokumejimasoykumenantokigawakunisakis" + + "-a-rockstarachowicekunitachiarailwaykunitomigusukumamotoyamashik" + + "okuchuokunneppubtlshiratakahagitlaborkunstsammlungkunstunddesign" + + "kuokgroupilotshishikuis-a-socialistdlibestadkureisenkurgankurobe" + + "laudibleasingleshisognekurogiminamiashigarakuroisoftwarezzokurom" + + "atsunais-a-soxfankurotakikawasakis-a-studentalkushirogawakustana" + + "is-a-teacherkassyncloudkusupplykutchanelkutnokuzumakis-a-techiet" + + "is-a-musiciankvafjordkvalsundkvamlidlugolekadenagaivuotnagaokaky" + + "otambabyenebakkeshibechambagriculturennebudejjuedischesapeakebay" + + "ernukvanangenkvinesdalkvinnheradkviteseidatingkvitsoykwpspectrum" + + "inamisanrikubetsurfastvps-serveronakasatsunairguardiannakadomari" + + "nebraskauniversitychyattorneyagawakembuchikumagayagawakkanaibets" + + "ubamericanfamilydsclouderackmazerbaijan-mayen-rootaribeiraogashi" + + "madachicagoboatsassaris-a-conservativegarsheis-a-cpadualstackher" + + "o-networkinggroupassenger-associationkzmissileluxembourgmisugito" + + "kuyamatsumotofukemitourismolanxesshitaramamitoyoakemiuramiyazure" + + "websiteshikagamiishibukawamiyotamanomjondalenmlbfanmontrealestat" + + "efarmequipmentrentinoa-adigemonza-brianzapposhizukuishimogosenmo" + + "nza-e-della-brianzaptokyotangotsukitahatakamoriokakegawamonzabri" + + "anzaramonzaebrianzamonzaedellabrianzamoonscaleforcemordoviamoriy" + + "amatsunomoriyoshiminamiawajikis-an-actormormonstermoroyamatsusak" + + "ahoginankokubunjis-an-actresshinshinotsurgerymortgagemoscowioshi" + + "zuokanagawamoseushistorymosjoenmoskeneshoppingmosshopwarendalenu" + + "gmosvikhmelnytskyivaomoteginowaniihamatamakawajimansionshoujis-a" + + "n-anarchistoricalsocietymoviemovimientolgamozilla-iotrentinoaadi" + + "gemtranbymuenstermuginozawaonsenmuikamisatokaizukamikitayamatsur" + + "is-an-artistgorymukoebenhavnmulhouseoullensvanguardmunakatanemun" + + "cienciamuosattemupimientakkoelnmurmanskhplaystation-cloudmurotor" + + "craftrentinoalto-adigemusashimurayamatsushigemusashinoharamuseet" + + "rentinoaltoadigemuseumverenigingmusicargodaddyn-vpndnshowamutsuz" + + "awamy-vigorgemy-wanggouvichungnamdalseidfjordyndns-mailubindalub" + + "lindesnesanjotoyotsukaidomyactivedirectorymyasustor-elvdalmycdn7" + + "7-sslattuminamitanemydattolocalhistorymyddnskingmydissentrentino" + + "s-tirolmydobisshikis-an-engineeringmydroboehringerikemydshowtime" + + "lhusdecorativeartshriramsterdamnserverbaniamyeffectrentinostirol" + + "myfastly-terrariuminamiuonumasudamyfirewallonieruchomoscienceand" + + "industrynmyforuminamiyamashirokawanabelembetsukubankhmelnitskiya" + + "marumorimachidamyfritzmyftpaccesshwitdklabudhabikinokawabarthads" + + "electrentin-suedtirolmyhome-servermyjinomykolaivaporcloudmymaile" + + "rmymediapchurcharternidyndns-office-on-the-webhareidsbergentingr" + + "ongausdalucaniamyokohamamatsudamypepinkmpspbarclays3-sa-east-1my" + + "petsienarviikamishihoronobeauxartsandcraftsigdalmyphotoshibalati" + + "nogiftsilknx-serversailleshioyandexcloudmypictetrentinosud-tirol" + + "mypsxn--32vp30haebaruericssongdalenviknakayamaoris-a-geekautokei" + + "notteroymysecuritycamerakermyshopblocksimple-urlmytis-a-bookkeep" + + "erspectakasugais-an-entertainermytuleaprendemasakikonaikawachina" + + "ganoharamcoachampionshiphoptobishimadridvagsoygardendoftheintern" + + "etlifyis-bytomaritimekeepingmyvncircustomer-ociprianiigataitogit" + + "suldaluccarbonia-iglesias-carboniaiglesiascarboniamywirepbodynam" + + "ic-dnsirdalplatformshangrilapyplatter-appioneerplatterpippugliap" + + "lazaplcube-serversicherungplumbingoplurinacionalpodhalevangerpod" + + "lasiellaktyubinskiptveterinaireadthedocscappgafannefrankfurtrent" + + "inosudtirolpodzonepohlpoivronpokerpokrovskomakiyosunndalpolitica" + + "rrierpolitiendapolkowicepoltavalle-aostathellewismillerpomorzesz" + + "owithgoogleapiszponpesaro-urbino-pesarourbinopesaromasvuotnaroyp" + + "onypordenonepornporsangerporsangugeporsgrunnanyokoshibahikariwan" + + "umatamayufuelveruminanopoznanpraxis-a-bruinsfanprdpreservationpr" + + "esidioprgmrprimelbourneprincipeprivatizehealthinsuranceprofesion" + + "alprogressivenneslaskerrylogisticslupskomatsushimarylhurstjordal" + + "shalsenpromombetsurgeonshalloffameiwamassa-carrara-massacarraram" + + "assabusinessebyklecznagasukepropertyprotectionprotonetrentinosue" + + "d-tirolprudentialpruszkowithyoutuberspacekitagatargivestbytemark" + + "omforbarefootballooningjerstadotsuruokakamigaharauthordalandds3-" + + "eu-central-1prvcyberlevagangaviikanonjis-certifieducatorahimeshi" + + "mamateramobaraprzeworskogptplusgardenpulawypupittsburghofficialp" + + "vhagakhanamigawapvtrentinosuedtirolpwcistrondheimmobilienissayok" + + "kaichiropractichitachinakagawassamukawatarightathomeftparocherni" + + "governmentksatxn--12c1fe0bradescorporationrenderpzqhagebostadqld" + + "qponiatowadaqslingqualifioappiwatequickconnectrentinsud-tirolqui" + + "cksytestingquipelementslzqvcitadeliveryggeesusonosuzakanazawasuz" + + "ukaneyamazoesuzukis-into-animegurownprovidersvalbardunloppacific" + + "ivilaviationissedalucernesveiosvelvikomorotsukaminoyamaxunjargas" + + "vizzerasvn-reposologneswidnicasacamdvrcampinagrandebuilderschles" + + "ischesolundbeckommunalforbundswidnikkokonoeswiebodzin-butterswif" + + "tcoverswinoujscienceandhistoryswissmarterthanyousynology-disksta" + + "tionsynology-dsolutionsnoasakakinokiaturystykanmakiwientuscanytu" + + "shuissier-justicetuvalle-daostaticsootuxfamilytwmailvestnesopotr" + + "entinsudtirolvestre-slidreviewsaitoshimayfirstockholmestrandvest" + + "re-totennishiawakuravestvagoyvevelstadvibo-valentiavibovalentiav" + + "ideovillasor-odalvinnicasadelamonedancevinnytsiavipsinaappixolin" + + "ovirginiavirtual-userveftpizzavirtualservervirtualuservegame-ser" + + "vervirtueeldomein-vigorlicevirtuelvisakegawaviterboknowsitallviv" + + "olkenkundenvixn--3bst00miniservervlaanderenvladikavkazimierz-dol" + + "nyvladimirvlogintoyonezawavminnesotaketaketomisatokorozawavologd" + + "anskongsbergvolvolkswagentsor-varangervolyngdalvoorloperaunitero" + + "is-into-carshinshirovossevangenvotevotingvotoyonowmflabsorfoldwn" + + "extdirectroandinosaureplantationworldworse-thandawowiwatsukiyono" + + "tairestaurantritonwpdevcloudwritesthisblogsytewroclawloclawekong" + + "svingerwtcminterepaircraftingvollombardiamondshisuifuettertdasne" + + "tzwtfauskedsmokorsetagayaseralingenoamishirasatogokasells-for-le" + + "ssaudawuozuwzmiuwajimaxn--42c2d9axn--45br5cylxn--45brj9civilizat" + + "ionxn--45q11civilwarmiastagets-itoyouraxn--4gbriminingxn--4it168" + + "dxn--4it797konskowolayangroupictureshirahamatonbetsurnadalxn--4p" + + "vxs4allxn--54b7fta0cclanbibaidarmeniaxn--55qw42gxn--55qx5dxn--5j" + + "s045dxn--5rtp49cldmailovecollegefantasyleaguernseyxn--5rtq34kons" + + "ulatrobeepilepsykkylvenetodayxn--5su34j936bgsgxn--5tzm5gxn--6btw" + + "5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264clic20001wwwhosw" + + "hokksundyndns-picsannohelplfinancialukowiiheyakagexn--80adxhksor" + + "ocabalestrandabergamo-siemensncfdxn--80ao21axn--80aqecdr1axn--80" + + "asehdbarreauction-webhostingjesdalillyolasitemrxn--80aswgxn--80a" + + "ugustowmcloudxn--8ltr62konyvelolipopiemontexn--8pvr4uxn--8y0a063" + + "axn--90a3academiamicaarpkomaganexn--90aeroportalabamagasakishima" + + "baraogakibichuoxn--90aishobarakawagoexn--90azhytomyravendbarrel-" + + "of-knowledgeapplicationcloudappspotagerxn--9dbhblg6digitalxn--9d" + + "bq2axn--9et52uxn--9krt00axn--andy-iraxn--aroport-byaotsurreyxn--" + + "asky-iraxn--aurskog-hland-jnbarrell-of-knowledgestackarasjokaras" + + "uyamarshallstatebankarateu-1xn--avery-yuasakuhokkaidownloadxn--b" + + "-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbsorreisahayakawakamiichi" + + "kawamisatottoris-foundationxn--bck1b9a5dre4clickashiwazakiyosemi" + + "texn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jxaxn--bhcavuotna" + + "-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn--bievt-0qa2xn--" + + "bjarky-fyasakaiminatoyookaniepcexn--bjddar-ptarumizusawaxn--blt-" + + "elabourxn--bmlo-graingerxn--bod-2nativeamericanantiquesortlandxn" + + "--bozen-sdtirol-2obanazawaxn--brnny-wuacademy-firewall-gatewayxn" + + "--brnnysund-m8accident-investigation-aptibleadpagest-mon-blogueu" + + "rovision-k3sorumincomcastresindevicenzaporizhzhiaxn--brum-voagat" + + "rogstadxn--btsfjord-9zaxn--bulsan-sdtirol-nsbarsycenterprisesaki" + + "kugawaltervistaikimobetsuitainaioirasebastopologyeongnamegawakay" + + "amagazineat-urlimanowarudautomotiveconomiasakuchinotsuchiurakawa" + + "lesundeportevadsobetsumidatlanticaseihicampobassociatest-iservec" + + "ounterstrikebinagisoccertmgrazimutheworkpccwebredirectmembers3-e" + + "u-west-1xn--c1avgxn--c2br7gxn--c3s14misakis-a-therapistoiaxn--cc" + + "k2b3barsyonlinewhampshirealtysnes3-us-gov-west-1xn--cckwcxetdxn-" + + "-cesena-forl-mcbremangerxn--cesenaforl-i8axn--cg4bkis-into-carto" + + "onshintokushimaxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a" + + "2oxn--correios-e-telecomunicaes-ghc29axn--czr694bashkiriautoscan" + + "adaeguambulanceobihirosakikamijimatsuzakibmdevelopmentatsunobira" + + "ukraanghkeymachineustargardd-dnsiskinkyotobetsulikes-piedmontice" + + "llodingenatuurwetenschappenaumburggfarmerseine164-balsfjorddnsli" + + "velanddnss3-ap-southeast-1xn--czrs0tromsakataobaomoriguchiharahk" + + "keravjuegoshikijobservableusercontentrentinsuedtirolxn--czru2dxn" + + "--czrw28basicservercelliguriaveroykenglandgcahcesuoloans3-eu-wes" + + "t-2xn--d1acj3basilicataniavocatanzarowebspacebinordreisa-hockeyn" + + "utazuerichardlikescandyn53utilitiesquare7xn--d1alfaromeoxn--d1at" + + "romsojamisonxn--d5qv7z876clinichocolatelevisionishiokoppegardynd" + + "ns-ipartinuyamashinatsukigatakashimarnardalouvreitoyosatoyokawax" + + "n--davvenjrga-y4axn--djrs72d6uyxn--djty4kooris-a-nursembokukitch" + + "enxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e1a4cl" + + "iniquenoharaxn--eckvdtc9dxn--efvn9soundcastronomy-routerxn--efvy" + + "88haibarakitahiroshimapartmentservicesevastopolexn--ehqz56nxn--e" + + "lqq16hair-surveillancexn--eveni-0qa01gaxn--f6qx53axn--fct429kope" + + "rvikharkovanylvenicexn--fhbeiarnxn--finny-yuaxn--fiq228c5hsouthc" + + "arolinatalxn--fiq64basketballfinanzgoravoues3-eu-west-3xn--fiqs8" + + "southwestfalenxn--fiqz9sowaxn--fjord-lraxn--fjq720axn--fl-ziaxn-" + + "-flor-jraxn--flw351exn--forl-cesena-fcbsspeedpartnersokananiimih" + + "oboleslawiecitichitosetogakushimotoganewportlligatmparsamsclubar" + + "towhalingriwataraidyndns-homednsamsungroks-thisayamanobeokakudam" + + "atsuexn--forlcesena-c8axn--fpcrj9c3dxn--frde-grandrapidspjelkavi" + + "komonowruzhgorodeoxn--frna-woaraisaijosoyrorospreadbettingxn--fr" + + "ya-hraxn--fzc2c9e2clintonoshoesanokasserverrankoshigayameinforum" + + "zxn--fzys8d69uvgmailxn--g2xx48clothingdustdataiwanairforcebetsui" + + "kidsmynasushiobaragusabaejrietisalatinabenonicbcn-north-1xn--gck" + + "r3f0fbsbxn--12co0c3b4evalleaostavangerxn--gecrj9cn-northwest-1xn" + + "--ggaviika-8ya47hakatanortonxn--gildeskl-g0axn--givuotna-8yasugi" + + "vingxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-into-ga" + + "messinazawaxn--gmqw5axn--h-2failxn--h1aeghakodatexn--h2breg3even" + + "espydebergxn--h2brj9c8cngrossetouchihayaakasakawaharaxn--h3cuzk1" + + "discountyxn--hbmer-xqaxn--hcesuolo-7ya35batochiokinoshimakeupowi" + + "at-band-campaniaxaurskog-holandingjemnes3-ap-southeast-2xn--hery" + + "-iraxn--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4accident-pr" + + "evention-rancherkasydneyxn--hnefoss-q1axn--hobl-iraxn--holtlen-h" + + "xaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b" + + "6b1a6a2exn--imr513nxn--indery-fyasuokanoyakumoldeloittenrikuzent" + + "akatajimidorissagamiharaxn--io0a7is-leetrentino-sud-tirolxn--j1a" + + "efbx-osauheradyndns1xn--j1amhakonexn--j6w193gxn--jlq480n2rgxn--j" + + "lq61u9w7batsfjordiscoveryombolzano-altoadigeologyomitanoceanogra" + + "phics3-us-west-1xn--jlster-byatomitamamuraxn--jrpeland-54axn--jv" + + "r189misasaguris-an-accountantshinkamigotoyohashimototalxn--k7yn9" + + "5exn--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-w" + + "oaxn--klt787dxn--kltp7dxn--kltx9axn--klty5xn--3ds443gxn--koluokt" + + "a-7ya57hakubahcavuotnagaraholtaleniwaizumiotsukumiyamazonawsmppl" + + "anetariuminamiizukamiokameokameyamatotakadaxn--kprw13dxn--kpry57" + + "dxn--kpu716fbxosavannahgaxn--kput3is-lostrolekamakurazakiwakunig" + + "amiharustkannamilanotogawaxn--krager-gyatsukanraxn--kranghke-b0a" + + "xn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdfastpanelbla" + + "grarchaeologyeongbuk0emmafann-arboretumbriamallamaceiobbcg12038x" + + "n--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatsushiroxn--kvnangen-k0" + + "axn--l-1fairwindsrlxn--l1accentureklamborghinikolaeventsrvareser" + + "vehalflifestylexn--laheadju-7yawaraxn--langevg-jxaxn--lcvr32dxn-" + + "-ldingen-q1axn--leagaviika-52bauhausposts-and-telecommunications" + + "3-us-west-2xn--lesund-huaxn--lgbbat1ad8jelasticbeanstalkhakassia" + + "xn--lgrd-poacctrusteexn--lhppi-xqaxn--linds-pramericanartrvargga" + + "trentoyonakagyokutoyakolobrzegersundxn--lns-qlaquilanstorfjordxn" + + "--loabt-0qaxn--lrdal-sraxn--lrenskog-54axn--lt-liacnpyatigorskod" + + "jeffersonxn--lten-granexn--lury-iraxn--m3ch0j3axn--mely-iraxn--m" + + "erker-kuaxn--mgb2ddestorjdevcloudnshinyoshitomiokamitondabayashi" + + "ogamagoriziaxn--mgb9awbfedorapeoplegnicapebretonamicrosoftbankas" + + "uyanaizulminamiechizenxn--mgba3a3ejtrycloudflareportrevisohughes" + + "omaxn--mgba3a4f16axn--mgba3a4franamizuholdingstpetersburgxn--mgb" + + "a7c0bbn0axn--mgbaakc7dvfedoraprojectransportexn--mgbaam7a8hakuis" + + "-a-greenxn--mgbab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00beneventoe" + + "idskoguchikuzenayorovigovtaxihuanflfanfshostrowwlkpmgjovikaratsu" + + "ginamikatagamilitaryonagoyaxn--mgbai9azgqp6jelenia-goraxn--mgbay" + + "h7gpaleoxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgberp4a5" + + "d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgbpl2f" + + "hskydivingxn--mgbqly7c0a67fbcnsantabarbaraxn--mgbqly7cvafranzisk" + + "anerimaringatlantakahashimamakiryuohdattorelayxn--mgbt3dhdxn--mg" + + "btf8flatangerxn--mgbtx2bentleyonagunicommbankarelianceu-2xn--mgb" + + "x4cd0abbvieeexn--mix082feiraquarelleaseeklogesaves-the-whalessan" + + "dria-trani-barletta-andriatranibarlettaandriaxn--mix891fermochiz" + + "ukirovogradoyxn--mjndalen-64axn--mk0axin-dslgbtrysiljanxn--mk1bu" + + "44cntoystre-slidrettozawaxn--mkru45is-not-certifiedugit-pagespee" + + "dmobilizeroticanonoichinomiyakexn--mlatvuopmi-s4axn--mli-tlarvik" + + "oryokamikawanehonbetsurutaharaxn--mlselv-iuaxn--moreke-juaxn--mo" + + "ri-qsakuragawaxn--mosjen-eyawatahamaxn--mot-tlavagiskexn--mre-og" + + "-romsdal-qqbuserveexchangexn--msy-ula0hakusanagochijiwadell-ogli" + + "astraderxn--mtta-vrjjat-k7aflakstadaokagakicks-assnasaarlandxn--" + + "muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3e0b" + + "707exn--nit225kosaigawaxn--nmesjevuemie-tcbalsan-sudtirollagdene" + + "snaaseinet-freakstreamswatch-and-clockerxn--nnx388axn--nodessaku" + + "rais-savedunetflixilxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn" + + "--ntsq17gxn--nttery-byaeservehttplantsjcbnpparibaselburgxn--nvuo" + + "tna-hwaxn--nyqy26axn--o1acheltenham-radio-openairbusantiquest-a-" + + "la-maisondre-landroidxn--o3cw4haldenxn--o3cyx2axn--od0algxn--od0" + + "aq3beppublishproxyzgorzeleccogladefinimakanegasakiraxn--ogbpf8fl" + + "ekkefjordxn--oppegrd-ixaxn--ostery-fyaxn--osyro-wuaxn--otu796dxn" + + "--p1acferraraxn--p1ais-slickfhappoutwentexn--pbt977collectionxn-" + + "-pgbs0dhlxn--porsgu-sta26ferrarivnexn--pssu33lxn--pssy2uxn--q9jy" + + "b4colognewyorkshirecifedexeterxn--qcka1pmckinseyxn--qqqt11miscon" + + "fusedxn--qxa6axn--qxamuneuestudioxn--rady-iraxn--rdal-poaxn--rde" + + "-ulavangenxn--rdy-0nabaris-uberleetrentino-sudtirolxn--rennesy-v" + + "1axn--rhkkervju-01aferrerotikagoshimalvikaszubyxn--rholt-mragowo" + + "odsidemonmouthalsaitamatsukuris-a-guruslivinghistoryxn--rhqv96gx" + + "n--rht27zxn--rht3dxn--rht61exn--risa-5naturalhistorymuseumcenter" + + "xn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny31h" + + "ammarfeastafricapitalonewmexicodyn-o-saurlandesevenassisicilyxn-" + + "-rovu88beskidyn-ip24xn--rros-granvindafjordxn--rskog-uuaxn--rst-" + + "0naturalsciencesnaturellestudynamisches-dnsokndalxn--rsta-franca" + + "iseharaxn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithamur" + + "akamigoris-a-hard-workersewinbarclaycards3-fips-us-gov-west-1xn-" + + "-s9brj9colonialwilliamsburgroundhandlingroznyxn--sandnessjen-ogb" + + "estbuyshouses3-website-ap-northeast-1xn--sandy-yuaxn--sdtirol-n2" + + "axn--seral-lraxn--ses554gxn--sgne-graphoxn--3hcrj9civilisationis" + + "shinguccircleverappsannaniyodogawaxn--skierv-utazastuff-4-salexn" + + "--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland-fxaxn--slat-5n" + + "aturbruksgymnxn--slt-elabcieszynxn--smla-hraxn--smna-gratangentl" + + "entapisa-geekosakaerodromegallupinbargainstantcloudfunctionswede" + + "nvironmentalconservationfabricafederationionjukudoyamaizuruhrhcl" + + "oudiscourses3-us-east-2xn--snase-nraxn--sndre-land-0cbetainaboxf" + + "usejnymemsettsupportcp4xn--snes-poaxn--snsa-roaxn--sr-aurdal-l8a" + + "xn--sr-fron-q1axn--sr-odal-q1axn--sr-varanger-ggbhzcasinordkappa" + + "lmasfjordenhktjeldsundishakotanhlfanhs3-website-ap-southeast-1xn" + + "--srfold-byaxn--srreisa-q1axn--srum-gratis-a-bulls-fanxn--stfold" + + "-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbieidsvollimitediskussio" + + "nsbereichaseljeepsondriodejaneirockartuzyoriikariyaltakatorin-th" + + "e-bandain-vpncateringebuildinglassassinationalheritageu-3xn--str" + + "e-toten-zcbielawashingtondclkarlsoyoshiokanzakiyokawaraxn--t60b5" + + "6axn--tckweatherchannelxn--tiq49xqyjeonnamerikawauexn--tjme-hrax" + + "n--tn0agrinetbankoseis-a-painteractivegaskvollxn--tnsberg-q1axn-" + + "-tor131oxn--trany-yuaxn--trentin-sd-tirol-rzbiellaakesvuemielecc" + + "eu-4xn--trentin-sdtirol-7vbrplsbxn--3oq18vl8pn36axn--trentino-sd" + + "-tirol-c3bieszczadygeyachimataipeigersundisrechtrainingleezevje-" + + "og-hornnes3-website-ap-southeast-2xn--trentino-sdtirol-szbievath" + + "letajimabaridagawalbrzycharitydalcesurancechirealmpmnikonanporov" + + "noceanographiquextraspace-to-rentalstomakomaibaraxn--trentinosd-" + + "tirol-rzbifukagawashtenawdev-myqnapcloudeitysfjordivtasvuodnakam" + + "agayahabaghdadivttasvuotnakamuratakahamalselvendrellimoliseminex" + + "n--trentinosdtirol-7vbigv-infoodnetworkangerxn--trentinsd-tirol-" + + "6vbihorologyukincheoninohekinannestadiyukuhashimojindianapolis-a" + + "-bloggerxn--trentinsdtirol-nsbikedaejeonbukcoalvdalaheadjudygarl" + + "andnpalmspringsakerxn--trgstad-r1axn--trna-woaxn--troms-zuaxn--t" + + "ysvr-vraxn--uc0atvaroyxn--uc0ay4axn--uist22handsonyoursidellogli" + + "astradingxn--uisz3gxn--unjrga-rtashkentunesomnarvikommunexn--unu" + + "p4yxn--uuwu58axn--vads-jraxn--valle-aoste-ebbtunkomvuxn--30rr7yx" + + "n--valle-d-aoste-ehbodollstufftoread-booksnesolarssonxn--valleao" + + "ste-e7axn--valledaoste-ebbvacationstuttgartrentinsued-tirolxn--v" + + "ard-jraxn--vegrshei-c0axn--vermgensberater-ctbilbaokinawashirosa" + + "tochigiessensiositelemarkarmoyurihonjournalistjohninomiyakonojor" + + "pelandrangedalinkyard-cloudyclusterxn--vermgensberatung-pwbillus" + + "trationredumbrellahppiacenzachpomorskienirasakindianmarketinglit" + + "chattanooganordlandray-dnsupdaternopilawaweddingliwicexn--vestvg" + + "y-ixa6oxn--vg-yiabkhaziaxn--vgan-qoaxn--vgsy-qoa0jetztrentino-su" + + "ed-tirolxn--vgu402coloradoplateaudioxn--vhquvestfoldxn--vler-qoa" + + "xn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5gxn--vuq861biocpanama" + + "tta-varjjatjmaxxxboxenapponazure-mobilexn--w4r85el8fhu5dnraxn--w" + + "4rs40lxn--wcvs22dxn--wgbh1columbusheyxn--wgbl6axn--xhq521birdart" + + "centerprisecloudcontrolappleborkdalwaysdatabaseballangenkainanae" + + "robatickets3-website-eu-west-1xn--xkc2al3hye2axn--xkc2dl3a5ee0ha" + + "ngglidingxn--y9a3aquariumishimatsumaebashimodatexn--yer-znaturhi" + + "storischesusakis-gonexn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn-" + + "-3pxu8koninjambylxn--ystre-slidre-ujbirkenesoddtangenovaranzanqu" + + "anpachigasakihokumakogengerdalaskanittedallasalleangaviikaascoli" + + "picenodumetacentrumeteorappanasonicatholicaxiashorokanaiexn--zbx" + + "025dxn--zf0ao64axn--zf0avxlxn--zfr164birthplacexnbayxz" // nodes is the list of nodes. Each node is represented as a uint32, which // encodes the node's children, wildcard bit and node type (as an index into @@ -524,1809 +526,1818 @@ const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijoinvill" // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x32ce03, - 0x243304, - 0x2d7946, - 0x215803, - 0x215806, - 0x38b3c6, - 0x3ae643, - 0x246d44, - 0x341047, - 0x2d7588, + 0x297a83, + 0x32a504, + 0x2eadc6, + 0x24c943, + 0x24c946, + 0x38b146, + 0x3b05c3, + 0x214bc4, + 0x201507, + 0x2eaa08, 0x1a000c2, - 0x1f3aec7, - 0x377a09, - 0x2c628a, - 0x2c628b, - 0x231b43, - 0x233805, - 0x2203042, - 0x212284, - 0x2d7ac3, - 0x203045, - 0x260c6c2, - 0x3290c3, - 0x2b22c44, - 0x33f285, - 0x2e0c182, - 0x26d6ce, - 0x24e5c3, - 0x3a36c6, - 0x3206082, - 0x2fd2c7, - 0x236086, - 0x3602982, - 0x27f103, - 0x27f104, - 0x397646, - 0x36bf08, - 0x288086, - 0x270104, + 0x1f36987, + 0x376649, + 0x36c4ca, + 0x36c4cb, + 0x201203, + 0x233985, + 0x2201602, + 0x2d2044, + 0x2eaf43, + 0x269045, + 0x2601742, + 0x343083, + 0x2a135c4, + 0x2982c5, + 0x2e0de42, + 0x26e24e, + 0x250b83, + 0x3a6286, + 0x3203082, + 0x306087, + 0x2372c6, + 0x3606bc2, + 0x27f943, + 0x27f944, + 0x399b86, + 0x35bc88, + 0x286046, + 0x26fc84, 0x3a00ac2, - 0x34cb09, - 0x2171c7, - 0x344986, - 0x28dfc9, - 0x32fa48, - 0x34b444, - 0x3947c6, - 0x336a46, - 0x3e03582, - 0x3da686, - 0x24070f, - 0x2112ce, - 0x217bc4, - 0x20d005, - 0x32cd05, - 0x2e1b49, - 0x23b549, - 0x397e47, - 0x3cffc6, - 0x28e143, - 0x4212082, - 0x2232c3, - 0x28da0a, - 0x4613583, - 0x3cea45, - 0x299082, - 0x38c209, - 0x4e02282, - 0x213c04, - 0x21fb46, - 0x2fff45, - 0x36db84, - 0x5643344, - 0x225843, - 0x232b84, - 0x5a03342, - 0x31fd84, - 0x5f8a244, - 0x2fe64a, + 0x34abc9, + 0x2236c7, + 0x202446, + 0x353689, + 0x32f208, + 0x2478c4, + 0x23f2c6, + 0x3c3846, + 0x3e041c2, + 0x36fcc6, + 0x242f4f, + 0x2d108e, + 0x219a44, + 0x218b45, + 0x32a405, + 0x2e7589, + 0x23d709, + 0x39a387, + 0x3ddf06, + 0x267243, + 0x42037c2, + 0x21adc3, + 0x35054a, + 0x460f283, + 0x3d95c5, + 0x29d282, + 0x38b6c9, + 0x4e01182, + 0x201c84, + 0x2f3146, + 0x28a745, + 0x36d1c4, + 0x560fbc4, + 0x220dc3, + 0x232d04, + 0x5a02d02, + 0x235784, + 0x5e79284, + 0x33cb4a, 0x6200882, - 0x21ef47, - 0x27afc8, - 0x7204c82, - 0x2f6e47, - 0x2c2b84, - 0x2c2b87, - 0x3d6805, - 0x362187, - 0x2e73c6, - 0x27d8c4, - 0x328e45, - 0x256407, - 0x8a05802, - 0x3da803, - 0x21e182, - 0x369a03, - 0x8e09bc2, - 0x281705, - 0x9200202, - 0x3c2844, - 0x277445, - 0x217b07, - 0x2fdfce, - 0x2b1044, - 0x261dc4, - 0x20e5c3, - 0x251789, - 0x265f0b, - 0x273788, - 0x28dd88, - 0x2e53c8, - 0x28c008, - 0x34b28a, - 0x362087, - 0x276586, - 0x9615842, - 0x2be403, - 0x3cab03, - 0x3cd244, - 0x2be443, - 0x28ca83, - 0x1736f42, - 0x9a019c2, - 0x27e945, - 0x313dc6, - 0x2335c4, - 0x379907, - 0x263e46, - 0x2bfa04, - 0x399647, - 0x2019c3, - 0x9ecb4c2, - 0xa227682, - 0xa627442, - 0x227446, - 0xaa00282, - 0x285845, - 0x338483, - 0x3bfc44, - 0x2eddc4, - 0x2eddc5, - 0x3c7543, - 0xae48343, - 0xb338dc2, - 0x203c05, - 0x203c0b, - 0x20b24b, - 0x26bb44, - 0x204a09, - 0x205f44, - 0xb606802, - 0x207043, - 0x207183, - 0xba08082, - 0x2ed8ca, - 0xbe08342, - 0x212505, - 0x2de9ca, - 0x35cc04, - 0x208343, - 0x209ec4, - 0x20ba03, - 0x20ba04, - 0x20ba07, - 0x20c585, - 0x20d346, - 0x213006, - 0x213cc3, - 0x217f48, - 0x20db43, - 0xc209582, - 0x23d4c8, - 0x20958b, - 0x221cc8, - 0x222a86, - 0x224447, - 0x226fc8, - 0xd205b82, - 0xd6c1142, - 0x33f3c8, - 0x20f9c7, - 0x30f645, - 0x30f648, - 0xdadcf48, - 0x27ff43, - 0x22a104, - 0x38b442, - 0xde2a542, - 0xe243bc2, - 0xea2a8c2, - 0x22a8c3, - 0xee04042, - 0x30e303, - 0x237484, - 0x204043, - 0x206444, - 0x37454b, - 0x2094c3, - 0x2e94c6, - 0x27f404, - 0x2ba20e, - 0x381e45, - 0x3a37c8, - 0x3dd347, - 0x3dd34a, - 0x22f603, - 0x243107, - 0x2660c5, - 0x22f604, - 0x250206, - 0x250207, - 0x2fc304, - 0xf30f084, - 0x2fe304, - 0x2fe306, - 0x3db9c4, - 0x3ba486, - 0x226e03, - 0x3a8908, - 0x3c38c8, - 0x291d83, - 0x2ed883, - 0x346ac4, - 0x358183, - 0xfa09382, - 0xfe8b742, - 0x20b983, - 0x240d86, - 0x329383, - 0x35b7c4, - 0x102179c2, - 0x24a583, - 0x2179c3, - 0x214c82, - 0x10600d42, - 0x2c5c86, - 0x2344c7, - 0x2f8407, - 0x3a9405, - 0x207484, - 0x29bac5, - 0x267347, - 0x3cb009, - 0x2db306, - 0x2ea9c6, - 0x10a02c82, - 0x331448, - 0x31f486, - 0x34ebc5, - 0x3ac387, - 0x306104, - 0x306105, - 0x10e02c84, - 0x202c88, - 0x11203cc2, - 0x11600482, - 0x21d746, - 0x200488, - 0x335f85, - 0x34d406, - 0x351b08, - 0x35b088, - 0x11a07d45, - 0x11e25744, - 0x322d47, - 0x122059c2, - 0x1268cac2, - 0x13a0c302, - 0x21fc45, - 0x284a05, - 0x384006, - 0x326507, - 0x3a80c7, - 0x1422c0c3, - 0x318887, - 0x3a4548, - 0x1f22c289, - 0x26d887, - 0x22c9c7, - 0x22d408, - 0x22dc06, - 0x22f106, - 0x23000c, - 0x230d0a, - 0x231b87, - 0x2336cb, - 0x234307, - 0x23430e, - 0x1f635404, - 0x235604, - 0x237347, - 0x25bfc7, - 0x23ac06, - 0x23ac07, - 0x333e47, - 0x2e4003, - 0x1fa2ae02, - 0x23bec6, - 0x23beca, - 0x23c90b, - 0x23e487, - 0x23ef05, - 0x23f443, - 0x23f946, - 0x23f947, - 0x2ef083, - 0x1fe00102, - 0x24038a, - 0x20378f82, - 0x20661482, - 0x20a3d1c2, - 0x20e36182, - 0x242505, - 0x242cc4, - 0x21659dc2, - 0x31fe05, - 0x23cf03, - 0x2954c5, - 0x2028c4, - 0x20a204, - 0x280186, - 0x27e0c6, - 0x203e03, - 0x3bcfc4, - 0x2f8703, - 0x226081c2, - 0x2247c4, - 0x3232c6, - 0x2247c5, - 0x244086, - 0x3ac488, - 0x22b144, - 0x36b888, - 0x322805, - 0x37f488, - 0x2c24c6, - 0x3049c7, - 0x287804, - 0x23a87806, - 0x23ee85c3, - 0x39c943, - 0x2ec108, - 0x331344, - 0x24361707, - 0x24abe846, - 0x2dbb09, - 0x330048, - 0x34b8c8, - 0x355644, - 0x3c6d83, - 0x23cfc2, - 0x24e4cfc2, - 0x25201d42, - 0x204583, - 0x2560a782, - 0x2ef004, - 0x24ad06, - 0x21af83, - 0x2b6387, - 0x2f7443, - 0x334888, - 0x2101c5, - 0x259203, - 0x2773c5, - 0x277504, - 0x305e06, - 0x2127c6, - 0x217a46, - 0x2203c4, - 0x2346c3, - 0x25a05202, - 0x25e2ec05, - 0x200843, - 0x2660f4c2, - 0x22c243, - 0x373605, - 0x26a32c43, - 0x27232c49, - 0x27600942, - 0x27e04282, - 0x28b045, - 0x215e46, - 0x205606, - 0x2cf508, - 0x2cf50b, - 0x32ed0b, - 0x3a9605, - 0x2cbc09, - 0x1600b42, - 0x2cfc08, - 0x204d04, - 0x28601bc2, - 0x34a603, - 0x28e5c186, - 0x33e208, - 0x29201a02, - 0x28c608, - 0x29609802, - 0x33c4ca, - 0x29a46e03, - 0x2a378046, - 0x3910c8, - 0x330906, - 0x387087, - 0x240907, - 0x3365ca, - 0x35cc84, - 0x35fe04, - 0x376889, - 0x2a7a7545, + 0x3c1f47, + 0x2d0548, + 0x76031c2, + 0x328287, + 0x2c9044, + 0x2c9047, + 0x3d57c5, + 0x378847, + 0x303c06, + 0x2f0e44, + 0x342e05, + 0x257187, + 0x8e01482, + 0x36fe43, + 0x9226782, + 0x3633c3, + 0x9606b42, + 0x274985, + 0x9a00202, + 0x2cd104, + 0x2c23c5, + 0x219987, + 0x249e0e, + 0x2b6e44, + 0x290f44, + 0x210603, + 0x286ac9, + 0x3aa74b, + 0x2edac8, + 0x303148, + 0x3b1888, + 0x3d9ac8, + 0x3534ca, + 0x378747, + 0x2cdf46, + 0x9e47402, + 0x374d83, + 0x3ccac3, + 0x3ce604, + 0x374dc3, + 0x35cb83, + 0x1732182, + 0xa2016c2, + 0x27cd05, + 0x224686, + 0x233744, + 0x38a5c7, + 0x2355c6, + 0x2c8984, + 0x3abfc7, + 0x215dc3, + 0xa6d5bc2, + 0xaa20f82, + 0xae20d42, + 0x220d46, + 0xb200282, + 0x284405, + 0x3336c3, + 0x3c8744, + 0x2f7784, + 0x2f7785, + 0x3d6d83, + 0xb602703, + 0xba019c2, + 0x205fc5, + 0x205fcb, + 0x20ec0b, + 0x229904, + 0x206689, + 0x208244, + 0xbe09c42, + 0x20a483, + 0x20a703, + 0xc202e82, + 0x398a0a, + 0xc601542, + 0x2d22c5, + 0x2e6a0a, + 0x247584, + 0x20b103, + 0x20b7c4, + 0x20d6c3, + 0x20d6c4, + 0x20d6c7, + 0x20e245, 0x2114c6, - 0x20fbc3, - 0x24bd04, - 0x2aa0d644, - 0x344147, - 0x2aee3587, - 0x293104, - 0x236cc5, - 0x3840c8, - 0x3a03c7, - 0x243547, - 0x2b20c202, - 0x298d44, - 0x294348, - 0x2443c4, - 0x249204, - 0x249b85, - 0x249cc7, - 0x2b658549, - 0x24a804, - 0x24b0c9, - 0x24b308, - 0x24ba84, - 0x24ba87, - 0x2ba4cdc3, - 0x24d2c7, - 0x2be014c2, - 0x16b1b82, - 0x24df86, - 0x24e607, - 0x24e884, - 0x24f687, - 0x250647, - 0x2510c3, - 0x2b12c2, - 0x20bcc2, - 0x28de83, - 0x3be3c4, - 0x3be3cb, - 0x2c28de88, - 0x258bc4, - 0x254205, - 0x255c47, - 0x238a05, - 0x2d908a, - 0x258b03, - 0x2c603d42, - 0x20da44, - 0x25bd89, - 0x2601c3, - 0x260287, - 0x2683c9, - 0x3de348, - 0x23e2c3, - 0x27c387, - 0x27ce49, - 0x266883, - 0x284fc4, - 0x286209, - 0x289406, - 0x2c7d43, - 0x2076c2, - 0x235c83, - 0x2b1987, - 0x235c85, - 0x3b8806, - 0x26e144, - 0x3cc645, - 0x279803, - 0x213f06, - 0x210dc3, - 0x204c02, - 0x248304, - 0x2ca6bc02, - 0x2ce6bc03, - 0x2d2020c2, - 0x247603, - 0x213484, - 0x239bc7, - 0x216586, - 0x278042, - 0x2d65c582, - 0x3ac684, - 0x2da0bb82, - 0x2de063c2, - 0x2b36c4, - 0x2b36c5, - 0x27d545, - 0x366a06, - 0x2e204882, - 0x3bd645, - 0x3cedc5, - 0x204883, - 0x21a286, - 0x21b845, - 0x2273c2, - 0x35acc5, - 0x2273c4, - 0x22b083, - 0x22b2c3, - 0x2e61d302, - 0x256607, - 0x24b504, - 0x24b509, - 0x24bc04, - 0x284883, - 0x39bf88, - 0x2ea84884, - 0x284886, - 0x2a6b43, - 0x254c43, - 0x228b03, - 0x2eeedc82, - 0x302342, - 0x2f200642, - 0x339f48, - 0x301408, - 0x3aedc6, - 0x272945, - 0x2802c5, - 0x345387, - 0x2f677f05, - 0x220482, - 0x2fa97642, - 0x2fe00042, - 0x278cc8, - 0x31f3c5, - 0x2f3e44, - 0x243fc5, - 0x245547, - 0x27a1c4, - 0x240282, - 0x30205702, - 0x352784, - 0x222f47, - 0x28cf47, - 0x362144, - 0x3cc143, - 0x291cc4, - 0x291cc8, - 0x22f446, - 0x25008a, - 0x2eb544, - 0x296008, - 0x242ec4, - 0x224546, - 0x297604, - 0x21ff46, - 0x24b7c9, - 0x2a62c7, - 0x2087c3, - 0x306033c2, - 0x34b643, - 0x206a02, - 0x30a17d82, - 0x2fb0c6, - 0x380708, - 0x2a8787, - 0x26ad49, - 0x2ad689, - 0x2aa9c5, - 0x2abd49, - 0x2ac545, - 0x2ad385, - 0x2ae008, - 0x30e04104, - 0x31251207, - 0x22cd83, - 0x2ae207, - 0x22cd86, - 0x2ae607, - 0x2a5e45, - 0x22c603, - 0x31630ac2, - 0x208584, - 0x31a0adc2, - 0x31e04742, - 0x3ae186, - 0x27af45, - 0x2b0587, - 0x2fef43, - 0x28ca04, - 0x201e83, - 0x20f703, - 0x32203dc2, - 0x32a01cc2, - 0x38b4c4, - 0x3881c3, - 0x2fbf45, - 0x32e00f42, - 0x33602b82, - 0x2d5c86, - 0x2fdf04, - 0x303f04, - 0x303f0a, - 0x33e005c2, - 0x263f43, - 0x20cd0a, - 0x214388, - 0x34224e44, - 0x2005c3, - 0x34601803, - 0x266ac9, - 0x24d8c9, - 0x2b6486, - 0x34a14543, - 0x36f705, - 0x3b62cd, - 0x214546, - 0x219e4b, - 0x34e129c2, - 0x394608, - 0x38218042, - 0x38604dc2, - 0x2b3905, - 0x38a01742, - 0x2c67c7, - 0x214903, - 0x21ba08, - 0x38e02cc2, - 0x219384, - 0x20ff03, - 0x2f7ac5, + 0x211846, + 0x2124c3, + 0x217688, + 0x208f03, + 0xca0cd42, + 0x308648, + 0x2862cb, + 0x21ffc8, + 0x2205c6, + 0x2213c7, + 0x227208, + 0xda07682, + 0xde1d482, + 0x298408, + 0x210c07, + 0x30dcc5, + 0x30dcc8, + 0xe301108, + 0x26c243, + 0x22a444, + 0x38b1c2, + 0xe62a882, + 0xea16182, + 0xf22c042, + 0x22c043, + 0xf6086c2, + 0x296303, + 0x3b2744, + 0x2086c3, + 0x247884, + 0x296a4b, + 0x215843, + 0x2f1486, + 0x278704, + 0x2c340e, + 0x38f345, + 0x261e48, + 0x3a6387, + 0x3a638a, + 0x22f983, + 0x2343c7, + 0x3aa905, + 0x22f984, + 0x2526c6, + 0x2526c7, + 0x31a204, + 0xfb0d704, + 0x24a144, + 0x33c806, + 0x22b844, + 0x3b5cc6, + 0x232443, + 0x3ba348, + 0x3df888, + 0x290f03, + 0x3989c3, + 0x340384, + 0x355943, + 0x10215702, + 0x1068d502, + 0x218043, + 0x2435c6, + 0x343343, + 0x30c504, + 0x10a3fec2, + 0x24cf43, + 0x327783, + 0x212c02, + 0x10e00d42, + 0x2cb886, + 0x234807, + 0x3c25c7, + 0x3b91c5, + 0x3d3004, + 0x29fbc5, + 0x2253c7, + 0x2ade49, + 0x2c19c6, + 0x2ec246, + 0x1120b682, + 0x2f4b48, + 0x3ae1c6, + 0x2aed85, + 0x30a6c7, + 0x3562c4, + 0x3562c5, + 0x11668c84, + 0x268c88, + 0x11a06082, + 0x11e00482, + 0x26e986, + 0x200488, + 0x331ac5, + 0x34b646, + 0x34ef88, + 0x35b788, + 0x12201805, + 0x126136c4, + 0x2136c7, + 0x12a07cc2, + 0x12e167c2, + 0x14201242, + 0x2f3245, + 0x14a83545, + 0x262486, + 0x323647, + 0x39f087, + 0x14e14a83, + 0x338487, + 0x38a948, + 0x2022cd09, + 0x26e407, + 0x22d447, + 0x22e548, + 0x22ed46, + 0x22f486, + 0x2300cc, + 0x23180a, + 0x231c07, + 0x23384b, + 0x234647, + 0x23464e, + 0x20635944, + 0x235b44, + 0x238b07, + 0x25c7c7, 0x23d006, - 0x21e244, - 0x2ed843, - 0x2b26c3, - 0x392163c2, - 0x3a9584, - 0x3b77c5, - 0x2b1587, - 0x279c43, - 0x2b2183, - 0x16b2242, - 0x2b2243, - 0x2b2643, - 0x39600e02, - 0x246b84, - 0x27e2c6, - 0x3cba43, - 0x2b2d43, - 0x39a48902, - 0x248908, - 0x2b3d84, - 0x20ed06, - 0x255087, - 0x270906, - 0x291e84, - 0x47e01b82, - 0x22cc4b, - 0x2f91ce, - 0x216c0f, - 0x292e43, - 0x48659902, - 0x163ea82, - 0x48a017c2, - 0x296583, - 0x20e883, - 0x2dd4c6, - 0x3cb286, - 0x2b0187, - 0x30b0c4, - 0x48e11902, - 0x492106c2, - 0x245005, - 0x2f1887, - 0x2b47c6, - 0x496526c2, - 0x2526c4, - 0x2b93c3, - 0x49a4e082, - 0x49f72383, - 0x2bac04, - 0x2c1d89, - 0x4a2c8c82, - 0x4a601882, - 0x201885, - 0x4aac9182, - 0x4ae03c42, - 0x35f107, - 0x377c8b, - 0x2406c5, - 0x2570c9, - 0x268746, - 0x4b207844, - 0x328949, - 0x2c9cc7, - 0x32a547, - 0x22abc3, - 0x2b3546, - 0x3246c7, - 0x20a443, - 0x291246, - 0x4ba23342, - 0x4be1d702, - 0x34b783, - 0x38c3c5, - 0x221587, - 0x3cb386, - 0x235c05, - 0x24b484, - 0x2a4d05, - 0x38cf44, - 0x4c201b02, - 0x2c71c4, - 0x267f44, - 0x38830d, - 0x37adc9, - 0x22aec8, - 0x201b04, - 0x3dad85, - 0x3a8e87, - 0x206504, - 0x263f07, - 0x2eb205, - 0x4c607b04, - 0x2a8b45, - 0x25ee84, - 0x27a306, - 0x35f885, - 0x4ca26902, - 0x21d6c3, - 0x28f783, - 0x348084, - 0x348085, - 0x37c586, - 0x235d45, - 0x3d3284, - 0x32c043, - 0x4ce0a6c6, - 0x225045, - 0x225c85, - 0x326404, - 0x2eb5c3, - 0x2eb5cc, - 0x4d204482, - 0x4d601442, - 0x4da03102, - 0x20e403, - 0x20e404, - 0x4de05f82, - 0x380d88, - 0x3b88c5, - 0x2c93c4, - 0x23aa86, - 0x4e217002, - 0x4e6115c2, - 0x4ea00c42, - 0x291a85, - 0x220286, - 0x20d584, - 0x397b86, - 0x21ed06, - 0x221983, - 0x4ee9e10a, - 0x279e05, - 0x28d9c3, - 0x2254c6, - 0x3bd449, - 0x2254c7, - 0x2a9c48, - 0x32f909, - 0x3b9e48, - 0x303706, - 0x20e583, - 0x4f21fc02, - 0x39dc88, - 0x4f644502, - 0x4fa06a42, - 0x238cc3, - 0x2e2a45, - 0x29b404, - 0x2f5d89, - 0x32acc4, - 0x3dabc8, - 0x50206a43, - 0x507749c4, - 0x215e88, - 0x388247, - 0x50a52742, - 0x22e302, - 0x32cc85, - 0x261b89, - 0x211543, - 0x27fcc4, - 0x36f6c4, - 0x20e903, - 0x2812ca, - 0x50f40d82, - 0x512083c2, - 0x2cb443, - 0x38f5c3, - 0x162c142, - 0x2bdc03, - 0x5161d902, - 0x51a00bc2, - 0x51f03f84, - 0x3b3506, - 0x269884, - 0x278b03, - 0x3bf203, - 0x52200bc3, - 0x23cc86, - 0x3a0e45, - 0x2cb5c7, - 0x2cf7c6, - 0x2d0648, - 0x2d0846, - 0x2035c4, - 0x29cd0b, - 0x2d3643, - 0x2d3645, - 0x21fdc2, - 0x35f402, - 0x52642582, - 0x52a05a02, - 0x215fc3, - 0x52e6bf42, - 0x26bf43, - 0x2d46c3, - 0x5360cac2, - 0x53ad9bc6, - 0x257906, - 0x53ed9d02, - 0x542071c2, - 0x5462b302, - 0x54a09082, - 0x54e18942, - 0x552050c2, - 0x208b03, - 0x26cb45, - 0x379b06, - 0x55617b84, - 0x3230ca, - 0x3a5d46, - 0x20bdc4, - 0x28dd43, - 0x56212b02, - 0x205642, - 0x22c203, - 0x5660a803, - 0x3b8307, - 0x35f787, - 0x58ae4447, - 0x39e847, - 0x229183, - 0x333b4a, - 0x340644, - 0x319084, - 0x31908a, - 0x3a8205, - 0x58e11482, - 0x24df43, - 0x59200602, - 0x24bbc3, - 0x34b603, - 0x59a00582, - 0x3a44c4, - 0x345584, - 0x3b0645, - 0x31e4c5, - 0x2e4a06, - 0x304146, - 0x59e39242, - 0x5a202f42, - 0x33d185, - 0x257612, - 0x353286, - 0x270e03, - 0x356606, - 0x31cd05, - 0x16045c2, - 0x626080c2, - 0x376203, - 0x2080c3, - 0x396203, - 0x62a18d42, - 0x23a183, - 0x63223242, - 0x220103, - 0x300808, - 0x239503, - 0x239506, - 0x3c4d87, - 0x321186, - 0x32118b, - 0x20bd07, - 0x2ebf04, - 0x63a00c02, - 0x3b8745, - 0x63e09783, - 0x21d283, - 0x2e60c5, - 0x333a43, - 0x64733a46, - 0x3c8fca, - 0x2a3fc3, - 0x235f44, - 0x2003c6, - 0x34efc6, - 0x64a16603, - 0x340007, - 0x2669c7, - 0x29e985, - 0x26f486, - 0x2158c3, - 0x6761a4c3, - 0x67a00a82, - 0x67e8f804, - 0x3c36c9, - 0x2137c5, - 0x229bc4, - 0x354e88, - 0x2e47c5, - 0x682352c5, - 0x23f549, - 0x344a43, - 0x261404, - 0x686161c2, - 0x2161c3, - 0x68a74542, - 0x274546, - 0x1678002, - 0x68e08f82, - 0x291988, - 0x291c83, - 0x2a8a87, - 0x2b2745, - 0x2b22c5, - 0x2b22cb, - 0x2e8206, - 0x2b24c6, - 0x23bb44, - 0x2e8946, - 0x69321408, - 0x27f4c3, - 0x264503, - 0x264504, - 0x2e51c4, - 0x2ea707, - 0x2ec545, - 0x696ec682, - 0x69a08242, - 0x6a21ae45, - 0x2b8f44, - 0x2d244b, - 0x2edcc8, - 0x250f44, - 0x6a62ad42, - 0x6aa23c42, - 0x3ba403, - 0x2efb84, - 0x2efe45, - 0x2f0607, - 0x2f3984, - 0x362244, - 0x6ae16102, - 0x37b5c9, - 0x2f4c05, - 0x240985, - 0x2f5cc5, - 0x6b216103, - 0x2f67c4, - 0x2f67cb, - 0x2f8a84, - 0x2f8d4b, - 0x2f95c5, - 0x216d4a, - 0x2f9e88, - 0x2fa08a, - 0x2fa883, - 0x2fa88a, - 0x6ba13602, - 0x6be20082, - 0x6c2ba0c3, - 0x6c6fdb02, - 0x2fdb03, - 0x6caed182, - 0x6cf38c02, - 0x301f04, - 0x218086, - 0x3978c5, - 0x303c03, - 0x32d3c6, - 0x3973c5, - 0x3d2dc4, - 0x6d200902, - 0x29fc84, - 0x2cb88a, - 0x3001c7, - 0x32a006, - 0x242f47, - 0x23bf03, - 0x2bac48, - 0x3c608b, - 0x2b6585, - 0x2c26c5, - 0x2c26c6, - 0x229984, - 0x3a4f48, - 0x20f883, - 0x25b984, - 0x336947, - 0x2ebb46, - 0x340846, - 0x2ba04a, - 0x24b144, - 0x31b14a, - 0x6d7009c6, - 0x3009c7, - 0x254287, - 0x273f04, - 0x273f09, - 0x251e05, - 0x234f8b, - 0x2ed083, - 0x212983, - 0x6da1de03, - 0x331d84, - 0x6de00682, - 0x228906, - 0x6e2bb4c5, - 0x356845, - 0x24e1c6, - 0x2a1384, - 0x6e602442, - 0x23f484, - 0x6ea0a982, - 0x3287c5, - 0x34c884, - 0x6f61b443, - 0x6fa08102, - 0x208103, - 0x3062c6, - 0x6fe04e82, - 0x392248, - 0x225344, - 0x225346, - 0x38fe46, - 0x70255d04, - 0x20a645, - 0x225648, - 0x227187, - 0x34e087, - 0x34e08f, - 0x294246, - 0x23b743, - 0x23fac4, - 0x20dc83, - 0x224684, - 0x24e784, - 0x706085c2, - 0x28b443, - 0x335543, - 0x70a09482, - 0x209483, - 0x227603, - 0x20c60a, - 0x272bc7, - 0x25398c, - 0x70e53c46, - 0x253dc6, - 0x254d87, - 0x7122d847, - 0x25aac9, - 0x23d604, - 0x71660404, - 0x71a16002, - 0x71e02e42, - 0x2ba406, - 0x33fe04, - 0x28b8c6, - 0x22dcc8, - 0x38c484, - 0x2d7b46, - 0x2055c5, - 0x7228a748, + 0x23d007, + 0x3b3147, + 0x2d2c43, + 0x20a2ba02, + 0x23e306, + 0x23e30a, + 0x23f44b, + 0x240987, + 0x241405, + 0x241e43, + 0x242246, + 0x242247, + 0x2f8983, + 0x20e00102, + 0x242bca, + 0x21377dc2, + 0x2173da82, + 0x21a3fd02, + 0x21e373c2, + 0x245385, + 0x245d44, + 0x22a05582, + 0x235805, 0x23fa43, - 0x314705, - 0x28dc43, - 0x240a83, - 0x240a84, - 0x20da03, - 0x72648d42, - 0x72a03382, - 0x2ecf49, - 0x291b85, - 0x292544, - 0x296b45, - 0x209b04, - 0x2cd147, - 0x35a545, - 0x72e46484, - 0x2d2088, - 0x2d2f86, - 0x2dedc4, - 0x2e13c8, - 0x2e1a07, - 0x73201702, - 0x2e99c4, - 0x310d44, - 0x2c2d87, - 0x73605bc4, - 0x215782, - 0x73a01782, - 0x201783, - 0x201784, - 0x29f703, - 0x2aed05, - 0x73e2e942, - 0x302245, - 0x287582, - 0x30a205, - 0x3c0085, - 0x74210342, - 0x217944, - 0x74602602, - 0x28eb86, - 0x2bf706, - 0x261cc8, - 0x2c3748, - 0x3ae104, - 0x30ed05, - 0x3abbc9, - 0x2cfd44, - 0x3c8f84, - 0x2204c3, - 0x319c83, - 0x74b19c85, - 0x2411c5, - 0x284b04, - 0x356bcd, - 0x293042, - 0x359103, - 0x74e09442, - 0x75203a42, - 0x391d05, - 0x3babc7, - 0x21e484, - 0x32fb09, - 0x2cb9c9, - 0x277e43, - 0x277e48, - 0x245e09, - 0x214947, - 0x204185, - 0x37c106, - 0x37ec86, - 0x3808c5, - 0x37aec5, - 0x75601a82, - 0x287205, - 0x2b7748, - 0x2c5a46, - 0x75a52b07, - 0x2bd2c4, - 0x2fc647, - 0x305546, - 0x75e01082, - 0x37c286, - 0x30988a, - 0x30a105, - 0x762e8f82, - 0x76621902, - 0x3645c6, - 0x221908, - 0x76a8d107, - 0x76e43b02, - 0x288ec3, - 0x2ff806, - 0x226884, - 0x275b06, - 0x319f46, - 0x2034ca, - 0x2021c5, - 0x3006c6, - 0x2520c3, - 0x2520c4, - 0x207442, - 0x331403, - 0x7720e442, - 0x2f1803, - 0x7760cf84, - 0x221a44, - 0x77a21a4a, - 0x22ce03, - 0x266c87, - 0x30d106, - 0x2ff144, - 0x20bc82, - 0x2a6f02, - 0x77e007c2, - 0x22b9c3, - 0x254047, + 0x314885, + 0x2688c4, + 0x2afb04, + 0x2cea06, + 0x250f06, + 0x2061c3, + 0x3bb644, + 0x303ec3, + 0x23a02a42, + 0x213c44, + 0x213c46, + 0x221745, + 0x244d46, + 0x30a7c8, + 0x223dc4, + 0x367bc8, + 0x231e85, + 0x262b88, + 0x2caa06, + 0x217c07, + 0x273504, + 0x24e73506, + 0x252239c3, + 0x39e183, + 0x31d988, + 0x29ffc4, + 0x2572ccc7, + 0x25ee4846, + 0x2e4849, + 0x362008, + 0x36a408, + 0x3b6544, + 0x3c7903, + 0x22dd42, + 0x2624e782, + 0x2660fa82, + 0x3c9083, + 0x26a01642, + 0x2f8904, + 0x279986, + 0x21c103, + 0x2bc7c7, + 0x303743, + 0x32fcc8, + 0x20b885, + 0x25a683, + 0x2c2345, + 0x2c2484, + 0x30bcc6, + 0x20cac6, + 0x2198c6, + 0x2f39c4, + 0x234a03, + 0x26e0fe02, + 0x27233fc5, + 0x200843, + 0x27a07382, + 0x22d1c3, + 0x2676c5, + 0x27e32dc3, + 0x28632dc9, + 0x28a00942, + 0x29208902, + 0x28ce05, + 0x213f06, + 0x28ec06, + 0x2e6608, + 0x2e660b, + 0x339c8b, + 0x3b93c5, + 0x2d6149, + 0x1600b42, + 0x2f0548, + 0x206984, + 0x29a03c42, + 0x34a843, + 0x2a25c986, + 0x3c2888, + 0x2a6142c2, + 0x35c708, + 0x2aaaac82, + 0x337f8a, + 0x2aedb383, + 0x2b776c86, + 0x392488, + 0x214886, + 0x387b87, + 0x243147, + 0x3c33ca, + 0x247604, + 0x360704, + 0x376209, + 0x2bba9dc5, + 0x26e286, + 0x210e03, + 0x24e3c4, + 0x2be196c4, + 0x3458c7, + 0x2c241c87, + 0x294f84, + 0x39f545, + 0x262548, + 0x39e647, + 0x3a24c7, + 0x2c60dec2, + 0x29cf44, + 0x293048, + 0x246d84, + 0x24b904, + 0x24bcc5, + 0x24be07, + 0x2ca7ebc9, + 0x2232c4, + 0x24d789, + 0x24d9c8, + 0x24e144, + 0x24e147, + 0x2ce4e583, + 0x24ea87, + 0x2d20bb42, + 0x16b8842, + 0x24fa46, + 0x250087, + 0x250704, + 0x251d07, + 0x253787, + 0x253f83, + 0x22dec2, + 0x20d982, + 0x303243, + 0x3c6704, + 0x3c670b, + 0x2d703248, + 0x25a044, + 0x255b85, + 0x257407, + 0x2e92c5, + 0x33144a, + 0x259f83, + 0x2da05dc2, + 0x208e04, + 0x25c589, + 0x260c03, + 0x260cc7, + 0x240749, + 0x205dc8, + 0x22af03, + 0x27b3c7, + 0x27be89, + 0x225583, + 0x283b84, + 0x284d09, + 0x28b2c6, + 0x2f4103, + 0x2015c2, + 0x23c903, + 0x2b8647, + 0x23c905, + 0x3b1686, + 0x270744, + 0x35ff85, + 0x27c7c3, + 0x212706, + 0x292503, + 0x206882, + 0x248f84, + 0x2de299c2, + 0x2e2299c3, + 0x2e607082, + 0x248343, + 0x211cc4, + 0x2ece07, + 0x2946c6, + 0x262302, + 0x2ea5cd82, + 0x30a9c4, + 0x2f20d842, + 0x2f616902, + 0x2ef084, + 0x2ef085, + 0x302c85, + 0x35ef86, + 0x2fa0f582, + 0x39b745, + 0x3ba745, + 0x283483, + 0x20f586, + 0x20fec5, + 0x220cc2, + 0x35b3c5, + 0x220cc4, + 0x223d03, + 0x223f43, + 0x2fe05b42, + 0x2e29c7, + 0x24dbc4, + 0x24dbc9, + 0x24e2c4, + 0x2833c3, + 0x2b61c8, + 0x302833c4, + 0x2833c6, + 0x2a37c3, + 0x256303, + 0x308003, + 0x306f7642, + 0x309442, + 0x30a00642, + 0x335408, + 0x36af48, + 0x3b7906, + 0x3830c5, + 0x22c805, + 0x204287, + 0x30e77185, + 0x23c782, + 0x3129b602, + 0x31600042, + 0x2cfb88, + 0x3ae105, + 0x2fc7c4, + 0x244c85, + 0x2547c7, + 0x3a3884, + 0x242ac2, + 0x31a11442, + 0x351144, + 0x220a87, + 0x28ddc7, + 0x378804, + 0x3cd483, + 0x290e44, + 0x290e48, + 0x22f7c6, + 0x25254a, + 0x326584, + 0x299288, + 0x234184, + 0x2214c6, + 0x29b5c4, + 0x2f3546, + 0x24de89, + 0x2a9fc7, + 0x207543, + 0x31e3ee42, + 0x3b62c3, + 0x209e42, + 0x32204702, + 0x349e46, + 0x381988, + 0x2abfc7, + 0x228b09, + 0x2b1549, + 0x2ad505, + 0x2afc09, + 0x2b0405, + 0x2b1245, + 0x2b1f88, + 0x32608784, + 0x32a540c7, + 0x22d803, + 0x2b2187, + 0x22d806, + 0x2b25c7, + 0x2a9ac5, + 0x22d083, + 0x32e315c2, + 0x20b344, + 0x3320e782, + 0x33606502, + 0x380e86, + 0x2d04c5, + 0x2b54c7, + 0x343a03, + 0x35cb04, + 0x209283, + 0x2cd743, + 0x33a06182, + 0x34205bc2, + 0x38b244, + 0x22de83, + 0x3047c5, + 0x34600f42, + 0x34e01f02, + 0x304fc6, + 0x201f04, + 0x306bc4, + 0x306bca, + 0x356005c2, + 0x213903, + 0x21884a, + 0x21bac8, + 0x35a21dc4, + 0x2005c3, + 0x35e96b43, + 0x237909, + 0x22e0c9, + 0x2bc8c6, + 0x3621bc83, + 0x21bc85, + 0x222f8d, + 0x226586, + 0x26518b, + 0x3660ccc2, + 0x205708, + 0x3a217782, + 0x3a605382, + 0x2bad85, + 0x3aa04582, + 0x2b3307, + 0x210083, + 0x210088, + 0x3ae07882, + 0x288304, + 0x20c743, + 0x33b805, + 0x23fb46, + 0x224004, + 0x398983, + 0x2b9583, + 0x3b201d82, + 0x3b9344, + 0x3d4c45, + 0x2b8247, + 0x279403, + 0x2b8e43, + 0x16b9102, + 0x2b9103, + 0x2b9503, + 0x3b600e02, + 0x3473c4, + 0x251106, + 0x2e42c3, + 0x2b9c03, + 0x3ba49582, + 0x249588, + 0x2bab84, + 0x347146, + 0x255707, + 0x284646, + 0x29ff44, + 0x49e03fc2, + 0x22d6cb, + 0x2ff50e, + 0x216d8f, + 0x39d6c3, + 0x4a65ac42, + 0x161fb02, + 0x4aa0af02, + 0x2928c3, + 0x2108c3, + 0x20af06, + 0x21d306, + 0x34dec7, + 0x310c44, + 0x4ae14042, + 0x4b20bd82, + 0x2e0685, + 0x2ff987, + 0x2bb206, + 0x4b662702, + 0x384c44, + 0x2c03c3, + 0x4ba01e42, + 0x4bf73103, + 0x2c2984, + 0x2c8009, + 0x4c2ced42, + 0x4c614d42, + 0x344945, + 0x4cad3942, + 0x4ce06002, + 0x35f947, + 0x3768cb, + 0x242f05, + 0x258109, + 0x26aa86, + 0x4d209504, + 0x295449, + 0x2d46c7, + 0x3dea87, + 0x22c343, + 0x2eef06, + 0x324047, + 0x25cc03, + 0x2a6a86, + 0x4da1ae42, + 0x4de33042, + 0x3b6403, + 0x38b885, + 0x21f407, + 0x236146, + 0x23c885, + 0x24db44, + 0x2a8985, + 0x38dac4, + 0x4e202482, + 0x2cc844, + 0x22dfc4, + 0x22dfcd, + 0x377189, + 0x22c648, + 0x344bc4, + 0x328845, + 0x3b8c47, + 0x3c5cc4, + 0x265907, + 0x2e4005, + 0x4e6ac604, + 0x2bf345, + 0x25f8c4, + 0x3a39c6, + 0x3973c5, + 0x4ea05442, + 0x26e903, + 0x267fc3, + 0x348cc4, + 0x348cc5, + 0x396886, + 0x23c9c5, + 0x22ae84, + 0x329743, + 0x4ee1a286, + 0x221fc5, + 0x222a85, + 0x323544, + 0x2f6283, + 0x32660c, + 0x4f208b02, + 0x4f605102, + 0x4fa02042, + 0x21a8c3, + 0x21a8c4, + 0x4fe08282, + 0x30e1c8, + 0x3b1745, + 0x2d3b84, + 0x23af86, + 0x50223502, + 0x5061b542, + 0x50a00c42, + 0x290c05, + 0x2f3886, + 0x219604, + 0x39a0c6, + 0x362dc6, + 0x211183, + 0x50ea240a, + 0x2795c5, + 0x350503, + 0x222446, + 0x3d2d09, + 0x222447, + 0x2b4d08, + 0x32f0c9, + 0x2adfc8, + 0x227d46, + 0x2105c3, + 0x512017c2, + 0x39fa08, + 0x51601f42, + 0x51a09e82, + 0x2137c3, + 0x2ec0c5, + 0x29f2c4, + 0x2fe389, + 0x2898c4, + 0x24aec8, + 0x52209e83, + 0x52696ec4, + 0x213f48, + 0x22df07, + 0x52b3d642, + 0x238442, + 0x32a385, + 0x37fc49, + 0x23c803, + 0x27e384, + 0x31d284, + 0x210943, + 0x27f28a, + 0x52e03f82, + 0x5320b182, + 0x2d5b43, + 0x390883, + 0x1627f82, + 0x374583, + 0x5361d542, + 0x53a00bc2, + 0x53f06c44, + 0x3d7846, + 0x26bbc4, + 0x277d83, + 0x281c83, + 0x54200bc3, + 0x23f7c6, + 0x208405, + 0x2d9ac7, + 0x2d9a06, + 0x2dab48, + 0x2dad46, + 0x20e944, + 0x2a0f0b, + 0x2dd603, + 0x2dd605, + 0x20f002, + 0x35fc42, + 0x54645402, + 0x54a02382, + 0x202383, + 0x54e6c9c2, + 0x26c9c3, + 0x2de083, + 0x55622902, + 0x55ae2406, + 0x258946, + 0x55e05902, + 0x5620a742, + 0x56623f82, + 0x56a15402, + 0x56e18482, + 0x57202802, + 0x214e83, + 0x385546, + 0x57619a04, + 0x213a4a, + 0x3a4986, + 0x20da84, + 0x204643, + 0x5820ce02, + 0x208482, + 0x23a0c3, + 0x5861a3c3, + 0x3bd287, + 0x3972c7, + 0x5aed3087, + 0x344407, + 0x228643, + 0x22864a, + 0x262044, + 0x31afc4, + 0x31afca, + 0x22cb45, + 0x5b21bb02, + 0x24fa03, + 0x5b600602, + 0x24e283, + 0x3b6283, + 0x5be00582, + 0x38a8c4, + 0x204484, + 0x3c2d05, + 0x3dd205, + 0x26a146, + 0x306e06, + 0x5c230a42, + 0x5c602902, + 0x310805, + 0x258652, + 0x35e586, + 0x207283, + 0x359106, + 0x2bf805, + 0x16535c2, + 0x64a0a9c2, + 0x372b43, + 0x20a9c3, + 0x292083, + 0x64e06e42, + 0x210e83, + 0x6521ad42, + 0x276e43, + 0x24b188, + 0x2624c3, + 0x2ad386, + 0x3cfc87, + 0x321486, + 0x32148b, + 0x20d9c7, + 0x31d784, + 0x65a00c02, + 0x3b15c5, + 0x65e08443, + 0x26d243, + 0x3b29c5, + 0x33f243, + 0x6673f246, + 0x3cac0a, + 0x2a7083, + 0x2366c4, + 0x2003c6, + 0x2af186, + 0x66a42543, + 0x299047, + 0x237807, + 0x2a2c85, + 0x2e4406, + 0x222003, + 0x6960f7c3, + 0x69a00a82, + 0x69e0f044, + 0x3df689, + 0x21d685, + 0x356cc4, + 0x355b48, + 0x264bc5, + 0x6a231ac5, + 0x241f49, + 0x202503, + 0x33da04, + 0x6a614282, + 0x214283, + 0x6aa57b82, + 0x257b86, + 0x1677282, + 0x6ae15302, + 0x290b08, + 0x290e03, + 0x2bf287, + 0x2b9605, + 0x2b9185, + 0x2b918b, + 0x2eec86, + 0x2b9386, + 0x27d384, + 0x2efa86, + 0x6b321708, + 0x27fd03, + 0x265f03, + 0x265f04, + 0x2ed8c4, + 0x2f6a07, + 0x315645, + 0x6b72a5c2, + 0x6ba0a882, + 0x6c21bfc5, + 0x2c1044, + 0x2e0a0b, + 0x2f7688, + 0x253604, + 0x6c62c4c2, + 0x6ca1b742, + 0x3ba2c3, + 0x2f9484, + 0x2f9745, + 0x2fa147, + 0x6cefc304, + 0x378904, + 0x6d2141c2, + 0x37ab09, + 0x2fd745, + 0x2431c5, + 0x2fe2c5, + 0x6d6141c3, + 0x237f04, + 0x237f0b, + 0x2fedc4, + 0x2ff08b, + 0x3001c5, + 0x216eca, + 0x301708, + 0x30190a, + 0x3021c3, + 0x3021ca, + 0x6de11e42, + 0x6e214b42, + 0x6e615d43, + 0x6eadbd02, + 0x3068c3, + 0x6eef6702, + 0x6f333e42, + 0x309004, + 0x2177c6, + 0x399e05, + 0x30a643, + 0x298046, + 0x399905, + 0x3573c4, + 0x6f600902, + 0x299ec4, + 0x2d5dca, + 0x2ba807, + 0x33f5c6, + 0x234207, + 0x23e343, + 0x2c29c8, + 0x3d21cb, + 0x2bc9c5, + 0x2c8b85, + 0x2c8b86, + 0x34cb84, + 0x38ab88, + 0x21aa43, + 0x26ee44, + 0x3c3747, + 0x31d3c6, + 0x380b86, + 0x2c324a, + 0x24d804, + 0x31c0ca, + 0x6fb12606, + 0x312607, + 0x255c07, + 0x2a9a04, + 0x34a189, + 0x238dc5, + 0x307a4b, + 0x2f6603, + 0x20cc83, + 0x6fe1e243, + 0x22fb84, + 0x70200682, + 0x307e06, + 0x706c60c5, + 0x359345, + 0x24fc86, + 0x2a4944, + 0x70a013c2, + 0x241e84, + 0x70e0ca42, + 0x2160c5, + 0x3b2e44, + 0x71a1c5c3, + 0x71e0aa02, + 0x20aa03, + 0x21f646, + 0x72205142, + 0x393d08, + 0x2222c4, + 0x2222c6, + 0x391106, + 0x726574c4, + 0x21a205, + 0x356d88, + 0x3577c7, + 0x2ae247, + 0x2ae24f, + 0x292f46, + 0x23d183, + 0x242144, + 0x209043, + 0x221604, + 0x24e484, + 0x72a0b382, + 0x28d203, + 0x330983, + 0x72e090c2, + 0x215803, + 0x220f03, + 0x20e2ca, + 0x273847, + 0x25284c, + 0x73252b06, + 0x252c86, + 0x255407, + 0x7362e987, + 0x25a749, + 0x308784, + 0x73a5be04, + 0x73e023c2, + 0x742045c2, + 0x2c3606, + 0x298e44, + 0x28d686, + 0x22ee08, + 0x38b944, + 0x2eafc6, + 0x28ebc5, + 0x74750788, + 0x242343, + 0x3a6b85, + 0x3aa603, + 0x2432c3, + 0x2432c4, + 0x208dc3, + 0x74a499c2, + 0x74e02d42, + 0x2f64c9, + 0x290d05, + 0x291604, + 0x29ab05, + 0x206a84, + 0x286707, + 0x35a685, + 0x7523e804, + 0x2db988, + 0x2dcdc6, + 0x2e2d44, + 0x2e6e08, + 0x2e7447, + 0x75607842, + 0x2ef184, + 0x314cc4, + 0x2c9247, + 0x75a07844, + 0x24a682, + 0x75e02f82, + 0x210883, + 0x2e5ac4, + 0x299943, + 0x2b2cc5, + 0x7622ae42, + 0x309345, + 0x23c7c2, + 0x30f885, + 0x23c7c5, + 0x76607242, + 0x327704, + 0x76a071c2, + 0x33d486, + 0x2c8686, + 0x37fd88, + 0x2c9c08, + 0x380e04, + 0x3cdb05, + 0x310389, + 0x2f0684, + 0x3cabc4, + 0x288b03, + 0x26c703, + 0x76f02905, + 0x3829c5, + 0x283644, + 0x359b4d, + 0x294ec2, + 0x376403, + 0x77206382, + 0x77603242, + 0x3937c5, + 0x24b447, + 0x224244, + 0x32f2c9, + 0x2d5f09, + 0x2770c3, + 0x2770c8, + 0x312b09, + 0x21e7c7, + 0x77a08805, + 0x396406, + 0x3a06c6, + 0x3a8645, + 0x377285, + 0x77e01bc2, + 0x27a585, + 0x2bd4c8, + 0x2cb646, + 0x783b4347, + 0x2cf3c4, + 0x2da987, + 0x30b306, + 0x78601082, + 0x396586, + 0x30ef0a, + 0x30f785, + 0x78af00c2, + 0x78e11102, + 0x365486, + 0x211108, + 0x7928df87, + 0x79601402, + 0x214b83, + 0x3c0706, + 0x2caac4, + 0x346ac6, + 0x271ac6, + 0x26930a, + 0x2047c5, + 0x286f06, + 0x384643, + 0x384644, + 0x79a35002, + 0x2869c3, + 0x79e1a902, + 0x2ea903, + 0x7a218ac4, + 0x211244, + 0x7a61124a, + 0x21bd03, + 0x237ac7, + 0x313146, + 0x33c284, + 0x20d942, + 0x2aad42, + 0x7aa007c2, + 0x226e83, + 0x2559c7, 0x2007c7, - 0x287dc4, - 0x3d0847, - 0x2f0706, - 0x20fb07, - 0x227544, - 0x292445, - 0x2187c5, - 0x78214682, - 0x3b2f46, - 0x215943, - 0x21e0c2, - 0x21e0c6, - 0x78621542, - 0x78a19f82, - 0x298e05, - 0x78e47c82, - 0x79201942, - 0x324c85, - 0x2d3985, - 0x2a9385, - 0x79a1d043, - 0x24adc5, - 0x2e82c7, - 0x2f3505, - 0x202385, - 0x32b944, - 0x229a46, - 0x3dd844, - 0x79e008c2, - 0x7ab82d05, - 0x3c9447, - 0x3afe08, - 0x24d686, - 0x38bb4d, - 0x24d689, - 0x24d692, - 0x34cf05, - 0x37aa03, - 0x7ae06902, - 0x319b44, - 0x2145c3, - 0x38d005, - 0x30b405, - 0x7b20ff42, - 0x259243, - 0x7b62b902, - 0x7beca302, - 0x7c200082, - 0x2e08c5, - 0x2088c3, - 0x7c60fa02, - 0x7ca14302, - 0x3a4486, - 0x27ac8a, - 0x208c83, - 0x256203, - 0x2f6ac3, - 0x7de05402, - 0x8c218d82, - 0x8ca05782, - 0x217042, - 0x3cd2c9, - 0x2c80c4, - 0x2d6648, - 0x8cefbb02, - 0x8d60ff82, - 0x2c4e85, - 0x233b08, - 0x23c708, - 0x315b0c, - 0x237843, - 0x8da08842, - 0x8de00f02, - 0x3b9686, - 0x30df85, - 0x2dae43, - 0x252f86, - 0x30e0c6, - 0x27a383, - 0x310c83, - 0x311346, - 0x312bc4, - 0x263546, - 0x3b610a, - 0x23fbc4, - 0x313284, - 0x314aca, - 0x8e212f42, - 0x24cf45, - 0x31634a, - 0x316285, - 0x317c04, - 0x317d06, - 0x317e84, - 0x216486, - 0x8e615482, - 0x215486, - 0x251a45, - 0x3b2dc7, - 0x3b5f86, - 0x254f84, - 0x2db0c7, - 0x20a4c5, - 0x20a4c7, - 0x3b7147, - 0x3b714e, - 0x389606, - 0x22a785, - 0x205b07, - 0x207203, - 0x207207, - 0x21e905, - 0x225944, - 0x22a582, - 0x23db47, - 0x30b144, - 0x241b04, - 0x285f4b, - 0x21c283, - 0x2bc607, - 0x21c284, - 0x2bc907, - 0x229683, - 0x350f8d, - 0x3a0c48, - 0x8ea46384, - 0x246385, - 0x3194c5, - 0x319903, - 0x8ee25242, - 0x31c243, - 0x31d283, - 0x3b30c4, - 0x27cf45, - 0x2159c7, - 0x252146, - 0x38cdc3, - 0x22b34b, - 0x27350b, - 0x2ac28b, - 0x3cad8b, - 0x2e8fca, - 0x36f44b, - 0x39334b, - 0x3d950c, - 0x3dcb4b, - 0x31ddd1, - 0x31e20a, - 0x31e70b, - 0x31e9cc, - 0x31eccb, - 0x31ff4a, - 0x3206ca, - 0x321ece, - 0x32344b, - 0x32370a, - 0x324dd1, - 0x32520a, - 0x32570b, - 0x325c4e, - 0x326b4c, - 0x32738b, - 0x32764e, - 0x3279cc, - 0x32b40a, - 0x32c64c, - 0x8f32c94a, - 0x32d548, - 0x32e109, - 0x33204a, - 0x3322ca, - 0x33254b, - 0x334cce, - 0x335b91, - 0x341509, - 0x34174a, - 0x34244b, - 0x34634d, - 0x3471ca, - 0x348716, - 0x349a8b, - 0x34a80a, - 0x34ad8a, - 0x34c10b, - 0x34c989, - 0x351909, - 0x351e8d, - 0x35250b, - 0x35340b, - 0x353dcb, - 0x3543c9, - 0x354a0e, - 0x35520a, - 0x35608a, - 0x35698a, - 0x35724b, - 0x357a8b, - 0x35890d, - 0x35a04d, - 0x35a950, - 0x35ae0b, - 0x35b90c, - 0x35cecb, - 0x35ec0b, - 0x3602ce, - 0x3609cb, - 0x3609cd, - 0x36550b, - 0x365f8f, - 0x36634b, - 0x366b8a, - 0x3678c9, - 0x367f89, - 0x8f7689cb, - 0x368c8e, - 0x36900e, - 0x36cecb, - 0x36e00f, - 0x37024b, - 0x37050b, - 0x3707cb, - 0x370e8a, - 0x377889, - 0x37a00f, - 0x37e9cc, - 0x37ee0c, - 0x37f8ce, - 0x37fe4f, - 0x38020e, - 0x381310, - 0x38170f, - 0x3822ce, - 0x382e8c, - 0x383191, - 0x3835d2, - 0x384ad1, - 0x3852ce, - 0x38570b, - 0x38570e, - 0x385a8f, - 0x385e4e, - 0x3861d3, - 0x386691, - 0x386acc, - 0x386dce, - 0x38724c, - 0x387793, - 0x388650, - 0x38a34c, - 0x38a64c, - 0x38ab0b, - 0x38b0ce, - 0x38b5cb, - 0x38be8b, - 0x38d30c, - 0x39278a, - 0x392b4c, - 0x392e4c, - 0x393149, - 0x39494b, - 0x394c08, - 0x3953c9, - 0x3953cf, - 0x396c8b, - 0x8fb9800a, - 0x399fcc, - 0x39b18b, - 0x39b449, - 0x39bbc8, - 0x39c18b, - 0x39c70b, - 0x39d28a, - 0x39d50b, - 0x39da0c, - 0x39e3c9, - 0x39e608, - 0x3a0f8b, - 0x3a3ccb, - 0x3a694e, - 0x3a7e4b, - 0x3aabcb, - 0x3b6ccb, - 0x3b6f89, - 0x3b74cd, - 0x3c9e8a, - 0x3cdd57, - 0x3cf418, - 0x3d41c9, - 0x3d530b, - 0x3d5814, - 0x3d5d0b, - 0x3d628a, - 0x3d694a, - 0x3d6bcb, - 0x3d7410, - 0x3d7811, - 0x3d7eca, - 0x3d8b0d, - 0x3d920d, - 0x3ddd8b, - 0x3b3043, - 0x8ff83d43, - 0x32af06, - 0x22ef05, - 0x307347, - 0x332e46, - 0x1602d42, - 0x2ab3c9, - 0x32d1c4, - 0x2e4d08, - 0x21dd43, - 0x319a87, - 0x22de82, - 0x2b05c3, - 0x902057c2, - 0x2cc446, - 0x2cdb04, - 0x347d04, - 0x346243, - 0x90ac91c2, - 0x90e2a444, - 0x273e47, - 0x9122a1c2, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x111148, - 0x20ca43, + 0x285d84, + 0x3da107, + 0x2fa246, + 0x210d47, + 0x220e44, + 0x2ae145, + 0x205345, + 0x7ae1e502, + 0x3d7286, + 0x220383, + 0x2266c2, + 0x2266c6, + 0x7b21f3c2, + 0x7b633442, + 0x29d005, + 0x7ba02c02, + 0x7be02982, + 0x324605, + 0x2d7505, + 0x2ac745, + 0x7c65b003, + 0x279a45, + 0x2eed47, + 0x36cc85, + 0x204985, + 0x261f44, + 0x264a46, + 0x38e104, + 0x7ca008c2, + 0x7d793085, + 0x3cb087, + 0x3c0bc8, + 0x253c46, + 0x253c4d, + 0x262d49, + 0x262d52, + 0x37a385, + 0x37ae03, + 0x7da09d42, + 0x3027c4, + 0x226603, + 0x3cb985, + 0x310f85, + 0x7de0c782, + 0x25a6c3, + 0x7e226dc2, + 0x7ea1d602, + 0x7ee00082, + 0x2e9bc5, + 0x207643, + 0x7f205b02, + 0x7f60c2c2, + 0x38a886, + 0x2d020a, + 0x215003, + 0x2579c3, + 0x2ff8c3, + 0x80e01b82, + 0x8f20c1c2, + 0x8fa0a5c2, + 0x203642, + 0x3ce689, + 0x2ce144, + 0x2dfac8, + 0x8ff04382, + 0x90606482, + 0x3bd905, + 0x233c88, + 0x231148, + 0x2f738c, + 0x2398c3, + 0x90a075c2, + 0x90e00f02, + 0x24ac46, + 0x313fc5, + 0x295b43, + 0x254686, + 0x314106, + 0x296b03, + 0x314c03, + 0x315046, + 0x316884, + 0x29cc86, + 0x23cd44, + 0x316f44, + 0x31784a, + 0x912b7402, + 0x24e705, + 0x3193ca, + 0x319305, + 0x31a7c4, + 0x31a8c6, + 0x31aa44, + 0x214546, + 0x91602b42, + 0x24c5c6, + 0x33bf85, + 0x286d87, + 0x33a106, + 0x255604, + 0x2e3407, + 0x234f85, + 0x23b687, + 0x3bc247, + 0x3bc24e, + 0x278646, + 0x222705, + 0x207787, + 0x20a783, + 0x3d3a47, + 0x20ab85, + 0x2123c4, + 0x22a8c2, + 0x325ec7, + 0x310cc4, + 0x23dec4, + 0x284a4b, + 0x21cb83, + 0x2c4907, + 0x21cb84, + 0x2c4c07, + 0x3a6603, + 0x34e40d, + 0x3a2f88, + 0x91a292c4, + 0x23e705, + 0x31b805, + 0x31bc43, + 0x91e221c2, + 0x31d1c3, + 0x31e083, + 0x3d7404, + 0x27bf85, + 0x220407, + 0x3846c6, + 0x38d943, + 0x22680b, + 0x249b8b, + 0x2acfcb, + 0x2c174b, + 0x3ccd4a, + 0x31734b, + 0x36ea8b, + 0x394e0c, + 0x3ada0b, + 0x3bf811, + 0x3dcf4a, + 0x31f58b, + 0x31f84c, + 0x31fb4b, + 0x3200ca, + 0x3209ca, + 0x3221ce, + 0x32294b, + 0x322c0a, + 0x324751, + 0x324b8a, + 0x32508b, + 0x3255ce, + 0x326c8c, + 0x32784b, + 0x327b0e, + 0x327e8c, + 0x328bca, + 0x329d4c, + 0x9232a04a, + 0x32a808, + 0x32b3c9, + 0x32ce8a, + 0x32d10a, + 0x32d38b, + 0x33010e, + 0x3316d1, + 0x33e209, + 0x33e44a, + 0x33ee8b, + 0x33fc0d, + 0x340a8a, + 0x341616, + 0x34298b, + 0x34668a, + 0x347d0a, + 0x3490cb, + 0x34aa49, + 0x34ed89, + 0x34f30d, + 0x34fe0b, + 0x351c8b, + 0x352509, + 0x352b4e, + 0x35328a, + 0x353dca, + 0x35438a, + 0x354a0b, + 0x35524b, + 0x3585cd, + 0x35a18d, + 0x35b050, + 0x35b50b, + 0x35ce4c, + 0x35d98b, + 0x35f44b, + 0x360c4e, + 0x36128b, + 0x36128d, + 0x3663cb, + 0x366e4f, + 0x36720b, + 0x36860a, + 0x368e49, + 0x369509, + 0x9276988b, + 0x369b4e, + 0x369ece, + 0x36be8b, + 0x36d64f, + 0x370acb, + 0x370d8b, + 0x37104b, + 0x37164a, + 0x3764c9, + 0x37964f, + 0x37e24c, + 0x37f30c, + 0x38058e, + 0x3810cf, + 0x38148e, + 0x381e50, + 0x38224f, + 0x382b4e, + 0x38320c, + 0x383511, + 0x383952, + 0x3856d1, + 0x385dce, + 0x38620b, + 0x38620e, + 0x38658f, + 0x38694e, + 0x386cd3, + 0x387191, + 0x3875cc, + 0x3878ce, + 0x387d4c, + 0x388293, + 0x388a90, + 0x389b8c, + 0x389e8c, + 0x38a34b, + 0x38ae4e, + 0x38b34b, + 0x38cb4b, + 0x38ddcc, + 0x39424a, + 0x39460c, + 0x39490c, + 0x394c09, + 0x396a0b, + 0x396cc8, + 0x397509, + 0x39750f, + 0x3991cb, + 0x92b9a54a, + 0x39bd0c, + 0x39cccb, + 0x39cf89, + 0x39d348, + 0x39da4b, + 0x39df4b, + 0x39eb8a, + 0x39ee0b, + 0x39f78c, + 0x3a0149, + 0x3a0388, + 0x3a3d0b, + 0x3a6f4b, + 0x3a91ce, + 0x3aaf4b, + 0x3ad38b, + 0x3bbdcb, + 0x3bc089, + 0x3bc5cd, + 0x3cbe4a, + 0x3cf5d7, + 0x3d18d8, + 0x3d5909, + 0x3d6b0b, + 0x3d79d4, + 0x3d7ecb, + 0x3d844a, + 0x3d894a, + 0x3d8bcb, + 0x3da790, + 0x3dab91, + 0x3db24a, + 0x3dc54d, + 0x3dcc4d, + 0x3e06cb, + 0x3d7383, + 0x92f9b403, + 0x289b06, + 0x246085, + 0x30ccc7, + 0x2ef746, + 0x165c942, + 0x270b89, + 0x297e44, + 0x2ed408, + 0x21e183, + 0x302707, + 0x205602, + 0x2b5503, + 0x93201442, + 0x2d69c6, + 0x2d8084, + 0x38f1c4, + 0x268643, + 0x93ad3982, + 0x93e2a784, + 0x34a0c7, + 0x9422a502, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x105dc8, + 0x203dc3, 0x2000c2, - 0x9fe08, - 0x20c302, - 0x228b03, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x20c603, - 0x33b8d6, - 0x363e93, - 0x3d06c9, - 0x322c48, - 0x3b85c9, - 0x3164c6, - 0x3527d0, - 0x20c013, - 0x2ebc08, - 0x27a947, - 0x286b07, - 0x2a4a4a, - 0x3291c9, - 0x28f509, - 0x24224b, - 0x2e73c6, - 0x28830a, - 0x222a86, - 0x32cdc3, - 0x256545, - 0x3a8908, - 0x233fcd, - 0x21fd0c, - 0x2eaac7, - 0x3dcdcd, - 0x225744, - 0x22fd8a, - 0x23084a, - 0x230d0a, - 0x20c307, - 0x23a907, - 0x23da84, - 0x287806, - 0x251c04, - 0x2d58c8, - 0x32ad09, - 0x2cf506, - 0x2cf508, - 0x240dcd, - 0x2cbc09, - 0x3910c8, - 0x240907, - 0x23750a, - 0x24e606, - 0x25b7c7, - 0x2fb704, - 0x20b6c7, - 0x228b0a, - 0x239d4e, - 0x277f05, - 0x3d7c0b, - 0x22b709, - 0x24d8c9, - 0x2c6607, - 0x3c138a, - 0x2c2cc7, - 0x2f9309, - 0x27b408, - 0x2e640b, - 0x2e2a45, - 0x22ad8a, - 0x22b0c9, - 0x33e68a, - 0x20460b, - 0x20b5cb, - 0x241fd5, - 0x2c1f85, - 0x240985, - 0x2f67ca, - 0x3dbb0a, - 0x31b687, - 0x233c43, - 0x2ba388, - 0x2d80ca, - 0x225346, - 0x2592c9, - 0x28a748, - 0x2dedc4, - 0x387549, - 0x2c3748, - 0x2c2407, - 0x382d06, - 0x3c9447, - 0x2b4607, - 0x23ca85, - 0x2e450c, - 0x246385, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0xca43, - 0x216603, - 0x20c302, - 0x22c0c3, - 0x20a803, - 0x20ca43, - 0x216603, - 0x22c0c3, - 0x20a803, - 0xca43, - 0x239503, - 0x216603, - 0x1ca243, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x9fe08, - 0x20c302, - 0x22c0c3, - 0x22c0c7, - 0x20a803, - 0x216603, - 0x20c302, - 0x201d02, - 0x2ebe82, - 0x202cc2, - 0x202f82, - 0x2e5382, - 0x91746, - 0x4e9c9, - 0x481b443, - 0x88147, - 0x5b03, - 0x119045, + 0x9a048, + 0x201242, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x20e2c3, + 0x337396, + 0x364d53, + 0x3d9f89, + 0x2135c8, + 0x3b1449, + 0x319546, + 0x351190, + 0x20dcd3, + 0x31d488, + 0x277e87, + 0x279e87, + 0x2a86ca, + 0x343189, + 0x267d49, + 0x2d368b, + 0x303c06, + 0x30334a, + 0x2205c6, + 0x32a4c3, + 0x2e2905, + 0x3ba348, + 0x27decd, + 0x2f330c, + 0x2ec347, + 0x30bfcd, + 0x2136c4, + 0x22fe4a, + 0x23134a, + 0x23180a, + 0x20dfc7, + 0x23cb87, + 0x240104, + 0x273506, + 0x348a44, + 0x304c08, + 0x289909, + 0x2e6606, + 0x2e6608, + 0x24360d, + 0x2d6149, + 0x392488, + 0x243147, + 0x3b27ca, + 0x250086, + 0x2fd244, + 0x212107, + 0x30800a, + 0x3ab68e, + 0x277185, + 0x3daf8b, + 0x226bc9, + 0x22e0c9, + 0x2b3147, + 0x3d090a, + 0x2c9187, + 0x2ff649, + 0x33b048, + 0x2a5e8b, + 0x2ec0c5, + 0x22c50a, + 0x223d49, + 0x295aca, + 0x20f30b, + 0x21200b, + 0x2d3415, + 0x2c8205, + 0x2431c5, + 0x237f0a, + 0x22b98a, + 0x2f5d87, + 0x233dc3, + 0x2c3588, + 0x2e0eca, + 0x2222c6, + 0x259c09, + 0x350788, + 0x2e2d44, + 0x388049, + 0x2c9c08, + 0x2ca947, + 0x393086, + 0x3cb087, + 0x2be807, + 0x23f5c5, + 0x2d314c, + 0x23e705, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x201242, + 0x214a83, + 0x21a3c3, + 0x203dc3, + 0x242543, + 0x214a83, + 0x21a3c3, + 0x3dc3, + 0x2624c3, + 0x242543, + 0x1cc203, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x9a048, + 0x201242, + 0x214a83, + 0x22ca07, + 0x86504, + 0x21a3c3, + 0x97a04, + 0x242543, + 0x201242, + 0x2052c2, + 0x3192c2, + 0x207882, + 0x201582, + 0x2eda82, + 0x908c6, + 0x50849, + 0xf3fc7, + 0x481c5c3, + 0x86107, + 0x148406, + 0x7783, + 0x11af85, 0xc1, - 0x522c0c3, - 0x232c43, - 0x212483, - 0x228b03, - 0x214543, - 0x211543, - 0x2d9fc6, - 0x20a803, - 0x216603, - 0x20f803, - 0x9fe08, - 0x3443c4, - 0x374787, - 0x346283, - 0x2b3904, - 0x218c83, - 0x286243, - 0x228b03, - 0x176c87, + 0x5214a83, + 0x232dc3, + 0x228503, + 0x308003, + 0x21bc83, + 0x23c803, + 0x2e2806, + 0x21a3c3, + 0x242543, + 0x233d43, + 0x9a048, + 0x345b44, + 0x296c87, + 0x268683, + 0x2bad84, + 0x2187c3, + 0x284d43, + 0x308003, + 0x17e707, 0x9c4, - 0x11c3, - 0x2b05, - 0x2000c2, - 0x48343, - 0x660c302, - 0x688a549, - 0x8abcd, - 0x8af0d, - 0x2ebe82, - 0x24e44, - 0x2b49, + 0x4e83, + 0x68b05, + 0x66000c2, + 0x2703, + 0x6a01242, + 0x6c8c109, + 0x8c98d, + 0x8cccd, + 0x3192c2, + 0x21dc4, + 0x68b49, 0x2003c2, - 0x6e24d48, - 0xf61c4, - 0x9fe08, - 0x1417c42, + 0x7221cc8, + 0xfe7c4, + 0x31c843, + 0x9a048, + 0x1414882, 0x14005c2, - 0x1417c42, - 0x1513486, - 0x22df03, - 0x26fb43, - 0x762c0c3, - 0x22fd84, - 0x7a32c43, - 0x8628b03, - 0x203dc2, - 0x224e44, - 0x20a803, - 0x2e59c3, - 0x201e02, - 0x216603, - 0x2185c2, - 0x301e43, - 0x204e82, - 0x203303, - 0x28a803, - 0x205842, - 0x9fe08, - 0x22df03, - 0x3c38c8, - 0x7ee59c3, - 0x201e02, - 0x301e43, - 0x204e82, - 0x8203303, - 0x28a803, - 0x205842, - 0x253c47, - 0x232c49, - 0x301e43, - 0x204e82, - 0x203303, - 0x28a803, - 0x205842, - 0x22c0c3, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x214543, - 0x211543, - 0x217b84, - 0x20a803, - 0x216603, - 0x20b142, - 0x216103, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x248343, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x20a803, - 0x216603, - 0x204185, - 0x20ff42, + 0x1414882, + 0x1517146, + 0x22f043, + 0x26f6c3, + 0x7a14a83, + 0x22fe44, + 0x7e32dc3, + 0x8b08003, + 0x206182, + 0x221dc4, + 0x21a3c3, + 0x3b1e83, + 0x204042, + 0x242543, + 0x202642, + 0x308f43, + 0x205142, + 0x2263c3, + 0x223a43, + 0x201342, + 0x9a048, + 0x22f043, + 0x3df888, + 0x83b1e83, + 0x204042, + 0x308f43, + 0x205142, + 0x86263c3, + 0x223a43, + 0x201342, + 0x252b07, + 0x232dc9, + 0x308f43, + 0x205142, + 0x2263c3, + 0x223a43, + 0x201342, + 0x214a83, + 0x16c2, + 0x32443, + 0x3c42, + 0xaac82, + 0x5cd82, + 0x17c2, + 0x1b82, + 0x43342, + 0x202703, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21bc83, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x20eb02, + 0x2141c3, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x202703, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21a3c3, + 0x242543, + 0x208805, + 0x20c782, 0x2000c2, - 0x9fe08, - 0x14470c8, - 0xf704a, - 0x228b03, - 0x203281, + 0x9a048, + 0x144ca88, + 0x12848a, + 0x308003, + 0x225cc1, 0x2009c1, 0x200a01, - 0x201301, - 0x201281, - 0x207101, - 0x2027c1, - 0x2223c1, - 0x203bc1, + 0x204ac1, + 0x204781, + 0x20a541, + 0x201941, + 0x225dc1, + 0x23ff81, 0x200001, 0x2000c1, 0x200201, - 0x12eb85, - 0x9fe08, + 0x139b05, + 0x9a048, 0x200101, - 0x2015c1, + 0x201301, 0x200501, - 0x2014c1, + 0x205dc1, 0x200041, 0x200801, 0x200181, @@ -2337,7112 +2348,7193 @@ var nodes = [...]uint32{ 0x200581, 0x2003c1, 0x200a81, - 0x209101, + 0x215481, 0x200401, 0x200741, 0x2007c1, 0x200081, 0x200f01, - 0x205841, - 0x201241, - 0x2018c1, - 0x204981, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x20c302, - 0x22c0c3, - 0x232c43, + 0x201341, + 0x204f01, + 0x201b41, + 0x201441, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x201242, + 0x214a83, + 0x232dc3, 0x2003c2, - 0x216603, - 0x1ae03, - 0x176c87, - 0x11647, - 0x39346, - 0x3484a, - 0x89988, - 0x53388, - 0x53f47, - 0xbdc06, - 0xe1145, - 0x175305, - 0x125b03, - 0x13686, - 0x3e006, - 0x242244, - 0x2f6d07, - 0x9fe08, - 0x2db1c4, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0xc302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x32cb48, - 0x345344, - 0x232b84, - 0x26bb44, - 0x3b9587, - 0x2d6b87, - 0x22c0c3, - 0x23560b, - 0x37400a, - 0x2ff007, - 0x308a08, - 0x2f7b48, - 0x232c43, - 0x2e6687, - 0x212483, - 0x204f48, - 0x209c89, - 0x224e44, - 0x214543, - 0x238cc8, - 0x211543, - 0x2d378a, - 0x2d9fc6, - 0x3a5d47, - 0x20a803, - 0x373846, - 0x26f9c8, - 0x216603, - 0x2433c6, - 0x2edf0d, - 0x2f0348, - 0x2f8a8b, - 0x20b186, - 0x3baac7, - 0x212605, - 0x3c554a, - 0x222085, - 0x2410ca, - 0x20ff42, - 0x205b03, - 0x241b04, - 0x200006, - 0x3ae643, - 0x29fd03, - 0x258783, - 0x20f643, - 0x373c83, - 0x203582, - 0x3abe85, - 0x2aad89, - 0x23d103, - 0x225843, - 0x215203, - 0x200201, - 0x2cfb07, - 0x2e0605, - 0x3a8843, - 0x3c7543, - 0x26bb44, - 0x2fef83, - 0x21b908, - 0x367b03, - 0x30f30d, - 0x3896c8, - 0x3c3a86, - 0x2fdec3, - 0x360cc3, - 0x38d5c3, - 0xc62c0c3, - 0x232488, - 0x235604, - 0x23e483, - 0x200106, - 0x241648, - 0x27c083, - 0x3c5583, - 0x22c243, - 0x232c43, - 0x2234c3, - 0x2420c3, - 0x284ac3, - 0x3313c3, - 0x28c603, - 0x20d643, - 0x38c105, - 0x24e984, - 0x24f307, - 0x2b12c2, - 0x252d83, - 0x256cc6, - 0x258283, - 0x258e03, - 0x277e03, - 0x2be4c3, - 0x3440c3, - 0x297e47, - 0xca28b03, - 0x2530c3, - 0x3d9e83, - 0x204f43, - 0x214383, - 0x2157c3, - 0x3c3345, - 0x372f03, - 0x200e09, - 0x201503, - 0x30b703, - 0xce35c03, - 0x2c9343, - 0x219a08, - 0x2aacc6, - 0x2be286, - 0x2b1306, - 0x388d07, + 0x242543, + 0x1bf83, + 0x17e707, + 0xd1407, + 0x28886, + 0x34b8a, + 0x8b848, + 0x54e08, + 0x558c7, + 0x174586, + 0xea585, + 0x97805, + 0x125483, + 0x11ec6, + 0x365c6, + 0x2d3684, + 0x328147, + 0x9a048, + 0x2e3504, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x1242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x32a248, + 0x204244, + 0x232d04, + 0x229904, + 0x24ab47, + 0x2e0007, + 0x214a83, + 0x235b4b, + 0x29650a, + 0x33c147, + 0x23bc48, + 0x33b888, + 0x232dc3, + 0x287847, 0x228503, - 0x238cc3, - 0x211543, - 0x289a86, - 0x21fdc2, - 0x28f543, - 0x33a385, - 0x20a803, - 0x316d07, - 0x160ca43, - 0x26f9c3, - 0x204343, - 0x230743, - 0x21d283, - 0x216603, - 0x20dc46, - 0x3b9d86, - 0x37a8c3, - 0x2ef183, - 0x216103, - 0x2275c3, - 0x310d03, - 0x2fd203, - 0x302203, - 0x3973c5, - 0x236bc3, - 0x236bc6, - 0x211f08, - 0x212983, - 0x212989, - 0x33f908, - 0x216f88, - 0x221105, - 0x22ceca, - 0x22e04a, - 0x237acb, - 0x23a5c8, - 0x2ed803, - 0x38cf03, - 0x2f9503, - 0x30e208, - 0x3606c3, - 0x2520c4, - 0x207442, - 0x25c283, + 0x206f88, + 0x2130c9, + 0x221dc4, + 0x21bc83, + 0x23b248, + 0x23c803, + 0x2dd74a, + 0x2e2806, + 0x3a4987, + 0x21a3c3, + 0x267906, + 0x26f548, + 0x242543, + 0x24d446, + 0x2f78cd, + 0x2f9e08, + 0x2fedcb, + 0x20eb46, + 0x24b347, + 0x2225c5, + 0x21674a, + 0x308245, + 0x3828ca, + 0x20c782, + 0x207783, + 0x23dec4, + 0x200006, + 0x3b05c3, + 0x299f43, + 0x27ee03, + 0x204243, + 0x296183, + 0x2041c2, + 0x355dc5, + 0x2ad8c9, + 0x23fc43, + 0x220dc3, + 0x21fdc3, + 0x200201, + 0x2f0447, + 0x2e9905, + 0x3b5c03, + 0x3d6d83, + 0x229904, + 0x343a43, + 0x20ff88, + 0x35d143, + 0x30d98d, + 0x278708, + 0x3dfa46, + 0x286a03, + 0x361583, + 0x38e083, + 0xce14a83, + 0x232608, + 0x235b44, + 0x240983, + 0x200106, + 0x243d88, + 0x27b0c3, + 0x216783, + 0x22d1c3, + 0x232dc3, + 0x21afc3, + 0x2532c3, + 0x283603, + 0x286983, + 0x2cbf83, + 0x2196c3, + 0x38b5c5, + 0x250804, + 0x251987, + 0x22dec2, + 0x254483, + 0x257d06, + 0x2592c3, + 0x25a283, + 0x277083, + 0x374e43, + 0x345843, + 0x29c047, + 0xd308003, + 0x2425c3, + 0x286a43, + 0x206c03, + 0x21bac3, + 0x24c903, + 0x20ef85, + 0x373c83, + 0x200e09, + 0x20bb83, + 0x311283, + 0xd63c883, + 0x2d3b03, + 0x219208, + 0x2ad806, + 0x374c06, + 0x2b7106, + 0x389147, + 0x227d43, + 0x2137c3, + 0x23c803, + 0x28b946, + 0x20f002, + 0x267d83, + 0x353145, + 0x21a3c3, + 0x319e87, + 0x1603dc3, + 0x202903, + 0x2089c3, + 0x21fec3, + 0x26d243, + 0x242543, + 0x209006, + 0x3b5f86, + 0x37a243, + 0x2f8a83, + 0x2141c3, + 0x220ec3, + 0x314c83, + 0x305fc3, + 0x309303, + 0x399905, + 0x22b983, + 0x39f446, + 0x2d1cc8, + 0x20cc83, + 0x20cc89, + 0x298948, + 0x223488, + 0x229a85, + 0x22f18a, + 0x23818a, + 0x239b4b, + 0x23b808, + 0x398943, + 0x38da83, + 0x30a583, + 0x326f48, + 0x376dc3, + 0x384644, + 0x235002, + 0x25ca83, 0x2007c3, - 0x228803, - 0x250d43, - 0x20f803, - 0x20ff42, - 0x229543, - 0x237843, - 0x313603, - 0x315504, - 0x241b04, - 0x3ced43, - 0x9fe08, + 0x356c43, + 0x263343, + 0x233d43, + 0x20c782, + 0x229e43, + 0x2398c3, + 0x3172c3, + 0x318284, + 0x23dec4, + 0x20fe43, + 0x9a048, 0x2000c2, 0x200ac2, - 0x203582, - 0x202542, + 0x2041c2, + 0x204b42, 0x200202, - 0x201ec2, - 0x25a902, - 0x201bc2, + 0x204342, + 0x240702, + 0x203c42, 0x200382, 0x200c42, - 0x252742, - 0x205a02, - 0x26bf42, + 0x33d642, + 0x202382, + 0x26c9c2, 0x200a82, - 0x2e5382, - 0x2161c2, - 0x201c82, - 0x216102, - 0x228702, - 0x204d42, + 0x2eda82, + 0x214282, + 0x205742, + 0x2141c2, + 0x2c1902, + 0x2069c2, 0x200682, - 0x216c82, - 0x202442, - 0x209482, - 0x202e42, - 0x2411c2, - 0x201942, + 0x206f02, + 0x2013c2, + 0x2090c2, + 0x2045c2, + 0x26c702, + 0x202982, 0xc2, 0xac2, - 0x3582, - 0x2542, + 0x41c2, + 0x4b42, 0x202, - 0x1ec2, - 0x5a902, - 0x1bc2, + 0x4342, + 0x40702, + 0x3c42, 0x382, 0xc42, - 0x52742, - 0x5a02, - 0x6bf42, + 0x13d642, + 0x2382, + 0x6c9c2, 0xa82, - 0xe5382, - 0x161c2, - 0x1c82, - 0x16102, - 0x28702, - 0x4d42, + 0xeda82, + 0x14282, + 0x5742, + 0x141c2, + 0xc1902, + 0x69c2, 0x682, - 0x16c82, - 0x2442, - 0x9482, - 0x2e42, - 0x411c2, - 0x1942, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x5b02, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0xc302, - 0x20c302, - 0x216603, - 0xe62c0c3, - 0x228b03, - 0x211543, - 0x6d9c3, - 0x22d7c2, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x57c2, + 0x6f02, + 0x13c2, + 0x90c2, + 0x45c2, + 0x6c702, + 0x2982, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x7782, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x1242, + 0x201242, + 0x242543, + 0xee14a83, + 0x308003, + 0x23c803, + 0x1b4103, + 0x22aec2, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x3dc3, + 0x1b4103, + 0x242543, + 0x1442, 0x2001c2, - 0x154da85, - 0x12eb85, - 0x208602, - 0x9fe08, - 0xc302, - 0x234482, - 0x204b02, + 0x15c45c5, + 0x139b05, + 0x20b3c2, + 0x9a048, + 0x1242, + 0x2347c2, + 0x206782, + 0x204642, 0x21bb02, - 0x211482, - 0x239242, - 0x175305, - 0x2016c2, - 0x201e02, - 0x218d42, - 0x201dc2, - 0x2161c2, - 0x23d182, - 0x201782, - 0x296542, - 0xf73f344, + 0x230a42, + 0x97805, + 0x202f42, + 0x204042, + 0x206e42, + 0x205e42, + 0x214282, + 0x23fcc2, + 0x202f82, + 0x292882, + 0xfe98384, 0x142, - 0x176c87, - 0x1266cd, - 0xe11c9, - 0x11214b, - 0xe8188, - 0x643c9, - 0x10c246, - 0x228b03, - 0x9fe08, + 0x17e707, + 0x12380d, + 0xea609, + 0x115e0b, + 0xeec08, + 0x65dc9, + 0x111b86, + 0x308003, + 0x9a048, 0x9c4, - 0x11c3, - 0x2b05, - 0x9fe08, - 0xddc47, - 0x54c46, - 0x2b49, - 0x7b0e, - 0x14a647, + 0x4e83, + 0x68b05, + 0x9a048, + 0xe5a47, + 0x56306, + 0x68b49, + 0x1d134e, + 0x14a887, 0x2000c2, - 0x242244, - 0x20c302, - 0x22c0c3, - 0x201d02, - 0x232c43, - 0x14403, + 0x2d3684, + 0x201242, + 0x214a83, + 0x2052c2, + 0x232dc3, + 0x1bb43, 0x200382, - 0x2db1c4, - 0x214543, - 0x244502, - 0x20a803, + 0x2e3504, + 0x21bc83, + 0x201f42, + 0x21a3c3, + 0x30a42, 0x2003c2, - 0x216603, - 0x240986, - 0x332b0f, + 0x242543, + 0x2431c6, + 0x32d94f, 0x602, - 0x6be683, - 0x9fe08, - 0x20c302, - 0x212483, - 0x228b03, - 0x211543, - 0xca43, - 0x7b08, - 0x15c2c4b, - 0x15642ca, - 0xf5009, - 0x15c534a, - 0x150bb87, - 0xa4b0b, - 0x160745, - 0x116a49, - 0x12eb85, - 0x176c87, - 0xf3644, - 0x20c302, - 0x22c0c3, - 0x228b03, - 0x20a803, + 0x725e43, + 0x2f294a, + 0x9a048, + 0x201242, + 0x228503, + 0x308003, + 0x23c803, + 0x3dc3, + 0x1467206, + 0x1d1348, + 0x141650b, + 0x156518a, + 0xf1fc9, + 0x15d024a, + 0x1511707, + 0xa878b, + 0x10b7c5, + 0xebbc5, + 0x119bc9, + 0x139b05, + 0x17e707, + 0xfbfc4, + 0x201242, + 0x214a83, + 0x308003, + 0x21a3c3, 0x2000c2, 0x200c82, - 0x338dc2, - 0x12a2c0c3, - 0x23b182, - 0x232c43, - 0x2014c2, - 0x26bc02, - 0x228b03, - 0x220482, - 0x288542, - 0x22a402, + 0x2019c2, + 0x13214a83, + 0x23d342, + 0x232dc3, + 0x20bb42, + 0x2299c2, + 0x308003, + 0x23c782, + 0x25d282, + 0x22a742, 0x200cc2, - 0x291482, + 0x290602, 0x200802, 0x200d82, - 0x2033c2, - 0x21efc2, - 0x217d82, - 0xe550c, - 0x2b2182, - 0x2f10c2, - 0x215982, - 0x2450c2, - 0x211543, + 0x23ee42, + 0x27b8c2, + 0x204702, + 0x1b19cc, + 0x2b8e42, + 0x252e82, + 0x2203c2, + 0x248642, + 0x23c803, 0x200bc2, - 0x20a803, - 0x228c42, - 0x25b002, - 0x216603, - 0x301b82, - 0x209482, - 0x216002, - 0x203382, - 0x210342, - 0x2e8f82, - 0x214682, - 0x22b902, - 0x21e202, - 0x32370a, - 0x366b8a, - 0x39914a, - 0x3de682, - 0x20e6c2, - 0x3c3302, - 0x12fda689, - 0x1328caca, - 0x142d1c7, - 0x136049c2, - 0x14bd543, - 0x2482, - 0x8caca, - 0x15d14e, - 0x249f84, - 0xf04c5, - 0x13e2c0c3, - 0x3b903, - 0x232c43, - 0x24b304, - 0x228b03, - 0x224e44, - 0x214543, - 0x13bfc9, - 0x8f7c6, - 0x211543, - 0xe88c4, - 0x2143, - 0x20a803, - 0x12abc5, - 0x20ca43, - 0x216603, - 0x1429b04, - 0x236bc3, - 0x10cbc4, - 0x205b03, - 0x9fe08, - 0xbe5c6, - 0x14bdb84, - 0x146045, - 0x14a40a, - 0x12c5c2, - 0x1454114d, - 0x1a36c6, - 0x8f11, - 0x14bda689, - 0x1460c8, - 0x4aa08, - 0x1b584807, - 0x2282, - 0x1da807, - 0xe840e, - 0x12eb8b, - 0x13390b, - 0x1a3f4a, - 0x8824a, - 0x6bb47, - 0x9fe08, - 0x11a9c8, - 0x58c7, - 0x1b81684b, - 0x1ae07, - 0x9582, - 0x2b80d, - 0x13e387, - 0x14ebca, - 0x1ce74f, - 0x1732cf, - 0x8cac2, - 0xc302, - 0x84a08, - 0x1bcfdc4c, - 0xe1cca, - 0xdd74a, - 0x4f08a, - 0x1894c8, - 0xd948, - 0x59748, - 0xddc08, - 0xe7688, - 0x81c2, - 0x14db0f, - 0xa24cb, - 0x18a0c8, - 0x67607, - 0x168a, - 0x11404b, - 0x330c9, - 0x44447, - 0xd848, - 0x2e20c, - 0x16c307, - 0x5674a, - 0xe688, - 0x6aace, - 0x6b28e, - 0x6b98b, - 0x1d2e8b, - 0x1cb64b, - 0xe3089, - 0xead0b, - 0x3934d, - 0x3b98b, - 0x3c10d, - 0x3c48d, - 0x3de4a, - 0x4194b, - 0x461cb, - 0x44845, - 0x1c026590, - 0x19794f, - 0x13f50f, - 0x6a44d, - 0x13c190, - 0x9802, - 0x1c7d0408, - 0x114c8, - 0x93110, - 0x11d30e, - 0x1cb67ac5, - 0x4a80b, - 0x13b0d0, - 0x515c8, - 0xda4a, - 0x1d3049, - 0x60907, - 0x60c47, - 0x60e07, - 0x61787, - 0x62b87, - 0x63107, - 0x63b87, - 0x640c7, - 0x64d07, - 0x65087, - 0x65747, - 0x65907, - 0x65ac7, - 0x65c87, - 0x664c7, - 0x67907, - 0x688c7, - 0x68c87, - 0x692c7, - 0x69587, - 0x69747, - 0x69a47, - 0x6be07, - 0x6c007, - 0x6cd87, - 0x6cf47, - 0x6d107, - 0x6f6c7, - 0x70a87, - 0x70f07, - 0x71647, - 0x71907, - 0x71c87, - 0x71e47, - 0x72247, - 0x72687, - 0x72a87, - 0x73007, - 0x731c7, - 0x73387, - 0x73c47, - 0x746c7, - 0x74c07, - 0x75207, - 0x753c7, - 0x75747, - 0x76847, - 0x4c02, - 0x5984a, - 0x13488, - 0x11a007, - 0x8a005, - 0xa7791, - 0x4886, - 0xfadca, - 0x8488a, - 0x54c46, - 0xacd8b, - 0x642, - 0x2f451, - 0xb6fc9, - 0x97249, - 0x33c2, - 0x198c0a, - 0xaa289, - 0xaa9cf, - 0xaafce, - 0xac0c8, - 0x4742, - 0xbe0c9, - 0x1b0ece, - 0xea24c, - 0xf4d0f, - 0x1aeece, - 0x26ccc, - 0xe3389, - 0xe3911, - 0xe3ec8, - 0x2e612, - 0x17f34d, - 0x1a054d, - 0x4abcb, - 0x58415, - 0x6dc89, - 0x7280a, - 0x7a089, - 0x80510, - 0x16ff8b, - 0x1a798f, - 0x9110b, - 0x9494c, - 0x99310, - 0xa9a4a, - 0xadccd, - 0xaf68e, - 0xafdca, - 0xc4a8c, - 0xb42d4, - 0xb6c51, - 0xb8e0b, - 0xb9f0f, - 0xbb38d, - 0xbf5ce, - 0xc22cc, - 0xc3e0c, - 0xc478b, - 0xc558e, - 0xc6110, - 0xc7dcb, - 0x11c78d, - 0x141d4f, - 0x16d38c, - 0xcf38e, - 0xd1151, - 0xd564c, - 0xde6c7, - 0xf2b0d, - 0xfc10c, - 0x110450, - 0x1cc44d, - 0x105687, - 0x147410, - 0x166dc8, - 0x1710cb, - 0xb0d8f, - 0x1432c8, - 0xfafcd, - 0x10a190, - 0x176b89, - 0x1ceb2d46, - 0xb3cc3, - 0xb90c5, - 0x4e082, - 0x1b09, - 0x5590a, - 0x1d22eac6, - 0x1d73e584, - 0x56286, - 0x1dc4a, - 0x6f0cd, - 0x1d9b9b89, - 0x17c03, - 0x11594a, - 0xdb911, - 0xdbd49, - 0xdd6c7, - 0xde408, - 0xde887, - 0x11a0c8, - 0x908b, - 0x12e989, - 0xe9250, - 0xe970c, - 0xea548, - 0xea8c5, - 0x79148, - 0x10eaca, - 0xc7c07, - 0x523c7, - 0x2f42, - 0x1de46bd5, - 0x13bdca, - 0x3d888, - 0x98b89, - 0x2efc5, - 0x116b8a, - 0x8d04f, - 0x12b98b, - 0x1c340c, - 0x147952, - 0x78005, - 0x1966c8, - 0x4b60a, - 0x1e2f5b85, - 0x183acc, - 0x138c03, - 0x190ec6, - 0x3d182, - 0x10238b, - 0x102dca, - 0x150314c, - 0x11848, - 0x3c2c8, - 0x1e63d906, - 0x12fec7, - 0xa982, - 0x4e82, - 0x4bdd0, - 0x66647, - 0x2dccf, - 0x13686, - 0x15c7ce, - 0x9588b, - 0x45948, - 0x33489, - 0xfe992, - 0x190f8d, - 0x111788, - 0x112009, - 0x17ab8d, - 0x1964c9, - 0x1d714b, - 0x69bc8, - 0x7ea48, - 0x80908, - 0x80d49, - 0x80f4a, - 0x8730c, - 0x4648a, - 0xec2ca, - 0x110d47, - 0x9f70a, - 0x13670d, - 0xe41d1, - 0x1eabf8c6, - 0x1ab70b, - 0x12cfcc, - 0x37908, - 0x61249, - 0x15b14d, - 0x1a38d0, - 0x17b8cd, - 0x14302, - 0x5cd8d, - 0x5402, - 0x18d82, - 0x110c8a, - 0x1d4ca, - 0xfacca, - 0x11998b, - 0x6b50c, - 0x11a4ca, - 0x11a74e, - 0x1b318d, - 0x1edde545, - 0x1dae88, - 0x57c2, - 0x14e85c3, - 0x14ebec0e, - 0x156037ce, - 0x15e0254a, - 0x16745d0e, - 0x16e8f9ce, - 0x1772b10c, - 0x142d1c7, - 0x142d1c9, - 0x14bd543, - 0x17f6ae8c, - 0x186e7b09, - 0x18ef8849, - 0x1974a209, - 0x2482, - 0xbeb51, - 0x3711, - 0x248d, - 0x145c51, - 0x8f911, - 0x12b04f, - 0x16adcf, - 0xe7a4c, - 0xf878c, - 0x14a14c, - 0x1dc00d, - 0x1015d5, - 0x661cc, - 0x7394c, - 0x1bad50, - 0x130d4c, - 0x133fcc, - 0x155a59, - 0x162919, - 0x199999, - 0x1b67d4, - 0x1c41d4, - 0x1d09d4, - 0x5a54, - 0x6b54, - 0x19e66289, - 0x1a5d0c89, - 0x1ae73a09, - 0x152e40c9, - 0x2482, - 0x15ae40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x162e40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x16ae40c9, - 0x2482, - 0x172e40c9, - 0x2482, - 0x17ae40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x182e40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x18ae40c9, - 0x2482, - 0x192e40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x19ae40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x1a2e40c9, - 0x2482, - 0x1aae40c9, - 0x2482, - 0x1b2e40c9, - 0x2482, - 0x5a4a, - 0x2482, - 0x1400401, - 0x8f05, - 0x1a3f44, - 0x1442303, - 0x15b08c3, - 0x14ef043, - 0xbec0e, - 0x37ce, - 0x7984e, - 0x254a, - 0x145d0e, - 0x8f9ce, - 0x12b10c, - 0x16ae8c, - 0xe7b09, - 0xf8849, - 0x14a209, - 0x66289, - 0x1d0c89, - 0x73a09, - 0x1017cd, - 0x5d09, - 0x6e09, - 0x14c004, - 0x1a5104, - 0x1b3644, - 0x1b5344, - 0xa4dc4, - 0x1a82c4, - 0x35e04, - 0x50fc4, - 0x13584, - 0x1587c03, - 0xbe9c7, - 0x33d8c, - 0x13583, - 0x9802, - 0x10bb86, - 0x1b3183, - 0x13583, - 0x9bb83, - 0x3f02, - 0x3f08, - 0xdff47, - 0x12ea07, - 0x81c2, - 0x2000c2, - 0x20c302, - 0x201d02, - 0x20c202, - 0x200382, - 0x2003c2, - 0x204e82, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x214383, - 0x20a803, - 0x216603, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x20a803, - 0x216603, - 0x8503, - 0x228b03, - 0x24e44, - 0x2000c2, - 0x248343, - 0x2122c0c3, - 0x38c507, - 0x228b03, - 0x20e403, - 0x217b84, - 0x20a803, - 0x216603, - 0x21de8a, - 0x240985, - 0x216103, - 0x219f82, - 0x9fe08, - 0x9fe08, - 0xc302, - 0x135f02, - 0x21bb990b, - 0x21e2c344, - 0x13e4c5, - 0x7d45, - 0xfdc46, - 0x22207d45, - 0x50cc3, - 0x93003, - 0x9c4, - 0x11c3, - 0x2b05, - 0x12eb85, - 0x9fe08, - 0x1ae07, - 0x2c0c3, - 0x2c28d, - 0x22a380c7, - 0x15c6, - 0x22ce7945, - 0x1a9012, - 0x381c7, - 0xa0ca, - 0x9f88, - 0xe207, - 0x63d4a, - 0x18aec8, - 0x62607, - 0x18098f, - 0x43dc7, - 0x50dc6, - 0x13b0d0, - 0xc9fcf, - 0x20f09, - 0x56304, - 0x2303828e, - 0x11fb09, - 0x65dc6, - 0x109649, - 0x18ce06, - 0x1ba306, - 0x189e8c, - 0x11424a, - 0x33247, - 0x129b8a, - 0x143889, - 0xed38c, - 0x1ceb0a, - 0x7e54a, - 0x2b49, - 0x56286, - 0x3330a, - 0x11268a, - 0xa0d4a, - 0x127149, - 0xdad88, - 0xdb006, - 0xe208d, - 0xb9545, - 0x23754d4c, - 0x14a647, - 0x107849, - 0xa8c07, - 0x10a594, - 0x10aa8b, - 0x6744a, - 0xfe80a, - 0xa6d8d, - 0x1519b89, - 0x11154c, - 0x111e0b, - 0xe683, - 0xe683, - 0x39346, - 0xe683, - 0xfdc48, - 0x1581c3, - 0x33445, - 0x141d703, - 0x4e9c9, - 0x156d603, - 0x1439887, - 0x80787, - 0x245846c9, - 0xa6c6, - 0xbd389, - 0x48343, - 0x9fe08, - 0xc302, - 0x4b304, - 0x4243, - 0x4185, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x225843, - 0x22c0c3, - 0x232c43, - 0x212483, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x297403, - 0x205b03, - 0x225843, - 0x242244, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x21d0c3, - 0x261847c5, - 0x142bd43, - 0x22c0c3, - 0x232c43, - 0x214403, - 0x212483, - 0x228b03, - 0x224e44, - 0x201143, - 0x238cc3, - 0x211543, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x216103, - 0x26e20643, - 0x147849, - 0xc302, - 0x2ff843, - 0x27a2c0c3, - 0x232c43, - 0x244743, - 0x228b03, - 0x217203, - 0x238cc3, - 0x216603, - 0x2f5cc3, - 0x3a4e04, - 0x9fe08, - 0x2822c0c3, - 0x232c43, - 0x2ac183, - 0x228b03, - 0x211543, - 0x217b84, - 0x20a803, - 0x216603, - 0x22d843, - 0x9fe08, - 0x28a2c0c3, - 0x232c43, - 0x212483, - 0x20ca43, - 0x216603, - 0x9fe08, - 0x142d1c7, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x217b84, - 0x20a803, - 0x216603, - 0x12eb85, - 0x176c87, - 0x10a7cb, - 0xdc144, - 0xb9545, - 0x14470c8, - 0x2a20d, - 0x29e352c5, - 0x46e44, - 0xc302, - 0x8303, - 0x176a85, - 0x2d7c2, - 0x1dc2, - 0x2e7585, - 0x9fe08, - 0x7e42, - 0xeec3, - 0x16368f, - 0xc302, - 0xfcac6, - 0x2000c2, - 0x248343, - 0x22c0c3, - 0x228b03, - 0x224e44, - 0x211543, - 0x217b84, - 0x20a803, - 0x216603, - 0x216103, - 0x2d7c2, - 0x32d6c8, - 0x242244, - 0x342bc6, - 0x34a006, - 0x9fe08, - 0x31f443, - 0x20f509, - 0x3046d5, - 0x1046df, - 0x22c0c3, - 0x11d07, - 0x330912, - 0x170a46, - 0x17f0c5, - 0xda4a, - 0x1d3049, - 0x3306cf, - 0x2db1c4, - 0x28ed85, - 0x30b4d0, - 0x322e47, - 0x20ca43, - 0x31b008, - 0xf6f86, - 0x280aca, - 0x224d04, - 0x2f55c3, - 0x219f82, - 0x2eec0b, - 0xca43, - 0x17d404, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x2fd643, - 0x20c302, - 0x12aec3, - 0x12a8c4, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20e403, - 0x22b0c3, - 0x216603, - 0x48343, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x20a803, - 0xca43, - 0x216603, - 0x2000c2, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x7d45, - 0x242244, - 0x22c0c3, - 0x232c43, - 0x303f84, - 0x20a803, - 0x216603, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x133d89, - 0x22c0c3, - 0x232c43, - 0x212483, - 0x204f43, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x329144, - 0x224e44, - 0x20a803, - 0x216603, - 0x205b03, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x220383, - 0x63f43, - 0xe403, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x32370a, - 0x3484c9, - 0x35f2cb, - 0x35f9ca, - 0x366b8a, - 0x378e4b, - 0x38cbca, - 0x39278a, - 0x39914a, - 0x3993cb, - 0x3b8049, - 0x3c840a, - 0x3c894b, - 0x3d5fcb, - 0x3dc90a, - 0x22c0c3, - 0x232c43, - 0x212483, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x920b, - 0x5a448, - 0x17acc4, - 0x91c6, - 0x3e109, - 0x9fe08, - 0x22c0c3, - 0xda44, - 0x260904, - 0x20aa02, - 0x217b84, - 0x203045, - 0x225843, - 0x242244, - 0x22c0c3, - 0x235604, - 0x232c43, - 0x24b304, - 0x2db1c4, - 0x224e44, - 0x238cc3, - 0x20a803, - 0x216603, - 0x25cf45, - 0x21d0c3, - 0x216103, - 0x24f1c3, - 0x246484, - 0x2be544, - 0x2bd645, - 0x9fe08, - 0x344b04, - 0x3ba486, - 0x202c84, - 0x20c302, - 0x347d47, - 0x243647, - 0x249204, - 0x238a05, - 0x3cc645, - 0x22cd85, - 0x224e44, - 0x388dc8, - 0x3db706, - 0x32bec8, - 0x27c8c5, - 0x2e2a45, - 0x340644, - 0x216603, - 0x2f61c4, - 0x377bc6, - 0x240a83, - 0x246484, - 0x2411c5, - 0x201a84, - 0x336544, - 0x219f82, - 0x322706, - 0x3ab5c6, - 0x30df85, - 0x2000c2, - 0x248343, - 0x3260c302, - 0x3d0584, - 0x200382, - 0x211543, - 0x209082, - 0x20a803, - 0x2003c2, - 0x2f1d06, - 0x20c603, - 0x205b03, - 0x9fe08, - 0x9fe08, - 0x228b03, - 0x6d9c3, - 0x2000c2, - 0x3320c302, - 0x228b03, - 0x2623c3, - 0x201143, - 0x22c344, - 0x20a803, - 0x216603, - 0x9fe08, - 0x2000c2, - 0x33a0c302, - 0x22c0c3, - 0x20a803, - 0xca43, - 0x216603, - 0x682, - 0x206902, - 0x20ff42, - 0x20e403, - 0x2ed343, - 0x2000c2, - 0x12eb85, - 0x9fe08, - 0x176c87, - 0x20c302, - 0x232c43, - 0x24b304, - 0x2020c3, - 0x228b03, - 0x204f43, - 0x211543, - 0x20a803, - 0x213dc3, - 0x216603, - 0x233c43, - 0x1b8a13, - 0x127c94, - 0x12eb85, - 0x176c87, - 0x10f246, - 0x11b7cb, - 0x39346, - 0x531c7, - 0x38a06, - 0x649, - 0x160d4a, - 0x8984d, - 0x1263cc, - 0x11300a, - 0x45c88, - 0x175305, - 0xa108, - 0x13686, - 0x1be2c6, - 0x3e006, - 0x602, - 0x209802, - 0x3b04, - 0x9bb86, - 0x184410, - 0x8170e, - 0x2846, - 0x1841cc, - 0x3537314b, - 0x12eb85, - 0x1426cb, - 0x357be204, - 0x1a4107, - 0x25191, - 0x11f54a, - 0x22c0c3, - 0x63cc5, - 0x1bd708, - 0x12704, - 0x55b05, - 0x3588c906, - 0xa7786, - 0xc14c6, - 0x9174a, - 0x1a8883, - 0x35e0bfc4, - 0x4e9c9, - 0x12c047, - 0x1770a, - 0x14ce3c9, - 0x605, - 0xeac83, - 0x3622eb47, - 0x12abc5, - 0x153c6c6, - 0x153f846, - 0xace4c, - 0xfa308, - 0x3643d183, - 0xeee4b, - 0x118a4b, - 0x36a4528c, - 0x14070c3, - 0xbb048, - 0xef0c5, - 0xa2349, - 0x119c88, - 0x141db86, - 0x88147, - 0x36f5b149, - 0x117787, - 0x16074a, - 0x111acd, - 0x8148, - 0x13583, - 0xbdb03, - 0xfdc48, - 0x13584, - 0x1224c5, - 0x148d103, - 0xe85c7, - 0x372e85c3, - 0x377afc46, - 0x37af67c4, - 0x37f02f87, - 0xfdc44, - 0xfdc44, - 0xfdc44, - 0xfdc44, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x2000c2, - 0x20c302, - 0x228b03, - 0x203dc2, - 0x20a803, - 0x216603, - 0x20c603, - 0x37fe4f, - 0x38020e, - 0x9fe08, - 0x22c0c3, - 0x41487, - 0x232c43, - 0x228b03, - 0x214543, - 0x20a803, - 0x216603, - 0x2784, - 0x1304, - 0x144444, - 0x21c0c3, - 0x374247, - 0x206082, - 0x26c3c9, - 0x200ac2, - 0x24c0cb, - 0x29d88a, - 0x29e589, - 0x200542, - 0x212ac6, - 0x38d7d5, - 0x24c215, - 0x231e53, - 0x24c793, - 0x212082, - 0x21e405, - 0x369e0c, - 0x27494b, - 0x297885, - 0x202542, - 0x299082, - 0x37bf46, - 0x202282, - 0x37bb46, - 0x20dccd, - 0x32a94c, - 0x226604, - 0x200882, - 0x20be02, - 0x22e9c8, - 0x200202, - 0x30e386, - 0x30e38f, - 0x393f90, - 0x21f204, - 0x38d995, - 0x231fd3, - 0x21cf83, - 0x349d0a, - 0x208b87, - 0x369349, - 0x2175c7, - 0x227682, - 0x200282, - 0x3b4e46, - 0x203c02, - 0x9fe08, - 0x208082, - 0x208342, - 0x21e9c7, - 0x330307, - 0x330311, - 0x218585, - 0x21858e, - 0x21968f, - 0x209582, - 0x373907, - 0x21c708, - 0x205b82, - 0x2c1142, - 0x21bb46, - 0x21bb4f, - 0x269f10, - 0x22a8c2, - 0x204042, - 0x251c88, - 0x204043, - 0x25c6c8, - 0x2db50d, - 0x2094c3, - 0x3bc3c8, - 0x27f40f, - 0x27f7ce, - 0x2fe4ca, - 0x2da0d1, - 0x2da550, - 0x2dc90d, - 0x2dcc4c, - 0x2ff6c7, - 0x349e87, - 0x342c89, - 0x226702, - 0x201ec2, - 0x2553cc, - 0x2556cb, - 0x200d42, - 0x2c4946, - 0x202c82, - 0x200482, - 0x28cac2, - 0x20c302, - 0x22c784, - 0x237d87, - 0x22ae02, - 0x23cbc7, - 0x23ed47, - 0x22e002, - 0x22dac2, - 0x241345, - 0x259dc2, - 0x382a4e, - 0x3c91cd, - 0x232c43, - 0x28658e, - 0x3d234d, - 0x32fe43, - 0x202102, - 0x284744, - 0x24a542, - 0x2253c2, - 0x39b645, - 0x39ce07, - 0x243f82, - 0x20c202, - 0x24af07, - 0x24ed48, - 0x2b12c2, - 0x278086, - 0x25524c, - 0x25558b, - 0x203d42, - 0x25d0cf, - 0x25d490, - 0x25d88f, - 0x25dc55, - 0x25e194, - 0x25e68e, - 0x25ea0e, - 0x25ed8f, - 0x25f14e, - 0x25f4d4, - 0x25f9d3, - 0x25fe8d, - 0x276a09, - 0x28b243, - 0x2020c2, - 0x35c2c5, - 0x3cfd46, - 0x200382, - 0x3776c7, - 0x228b03, - 0x200642, - 0x231448, - 0x2da311, - 0x2da750, - 0x202b82, - 0x28a387, - 0x201742, - 0x247f07, - 0x24e082, - 0x328c49, - 0x37bf07, - 0x296c48, - 0x28c746, - 0x28f303, - 0x28f305, - 0x21d702, - 0x2004c2, - 0x3b5245, - 0x383f45, - 0x201b02, - 0x22aec3, - 0x342a47, - 0x20c907, - 0x201f82, - 0x201f84, - 0x20e503, - 0x2ebf89, - 0x20e508, - 0x203102, - 0x205f82, - 0x2eb887, - 0x3dd285, - 0x33fb88, - 0x34e347, - 0x21a7c3, - 0x29ba06, - 0x2dc78d, - 0x2dcb0c, - 0x2d5d46, - 0x204b02, - 0x21fc02, - 0x206a42, - 0x27f28f, - 0x27f68e, - 0x3cc6c7, - 0x206702, - 0x295d05, - 0x295d06, - 0x21d902, - 0x200bc2, - 0x28d746, - 0x2062c3, - 0x206586, - 0x2cc185, - 0x2cc18d, - 0x2cc7d5, - 0x2cd88c, - 0x2cdc0d, - 0x2cdf52, - 0x205a02, - 0x26bf42, - 0x2050c2, - 0x3dbec6, - 0x3b0d86, - 0x202f42, - 0x3cfdc6, - 0x218d42, - 0x374a45, - 0x202f82, - 0x382b89, - 0x22330c, - 0x22364b, - 0x2003c2, - 0x24f708, - 0x201902, - 0x200a82, - 0x271f86, - 0x2e4045, - 0x200a87, - 0x228445, - 0x2563c5, - 0x2091c2, - 0x20a1c2, - 0x2161c2, - 0x3a7c87, - 0x2f1dcd, - 0x2f214c, - 0x243047, - 0x278002, - 0x201c82, - 0x3c63c8, - 0x201c88, - 0x32c1c8, - 0x2faf84, - 0x2c5807, - 0x33e603, - 0x223c42, - 0x212842, - 0x2f3749, - 0x26aec7, - 0x216102, - 0x272385, - 0x220082, - 0x20b182, - 0x2fd083, - 0x2fd086, - 0x2fd202, - 0x301b02, - 0x200402, - 0x36c686, - 0x2aba07, - 0x215f02, - 0x200902, - 0x25c50f, - 0x2863cd, - 0x3b12ce, - 0x3d21cc, - 0x204bc2, - 0x203d82, - 0x28c585, - 0x320886, - 0x200b82, - 0x204d42, - 0x200682, - 0x286744, - 0x2db384, - 0x359786, - 0x204e82, - 0x286e87, - 0x23bc03, - 0x23bc08, - 0x23f748, - 0x37f1c7, - 0x24e306, - 0x201702, - 0x2183c3, - 0x2183c7, - 0x314946, - 0x2e7e85, - 0x2fb308, - 0x202602, - 0x3a9687, - 0x2411c2, - 0x293042, - 0x209442, - 0x219809, - 0x201082, - 0xc41c8, - 0x2021c2, - 0x2432c3, - 0x202247, - 0x205c42, - 0x22348c, - 0x22378b, - 0x2d5dc6, - 0x2eabc5, - 0x247c82, - 0x201942, - 0x2bf146, - 0x236483, - 0x328ec7, - 0x235282, - 0x2008c2, - 0x38d655, - 0x24c3d5, - 0x231d13, - 0x24c913, - 0x37f647, - 0x25b951, - 0x262d10, - 0x274d92, - 0x2779d1, - 0x284bc8, - 0x284bd0, - 0x2d7c8f, - 0x29d653, - 0x29e352, - 0x29ffd0, - 0x2a7b8f, - 0x2a9e12, - 0x305811, - 0x371353, - 0x3b78d2, - 0x2b2e8f, - 0x2cbe0e, - 0x2cd412, - 0x2d3c51, - 0x2d430f, - 0x2d830e, - 0x2d9791, - 0x2de010, - 0x2df0d2, - 0x2e8a91, - 0x2ef5d0, - 0x2fa4cf, - 0x2fd6d1, - 0x3029d0, - 0x31bb46, - 0x3adfc7, - 0x20ce47, - 0x201a42, - 0x2824c5, - 0x30b247, - 0x20ff42, - 0x207e02, - 0x229545, - 0x220883, - 0x2bdfc6, - 0x2f1f8d, - 0x2f22cc, - 0x217042, - 0x369c8b, - 0x27480a, - 0x21e2ca, - 0x2bc0c9, - 0x2f0c0b, - 0x34e48d, - 0x30b94c, - 0x25b3ca, - 0x27108c, - 0x2758cb, - 0x2976cc, - 0x31ce0e, - 0x36710b, - 0x2b1d4c, - 0x2e2703, - 0x37aa86, - 0x3bcb02, - 0x2fbb02, - 0x25a083, - 0x20ff82, - 0x233b03, - 0x324b86, - 0x25de07, - 0x2e0e06, - 0x2e1e88, - 0x3428c8, - 0x31d5c6, - 0x200f02, - 0x30d94d, - 0x30dc8c, - 0x318c07, - 0x312e47, - 0x229942, - 0x216302, - 0x218342, - 0x279642, - 0x335056, - 0x33a4d5, - 0x33d6d6, - 0x346693, - 0x346d52, - 0x357d53, - 0x358492, - 0x3aa4cf, - 0x3bbb18, - 0x3bc5d7, - 0x3bdc19, - 0x3be7d8, - 0x3bf698, - 0x3c46d7, - 0x3c57d7, - 0x3c7016, - 0x3ca6d3, - 0x3cbc95, - 0x3cc992, - 0x3cce13, - 0x20c302, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x217b84, - 0x20a803, - 0x216603, - 0x20c603, - 0x2000c2, - 0x203042, - 0x39e946c5, - 0x3a219305, - 0x3a675c06, - 0x9fe08, - 0x3aab3405, - 0x20c302, - 0x201d02, - 0x3aefedc5, - 0x3b280405, - 0x3b681c47, - 0x3ba82949, - 0x3bf064c4, - 0x200382, - 0x200642, - 0x3c25aec5, - 0x3c6998c9, - 0x3cb34708, - 0x3ceafc45, - 0x3d313987, - 0x3d622508, - 0x3db11985, - 0x3de9a406, - 0x3e243789, - 0x3e6d1dc8, - 0x3eac45c8, - 0x3ee99f0a, - 0x3f277244, - 0x3f605285, - 0x3fac0b08, - 0x3fe01885, - 0x213ec2, - 0x40242a83, - 0x406a64c6, - 0x40b4f408, - 0x40e1f986, - 0x412dd348, - 0x41779b06, - 0x41a3f204, - 0x41e05642, - 0x427315c7, - 0x42aacb84, - 0x42e79cc7, - 0x433c4d87, - 0x2003c2, - 0x4369e985, - 0x43a88bc4, - 0x43ed0e07, - 0x4423b747, - 0x44684586, - 0x44a81485, - 0x44e999c7, - 0x452d1c48, - 0x457c5107, - 0x45b48289, - 0x45ed3985, - 0x463102c7, - 0x46693d06, - 0x46e4b, - 0x46a7b288, - 0x2221cd, - 0x27d049, - 0x28858b, - 0x2aa48b, - 0x2b734b, - 0x31368b, - 0x320a8b, - 0x320d4b, - 0x321b89, - 0x32398b, - 0x323c4b, - 0x32430b, - 0x32548a, - 0x3259ca, - 0x325fcc, - 0x32bc4b, - 0x32c3ca, - 0x3419ca, - 0x34d0ce, - 0x35024e, - 0x3505ca, - 0x3521ca, - 0x352bcb, - 0x352e8b, - 0x353b0b, - 0x36d78b, - 0x36dd8a, - 0x36ea4b, - 0x36ed0a, - 0x36ef8a, - 0x36f20a, - 0x38decb, - 0x39360b, - 0x395ace, - 0x395e4b, - 0x39cfcb, - 0x39de8b, - 0x3a124a, - 0x3a14c9, - 0x3a170a, - 0x3a31ca, - 0x3bb50b, - 0x3c8c0b, - 0x3c960a, - 0x3ca10b, - 0x3d38cb, - 0x3dc34b, - 0x46e82f08, - 0x47288fc9, - 0x476a21c9, - 0x47ae4d08, - 0x359505, - 0x218e03, - 0x27e244, - 0x2abc05, - 0x306206, - 0x34d545, - 0x288844, - 0x3775c8, - 0x3197c5, - 0x295604, - 0x3c17c7, - 0x2a154a, - 0x381fca, - 0x3cc7c7, - 0x218d07, - 0x2de547, - 0x282bc7, - 0x35e6c5, - 0x3b0106, - 0x3b0347, - 0x3bdb04, - 0x2f1246, - 0x2f1146, - 0x3b06c5, - 0x355784, - 0x29af46, - 0x2a0607, - 0x26a746, - 0x31f207, - 0x27e303, - 0x39c446, - 0x251ec5, - 0x281d47, - 0x267aca, - 0x231544, - 0x220c88, - 0x310809, - 0x2cc587, - 0x38f346, - 0x28ee48, - 0x2200c9, - 0x369504, - 0x35c644, - 0x2d5085, - 0x225d48, - 0x2ca407, - 0x2f3249, - 0x228ec8, - 0x315686, - 0x229a46, - 0x29b888, - 0x371b06, - 0x219305, - 0x284646, - 0x27a648, - 0x27f186, - 0x25440b, - 0x292ec6, - 0x29d1cd, - 0x3c12c5, - 0x2aca46, - 0x210985, - 0x3b91c9, - 0x249507, - 0x3a4a48, - 0x314486, - 0x29c489, - 0x3b8486, - 0x267a45, - 0x215146, - 0x2c9006, - 0x2cee49, - 0x2b9b06, - 0x2a1247, - 0x2a4385, - 0x207683, - 0x223cc5, - 0x2affc7, - 0x36a486, - 0x3c11c9, - 0x275c06, - 0x279ec6, - 0x21a549, - 0x284049, - 0x2a4907, - 0x344e08, - 0x2a75c9, - 0x282148, - 0x3929c6, - 0x2dab45, - 0x278eca, - 0x279f46, - 0x21ce06, - 0x2d28c5, - 0x24ff08, - 0x2eb407, - 0x22f24a, - 0x24bb06, - 0x2f4745, - 0x302086, - 0x328687, - 0x38f207, - 0x21b145, - 0x267c05, - 0x269d86, - 0x26e4c6, - 0x27fdc6, - 0x226384, - 0x2835c9, - 0x28a146, - 0x2fd3ca, - 0x2278c8, - 0x30ffc8, - 0x381fca, - 0x223fc5, - 0x2a0545, - 0x3c1e08, - 0x2bcc08, - 0x266e07, - 0x226b86, - 0x338748, - 0x20e887, - 0x2815c8, - 0x2b8cc6, - 0x285308, - 0x298406, - 0x27ca47, - 0x3229c6, - 0x29af46, - 0x26ed4a, - 0x2d5ec6, - 0x2dab49, - 0x368506, - 0x21eb0a, - 0x23f209, - 0x2f2786, - 0x2baac4, - 0x35c38d, - 0x289247, - 0x2e6186, - 0x2c4485, - 0x3b8505, - 0x38fe46, - 0x2d0c49, - 0x2b7907, - 0x27bb46, - 0x2c9e46, - 0x2888c9, - 0x359a44, - 0x244f84, - 0x340e88, - 0x236846, - 0x2a3e08, - 0x2150c8, - 0x219447, - 0x3b5b89, - 0x27ffc7, - 0x2b32ca, - 0x2f420f, - 0x26f44a, - 0x28c385, - 0x27a885, - 0x214f05, - 0x21f147, - 0x267083, - 0x345008, - 0x20ef06, - 0x20f009, - 0x3cb186, - 0x2d0487, - 0x29c249, - 0x3a4948, - 0x2d2987, - 0x31da43, - 0x359585, - 0x3281c5, - 0x2261cb, - 0x201944, - 0x308804, - 0x278686, - 0x31dc07, + 0x21a3c3, + 0x243802, + 0x249b42, + 0x242543, + 0x308c82, + 0x2090c2, + 0x2023c2, + 0x202d42, + 0x207242, + 0x2f00c2, + 0x21e502, + 0x226dc2, + 0x223fc2, + 0x322c0a, + 0x36860a, 0x39abca, - 0x242b07, - 0x2ff907, - 0x280405, - 0x3bfc85, - 0x26de89, - 0x29af46, - 0x24298d, - 0x33fac5, - 0x2b6243, - 0x23ffc3, - 0x3d0605, - 0x35e345, - 0x28ee48, - 0x27c487, - 0x244d06, - 0x2a1e46, - 0x229e05, - 0x232f07, - 0x2e6d07, - 0x3db5c7, - 0x20530a, - 0x39c508, - 0x226384, - 0x27ef07, - 0x27ec47, - 0x353106, - 0x297a87, - 0x2e0388, - 0x360f08, - 0x249406, - 0x218f48, - 0x2b9b84, - 0x3b0346, - 0x238786, - 0x3aa006, - 0x345606, - 0x219cc4, - 0x282c86, - 0x2c3106, - 0x29b306, - 0x22f846, - 0x3c6986, - 0x2e01c6, - 0x244c08, - 0x2b4d08, - 0x2d6848, - 0x34d748, - 0x3c1d86, - 0x209a85, - 0x223c86, - 0x2afcc5, - 0x391e47, - 0x228f85, - 0x20ba83, - 0x20ca85, - 0x230fc4, - 0x3c6ac5, - 0x201903, - 0x393907, - 0x36d1c8, - 0x31f2c6, - 0x376e0d, - 0x27a846, - 0x29a8c5, - 0x219803, - 0x2c04c9, - 0x359bc6, - 0x296206, - 0x398b84, - 0x26f3c7, - 0x36c186, - 0x2b7bc5, - 0x242943, - 0x3d7004, - 0x27ee06, - 0x238884, - 0x2e9f88, - 0x3befc9, - 0x309209, - 0x2a3c0a, - 0x2a54cd, - 0x2318c7, - 0x3ba1c6, - 0x20a204, - 0x282949, - 0x287b88, - 0x288e46, - 0x234b46, - 0x297a87, - 0x2c1246, - 0x34fc46, - 0x2ffa86, - 0x3c4e0a, - 0x222508, - 0x2e3805, - 0x33e9c9, - 0x2cab8a, - 0x305288, - 0x29f1c8, - 0x296188, - 0x2e710c, - 0x350805, - 0x2a20c8, - 0x2b5006, - 0x317646, - 0x3d8287, - 0x242a05, - 0x2847c5, - 0x3090c9, - 0x20ac07, - 0x20efc5, - 0x237187, - 0x23ffc3, - 0x2cb045, - 0x21ac08, - 0x283347, - 0x29f089, - 0x2dedc5, - 0x3ae2c4, - 0x2a5188, - 0x331707, - 0x2d2b48, - 0x3d36c8, - 0x2adbc5, - 0x21f506, - 0x249886, - 0x2d5449, - 0x2b3f47, - 0x2b0386, - 0x3d00c7, - 0x205083, - 0x3064c4, - 0x2d8c85, - 0x233044, - 0x248d84, - 0x3890c7, - 0x2651c7, - 0x27bd04, - 0x29eed0, - 0x33ebc7, - 0x3bfc85, - 0x2f764c, - 0x32a2c4, - 0x2b2b48, - 0x27c949, - 0x385146, - 0x319dc8, - 0x270d84, - 0x278988, - 0x331dc6, - 0x26ebc8, - 0x2a0bc6, - 0x2d004b, - 0x32de45, - 0x2d8b08, - 0x213304, - 0x3bf40a, - 0x29f089, - 0x3228c6, - 0x225fc8, - 0x258305, - 0x2bfd44, - 0x2b2a46, - 0x3db488, - 0x282f08, - 0x338fc6, - 0x301104, - 0x278e46, - 0x280047, - 0x279bc7, - 0x297a8f, - 0x32eec7, - 0x2f2847, - 0x295bc5, - 0x376185, - 0x2a45c9, - 0x2d7886, - 0x389305, - 0x284347, - 0x2cd008, - 0x2f9c05, - 0x3229c6, - 0x227708, - 0x21f98a, - 0x3db188, - 0x28d4c7, - 0x2f4646, - 0x33e986, - 0x2003c3, - 0x208a43, - 0x2cad49, - 0x2a7449, - 0x2b2946, - 0x2dedc5, - 0x2191c8, - 0x225fc8, - 0x371c88, - 0x2ffb0b, - 0x377047, - 0x31ae49, - 0x297d08, - 0x351c84, - 0x3a9c48, - 0x290cc9, - 0x2b0685, - 0x21f047, - 0x306545, - 0x282e08, - 0x29454b, - 0x299710, - 0x2ac685, - 0x21324c, - 0x244ec5, - 0x280483, - 0x31cc06, - 0x2c2644, - 0x288cc6, - 0x2a0607, - 0x212bc4, - 0x23ffc8, - 0x344ecd, - 0x31c485, - 0x231904, - 0x2a3484, - 0x2a3489, - 0x2af088, - 0x32e307, - 0x331e48, - 0x283688, - 0x27be45, - 0x2110c7, - 0x27bdc7, - 0x20f2c7, - 0x267c09, - 0x2e6809, - 0x3c3b86, - 0x2dce46, - 0x284406, - 0x323fc5, - 0x3af9c4, - 0x3bcb46, - 0x3bed86, - 0x27be88, - 0x32834b, - 0x2363c7, - 0x20a204, - 0x36c0c6, - 0x2e06c7, - 0x3da1c5, - 0x374cc5, - 0x227c84, - 0x2e6786, - 0x3bcbc8, - 0x282949, - 0x264806, - 0x287988, - 0x2b7c86, - 0x35d948, - 0x32170c, - 0x27bd06, - 0x29a58d, - 0x29aa0b, - 0x2a1305, - 0x2e6e47, - 0x2b9c06, - 0x38f0c8, - 0x3c3c09, - 0x307e48, - 0x3bfc85, - 0x3bd847, - 0x282248, - 0x3c0bc9, - 0x36be06, - 0x26470a, - 0x38ee48, - 0x307c8b, - 0x22278c, - 0x278a88, - 0x27e846, - 0x210ac8, - 0x21f607, - 0x21ca09, - 0x3983cd, - 0x29ae46, - 0x267048, - 0x2b4bc9, - 0x2c0f48, - 0x285408, - 0x2c3b4c, - 0x2c5107, - 0x2c5bc7, - 0x267a45, - 0x2c0d87, - 0x2ccec8, - 0x2b2ac6, - 0x2934cc, - 0x2f9688, - 0x2d1588, - 0x234d86, - 0x34ef07, - 0x3c3d84, - 0x34d748, - 0x28688c, - 0x289b8c, - 0x28c405, - 0x3b0747, - 0x301086, - 0x34ee86, - 0x3b9388, - 0x21c984, - 0x26a74b, - 0x286fcb, - 0x2f4646, - 0x344d47, - 0x28f405, - 0x271a45, - 0x26a886, - 0x2582c5, - 0x201905, - 0x2cec87, - 0x20afc9, - 0x26e684, - 0x258e45, - 0x2fcfc5, - 0x2e9d08, - 0x28b9c5, - 0x2bd109, - 0x2b3947, - 0x2b394b, - 0x2f24c6, - 0x244949, - 0x3556c8, - 0x291005, - 0x20f3c8, - 0x2e6848, - 0x261fc7, - 0x331bc7, - 0x389149, - 0x26eb07, - 0x29cf89, - 0x2fc3cc, - 0x348188, - 0x2b9649, - 0x2bb207, - 0x283749, - 0x2ff287, - 0x222888, - 0x3b5d45, - 0x3b02c6, - 0x2c44c8, - 0x2d7148, - 0x2caa49, - 0x201947, - 0x272445, - 0x336b09, - 0x2d3206, - 0x293d04, - 0x31bf86, - 0x34f288, - 0x3cbac7, - 0x328548, - 0x219009, - 0x2f8107, - 0x2a1706, - 0x2e6f04, - 0x20cb09, - 0x210f48, - 0x234c47, - 0x36b6c6, - 0x328286, - 0x21cd84, - 0x2f5206, - 0x20f0c3, - 0x32d9c9, - 0x32de06, - 0x2accc5, - 0x2a1e46, - 0x2cf205, - 0x2826c8, - 0x20edc7, - 0x238ec6, - 0x2fee06, - 0x30ffc8, - 0x2a4747, - 0x29ae85, - 0x29ecc8, - 0x3a77c8, - 0x38ee48, - 0x244d85, - 0x3b0346, - 0x308fc9, - 0x2d52c4, - 0x2cf08b, - 0x34f94b, - 0x2e3709, - 0x23ffc3, - 0x256085, - 0x2e48c6, - 0x245b08, - 0x304204, - 0x31f2c6, - 0x205449, - 0x2c2f05, - 0x2cebc6, - 0x331706, - 0x2191c4, - 0x29f34a, - 0x2acc08, - 0x2d7146, - 0x3c2785, - 0x344bc7, - 0x35e587, - 0x21f504, - 0x34fb87, - 0x228f44, - 0x228f46, - 0x20eb03, - 0x267c05, - 0x2b1045, - 0x32f108, - 0x27f0c5, - 0x27ba49, - 0x2a62c7, - 0x34d58b, - 0x2a62cc, - 0x2a68ca, - 0x313987, - 0x20cc43, - 0x3897c8, - 0x244f45, - 0x2f9c85, - 0x359644, - 0x222786, - 0x27c946, - 0x2f5247, - 0x33608b, - 0x219cc4, - 0x3ac004, - 0x2c9a44, - 0x2ce986, - 0x212bc4, - 0x225e48, - 0x359445, - 0x21afc5, - 0x371bc7, - 0x2e6f49, - 0x35e345, - 0x38fe4a, - 0x2a4289, - 0x2ae38a, - 0x3c4f49, - 0x352404, - 0x2c9f05, - 0x2c1348, - 0x2d0ecb, - 0x2d5085, - 0x215246, - 0x209744, - 0x27bf86, - 0x2f7f89, - 0x2e07c7, - 0x275dc8, - 0x2a5846, - 0x27ffc7, - 0x282f08, - 0x3903c6, - 0x3bd204, - 0x380547, - 0x36fe85, - 0x382607, - 0x29a404, - 0x2b9b86, - 0x304f88, - 0x29abc8, - 0x2f1887, - 0x31d6c8, - 0x2984c5, - 0x240004, - 0x381ec8, - 0x295e04, - 0x214e85, - 0x305184, - 0x20e987, - 0x28a207, - 0x283888, - 0x2d2cc6, - 0x27f045, - 0x27b848, - 0x248e88, - 0x2a3b49, - 0x34fc46, - 0x22f2c8, - 0x3bf28a, - 0x3da248, - 0x311985, - 0x223e86, - 0x2a4148, - 0x3bd90a, - 0x20d487, - 0x287fc5, - 0x293f08, - 0x2ab804, - 0x24ff86, - 0x2c5f48, - 0x3c6986, - 0x3c9c88, - 0x254747, - 0x3c16c6, - 0x2baac4, - 0x266847, - 0x2b5684, - 0x2f7f47, - 0x36bacd, - 0x266e85, - 0x2d0a4b, - 0x289e06, - 0x24f808, - 0x23ff84, - 0x3c1f86, - 0x27ee06, - 0x210e07, - 0x29a24d, - 0x2fbf87, - 0x2b6188, - 0x285585, - 0x26e048, - 0x2ca386, - 0x298548, - 0x22e4c6, - 0x2f73c7, - 0x283c09, - 0x35a447, - 0x289108, - 0x273d85, - 0x229e88, - 0x34edc5, - 0x26b045, - 0x34c4c5, - 0x215183, - 0x2846c4, - 0x294105, - 0x243789, - 0x36b5c6, - 0x2e0488, - 0x331985, - 0x2b7f47, - 0x3171ca, - 0x2ceb09, - 0x2c8f0a, - 0x2d68c8, - 0x236fcc, - 0x2843cd, - 0x30ad03, - 0x3c9b88, - 0x3d6fc5, - 0x21f746, - 0x3a47c6, - 0x35c045, - 0x3d01c9, - 0x28e9c5, - 0x27b848, - 0x257506, - 0x360146, - 0x2a5049, - 0x3a6787, - 0x294806, - 0x317148, - 0x3a9f08, - 0x2e4f07, - 0x2c328e, - 0x2ca5c5, - 0x3c0ac5, - 0x3c6888, - 0x31a307, - 0x200e42, - 0x2c36c4, - 0x288bca, - 0x234d08, - 0x2e6986, - 0x29c388, - 0x249886, - 0x36a0c8, - 0x2b0388, - 0x26b004, - 0x2b8705, - 0x602c84, - 0x602c84, - 0x602c84, - 0x204ec3, - 0x328106, - 0x27bd06, - 0x2a0fcc, - 0x202f03, - 0x2cab86, - 0x21a9c4, - 0x359b48, - 0x205285, - 0x288cc6, - 0x2c0c08, - 0x2d8046, - 0x238e46, - 0x212bc8, - 0x2d8d07, - 0x26e8c9, - 0x32044a, - 0x2052c4, - 0x228f85, - 0x2f3205, - 0x3598c6, - 0x231906, - 0x2a1b06, - 0x3cc306, - 0x26ea04, - 0x26ea0b, - 0x228d44, - 0x244ac5, - 0x2af585, - 0x219506, - 0x3c6e08, - 0x284287, - 0x32dd84, - 0x25a2c3, - 0x2ab305, - 0x31be47, - 0x28418b, - 0x32f007, - 0x2c0b08, - 0x2bf447, - 0x269406, - 0x27d308, - 0x292a0b, - 0x2abb46, - 0x213a89, - 0x292b85, - 0x31da43, - 0x2cebc6, - 0x254648, - 0x214303, - 0x27d903, - 0x27b386, - 0x249886, - 0x37880a, - 0x27e885, - 0x27ec4b, - 0x2a1d8b, - 0x244043, - 0x206743, - 0x2b3244, - 0x249647, - 0x2546c4, - 0x219344, - 0x2b4e84, - 0x3da548, - 0x3c26c8, - 0x2089c9, - 0x2d3a08, - 0x34c747, - 0x22f846, - 0x2e00cf, - 0x2ca706, - 0x2d6044, - 0x3c250a, - 0x31bd47, - 0x2b5786, - 0x293d49, - 0x208945, - 0x32f245, - 0x208a86, - 0x229fc3, - 0x2ab849, - 0x222686, - 0x218dc9, - 0x39abc6, - 0x267c05, - 0x28c805, - 0x206643, - 0x249788, - 0x32e4c7, - 0x20ef04, - 0x3599c8, - 0x3173c4, - 0x356506, - 0x31cc06, - 0x23b486, - 0x2d89c9, - 0x2f9c05, - 0x29af46, - 0x247d89, - 0x2c9646, - 0x2e01c6, - 0x39f786, - 0x212185, - 0x305186, - 0x2f73c4, - 0x3b5d45, - 0x2c44c4, - 0x2b6b06, - 0x33fa84, - 0x201a43, - 0x287c45, - 0x233c08, - 0x3d2cc7, - 0x304289, - 0x287ec8, - 0x29b651, - 0x33178a, - 0x2f4587, - 0x254886, - 0x21a9c4, - 0x2c45c8, - 0x2b5c48, - 0x29b80a, - 0x2bcecd, - 0x215146, - 0x212cc6, - 0x266906, - 0x21afc7, - 0x2b6245, - 0x251907, - 0x344ec5, - 0x2b3a84, - 0x206686, - 0x2269c7, - 0x2ab54d, - 0x2a4087, - 0x3774c8, - 0x27bb49, - 0x223d86, - 0x36bd85, - 0x23ae44, - 0x34f386, - 0x21f406, - 0x234e86, - 0x29cc08, - 0x223283, - 0x210e03, - 0x343085, - 0x35c6c6, - 0x2b0345, - 0x2a5a48, - 0x2a07ca, - 0x246b04, - 0x359b48, - 0x296188, - 0x219347, - 0x331a49, - 0x2c0808, - 0x2829c7, - 0x2b5106, - 0x3c698a, - 0x34f408, - 0x307009, - 0x2af148, - 0x227f89, - 0x361107, - 0x303505, - 0x2ffd06, - 0x2b2948, - 0x24f988, - 0x313c48, - 0x31c5c8, - 0x244ac5, - 0x200d04, - 0x232588, - 0x23eb84, - 0x3c4d44, - 0x267c05, - 0x295647, - 0x2e6d09, - 0x210c07, - 0x21a5c5, - 0x278886, - 0x368186, - 0x213bc4, - 0x2a5386, - 0x27e044, - 0x292686, - 0x2e6ac6, - 0x214146, - 0x3bfc85, - 0x2a5907, - 0x20cc43, - 0x20a909, - 0x30fdc8, - 0x282844, - 0x28284d, - 0x29acc8, - 0x2f0148, - 0x306f86, - 0x283d09, - 0x2ceb09, - 0x2f7c85, - 0x2a08ca, - 0x26da4a, - 0x270c0c, - 0x270d86, - 0x2794c6, - 0x2caf86, - 0x39b709, - 0x21f986, - 0x222906, - 0x28ea86, - 0x34d748, - 0x31d6c6, - 0x2d4b8b, - 0x2957c5, - 0x21afc5, - 0x279cc5, - 0x340c06, - 0x215103, - 0x23b406, - 0x2a4007, - 0x2c4485, - 0x211e45, - 0x3b8505, - 0x33d006, - 0x2f7d44, - 0x334606, - 0x2a9789, - 0x340a8c, - 0x2b37c8, - 0x2a98c4, - 0x304e86, - 0x289f06, - 0x254648, - 0x225fc8, - 0x340989, - 0x344bc7, - 0x236589, - 0x271b06, - 0x2150c4, - 0x205fc4, - 0x281fc4, - 0x282f08, - 0x2e6b4a, - 0x35e2c6, - 0x36b487, - 0x382887, - 0x244a45, - 0x2f31c4, - 0x290c86, - 0x2b6286, - 0x20eec3, - 0x30fc07, - 0x3d35c8, - 0x2f7dca, - 0x345188, - 0x2dd348, - 0x33fac5, - 0x2a1405, - 0x2364c5, - 0x244e06, - 0x35cb06, - 0x2fe385, - 0x32dc09, - 0x2f2fcc, - 0x35b4c7, - 0x29b888, - 0x276705, - 0x602c84, - 0x229cc4, - 0x283484, - 0x218bc6, - 0x2a2d4e, - 0x32f2c7, - 0x21b1c5, - 0x2d524c, - 0x30af87, - 0x226947, - 0x22bb09, - 0x220d49, - 0x287fc5, - 0x30fdc8, - 0x308fc9, - 0x38ed05, - 0x2c43c8, - 0x2b9886, - 0x382146, - 0x23f204, - 0x28fe08, - 0x223f43, - 0x209284, - 0x2ab385, - 0x394e47, - 0x26bcc5, - 0x3bf149, - 0x2a5f8d, - 0x2c6506, - 0x3c37c4, - 0x226b08, - 0x20ae0a, - 0x21bf47, - 0x36ba05, - 0x2092c3, - 0x2a1f4e, - 0x24988c, - 0x305387, - 0x2a2f07, - 0x4230e9c7, - 0x14f0c6, - 0x46e44, - 0x210d83, - 0x21f9c5, - 0x283485, - 0x29c748, - 0x299d49, - 0x3db306, - 0x2546c4, - 0x2f44c6, - 0x266e0b, - 0x2dc50c, - 0x24b8c7, - 0x2d4e45, - 0x3a76c8, - 0x2e4cc5, - 0x3c2507, - 0x3315c7, - 0x22ee45, - 0x215103, - 0x20fd44, - 0x3cb985, - 0x26e585, - 0x26e586, - 0x2a8f48, - 0x2269c7, - 0x3a4ac6, - 0x21cc86, - 0x34c406, - 0x2671c9, - 0x2111c7, - 0x27e146, - 0x2dc686, - 0x277146, - 0x2acb45, - 0x205746, - 0x383a05, - 0x28ba48, - 0x29528b, - 0x2909c6, - 0x3828c4, - 0x2d5b09, - 0x2a62c4, - 0x2b9808, - 0x31c087, - 0x285304, - 0x2bff48, - 0x2c59c4, - 0x2acb84, - 0x398305, - 0x31c4c6, - 0x3da487, - 0x24e4c3, - 0x2a17c5, - 0x2fb684, - 0x3c0b06, - 0x2f7d08, - 0x3db085, - 0x294f49, - 0x313985, - 0x3736c8, - 0x21a887, - 0x32df08, - 0x2bfb87, - 0x2f2909, - 0x282b06, - 0x341c06, - 0x28ea84, - 0x3abf45, - 0x30d1cc, - 0x279cc7, - 0x27a747, - 0x231548, - 0x2c6506, - 0x2a3f44, - 0x34ab44, - 0x388fc9, - 0x2cb086, - 0x26df07, - 0x210a44, - 0x261606, - 0x3a4405, - 0x2d2807, - 0x2d4b06, - 0x2645c9, - 0x2cfa47, - 0x297a87, - 0x2a4ec6, - 0x261545, - 0x281448, - 0x222508, - 0x22fa46, - 0x3db0c5, - 0x2c7406, - 0x2017c3, - 0x29c5c9, - 0x2a188e, - 0x2bf2c8, - 0x3174c8, - 0x22f84b, - 0x295186, - 0x379b04, - 0x238e44, - 0x2a198a, - 0x213147, - 0x27e205, - 0x213a89, - 0x2c31c5, - 0x3c4d87, - 0x230504, - 0x299187, - 0x214fc8, - 0x2cc646, - 0x2b9d09, - 0x2c090a, - 0x2130c6, - 0x29a806, - 0x2af505, - 0x396405, - 0x34bac7, - 0x242788, - 0x3a4348, - 0x26b006, - 0x28c885, - 0x23168e, - 0x226384, - 0x22f9c5, - 0x278209, - 0x2d7688, - 0x28d406, - 0x29e7cc, - 0x2a03d0, - 0x2a298f, - 0x2a44c8, - 0x313987, - 0x3bfc85, - 0x294105, - 0x3da309, - 0x294109, - 0x278f46, - 0x2d5107, - 0x3abe45, - 0x306a89, - 0x353186, - 0x21f7cd, - 0x281e89, - 0x219344, - 0x2bf048, - 0x232649, - 0x35e486, - 0x3899c5, - 0x341c06, - 0x275c89, - 0x27b108, - 0x209a85, - 0x28fe04, - 0x29e98b, - 0x35e345, - 0x245b86, - 0x284706, - 0x252a06, - 0x2a388b, - 0x295049, - 0x21cbc5, - 0x391d47, - 0x331706, - 0x212dc6, - 0x283208, - 0x2b5209, - 0x37728c, - 0x31bc48, - 0x317f06, - 0x338fc3, - 0x22d046, - 0x2a36c5, - 0x27fb48, - 0x28c286, - 0x2d2a48, - 0x242b85, - 0x292745, - 0x21a9c8, - 0x3a9dc7, - 0x3a4707, - 0x2f5247, - 0x319dc8, - 0x313ac8, - 0x2b5b46, - 0x2b6947, - 0x306387, - 0x2a358a, - 0x206383, - 0x340c06, - 0x231605, - 0x288bc4, - 0x27bb49, - 0x2f2884, - 0x202244, - 0x2a0c44, - 0x2a2f0b, - 0x32e407, - 0x2318c5, - 0x2981c8, - 0x278886, - 0x278888, - 0x27e7c6, - 0x28fd45, - 0x290005, - 0x2915c6, - 0x2937c8, - 0x293c88, - 0x27bd06, - 0x29800f, - 0x29c090, - 0x3c12c5, - 0x20cc43, - 0x22aa85, - 0x31ad88, - 0x294009, - 0x38ee48, - 0x2d4f08, - 0x31f888, - 0x32e4c7, - 0x278549, - 0x2d2c48, - 0x285a84, - 0x2a0ac8, - 0x2e9dc9, - 0x2b7607, - 0x2b0104, - 0x210cc8, - 0x2a56ca, - 0x2fb906, - 0x215146, - 0x34fb09, - 0x2a0607, - 0x2d0308, - 0x230588, - 0x21d348, - 0x37f785, - 0x207685, - 0x21afc5, - 0x283445, - 0x2b4a07, - 0x244bc5, - 0x2c4485, - 0x3cfec6, - 0x38ed87, - 0x2d0e07, - 0x2a59c6, - 0x2d6e05, - 0x245b86, - 0x20ee45, - 0x2bca88, - 0x3abdc4, - 0x2c96c6, - 0x324c84, - 0x2bfd48, - 0x2c97ca, - 0x27c48c, - 0x336285, - 0x21b086, - 0x377446, - 0x28e886, - 0x317f84, - 0x3a4d85, - 0x27dd87, - 0x2a0689, - 0x2cef47, - 0x602c84, - 0x602c84, - 0x32e285, - 0x217684, - 0x29dd4a, - 0x278706, - 0x308dc4, - 0x3b06c5, - 0x2b41c5, - 0x2b6184, - 0x284347, - 0x336c87, - 0x2ce988, - 0x2c7508, - 0x209a89, - 0x295e08, - 0x29df0b, - 0x26f484, - 0x2921c5, - 0x389385, - 0x2f51c9, - 0x2b5209, - 0x2d5a08, - 0x228d48, - 0x219504, - 0x289f45, - 0x218e03, - 0x359885, - 0x29afc6, - 0x299b8c, - 0x210946, - 0x3898c6, - 0x28d685, - 0x33d088, - 0x3d83c6, - 0x254a06, - 0x215146, - 0x26368c, - 0x389444, - 0x34c54a, - 0x28d5c8, - 0x2999c7, - 0x2fb586, - 0x3db3c7, - 0x2f40c5, - 0x36b6c6, - 0x366906, - 0x376047, - 0x2c0604, - 0x20ea85, - 0x278204, - 0x2b3b07, - 0x278448, - 0x27934a, - 0x2820c7, - 0x2ac747, - 0x313907, - 0x2e4e09, - 0x299b8a, - 0x229a03, - 0x3d2c85, - 0x214183, - 0x2b4ec9, - 0x361248, - 0x295bc7, - 0x38ef49, - 0x222606, - 0x3b5e08, - 0x393885, - 0x248f8a, - 0x3b0a49, - 0x2492c9, - 0x3d8287, - 0x2b5d49, - 0x214048, - 0x36a2c6, - 0x21b248, - 0x212187, - 0x26eb07, - 0x2a4287, - 0x2d1c48, - 0x3cd4c6, - 0x2a5485, - 0x27dd87, - 0x29a308, - 0x34c384, - 0x2fd284, - 0x294707, - 0x2b0707, - 0x308e4a, - 0x36a246, - 0x32f70a, - 0x2c3607, - 0x226147, - 0x20eb44, - 0x29d044, - 0x2d2706, - 0x36c404, - 0x36c40c, - 0x308d05, - 0x214e09, - 0x2b3644, - 0x2b6245, - 0x20ad88, - 0x293d45, - 0x38fe46, - 0x294244, - 0x2ad88a, - 0x2b3e46, - 0x293a0a, - 0x3c5107, - 0x2d0145, - 0x229fc5, - 0x244a8a, - 0x293945, - 0x2a3c06, - 0x23eb84, - 0x2b33c6, - 0x34bb85, - 0x28c346, - 0x2f188c, - 0x26390a, - 0x26db44, - 0x22f846, - 0x2a0607, - 0x2d4a84, - 0x34d748, - 0x2e7f46, - 0x382709, - 0x2c20c9, - 0x348289, - 0x2cf246, - 0x212286, - 0x21b387, - 0x32db48, - 0x212089, - 0x32e407, - 0x298346, - 0x280047, - 0x2667c5, - 0x226384, - 0x21af47, - 0x306545, - 0x288b05, - 0x200cc7, - 0x22ed08, - 0x3a7646, - 0x29b14d, - 0x29c94f, - 0x2a1d8d, - 0x205484, - 0x233d06, - 0x2d9448, - 0x28ea45, - 0x2a3748, - 0x261e8a, - 0x219344, - 0x2b53c6, - 0x2d60c7, - 0x219cc7, - 0x2d8dc9, - 0x21b205, - 0x2b6184, - 0x2b864a, - 0x2c03c9, - 0x2b5e47, - 0x2f2dc6, - 0x35e486, - 0x289e86, - 0x380606, - 0x2d868f, - 0x2d9309, - 0x31d6c6, - 0x388c06, - 0x32d209, - 0x2b6a47, - 0x214703, - 0x243846, - 0x208a43, - 0x35bf08, - 0x27fe87, - 0x2a46c9, - 0x31ca88, - 0x3a4848, - 0x2ff3c6, - 0x210889, - 0x35b405, - 0x22cf84, - 0x3035c7, - 0x39b785, - 0x205484, - 0x231988, - 0x20f104, - 0x2b6787, - 0x36d146, - 0x269e45, - 0x2af148, - 0x35e34b, - 0x3102c7, - 0x244d06, - 0x2ca784, - 0x379a86, - 0x267c05, - 0x306545, - 0x2811c9, - 0x283f49, - 0x26eb44, - 0x26eb85, - 0x22f885, - 0x248e06, - 0x30fec8, - 0x2c29c6, - 0x3d340b, - 0x384fca, - 0x2bfc85, - 0x290086, - 0x246805, - 0x2db7c5, - 0x296307, - 0x340e88, - 0x236584, - 0x261a86, - 0x293d06, - 0x214207, - 0x31da04, - 0x27ee06, - 0x21f245, - 0x21f249, - 0x212484, - 0x2f3349, - 0x27bd06, - 0x2c51c8, - 0x22f885, - 0x382985, - 0x28c346, - 0x377189, - 0x220d49, - 0x389946, - 0x2d7788, - 0x2a60c8, - 0x2467c4, - 0x2b8ac4, - 0x2b8ac8, - 0x2e6288, - 0x236689, - 0x29af46, - 0x215146, - 0x33860d, - 0x31f2c6, - 0x3215c9, - 0x202945, - 0x208a86, - 0x27b288, - 0x334545, - 0x3063c4, - 0x267c05, - 0x283a88, - 0x29db09, - 0x2782c4, - 0x2b9b86, - 0x3071ca, - 0x305288, - 0x308fc9, - 0x268a0a, - 0x38eec6, - 0x29cb08, - 0x3c22c5, - 0x28d848, - 0x2f4145, - 0x2224c9, - 0x33a989, - 0x20fe02, - 0x292b85, - 0x271786, - 0x27bc47, - 0x322b85, - 0x2fb486, - 0x312c48, - 0x2c6506, - 0x2c1209, - 0x27a846, - 0x283088, - 0x389d05, - 0x3ddc06, - 0x2f74c8, - 0x282f08, - 0x361008, - 0x315708, - 0x205744, - 0x21f543, - 0x2c1444, - 0x2822c6, - 0x266804, - 0x317407, - 0x254909, - 0x2c9a45, - 0x230586, - 0x243846, - 0x2a8d8b, - 0x2b56c6, - 0x33fd06, - 0x2ccd48, - 0x229a46, - 0x2bd1c3, - 0x203e83, - 0x226384, - 0x22f1c5, - 0x2b7ac7, - 0x278448, - 0x27844f, - 0x27dc8b, - 0x30fcc8, - 0x2b9c06, - 0x30ffce, - 0x244ec3, - 0x2b7a44, - 0x2b5645, - 0x2b6006, - 0x290d8b, - 0x295706, - 0x227789, - 0x269e45, - 0x24e408, - 0x204d88, - 0x220c0c, - 0x2a2f46, - 0x3598c6, - 0x2dedc5, - 0x288ec8, - 0x27c485, - 0x351c88, - 0x29eb4a, - 0x2a21c9, - 0x602c84, + 0x3e0d02, + 0x210702, + 0x20ef42, + 0x1376fcc9, + 0x13b5cbca, + 0x142e307, + 0x13e026c2, + 0x14fe3c3, + 0x4a82, + 0x15cbca, + 0x15dc0e, + 0x24c0c4, + 0x572c5, + 0x14614a83, + 0x3dc83, + 0x232dc3, + 0x24d9c4, + 0x308003, + 0x221dc4, + 0x21bc83, + 0x137a89, + 0x68006, + 0x23c803, + 0xefa04, + 0x4743, + 0x21a3c3, + 0x1df105, + 0x203dc3, + 0x242543, + 0x1464b04, + 0x22b983, + 0x11b504, + 0x207783, + 0x9a048, + 0x1521403, + 0x125d86, + 0x1574504, + 0x68445, + 0x14a64a, + 0x129cc2, + 0x1500160d, + 0x1a6286, + 0x15291, + 0x1576fcc9, + 0x684c8, + 0x62888, + 0x1c12c707, + 0x1182, + 0x16fe47, + 0x2380e, + 0x139b0b, + 0x13f10b, + 0x1b3d4a, + 0x29907, + 0x9a048, + 0x11c988, + 0x7bc7, + 0x1c4169cb, + 0x1bf87, + 0xcd42, + 0x26ccd, + 0x1c2a07, + 0xaed8a, + 0x1d92cf, + 0x6738f, + 0x167c2, + 0x1242, + 0x83548, + 0x1c8f48cc, + 0xe770a, + 0xe554a, + 0x18990a, + 0x78508, + 0x8d08, + 0x5aa88, + 0xe5a08, + 0x145e88, + 0x2a42, + 0x1c464f, + 0xc134b, + 0x79108, + 0x25687, + 0x14474a, + 0x2490b, + 0x33249, + 0x46e07, + 0x8c08, + 0x3834c, + 0x15c087, + 0x1a67ca, + 0x106c8, + 0x2888e, + 0x2904e, + 0x2974b, + 0x2aa8b, + 0x15748b, + 0x14bf09, + 0xe3b0b, + 0xec58d, + 0x1261cb, + 0x30b4d, + 0x30ecd, + 0x3640a, + 0x3dd0b, + 0x3e54b, + 0x46405, + 0x1cd79a10, + 0x199e8f, + 0x9854f, + 0x63c4d, + 0x137c50, + 0xaac82, + 0x1d20c388, + 0xd1288, + 0xe8090, + 0xcf48e, + 0x1d75d105, + 0x4d1cb, + 0x136b90, + 0x8e0a, + 0x2ac49, + 0x61487, + 0x617c7, + 0x61987, + 0x61d07, + 0x631c7, + 0x63407, + 0x65587, + 0x65ac7, + 0x66007, + 0x66387, + 0x66a47, + 0x66c07, + 0x66dc7, + 0x66f87, + 0x69a47, + 0x6a407, + 0x6ac07, + 0x6afc7, + 0x6b607, + 0x6b8c7, + 0x6ba87, + 0x6bd87, + 0x6c887, + 0x6ca87, + 0x6d907, + 0x6dac7, + 0x6dc87, + 0x6f247, + 0x71247, + 0x71707, + 0x72207, + 0x724c7, + 0x72847, + 0x72a07, + 0x72e07, + 0x73247, + 0x73707, + 0x73c87, + 0x73e47, + 0x74007, + 0x74447, + 0x74ec7, + 0x75407, + 0x75987, + 0x75b47, + 0x75ec7, + 0x76407, + 0x6882, + 0x5ab8a, + 0x11cc8, + 0x1b0ecc, + 0x71b87, + 0x85805, + 0xa7951, + 0x1c0d86, + 0xfb14a, + 0x833ca, + 0x56306, + 0xb060b, + 0x642, + 0x2f7d1, + 0xbf089, + 0x9b209, + 0x9bb06, + 0x3ee42, + 0x9218a, + 0xacdc9, + 0xad50f, + 0xadb0e, + 0xaff88, + 0x6502, + 0x174a49, + 0x8a58e, + 0x1c7f0c, + 0xf1ccf, + 0x1b7a0e, + 0x3230c, + 0x41a89, + 0xd2551, + 0xd2b08, + 0x59452, + 0x62a4d, + 0x733cd, + 0x7984b, + 0x7ea95, + 0xf0c09, + 0x182f8a, + 0x1a3749, + 0x1aa210, + 0x9028b, + 0x9378f, + 0xa694b, + 0xab54c, + 0xb1b90, + 0xb4b0a, + 0xcc00d, + 0xb7ece, + 0x14db0a, + 0x1bd50c, + 0xbe4d4, + 0xbed11, + 0xc0f0b, + 0xc310f, + 0xc5f8d, + 0xc854e, + 0xca80c, + 0xcb00c, + 0xcbd0b, + 0x13ea4e, + 0x16c350, + 0xd974b, + 0xda40d, + 0xdcf0f, + 0xdf00c, + 0xe648e, + 0xf2391, + 0x10498c, + 0x1dc387, + 0x10b44d, + 0x11a00c, + 0x140cd0, + 0x15fd8d, + 0x168847, + 0x18e8d0, + 0x19d508, + 0x1a160b, + 0xb6b8f, + 0x1b1148, + 0x149d4d, + 0x10f810, + 0x17e609, + 0x1db799c8, + 0x1deb9c06, + 0xbaac3, + 0x15a889, + 0xc00c5, + 0x1e42, + 0x144bc9, + 0x14a34a, + 0x1e259906, + 0x145990d, + 0x1e7c2c04, + 0x57a46, + 0x1e08a, + 0x6474d, + 0x1e9df489, + 0x19a83, + 0x1175ca, + 0xe4651, + 0xe4a89, + 0xe54c7, + 0xe61c8, + 0xe68c7, + 0x71c48, + 0x1540b, + 0x12bc49, + 0xf1210, + 0xf16cc, + 0xf27c8, + 0xf4705, + 0x13b1c8, + 0x1961ca, + 0x184947, + 0x2902, + 0x1ef47415, + 0x13788a, + 0x1b2589, + 0x108a08, + 0x9cd89, + 0x46145, + 0x119d0a, + 0x8decf, + 0x10b84b, + 0xf04c, + 0x18ee12, + 0x77285, + 0x114e48, + 0xf678b, + 0xe0a11, + 0x4dcca, + 0x1f2fe185, + 0x19b18c, + 0x133e43, + 0x192286, + 0x3fcc2, + 0x10948b, + 0x109f4a, + 0x150a2cc, + 0xd1608, + 0x30d08, + 0x1f708a86, + 0x1b2f07, + 0xca42, + 0x5142, + 0x18bb50, + 0x69bc7, + 0x2ee0f, + 0x11ec6, + 0x11ed0e, + 0x94c0b, + 0x472c8, + 0x33609, + 0x13ce92, + 0x19234d, + 0x115488, + 0x115cc9, + 0x176f4d, + 0x198609, + 0x63cb, + 0x6bf08, + 0x7a688, + 0x7ce08, + 0x7d249, + 0x7d44a, + 0x8c30c, + 0x3e80a, + 0xf198a, + 0x114cc7, + 0x9994a, + 0x1c350d, + 0xd2e11, + 0x1fac8846, + 0x1cd64b, + 0x97c4c, + 0x39988, + 0x13d849, + 0x15b84d, + 0x61f50, + 0x1808cd, + 0xc2c2, + 0x4f70d, + 0x1b82, + 0xc1c2, + 0x114c0a, + 0x6e70a, + 0xfb04a, + 0x10260b, + 0x292cc, + 0x11c48a, + 0x11c70e, + 0x1d74cd, + 0x1fde0bc5, + 0x128948, + 0x1442, + 0x14239c3, + 0x15a6960e, + 0x16204b4e, + 0x16a6820a, + 0x1734630e, + 0x17b63a8e, + 0x18289d0c, + 0x142e307, + 0x142e309, + 0x14fe3c3, + 0x18b0400c, + 0x1933dfc9, + 0x19b48e89, + 0x1a353b89, + 0x4a82, + 0x69551, + 0x4a91, + 0x6814d, + 0x146251, + 0x1639d1, + 0x89c4f, + 0x103f4f, + 0x13df0c, + 0x148dcc, + 0x153acc, + 0x4b5cd, + 0x1aaa15, + 0xedc8c, + 0x1b32cc, + 0x13f810, + 0x16b10c, + 0x178fcc, + 0x1ac319, + 0x1b6959, + 0x1c1259, + 0x1da294, + 0x76d4, + 0x7d54, + 0x9754, + 0x9f94, + 0x1aa07989, + 0x1b008009, + 0x1bbb3389, + 0x15ed2d09, + 0x4a82, + 0x166d2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x16ed2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x176d2d09, + 0x4a82, + 0x17ed2d09, + 0x4a82, + 0x186d2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x18ed2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x196d2d09, + 0x4a82, + 0x19ed2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x1a6d2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x1aed2d09, + 0x4a82, + 0x1b6d2d09, + 0x4a82, + 0x1bed2d09, + 0x4a82, + 0x76ca, + 0x4a82, + 0x1400401, + 0x15285, + 0x1b3d44, + 0x14c86c3, + 0x15d6e03, + 0x14f8943, + 0x6960e, + 0x4b4e, + 0x7c80e, + 0x6820a, + 0x14630e, + 0x163a8e, + 0x89d0c, + 0x10400c, + 0x13dfc9, + 0x148e89, + 0x153b89, + 0x7989, + 0x8009, + 0x1b3389, + 0x13f8cd, + 0x9a09, + 0xa249, + 0x12f604, + 0x18ad44, + 0x1bad44, + 0x1bf004, + 0xa8a44, + 0x2cc04, + 0x3ca84, + 0x53684, + 0x11dc4, + 0x62b84, + 0x1588703, + 0x13dd87, + 0x147dc8c, + 0xf283, + 0xaac82, + 0xae8c6, + 0x1d74c3, + 0xf283, + 0x9fc83, + 0x8582, + 0x8588, + 0xe9247, + 0x12bcc7, + 0x2a42, 0x2000c2, - 0x4820c302, + 0x201242, + 0x2052c2, + 0x20dec2, 0x200382, - 0x224e44, - 0x206a42, - 0x303f84, - 0x205642, - 0xca43, 0x2003c2, - 0x209482, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x20a803, - 0x216603, - 0x234c83, - 0x242244, - 0x22c0c3, - 0x235604, - 0x232c43, - 0x2db1c4, - 0x228b03, - 0x322e47, - 0x211543, - 0x20ca43, - 0x31b008, - 0x216603, - 0x280acb, - 0x2f55c3, - 0x240986, - 0x219f82, - 0x2eec0b, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x216603, - 0x221003, - 0x204383, + 0x205142, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21bac3, + 0x21a3c3, + 0x242543, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x21a3c3, + 0x242543, + 0xb2c3, + 0x308003, + 0x21dc4, 0x2000c2, - 0x9fe08, - 0x397705, - 0x3065c8, - 0x2e2bc8, - 0x20c302, - 0x329085, - 0x3bfd47, - 0x201bc2, - 0x2401c7, - 0x200382, - 0x254f47, - 0x2bd949, - 0x26c708, - 0x21d1c9, - 0x208582, - 0x3b04c7, - 0x3880c4, - 0x3bfe07, - 0x384ec7, - 0x259902, - 0x211543, - 0x205a02, - 0x205642, - 0x2003c2, - 0x2161c2, - 0x200902, - 0x209482, - 0x2d6405, - 0x21bb85, - 0xc302, - 0x32c43, - 0x22c0c3, - 0x232c43, - 0x210b03, - 0x228b03, - 0x204f43, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x8083, - 0x101, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x214543, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x216e03, - 0x4b50bb86, - 0xe85c3, - 0xca9c5, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x82c2, - 0x9fe08, - 0x12cdc3, - 0xca43, - 0x6d9c3, - 0x42744, - 0x142a744, - 0xe50c5, - 0x2000c2, - 0x392104, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x241f43, - 0x22cd85, - 0x214543, - 0x20e403, - 0x20a803, - 0x24bbc3, - 0x216603, - 0x20c603, - 0x2422c3, - 0x205b03, - 0x5c2, - 0x2d7c2, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x2000c2, - 0x248343, - 0x20c302, - 0x232c43, - 0x228b03, - 0x224e44, - 0x20a803, - 0x216603, - 0x209482, - 0x9fe08, - 0x228b03, - 0x6d9c3, - 0x9fe08, - 0x6d9c3, - 0x26fb43, - 0x22c0c3, - 0x22fd84, - 0x232c43, - 0x228b03, - 0x203dc2, - 0x211543, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x203dc2, - 0x238cc3, - 0x20a803, - 0x216603, - 0x2ed343, - 0x20c603, - 0x2000c2, - 0x20c302, - 0x228b03, - 0x20a803, - 0x216603, - 0x240985, - 0x127206, - 0x242244, - 0x219f82, - 0x9fe08, - 0x2000c2, - 0x12eb85, - 0x1c508, - 0x175583, - 0x20c302, - 0x4fd40486, - 0xd944, - 0x10a7cb, - 0x34786, - 0x11647, - 0x1b8dc9, - 0x232c43, - 0x47508, - 0x4750b, - 0x4798b, - 0x480cb, - 0x4840b, - 0x486cb, - 0x48b0b, - 0x7386, - 0x228b03, - 0x20005, - 0x2a44, - 0x20e943, - 0x115547, - 0xded04, - 0x6c144, - 0x20a803, - 0x189a46, - 0x194584, - 0x6d9c3, - 0x216603, - 0x2f61c4, - 0x12ea07, - 0x126e09, - 0x10a588, - 0x52c84, - 0x3e006, - 0x8148, - 0x130245, - 0x3fc9, - 0x2f783, - 0x12eb85, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20ca43, - 0x216603, - 0x2f55c3, - 0x219f82, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x214383, - 0x217b84, - 0x20a803, - 0xca43, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x2db1c4, - 0x228b03, - 0x20a803, - 0x216603, - 0x240986, - 0x232c43, - 0x228b03, - 0x3a183, - 0x6d9c3, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x12eb85, - 0x11647, - 0x7883, - 0x2f783, - 0x9fe08, - 0x228b03, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x5c743, - 0x20a803, - 0x216603, - 0x5322c0c3, - 0x232c43, - 0x20a803, - 0x216603, - 0x9fe08, - 0x2000c2, - 0x20c302, - 0x22c0c3, - 0x228b03, - 0x20a803, - 0x2003c2, - 0x216603, - 0x33aec7, - 0x20f64b, - 0x20c003, - 0x278c08, - 0x32d8c7, - 0x32a1c6, - 0x20d0c5, - 0x3291c9, - 0x2112c8, - 0x37b649, - 0x3a1d90, - 0x37b64b, - 0x2e1b49, - 0x207883, - 0x2ef2c9, - 0x230a06, - 0x230a0c, - 0x3977c8, - 0x3d80c8, - 0x2bde09, - 0x2ba48e, - 0x2bd70b, - 0x2fff4c, - 0x225843, - 0x28768c, - 0x3ce3c9, - 0x308907, - 0x232b8c, - 0x2b18ca, - 0x249f84, - 0x30810d, - 0x287548, - 0x3cee4d, - 0x314846, - 0x24224b, - 0x326f89, - 0x388e87, - 0x369a86, - 0x373a89, - 0x2f790a, - 0x3dcf08, - 0x2f4c84, - 0x38e347, - 0x2417c7, - 0x345784, - 0x217304, - 0x344509, - 0x251789, - 0x28c008, - 0x2eda85, - 0x2084c5, - 0x204c46, - 0x307fc9, - 0x26210d, - 0x215348, - 0x204b47, - 0x20d148, - 0x263e46, - 0x237b84, - 0x285845, - 0x3c4c46, - 0x3c5d44, - 0x3ce2c7, - 0x3d558a, - 0x20ab44, - 0x213006, - 0x213cc9, - 0x213ccf, - 0x214b0d, - 0x215b86, - 0x21c110, - 0x21c506, - 0x21dac7, - 0x220607, - 0x22060f, - 0x221349, - 0x226486, - 0x226fc7, - 0x226fc8, - 0x227ac9, - 0x3a8b48, - 0x311007, - 0x20b383, - 0x22bf46, - 0x298fc8, - 0x2ba74a, - 0x2094c9, - 0x211403, - 0x328f86, - 0x2618ca, - 0x23a747, - 0x30874a, - 0x34018e, - 0x221486, - 0x318947, - 0x34f706, - 0x240d86, - 0x20748b, - 0x39710a, - 0x27630d, - 0x212347, - 0x265388, - 0x265389, - 0x26538f, - 0x30440c, - 0x263289, - 0x3d28ce, - 0x322f4a, - 0x3c2b46, - 0x2fdb86, - 0x31ef4c, - 0x32018c, - 0x322208, - 0x35a347, - 0x37c545, - 0x2297c4, - 0x36a6ce, - 0x262584, - 0x329687, - 0x39d78a, - 0x3d3b54, - 0x3d64cf, - 0x2207c8, - 0x22be08, - 0x3625cd, - 0x3625ce, - 0x22c289, - 0x22d408, - 0x22d40f, - 0x23288c, - 0x23288f, - 0x233a47, - 0x235f0a, - 0x23d64b, - 0x237788, - 0x238b87, - 0x25bfcd, - 0x330106, - 0x3082c6, - 0x23b289, - 0x3dbb88, - 0x240b88, - 0x240b8e, - 0x20f747, - 0x2fbb45, - 0x242505, - 0x207a84, - 0x32a486, - 0x28bf08, - 0x374883, - 0x2e16ce, - 0x25c388, - 0x2a704b, - 0x26fd07, - 0x26ae45, - 0x287806, - 0x2aeb47, - 0x31b4c8, - 0x34b8c9, - 0x3cc205, - 0x287c88, - 0x222e86, - 0x3a35ca, - 0x36a5c9, - 0x232c49, - 0x232c4b, - 0x339748, - 0x345649, - 0x2edb46, - 0x28f0ca, - 0x36764a, - 0x23610c, - 0x368807, - 0x26c50a, - 0x2e5b0b, - 0x2e5b19, - 0x324888, - 0x240a05, - 0x25c186, - 0x217d09, - 0x26cc06, - 0x236d8a, - 0x2114c6, - 0x20d644, - 0x2cbb0d, - 0x344147, - 0x20d649, - 0x244745, - 0x245148, - 0x2472c9, - 0x249204, - 0x249e87, - 0x249e88, - 0x24a2c7, - 0x264208, - 0x24ef47, - 0x36bfc5, - 0x256e4c, - 0x257309, - 0x2d908a, - 0x3a6609, - 0x2ef3c9, - 0x3889cc, - 0x25a18b, - 0x25ad08, - 0x25c8c8, - 0x260284, - 0x284fc8, - 0x286209, - 0x2b1987, - 0x213f06, - 0x2a0e07, - 0x29bc49, - 0x20624b, - 0x35cd07, - 0x216687, - 0x3c5247, - 0x3cedc4, - 0x3cedc5, - 0x2daec5, - 0x358e8b, - 0x3b40c4, - 0x326948, - 0x2f9a0a, - 0x222f47, - 0x3c8e87, - 0x290552, - 0x292586, - 0x22f446, - 0x28e40e, - 0x296b86, - 0x296008, - 0x29664f, - 0x3cf208, - 0x3b1148, - 0x34200a, - 0x342011, - 0x2a5c4e, - 0x2536ca, - 0x2536cc, - 0x22d607, - 0x22d610, - 0x3bee08, - 0x2a5e45, - 0x2aee4a, - 0x3c5d8c, - 0x29868d, - 0x3b0c46, - 0x3b0c47, - 0x3b0c4c, - 0x3bd2cc, - 0x36f70c, - 0x2c4c4b, - 0x38c184, - 0x2e5bc4, - 0x2b1189, - 0x34abc7, - 0x37d789, - 0x367489, - 0x2b1587, - 0x2b1746, - 0x2b1749, - 0x2b1b43, - 0x2c660a, - 0x373cc7, - 0x3c05cb, - 0x27618a, - 0x388144, - 0x32fd06, - 0x282349, - 0x36c284, - 0x2f480a, - 0x245005, - 0x2c16c5, - 0x2c16cd, - 0x2c1a0e, - 0x2c1585, - 0x339b86, - 0x240587, - 0x3db90a, - 0x2569c6, - 0x37c044, - 0x30ed87, - 0x2ee38b, - 0x263f07, - 0x24aac4, - 0x27a306, - 0x27a30d, - 0x2dd88c, - 0x20a6c6, - 0x21554a, - 0x229886, - 0x2147c8, - 0x35b747, - 0x2c93ca, - 0x23b006, - 0x212243, - 0x220286, - 0x298e48, - 0x22fb0a, - 0x2d2dc7, - 0x2d2dc8, - 0x25af84, - 0x290ac7, - 0x2d3288, - 0x292788, - 0x2f1b08, - 0x2b808a, - 0x2e2a45, - 0x2db407, - 0x253513, - 0x268f86, - 0x3dabc8, - 0x224609, - 0x240088, - 0x2ff44b, - 0x3a4bc8, - 0x2b92c4, - 0x21aac6, - 0x320906, - 0x31c309, - 0x2c9207, - 0x256f48, - 0x2a1c06, - 0x200bc4, - 0x3a0e45, - 0x2cf888, - 0x201d8a, - 0x2cb788, - 0x2d0846, - 0x29cd0a, - 0x26e708, - 0x2d4888, - 0x2d6288, - 0x2d6ac6, - 0x2d9646, - 0x3a60cc, - 0x2d9bd0, - 0x2ade05, - 0x3b6408, - 0x3b6410, - 0x3cf010, - 0x3a1c0e, - 0x3a5d4e, - 0x3a5d54, - 0x3ad7cf, - 0x3adb86, - 0x345851, - 0x343a93, - 0x343f08, - 0x369c05, - 0x27aa88, - 0x2097c5, - 0x329d8c, - 0x229189, - 0x229609, - 0x3dd547, - 0x340649, - 0x236947, - 0x35e746, - 0x285647, - 0x203885, - 0x2080c3, - 0x23a183, - 0x20fc44, - 0x30128d, - 0x34bc8f, - 0x200c05, - 0x333a46, - 0x212887, - 0x397547, - 0x204206, - 0x20420b, - 0x2a6a85, - 0x258b46, - 0x305f87, - 0x24f449, - 0x2211c6, - 0x3855c5, - 0x3ba74b, - 0x3b0946, - 0x2137c5, - 0x23f088, - 0x291988, - 0x29f94c, - 0x29f950, - 0x2a2749, - 0x2b71c7, - 0x2b22cb, - 0x2c1f86, - 0x310eca, - 0x3da94b, - 0x30cc4a, - 0x2eca86, - 0x2ed205, - 0x32d7c6, - 0x286bc8, - 0x3dd60a, - 0x36225c, - 0x2f568c, - 0x2f5988, - 0x240985, + 0x202703, + 0x22214a83, 0x38b9c7, - 0x2ba0c6, - 0x3b9505, - 0x218086, - 0x2043c8, - 0x2c0647, - 0x2ba388, - 0x26904a, - 0x3a978c, - 0x374b09, - 0x3a9a07, - 0x286744, - 0x2425c6, - 0x300b4a, - 0x367585, - 0x216f8c, - 0x21a0c8, - 0x2e4ac8, - 0x34ea0c, - 0x35a64c, - 0x387c89, - 0x387ec7, - 0x370b8c, - 0x222104, - 0x24a04a, - 0x30f80c, - 0x25038b, - 0x250a0b, - 0x253c46, - 0x256b07, - 0x22d847, - 0x22d84f, - 0x309cd1, - 0x2dfa92, - 0x257bcd, - 0x257bce, - 0x257f0e, - 0x3ad988, - 0x3ad992, - 0x260408, - 0x224c47, - 0x24d44a, - 0x2a95c8, - 0x296b45, - 0x2b484a, - 0x21c887, - 0x2e99c4, - 0x201783, - 0x235b45, - 0x342287, - 0x355047, - 0x29888e, - 0x3355cd, - 0x33c809, - 0x319c85, - 0x358243, - 0x34a646, - 0x259145, - 0x2a7288, - 0x21e489, - 0x25c1c5, - 0x25c1cf, - 0x2d2547, - 0x20cf45, - 0x2706ca, - 0x3c1586, - 0x245e09, - 0x37818c, - 0x3addc9, - 0x3d7046, - 0x2f980c, - 0x3390c6, - 0x307648, - 0x2e5a06, - 0x3645c6, - 0x2b5844, - 0x31c283, - 0x221a4a, - 0x3037d1, - 0x26344a, - 0x246685, - 0x25a5c7, - 0x254047, - 0x2d3384, - 0x2d338b, - 0x21d048, - 0x2bf146, - 0x2315c5, - 0x32b944, - 0x2410c9, - 0x2008c4, - 0x20c3c7, - 0x34cf05, - 0x34cf07, - 0x28e645, - 0x247d03, - 0x224b08, - 0x27ac8a, - 0x24e4c3, - 0x39774a, - 0x36c746, - 0x25bf4f, - 0x3d2009, - 0x2e1650, - 0x2fcbc8, - 0x2d1689, - 0x29a087, - 0x27a28f, - 0x38f304, - 0x2db244, - 0x21c386, - 0x243206, - 0x2ed5ca, - 0x252f86, - 0x395207, - 0x311348, - 0x311547, - 0x312a07, - 0x314aca, - 0x31330b, - 0x251a45, - 0x2df6c8, - 0x20ae83, - 0x3bcd4c, - 0x37c2cf, - 0x3c0d8d, - 0x257747, - 0x33c949, - 0x2312c7, - 0x267e48, - 0x3d3d4c, - 0x2b91c8, - 0x246388, - 0x33104e, - 0x348c94, - 0x3491a4, - 0x35ff0a, - 0x37bccb, - 0x236a04, - 0x236a09, - 0x2b5448, - 0x242d05, - 0x37438a, - 0x285b07, - 0x322c44, - 0x248343, - 0x22c0c3, - 0x235604, - 0x232c43, - 0x228b03, - 0x224e44, - 0x214543, - 0x211543, - 0x2d9bc6, - 0x217b84, - 0x20a803, - 0x216603, - 0x216103, + 0x308003, + 0x21a8c3, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x21e2ca, + 0x2431c5, + 0x2141c3, + 0x233442, + 0x9a048, + 0x226d8a4a, + 0xe01, + 0x9a048, + 0x1242, + 0x131a42, + 0x22fdf20b, + 0x23227fc4, + 0x1c2b45, + 0x1805, + 0xf48c6, + 0x23601805, + 0x53bc3, + 0x94e83, + 0x9c4, + 0x4e83, + 0x68b05, + 0x139b05, + 0x9a048, + 0x1bf87, + 0x14a83, + 0x2cd0d, + 0x23e3a147, + 0x144686, + 0x24146145, + 0x1b8dd2, + 0x3a247, + 0x1d35ca, + 0x1d3488, + 0x95c7, + 0x6574a, + 0x1a7308, + 0xe2b07, + 0x1a870f, + 0x169347, + 0x53486, + 0x136b90, + 0x11dccf, + 0x1a009, + 0x57ac4, + 0x2443a30e, + 0x35509, + 0x670c6, + 0x10ecc9, + 0x18d986, + 0x1ba1c6, + 0x78ecc, + 0x24b0a, + 0x333c7, + 0x14420a, + 0x33c9, + 0xf714c, + 0x1d40a, + 0x5c30a, + 0x68b49, + 0x57a46, + 0x3348a, + 0x11634a, + 0xa430a, + 0x14fbc9, + 0xe30c8, + 0xe3346, + 0xeb54d, + 0x5390b, + 0xc0545, + 0x24b55a0c, + 0x14a887, + 0x10d1c9, + 0xbf407, + 0x10fc14, + 0x11010b, + 0x254ca, + 0x13cd0a, + 0xaabcd, + 0x1502809, + 0x11524c, + 0x115acb, + 0x106c3, + 0x106c3, + 0x28886, + 0x106c3, + 0xf48c8, + 0x155983, + 0x44ec4, + 0x53f83, + 0x335c5, + 0x146e943, + 0x50849, + 0xf678b, + 0x14df283, + 0x148406, + 0x14ecac7, + 0x1aa487, + 0x2592c5c9, + 0x1a286, + 0x173d09, + 0x2703, + 0x9a048, + 0x1242, + 0x4d9c4, + 0x88c3, + 0x8805, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x220dc3, + 0x214a83, + 0x232dc3, + 0x228503, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x29b3c3, + 0x207783, + 0x220dc3, + 0x2d3684, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x2308c3, + 0x2752c6c5, + 0x142c943, + 0x214a83, + 0x232dc3, + 0x21bb43, + 0x228503, + 0x308003, + 0x221dc4, + 0x2059c3, + 0x2137c3, + 0x23c803, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x2141c3, + 0x2821e9c3, + 0x18ed09, + 0x1242, + 0x3c0743, + 0x28e14a83, + 0x232dc3, + 0x247103, + 0x308003, + 0x223703, + 0x2137c3, + 0x242543, + 0x2f4bc3, + 0x3b9a84, + 0x9a048, + 0x29614a83, + 0x232dc3, + 0x2b0043, + 0x308003, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x22e983, + 0x9a048, + 0x29e14a83, + 0x232dc3, + 0x228503, + 0x203dc3, + 0x242543, + 0x9a048, + 0x142e307, + 0x202703, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x139b05, + 0x17e707, + 0x10fe4b, + 0xe4e84, + 0xc0545, + 0x144ca88, + 0x2a54d, + 0x2b231ac5, + 0x647c4, + 0x1242, + 0x3a83, + 0x17e505, + 0x2aec2, + 0x5e42, + 0x303dc5, + 0x9a048, + 0x106c2, + 0x1d2c3, + 0x16454f, + 0x1242, + 0x105646, 0x2000c2, - 0x248343, - 0x20c302, - 0x22c0c3, - 0x235604, - 0x232c43, - 0x228b03, - 0x214543, - 0x2d9bc6, - 0x20a803, - 0x216603, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x212483, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x217b84, - 0x20a803, - 0x216603, + 0x202703, + 0x214a83, + 0x308003, + 0x221dc4, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x2141c3, + 0x2aec2, + 0x32a988, + 0x2d3684, + 0x349646, + 0x353986, + 0x9a048, + 0x3373c3, + 0x2cd549, + 0x217915, + 0x1791f, + 0x214a83, + 0xd1ac7, + 0x214892, + 0x169046, + 0x1712c5, + 0x8e0a, + 0x2ac49, + 0x21464f, + 0x2e3504, + 0x224445, + 0x311050, + 0x2137c7, + 0x203dc3, + 0x31bf88, + 0x1283c6, + 0x27cfca, + 0x221c84, + 0x2fdbc3, + 0x233442, + 0x2f850b, + 0x3dc3, + 0x17cc84, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x306403, + 0x201242, + 0x89ac3, + 0x1dee04, + 0x21a3c3, + 0x242543, + 0x2ed73e05, + 0x8346, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a8c3, + 0x223d43, + 0x242543, + 0x2703, + 0x201242, + 0x214a83, + 0x232dc3, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x267c2, 0x2000c2, - 0x258783, - 0x20c302, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x204042, - 0x209382, - 0x20c302, - 0x22c0c3, - 0x207902, - 0x2005c2, - 0x224e44, - 0x303f84, - 0x22b302, - 0x217b84, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x1805, + 0xf283, + 0x2d3684, + 0x214a83, + 0x232dc3, + 0x306c44, + 0x21a3c3, + 0x242543, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x1b3089, + 0x29904, + 0x214a83, + 0x2a42, + 0x232dc3, + 0x228503, + 0x206c03, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x2982, + 0x214a83, + 0x232dc3, + 0x308003, + 0x343104, + 0x221dc4, + 0x21a3c3, + 0x242543, + 0x207783, + 0x16c2, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x2f3983, + 0x13903, + 0x1a8c3, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x322c0a, + 0x3413c9, + 0x35fb0b, + 0x3602ca, + 0x36860a, + 0x377c8b, + 0x38d74a, + 0x39424a, + 0x39abca, + 0x39ae4b, + 0x3bcfc9, + 0x3ca20a, + 0x3ca58b, + 0x3d818b, + 0x3e040a, + 0x15702, + 0x214a83, + 0x232dc3, + 0x228503, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x1558b, + 0xcf487, + 0x5b788, + 0x177084, + 0x8f308, + 0xe8006, + 0x15546, + 0x366c9, + 0x9a048, + 0x214a83, + 0x8e04, + 0x261484, + 0x202742, + 0x219a04, + 0x269045, + 0x220dc3, + 0x2d3684, + 0x214a83, + 0x235b44, + 0x232dc3, + 0x24d9c4, + 0x2e3504, + 0x221dc4, + 0x2137c3, + 0x21a3c3, + 0x242543, + 0x24f8c5, + 0x2308c3, + 0x2141c3, + 0x32bf03, + 0x23e804, + 0x325d04, + 0x373fc5, + 0x9a048, + 0x203ac4, + 0x3b5cc6, + 0x268c84, + 0x201242, + 0x38f207, + 0x3a25c7, + 0x24b904, + 0x2e92c5, + 0x35ff85, + 0x22d805, + 0x221dc4, + 0x389208, + 0x22b586, + 0x3295c8, + 0x27b905, + 0x2ec0c5, + 0x262044, + 0x242543, + 0x2fe7c4, + 0x376806, + 0x2432c3, + 0x23e804, + 0x3829c5, + 0x344b44, + 0x23acc4, + 0x233442, + 0x231d86, + 0x3aeb46, + 0x313fc5, + 0x2000c2, + 0x202703, + 0x33e01242, + 0x20c504, + 0x200382, + 0x23c803, + 0x215402, + 0x21a3c3, 0x2003c2, - 0x216603, - 0x216103, - 0x253c46, - 0x20ff42, - 0x205402, - 0x225242, - 0x55a08683, - 0x55e2d603, - 0x54b86, - 0x54b86, - 0x242244, - 0x20ca43, - 0x14114d, - 0x8bd8a, - 0x1bc1cc, - 0x1b338c, - 0xca7cd, - 0x12eb85, - 0x8b50c, - 0x6bb47, - 0xbec6, - 0x15d08, - 0x1ae07, - 0x21ec8, - 0x19974a, - 0x10f087, - 0x56a8b745, - 0xdc1c9, - 0x56c344cb, - 0x920b, - 0x1846c8, - 0x14dd89, - 0x6828a, - 0xe56ce, - 0x7d4d, - 0x2c28d, - 0x143fe8b, - 0xdd74a, - 0xd944, - 0x58c86, - 0x1bd708, - 0x18a0c8, - 0x67607, - 0xa0c5, - 0xfdc7, - 0x330c9, - 0x16c307, - 0xe688, - 0x2b5c9, - 0x4a444, - 0x4d185, - 0x13fe4e, - 0x189d4d, - 0x114c8, - 0x57293106, - 0x57d72f88, - 0x74388, - 0x13b0d0, - 0x510cc, - 0x60fc7, - 0x62447, - 0x68607, - 0x71487, - 0x4c02, - 0x122587, - 0x1972cc, - 0xfe445, - 0x35147, - 0xa8946, - 0xaa289, - 0xac0c8, - 0x4742, + 0x2fb406, + 0x20e2c3, + 0x207783, + 0x9a048, + 0x9a048, + 0x308003, + 0x1b4103, + 0x2000c2, + 0x34a01242, + 0x308003, + 0x266d43, + 0x2059c3, + 0x227fc4, + 0x21a3c3, + 0x242543, + 0x9a048, + 0x2000c2, + 0x35201242, + 0x214a83, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x682, + 0x209d42, + 0x20c782, + 0x21a8c3, + 0x2f7103, + 0x2000c2, + 0x139b05, + 0x9a048, + 0x17e707, + 0x201242, + 0x232dc3, + 0x24d9c4, + 0x207083, + 0x308003, + 0x206c03, + 0x23c803, + 0x21a3c3, + 0x2125c3, + 0x242543, + 0x233dc3, + 0x12be53, + 0x12e714, + 0x139b05, + 0x17e707, + 0x1d35c9, + 0x10d8c6, + 0xf5ecb, + 0x28886, + 0x54c47, + 0x15aec6, + 0x649, + 0x15794a, + 0x8b70d, + 0x12350c, + 0x116cca, + 0x112988, + 0x97805, + 0x1d3608, + 0x11ec6, + 0x1c6606, + 0x365c6, + 0x602, + 0x2aac82, + 0x174ec4, + 0x9fc86, + 0x12c310, + 0x147498e, + 0x68846, + 0x6264c, + 0x36a6720b, + 0x139b05, + 0x14820b, + 0x36fc6544, + 0x1b3f07, + 0x22111, + 0x1ae28a, + 0x214a83, + 0x3727db88, + 0x656c5, + 0x19b808, + 0xca04, + 0x14a545, + 0x3755ca06, + 0xa7946, + 0xc7746, + 0x908ca, + 0x1b5c43, + 0x37a0dc84, + 0x50849, + 0x129747, + 0x1274ca, + 0x14d8949, + 0x605, + 0xec503, + 0x37e33f07, + 0x1df105, + 0x1538186, + 0x1498886, + 0xb06cc, + 0x101b88, + 0x3803fcc3, + 0xf874b, + 0x13864b, + 0x38647c0c, + 0x140a503, + 0xc2dc8, + 0xf89c5, + 0xc11c9, + 0xea803, + 0x102908, + 0x141dfc6, + 0x86107, + 0x38b5b849, + 0x19d887, + 0xebbca, + 0x39fbf648, + 0x11578d, + 0xa788, + 0xf283, + 0x1443f09, + 0x174483, + 0x28886, + 0xf48c8, + 0x11dc4, + 0x1205c5, + 0x148df83, + 0x239c7, + 0x38e239c3, + 0x393c0a06, + 0x39637f04, + 0x39b0a107, + 0xf48c4, + 0xf48c4, + 0xf48c4, + 0xf48c4, + 0x41, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x2000c2, + 0x201242, + 0x308003, + 0x206182, + 0x21a3c3, + 0x242543, + 0x20e2c3, + 0x3810cf, + 0x38148e, + 0x9a048, + 0x214a83, + 0x43bc7, + 0x232dc3, + 0x308003, + 0x21bc83, + 0x21a3c3, + 0x242543, + 0x68784, + 0x4fc4, + 0x145bc4, + 0x21c9c3, + 0x296747, + 0x203082, + 0x26ce49, + 0x200ac2, + 0x38be4b, + 0x2a1b8a, + 0x2a2889, + 0x200542, + 0x20cdc6, + 0x236a55, + 0x38bf95, + 0x2391d3, + 0x38c513, + 0x2037c2, + 0x2037c5, + 0x2037cc, + 0x27514b, + 0x276205, + 0x204b42, + 0x29d282, + 0x37bb86, + 0x201182, + 0x2c9d46, + 0x20908d, + 0x3dee8c, + 0x379a84, + 0x200882, + 0x202b02, + 0x259808, + 0x200202, + 0x205086, + 0x395a8f, + 0x205090, + 0x3a1544, + 0x236c15, + 0x239353, + 0x24d2c3, + 0x34934a, + 0x214f07, + 0x383d89, + 0x327387, + 0x220f82, + 0x200282, + 0x3beb06, + 0x205fc2, + 0x9a048, + 0x202e82, + 0x201542, + 0x20ac47, + 0x36a6c7, + 0x36a6d1, + 0x2180c5, + 0x2180ce, + 0x218e8f, + 0x20cd42, + 0x2679c7, + 0x21d008, + 0x207682, + 0x21d482, + 0x2101c6, + 0x2101cf, + 0x263710, + 0x22c042, + 0x2086c2, + 0x238c48, + 0x2086c3, + 0x25cec8, + 0x2c1bcd, + 0x215843, + 0x363208, + 0x27fc4f, + 0x28000e, + 0x33c9ca, + 0x2f5211, + 0x2f5690, + 0x300acd, + 0x300e0c, + 0x24a147, + 0x3494c7, + 0x349709, + 0x220f42, + 0x204342, + 0x25678c, + 0x256a8b, + 0x200d42, + 0x2cbec6, + 0x20b682, + 0x200482, + 0x2167c2, + 0x201242, + 0x22d204, + 0x239e07, + 0x22ba02, + 0x23f707, + 0x241247, + 0x22f142, + 0x22ec02, + 0x243a85, + 0x205582, + 0x392dce, + 0x3cae0d, + 0x232dc3, + 0x28508e, + 0x2b794d, + 0x328b03, + 0x2027c2, + 0x21fc84, + 0x24cf02, + 0x222342, + 0x38cdc5, + 0x39d187, + 0x246702, + 0x20dec2, + 0x24d5c7, + 0x250bc8, + 0x22dec2, + 0x277306, + 0x25660c, + 0x25694b, + 0x205dc2, + 0x25db0f, + 0x25ded0, + 0x25e2cf, + 0x25e695, + 0x25ebd4, + 0x25f0ce, + 0x25f44e, + 0x25f7cf, + 0x25fb8e, + 0x25ff14, + 0x260413, + 0x2608cd, + 0x2765c9, + 0x28d003, + 0x207082, + 0x31e805, + 0x3ddc86, + 0x200382, + 0x37f147, + 0x308003, + 0x200642, + 0x361608, + 0x2f5451, + 0x2f5890, + 0x201f02, + 0x28bf47, + 0x204582, + 0x271547, + 0x201e42, + 0x295749, + 0x37bb47, + 0x29ac08, + 0x35c846, + 0x24b083, + 0x24b085, + 0x233042, + 0x2004c2, + 0x3bef05, + 0x39b605, + 0x202482, + 0x21bdc3, + 0x348587, + 0x20e5c7, + 0x201842, + 0x345044, + 0x210543, + 0x31d809, + 0x210548, + 0x202042, + 0x208282, + 0x2ed207, + 0x2f5145, + 0x298bc8, + 0x2ae507, + 0x20fac3, + 0x29fb06, + 0x30094d, + 0x300ccc, + 0x305086, + 0x206782, + 0x2017c2, + 0x209e82, + 0x27facf, + 0x27fece, + 0x360007, + 0x210942, + 0x372385, + 0x372386, + 0x21d542, + 0x200bc2, + 0x28e5c6, + 0x247703, + 0x3c5d46, + 0x2d6705, + 0x2d670d, + 0x2d6f95, + 0x2d7e0c, + 0x2d818d, + 0x2d84d2, + 0x202382, + 0x26c9c2, + 0x202802, + 0x219386, + 0x3c7dc6, + 0x202902, + 0x3ddd06, + 0x206e42, + 0x296f45, + 0x201582, + 0x392f09, + 0x21ae0c, + 0x21b14b, + 0x2003c2, + 0x251d88, + 0x202942, + 0x200a82, + 0x272b46, + 0x2d2c85, + 0x200a87, + 0x227c85, + 0x257145, + 0x215542, + 0x2a3882, + 0x214282, + 0x293a87, + 0x2fb4cd, + 0x2fb84c, + 0x234307, + 0x277282, + 0x205742, + 0x3d2508, + 0x344d48, + 0x3298c8, + 0x3b1104, + 0x33ecc7, + 0x3c2c83, + 0x21b742, + 0x20cb42, + 0x2fc0c9, + 0x228c87, + 0x2141c2, + 0x272f45, + 0x214b42, + 0x20eb42, + 0x2f6e43, + 0x2f6e46, + 0x305fc2, + 0x308c02, + 0x200402, + 0x35c406, + 0x21fbc7, + 0x213fc2, + 0x200902, + 0x25cd0f, + 0x284ecd, + 0x28a98e, + 0x2b77cc, + 0x206842, + 0x206142, + 0x35c685, + 0x320b86, + 0x200b82, + 0x2069c2, + 0x200682, + 0x285244, + 0x2c1a44, + 0x384486, + 0x205142, + 0x27a207, + 0x23d903, + 0x23d908, + 0x23e108, + 0x2d23c7, + 0x24c186, + 0x207842, + 0x20b603, + 0x20b607, + 0x3a6dc6, + 0x2ee0c5, + 0x274608, + 0x2071c2, + 0x3b9447, + 0x26c702, + 0x294ec2, + 0x206382, + 0x205249, + 0x201082, + 0xcb3c8, + 0x203882, + 0x234583, + 0x204847, + 0x203282, + 0x21af8c, + 0x21b28b, + 0x305106, + 0x2ec445, + 0x202c02, + 0x202982, + 0x2c55c6, + 0x216643, + 0x342e87, + 0x291f82, + 0x2008c2, + 0x2368d5, + 0x38c155, + 0x239093, + 0x38c693, + 0x24ee47, + 0x26ee11, + 0x275590, + 0x283712, + 0x2eb111, + 0x29a208, + 0x29a210, + 0x29f38f, + 0x2a1953, + 0x2a2652, + 0x2a7d50, + 0x2b4ecf, + 0x3689d2, + 0x3a1891, + 0x3d4d53, + 0x2b9d52, + 0x2d634f, + 0x2ddd0e, + 0x2e1112, + 0x2e1fd1, + 0x2e5e0f, + 0x2e7c8e, + 0x2efbd1, + 0x2f8ed0, + 0x301d52, + 0x306491, + 0x309b50, + 0x311f8f, + 0x3cea91, + 0x347910, + 0x37b006, + 0x380cc7, + 0x218987, + 0x209f42, + 0x280f85, + 0x310dc7, + 0x20c782, + 0x2018c2, + 0x229e45, + 0x21ec03, + 0x374946, + 0x2fb68d, + 0x2fb9cc, + 0x203642, + 0x20364b, + 0x27500a, + 0x22408a, + 0x2c43c9, + 0x2fa74b, + 0x2ae64d, + 0x3114cc, + 0x35d58a, + 0x244f8c, + 0x27188b, + 0x27604c, + 0x29b68e, + 0x2bf90b, + 0x2b8a0c, + 0x2dc483, + 0x376e46, + 0x3bf642, + 0x304382, + 0x24f4c3, + 0x206482, + 0x20c3c3, + 0x324506, + 0x25e847, + 0x352386, + 0x2e78c8, + 0x348408, + 0x2cf746, + 0x200f02, + 0x31398d, + 0x313ccc, + 0x338807, + 0x316b07, + 0x234a42, + 0x2143c2, + 0x20b582, + 0x27c602, + 0x330496, + 0x335f95, + 0x3395d6, + 0x33ff53, + 0x340612, + 0x355513, + 0x358152, + 0x3acc8f, + 0x3be558, + 0x3bf117, + 0x3bfc59, + 0x3c1898, + 0x3c3c58, + 0x3c5fd7, + 0x3c6b17, + 0x3c8216, + 0x3cc693, + 0x3ccfd5, + 0x3cdd52, + 0x3ce1d3, + 0x201242, + 0x21a3c3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x20e2c3, + 0x2000c2, + 0x201602, + 0x3be933c5, + 0x3c281445, + 0x3c746bc6, + 0x9a048, + 0x3caba385, + 0x201242, + 0x2052c2, + 0x3ce871c5, + 0x3d27e985, + 0x3d680387, + 0x3da806c9, + 0x3de1f844, + 0x200382, + 0x200642, + 0x3e249a05, + 0x3e69d789, + 0x3eb2fb48, + 0x3eeb4985, + 0x3f350107, + 0x3f61d988, + 0x3fb09745, + 0x3fe9e2c6, + 0x403a2709, + 0x406db0c8, + 0x40aca648, + 0x40e9ddca, + 0x412c21c4, + 0x4168e885, + 0x41ac6c08, + 0x41f44945, + 0x20fe82, + 0x42297703, + 0x426aa1c6, + 0x42aaf5c8, + 0x42ef2f86, + 0x4320ad88, + 0x43785546, + 0x43a02c44, + 0x43e08482, + 0x446f4cc7, + 0x44ab0b04, + 0x44e79487, + 0x453cfc87, + 0x2003c2, + 0x456a2c85, + 0x45a13504, + 0x45fa3407, + 0x4623d187, + 0x466830c6, + 0x46a7f445, + 0x46e9d887, + 0x472daf48, + 0x477d0007, + 0x47b41189, + 0x47ed7505, + 0x48331207, + 0x48692a06, + 0x647cb, + 0x48b3aec8, + 0x225bcd, + 0x25d2c9, + 0x27418b, + 0x27c08b, + 0x2b014b, + 0x2f010b, + 0x320d8b, + 0x32104b, + 0x321e89, + 0x322e8b, + 0x32314b, + 0x323c8b, + 0x324e0a, + 0x32534a, + 0x32594c, + 0x32934b, + 0x329aca, + 0x33e6ca, + 0x34b30e, + 0x34d44e, + 0x34d7ca, + 0x34f64a, + 0x350c0b, + 0x350ecb, + 0x3519cb, + 0x36cdcb, + 0x36d3ca, + 0x36e08b, + 0x36e34a, + 0x36e5ca, + 0x36e84a, + 0x38e64b, + 0x39510b, + 0x397c0e, + 0x397f8b, + 0x39e8cb, + 0x39fc0b, + 0x3a3fca, + 0x3a4249, + 0x3a448a, + 0x3a5d8a, + 0x3bdf4b, + 0x3ca84b, + 0x3cb24a, + 0x3cc0cb, + 0x3d520b, + 0x3dfe4b, + 0x48e81788, + 0x4928ae89, + 0x496a5789, + 0x49aed408, + 0x3597c5, + 0x2041c3, + 0x251084, + 0x3015c5, + 0x21f586, + 0x307385, + 0x28a004, + 0x37f048, + 0x31bb05, + 0x294984, + 0x3c7607, + 0x2a4b0a, + 0x38f4ca, + 0x360107, + 0x34c207, + 0x2e6307, + 0x280947, + 0x334605, + 0x3b9b46, + 0x2f2207, + 0x39bc04, + 0x2f9b46, + 0x2f9a46, + 0x3c2d85, + 0x3b6684, + 0x29ee06, + 0x2a3bc7, + 0x34bb86, + 0x3adf47, + 0x251143, + 0x384106, + 0x238e85, + 0x280487, + 0x26a5ca, + 0x356504, + 0x219d88, + 0x31a2c9, + 0x2d4847, + 0x390606, + 0x3c5808, + 0x2f36c9, + 0x383f44, + 0x31eb84, + 0x2dea45, + 0x222b48, + 0x2d4b07, + 0x36c9c9, + 0x34cdc8, + 0x318406, + 0x264a46, + 0x29f988, + 0x36b706, + 0x281445, + 0x283186, + 0x279b88, + 0x27f9c6, + 0x255d8b, + 0x39d746, + 0x2a14cd, + 0x3d0845, + 0x2b09c6, + 0x20c045, + 0x24a789, + 0x370447, + 0x385188, + 0x291386, + 0x2a0689, + 0x3b1306, + 0x26a545, + 0x2a6dc6, + 0x2e5346, + 0x2d9209, + 0x2c0b06, + 0x2a4807, + 0x360b05, + 0x201583, + 0x21b7c5, + 0x34dd07, + 0x288f46, + 0x3d0749, + 0x346bc6, + 0x279686, + 0x20f849, + 0x282b89, + 0x2a8587, + 0x343488, + 0x2a7789, + 0x280c08, + 0x394486, + 0x2e2e85, + 0x2cfd8a, + 0x279706, + 0x33a806, + 0x2dc705, + 0x2523c8, + 0x326447, + 0x22f5ca, + 0x24e1c6, + 0x2e05c5, + 0x309186, + 0x215f87, + 0x3904c7, + 0x21c2c5, + 0x26a705, + 0x263586, + 0x269d46, + 0x26c0c6, + 0x2c70c4, + 0x282109, + 0x28bd06, + 0x30618a, + 0x2211c8, + 0x330f08, + 0x38f4ca, + 0x2af785, + 0x2a3b05, + 0x3c4f48, + 0x2c4f08, + 0x237c47, + 0x3b9d86, + 0x333988, + 0x2108c7, + 0x274848, + 0x2bebc6, + 0x283ec8, + 0x29c606, + 0x27ba87, + 0x3681c6, + 0x29ee06, + 0x2643ca, + 0x305206, + 0x2e2e89, + 0x36f506, + 0x2a5c8a, + 0x202c49, + 0x241706, + 0x2c2844, + 0x31e8cd, + 0x28b107, + 0x3b2a86, + 0x2ca505, + 0x3b1385, + 0x391106, + 0x2a7349, + 0x2bd687, + 0x27ab86, + 0x31db46, + 0x28a089, + 0x281384, + 0x244744, + 0x204088, + 0x356846, + 0x2a6ec8, + 0x318a88, + 0x2883c7, + 0x3c0549, + 0x26c2c7, + 0x2ba24a, + 0x2fcb8f, + 0x2e43ca, + 0x3d9e45, + 0x279dc5, + 0x2173c5, + 0x3c2147, + 0x215b43, + 0x343688, + 0x3de2c6, + 0x3de3c9, + 0x2f2b06, + 0x2d9047, + 0x2a0449, + 0x385088, + 0x2dc7c7, + 0x31f203, + 0x359845, + 0x215ac5, + 0x2c6f0b, + 0x344a04, + 0x23ba44, + 0x277906, + 0x31f3c7, + 0x39168a, + 0x3803c7, + 0x293607, + 0x27e985, + 0x3c8785, + 0x270489, + 0x29ee06, + 0x38024d, + 0x298b05, + 0x2bc683, + 0x226283, + 0x35c505, + 0x334285, + 0x3c5808, + 0x27b4c7, + 0x2444c6, + 0x2a5406, + 0x22a145, + 0x233087, + 0x287ec7, + 0x22b447, + 0x28e90a, + 0x3841c8, + 0x2c70c4, + 0x27f747, + 0x27d6c7, + 0x35e406, + 0x29bc87, + 0x2e9688, + 0x357b08, + 0x370346, + 0x34c448, + 0x2c0b84, + 0x2f2206, + 0x37ff46, + 0x3bbc46, + 0x204506, + 0x2a3044, + 0x280a06, + 0x2c95c6, + 0x29f1c6, + 0x245806, + 0x3d0d46, + 0x2e94c6, + 0x2443c8, + 0x2bb748, + 0x2dfcc8, + 0x307588, + 0x3c4ec6, + 0x206a05, + 0x21b786, + 0x2b4a05, + 0x393907, + 0x29d485, + 0x20d743, + 0x226305, + 0x2ed004, + 0x3d0e85, + 0x202943, + 0x395407, + 0x36c188, + 0x3ae006, + 0x37e88d, + 0x279d86, + 0x29e785, + 0x205243, + 0x2c65c9, + 0x281506, + 0x299486, + 0x292104, + 0x2e4347, + 0x35bf06, + 0x244945, + 0x23a8c3, + 0x206284, + 0x27d886, + 0x35ad44, + 0x26e588, + 0x3c7989, + 0x2bdc09, + 0x2a6cca, + 0x2a914d, + 0x361a87, + 0x3ba086, + 0x2afb04, + 0x2806c9, + 0x285b48, + 0x28ad06, + 0x234e86, + 0x29bc87, + 0x2c74c6, + 0x2261c6, + 0x287346, + 0x3cfd0a, + 0x21d988, + 0x265085, + 0x295e09, + 0x2d528a, + 0x30b048, + 0x2a34c8, + 0x299408, + 0x2b0d0c, + 0x34da05, + 0x2a5688, + 0x2bba46, + 0x372046, + 0x3db607, + 0x3802c5, + 0x283305, + 0x2bdac9, + 0x20d447, + 0x3de385, + 0x2283c7, + 0x226283, + 0x2d5745, + 0x2273c8, + 0x2d6d07, + 0x2a3389, + 0x2e2d45, + 0x380fc4, + 0x2a8e08, + 0x2c1e87, + 0x2dc988, + 0x20d188, + 0x2b1a85, + 0x20c206, + 0x2a5506, + 0x2dee09, + 0x380047, + 0x2b52c6, + 0x3de007, + 0x2027c3, + 0x21f844, + 0x2da0c5, + 0x2331c4, + 0x246744, + 0x389507, + 0x2664c7, + 0x27ad44, + 0x2a31d0, + 0x296007, + 0x3c8785, + 0x30394c, + 0x20cf44, + 0x2b9a08, + 0x27b989, + 0x3bcb46, + 0x302a48, + 0x267884, + 0x277c08, + 0x22fbc6, + 0x264248, + 0x2a4186, + 0x28ba4b, + 0x32b105, + 0x2d9f48, + 0x211b44, + 0x281e8a, + 0x2a3389, + 0x3680c6, + 0x2bbc48, + 0x259345, + 0x2c5bc4, + 0x2b9906, + 0x22b308, + 0x281788, + 0x32dc86, + 0x384404, + 0x2cfd06, + 0x26c347, + 0x279387, + 0x29bc8f, + 0x339e47, + 0x2417c7, + 0x372245, + 0x372ac5, + 0x2a8249, + 0x2ead06, + 0x389745, + 0x282e87, + 0x3db888, + 0x300805, + 0x3681c6, + 0x221008, + 0x2f2f8a, + 0x22b008, + 0x28e347, + 0x2fcfc6, + 0x295dc6, + 0x2003c3, + 0x212503, + 0x2d5449, + 0x2a7609, + 0x2b9806, + 0x2e2d45, + 0x2b0b88, + 0x2bbc48, + 0x36b888, + 0x2873cb, + 0x37eac7, + 0x31bdc9, + 0x29bf08, + 0x34f104, + 0x3bb888, + 0x28fe49, + 0x2b55c5, + 0x3c2047, + 0x21f8c5, + 0x281688, + 0x29324b, + 0x29d5d0, + 0x2b0545, + 0x211a8c, + 0x244685, + 0x27ea03, + 0x2bf706, + 0x2c8b04, + 0x368486, + 0x2a3bc7, + 0x202804, + 0x242808, + 0x34354d, + 0x318845, + 0x2a2cc4, + 0x2ae044, + 0x2b3e49, + 0x2b2308, + 0x32b5c7, + 0x22fc48, + 0x2821c8, + 0x27ae85, + 0x2d0e87, + 0x27ae07, + 0x2cd307, + 0x26a709, + 0x2879c9, + 0x3dfb46, + 0x301006, + 0x282f46, + 0x322605, + 0x3b8a04, + 0x3c4206, + 0x3c7086, + 0x27aec8, + 0x215c4b, + 0x3563c7, + 0x2afb04, + 0x35be46, + 0x2e99c7, + 0x36f805, + 0x2971c5, + 0x2ae204, + 0x287946, + 0x3c4288, + 0x2806c9, + 0x24bb46, + 0x285948, + 0x244a06, + 0x360a48, + 0x321a0c, + 0x27ad46, + 0x29e44d, + 0x29e8cb, + 0x2a48c5, + 0x288007, + 0x2c0c06, + 0x390388, + 0x3dfbc9, + 0x2ee4c8, + 0x3c8785, + 0x39b947, + 0x280d08, + 0x23b4c9, + 0x35bb86, + 0x25138a, + 0x390108, + 0x2ee30b, + 0x21dc0c, + 0x277d08, + 0x27cc06, + 0x2d0888, + 0x2f2c07, + 0x33a409, + 0x35024d, + 0x29ed06, + 0x2250c8, + 0x2bb609, + 0x2c71c8, + 0x283fc8, + 0x2c9ecc, + 0x2cab87, + 0x2cb7c7, + 0x26a545, + 0x2bdf87, + 0x3db748, + 0x2b9986, + 0x24b9cc, + 0x300288, + 0x2db2c8, + 0x307846, + 0x2af0c7, + 0x3dfd44, + 0x307588, + 0x2cf84c, + 0x28538c, + 0x3d9ec5, + 0x3c2e07, + 0x384386, + 0x2af046, + 0x24a948, + 0x21d284, + 0x34bb8b, + 0x27a34b, + 0x2fcfc6, + 0x3433c7, + 0x343ec5, + 0x272605, + 0x34bcc6, + 0x259305, + 0x3449c5, + 0x2d4287, + 0x20e989, + 0x269f04, + 0x25a2c5, + 0x2f6d85, + 0x35aac8, + 0x28d785, + 0x2cf209, + 0x2badc7, + 0x2badcb, + 0x2fbbc6, + 0x244109, + 0x3b65c8, + 0x290185, + 0x2cd408, + 0x287a08, + 0x253047, + 0x2b4247, + 0x389589, + 0x264187, + 0x29d389, + 0x2da70c, + 0x341088, + 0x2c0649, + 0x2c2f87, + 0x282289, + 0x33c3c7, + 0x21dd08, + 0x33a345, + 0x2f2186, + 0x2ca548, + 0x217488, + 0x2d5149, + 0x344a07, + 0x273005, + 0x3c3909, + 0x2f42c6, + 0x292a04, + 0x37b446, + 0x2af448, + 0x320807, + 0x215e48, + 0x34c509, + 0x33be47, + 0x2a4cc6, + 0x2880c4, + 0x226389, + 0x2d0d08, + 0x307707, + 0x367a06, + 0x215b86, + 0x33a784, + 0x34c706, + 0x239f83, + 0x32ac89, + 0x32b0c6, + 0x2a3705, + 0x2a5406, + 0x2d95c5, + 0x281188, + 0x347207, + 0x2306c6, + 0x287206, + 0x330f08, + 0x2a83c7, + 0x29ed45, + 0x2a2fc8, + 0x3aa048, + 0x390108, + 0x244545, + 0x2f2206, + 0x2bd9c9, + 0x2dec84, + 0x2d944b, + 0x225ecb, + 0x264f89, + 0x226283, + 0x257845, + 0x3ae4c6, + 0x246508, + 0x306ec4, + 0x3ae006, + 0x28ea49, + 0x2c93c5, + 0x2d41c6, + 0x2c1e86, + 0x222dc4, + 0x29958a, + 0x2a3648, + 0x217486, + 0x2cd045, + 0x343d47, + 0x3344c7, + 0x20c204, + 0x226107, + 0x2ba244, + 0x34ce46, + 0x210b43, + 0x26a705, + 0x2b6e45, + 0x23ef88, + 0x27f905, + 0x27aa89, + 0x2a9fc7, + 0x3073cb, + 0x2a9fcc, + 0x2aa5ca, + 0x350107, + 0x203d03, + 0x278808, + 0x244705, + 0x300885, + 0x359904, + 0x21dc06, + 0x27b986, + 0x34c747, + 0x23a80b, + 0x2a3044, + 0x355f44, + 0x2d4444, + 0x2d8ec6, + 0x202804, + 0x222c48, + 0x359705, + 0x21c145, + 0x36b7c7, + 0x288109, + 0x334285, + 0x39110a, + 0x3db9c9, + 0x2b174a, + 0x3cfe49, + 0x3545c4, + 0x31dc05, + 0x2c75c8, + 0x3a34cb, + 0x2dea45, + 0x24c386, + 0x241304, + 0x27afc6, + 0x33bcc9, + 0x2e9ac7, + 0x346d88, + 0x2a94c6, + 0x26c2c7, + 0x281788, + 0x377746, + 0x3c72c4, + 0x3817c7, + 0x382e85, + 0x392987, + 0x267784, + 0x2c0b86, + 0x30ad48, + 0x29ea88, + 0x2ff987, + 0x202808, + 0x29c6c5, + 0x226004, + 0x38f3c8, + 0x202904, + 0x217345, + 0x30af44, + 0x2109c7, + 0x28bdc7, + 0x2823c8, + 0x2dcb06, + 0x27f885, + 0x27a888, + 0x246848, + 0x2a6c09, + 0x2261c6, + 0x22f648, + 0x281d0a, + 0x36f888, + 0x309745, + 0x21b986, + 0x2a7208, + 0x39ba0a, + 0x219507, + 0x285f85, + 0x292c08, + 0x270fc4, + 0x252446, + 0x2cbb48, + 0x3d0d46, + 0x334c08, + 0x2d7ac7, + 0x3c7506, + 0x2c2844, + 0x237687, + 0x2bc004, + 0x33bc87, + 0x367e0d, + 0x237cc5, + 0x2d6b0b, + 0x285606, + 0x251e88, + 0x2427c4, + 0x3c50c6, + 0x27d886, + 0x2d0bc7, + 0x29e10d, + 0x304807, + 0x2bc5c8, + 0x284145, + 0x270648, + 0x2d4a86, + 0x29c748, + 0x238606, + 0x3036c7, + 0x282749, + 0x35a587, + 0x28afc8, + 0x34a005, + 0x22a1c8, + 0x2aef85, + 0x228e05, + 0x362b45, + 0x24dec3, + 0x204584, + 0x292e05, + 0x3a2709, + 0x367906, + 0x2e9788, + 0x2c2105, + 0x2bde47, + 0x371bca, + 0x2d4109, + 0x2e524a, + 0x2dfd48, + 0x22820c, + 0x282f0d, + 0x311883, + 0x334b08, + 0x206245, + 0x2f2d46, + 0x384f06, + 0x31e585, + 0x3de109, + 0x33d2c5, + 0x27a888, + 0x258546, + 0x369706, + 0x2a8cc9, + 0x3a9007, + 0x293506, + 0x371b48, + 0x3bbb48, + 0x2ed607, + 0x2c974e, + 0x2d4cc5, + 0x23b3c5, + 0x3d0c48, + 0x271e87, + 0x200e42, + 0x2c9b84, + 0x36838a, + 0x3077c8, + 0x287b46, + 0x2a0588, + 0x2a5506, + 0x288b88, + 0x2b52c8, + 0x228dc4, + 0x2be205, + 0x668c84, + 0x668c84, + 0x668c84, + 0x20aec3, + 0x215a06, + 0x27ad46, + 0x2a458c, + 0x202dc3, + 0x267786, + 0x21a604, + 0x281488, + 0x28e885, + 0x368486, + 0x2c6d08, + 0x2e0e46, + 0x230646, + 0x3c5608, + 0x2da147, + 0x263f49, + 0x3ae60a, + 0x266644, + 0x29d485, + 0x2e4305, + 0x2d7746, + 0x361ac6, + 0x2a50c6, + 0x3dc246, + 0x264084, + 0x26408b, + 0x264a44, + 0x244285, + 0x2b3a45, + 0x288486, + 0x201b48, + 0x282dc7, + 0x32b044, + 0x25b603, + 0x270ac5, + 0x37b307, + 0x282ccb, + 0x23ee87, + 0x2c6c08, + 0x2be347, + 0x26b746, + 0x25d588, + 0x2c51cb, + 0x301506, + 0x212849, + 0x2c5345, + 0x31f203, + 0x2d41c6, + 0x2d79c8, + 0x20c2c3, + 0x24c343, + 0x281786, + 0x2a5506, + 0x3759ca, + 0x27cc45, + 0x27d6cb, + 0x2a534b, + 0x213c03, + 0x20ea43, + 0x2ba1c4, + 0x370587, + 0x277d04, + 0x281484, + 0x2bb8c4, + 0x36fb88, + 0x2ccf88, + 0x214d49, + 0x2d7588, + 0x3b2d07, + 0x245806, + 0x2e93cf, + 0x2d4e06, + 0x2df404, + 0x2ccdca, + 0x37b207, + 0x2bc106, + 0x292a49, + 0x214cc5, + 0x23f0c5, + 0x214e06, + 0x22a303, + 0x271009, + 0x21db06, + 0x34c2c9, + 0x391686, + 0x26a705, + 0x35c905, + 0x204583, + 0x3706c8, + 0x32b787, + 0x3de2c4, + 0x281308, + 0x371dc4, + 0x359006, + 0x2bf706, + 0x23d646, + 0x2d9e09, + 0x300805, + 0x29ee06, + 0x2713c9, + 0x2d3e06, + 0x2e94c6, + 0x3a14c6, + 0x22bd85, + 0x30af46, + 0x3036c4, + 0x33a345, + 0x217484, + 0x2bcf46, + 0x298ac4, + 0x2109c3, + 0x285c05, + 0x233d88, + 0x3572c7, + 0x306f49, + 0x285e88, + 0x29f751, + 0x2c1f0a, + 0x2fcf07, + 0x357e46, + 0x21a604, + 0x2ca648, + 0x2ea008, + 0x29f90a, + 0x2cefcd, + 0x2a6dc6, + 0x3c5706, + 0x237746, + 0x21c147, + 0x2bc685, + 0x286c47, + 0x2813c5, + 0x2baf04, + 0x3c5e46, + 0x224dc7, + 0x270d0d, + 0x2a7147, + 0x37ef48, + 0x27ab89, + 0x21b886, + 0x35bb05, + 0x23c2c4, + 0x2af546, + 0x20c106, + 0x307946, + 0x2a0e08, + 0x21ad83, + 0x2465c3, + 0x349b05, + 0x31ec06, + 0x2b5285, + 0x2a96c8, + 0x2a3d8a, + 0x347344, + 0x281488, + 0x299408, + 0x2882c7, + 0x286589, + 0x2c6908, + 0x280747, + 0x2bbb46, + 0x3d0d4a, + 0x2af5c8, + 0x30c989, + 0x2b23c8, + 0x21ef89, + 0x357d07, + 0x312785, + 0x2a5906, + 0x2b9808, + 0x252008, + 0x224508, + 0x222dc8, + 0x244285, + 0x200d04, + 0x232708, + 0x241084, + 0x3cfc44, + 0x26a705, + 0x2949c7, + 0x287ec9, + 0x2d09c7, + 0x20f8c5, + 0x277b06, + 0x36f1c6, + 0x201c44, + 0x2a9006, + 0x27db04, + 0x291746, + 0x287c86, + 0x212e86, + 0x3c8785, + 0x2a9587, + 0x203d03, + 0x211609, + 0x330d08, + 0x2805c4, + 0x2805cd, + 0x29eb88, + 0x32a608, + 0x30c906, + 0x282849, + 0x2d4109, + 0x33b9c5, + 0x2a3e8a, + 0x291aca, + 0x2b444c, + 0x2b45c6, + 0x278406, + 0x2d5686, + 0x38ce89, + 0x2f2f86, + 0x21dd86, + 0x33d386, + 0x307588, + 0x202806, + 0x2de54b, + 0x294b45, + 0x21c145, + 0x279485, + 0x203e06, + 0x226043, + 0x23d5c6, + 0x2a70c7, + 0x2ca505, + 0x2d1c05, + 0x3b1385, + 0x310686, + 0x32fa44, + 0x32fa46, + 0x2ab289, + 0x203c8c, + 0x2bac48, + 0x22b284, + 0x30ac46, + 0x285706, + 0x2d79c8, + 0x2bbc48, + 0x203b89, + 0x343d47, + 0x356589, + 0x2726c6, + 0x22c144, + 0x2082c4, + 0x27f6c4, + 0x281788, + 0x287d0a, + 0x334206, + 0x3677c7, + 0x392c07, + 0x244205, + 0x36c944, + 0x28fe06, + 0x2bc6c6, + 0x21d2c3, + 0x330b47, + 0x20d088, + 0x33bb0a, + 0x22be48, + 0x20ad88, + 0x298b05, + 0x2a49c5, + 0x3564c5, + 0x2445c6, + 0x247486, + 0x33c885, + 0x32aec9, + 0x36c74c, + 0x2f4ec7, + 0x29f988, + 0x2521c5, + 0x668c84, + 0x265444, + 0x2d6e44, + 0x218706, + 0x2a650e, + 0x23f147, + 0x21c345, + 0x2dec0c, + 0x310b07, + 0x224d47, + 0x226fc9, + 0x219e49, + 0x285f85, + 0x330d08, + 0x2bd9c9, + 0x38ffc5, + 0x2ca448, + 0x2c0886, + 0x38f646, + 0x202c44, + 0x28ee48, + 0x21ba43, + 0x215604, + 0x270b45, + 0x396f07, + 0x2c2605, + 0x281bc9, + 0x2a118d, + 0x2b3046, + 0x3df784, + 0x3b9d08, + 0x20e7ca, + 0x21c847, + 0x367d45, + 0x215643, + 0x2a550e, + 0x3707cc, + 0x30b147, + 0x2a66c7, + 0x443960c7, + 0xaf286, + 0x647c4, + 0x203083, + 0x2f2fc5, + 0x2d6e45, + 0x2a0948, + 0x29dc09, + 0x22b186, + 0x277d04, + 0x2fce46, + 0x331bcb, + 0x2e844c, + 0x24df87, + 0x2de805, + 0x3a9f48, + 0x2ed3c5, + 0x2ccdc7, + 0x2f4cc7, + 0x245fc5, + 0x226043, + 0x20c584, + 0x2e4205, + 0x269e05, + 0x269e06, + 0x2a9dc8, + 0x224dc7, + 0x385206, + 0x33a686, + 0x362a86, + 0x225249, + 0x2d0f87, + 0x250f86, + 0x2e85c6, + 0x276d06, + 0x2b0ac5, + 0x20a586, + 0x39b0c5, + 0x28d808, + 0x29428b, + 0x28fb46, + 0x392c44, + 0x304e49, + 0x2a9fc4, + 0x2c0808, + 0x30e907, + 0x283ec4, + 0x2c5dc8, + 0x2cb5c4, + 0x2b0b04, + 0x274785, + 0x318886, + 0x36fac7, + 0x23db43, + 0x2a4d85, + 0x2fd1c4, + 0x23b406, + 0x33ba48, + 0x202705, + 0x293f49, + 0x350105, + 0x267788, + 0x21a4c7, + 0x32b1c8, + 0x2c5a07, + 0x241889, + 0x280886, + 0x33e906, + 0x2a78c4, + 0x355e85, + 0x31320c, + 0x279487, + 0x279c87, + 0x361708, + 0x2b3046, + 0x2a7004, + 0x34b0c4, + 0x389409, + 0x2d5786, + 0x270507, + 0x2d0804, + 0x326b06, + 0x38a805, + 0x2dc647, + 0x2de4c6, + 0x251249, + 0x2f0387, + 0x29bc87, + 0x2a8b46, + 0x326a45, + 0x27f408, + 0x21d988, + 0x245a06, + 0x202745, + 0x2cca86, + 0x20af03, + 0x2a07c9, + 0x2a4e4e, + 0x2c5748, + 0x371ec8, + 0x24580b, + 0x294186, + 0x385544, + 0x230644, + 0x2a4f4a, + 0x211987, + 0x251045, + 0x212849, + 0x2c9685, + 0x3cfc87, + 0x2305c4, + 0x3c7b07, + 0x318988, + 0x2d4906, + 0x2c0d09, + 0x2c6a0a, + 0x211906, + 0x29e6c6, + 0x2b39c5, + 0x398545, + 0x36ac07, + 0x245608, + 0x38a748, + 0x228dc6, + 0x35c985, + 0x36184e, + 0x2c70c4, + 0x245985, + 0x277489, + 0x2eab08, + 0x28e286, + 0x2a2acc, + 0x2a3990, + 0x2a614f, + 0x2a8148, + 0x350107, + 0x3c8785, + 0x292e05, + 0x36f949, + 0x292e09, + 0x2cfe06, + 0x2deac7, + 0x355d85, + 0x237c49, + 0x35e486, + 0x2f2dcd, + 0x27f589, + 0x281484, + 0x2c54c8, + 0x2327c9, + 0x3343c6, + 0x278a05, + 0x33e906, + 0x346c49, + 0x2d0688, + 0x206a05, + 0x281e04, + 0x2a2c8b, + 0x334285, + 0x246586, + 0x283246, + 0x3b4246, + 0x2875cb, + 0x294049, + 0x33a5c5, + 0x393807, + 0x2c1e86, + 0x231f46, + 0x281a88, + 0x224f09, + 0x37ed0c, + 0x37b108, + 0x31aac6, + 0x32dc83, + 0x22f306, + 0x241745, + 0x27e208, + 0x3d9d46, + 0x2dc888, + 0x380445, + 0x291805, + 0x21a608, + 0x3bba07, + 0x384e47, + 0x34c747, + 0x302a48, + 0x2d7848, + 0x2e9f06, + 0x2bcd87, + 0x21f707, + 0x2b3f4a, + 0x2168c3, + 0x203e06, + 0x22b3c5, + 0x213504, + 0x27ab89, + 0x241804, + 0x204844, + 0x2a4204, + 0x2a66cb, + 0x32b6c7, + 0x310645, + 0x29c3c8, + 0x277b06, + 0x277b08, + 0x27cb86, + 0x28ed85, + 0x28f045, + 0x290746, + 0x292408, + 0x292988, + 0x27ad46, + 0x29c20f, + 0x2a0290, + 0x3d0845, + 0x203d03, + 0x22c205, + 0x31bd08, + 0x292d09, + 0x390108, + 0x2de8c8, + 0x235288, + 0x32b787, + 0x2777c9, + 0x2dca88, + 0x291004, + 0x2a4088, + 0x35ab89, + 0x2bd387, + 0x34de44, + 0x2d0a88, + 0x2a934a, + 0x2fd446, + 0x2a6dc6, + 0x226089, + 0x2a3bc7, + 0x2d9c88, + 0x21fd08, + 0x33ad48, + 0x24ef85, + 0x3d3205, + 0x21c145, + 0x2d6e05, + 0x2bb447, + 0x226045, + 0x2ca505, + 0x3dde06, + 0x390047, + 0x3a3407, + 0x2a9646, + 0x2e0285, + 0x246586, + 0x241985, + 0x2c4d88, + 0x355d04, + 0x2d3e86, + 0x324604, + 0x2c5bc8, + 0x318c0a, + 0x27b4cc, + 0x23aa05, + 0x21c206, + 0x37eec6, + 0x202586, + 0x31ab44, + 0x3b9a05, + 0x27c447, + 0x2a3c49, + 0x2d9307, + 0x668c84, + 0x668c84, + 0x32b545, + 0x2dda04, + 0x2a204a, + 0x277986, + 0x2bd7c4, + 0x3c2d85, + 0x3bd405, + 0x2bc5c4, + 0x282e87, + 0x3c3a87, + 0x2d8ec8, + 0x26d5c8, + 0x206a09, + 0x372488, + 0x2a220b, + 0x2acc44, + 0x232045, + 0x3897c5, + 0x34c6c9, + 0x224f09, + 0x304d48, + 0x34cc48, + 0x288484, + 0x285745, + 0x2041c3, + 0x2d7705, + 0x29ee86, + 0x29da4c, + 0x20c006, + 0x278906, + 0x28e505, + 0x310708, + 0x2e86c6, + 0x357fc6, + 0x2a6dc6, + 0x22bbcc, + 0x389884, + 0x362bca, + 0x28e448, + 0x29d887, + 0x2fd0c6, + 0x22b247, + 0x2fca45, + 0x367a06, + 0x35ee86, + 0x372987, + 0x2c6704, + 0x210ac5, + 0x277484, + 0x2baf87, + 0x2776c8, + 0x27828a, + 0x280b87, + 0x2aa847, + 0x350087, + 0x2ed509, + 0x29da4a, + 0x22c103, + 0x357285, + 0x212ec3, + 0x2bb909, + 0x2d7c08, + 0x372247, + 0x390209, + 0x21da86, + 0x339f88, + 0x395385, + 0x24694a, + 0x343809, + 0x370209, + 0x3db607, + 0x2ea109, + 0x212d88, + 0x288d86, + 0x21c3c8, + 0x2d1f47, + 0x264187, + 0x3db9c7, + 0x2daf48, + 0x30aac6, + 0x2a9105, + 0x27c447, + 0x29e1c8, + 0x362a04, + 0x306044, + 0x293407, + 0x2b5647, + 0x2bd84a, + 0x288d06, + 0x32eeca, + 0x2c9ac7, + 0x2c6e87, + 0x210b84, + 0x29d444, + 0x2dc546, + 0x35c184, + 0x35c18c, + 0x30e845, + 0x2172c9, + 0x2ef004, + 0x2bc685, + 0x20e748, + 0x292a45, + 0x391106, + 0x292f44, + 0x2acb4a, + 0x2ef646, + 0x255fca, + 0x3d0007, + 0x215f85, + 0x22a305, + 0x24424a, + 0x292585, + 0x2a6cc6, + 0x241084, + 0x2ba346, + 0x36acc5, + 0x3d9e06, + 0x2ff98c, + 0x2e18ca, + 0x291bc4, + 0x245806, + 0x2a3bc7, + 0x2de444, + 0x307588, + 0x24c286, + 0x392a89, + 0x2c8349, + 0x341189, + 0x2d9606, + 0x2d2046, + 0x21c507, + 0x32ae08, + 0x2d1e49, + 0x32b6c7, + 0x29c546, + 0x26c347, + 0x237605, + 0x2c70c4, + 0x21c0c7, + 0x21f8c5, + 0x28a2c5, + 0x200cc7, + 0x245e88, + 0x3a9ec6, + 0x29f00d, + 0x2a0b4f, + 0x2a534d, + 0x202d84, + 0x233e86, + 0x2e1c88, + 0x33d345, + 0x2b4108, + 0x252f0a, + 0x281484, + 0x331e06, + 0x2abe07, + 0x2b7d47, + 0x2da209, + 0x21c385, + 0x2bc5c4, + 0x2be14a, + 0x2c64c9, + 0x2ea207, + 0x30b706, + 0x3343c6, + 0x285686, + 0x381886, + 0x2e158f, + 0x2e1b49, + 0x202806, + 0x389046, + 0x297e89, + 0x2bce87, + 0x2146c3, + 0x22bd46, + 0x212503, + 0x31e448, + 0x26c187, + 0x2a8349, + 0x2bf588, + 0x384f88, + 0x33c506, + 0x20bf49, + 0x2f4e05, + 0x22f244, + 0x312847, + 0x38cf05, + 0x202d84, + 0x361b48, + 0x211c44, + 0x2bcbc7, + 0x36c106, + 0x263645, + 0x2b23c8, + 0x33428b, + 0x331207, + 0x2444c6, + 0x2d4e84, + 0x3854c6, + 0x26a705, + 0x21f8c5, + 0x27f189, + 0x282a89, + 0x2641c4, + 0x264205, + 0x245845, + 0x2467c6, + 0x330e08, + 0x2c8e86, + 0x20cecb, + 0x3bc9ca, + 0x2c5b05, + 0x28f0c6, + 0x23eb85, + 0x24a285, + 0x292647, + 0x204088, + 0x292484, + 0x37fb46, + 0x292a06, + 0x212f47, + 0x31f1c4, + 0x27d886, + 0x3c2245, + 0x3c2249, + 0x2d2244, + 0x36cac9, + 0x27ad46, + 0x2cac48, + 0x245845, + 0x392d05, + 0x3d9e06, + 0x37ec09, + 0x219e49, + 0x278986, + 0x2eac08, + 0x2a12c8, + 0x23eb44, + 0x2be9c4, + 0x2be9c8, + 0x3b2b88, + 0x356689, + 0x29ee06, + 0x2a6dc6, + 0x33384d, + 0x3ae006, + 0x3218c9, + 0x268945, + 0x214e06, + 0x33aec8, + 0x32f985, + 0x21f744, + 0x26a705, + 0x2825c8, + 0x2a1e09, + 0x277544, + 0x2c0b86, + 0x30cb4a, + 0x30b048, + 0x2bd9c9, + 0x26ad4a, + 0x390186, + 0x2a0d08, + 0x2ccb85, + 0x2f0988, + 0x2fcac5, + 0x21d949, + 0x336449, + 0x20c642, + 0x2c5345, + 0x272346, + 0x27ac87, + 0x213505, + 0x3469c6, + 0x316908, + 0x2b3046, + 0x2c7489, + 0x279d86, + 0x281908, + 0x278d45, + 0x38e4c6, + 0x3037c8, + 0x281788, + 0x357c08, + 0x318488, + 0x20a584, + 0x20c243, + 0x2c76c4, + 0x280d86, + 0x237644, + 0x371e07, + 0x357ec9, + 0x2d4445, + 0x21fd06, + 0x22bd46, + 0x2a9c0b, + 0x2bc046, + 0x298d46, + 0x2d3f88, + 0x264a46, + 0x215d83, + 0x208503, + 0x2c70c4, + 0x22f545, + 0x244847, + 0x2776c8, + 0x2776cf, + 0x27c34b, + 0x330c08, + 0x2c0c06, + 0x330f0e, + 0x23b443, + 0x2447c4, + 0x2bbfc5, + 0x2bc446, + 0x28ff0b, + 0x294a86, + 0x221089, + 0x263645, + 0x23da88, + 0x3d29c8, + 0x219d0c, + 0x2a6706, + 0x2d7746, + 0x2e2d45, + 0x28ad88, + 0x27b4c5, + 0x34f108, + 0x2a2e4a, + 0x2a5789, + 0x668c84, + 0x2000c2, + 0x4a201242, + 0x200382, + 0x221dc4, + 0x209e82, + 0x306c44, + 0x208482, + 0x3dc3, + 0x2003c2, + 0x2090c2, + 0x9a048, + 0x29904, + 0x214a83, + 0x232dc3, + 0x308003, + 0xccc2, + 0x49582, + 0x23c803, + 0x21a3c3, + 0x242543, + 0xc782, + 0xc2c2, + 0x1b82, + 0x202703, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21a3c3, + 0x242543, + 0x241f83, + 0x2d3684, + 0x214a83, + 0x235b44, + 0x232dc3, + 0x2e3504, + 0x308003, + 0x2137c7, + 0x23c803, + 0x203dc3, + 0x31bf88, + 0x242543, + 0x27cfcb, + 0x2fdbc3, + 0x2431c6, + 0x233442, + 0x2f850b, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x242543, + 0x21a103, + 0x208a03, + 0x2000c2, + 0x9a048, + 0x399c45, + 0x21f948, + 0x2e3648, + 0x201242, + 0x343045, + 0x3c8847, + 0x203c42, + 0x242a07, + 0x200382, + 0x2555c7, + 0x3742c9, + 0x26d188, + 0x33abc9, + 0x20b342, + 0x3c7387, + 0x22dd84, + 0x3c8907, + 0x3bc8c7, + 0x25ac42, + 0x23c803, + 0x202382, + 0x208482, + 0x2003c2, + 0x214282, + 0x200902, + 0x2090c2, + 0x2df885, + 0x210205, + 0x1242, + 0x32dc3, + 0x214a83, + 0x232dc3, + 0x29a643, + 0x308003, + 0x206c03, + 0x21a3c3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0xa983, + 0x101, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21bc83, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x214903, + 0x4d4ae8c6, + 0x239c3, + 0xd50c5, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x1b02, + 0x9a048, + 0x12a4c3, + 0x3dc3, + 0x1b4103, + 0x455c4, + 0x14226c4, + 0xed7c5, + 0x2000c2, + 0x393bc4, + 0x214a83, + 0x232dc3, + 0x308003, + 0x231a43, + 0x22d805, + 0x21bc83, + 0x21a8c3, + 0x21a3c3, + 0x24e283, + 0x242543, + 0x20e2c3, + 0x266603, + 0x207783, 0x5c2, - 0x18ce06, - 0x1ba00b, - 0x1ba306, - 0xbe384, - 0x1753c7, - 0xe3389, - 0x6dc89, - 0x1432c8, - 0x48902, - 0x191f89, - 0xbac8, - 0xe9a8a, - 0x38909, - 0x52946, - 0xce3c9, - 0xdd6c7, - 0xdde09, - 0xdef08, - 0xe0f87, - 0xe29c9, - 0xe8ec5, - 0xe9250, - 0x155886, - 0x175305, - 0x114587, - 0x3950d, - 0x3ef85, - 0xef1c6, - 0xef9c7, - 0xf61d8, - 0x11848, - 0xbe7ca, - 0xa982, - 0x507ca, - 0x6284d, - 0x2e42, - 0x13686, - 0x9d488, - 0xabe4a, - 0x45948, - 0x6d309, - 0x111788, - 0x7768e, - 0x6d548, - 0x14a647, - 0x58293044, - 0x14e70d, - 0x102f05, - 0x3148, - 0x42dc8, - 0x10c246, - 0x14302, - 0x92c04, - 0x62706, - 0x3e006, - 0x58532e4b, - 0x57c2, + 0x2aec2, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x2000c2, + 0x202703, + 0x201242, + 0x2a42, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21a3c3, + 0x242543, + 0x2090c2, + 0x9a048, + 0x308003, + 0x1b4103, + 0x9a048, + 0x1b4103, + 0x26f6c3, + 0x214a83, + 0x22fe44, + 0x232dc3, + 0x308003, + 0x206182, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x206182, + 0x2137c3, + 0x21a3c3, + 0x242543, + 0x2f7103, + 0x20e2c3, + 0x2000c2, + 0x201242, + 0x308003, + 0x21a3c3, + 0x242543, + 0x2431c5, + 0x14fc86, + 0x2d3684, + 0x233442, + 0x882, + 0x9a048, + 0x2a42, + 0x49582, + 0x2982, + 0x2000c2, + 0x139b05, + 0x1ce08, + 0x991c3, + 0x201242, + 0x3c604, + 0x51c6c486, + 0x8d04, + 0x10fe4b, + 0x34ac6, + 0xd1407, + 0x12eb09, + 0x232dc3, + 0x48248, + 0x4824b, + 0x486cb, + 0x48d4b, + 0x4908b, + 0x4934b, + 0x4978b, + 0x1d2f06, + 0x308003, + 0xf3605, + 0x68a44, + 0x210983, + 0x1182c7, + 0xe6d44, + 0x6cbc4, + 0x21a3c3, + 0x78a86, + 0x5684, + 0x1b4103, + 0x242543, + 0x2fe7c4, + 0x12bcc7, + 0x14f889, + 0x10fc08, + 0x1b44c4, + 0x1c8a44, + 0x365c6, + 0xa788, + 0x16a605, + 0x8649, + 0x2fb03, + 0x139b05, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x203dc3, + 0x242543, + 0x2fdbc3, + 0x233442, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21bac3, + 0x219a04, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x2e3504, + 0x308003, + 0x21a3c3, + 0x242543, + 0x2431c6, + 0x232dc3, + 0x308003, + 0x10e83, + 0x1b4103, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x139b05, + 0xd1407, + 0x3103, + 0x2fb03, + 0x9a048, + 0x308003, + 0x214a83, + 0x232dc3, + 0x308003, + 0x5cf43, + 0x21a3c3, + 0x242543, + 0x55214a83, + 0x232dc3, + 0x21a3c3, + 0x242543, + 0x9a048, + 0x2000c2, + 0x201242, + 0x214a83, + 0x308003, + 0x21a3c3, + 0x2003c2, + 0x242543, + 0x336987, + 0x2cd68b, + 0x20dcc3, + 0x2cfac8, + 0x32ab87, + 0x3de706, + 0x218c05, + 0x343189, + 0x242f48, + 0x3359c9, + 0x3359d0, + 0x37ab8b, + 0x2e7589, + 0x203103, + 0x2f8bc9, + 0x231506, + 0x23150c, + 0x335bc8, + 0x3db448, + 0x374789, + 0x2c368e, + 0x37408b, + 0x2ba58c, + 0x220dc3, + 0x28c68c, + 0x3d8f49, + 0x23bb47, + 0x232d0c, + 0x2b858a, + 0x24c0c4, + 0x2ee78d, + 0x28c548, + 0x3ba7cd, + 0x3a6cc6, + 0x2d368b, + 0x34fa09, + 0x3892c7, + 0x295946, + 0x267b49, + 0x33b64a, + 0x30c108, + 0x2fd7c4, + 0x2b5a07, + 0x3c51c7, + 0x204684, + 0x223804, + 0x201fc9, + 0x286ac9, + 0x3d9ac8, + 0x398bc5, + 0x20b285, + 0x2068c6, + 0x2ee649, + 0x25318d, + 0x24c488, + 0x2067c7, + 0x218c88, + 0x2355c6, + 0x239c04, + 0x284405, + 0x3cfb46, + 0x3d1e84, + 0x3d8e47, + 0x3e094a, + 0x20d384, + 0x211846, + 0x2124c9, + 0x2124cf, + 0x212a8d, + 0x213306, + 0x21ca10, + 0x21ce06, + 0x21df07, + 0x21e987, + 0x21e98f, + 0x21f1c9, + 0x225986, + 0x227207, + 0x227208, + 0x2275c9, + 0x3ba588, + 0x305c87, + 0x20ed43, + 0x3d87c6, + 0x29d1c8, + 0x2c394a, + 0x215849, + 0x243083, + 0x342f46, + 0x37f98a, + 0x2f9f87, + 0x23b98a, + 0x31458e, + 0x21f306, + 0x338547, + 0x238886, + 0x2435c6, + 0x3d300b, + 0x39964a, + 0x2cdccd, + 0x2d2107, + 0x266688, + 0x266689, + 0x26668f, + 0x3070cc, + 0x34b789, + 0x27e48e, + 0x2138ca, + 0x216406, + 0x2f4806, + 0x3adc8c, + 0x31fdcc, + 0x320308, + 0x35a487, + 0x235185, + 0x3c8ac4, + 0x28918e, + 0x3a6744, + 0x201247, + 0x39dcca, + 0x3ab1d4, + 0x3d548f, + 0x21eb48, + 0x3d8688, + 0x378c8d, + 0x378c8e, + 0x22cd09, + 0x22e548, + 0x22e54f, + 0x232a0c, + 0x232a0f, + 0x233bc7, + 0x23714a, + 0x3087cb, + 0x239808, + 0x23b107, + 0x25c7cd, + 0x3620c6, + 0x2ee946, + 0x23d449, + 0x22ba08, + 0x2433c8, + 0x2433ce, + 0x2b7687, + 0x3043c5, + 0x245385, + 0x202404, + 0x3de9c6, + 0x3d99c8, + 0x296d83, + 0x2e710e, + 0x25cb88, + 0x2aae8b, + 0x26f887, + 0x228c05, + 0x273506, + 0x2b2b07, + 0x31b348, + 0x36a409, + 0x3cd545, + 0x285c48, + 0x2209c6, + 0x3a618a, + 0x289089, + 0x232dc9, + 0x232dcb, + 0x25d908, + 0x204549, + 0x398c86, + 0x3c5a8a, + 0x2bfe4a, + 0x23734c, + 0x3488c7, + 0x26cf8a, + 0x3b1fcb, + 0x3b1fd9, + 0x324208, + 0x243245, + 0x25c986, + 0x2a0049, + 0x39f606, + 0x219aca, + 0x26e286, + 0x2196c4, + 0x2d604d, + 0x3458c7, + 0x2196c9, + 0x247105, + 0x247ac8, + 0x248009, + 0x24b904, + 0x24bfc7, + 0x24bfc8, + 0x24cc87, + 0x265c08, + 0x250dc7, + 0x2d8b85, + 0x257e8c, + 0x258349, + 0x33144a, + 0x3a8e89, + 0x2f8cc9, + 0x388e0c, + 0x25b4cb, + 0x25c008, + 0x25d0c8, + 0x260cc4, + 0x283b88, + 0x284d09, + 0x2b8647, + 0x212706, + 0x2a43c7, + 0x29fd49, + 0x24768b, + 0x36aa87, + 0x2947c7, + 0x3d0147, + 0x3ba744, + 0x3ba745, + 0x2e3205, + 0x358b4b, + 0x33d684, + 0x323a88, + 0x30060a, + 0x220a87, + 0x3caac7, + 0x28f6d2, + 0x291646, + 0x22f7c6, + 0x28870e, + 0x29ab46, + 0x299288, + 0x29a60f, + 0x3bab88, + 0x28a808, + 0x2dd1ca, + 0x2dd1d1, + 0x2a98ce, + 0x25514a, + 0x25514c, + 0x22e747, + 0x22e750, + 0x3c7108, + 0x2a9ac5, + 0x2b2e0a, + 0x3d1ecc, + 0x29c88d, + 0x3c7c86, + 0x3c7c87, + 0x3c7c8c, + 0x3d2b8c, + 0x21bc8c, + 0x3bd6cb, + 0x38b644, + 0x226204, + 0x2b6f89, + 0x34b147, + 0x37d009, + 0x2bfc89, + 0x2b8247, + 0x2b8406, + 0x2b8409, + 0x2b8803, + 0x2b314a, + 0x2961c7, + 0x3c8e0b, + 0x2cdb4a, + 0x22de04, + 0x32f4c6, + 0x280e09, + 0x35c004, + 0x2df48a, + 0x2e0685, + 0x2c7945, + 0x2c794d, + 0x2c7c8e, + 0x2c7805, + 0x335046, + 0x242dc7, + 0x22b78a, + 0x3a6a46, + 0x37bc84, + 0x3cdb87, + 0x2fab0b, + 0x265907, + 0x262944, + 0x3a39c6, + 0x3a39cd, + 0x2e568c, + 0x21a286, + 0x24c68a, + 0x34ca86, + 0x21e648, + 0x30c487, + 0x2d3b8a, + 0x23c486, + 0x27d903, + 0x2f3886, + 0x29d048, + 0x245aca, + 0x2dcc07, + 0x2dcc08, + 0x249ac4, + 0x28fc47, + 0x2f4348, + 0x291848, + 0x2bbdc8, + 0x2ffc0a, + 0x2ec0c5, + 0x2c1ac7, + 0x254f93, + 0x26b2c6, + 0x24aec8, + 0x221589, + 0x2428c8, + 0x33c58b, + 0x385308, + 0x2c02c4, + 0x21a706, + 0x320c06, + 0x3186c9, + 0x2d39c7, + 0x257f88, + 0x2a51c6, + 0x200bc4, + 0x208405, + 0x3a3188, + 0x344e4a, + 0x2d5cc8, + 0x2dad46, + 0x2a0f0a, + 0x269f88, + 0x2de248, + 0x2df708, + 0x2dff46, + 0x2e1e86, + 0x3a4d0c, + 0x2e2410, + 0x2cc145, + 0x2230c8, + 0x2230d0, + 0x3ba990, + 0x33584e, + 0x3a498e, + 0x3a4994, + 0x3a804f, + 0x3a8406, + 0x3dbe51, + 0x345213, + 0x345688, + 0x2035c5, + 0x2d0008, + 0x3a05c5, + 0x33f34c, + 0x229f09, + 0x3a6589, + 0x356947, + 0x26c649, + 0x39f1c7, + 0x334686, + 0x284207, + 0x204c05, + 0x20a9c3, + 0x210e83, + 0x213404, + 0x36adcd, + 0x3c304f, + 0x200c05, + 0x33f246, + 0x20cb87, + 0x399a87, + 0x208886, + 0x20888b, + 0x2aa785, + 0x259fc6, + 0x30be47, + 0x251ac9, + 0x229b46, + 0x3860c5, + 0x3c910b, + 0x3d6e86, + 0x21d685, + 0x241588, + 0x290b08, + 0x299b8c, + 0x299b90, + 0x2ac2c9, + 0x2c15c7, + 0x2b918b, + 0x2c8206, + 0x305b4a, + 0x36ff8b, + 0x31b58a, + 0x398806, + 0x2f6fc5, + 0x32aa86, + 0x279f48, + 0x356a0a, + 0x37891c, + 0x2fdc8c, + 0x2fdf88, + 0x2431c5, + 0x382747, + 0x24a006, + 0x24aac5, + 0x2177c6, + 0x208a48, + 0x2c6747, + 0x2c3588, + 0x26b38a, + 0x3b954c, + 0x297009, + 0x3b97c7, + 0x285244, + 0x245446, + 0x28a38a, + 0x2bfd85, + 0x22348c, + 0x223b48, + 0x26a208, + 0x2aebcc, + 0x38878c, + 0x22d949, + 0x22db87, + 0x25494c, + 0x3082c4, + 0x3713ca, + 0x30de8c, + 0x24fdcb, + 0x25044b, + 0x252b06, + 0x256447, + 0x22e987, + 0x22e98f, + 0x30f351, + 0x2e8d92, + 0x258c0d, + 0x258c0e, + 0x258f4e, + 0x3a8208, + 0x3a8212, + 0x25be08, + 0x221bc7, + 0x24ec0a, + 0x2ac988, + 0x29ab05, + 0x2bb28a, + 0x21d187, + 0x2ef184, + 0x210883, + 0x236085, + 0x2dd447, + 0x30d3c7, + 0x29ca8e, + 0x352e8d, + 0x354009, + 0x302905, + 0x361043, + 0x34a886, + 0x25a5c5, + 0x2ab0c8, + 0x224249, + 0x25c9c5, + 0x25c9cf, + 0x2e0b07, + 0x218a85, + 0x27024a, + 0x3d0b06, + 0x312b09, + 0x381b4c, + 0x3ce889, + 0x2062c6, + 0x30040c, + 0x32dd86, + 0x30cfc8, + 0x3b1ec6, + 0x365486, + 0x2bc1c4, + 0x31d203, + 0x21124a, + 0x227e11, + 0x34b94a, + 0x23ea05, + 0x25b907, + 0x2559c7, + 0x2e6f04, + 0x2f444b, + 0x33aa48, + 0x2c55c6, + 0x361785, + 0x261f44, + 0x3828c9, + 0x2008c4, + 0x20e087, + 0x37a385, + 0x37a387, + 0x288945, + 0x3801c3, + 0x221a88, + 0x2d020a, + 0x23db43, + 0x399c8a, + 0x2a74c6, + 0x25c74f, + 0x2b7609, + 0x2e7090, + 0x305748, + 0x2db3c9, + 0x29df47, + 0x3a394f, + 0x3905c4, + 0x2e3584, + 0x203946, + 0x2344c6, + 0x2ef40a, + 0x254686, + 0x2b5e07, + 0x315048, + 0x315247, + 0x3166c7, + 0x31784a, + 0x316fcb, + 0x33bf85, + 0x2e89c8, + 0x201343, + 0x3bb3cc, + 0x3965cf, + 0x234f8d, + 0x258787, + 0x354149, + 0x357087, + 0x2401c8, + 0x3ab3cc, + 0x2c01c8, + 0x23e708, + 0x32c9ce, + 0x341b94, + 0x3420a4, + 0x36080a, + 0x37b90b, + 0x39f284, + 0x39f289, + 0x331e88, + 0x245d85, + 0x29688a, + 0x291087, + 0x2135c4, + 0x202703, + 0x214a83, + 0x235b44, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21bc83, + 0x23c803, + 0x2e2406, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x2141c3, + 0x2000c2, + 0x202703, + 0x201242, + 0x214a83, + 0x235b44, + 0x232dc3, + 0x308003, + 0x21bc83, + 0x2e2406, + 0x21a3c3, + 0x242543, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x228503, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x2000c2, + 0x27ee03, + 0x201242, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x2086c2, + 0x215702, + 0x201242, + 0x214a83, + 0x208c02, + 0x2005c2, + 0x221dc4, + 0x306c44, + 0x223f82, + 0x219a04, + 0x2003c2, + 0x242543, + 0x2141c3, + 0x252b06, + 0x20c782, + 0x201b82, + 0x2221c2, + 0x57a07403, + 0x57e2e743, + 0x56246, + 0x56246, + 0x2d3684, + 0x203dc3, + 0x160d, + 0x1d984a, + 0x16300c, + 0x1d76cc, + 0xd4ecd, + 0x139b05, + 0x86209, + 0x8d2cc, + 0x29907, + 0xdb86, + 0x13dc8, + 0x1bf87, + 0x201c8, + 0x1ac0ca, + 0x10d707, + 0x58a8d505, + 0xe4f09, + 0x58c3480b, + 0x125c08, + 0x1558b, + 0x12c5c8, + 0x1c48c9, + 0x4060a, + 0x1b1b8e, + 0x1d158d, + 0x2cd0d, + 0x14426cb, + 0xe554a, + 0x8d04, + 0x5a106, + 0x19b808, + 0x79108, + 0x25687, + 0x1d35c5, + 0xc607, + 0x33249, + 0x15c087, + 0x106c8, + 0x26a89, + 0x4ce04, + 0x4e945, + 0x98e8e, + 0x12c207, + 0x59225a86, + 0x78d8d, + 0xd1288, + 0x59694f86, + 0x5a094f88, + 0x56f88, + 0x136b90, + 0x53f8c, + 0x61b47, + 0x62347, + 0x6a947, + 0x72047, + 0x6882, + 0x120687, + 0x19980c, + 0x13c945, + 0x107c07, + 0xac186, + 0xacdc9, + 0xaff88, + 0x6502, + 0x5c2, + 0x18d986, + 0x1b9ecb, + 0x1ba1c6, + 0x174d04, + 0x978c7, + 0x41a89, + 0xf0c09, + 0x1b1148, + 0x49582, + 0x193a49, + 0xd788, + 0xef24a, + 0x15adc9, + 0x1b4186, + 0xd8949, + 0xe54c7, + 0xe5c09, + 0xe7ac8, + 0xea3c7, + 0xec049, + 0xf0005, + 0xf1210, + 0x1b6786, + 0x97805, + 0x91487, + 0xec74d, + 0x41485, + 0xf8ac6, + 0xf92c7, + 0xfe7d8, + 0xd1608, + 0x13db8a, + 0xca42, + 0x5020a, + 0x60e4d, + 0x45c2, + 0xce946, + 0x11ec6, + 0xa1788, + 0xafd0a, + 0x472c8, + 0x6de89, + 0x115488, + 0x6eace, + 0x6e0c8, + 0x14a887, + 0x5a694ec4, + 0xae8cd, + 0x10a085, + 0x69148, + 0x34088, + 0x111b86, + 0xc2c2, + 0xc53c4, + 0xe2c06, + 0x365c6, + 0x5a8ef74b, + 0x1442, 0x401, 0x81, - 0x5a947, - 0x8d9c3, - 0x576f67c4, - 0x57a973c3, + 0xb8f08, + 0x5bc87, + 0x150503, + 0x59a37f04, + 0x59e9b383, 0xc1, - 0x1a286, + 0xf586, 0xc1, 0x201, - 0x1a286, - 0x8d9c3, - 0x422c3, - 0x46e44, - 0x14947, - 0x5b07, - 0x153e145, - 0x4cec4, - 0x61107, - 0xc302, - 0x249f84, - 0x22c0c3, - 0x24b304, - 0x224e44, - 0x20a803, - 0x2244c5, - 0x216e03, - 0x236bc3, - 0x204185, - 0x205b03, - 0xdd43, - 0x5962c0c3, - 0x232c43, - 0x4b304, - 0x20c3, - 0x228b03, + 0xf586, + 0x150503, + 0x66603, + 0x647c4, + 0x1e7c7, + 0x7787, + 0x15c27c5, + 0x4e684, + 0x13d707, + 0x1242, + 0x24c0c4, + 0x214a83, + 0x24d9c4, + 0x221dc4, + 0x21a3c3, + 0x221445, + 0x214903, + 0x22b983, + 0x208805, + 0x207783, + 0x1243, + 0x5ba14a83, + 0x232dc3, + 0x4d9c4, + 0x7083, + 0x308003, 0x200181, - 0xe403, - 0x211543, - 0x303f84, - 0x217b84, - 0x20a803, - 0x4bbc3, - 0x216603, - 0x20c603, - 0x9fe08, + 0x1a8c3, + 0x23c803, + 0x306c44, + 0x219a04, + 0x21a3c3, + 0x4e283, + 0x242543, + 0x20e2c3, + 0x9a048, 0x2000c2, - 0x248343, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x212483, + 0x202703, + 0x201242, + 0x214a83, + 0x232dc3, + 0x228503, 0x2005c2, - 0x224e44, - 0x214543, - 0x211543, - 0x20a803, - 0x20ca43, - 0x216603, - 0x205b03, - 0x17c204, - 0x9fe08, - 0x103c87, - 0xc302, - 0x1a0dc5, - 0x5120f, - 0xd23c6, - 0x14470c8, - 0x11240e, - 0x5a631802, - 0x32ce48, - 0x28c4c6, - 0x24d046, - 0x30e787, - 0x5aa00c82, - 0x5afd1e88, - 0x21068a, - 0x260a48, + 0x221dc4, + 0x21bc83, + 0x23c803, + 0x21a3c3, + 0x203dc3, + 0x242543, + 0x207783, + 0x196504, + 0x9a048, + 0x106947, + 0x1242, + 0x1a3105, + 0x540cf, + 0xe0986, + 0x144ca88, + 0x1160ce, + 0x5ca345c2, + 0x297ac8, + 0x35c5c6, + 0x24e806, + 0x395e87, + 0x5ce00c82, + 0x5d2b7488, + 0x20bd4a, + 0x2615c8, 0x200ac2, - 0x3c0409, - 0x251a87, - 0x213e86, - 0x224849, - 0x2db544, - 0x3c0306, - 0x2c7144, - 0x203584, - 0x2560c9, - 0x30f546, - 0x229cc5, - 0x264f45, - 0x22cac7, - 0x2c3887, - 0x2f53c4, - 0x35c0c6, - 0x2f9145, - 0x20e805, - 0x246745, - 0x2c4f47, - 0x26fb45, - 0x247749, - 0x329945, - 0x31b604, - 0x256907, - 0x33ed4e, - 0x343689, - 0x28e2c9, - 0x33de06, - 0x23ce88, - 0x3c208b, - 0x36828c, - 0x324046, - 0x2ffe07, - 0x2b34c5, - 0x21730a, - 0x28c109, - 0x2013c9, - 0x3d9f06, - 0x305d45, - 0x242885, - 0x355449, - 0x2468cb, - 0x2772c6, - 0x354546, - 0x204b44, - 0x239b06, - 0x2fbbc8, - 0x3bc0c6, - 0x2eb006, - 0x3cf9c8, - 0x3d6e47, - 0x3d9cc9, - 0x3de005, - 0x9fe08, - 0x3cc184, - 0x312f84, - 0x208345, - 0x346b09, - 0x222c07, - 0x222c0b, - 0x225a4a, - 0x2290c5, - 0x5b20b382, - 0x20ebc7, - 0x5b6293c8, - 0x328887, - 0x2dd185, - 0x347e8a, - 0xc302, - 0x2795cb, - 0x27deca, - 0x247bc6, - 0x2081c3, - 0x291f0d, - 0x3c084c, - 0x3c1acd, - 0x2304c5, - 0x27cb85, - 0x3748c7, - 0x207909, - 0x210586, - 0x252e05, - 0x2ec888, - 0x239a03, - 0x2e2ec8, - 0x239a08, - 0x2c8907, - 0x369588, - 0x3afa49, - 0x2fb787, - 0x20f1c7, - 0x33dfc8, - 0x29b484, - 0x29b487, - 0x314748, - 0x360586, - 0x3c3e4f, - 0x22a5c7, - 0x35bbc6, - 0x388005, - 0x2253c3, - 0x243c47, - 0x3874c3, - 0x24a686, - 0x24cdc6, - 0x24db06, - 0x294d45, - 0x264203, - 0x391c08, - 0x38a8c9, - 0x39a24b, - 0x24dc88, - 0x24ec05, - 0x24fe45, - 0x5bab12c2, - 0x285709, - 0x224ec7, - 0x258bc5, - 0x255fc7, - 0x257a86, - 0x3804c5, - 0x258f8b, - 0x25ad04, - 0x260605, - 0x260747, - 0x276c46, - 0x277085, - 0x2851c7, - 0x285cc7, - 0x2d0d84, - 0x28b30a, - 0x28cd48, - 0x3c2349, - 0x394785, - 0x32f406, - 0x2fbd8a, - 0x264e46, - 0x231047, - 0x26c88d, - 0x2a65c9, - 0x390885, - 0x36ac47, - 0x252788, - 0x2f7288, - 0x3a8d07, - 0x3affc6, - 0x2230c7, - 0x24b503, - 0x30f4c4, - 0x37dc05, - 0x3a5447, - 0x3ab0c9, - 0x26b7c8, - 0x230f45, - 0x2530c4, - 0x24de45, - 0x25ca8d, + 0x3c8c49, + 0x33bfc7, + 0x212686, + 0x2217c9, + 0x2c1c04, + 0x3c8b46, + 0x2cc7c4, + 0x20e904, + 0x257889, + 0x30dbc6, + 0x265445, + 0x266245, + 0x22d547, + 0x2dbd87, + 0x34c8c4, + 0x31e606, + 0x2ff485, + 0x210845, + 0x23eac5, + 0x3bd9c7, + 0x26f6c5, + 0x248489, + 0x343fc5, + 0x31b484, + 0x3a6987, + 0x36344e, + 0x2031c9, + 0x2885c9, + 0x348706, + 0x23f9c8, + 0x36f2cb, + 0x2a5a0c, + 0x322686, + 0x2ba447, + 0x2eee85, + 0x3270ca, + 0x3d9bc9, + 0x345c89, + 0x295146, + 0x30bc05, + 0x245705, + 0x36a209, + 0x23ec4b, + 0x2c2246, + 0x352686, + 0x2067c4, + 0x2ecd46, + 0x304448, + 0x3c1e46, + 0x2e3e06, + 0x3dd908, + 0x2019c7, + 0x201d49, + 0x205a85, + 0x9a048, + 0x3cd4c4, + 0x316c44, + 0x20b105, + 0x3403c9, + 0x220747, + 0x22074b, + 0x22284a, + 0x228585, + 0x5d60c282, + 0x2cda07, + 0x5da29cc8, + 0x295387, + 0x301345, + 0x348aca, + 0x1242, + 0x27c58b, + 0x27d98a, + 0x248906, + 0x20a803, + 0x206c8d, + 0x3c4c4c, + 0x3c534d, + 0x230585, + 0x27bbc5, + 0x296dc7, + 0x3d1149, + 0x20bc46, + 0x254505, + 0x37b708, + 0x2ce983, + 0x2e3948, + 0x2ecc48, + 0x383fc7, + 0x3b8a88, + 0x3c0809, + 0x2fd2c7, + 0x2cd207, + 0x3de588, + 0x23ae04, + 0x23ae07, + 0x3a6bc8, + 0x360f06, + 0x3c0ecf, + 0x22a907, + 0x31e106, + 0x22dcc5, + 0x222343, + 0x246287, + 0x387fc3, + 0x24d046, + 0x24e586, + 0x24f0c6, + 0x293d45, + 0x265c03, + 0x3936c8, + 0x38a109, + 0x39bf8b, + 0x24f248, + 0x250a85, + 0x252305, + 0x5de2dec2, + 0x2842c9, + 0x221e47, + 0x25a045, + 0x257787, + 0x258ac6, + 0x381745, + 0x25a40b, + 0x25c004, + 0x261185, + 0x2612c7, + 0x276806, + 0x276c45, + 0x283d87, + 0x2847c7, + 0x2a7484, + 0x28d0ca, + 0x28dbc8, + 0x2ccc09, + 0x23f285, + 0x205886, + 0x30460a, + 0x266146, + 0x2ed087, + 0x26d30d, + 0x2aa2c9, + 0x391c45, + 0x363847, + 0x289708, + 0x303588, + 0x3286c7, + 0x384d06, + 0x21abc7, + 0x24dbc3, + 0x30db44, + 0x37d485, + 0x3a7747, + 0x3b0d49, + 0x229588, + 0x2ecf85, + 0x2425c4, + 0x247ec5, + 0x24f40d, 0x200cc2, - 0x2b6606, - 0x2d7a86, - 0x301bca, - 0x3915c6, - 0x398245, - 0x2c7605, - 0x2c7607, - 0x3a340c, - 0x27420a, - 0x290206, - 0x21fb05, - 0x239946, - 0x290387, - 0x292d06, - 0x294c4c, - 0x224989, - 0x5be1a707, - 0x296a05, - 0x296a06, - 0x296e48, - 0x245785, - 0x2a6d05, - 0x2a7f48, - 0x2a814a, - 0x5c21efc2, - 0x5c606a02, - 0x3ac085, - 0x266803, - 0x23dc88, - 0x245f43, - 0x2a83c4, - 0x245f4b, - 0x368688, + 0x2bca46, + 0x2eaf06, + 0x308cca, + 0x39a786, + 0x3a3345, + 0x26d6c5, + 0x26d6c7, + 0x3a5fcc, + 0x256e0a, + 0x28f246, + 0x2e1d85, + 0x2ecb86, + 0x28f507, + 0x291246, + 0x293c4c, + 0x221909, + 0x5e20fa07, + 0x29a9c5, + 0x29a9c6, + 0x29ae08, + 0x2c4005, + 0x2aab45, + 0x2ab848, + 0x2aba4a, + 0x5e67b8c2, + 0x5ea09e42, + 0x355fc5, + 0x237643, + 0x326008, + 0x228703, + 0x2abcc4, + 0x312c4b, + 0x36f688, + 0x2b9648, + 0x5ef03cc9, + 0x2b1009, + 0x2b19c6, 0x2b2788, - 0x5cae7489, - 0x2ad149, - 0x2adb06, - 0x2ae7c8, - 0x2ae9c9, - 0x2af346, - 0x2af4c5, - 0x244246, - 0x2afa09, - 0x2bf9c7, - 0x3ddac6, - 0x2dd507, - 0x2e77c7, - 0x208804, - 0x5ce11b49, - 0x3b9748, - 0x3d1d88, - 0x267747, - 0x2cb246, - 0x3c6b89, - 0x24d007, - 0x3b8fca, - 0x32f548, - 0x3bd087, - 0x3c1086, - 0x27d88a, - 0x241b88, - 0x2d7505, - 0x228345, - 0x3359c7, - 0x316049, - 0x31828b, - 0x354048, - 0x3299c9, - 0x24e087, - 0x2bae4c, - 0x2bb8cc, - 0x2bbbca, - 0x2bbe4c, - 0x2c6cc8, - 0x2c6ec8, - 0x2c70c4, - 0x2c8089, - 0x2c82c9, - 0x2c850a, - 0x2c8789, - 0x2c8ac7, - 0x3b4f4c, - 0x3c62c6, - 0x26c248, - 0x264f06, - 0x38ebc6, - 0x390787, - 0x39f348, - 0x32a68b, - 0x3da007, - 0x255d89, - 0x25a709, - 0x285907, - 0x2c7384, + 0x2b2989, + 0x2b3806, + 0x2b3985, + 0x246c06, + 0x2b4749, + 0x2c8947, + 0x38e386, + 0x20af47, + 0x345fc7, + 0x207584, + 0x5f2d1909, + 0x24ad08, + 0x2b7388, + 0x2257c7, + 0x2d5946, + 0x3d0f49, + 0x24e7c7, + 0x24a58a, + 0x32ed08, + 0x3bb707, + 0x3d0606, + 0x2f0e0a, + 0x23df48, + 0x2ea985, + 0x227b85, + 0x3cbc87, + 0x3190c9, + 0x31cf0b, + 0x351f08, + 0x344049, + 0x24fb47, + 0x2c2bcc, + 0x2c3bcc, + 0x2c3eca, + 0x2c414c, + 0x2cc348, + 0x2cc548, + 0x2cc744, + 0x2ce109, + 0x2ce349, + 0x2ce58a, + 0x2ce809, + 0x2ceb87, + 0x3bec0c, + 0x3d2406, + 0x26ccc8, + 0x266206, + 0x38fe86, + 0x391b47, + 0x3a1088, + 0x3debcb, + 0x295247, + 0x257549, + 0x25ba49, + 0x2844c7, + 0x2cca04, 0x200fc7, - 0x2cfec6, - 0x20c7c6, - 0x215705, - 0x2ce588, - 0x340544, - 0x340546, - 0x2740cb, - 0x2c6909, - 0x31fc86, - 0x2eb209, - 0x208406, - 0x201f88, - 0x20e503, - 0x305ec5, - 0x21b649, - 0x21bec5, - 0x380d84, - 0x2755c6, - 0x2354c5, - 0x207f06, - 0x316887, - 0x34b4c6, - 0x22ab4b, - 0x28efc7, - 0x243946, - 0x272506, - 0x22cb86, - 0x2f5389, - 0x2b884a, - 0x2f9d45, - 0x22850d, - 0x2a8246, - 0x23aec6, - 0x2e1546, - 0x214745, - 0x2e9547, - 0x26b107, - 0x272c8e, - 0x211543, - 0x2cb209, - 0x374d89, - 0x22c807, - 0x269887, - 0x292905, - 0x36b7c5, - 0x5d34464f, - 0x2d18c7, - 0x2d1a88, - 0x2d1fc4, - 0x2d2286, - 0x5d642582, - 0x2d6d46, - 0x2d9bc6, - 0x374f4e, - 0x2e2d0a, - 0x3d2606, - 0x219b8a, - 0x3c18c9, - 0x23bd85, - 0x307b08, - 0x335886, - 0x2b1388, - 0x3dbd48, - 0x27b58b, - 0x30e885, - 0x26fbc8, - 0x3cfb0c, - 0x2dd047, - 0x24d386, - 0x3dd0c8, - 0x32a348, - 0x5da39242, - 0x208ccb, - 0x3de209, - 0x28bbc9, - 0x21b4c7, - 0x3ba588, - 0x5de07748, - 0x20df8b, - 0x343149, - 0x259e4d, - 0x31d7c8, - 0x27da88, - 0x5e201e02, - 0x3c75c4, - 0x5e62d7c2, - 0x3aba86, - 0x5ea06302, - 0x2f258a, - 0x2a6b86, - 0x26a908, - 0x3be5c8, - 0x3c0206, - 0x300306, - 0x2fc946, - 0x2a7205, - 0x237dc4, - 0x5efd3204, - 0x359686, - 0x2978c7, - 0x5f20bc07, - 0x389b0b, - 0x328a89, - 0x27cbca, - 0x220504, - 0x2c7748, - 0x3dd88d, - 0x2f3a89, - 0x2f3cc8, - 0x2f3f49, - 0x2f61c4, - 0x23d504, - 0x39ba85, - 0x275f4b, - 0x368606, - 0x3594c5, - 0x3cb449, - 0x35c188, - 0x2a4984, - 0x217489, - 0x306845, - 0x2c38c8, - 0x20f887, - 0x28e6c8, - 0x282546, - 0x3a8a07, - 0x2deac9, - 0x3ba8c9, - 0x213845, - 0x322ac5, - 0x5f61df02, - 0x31b3c4, - 0x230705, - 0x30e686, - 0x33cf45, - 0x2b7d87, - 0x2f2ec5, - 0x276c84, - 0x33dec6, - 0x252e87, - 0x251f86, - 0x3ac605, - 0x2098c8, - 0x28c6c5, - 0x20e387, - 0x21d889, - 0x2c6a4a, - 0x227cc7, - 0x227ccc, - 0x229c86, - 0x241d49, - 0x38c685, - 0x2456c8, - 0x202e43, - 0x2edb05, - 0x3a94c5, - 0x27c1c7, - 0x5fa01482, - 0x2ee787, - 0x2e8746, - 0x37fcc6, - 0x2ecbc6, - 0x32a286, - 0x239188, - 0x27abc5, - 0x35bc87, - 0x35bc8d, - 0x201783, - 0x3c6785, - 0x270487, - 0x2eeac8, - 0x270045, - 0x216348, - 0x37d686, - 0x2dc387, - 0x2c9c05, - 0x30e906, - 0x392185, - 0x21034a, - 0x303406, - 0x26ef47, - 0x2c2fc5, - 0x308407, - 0x30ed04, - 0x380d06, - 0x307a45, - 0x397c4b, - 0x2cfd49, - 0x25888a, - 0x2138c8, - 0x38d108, - 0x30bd0c, - 0x30c747, - 0x30fac8, - 0x316608, - 0x3186c5, - 0x3562ca, - 0x358249, - 0x5fe03a42, - 0x206146, - 0x25c1c4, - 0x2f0e09, - 0x25b589, - 0x2712c7, - 0x31d0c7, - 0x367309, - 0x2b8288, - 0x2b828f, - 0x223ac6, - 0x2dbe8b, - 0x259485, - 0x259487, - 0x36c889, - 0x210086, - 0x217407, - 0x2dfe05, - 0x2303c4, - 0x35b606, - 0x222dc4, - 0x2f1347, - 0x321988, - 0x60305c48, - 0x306cc5, - 0x306e07, - 0x324a09, - 0x208a84, - 0x23eb48, - 0x607c2e88, - 0x2d3384, - 0x2ebdc8, - 0x369b44, - 0x34b6c9, - 0x214685, - 0x60a19f82, - 0x223b05, - 0x2e8045, - 0x36aa88, - 0x233887, - 0x60e008c2, - 0x3d3345, - 0x2d4706, - 0x23e306, - 0x31b388, - 0x3192c8, - 0x33cf06, - 0x34aa46, - 0x303d49, - 0x37fc06, - 0x20ff4b, - 0x32a105, - 0x2a9506, - 0x2f8548, - 0x34df46, - 0x313ec6, - 0x216a4a, - 0x2d64ca, - 0x24fb45, - 0x307487, - 0x2fb286, - 0x61217042, - 0x2705c7, - 0x2ff1c5, - 0x2fbd04, - 0x2fbd05, - 0x220406, - 0x272087, - 0x21c385, - 0x25b644, - 0x2e0cc8, - 0x313f85, - 0x3c8647, - 0x3d43c5, - 0x210285, - 0x2c4e84, - 0x2e3cc9, - 0x2f8f88, - 0x238546, - 0x2e9c46, - 0x27d5c6, - 0x6170c3c8, - 0x30c5c7, - 0x30c90d, - 0x30cecc, - 0x30d4c9, - 0x30d709, - 0x61b75ac2, - 0x3d1b43, + 0x2f0806, + 0x20e486, + 0x24c845, + 0x2f7d48, + 0x26c544, + 0x26c546, + 0x256ccb, + 0x2b3449, + 0x235686, + 0x2e4009, + 0x20b1c6, + 0x345048, + 0x210543, + 0x30bd85, + 0x21a9c9, + 0x21c7c5, + 0x30e1c4, + 0x275d46, + 0x235a05, + 0x254306, + 0x319a07, + 0x247946, + 0x22c2cb, + 0x3c5987, + 0x3a28c6, + 0x2730c6, + 0x22d606, + 0x34c889, + 0x3b604a, + 0x2c58c5, + 0x3d6f8d, + 0x2abb46, + 0x23c346, + 0x2e6f86, + 0x21e5c5, + 0x2f1507, + 0x228ec7, + 0x27390e, + 0x23c803, + 0x2d5909, + 0x297289, + 0x22d287, + 0x26bbc7, + 0x2919c5, + 0x367b05, + 0x5f60210f, + 0x2db607, + 0x2db7c8, + 0x2dbb84, + 0x2dc046, + 0x5fa45402, + 0x2e01c6, + 0x2e2406, + 0x29744e, + 0x2e378a, + 0x207106, + 0x2b7c0a, + 0x3c7709, + 0x2fbe85, + 0x2ee188, + 0x3cbb46, + 0x2b7188, + 0x202ac8, + 0x277fcb, + 0x395f85, + 0x26f748, + 0x3dda4c, + 0x301207, + 0x24eb46, + 0x30c2c8, + 0x3de888, + 0x5fe30a42, + 0x21504b, + 0x205c89, + 0x28d989, + 0x21c647, + 0x3b5dc8, + 0x603d32c8, + 0x20934b, + 0x349bc9, + 0x25b18d, + 0x202908, + 0x2f1008, + 0x60604042, + 0x20d5c4, + 0x60a2aec2, + 0x3cd9c6, + 0x60e01282, + 0x2fbc8a, + 0x2a3806, + 0x34bd48, + 0x3c6908, + 0x3d9746, + 0x2ba946, + 0x3054c6, + 0x2ab045, + 0x239e44, + 0x6122ae04, + 0x359946, + 0x276247, + 0x6160d8c7, + 0x278b4b, + 0x295589, + 0x27bc0a, + 0x26d804, + 0x2f3b08, + 0x38e14d, + 0x2fc409, + 0x2fc648, + 0x2fc8c9, + 0x2fe7c4, + 0x2aae04, + 0x38d205, + 0x346f0b, + 0x36f606, + 0x359785, + 0x236209, + 0x31e6c8, + 0x22af84, + 0x327249, + 0x24a345, + 0x2dbdc8, + 0x2cd8c7, + 0x2889c8, + 0x281006, + 0x3ba447, + 0x2e6b09, + 0x3c9289, + 0x21d705, + 0x3682c5, + 0x61a1e342, + 0x31b244, + 0x21fe85, + 0x395d86, + 0x346905, + 0x244b07, + 0x359a45, + 0x276844, + 0x3487c6, + 0x254587, + 0x238f46, + 0x30a945, + 0x217108, + 0x35c7c5, + 0x21a847, + 0x2277c9, + 0x2b358a, + 0x264cc7, + 0x264ccc, + 0x265406, + 0x2423c9, + 0x31f045, + 0x369188, + 0x211ec3, + 0x398c45, + 0x3b9285, + 0x27b207, + 0x61e08dc2, + 0x2f8087, + 0x2eea86, + 0x38dc46, + 0x2f6146, + 0x3de7c6, + 0x230988, + 0x2d0145, + 0x31e1c7, + 0x31e1cd, + 0x210883, + 0x3d28c5, + 0x270007, + 0x2f83c8, + 0x26fbc5, + 0x214408, + 0x37cf06, + 0x2e50c7, + 0x2d4605, + 0x396006, + 0x393c45, + 0x20ba0a, + 0x310586, + 0x2645c7, + 0x2c9485, + 0x3a8a87, + 0x3cdb04, + 0x30e146, + 0x3cba85, + 0x39a18b, + 0x2f0689, + 0x27ef0a, + 0x21d788, + 0x314248, + 0x31968c, + 0x31adc7, + 0x330a08, + 0x335d88, + 0x3382c5, + 0x358dca, + 0x361049, + 0x62203242, + 0x2945c6, + 0x25c9c4, + 0x2fa949, + 0x35d749, + 0x2451c7, + 0x29b947, + 0x2bfb09, + 0x2ffe08, + 0x2ffe0f, + 0x21b5c6, + 0x2e4bcb, + 0x259dc5, + 0x259dc7, + 0x37bd49, + 0x20c8c6, + 0x3271c7, + 0x2e9105, + 0x230484, + 0x2f5006, + 0x220904, + 0x2f9c47, + 0x321c88, + 0x6270bb08, + 0x30c645, + 0x30c787, + 0x324389, + 0x20d184, + 0x241048, + 0x62bd0448, + 0x2e6f04, + 0x31d648, + 0x295a04, + 0x3b6349, + 0x21e505, + 0x62e33442, + 0x21b605, + 0x2dd945, + 0x289548, + 0x233a07, + 0x632008c2, + 0x22af45, + 0x2de0c6, + 0x243906, + 0x31b208, + 0x338fc8, + 0x3468c6, + 0x34afc6, + 0x306a09, + 0x38db86, + 0x20c78b, + 0x3c2705, + 0x2ac8c6, + 0x3c4a88, + 0x33f6c6, + 0x224786, + 0x216bca, + 0x2df94a, + 0x248a45, + 0x30ce07, + 0x274586, + 0x63603642, + 0x270147, + 0x33c305, + 0x304584, + 0x304585, + 0x2f3a06, + 0x272c47, + 0x203945, + 0x2dfac4, + 0x352248, + 0x224845, + 0x37ae87, + 0x3ca445, + 0x20b945, + 0x2d2904, + 0x2d2909, + 0x2ff2c8, + 0x23a5c6, + 0x35aa06, + 0x302d06, + 0x63bd5b08, + 0x311d07, + 0x31234d, + 0x312f0c, + 0x313509, + 0x313749, + 0x63f75442, + 0x3d4a03, 0x2010c3, - 0x2cff85, - 0x3a554a, - 0x33cdc6, - 0x23fd45, - 0x317944, - 0x31794b, - 0x33280c, - 0x33310c, - 0x333415, - 0x3342cd, - 0x336e4f, - 0x337212, - 0x33768f, - 0x337a52, - 0x337ed3, - 0x33838d, - 0x33894d, - 0x338cce, - 0x33924e, - 0x33994c, - 0x339d0c, - 0x33a14b, - 0x33abce, - 0x33b4d2, - 0x33cb8c, - 0x33d2d0, - 0x34fdd2, - 0x350c0c, - 0x3512cd, - 0x35160c, - 0x3536d1, + 0x2f08c5, + 0x3a784a, + 0x338e86, + 0x23cec5, + 0x31a504, + 0x31a50b, + 0x32d64c, + 0x32df0c, + 0x32e215, + 0x32f70d, + 0x33208f, + 0x332452, + 0x3328cf, + 0x332c92, + 0x333113, + 0x3335cd, + 0x333b8d, + 0x333f0e, + 0x33480e, + 0x334e0c, + 0x3351cc, + 0x33560b, + 0x33668e, + 0x336f92, + 0x338c4c, + 0x3391d0, + 0x34cfd2, + 0x34e08c, + 0x34e74d, + 0x34ea8c, + 0x351591, + 0x35280d, 0x3546cd, - 0x356f0d, - 0x35750a, - 0x35778c, - 0x358c4c, - 0x3591cc, - 0x359d4c, - 0x35d4d3, - 0x35db50, - 0x35df50, - 0x35e8cd, - 0x35eecc, - 0x35fc49, - 0x3618cd, - 0x361c13, - 0x363251, - 0x363a53, - 0x36474f, - 0x364b0c, - 0x364e0f, - 0x3651cd, - 0x3657cf, - 0x365b90, - 0x36660e, - 0x36b18e, - 0x36cad0, - 0x36da4d, - 0x36e3ce, - 0x36e74c, - 0x36fa13, - 0x37180e, - 0x371e90, - 0x372291, - 0x3726cf, - 0x372a93, - 0x37564d, - 0x37598f, - 0x375d4e, - 0x3762d0, - 0x3766c9, - 0x378490, - 0x378a8f, - 0x37910f, - 0x3794d2, - 0x379c8e, - 0x37a68d, - 0x37b00d, - 0x37b34d, - 0x37c70d, - 0x37ca4d, - 0x37cd90, - 0x37d18b, - 0x37d9cc, - 0x37dd4c, - 0x37e34c, - 0x37e64e, - 0x38c7d0, - 0x38e512, - 0x38e98b, - 0x38f4ce, - 0x38f84e, - 0x3900ce, - 0x39054b, - 0x61f909d6, - 0x3912cd, - 0x391754, - 0x39244d, - 0x393ad5, - 0x39578d, - 0x39610f, - 0x3968cf, - 0x39a50f, - 0x39a8ce, - 0x39ae4d, - 0x39ca11, - 0x39eb0c, - 0x39ee0c, - 0x39f10b, - 0x39f54c, - 0x39fbcf, - 0x39ff92, - 0x3a088d, - 0x3a198c, - 0x3a244c, - 0x3a274d, - 0x3a2a8f, - 0x3a2e4e, - 0x3a520c, - 0x3a57cd, - 0x3a5b0b, - 0x3a63cc, - 0x3a6ccd, - 0x3a700e, - 0x3a7389, - 0x3a83d3, - 0x3aa18d, - 0x3aa88d, - 0x3aae8c, - 0x3ab30e, - 0x3ac78f, - 0x3acb4c, - 0x3ace4d, - 0x3ad18f, - 0x3ad54c, - 0x3ae3cc, - 0x3ae88c, - 0x3aeb8c, - 0x3af24d, - 0x3af592, - 0x3b164c, - 0x3b194c, - 0x3b1c51, - 0x3b208f, - 0x3b244f, - 0x3b2813, - 0x3b374e, - 0x3b3acf, - 0x3b3e8c, - 0x623b41ce, - 0x3b454f, - 0x3b4916, - 0x3b5452, - 0x3b7d4c, - 0x3bb14f, - 0x3bb7cd, - 0x3c76cf, - 0x3c7a8c, - 0x3c7d8d, - 0x3c80cd, - 0x3c988e, - 0x3ca3cc, - 0x3cd64c, - 0x3cd950, - 0x3d0ed1, - 0x3d130b, - 0x3d174c, - 0x3d1a4e, - 0x3d4811, - 0x3d4c4e, - 0x3d4fcd, - 0x3d854b, - 0x3d8e4f, - 0x3d9814, - 0x220482, - 0x220482, - 0x227dc3, - 0x220482, - 0x227dc3, - 0x220482, - 0x204142, - 0x244285, - 0x3d450c, - 0x220482, - 0x220482, - 0x204142, - 0x220482, - 0x2974c5, - 0x2c6a45, - 0x220482, - 0x220482, - 0x208342, - 0x2974c5, - 0x334a89, - 0x362f4c, - 0x220482, - 0x220482, - 0x220482, - 0x220482, - 0x244285, - 0x220482, - 0x220482, - 0x220482, - 0x220482, - 0x208342, - 0x334a89, - 0x220482, - 0x220482, - 0x220482, - 0x2c6a45, - 0x220482, - 0x2c6a45, - 0x362f4c, - 0x3d450c, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x20a803, - 0x216603, - 0x62f0f647, - 0x1ce4cf, - 0x144208, - 0x6704, - 0xca43, - 0xcd248, - 0x5bc4, + 0x354cca, + 0x354f4c, + 0x35890c, + 0x35948c, + 0x359e8c, + 0x35df93, + 0x35e710, + 0x35eb10, + 0x35f10d, + 0x35f70c, + 0x360549, + 0x36224d, + 0x362593, + 0x364111, + 0x364913, + 0x36560f, + 0x3659cc, + 0x365ccf, + 0x36608d, + 0x36668f, + 0x366a50, + 0x3674ce, + 0x36b40e, + 0x36ba90, + 0x36d08d, + 0x36da0e, + 0x36dd8c, + 0x36ed53, + 0x37268e, + 0x372c10, + 0x373011, + 0x37344f, + 0x373813, + 0x374fcd, + 0x37530f, + 0x3756ce, + 0x375c50, + 0x376049, + 0x3773d0, + 0x3778cf, + 0x377f4f, + 0x378312, + 0x3792ce, + 0x37a00d, + 0x37a54d, + 0x37a88d, + 0x37bf8d, + 0x37c2cd, + 0x37c610, + 0x37ca0b, + 0x37d24c, + 0x37d5cc, + 0x37dbcc, + 0x37dece, + 0x38d350, + 0x38f7d2, + 0x38fc4b, + 0x39078e, + 0x390b0e, + 0x39138e, + 0x39190b, + 0x64391d96, + 0x39268d, + 0x393214, + 0x393f0d, + 0x3955d5, + 0x3978cd, + 0x39824f, + 0x398e0f, + 0x39c24f, + 0x39c60e, + 0x39c98d, + 0x39e251, + 0x3a084c, + 0x3a0b4c, + 0x3a0e4b, + 0x3a128c, + 0x3a1ccf, + 0x3a2092, + 0x3a2bcd, + 0x3a470c, + 0x3a500c, + 0x3a530d, + 0x3a564f, + 0x3a5a0e, + 0x3a750c, + 0x3a7acd, + 0x3a7e0b, + 0x3a8c4c, + 0x3a954d, + 0x3a988e, + 0x3a9c09, + 0x3abb53, + 0x3ac94d, + 0x3ad04d, + 0x3ad64c, + 0x3ae88e, + 0x3aef8f, + 0x3af34c, + 0x3af64d, + 0x3af98f, + 0x3afd4c, + 0x3b034c, + 0x3b080c, + 0x3b0b0c, + 0x3b35cd, + 0x3b3912, + 0x3b45cc, + 0x3b48cc, + 0x3b4bd1, + 0x3b500f, + 0x3b53cf, + 0x3b5793, + 0x3b6f8e, + 0x3b730f, + 0x3b76cc, + 0x647b7d8e, + 0x3b810f, + 0x3b84d6, + 0x3bae52, + 0x3bcccc, + 0x3bdb8f, + 0x3be20d, + 0x3c94cf, + 0x3c988c, + 0x3c9b8d, + 0x3c9ecd, + 0x3cb4ce, + 0x3cc38c, + 0x3ceecc, + 0x3cf1d0, + 0x3d3d91, + 0x3d41cb, + 0x3d460c, + 0x3d490e, + 0x3d6011, + 0x3d644e, + 0x3d67cd, + 0x3dbc0b, + 0x3dc88f, + 0x3dd454, + 0x23c782, + 0x23c782, + 0x23e083, + 0x23c782, + 0x23e083, + 0x23c782, + 0x203802, + 0x246c45, + 0x3d5d0c, + 0x23c782, + 0x23c782, + 0x203802, + 0x23c782, + 0x29b485, + 0x2b3585, + 0x23c782, + 0x23c782, + 0x201542, + 0x29b485, + 0x32fec9, + 0x363e0c, + 0x23c782, + 0x23c782, + 0x23c782, + 0x23c782, + 0x246c45, + 0x23c782, + 0x23c782, + 0x23c782, + 0x23c782, + 0x201542, + 0x32fec9, + 0x23c782, + 0x23c782, + 0x23c782, + 0x2b3585, + 0x23c782, + 0x2b3585, + 0x363e0c, + 0x3d5d0c, + 0x202703, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21a3c3, + 0x242543, + 0x1d904f, + 0x145988, + 0x1a704, + 0x3dc3, + 0x86808, + 0x1cc203, 0x2000c2, - 0x6360c302, - 0x23e483, - 0x259844, - 0x2020c3, - 0x2d3b84, - 0x22f446, - 0x20b8c3, - 0x30b0c4, - 0x398685, - 0x211543, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x21de8a, - 0x253c46, - 0x38fbcc, - 0x9fe08, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x238cc3, - 0x2d9bc6, - 0x20a803, - 0x216603, - 0x216103, - 0x2f783, - 0xa9148, - 0x641c6005, - 0x453c7, - 0x12eb85, - 0x9349, - 0xc6c2, - 0x1b5fca, - 0x64f9e785, - 0x12eb85, - 0x6bb47, - 0x6d448, - 0x680e, - 0x894d2, - 0x173e0b, - 0x10f186, - 0x6528b745, - 0x6568b74c, - 0x8ec47, - 0x176c87, - 0x12650a, - 0x3a210, - 0xe7945, - 0x10a7cb, - 0x18a0c8, - 0x67607, - 0x11404b, - 0x330c9, - 0x44447, - 0x16c307, - 0x77507, - 0x346c6, - 0xe688, - 0x65c39346, - 0x45887, - 0x147786, - 0x189d4d, - 0xc78d0, - 0x66009802, - 0x114c8, - 0x67fd0, - 0x181a8c, - 0x6678b84d, - 0x59648, - 0x59acb, - 0x68e47, - 0x6e149, - 0x54c46, - 0x97048, - 0x33c2, - 0x198c0a, - 0x1cb807, - 0x35147, - 0xaa289, - 0xac0c8, - 0x20005, - 0x18ce06, - 0x1ba306, - 0x100d4e, - 0x240ce, - 0x14f5cf, - 0xe3389, - 0x6dc89, - 0x19878b, - 0xa318f, - 0x15090c, - 0xc010b, - 0xd8fc8, - 0x116e87, - 0x15f548, - 0x18e14b, - 0x194fcc, - 0x19bd8c, - 0x19f8cc, - 0xb08cd, - 0x1432c8, - 0xf10c2, - 0x191f89, - 0x45c88, - 0x19e10b, - 0xcb446, - 0xd408b, - 0x13b00b, - 0xdf54a, - 0xe1145, - 0xe9250, - 0xeba46, - 0x52286, - 0x175305, - 0x114587, - 0xd6fc8, - 0xef9c7, - 0xefc87, - 0x184907, - 0xc10c6, - 0x1ab8ca, - 0x9fc8a, - 0x13686, - 0xad44d, - 0x45948, - 0x111788, - 0x112009, - 0xb9545, - 0x1a214c, - 0xb0acb, - 0x1cab84, - 0x10c009, - 0x10c246, - 0x4a506, - 0x1bff46, - 0x5402, - 0x3e006, - 0xbe70b, - 0x118547, - 0x57c2, - 0xccc85, - 0x63444, + 0x65601242, + 0x240983, + 0x224c84, + 0x207083, + 0x384584, + 0x22f7c6, + 0x310c83, + 0x310c44, + 0x2f0b05, + 0x23c803, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x21e2ca, + 0x252b06, + 0x390e8c, + 0x9a048, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x2137c3, + 0x2e2406, + 0x21a3c3, + 0x242543, + 0x2141c3, + 0x2fb03, + 0xac508, + 0x661d2145, + 0x47d47, + 0x139b05, + 0x156c9, + 0x1742, + 0x13a14a, + 0x66fa0505, + 0x139b05, + 0x29907, + 0x6dfc8, + 0x9c4e, + 0x8b392, + 0x9630b, + 0x10d806, + 0x6728d505, + 0x6768d50c, + 0x13d547, + 0x17e707, + 0x12364a, + 0x3be50, + 0x146145, + 0x10fe4b, + 0x79108, + 0x25687, + 0x2490b, + 0x33249, + 0x46e07, + 0x15c087, + 0xc2487, + 0x34a06, + 0x106c8, + 0x67c28886, + 0x47207, + 0x18ec46, + 0x78d8d, + 0xf3c90, + 0x680aac82, + 0xd1288, + 0x40350, + 0x17f5cc, + 0x687825cd, + 0x5a988, + 0x5ae0b, + 0x6b187, + 0x70749, + 0x56306, + 0x9b008, + 0x3ee42, + 0x9218a, + 0x157647, + 0x107c07, + 0xacdc9, + 0xaff88, + 0xf3605, + 0x18d986, + 0x1ba1c6, + 0xfd84e, + 0xaf88e, + 0x3874f, + 0x41a89, + 0xf0c09, + 0x91d0b, + 0xb3b4f, + 0xbd08c, + 0xca18b, + 0x131388, + 0x171887, + 0x197088, + 0xb580b, + 0xb5bcc, + 0xb5fcc, + 0xb63cc, + 0xb66cd, + 0x1b1148, + 0x52e82, + 0x193a49, + 0x112988, + 0x19fe8b, + 0xd5b46, + 0xdda8b, + 0x136acb, + 0xe884a, + 0xea585, + 0xf1210, + 0xf5c86, + 0x184806, + 0x97805, + 0x91487, + 0xe0448, + 0xf92c7, + 0xf9587, + 0x12c807, + 0xc7346, + 0x1cd80a, + 0x99eca, + 0x11ec6, + 0xb130d, + 0x472c8, + 0x115488, + 0x115cc9, + 0xc0545, + 0x1aec8c, + 0xb68cb, + 0x86fc9, + 0x1ccb44, + 0x111949, + 0x111b86, + 0x4cec6, + 0x3c686, + 0x1b82, + 0x365c6, + 0x13dacb, + 0x129187, + 0x11ac47, + 0x1442, + 0xd7445, + 0x27e04, 0x101, - 0x50343, - 0x65a669c6, - 0x973c3, + 0x4fd83, + 0x67a37806, + 0x9b383, 0x382, - 0x2b704, + 0x26bc4, 0xac2, - 0x42244, + 0xd3684, 0x882, - 0x4c82, - 0x19c2, - 0x27682, - 0x4042, - 0x8b742, + 0x31c2, + 0x16c2, + 0x20f82, + 0x86c2, + 0x8d502, 0xd42, - 0x8cac2, - 0x36182, - 0x59dc2, - 0x81c2, - 0x4cfc2, - 0x32c43, + 0x167c2, + 0x373c2, + 0x5582, + 0x2a42, + 0x4e782, + 0x32dc3, 0x942, - 0x1bc2, - 0xc202, - 0x3d42, + 0x3c42, + 0xdec2, + 0x5dc2, 0x642, - 0x30ac2, - 0x4742, - 0x1cc2, + 0x315c2, + 0x6502, + 0x5bc2, 0xf42, 0x5c2, - 0x14543, - 0x1742, - 0x2cc2, - 0x48902, - 0x4e082, - 0x3102, - 0x5f82, - 0x17002, - 0x1fc02, - 0x6a42, - 0x140d82, - 0x6bf42, - 0x9082, - 0xa803, + 0x1bc83, + 0x4582, + 0x7882, + 0x49582, + 0x1e42, + 0x2042, + 0x8282, + 0x23502, + 0x17c2, + 0x9e82, + 0x3f82, + 0x6c9c2, + 0x15402, + 0x1a3c3, 0x602, - 0x39242, - 0x2f42, - 0x23242, - 0x137c5, - 0x8242, - 0x20082, - 0x3b1c3, + 0x30a42, + 0x2902, + 0x1ad42, + 0x1d685, + 0xa882, + 0x14b42, + 0x3d383, 0x682, - 0xa982, - 0x2e42, - 0x1702, - 0x1782, + 0xca42, + 0x45c2, + 0x7842, + 0x2f82, 0x8c2, - 0x14302, - 0x5402, - 0x7d45, - 0x66a04142, - 0x66f6d603, - 0x13583, - 0x67204142, - 0x13583, - 0x819c7, - 0x209e83, + 0xc2c2, + 0x1b82, + 0x1805, + 0x68a03802, + 0x68edf283, + 0xf283, + 0x69203802, + 0xf283, + 0x74c47, + 0x201503, 0x2000c2, - 0x22c0c3, - 0x232c43, - 0x212483, + 0x214a83, + 0x232dc3, + 0x228503, 0x2005c3, - 0x238cc3, - 0x20a803, - 0x20ca43, - 0x216603, - 0x297403, - 0xfba85, - 0x8303, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x212483, - 0x211543, - 0x20a803, - 0x20ca43, - 0x6d9c3, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, + 0x2137c3, + 0x21a3c3, + 0x203dc3, + 0x242543, + 0x29b3c3, + 0xc0584, + 0x19405, + 0x104305, + 0x3a83, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x228503, + 0x23c803, + 0x21a3c3, + 0x203dc3, + 0x1b4103, + 0x242543, + 0x214a83, + 0x232dc3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, 0x200181, - 0x211543, - 0x20a803, - 0x24bbc3, - 0x216603, - 0xbef44, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x20d083, - 0x212483, - 0x35c6c3, - 0x2042c3, - 0x2a6b43, - 0x20edc3, - 0x228b03, - 0x224e44, - 0x20a803, - 0x216603, - 0x205b03, - 0x345344, - 0x25cc83, - 0x25843, - 0x2287c3, - 0x32b808, - 0x27d8c4, + 0x23c803, + 0x21a3c3, + 0x24e283, + 0x242543, + 0x69944, + 0x202703, + 0x214a83, + 0x232dc3, + 0x218bc3, + 0x228503, + 0x2c26c3, + 0x208943, + 0x2a37c3, + 0x216243, + 0x308003, + 0x221dc4, + 0x21a3c3, + 0x242543, + 0x207783, + 0x204244, + 0x24f603, + 0x20dc3, + 0x29cfc3, + 0x328fc8, + 0x2f0e44, 0x20020a, - 0x31fa06, - 0x124804, - 0x38ad87, - 0x22090a, - 0x223989, - 0x3b2c87, - 0x3b588a, - 0x248343, - 0x3ac10b, - 0x3c28c9, - 0x2d3185, - 0x3ae6c7, - 0xc302, - 0x22c0c3, - 0x3c3187, - 0x26a3c5, - 0x2c7249, - 0x232c43, - 0x2bd546, - 0x2c5d83, - 0xcfe03, - 0x115f06, - 0x13f146, - 0xb847, - 0x21e686, - 0x2276c5, - 0x3de0c7, - 0x312847, - 0x69e28b03, - 0x350e47, - 0x3c0043, - 0x20a405, - 0x224e44, - 0x26f848, - 0x37a38c, - 0x2b2045, - 0x2a6746, - 0x3c3047, - 0x3a9ac7, - 0x243a87, - 0x24fc48, - 0x314f4f, - 0x223bc5, - 0x23e587, - 0x205147, - 0x2a850a, - 0x2ec6c9, - 0x31e445, - 0x320fca, - 0xbc7c6, - 0xb9a07, - 0x2c5e05, - 0x2ed104, - 0x3c0146, - 0xdd246, - 0x381d07, - 0x2f0fc7, - 0x369748, - 0x2188c5, - 0x26a2c6, - 0x25788, - 0x2eaf85, - 0xeb146, - 0x2311c5, - 0x28b084, - 0x306907, - 0x238fca, - 0x336408, - 0x36a346, - 0x38cc3, - 0x2e2a45, - 0x322406, - 0x3b5186, - 0x375206, - 0x211543, - 0x3a0b07, - 0x2050c5, - 0x20a803, - 0x2df80d, - 0x20ca43, - 0x369848, - 0x20fcc4, - 0x276f45, - 0x2a8406, - 0x394306, - 0x2a9407, - 0x259d07, - 0x28aa85, - 0x216603, - 0x31a207, - 0x316f89, - 0x26e2c9, - 0x2524ca, - 0x2091c2, - 0x20a3c4, - 0x302604, - 0x2ee247, - 0x2ee648, - 0x2f0889, - 0x3c6649, - 0x2f1507, - 0x101f49, - 0x21ee46, - 0xf4a86, - 0x2f61c4, - 0x22c50a, - 0x2fab08, - 0x2fc809, - 0x2fcdc6, - 0x2b6305, - 0x3362c8, - 0x2cb88a, - 0x24f1c3, - 0x3454c6, - 0x2f1607, - 0x31f785, - 0x3a4245, - 0x240a83, - 0x246484, - 0x228305, - 0x285dc7, - 0x2f90c5, - 0x2f6a46, - 0x11ba45, - 0x359a43, - 0x3d26c9, - 0x276d0c, - 0x2bb5cc, - 0x39e908, - 0x2a98c7, - 0x3085c8, - 0x108c07, - 0x30944a, - 0x309b0b, - 0x3c2a08, - 0x394408, - 0x3db806, - 0x27d485, - 0x33954a, - 0x36d645, - 0x219f82, - 0x2c9ac7, - 0x24d686, - 0x377b45, - 0x30adc9, - 0x27ae85, - 0x295b05, - 0x2f8249, - 0x322346, - 0x329788, - 0x267dc3, - 0x21e7c6, - 0x275506, - 0x318085, - 0x318089, - 0x2bc409, - 0x27d207, - 0x11abc4, - 0x31abc7, - 0x3c6549, - 0x220b05, - 0x37ec8, - 0x342dc5, - 0x28e1c5, - 0x383dc9, - 0x202542, - 0x3d2c04, - 0x201e82, - 0x201742, - 0x2e5285, - 0x324588, - 0x2b9485, - 0x2c8c83, - 0x2c8c85, - 0x2d6f43, - 0x2071c2, - 0x331d04, - 0x26e683, + 0x235406, + 0x124184, + 0x3a71c7, + 0x21ec8a, + 0x21b489, + 0x3bb287, + 0x3c024a, + 0x202703, + 0x35604b, + 0x216189, + 0x2f4245, + 0x3b0647, + 0x1242, + 0x214a83, + 0x20fcc7, + 0x263bc5, + 0x2cc8c9, + 0x232dc3, + 0x373ec6, + 0x2cb983, + 0xeeb03, + 0x118f86, + 0x98186, + 0x1d3bc7, + 0x212286, + 0x220fc5, + 0x205b47, + 0x316507, + 0x6bf08003, + 0x34e2c7, + 0x23c783, + 0x3d3905, + 0x221dc4, + 0x26f3c8, + 0x385acc, + 0x2b8d05, + 0x2aa446, + 0x20fb87, + 0x3b9887, + 0x3a2a07, + 0x248b48, + 0x317ccf, + 0x21b6c5, + 0x240a87, + 0x28e747, + 0x276e0a, + 0x37b549, + 0x3dd185, + 0x3212ca, + 0xc4ac6, + 0xc0a07, + 0x2cba05, + 0x2f6684, + 0x3d9686, + 0x101406, + 0x37f847, + 0x252d87, + 0x33b388, + 0x218405, + 0x263ac6, + 0x156ec8, + 0x2e3d85, + 0xe3f46, + 0x3268c5, + 0x28ce44, + 0x24a407, + 0x2307ca, + 0x23ab88, + 0x288e06, + 0x137c3, + 0x2ec0c5, + 0x320506, + 0x3bee46, + 0x297706, + 0x23c803, + 0x3a2e47, + 0x28e6c5, + 0x21a3c3, + 0x2e8b0d, + 0x203dc3, + 0x33b488, + 0x213484, + 0x276b05, + 0x2abd06, + 0x205406, + 0x2ac7c7, + 0x25b047, + 0x350ac5, + 0x242543, + 0x271d87, + 0x371989, + 0x2708c9, + 0x384a4a, + 0x215542, + 0x3d38c4, + 0x2fb304, + 0x2f7c07, + 0x2f7f48, + 0x2fa3c9, + 0x3d2789, + 0x2fadc7, + 0x109049, + 0x362f06, + 0xfd5c6, + 0x2fe7c4, + 0x22cf8a, + 0x302448, + 0x305389, + 0x305946, + 0x2bc745, + 0x23aa48, + 0x2d5dca, + 0x32bf03, + 0x2043c6, + 0x2faec7, + 0x35a785, + 0x3b4045, + 0x2432c3, + 0x23e804, + 0x227b45, + 0x2848c7, + 0x2ff405, + 0x2ff846, + 0x111e85, + 0x2071c3, + 0x2071c9, + 0x2768cc, + 0x2c61cc, + 0x3444c8, + 0x2ab3c7, + 0x30d588, + 0x10e747, + 0x30eaca, + 0x30f18b, + 0x2162c8, + 0x205508, + 0x22b686, + 0x302bc5, + 0x25d70a, + 0x2df2c5, + 0x233442, + 0x2d44c7, + 0x253c46, + 0x376785, + 0x310949, + 0x2d0405, + 0x372185, + 0x3c2409, + 0x320446, + 0x201348, + 0x3d39c3, + 0x20aa46, + 0x275c86, + 0x31cd05, + 0x31cd09, + 0x2c4709, + 0x25d487, + 0x11cb84, + 0x31cb87, + 0x3d2689, + 0x21ee85, + 0x39f48, + 0x349845, + 0x353885, + 0x39b489, + 0x204b42, + 0x357204, + 0x209282, + 0x204582, + 0x2ed985, + 0x323f08, + 0x2c0485, + 0x2ced43, + 0x2ced45, + 0x2e03c3, + 0x20a742, + 0x2b4384, + 0x269f03, 0x200a82, - 0x3b8944, - 0x311943, - 0x212842, - 0x2b9503, - 0x213604, - 0x2fcf43, - 0x254ec4, - 0x204e82, - 0x216003, - 0x219c83, - 0x202602, - 0x293042, - 0x2bc249, - 0x20fa02, - 0x28a304, - 0x20d542, - 0x336144, - 0x21ee04, - 0x252b44, - 0x205402, - 0x23b4c2, - 0x387e43, - 0x298cc3, - 0x2614c4, - 0x28dcc4, - 0x2d0984, - 0x2f1784, - 0x31ad43, - 0x300b03, - 0x2bc744, - 0x31d9c4, - 0x31db06, - 0x20b582, - 0xc302, - 0x3ef83, - 0x20c302, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, + 0x3b17c4, + 0x309703, + 0x20cb42, + 0x2c0503, + 0x211e44, + 0x305ac3, + 0x255544, + 0x205142, + 0x2140c3, + 0x21ab03, + 0x2071c2, + 0x294ec2, + 0x2c4549, + 0x205b02, + 0x28bec4, + 0x206542, + 0x23a8c4, + 0x362ec4, + 0x3b4384, + 0x201b82, + 0x22b2c2, + 0x22db03, + 0x29cec3, + 0x3269c4, + 0x3aa684, + 0x2dae84, + 0x2ea884, + 0x31bcc3, + 0x312743, + 0x2c4a44, + 0x31f184, + 0x31f2c6, + 0x21d642, + 0x1242, + 0x41483, + 0x201242, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x6c05, 0x2000c2, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x205e03, - 0x228b03, - 0x224e44, - 0x2bc504, - 0x217b84, - 0x20a803, - 0x216603, - 0x216103, - 0x2f8a84, - 0x32ce03, - 0x2aad03, - 0x37a944, - 0x342bc6, - 0x20e5c3, - 0x12eb85, - 0x176c87, - 0x2e4003, - 0x6b644548, - 0x2420c3, - 0x2b4103, - 0x20a443, - 0x238cc3, - 0x3afd05, - 0x1ae683, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x208243, - 0x22dcc3, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x214543, - 0x20a803, - 0x27f984, - 0x6d9c3, - 0x216603, - 0x2ba0c4, - 0x12eb85, - 0x2c2ac5, - 0x176c87, - 0x20c302, - 0x201d02, + 0x202703, + 0x214a83, + 0x232dc3, + 0x209b03, + 0x308003, + 0x221dc4, + 0x2c4804, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x2141c3, + 0x2fedc4, + 0x297a83, + 0x2ad843, + 0x37a2c4, + 0x349646, + 0x210603, + 0x139b05, + 0x17e707, + 0x2d2c43, + 0x6da46f08, + 0x2532c3, + 0x2bb143, + 0x25cc03, + 0x2137c3, + 0x3c0ac5, + 0x1b0603, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x20a883, + 0x22ee03, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21bc83, + 0x21a3c3, + 0x2801c4, + 0x1b4103, + 0x242543, + 0x24a004, + 0x139b05, + 0x2c8f85, + 0x17e707, + 0x201242, + 0x2052c2, 0x200382, - 0x205642, - 0xca43, + 0x208482, + 0x3dc3, 0x2003c2, - 0x1244, - 0x22c0c3, - 0x235604, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x217b84, - 0x20a803, - 0xca43, - 0x216603, - 0x20c603, - 0x242244, - 0x9fe08, - 0x22c0c3, - 0x20ca43, - 0x8303, - 0x123ec4, - 0x249f84, - 0x9fe08, - 0x22c0c3, - 0x24b304, - 0x224e44, - 0x20ca43, - 0x201e02, - 0x6d9c3, - 0x216603, - 0x236bc3, - 0x46484, - 0x204185, - 0x219f82, - 0x2be683, - 0x2b49, - 0xddb86, - 0x142ec8, + 0x4f04, + 0x214a83, + 0x235b44, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x20e2c3, + 0x2d3684, + 0x9a048, + 0x214a83, + 0x203dc3, + 0x3a83, + 0x122504, + 0x24c0c4, + 0x9a048, + 0x214a83, + 0x24d9c4, + 0x221dc4, + 0x203dc3, + 0x204042, + 0x1b4103, + 0x242543, + 0x22b983, + 0x3e804, + 0x208805, + 0x233442, + 0x325e43, + 0x68b49, + 0xe5986, + 0x149948, 0x2000c2, - 0x9fe08, - 0x20c302, - 0x232c43, - 0x228b03, + 0x9a048, + 0x201242, + 0x232dc3, + 0x308003, 0x2005c2, - 0xca43, - 0x216603, - 0x5942, + 0x3dc3, + 0x242543, + 0x7c42, 0x82, 0xc2, - 0x1b5a47, - 0x13dc09, - 0x7be83, - 0x9fe08, - 0x27643, - 0x6ef26287, - 0x2c0c3, - 0x6048, - 0x32c43, - 0x28b03, - 0x3a086, - 0x14543, - 0x96448, - 0xc53c8, - 0x79046, - 0x11543, - 0xce788, - 0xb7e03, - 0x6f0e23c6, - 0xea185, - 0x32e47, - 0xa803, - 0x21803, - 0x16603, - 0xb142, - 0x17d48a, - 0x4e03, - 0xe5343, - 0xfe804, - 0x114d4b, - 0x115308, - 0x91482, - 0x1451207, - 0x153efc7, - 0x14c8d48, - 0x151d403, - 0x10044b, - 0x8582, - 0x12ea07, - 0x10cbc4, + 0x1c0407, + 0x142c09, + 0x7aec3, + 0x9a048, + 0x20f43, + 0x713233c7, + 0x14a83, + 0x944c8, + 0x32dc3, + 0x108003, + 0x1ab9c6, + 0x1bc83, + 0x92788, + 0xcae48, + 0xcff06, + 0x3c803, + 0xd8cc8, + 0x44b83, + 0x714eb886, + 0xf1c05, + 0x32fc7, + 0x1a3c3, + 0x11003, + 0x42543, + 0xeb02, + 0x17cd0a, + 0x2cc3, + 0xeda43, + 0x10a104, + 0x117acb, + 0x118088, + 0x90602, + 0x14540c7, + 0x15636c7, + 0x14cee08, + 0x14cf583, + 0x143acb, + 0xb342, + 0x12bcc7, + 0x11b504, 0x2000c2, - 0x20c302, - 0x235604, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x238cc3, - 0x20a803, - 0x216603, - 0x2ba0c3, - 0x20c603, - 0x2f783, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, + 0x201242, + 0x235b44, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x2137c3, + 0x21a3c3, + 0x242543, + 0x215d43, + 0x20e2c3, + 0x2fb03, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, 0x602, - 0x8303, - 0x28b03, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x238cc3, - 0x20a803, - 0x216603, - 0x20ff42, + 0x3a83, + 0x108003, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x2137c3, + 0x21a3c3, + 0x242543, + 0x20c782, 0x2000c1, 0x2000c2, 0x200201, - 0x336f42, - 0x9fe08, - 0x21c105, + 0x332182, + 0x9a048, + 0x21ca05, 0x200101, - 0x2c0c3, - 0x2fd84, - 0x2015c1, + 0x14a83, + 0x2fe44, + 0x201301, 0x200501, - 0x2014c1, - 0x244202, - 0x3874c4, - 0x244203, + 0x205dc1, + 0x246bc2, + 0x387fc4, + 0x246bc3, 0x200041, 0x200801, 0x200181, 0x200701, - 0x2f6b87, - 0x380f4f, - 0x3cac46, + 0x302fc7, + 0x30e38f, + 0x3ccc06, 0x2004c1, - 0x323f06, + 0x322546, 0x200bc1, 0x200581, - 0x3d878e, + 0x3affce, 0x2003c1, - 0x216603, + 0x242543, 0x200a81, - 0x2e3285, - 0x20b142, - 0x240985, + 0x34c105, + 0x20eb02, + 0x2431c5, 0x200401, 0x200741, 0x2007c1, - 0x219f82, + 0x233442, 0x200081, - 0x205841, - 0x201241, - 0x2018c1, - 0x204981, - 0x4e9c9, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x216e03, - 0x22c0c3, - 0x228b03, - 0x913c8, - 0x211543, - 0x20a803, - 0x70e03, - 0x216603, - 0x14ecd48, - 0x8148, - 0x12eb85, - 0x9fe08, - 0xca43, - 0x12eb85, - 0x1da144, - 0x116c8, - 0x42744, - 0xc9345, - 0x4e9c9, - 0x14ecd4a, - 0x9fe08, - 0x6d9c3, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x225843, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x2db1c4, - 0x216603, - 0x25cf45, - 0x27ac84, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x206a42, - 0x20a803, - 0x216603, - 0xc603, - 0xa924a, - 0x119b84, - 0x121d46, - 0x248343, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x20a803, - 0x216603, - 0x20c302, - 0x22c0c3, - 0x230309, - 0x232c43, - 0x2ac809, - 0x228b03, - 0x211543, - 0x20a803, - 0x189a44, - 0xca43, - 0x216603, - 0x2f5fc8, - 0x23ad87, - 0x204185, - 0x1d1548, - 0x1b5a47, - 0xee8ca, - 0x6fe0b, - 0x124147, - 0x3cd48, - 0x1198a, - 0x1a348, - 0x13dc09, - 0x281c7, - 0x106707, - 0x140cc8, - 0x6048, - 0x3e84f, - 0x17c45, - 0x16687, - 0x3a086, - 0x3fc07, - 0x11e586, - 0x96448, - 0x9f546, - 0x129587, - 0x143489, - 0x1a4ec7, - 0x9be49, - 0xba9c9, - 0xc2846, - 0xc53c8, - 0xc3a05, - 0x7c70a, - 0xce788, - 0xb7e03, - 0xd7348, - 0x32e47, - 0x13e8c5, - 0x64910, - 0x21803, - 0x6d9c3, - 0x129407, - 0x231c5, - 0xeff88, - 0x65305, - 0xe5343, - 0x3308, - 0xb446, - 0x92289, - 0xaebc7, - 0x2e0b, - 0x6c1c4, - 0x10b8c4, - 0x114d4b, - 0x115308, - 0x115e07, - 0x12eb85, - 0x22c0c3, - 0x232c43, - 0x212483, - 0x216603, - 0x23bf03, - 0x228b03, - 0x6d9c3, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x1988cb, + 0x201341, + 0x204f01, + 0x201b41, + 0x201441, + 0x50849, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x214903, + 0x214a83, + 0x308003, + 0x90548, + 0x23c803, + 0x21a3c3, + 0x7283, + 0x242543, + 0x14f62c8, + 0x1e0603, + 0xa788, + 0x139b05, + 0x9a048, + 0x3dc3, + 0x139b05, + 0xcd184, + 0xd1488, + 0x455c4, + 0xcf487, + 0xd3b05, + 0x50849, + 0x11d287, + 0x14f62ca, + 0x9a048, + 0x1b4103, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x220dc3, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x2e3504, + 0x242543, + 0x24f8c5, + 0x2d0204, + 0x214a83, + 0x232dc3, + 0x308003, + 0x209e82, + 0x21a3c3, + 0x242543, + 0xe2c3, + 0xac60a, + 0xe8006, + 0x102804, + 0x122046, + 0x202703, + 0x214a83, + 0x232dc3, + 0x308003, + 0x21a3c3, + 0x242543, + 0x201242, + 0x214a83, + 0x2303c9, + 0x232dc3, + 0x2aa909, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x78a84, + 0x3dc3, + 0x242543, + 0x2fe5c8, + 0x23c207, + 0x208805, + 0xdbc48, + 0x1d4408, + 0x1c0407, + 0xf81ca, + 0x6f98b, + 0x122787, + 0x3f888, + 0xd174a, + 0xf648, + 0x142c09, + 0x27a07, + 0x1fa87, + 0x3ec8, + 0x944c8, + 0x40d4f, + 0x3ad45, + 0x947c7, + 0x1ab9c6, + 0x3cd87, + 0x1dd2c6, + 0x92788, + 0x99786, + 0x1147, + 0x2fc9, + 0x18ab07, + 0x179dc9, + 0xc2749, + 0xc8d06, + 0xcae48, + 0xdbf05, + 0x7b74a, + 0xd8cc8, + 0x44b83, + 0xe07c8, + 0x32fc7, + 0x95d05, + 0x51590, + 0x11003, + 0x1b4103, + 0x2e47, + 0x1acc5, + 0xf9888, + 0x66605, + 0xeda43, + 0x1cb7c8, + 0xee06, + 0x32109, + 0xb2b87, + 0x68e0b, + 0x6cc44, + 0x111444, + 0x117acb, + 0x118088, + 0x118e87, + 0x139b05, + 0x214a83, + 0x232dc3, + 0x228503, + 0x242543, + 0x23e343, + 0x308003, + 0x1b4103, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x91e4b, 0x2000c2, - 0x20c302, - 0x216603, - 0x9fe08, - 0x133d89, - 0xc302, + 0x201242, + 0x242543, + 0xd42, + 0x9e82, + 0x7782, + 0x9a048, + 0x1b3089, + 0x1242, 0x2000c2, - 0x20c302, + 0x201242, 0x200382, 0x2005c2, - 0x206702, - 0x20a803, - 0x133a46, + 0x210942, + 0x21a3c3, + 0x13f246, 0x2003c2, - 0x46484, + 0x3e804, 0x2000c2, - 0x248343, - 0x20c302, - 0x22c0c3, - 0x232c43, + 0x202703, + 0x201242, + 0x214a83, + 0x232dc3, 0x200382, - 0x228b03, - 0x214543, - 0x211543, - 0x217b84, - 0x20a803, - 0x213dc3, - 0xca43, - 0x216603, - 0x2fe804, - 0x205b03, - 0x228b03, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x20ca43, - 0x216603, - 0x3b8207, - 0x22c0c3, - 0x27c087, - 0x35f6c6, - 0x216b03, - 0x214403, - 0x228b03, - 0x204f43, - 0x224e44, - 0x300bc4, - 0x3187c6, - 0x218f83, - 0x20a803, - 0x216603, - 0x25cf45, - 0x34f1c4, - 0x326a03, - 0x276683, - 0x2c9ac7, - 0x20f805, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x211543, - 0x20a803, - 0x216603, - 0x14803, - 0x7970270c, - 0x50e87, - 0xbe846, - 0x114587, - 0x8f6c5, - 0x20be02, - 0x245a83, - 0x208b83, - 0x248343, - 0x7a22c0c3, - 0x207902, - 0x232c43, - 0x2020c3, - 0x228b03, - 0x224e44, - 0x201143, - 0x223bc3, - 0x211543, - 0x217b84, - 0x7a612b02, - 0x20a803, - 0x216603, - 0x21d0c3, - 0x22ce03, - 0x20a883, - 0x20ff42, - 0x205b03, - 0x9fe08, - 0x228b03, - 0x8303, - 0x322c44, - 0x248343, - 0x20c302, - 0x22c0c3, - 0x235604, - 0x232c43, - 0x228b03, - 0x224e44, - 0x214543, - 0x246b84, - 0x303f84, - 0x2d9bc6, - 0x217b84, - 0x20a803, - 0x216603, - 0x216103, - 0x24d686, - 0x3494b, - 0x39346, - 0x396ca, - 0x11960a, - 0x9fe08, - 0x225744, - 0x7ba2c0c3, - 0x3db044, - 0x232c43, - 0x26e144, - 0x228b03, - 0x220383, - 0x211543, - 0x20a803, - 0x6d9c3, - 0x216603, - 0x47203, - 0x34b00b, - 0x3c840a, - 0x3dc60c, - 0xe27c8, - 0x2000c2, - 0x20c302, - 0x200382, - 0x22cd85, - 0x224e44, - 0x206a42, - 0x211543, - 0x303f84, - 0x205642, - 0x2003c2, - 0x209482, - 0x20ff42, - 0x48343, - 0x9382, - 0x2c4009, - 0x364448, - 0x228989, - 0x208649, - 0x2181ca, - 0x22170a, - 0x203cc2, - 0x28cac2, - 0xc302, - 0x22c0c3, - 0x22ae02, - 0x23e746, - 0x378f82, - 0x201682, - 0x27018e, - 0x21604e, - 0x27fc47, - 0x20a787, - 0x24b5c2, - 0x232c43, - 0x228b03, - 0x20d602, - 0x2005c2, - 0x14383, - 0x23580f, - 0x23ea82, - 0x366f87, - 0x2b1bc7, - 0x354207, - 0x2b590c, - 0x2e09cc, - 0x3d0384, - 0x39b8ca, - 0x211902, - 0x24e082, - 0x2bce04, - 0x200702, - 0x2c4fc2, - 0x2e0c04, - 0x213ec2, - 0x203102, - 0xe403, - 0x29f5c7, - 0x238685, - 0x217002, - 0x23fb84, - 0x340d82, - 0x2e2548, - 0x20a803, - 0x377ec8, - 0x201fc2, - 0x3d0545, - 0x394d46, - 0x216603, - 0x208242, - 0x2f0ac7, - 0xb142, - 0x212ec5, - 0x301185, - 0x216442, - 0x2085c2, - 0x21cf0a, - 0x28a90a, - 0x287582, - 0x2a0cc4, - 0x205c42, - 0x20a288, - 0x205782, - 0x356708, - 0xf01, - 0x30ef47, - 0x310a49, - 0x212f42, - 0x316805, - 0x3b0205, - 0x21898b, - 0x318d4c, - 0x22a908, - 0x32e848, - 0x20b582, - 0x2a94c2, - 0x2000c2, - 0x9fe08, - 0x20c302, - 0x22c0c3, - 0x200382, - 0x205642, - 0xca43, - 0x2003c2, - 0x216603, - 0x209482, - 0x2000c2, - 0x12eb85, - 0x7ce0c302, - 0x7d628b03, - 0x20e403, - 0x206a42, - 0x20a803, - 0x3559c3, - 0x7da16603, - 0x2ed343, - 0x281ac6, - 0x160c603, - 0x12eb85, - 0x13390b, - 0x9fe08, - 0x7d27d6c8, - 0x7e407, - 0x6d247, - 0x175305, - 0x2a20d, - 0x39e82, - 0x115902, - 0xaa74a, - 0x8a747, - 0x27304, - 0x27343, - 0x1bffc4, - 0x7e204ec2, - 0x7e600ac2, - 0x7ea02282, - 0x7ee03342, - 0x7f209bc2, - 0x7f604042, - 0x176c87, - 0x7fa0c302, - 0x7fe2dac2, - 0x80221442, - 0x806081c2, - 0x216043, - 0x12704, - 0x236cc3, - 0x80a0c782, - 0x59648, - 0x80e076c2, - 0x4bc07, - 0x81200042, - 0x81600d82, - 0x81a00182, - 0x81e03dc2, - 0x82200f42, - 0x826005c2, - 0xd30c5, - 0x215183, - 0x36c284, - 0x82a00702, - 0x82e01882, - 0x83203c42, - 0x86ccb, - 0x83600c42, - 0x83e44502, - 0x84206a42, - 0x84606702, - 0x84a1d902, - 0x84e00bc2, - 0x85205a02, - 0x8566bf42, - 0x85a12b02, - 0x85e04f82, - 0x86205642, - 0x86636002, - 0x86a6f802, - 0x86e28c42, - 0x194584, - 0x217903, - 0x87200ec2, - 0x8760fc42, - 0x87a0ad82, - 0x87e006c2, - 0x882003c2, - 0x88600a82, - 0x198a47, - 0x88a16102, - 0x88e03d82, - 0x89209482, - 0x89616002, - 0x1a214c, - 0x89a47c82, - 0x89e22182, - 0x8a202682, - 0x8a617042, - 0x8aa00f02, - 0x8ae18342, - 0x8b205842, - 0x8b60b902, - 0x8ba75882, - 0x8be369c2, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x17203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x83a01143, - 0x217203, - 0x3afd84, - 0x228886, - 0x2fd643, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x2bdd09, - 0x209382, - 0x39c403, - 0x2bacc3, - 0x36aa05, - 0x2020c3, - 0x201143, - 0x217203, - 0x28f543, - 0x221a43, - 0x34d8c9, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x201143, - 0x217203, - 0x209382, - 0x209382, - 0x201143, - 0x217203, - 0x8c62c0c3, - 0x232c43, - 0x208883, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x9fe08, - 0x20c302, - 0x22c0c3, - 0x20a803, - 0x216603, - 0xbdb82, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x8d0ebe82, - 0x211543, - 0x20a803, - 0xca43, - 0x216603, - 0x15c1, - 0x249f84, - 0x20c302, - 0x22c0c3, - 0x200983, - 0x232c43, - 0x24b304, - 0x212483, - 0x228b03, - 0x224e44, - 0x214543, - 0x211543, - 0x20a803, - 0x216603, - 0x236bc3, - 0x204185, - 0x221a43, - 0x205b03, - 0xca43, - 0x20c302, - 0x22c0c3, - 0x201143, - 0x20a803, - 0x216603, - 0x2000c2, - 0x248343, - 0x9fe08, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x22f446, - 0x224e44, - 0x214543, - 0x217b84, - 0x20a803, - 0x216603, - 0x216103, - 0x22c0c3, - 0x232c43, - 0x20a803, - 0x216603, - 0x2d7c2, - 0x1942, - 0x1458787, - 0x141347, - 0x22c0c3, - 0x39346, - 0x232c43, - 0x228b03, - 0xe7d46, - 0x20a803, - 0x216603, - 0x32b688, - 0x32e689, - 0x341509, - 0x34cd48, - 0x396f48, - 0x396f49, - 0x32370a, - 0x35f9ca, - 0x39278a, - 0x39914a, - 0x3c840a, - 0x3d5fcb, - 0x23d20d, - 0x367bcf, - 0x25b050, - 0x36144d, - 0x37e04c, - 0x398e8b, - 0x6d448, - 0xebcc8, - 0x92e85, - 0x1488147, - 0xccc85, - 0x2000c2, - 0x20f645, - 0x20e3c3, - 0x9060c302, - 0x232c43, - 0x228b03, - 0x3d4007, - 0x20a443, - 0x211543, - 0x20a803, - 0x24bbc3, - 0x213dc3, - 0x209a83, - 0x20ca43, - 0x216603, + 0x308003, + 0x21bc83, + 0x23c803, + 0x219a04, + 0x21a3c3, + 0x2125c3, + 0x3dc3, + 0x242543, + 0x30a104, + 0x207783, + 0x308003, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x203dc3, + 0x242543, + 0x3bd187, + 0x214a83, + 0x27b0c7, + 0x397206, + 0x216c83, + 0x21bb43, + 0x308003, + 0x206c03, + 0x221dc4, + 0x28a404, + 0x3383c6, + 0x213a43, + 0x21a3c3, + 0x242543, + 0x24f8c5, + 0x2af384, + 0x323b43, + 0x2ce043, + 0x2d44c7, + 0x2cd845, + 0x68703, + 0x214a83, + 0x232dc3, + 0x308003, + 0x23c803, + 0x21a3c3, + 0x6e544, + 0x242543, + 0x14583, + 0x7c30988c, + 0x53547, + 0xe4846, + 0x91487, + 0x67f05, + 0x202b02, + 0x247403, + 0x214f03, + 0x202703, + 0x7ce14a83, + 0x208c02, + 0x232dc3, + 0x207083, + 0x308003, + 0x221dc4, + 0x2059c3, + 0x21b6c3, + 0x23c803, + 0x219a04, + 0x7d20ce02, + 0x21a3c3, + 0x242543, + 0x2308c3, + 0x21bd03, + 0x21a443, + 0x20c782, + 0x207783, + 0x9a048, + 0x308003, + 0x3a83, + 0x2135c4, + 0x202703, + 0x201242, + 0x214a83, + 0x235b44, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x21bc83, + 0x3473c4, + 0x306c44, + 0x2e2406, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x2141c3, 0x253c46, - 0x219f82, - 0x205b03, - 0x9fe08, + 0x34c8b, + 0x28886, + 0xec90a, + 0x11b94a, + 0x9a048, + 0x2136c4, + 0x7e614a83, + 0x2026c4, + 0x232dc3, + 0x270744, + 0x308003, + 0x2f3983, + 0x23c803, + 0x21a3c3, + 0x1b4103, + 0x242543, + 0x4cbc3, + 0x347f8b, + 0x3ca20a, + 0x3e010c, + 0xebe48, 0x2000c2, - 0x248343, - 0x20c302, - 0x22c0c3, - 0x232c43, - 0x228b03, - 0x224e44, - 0x211543, - 0x20a803, - 0x216603, - 0x20c603, - 0x141347, - 0x8582, - 0x2b44, - 0x15c87c6, + 0x201242, + 0x200382, + 0x22d805, + 0x221dc4, + 0x209e82, + 0x23c803, + 0x306c44, + 0x208482, + 0x2003c2, + 0x2090c2, + 0x20c782, + 0x2703, + 0x15702, + 0x2cb209, + 0x365308, + 0x307e89, + 0x2073c9, + 0x20b40a, + 0x210f0a, + 0x206082, + 0x2167c2, + 0x1242, + 0x214a83, + 0x22ba02, + 0x240c46, + 0x377dc2, + 0x208d42, + 0x26fd0e, + 0x21410e, + 0x27e307, + 0x21a347, + 0x24dc82, + 0x232dc3, + 0x308003, + 0x210d82, + 0x2005c2, + 0x1bac3, + 0x235d4f, + 0x21fb02, + 0x2b8887, + 0x3520c7, + 0x2bc287, + 0x2e9ccc, + 0x2dc18c, + 0x20c304, + 0x38d04a, + 0x214042, + 0x201e42, + 0x2c5104, + 0x200702, + 0x2cc342, + 0x2dc3c4, + 0x20fe82, + 0x202042, + 0x1a8c3, + 0x299807, + 0x23a705, + 0x223502, + 0x23cd04, + 0x203f82, + 0x2eba08, + 0x21a3c3, + 0x376b08, + 0x2029c2, + 0x20c4c5, + 0x396e06, + 0x242543, + 0x20a882, + 0x2fa607, + 0xeb02, + 0x39e785, + 0x3c2f45, + 0x206442, + 0x20b382, + 0x33a90a, + 0x35094a, + 0x23c7c2, + 0x2a4284, + 0x203282, + 0x3d3788, + 0x20a5c2, + 0x359208, + 0xf01, + 0x314447, + 0x3149c9, + 0x2b7402, + 0x319985, + 0x3b9c45, + 0x2184cb, + 0x33894c, + 0x22c088, + 0x32bb08, + 0x21d642, + 0x2ac882, 0x2000c2, - 0x20c302, - 0x228b03, - 0x211543, - 0x216603, + 0x9a048, + 0x201242, + 0x214a83, + 0x200382, + 0x208482, + 0x3dc3, + 0x2003c2, + 0x242543, + 0x2090c2, + 0x2000c2, + 0x139b05, + 0x7fa01242, + 0x1099c4, + 0x37e85, + 0x80708003, + 0x21a8c3, + 0x209e82, + 0x21a3c3, + 0x3b68c3, + 0x80a42543, + 0x2f7103, + 0x274d46, + 0x160e2c3, + 0x139b05, + 0x13f10b, + 0x9a048, + 0x7ff02e08, + 0x5c1c7, + 0x802c108a, + 0x6ddc7, + 0x97805, + 0x2a54d, + 0x8e242, + 0x118682, + 0xe01, + 0xad28a, + 0x150787, + 0x20c04, + 0x20c43, + 0x3c704, + 0x81202842, + 0x81600ac2, + 0x81a01182, + 0x81e02d02, + 0x82206b42, + 0x826086c2, + 0x17e707, + 0x82a01242, + 0x82e2ec02, + 0x8321f2c2, + 0x83602a42, + 0x214103, + 0xca04, + 0x22dcc3, + 0x83a0e442, + 0x5a988, + 0x83e015c2, + 0x4e2c7, + 0x1ad887, + 0x84200042, + 0x84600d82, + 0x84a00182, + 0x84e06182, + 0x85200f42, + 0x856005c2, + 0xf4185, + 0x24dec3, + 0x35c004, + 0x85a00702, + 0x85e14d42, + 0x86206002, + 0x7a04b, + 0x86600c42, + 0x86e01f42, + 0x87209e82, + 0x87610942, + 0x87a1d542, + 0x87e00bc2, + 0x88202382, + 0x8866c9c2, + 0x88a0ce02, + 0x88e03142, + 0x89208482, + 0x89637242, + 0x89a510c2, + 0x89e43802, + 0x5684, + 0x310543, + 0x8a200ec2, + 0x8a610e82, + 0x8aa0e742, + 0x8ae006c2, + 0x8b2003c2, + 0x8b600a82, + 0xf6bc8, + 0x91fc7, + 0x8ba141c2, + 0x8be06142, + 0x8c2090c2, + 0x8c6023c2, + 0x1aec8c, + 0x8ca02c02, + 0x8ce25b82, + 0x8d20f482, + 0x8d603642, + 0x8da00f02, + 0x8de0b582, + 0x8e201342, + 0x8e607302, + 0x8ea76002, + 0x8ee76542, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x23703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x86a059c3, + 0x223703, + 0x3c0b44, + 0x307d86, + 0x306403, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x374689, + 0x215702, + 0x39b6c3, + 0x2c2a43, + 0x2894c5, + 0x207083, + 0x2059c3, + 0x223703, + 0x267d83, + 0x211243, + 0x3c4409, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x2059c3, + 0x223703, + 0x215702, + 0x215702, + 0x2059c3, + 0x223703, + 0x8f614a83, + 0x232dc3, + 0x207603, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x9a048, + 0x201242, + 0x214a83, + 0x21a3c3, + 0x242543, + 0x141842, + 0x214a83, + 0x232dc3, + 0x308003, + 0x901192c2, + 0x23c803, + 0x21a3c3, + 0x3dc3, + 0x242543, + 0x1301, + 0x24c0c4, + 0x201242, + 0x214a83, + 0x200983, + 0x232dc3, + 0x24d9c4, + 0x228503, + 0x308003, + 0x221dc4, + 0x21bc83, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x22b983, + 0x208805, + 0x211243, + 0x207783, + 0x882, + 0x3dc3, + 0x201242, + 0x214a83, + 0x2059c3, + 0x21a3c3, + 0x242543, + 0x2000c2, + 0x202703, + 0x9a048, + 0x214a83, + 0x232dc3, + 0x308003, + 0x22f7c6, + 0x221dc4, + 0x21bc83, + 0x219a04, + 0x21a3c3, + 0x242543, + 0x2141c3, + 0x29904, + 0x214a83, + 0x239c3, + 0x232dc3, + 0x9e82, + 0x21a3c3, + 0x242543, + 0x2aec2, + 0x2982, + 0x147ee07, + 0x1807, + 0x214a83, + 0x28886, + 0x232dc3, + 0x308003, + 0xedf86, + 0x21a3c3, + 0x242543, + 0x328e48, + 0x32b949, + 0x33e209, + 0x34ae08, + 0x399488, + 0x399489, + 0x322c0a, + 0x3602ca, + 0x39424a, + 0x39abca, + 0x3ca20a, + 0x3d818b, + 0x30838d, + 0x23fd4f, + 0x35d210, + 0x361d4d, + 0x37d8cc, + 0x39a90b, + 0x6dfc8, + 0x11d548, + 0x19d705, + 0x1486107, + 0xd7445, + 0x2000c2, + 0x2cd685, + 0x202003, + 0x93601242, + 0x232dc3, + 0x308003, + 0x27e7c7, + 0x25cc03, + 0x23c803, + 0x21a3c3, + 0x24e283, + 0x2125c3, + 0x206a03, + 0x203dc3, + 0x242543, + 0x252b06, + 0x233442, + 0x207783, + 0x9a048, + 0x2000c2, + 0x202703, + 0x201242, + 0x214a83, + 0x232dc3, + 0x308003, + 0x221dc4, + 0x23c803, + 0x21a3c3, + 0x242543, + 0x20e2c3, + 0x1807, + 0xb342, + 0x68b44, + 0x151c306, + 0x2000c2, + 0x201242, + 0x308003, + 0x23c803, + 0x242543, } // children is the list of nodes' children, the parent's wildcard bit and the @@ -9462,18 +9554,18 @@ var children = [...]uint32{ 0x40000000, 0x50000000, 0x60000000, - 0x17f85f8, - 0x17fc5fe, - 0x18005ff, - 0x1824600, - 0x1980609, - 0x1998660, - 0x19ac666, - 0x19c466b, - 0x19e4671, - 0x19fc679, - 0x1a1467f, - 0x1a2c685, + 0x17ec5f5, + 0x17f05fb, + 0x17f45fc, + 0x18185fd, + 0x1970606, + 0x198865c, + 0x199c662, + 0x19b4667, + 0x19d466d, + 0x19f4675, + 0x1a0c67d, + 0x1a2c683, 0x1a3068b, 0x1a5868c, 0x1a5c696, @@ -9482,516 +9574,501 @@ var children = [...]uint32{ 0x1a7c69e, 0x1ab869f, 0x1abc6ae, - 0x61ac46af, - 0x21acc6b1, - 0x1b146b3, - 0x1b186c5, - 0x1b3c6c6, - 0x1b406cf, + 0x1ac06af, + 0x61ac86b0, + 0x21ad06b2, + 0x1b186b4, + 0x1b1c6c6, + 0x1b406c7, 0x1b446d0, - 0x1b586d1, - 0x1b5c6d6, - 0x1b8c6d7, - 0x1ba86e3, - 0x1bd06ea, - 0x1be06f4, - 0x1be46f8, - 0x1c7c6f9, - 0x1c9071f, - 0x1ca4724, - 0x1cdc729, - 0x1cec737, - 0x1d0073b, - 0x1d18740, - 0x1dbc746, - 0x1fc076f, - 0x1fc47f0, - 0x20307f1, - 0x209c80c, - 0x20b4827, - 0x20c882d, - 0x20cc832, - 0x20d4833, - 0x20e8835, - 0x20ec83a, - 0x210883b, - 0x2158842, - 0x215c856, - 0x22160857, - 0x217c858, - 0x218085f, + 0x1b486d1, + 0x1b5c6d2, + 0x1b606d7, + 0x1b806d8, + 0x1bb06e0, + 0x1bcc6ec, + 0x1bf46f3, + 0x1c046fd, + 0x1c08701, + 0x1ca0702, + 0x1cb4728, + 0x1cc872d, + 0x1d00732, + 0x1d10740, + 0x1d24744, + 0x1d3c749, + 0x1de074f, + 0x1fe4778, + 0x1fe87f9, + 0x20547fa, + 0x20c0815, + 0x20d8830, + 0x20ec836, + 0x20f083b, + 0x20f883c, + 0x210c83e, + 0x2110843, + 0x2130844, + 0x218084c, 0x2184860, - 0x21a8861, - 0x21e886a, - 0x21ec87a, - 0x621f087b, - 0x220887c, - 0x222c882, - 0x223888b, - 0x224888e, - 0x22fc892, - 0x23008bf, - 0x223108c0, - 0x223148c4, - 0x2231c8c5, - 0x23748c7, - 0x23788dd, - 0x288c8de, - 0x2890a23, - 0x22938a24, - 0x2293ca4e, - 0x22940a4f, - 0x2294ca50, - 0x22950a53, - 0x2295ca54, - 0x22960a57, - 0x22964a58, - 0x22968a59, - 0x2296ca5a, - 0x22970a5b, - 0x2297ca5c, - 0x22980a5f, - 0x2298ca60, + 0x22188861, + 0x21a4862, + 0x21a8869, + 0x21ac86a, + 0x21d086b, + 0x2214874, + 0x2218885, + 0x6221c886, + 0x2238887, + 0x226488e, + 0x2270899, + 0x228089c, + 0x23348a0, + 0x23388cd, + 0x223488ce, + 0x2234c8d2, + 0x223548d3, + 0x23ac8d5, + 0x23b08eb, + 0x23b48ec, + 0x28dc8ed, + 0x28e0a37, + 0x22988a38, + 0x2298ca62, 0x22990a63, - 0x22994a64, - 0x22998a65, - 0x229a4a66, - 0x229a8a69, - 0x229b4a6a, + 0x2299ca64, + 0x229a0a67, + 0x229aca68, + 0x229b0a6b, + 0x229b4a6c, 0x229b8a6d, 0x229bca6e, 0x229c0a6f, - 0x29c4a70, - 0x229c8a71, - 0x229d4a72, - 0x229d8a75, - 0x29dca76, - 0x29e4a77, - 0x629f0a79, - 0x2a34a7c, - 0x22a54a8d, - 0x22a58a95, - 0x22a5ca96, - 0x22a64a97, - 0x22a68a99, - 0x2a6ca9a, - 0x22a70a9b, - 0x22a74a9c, - 0x22a78a9d, - 0x22a7ca9e, - 0x2a84a9f, - 0x2a8caa1, - 0x2a90aa3, - 0x2aacaa4, - 0x2ac4aab, - 0x2ac8ab1, - 0x2ad8ab2, - 0x2ae4ab6, - 0x2b18ab9, + 0x229cca70, + 0x229d0a73, + 0x229dca74, + 0x229e0a77, + 0x229e4a78, + 0x229e8a79, + 0x229f4a7a, + 0x229f8a7d, + 0x22a04a7e, + 0x22a08a81, + 0x22a0ca82, + 0x22a10a83, + 0x2a14a84, + 0x22a18a85, + 0x22a24a86, + 0x22a28a89, + 0x2a2ca8a, + 0x2a34a8b, + 0x62a40a8d, + 0x2a84a90, + 0x22aa4aa1, + 0x22aa8aa9, + 0x22aacaaa, + 0x22ab0aab, + 0x22ab8aac, + 0x22abcaae, + 0x2ac0aaf, + 0x22ac4ab0, + 0x22ac8ab1, + 0x22accab2, + 0x22ad0ab3, + 0x2ad8ab4, + 0x2ae0ab6, + 0x2ae4ab8, + 0x2b00ab9, + 0x2b18ac0, 0x2b1cac6, - 0x2b34ac7, - 0x22b3cacd, - 0x22b40acf, - 0x22b48ad0, - 0x2c40ad2, - 0x22c44b10, - 0x2c4cb11, - 0x2c50b13, - 0x22c54b14, - 0x2c58b15, - 0x2c70b16, - 0x2c74b1c, - 0x2c78b1d, - 0x2c7cb1e, - 0x2c94b1f, - 0x2ca8b25, - 0x2cd0b2a, - 0x2cf0b34, - 0x2cf4b3c, - 0x62cf8b3d, - 0x2d2cb3e, - 0x2d30b4b, - 0x22d34b4c, - 0x2d38b4d, - 0x2d60b4e, + 0x2b2cac7, + 0x2b38acb, + 0x2b6cace, + 0x2b74adb, + 0x22b78add, + 0x2b90ade, + 0x22b98ae4, + 0x22b9cae6, + 0x22ba4ae7, + 0x2ca0ae9, + 0x22ca4b28, + 0x2cacb29, + 0x2cb0b2b, + 0x22cb4b2c, + 0x2cb8b2d, + 0x2ce0b2e, + 0x2ce4b38, + 0x2ce8b39, + 0x2cecb3a, + 0x2d04b3b, + 0x2d18b41, + 0x2d40b46, + 0x2d60b50, 0x2d64b58, - 0x2d88b59, - 0x2d8cb62, - 0x2da0b63, - 0x2da4b68, + 0x62d68b59, + 0x2d9cb5a, + 0x2da0b67, + 0x22da4b68, 0x2da8b69, - 0x2dc8b6a, - 0x2de4b72, - 0x2de8b79, - 0x22decb7a, - 0x2df0b7b, - 0x2df4b7c, - 0x2df8b7d, - 0x2e00b7e, - 0x2e14b80, + 0x2dd0b6a, + 0x2dd4b74, + 0x2df8b75, + 0x2dfcb7e, + 0x2e10b7f, + 0x2e14b84, 0x2e18b85, - 0x2e1cb86, - 0x2e44b87, - 0x2e48b91, - 0x2ebcb92, - 0x2ec0baf, - 0x2ec4bb0, - 0x2ee4bb1, - 0x2ef8bb9, - 0x2f0cbbe, - 0x2f24bc3, - 0x2f40bc9, - 0x2f58bd0, - 0x2f5cbd6, - 0x2f74bd7, - 0x2f90bdd, - 0x2f94be4, - 0x2fb4be5, - 0x2fd4bed, - 0x2ff0bf5, - 0x3054bfc, - 0x3070c15, - 0x3080c1c, - 0x3084c20, - 0x309cc21, - 0x30e0c27, - 0x3160c38, - 0x3190c58, - 0x3194c64, - 0x31a0c65, - 0x31c0c68, - 0x31c4c70, - 0x31e8c71, - 0x31f0c7a, - 0x322cc7c, - 0x327cc8b, - 0x3280c9f, - 0x3284ca0, - 0x3354ca1, - 0x23358cd5, - 0x2335ccd6, - 0x3360cd7, - 0x23364cd8, - 0x23368cd9, - 0x336ccda, - 0x23370cdb, - 0x23380cdc, - 0x23384ce0, - 0x23388ce1, - 0x2338cce2, - 0x23390ce3, - 0x33a8ce4, - 0x33cccea, - 0x33eccf3, - 0x3a58cfb, - 0x3a64e96, - 0x3a84e99, - 0x3c44ea1, - 0x3d14f11, - 0x3d84f45, - 0x3ddcf61, - 0x3ec4f77, - 0x3f1cfb1, - 0x3f58fc7, - 0x4054fd6, - 0x4121015, - 0x41b9048, - 0x424906e, - 0x42ad092, - 0x44e50ab, - 0x459d139, - 0x4669167, - 0x46b519a, - 0x473d1ad, - 0x47791cf, - 0x47c91de, - 0x48411f2, - 0x64845210, - 0x64849211, - 0x6484d212, - 0x48c9213, - 0x4925232, - 0x49a1249, - 0x4a19268, - 0x4a99286, - 0x4b052a6, - 0x4c312c1, - 0x4c8930c, - 0x64c8d322, - 0x4d25323, - 0x4d2d349, - 0x24d3134b, - 0x4db934c, - 0x4e0536e, - 0x4e6d381, - 0x4f1539b, - 0x4fdd3c5, - 0x50453f7, - 0x5159411, - 0x6515d456, - 0x65161457, - 0x51bd458, - 0x521946f, - 0x52a9486, - 0x53254aa, - 0x53694c9, - 0x544d4da, - 0x5481513, - 0x54e1520, - 0x5555538, - 0x55dd555, - 0x561d577, - 0x568d587, - 0x656915a3, - 0x56b95a4, - 0x56bd5ae, - 0x56d55af, - 0x56f15b5, - 0x57355bc, - 0x57455cd, - 0x575d5d1, - 0x57d55d7, - 0x57dd5f5, - 0x57f95f7, - 0x580d5fe, - 0x5829603, - 0x585560a, - 0x5859615, - 0x5861616, - 0x5875618, - 0x589561d, - 0x58a5625, - 0x58b1629, - 0x58ed62c, - 0x58f563b, - 0x590963d, - 0x592d642, - 0x593964b, - 0x594164e, - 0x5965650, - 0x5989659, - 0x59a1662, - 0x59a5668, - 0x59ad669, - 0x59b166b, - 0x5a5166c, - 0x5a55694, - 0x5a59695, - 0x5a5d696, - 0x5a81697, - 0x5aa56a0, - 0x5ac16a9, - 0x5ad56b0, - 0x5ae96b5, - 0x5af16ba, - 0x5af96bc, - 0x5b016be, - 0x5b196c0, - 0x5b296c6, - 0x5b2d6ca, - 0x5b496cb, - 0x63d16d2, - 0x64098f4, - 0x6435902, - 0x645190d, - 0x6471914, - 0x649191c, - 0x64d5924, - 0x64dd935, - 0x264e1937, - 0x264e5938, - 0x64ed939, - 0x66c593b, - 0x266c99b1, - 0x66cd9b2, - 0x266dd9b3, - 0x266e59b7, - 0x266f19b9, - 0x66f59bc, - 0x266fd9bd, - 0x67059bf, - 0x67159c1, - 0x673d9c5, - 0x67799cf, - 0x677d9de, - 0x67b59df, - 0x67d99ed, - 0x73319f6, - 0x7335ccc, - 0x7339ccd, - 0x2733dcce, - 0x7341ccf, - 0x27345cd0, - 0x7349cd1, - 0x27355cd2, - 0x7359cd5, - 0x735dcd6, - 0x27361cd7, - 0x7365cd8, - 0x2736dcd9, - 0x7371cdb, - 0x7375cdc, - 0x27385cdd, - 0x7389ce1, - 0x738dce2, - 0x7391ce3, - 0x7395ce4, - 0x27399ce5, - 0x739dce6, - 0x73a1ce7, - 0x73a5ce8, - 0x73a9ce9, - 0x273b1cea, - 0x73b5cec, - 0x73b9ced, - 0x73bdcee, - 0x273c1cef, - 0x73c5cf0, - 0x273cdcf1, - 0x273d1cf3, - 0x73edcf4, - 0x7405cfb, - 0x27409d01, - 0x744dd02, - 0x7451d13, - 0x7475d14, - 0x7481d1d, - 0x7485d20, - 0x7489d21, - 0x7645d22, - 0x27649d91, - 0x27651d92, - 0x27655d94, - 0x27659d95, - 0x7661d96, - 0x773dd98, - 0x27749dcf, - 0x2774ddd2, - 0x27751dd3, - 0x27755dd4, - 0x7759dd5, - 0x7785dd6, - 0x7789de1, - 0x778dde2, - 0x77b1de3, - 0x77bddec, - 0x77dddef, - 0x77e1df7, - 0x7819df8, - 0x7ac9e06, - 0x7b85eb2, - 0x7b89ee1, - 0x7b8dee2, - 0x7ba1ee3, - 0x7bd5ee8, - 0x7c0def5, - 0x27c11f03, - 0x7c2df04, - 0x7c55f0b, - 0x7c59f15, - 0x7c7df16, - 0x7c99f1f, - 0x7cc1f26, - 0x7cd1f30, - 0x7cd5f34, - 0x7cd9f35, - 0x7d11f36, - 0x7d1df44, - 0x7d45f47, - 0x7dc5f51, - 0x27dc9f71, - 0x7dd9f72, - 0x7de9f76, - 0x7e05f7a, - 0x7e25f81, - 0x7e29f89, - 0x7e3df8a, - 0x7e51f8f, - 0x7e55f94, - 0x7e59f95, - 0x7e5df96, - 0x7e7df97, - 0x7f25f9f, - 0x7f29fc9, - 0x7f45fca, - 0x7f69fd1, - 0x7f6dfda, - 0x7f75fdb, - 0x7f91fdd, - 0x7f99fe4, - 0x7fadfe6, - 0x7fcdfeb, - 0x7fe9ff3, - 0x7ff5ffa, - 0x800dffd, - 0x8046003, - 0x811a011, - 0x811e046, - 0x8132047, - 0x813a04c, - 0x815204e, - 0x8156054, - 0x8162055, - 0x8166058, - 0x816a059, - 0x816e05a, - 0x819205b, - 0x81d2064, - 0x81d6074, - 0x81f6075, - 0x824607d, - 0x826a091, - 0x2826e09a, - 0x827609b, - 0x82ce09d, - 0x82d20b3, - 0x82d60b4, - 0x82da0b5, - 0x831e0b6, - 0x832e0c7, - 0x836e0cb, - 0x83720db, - 0x83a20dc, - 0x84ee0e8, - 0x851613b, - 0x8546145, - 0x8566151, - 0x2856e159, - 0x857615b, - 0x858215d, - 0x8696160, - 0x86a21a5, - 0x86ae1a8, - 0x86ba1ab, - 0x86c61ae, - 0x86d21b1, - 0x86de1b4, - 0x86ea1b7, - 0x86f61ba, - 0x87021bd, - 0x870e1c0, - 0x871a1c3, - 0x87261c6, - 0x87321c9, - 0x873a1cc, - 0x87461ce, - 0x87521d1, - 0x875e1d4, - 0x876a1d7, - 0x87761da, - 0x87821dd, - 0x878e1e0, - 0x879a1e3, - 0x87a61e6, - 0x87b21e9, - 0x87be1ec, - 0x87ea1ef, - 0x87f61fa, - 0x88021fd, - 0x880e200, - 0x881a203, - 0x8826206, - 0x882e209, + 0x2e38b86, + 0x2e54b8e, + 0x2e58b95, + 0x22e5cb96, + 0x2e60b97, + 0x2e64b98, + 0x2e68b99, + 0x2e70b9a, + 0x2e84b9c, + 0x2e88ba1, + 0x2e8cba2, + 0x2eb4ba3, + 0x2eb8bad, + 0x2f2cbae, + 0x2f30bcb, + 0x2f34bcc, + 0x2f54bcd, + 0x2f6cbd5, + 0x2f70bdb, + 0x2f84bdc, + 0x2f9cbe1, + 0x2fbcbe7, + 0x2fd4bef, + 0x2fd8bf5, + 0x2ff4bf6, + 0x3010bfd, + 0x3014c04, + 0x3040c05, + 0x3060c10, + 0x3080c18, + 0x30e4c20, + 0x3104c39, + 0x3120c41, + 0x3124c48, + 0x313cc49, + 0x3180c4f, + 0x3200c60, + 0x3230c80, + 0x3234c8c, + 0x3240c8d, + 0x3260c90, + 0x3264c98, + 0x3288c99, + 0x3290ca2, + 0x32ccca4, + 0x3320cb3, + 0x3324cc8, + 0x3328cc9, + 0x3404cca, + 0x2340cd01, + 0x23410d03, + 0x23414d04, + 0x3418d05, + 0x2341cd06, + 0x23420d07, + 0x3424d08, + 0x23428d09, + 0x23438d0a, + 0x2343cd0e, + 0x23440d0f, + 0x23444d10, + 0x23448d11, + 0x2344cd12, + 0x3464d13, + 0x3488d19, + 0x34a8d22, + 0x3b14d2a, + 0x3b20ec5, + 0x3b40ec8, + 0x3d00ed0, + 0x3dd0f40, + 0x3e40f74, + 0x3e98f90, + 0x3f80fa6, + 0x3fd8fe0, + 0x4014ff6, + 0x4111005, + 0x41dd044, + 0x4275077, + 0x430509d, + 0x43690c1, + 0x45a10da, + 0x4659168, + 0x4725196, + 0x47711c9, + 0x47f91dc, + 0x48351fe, + 0x488520d, + 0x48fd221, + 0x6490123f, + 0x64905240, + 0x64909241, + 0x4985242, + 0x49e1261, + 0x4a5d278, + 0x4ad5297, + 0x4b552b5, + 0x4bc12d5, + 0x4ced2f0, + 0x4d4533b, + 0x64d49351, + 0x4de1352, + 0x4de9378, + 0x24ded37a, + 0x4e7537b, + 0x4ec139d, + 0x4f293b0, + 0x4fd13ca, + 0x50993f4, + 0x5101426, + 0x5215440, + 0x65219485, + 0x6521d486, + 0x5279487, + 0x52d549e, + 0x53654b5, + 0x53e14d9, + 0x54254f8, + 0x5509509, + 0x553d542, + 0x559d54f, + 0x5611567, + 0x5699584, + 0x56d95a6, + 0x57495b6, + 0x6574d5d2, + 0x57755d3, + 0x57795dd, + 0x57a95de, + 0x57c55ea, + 0x58095f1, + 0x5819602, + 0x5831606, + 0x58a960c, + 0x58b162a, + 0x58cd62c, + 0x58e1633, + 0x58fd638, + 0x592963f, + 0x592d64a, + 0x593564b, + 0x594964d, + 0x5969652, + 0x597965a, + 0x598565e, + 0x59c1661, + 0x59c9670, + 0x59dd672, + 0x5a05677, + 0x5a11681, + 0x5a19684, + 0x5a41686, + 0x5a65690, + 0x5a7d699, + 0x5a8169f, + 0x5a896a0, + 0x5a9d6a2, + 0x5b456a7, + 0x5b496d1, + 0x5b4d6d2, + 0x5b516d3, + 0x5b756d4, + 0x5b996dd, + 0x5bb56e6, + 0x5bc96ed, + 0x5bdd6f2, + 0x5be56f7, + 0x5bed6f9, + 0x5bf56fb, + 0x5c0d6fd, + 0x5c1d703, + 0x5c21707, + 0x5c3d708, + 0x64c570f, + 0x64fd931, + 0x652993f, + 0x654594a, + 0x6565951, + 0x6585959, + 0x65c9961, + 0x65d1972, + 0x265d5974, + 0x265d9975, + 0x65e1976, + 0x67cd978, + 0x267d19f3, + 0x67d59f4, + 0x267d99f5, + 0x267e99f6, + 0x267f19fa, + 0x267fd9fc, + 0x68019ff, + 0x26809a00, + 0x6811a02, + 0x6821a04, + 0x6849a08, + 0x6885a12, + 0x6889a21, + 0x68c1a22, + 0x68e5a30, + 0x743da39, + 0x7441d0f, + 0x7445d10, + 0x27449d11, + 0x744dd12, + 0x27451d13, + 0x7455d14, + 0x27461d15, + 0x7465d18, + 0x7469d19, + 0x2746dd1a, + 0x7471d1b, + 0x27479d1c, + 0x747dd1e, + 0x7481d1f, + 0x27491d20, + 0x7495d24, + 0x7499d25, + 0x749dd26, + 0x74a1d27, + 0x274a5d28, + 0x74a9d29, + 0x74add2a, + 0x74b1d2b, + 0x74b5d2c, + 0x274bdd2d, + 0x74c1d2f, + 0x74c5d30, + 0x74c9d31, + 0x274cdd32, + 0x74d1d33, + 0x274d9d34, + 0x274ddd36, + 0x74f9d37, + 0x7511d3e, + 0x7555d44, + 0x7559d55, + 0x757dd56, + 0x7589d5f, + 0x758dd62, + 0x7591d63, + 0x7755d64, + 0x27759dd5, + 0x27761dd6, + 0x27765dd8, + 0x27769dd9, + 0x7771dda, + 0x784dddc, + 0x27859e13, + 0x2785de16, + 0x27861e17, + 0x27865e18, + 0x7869e19, + 0x7895e1a, + 0x78a1e25, + 0x78a5e28, + 0x78c9e29, + 0x78d5e32, + 0x78f5e35, + 0x78f9e3d, + 0x7931e3e, + 0x7be1e4c, + 0x7c9def8, + 0x7ca1f27, + 0x7ca5f28, + 0x7cb9f29, + 0x7cbdf2e, + 0x7cf1f2f, + 0x7d29f3c, + 0x27d2df4a, + 0x7d49f4b, + 0x7d71f52, + 0x7d75f5c, + 0x7d99f5d, + 0x7db5f66, + 0x7dddf6d, + 0x7dedf77, + 0x7df1f7b, + 0x7df5f7c, + 0x7e2df7d, + 0x7e39f8b, + 0x7e61f8e, + 0x7ee1f98, + 0x27ee5fb8, + 0x7ef5fb9, + 0x7f05fbd, + 0x7f21fc1, + 0x7f41fc8, + 0x7f45fd0, + 0x7f59fd1, + 0x7f6dfd6, + 0x7f71fdb, + 0x7f75fdc, + 0x7f79fdd, + 0x7f99fde, + 0x8041fe6, + 0x8046010, + 0x8062011, + 0x808a018, + 0x808e022, + 0x8096023, + 0x80ba025, + 0x80c202e, + 0x80d6030, + 0x80f6035, + 0x811203d, + 0x8122044, + 0x813a048, + 0x817204e, + 0x817605c, + 0x824a05d, + 0x824e092, + 0x8262093, + 0x826a098, + 0x828209a, + 0x82860a0, + 0x82920a1, + 0x829e0a4, + 0x82a20a7, + 0x82a60a8, + 0x82aa0a9, + 0x82ce0aa, + 0x830e0b3, + 0x83120c3, + 0x83320c4, + 0x83820cc, + 0x83ae0e0, + 0x283b20eb, + 0x83ba0ec, + 0x84120ee, + 0x8416104, + 0x841a105, + 0x841e106, + 0x8462107, + 0x8472118, + 0x84b211c, + 0x84b612c, + 0x84e612d, + 0x8632139, + 0x865a18c, + 0x8692196, + 0x86b61a4, + 0x286be1ad, + 0x286c21af, + 0x86ca1b0, + 0x86d61b2, + 0x87f21b5, + 0x87fe1fc, + 0x880a1ff, + 0x8816202, + 0x8822205, + 0x882e208, 0x883a20b, 0x884620e, 0x8852211, @@ -10000,47 +10077,74 @@ var children = [...]uint32{ 0x887621a, 0x888221d, 0x888e220, - 0x889a223, - 0x88a6226, - 0x88b2229, - 0x88be22c, - 0x88ca22f, - 0x88d2232, + 0x8896223, + 0x88a2225, + 0x88ae228, + 0x88ba22b, + 0x88c622e, + 0x88d2231, 0x88de234, 0x88ea237, 0x88f623a, 0x890223d, 0x890e240, 0x891a243, - 0x8926246, - 0x8932249, - 0x893624c, - 0x894224d, - 0x895e250, - 0x8962257, - 0x8972258, - 0x899625c, - 0x899a265, - 0x89de266, - 0x89e2277, - 0x89f6278, - 0x8a2a27d, - 0x8a3a28a, - 0x8a4228e, - 0x8a66290, - 0x8a7e299, - 0x8a9629f, - 0x8aae2a5, - 0x8ac22ab, - 0x28b0a2b0, - 0x8b0e2c2, - 0x8b3a2c3, - 0x8b4a2ce, - 0x8b5e2d2, + 0x8946246, + 0x8952251, + 0x895e254, + 0x896a257, + 0x897625a, + 0x898225d, + 0x898a260, + 0x8996262, + 0x89a2265, + 0x89ae268, + 0x89ba26b, + 0x89c626e, + 0x89d2271, + 0x89de274, + 0x89ea277, + 0x89f627a, + 0x8a0227d, + 0x8a0e280, + 0x8a16283, + 0x8a22285, + 0x8a2a288, + 0x8a3628a, + 0x8a4228d, + 0x8a4e290, + 0x8a5a293, + 0x8a66296, + 0x8a72299, + 0x8a7e29c, + 0x8a8a29f, + 0x8a8e2a2, + 0x8a9a2a3, + 0x8ab62a6, + 0x8aba2ad, + 0x8aca2ae, + 0x8aee2b2, + 0x8af22bb, + 0x8b362bc, + 0x8b3e2cd, + 0x8b522cf, + 0x8b862d4, + 0x8ba22e1, + 0x8baa2e8, + 0x8bce2ea, + 0x8be62f3, + 0x8bfe2f9, + 0x8c162ff, + 0x8c2a305, + 0x28c7230a, + 0x8c7631c, + 0x8ca231d, + 0x8cb2328, + 0x8cc632c, } -// max children 580 (capacity 1023) -// max text offset 30618 (capacity 32767) +// max children 592 (capacity 1023) +// max text offset 30772 (capacity 32767) // max text length 36 (capacity 63) -// max hi 8919 (capacity 16383) -// max lo 8914 (capacity 16383) +// max hi 9009 (capacity 16383) +// max lo 9004 (capacity 16383) diff --git a/vendor/gopkg.in/resty.v1/default.go b/vendor/gopkg.in/resty.v1/default.go deleted file mode 100644 index cc6ae478c..000000000 --- a/vendor/gopkg.in/resty.v1/default.go +++ /dev/null @@ -1,327 +0,0 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. -// resty source code and usage is governed by a MIT style -// license that can be found in the LICENSE file. - -package resty - -import ( - "crypto/tls" - "encoding/json" - "io" - "math" - "net/http" - "net/http/cookiejar" - "net/url" - "os" - "time" - - "golang.org/x/net/publicsuffix" -) - -// DefaultClient of resty -var DefaultClient *Client - -// New method creates a new go-resty client. -func New() *Client { - cookieJar, _ := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List}) - return createClient(&http.Client{Jar: cookieJar}) -} - -// NewWithClient method create a new go-resty client with given `http.Client`. -func NewWithClient(hc *http.Client) *Client { - return createClient(hc) -} - -// R creates a new resty request object, it is used form a HTTP/RESTful request -// such as GET, POST, PUT, DELETE, HEAD, PATCH and OPTIONS. -func R() *Request { - return DefaultClient.R() -} - -// NewRequest is an alias for R(). Creates a new resty request object, it is used form a HTTP/RESTful request -// such as GET, POST, PUT, DELETE, HEAD, PATCH and OPTIONS. -func NewRequest() *Request { - return R() -} - -// SetHostURL sets Host URL. See `Client.SetHostURL for more information. -func SetHostURL(url string) *Client { - return DefaultClient.SetHostURL(url) -} - -// SetHeader sets single header. See `Client.SetHeader` for more information. -func SetHeader(header, value string) *Client { - return DefaultClient.SetHeader(header, value) -} - -// SetHeaders sets multiple headers. See `Client.SetHeaders` for more information. -func SetHeaders(headers map[string]string) *Client { - return DefaultClient.SetHeaders(headers) -} - -// SetCookieJar sets custom http.CookieJar. See `Client.SetCookieJar` for more information. -func SetCookieJar(jar http.CookieJar) *Client { - return DefaultClient.SetCookieJar(jar) -} - -// SetCookie sets single cookie object. See `Client.SetCookie` for more information. -func SetCookie(hc *http.Cookie) *Client { - return DefaultClient.SetCookie(hc) -} - -// SetCookies sets multiple cookie object. See `Client.SetCookies` for more information. -func SetCookies(cs []*http.Cookie) *Client { - return DefaultClient.SetCookies(cs) -} - -// SetQueryParam method sets single parameter and its value. See `Client.SetQueryParam` for more information. -func SetQueryParam(param, value string) *Client { - return DefaultClient.SetQueryParam(param, value) -} - -// SetQueryParams method sets multiple parameters and its value. See `Client.SetQueryParams` for more information. -func SetQueryParams(params map[string]string) *Client { - return DefaultClient.SetQueryParams(params) -} - -// SetFormData method sets Form parameters and its values. See `Client.SetFormData` for more information. -func SetFormData(data map[string]string) *Client { - return DefaultClient.SetFormData(data) -} - -// SetBasicAuth method sets the basic authentication header. See `Client.SetBasicAuth` for more information. -func SetBasicAuth(username, password string) *Client { - return DefaultClient.SetBasicAuth(username, password) -} - -// SetAuthToken method sets bearer auth token header. See `Client.SetAuthToken` for more information. -func SetAuthToken(token string) *Client { - return DefaultClient.SetAuthToken(token) -} - -// OnBeforeRequest method sets request middleware. See `Client.OnBeforeRequest` for more information. -func OnBeforeRequest(m func(*Client, *Request) error) *Client { - return DefaultClient.OnBeforeRequest(m) -} - -// OnAfterResponse method sets response middleware. See `Client.OnAfterResponse` for more information. -func OnAfterResponse(m func(*Client, *Response) error) *Client { - return DefaultClient.OnAfterResponse(m) -} - -// SetPreRequestHook method sets the pre-request hook. See `Client.SetPreRequestHook` for more information. -func SetPreRequestHook(h func(*Client, *Request) error) *Client { - return DefaultClient.SetPreRequestHook(h) -} - -// SetDebug method enables the debug mode. See `Client.SetDebug` for more information. -func SetDebug(d bool) *Client { - return DefaultClient.SetDebug(d) -} - -// SetDebugBodyLimit method sets the response body limit for debug mode. See `Client.SetDebugBodyLimit` for more information. -func SetDebugBodyLimit(sl int64) *Client { - return DefaultClient.SetDebugBodyLimit(sl) -} - -// SetAllowGetMethodPayload method allows the GET method with payload. See `Client.SetAllowGetMethodPayload` for more information. -func SetAllowGetMethodPayload(a bool) *Client { - return DefaultClient.SetAllowGetMethodPayload(a) -} - -// SetRetryCount method sets the retry count. See `Client.SetRetryCount` for more information. -func SetRetryCount(count int) *Client { - return DefaultClient.SetRetryCount(count) -} - -// SetRetryWaitTime method sets the retry wait time. See `Client.SetRetryWaitTime` for more information. -func SetRetryWaitTime(waitTime time.Duration) *Client { - return DefaultClient.SetRetryWaitTime(waitTime) -} - -// SetRetryMaxWaitTime method sets the retry max wait time. See `Client.SetRetryMaxWaitTime` for more information. -func SetRetryMaxWaitTime(maxWaitTime time.Duration) *Client { - return DefaultClient.SetRetryMaxWaitTime(maxWaitTime) -} - -// AddRetryCondition method appends check function for retry. See `Client.AddRetryCondition` for more information. -func AddRetryCondition(condition RetryConditionFunc) *Client { - return DefaultClient.AddRetryCondition(condition) -} - -// SetDisableWarn method disables warning comes from `go-resty` client. See `Client.SetDisableWarn` for more information. -func SetDisableWarn(d bool) *Client { - return DefaultClient.SetDisableWarn(d) -} - -// SetLogger method sets given writer for logging. See `Client.SetLogger` for more information. -func SetLogger(w io.Writer) *Client { - return DefaultClient.SetLogger(w) -} - -// SetContentLength method enables `Content-Length` value. See `Client.SetContentLength` for more information. -func SetContentLength(l bool) *Client { - return DefaultClient.SetContentLength(l) -} - -// SetError method is to register the global or client common `Error` object. See `Client.SetError` for more information. -func SetError(err interface{}) *Client { - return DefaultClient.SetError(err) -} - -// SetRedirectPolicy method sets the client redirect poilicy. See `Client.SetRedirectPolicy` for more information. -func SetRedirectPolicy(policies ...interface{}) *Client { - return DefaultClient.SetRedirectPolicy(policies...) -} - -// SetHTTPMode method sets go-resty mode into HTTP. See `Client.SetMode` for more information. -func SetHTTPMode() *Client { - return DefaultClient.SetHTTPMode() -} - -// SetRESTMode method sets go-resty mode into RESTful. See `Client.SetMode` for more information. -func SetRESTMode() *Client { - return DefaultClient.SetRESTMode() -} - -// Mode method returns the current client mode. See `Client.Mode` for more information. -func Mode() string { - return DefaultClient.Mode() -} - -// SetTLSClientConfig method sets TLSClientConfig for underling client Transport. See `Client.SetTLSClientConfig` for more information. -func SetTLSClientConfig(config *tls.Config) *Client { - return DefaultClient.SetTLSClientConfig(config) -} - -// SetTimeout method sets timeout for request. See `Client.SetTimeout` for more information. -func SetTimeout(timeout time.Duration) *Client { - return DefaultClient.SetTimeout(timeout) -} - -// SetProxy method sets Proxy for request. See `Client.SetProxy` for more information. -func SetProxy(proxyURL string) *Client { - return DefaultClient.SetProxy(proxyURL) -} - -// RemoveProxy method removes the proxy configuration. See `Client.RemoveProxy` for more information. -func RemoveProxy() *Client { - return DefaultClient.RemoveProxy() -} - -// SetCertificates method helps to set client certificates into resty conveniently. -// See `Client.SetCertificates` for more information and example. -func SetCertificates(certs ...tls.Certificate) *Client { - return DefaultClient.SetCertificates(certs...) -} - -// SetRootCertificate method helps to add one or more root certificates into resty client. -// See `Client.SetRootCertificate` for more information. -func SetRootCertificate(pemFilePath string) *Client { - return DefaultClient.SetRootCertificate(pemFilePath) -} - -// SetOutputDirectory method sets output directory. See `Client.SetOutputDirectory` for more information. -func SetOutputDirectory(dirPath string) *Client { - return DefaultClient.SetOutputDirectory(dirPath) -} - -// SetTransport method sets custom `*http.Transport` or any `http.RoundTripper` -// compatible interface implementation in the resty client. -// See `Client.SetTransport` for more information. -func SetTransport(transport http.RoundTripper) *Client { - return DefaultClient.SetTransport(transport) -} - -// SetScheme method sets custom scheme in the resty client. -// See `Client.SetScheme` for more information. -func SetScheme(scheme string) *Client { - return DefaultClient.SetScheme(scheme) -} - -// SetCloseConnection method sets close connection value in the resty client. -// See `Client.SetCloseConnection` for more information. -func SetCloseConnection(close bool) *Client { - return DefaultClient.SetCloseConnection(close) -} - -// SetDoNotParseResponse method instructs `Resty` not to parse the response body automatically. -// See `Client.SetDoNotParseResponse` for more information. -func SetDoNotParseResponse(parse bool) *Client { - return DefaultClient.SetDoNotParseResponse(parse) -} - -// SetPathParams method sets the Request path parameter key-value pairs. See -// `Client.SetPathParams` for more information. -func SetPathParams(params map[string]string) *Client { - return DefaultClient.SetPathParams(params) -} - -// IsProxySet method returns the true if proxy is set on client otherwise false. -// See `Client.IsProxySet` for more information. -func IsProxySet() bool { - return DefaultClient.IsProxySet() -} - -// GetClient method returns the current `http.Client` used by the default resty client. -func GetClient() *http.Client { - return DefaultClient.httpClient -} - -//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// Unexported methods -//___________________________________ - -func createClient(hc *http.Client) *Client { - c := &Client{ - HostURL: "", - QueryParam: url.Values{}, - FormData: url.Values{}, - Header: http.Header{}, - UserInfo: nil, - Token: "", - Cookies: make([]*http.Cookie, 0), - Debug: false, - Log: getLogger(os.Stderr), - RetryCount: 0, - RetryWaitTime: defaultWaitTime, - RetryMaxWaitTime: defaultMaxWaitTime, - JSONMarshal: json.Marshal, - JSONUnmarshal: json.Unmarshal, - jsonEscapeHTML: true, - httpClient: hc, - debugBodySizeLimit: math.MaxInt32, - pathParams: make(map[string]string), - } - - // Log Prefix - c.SetLogPrefix("RESTY ") - - // Default redirect policy - c.SetRedirectPolicy(NoRedirectPolicy()) - - // default before request middlewares - c.beforeRequest = []func(*Client, *Request) error{ - parseRequestURL, - parseRequestHeader, - parseRequestBody, - createHTTPRequest, - addCredentials, - } - - // user defined request middlewares - c.udBeforeRequest = []func(*Client, *Request) error{} - - // default after response middlewares - c.afterResponse = []func(*Client, *Response) error{ - responseLogger, - parseResponseBody, - saveResponseIntoFile, - } - - return c -} - -func init() { - DefaultClient = New() -} diff --git a/vendor/gopkg.in/resty.v1/go.mod b/vendor/gopkg.in/resty.v1/go.mod deleted file mode 100644 index 61341be87..000000000 --- a/vendor/gopkg.in/resty.v1/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module gopkg.in/resty.v1 - -require golang.org/x/net v0.0.0-20181220203305-927f97764cc3 diff --git a/vendor/gopkg.in/resty.v1/request16.go b/vendor/gopkg.in/resty.v1/request16.go deleted file mode 100644 index 079ecfca7..000000000 --- a/vendor/gopkg.in/resty.v1/request16.go +++ /dev/null @@ -1,63 +0,0 @@ -// +build !go1.7 - -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com) -// 2016 Andrew Grigorev (https://github.com/ei-grad) -// All rights reserved. -// resty source code and usage is governed by a MIT style -// license that can be found in the LICENSE file. - -package resty - -import ( - "bytes" - "encoding/json" - "net/http" - "net/url" - "time" -) - -// Request type is used to compose and send individual request from client -// go-resty is provide option override client level settings such as -// Auth Token, Basic Auth credentials, Header, Query Param, Form Data, Error object -// and also you can add more options for that particular request -type Request struct { - URL string - Method string - Token string - QueryParam url.Values - FormData url.Values - Header http.Header - Time time.Time - Body interface{} - Result interface{} - Error interface{} - RawRequest *http.Request - SRV *SRVRecord - UserInfo *User - - isMultiPart bool - isFormData bool - setContentLength bool - isSaveResponse bool - notParseResponse bool - jsonEscapeHTML bool - outputFile string - fallbackContentType string - pathParams map[string]string - client *Client - bodyBuf *bytes.Buffer - multipartFiles []*File - multipartFields []*MultipartField -} - -func (r *Request) addContextIfAvailable() { - // nothing to do for golang<1.7 -} - -func (r *Request) isContextCancelledIfAvailable() bool { - // just always return false golang<1.7 - return false -} - -// for !go1.7 -var noescapeJSONMarshal = json.Marshal diff --git a/vendor/gopkg.in/resty.v1/request17.go b/vendor/gopkg.in/resty.v1/request17.go deleted file mode 100644 index 0629a114c..000000000 --- a/vendor/gopkg.in/resty.v1/request17.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build go1.7 go1.8 - -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com) -// 2016 Andrew Grigorev (https://github.com/ei-grad) -// All rights reserved. -// resty source code and usage is governed by a MIT style -// license that can be found in the LICENSE file. - -package resty - -import ( - "bytes" - "context" - "encoding/json" - "net/http" - "net/url" - "time" -) - -// Request type is used to compose and send individual request from client -// go-resty is provide option override client level settings such as -// Auth Token, Basic Auth credentials, Header, Query Param, Form Data, Error object -// and also you can add more options for that particular request -type Request struct { - URL string - Method string - Token string - QueryParam url.Values - FormData url.Values - Header http.Header - Time time.Time - Body interface{} - Result interface{} - Error interface{} - RawRequest *http.Request - SRV *SRVRecord - UserInfo *User - - isMultiPart bool - isFormData bool - setContentLength bool - isSaveResponse bool - notParseResponse bool - jsonEscapeHTML bool - outputFile string - fallbackContentType string - ctx context.Context - pathParams map[string]string - client *Client - bodyBuf *bytes.Buffer - multipartFiles []*File - multipartFields []*MultipartField -} - -// Context method returns the Context if its already set in request -// otherwise it creates new one using `context.Background()`. -func (r *Request) Context() context.Context { - if r.ctx == nil { - return context.Background() - } - return r.ctx -} - -// SetContext method sets the context.Context for current Request. It allows -// to interrupt the request execution if ctx.Done() channel is closed. -// See https://blog.golang.org/context article and the "context" package -// documentation. -func (r *Request) SetContext(ctx context.Context) *Request { - r.ctx = ctx - return r -} - -func (r *Request) addContextIfAvailable() { - if r.ctx != nil { - r.RawRequest = r.RawRequest.WithContext(r.ctx) - } -} - -func (r *Request) isContextCancelledIfAvailable() bool { - if r.ctx != nil { - if r.ctx.Err() != nil { - return true - } - } - return false -} - -// for go1.7+ -var noescapeJSONMarshal = func(v interface{}) ([]byte, error) { - buf := acquireBuffer() - defer releaseBuffer(buf) - encoder := json.NewEncoder(buf) - encoder.SetEscapeHTML(false) - err := encoder.Encode(v) - return buf.Bytes(), err -} diff --git a/vendor/gopkg.in/resty.v1/resty.go b/vendor/gopkg.in/resty.v1/resty.go deleted file mode 100644 index 9a32463d7..000000000 --- a/vendor/gopkg.in/resty.v1/resty.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. -// resty source code and usage is governed by a MIT style -// license that can be found in the LICENSE file. - -// Package resty provides Simple HTTP and REST client library for Go. -package resty - -// Version # of resty -const Version = "1.12.0" diff --git a/vendor/gopkg.in/resty.v1/retry.go b/vendor/gopkg.in/resty.v1/retry.go deleted file mode 100644 index 4ed9b6d60..000000000 --- a/vendor/gopkg.in/resty.v1/retry.go +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) 2015-2019 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. -// resty source code and usage is governed by a MIT style -// license that can be found in the LICENSE file. - -package resty - -import ( - "math" - "math/rand" - "time" -) - -const ( - defaultMaxRetries = 3 - defaultWaitTime = time.Duration(100) * time.Millisecond - defaultMaxWaitTime = time.Duration(2000) * time.Millisecond -) - -type ( - // Option is to create convenient retry options like wait time, max retries, etc. - Option func(*Options) - - // RetryConditionFunc type is for retry condition function - RetryConditionFunc func(*Response) (bool, error) - - // Options to hold go-resty retry values - Options struct { - maxRetries int - waitTime time.Duration - maxWaitTime time.Duration - retryConditions []RetryConditionFunc - } -) - -// Retries sets the max number of retries -func Retries(value int) Option { - return func(o *Options) { - o.maxRetries = value - } -} - -// WaitTime sets the default wait time to sleep between requests -func WaitTime(value time.Duration) Option { - return func(o *Options) { - o.waitTime = value - } -} - -// MaxWaitTime sets the max wait time to sleep between requests -func MaxWaitTime(value time.Duration) Option { - return func(o *Options) { - o.maxWaitTime = value - } -} - -// RetryConditions sets the conditions that will be checked for retry. -func RetryConditions(conditions []RetryConditionFunc) Option { - return func(o *Options) { - o.retryConditions = conditions - } -} - -// Backoff retries with increasing timeout duration up until X amount of retries -// (Default is 3 attempts, Override with option Retries(n)) -func Backoff(operation func() (*Response, error), options ...Option) error { - // Defaults - opts := Options{ - maxRetries: defaultMaxRetries, - waitTime: defaultWaitTime, - maxWaitTime: defaultMaxWaitTime, - retryConditions: []RetryConditionFunc{}, - } - - for _, o := range options { - o(&opts) - } - - var ( - resp *Response - err error - ) - base := float64(opts.waitTime) // Time to wait between each attempt - capLevel := float64(opts.maxWaitTime) // Maximum amount of wait time for the retry - for attempt := 0; attempt < opts.maxRetries; attempt++ { - resp, err = operation() - - var needsRetry bool - var conditionErr error - for _, condition := range opts.retryConditions { - needsRetry, conditionErr = condition(resp) - if needsRetry || conditionErr != nil { - break - } - } - - // If the operation returned no error, there was no condition satisfied and - // there was no error caused by the conditional functions. - if err == nil && !needsRetry && conditionErr == nil { - return nil - } - // Adding capped exponential backup with jitter - // See the following article... - // http://www.awsarchitectureblog.com/2015/03/backoff.html - temp := math.Min(capLevel, base*math.Exp2(float64(attempt))) - ri := int(temp / 2) - if ri <= 0 { - ri = 1<<31 - 1 // max int for arch 386 - } - sleepDuration := time.Duration(math.Abs(float64(ri + rand.Intn(ri)))) - - if sleepDuration < opts.waitTime { - sleepDuration = opts.waitTime - } - time.Sleep(sleepDuration) - } - - return err -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 96f498450..1d5e99115 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -222,6 +222,8 @@ github.com/go-ini/ini # github.com/go-ole/go-ole v1.2.4 github.com/go-ole/go-ole github.com/go-ole/go-ole/oleutil +# github.com/go-resty/resty/v2 v2.3.0 +github.com/go-resty/resty/v2 # github.com/gobwas/glob v0.2.3 github.com/gobwas/glob github.com/gobwas/glob/compiler @@ -435,8 +437,10 @@ github.com/klauspost/pgzip github.com/konsorten/go-windows-terminal-sequences # github.com/kr/fs v0.0.0-20131111012553-2788f0dbd169 github.com/kr/fs -# github.com/linode/linodego v0.7.1 +# github.com/linode/linodego v0.14.0 github.com/linode/linodego +github.com/linode/linodego/internal/duration +github.com/linode/linodego/internal/parseabletime # github.com/masterzen/azure-sdk-for-go v0.0.0-20161014135628-ee4f0065d00c github.com/masterzen/azure-sdk-for-go/core/http github.com/masterzen/azure-sdk-for-go/core/tls @@ -702,7 +706,7 @@ golang.org/x/mobile/event/key # golang.org/x/mod v0.2.0 golang.org/x/mod/module golang.org/x/mod/semver -# golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e +# golang.org/x/net v0.0.0-20200602114024-627f9648deb9 golang.org/x/net/context golang.org/x/net/context/ctxhttp golang.org/x/net/html @@ -851,8 +855,6 @@ google.golang.org/grpc/status google.golang.org/grpc/tap # gopkg.in/ini.v1 v1.42.0 gopkg.in/ini.v1 -# gopkg.in/resty.v1 v1.12.0 -gopkg.in/resty.v1 # gopkg.in/square/go-jose.v2 v2.3.1 gopkg.in/square/go-jose.v2 gopkg.in/square/go-jose.v2/cipher