From 91c05bd118ac9566be26251b71cba9bc05ce43e1 Mon Sep 17 00:00:00 2001 From: DJ Date: Thu, 14 Apr 2022 18:33:32 +0900 Subject: [PATCH] Upgrade dependency (#13) * upgrade simpleresty to v0.3.0 * update vendor --- .github/workflows/ci.yml | 2 +- go.mod | 19 +- go.sum | 39 +- vendor/github.com/davecgh/go-spew/LICENSE | 2 +- .../github.com/davecgh/go-spew/spew/bypass.go | 187 +- .../davecgh/go-spew/spew/bypasssafe.go | 2 +- .../github.com/davecgh/go-spew/spew/common.go | 2 +- .../github.com/davecgh/go-spew/spew/dump.go | 10 +- .../github.com/davecgh/go-spew/spew/format.go | 4 +- .../davidji99/simpleresty/README.md | 53 +- .../davidji99/simpleresty/client.go | 49 + .../github.com/davidji99/simpleresty/go.mod | 9 - .../github.com/davidji99/simpleresty/go.sum | 21 - .../davidji99/simpleresty/helper.go | 18 + .../github.com/davidji99/simpleresty/oauth.go | 54 + .../github.com/davidji99/simpleresty/proxy.go | 99 + .../davidji99/simpleresty/response.go | 1 + .../davidji99/simpleresty/simpleresty.go | 24 +- .../github.com/go-resty/resty/v2/.gitignore | 3 +- .../github.com/go-resty/resty/v2/.travis.yml | 8 +- vendor/github.com/go-resty/resty/v2/LICENSE | 2 +- vendor/github.com/go-resty/resty/v2/README.md | 171 +- vendor/github.com/go-resty/resty/v2/client.go | 259 +- vendor/github.com/go-resty/resty/v2/go.mod | 5 - .../go-resty/resty/v2/middleware.go | 86 +- .../github.com/go-resty/resty/v2/redirect.go | 2 +- .../github.com/go-resty/resty/v2/request.go | 154 +- .../github.com/go-resty/resty/v2/response.go | 23 +- vendor/github.com/go-resty/resty/v2/resty.go | 4 +- vendor/github.com/go-resty/resty/v2/retry.go | 99 +- vendor/github.com/go-resty/resty/v2/trace.go | 47 +- .../github.com/go-resty/resty/v2/transport.go | 35 + .../go-resty/resty/v2/transport112.go | 34 + vendor/github.com/go-resty/resty/v2/util.go | 40 +- vendor/github.com/stretchr/testify/LICENSE | 2 +- .../testify/assert/assertion_compare.go | 394 + .../testify/assert/assertion_format.go | 215 +- .../testify/assert/assertion_forward.go | 412 +- .../testify/assert/assertion_order.go | 332 +- .../stretchr/testify/assert/assertions.go | 488 +- .../testify/assert/forward_assertions.go | 2 +- .../testify/assert/http_assertions.go | 25 +- vendor/golang.org/x/net/context/go17.go | 1 + vendor/golang.org/x/net/context/go19.go | 1 + vendor/golang.org/x/net/context/pre_go17.go | 1 + vendor/golang.org/x/net/context/pre_go19.go | 1 + vendor/golang.org/x/net/publicsuffix/table.go | 19837 ++++++++-------- vendor/golang.org/x/oauth2/README.md | 13 +- .../x/oauth2/bitbucket/bitbucket.go | 16 + .../clientcredentials/clientcredentials.go | 120 + vendor/golang.org/x/oauth2/go.mod | 10 - vendor/golang.org/x/oauth2/go.sum | 12 - vendor/golang.org/x/oauth2/transport.go | 79 +- vendor/gopkg.in/yaml.v2/.travis.yml | 12 - vendor/gopkg.in/yaml.v2/LICENSE | 201 - vendor/gopkg.in/yaml.v2/decode.go | 775 - vendor/gopkg.in/yaml.v2/encode.go | 390 - vendor/gopkg.in/yaml.v2/go.mod | 5 - vendor/gopkg.in/yaml.v2/writerc.go | 26 - .../LICENSE.libyaml => yaml.v3/LICENSE} | 39 +- vendor/gopkg.in/{yaml.v2 => yaml.v3}/NOTICE | 0 .../gopkg.in/{yaml.v2 => yaml.v3}/README.md | 31 +- vendor/gopkg.in/{yaml.v2 => yaml.v3}/apic.go | 56 +- vendor/gopkg.in/yaml.v3/decode.go | 950 + .../gopkg.in/{yaml.v2 => yaml.v3}/emitterc.go | 413 +- vendor/gopkg.in/yaml.v3/encode.go | 577 + .../gopkg.in/{yaml.v2 => yaml.v3}/parserc.go | 156 +- .../gopkg.in/{yaml.v2 => yaml.v3}/readerc.go | 24 +- .../gopkg.in/{yaml.v2 => yaml.v3}/resolve.go | 140 +- .../gopkg.in/{yaml.v2 => yaml.v3}/scannerc.go | 476 +- .../gopkg.in/{yaml.v2 => yaml.v3}/sorter.go | 25 +- vendor/gopkg.in/yaml.v3/writerc.go | 48 + vendor/gopkg.in/{yaml.v2 => yaml.v3}/yaml.go | 342 +- vendor/gopkg.in/{yaml.v2 => yaml.v3}/yamlh.go | 81 +- .../{yaml.v2 => yaml.v3}/yamlprivateh.go | 37 +- vendor/modules.txt | 29 +- 76 files changed, 16024 insertions(+), 12337 deletions(-) delete mode 100644 vendor/github.com/davidji99/simpleresty/go.mod delete mode 100644 vendor/github.com/davidji99/simpleresty/go.sum create mode 100644 vendor/github.com/davidji99/simpleresty/helper.go create mode 100644 vendor/github.com/davidji99/simpleresty/oauth.go create mode 100644 vendor/github.com/davidji99/simpleresty/proxy.go delete mode 100644 vendor/github.com/go-resty/resty/v2/go.mod create mode 100644 vendor/github.com/go-resty/resty/v2/transport.go create mode 100644 vendor/github.com/go-resty/resty/v2/transport112.go create mode 100644 vendor/github.com/stretchr/testify/assert/assertion_compare.go create mode 100644 vendor/golang.org/x/oauth2/bitbucket/bitbucket.go create mode 100644 vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go delete mode 100644 vendor/golang.org/x/oauth2/go.mod delete mode 100644 vendor/golang.org/x/oauth2/go.sum delete mode 100644 vendor/gopkg.in/yaml.v2/.travis.yml delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE delete mode 100644 vendor/gopkg.in/yaml.v2/decode.go delete mode 100644 vendor/gopkg.in/yaml.v2/encode.go delete mode 100644 vendor/gopkg.in/yaml.v2/go.mod delete mode 100644 vendor/gopkg.in/yaml.v2/writerc.go rename vendor/gopkg.in/{yaml.v2/LICENSE.libyaml => yaml.v3/LICENSE} (51%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/NOTICE (100%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/README.md (66%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/apic.go (93%) create mode 100644 vendor/gopkg.in/yaml.v3/decode.go rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/emitterc.go (80%) create mode 100644 vendor/gopkg.in/yaml.v3/encode.go rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/parserc.go (85%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/readerc.go (91%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/resolve.go (59%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/scannerc.go (84%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/sorter.go (76%) create mode 100644 vendor/gopkg.in/yaml.v3/writerc.go rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/yaml.go (55%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/yamlh.go (88%) rename vendor/gopkg.in/{yaml.v2 => yaml.v3}/yamlprivateh.go (78%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ba52fd1..b836993 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ jobs: test: strategy: matrix: - go-version: [1.12.x, 1.13.x, 1.14.x] + go-version: [1.16.x, 1.17.x, 1.18.x] platform: [ubuntu-latest] runs-on: ${{ matrix.platform }} diff --git a/go.mod b/go.mod index 9924164..c37e4a9 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,20 @@ module github.com/davidji99/bitbucket-go require ( - github.com/davidji99/simpleresty v0.2.1 - github.com/stretchr/testify v1.4.0 - golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 + github.com/davidji99/simpleresty v0.3.0 + github.com/stretchr/testify v1.7.0 + golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d ) -go 1.13 +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/davidji99/go-querystring v1.0.2 // indirect + github.com/go-resty/resty/v2 v2.6.0 // indirect + github.com/golang/protobuf v1.2.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 // indirect + google.golang.org/appengine v1.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +) + +go 1.18 diff --git a/go.sum b/go.sum index c6bdf12..b469964 100644 --- a/go.sum +++ b/go.sum @@ -1,34 +1,41 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidji99/go-querystring v1.0.2 h1:zZUgCkhdFEsb0b1tS1zhn7FwjoRyp33J3be1av5sBi0= github.com/davidji99/go-querystring v1.0.2/go.mod h1:67KzURpYgsT0d/eszawoSvtpI+34vczasEK3xgrxrqA= -github.com/davidji99/simpleresty v0.2.1 h1:yTyP0iPCEQebr4VUJNrIqzcs8nh/E7QzL0KCLnMGYA0= -github.com/davidji99/simpleresty v0.2.1/go.mod h1:B1ZRSWhCx53BHzjc5i9r0Tp11aH6Q8KmdbiR/VINnWw= -github.com/go-resty/resty/v2 v2.2.0 h1:vgZ1cdblp8Aw4jZj3ZsKh6yKAlMg3CHMrqFSFFd+jgY= -github.com/go-resty/resty/v2 v2.2.0/go.mod h1:nYW/8rxqQCmI3bPz9Fsmjbr2FBjGuR2Mzt6kDh3zZ7w= +github.com/davidji99/simpleresty v0.3.0 h1:LXOav6OJwF+25M3yrFec6kqwWLVrrTp2TRZWBCuFeUc= +github.com/davidji99/simpleresty v0.3.0/go.mod h1:swW46D95huJNFeXlswYqwgvLk7D/GeagbPzL/MdEKek= +github.com/go-resty/resty/v2 v2.6.0 h1:joIR5PNLM2EFqqESUjCMGXrWmXNHEU9CEiK813oKYS4= +github.com/go-resty/resty/v2 v2.6.0/go.mod h1:PwvJS6hvaPkjtjNg9ph+VrSD92bi5Zq73w/BIH7cC3Q= 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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 h1:MsuvTghUPjX762sGLnGsxC3HM0B5r83wEtYcYR8/vRs= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 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/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.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/github.com/davecgh/go-spew/LICENSE b/vendor/github.com/davecgh/go-spew/LICENSE index c836416..bc52e96 100644 --- a/vendor/github.com/davecgh/go-spew/LICENSE +++ b/vendor/github.com/davecgh/go-spew/LICENSE @@ -2,7 +2,7 @@ ISC License Copyright (c) 2012-2016 Dave Collins -Permission to use, copy, modify, and distribute this software for any +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. diff --git a/vendor/github.com/davecgh/go-spew/spew/bypass.go b/vendor/github.com/davecgh/go-spew/spew/bypass.go index 8a4a658..7929947 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypass.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypass.go @@ -16,7 +16,9 @@ // when the code is not running on Google App Engine, compiled by GopherJS, and // "-tags safe" is not added to the go build command line. The "disableunsafe" // tag is deprecated and thus should not be used. -// +build !js,!appengine,!safe,!disableunsafe +// Go versions prior to 1.4 are disabled because they use a different layout +// for interfaces which make the implementation of unsafeReflectValue more complex. +// +build !js,!appengine,!safe,!disableunsafe,go1.4 package spew @@ -34,80 +36,49 @@ const ( ptrSize = unsafe.Sizeof((*byte)(nil)) ) +type flag uintptr + var ( - // offsetPtr, offsetScalar, and offsetFlag are the offsets for the - // internal reflect.Value fields. These values are valid before golang - // commit ecccf07e7f9d which changed the format. The are also valid - // after commit 82f48826c6c7 which changed the format again to mirror - // the original format. Code in the init function updates these offsets - // as necessary. - offsetPtr = uintptr(ptrSize) - offsetScalar = uintptr(0) - offsetFlag = uintptr(ptrSize * 2) - - // flagKindWidth and flagKindShift indicate various bits that the - // reflect package uses internally to track kind information. - // - // flagRO indicates whether or not the value field of a reflect.Value is - // read-only. - // - // flagIndir indicates whether the value field of a reflect.Value is - // the actual data or a pointer to the data. - // - // These values are valid before golang commit 90a7c3c86944 which - // changed their positions. Code in the init function updates these - // flags as necessary. - flagKindWidth = uintptr(5) - flagKindShift = uintptr(flagKindWidth - 1) - flagRO = uintptr(1 << 0) - flagIndir = uintptr(1 << 1) + // flagRO indicates whether the value field of a reflect.Value + // is read-only. + flagRO flag + + // flagAddr indicates whether the address of the reflect.Value's + // value may be taken. + flagAddr flag ) -func init() { - // Older versions of reflect.Value stored small integers directly in the - // ptr field (which is named val in the older versions). Versions - // between commits ecccf07e7f9d and 82f48826c6c7 added a new field named - // scalar for this purpose which unfortunately came before the flag - // field, so the offset of the flag field is different for those - // versions. - // - // This code constructs a new reflect.Value from a known small integer - // and checks if the size of the reflect.Value struct indicates it has - // the scalar field. When it does, the offsets are updated accordingly. - vv := reflect.ValueOf(0xf00) - if unsafe.Sizeof(vv) == (ptrSize * 4) { - offsetScalar = ptrSize * 2 - offsetFlag = ptrSize * 3 - } +// flagKindMask holds the bits that make up the kind +// part of the flags field. In all the supported versions, +// it is in the lower 5 bits. +const flagKindMask = flag(0x1f) - // Commit 90a7c3c86944 changed the flag positions such that the low - // order bits are the kind. This code extracts the kind from the flags - // field and ensures it's the correct type. When it's not, the flag - // order has been changed to the newer format, so the flags are updated - // accordingly. - upf := unsafe.Pointer(uintptr(unsafe.Pointer(&vv)) + offsetFlag) - upfv := *(*uintptr)(upf) - flagKindMask := uintptr((1<>flagKindShift != uintptr(reflect.Int) { - flagKindShift = 0 - flagRO = 1 << 5 - flagIndir = 1 << 6 - - // Commit adf9b30e5594 modified the flags to separate the - // flagRO flag into two bits which specifies whether or not the - // field is embedded. This causes flagIndir to move over a bit - // and means that flagRO is the combination of either of the - // original flagRO bit and the new bit. - // - // This code detects the change by extracting what used to be - // the indirect bit to ensure it's set. When it's not, the flag - // order has been changed to the newer format, so the flags are - // updated accordingly. - if upfv&flagIndir == 0 { - flagRO = 3 << 5 - flagIndir = 1 << 7 - } +// Different versions of Go have used different +// bit layouts for the flags type. This table +// records the known combinations. +var okFlags = []struct { + ro, addr flag +}{{ + // From Go 1.4 to 1.5 + ro: 1 << 5, + addr: 1 << 7, +}, { + // Up to Go tip. + ro: 1<<5 | 1<<6, + addr: 1 << 8, +}} + +var flagValOffset = func() uintptr { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") } + return field.Offset +}() + +// flagField returns a pointer to the flag field of a reflect.Value. +func flagField(v *reflect.Value) *flag { + return (*flag)(unsafe.Pointer(uintptr(unsafe.Pointer(v)) + flagValOffset)) } // unsafeReflectValue converts the passed reflect.Value into a one that bypasses @@ -119,34 +90,56 @@ func init() { // This allows us to check for implementations of the Stringer and error // interfaces to be used for pretty printing ordinarily unaddressable and // inaccessible values such as unexported struct fields. -func unsafeReflectValue(v reflect.Value) (rv reflect.Value) { - indirects := 1 - vt := v.Type() - upv := unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetPtr) - rvf := *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + offsetFlag)) - if rvf&flagIndir != 0 { - vt = reflect.PtrTo(v.Type()) - indirects++ - } else if offsetScalar != 0 { - // The value is in the scalar field when it's not one of the - // reference types. - switch vt.Kind() { - case reflect.Uintptr: - case reflect.Chan: - case reflect.Func: - case reflect.Map: - case reflect.Ptr: - case reflect.UnsafePointer: - default: - upv = unsafe.Pointer(uintptr(unsafe.Pointer(&v)) + - offsetScalar) - } +func unsafeReflectValue(v reflect.Value) reflect.Value { + if !v.IsValid() || (v.CanInterface() && v.CanAddr()) { + return v } + flagFieldPtr := flagField(&v) + *flagFieldPtr &^= flagRO + *flagFieldPtr |= flagAddr + return v +} - pv := reflect.NewAt(vt, upv) - rv = pv - for i := 0; i < indirects; i++ { - rv = rv.Elem() +// Sanity checks against future reflect package changes +// to the type or semantics of the Value.flag field. +func init() { + field, ok := reflect.TypeOf(reflect.Value{}).FieldByName("flag") + if !ok { + panic("reflect.Value has no flag field") + } + if field.Type.Kind() != reflect.TypeOf(flag(0)).Kind() { + panic("reflect.Value flag field has changed kind") + } + type t0 int + var t struct { + A t0 + // t0 will have flagEmbedRO set. + t0 + // a will have flagStickyRO set + a t0 + } + vA := reflect.ValueOf(t).FieldByName("A") + va := reflect.ValueOf(t).FieldByName("a") + vt0 := reflect.ValueOf(t).FieldByName("t0") + + // Infer flagRO from the difference between the flags + // for the (otherwise identical) fields in t. + flagPublic := *flagField(&vA) + flagWithRO := *flagField(&va) | *flagField(&vt0) + flagRO = flagPublic ^ flagWithRO + + // Infer flagAddr from the difference between a value + // taken from a pointer and not. + vPtrA := reflect.ValueOf(&t).Elem().FieldByName("A") + flagNoPtr := *flagField(&vA) + flagPtr := *flagField(&vPtrA) + flagAddr = flagNoPtr ^ flagPtr + + // Check that the inferred flags tally with one of the known versions. + for _, f := range okFlags { + if flagRO == f.ro && flagAddr == f.addr { + return + } } - return rv + panic("reflect.Value read-only flag has changed semantics") } diff --git a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go index 1fe3cf3..205c28d 100644 --- a/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go +++ b/vendor/github.com/davecgh/go-spew/spew/bypasssafe.go @@ -16,7 +16,7 @@ // when the code is running on Google App Engine, compiled by GopherJS, or // "-tags safe" is added to the go build command line. The "disableunsafe" // tag is deprecated and thus should not be used. -// +build js appengine safe disableunsafe +// +build js appengine safe disableunsafe !go1.4 package spew diff --git a/vendor/github.com/davecgh/go-spew/spew/common.go b/vendor/github.com/davecgh/go-spew/spew/common.go index 7c519ff..1be8ce9 100644 --- a/vendor/github.com/davecgh/go-spew/spew/common.go +++ b/vendor/github.com/davecgh/go-spew/spew/common.go @@ -180,7 +180,7 @@ func printComplex(w io.Writer, c complex128, floatPrecision int) { w.Write(closeParenBytes) } -// printHexPtr outputs a uintptr formatted as hexidecimal with a leading '0x' +// printHexPtr outputs a uintptr formatted as hexadecimal with a leading '0x' // prefix to Writer w. func printHexPtr(w io.Writer, p uintptr) { // Null pointer. diff --git a/vendor/github.com/davecgh/go-spew/spew/dump.go b/vendor/github.com/davecgh/go-spew/spew/dump.go index df1d582..f78d89f 100644 --- a/vendor/github.com/davecgh/go-spew/spew/dump.go +++ b/vendor/github.com/davecgh/go-spew/spew/dump.go @@ -35,16 +35,16 @@ var ( // cCharRE is a regular expression that matches a cgo char. // It is used to detect character arrays to hexdump them. - cCharRE = regexp.MustCompile("^.*\\._Ctype_char$") + cCharRE = regexp.MustCompile(`^.*\._Ctype_char$`) // cUnsignedCharRE is a regular expression that matches a cgo unsigned // char. It is used to detect unsigned character arrays to hexdump // them. - cUnsignedCharRE = regexp.MustCompile("^.*\\._Ctype_unsignedchar$") + cUnsignedCharRE = regexp.MustCompile(`^.*\._Ctype_unsignedchar$`) // cUint8tCharRE is a regular expression that matches a cgo uint8_t. // It is used to detect uint8_t arrays to hexdump them. - cUint8tCharRE = regexp.MustCompile("^.*\\._Ctype_uint8_t$") + cUint8tCharRE = regexp.MustCompile(`^.*\._Ctype_uint8_t$`) ) // dumpState contains information about the state of a dump operation. @@ -143,10 +143,10 @@ func (d *dumpState) dumpPtr(v reflect.Value) { // Display dereferenced value. d.w.Write(openParenBytes) switch { - case nilFound == true: + case nilFound: d.w.Write(nilAngleBytes) - case cycleFound == true: + case cycleFound: d.w.Write(circularBytes) default: diff --git a/vendor/github.com/davecgh/go-spew/spew/format.go b/vendor/github.com/davecgh/go-spew/spew/format.go index c49875b..b04edb7 100644 --- a/vendor/github.com/davecgh/go-spew/spew/format.go +++ b/vendor/github.com/davecgh/go-spew/spew/format.go @@ -182,10 +182,10 @@ func (f *formatState) formatPtr(v reflect.Value) { // Display dereferenced value. switch { - case nilFound == true: + case nilFound: f.fs.Write(nilAngleBytes) - case cycleFound == true: + case cycleFound: f.fs.Write(circularShortBytes) default: diff --git a/vendor/github.com/davidji99/simpleresty/README.md b/vendor/github.com/davidji99/simpleresty/README.md index 998d54d..506a34e 100644 --- a/vendor/github.com/davidji99/simpleresty/README.md +++ b/vendor/github.com/davidji99/simpleresty/README.md @@ -5,32 +5,59 @@ A simple wrapper around [go-resty](https://github.com/go-resty/resty). ## Background -Having used go-resty to create clients for various service APIs, I noticed a common set of methods I would define in each -API client. I extracted those methods/function and moved them into this separate library. This way, all my clients could benefit -from using a single library to interface with the APIs. +Having used [go-resty](https://github.com/go-resty/resty) to create clients for various service APIs, +I noticed a common set of methods/functions I would define in each API client. I extracted those methods/functions +and moved them into this separate library. This way, all my clients could benefit from using a single library to +interface with the APIs. I have embedded `resty.Client` into `simpleresty.Client` so all of `resty`'s functions/methods are available to the user. In fact, `simpleresty.New()` returns a `resty.Client`. ## Example - ```go +package main + +import ( + "fmt" + "github.com/davidji99/simpleresty" +) + type GithubAPIResponse struct { - CurrentUserURL string `json:"current_user_url,omitempty"` + CurrentUserURL string `json:"current_user_url,omitempty"` } -c := simpleresty.New() -c.SetBaseURL("https://api.github.com/") +func main() { + c := simpleresty.New() -var result *GithubAPIResponse -response, getErr := c.Get("", result, nil) + var result *GithubAPIResponse + response, getErr := c.Get("https://api.github.com", &result, nil) + if getErr != nil { + panic(getErr) + } -fmt.Println(getErr) - -fmt.Println(response.StatusCode) -fmt.Println(result.CurrentUserURL) + fmt.Println(response.StatusCode) // Returns 200 + fmt.Println(result.CurrentUserURL) // Returns 'https://api.github.com/user' +} ``` +Additional examples can be found in the `/examples` folder. + +You can also check out [rollrest-go](https://github.com/davidji99/rollrest-go), which uses this library to implement +an API rest client for Rollbar. + +## Proxy + +`simpleresty` respects any proxy URLs set in your environment in this order of preference: +1. `HTTPS_PROXY` +1. `https_proxy` +1. `HTTP_PROXY` +1. `http_proxy` + +Only a single value from one of the above four environment variables will be used to set the proxy URL on the `Client`. + +`simpleresty` will also respect domains (not IP addresses or CIDR ranges) defined by the `NO_PROXY` or `no_proxy` +environment variable. Multiple domains must be separated by a comma. + ## Go-Resty As this pkg is a thin wrapper around go-resty, all of its methods are available to use in this package. Please refer to [go-resty's documentation](https://github.com/go-resty/resty) for more information. \ No newline at end of file diff --git a/vendor/github.com/davidji99/simpleresty/client.go b/vendor/github.com/davidji99/simpleresty/client.go index 3dbfde0..77f30e9 100644 --- a/vendor/github.com/davidji99/simpleresty/client.go +++ b/vendor/github.com/davidji99/simpleresty/client.go @@ -3,6 +3,7 @@ package simpleresty import ( "fmt" "github.com/go-resty/resty/v2" + "strings" ) const ( @@ -19,12 +20,25 @@ type Client struct { // baseURL for the API endpoint. Please include a trailing slash '/'. baseURL string + + // noProxyDomains contains a list of domains that don't require a proxy. + noProxyDomains []string + + // proxyURL represents a proxy URL. + proxyURL *string + + // shouldSetProxy stores a boolean value that determines if a proxy needs to be used. + shouldSetProxy bool } // Dispatch method is a wrapper around the send method which // performs the HTTP request using the method and URL already defined. func (c *Client) Dispatch(request *resty.Request) (*Response, error) { + // Set Proxy if applicable + c.determineSetProxy() + response, err := request.Send() + if err != nil { return nil, err } @@ -94,6 +108,9 @@ func (c *Client) Delete(url string, r, body interface{}) (*Response, error) { // ConstructRequest creates a new request. func (c *Client) ConstructRequest(r, body interface{}) *resty.Request { + // Set Proxy if applicable + c.determineSetProxy() + req := c.R().SetBody(body) if r != nil { @@ -105,6 +122,11 @@ func (c *Client) ConstructRequest(r, body interface{}) *resty.Request { // RequestURL appends the template argument to the base URL and returns the full request URL. func (c *Client) RequestURL(template string, args ...interface{}) string { + // Validate to make sure baseURL is set + if c.baseURL == "" { + panic("base URL not set") + } + if len(args) == 1 && args[0] == "" { return c.baseURL + template } @@ -123,3 +145,30 @@ func (c *Client) RequestURLWithQueryParams(url string, opts ...interface{}) (str func (c *Client) SetBaseURL(url string) { c.baseURL = url } + +// determineSetProxy first checks if proxy is already set or not. If it is, this method returns early. +// +// If no proxy is set, it will be set if the proxyURL is defined and the base domain is not present +// in the noProxyDomains string array. +func (c *Client) determineSetProxy() { + // If proxy is already set in a previous execution, short circuit this method call. + if c.IsProxySet() { + return + } + + if c.proxyURL != nil { + c.shouldSetProxy = true + + // Loop through noProxyDomains and check if the base url doesn't need a proxy set for the Client. + for _, d := range c.noProxyDomains { + if strings.Contains(strings.ToLower(c.baseURL), d) { + c.shouldSetProxy = false + break + } + } + + if c.shouldSetProxy { + c.SetProxy(*c.proxyURL) + } + } +} diff --git a/vendor/github.com/davidji99/simpleresty/go.mod b/vendor/github.com/davidji99/simpleresty/go.mod deleted file mode 100644 index 2ad27b4..0000000 --- a/vendor/github.com/davidji99/simpleresty/go.mod +++ /dev/null @@ -1,9 +0,0 @@ -module github.com/davidji99/simpleresty - -go 1.13 - -require ( - github.com/davidji99/go-querystring v1.0.2 - github.com/go-resty/resty/v2 v2.2.0 - github.com/stretchr/testify v1.4.0 -) diff --git a/vendor/github.com/davidji99/simpleresty/go.sum b/vendor/github.com/davidji99/simpleresty/go.sum deleted file mode 100644 index 67b3229..0000000 --- a/vendor/github.com/davidji99/simpleresty/go.sum +++ /dev/null @@ -1,21 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidji99/go-querystring v1.0.2 h1:zZUgCkhdFEsb0b1tS1zhn7FwjoRyp33J3be1av5sBi0= -github.com/davidji99/go-querystring v1.0.2/go.mod h1:67KzURpYgsT0d/eszawoSvtpI+34vczasEK3xgrxrqA= -github.com/go-resty/resty/v2 v2.2.0 h1:vgZ1cdblp8Aw4jZj3ZsKh6yKAlMg3CHMrqFSFFd+jgY= -github.com/go-resty/resty/v2 v2.2.0/go.mod h1:nYW/8rxqQCmI3bPz9Fsmjbr2FBjGuR2Mzt6kDh3zZ7w= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 h1:MsuvTghUPjX762sGLnGsxC3HM0B5r83wEtYcYR8/vRs= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -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/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/davidji99/simpleresty/helper.go b/vendor/github.com/davidji99/simpleresty/helper.go new file mode 100644 index 0000000..442c1ba --- /dev/null +++ b/vendor/github.com/davidji99/simpleresty/helper.go @@ -0,0 +1,18 @@ +package simpleresty + +import "strings" + +func contains(a []string, x string, ignoreCase bool) bool { + for _, n := range a { + if ignoreCase { + if strings.ToLower(x) == strings.ToLower(n) { + return true + } + } else { + if x == n { + return true + } + } + } + return false +} diff --git a/vendor/github.com/davidji99/simpleresty/oauth.go b/vendor/github.com/davidji99/simpleresty/oauth.go new file mode 100644 index 0000000..aeeaee5 --- /dev/null +++ b/vendor/github.com/davidji99/simpleresty/oauth.go @@ -0,0 +1,54 @@ +package simpleresty + +import ( + "context" + "fmt" + "golang.org/x/oauth2" + "golang.org/x/oauth2/clientcredentials" +) + +func OAuth(clientID, clientSecret string, endpoint oauth2.Endpoint) (*oauth2.Token, error) { + ctx := context.Background() + conf := &oauth2.Config{ + ClientID: clientID, + ClientSecret: clientSecret, + Endpoint: endpoint, + } + + // Redirect user to consent page to ask for permission + // for the scopes specified above. + url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline) + fmt.Printf("Visit the URL for the auth dialog:\n%v", url) + + // Use the authorization code that is pushed to the redirect + // URL. Exchange will do the handshake to retrieve the + // initial access token. The HTTP Client returned by + // conf.Client will refresh the token as necessary. + var code string + fmt.Printf("Enter the code in the return URL: ") + if _, err := fmt.Scan(&code); err != nil { + return nil, err + } + tok, err := conf.Exchange(ctx, code) + if err != nil { + return nil, err + } + + return tok, nil +} + +func OAuthClientCredentials(clientID, clientSecret, tokenURL string) (*oauth2.Token, error) { + ctx := context.Background() + conf := &clientcredentials.Config{ + ClientID: clientID, + ClientSecret: clientSecret, + TokenURL: tokenURL, + } + + token, retrieveErr := conf.Token(ctx) + if retrieveErr != nil { + return nil, retrieveErr + } + + return token, nil +} diff --git a/vendor/github.com/davidji99/simpleresty/proxy.go b/vendor/github.com/davidji99/simpleresty/proxy.go new file mode 100644 index 0000000..13a9f1a --- /dev/null +++ b/vendor/github.com/davidji99/simpleresty/proxy.go @@ -0,0 +1,99 @@ +package simpleresty + +import ( + "os" + "regexp" + "strings" +) + +var ( + proxyVars = []string{"HTTPS_PROXY", "https_proxy", "HTTP_PROXY", "http_proxy"} + noProxyVars = []string{"NO_PROXY", "no_proxy"} +) + +// parseProxyURLForDomain parses a proxy URL : and returns just the domain. +func parseProxyURLForDomain(proxyURL string) string { + var domainRaw string + + // Split proxyURL by '@' to account for username/password in the URL + proxyURLSplitted := strings.Split(proxyURL, "@") + + if len(proxyURLSplitted) == 1 { + // If no username/password in URL, return proxyURLSplitted's zero index + domainRaw = strings.ToLower(proxyURLSplitted[0]) + } else { + // Take the 1st index value + domainRaw = proxyURLSplitted[1] + } + + // Strip out the protocol + regex := regexp.MustCompile(`http[s]?://`) + domainRaw = regex.ReplaceAllString(domainRaw, "") + + // Split by colon to separate server from PORT and get the zero index + domain := strings.Split(domainRaw, ":")[0] + + return strings.ToLower(domain) +} + +// getNoProxyDomains fetches no proxy variables from the environment and parses each variable value for domains. +// +// Returns a String array of domain names (default empty) and a Boolean for if there are any no proxy domains. +func getNoProxyDomains() ([]string, bool) { + noProxyDomains := make([]string, 0) + + for _, v := range noProxyVars { + noProxyDomainString, isSet := os.LookupEnv(v) + if !isSet || noProxyDomainString == "" { + continue + } + + // Split by comma + noProxyDomainsRaw := strings.Split(noProxyDomainString, ",") + + // Iterate through each URL and format properly + for _, domainRaw := range noProxyDomainsRaw { + // Remove leading and trailing whitespaces + domainRaw = strings.TrimSpace(domainRaw) + + // Strip out any wildcard notation, `*.` + regexWC1 := regexp.MustCompile(`\*\.`) + domainRaw = regexWC1.ReplaceAllString(domainRaw, "") + + // Strip out any wildcard notation, `.*` + regexWC2 := regexp.MustCompile(`\.\*`) + domainRaw = regexWC2.ReplaceAllString(domainRaw, "") + + // Make sure noProxyURLRaw is a valid domain, such as example.info|com|net|etc... + validDomainFormatRegex := regexp.MustCompile(`\S+\.\S+`) + isValidDomain := validDomainFormatRegex.MatchString(domainRaw) + + if isValidDomain { + noProxyDomains = append(noProxyDomains, strings.ToLower(domainRaw)) + } + } + } + + return noProxyDomains, len(noProxyDomains) > 0 +} + +// getProxyURL gets any proxy urls from one of the four environment variables: +// - HTTPS_PROXY +// - https_proxy +// - HTTP_PROXY +// - http_proxy +func getProxyURL() *string { + for _, v := range proxyVars { + proxyURL, isVarSet := os.LookupEnv(v) + if !isVarSet { + continue + } + + if proxyURL != "" { + url := strings.TrimSpace(proxyURL) + return &url + } + } + + return nil +} diff --git a/vendor/github.com/davidji99/simpleresty/response.go b/vendor/github.com/davidji99/simpleresty/response.go index f3d1abc..fbf20c7 100644 --- a/vendor/github.com/davidji99/simpleresty/response.go +++ b/vendor/github.com/davidji99/simpleresty/response.go @@ -34,6 +34,7 @@ type Response struct { Body string } +// checkResponse parses the HTTP response and returns the response and an error if applicable. func checkResponse(resp *resty.Response) (*Response, error) { path, _ := url.QueryUnescape(resp.Request.URL) r := &Response{Status: resp.Status(), StatusCode: resp.StatusCode(), diff --git a/vendor/github.com/davidji99/simpleresty/simpleresty.go b/vendor/github.com/davidji99/simpleresty/simpleresty.go index 76a7897..27605fa 100644 --- a/vendor/github.com/davidji99/simpleresty/simpleresty.go +++ b/vendor/github.com/davidji99/simpleresty/simpleresty.go @@ -1,8 +1,26 @@ package simpleresty -import "github.com/go-resty/resty/v2" +import ( + "github.com/go-resty/resty/v2" +) -// New function creates a new SimpleResty client. +// New function creates a new simpleresty client with base url set to empty string. +// +// Users can set the base string later in their code. func New() *Client { - return &Client{Client: resty.New()} + c := NewWithBaseURL("") + return c +} + +// NewWithBaseURL creates a new simpleresty client with base url set. +func NewWithBaseURL(url string) *Client { + c := &Client{Client: resty.New(), baseURL: url, proxyURL: nil, shouldSetProxy: false} + + // Set no proxy domains if any + c.noProxyDomains, _ = getNoProxyDomains() + + // Set proxy URL if any + c.proxyURL = getProxyURL() + + return c } diff --git a/vendor/github.com/go-resty/resty/v2/.gitignore b/vendor/github.com/go-resty/resty/v2/.gitignore index 54910a0..9e856bd 100644 --- a/vendor/github.com/go-resty/resty/v2/.gitignore +++ b/vendor/github.com/go-resty/resty/v2/.gitignore @@ -25,7 +25,6 @@ _testmain.go coverage.out coverage.txt -go.sum # Exclude intellij IDE folders -.idea/* \ No newline at end of file +.idea/* diff --git a/vendor/github.com/go-resty/resty/v2/.travis.yml b/vendor/github.com/go-resty/resty/v2/.travis.yml index 103aa35..583a039 100644 --- a/vendor/github.com/go-resty/resty/v2/.travis.yml +++ b/vendor/github.com/go-resty/resty/v2/.travis.yml @@ -1,10 +1,10 @@ language: go -sudo: false +os: linux go: # use travis ci resource effectively, keep always latest 2 versions and tip :) - - 1.12.x - - 1.13.x + - 1.15.x + - 1.14.x - tip install: @@ -16,6 +16,6 @@ script: after_success: - bash <(curl -s https://codecov.io/bash) -matrix: +jobs: allow_failures: - go: tip diff --git a/vendor/github.com/go-resty/resty/v2/LICENSE b/vendor/github.com/go-resty/resty/v2/LICENSE index c9ae93e..27326a6 100644 --- a/vendor/github.com/go-resty/resty/v2/LICENSE +++ b/vendor/github.com/go-resty/resty/v2/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015-2020 Jeevanandam M., https://myjeeva.com +Copyright (c) 2015-2021 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/github.com/go-resty/resty/v2/README.md b/vendor/github.com/go-resty/resty/v2/README.md index 5ddf294..819fbf3 100644 --- a/vendor/github.com/go-resty/resty/v2/README.md +++ b/vendor/github.com/go-resty/resty/v2/README.md @@ -4,7 +4,7 @@

Features section describes in detail about Resty capabilities

-

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

+

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

Resty Communication Channels

@@ -13,52 +13,54 @@ ## News - * v2.2.0 [released](https://github.com/go-resty/resty/releases/tag/v2.2.0) and tagged on Feb 23, 2020. + * v2.6.0 [released](https://github.com/go-resty/resty/releases/tag/v2.6.0) and tagged on Apr 09, 2021. * 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.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](https://godoc.org/github.com/go-resty/resty#Request) Body can be `string`, `[]byte`, `struct`, `map`, `slice` and `io.Reader` too + * [Request](https://pkg.go.dev/github.com/go-resty/resty/v2#Request) Body can be `string`, `[]byte`, `struct`, `map`, `slice` and `io.Reader` too * Auto detects `Content-Type` * Buffer less processing for `io.Reader` + * Native `*http.Request` instance may be accessed during middleware and request execution via `Request.RawRequest` * 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 + * [Response](https://pkg.go.dev/github.com/go-resty/resty/v2#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/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). + - Success scenario [Request.SetResult()](https://pkg.go.dev/github.com/go-resty/resty/v2#Request.SetResult) and [Response.Result()](https://pkg.go.dev/github.com/go-resty/resty/v2#Response.Result). + - Error scenario [Request.SetError()](https://pkg.go.dev/github.com/go-resty/resty/v2#Request.SetError) and [Response.Error()](https://pkg.go.dev/github.com/go-resty/resty/v2#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/github.com/go-resty/resty#Request.SetPathParams) + * Request URL [Path Params (aka URI Params)](https://pkg.go.dev/github.com/go-resty/resty/v2#Request.SetPathParams) * Backoff Retry Mechanism with retry condition function [reference](retry_test.go) - * 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 + * Resty client HTTP & REST [Request](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.OnBeforeRequest) and [Response](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.OnAfterResponse) middlewares * `Request.SetContext` supported * Authorization option of `BasicAuth` and `Bearer` token * Set request `ContentLength` value for all request or particular request - * 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). + * Custom [Root Certificates](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.SetRootCertificate) and Client [Certificates](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.SetCertificates) + * Download/Save HTTP response directly into File, like `curl -o` flag. See [SetOutputDirectory](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.SetOutputDirectory) & [SetOutput](https://pkg.go.dev/github.com/go-resty/resty/v2#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/github.com/go-resty/resty#Client.SetAllowGetMethodPayload) + * Optionally allows GET request with payload, see [SetAllowGetMethodPayload](https://pkg.go.dev/github.com/go-resty/resty/v2#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) * Resty design * Have client level settings & options and also override at Request level if you want to - * Request and Response middlewares + * Request and Response middleware * Create Multiple clients if you want to `resty.New()` - * Supports `http.RoundTripper` implementation, see [SetTransport](https://godoc.org/github.com/go-resty/resty#Client.SetTransport) + * Supports `http.RoundTripper` implementation, see [SetTransport](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.SetTransport) * goroutine concurrent safe - * 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) + * Resty Client trace, see [Client.EnableTrace](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.EnableTrace) and [Request.EnableTrace](https://pkg.go.dev/github.com/go-resty/resty/v2#Request.EnableTrace) + * Since v2.4.0, trace info contains a `RequestAttempt` value, and the `Request` object contains an `Attempt` attribute * 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` @@ -76,13 +78,14 @@ * Retry Mechanism [how to use](#retries) * Backoff Retry * Conditional Retry + * Since v2.6.0, Retry Hooks - [Client](https://pkg.go.dev/github.com/go-resty/resty/v2#Client.AddRetryHook), [Request](https://pkg.go.dev/github.com/go-resty/resty/v2#Request.AddRetryHook) * 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)). #### Supported Go Versions -Initially Resty started supporting `go modules` since `v1.10.0` release. +Initially Resty started supporting `go modules` since `v1.10.0` release. 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: @@ -104,7 +107,7 @@ Resty author also published following projects for Go Community. ```bash # Go Modules -require github.com/go-resty/resty/v2 v2.2.0 +require github.com/go-resty/resty/v2 v2.4.0 ``` ## Usage @@ -123,61 +126,70 @@ import "github.com/go-resty/resty/v2" client := resty.New() resp, err := client.R(). - EnableTrace(). - Get("https://httpbin.org/get") + 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("Time :", resp.Time()) -fmt.Println("Received At:", resp.ReceivedAt()) -fmt.Println("Body :\n", resp) +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("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) +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) +fmt.Println(" RequestAttempt:", ti.RequestAttempt) +fmt.Println(" RemoteAddr :", ti.RemoteAddr.String()) /* Output Response Info: -Error : -Status Code: 200 -Status : 200 OK -Time : 465.301137ms -Received At: 2019-06-16 01:52:33.772456 -0800 PST m=+0.466672260 -Body : - { - "args": {}, - "headers": { - "Accept-Encoding": "gzip", - "Host": "httpbin.org", - "User-Agent": "go-resty/2.0.0 (https://github.com/go-resty/resty)" - }, - "origin": "0.0.0.0", - "url": "https://httpbin.org/get" -} + Error : + Status Code: 200 + Status : 200 OK + Proto : HTTP/2.0 + Time : 457.034718ms + Received At: 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045 + Body : + { + "args": {}, + "headers": { + "Accept-Encoding": "gzip", + "Host": "httpbin.org", + "User-Agent": "go-resty/2.4.0 (https://github.com/go-resty/resty)", + "X-Amzn-Trace-Id": "Root=1-5f5ff031-000ff6292204aa6898e4de49" + }, + "origin": "0.0.0.0", + "url": "https://httpbin.org/get" + } Request Trace Info: -DNSLookup : 2.21124ms -ConnTime : 393.875795ms -TLSHandshake : 319.313546ms -ServerTime : 71.109256ms -ResponseTime : 94.466µs -TotalTime : 465.301137ms -IsConnReused : false -IsConnWasIdle: false -ConnIdleTime : 0s + DNSLookup : 4.074657ms + ConnTime : 381.709936ms + TCPConnTime : 77.428048ms + TLSHandshake : 299.623597ms + ServerTime : 75.414703ms + ResponseTime : 79.337µs + TotalTime : 457.034718ms + IsConnReused : false + IsConnWasIdle : false + ConnIdleTime : 0s + RequestAttempt: 1 + RemoteAddr : 3.221.81.55:443 */ ``` @@ -206,6 +218,13 @@ resp, err := client.R(). SetHeader("Accept", "application/json"). SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F"). Get("/show_product") + + +// If necessary, you can force response content type to tell Resty to parse a JSON response into your struct +resp, err := client.R(). + SetResult(result). + ForceContentType("application/json"). + Get("v2/alpine/manifests/latest") ``` #### Various POST method combinations @@ -496,6 +515,28 @@ client.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error { }) ``` +#### OnError Hooks + +Resty provides OnError hooks that may be called because: + +- The client failed to send the request due to connection timeout, TLS handshake failure, etc... +- The request was retried the maximum amount of times, and still failed. + +If there was a response from the server, the original error will be wrapped in `*resty.ResponseError` which contains the last response received. + +```go +// Create a Resty Client +client := resty.New() + +client.OnError(func(req *resty.Request, err error) { + if v, ok := err.(*resty.ResponseError); ok { + // v.Response contains the last response from the server + // v.Err contains the original error + } + // Log the error, increment a metric, etc... +}) +``` + #### Redirect Policy Resty provides few ready to use redirect policy(s) also it supports multiple policies together. @@ -635,7 +676,7 @@ client. 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) { + SetRetryAfter(func(client *resty.Client, resp *resty.Response) (time.Duration, error) { return 0, errors.New("quota exceeded") }) ``` @@ -643,7 +684,7 @@ client. Above setup will result in resty retrying requests returned non nil error up to 3 times with delay increased after each attempt. -You can optionally provide client with custom retry conditions: +You can optionally provide client with [custom retry conditions](https://pkg.go.dev/github.com/go-resty/resty/v2#RetryConditionFunc): ```go // Create a Resty Client @@ -651,7 +692,7 @@ client := resty.New() client.AddRetryCondition( // RetryConditionFunc type is for retry condition function - // input: non-nil Response OR request execution error + // input: non-nil Response OR request execution error func(r *resty.Response, err error) bool { return r.StatusCode() == http.StatusTooManyRequests }, @@ -819,7 +860,7 @@ More detailed example of mocking resty http requests using ginko could be found Resty releases versions according to [Semantic Versioning](http://semver.org) * Resty v2 does not use `gopkg.in` service for library versioning. - * Resty fully adapted to `go mod` capabilities since `v1.10.0` release. + * 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. @@ -833,6 +874,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/github.com/go-resty/resty/v2/client.go b/vendor/github.com/go-resty/resty/v2/client.go index 3ba9850..36b9f9c 100644 --- a/vendor/github.com/go-resty/resty/v2/client.go +++ b/vendor/github.com/go-resty/resty/v2/client.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -15,12 +15,10 @@ import ( "io" "io/ioutil" "math" - "net" "net/http" "net/url" "reflect" "regexp" - "runtime" "strings" "sync" "time" @@ -55,7 +53,7 @@ var ( hdrContentTypeKey = http.CanonicalHeaderKey("Content-Type") hdrContentLengthKey = http.CanonicalHeaderKey("Content-Length") hdrContentEncodingKey = http.CanonicalHeaderKey("Content-Encoding") - hdrAuthorizationKey = http.CanonicalHeaderKey("Authorization") + hdrLocationKey = http.CanonicalHeaderKey("Location") plainTextType = "text/plain; charset=utf-8" jsonContentType = "application/json" @@ -68,6 +66,26 @@ var ( bufPool = &sync.Pool{New: func() interface{} { return &bytes.Buffer{} }} ) +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 + + // ErrorHook type is for reacting to request errors, called after all retries were attempted + ErrorHook func(*Request, 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. // @@ -80,6 +98,7 @@ type Client struct { Header http.Header UserInfo *User Token string + AuthScheme string Cookies []*http.Cookie Error reflect.Type Debug bool @@ -89,10 +108,15 @@ type Client struct { RetryWaitTime time.Duration RetryMaxWaitTime time.Duration RetryConditions []RetryConditionFunc + RetryHooks []OnRetryFunc RetryAfter RetryAfterFunc JSONMarshal func(v interface{}) ([]byte, error) JSONUnmarshal func(data []byte, v interface{}) error + // HeaderAuthorizationKey is used to set/access Request Authorization header + // value when `SetAuthToken` option is used. + HeaderAuthorizationKey string + jsonEscapeHTML bool setContentLength bool closeConnection bool @@ -105,12 +129,13 @@ type Client struct { log Logger httpClient *http.Client proxyURL *url.URL - beforeRequest []func(*Client, *Request) error - udBeforeRequest []func(*Client, *Request) error - preReqHook func(*Client, *http.Request) error - afterResponse []func(*Client, *Response) error - requestLog func(*RequestLog) error - responseLog func(*ResponseLog) error + beforeRequest []RequestMiddleware + udBeforeRequest []RequestMiddleware + preReqHook PreRequestHook + afterResponse []ResponseMiddleware + requestLog RequestLogCallback + responseLog ResponseLogCallback + errorHooks []ErrorHook } // User type is to hold an username and password information @@ -169,6 +194,21 @@ func (c *Client) SetHeaders(headers map[string]string) *Client { return c } +// SetHeaderVerbatim method is to set a single header field and its value verbatim in the current request. +// +// For Example: To set `all_lowercase` and `UPPERCASE` as `available`. +// client.R(). +// SetHeaderVerbatim("all_lowercase", "available"). +// SetHeaderVerbatim("UPPERCASE", "available") +// +// Also you can override header value, which was set at client instance level. +// +// Since v2.6.0 +func (c *Client) SetHeaderVerbatim(header, value string) *Client { + c.Header[header] = []string{value} + return c +} + // SetCookieJar method sets custom http.CookieJar in the resty client. Its way to override default. // // For Example: sometimes we don't want to save cookies in api contacting, we can remove the default @@ -278,14 +318,15 @@ func (c *Client) SetBasicAuth(username, password string) *Client { return c } -// SetAuthToken method sets bearer auth token header in the HTTP request. For 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: // // For Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F // // client.SetAuthToken("BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F") // -// This bearer auth token gets added to all the request rasied from this client instance. +// 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`. @@ -294,6 +335,27 @@ func (c *Client) SetAuthToken(token string) *Client { return c } +// 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{ @@ -326,7 +388,7 @@ func (c *Client) NewRequest() *Request { // // 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 } @@ -340,16 +402,32 @@ func (c *Client) OnBeforeRequest(m func(*Client, *Request) error) *Client { // // 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 } +// OnError method adds a callback that will be run whenever a request execution fails. +// This is called after all retries have been attempted (if any). +// If there was a response from the server, the error will be wrapped in *ResponseError +// which has the last response received from the server. +// +// client.OnError(func(req *resty.Request, err error) { +// if v, ok := err.(*resty.ResponseError); ok { +// // Do something with v.Response +// } +// // Log the error, increment a metric, etc... +// }) +func (c *Client) OnError(h ErrorHook) *Client { + c.errorHooks = append(c.errorHooks, h) + return c +} + // 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 `client.OnBeforeRequest` for mutilple. -func (c *Client) SetPreRequestHook(h func(*Client, *http.Request) error) *Client { +func (c *Client) SetPreRequestHook(h PreRequestHook) *Client { if c.preReqHook != nil { c.log.Warnf("Overwriting an existing pre-request hook: %s", functionName(h)) } @@ -375,7 +453,7 @@ func (c *Client) SetDebugBodyLimit(sl int64) *Client { // 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.Warnf("Overwriting an existing on-request-log callback from=%s to=%s", functionName(c.requestLog), functionName(rl)) @@ -386,7 +464,7 @@ func (c *Client) OnRequestLog(rl func(*RequestLog) error) *Client { // 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.Warnf("Overwriting an existing on-response-log callback from=%s to=%s", functionName(c.responseLog), functionName(rl)) @@ -516,6 +594,26 @@ func (c *Client) AddRetryCondition(condition RetryConditionFunc) *Client { return c } +// AddRetryAfterErrorCondition adds the basic condition of retrying after encountering +// an error from the http response +// +// Since v2.6.0 +func (c *Client) AddRetryAfterErrorCondition() *Client { + c.AddRetryCondition(func(response *Response, err error) bool { + return response.IsError() + }) + return c +} + +// AddRetryHook adds a side-effecting retry hook to an array of hooks +// that will be executed on each retry. +// +// Since v2.6.0 +func (c *Client) AddRetryHook(hook OnRetryFunc) *Client { + c.RetryHooks = append(c.RetryHooks, hook) + return c +} + // SetTLSClientConfig method sets TLSClientConfig for underling client Transport. // // For Example: @@ -683,6 +781,22 @@ func (c *Client) SetDoNotParseResponse(parse bool) *Client { return c } +// SetPathParam method sets single URL path key-value pair in the +// Resty client instance. +// client.SetPathParam("userId", "sample@sample.com") +// +// Result: +// URL - /v1/users/{userId}/details +// Composed URL - /v1/users/sample@sample.com/details +// It replaces the value of the key while composing the request URL. +// +// Also it can be overridden at request level Path Params options, +// see `Request.SetPathParam` or `Request.SetPathParams`. +func (c *Client) SetPathParam(param, value string) *Client { + c.pathParams[param] = value + return c +} + // SetPathParams method sets multiple URL path key-value pairs at one go in the // Resty client instance. // client.SetPathParams(map[string]string{ @@ -693,11 +807,13 @@ func (c *Client) SetDoNotParseResponse(parse bool) *Client { // Result: // URL - /v1/users/{userId}/{subAccountId}/details // Composed URL - /v1/users/sample@sample.com/100002/details -// It replace the value of the key while composing request URL. Also it can be -// overridden at request level Path Params options, see `Request.SetPathParams`. +// It replaces the value of the key while composing the request URL. +// +// Also it can be overridden at request level Path Params options, +// see `Request.SetPathParam` or `Request.SetPathParams`. func (c *Client) SetPathParams(params map[string]string) *Client { for p, v := range params { - c.pathParams[p] = v + c.SetPathParam(p, v) } return c } @@ -761,14 +877,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 + return nil, wrapNoRetryErr(err) } } @@ -779,29 +895,24 @@ func (c *Client) execute(req *Request) (*Response, error) { // call pre-request if defined if c.preReqHook != nil { if err = c.preReqHook(c, req.RawRequest); err != nil { - return nil, err + return nil, wrapNoRetryErr(err) } } if err = requestLogger(c, req); err != nil { - return nil, err + return nil, wrapNoRetryErr(err) } req.Time = time.Now() resp, err := c.httpClient.Do(req.RawRequest) - endTime := time.Now() - - if c.trace || req.trace { - req.clientTrace.endTime = endTime - } response := &Response{ Request: req, RawResponse: resp, - receivedAt: endTime, } if err != nil || req.notParseResponse || c.notParseResponse { + response.setReceivedAt() return response, err } @@ -814,6 +925,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) @@ -821,12 +933,15 @@ func (c *Client) execute(req *Request) (*Response, error) { } if response.body, err = ioutil.ReadAll(body); err != nil { + response.setReceivedAt() return response, err } response.size = int64(len(response.body)) } + response.setReceivedAt() // after we read the body + // Apply Response middleware for _, f := range c.afterResponse { if err = f(c, response); err != nil { @@ -834,7 +949,7 @@ func (c *Client) execute(req *Request) (*Response, error) { } } - return response, err + return response, wrapNoRetryErr(err) } // getting TLS client config if not exists then create one @@ -864,6 +979,35 @@ func (c *Client) outputLogTo(w io.Writer) *Client { return c } +// ResponseError is a wrapper for including the server response with an error. +// Neither the err nor the response should be nil. +type ResponseError struct { + Response *Response + Err error +} + +func (e *ResponseError) Error() string { + return e.Err.Error() +} + +func (e *ResponseError) Unwrap() error { + return e.Err +} + +// Helper to run onErrorHooks hooks. +// It wraps the error in a ResponseError if the resp is not nil +// so hooks can access it. +func (c *Client) onErrorHooks(req *Request, resp *Response, err error) { + if err != nil { + if resp != nil { // wrap with ResponseError + err = &ResponseError{Response: resp, Err: err} + } + for _, h := range c.errorHooks { + h(req, err) + } + } +} + //‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ // File struct and its methods //_______________________________________________________________________ @@ -902,25 +1046,26 @@ func createClient(hc *http.Client) *Client { } 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), + QueryParam: url.Values{}, + FormData: url.Values{}, + Header: http.Header{}, + Cookies: make([]*http.Cookie, 0), + RetryWaitTime: defaultWaitTime, + RetryMaxWaitTime: defaultMaxWaitTime, + JSONMarshal: json.Marshal, + JSONUnmarshal: json.Unmarshal, + HeaderAuthorizationKey: http.CanonicalHeaderKey("Authorization"), + jsonEscapeHTML: true, + httpClient: hc, + debugBodySizeLimit: math.MaxInt32, + pathParams: make(map[string]string), } // Logger c.SetLogger(createLogger()) // default before request middlewares - c.beforeRequest = []func(*Client, *Request) error{ + c.beforeRequest = []RequestMiddleware{ parseRequestURL, parseRequestHeader, parseRequestBody, @@ -929,10 +1074,10 @@ func createClient(hc *http.Client) *Client { } // user defined request middlewares - c.udBeforeRequest = []func(*Client, *Request) error{} + c.udBeforeRequest = []RequestMiddleware{} // default after response middlewares - c.afterResponse = []func(*Client, *Response) error{ + c.afterResponse = []ResponseMiddleware{ responseLogger, parseResponseBody, saveResponseIntoFile, @@ -940,23 +1085,3 @@ func createClient(hc *http.Client) *Client { return c } - -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/github.com/go-resty/resty/v2/go.mod b/vendor/github.com/go-resty/resty/v2/go.mod deleted file mode 100644 index 0ecb0cf..0000000 --- a/vendor/github.com/go-resty/resty/v2/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/go-resty/resty/v2 - -require golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 - -go 1.11 diff --git a/vendor/github.com/go-resty/resty/v2/middleware.go b/vendor/github.com/go-resty/resty/v2/middleware.go index d000645..06ed48b 100644 --- a/vendor/github.com/go-resty/resty/v2/middleware.go +++ b/vendor/github.com/go-resty/resty/v2/middleware.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -162,6 +162,8 @@ func createHTTPRequest(c *Client, r *Request) (err error) { if r.bodyBuf == nil { if reader, ok := r.Body.(io.Reader); ok { r.RawRequest, err = http.NewRequest(r.Method, r.URL, reader) + } else if c.setContentLength || r.setContentLength { + r.RawRequest, err = http.NewRequest(r.Method, r.URL, http.NoBody) } else { r.RawRequest, err = http.NewRequest(r.Method, r.URL, nil) } @@ -206,29 +208,16 @@ func createHTTPRequest(c *Client, r *Request) (err error) { r.RawRequest = r.RawRequest.WithContext(r.ctx) } + bodyCopy, err := getBodyCopy(r) + if err != nil { + return err + } + // 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 + if bodyCopy != nil { + return ioutil.NopCloser(bytes.NewReader(bodyCopy.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 } @@ -252,11 +241,21 @@ func addCredentials(c *Client, r *Request) error { } } - // 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(c.HeaderAuthorizationKey, authScheme+" "+r.Token) } else if !IsStringEmpty(c.Token) { - r.RawRequest.Header.Set(hdrAuthorizationKey, "Bearer "+c.Token) + r.RawRequest.Header.Set(c.HeaderAuthorizationKey, authScheme+" "+c.Token) } return nil @@ -304,18 +303,19 @@ func responseLogger(c *Client, res *Response) error { 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 { - debugLog += fmt.Sprintf("BODY :\n***** RESPONSE WRITTEN INTO FILE *****\n") + debugLog += "BODY :\n***** RESPONSE WRITTEN INTO FILE *****\n" } else { debugLog += fmt.Sprintf("BODY :\n%v\n", rl.Body) } debugLog += "==============================================================================\n" - c.log.Debugf(debugLog) + c.log.Debugf("%s", debugLog) } return nil @@ -326,7 +326,7 @@ 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() { @@ -444,7 +444,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 @@ -459,8 +459,14 @@ func handleRequestBody(c *Client, r *Request) (err error) { } else if IsJSONType(contentType) && (kind == reflect.Struct || kind == reflect.Map || kind == reflect.Slice) { bodyBytes, err = jsonMarshal(c, r, r.Body) + if err != nil { + return + } } else if IsXMLType(contentType) && (kind == reflect.Struct) { bodyBytes, err = xml.Marshal(r.Body) + if err != nil { + return + } } if bodyBytes == nil && r.bodyBuf == nil { @@ -513,3 +519,27 @@ func saveResponseIntoFile(c *Client, res *Response) error { return nil } + +func getBodyCopy(r *Request) (*bytes.Buffer, error) { + // If r.bodyBuf present, return the copy + if r.bodyBuf != nil { + return bytes.NewBuffer(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 bytes.NewBuffer(b), nil + } + return nil, nil +} diff --git a/vendor/github.com/go-resty/resty/v2/redirect.go b/vendor/github.com/go-resty/resty/v2/redirect.go index 2976b7c..7d7e43b 100644 --- a/vendor/github.com/go-resty/resty/v2/redirect.go +++ b/vendor/github.com/go-resty/resty/v2/redirect.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. diff --git a/vendor/github.com/go-resty/resty/v2/request.go b/vendor/github.com/go-resty/resty/v2/request.go index 7c70708..41709cf 100644 --- a/vendor/github.com/go-resty/resty/v2/request.go +++ b/vendor/github.com/go-resty/resty/v2/request.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -30,6 +30,7 @@ type Request struct { URL string Method string Token string + AuthScheme string QueryParam url.Values FormData url.Values Header http.Header @@ -42,6 +43,12 @@ type Request struct { UserInfo *User Cookies []*http.Cookie + // Attempt is to represent the request attempt made during a Resty + // request execution flow, including retry count. + // + // Since v2.4.0 + Attempt int + isMultiPart bool isFormData bool setContentLength bool @@ -51,6 +58,7 @@ type Request struct { trace bool outputFile string fallbackContentType string + forceContentType string ctx context.Context pathParams map[string]string values map[string]interface{} @@ -109,6 +117,21 @@ func (r *Request) SetHeaders(headers map[string]string) *Request { return r } +// SetHeaderVerbatim method is to set a single header field and its value verbatim in the current request. +// +// For Example: To set `all_lowercase` and `UPPERCASE` as `available`. +// client.R(). +// SetHeaderVerbatim("all_lowercase", "available"). +// SetHeaderVerbatim("UPPERCASE", "available") +// +// Also you can override header value, which was set at client instance level. +// +// Since v2.6.0 +func (r *Request) SetHeaderVerbatim(header, value string) *Request { + r.Header[header] = []string{value} + return r +} + // SetQueryParam method sets single parameter and its value in the current request. // It will be formed as query string for the request. // @@ -320,6 +343,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 @@ -364,7 +396,7 @@ func (r *Request) SetMultipartFields(fields ...*MultipartField) *Request { // See `Client.SetContentLength` // client.R().SetContentLength(true) func (r *Request) SetContentLength(l bool) *Request { - r.setContentLength = true + r.setContentLength = l return r } @@ -382,7 +414,7 @@ func (r *Request) SetBasicAuth(username, password string) *Request { 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 // // For Example: To set auth token BC594900518B4F7EAC75BD37F019E08FBC594900518B4F7EAC75BD37F019E08F @@ -395,6 +427,27 @@ func (r *Request) SetAuthToken(token string) *Request { 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 @@ -431,6 +484,20 @@ func (r *Request) SetDoNotParseResponse(parse bool) *Request { return r } +// SetPathParam method sets single URL path key-value pair in the +// Resty current request instance. +// client.R().SetPathParam("userId", "sample@sample.com") +// +// Result: +// URL - /v1/users/{userId}/details +// Composed URL - /v1/users/sample@sample.com/details +// It replaces the value of the key while composing the request URL. Also you can +// override Path Params value, which was set at client instance level. +func (r *Request) SetPathParam(param, value string) *Request { + r.pathParams[param] = value + return r +} + // SetPathParams method sets multiple URL path key-value pairs at one go in the // Resty current request instance. // client.R().SetPathParams(map[string]string{ @@ -441,11 +508,11 @@ func (r *Request) SetDoNotParseResponse(parse bool) *Request { // Result: // URL - /v1/users/{userId}/{subAccountId}/details // Composed URL - /v1/users/sample@sample.com/100002/details -// It replace the value of the key while composing request URL. Also you can +// It replaces the value of the key while composing request URL. Also you can // override Path Params value, which was set at client instance level. func (r *Request) SetPathParams(params map[string]string) *Request { for p, v := range params { - r.pathParams[p] = v + r.SetPathParam(p, v) } return r } @@ -457,6 +524,14 @@ func (r *Request) ExpectContentType(contentType string) *Request { return r } +// ForceContentType method provides a strong sense of response `Content-Type` for automatic unmarshalling. +// Resty gives this a higher priority than the `Content-Type` response header. This means that if both +// `Request.ForceContentType` is set and the response `Content-Type` is available, `ForceContentType` will win. +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. @@ -535,17 +610,45 @@ func (r *Request) TraceInfo() TraceInfo { return TraceInfo{} } - return TraceInfo{ - DNSLookup: ct.dnsDone.Sub(ct.dnsStart), - ConnTime: ct.gotConn.Sub(ct.getConn), - TLSHandshake: ct.tlsHandshakeDone.Sub(ct.tlsHandshakeStart), - ServerTime: ct.gotFirstResponseByte.Sub(ct.wroteRequest), - ResponseTime: ct.endTime.Sub(ct.gotFirstResponseByte), - TotalTime: ct.endTime.Sub(ct.getConn), - IsConnReused: ct.gotConnInfo.Reused, - IsConnWasIdle: ct.gotConnInfo.WasIdle, - ConnIdleTime: ct.gotConnInfo.IdleTime, + ti := TraceInfo{ + DNSLookup: ct.dnsDone.Sub(ct.dnsStart), + TLSHandshake: ct.tlsHandshakeDone.Sub(ct.tlsHandshakeStart), + ServerTime: ct.gotFirstResponseByte.Sub(ct.gotConn), + IsConnReused: ct.gotConnInfo.Reused, + IsConnWasIdle: ct.gotConnInfo.WasIdle, + ConnIdleTime: ct.gotConnInfo.IdleTime, + RequestAttempt: r.Attempt, + } + + // Calculate the total time accordingly, + // when connection is reused + if ct.gotConnInfo.Reused { + ti.TotalTime = ct.endTime.Sub(ct.getConn) + } else { + ti.TotalTime = ct.endTime.Sub(ct.dnsStart) + } + + // Only calculate on successful connections + if !ct.connectDone.IsZero() { + ti.TCPConnTime = ct.connectDone.Sub(ct.dnsDone) + } + + // Only calculate on successful connections + if !ct.gotConn.IsZero() { + ti.ConnTime = ct.gotConn.Sub(ct.getConn) + } + + // Only calculate on successful connections + if !ct.gotFirstResponseByte.IsZero() { + ti.ResponseTime = ct.endTime.Sub(ct.gotFirstResponseByte) } + + // Capture remote address info when connection is non-nil + if ct.gotConnInfo.Conn != nil { + ti.RemoteAddr = ct.gotConnInfo.Conn.RemoteAddr() + } + + return ti } //‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ @@ -602,15 +705,18 @@ func (r *Request) Send() (*Response, error) { // 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 || method == MethodPatch) { + // No OnError hook here since this is a request validation error return nil, fmt.Errorf("multipart content is not allowed in HTTP verb [%v]", method) } if r.SRV != nil { _, addrs, err = net.LookupSRV(r.SRV.Service, "tcp", r.SRV.Domain) if err != nil { + r.client.onErrorHooks(r, nil, err) return nil, err } } @@ -619,20 +725,21 @@ 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) + r.Attempt = 1 + resp, err = r.client.execute(r) + r.client.onErrorHooks(r, resp, unwrapNoRetryErr(err)) + return resp, unwrapNoRetryErr(err) } - var resp *Response - attempt := 0 err = Backoff( func() (*Response, error) { - attempt++ + r.Attempt++ - r.URL = r.selectAddr(addrs, url, attempt) + r.URL = r.selectAddr(addrs, url, r.Attempt) resp, err = r.client.execute(r) if err != nil { - r.client.log.Errorf("%v, Attempt %v", err, attempt) + r.client.log.Errorf("%v, Attempt %v", err, r.Attempt) } return resp, err @@ -641,9 +748,12 @@ func (r *Request) Execute(method, url string) (*Response, error) { WaitTime(r.client.RetryWaitTime), MaxWaitTime(r.client.RetryMaxWaitTime), RetryConditions(r.client.RetryConditions), + RetryHooks(r.client.RetryHooks), ) - return resp, err + r.client.onErrorHooks(r, resp, unwrapNoRetryErr(err)) + + return resp, unwrapNoRetryErr(err) } //‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ diff --git a/vendor/github.com/go-resty/resty/v2/response.go b/vendor/github.com/go-resty/resty/v2/response.go index d8d1413..8ae0e10 100644 --- a/vendor/github.com/go-resty/resty/v2/response.go +++ b/vendor/github.com/go-resty/resty/v2/response.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -55,6 +55,14 @@ func (r *Response) StatusCode() int { 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 @@ -91,16 +99,16 @@ func (r *Response) String() string { // 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 received 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.receivedAt.Sub(r.Request.clientTrace.getConn) + return r.Request.TraceInfo().TotalTime } return r.receivedAt.Sub(r.Request.Time) } -// ReceivedAt method returns when response got recevied from server for the request. +// ReceivedAt method returns when response got received from server for the request. func (r *Response) ReceivedAt() time.Time { return r.receivedAt } @@ -138,6 +146,13 @@ func (r *Response) IsError() bool { // 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 { diff --git a/vendor/github.com/go-resty/resty/v2/resty.go b/vendor/github.com/go-resty/resty/v2/resty.go index af829c3..2a53e06 100644 --- a/vendor/github.com/go-resty/resty/v2/resty.go +++ b/vendor/github.com/go-resty/resty/v2/resty.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -14,7 +14,7 @@ import ( ) // Version # of resty -const Version = "2.2.0" +const Version = "2.6.0" // New method creates a new Resty client. func New() *Client { diff --git a/vendor/github.com/go-resty/resty/v2/retry.go b/vendor/github.com/go-resty/resty/v2/retry.go index ac8b726..a841c46 100644 --- a/vendor/github.com/go-resty/resty/v2/retry.go +++ b/vendor/github.com/go-resty/resty/v2/retry.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -8,6 +8,7 @@ import ( "context" "math" "math/rand" + "sync" "time" ) @@ -25,6 +26,9 @@ type ( // input: non-nil Response OR request execution error RetryConditionFunc func(*Response, error) bool + // OnRetryFunc is for side-effecting functions triggered on retry + OnRetryFunc func(*Response, error) + // 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 @@ -38,6 +42,7 @@ type ( waitTime time.Duration maxWaitTime time.Duration retryConditions []RetryConditionFunc + retryHooks []OnRetryFunc } ) @@ -69,6 +74,13 @@ func RetryConditions(conditions []RetryConditionFunc) Option { } } +// RetryHooks sets the hooks that will be executed after each retry +func RetryHooks(hooks []OnRetryFunc) Option { + return func(o *Options) { + o.retryHooks = hooks + } +} + // 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 { @@ -89,7 +101,7 @@ func Backoff(operation func() (*Response, error), options ...Option) error { err error ) - for attempt := 0; attempt < opts.maxRetries; attempt++ { + for attempt := 0; attempt <= opts.maxRetries; attempt++ { resp, err = operation() ctx := context.Background() if resp != nil && resp.Request.ctx != nil { @@ -99,10 +111,11 @@ func Backoff(operation func() (*Response, error), options ...Option) error { return err } - needsRetry := err != nil // retry on operation errors by default + 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, err) + needsRetry = condition(resp, err1) if needsRetry { break } @@ -112,6 +125,10 @@ func Backoff(operation func() (*Response, error), options ...Option) error { return err } + for _, hook := range opts.retryHooks { + hook(resp, err) + } + waitTime, err2 := sleepDuration(resp, opts.waitTime, opts.maxWaitTime, attempt) if err2 != nil { if err == nil { @@ -132,49 +149,67 @@ func Backoff(operation func() (*Response, error), options ...Option) error { 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 + return jitterBackoff(min, max, attempt), nil } - // 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 + retryAfterFunc := resp.Request.client.RetryAfter + + // Check for custom callback + if retryAfterFunc == nil { + return jitterBackoff(min, max, attempt), nil } - // 2. Return capped exponential backoff with jitter - // http://www.awsarchitectureblog.com/2015/03/backoff.html -defaultCase: + result, err := retryAfterFunc(resp.Request.client, resp) + if err != nil { + return 0, err // i.e. 'API quota exceeded' + } + if result == 0 { + return jitterBackoff(min, max, attempt), nil + } + if result < 0 || max < result { + result = max + } + if result < min { + result = min + } + return result, nil +} + +// Return capped exponential backoff with jitter +// http://www.awsarchitectureblog.com/2015/03/backoff.html +func jitterBackoff(min, max time.Duration, attempt int) time.Duration { 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)))) + ri := time.Duration(temp / 2) + result := randDuration(ri) if result < min { result = min } - return result, nil + return result +} + +var rnd = newRnd() +var rndMu sync.Mutex + +func randDuration(center time.Duration) time.Duration { + rndMu.Lock() + defer rndMu.Unlock() + + var ri = int64(center) + var jitter = rnd.Int63n(ri) + return time.Duration(math.Abs(float64(ri + jitter))) +} + +func newRnd() *rand.Rand { + var seed = time.Now().UnixNano() + var src = rand.NewSource(seed) + return rand.New(src) } diff --git a/vendor/github.com/go-resty/resty/v2/trace.go b/vendor/github.com/go-resty/resty/v2/trace.go index 130ff9b..23cf703 100644 --- a/vendor/github.com/go-resty/resty/v2/trace.go +++ b/vendor/github.com/go-resty/resty/v2/trace.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -7,6 +7,7 @@ package resty import ( "context" "crypto/tls" + "net" "net/http/httptrace" "time" ) @@ -27,6 +28,9 @@ type TraceInfo struct { // 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 @@ -51,10 +55,17 @@ type TraceInfo struct { // ConnIdleTime is a duration how long the connection was previously // idle, if IsConnWasIdle is true. ConnIdleTime time.Duration + + // RequestAttempt is to represent the request attempt made during a Resty + // request execution flow, including retry count. + RequestAttempt int + + // RemoteAddr returns the remote network address. + RemoteAddr net.Addr } //‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ -// CientTrace struct and its methods +// ClientTrace struct and its methods //_______________________________________________________________________ // tracer struct maps the `httptrace.ClientTrace` hooks into Fields @@ -62,13 +73,13 @@ type TraceInfo struct { // Request. type clientTrace struct { getConn time.Time - gotConn time.Time - gotFirstResponseByte time.Time dnsStart time.Time dnsDone time.Time + connectDone time.Time tlsHandshakeStart time.Time tlsHandshakeDone time.Time - wroteRequest time.Time + gotConn time.Time + gotFirstResponseByte time.Time endTime time.Time gotConnInfo httptrace.GotConnInfo } @@ -81,6 +92,23 @@ 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() }, @@ -91,21 +119,12 @@ func (t *clientTrace) createContext(ctx context.Context) context.Context { GotFirstResponseByte: func() { t.gotFirstResponseByte = time.Now() }, - DNSStart: func(_ httptrace.DNSStartInfo) { - t.dnsStart = time.Now() - }, - DNSDone: func(_ httptrace.DNSDoneInfo) { - t.dnsDone = time.Now() - }, TLSHandshakeStart: func() { t.tlsHandshakeStart = time.Now() }, TLSHandshakeDone: func(_ tls.ConnectionState, _ error) { t.tlsHandshakeDone = time.Now() }, - WroteRequest: func(_ httptrace.WroteRequestInfo) { - t.wroteRequest = 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 0000000..e15b48c --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/transport.go @@ -0,0 +1,35 @@ +// +build go1.13 + +// Copyright (c) 2015-2021 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 0000000..fbbbc59 --- /dev/null +++ b/vendor/github.com/go-resty/resty/v2/transport112.go @@ -0,0 +1,34 @@ +// +build !go1.13 + +// Copyright (c) 2015-2021 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/github.com/go-resty/resty/v2/util.go b/vendor/github.com/go-resty/resty/v2/util.go index 0920f60..b017256 100644 --- a/vendor/github.com/go-resty/resty/v2/util.go +++ b/vendor/github.com/go-resty/resty/v2/util.go @@ -1,4 +1,4 @@ -// Copyright (c) 2015-2020 Jeevanandam M (jeeva@myjeeva.com), All rights reserved. +// Copyright (c) 2015-2021 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. @@ -285,11 +285,11 @@ 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(c *Client, r *Request, hdrs http.Header) string { str := make([]string, 0, len(hdrs)) @@ -297,11 +297,13 @@ func composeHeaders(c *Client, r *Request, hdrs http.Header) string { var v string if k == "Cookie" { cv := strings.TrimSpace(strings.Join(hdrs[k], ", ")) - for _, c := range c.GetClient().Jar.Cookies(r.RawRequest.URL) { - if cv != "" { - cv = cv + "; " + c.String() - } else { - cv = c.String() + 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)) @@ -331,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/stretchr/testify/LICENSE b/vendor/github.com/stretchr/testify/LICENSE index f38ec59..4b0421c 100644 --- a/vendor/github.com/stretchr/testify/LICENSE +++ b/vendor/github.com/stretchr/testify/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2012-2018 Mat Ryer and Tyler Bunnell +Copyright (c) 2012-2020 Mat Ryer, Tyler Bunnell and contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/vendor/github.com/stretchr/testify/assert/assertion_compare.go b/vendor/github.com/stretchr/testify/assert/assertion_compare.go new file mode 100644 index 0000000..41649d2 --- /dev/null +++ b/vendor/github.com/stretchr/testify/assert/assertion_compare.go @@ -0,0 +1,394 @@ +package assert + +import ( + "fmt" + "reflect" +) + +type CompareType int + +const ( + compareLess CompareType = iota - 1 + compareEqual + compareGreater +) + +var ( + intType = reflect.TypeOf(int(1)) + int8Type = reflect.TypeOf(int8(1)) + int16Type = reflect.TypeOf(int16(1)) + int32Type = reflect.TypeOf(int32(1)) + int64Type = reflect.TypeOf(int64(1)) + + uintType = reflect.TypeOf(uint(1)) + uint8Type = reflect.TypeOf(uint8(1)) + uint16Type = reflect.TypeOf(uint16(1)) + uint32Type = reflect.TypeOf(uint32(1)) + uint64Type = reflect.TypeOf(uint64(1)) + + float32Type = reflect.TypeOf(float32(1)) + float64Type = reflect.TypeOf(float64(1)) + + stringType = reflect.TypeOf("") +) + +func compare(obj1, obj2 interface{}, kind reflect.Kind) (CompareType, bool) { + obj1Value := reflect.ValueOf(obj1) + obj2Value := reflect.ValueOf(obj2) + + // throughout this switch we try and avoid calling .Convert() if possible, + // as this has a pretty big performance impact + switch kind { + case reflect.Int: + { + intobj1, ok := obj1.(int) + if !ok { + intobj1 = obj1Value.Convert(intType).Interface().(int) + } + intobj2, ok := obj2.(int) + if !ok { + intobj2 = obj2Value.Convert(intType).Interface().(int) + } + if intobj1 > intobj2 { + return compareGreater, true + } + if intobj1 == intobj2 { + return compareEqual, true + } + if intobj1 < intobj2 { + return compareLess, true + } + } + case reflect.Int8: + { + int8obj1, ok := obj1.(int8) + if !ok { + int8obj1 = obj1Value.Convert(int8Type).Interface().(int8) + } + int8obj2, ok := obj2.(int8) + if !ok { + int8obj2 = obj2Value.Convert(int8Type).Interface().(int8) + } + if int8obj1 > int8obj2 { + return compareGreater, true + } + if int8obj1 == int8obj2 { + return compareEqual, true + } + if int8obj1 < int8obj2 { + return compareLess, true + } + } + case reflect.Int16: + { + int16obj1, ok := obj1.(int16) + if !ok { + int16obj1 = obj1Value.Convert(int16Type).Interface().(int16) + } + int16obj2, ok := obj2.(int16) + if !ok { + int16obj2 = obj2Value.Convert(int16Type).Interface().(int16) + } + if int16obj1 > int16obj2 { + return compareGreater, true + } + if int16obj1 == int16obj2 { + return compareEqual, true + } + if int16obj1 < int16obj2 { + return compareLess, true + } + } + case reflect.Int32: + { + int32obj1, ok := obj1.(int32) + if !ok { + int32obj1 = obj1Value.Convert(int32Type).Interface().(int32) + } + int32obj2, ok := obj2.(int32) + if !ok { + int32obj2 = obj2Value.Convert(int32Type).Interface().(int32) + } + if int32obj1 > int32obj2 { + return compareGreater, true + } + if int32obj1 == int32obj2 { + return compareEqual, true + } + if int32obj1 < int32obj2 { + return compareLess, true + } + } + case reflect.Int64: + { + int64obj1, ok := obj1.(int64) + if !ok { + int64obj1 = obj1Value.Convert(int64Type).Interface().(int64) + } + int64obj2, ok := obj2.(int64) + if !ok { + int64obj2 = obj2Value.Convert(int64Type).Interface().(int64) + } + if int64obj1 > int64obj2 { + return compareGreater, true + } + if int64obj1 == int64obj2 { + return compareEqual, true + } + if int64obj1 < int64obj2 { + return compareLess, true + } + } + case reflect.Uint: + { + uintobj1, ok := obj1.(uint) + if !ok { + uintobj1 = obj1Value.Convert(uintType).Interface().(uint) + } + uintobj2, ok := obj2.(uint) + if !ok { + uintobj2 = obj2Value.Convert(uintType).Interface().(uint) + } + if uintobj1 > uintobj2 { + return compareGreater, true + } + if uintobj1 == uintobj2 { + return compareEqual, true + } + if uintobj1 < uintobj2 { + return compareLess, true + } + } + case reflect.Uint8: + { + uint8obj1, ok := obj1.(uint8) + if !ok { + uint8obj1 = obj1Value.Convert(uint8Type).Interface().(uint8) + } + uint8obj2, ok := obj2.(uint8) + if !ok { + uint8obj2 = obj2Value.Convert(uint8Type).Interface().(uint8) + } + if uint8obj1 > uint8obj2 { + return compareGreater, true + } + if uint8obj1 == uint8obj2 { + return compareEqual, true + } + if uint8obj1 < uint8obj2 { + return compareLess, true + } + } + case reflect.Uint16: + { + uint16obj1, ok := obj1.(uint16) + if !ok { + uint16obj1 = obj1Value.Convert(uint16Type).Interface().(uint16) + } + uint16obj2, ok := obj2.(uint16) + if !ok { + uint16obj2 = obj2Value.Convert(uint16Type).Interface().(uint16) + } + if uint16obj1 > uint16obj2 { + return compareGreater, true + } + if uint16obj1 == uint16obj2 { + return compareEqual, true + } + if uint16obj1 < uint16obj2 { + return compareLess, true + } + } + case reflect.Uint32: + { + uint32obj1, ok := obj1.(uint32) + if !ok { + uint32obj1 = obj1Value.Convert(uint32Type).Interface().(uint32) + } + uint32obj2, ok := obj2.(uint32) + if !ok { + uint32obj2 = obj2Value.Convert(uint32Type).Interface().(uint32) + } + if uint32obj1 > uint32obj2 { + return compareGreater, true + } + if uint32obj1 == uint32obj2 { + return compareEqual, true + } + if uint32obj1 < uint32obj2 { + return compareLess, true + } + } + case reflect.Uint64: + { + uint64obj1, ok := obj1.(uint64) + if !ok { + uint64obj1 = obj1Value.Convert(uint64Type).Interface().(uint64) + } + uint64obj2, ok := obj2.(uint64) + if !ok { + uint64obj2 = obj2Value.Convert(uint64Type).Interface().(uint64) + } + if uint64obj1 > uint64obj2 { + return compareGreater, true + } + if uint64obj1 == uint64obj2 { + return compareEqual, true + } + if uint64obj1 < uint64obj2 { + return compareLess, true + } + } + case reflect.Float32: + { + float32obj1, ok := obj1.(float32) + if !ok { + float32obj1 = obj1Value.Convert(float32Type).Interface().(float32) + } + float32obj2, ok := obj2.(float32) + if !ok { + float32obj2 = obj2Value.Convert(float32Type).Interface().(float32) + } + if float32obj1 > float32obj2 { + return compareGreater, true + } + if float32obj1 == float32obj2 { + return compareEqual, true + } + if float32obj1 < float32obj2 { + return compareLess, true + } + } + case reflect.Float64: + { + float64obj1, ok := obj1.(float64) + if !ok { + float64obj1 = obj1Value.Convert(float64Type).Interface().(float64) + } + float64obj2, ok := obj2.(float64) + if !ok { + float64obj2 = obj2Value.Convert(float64Type).Interface().(float64) + } + if float64obj1 > float64obj2 { + return compareGreater, true + } + if float64obj1 == float64obj2 { + return compareEqual, true + } + if float64obj1 < float64obj2 { + return compareLess, true + } + } + case reflect.String: + { + stringobj1, ok := obj1.(string) + if !ok { + stringobj1 = obj1Value.Convert(stringType).Interface().(string) + } + stringobj2, ok := obj2.(string) + if !ok { + stringobj2 = obj2Value.Convert(stringType).Interface().(string) + } + if stringobj1 > stringobj2 { + return compareGreater, true + } + if stringobj1 == stringobj2 { + return compareEqual, true + } + if stringobj1 < stringobj2 { + return compareLess, true + } + } + } + + return compareEqual, false +} + +// Greater asserts that the first element is greater than the second +// +// assert.Greater(t, 2, 1) +// assert.Greater(t, float64(2), float64(1)) +// assert.Greater(t, "b", "a") +func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) +} + +// GreaterOrEqual asserts that the first element is greater than or equal to the second +// +// assert.GreaterOrEqual(t, 2, 1) +// assert.GreaterOrEqual(t, 2, 2) +// assert.GreaterOrEqual(t, "b", "a") +// assert.GreaterOrEqual(t, "b", "b") +func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareGreater, compareEqual}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) +} + +// Less asserts that the first element is less than the second +// +// assert.Less(t, 1, 2) +// assert.Less(t, float64(1), float64(2)) +// assert.Less(t, "a", "b") +func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) +} + +// LessOrEqual asserts that the first element is less than or equal to the second +// +// assert.LessOrEqual(t, 1, 2) +// assert.LessOrEqual(t, 2, 2) +// assert.LessOrEqual(t, "a", "b") +// assert.LessOrEqual(t, "b", "b") +func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { + return compareTwoValues(t, e1, e2, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) +} + +// Positive asserts that the specified element is positive +// +// assert.Positive(t, 1) +// assert.Positive(t, 1.23) +func Positive(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { + zero := reflect.Zero(reflect.TypeOf(e)) + return compareTwoValues(t, e, zero.Interface(), []CompareType{compareGreater}, "\"%v\" is not positive", msgAndArgs) +} + +// Negative asserts that the specified element is negative +// +// assert.Negative(t, -1) +// assert.Negative(t, -1.23) +func Negative(t TestingT, e interface{}, msgAndArgs ...interface{}) bool { + zero := reflect.Zero(reflect.TypeOf(e)) + return compareTwoValues(t, e, zero.Interface(), []CompareType{compareLess}, "\"%v\" is not negative", msgAndArgs) +} + +func compareTwoValues(t TestingT, e1 interface{}, e2 interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + e1Kind := reflect.ValueOf(e1).Kind() + e2Kind := reflect.ValueOf(e2).Kind() + if e1Kind != e2Kind { + return Fail(t, "Elements should be the same type", msgAndArgs...) + } + + compareResult, isComparable := compare(e1, e2, e1Kind) + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + } + + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, e1, e2), msgAndArgs...) + } + + return true +} + +func containsValue(values []CompareType, value CompareType) bool { + for _, v := range values { + if v == value { + return true + } + } + + return false +} diff --git a/vendor/github.com/stretchr/testify/assert/assertion_format.go b/vendor/github.com/stretchr/testify/assert/assertion_format.go index e0364e9..4dfd122 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_format.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_format.go @@ -32,7 +32,8 @@ func Containsf(t TestingT, s interface{}, contains interface{}, msg string, args return Contains(t, s, contains, append([]interface{}{msg}, args...)...) } -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func DirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -92,7 +93,7 @@ func EqualErrorf(t TestingT, theError error, errString string, msg string, args // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// assert.EqualValuesf(t, uint32(123, "error message %s", "formatted"), int32(123)) +// assert.EqualValuesf(t, uint32(123), int32(123), "error message %s", "formatted") func EqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -113,6 +114,24 @@ func Errorf(t TestingT, err error, msg string, args ...interface{}) bool { return Error(t, err, append([]interface{}{msg}, args...)...) } +// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func ErrorAsf(t TestingT, err error, target interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return ErrorAs(t, err, target, append([]interface{}{msg}, args...)...) +} + +// ErrorIsf asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func ErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return ErrorIs(t, err, target, append([]interface{}{msg}, args...)...) +} + // Eventuallyf asserts that given condition will be met in waitFor time, // periodically checking target function each tick. // @@ -126,7 +145,7 @@ func Eventuallyf(t TestingT, condition func() bool, waitFor time.Duration, tick // Exactlyf asserts that two objects are equal in value and type. // -// assert.Exactlyf(t, int32(123, "error message %s", "formatted"), int64(123)) +// assert.Exactlyf(t, int32(123), int64(123), "error message %s", "formatted") func Exactlyf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -160,7 +179,8 @@ func Falsef(t TestingT, value bool, msg string, args ...interface{}) bool { return False(t, value, append([]interface{}{msg}, args...)...) } -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -171,7 +191,7 @@ func FileExistsf(t TestingT, path string, msg string, args ...interface{}) bool // Greaterf asserts that the first element is greater than the second // // assert.Greaterf(t, 2, 1, "error message %s", "formatted") -// assert.Greaterf(t, float64(2, "error message %s", "formatted"), float64(1)) +// assert.Greaterf(t, float64(2), float64(1), "error message %s", "formatted") // assert.Greaterf(t, "b", "a", "error message %s", "formatted") func Greaterf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -223,7 +243,7 @@ func HTTPBodyNotContainsf(t TestingT, handler http.HandlerFunc, method string, u // // assert.HTTPErrorf(t, myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -235,7 +255,7 @@ func HTTPErrorf(t TestingT, handler http.HandlerFunc, method string, url string, // // assert.HTTPRedirectf(t, myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -243,6 +263,18 @@ func HTTPRedirectf(t TestingT, handler http.HandlerFunc, method string, url stri return HTTPRedirect(t, handler, method, url, values, append([]interface{}{msg}, args...)...) } +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCodef(t, myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCodef(t TestingT, handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(t, handler, method, url, values, statuscode, append([]interface{}{msg}, args...)...) +} + // HTTPSuccessf asserts that a specified handler returns a success status code. // // assert.HTTPSuccessf(t, myHandler, "POST", "http://www.google.com", nil, "error message %s", "formatted") @@ -257,7 +289,7 @@ func HTTPSuccessf(t TestingT, handler http.HandlerFunc, method string, url strin // Implementsf asserts that an object is implemented by the specified interface. // -// assert.Implementsf(t, (*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// assert.Implementsf(t, (*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -267,7 +299,7 @@ func Implementsf(t TestingT, interfaceObject interface{}, object interface{}, ms // InDeltaf asserts that the two numerals are within delta of each other. // -// assert.InDeltaf(t, math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// assert.InDeltaf(t, math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func InDeltaf(t TestingT, expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -307,6 +339,54 @@ func InEpsilonSlicef(t TestingT, expected interface{}, actual interface{}, epsil return InEpsilonSlice(t, expected, actual, epsilon, append([]interface{}{msg}, args...)...) } +// IsDecreasingf asserts that the collection is decreasing +// +// assert.IsDecreasingf(t, []int{2, 1, 0}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsDecreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +func IsDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsDecreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsIncreasingf asserts that the collection is increasing +// +// assert.IsIncreasingf(t, []int{1, 2, 3}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsIncreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +func IsIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsIncreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsNonDecreasingf asserts that the collection is not decreasing +// +// assert.IsNonDecreasingf(t, []int{1, 1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []float{1, 2}, "error message %s", "formatted") +// assert.IsNonDecreasingf(t, []string{"a", "b"}, "error message %s", "formatted") +func IsNonDecreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsNonDecreasing(t, object, append([]interface{}{msg}, args...)...) +} + +// IsNonIncreasingf asserts that the collection is not increasing +// +// assert.IsNonIncreasingf(t, []int{2, 1, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []float{2, 1}, "error message %s", "formatted") +// assert.IsNonIncreasingf(t, []string{"b", "a"}, "error message %s", "formatted") +func IsNonIncreasingf(t TestingT, object interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return IsNonIncreasing(t, object, append([]interface{}{msg}, args...)...) +} + // IsTypef asserts that the specified objects are of the same type. func IsTypef(t TestingT, expectedType interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -325,14 +405,6 @@ func JSONEqf(t TestingT, expected string, actual string, msg string, args ...int return JSONEq(t, expected, actual, append([]interface{}{msg}, args...)...) } -// YAMLEqf asserts that two YAML strings are equivalent. -func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - return YAMLEq(t, expected, actual, append([]interface{}{msg}, args...)...) -} - // Lenf asserts that the specified object has specific length. // Lenf also fails if the object has a type that len() not accept. // @@ -347,7 +419,7 @@ func Lenf(t TestingT, object interface{}, length int, msg string, args ...interf // Lessf asserts that the first element is less than the second // // assert.Lessf(t, 1, 2, "error message %s", "formatted") -// assert.Lessf(t, float64(1, "error message %s", "formatted"), float64(2)) +// assert.Lessf(t, float64(1), float64(2), "error message %s", "formatted") // assert.Lessf(t, "a", "b", "error message %s", "formatted") func Lessf(t TestingT, e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -369,6 +441,28 @@ func LessOrEqualf(t TestingT, e1 interface{}, e2 interface{}, msg string, args . return LessOrEqual(t, e1, e2, append([]interface{}{msg}, args...)...) } +// Negativef asserts that the specified element is negative +// +// assert.Negativef(t, -1, "error message %s", "formatted") +// assert.Negativef(t, -1.23, "error message %s", "formatted") +func Negativef(t TestingT, e interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Negative(t, e, append([]interface{}{msg}, args...)...) +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Neverf(t, func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func Neverf(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Never(t, condition, waitFor, tick, append([]interface{}{msg}, args...)...) +} + // Nilf asserts that the specified object is nil. // // assert.Nilf(t, err, "error message %s", "formatted") @@ -379,6 +473,15 @@ func Nilf(t TestingT, object interface{}, msg string, args ...interface{}) bool return Nil(t, object, append([]interface{}{msg}, args...)...) } +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoDirExists(t, path, append([]interface{}{msg}, args...)...) +} + // NoErrorf asserts that a function returned no error (i.e. `nil`). // // actualObj, err := SomeFunction() @@ -392,6 +495,15 @@ func NoErrorf(t TestingT, err error, msg string, args ...interface{}) bool { return NoError(t, err, append([]interface{}{msg}, args...)...) } +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExistsf(t TestingT, path string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NoFileExists(t, path, append([]interface{}{msg}, args...)...) +} + // NotContainsf asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // @@ -431,6 +543,25 @@ func NotEqualf(t TestingT, expected interface{}, actual interface{}, msg string, return NotEqual(t, expected, actual, append([]interface{}{msg}, args...)...) } +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValuesf(t, obj1, obj2, "error message %s", "formatted") +func NotEqualValuesf(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(t, expected, actual, append([]interface{}{msg}, args...)...) +} + +// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func NotErrorIsf(t TestingT, err error, target error, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotErrorIs(t, err, target, append([]interface{}{msg}, args...)...) +} + // NotNilf asserts that the specified object is not nil. // // assert.NotNilf(t, err, "error message %s", "formatted") @@ -453,7 +584,7 @@ func NotPanicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bo // NotRegexpf asserts that a specified regexp does not match a string. // -// assert.NotRegexpf(t, regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// assert.NotRegexpf(t, regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // assert.NotRegexpf(t, "^start", "it's not starting", "error message %s", "formatted") func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -462,6 +593,19 @@ func NotRegexpf(t TestingT, rx interface{}, str interface{}, msg string, args .. return NotRegexp(t, rx, str, append([]interface{}{msg}, args...)...) } +// NotSamef asserts that two pointers do not reference the same object. +// +// assert.NotSamef(t, ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSamef(t TestingT, expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return NotSame(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // NotSubsetf asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // @@ -491,6 +635,18 @@ func Panicsf(t TestingT, f PanicTestFunc, msg string, args ...interface{}) bool return Panics(t, f, append([]interface{}{msg}, args...)...) } +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithErrorf(t, "crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func PanicsWithErrorf(t TestingT, errString string, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return PanicsWithError(t, errString, f, append([]interface{}{msg}, args...)...) +} + // PanicsWithValuef asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // @@ -502,9 +658,20 @@ func PanicsWithValuef(t TestingT, expected interface{}, f PanicTestFunc, msg str return PanicsWithValue(t, expected, f, append([]interface{}{msg}, args...)...) } +// Positivef asserts that the specified element is positive +// +// assert.Positivef(t, 1, "error message %s", "formatted") +// assert.Positivef(t, 1.23, "error message %s", "formatted") +func Positivef(t TestingT, e interface{}, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return Positive(t, e, append([]interface{}{msg}, args...)...) +} + // Regexpf asserts that a specified regexp matches a string. // -// assert.Regexpf(t, regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// assert.Regexpf(t, regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // assert.Regexpf(t, "start...$", "it's not starting", "error message %s", "formatted") func Regexpf(t TestingT, rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { @@ -557,6 +724,14 @@ func WithinDurationf(t TestingT, expected time.Time, actual time.Time, delta tim return WithinDuration(t, expected, actual, delta, append([]interface{}{msg}, args...)...) } +// YAMLEqf asserts that two YAML strings are equivalent. +func YAMLEqf(t TestingT, expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + return YAMLEq(t, expected, actual, append([]interface{}{msg}, args...)...) +} + // Zerof asserts that i is the zero value for its type. func Zerof(t TestingT, i interface{}, msg string, args ...interface{}) bool { if h, ok := t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_forward.go b/vendor/github.com/stretchr/testify/assert/assertion_forward.go index 2683040..25337a6 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_forward.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_forward.go @@ -53,7 +53,8 @@ func (a *Assertions) Containsf(s interface{}, contains interface{}, msg string, return Containsf(a.t, s, contains, msg, args...) } -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -61,7 +62,8 @@ func (a *Assertions) DirExists(path string, msgAndArgs ...interface{}) bool { return DirExists(a.t, path, msgAndArgs...) } -// DirExistsf checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// DirExistsf checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func (a *Assertions) DirExistsf(path string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -167,7 +169,7 @@ func (a *Assertions) EqualValues(expected interface{}, actual interface{}, msgAn // EqualValuesf asserts that two objects are equal or convertable to the same types // and equal. // -// a.EqualValuesf(uint32(123, "error message %s", "formatted"), int32(123)) +// a.EqualValuesf(uint32(123), int32(123), "error message %s", "formatted") func (a *Assertions) EqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -202,6 +204,42 @@ func (a *Assertions) Error(err error, msgAndArgs ...interface{}) bool { return Error(a.t, err, msgAndArgs...) } +// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func (a *Assertions) ErrorAs(err error, target interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorAs(a.t, err, target, msgAndArgs...) +} + +// ErrorAsf asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func (a *Assertions) ErrorAsf(err error, target interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorAsf(a.t, err, target, msg, args...) +} + +// ErrorIs asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) ErrorIs(err error, target error, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorIs(a.t, err, target, msgAndArgs...) +} + +// ErrorIsf asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) ErrorIsf(err error, target error, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return ErrorIsf(a.t, err, target, msg, args...) +} + // Errorf asserts that a function returned an error (i.e. not `nil`). // // actualObj, err := SomeFunction() @@ -249,7 +287,7 @@ func (a *Assertions) Exactly(expected interface{}, actual interface{}, msgAndArg // Exactlyf asserts that two objects are equal in value and type. // -// a.Exactlyf(int32(123, "error message %s", "formatted"), int64(123)) +// a.Exactlyf(int32(123), int64(123), "error message %s", "formatted") func (a *Assertions) Exactlyf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -309,7 +347,8 @@ func (a *Assertions) Falsef(value bool, msg string, args ...interface{}) bool { return Falsef(a.t, value, msg, args...) } -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -317,7 +356,8 @@ func (a *Assertions) FileExists(path string, msgAndArgs ...interface{}) bool { return FileExists(a.t, path, msgAndArgs...) } -// FileExistsf checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExistsf checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func (a *Assertions) FileExistsf(path string, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -366,7 +406,7 @@ func (a *Assertions) GreaterOrEqualf(e1 interface{}, e2 interface{}, msg string, // Greaterf asserts that the first element is greater than the second // // a.Greaterf(2, 1, "error message %s", "formatted") -// a.Greaterf(float64(2, "error message %s", "formatted"), float64(1)) +// a.Greaterf(float64(2), float64(1), "error message %s", "formatted") // a.Greaterf("b", "a", "error message %s", "formatted") func (a *Assertions) Greaterf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -443,7 +483,7 @@ func (a *Assertions) HTTPError(handler http.HandlerFunc, method string, url stri // // a.HTTPErrorf(myHandler, "POST", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPErrorf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -467,7 +507,7 @@ func (a *Assertions) HTTPRedirect(handler http.HandlerFunc, method string, url s // // a.HTTPRedirectf(myHandler, "GET", "/a/b/c", url.Values{"a": []string{"b", "c"}} // -// Returns whether the assertion was successful (true, "error message %s", "formatted") or not (false). +// Returns whether the assertion was successful (true) or not (false). func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url string, values url.Values, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -475,6 +515,30 @@ func (a *Assertions) HTTPRedirectf(handler http.HandlerFunc, method string, url return HTTPRedirectf(a.t, handler, method, url, values, msg, args...) } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCode(myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCode(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCode(a.t, handler, method, url, values, statuscode, msgAndArgs...) +} + +// HTTPStatusCodef asserts that a specified handler returns a specified status code. +// +// a.HTTPStatusCodef(myHandler, "GET", "/notImplemented", nil, 501, "error message %s", "formatted") +// +// Returns whether the assertion was successful (true) or not (false). +func (a *Assertions) HTTPStatusCodef(handler http.HandlerFunc, method string, url string, values url.Values, statuscode int, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return HTTPStatusCodef(a.t, handler, method, url, values, statuscode, msg, args...) +} + // HTTPSuccess asserts that a specified handler returns a success status code. // // a.HTTPSuccess(myHandler, "POST", "http://www.google.com", nil) @@ -511,7 +575,7 @@ func (a *Assertions) Implements(interfaceObject interface{}, object interface{}, // Implementsf asserts that an object is implemented by the specified interface. // -// a.Implementsf((*MyInterface, "error message %s", "formatted")(nil), new(MyObject)) +// a.Implementsf((*MyInterface)(nil), new(MyObject), "error message %s", "formatted") func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -521,7 +585,7 @@ func (a *Assertions) Implementsf(interfaceObject interface{}, object interface{} // InDelta asserts that the two numerals are within delta of each other. // -// a.InDelta(math.Pi, (22 / 7.0), 0.01) +// a.InDelta(math.Pi, 22/7.0, 0.01) func (a *Assertions) InDelta(expected interface{}, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -563,7 +627,7 @@ func (a *Assertions) InDeltaSlicef(expected interface{}, actual interface{}, del // InDeltaf asserts that the two numerals are within delta of each other. // -// a.InDeltaf(math.Pi, (22 / 7.0, "error message %s", "formatted"), 0.01) +// a.InDeltaf(math.Pi, 22/7.0, 0.01, "error message %s", "formatted") func (a *Assertions) InDeltaf(expected interface{}, actual interface{}, delta float64, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { h.Helper() @@ -603,6 +667,102 @@ func (a *Assertions) InEpsilonf(expected interface{}, actual interface{}, epsilo return InEpsilonf(a.t, expected, actual, epsilon, msg, args...) } +// IsDecreasing asserts that the collection is decreasing +// +// a.IsDecreasing([]int{2, 1, 0}) +// a.IsDecreasing([]float{2, 1}) +// a.IsDecreasing([]string{"b", "a"}) +func (a *Assertions) IsDecreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsDecreasing(a.t, object, msgAndArgs...) +} + +// IsDecreasingf asserts that the collection is decreasing +// +// a.IsDecreasingf([]int{2, 1, 0}, "error message %s", "formatted") +// a.IsDecreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsDecreasingf([]string{"b", "a"}, "error message %s", "formatted") +func (a *Assertions) IsDecreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsDecreasingf(a.t, object, msg, args...) +} + +// IsIncreasing asserts that the collection is increasing +// +// a.IsIncreasing([]int{1, 2, 3}) +// a.IsIncreasing([]float{1, 2}) +// a.IsIncreasing([]string{"a", "b"}) +func (a *Assertions) IsIncreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsIncreasing(a.t, object, msgAndArgs...) +} + +// IsIncreasingf asserts that the collection is increasing +// +// a.IsIncreasingf([]int{1, 2, 3}, "error message %s", "formatted") +// a.IsIncreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsIncreasingf([]string{"a", "b"}, "error message %s", "formatted") +func (a *Assertions) IsIncreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsIncreasingf(a.t, object, msg, args...) +} + +// IsNonDecreasing asserts that the collection is not decreasing +// +// a.IsNonDecreasing([]int{1, 1, 2}) +// a.IsNonDecreasing([]float{1, 2}) +// a.IsNonDecreasing([]string{"a", "b"}) +func (a *Assertions) IsNonDecreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonDecreasing(a.t, object, msgAndArgs...) +} + +// IsNonDecreasingf asserts that the collection is not decreasing +// +// a.IsNonDecreasingf([]int{1, 1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]float{1, 2}, "error message %s", "formatted") +// a.IsNonDecreasingf([]string{"a", "b"}, "error message %s", "formatted") +func (a *Assertions) IsNonDecreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonDecreasingf(a.t, object, msg, args...) +} + +// IsNonIncreasing asserts that the collection is not increasing +// +// a.IsNonIncreasing([]int{2, 1, 1}) +// a.IsNonIncreasing([]float{2, 1}) +// a.IsNonIncreasing([]string{"b", "a"}) +func (a *Assertions) IsNonIncreasing(object interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonIncreasing(a.t, object, msgAndArgs...) +} + +// IsNonIncreasingf asserts that the collection is not increasing +// +// a.IsNonIncreasingf([]int{2, 1, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]float{2, 1}, "error message %s", "formatted") +// a.IsNonIncreasingf([]string{"b", "a"}, "error message %s", "formatted") +func (a *Assertions) IsNonIncreasingf(object interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return IsNonIncreasingf(a.t, object, msg, args...) +} + // IsType asserts that the specified objects are of the same type. func (a *Assertions) IsType(expectedType interface{}, object interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -639,22 +799,6 @@ func (a *Assertions) JSONEqf(expected string, actual string, msg string, args .. return JSONEqf(a.t, expected, actual, msg, args...) } -// YAMLEq asserts that two YAML strings are equivalent. -func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return YAMLEq(a.t, expected, actual, msgAndArgs...) -} - -// YAMLEqf asserts that two YAML strings are equivalent. -func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args ...interface{}) bool { - if h, ok := a.t.(tHelper); ok { - h.Helper() - } - return YAMLEqf(a.t, expected, actual, msg, args...) -} - // Len asserts that the specified object has specific length. // Len also fails if the object has a type that len() not accept. // @@ -718,7 +862,7 @@ func (a *Assertions) LessOrEqualf(e1 interface{}, e2 interface{}, msg string, ar // Lessf asserts that the first element is less than the second // // a.Lessf(1, 2, "error message %s", "formatted") -// a.Lessf(float64(1, "error message %s", "formatted"), float64(2)) +// a.Lessf(float64(1), float64(2), "error message %s", "formatted") // a.Lessf("a", "b", "error message %s", "formatted") func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -727,6 +871,50 @@ func (a *Assertions) Lessf(e1 interface{}, e2 interface{}, msg string, args ...i return Lessf(a.t, e1, e2, msg, args...) } +// Negative asserts that the specified element is negative +// +// a.Negative(-1) +// a.Negative(-1.23) +func (a *Assertions) Negative(e interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Negative(a.t, e, msgAndArgs...) +} + +// Negativef asserts that the specified element is negative +// +// a.Negativef(-1, "error message %s", "formatted") +// a.Negativef(-1.23, "error message %s", "formatted") +func (a *Assertions) Negativef(e interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Negativef(a.t, e, msg, args...) +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Never(func() bool { return false; }, time.Second, 10*time.Millisecond) +func (a *Assertions) Never(condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Never(a.t, condition, waitFor, tick, msgAndArgs...) +} + +// Neverf asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// a.Neverf(func() bool { return false; }, time.Second, 10*time.Millisecond, "error message %s", "formatted") +func (a *Assertions) Neverf(condition func() bool, waitFor time.Duration, tick time.Duration, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Neverf(a.t, condition, waitFor, tick, msg, args...) +} + // Nil asserts that the specified object is nil. // // a.Nil(err) @@ -747,6 +935,24 @@ func (a *Assertions) Nilf(object interface{}, msg string, args ...interface{}) b return Nilf(a.t, object, msg, args...) } +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoDirExists(a.t, path, msgAndArgs...) +} + +// NoDirExistsf checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func (a *Assertions) NoDirExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoDirExistsf(a.t, path, msg, args...) +} + // NoError asserts that a function returned no error (i.e. `nil`). // // actualObj, err := SomeFunction() @@ -773,6 +979,24 @@ func (a *Assertions) NoErrorf(err error, msg string, args ...interface{}) bool { return NoErrorf(a.t, err, msg, args...) } +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExists(path string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoFileExists(a.t, path, msgAndArgs...) +} + +// NoFileExistsf checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func (a *Assertions) NoFileExistsf(path string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NoFileExistsf(a.t, path, msg, args...) +} + // NotContains asserts that the specified string, list(array, slice...) or map does NOT contain the // specified substring or element. // @@ -838,6 +1062,26 @@ func (a *Assertions) NotEqual(expected interface{}, actual interface{}, msgAndAr return NotEqual(a.t, expected, actual, msgAndArgs...) } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValues(obj1, obj2) +func (a *Assertions) NotEqualValues(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValues(a.t, expected, actual, msgAndArgs...) +} + +// NotEqualValuesf asserts that two objects are not equal even when converted to the same type +// +// a.NotEqualValuesf(obj1, obj2, "error message %s", "formatted") +func (a *Assertions) NotEqualValuesf(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotEqualValuesf(a.t, expected, actual, msg, args...) +} + // NotEqualf asserts that the specified values are NOT equal. // // a.NotEqualf(obj1, obj2, "error message %s", "formatted") @@ -851,6 +1095,24 @@ func (a *Assertions) NotEqualf(expected interface{}, actual interface{}, msg str return NotEqualf(a.t, expected, actual, msg, args...) } +// NotErrorIs asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) NotErrorIs(err error, target error, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotErrorIs(a.t, err, target, msgAndArgs...) +} + +// NotErrorIsf asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func (a *Assertions) NotErrorIsf(err error, target error, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotErrorIsf(a.t, err, target, msg, args...) +} + // NotNil asserts that the specified object is not nil. // // a.NotNil(err) @@ -904,7 +1166,7 @@ func (a *Assertions) NotRegexp(rx interface{}, str interface{}, msgAndArgs ...in // NotRegexpf asserts that a specified regexp does not match a string. // -// a.NotRegexpf(regexp.MustCompile("starts", "error message %s", "formatted"), "it's starting") +// a.NotRegexpf(regexp.MustCompile("starts"), "it's starting", "error message %s", "formatted") // a.NotRegexpf("^start", "it's not starting", "error message %s", "formatted") func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -913,6 +1175,32 @@ func (a *Assertions) NotRegexpf(rx interface{}, str interface{}, msg string, arg return NotRegexpf(a.t, rx, str, msg, args...) } +// NotSame asserts that two pointers do not reference the same object. +// +// a.NotSame(ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSame(expected interface{}, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSame(a.t, expected, actual, msgAndArgs...) +} + +// NotSamef asserts that two pointers do not reference the same object. +// +// a.NotSamef(ptr1, ptr2, "error message %s", "formatted") +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func (a *Assertions) NotSamef(expected interface{}, actual interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return NotSamef(a.t, expected, actual, msg, args...) +} + // NotSubset asserts that the specified list(array, slice...) contains not all // elements given in the specified subset(array, slice...). // @@ -961,6 +1249,30 @@ func (a *Assertions) Panics(f PanicTestFunc, msgAndArgs ...interface{}) bool { return Panics(a.t, f, msgAndArgs...) } +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithError("crazy error", func(){ GoCrazy() }) +func (a *Assertions) PanicsWithError(errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithError(a.t, errString, f, msgAndArgs...) +} + +// PanicsWithErrorf asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// a.PanicsWithErrorf("crazy error", func(){ GoCrazy() }, "error message %s", "formatted") +func (a *Assertions) PanicsWithErrorf(errString string, f PanicTestFunc, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return PanicsWithErrorf(a.t, errString, f, msg, args...) +} + // PanicsWithValue asserts that the code inside the specified PanicTestFunc panics, and that // the recovered panic value equals the expected panic value. // @@ -993,6 +1305,28 @@ func (a *Assertions) Panicsf(f PanicTestFunc, msg string, args ...interface{}) b return Panicsf(a.t, f, msg, args...) } +// Positive asserts that the specified element is positive +// +// a.Positive(1) +// a.Positive(1.23) +func (a *Assertions) Positive(e interface{}, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Positive(a.t, e, msgAndArgs...) +} + +// Positivef asserts that the specified element is positive +// +// a.Positivef(1, "error message %s", "formatted") +// a.Positivef(1.23, "error message %s", "formatted") +func (a *Assertions) Positivef(e interface{}, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return Positivef(a.t, e, msg, args...) +} + // Regexp asserts that a specified regexp matches a string. // // a.Regexp(regexp.MustCompile("start"), "it's starting") @@ -1006,7 +1340,7 @@ func (a *Assertions) Regexp(rx interface{}, str interface{}, msgAndArgs ...inter // Regexpf asserts that a specified regexp matches a string. // -// a.Regexpf(regexp.MustCompile("start", "error message %s", "formatted"), "it's starting") +// a.Regexpf(regexp.MustCompile("start"), "it's starting", "error message %s", "formatted") // a.Regexpf("start...$", "it's not starting", "error message %s", "formatted") func (a *Assertions) Regexpf(rx interface{}, str interface{}, msg string, args ...interface{}) bool { if h, ok := a.t.(tHelper); ok { @@ -1103,6 +1437,22 @@ func (a *Assertions) WithinDurationf(expected time.Time, actual time.Time, delta return WithinDurationf(a.t, expected, actual, delta, msg, args...) } +// YAMLEq asserts that two YAML strings are equivalent. +func (a *Assertions) YAMLEq(expected string, actual string, msgAndArgs ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return YAMLEq(a.t, expected, actual, msgAndArgs...) +} + +// YAMLEqf asserts that two YAML strings are equivalent. +func (a *Assertions) YAMLEqf(expected string, actual string, msg string, args ...interface{}) bool { + if h, ok := a.t.(tHelper); ok { + h.Helper() + } + return YAMLEqf(a.t, expected, actual, msg, args...) +} + // Zero asserts that i is the zero value for its type. func (a *Assertions) Zero(i interface{}, msgAndArgs ...interface{}) bool { if h, ok := a.t.(tHelper); ok { diff --git a/vendor/github.com/stretchr/testify/assert/assertion_order.go b/vendor/github.com/stretchr/testify/assert/assertion_order.go index 15a486c..1c3b471 100644 --- a/vendor/github.com/stretchr/testify/assert/assertion_order.go +++ b/vendor/github.com/stretchr/testify/assert/assertion_order.go @@ -5,305 +5,77 @@ import ( "reflect" ) -func compare(obj1, obj2 interface{}, kind reflect.Kind) (int, bool) { - switch kind { - case reflect.Int: - { - intobj1 := obj1.(int) - intobj2 := obj2.(int) - if intobj1 > intobj2 { - return -1, true - } - if intobj1 == intobj2 { - return 0, true - } - if intobj1 < intobj2 { - return 1, true - } - } - case reflect.Int8: - { - int8obj1 := obj1.(int8) - int8obj2 := obj2.(int8) - if int8obj1 > int8obj2 { - return -1, true - } - if int8obj1 == int8obj2 { - return 0, true - } - if int8obj1 < int8obj2 { - return 1, true - } - } - case reflect.Int16: - { - int16obj1 := obj1.(int16) - int16obj2 := obj2.(int16) - if int16obj1 > int16obj2 { - return -1, true - } - if int16obj1 == int16obj2 { - return 0, true - } - if int16obj1 < int16obj2 { - return 1, true - } - } - case reflect.Int32: - { - int32obj1 := obj1.(int32) - int32obj2 := obj2.(int32) - if int32obj1 > int32obj2 { - return -1, true - } - if int32obj1 == int32obj2 { - return 0, true - } - if int32obj1 < int32obj2 { - return 1, true - } - } - case reflect.Int64: - { - int64obj1 := obj1.(int64) - int64obj2 := obj2.(int64) - if int64obj1 > int64obj2 { - return -1, true - } - if int64obj1 == int64obj2 { - return 0, true - } - if int64obj1 < int64obj2 { - return 1, true - } - } - case reflect.Uint: - { - uintobj1 := obj1.(uint) - uintobj2 := obj2.(uint) - if uintobj1 > uintobj2 { - return -1, true - } - if uintobj1 == uintobj2 { - return 0, true - } - if uintobj1 < uintobj2 { - return 1, true - } - } - case reflect.Uint8: - { - uint8obj1 := obj1.(uint8) - uint8obj2 := obj2.(uint8) - if uint8obj1 > uint8obj2 { - return -1, true - } - if uint8obj1 == uint8obj2 { - return 0, true - } - if uint8obj1 < uint8obj2 { - return 1, true - } - } - case reflect.Uint16: - { - uint16obj1 := obj1.(uint16) - uint16obj2 := obj2.(uint16) - if uint16obj1 > uint16obj2 { - return -1, true - } - if uint16obj1 == uint16obj2 { - return 0, true - } - if uint16obj1 < uint16obj2 { - return 1, true - } - } - case reflect.Uint32: - { - uint32obj1 := obj1.(uint32) - uint32obj2 := obj2.(uint32) - if uint32obj1 > uint32obj2 { - return -1, true - } - if uint32obj1 == uint32obj2 { - return 0, true - } - if uint32obj1 < uint32obj2 { - return 1, true - } - } - case reflect.Uint64: - { - uint64obj1 := obj1.(uint64) - uint64obj2 := obj2.(uint64) - if uint64obj1 > uint64obj2 { - return -1, true - } - if uint64obj1 == uint64obj2 { - return 0, true - } - if uint64obj1 < uint64obj2 { - return 1, true - } - } - case reflect.Float32: - { - float32obj1 := obj1.(float32) - float32obj2 := obj2.(float32) - if float32obj1 > float32obj2 { - return -1, true - } - if float32obj1 == float32obj2 { - return 0, true - } - if float32obj1 < float32obj2 { - return 1, true - } - } - case reflect.Float64: - { - float64obj1 := obj1.(float64) - float64obj2 := obj2.(float64) - if float64obj1 > float64obj2 { - return -1, true - } - if float64obj1 == float64obj2 { - return 0, true - } - if float64obj1 < float64obj2 { - return 1, true - } - } - case reflect.String: - { - stringobj1 := obj1.(string) - stringobj2 := obj2.(string) - if stringobj1 > stringobj2 { - return -1, true - } - if stringobj1 == stringobj2 { - return 0, true - } - if stringobj1 < stringobj2 { - return 1, true - } - } - } - - return 0, false -} - -// Greater asserts that the first element is greater than the second -// -// assert.Greater(t, 2, 1) -// assert.Greater(t, float64(2), float64(1)) -// assert.Greater(t, "b", "a") -func Greater(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() +// isOrdered checks that collection contains orderable elements. +func isOrdered(t TestingT, object interface{}, allowedComparesResults []CompareType, failMessage string, msgAndArgs ...interface{}) bool { + objKind := reflect.TypeOf(object).Kind() + if objKind != reflect.Slice && objKind != reflect.Array { + return false } - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } + objValue := reflect.ValueOf(object) + objLen := objValue.Len() - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) + if objLen <= 1 { + return true } - if res != -1 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than \"%v\"", e1, e2), msgAndArgs...) - } + value := objValue.Index(0) + valueInterface := value.Interface() + firstValueKind := value.Kind() - return true -} + for i := 1; i < objLen; i++ { + prevValue := value + prevValueInterface := valueInterface -// GreaterOrEqual asserts that the first element is greater than or equal to the second -// -// assert.GreaterOrEqual(t, 2, 1) -// assert.GreaterOrEqual(t, 2, 2) -// assert.GreaterOrEqual(t, "b", "a") -// assert.GreaterOrEqual(t, "b", "b") -func GreaterOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } + value = objValue.Index(i) + valueInterface = value.Interface() - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } + compareResult, isComparable := compare(prevValueInterface, valueInterface, firstValueKind) - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } + if !isComparable { + return Fail(t, fmt.Sprintf("Can not compare type \"%s\" and \"%s\"", reflect.TypeOf(value), reflect.TypeOf(prevValue)), msgAndArgs...) + } - if res != -1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not greater than or equal to \"%v\"", e1, e2), msgAndArgs...) + if !containsValue(allowedComparesResults, compareResult) { + return Fail(t, fmt.Sprintf(failMessage, prevValue, value), msgAndArgs...) + } } return true } -// Less asserts that the first element is less than the second +// IsIncreasing asserts that the collection is increasing // -// assert.Less(t, 1, 2) -// assert.Less(t, float64(1), float64(2)) -// assert.Less(t, "a", "b") -func Less(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } - - if res != 1 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than \"%v\"", e1, e2), msgAndArgs...) - } - - return true +// assert.IsIncreasing(t, []int{1, 2, 3}) +// assert.IsIncreasing(t, []float{1, 2}) +// assert.IsIncreasing(t, []string{"a", "b"}) +func IsIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []CompareType{compareLess}, "\"%v\" is not less than \"%v\"", msgAndArgs) } -// LessOrEqual asserts that the first element is less than or equal to the second +// IsNonIncreasing asserts that the collection is not increasing // -// assert.LessOrEqual(t, 1, 2) -// assert.LessOrEqual(t, 2, 2) -// assert.LessOrEqual(t, "a", "b") -// assert.LessOrEqual(t, "b", "b") -func LessOrEqual(t TestingT, e1 interface{}, e2 interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - e1Kind := reflect.ValueOf(e1).Kind() - e2Kind := reflect.ValueOf(e2).Kind() - if e1Kind != e2Kind { - return Fail(t, "Elements should be the same type", msgAndArgs...) - } - - res, isComparable := compare(e1, e2, e1Kind) - if !isComparable { - return Fail(t, fmt.Sprintf("Can not compare type \"%s\"", reflect.TypeOf(e1)), msgAndArgs...) - } +// assert.IsNonIncreasing(t, []int{2, 1, 1}) +// assert.IsNonIncreasing(t, []float{2, 1}) +// assert.IsNonIncreasing(t, []string{"b", "a"}) +func IsNonIncreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []CompareType{compareEqual, compareGreater}, "\"%v\" is not greater than or equal to \"%v\"", msgAndArgs) +} - if res != 1 && res != 0 { - return Fail(t, fmt.Sprintf("\"%v\" is not less than or equal to \"%v\"", e1, e2), msgAndArgs...) - } +// IsDecreasing asserts that the collection is decreasing +// +// assert.IsDecreasing(t, []int{2, 1, 0}) +// assert.IsDecreasing(t, []float{2, 1}) +// assert.IsDecreasing(t, []string{"b", "a"}) +func IsDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []CompareType{compareGreater}, "\"%v\" is not greater than \"%v\"", msgAndArgs) +} - return true +// IsNonDecreasing asserts that the collection is not decreasing +// +// assert.IsNonDecreasing(t, []int{1, 1, 2}) +// assert.IsNonDecreasing(t, []float{1, 2}) +// assert.IsNonDecreasing(t, []string{"a", "b"}) +func IsNonDecreasing(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { + return isOrdered(t, object, []CompareType{compareLess, compareEqual}, "\"%v\" is not less than or equal to \"%v\"", msgAndArgs) } diff --git a/vendor/github.com/stretchr/testify/assert/assertions.go b/vendor/github.com/stretchr/testify/assert/assertions.go index 044da8b..bcac440 100644 --- a/vendor/github.com/stretchr/testify/assert/assertions.go +++ b/vendor/github.com/stretchr/testify/assert/assertions.go @@ -11,6 +11,7 @@ import ( "reflect" "regexp" "runtime" + "runtime/debug" "strings" "time" "unicode" @@ -18,10 +19,10 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/pmezard/go-difflib/difflib" - yaml "gopkg.in/yaml.v2" + yaml "gopkg.in/yaml.v3" ) -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_format.go.tmpl +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_format.go.tmpl" // TestingT is an interface wrapper around *testing.T type TestingT interface { @@ -44,7 +45,7 @@ type BoolAssertionFunc func(TestingT, bool, ...interface{}) bool // for table driven tests. type ErrorAssertionFunc func(TestingT, error, ...interface{}) bool -// Comparison a custom function that returns true on success and false on failure +// Comparison is a custom function that returns true on success and false on failure type Comparison func() (success bool) /* @@ -103,11 +104,11 @@ the problem actually occurred in calling code.*/ // failed. func CallerInfo() []string { - pc := uintptr(0) - file := "" - line := 0 - ok := false - name := "" + var pc uintptr + var ok bool + var file string + var line int + var name string callers := []string{} for i := 0; ; i++ { @@ -171,8 +172,8 @@ func isTest(name, prefix string) bool { if len(name) == len(prefix) { // "Test" is ok return true } - rune, _ := utf8.DecodeRuneInString(name[len(prefix):]) - return !unicode.IsLower(rune) + r, _ := utf8.DecodeRuneInString(name[len(prefix):]) + return !unicode.IsLower(r) } func messageFromMsgAndArgs(msgAndArgs ...interface{}) string { @@ -351,6 +352,19 @@ func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) } +// validateEqualArgs checks whether provided arguments can be safely used in the +// Equal/NotEqual functions. +func validateEqualArgs(expected, actual interface{}) error { + if expected == nil && actual == nil { + return nil + } + + if isFunction(expected) || isFunction(actual) { + return errors.New("cannot take func type as argument") + } + return nil +} + // Same asserts that two pointers reference the same object. // // assert.Same(t, ptr1, ptr2) @@ -362,18 +376,7 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b h.Helper() } - expectedPtr, actualPtr := reflect.ValueOf(expected), reflect.ValueOf(actual) - if expectedPtr.Kind() != reflect.Ptr || actualPtr.Kind() != reflect.Ptr { - return Fail(t, "Invalid operation: both arguments must be pointers", msgAndArgs...) - } - - expectedType, actualType := reflect.TypeOf(expected), reflect.TypeOf(actual) - if expectedType != actualType { - return Fail(t, fmt.Sprintf("Pointer expected to be of type %v, but was %v", - expectedType, actualType), msgAndArgs...) - } - - if expected != actual { + if !samePointers(expected, actual) { return Fail(t, fmt.Sprintf("Not same: \n"+ "expected: %p %#v\n"+ "actual : %p %#v", expected, expected, actual, actual), msgAndArgs...) @@ -382,6 +385,42 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b return true } +// NotSame asserts that two pointers do not reference the same object. +// +// assert.NotSame(t, ptr1, ptr2) +// +// Both arguments must be pointer variables. Pointer variable sameness is +// determined based on the equality of both type and value. +func NotSame(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if samePointers(expected, actual) { + return Fail(t, fmt.Sprintf( + "Expected and actual point to the same object: %p %#v", + expected, expected), msgAndArgs...) + } + return true +} + +// samePointers compares two generic interface objects and returns whether +// they point to the same object +func samePointers(first, second interface{}) bool { + firstPtr, secondPtr := reflect.ValueOf(first), reflect.ValueOf(second) + if firstPtr.Kind() != reflect.Ptr || secondPtr.Kind() != reflect.Ptr { + return false + } + + firstType, secondType := reflect.TypeOf(first), reflect.TypeOf(second) + if firstType != secondType { + return false + } + + // compare pointer addresses + return first == second +} + // formatUnequalValues takes two values of arbitrary types and returns string // representations appropriate to be presented to the user. // @@ -390,12 +429,27 @@ func Same(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) b // to a type conversion in the Go grammar. func formatUnequalValues(expected, actual interface{}) (e string, a string) { if reflect.TypeOf(expected) != reflect.TypeOf(actual) { - return fmt.Sprintf("%T(%#v)", expected, expected), - fmt.Sprintf("%T(%#v)", actual, actual) + return fmt.Sprintf("%T(%s)", expected, truncatingFormat(expected)), + fmt.Sprintf("%T(%s)", actual, truncatingFormat(actual)) + } + switch expected.(type) { + case time.Duration: + return fmt.Sprintf("%v", expected), fmt.Sprintf("%v", actual) } + return truncatingFormat(expected), truncatingFormat(actual) +} - return fmt.Sprintf("%#v", expected), - fmt.Sprintf("%#v", actual) +// truncatingFormat formats the data and truncates it if it's too long. +// +// This helps keep formatted error messages lines from exceeding the +// bufio.MaxScanTokenSize max line length that the go testing framework imposes. +func truncatingFormat(data interface{}) string { + value := fmt.Sprintf("%#v", data) + max := bufio.MaxScanTokenSize - 100 // Give us some space the type info too if needed. + if len(value) > max { + value = value[0:max] + "<... truncated>" + } + return value } // EqualValues asserts that two objects are equal or convertable to the same types @@ -442,12 +496,12 @@ func Exactly(t TestingT, expected, actual interface{}, msgAndArgs ...interface{} // // assert.NotNil(t, err) func NotNil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if !isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Expected value not to be nil.", msgAndArgs...) } @@ -488,12 +542,12 @@ func isNil(object interface{}) bool { // // assert.Nil(t, err) func Nil(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if isNil(object) { return true } + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Expected nil, but got: %#v", object), msgAndArgs...) } @@ -530,12 +584,11 @@ func isEmpty(object interface{}) bool { // // assert.Empty(t, obj) func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should be empty, but was %v", object), msgAndArgs...) } @@ -550,12 +603,11 @@ func Empty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { // assert.Equal(t, "two", obj[1]) // } func NotEmpty(t TestingT, object interface{}, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - pass := !isEmpty(object) if !pass { + if h, ok := t.(tHelper); ok { + h.Helper() + } Fail(t, fmt.Sprintf("Should NOT be empty, but was %v", object), msgAndArgs...) } @@ -598,16 +650,10 @@ func Len(t TestingT, object interface{}, length int, msgAndArgs ...interface{}) // // assert.True(t, myBool) func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if h, ok := t.(interface { - Helper() - }); ok { - h.Helper() - } - - if value != true { + if !value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be true", msgAndArgs...) } @@ -619,11 +665,10 @@ func True(t TestingT, value bool, msgAndArgs ...interface{}) bool { // // assert.False(t, myBool) func False(t TestingT, value bool, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - - if value != false { + if value { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "Should be false", msgAndArgs...) } @@ -654,6 +699,21 @@ func NotEqual(t TestingT, expected, actual interface{}, msgAndArgs ...interface{ } +// NotEqualValues asserts that two objects are not equal even when converted to the same type +// +// assert.NotEqualValues(t, obj1, obj2) +func NotEqualValues(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + if ObjectsAreEqualValues(expected, actual) { + return Fail(t, fmt.Sprintf("Should not be: %#v\n", actual), msgAndArgs...) + } + + return true +} + // containsElement try loop over the list check if the list includes the element. // return (false, false) if impossible. // return (true, false) if element was not found. @@ -706,10 +766,10 @@ func Contains(t TestingT, s, contains interface{}, msgAndArgs ...interface{}) bo ok, found := includeElement(s, contains) if !ok { - return Fail(t, fmt.Sprintf("\"%s\" could not be applied builtin len()", s), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v could not be applied builtin len()", s), msgAndArgs...) } if !found { - return Fail(t, fmt.Sprintf("\"%s\" does not contain \"%s\"", s, contains), msgAndArgs...) + return Fail(t, fmt.Sprintf("%#v does not contain %#v", s, contains), msgAndArgs...) } return true @@ -840,27 +900,39 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface return true } - aKind := reflect.TypeOf(listA).Kind() - bKind := reflect.TypeOf(listB).Kind() + if !isList(t, listA, msgAndArgs...) || !isList(t, listB, msgAndArgs...) { + return false + } + + extraA, extraB := diffLists(listA, listB) - if aKind != reflect.Array && aKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listA, aKind), msgAndArgs...) + if len(extraA) == 0 && len(extraB) == 0 { + return true } - if bKind != reflect.Array && bKind != reflect.Slice { - return Fail(t, fmt.Sprintf("%q has an unsupported type %s", listB, bKind), msgAndArgs...) + return Fail(t, formatListDiff(listA, listB, extraA, extraB), msgAndArgs...) +} + +// isList checks that the provided value is array or slice. +func isList(t TestingT, list interface{}, msgAndArgs ...interface{}) (ok bool) { + kind := reflect.TypeOf(list).Kind() + if kind != reflect.Array && kind != reflect.Slice { + return Fail(t, fmt.Sprintf("%q has an unsupported type %s, expecting array or slice", list, kind), + msgAndArgs...) } + return true +} +// diffLists diffs two arrays/slices and returns slices of elements that are only in A and only in B. +// If some element is present multiple times, each instance is counted separately (e.g. if something is 2x in A and +// 5x in B, it will be 0x in extraA and 3x in extraB). The order of items in both lists is ignored. +func diffLists(listA, listB interface{}) (extraA, extraB []interface{}) { aValue := reflect.ValueOf(listA) bValue := reflect.ValueOf(listB) aLen := aValue.Len() bLen := bValue.Len() - if aLen != bLen { - return Fail(t, fmt.Sprintf("lengths don't match: %d != %d", aLen, bLen), msgAndArgs...) - } - // Mark indexes in bValue that we already used visited := make([]bool, bLen) for i := 0; i < aLen; i++ { @@ -877,11 +949,38 @@ func ElementsMatch(t TestingT, listA, listB interface{}, msgAndArgs ...interface } } if !found { - return Fail(t, fmt.Sprintf("element %s appears more times in %s than in %s", element, aValue, bValue), msgAndArgs...) + extraA = append(extraA, element) } } - return true + for j := 0; j < bLen; j++ { + if visited[j] { + continue + } + extraB = append(extraB, bValue.Index(j).Interface()) + } + + return +} + +func formatListDiff(listA, listB interface{}, extraA, extraB []interface{}) string { + var msg bytes.Buffer + + msg.WriteString("elements differ") + if len(extraA) > 0 { + msg.WriteString("\n\nextra elements in list A:\n") + msg.WriteString(spewConfig.Sdump(extraA)) + } + if len(extraB) > 0 { + msg.WriteString("\n\nextra elements in list B:\n") + msg.WriteString(spewConfig.Sdump(extraB)) + } + msg.WriteString("\n\nlistA:\n") + msg.WriteString(spewConfig.Sdump(listA)) + msg.WriteString("\n\nlistB:\n") + msg.WriteString(spewConfig.Sdump(listB)) + + return msg.String() } // Condition uses a Comparison to assert a complex condition. @@ -901,15 +1000,17 @@ func Condition(t TestingT, comp Comparison, msgAndArgs ...interface{}) bool { type PanicTestFunc func() // didPanic returns true if the function passed to it panics. Otherwise, it returns false. -func didPanic(f PanicTestFunc) (bool, interface{}) { +func didPanic(f PanicTestFunc) (bool, interface{}, string) { didPanic := false var message interface{} + var stack string func() { defer func() { if message = recover(); message != nil { didPanic = true + stack = string(debug.Stack()) } }() @@ -918,7 +1019,7 @@ func didPanic(f PanicTestFunc) (bool, interface{}) { }() - return didPanic, message + return didPanic, message, stack } @@ -930,7 +1031,7 @@ func Panics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { h.Helper() } - if funcDidPanic, panicValue := didPanic(f); !funcDidPanic { + if funcDidPanic, panicValue, _ := didPanic(f); !funcDidPanic { return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) } @@ -946,12 +1047,34 @@ func PanicsWithValue(t TestingT, expected interface{}, f PanicTestFunc, msgAndAr h.Helper() } - funcDidPanic, panicValue := didPanic(f) + funcDidPanic, panicValue, panickedStack := didPanic(f) if !funcDidPanic { return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) } if panicValue != expected { - return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v", f, expected, panicValue), msgAndArgs...) + return Fail(t, fmt.Sprintf("func %#v should panic with value:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, expected, panicValue, panickedStack), msgAndArgs...) + } + + return true +} + +// PanicsWithError asserts that the code inside the specified PanicTestFunc +// panics, and that the recovered panic value is an error that satisfies the +// EqualError comparison. +// +// assert.PanicsWithError(t, "crazy error", func(){ GoCrazy() }) +func PanicsWithError(t TestingT, errString string, f PanicTestFunc, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + funcDidPanic, panicValue, panickedStack := didPanic(f) + if !funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should panic\n\tPanic value:\t%#v", f, panicValue), msgAndArgs...) + } + panicErr, ok := panicValue.(error) + if !ok || panicErr.Error() != errString { + return Fail(t, fmt.Sprintf("func %#v should panic with error message:\t%#v\n\tPanic value:\t%#v\n\tPanic stack:\t%s", f, errString, panicValue, panickedStack), msgAndArgs...) } return true @@ -965,8 +1088,8 @@ func NotPanics(t TestingT, f PanicTestFunc, msgAndArgs ...interface{}) bool { h.Helper() } - if funcDidPanic, panicValue := didPanic(f); funcDidPanic { - return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v", f, panicValue), msgAndArgs...) + if funcDidPanic, panicValue, panickedStack := didPanic(f); funcDidPanic { + return Fail(t, fmt.Sprintf("func %#v should not panic\n\tPanic value:\t%v\n\tPanic stack:\t%s", f, panicValue, panickedStack), msgAndArgs...) } return true @@ -993,6 +1116,8 @@ func toFloat(x interface{}) (float64, bool) { xok := true switch xn := x.(type) { + case uint: + xf = float64(xn) case uint8: xf = float64(xn) case uint16: @@ -1014,7 +1139,7 @@ func toFloat(x interface{}) (float64, bool) { case float32: xf = float64(xn) case float64: - xf = float64(xn) + xf = xn case time.Duration: xf = float64(xn) default: @@ -1026,7 +1151,7 @@ func toFloat(x interface{}) (float64, bool) { // InDelta asserts that the two numerals are within delta of each other. // -// assert.InDelta(t, math.Pi, (22 / 7.0), 0.01) +// assert.InDelta(t, math.Pi, 22/7.0, 0.01) func InDelta(t TestingT, expected, actual interface{}, delta float64, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1128,6 +1253,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !aok { return 0, fmt.Errorf("expected value %q cannot be converted to float", expected) } + if math.IsNaN(af) { + return 0, errors.New("expected value must not be NaN") + } if af == 0 { return 0, fmt.Errorf("expected value must have a value other than zero to calculate the relative error") } @@ -1135,6 +1263,9 @@ func calcRelativeError(expected, actual interface{}) (float64, error) { if !bok { return 0, fmt.Errorf("actual value %q cannot be converted to float", actual) } + if math.IsNaN(bf) { + return 0, errors.New("actual value must not be NaN") + } return math.Abs(af-bf) / math.Abs(af), nil } @@ -1144,6 +1275,9 @@ func InEpsilon(t TestingT, expected, actual interface{}, epsilon float64, msgAnd if h, ok := t.(tHelper); ok { h.Helper() } + if math.IsNaN(epsilon) { + return Fail(t, "epsilon must not be NaN") + } actualEpsilon, err := calcRelativeError(expected, actual) if err != nil { return Fail(t, err.Error(), msgAndArgs...) @@ -1191,10 +1325,10 @@ func InEpsilonSlice(t TestingT, expected, actual interface{}, epsilon float64, m // assert.Equal(t, expectedObj, actualObj) // } func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } if err != nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, fmt.Sprintf("Received unexpected error:\n%+v", err), msgAndArgs...) } @@ -1208,11 +1342,10 @@ func NoError(t TestingT, err error, msgAndArgs ...interface{}) bool { // assert.Equal(t, expectedError, err) // } func Error(t TestingT, err error, msgAndArgs ...interface{}) bool { - if h, ok := t.(tHelper); ok { - h.Helper() - } - if err == nil { + if h, ok := t.(tHelper); ok { + h.Helper() + } return Fail(t, "An error is expected but got nil.", msgAndArgs...) } @@ -1314,7 +1447,8 @@ func NotZero(t TestingT, i interface{}, msgAndArgs ...interface{}) bool { return true } -// FileExists checks whether a file exists in the given path. It also fails if the path points to a directory or there is an error when trying to check the file. +// FileExists checks whether a file exists in the given path. It also fails if +// the path points to a directory or there is an error when trying to check the file. func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1332,7 +1466,24 @@ func FileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { return true } -// DirExists checks whether a directory exists in the given path. It also fails if the path is a file rather a directory or there is an error checking whether it exists. +// NoFileExists checks whether a file does not exist in a given path. It fails +// if the path points to an existing _file_ only. +func NoFileExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + return true + } + if info.IsDir() { + return true + } + return Fail(t, fmt.Sprintf("file %q exists", path), msgAndArgs...) +} + +// DirExists checks whether a directory exists in the given path. It also fails +// if the path is a file rather a directory or there is an error checking whether it exists. func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { if h, ok := t.(tHelper); ok { h.Helper() @@ -1350,6 +1501,25 @@ func DirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { return true } +// NoDirExists checks whether a directory does not exist in the given path. +// It fails if the path points to an existing _directory_ only. +func NoDirExists(t TestingT, path string, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + info, err := os.Lstat(path) + if err != nil { + if os.IsNotExist(err) { + return true + } + return true + } + if !info.IsDir() { + return true + } + return Fail(t, fmt.Sprintf("directory %q exists", path), msgAndArgs...) +} + // JSONEq asserts that two JSON strings are equivalent. // // assert.JSONEq(t, `{"hello": "world", "foo": "bar"}`, `{"foo": "bar", "hello": "world"}`) @@ -1439,15 +1609,6 @@ func diff(expected interface{}, actual interface{}) string { return "\n\nDiff:\n" + diff } -// validateEqualArgs checks whether provided arguments can be safely used in the -// Equal/NotEqual functions. -func validateEqualArgs(expected, actual interface{}) error { - if isFunction(expected) || isFunction(actual) { - return errors.New("cannot take func type as argument") - } - return nil -} - func isFunction(arg interface{}) bool { if arg == nil { return false @@ -1460,6 +1621,8 @@ var spewConfig = spew.ConfigState{ DisablePointerAddresses: true, DisableCapacities: true, SortKeys: true, + DisableMethods: true, + MaxDepth: 10, } type tHelper interface { @@ -1475,24 +1638,137 @@ func Eventually(t TestingT, condition func() bool, waitFor time.Duration, tick t h.Helper() } + ch := make(chan bool, 1) + timer := time.NewTimer(waitFor) - ticker := time.NewTicker(tick) - checkPassed := make(chan bool) defer timer.Stop() + + ticker := time.NewTicker(tick) defer ticker.Stop() - defer close(checkPassed) - for { + + for tick := ticker.C; ; { select { case <-timer.C: return Fail(t, "Condition never satisfied", msgAndArgs...) - case result := <-checkPassed: - if result { + case <-tick: + tick = nil + go func() { ch <- condition() }() + case v := <-ch: + if v { return true } - case <-ticker.C: - go func() { - checkPassed <- condition() - }() + tick = ticker.C + } + } +} + +// Never asserts that the given condition doesn't satisfy in waitFor time, +// periodically checking the target function each tick. +// +// assert.Never(t, func() bool { return false; }, time.Second, 10*time.Millisecond) +func Never(t TestingT, condition func() bool, waitFor time.Duration, tick time.Duration, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + + ch := make(chan bool, 1) + + timer := time.NewTimer(waitFor) + defer timer.Stop() + + ticker := time.NewTicker(tick) + defer ticker.Stop() + + for tick := ticker.C; ; { + select { + case <-timer.C: + return true + case <-tick: + tick = nil + go func() { ch <- condition() }() + case v := <-ch: + if v { + return Fail(t, "Condition satisfied", msgAndArgs...) + } + tick = ticker.C } } } + +// ErrorIs asserts that at least one of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func ErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if errors.Is(err, target) { + return true + } + + var expectedText string + if target != nil { + expectedText = target.Error() + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Target error should be in err chain:\n"+ + "expected: %q\n"+ + "in chain: %s", expectedText, chain, + ), msgAndArgs...) +} + +// NotErrorIs asserts that at none of the errors in err's chain matches target. +// This is a wrapper for errors.Is. +func NotErrorIs(t TestingT, err, target error, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if !errors.Is(err, target) { + return true + } + + var expectedText string + if target != nil { + expectedText = target.Error() + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Target error should not be in err chain:\n"+ + "found: %q\n"+ + "in chain: %s", expectedText, chain, + ), msgAndArgs...) +} + +// ErrorAs asserts that at least one of the errors in err's chain matches target, and if so, sets target to that error value. +// This is a wrapper for errors.As. +func ErrorAs(t TestingT, err error, target interface{}, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + if errors.As(err, target) { + return true + } + + chain := buildErrorChainString(err) + + return Fail(t, fmt.Sprintf("Should be in error chain:\n"+ + "expected: %q\n"+ + "in chain: %s", target, chain, + ), msgAndArgs...) +} + +func buildErrorChainString(err error) string { + if err == nil { + return "" + } + + e := errors.Unwrap(err) + chain := fmt.Sprintf("%q", err.Error()) + for e != nil { + chain += fmt.Sprintf("\n\t%q", e.Error()) + e = errors.Unwrap(e) + } + return chain +} diff --git a/vendor/github.com/stretchr/testify/assert/forward_assertions.go b/vendor/github.com/stretchr/testify/assert/forward_assertions.go index 9ad5685..df189d2 100644 --- a/vendor/github.com/stretchr/testify/assert/forward_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/forward_assertions.go @@ -13,4 +13,4 @@ func New(t TestingT) *Assertions { } } -//go:generate go run ../_codegen/main.go -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs +//go:generate sh -c "cd ../_codegen && go build && cd - && ../_codegen/_codegen -output-package=assert -template=assertion_forward.go.tmpl -include-format-funcs" diff --git a/vendor/github.com/stretchr/testify/assert/http_assertions.go b/vendor/github.com/stretchr/testify/assert/http_assertions.go index df46fa7..4ed341d 100644 --- a/vendor/github.com/stretchr/testify/assert/http_assertions.go +++ b/vendor/github.com/stretchr/testify/assert/http_assertions.go @@ -33,7 +33,6 @@ func HTTPSuccess(t TestingT, handler http.HandlerFunc, method, url string, value code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isSuccessCode := code >= http.StatusOK && code <= http.StatusPartialContent @@ -56,7 +55,6 @@ func HTTPRedirect(t TestingT, handler http.HandlerFunc, method, url string, valu code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isRedirectCode := code >= http.StatusMultipleChoices && code <= http.StatusTemporaryRedirect @@ -79,7 +77,6 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values code, err := httpCode(handler, method, url, values) if err != nil { Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) - return false } isErrorCode := code >= http.StatusBadRequest @@ -90,6 +87,28 @@ func HTTPError(t TestingT, handler http.HandlerFunc, method, url string, values return isErrorCode } +// HTTPStatusCode asserts that a specified handler returns a specified status code. +// +// assert.HTTPStatusCode(t, myHandler, "GET", "/notImplemented", nil, 501) +// +// Returns whether the assertion was successful (true) or not (false). +func HTTPStatusCode(t TestingT, handler http.HandlerFunc, method, url string, values url.Values, statuscode int, msgAndArgs ...interface{}) bool { + if h, ok := t.(tHelper); ok { + h.Helper() + } + code, err := httpCode(handler, method, url, values) + if err != nil { + Fail(t, fmt.Sprintf("Failed to build test request, got error: %s", err)) + } + + successful := code == statuscode + if !successful { + Fail(t, fmt.Sprintf("Expected HTTP status code %d for %q but received %d", statuscode, url+"?"+values.Encode(), code)) + } + + return successful +} + // HTTPBody is a helper that returns HTTP body of the response. It returns // empty string if building a new request fails. func HTTPBody(handler http.HandlerFunc, method, url string, values url.Values) string { diff --git a/vendor/golang.org/x/net/context/go17.go b/vendor/golang.org/x/net/context/go17.go index d20f52b..344bd14 100644 --- a/vendor/golang.org/x/net/context/go17.go +++ b/vendor/golang.org/x/net/context/go17.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.7 // +build go1.7 package context diff --git a/vendor/golang.org/x/net/context/go19.go b/vendor/golang.org/x/net/context/go19.go index d88bd1d..64d31ec 100644 --- a/vendor/golang.org/x/net/context/go19.go +++ b/vendor/golang.org/x/net/context/go19.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build go1.9 // +build go1.9 package context diff --git a/vendor/golang.org/x/net/context/pre_go17.go b/vendor/golang.org/x/net/context/pre_go17.go index 0f35592..5270db5 100644 --- a/vendor/golang.org/x/net/context/pre_go17.go +++ b/vendor/golang.org/x/net/context/pre_go17.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.7 // +build !go1.7 package context diff --git a/vendor/golang.org/x/net/context/pre_go19.go b/vendor/golang.org/x/net/context/pre_go19.go index b105f80..1f97153 100644 --- a/vendor/golang.org/x/net/context/pre_go19.go +++ b/vendor/golang.org/x/net/context/pre_go19.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !go1.9 // +build !go1.9 package context diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go index 8eb0495..31a034c 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 41cb01612341c7ce3bcdd0cc4e696ae9f6416600 (2019-11-08T08:48:39Z)" +const version = "publicsuffix.org's public_suffix_list.dat, git revision f9f612a3386dd9a1e4a1892722e3418549520b49 (2020-11-30T21:55:23Z)" const ( nodesBitsChildren = 10 @@ -23,487 +23,499 @@ const ( ) // numTLD is the number of top level domains. -const numTLD = 1538 +const numTLD = 1513 // Text is the combined text of all labels. -const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijoinvill" + - "eksvik12ix4432-balsfjordd-dnsiskinkyotobetsulikes-piedmonticello" + - "dingenaturhistorisches3-ap-south-16-b-dataikikonaikawachinaganoh" + - "aramcoachampionshiphoptobishimadridvagsoyereportatarantours3-ap-" + - "northeast-2038bloombergbauerninomiyakonojorpelandiyusuharabloxcm" + - "s3-website-us-west-2bluedancebmoattachments5yusuisservehumourbms" + - "akyotanabellunord-aurdalvdalaskanittedallasalleangaviikaascolipi" + - "cenodumetlifeinsurancebmwedeployuu2-localhostoregontrailroadnpar" + - "isor-fronirasakindigenaklodzkochikushinonsenergyuzawabnrwegrowei" + - "bolognagasakimobetsuitainaioirasebastopologyeongnamegawakayamaga" + - "zineat-urlimitedrangedalimoliseoullensvanguardray-dnsupdaternopi" + - "lawatchesalangenishiazaindustriabomloabathsbcatholicaxiashorokan" + - "aiebondrayddnsfreebox-osascoli-picenordre-landraydnsalondonetska" + - "rlsoybonnishigobookinghostfoldnavyboomlahppiacenzachpomorskienis" + - "hiharaboschaefflerdalinkyard-cloudnsaltdalivornobostikarmoybosto" + - "nakijinsekikogentingloboavistanbulsan-sudtirolombardynaliaskimit" + - "subatamibugattiffanynysadoes-itvedestrandrivefsnillfjordrobaknol" + - "uoktachikawakembuchikumagayagawakkanaibetsubamericanfamilydsclou" + - "deitychyattorneyagawafflecellclaimsaludrudupontariodejaneirodoyb" + - "otanicalgardenishiizunazukindustriesteamfamberkeleybotanicgarden" + - "ishikatakazakinfinitintuitjxfinitybotanybouncemerckmsdnipropetro" + - "vskjervoyagebounty-fullensakerrypropertiesalvadordalibabalestran" + - "dabergamo-siemensncfdurbanamexnethnologyboutiquebecheltenham-rad" + - "io-openairbusantiquest-a-la-maisondre-landroidurhamburglogoweirb" + - "ozen-sudtirolomzaporizhzhegurinuyamashinatsukigatakasakitchenish" + - "ikatsuragit-reposalzburgloppenzaolbia-tempio-olbiatempioolbialys" + - "tokkepnogatagajobojinvestmentsamegawabozen-suedtirolondrinamssko" + - "ganeinzais-a-candidatebplacedogawarabikomaezakirunorddalorenskog" + - "lugmbhartipscbgminakamichiharabrandywinevalleybrasiliabrindisibe" + - "nikinderoybristoloseyouriparliamentkmaxxjavald-aostarostwodzisla" + - "wellbeingzonebritishcolumbialowiezaganquanpachigasakievennodesab" + - "aerobaticketsamnangerbroadcastleclerchernihivgubsampalacebroadwa" + - "ybroke-itksatxn--0trq7p7nnishikawazukamisunagawabrokerbronnoysun" + - "dweberbrothermesaverdealstahaugesunderseaportsinfolldalotenkawab" + - "rowsersafetymarketsamsclubartowfarmsteadynathomebuiltmparmattele" + - "fonicarbonia-iglesias-carboniaiglesiascarboniabrumunddalottebrun" + - "elasticbeanstalkarpaczeladzparochernigovernmentoyosatoyokawabrus" + - "selsamsungmodellingmxn--11b4c3dyndns-at-homedepotenzamamidsundyn" + - "dns-at-workisboringrimstadyndns-blogdnsandnessjoenishimerabruxel" + - "lesandoybryansklepparsandvikcoromantovalle-d-aostaticsanfrancisc" + - "ofreakunemurorangeiseiyoichippubetsubetsugarugbydgoszczecinemage" + - "ntositecnologiabrynewhollandyndns-freeboxosloftranakanojoetsuwan" + - "ouchikujogaszkolajollamericanexpressexybuskerudinewmexicoalottok" + - "onamegatakatsukis-a-catererbuzentsujiiebuzzwhalingripebwhoswhokk" + - "sundyndns-homednsangobzhitomirumalatvuopmicrolightingriwataraidy" + - "ndns-ipartis-a-celticsfanishinomiyashironobzzcolognexus-2colonia" + - "lwilliamsburgrongausdalukowiiheyakumoldeloittemp-dnsaogoncartier" + - "coloradoplateaudiocolumbusheycommunecommunitycomoarekecomparemar" + - "kerryhotelsaotomeloyalistoragecompute-1computerhistoryofscience-" + - "fictioncomsecuritytacticsapporocondoshichinohealth-carereformina" + - "miechizenconferenceconstructionconsuladonnakaiwamizawassamukawat" + - "aricoharuovatranoyconsultanthropologyconsultingrossetouchihayaak" + - "asakawaharacontactransportecontagematsubaracontemporaryarteducat" + - "ionalchikugodontexistmein-iservebeercontractorskenconventureshin" + - "odebalancertificationcookingchannelsdvrdnsfor-better-thanawatcha" + - "ndclockashiwaracooluroycooperativano-frankivskolegallocus-3copen" + - "hagencyclopedichiryukyuragifuchungbukharanzanishinoomotegocorsic" + - "afederationcorvettemasekashiwazakiyosatokamachintaifun-dnsdojols" + - "tercosenzakopanecosidnshome-webserverdalutskasukabedzin-berlinda" + - "sdaburcostumedicinakamagayahabaghdadyndns-workshopitsitevadsobet" + - "sumidatlantichitachinakagawashtenawdev-myqnapcloudcontrolledekag" + - "aminogiftsanjotoyotapartsannanishinoshimatsuuracouchpotatofriesa" + - "rdegnaroycounciluxurycouponsardiniacq-acranbrookuwanalyticsarluz" + - "erncrdyndns1creditcardynnsarpsborgroundhandlingroznycreditunionc" + - "remonashgabadaddjaguarqhachirogatakanezawacrewildlifedorainfracl" + - "ouderacricketrzyncrimeast-kazakhstanangercrotonecrownipasadenara" + - "shinocrsvpassagensarufutsunomiyawakasaikaitakoelncruisesasayamac" + - "ryptonomichigangwoncuisinellair-traffic-controlleyculturalcenter" + - "tainmentransurlvivanovoldacuneocupcakecuritibahcavuotnagaivuotna" + - "gaokakyotambabyeniwaizumiotsukumiyamazonawsagaeroclubmedecincinn" + - "ationwidealercxn--12c1fe0bradescorporationcymrussiacyonabarumina" + - "mifuranocyoutheworkpccwilliamhillferrerotikagoshimalvikasumigaur" + - "awa-mazowszextraspace-to-rentalstomakomaibarafetsundynuconnectra" + - "paniizafgruefhvalerfidoomdnstracefieldynv6figueresinstaginguideg" + - "reefilateliafilegear-audnedalnfilegear-deatnufcfanfilegear-gbizf" + - "ilegear-iefilegear-jpmorganfilegear-sguitarsavannahgafilminamiiz" + - "ukamiokameokameyamatotakadafinalfinancefineartsaves-the-whalessa" + - "ndria-trani-barletta-andriatranibarlettaandriafinlandynvpnplus-4" + - "finnoyfirebaseapplinzis-a-financialadvisor-aurdalfirenzefireston" + - "efirmdalegoldpoint2thisamitsukefishingolffansavonarusawafitjarvo" + - "dkafjordyroyrvikingrpassenger-associationfitnessettlementraveler" + - "sinsurancefjalerflesbergujohanamakinoharaflickragerogersaxofligh" + - "tschoenbrunnflirfloginlinefloraflorencefloridattorelayfloripader" + - "bornfloristanohatakaharulminamimakis-a-geekasuyanagawaflorokunoh" + - "ealthcareerschokokekschokoladenflowerscholarshipschoolschulefltr" + - "dflynnhosting-clusterflynnhubanzaicloudcontrolappleborkdalpha-my" + - "qnapcloud66fndfor-ourfor-somedizinhistorischeschwarzgwangjuniper" + - "for-theaterforexrothadanorthwesternmutualforgotdnschweizforli-ce" + - "sena-forlicesenaforlikescandyn53forsaleikangerforsandasuologoipa" + - "triafortalfortmissoulancashirecreationfortworthadselectrentin-su" + - "d-tirolforumzfosnesciencecentersciencehistoryfotaris-a-greenfoxf" + - "ordebianfozorafredrikstadtvscientistordalfreeddnsgeekgalaxyfreed" + - "esktopocznore-og-uvdalfreemasonryfreesitexaskoyabearalvahkihokum" + - "akogengerdalcesurancechirealmpmnfreetlscjohnsonfreiburgulenfreig" + - "htrentin-sudtirolfreseniuscountryestateofdelawareggio-calabriafr" + - "ibourgunmaoris-a-gurulvikaszubyfriuli-v-giuliafriuli-ve-giuliafr" + - "iuli-vegiuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgi" + - "uliafriuliv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giu" + - "liafriuliveneziagiuliafriulivgiuliafrlfroganscotlandfrognfroland" + - "from-akrehamnfrom-alfrom-arfrom-azimuthdfcbankatowicefrom-capebr" + - "etonamicrosoftbankatsushikabeeldengeluidfrom-codyn-vpndnscrapper" + - "-sitefrom-ctrentin-sued-tirolfrom-dchitosetogakushimotoganewspap" + - "erfrom-dedyn-berlincolnfrom-flanderscrappinguovdageaidnunusualpe" + - "rsonfrom-gaulardalfrom-hichisochildrensgardenfrom-iafrom-idfrom-" + - "ilfrom-in-brbarcelonagareyamaizuruhrhcloudiscoveryombolzano-alto" + - "adigeu-3from-kscrysechocolatelemarkaruizawafrom-kyowariasahikawa" + - "winbarclaycards3-fips-us-gov-west-1from-lancasterfrom-mamurogawa" + - "from-mdfrom-meeresistancefrom-mifunefrom-mnfrom-modalenfrom-mser" + - "veirchofunatoriginstitutelevisionishiokoppegardyndns-mailouvreit" + - "oyotomiyazakis-a-chefarsundyndns-office-on-the-webhareidsbergeni" + - "shitosashimizunaminamibosogndalowiczest-le-patronishiwakis-a-con" + - "servativegarsheis-a-cpadualstackhero-networkinggroupartyfrom-mtn" + - "from-nctulanciafrom-ndfrom-nefrom-nh-serveblogsiteleafamilycompa" + - "nyminamiminowafrom-njaworznoticiasnesoddenmarkhangelskjakdneprop" + - "etrovskiervaapsteiermarkatsuyamarylandfrom-nminamioguni5from-nva" + - "lled-aostamayufuettertdasnetzfrom-nyfrom-ohkurafrom-oketogurafro" + - "m-orfrom-padovaksdalfrom-pratohmangonohejis-a-hard-workerservemi" + - "necraftrentin-suedtirolfrom-ris-a-hunterfrom-schmidtre-gauldalfr" + - "om-sdfrom-tnfrom-txn--12co0c3b4evalleaostavernfrom-utazuerichard" + - "lillehammerfeste-ipaviancarrdfrom-val-daostavalleyfrom-vtrentino" + - "-a-adigefrom-wafrom-wielunnerfrom-wvalledaostaobaomoriguchiharag" + - "usartservemp3from-wyfrosinonefrostalowa-wolawafroyahooguyfstcgro" + - "upfizerfujiiderafujikawaguchikonefujiminokamoenairlinedre-eikerf" + - "ujinomiyadavvenjargap-northeast-3fujiokayamangyshlakasamatsudovr" + - "e-eikerfujisatoshonairportland-4-salernoboribetsuckservep2pgfogg" + - "iafujisawafujishiroishidakabiratoridefenseljordfujitsurugashiman" + - "iwakuratextileirfjordfujixeroxn--1ck2e1barclays3-sa-east-1fujiyo" + - "shidavvesiidatsunanjoburgushikamifuranorth-kazakhstanfukayabeats" + - "ervepicservequakefukuchiyamadazaifudaigojomedio-campidano-medioc" + - "ampidanomediofukudominichonanbulsan-suedtirolpusercontentoyotsuk" + - "aidofukuis-a-knightpointtohobby-sitefukumitsubishigakisarazureco" + - "ntainerdpolicefukuokazakishiwadafukuroishikarikaturindalfukusaki" + - "sofukushimannorfolkebibleirvikaufenfukuyamagatakahatakaishimogos" + - "enfunabashiriuchinadafunagatakamatsukawafunahashikamiamakusatsum" + - "asendaisennangooglecodespotaruis-a-landscaperfundaciofuoiskujuku" + - "riyamansionservesarcasmatartanddesignfuosskoczowindmillfurniture" + - "ggio-emilia-romagnakatombetsumitakagiizefurubirafurudonostiaafur" + - "ukawairtelebitballooningwiddleitungsenfusodegaurafussaikisosakit" + - "agawafutabayamaguchinomigawafutboldlygoingnowhere-for-morenakats" + - "ugawafuttsurugimperiafuturecmservicesevastopolefuturehostingxn--" + - "1ctwolominamatargivestbytemarkautokeinotteroyfuturemailingfvgfyl" + - "kesbiblackbaudcdn77-securebungoonord-odalwaysdatabaseballangenka" + - "inanaejrietisalatinabenonichoseiroumuenchenissandiegofyresdalhan" + - "gglidinghangoutsystemscloudyclusterhannanmokuizumodenakayamarbur" + - "ghannosegawahanyuzenhapmirharstadharvestcelebrationhasamarcheapi" + - "geelvinckazoologyhasaminami-alpsewindowsharis-a-libertarianhashb" + - "anghasudahasura-appharmaciensharpharmacyshawaiijimarnardalhasvik" + - "azunow-dnshellaspeziahatogayaizuwakamatsubushikusakadogawahatoya" + - "mazakitakamiizumisanofidelityhatsukaichikaiseis-a-linux-useranis" + - "hiaritabashijonawatehattfjelldalhayashimamotobungotakadapliernew" + - "jerseyhazuminobusells-for-unzenhelsinkitakatakaokalmykiahembygds" + - "forbundhemneshimojis-a-llamarriottrentino-aadigehemsedalhepforge" + - "herokussldheroyhgtvallee-aosteroyhigashiagatsumagoianiahigashich" + - "ichibunkyonanaoshimageandsoundandvisionhigashihiroshimanehigashi" + - "izumozakitakyushuaiahigashikagawahigashikagurasoedahigashikawaki" + - "taaikitamihamadahigashikurumeetnedalhigashimatsushimaritimodernh" + - "igashimatsuyamakitaakitadaitoigawahigashimurayamamotorcycleshimo" + - "kawahigashinarusells-itrentino-alto-adigehigashinehigashiomihach" + - "imanaustdalhigashiosakasayamanakakogawahigashishirakawamatakaraz" + - "ukaluganskypehigashisumiyoshikawaminamiaikitamotosumy-gatewayhig" + - "ashitsunoshiroomurahigashiurausukitanakagusukumoduminamisanrikub" + - "etsurfastly-terrariuminamiiserniahigashiyamatokoriyamanashiftedi" + - "tchyouriphdhigashiyodogawahigashiyoshinogaris-a-musicianhiraizum" + - "isatohnoshoooshikamaishimodatehirakatashinagawahiranairtrafficpl" + - "exus-1hirarahiratsukagawahirayakagehistorichouseshimokitayamahit" + - "achiomiyagildeskaliszhitachiotagoppdalhitraeumtgeradelmenhorstal" + - "banshimonitayanagithubusercontentrentino-altoadigehjartdalhjelme" + - "landholeckobierzyceholidayhomeiphiladelphiaareadmyblogspotrentin" + - "o-s-tirolhomelinkitoolsztynsettlershimonosekikawahomelinuxn--1lq" + - "s03nhomeofficehomesecuritymacaparecidahomesecuritypchoshibuyacht" + - "sannohelplfinancialubindalublindesnesanokarumaifashionissayokkai" + - "chiropractichernivtsiciliahomesensellsyourhomegoodshimosuwalkis-" + - "a-nascarfanhomeunixn--1lqs71dhondahongotembaixadahonjyoitakasago" + - "tpantheonsitehornindalhorsembokukitashiobarahorteneis-a-nursemin" + - "ehospitalhoteleshimotsukehotmailhoyangerhoylandetroitskddielddan" + - "uorrikuzentakatajimidorissagamiharahumanitieshimotsumahurdalhuru" + - "majis-a-painteractivegaskvollhyllestadhyogoris-a-patsfanhyugawar" + - "ahyundaiwafuneis-very-sweetpepperis-with-thebandoisleofmancheste" + - "rjewelryjewishartgalleryjfkhakassiajgorajlljmphoenixn--1qqw23ajn" + - "jcphilipsyno-dshintokushimajoyentrentino-sued-tiroljoyokaichibal" + - "atinoipirangamvikharkivalleeaosteinkjerusalembroideryjpnjprshiny" + - "oshitomiokamitondabayashiogamagoriziajurkoseis-a-playerkosherbro" + - "okegawakoshimizumakiyosunndalkoshunantankhersonkosugekotohiradom" + - "ainsurehabmerkotourakouhokutamakizunokunimimatakatoris-a-republi" + - "cancerresearchaeologicaliforniakounosupplieshirahamatonbetsurnad" + - "alkouyamashikekouzushimashikis-a-rockstarachowicekozagawakozakis" + - "-a-socialistdlibestadkozowinnershirakofuefukihaboromskogkpnkppsp" + - "dnshiranukamitsuekrasnikahokutokashikis-a-soxfankrasnodarkredsto" + - "nekristiansandcatshiraois-a-studentalkristiansundkrodsheradkroks" + - "tadelvaldaostathelleluxembourgkryminamitanekumatorinokumejimasoy" + - "kumenantokigawakunisakis-a-teacherkassyncloudkunitachiarailwayku" + - "nitomigusukumamotoyamashikokuchuokunneppubtlshiraokamogawakunsts" + - "ammlungkunstunddesignkuokgroupictetrentino-suedtirolkureisenkurg" + - "ankurobelaudibleasingleshiratakahagitlaborkurogiminamiashigaraku" + - "roisoftwarendalenugkuromatsunais-a-techietis-a-personaltrainerku" + - "rotakikawasakis-a-therapistoiakushirogawakustanais-an-accountant" + - "shinichinankusupplykutchanelkutnokuzumakis-an-actorkvafjordkvals" + - "undkvamlidlugolekadenagahamaroygardenebakkeshibechambagriculture" + - "nnebudejjuedischesapeakebayernutwentekvanangenkvinesdalkvinnhera" + - "dkviteseidskogkvitsoykwpspectruminamiuonumassa-carrara-massacarr" + - "aramassabusinessebyklecznagasukekzmisugitokorozawamitourismolang" + - "evagrigentomologyeonggiehtavuoatnadexetermitoyoakemiuramiyazurew" + - "ebsiteshikagamiishibukawamiyotamanomjondalenmlbfanmonstermontrea" + - "lestatefarmequipmentrentinoaadigemonza-brianzapposhishikuis-an-a" + - "rtistgorymonza-e-della-brianzaptokuyamatsumotofukemonzabrianzara" + - "monzaebrianzamonzaedellabrianzamoonscalewismillermoparachutingmo" + - "rdoviamoriyamatsunomoriyoshiminamiawajikis-an-engineeringmormonm" + - "outhagakhanamigawamoroyamatsusakahoginankokubunjis-an-entertaine" + - "rmortgagemoscowioshisognemoseushistorymosjoenmoskeneshisuifuelve" + - "ruminamiyamashirokawanabelembetsukubankhmelnitskiyamarylhurstjor" + - "dalshalsenmosshitaramamosvikhmelnytskyivanylvenicemoteginowaniih" + - "amatamakawajimanxn--2scrj9christiansburgroks-thisayamanobeokakud" + - "amatsuemoviemovimientokyotangovtrentinoalto-adigemovistargardmoz" + - "illa-iotrentinoaltoadigemtranbymuenstermuginozawaonsenmuikamisat" + - "okaizukamikitayamatsuris-bytomaritimekeepingmukodairamulhouserve" + - "game-servermunakatanemuncienciamuosattemupictureshizukuishimofus" + - "aitamatsukuris-certifieducatorahimeshimamateramobaramurmanskhpla" + - "ystationmurotorcraftrentinos-tirolmusashimurayamatsushigemusashi" + - "noharamuseetrentinostirolmuseumverenigingmusicargodaddyn-o-saurl" + - "andeshizuokanagawamutsuzawamy-vigorgemy-wanggouvichristmasakindl" + - "efrakkestadyndns-picsantacruzsantafedjejuifminamidaitomandalucan" + - "iamyactivedirectorymyasustor-elvdalmycdn77-sslattuminanomydattol" + - "ocalhistorymyddnskingmydissentrentinosud-tirolmydobisshikis-foun" + - "dationmydroboehringerikemydshoppingmyeffectrentinosudtirolmyfire" + - "wallonieruchomoscienceandindustrynmyfritzmyftpaccesshoujis-gonem" + - "yhome-servermyjinomykolaivaomymailermymediapchromedicaltanissett" + - "airavennagatorockartuzymyokohamamatsudamypepiemontemypetshowamyp" + - "hotoshibalena-deviceshowtimembershriramsterdamnserverbaniamypiag" + - "etmyiphostrodawaramypsxn--30rr7ymysecuritycamerakermyshopblocksi" + - "enarutolgamytis-a-bookkeeperugiamytuleapilotsigdalmyvnchryslermy" + - "wirepaircraftingvollombardiamondsilklabudhabikinokawabarthaebaru" + - "ericssonyoursidell-ogliastraderpiwatepixolinopizzapknx-serversai" + - "lleshiojirishirifujiedaplantationplantsimple-urlplatformshangril" + - "ansirdalplazaplcube-serversicherungplumbingoplurinacionalpodhale" + - "zajskolobrzegersundpodlasiellaktyubinskiptveterinaireadthedocsca" + - "ppgafannefrankfurtrentinosuedtirolpodzonepohlpoivronpokerpokrovs" + - "komaganepoliticarrierpolitiendapolkowicepoltavalle-aostatic-acce" + - "ssjcbnpparibaselburgpomorzeszowitdkomakiyosemiteponpesaro-urbino" + - "-pesarourbinopesaromasvuotnaritakurashikis-into-animeguroroshinj" + - "ukumanowtvallee-d-aosteigenponypordenonepornporsangerporsangugep" + - "orsgrunnanyokoshibahikariwanumatakinouepoznanpraxis-a-bruinsfanp" + - "rdpreservationpresidioprgmrprimelhusdecorativeartslupskomatsushi" + - "masfjordenprincipeprivatizehealthinsuranceprochowiceproductionsl" + - "zprofesionalprogressivenneslaskerrylogisticsnoasaitoshimayfirsto" + - "ckholmestrandpromombetsurgeonshalloffameldalpropertyprotectionpr" + - "otonetrentinsud-tirolprudentialpruszkowithgoogleapisa-hockeynuts" + - "iracusakatakkoebenhavnprvcyberlevagangaviikanonjis-into-carshink" + - "amigotoyohashimototalprzeworskogptplusgardenpulawypupimientaketo" + - "misatomobellevuelosangelesjabbottrentinosued-tirolpvhagebostadpv" + - "trentinsudtirolpwchungnamdalseidfjordyndns-remotewdyndns-serveri" + - "signissedaluccapitalonewportlligatoyourapzqldqponiatowadaqslingq" + - "ualifioappinkmpspbarefootballfinanzgoraustinnavuotnaples3-ca-cen" + - "tral-1quickconnectrentinsued-tirolquicksytestingquipelementsokan" + - "aniimihoboleslawiechurcharternidyndns-webhopencraftoystre-slidre" + - "ttozawaqvcircleverappsseljeepsongdalenviknaharimalopolskanlandyn" + - "dns-wikirkenesantamariakesusonosuzakanazawasuzukaneyamazoesuzuki" + - "s-leetrentino-stirolsvalbardunloppacificircustomersveiosvelvikom" + - "onowruzhgorodeosvizzerasvn-reposopotrentinsuedtirolswedenswidnic" + - "artoonartdecologiaswidnikkokaminokawanishiaizubangeswiebodzin-bu" + - "tterswiftcoverswinoujscienceandhistoryswissmarterthanyousynology" + - "-diskstationsynology-dsor-odaltuscanytushuissier-justicetuvalle-" + - "daostavangertuxfamilytwmailvestfoldvestnesorocabalsan-sudtirolla" + - "gdenesnaaseinet-freaksolognevestre-slidreplanetariuminiserverves" + - "tre-totennishiawakuravestvagoyvevelstadvibo-valentiavibovalentia" + - "videovillasorreisahayakawakamiichikawamisatottoris-into-cartoons" + - "hinshinotsurgeryvinnicasacamdvrcampinagrandebuilderschlesischeso" + - "rtlandvinnytsiavipsinaappioneervirginiavirtual-userveexchangevir" + - "tualservervirtualuserveftpippugliavirtueeldomein-vigorlicevirtue" + - "lvisakegawaviterboknowsitallvivolkenkundenvixn--32vp30haibarakit" + - "ahiroshimapartmentsevenassisicilyvlaanderenvladikavkazimierz-dol" + - "nyvladimirvlogintoyonezawavminnesotaketakayamasudavologdanskomvu" + - "xn--2m4a15evolvolkswagentsorumincomcastresindevicenzaporizhzhiav" + - "olyngdalvoorloperauniterois-lostrolekamakurazakiwakunigamiharusl" + - "ivinghistoryvossevangenvotevotingvotoyonowloclawekongsbergwmflab" + - "soundcastronomy-routerwnextdirectromsakakinokiaworldworse-thanda" + - "wowithyoutuberspacekitagatargets-itroandinosaurepbodynamic-dnsor" + - "-varangerwpdevcloudwritesthisblogsytewroclawiwatsukiyonotairesta" + - "urantrogstadwtcmintelligencewtfastvps-serveronakasatsunairguardi" + - "annakadomarinebraskauniversitydalaheadjudaicable-modemocraciawuo" + - "zuwzmiuwajimaxn--3oq18vl8pn36axn--3pxu8kongsvingerxn--42c2d9axn-" + - "-45br5cylxn--45brj9citadeliveryggeexn--45q11citichernovtsymantec" + - "hnologyxn--4gbriminingxn--4it168dxn--4it797koninjambylxn--4pvxs4" + - "allxn--54b7fta0ccivilaviationiyodogawaxn--55qw42gxn--55qx5dxn--5" + - "js045dxn--5rtp49civilisationxn--5rtq34konskowolayangrouphonefoss" + - "hioyanaizustkannamilanotogawaxn--5su34j936bgsgxn--5tzm5gxn--6btw" + - "5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264civilizationxn--" + - "80adxhksouthcarolinarvikommunalforbundxn--80ao21axn--80aqecdr1ax" + - "n--80asehdbarrel-of-knowledgemologicallillyomitanoddaustrheimatu" + - "nduhrennesoyokozebinordreisa-geekaracoldwarmiastagebizenakanotod" + - "denayorovnobninskaragandaukraanghkeymachineustarnbergjemnes3-ap-" + - "southeast-2xn--80aswgxn--80augustownproviderxn--8ltr62konsulatro" + - "beepilepsykkylvenetodayxn--8pvr4uxn--8y0a063axn--90a3academiamic" + - "aaarborteaches-yogasawaracingxn--90aeroportalabamagasakishimabar" + - "aogakibichuoxn--90aishobarakawagoexn--90azhytomyravendbarrell-of" + - "-knowledgeologyonagoyauthordalandeportenrightathomeftpalmaserati" + - "bmdevelopmentcp4lima-cityeatselinogradultateshinanomachimkentate" + - "yamabogadodgehirnrtatsunobihirosakikamijimatsuzaki234xn--9dbhblg" + - "6dietcimdbarsycenterprisesakikugawalmartjeldsundishakotanflfanfs" + - "hostrowwlkpmgladefinimakanegasakirautomotiveconomiasakuchinotsuc" + - "hiurakawalesundgcagliaribeiraokinawashirosatochigiessensiositele" + - "kommunikationionjukudoyamaintenancehimejiitatebayashiibajddarchi" + - "tecturealtorlandiscountyolasitempresashibetsukuiiyamanouchikuhok" + - "uryugasakitaurayasudaurskog-holandingjerdrumemsettsupportaxihuan" + - "aval-d-aosta-valleyokosukanumazuryokoteastcoastaldefenceatonsber" + - "gjerstadotsuruokakamigaharagrocerybnikeisenbahnatuurwetenschappe" + - "naumburggfarmerseine164-baltimore-og-romsdalipayboltattoobiraetn" + - "abudapest-a-la-masion-webhostingdyniabruzzoologicalvinklein-addr" + - "ammenuorochesterimo-i-ranaamesjevuemielno-ipifonyc66xn--9dbq2axn" + - "--9et52uxn--9krt00axn--andy-iraxn--aroport-byandexcloudxn--asky-" + - "iraxn--aurskog-hland-jnbarsyonlinewhampshirealtysnes3-us-east-2x" + - "n--avery-yuasakuhokkaidownloadxn--b-5gaxn--b4w605ferdxn--balsan-" + - "sdtirol-nsbsouthwestfalenxn--bck1b9a5dre4civilwarmanagementozsde" + - "ltaiwanairforcebetsuikidsmynasushiobarackmazerbaijan-mayendofthe" + - "internetlifyis-a-cubicle-slavellinodearthachiojiyaitakanabeautys" + - "vardoesntexisteingeekashibatakasugais-a-democratrani-andria-barl" + - "etta-trani-andriaxn--bdddj-mrabdxn--bearalvhki-y4axn--berlevg-jx" + - "axn--bhcavuotna-s4axn--bhccavuotna-k7axn--bidr-5nachikatsuuraxn-" + - "-bievt-0qa2xn--bjarky-fyaotsurreyxn--bjddar-ptarnobrzegyptianxn-" + - "-blt-elabourxn--bmlo-graingerxn--bod-2natalxn--bozen-sdtirol-2ob" + - "anazawaxn--brnny-wuacademy-firewall-gatewayxn--brnnysund-m8accid" + - "ent-investigation-aptibleadpagest-mon-blogueurovision-rancherkas" + - "ydneyxn--brum-voagatromsojamisonxn--btsfjord-9zaxn--bulsan-sdtir" + - "ol-nsbashkiriautoscanadaeguambulanceoceanographics3-eu-west-1xn-" + - "-c1avgxn--c2br7gxn--c3s14misasaguris-an-anarchistoricalsocietyxn" + - "--cck2b3basicservercelliguriaveroykenglandiscourses3-eu-west-2xn" + - "--cesena-forl-mcbremangerxn--cesenaforl-i8axn--cg4bkis-not-certi" + - "fiedugit-pagespeedmobilizeroticahcesuoloanshinshiroxn--ciqpnxn--" + - "clchc0ea0b2g2a9gcdxn--comunicaes-v6a2oxn--correios-e-telecomunic" + - "aes-ghc29axn--czr694basilicataniavocatanzarowebspacemreviewskrak" + - "oweddingjesdalazioceanographiqueu-1xn--czrs0trusteexn--czru2dxn-" + - "-czrw28basketballyngenvironmentalconservationrenderxn--d1acj3bat" + - "ochiokinoshimakeupowiat-band-campaniavoues3-eu-west-3utilitiesqu" + - "are7xn--d1alfaromeoxn--d1atrvareservehalflifestylexn--d5qv7z876c" + - "lanbibaidarmeniaxn--davvenjrga-y4axn--djrs72d6uyxn--djty4konyvel" + - "olipophotographysioxn--dnna-grajewolterskluwerxn--drbak-wuaxn--d" + - "yry-iraxn--e1a4cldmailovecollegefantasyleaguernseyxn--eckvdtc9dx" + - "n--efvn9sowaxn--efvy88hair-surveillancexn--ehqz56nxn--elqq16haka" + - "tanortonxn--estv75gxn--eveni-0qa01gaxn--f6qx53axn--fct429kooris-" + - "a-photographerokuapphilatelyxn--fhbeiarnxn--finny-yuaxn--fiq228c" + - "5hspeedpartnersolundbeckomforbargainstantcloudfrontdoorxn--fiq64" + - "batsfjordisrechtraininglassassinationalheritageu-4xn--fiqs8spjel" + - "kavikommunexn--fiqz9spreadbettingxn--fjord-lraxn--fjq720axn--fl-" + - "ziaxn--flor-jraxn--flw351exn--forl-cesena-fcbsspydebergxn--forlc" + - "esena-c8axn--fpcrj9c3dxn--frde-grandrapidsrlxn--frna-woaraisaijo" + - "soyrovigotsukitahatakamoriokakegawaxn--frya-hraxn--fzc2c9e2click" + - "ashiharaxn--fzys8d69uvgmailxn--g2xx48clinichirurgiens-dentistes-" + - "en-francexn--gckr3f0fauskedsmokorsetagayaseralingenoamishirasato" + - "gokasells-for-lessaskatchewanxn--gecrj9cliniquenoharaxn--ggaviik" + - "a-8ya47hakodatexn--gildeskl-g0axn--givuotna-8yasakaiminatoyookan" + - "iepcexn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050is-savedu" + - "netflixilxn--gmqw5axn--h-2failxn--h1aeghakonexn--h2breg3evenesrt" + - "rentoyonakagyokutoyakokonoexn--h2brj9c8clintonoshoesantoandreamh" + - "ostersanukis-a-designerxn--h3cuzk1digitalxn--hbmer-xqaxn--hcesuo" + - "lo-7ya35bauhausposts-and-telecommunicationswatch-and-clockerxn--" + - "hery-iraxn--hgebostad-g3axn--hkkinen-5waxn--hmmrfeasta-s4acciden" + - "t-prevention-riopretobamaceratabuseating-organicbcn-north-1xn--h" + - "nefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmir-xqaxn--hxt814exn-" + - "-hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn--imr513nxn--indery" + - "-fyasugivingxn--io0a7is-slickfhappousrcfastlylbananarepublicasad" + - "elamonedatingjovikarasjohkamikoaniikappuboliviajessheimetacentru" + - "meteorappalmspringsakerevistaples3-external-1xn--j1aefbsbxn--12c" + - "fi8ixb8lxn--j1amhakubahccavuotnagarahkkeravjuegoshikikuchikuseik" + - "arugalsacexn--j6w193gxn--jlq61u9w7beneventoeidsvollimanowarudaxa" + - "ustevollavagiskebinagisoccertmgretakahamalselvendrellavangenavig" + - "ationavoizumizakibigawajudygarlanddnslivelanddnss3-ap-southeast-" + - "1kappchizip6xn--jlster-byasuokanoyaltakashimarshallstatebankoper" + - "vikharkovalleedaostexn--jrpeland-54axn--jvr189misawaxn--k7yn95ex" + - "n--karmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woax" + - "n--klt787dxn--kltp7dxn--kltx9axn--klty5xn--3bst00misakis-an-actr" + - "esshinjournalismailillesandefjordxn--koluokta-7ya57hakuis-a-lawy" + - "erxn--kprw13dxn--kpry57dxn--kpu716fbx-osassaris-a-doctorayxn--kp" + - "ut3is-uberleetrentino-sud-tirolxn--krager-gyatomitamamuraxn--kra" + - "nghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jdfas" + - "tpanelblagrarchaeologyeongbuk0emmafann-arboretumbriamallamaceiob" + - "bcg120001wwwebredirectmemorial-o-g-i-n4t3l3p0rtashkentatamotors3" + - "-ap-northeast-1337xn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyatsuk" + - "anraxn--kvnangen-k0axn--l-1fairwindsrvaporcloudxn--l1accenturekl" + - "amborghinikolaeventstorfjordxn--laheadju-7yatsushiroxn--langevg-" + - "jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika-52bentleyonagunicomm" + - "bankarasjokarasuyamarugame-hostrowiecaseihicampobassociatest-ise" + - "rvecounterstrikeverbankaratevje-og-hornnes3-us-gov-west-1xn--les" + - "und-huaxn--lgbbat1ad8jelenia-goraxn--lgrd-poacctrycloudflarezzox" + - "n--lhppi-xqaxn--linds-pramericanartrysiljanxn--lns-qlanxesstorjd" + - "evcloudfunctionshintomikasaharaxn--loabt-0qaxn--lrdal-sraxn--lre" + - "nskog-54axn--lt-liaclothingdustdataitogitsuldalucernexn--lten-gr" + +const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijolstere" + + "trosnubalsfjordd-dnshome-webserverdal-o-g-i-n4tatsunobihirosakik" + + "amijimatsuuragrocerybnikeisenbahnaturhistorisches3-ap-south-1bip" + + "almasfjordenikonanporovnocpalmspringsakerbirdartcenterprisecloud" + + "accesscambridgeiseiyoichippubetsubetsugarussiabirkenesoddtangeno" + + "varahkkeravjuegoshikilatironrenderbirthplacevje-og-hornnes3-webs" + + "ite-us-west-1bjarkoyukuhashimojin-the-bandain-vpncateringebuildi" + + "ngladegreextraspace-to-rentalstomakomaibarabjerkreimbamblebesbyg" + + "landroverhalla-speziaustevollaziobiramswatch-and-clockereviewsai" + + "toshimattelekommunikationatuurwetenschappengine164-baltimore-og-" + + "romsdalp1bjugnieznord-odalwaysdatabaseballangenkainanaejrietisal" + + "atinabenonicatholicaxiaskimitsubatamibugattiffanyaaarborteaches-" + + "yogasawara-rugbydgoszczecinemaceratabuseating-organicbcieszynino" + + "hekinannestadiyurihonjournalistjohninomiyakonojorpelandnpanamats" + + "uzakincheonirasakindianapolis-a-bloggerblackfridayusuharabloombe" + + "rgbauernishiazaindianmarketinglassassinationalheritagebloxcms3-w" + + "ebsite-us-west-2bluedagestangemologicallyngenishigoddabmoattachm" + + "ents5yusuisservehttpanasonichernivtsiciliabmsakyotanabellunord-f" + + "rontierbmwedeployuulmemsettlersalangenishiharabnrwegroweibologna" + + "gareyamakeupowiatmallorcafederation-webhopencraftrainingleezebom" + + "loabathsbchernovtsyncloudrangedalondrinamsskoganeindielddanuorri" + + "ndigenaklodzkodairabondigitaloceanographicsxboxenishiizunazukind" + + "owapblogsiteleafamilycompany-2bonnishikataketomisatomobellevuelo" + + "sangelesjabbottjeldsundray-dnstracebookinghosted-by-previderboom" + + "lair-traffic-controlleyuzawaboschaefflerdalorenskoglitcheltenham" + + "-radio-opensocialottebostikariyameiwamarugame-hostedpictetjmaxxx" + + "finitybostonakijinsekikogentappsalon-1botanicalgardenishikatsura" + + "git-reposaltdalottokonamegatakayamassa-carrara-massacarraramassa" + + "businessebykleclerchirurgiens-dentistes-en-francebotanicgardenis" + + "hikawazukamishihoronobeauxartsandcraftsaludrayddnsfreebox-osasco" + + "li-picenordlandraydnsupdaterbotanychiryukyuragifuchungbukharauma" + + "lborkarlsoybouncemerckmsdnipropetrovskjervoyageorgeorgiabounty-f" + + "ullensakerrypropertiesalvadordalibabalena-devicesalzburgliwicebo" + + "utiquebechitachinakagawatchandclockarmoybozen-sudtirolouvrehabme" + + "rbozen-suedtirolowiczest-le-patronishimerabplaceducatorahimeshim" + + "amateraholtalenishinomiyashironohtawaramotoineppueblockbusternii" + + "minamiawajikindustriabrandywinevalleybrasiliabrindisibenikimobet" + + "suitaipeigersundrivefsnillfjordrobaknoluoktachikawafflecellcube-" + + "serverbristoloseyouriparachutinglobalashovhachinohedmarkarpaczel" + + "adzlgloboavistanbulsan-sudtirolpusercontentjomeloyalistoragebrit" + + "ishcolumbialowiezaganishinoomotegomniweatherchannelubindalublind" + + "esnesamegawabroadcastlebtimnetzparaglidinglogoweirbroadwaybroke-" + + "itvedestrandrudupontariobranconakaniikawatanagurabrokerbronnoysu" + + "ndurbanamexhibitionishinoshimatsushigebrothermesaverdeatnulvikar" + + "uizawabrowsersafetymarketsamnangerbrumunddalucaniabrunelastxjava" + + "ld-aostarnbergloppenzaolbia-tempio-olbiatempioolbialystokkembuch" + + "ikumagayagawakayamagentositecnologiabrusselsampalacebruxellesams" + + "clubartowellbeingzonebryansklepparisor-fronishiokoppegardurhambu" + + "rglugsjcbnpparibaselburgmbhartipsselfiparliamentjxn--0trq7p7nnis" + + "hitosashimizunaminamibosogndaluccargodaddyn-o-saurlandesamsungmi" + + "nakamichiharabrynewhollandynathomebuiltwithdarkarumaifarmsteadyn" + + "dns-at-homedepotenzamamidsundyndns-at-workisboringmodellingmxn--" + + "11b4c3dyndns-blogdnsandnessjoenishiwakindustriesteamfamberkeleyb" + + "uskerudyndns-freeboxoslocus-4buzentsujiiebuzzwesteuropenairbusan" + + "tiquest-a-la-maisondre-landroidyndns-homednsandoybwestfalenissan" + + "diegomurabzhitomirumalatvuopmicrolightingretakamoriokakudamatsue" + + "bzzcompute-1computerhistoryofscience-fictioncomsecaaskoyabearalv" + + "ahkijobservableusercontentoyotsukaidocondoshichinohealth-careref" + + "ormitakeharaconferenceconstructionconsuladoesntexisteingeekashiw" + + "araconsultanthropologyconsultingrongausdalcontactoyouracontagema" + + "tsubaracontemporaryarteducationalchikugodogadollsapporocontracto" + + "rskenconventureshinodeartheworkpccwhoswhokksundyndns1cookingchan" + + "nelsdvrdnsdojoburgrossetouchihayaakasakawaharacoolcooperativano-" + + "frankivskolefrakkestadynnsardegnaroycopenhagencyclopedichonanbul" + + "san-suedtirolukowestus2coproductionsardiniacorporationcorsicanon" + + "oichinomiyakecorvettemp-dnsarlcosenzakopanelastycoffeedbackplane" + + "applinzinzais-a-candidatecosidnsfor-better-thanawatchesarpsborgr" + + "oundhandlingroznynysaintlouis-a-anarchistoireggio-emilia-romagna" + + "katombetsumitakagiizecostumedicinagatorodoycouchpotatofriesarufu" + + "tsunomiyawakasaikaitabashikaoizumizakis-a-caterercoukashiwazakiy" + + "okawaracouncilcouponsasayamayfirstockholmestrandynservebbsasebof" + + "ageologycozoracqcxn--12co0c3b4evalleaostavangercranbrookuwanalyt" + + "icsaskatchewancrdynuniversitycreditcardynv6creditunioncremonashg" + + "abadaddjaguarqhachiojiyaizuwakamatsubushikusakadogawacrewiencric" + + "ketrzyncrimeast-kazakhstanangercrotonexus-3crownipartsassaris-a-" + + "celticsfancrsvps-hostrolekagoshimalopolskanlandynvpnpluscountrye" + + "stateofdelawareclaimsaudacruisesauheradyroyrvikingrpartycryptono" + + "michigangwoncuisinellajollamericanexpressexyculturalcentertainme" + + "ntoystre-slidrettozawacuneocupcakecuritibaghdadcurvalled-aostave" + + "rncymrunjargacyonabarumetacentrumeteorappasadenarashinocyouthruh" + + "erecifedexeterferrarivneferrerotikakamigaharafetsundfguidell-ogl" + + "iastraderfhskydivinguitarsavonarusawafhvalerfidontexistmein-iser" + + "vebeerfieldfigueresinstagingujoinvilleirvikasserversaillesaxofil" + + "ateliafilegear-audnedalnfilegear-debianfilegear-gbizfilegear-ief" + + "ilegear-jpmorganfilegear-sg-1filminamifuranofinalfinancefinearts" + + "choenbrunnfinlandfinnoyfirebaseappassagenschokokekschokoladenfir" + + "enetrani-andria-barletta-trani-andriafirenzefirestonefirmdalegni" + + "capetownnews-stagingulenfishingoldpoint2thisamitsukefitjarvodkaf" + + "jordvagsoygardenflfanquanpachigasakievennodesabaerobaticketschol" + + "arshipschoolsztynsettsurgeonshalloffameldalfitnessettlementrania" + + "ndriabarlettatraniandriafjalerflesbergunmansionschulezajskasukab" + + "edzin-berlindasdaburflickragerogerschulserverflightschwarzgwangj" + + "uifminamiiserniaflirfloginlinefloraflorencefloridatsunanjoetsuwa" + + "nouchikujogaszkolancashirecipescaravantaarpassenger-associationf" + + "loripaderbornfloristanohatajiris-a-chefashionflorokunohealthcare" + + "erschweizflowersciencecentersciencehistoryfltranoyflynnhosting-c" + + "lusterfndfnwkasumigaurayasudafoodnetworkdalfor-ourfor-somedizinh" + + "istorischescientistordalfor-theaterforexrothachirogatakanabeauty" + + "sfjordforgotdnscjohnsonforli-cesena-forlicesenaforlikescandyn53f" + + "orsalegolffanscrapper-siteforsandasuoloftranslatefortalfortextil" + + "eikangerfortmissoulancasterfortworthadanorth-kazakhstanfosnescra" + + "ppinguovdageaidnunusualpersonfotaruis-a-conservativegarsheis-a-c" + + "padualstackasuyanaizuerichardlillesandefjordfoxafozfrancaisehara" + + "franziskanerimaringatlantakahamalvikaszubyfredrikstadtvscrysecur" + + "itytacticservehumourfreeddnsgeekgalaxyfreedesktopocznordreisa-ho" + + "ckeynutazurestaticappspotagerfreemasonryfreesitefreetlserveircho" + + "shibuyahabackyardsangomutashinainfinitintelligencefreiburgushika" + + "mifuranorfolkebibleitungsenfreseniusculturecreationfribourgwiddl" + + "eksvikatowicefriuli-v-giuliafriuli-ve-giuliafriuli-vegiuliafriul" + + "i-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriuliv-giulia" + + "friulive-giuliafriulivegiuliafriulivenezia-giuliafriuliveneziagi" + + "uliafriulivgiuliafrlfroganserveminecraftransportefrognfrolandfro" + + "m-akrehamnfrom-alfrom-arfrom-azurewebsiteshikagamiishibukawalbrz" + + "ycharternopilawalesundfrom-capitalonewjerseyfrom-cogxn--1ctwolom" + + "inamatargitlaborfrom-ctransurlfrom-dchoyodobashichikashukujitawa" + + "ravennagasakinderoyfrom-dedyn-berlincolnfrom-flanderservemp3from" + + "-gaulardalfrom-hichisochildrensgardenfrom-iafrom-idfrom-ilfrom-i" + + "n-brbar1from-kservep2patriafrom-kyowariasahikawafrom-lanciafrom-" + + "mamurogawafrom-mdfrom-meeresistancefrom-mifunefrom-mnfrom-modale" + + "nfrom-mservepicservequakefrom-mtnfrom-nctulangevagrigentomologye" + + "onggiehtavuoatnabudapest-a-la-masion-rancherkasydneyfrom-ndfrom-" + + "nefrom-nh-serveblogspotrapaniizafrom-njservesarcasmatartanddesig" + + "nfrom-nminamiizukaminoyamaxunispacefrom-nvalledaostaobaomoriguch" + + "iharag-cloud-charitychyattorneyagawakepnogatagajobojis-a-cubicle" + + "-slavellinodeobjectservicesevastopolefrom-nyminamimakis-a-democr" + + "atravelchannelfrom-ohdattorelayfrom-oketogurafrom-orfrom-padovak" + + "sdalfrom-pratohmandalfrom-ris-a-designerfrom-schmidtre-gauldalfr" + + "om-sdfrom-tnfrom-txn--1lqs03nfrom-utsiracusagamiharafrom-val-dao" + + "stavalleyfrom-vtravelersinsurancefrom-wafrom-wiardwebredirectmee" + + "trdfrom-wvallee-aosteroyfrom-wyfrosinonefrostalowa-wolawafroyait" + + "akaharunzenfstcgroupaviancarrierfujiiderafujikawaguchikonefujimi" + + "nokamoenairguardiannakadomarinebraskaunicommbankatsushikabeelden" + + "geluidvallee-d-aosteigenfujinomiyadattowebcampinashikiminohostfo" + + "ldnavyfujiokayamangonohejis-a-doctorayfujisatoshonairlinedre-eik" + + "erfujisawafujishiroishidakabiratoridefenseljordfujitsurugashiman" + + "gyshlakasamatsudoomdnsiskinkyotobetsumidatlantichristiansburgrim" + + "stadyndns-mailutskashibatakatorinternationalfirearmsanjotlon-2fu" + + "jixeroxfordefinimakanegasakinkobierzycefujiyoshidavvenjargap-nor" + + "theast-3fukayabeatsevenassisicilyfukuchiyamadavvesiidappnodebala" + + "ncertificationfukudomigawafukuis-a-financialadvisor-aurdalfukumi" + + "tsubishigakirovogradoyfukuokazakiryuohkurafukuroishikarikaturind" + + "alfukusakisarazure-mobileirfjordfukuyamagatakahashimamakishiwada" + + "zaifudaigojomedio-campidano-mediocampidanomediofunabashiriuchina" + + "dafunagatakahatakaishimoichinosekigaharafunahashikamiamakusatsum" + + "asendaisennangooglecodespotrendhostingfundaciofunkfeuerfuoiskuju" + + "kuriyamaniwakuratefuosskoczowiiheyakumoduminamiminowafurnituregg" + + "io-calabriafurubirafurudonostiaafurukawairportland-4-salernobori" + + "betsucksharis-a-geekatsuyamarumorimachidafusodegaurafussaikisofu" + + "kushimannore-og-uvdalfutabayamaguchinomihachimanagementrentin-su" + + "d-tirolfutboldlygoingnowhere-for-morenakasatsunairtelebitbridges" + + "toneendoftheinternethnologyfuttsurugimperiafuturecmsharpfizerfut" + + "urehostingfuturemailingfvgfyresdalhangglidinghangoutsystemscloud" + + "hannanmokuizumodenakayamanxn--1lqs71dhannortonhanyuzenhapmirclou" + + "dplatform0harstadharvestcelebrationhasamaoris-a-hunterhasaminami" + + "-alpshimokawahashbanghasudahasura-appgfoggiahasvikautokeinotogaw" + + "ahatoyamazakitahiroshimapartmentshimokitayamahatsukaichikaiseihe" + + "ijis-a-knightpointtohobby-sitehattfjelldalhayashimamotobungotaka" + + "dancehazuminobusells-for-ustkanmakiwakunigamiharutwentehelsinkit" + + "akamiizumisanofidelitysvardonnakamuratajimidorittogliattis-a-lan" + + "dscaperugiahembygdsforbundhemneshimonitayanagitappharmacienshimo" + + "nosekikawahemsedalhepforgeherokussldheroyhgtvalleeaosteinkjerusa" + + "lembroideryhidorahigashiagatsumagoianiahigashichichibunkyonanaos" + + "himageandsoundandvisionthewifiatrentin-sued-tirolhigashihiroshim" + + "anehigashiizumozakitakatakaokaluganskygearappharmacyshimosuwalki" + + "s-a-lawyerhigashikagawahigashikagurasoedahigashikawakitaaikitaky" + + "ushuaiahigashikurumegurownproviderhigashimatsushimarburghigashim" + + "atsuyamakitaakitadaitoigawahigashimurayamamotorcycleshimotsukehi" + + "gashinarusells-itrentin-suedtirolhigashinehigashiomitamamurausuk" + + "itamihamadahigashiosakasayamanakakogawahigashishirakawamatakaraz" + + "ukamakurazakitamotosumy-gatewayhigashisumiyoshikawaminamiaikitan" + + "akagusukumodernhigashitsunosegawahigashiurawa-mazowszexnetrentin" + + "o-a-adigehigashiyamatokoriyamanashiibahccavuotnagaragusadocktera" + + "mo-siemenscaledogawarabikomaezakirunoipirangalsacentralus-2higas" + + "hiyodogawahigashiyoshinogaris-a-liberalhiraizumisatohnoshoooshik" + + "amaishimofusartshimotsumahirakatashinagawahiranairtrafficplexus-" + + "1hirarahiratsukaeruhirayakagehistorichouseshinichinanhitachiomiy" + + "agildeskaliszhitachiotagoppdalhitraeumtgeradeloittenrissagaerocl" + + "ubmedecincinnationwidealstahaugesunderseaportsinfolionetworkange" + + "rhjartdalhjelmelandholeckochikushinonsenergyholidayhomegoodshinj" + + "ournalismailillehammerfeste-iphdfcbankazoologyhomeiphiladelphiaa" + + "readmyblogsytehomelinkyard-cloudnshinjukumanowruzhgorodeohomelin" + + "uxn--1qqw23ahomeofficehomesecuritymacaparecidahomesecuritypchris" + + "tmaseratiresannanisshingucciprianidyndns-office-on-the-weberhome" + + "senseeringhomeunixn--2m4a15ehondahongotembaixadahonjyoitakasagot" + + "pantheonsitehornindalhorsellsyourhomeftphilatelyhortendofinterne" + + "t-dnshinkamigototalhospitalhoteleshinshinotsurgeryhotmailhoyange" + + "rhoylandetroitskypehumanitieshinshirohurdalhurumajis-a-libertari" + + "anhyllestadhyogoris-a-linux-usershintokushimahyugawarahyundaiwaf" + + "uneis-very-badajozis-a-nursembokukitchenis-very-evillageis-very-" + + "goodyearis-very-niceis-very-sweetpepperis-with-thebandovre-eiker" + + "isleofmanaustdaljenv-arubabizjeonnamerikawauejetztrentino-stirol" + + "jevnakershusdecorativeartshiranukamitondabayashiogamagoriziajewe" + + "lryjewishartgalleryjfkddiamondshiraois-a-painterhostsolutionshin" + + "tomikasaharajgorajlljls-sto1jls-sto2jls-sto3jmphonefosshiraokami" + + "tsuejnjaworznotairestaurantrentino-s-tiroljoyentrentino-sud-tiro" + + "ljoyokaichibajddarchitecturealtorlandjpnjprshiratakahagithubuser" + + "contentrentino-sudtiroljurkosaigawakosakaerodromegallupinbarclay" + + "cards3-sa-east-1koseis-a-photographerokuapphilipsynology-disksta" + + "tionkosherbrookegawakoshimizumakiyosemitekoshunantankhakassiakos" + + "ugekotohiradomainsureggioemiliaromagnamsosnowiechurchaseljedugit" + + "-pagespeedmobilizeroticahcesuoloansanokashiharakotourakouhokutam" + + "akiyosunndalkounosupplieshitaramakouyamashikekouzushimashikizuno" + + "kunimilitarykozagawakozakis-a-playershifteditchyouriphoenixn--2s" + + "crj9chromedicaltanissettaishinomakindlecznagasukekozowildlifesty" + + "lekpnkppspdnshizukuishimogosenkrasnikahokutokashikis-a-republica" + + "ncerresearchaeologicaliforniakrasnodarkredstonekristiansandcatsh" + + "izuokamogawakristiansundkrodsheradkrokstadelvaldaostarostwodzisl" + + "awilliamhillkryminamioguni5kumatorinowtvaporcloudkumejimasoykume" + + "nantokigawakunisakis-a-rockstarachowicekunitachiarailwaykunitomi" + + "gusukumamotoyamashikokuchuokunneppubtlshoppingkunstsammlungkunst" + + "unddesignkuokgrouphxn--32vp30haebaruericssongdalenviknakatsugawa" + + "kuregruhostingkurgankurobelaudibleasingleshopwarendalenugkurogim" + + "imatakatsukis-a-socialistdlibestadkuroisoftwarezzokuromatsunais-" + + "a-soxfankurotakikawasakis-a-studentalkushirogawakustanais-a-teac" + + "herkassyno-dshinyoshitomiokamisunagawakusupplynxn--3bst00minamis" + + "anrikubetsupportrentino-sued-tirolkutchanelveruminamitanekutnoku" + + "zumakis-a-techietis-a-llamarnardalkvafjordkvalsundkvamlidlugolek" + + "adenagahamaroyerkvanangenkvinesdalkvinnheradkviteseidatingkvitso" + + "ykwpspectruminamiuonumassivegridkzmisconfusedmishimasudamissilel" + + "uxembourgmisugitokorozawamitourismilevangermitoyoakemiuramiyazur" + + "econtainerdpolicemiyotamanomjondalenmlbfanmontrealestatefarmequi" + + "pmentrentino-suedtirolmonza-brianzapposhoujis-an-actresshioyande" + + "xcloudmonza-e-della-brianzaptokuyamatsumaebashimodatemonzabrianz" + + "aramonzaebrianzamonzaedellabrianzamoonscaleforcemordoviamoriyama" + + "tsumotofukemoriyoshiminamiashigaramormonstermoroyamatsunomortgag" + + "emoscowinbarclays3-us-east-2moseushistorymosjoenmoskeneshowamoss" + + "howtimelhusgardenmosvikharkovanylvenicemoteginowaniigatakamatsuk" + + "awamoviemovimientokyotangotsukisosakitagawamozilla-iotrentinoa-a" + + "digemtranbymuginozawaonsenmuikamiokameokameyamatotakadamukoebenh" + + "avnmulhouseoullensvanguardmunakatanemuncienciamuosattemupiemonte" + + "murmanskhersonmurotorcraftrentinoaadigemusashimurayamatsusakahog" + + "inankokubunjis-an-anarchistoricalsocietymusashinoharamuseetrenti" + + "noalto-adigemuseumverenigingmusicarrdmutsuzawamy-vigorgemy-wangg" + + "ouvicircustomer-ocimdbananarepublic66myactivedirectorymyasustor-" + + "elvdalmycdn77-sslattuminamiyamashirokawanabelembetsukubankharkiv" + + "alleedaostemycloudswitcheshwindmillmydattolocalhistorymyddnsking" + + "mydissentrentinoaltoadigemydobisshikis-an-artistgorymydroboehrin" + + "gerikemydsienarutolgamyeffectrentinos-tirolmyfastblogermyfirewal" + + "lonieruchomoscienceandindustrynmyforuminanomyfritzmyftpaccessigd" + + "almyhome-servermyjinomykolaivareservegame-servermymailermymediap" + + "cistrondheimmobilieniyodogawamyokohamamatsudamypepilotsilkhmelni" + + "tskiyamarylandmypetsimple-urlmyphotoshibalatinombresciamypicture" + + "sirdalmypsxn--3ds443gmysecuritycamerakermyshopblockslupskhmelnyt" + + "skyivaomythic-beastslzmytis-a-bookkeeperspectakashimaritimoldelt" + + "aiwanairforcebetsuikidsmynasushiobarackmazerbaijan-mayen-rootari" + + "beiraogashimadachicagoboatsmolapymntrentinostirolmytuleaprendema" + + "sakihokumakogenebakkeshibechambagriculturennebudejjuedischesapea" + + "kebayernrtrentinosud-tirolmyvncitadeliverydyndns-remotewdyndns-s" + + "erverisignmywireitrentinosudtirolpklabudhabikinokawabarthadselec" + + "trentin-sudtirolplantsnoasakakinokiaplatformshangrilanxessokanag" + + "awaplatter-appimientakinoueplatterpinkhplaystation-cloudplazaplc" + + "itichocolatelevisionissayokkaichiropractichitosetogakushimotogan" + + "ewportkmaxxn--12c1fe0bradescotlandyndns-iparmatta-varjjatksatxn-" + + "-12cfi8ixb8lucerneplumbingoplurinacionalpodhaleviracloudletsoknd" + + "alpodlasiellaktyubinskiptveterinaireadthedocscappgafannefrankfur" + + "trentinosued-tirolpodzonepohlpoivronpokerpokrovskmpspbar2politic" + + "artoonartdecologiapolitiendapolkowicepoltavalle-aostathellewismi" + + "llerpomorzeszowindowskrakowinnersolarssonponpesaro-urbino-pesaro" + + "urbinopesaromasvuotnaritakoelnponypordenonepornporsangerporsangu" + + "geporsgrunnanyokoshibahikariwanumatakkofuefukihaboromskogpoznanp" + + "raxis-a-bruinsfanprdpreservationpresidioprgmrprimetelemarknx-ser" + + "versicherungprincipeprivatizehealthinsuranceprofesionalprogressi" + + "venneslaskerrylogisticsolognepromombetsurfastvps-serveronakanoto" + + "ddenpropertyprotectionprotonetrentinosuedtirolprudentialpruszkow" + + "iosolundbeckomaganeprvcyberlevagangaviikanonjis-an-engineeringpr" + + "zeworskogpulawypupioneerpvhagakhanamigawapvtrentinsud-tirolpwciv" + + "ilaviationpzqldqotoyohashimotoolsomaqponiatowadaqslingqualifioap" + + "pippugliaquickconnectrentinsudtirolquicksytestingquipelementsomn" + + "arviikamisatokaizukamikitayamatsuris-an-entertainerqvcivilisatio" + + "nsveiosvelvikomforbarcelonagawalmartattoolforgebinagisoccertmgra" + + "zimuthatogayachimataiji234lima-cityeatselinogradultateshinanomac" + + "himkentateyamaetnaamesjevuemielno-ipifony-1svizzerasvn-reposor-v" + + "arangerswidnicasadelamonedapliernewmexicodyn-vpndnsorfoldswidnik" + + "kokonoeswiebodzin-butterswiftcoverswinoujscienceandhistoryswissm" + + "arterthanyousynology-dsorocabalestrandabergamoareketunkommunalfo" + + "rbundturystykaniepcetuscanytushuissier-justicetuvalle-daostatics" + + "oundcastronomy-routertuxfamilytwmailvestre-slidreplantationvestr" + + "e-totennishiawakuravestvagoyvevelstadvibo-valentiavibovalentiavi" + + "deovillasouthwest1-uslivinghistoryvinnicaseihicampobassociatest-" + + "iservecounterstrikevinnytsiavipsinaappittsburghofficialvirginiav" + + "irtual-userveexchangevirtualcloudvirtualservervirtualuserveftpiw" + + "atevirtueeldomein-vigorlicevirtuelvisakegawaviterboknowsitallviv" + + "olkenkundenvixn--3hcrj9clanbibaidarmeniavlaanderenvladikavkazimi" + + "erz-dolnyvladimirvlogintoyonezawavminiservervologdanskommunevolv" + + "olkswagentsowavolyngdalvoorloperauniterois-gonevossevangenvotevo" + + "tingvotoyonowiwatsukiyonoshiroomgwloclawekomorotsukagawawmcloudw" + + "mflabspeedpartnersoownextdirectrevisohughesorreisahayakawakamiic" + + "hikawamisatottoris-bytomaritimekeepingworldworse-thandawowitdkom" + + "onow-dnshisognewpdevcloudwpenginepoweredwritesthisblogwroclawith" + + "googleapiszwtcircleverappsphinxn--3e0b707ewtfauskedsmokorsetagay" + + "aseralingenoamishirasatogokasells-for-lessavannahgawuozuwzmiuwaj" + + "imaxn--45q11clic20001wwwfarsundyndns-webhareidsbergentingripexn-" + + "-4gbriminingxn--4it168dxn--4it797kongsbergxn--4pvxs4allxn--54b7f" + + "ta0cclicketcloudcontrolapplicationcloud66xn--55qw42gxn--55qx5dxn" + + "--5js045dxn--5rtp49clinichofunatoriginstitutemasekasaokamiminers" + + "andvikcoromantovalle-d-aostatic-accessanfranciscofreakunemuroran" + + "gecloudyclusterxn--5rtq34kongsvingerxn--5su34j936bgsgxn--5tzm5gx" + + "n--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--7t0a264cliniquen" + + "oharaxn--80adxhkspjelkavikomatsushimarylhurstjordalshalsenxn--80" + + "ao21axn--80aqecdr1axn--80asehdbarefootballooningjerdrumckinseyol" + + "asitebinordre-landiscoveryggeebizenakanojohanamakinoharaustinnau" + + "mburggfarmerseineastasiamuneues3-ap-southeast-2ix4432-balsan-sue" + + "dtirolkuszczytnord-aurdalipayboltatarantours3-ap-northeast-2xn--" + + "80aswgxn--80augustowithyoutuberspacekitagatargetmyiphosteurxn--8" + + "ltr62koninjambylxn--8pvr4uxn--8y0a063axn--90a3academiamicable-mo" + + "democraciaxn--90aeroportalabamagasakishimabaraogakibichuoxn--90a" + + "ishobarakawagoexn--90azhytomyravendbargainstantcloudfunctionsncf" + + "dishakotanavigationavoirmcpehimejibigawaustraliamusementdllpages" + + "3-ca-central-1xn--9dbhblg6dietritonxn--9dbq2axn--9et52uxn--9krt0" + + "0axn--andy-iraxn--aroport-byaotsurreyxn--asky-iraxn--aurskog-hla" + + "nd-jnbarreauctionfabricagliaricoharuhrxn--avery-yuasakuhokkaidop" + + "aaskvollxn--b-5gaxn--b4w605ferdxn--balsan-sdtirol-nsbspreadbetti" + + "ngxn--bck1b9a5dre4clintonoshoesantabarbaraxn--bdddj-mrabdxn--bea" + + "ralvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7ax" + + "n--bidr-5nachikatsuuraxn--bievt-0qa2xn--bjarky-fyasakaiminatoyoo" + + "kaneyamazoexn--bjddar-ptarnobrzegyptianxn--blt-elabourxn--bmlo-g" + + "raingerxn--bod-2natalxn--bozen-sdtirol-2obanazawaxn--brnny-wuaca" + + "demy-firewall-gatewayxn--brnnysund-m8accident-investigation-apti" + + "bleadpagesquare7xn--brum-voagatroandinosaurepaircraftingvollomba" + + "rdiademonmouthagebostadxn--btsfjord-9zaxn--bulsan-sdtirol-nsbarr" + + "el-of-knowledgeappleborkaracoldwarszawaustrheimatunduhrennesoyok" + + "osukanraukraanghkeymachineustargardds3-eu-central-1xn--c1avgxn--" + + "c2br7gxn--c3s14minnesotaketakazakis-a-therapistoiaxn--cck2b3barr" + + "ell-of-knowledgehirnufcfanavuotnapleskns3-us-gov-west-1xn--cckwc" + + "xetdxn--cesena-forl-mcbremangerxn--cesenaforl-i8axn--cg4bkis-int" + + "o-animeinforumzxn--ciqpnxn--clchc0ea0b2g2a9gcdxn--comunicaes-v6a" + + "2oxn--correios-e-telecomunicaes-ghc29axn--czr694barsycenterprise" + + "sakikuchikuseikarugamvik-serverrankoshigayachiyodaejeonbukcoalph" + + "a-myqnapcloud-fr1xn--czrs0trogstadxn--czru2dxn--czrw28barsyonlin" + + "ewhampshirealtydalvdalaskanittedallasalleangaviikaascolipicenodu" + + "members3-us-west-1xn--d1acj3bashkiriauthordalandgcapebretonamicr" + + "osoftbank12xn--d1alfaromeoxn--d1atromsakatamayufuelblagrarchaeol" + + "ogyeongbuk0xn--d5qv7z876clothingdustdataitogitsuldalvivanovoldax" + + "n--davvenjrga-y4axn--djrs72d6uyxn--djty4konskowolayangrouphotogr" + + "aphysioxn--dnna-grajewolterskluwerxn--drbak-wuaxn--dyry-iraxn--e" + + "1a4cn-northwest-1xn--eckvdtc9dxn--efvn9spydebergxn--efvy88haibar" + + "akitahatakanezawaxn--ehqz56nxn--elqq16hair-surveillancexn--eveni" + + "-0qa01gaxn--f6qx53axn--fct429konsulatrobeepilepsykkylvenetodayxn" + + "--fhbeiarnxn--finny-yuaxn--fiq228c5hsrlxn--fiq64basicservercelli" + + "guriautomotiveconomiasakuchinotsuchiurakawakuyabukikonaikawachin" + + "aganoharamcoachampionshiphoptobamadridnbloggerevistaples3-eu-wes" + + "t-1xn--fiqs8srvarggatrentinsuedtirolxn--fiqz9storegontrailroadxn" + + "--fjord-lraxn--fjq720axn--fl-ziaxn--flor-jraxn--flw351exn--forl-" + + "cesena-fcbsstorfjordxn--forlcesena-c8axn--fpcrj9c3dxn--frde-gran" + + "drapidstorjcloud-ver-jpchungnamdalseidfjordyndns-picsannohelplfi" + + "nancialuxuryxn--frna-woaraisaijosoyrorostpetersburgxn--frya-hrax" + + "n--fzc2c9e2cngriwataraidyndns-wikiraxn--fzys8d69uvgmailxn--g2xx4" + + "8cnpyatigorskodjeepsondriodejaneirockartuzyxn--gckr3f0fbsbxn--1c" + + "k2e1bar0emmafann-arboretumbriamallamaceiobbcg12038xn--gecrj9cnsa" + + "ntacruzsewhalingroks-thisayamanobeokalmykiaxn--ggaviika-8ya47hak" + + "atanorthwesternmutualxn--gildeskl-g0axn--givuotna-8yasugitpagefr" + + "ontappixolinoxn--gjvik-wuaxn--gk3at1exn--gls-elacaixaxn--gmq050i" + + "s-into-carshirahamatonbetsurnadalxn--gmqw5axn--h-2failxn--h1aegh" + + "akodatexn--h2breg3evenestreams1xn--h2brj9c8cntoyotaparsantafedje" + + "ffersonxn--h3cuzk1discountysnestudioxn--hbmer-xqaxn--hcesuolo-7y" + + "a35basilicataniautoscanadaeguambulancechirealmpmnaval-d-aosta-va" + + "lleyokoteastcoastaldefenceastus2xn--hery-iraxn--hgebostad-g3axn-" + + "-hkkinen-5waxn--hmmrfeasta-s4accident-prevention-k3studynamische" + + "s-dnsopotrentinsued-tirolxn--hnefoss-q1axn--hobl-iraxn--holtlen-" + + "hxaxn--hpmir-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1" + + "b6b1a6a2exn--imr513nxn--indery-fyasuokannamihoboleslawiecolognew" + + "spaperxn--io0a7is-into-cartoonshirakokaminokawanishiaizubangexn-" + + "-j1aefbx-ostrowiechoseiroumuenchenissedaluroyxn--j1amhakonexn--j" + + "6w193gxn--jlq480n2rgxn--jlq61u9w7basketballfinanzgorzeleccollect" + + "ionayorovigovtaxihuanfshostyhostingjerstadotsuruokakegawaveroyke" + + "ngerdalces3-eu-west-2xn--jlster-byatominamidaitomanchesterxn--jr" + + "peland-54axn--jvr189mintereisenxn--k7yn95exn--karmy-yuaxn--kbrq7" + + "oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--klt787dxn--kltp7dx" + + "n--kltx9axn--klty5xn--3oq18vl8pn36axn--koluokta-7ya57hakubahcavu" + + "otnagaivuotnagaokakyotambabyenglandxn--kprw13dxn--kpry57dxn--kpu" + + "t3is-into-gamessinazawaxn--krager-gyatsukanoyaltakasugais-leetre" + + "ntino-aadigexn--kranghke-b0axn--krdsherad-m8axn--krehamn-dxaxn--" + + "krjohka-hwab49jdevcloudjiffylkesbiblackbaudcdn-edgestackhero-net" + + "workinggroupaashorokanaiexn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-" + + "fyatsushiroxn--kvnangen-k0axn--l-1fairwindstuff-4-salexn--l1acce" + + "ntureklamborghinikolaeventstufftoread-booksnesor-odalxn--laheadj" + + "u-7yawaraxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagaviika" + + "-52batochiokinoshimaintenanceobninskaragandavocatanzarowbq-aursk" + + "og-holandingdyniajudaicadaquest-mon-blogueurovision-riopretobish" + + "imagazinekobayashikshacknetnedalaheadjudygarlanddnslivelanddnss3" + + "-ap-southeast-1xn--lesund-huaxn--lgbbat1ad8jdfastlylbanzaiclouda" + + "ppscbgivingjemnes3-fips-us-gov-west-1xn--lgrd-poacctromsojamison" + + "xn--lhppi-xqaxn--linds-pramericanartrusteexn--lns-qlaquilanstutt" + + "gartrentoyonakagyokutoyakolobrzegersundxn--loabt-0qaxn--lrdal-sr" + + "axn--lrenskog-54axn--lt-liacolonialwilliamsburgrondarxn--lten-gr" + "anexn--lury-iraxn--m3ch0j3axn--mely-iraxn--merker-kuaxn--mgb2dde" + - "stpetersburgxn--mgb9awbfbxosaudaxn--mgba3a3ejtunesorfoldxn--mgba" + - "3a4f16axn--mgba3a4franamizuholdingstreamuneuesolutionsokndalxn--" + - "mgba7c0bbn0axn--mgbaakc7dvfedorapeoplegnicanonoichinomiyakexn--m" + - "gbaam7a8hakusanagochijiwadellogliastradingxn--mgbab2bdxn--mgbah1" + - "a3hjkrdxn--mgbai9a5eva00beppublishproxyzgorzeleccoffeedbackplane" + - "applicationcloudaccesscambridgestonewyorkshirecifedexhibitionhkt" + - "jmaxxxboxenapponazure-mobilexn--mgbai9azgqp6jeonnamerikawauexn--" + - "mgbayh7gpaleoxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgbe" + - "rp4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mg" + - "bpl2fhskydivingxn--mgbqly7c0a67fbcn-northwest-1xn--mgbqly7cvafra" + - "nziskanerimaringatlantakahashimamakiryuohdattowebcampinashikimin" + - "ohostre-totendofinternet-dnsaliasiaxn--mgbt3dhdxn--mgbtf8flatang" + - "erxn--mgbtx2beskidyn-ip24xn--mgbx4cd0abbvieeexn--mix082fedorapro" + - "jectravelchannelxn--mix891feiraquarelleaseeklogesauheradynserveb" + - "bsasebofageorgeorgiaxn--mjndalen-64axn--mk0axin-dslgbtunkomorots" + - "ukaminoyamaxunjargaxn--mk1bu44cngrondarxn--mkru45is-very-badajoz" + - "xn--mlatvuopmi-s4axn--mli-tlapyxn--mlselv-iuaxn--moreke-juaxn--m" + - "ori-qsakuragawaxn--mosjen-eyawaraxn--mot-tlaquilancomelbournexn-" + - "-mre-og-romsdal-qqbestbuyshouses3-us-west-1xn--msy-ula0haldenxn-" + - "-mtta-vrjjat-k7aflakstadaokagakicks-assnasaarlandxn--muost-0qaxn" + - "--mxtq1misconfusedxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3ds443gxn-" + - "-nit225koryokamikawanehonbetsurutaharaxn--nmesjevuemie-tcbalsan-" + - "suedtirolkuszczytnombresciaxn--nnx388axn--nodessakurais-very-evi" + - "llagexn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn--nt" + - "tery-byaeservehttpiszxn--nvuotna-hwaxn--nyqy26axn--o1achattanoog" + - "anordlandxn--o3cw4halsaintlouis-a-anarchistoireggiocalabriaxn--o" + - "3cyx2axn--od0algxn--od0aq3betainaboxfusejnyoriikaratsuginamikata" + - "gamilitaryoshiokanzakiyokawaraxn--ogbpf8flekkefjordxn--oppegrd-i" + - "xaxn--ostery-fyawatahamaxn--osyro-wuaxn--otu796dxn--p1acfermochi" + - "zukirovogradoyxn--p1ais-very-goodyearxn--pbt977cnpyatigorskodjef" + - "fersonxn--pgbs0dhlxn--porsgu-sta26ferraraxn--pssu33lxn--pssy2uxn" + - "--q9jyb4cnsaobernardoxn--qcka1pmckinseyxn--qqqt11mishimatsumaeba" + - "shikshacknetrentinoa-adigexn--qxamusementdllpagestudioxn--rady-i" + - "raxn--rdal-poaxn--rde-ularvikosaigawaxn--rdy-0nabaris-very-nicex" + - "n--rennesy-v1axn--rhkkervju-01aferrarivnexn--rholt-mragowoodside" + - "moneyxn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5nativeame" + - "ricanantiquestudynamisches-dnsomaxn--risr-iraxn--rland-uuaxn--rl" + - "ingen-mxaxn--rmskog-byaxn--rny31hammarfeastafricapetownnews-stag" + - "ingxn--rovu88bhzcasertaipeiheijin-the-bandain-vpncasinordkappana" + - "matta-varjjatjomemergencyahikobeardubaiduckdns3-us-west-2xn--rro" + - "s-granvindafjordxn--rskog-uuaxn--rst-0naturalhistorymuseumcenter" + - "xn--rsta-francaiseharaxn--rvc1e0am3exn--ryken-vuaxn--ryrvik-byax" + - "n--s-1faithruherecipescaravantaarpittsburghofficialxn--s9brj9cnt" + - "raniandriabarlettatraniandriaxn--sandnessjen-ogbieigersundivtasv" + - "uodnakamuratajirittogliattires3-website-ap-northeast-1xn--sandy-" + - "yuaxn--sdtirol-n2axn--seral-lraxn--ses554gxn--sgne-gratangenxn--" + - "skierv-utazastuff-4-salexn--skjervy-v1axn--skjk-soaxn--sknit-yqa" + - "xn--sknland-fxaxn--slat-5naturalsciencesnaturellestufftoread-boo" + - "ksnesomnarviikamishihoronobeauxartsandcraftsolarssonxn--slt-elab" + - "cieszynxn--smla-hraxn--smna-gratis-a-bulls-fanxn--snase-nraxn--s" + - "ndre-land-0cbielawaltervistaprinternationalfirearms3-website-ap-" + - "southeast-1xn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-" + - "q1axn--sr-odal-q1axn--sr-varanger-ggbielladbrokes3-website-ap-so" + - "utheast-2xn--srfold-byaxn--srreisa-q1axn--srum-grazxn--stfold-9x" + - "axn--stjrdal-s1axn--stjrdalshalsen-sqbieszczadygeyachiyodaejeonb" + - "uklugsmilebtimnetzjampagefrontappanasonicateringebuildingleezexn" + - "--stre-toten-zcbievathletajimabaridagawakuyabukijobserverrankosh" + - "igayachimataijincheonhlfanhs3-website-eu-west-1xn--t60b56axn--tc" + - "kweatherchannelxn--tiq49xqyjetztrentino-sudtirolxn--tjme-hraxn--" + - "tn0agrinetbankosakaerodromegallupinbarreauctionredumbrella-spezi" + - "australiaisondriobranconagawalbrzycharitysfjordds3-eu-central-1x" + - "n--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tirol-rzbif" + - "ukagawarszawashingtondclkareliancexn--trentin-sdtirol-7vbigv-inf" + - "oodnetworkangerxn--trentino-sd-tirol-c3bihorologyukindianapolis-" + - "a-bloggerxn--trentino-sdtirol-szbikedagestangeometre-experts-com" + - "ptables3-website-sa-east-1xn--trentinosd-tirol-rzbilbaogashimada" + - "chicagoboats3-website-us-east-1xn--trentinosdtirol-7vbillustrati" + - "onthewifiatmallorcadaques3-website-us-west-1xn--trentinsd-tirol-" + - "6vbiohtawaramotoineppueblockbustermezlglitchaselfiparaglidingliw" + - "icexn--trentinsdtirol-nsbirdartcenterprisecloudappspotagerxn--tr" + - "gstad-r1axn--trna-woaxn--troms-zuaxn--tysvr-vraxn--uc0atvarggatr" + - "itonxn--uc0ay4axn--uist22hamurakamigoris-a-liberalxn--uisz3gxn--" + - "unjrga-rtarumizusawaxn--unup4yxn--uuwu58axn--vads-jraxn--valle-a" + - "oste-ebbturystykanmakiwienxn--valle-d-aoste-ehbodollstuttgartrev" + - "isohughesooxn--valleaoste-e7axn--valledaoste-ebbvacationsusakis-" + - "into-gamessinazawaxn--vard-jraxn--vegrshei-c0axn--vermgensberate" + - "r-ctbirkenesoddtangenovaraholtalenikonanporomutashinaindianmarke" + - "tinglobalashovhachinohedmarkariyameiwamarumorimachidaxn--vermgen" + - "sberatung-pwbirthplacexn--vestvgy-ixa6oxn--vg-yiabkhaziaxn--vgan" + - "-qoaxn--vgsy-qoa0jevnakershuscultureggioemiliaromagnamsosnowiech" + - "oyodobashichikashukujitawaraumalborkasaokamiminersantabarbaraxn-" + - "-vgu402coguchikuzenxn--vhquvaroyxn--vler-qoaxn--vre-eiker-k8axn-" + - "-vrggt-xqadxn--vry-yla5gxn--vuq861bjarkoyukuhashimoichinosekigah" + - "araxn--w4r85el8fhu5dnraxn--w4rs40lxn--wcvs22dxn--wgbh1collection" + - "xn--wgbl6axn--xhq521bjerkreimbamblebesbyglandroverhallaakesvuemi" + - "elecceu-2xn--xkc2al3hye2axn--xkc2dl3a5ee0handsonxn--y9a3aquarium" + - "issilevangerxn--yer-znaturbruksgymnxn--yfro4i67oxn--ygarden-p1ax" + - "n--ygbi2ammxn--3e0b707exn--ystre-slidre-ujbjugnieznord-frontierx" + - "n--zbx025dxn--zf0ao64axn--zf0avxn--3hcrj9cistrondheimmobilieniss" + - "hingucciprianiigataishinomakinkobayashikaoirmitakeharaxn--zfr164" + - "blackfridayurihonjournalistjohninohekinannestadivttasvuotnakanii" + - "kawatanaguraxnbayxz" + "susakis-certifiedunetlifyis-a-musicianxn--mgb9awbfbxostrowwlkpmg" + + "ruexn--mgba3a3ejtrvaroyxn--mgba3a4f16axn--mgba3a4fra1-dexn--mgba" + + "7c0bbn0axn--mgbaakc7dvfedorainfracloudfrontdoorxn--mgbaam7a8haku" + + "is-a-greenxn--mgbab2bdxn--mgbah1a3hjkrdxn--mgbai9a5eva00batsfjor" + + "diskussionsbereichattanooganordeste-idcasertairanzanhktcmemergen" + + "cyahikobeardubaiduckdns3-us-west-2xn--mgbai9azgqp6jejuniperxn--m" + + "gbayh7gpaleoxn--mgbbh1a71exn--mgbc0a9azcgxn--mgbca7dzdoxn--mgber" + + "p4a5d4a87gxn--mgberp4a5d4arxn--mgbgu82axn--mgbi4ecexposedxn--mgb" + + "pl2fhappouxn--mgbqly7c0a67fbcoloradoplateaudiopsysantamariakexn-" + + "-mgbqly7cvafr-1xn--mgbt3dhdxn--mgbtf8flatangerxn--mgbtx2bauhausp" + + "osts-and-telecommunicationswedeniwaizumiotsukumiyamazonawsmpplan" + + "etariumemorialillyombolzano-altoadigeometre-experts-comptables3-" + + "website-ap-northeast-1xn--mgbx4cd0abbvieeexn--mix082fedorapeople" + + "gallodingenxn--mix891fedoraprojectozsdeportevadsobetsulikes-pied" + + "monticellocalzonexn--mjndalen-64axn--mk0axin-dslgbtrycloudflarep" + + "bodynamic-dnsortlandxn--mk1bu44columbusheyxn--mkru45is-lostre-to" + + "teneis-a-nascarfanxn--mlatvuopmi-s4axn--mli-tlarvikonyvelolipopu" + + "sinteractivegashisuifuettertdasnetzxn--mlselv-iuaxn--moreke-juax" + + "n--mori-qsakuragawaxn--mosjen-eyawatahamaxn--mot-tlavagiskexn--m" + + "re-og-romsdal-qqbuseranishiaritakurashikis-not-certifiedxn--msy-" + + "ula0hakusanagochijiwadellogliastradingxn--mtta-vrjjat-k7aflaksta" + + "daokagakicks-assnasaarlandxn--muost-0qaxn--mxtq1misakis-an-accou" + + "ntantshiojirishirifujiedaxn--ngbc5azdxn--ngbe9e0axn--ngbrxn--3px" + + "u8komvuxn--30rr7yxn--nit225kooris-a-personaltrainerxn--nmesjevue" + + "mie-tcbalsan-sudtirollagdenesnaaseinet-freaksusonoxn--nnx388axn-" + + "-nodessakurais-savedxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn" + + "--ntsq17gxn--nttery-byaeservehalflifeinsurancexn--nvuotna-hwaxn-" + + "-nyqy26axn--o1achernihivgubsuzakananiikappuboliviajessheimpertri" + + "xcdn77-secureggiocalabriaxn--o3cw4haldenxn--o3cyx2axn--od0algxn-" + + "-od0aq3beneventoeidskoguchikuzenvironmentalconservationionjukudo" + + "yamaizuruovat-band-campaniavoues3-eu-west-3utilities-1kappchizip" + + "6116-b-datacentermezgorabogadobeaemcloud-dealerimo-i-rana4u2-loc" + + "alhostrodawarabruzzoologicalvinklein-addrammenuorochestereport3l" + + "3p0rtashkentatamotors3-ap-northeast-1337xn--ogbpf8flekkefjordxn-" + + "-oppegrd-ixaxn--ostery-fyaxn--osyro-wuaxn--otu796dxn--p1acfeiraq" + + "uarelleaseeklogesaveincloudxn--p1ais-slickazteleportlligatrentin" + + "o-alto-adigexn--pgbs0dhlxn--porsgu-sta26fermochizukirkenesaves-t" + + "he-whalessandria-trani-barletta-andriatranibarlettaandriaxn--pss" + + "u33lxn--pssy2uxn--q9jyb4communewyorkshirebungoonordkappartintuit" + + "oyotomiyazakinuyamashinatsukigatakasakitauraxn--qcka1pmcdirxn--q" + + "qqt11misasaguris-an-actorxn--qxa6axn--qxamsterdamnserverbaniaxn-" + + "-rady-iraxn--rdal-poaxn--rde-ulavangenxn--rdy-0nabaris-uberleetr" + + "entino-altoadigexn--rennesy-v1axn--rhkkervju-01aferraraxn--rholt" + + "-mragowoodsidevelopmentrysiljanxn--rhqv96gxn--rht27zxn--rht3dxn-" + + "-rht61exn--risa-5nativeamericanantiquesuzukanazawaxn--risr-iraxn" + + "--rland-uuaxn--rlingen-mxaxn--rmskog-byaxn--rny31halsaitamatsuku" + + "ris-a-gurusrcfastly-terrariuminamiechizenxn--rovu88bentleyomitan" + + "observerxn--rros-granvindafjordxn--rskog-uuaxn--rst-0naturalhist" + + "orymuseumcenterxn--rsta-franamizuholdingsmall-webhostingxn--rvc1" + + "e0am3exn--ryken-vuaxn--ryrvik-byaxn--s-1faithammarfeastafricarbo" + + "nia-iglesias-carboniaiglesiascarboniaxn--s9brj9community-prochow" + + "icexn--sandnessjen-ogbeppublishproxyzjampagexlimanowarudaxarnetf" + + "lixilovecollegefantasyleaguernseyokozeatonsbergivestbytemarkanza" + + "kiwielunnerhcloudiscourses3-external-1xn--sandy-yuaxn--sdtirol-n" + + "2axn--seral-lraxn--ses554gxn--sgne-graphoxn--42c2d9axn--skierv-u" + + "tazasuzukis-foundationxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn" + + "--sknland-fxaxn--slat-5naturalsciencesnaturellesvalbardunloppaci" + + "ficivilizationxn--slt-elabcn-north-1xn--smla-hraxn--smna-gratang" + + "entlentapisa-geekopervikfh-muensterxn--snase-nraxn--sndre-land-0" + + "cbeskidyn-ip24xn--snes-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fr" + + "on-q1axn--sr-odal-q1axn--sr-varanger-ggbestbuyshouses3-website-a" + + "p-southeast-1xn--srfold-byaxn--srreisa-q1axn--srum-gratis-a-bull" + + "s-fanxn--stfold-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbetainabo" + + "xfusejnyanagawaltervistaikikugawashingtondclk3xn--stre-toten-zcb" + + "hzcasinorddalimitedisrechtranaharimalselvendrellimoliseminempres" + + "ashibetsukuibmdivtasvuodnakaiwamizawaweddingjesdalivornoceanogra" + + "phiquemrxn--t60b56axn--tckwebspacexn--tiq49xqyjelasticbeanstalka" + + "zunotteroyxn--tjme-hraxn--tn0agrinetbankoryokamikawanehonbetsuru" + + "taharaxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trentin-sd-tiro" + + "l-rzbieidsvollombardynaliasnesoddenmarkhangelskjakdnepropetrovsk" + + "iervaapsteiermarkarasjohkamikoaniihamatamakawajimarriottcp4xn--t" + + "rentin-sdtirol-7vbrplsbxn--45br5cylxn--trentino-sd-tirol-c3biela" + + "washtenawdev-myqnapcloudcontrolledekagaminogifts3-website-ap-sou" + + "theast-2xn--trentino-sdtirol-szbiellaakesvuemielecceu-1xn--trent" + + "inosd-tirol-rzbieszczadygeyachts3-website-eu-west-1xn--trentinos" + + "dtirol-7vbievathletajimabaridagawakkanaibetsubamericanfamilydscl" + + "ouderacingjovikarasjokarasuyamarshallstatebankarateu-2xn--trenti" + + "nsd-tirol-6vbifukagawassamukawatarikuzentakatainaioirasebastopol" + + "ogyeongnamegawafaicloudineat-urlomzaporizhzheguriitatebayashijon" + + "awateu-3xn--trentinsdtirol-nsbigv-infolldalondonetskaratsuginami" + + "katagamilanoticias3-website-sa-east-1xn--trgstad-r1axn--trna-woa" + + "xn--troms-zuaxn--tysvr-vraxn--uc0atvestfoldxn--uc0ay4axn--uist22" + + "hamurakamigoris-a-hard-workershawaiijimarcheapigeelvinckaufenxn-" + + "-uisz3gxn--unjrga-rtarumizusawaxn--unup4yxn--uuwu58axn--vads-jra" + + "xn--valle-aoste-ebbtunesorumincomcastresindevicenzaporizhzhiaxn-" + + "-valle-d-aoste-ehbodoes-it1-eurxn--valleaoste-e7axn--valledaoste" + + "-ebbvacationsvcivilwarmiastagets-itmparochernigovernmentoyosatoy" + + "okawaxn--vard-jraxn--vegrshei-c0axn--vermgensberater-ctbihorolog" + + "yonagoyaxn--vermgensberatung-pwblogoipizzaxn--vestvgy-ixa6oxn--v" + + "g-yiabkhaziaxn--vgan-qoaxn--vgsy-qoa0jelenia-goraxn--vgu402comob" + + "araxn--vhquvestnesouthcarolinarvikomakiyosatokamachintaifun-dnsa" + + "liashishikuis-a-patsfanxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xq" + + "adxn--vry-yla5gxn--vuq861bikedaemoneyonagunicloudivttasvuotnakam" + + "agayahooguyoriikarelianceu-4xn--w4r85el8fhu5dnraxn--w4rs40lxn--w" + + "cvs22dxn--wgbh1comparemarkerryhotelsantoandreamhostersanukinvest" + + "mentsaobernardownloadyndns-workshopitsitexasaogoncasacamdvrcampi" + + "nagrandebuilderschlesischesaotomelbournexn--wgbl6axn--xhq521bilb" + + "aokinawashirosatochigiessensiositechnologyoshiokanumazuryukiiyam" + + "anouchikuhokuryugasakitashiobaraxn--xkc2al3hye2axn--xkc2dl3a5ee0" + + "handsonyoursidelmenhorstalbanshellaspeziaxn--y9a3aquariumisawaxn" + + "--yer-znaturbruksgymnxn--yfro4i67oxn--ygarden-p1axn--ygbi2ammxn-" + + "-45brj9cldmailuzernxn--ystre-slidre-ujbillustrationredumbrellahp" + + "piacenzachpomorskienhlfanhs3-website-us-east-1xn--zbx025dxn--zf0" + + "ao64axn--zf0avxlxn--zfr164biocelotenkawaxnbayxz" // 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 @@ -523,1820 +535,1816 @@ const text = "9guacuiababia-goracleaningroks-theatree12hpalermomahachijoinvill" // [15 bits] text index // [ 6 bits] text length var nodes = [...]uint32{ - 0x324003, - 0x3ac784, - 0x2e6d06, - 0x2f86c3, - 0x2f86c6, - 0x38e946, - 0x3b2f83, - 0x316b04, - 0x3280c7, - 0x2e6948, + 0x20bc43, + 0x25d9c4, + 0x2f8cc6, + 0x217243, + 0x217246, + 0x38e886, + 0x3bb603, + 0x2392c4, + 0x3a15c7, + 0x2f8908, 0x1a000c2, - 0x1f3f4c7, - 0x378d49, - 0x2c3d8a, - 0x2c3d8b, - 0x234283, - 0x235a45, - 0x2203782, - 0x3c3f44, - 0x23be43, - 0x327905, - 0x260e2c2, - 0x3425c3, - 0x2a1f004, - 0x331f05, - 0x2e12502, - 0x270d0e, - 0x251a03, - 0x3a7ac6, - 0x3202e82, - 0x2cf107, - 0x238046, - 0x3602a42, - 0x223743, - 0x280904, - 0x2171c6, - 0x3381c8, - 0x289106, - 0x271dc4, + 0x1f3cf47, + 0x376f09, + 0x397eca, + 0x397ecb, + 0x23a2c3, + 0x23cf05, + 0x22070c2, + 0x2f5304, + 0x2f8e43, + 0x30eb85, + 0x260ad42, + 0x360f03, + 0x2a58bc4, + 0x30f345, + 0x2e13602, + 0x21638e, + 0x25c3c3, + 0x3b3dc6, + 0x3202302, + 0x3096c7, + 0x23fa86, + 0x3606a82, + 0x28e183, + 0x235e06, + 0x2f4148, + 0x295bc6, + 0x3c7c04, 0x3a00ac2, - 0x34c289, - 0x215c87, - 0x331a86, - 0x2fb689, - 0x36dc08, - 0x34a384, - 0x36a106, - 0x248746, - 0x3e03082, - 0x22a54f, - 0x211b0e, - 0x216684, - 0x213985, - 0x323f05, - 0x2e3949, - 0x23ec89, - 0x2179c7, - 0x21e906, - 0x238a03, - 0x42197c2, - 0x2197c3, - 0x30d24a, - 0x4631643, - 0x255b85, - 0x2fae02, - 0x38f789, - 0x4e03002, - 0x204dc4, - 0x203006, - 0x32cec5, - 0x36f104, - 0x5624404, - 0x21c183, - 0x234dc4, - 0x5a04182, - 0x23afc4, - 0x5f8d7c4, - 0x37bc4a, + 0x34b449, + 0x220787, + 0x32e5c6, + 0x36ba09, + 0x3ce888, + 0x210944, + 0x2acb06, + 0x2076c6, + 0x3e02002, + 0x38cc46, + 0x24d68f, + 0x3cdb8e, + 0x22b1c4, + 0x234c85, + 0x330d45, + 0x3aaa09, + 0x247e89, + 0x236607, + 0x2584c6, + 0x267083, + 0x422d0c2, + 0x22d543, + 0x29b5ca, + 0x4609983, + 0x3403c5, + 0x30a8c2, + 0x3a4f89, + 0x4e03b42, + 0x207a04, + 0x354186, + 0x243885, + 0x36ebc4, + 0x5626e04, + 0x203b43, + 0x23c4c4, + 0x5a030c2, + 0x25b344, + 0x5f2d504, + 0x316d0a, 0x6200882, - 0x3ba4c7, - 0x212208, - 0x7204602, - 0x3bda07, - 0x22f344, - 0x2c1247, - 0x22f345, - 0x361307, - 0x326546, - 0x28c784, - 0x342345, - 0x2774c7, - 0x8a02cc2, - 0x245a03, - 0x20bd02, - 0x36af43, - 0x8e09fc2, - 0x282e45, - 0x9200202, - 0x2452c4, - 0x3a9905, - 0x2165c7, - 0x366b8e, - 0x2b1b04, - 0x263a84, - 0x20fc03, - 0x268309, - 0x26a0cb, - 0x27e9c8, - 0x2fb448, - 0x353748, - 0x28dc48, - 0x34a1ca, - 0x361207, - 0x2c6606, - 0x9682702, - 0x375fc3, - 0x3cb183, - 0x3ccb84, - 0x376003, - 0x363c03, - 0x173b542, - 0x9a019c2, - 0x27fec5, - 0x339e46, - 0x235804, - 0x37ab87, - 0x23ae06, - 0x2ba3c4, - 0x394487, - 0x2019c3, - 0x9ecab82, - 0xa21c342, - 0xa61c102, - 0x21c106, - 0xaa00282, - 0x284505, - 0x33ca83, - 0x3c2804, - 0x2e99c4, - 0x2e99c5, - 0x3c6083, - 0xae4af03, - 0xb33d3c2, - 0x28d145, - 0x3dc00b, - 0x3c65cb, - 0x226804, - 0x204389, - 0x205504, - 0xb605742, - 0x205f43, - 0x207583, - 0xba08d42, - 0x2ed10a, - 0xbe09002, - 0x3c41c5, - 0x2df2ca, - 0x390144, - 0x20b803, - 0x20c0c4, - 0x20d3c3, - 0x20d3c4, - 0x20d3c7, - 0x20e185, - 0x20ec06, - 0x20eec6, - 0x212fc3, - 0x216a08, - 0x20c483, - 0xc21c782, - 0x246648, - 0x38764b, - 0x21fe48, - 0x220c06, - 0x221187, - 0x224f08, - 0xd205142, - 0xd6bfa42, - 0x332048, - 0x210207, - 0x309b05, - 0x309b08, - 0xdac8208, - 0x2a9e43, - 0x22b9c4, - 0x38e9c2, - 0xde2bd82, - 0xe228b82, - 0xea2c542, - 0x22c543, - 0xee07982, - 0x305b43, - 0x238fc4, - 0x207983, - 0x31f8c4, - 0x332c0b, - 0x280c03, - 0x2e4a86, - 0x280c04, - 0x2b800e, - 0x384a45, - 0x3a7bc8, - 0x2fa347, - 0x2fa34a, - 0x223103, - 0x3ac587, - 0x26a285, - 0x231cc4, - 0x254146, - 0x254147, - 0x2f6e04, - 0x22ee47, - 0xf309544, - 0x37b904, - 0x37b906, - 0x2595c4, - 0x3a8c46, - 0x20bb03, - 0x3b9a08, - 0x20bb08, - 0x263a43, - 0x2ed0c3, - 0x3453c4, - 0x356ac3, - 0xfa47502, - 0xfe8d382, - 0x2056c3, - 0x243e86, - 0x342883, - 0x380c04, - 0x10216482, - 0x24ab83, - 0x216483, - 0x213e42, - 0x10600d42, - 0x2c4586, - 0x236707, - 0x3be887, - 0x3c6a85, - 0x39ad84, - 0x290e85, - 0x239b07, - 0x2dbc49, - 0x2e1b06, - 0x2e5d88, - 0x2fd486, - 0x10a27f02, - 0x3db188, - 0x2fe246, - 0x227f05, - 0x3184c7, - 0x318b04, - 0x318b05, - 0x10f27544, - 0x327548, - 0x11214c42, - 0x11600482, - 0x212746, + 0x3cd347, + 0x27b5c8, + 0x7a08502, + 0x336287, + 0x2d36c4, + 0x2d36c7, + 0x38aa45, + 0x38bf07, + 0x34a906, + 0x29ac84, + 0x3633c5, + 0x282507, + 0x920c142, + 0x38cdc3, + 0x960b4c2, + 0x3b5e03, + 0x9a08742, + 0x2691c5, + 0x9e00202, + 0x371604, + 0x387345, + 0x22b107, + 0x2e954e, + 0x206984, + 0x283b04, + 0x2079c3, + 0x30d489, + 0x2c4e4b, + 0x2e1248, + 0x32b788, + 0x3328c8, + 0x20a888, + 0xa36b84a, + 0x38be07, + 0x2f7086, + 0xa617282, + 0x35ca43, + 0x3d6443, + 0x3d8084, + 0x35ca83, + 0x3bb643, + 0x1738b82, + 0xaa04702, + 0x28a385, + 0x261e86, + 0x252084, + 0x3b0cc7, + 0x25b186, + 0x2d4704, + 0x3be9c7, + 0x204703, + 0xb2dc982, + 0xb728c42, + 0xba13982, + 0x230646, + 0xbe00282, + 0x26b385, + 0x33a0c3, + 0x3de644, + 0x2fd584, + 0x2fd585, + 0x3e9683, + 0xc253c43, + 0xc606342, + 0x20e9c5, + 0x20e9cb, + 0x223c8b, + 0x20e804, + 0x20ee49, + 0x210404, + 0xca10d82, + 0x211a83, + 0x2121c3, + 0xce02502, + 0x23020a, + 0xd20bd42, + 0x2f5585, + 0x2ece4a, + 0x246f44, + 0x213f43, + 0x2154c4, + 0x2178c3, + 0x2178c4, + 0x2178c7, + 0x218705, + 0x219546, + 0x21a186, + 0x2172c3, + 0x220f88, + 0x215b03, + 0xd604242, + 0x2fc548, + 0x295e4b, + 0x229c88, + 0x22ac46, + 0x22b987, + 0x22e908, + 0xee016c2, + 0xf2295c2, + 0x278408, + 0x20b947, + 0x206e85, + 0x3e2208, + 0xf61c008, + 0x26a0c3, + 0x235a44, + 0x38e902, + 0xfa36c42, + 0xfe07f42, + 0x10637242, + 0x237243, + 0x10a04182, + 0x312683, + 0x2135c4, + 0x210903, + 0x210904, + 0x3a264b, + 0x204183, + 0x2f27c6, + 0x284a84, + 0x2ccf8e, + 0x240ec5, + 0x257008, + 0x2716c7, + 0x2716ca, + 0x21b9c3, + 0x25d7c7, + 0x2c5005, + 0x239e44, + 0x25ef06, + 0x25ef07, + 0x3601c4, + 0x10f10344, + 0x3169c4, + 0x3169c6, + 0x25d4c4, + 0x3c2086, + 0x206c43, + 0x206c48, + 0x20b2c8, + 0x2b3843, + 0x2301c3, + 0x344544, + 0x357203, + 0x11604042, + 0x11aea202, + 0x217843, + 0x203c06, + 0x3796c3, + 0x2fd344, + 0x11efd0c2, + 0x343583, + 0x332f83, + 0x21cdc2, + 0x12200d42, + 0x2d7946, + 0x228b07, + 0x27b347, + 0x2c7cc5, + 0x386404, + 0x3d4a45, + 0x3dcc47, + 0x2b5ec9, + 0x2cb106, + 0x2c7bc6, + 0x1320c602, + 0x2b6688, + 0x321346, + 0x327b05, + 0x2f7787, + 0x2fafc4, + 0x2fafc5, + 0x1370e7c4, + 0x30e7c8, + 0x13a08d02, + 0x13e00482, + 0x24c3c6, 0x200488, - 0x358ec5, - 0x359946, - 0x35b9c8, - 0x3804c8, - 0x11a0e745, - 0x11e22584, - 0x245c47, - 0x12204f82, - 0x126291c2, - 0x13a03102, - 0x203105, - 0x2864c5, - 0x386c06, - 0x34f647, - 0x22db47, - 0x1422f743, - 0x30f807, - 0x37af08, - 0x1e22f909, - 0x270ec7, - 0x22fd87, - 0x2309c8, - 0x2311c6, - 0x2317c6, - 0x2324cc, - 0x23394a, - 0x2342c7, - 0x23590b, - 0x236547, - 0x23654e, - 0x1e6373c4, - 0x2375c4, - 0x238e87, - 0x25e687, - 0x23e546, - 0x23e547, - 0x344b07, - 0x26f503, - 0x1ea2ca82, - 0x23f306, - 0x23f30a, - 0x23fd0b, - 0x241187, - 0x241c05, - 0x242143, - 0x242c46, - 0x242c47, - 0x2eaf03, - 0x1ee00102, - 0x2434ca, - 0x1f37a202, - 0x1f647542, - 0x1fa46342, - 0x1fe38142, - 0x246a85, - 0x247204, - 0x20624502, - 0x23b045, - 0x23b843, - 0x205605, - 0x202984, - 0x20adc4, - 0x3671c6, - 0x27f2c6, - 0x2a75c3, - 0x3c0544, - 0x3beb83, - 0x21607682, - 0x221504, - 0x2461c6, - 0x221505, - 0x249f46, - 0x3185c8, - 0x225304, - 0x22e988, - 0x337f85, - 0x33aa08, - 0x2bc7c6, - 0x359d87, - 0x2877c4, - 0x22a877c6, - 0x22e3c8c3, - 0x3a03c3, - 0x2e6648, - 0x329044, - 0x23360887, - 0x23add286, - 0x2dd289, - 0x32d3c8, - 0x268a48, - 0x329bc4, - 0x204c03, - 0x2403c2, - 0x23e50002, - 0x24201d42, - 0x207ec3, - 0x2460ce02, - 0x2eae84, - 0x372c86, - 0x328205, - 0x21b703, - 0x2b6f47, - 0x3301c3, - 0x336588, - 0x210a05, - 0x25b603, - 0x3a9885, - 0x3a99c4, - 0x3006c6, - 0x212a46, - 0x216506, - 0x203884, - 0x236903, - 0x24a08682, - 0x24f39905, + 0x325105, + 0x3264c6, + 0x329dc8, + 0x34c608, + 0x14203ec5, + 0x16e2f004, + 0x2b0f87, + 0x1720fe82, + 0x1762e702, + 0x18a16542, + 0x354285, + 0x192904c5, + 0x241c06, + 0x3b6207, + 0x368e07, + 0x19616543, + 0x3d6787, + 0x283a08, + 0x273b4bc9, + 0x216547, + 0x3e03c7, + 0x238308, + 0x238b06, + 0x239946, + 0x23a58c, + 0x23b58a, + 0x23ba87, + 0x23cdcb, + 0x23dd47, + 0x23dd4e, + 0x2763eb84, + 0x23ec84, + 0x240d87, + 0x24be07, + 0x246386, + 0x246387, + 0x3b74c7, + 0x203643, + 0x27a13b02, + 0x248746, + 0x24874a, + 0x248acb, + 0x249f07, + 0x24aac5, + 0x24b283, + 0x24c646, + 0x24c647, + 0x2feac3, + 0x27e00102, + 0x24d30a, + 0x28378742, + 0x2863d842, + 0x28a47402, + 0x28e3fb82, + 0x24f085, + 0x24fdc4, + 0x29a0c542, + 0x25b3c5, + 0x231943, + 0x29d005, + 0x20a784, + 0x21e5c4, + 0x2d9d06, + 0x25cc06, + 0x20ebc3, + 0x3c1a44, + 0x341883, + 0x2aa03242, + 0x2b1504, + 0x3a1a46, + 0x2b1505, + 0x207106, + 0x2f7888, + 0x233d04, + 0x2b0ac8, + 0x2f3f05, + 0x27ce88, + 0x2d57c6, + 0x21c787, + 0x279ec4, + 0x2be79ec6, + 0x2c220a83, + 0x3a6543, + 0x2c05c8, + 0x334684, + 0x2c615587, + 0x280dc6, + 0x2e9b49, + 0x362488, + 0x32c448, + 0x333004, + 0x20d303, + 0x249182, + 0x2ce57f02, + 0x2d226cc2, + 0x20dd83, + 0x2d615fc2, + 0x2fea44, + 0x285786, + 0x23ca03, + 0x2c72c7, + 0x36ca43, + 0x3e1348, + 0x2253c5, + 0x267d03, + 0x3872c5, + 0x387404, + 0x3bad86, + 0x22a386, + 0x22b046, + 0x2580c4, + 0x23e103, + 0x2da15282, + 0x2de3d545, 0x200843, - 0x25612602, - 0x22f8c3, - 0x23ce85, - 0x25a34e83, - 0x26234e89, - 0x26600942, - 0x26e07bc2, - 0x28cc85, - 0x214b46, - 0x208a86, - 0x2ceb88, - 0x2ceb8b, - 0x3293cb, - 0x2fe6c5, - 0x2cb2c9, + 0x2e603e82, + 0x23a543, + 0x3ca805, + 0x2ea22bc3, + 0x2f23c589, + 0x2f600942, + 0x2fe05342, + 0x2973c5, + 0x21f406, + 0x2b2986, + 0x308cc8, + 0x308ccb, + 0x346d8b, + 0x35b445, + 0x2dcf09, 0x1600b42, - 0x2e7008, - 0x204684, - 0x27601bc2, - 0x34bf03, - 0x27e5e846, - 0x25d348, - 0x28201a02, - 0x28e248, - 0x28669102, - 0x340aca, - 0x28ad0703, - 0x29379386, - 0x37c3c8, - 0x30ad48, - 0x3c2d46, - 0x38acc7, - 0x22a747, - 0x2482ca, - 0x3901c4, - 0x35e684, - 0x3786c9, - 0x297ac185, - 0x211d06, - 0x210403, - 0x24fa44, - 0x29a227c4, - 0x331247, - 0x29eaabc7, - 0x2a1144, - 0x387c05, - 0x386cc8, - 0x3a47c7, - 0x247847, - 0x2a2143c2, - 0x3c51c4, - 0x294548, - 0x2494c4, - 0x24bd44, - 0x24c6c5, - 0x24c807, - 0x2a64e689, - 0x24e184, - 0x24ee09, - 0x24f048, - 0x24f7c4, - 0x24f7c7, - 0x2aa4fe03, - 0x250a47, - 0x16014c2, - 0x16b2642, - 0x251a46, - 0x251ec7, - 0x252304, - 0x253107, - 0x2547c7, - 0x255043, - 0x2b1d82, - 0x20d682, - 0x2fb543, - 0x3c0fc4, - 0x3c0fcb, - 0x2aefb548, - 0x25afc4, - 0x2572c5, - 0x258807, - 0x25a1c5, - 0x2def0a, - 0x25af03, - 0x2b208142, - 0x20c384, - 0x25e449, - 0x2628c3, - 0x262987, - 0x353b89, - 0x3d9dc8, - 0x229b43, - 0x27dbc7, - 0x27e549, - 0x239cc3, - 0x286b44, - 0x287dc9, - 0x28a706, - 0x339283, - 0x202ec2, - 0x237c43, - 0x2b2447, - 0x237c45, - 0x3bd6c6, - 0x2d7004, - 0x3cd145, - 0x27b483, - 0x213206, - 0x211603, - 0x204582, - 0x24aec4, - 0x2b6268c2, - 0x2ba268c3, - 0x2be020c2, - 0x24a403, - 0x20f344, - 0x20f347, - 0x390246, - 0x27cec2, - 0x2c25ec42, - 0x3187c4, - 0x2c60d542, - 0x2ca19202, - 0x23d144, - 0x23d145, - 0x28c405, - 0x366186, - 0x2ce0f4c2, - 0x32a305, - 0x354585, - 0x223383, - 0x3cf0c6, - 0x20f4c5, - 0x21c082, - 0x359585, - 0x21c084, - 0x225243, - 0x225483, - 0x2d209102, - 0x2dac07, - 0x24f244, - 0x24f249, - 0x24f944, - 0x286343, - 0x39f748, - 0x2d686344, - 0x286346, - 0x2a57c3, - 0x257b03, - 0x224943, - 0x2dae9882, - 0x2faf82, - 0x2de00642, - 0x33e548, - 0x342a88, - 0x3b3706, - 0x25adc5, - 0x22bc45, - 0x3306c7, - 0x2e26fbc5, - 0x203942, - 0x2e698402, - 0x2ea00042, - 0x315e88, - 0x3db0c5, - 0x2efec4, - 0x249e85, - 0x24b947, - 0x25f444, - 0x2433c2, - 0x2ee08b82, - 0x350584, - 0x217c07, - 0x28f207, - 0x3612c4, - 0x3cbb43, - 0x263984, - 0x263988, - 0x231b06, - 0x253fca, - 0x2aa144, - 0x2967c8, - 0x28ab44, - 0x221286, - 0x2983c4, - 0x203406, - 0x24f509, - 0x23c347, - 0x21fa83, - 0x2f25ce02, - 0x387f43, - 0x205942, - 0x2f616842, - 0x2f5d86, - 0x3836c8, - 0x2a74c7, - 0x225a09, - 0x2aba89, - 0x2a9385, - 0x2ab689, - 0x2ac745, - 0x2ad585, - 0x2ae048, - 0x2fa07a44, - 0x2fe55187, - 0x230143, - 0x2ae247, - 0x230146, - 0x2ae647, - 0x2a4ac5, - 0x2b9ac3, - 0x30233702, - 0x20ba44, - 0x3062cc02, - 0x30a05dc2, - 0x3cc0c6, - 0x212185, - 0x2b1047, - 0x326fc3, - 0x363b84, - 0x201e83, - 0x2c5e03, - 0x30e03842, - 0x31601cc2, - 0x38ea44, - 0x2dca43, - 0x2f6a45, - 0x31a00f42, - 0x32203702, - 0x2d8946, - 0x329184, - 0x3dacc4, - 0x3dacca, - 0x32a005c2, - 0x245e83, - 0x21368a, - 0x214348, - 0x32e21b84, + 0x2d2908, + 0x20f144, + 0x30602bc2, + 0x33e203, + 0x30e4bfc6, + 0x31200fc2, + 0x20ae88, + 0x31613242, + 0x37aa4a, + 0x32239383, + 0x32b77546, + 0x318348, + 0x38db06, + 0x389c87, + 0x24d887, + 0x20724a, + 0x246fc4, + 0x360c84, + 0x376889, + 0x32fb3a05, + 0x2163c6, + 0x20bb43, + 0x263284, + 0x33232d44, + 0x32d187, + 0x3365e987, + 0x2edb44, + 0x250145, + 0x241cc8, + 0x250387, + 0x250607, + 0x33a18242, + 0x2a2704, + 0x29e388, + 0x251b04, + 0x254744, + 0x254b05, + 0x254c47, + 0x3468b8c9, + 0x2555c4, + 0x256b09, + 0x256d48, + 0x257604, + 0x257607, + 0x257d03, + 0x259ac7, + 0x34a01282, + 0x16c0502, + 0x25b506, + 0x25bb47, + 0x25c404, + 0x25e347, + 0x25f247, + 0x25fc83, + 0x34e5c082, + 0x239fc2, + 0x260743, + 0x260744, + 0x26074b, + 0x32b888, + 0x2891c4, + 0x2618c5, + 0x262fc7, + 0x2ee845, + 0x3b930a, + 0x266b03, + 0x3520eb02, + 0x21dc84, + 0x26b6c9, + 0x26f443, + 0x26f507, + 0x384989, + 0x211fc8, + 0x213bc3, + 0x286bc7, + 0x288f89, + 0x276a83, + 0x290984, + 0x291d49, + 0x2951c6, + 0x3825c3, + 0x204982, + 0x268803, + 0x2c0307, + 0x38f005, + 0x2c4c46, + 0x219a44, + 0x372285, + 0x289e43, + 0x21abc6, + 0x22e143, + 0x20c342, + 0x253c04, + 0x35634402, + 0x35a34403, + 0x35e04342, + 0x253283, + 0x21a604, + 0x323c87, + 0x21fb46, + 0x290942, + 0x3620e8c2, + 0x32c684, + 0x36a17a42, + 0x36e09ac2, + 0x3caac4, + 0x3caac5, + 0x3b6b85, + 0x37d146, + 0x37207042, + 0x207045, + 0x20f745, + 0x213dc3, + 0x2267c6, + 0x227105, + 0x2305c2, + 0x35ac85, + 0x2305c4, + 0x233c43, + 0x233e83, + 0x3760a302, + 0x2318c7, + 0x257784, + 0x257789, + 0x263184, + 0x290343, + 0x2bd008, + 0x37a90344, + 0x290346, + 0x2b05c3, + 0x262243, + 0x343b43, + 0x37f03e02, + 0x30ad42, + 0x38200642, + 0x33bfc8, + 0x2158c8, + 0x3bfcc6, + 0x385145, + 0x323e05, + 0x202347, + 0x386823c5, + 0x2038c2, + 0x38aa0a82, + 0x38e00042, + 0x2832c8, + 0x2b65c5, + 0x302f84, + 0x250d45, + 0x2514c7, + 0x3b0184, + 0x24d202, + 0x3923b502, + 0x350984, + 0x22fec7, + 0x297b47, + 0x38bec4, + 0x3d7403, + 0x2b3784, + 0x2b3788, + 0x239c86, + 0x25ed8a, + 0x358e44, + 0x29ddc8, + 0x24ffc4, + 0x22ba86, + 0x2a0a44, + 0x354586, + 0x257a49, + 0x221247, + 0x39d543, + 0x39605102, + 0x386d03, + 0x210f82, + 0x39a027c2, + 0x268f86, + 0x3b2848, + 0x2b2b07, + 0x2331c9, + 0x2b2cc9, + 0x2b5585, + 0x2b6f09, + 0x2b7705, + 0x2b8545, + 0x2b94c8, + 0x39e17a84, + 0x3a25fdc7, + 0x2b96c3, + 0x2b96c7, + 0x3e0786, + 0x2b9c87, + 0x2af945, + 0x2d0843, + 0x3a63b342, + 0x214184, + 0x3aa11402, + 0x3ae1ec82, + 0x31e946, + 0x27b545, + 0x2bbd87, + 0x3c32c3, + 0x20ccc4, + 0x21e103, + 0x2f6883, + 0x3b2042c2, + 0x3ba08e82, + 0x38e984, + 0x25c043, + 0x308985, + 0x3be05502, + 0x3c602102, + 0x222f86, + 0x2e9484, + 0x2f0284, + 0x2f028a, + 0x3ce005c2, + 0x20e103, + 0x23498a, + 0x26a7c8, + 0x3d2b1b84, 0x2005c3, - 0x33201803, - 0x26c409, - 0x207349, - 0x2b7046, - 0x33614503, - 0x315405, - 0x3b478d, - 0x214506, - 0x21a4cb, - 0x33a03302, - 0x2b4148, - 0x36a16b02, - 0x36e08242, - 0x2e8205, - 0x37201742, - 0x371347, - 0x2022c3, - 0x20f688, - 0x376051c2, - 0x32e244, - 0x210743, - 0x32aa45, - 0x240406, - 0x21da04, - 0x2ed083, - 0x2b3003, - 0x37a150c2, - 0x2fe644, - 0x3bc6c5, - 0x2b2047, - 0x27b8c3, - 0x2b2a03, - 0x16b2ac2, - 0x2b2ac3, - 0x2b2f83, - 0x37e00e02, - 0x3bac04, - 0x27f4c6, - 0x23d303, - 0x2b36c3, - 0x3824b4c2, - 0x24b4c8, - 0x2b4e04, - 0x369ac6, - 0x256e47, - 0x284746, - 0x2aed84, - 0x46601b82, - 0x23000b, - 0x2f378e, - 0x2156cf, - 0x366703, - 0x46e5bd02, - 0x1638902, - 0x472017c2, - 0x296d43, - 0x2092c3, - 0x21d086, - 0x2dbec6, - 0x218d87, - 0x3cb504, - 0x47614c82, - 0x47a10f02, - 0x242b05, - 0x2f1d87, - 0x2b5dc6, - 0x47e47482, - 0x32a244, - 0x2bae03, - 0x48251b42, - 0x48774343, - 0x2bbe44, - 0x2c0549, - 0x48ac7542, - 0x48e01882, - 0x201885, - 0x492c8802, - 0x49604b42, - 0x35d987, - 0x3b6a09, - 0x378fcb, - 0x22a505, - 0x26aa09, - 0x270246, - 0x393bc7, - 0x49a04b44, - 0x3d6a49, - 0x37ed07, - 0x206a07, - 0x22c843, - 0x2b3fc6, - 0x322ec7, - 0x20b003, - 0x371f06, - 0x4a219842, - 0x4a612702, - 0x329a83, - 0x38f945, - 0x21f787, - 0x2dbfc6, - 0x237bc5, - 0x24f1c4, - 0x2a3fc5, - 0x390c84, - 0x4aa01b02, - 0x3be187, - 0x2c51c4, - 0x207244, - 0x20724d, - 0x34ca49, - 0x22cb48, - 0x201b04, - 0x31f985, - 0x20a247, - 0x20a5c4, - 0x266407, - 0x2aa705, - 0x4ae0e504, - 0x2b3145, - 0x261584, - 0x310fc6, - 0x35e105, - 0x4b224382, - 0x2126c3, - 0x3a2a83, - 0x346984, - 0x346985, - 0x361d86, - 0x237d05, - 0x229ac4, - 0x34dfc3, - 0x4b60cd46, - 0x223dc5, - 0x22ae85, - 0x34f544, - 0x2aa1c3, - 0x2aa1cc, - 0x4ba07dc2, - 0x4be01442, - 0x4c20e942, - 0x20e943, - 0x20e944, - 0x4c605542, - 0x353408, - 0x3bd785, - 0x2bd504, - 0x23e3c6, - 0x4ca065c2, - 0x4ce11e02, - 0x4d200c42, - 0x292905, - 0x203746, - 0x2aab04, - 0x217706, - 0x34b306, - 0x227803, - 0x4d737c4a, - 0x2747c5, - 0x30d203, - 0x222306, - 0x3ceec9, - 0x222307, - 0x297688, - 0x36dac9, - 0x326e08, - 0x222e46, - 0x20fbc3, - 0x4da030c2, - 0x3a17c8, - 0x4de49602, - 0x4e205982, - 0x225a83, - 0x2e1985, - 0x29b6c4, - 0x393d09, - 0x3a93c4, - 0x376588, - 0x4ea05983, - 0x4ef33084, - 0x214b88, - 0x207187, - 0x4f32a2c2, - 0x247702, - 0x323e85, - 0x264149, - 0x211d83, - 0x2814c4, - 0x3153c4, - 0x20a2c3, - 0x282a0a, - 0x4f727e02, - 0x4fa0b882, - 0x2cab03, - 0x3928c3, - 0x162f7c2, - 0x3757c3, - 0x4fe1f382, - 0x50200bc2, - 0x50746484, - 0x388586, - 0x26bc04, - 0x27aac3, - 0x3d4c43, - 0x50a00bc3, - 0x240086, - 0x3a5005, - 0x2cac87, - 0x2cdc45, - 0x2cee46, - 0x2d0048, - 0x2d0246, - 0x265cc4, - 0x29cc4b, - 0x2d41c3, - 0x2d41c5, - 0x2d4c48, - 0x203282, - 0x35dc82, - 0x50e46b02, - 0x51204fc2, - 0x214cc3, - 0x5166ff42, - 0x26ff43, - 0x2d5603, - 0x51e23c42, - 0x522da646, - 0x2578c6, - 0x526b4342, - 0x52a075c2, - 0x52e254c2, - 0x5323c9c2, - 0x53618382, - 0x53a02142, - 0x206183, - 0x2c9805, - 0x326406, - 0x53e09c04, - 0x245fca, - 0x3aa986, - 0x20d784, - 0x26a083, - 0x54a05682, - 0x208ac2, - 0x22f883, - 0x54e0ce83, - 0x3bd1c7, - 0x35e007, - 0x56e6f947, - 0x321a47, - 0x229483, - 0x22948a, - 0x265e44, - 0x3125c4, - 0x3125ca, - 0x22dc85, - 0x57211cc2, - 0x2522c3, - 0x57600602, - 0x22c483, - 0x387f03, - 0x57e00582, - 0x37ae84, - 0x3308c4, - 0x3ce845, - 0x319b45, - 0x28ea86, - 0x2aad46, - 0x5824dc02, - 0x58602f42, - 0x312a85, - 0x2575d2, - 0x351086, - 0x271283, - 0x301046, - 0x2ef145, - 0x1607f02, - 0x60a08d82, - 0x378043, - 0x208d83, - 0x282583, - 0x60e18782, - 0x23fc83, - 0x6160dbc2, - 0x2035c3, - 0x3bac48, - 0x26d843, - 0x26d846, - 0x32b747, - 0x31bb46, - 0x31bb4b, - 0x20d6c7, - 0x2e6444, - 0x61e00c02, - 0x3bd605, - 0x6220ce43, - 0x209b43, - 0x32c2c5, - 0x335703, - 0x62b35706, - 0x2e718a, - 0x2a3283, - 0x2170c4, - 0x2003c6, - 0x228306, - 0x62e3f7c3, - 0x363a47, - 0x26c307, - 0x29e485, - 0x281ec6, - 0x223e03, - 0x65bcf303, - 0x65e00a82, - 0x663406c4, - 0x3b9809, - 0x207f45, - 0x227484, - 0x3531c8, - 0x23d505, - 0x6666fcc5, - 0x242249, - 0x331b43, - 0x2474c4, - 0x66a04ac2, - 0x214ec3, - 0x66e7a042, - 0x27a046, - 0x167ce82, - 0x67203482, - 0x292808, - 0x2a2203, - 0x2b3087, - 0x31bdc5, - 0x2e2fc5, - 0x34e14b, - 0x2e2fc6, - 0x34e346, - 0x2e3f06, - 0x280104, - 0x2c0746, - 0x676d7a48, - 0x280cc3, - 0x266a03, - 0x266a04, - 0x2fb244, - 0x30a607, - 0x2e7b45, - 0x67ae7c82, - 0x67e07702, - 0x6861b5c5, - 0x2b5c44, - 0x2d8f4b, - 0x2e98c8, - 0x24de84, - 0x68a2c9c2, - 0x68e1a142, - 0x3a8bc3, - 0x2eba44, - 0x2ebd05, - 0x2ec547, - 0x2efa04, - 0x3613c4, - 0x69214e02, - 0x37e589, - 0x2f0b45, - 0x22a7c5, - 0x2f16c5, - 0x69614e03, - 0x2f2d04, - 0x2f2d0b, - 0x2f3044, - 0x2f330b, - 0x2f4345, - 0x21580a, - 0x2f4b08, - 0x2f4d0a, - 0x2f5543, - 0x2f554a, - 0x69e1c282, - 0x6a203542, - 0x6a628743, - 0x6aaf93c2, + 0x3d687643, + 0x326909, + 0x280609, + 0x2c73c6, + 0x3da43543, + 0x2887cd, + 0x3a8e86, + 0x3e0e8b, + 0x3de087c2, + 0x2ac948, + 0x42221082, + 0x42601e02, + 0x398285, + 0x42a02642, + 0x2b3187, + 0x202983, + 0x2272c8, + 0x42e06002, + 0x3a9984, + 0x22a003, + 0x3532c5, + 0x2491c6, + 0x22cf04, + 0x230183, + 0x44205b42, + 0x35b3c4, + 0x2beb45, + 0x2bff07, + 0x285203, + 0x2c1443, + 0x1619e82, + 0x2c1b03, + 0x2c2103, + 0x44600e02, + 0x239104, + 0x23e306, + 0x288d83, + 0x2c2a83, + 0x44a54202, + 0x254208, + 0x2c3a04, + 0x2052c6, + 0x387d07, + 0x3d4dc6, + 0x2c0544, + 0x52e025c2, + 0x3e064b, + 0x30624e, + 0x2201cf, + 0x3bc5c3, + 0x536687c2, + 0x161ee02, + 0x53a01f42, + 0x2f9843, + 0x20b603, + 0x2732c6, + 0x2cb846, + 0x2bc847, + 0x3b7004, + 0x53e1f542, + 0x542258c2, + 0x302645, + 0x32a647, + 0x2c6106, + 0x5463d782, + 0x382f04, + 0x2cc083, + 0x54a07bc2, + 0x54f73803, + 0x2cd984, + 0x2d2249, + 0x552da042, + 0x55611b82, + 0x2876c5, + 0x55ada802, + 0x56205542, + 0x35fb87, + 0x37718b, + 0x24d645, + 0x264489, + 0x275d46, + 0x56608004, + 0x208009, + 0x2f9cc7, + 0x349887, + 0x205543, + 0x2f1a46, + 0x351887, + 0x24c243, + 0x2a4106, + 0x56e1f002, + 0x57225e82, + 0x217443, + 0x3a5145, + 0x21c307, + 0x23f286, + 0x38ef85, + 0x263104, + 0x2aee85, + 0x390bc4, + 0x5760b402, + 0x2d8d84, + 0x2cbe44, + 0x39c84d, + 0x2cbe49, + 0x237848, + 0x262c84, + 0x38d345, + 0x3c2307, + 0x3c2bc4, + 0x273847, + 0x228f05, + 0x57ab4484, + 0x2c5b45, + 0x26e104, + 0x316546, + 0x3b6005, + 0x57e6b2c2, + 0x225e43, + 0x333e43, + 0x2c8784, + 0x2c8785, + 0x208c86, + 0x235585, + 0x263944, + 0x58392e03, + 0x587d1a86, + 0x219405, + 0x21b385, + 0x3b6104, 0x2f93c3, - 0x6af56bc2, - 0x6b33d202, - 0x2fab44, - 0x216b46, - 0x217445, - 0x2fe1c3, - 0x3245c6, - 0x216f45, - 0x22cec4, - 0x6b600902, - 0x2a7b04, - 0x2caf4a, - 0x32d147, - 0x335a86, - 0x3ac3c7, - 0x23f343, - 0x2bbe88, - 0x3bdbcb, - 0x2b7145, - 0x2c0d85, - 0x2c0d86, - 0x26cf04, - 0x3c0688, - 0x21be43, - 0x248644, - 0x248647, - 0x2e6086, - 0x203a86, - 0x2b7e4a, - 0x24ee84, - 0x314eca, - 0x6bb48d46, - 0x348d47, - 0x257347, - 0x276e44, - 0x276e49, - 0x233045, - 0x326a0b, - 0x2e8f43, - 0x212c03, - 0x6be1d5c3, - 0x2c9a04, - 0x6c200682, - 0x224746, - 0x6c6b9845, - 0x301285, - 0x251c86, - 0x2a0304, - 0x6ca03e42, - 0x242184, - 0x6ce129c2, - 0x228ac5, - 0x268804, - 0x6da1bbc3, - 0x6de08dc2, - 0x208dc3, - 0x238446, - 0x6e205fc2, - 0x395a48, - 0x222184, - 0x222186, - 0x393146, - 0x6e6588c4, - 0x20ccc5, - 0x222488, - 0x2250c7, - 0x227547, - 0x22754f, - 0x294446, - 0x231603, - 0x23ee84, - 0x20c5c3, - 0x2213c4, - 0x251dc4, - 0x6ea0ba82, - 0x28d083, - 0x337243, - 0x6ee02442, - 0x223943, - 0x21c2c3, - 0x20e20a, - 0x275b47, - 0x25494c, - 0x6f254c06, - 0x254d86, - 0x256b47, - 0x6f630e07, - 0x25d989, - 0x246784, - 0x262b04, - 0x6fa14d02, - 0x6fe05c82, - 0x2b8206, - 0x363844, - 0x28d506, - 0x231288, - 0x38fa04, - 0x259c46, - 0x208a45, - 0x7028b748, - 0x242d43, - 0x30d485, - 0x2917c3, - 0x22a8c3, - 0x22a8c4, - 0x20c343, - 0x7064b902, - 0x70a033c2, - 0x2e8e09, - 0x292705, - 0x292a04, - 0x293245, - 0x20b444, - 0x3a2007, - 0x35fbc5, - 0x70e3bb84, - 0x2df6c8, - 0x2e0cc6, - 0x2e2e04, - 0x2e3508, - 0x2e3807, - 0x71201702, - 0x2e6804, - 0x30a484, - 0x2c1447, - 0x71605184, - 0x226b42, - 0x71a01782, - 0x201783, - 0x201784, - 0x29f203, - 0x29f205, - 0x71e1df42, - 0x2fae85, - 0x287542, - 0x303a85, - 0x3b9145, - 0x72210b82, - 0x216404, - 0x726026c2, - 0x36b586, - 0x2ba0c6, - 0x264288, - 0x2c20c8, - 0x3cc044, - 0x3b2ac5, - 0x383b49, - 0x2fe744, - 0x2e7144, - 0x203983, - 0x248403, - 0x72a48405, - 0x234545, - 0x2865c4, - 0x35550d, - 0x354282, - 0x357a43, - 0x35ef43, - 0x72e05c42, - 0x73202302, - 0x395505, - 0x368687, - 0x21dc44, - 0x36dcc9, - 0x2cb089, - 0x279e83, - 0x279e88, - 0x2f3f49, - 0x2305c7, - 0x207ac5, - 0x383886, - 0x3a2c06, - 0x3a6305, - 0x34cb45, - 0x73601a82, - 0x27cbc5, - 0x2b8908, - 0x2c4346, - 0x73b2ec87, - 0x2a1084, - 0x309247, - 0x2ffe86, - 0x73e01082, - 0x361a86, - 0x30310a, - 0x303985, - 0x742e4542, - 0x7468f3c2, - 0x340fc6, - 0x318e08, - 0x74a8f3c7, - 0x74e28cc2, - 0x28a1c3, - 0x3a8546, - 0x224304, - 0x278b06, - 0x313646, - 0x376d4a, - 0x203bc5, - 0x331cc6, - 0x32ee03, - 0x32ee04, - 0x20b102, - 0x329103, - 0x7520e982, - 0x2ed803, - 0x213904, - 0x2c28c4, - 0x75718f4a, - 0x222f03, - 0x222f0a, - 0x239447, - 0x307186, - 0x23bd84, - 0x20d642, - 0x2a5b82, - 0x75a007c2, - 0x263943, - 0x257107, - 0x2007c7, - 0x288e44, - 0x21f187, - 0x2ec646, - 0x210347, - 0x21c204, - 0x3ae645, - 0x20fa45, - 0x75e14642, - 0x387fc6, - 0x214643, - 0x21d882, - 0x21d886, - 0x76207202, - 0x7661a602, - 0x3c5285, - 0x76a44d02, - 0x76e01942, - 0x323485, - 0x2d4505, + 0x358ecc, + 0x58ac0002, + 0x58e00e82, + 0x59209d42, + 0x21b283, + 0x21b284, + 0x59610442, + 0x308108, + 0x2c4d05, + 0x2dafc4, + 0x359186, + 0x59a205c2, + 0x59e109c2, + 0x5a200c42, + 0x2a3c05, + 0x354806, + 0x232c84, + 0x236346, + 0x213186, + 0x25aa03, + 0x5a694b4a, + 0x2853c5, + 0x29b583, + 0x20f546, + 0x5aa0f549, + 0x22c4c7, + 0x3c8c08, + 0x3ce749, + 0x2b6048, + 0x209146, + 0x207cc3, + 0x5af1de42, + 0x32bd88, + 0x5b256e02, + 0x5b601582, + 0x233243, + 0x2efe85, + 0x280f44, + 0x3e27c9, + 0x386e04, + 0x38d188, + 0x5be10fc3, + 0x5c3a2ac4, + 0x21f448, + 0x5c70df02, + 0x2cf1c2, + 0x330cc5, + 0x34af09, + 0x216443, + 0x31b884, + 0x36e504, + 0x20b683, + 0x28bf8a, + 0x5cb0f082, + 0x5ce13fc2, + 0x2dc903, + 0x3939c3, + 0x1609382, + 0x35c243, + 0x5d228882, + 0x5d600bc2, + 0x5da8d4c4, + 0x28d4c6, + 0x276e84, + 0x283103, + 0x28f583, + 0x5de00bc3, + 0x248e46, + 0x3de805, + 0x2e0947, + 0x2e0886, + 0x2e0e48, + 0x2e1046, + 0x2239c4, + 0x2a6a8b, + 0x2e30c3, + 0x2e30c5, + 0x2165c2, + 0x35fe82, + 0x5e24f102, + 0x5e603742, + 0x20a083, + 0x5ea77782, + 0x277783, + 0x2e4103, + 0x5f2093c2, + 0x5f6e8306, + 0x35e3c6, + 0x5fae8442, + 0x5fe12202, + 0x60233ec2, + 0x60ea9542, + 0x61345342, + 0x61602802, + 0x20b0c3, + 0x3da086, + 0x61a1b544, + 0x2b130a, + 0x3b1d46, + 0x285084, + 0x202703, + 0x62606c02, + 0x204cc2, + 0x26f843, + 0x62a296c3, + 0x3c5847, + 0x3b5f07, + 0x67e60847, + 0x341607, + 0x232403, + 0x23240a, + 0x257204, + 0x31e544, + 0x31e54a, + 0x24a905, + 0x6823a382, + 0x2583c3, + 0x68600602, + 0x257743, + 0x386cc3, + 0x68e00582, + 0x283984, + 0x202544, + 0x2032c5, + 0x3301c5, + 0x236e86, + 0x2fb4c6, + 0x6924ba82, + 0x69601cc2, + 0x2f97c5, + 0x35e0d2, + 0x298a06, + 0x291c43, + 0x2b4ac6, + 0x2cf8c5, + 0x1603442, + 0x71a056c2, + 0x341143, + 0x212bc3, + 0x29c403, + 0x71e01102, + 0x21e803, + 0x7222d4c2, + 0x201d03, + 0x3b1008, + 0x241c43, + 0x2b5406, + 0x3e3047, + 0x34dbc6, + 0x34dbcb, + 0x284fc7, + 0x33ee44, + 0x72a00c02, + 0x2c4b85, + 0x72e2f483, + 0x23b843, + 0x39fd45, + 0x348ec3, + 0x73748ec6, + 0x3e514a, + 0x2ade43, + 0x213a04, + 0x2003c6, + 0x327f06, + 0x73a0cb83, + 0x20cb87, + 0x326807, 0x2a8485, - 0x77609903, - 0x372d45, - 0x2e3087, - 0x2f7405, - 0x203d85, - 0x322804, - 0x23d386, - 0x2fdc84, - 0x77a008c2, - 0x786e7645, - 0x3858c7, - 0x3543c8, - 0x250e06, - 0x38f0cd, - 0x250e09, - 0x250e12, - 0x349b05, - 0x34c683, - 0x78a05842, - 0x313244, - 0x214583, - 0x382b45, - 0x304945, - 0x78e10782, - 0x25b643, - 0x7921ddc2, - 0x79a736c2, - 0x79e00082, - 0x2d1885, - 0x21fb83, - 0x248d88, - 0x7a210242, - 0x7a613602, - 0x37ae46, - 0x31650a, - 0x206303, - 0x258dc3, - 0x2f1cc3, - 0x7ba04cc2, - 0x89e187c2, - 0x8a608c02, - 0x2038c2, - 0x3ccc09, - 0x2c6984, - 0x20a988, - 0x8aaf6602, - 0x8b205d42, - 0x2b04c5, - 0x235d48, - 0x2f9f08, - 0x2e95cc, - 0x239383, - 0x8b61fb02, - 0x8ba00f02, - 0x367b06, - 0x308005, - 0x2db783, - 0x250346, - 0x308146, - 0x291103, - 0x30a3c3, - 0x30a7c6, - 0x30c044, - 0x26c6c6, - 0x3b45ca, - 0x2443c4, - 0x30c704, - 0x30d84a, - 0x8bee5d02, - 0x24ff85, - 0x30f38a, - 0x30f2c5, - 0x3115c4, - 0x3116c6, - 0x311844, - 0x215186, - 0x8c22c902, - 0x2f8346, - 0x32b1c5, - 0x329847, - 0x3b4446, - 0x256d44, - 0x2dba07, - 0x337b86, - 0x20b085, - 0x20b087, - 0x3bc047, - 0x3bc04e, - 0x38cb86, - 0x221045, - 0x2050c7, - 0x207603, - 0x349047, - 0x208f45, - 0x217ec4, - 0x222782, - 0x22bdc7, - 0x3cb584, - 0x2ff104, - 0x24758b, - 0x21c903, - 0x291847, - 0x21c904, - 0x2ba647, - 0x22ac83, - 0x34e84d, - 0x3a4e08, - 0x8c6261c4, - 0x23ba85, - 0x312bc5, - 0x313003, - 0x8ca22082, - 0x315303, - 0x315703, - 0x388144, - 0x27e645, - 0x2146c7, - 0x32ee86, - 0x390b03, - 0x22550b, - 0x27e74b, - 0x2b2ccb, - 0x2d340b, - 0x2e458a, - 0x3709cb, - 0x396c8b, - 0x3d92cc, - 0x3da7cb, - 0x317351, - 0x31778a, - 0x317c8b, - 0x317f4c, - 0x31824b, - 0x3188ca, - 0x3191ca, - 0x31a0ce, - 0x31a98b, - 0x31ac4a, - 0x31c751, - 0x31cb8a, - 0x31d08b, - 0x31d5ce, - 0x31df0c, - 0x31e98b, - 0x31ec4e, - 0x31efcc, - 0x3222ca, - 0x32384c, - 0x8cf23b4a, - 0x324748, - 0x325309, - 0x333d0a, - 0x333f8a, - 0x33420b, - 0x3369ce, - 0x337651, - 0x342f49, - 0x34318a, - 0x343f8b, - 0x345aca, - 0x346f16, - 0x34828b, - 0x3498ca, - 0x349cca, - 0x34accb, - 0x34c109, - 0x34f1c9, - 0x34fc8d, - 0x35030b, - 0x35120b, - 0x351bcb, - 0x352709, - 0x352d4e, - 0x353dca, - 0x354c8a, - 0x3552ca, - 0x355b8b, - 0x3563cb, - 0x35724d, - 0x358bcd, - 0x359210, - 0x3596cb, - 0x35a24c, - 0x35b74b, - 0x35d48b, - 0x35eb4e, - 0x35f6cb, - 0x35f6cd, - 0x364c8b, - 0x36570f, - 0x365acb, - 0x36630a, - 0x368b49, - 0x369209, - 0x8d36a28b, - 0x36a54e, - 0x36e90b, - 0x36f58f, - 0x37208b, - 0x37234b, - 0x37260b, - 0x372e8a, - 0x378bc9, - 0x37d1cf, + 0x239706, + 0x217303, + 0x76626a03, + 0x76a00a82, + 0x76ec8044, + 0x2114c9, + 0x22f7c5, + 0x361cc4, + 0x31e288, + 0x24ac45, + 0x7724ccc5, + 0x255849, + 0x32e683, + 0x23d7c4, + 0x77608402, + 0x21f783, + 0x77a96dc2, + 0x296dc6, + 0x169a902, + 0x77e15982, + 0x2a3b08, + 0x2b3743, + 0x2c5a87, + 0x2c1b85, + 0x2c5645, + 0x34de4b, + 0x2f17c6, + 0x34e046, + 0x277304, + 0x219d06, + 0x782f1e48, + 0x28e543, + 0x265043, + 0x265044, + 0x2fa884, + 0x309447, + 0x3da945, + 0x786f8842, + 0x78a059c2, + 0x792059c5, + 0x2ca784, + 0x2fa9cb, + 0x2fd488, + 0x24bd04, + 0x796376c2, + 0x79a06bc2, + 0x206bc3, + 0x2ff644, + 0x2ff905, + 0x300487, + 0x79f02ac4, + 0x38bfc4, + 0x7a2037c2, + 0x37e5c9, + 0x303fc5, + 0x24d905, + 0x304b45, + 0x7a61f6c3, + 0x240644, + 0x24064b, + 0x305b04, + 0x305dcb, + 0x306745, + 0x22030a, + 0x307108, + 0x30730a, + 0x307b83, + 0x307b8a, + 0x7ae1a782, + 0x7b24cec2, + 0x7b604683, + 0x7bad3b02, + 0x309ec3, + 0x7bef57c2, + 0x7c33a842, + 0x30a904, + 0x2210c6, + 0x236085, + 0x30ccc3, + 0x3ce106, + 0x219045, + 0x35a504, + 0x7c600902, + 0x2b4004, + 0x2dcb8a, + 0x2c3687, + 0x349246, + 0x25d607, + 0x248783, + 0x2cd9c8, + 0x3e7ccb, + 0x221e45, + 0x36e645, + 0x36e646, + 0x2f8384, + 0x3df448, + 0x205703, + 0x2075c4, + 0x2075c7, + 0x33ea86, + 0x3a2e06, + 0x2ccdca, + 0x256b84, + 0x2c244a, + 0x7ca08dc6, + 0x208dc7, + 0x261947, + 0x266584, + 0x266589, + 0x336705, + 0x2f9c43, + 0x22a543, + 0x7ce264c3, + 0x23a044, + 0x7d200682, + 0x3d8986, + 0x7d6d05c5, + 0x2b4d05, + 0x25b746, + 0x31d704, + 0x7da12742, + 0x24b2c4, + 0x7de04a02, + 0x20c2c5, + 0x336884, + 0x7f22ccc3, + 0x7f609742, + 0x209743, + 0x21e946, + 0x7fa01ec2, + 0x397488, + 0x22c344, + 0x22c346, + 0x394246, + 0x7fe63084, + 0x21a7c5, + 0x22ef08, + 0x231dc7, + 0x326fc7, + 0x326fcf, + 0x29e286, + 0x23cc03, + 0x241684, + 0x20f843, + 0x22bbc4, + 0x252e44, + 0x80207f02, + 0x3747c3, + 0x337cc3, + 0x80602b02, + 0x204143, + 0x37d083, + 0x21878a, + 0x27eb47, + 0x258ecc, + 0x80a59186, + 0x25abc6, + 0x25bcc7, + 0x80e38747, + 0x262389, + 0x812fc684, + 0x8160a0c2, + 0x81a01702, + 0x2cd186, + 0x20c984, + 0x39e1c6, + 0x267ec8, + 0x3a5204, + 0x2f8ec6, + 0x2b2945, + 0x81e7c4c8, + 0x24c743, + 0x28a485, + 0x35d1c3, + 0x24da03, + 0x24da04, + 0x21dc43, + 0x82254642, + 0x826014c2, + 0x2f9b09, + 0x296cc5, + 0x3d4744, + 0x3e5745, + 0x20f244, + 0x37b3c7, + 0x338685, + 0x82ed1984, + 0x2d1988, + 0x2dd986, + 0x2e1dc4, + 0x2e1fc8, + 0x83204ac2, + 0x2f0d84, + 0x20f904, + 0x2d38c7, + 0x83605fc4, + 0x2171c2, + 0x83a0b5c2, + 0x20b5c3, + 0x2875c4, + 0x2512c3, + 0x2ba385, + 0x83e35542, + 0x30ac45, + 0x279c42, + 0x311f85, + 0x2db805, + 0x842010c2, + 0x332f04, + 0x84602d82, + 0x30dd46, + 0x2192c6, + 0x34b048, + 0x2d49c8, + 0x31e8c4, + 0x301805, + 0x2c0d09, + 0x2d2a44, + 0x3e5104, + 0x21f203, + 0x207383, + 0x84a07385, + 0x26fac5, + 0x269544, + 0x337d4d, + 0x352902, + 0x352903, + 0x84e04102, + 0x85200ec2, + 0x396f45, + 0x354c47, + 0x22d144, + 0x3ce949, + 0x2dccc9, + 0x282303, + 0x282308, + 0x246809, + 0x227d47, + 0x85755b45, + 0x3615c6, + 0x362786, + 0x365cc5, + 0x2cbf45, + 0x85a01c42, + 0x2930c5, + 0x2c9448, + 0x2d6a06, + 0x85ed7247, + 0x306984, + 0x2b9ac7, + 0x3b9106, + 0x8624b302, + 0x208986, + 0x31160a, + 0x311e85, + 0x86615a82, + 0x86a14442, + 0x278b86, + 0x86e97d07, + 0x8720c4c2, + 0x20a803, + 0x2250c6, + 0x2d5884, + 0x27ac86, + 0x32fa86, + 0x3a32ca, + 0x32e805, + 0x30d8c6, + 0x36c343, + 0x36c344, + 0x87603bc2, + 0x321303, + 0x87a1b2c2, + 0x31fec3, + 0x87e34c04, + 0x2d8284, + 0x883e380a, + 0x209203, + 0x326ac7, + 0x315106, + 0x38fa84, + 0x236d42, + 0x2b0982, + 0x886007c2, + 0x232a43, + 0x261707, + 0x2007c7, + 0x292704, + 0x258d47, + 0x300586, + 0x20ba87, + 0x230744, + 0x2b61c5, + 0x221c45, + 0x88a0d782, + 0x219e46, + 0x230bc3, + 0x29d6c2, + 0x2fc146, + 0x88e12682, + 0x89213402, + 0x213405, + 0x8962bdc2, + 0x89a02a02, + 0x351e45, + 0x2e3405, + 0x30a705, + 0x8a268b83, + 0x285845, + 0x2f1887, + 0x2b9385, + 0x32e9c5, + 0x257104, + 0x361b46, + 0x24e044, + 0x8a6008c2, + 0x8b2510c5, + 0x3967c7, + 0x213c08, + 0x27d046, + 0x27d04d, + 0x2803c9, + 0x2803d2, + 0x37e8c5, + 0x383403, + 0x8b6091c2, + 0x32f684, + 0x3a8f03, + 0x3d64c5, + 0x3136c5, + 0x8ba2a042, + 0x267d43, + 0x8be32982, + 0x8c629742, + 0x8ca00082, + 0x2ead45, + 0x39d643, + 0x8ce04942, + 0x8d206502, + 0x283946, + 0x2484ca, + 0x201c83, + 0x2638c3, + 0x2f2d43, + 0x8ee04a42, + 0x9d666342, + 0x9de0e002, + 0x205002, + 0x3d8109, + 0x2d9444, + 0x2e5488, + 0x9e308542, + 0x9ea017c2, + 0x393285, + 0x23d208, + 0x2f8088, + 0x30500c, + 0x241403, + 0x9ee6dac2, + 0x9f208e42, + 0x39dbc6, + 0x315f85, + 0x2e8c43, + 0x24cb06, + 0x3160c6, + 0x251403, + 0x317703, + 0x317dc6, + 0x319884, + 0x2a2446, + 0x34cd04, + 0x319f44, + 0x31aa0a, + 0x9f603582, + 0x257e85, + 0x31bfca, + 0x31bf05, + 0x31ce84, + 0x31cf86, + 0x31d104, + 0x21fa46, + 0x9fa16ec2, + 0x216ec6, + 0x271385, + 0x30d747, + 0x3c1346, + 0x25bec4, + 0x2e8ec7, + 0x2089c5, + 0x242c07, + 0x228947, + 0x22894e, + 0x2849c6, + 0x2b6dc5, + 0x205f07, + 0x3c3947, + 0x212d85, + 0x229b84, + 0x3235c2, + 0x23d887, + 0x249e04, + 0x35a784, + 0x2cf04b, + 0x9fe246c3, + 0x301387, + 0x2246c4, + 0x301687, + 0x310883, + 0x34e54d, + 0x3ad188, + 0xa0233984, + 0x3e16c5, + 0x31f985, + 0x31fdc3, + 0xa0608f02, + 0x3212c3, + 0x321a83, + 0x215ac4, + 0x289085, + 0x219fc7, + 0x36c3c6, + 0x390a43, + 0x233f0b, + 0x35be8b, + 0x2b504b, + 0x2cae8b, + 0x3991ca, + 0x2d6bcb, + 0x2f228b, + 0x32178c, + 0x31a34b, + 0x370491, + 0x398e4a, + 0x3b8a4b, + 0x3c95cc, + 0x3e6f4b, + 0x3230ca, + 0x323f4a, + 0x324dce, + 0x325a4b, + 0x325d0a, + 0x328911, + 0x328d4a, + 0x32924b, + 0x32978e, + 0x32a14c, + 0x32ae8b, + 0x32b14e, + 0x32b4cc, + 0x32ef0a, + 0x33068c, + 0xa0b3098a, + 0x331288, + 0x331e49, + 0x3348ca, + 0x334b4a, + 0x334dcb, + 0x33744e, + 0x338091, + 0x341cc9, + 0x341f0a, + 0x342c8b, + 0x343dcd, + 0x344c4a, + 0x345616, + 0x34698b, + 0x34844a, + 0x34888a, + 0x34a48b, + 0x34b2c9, + 0x34eec9, + 0x34f44d, + 0x34fc0b, + 0x3514cb, + 0x351f89, + 0x3525ce, + 0x3529ca, + 0x3550ca, + 0x35590a, + 0x3562cb, + 0x356b0b, + 0x35798d, + 0x359fcd, + 0x35a910, + 0x35adcb, + 0x35bacc, + 0x35cc8b, + 0x35f68b, + 0x3611ce, + 0x3617cb, + 0x3617cd, + 0x36740b, + 0x367e8f, + 0x36824b, + 0x36918a, + 0x369f49, + 0x36ab49, + 0xa0f6aecb, + 0x36b18e, + 0x36b50e, + 0x36e28b, + 0x36f04f, + 0x3718cb, + 0x371b8b, + 0x371e4a, + 0x376d89, + 0x37c74f, 0x381d4c, - 0x38230c, - 0x38280e, - 0x382e0f, - 0x3831ce, - 0x383f10, - 0x38430f, - 0x384ece, - 0x385a8c, - 0x385d91, - 0x3861d2, - 0x388711, - 0x388f0e, - 0x38934b, - 0x38934e, - 0x3896cf, - 0x389a8e, - 0x389e13, - 0x38a2d1, - 0x38a70c, - 0x38aa0e, - 0x38ae8c, - 0x38b3d3, - 0x38bbd0, - 0x38d8cc, - 0x38dbcc, - 0x38e08b, - 0x38e64e, - 0x38eb4b, - 0x38f40b, - 0x3914cc, - 0x395f8a, - 0x39648c, - 0x39678c, - 0x396a89, - 0x3986cb, - 0x398988, - 0x399149, - 0x39914f, - 0x39a90b, - 0x8d79b24a, - 0x39d78c, - 0x39e94b, - 0x39ec09, - 0x39f388, - 0x39f94b, - 0x3a018b, - 0x3a0d0a, - 0x3a0f8b, - 0x3a154c, - 0x3a2688, - 0x3a514b, - 0x3a80cb, - 0x3ab58e, - 0x3acccb, - 0x3af7cb, - 0x3bbbcb, - 0x3bbe89, - 0x3bc3cd, - 0x3ca50a, - 0x3cdb97, - 0x3cfd58, - 0x3d34c9, - 0x3d460b, - 0x3d50d4, - 0x3d55cb, - 0x3d5b4a, - 0x3d600a, - 0x3d628b, - 0x3d7250, - 0x3d7651, - 0x3d7c0a, - 0x3d88cd, - 0x3d8fcd, - 0x3dbd8b, - 0x3880c3, - 0x8db86943, - 0x2a9ec6, - 0x279c45, - 0x3911c7, - 0x334b06, - 0x1603a02, - 0x3d2049, - 0x3243c4, - 0x2e2608, - 0x21d503, - 0x313187, - 0x231442, - 0x2b1083, - 0x8de08c42, - 0x2cbb06, - 0x2ccf04, - 0x346604, - 0x36d203, - 0x8e6c8842, - 0x8ea1e244, - 0x276d87, - 0x8ee2ba82, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x1acac8, - 0x204783, + 0x38298c, + 0x3830ce, + 0x3835cf, + 0x38398e, + 0x383e10, + 0x38420f, + 0x384bce, + 0x38528c, + 0x385591, + 0x3859d2, + 0x387891, + 0x387ece, + 0x38830b, + 0x38830e, + 0x38868f, + 0x388a4e, + 0x388dd3, + 0x389291, + 0x3896cc, + 0x3899ce, + 0x389e4c, + 0x38a293, + 0x38af50, + 0x38b3cc, + 0x38b6cc, + 0x38bb8b, + 0x38e58e, + 0x38ea8b, + 0x38f2cb, + 0x39150c, + 0x3979ca, + 0x39864c, + 0x39894c, + 0x398c49, + 0x39ac8b, + 0x39af48, + 0x39b509, + 0x39b50f, + 0x39cf4b, + 0xa139e64a, + 0x3a3a0c, + 0x3a49cb, + 0x3a4c89, + 0x3a56c8, + 0x3a630b, + 0x3a810a, + 0x3a838b, + 0x3a9b0c, + 0x3aa649, + 0x3aa888, + 0x3ad7cb, + 0x3b0a4b, + 0x3b2e0e, + 0x3b494b, + 0x3b83cb, + 0x3c420b, + 0x3c44c9, + 0x3c488d, + 0x3d57ca, + 0x3d9857, + 0x3da218, + 0x3dc0c9, + 0x3de3cb, + 0x3df714, + 0x3dfc0b, + 0x3e018a, + 0x3e2a0a, + 0x3e2c8b, + 0x3e4810, + 0x3e4c11, + 0x3e5a4a, + 0x3e654d, + 0x3e6c4d, + 0x3e940b, + 0x219f43, + 0xa17b5883, + 0x3cc686, + 0x3df0c5, + 0x27a587, + 0x2ddec6, + 0x164bf82, + 0x2729c9, + 0x20c004, + 0x2f0788, + 0x226403, + 0x32f5c7, + 0x247f82, + 0x2bbdc3, + 0xa1a0e042, + 0x2dd846, + 0x2defc4, + 0x2c8404, + 0x3a0f43, + 0xa22da842, + 0xa262f444, + 0x2664c7, + 0xa2a35b02, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x117bc8, + 0x20d903, 0x2000c2, - 0xa7c88, - 0x203102, - 0x224943, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x202443, - 0x33fed6, - 0x362e53, - 0x21f009, - 0x245b48, - 0x3bd489, - 0x30f506, - 0x3505d0, - 0x243713, - 0x2e6148, - 0x27abc7, - 0x27c4c7, - 0x2a3d0a, - 0x3426c9, - 0x3a2809, - 0x25078b, - 0x326546, - 0x28938a, - 0x220c06, - 0x323fc3, - 0x2dab45, - 0x3b9a08, - 0x23620d, - 0x2031cc, - 0x2fd587, - 0x31a40d, - 0x222584, - 0x23224a, - 0x23348a, - 0x23394a, - 0x23cc87, - 0x23e247, - 0x240a84, - 0x2877c6, - 0x32b384, - 0x2d8588, - 0x3a9409, - 0x2ceb86, - 0x2ceb88, - 0x243ecd, - 0x2cb2c9, - 0x30ad48, - 0x22a747, - 0x23904a, - 0x251ec6, - 0x25dec7, - 0x2d0e84, - 0x28f047, - 0x22494a, - 0x23f84e, - 0x26fbc5, - 0x28ef4b, - 0x222b09, - 0x207349, - 0x371187, - 0x3dc44a, - 0x2c1387, - 0x2f38c9, - 0x209f08, - 0x32c60b, - 0x2e1985, - 0x22ca0a, - 0x225289, - 0x36beca, - 0x2cdccb, - 0x3c6c8b, - 0x250515, - 0x2e59c5, - 0x22a7c5, - 0x2f2d0a, - 0x25970a, - 0x313b87, - 0x22a803, - 0x2b8188, - 0x2d928a, - 0x222186, - 0x25b6c9, - 0x28b748, - 0x2e2e04, - 0x38b189, - 0x2c20c8, - 0x2bc707, - 0x2e7646, - 0x3858c7, - 0x2c2dc7, - 0x23fe85, - 0x26fa0c, - 0x23ba85, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x203102, - 0x22f743, - 0x20ce83, - 0x204783, - 0x23f7c3, - 0x22f743, - 0x20ce83, - 0x4783, - 0x26d843, - 0x23f7c3, - 0x1ca8c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0xa7c88, - 0x203102, - 0x22f743, - 0x22f747, - 0x20ce83, - 0x23f7c3, - 0x203102, - 0x201d02, - 0x2e63c2, - 0x2051c2, - 0x2090c2, - 0x2e4e02, - 0x92246, - 0x52449, - 0x481bbc3, - 0x891c7, - 0x50c3, - 0x112585, + 0x793c8, + 0x216542, + 0x343b43, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x202b03, + 0x33d956, + 0x365753, + 0x258bc9, + 0x2b0e88, + 0x2c4a09, + 0x31c146, + 0x3509d0, + 0x218053, + 0x33eb48, + 0x285c87, + 0x2929c7, + 0x2aebca, + 0x363749, + 0x333bc9, + 0x25dd0b, + 0x34a906, + 0x32b98a, + 0x22ac46, + 0x238c43, + 0x231805, + 0x206c48, + 0x28b04d, + 0x35434c, + 0x271047, + 0x309f4d, + 0x22f004, + 0x23a30a, + 0x23b0ca, + 0x23b58a, + 0x218347, + 0x2461c7, + 0x249d44, + 0x279ec6, + 0x34abc4, + 0x222bc8, + 0x386e49, + 0x209a46, + 0x308cc8, + 0x24dd4d, + 0x2dcf09, + 0x318348, + 0x24d887, + 0x21364a, + 0x25bb46, + 0x34bbc4, + 0x2298c7, + 0x3d8b8a, + 0x242f8e, + 0x2823c5, + 0x29788b, + 0x232789, + 0x280609, + 0x20d547, + 0x20d54a, + 0x2d3807, + 0x306389, + 0x37b048, + 0x37948b, + 0x2efe85, + 0x23770a, + 0x233c89, + 0x33324a, + 0x22654b, + 0x2297cb, + 0x25da95, + 0x2f0c45, + 0x24d905, + 0x24064a, + 0x26ba4a, + 0x390f47, + 0x23d343, + 0x2cd108, + 0x2e640a, + 0x22c346, + 0x261289, + 0x27c4c8, + 0x2e1dc4, + 0x2512c9, + 0x2d49c8, + 0x2d5707, + 0x2510c6, + 0x3967c7, + 0x399b07, + 0x248c45, + 0x37500c, + 0x3e16c5, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x216542, + 0x216543, + 0x2296c3, + 0x20d903, + 0x20cb83, + 0x216543, + 0x2296c3, + 0xd903, + 0x241c43, + 0x20cb83, + 0x1d5b83, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x793c8, + 0x216542, + 0x216543, + 0x3a8607, + 0x17b1c4, + 0x2296c3, + 0xbbc4, + 0x20cb83, + 0x19045, + 0x216542, + 0x2104c2, + 0x31d0c2, + 0x206002, + 0x205c02, + 0x2160c2, + 0x9a6c6, + 0x5c549, + 0x182487, + 0x1550e, + 0x99049, + 0x482ccc3, + 0x95c87, + 0x152e06, + 0x1643, + 0x11e505, 0xc1, - 0x522f743, - 0x234e83, - 0x20d343, - 0x224943, - 0x214503, - 0x211d83, - 0x2daa46, - 0x20ce83, - 0x23f7c3, - 0x2021c3, - 0xa7c88, - 0x3314c4, - 0x332e47, - 0x36d243, - 0x2e8204, - 0x2186c3, - 0x287e03, - 0x224943, - 0xe747, + 0x5216543, + 0x222bc3, + 0x2f5503, + 0x343b43, + 0x243543, + 0x216443, + 0x2e8706, + 0x2296c3, + 0x20cb83, + 0x202883, + 0x793c8, + 0x209b84, + 0x3a2887, + 0x3a0f83, + 0x25e704, + 0x20d3c3, + 0x20d5c3, + 0x343b43, + 0xb46c7, 0x9c4, - 0x11c3, - 0x1273c5, - 0x2000c2, - 0x4af03, - 0x6603102, - 0x688b549, - 0x8bbcd, - 0x8cb4d, - 0x2e63c2, - 0x21b84, - 0x127409, + 0x12db83, + 0x10e645, + 0x66000c2, + 0x53c43, + 0x6a16542, + 0x6e90b89, + 0x7096ac9, + 0x96f4d, + 0x9728d, + 0x31d0c2, + 0xb1b84, + 0x10e689, 0x2003c2, - 0x6e21a88, - 0xf2484, - 0xa7c88, - 0x1416702, + 0x76b1a88, + 0x105504, + 0x320b43, + 0x793c8, + 0x49e04, + 0x1407242, 0x14005c2, - 0x1416702, - 0x150c906, - 0x2314c3, - 0x271803, - 0x762f743, - 0x232244, - 0x7a34e83, - 0x8624943, - 0x203842, - 0x221b84, - 0x20ce83, - 0x301e03, - 0x201e02, - 0x23f7c3, - 0x218002, - 0x2faa83, - 0x205fc2, - 0x2a3903, - 0x28b803, - 0x202d02, - 0xa7c88, - 0x2314c3, - 0x20bb08, - 0x2802c2, - 0x7f01e03, - 0x201e02, - 0x2faa83, - 0x205fc2, - 0x82a3903, - 0x28b803, - 0x202d02, - 0x254c07, - 0x234e89, - 0x2faa83, - 0x205fc2, - 0x2a3903, - 0x28b803, - 0x202d02, - 0x22f743, - 0x24af03, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x214503, - 0x211d83, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x20da42, - 0x214e03, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x24af03, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x20ce83, - 0x23f7c3, - 0x207ac5, - 0x210782, + 0x1407242, + 0x151a146, + 0x23bb83, + 0x2cc803, + 0x7e16543, + 0x23a304, + 0x8622bc3, + 0x8f43b43, + 0x2042c2, + 0x2b1b84, + 0x2296c3, + 0x38c643, + 0x203c82, + 0x20cb83, + 0x221a42, + 0x30a303, + 0x201ec2, + 0x26a603, + 0x220b03, + 0x2089c2, + 0x793c8, + 0x82fdcc9, + 0x27b43, + 0x23bb83, + 0x20b2c8, + 0x8b8c643, + 0x203c82, + 0x30a303, + 0x201ec2, + 0x26a603, + 0x220b03, + 0x2089c2, + 0x259187, + 0x30a303, + 0x201ec2, + 0x26a603, + 0x220b03, + 0x2089c2, + 0x216543, + 0x4702, + 0x6c43, + 0x2bc2, + 0x13242, + 0xe8c2, + 0x11de42, + 0x4a42, + 0x4da82, + 0x253c43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x243543, + 0x216443, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x204642, + 0x21f6c3, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x8503, + 0x2d4c2, + 0x253c43, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x2296c3, + 0x20cb83, + 0x355b45, + 0x22a042, 0x2000c2, - 0xa7c88, - 0x14441c8, - 0x13258a, - 0x224943, - 0x2042c1, + 0x793c8, + 0xaec0ad2, + 0x1472588, + 0x1b2b8a, + 0x3ec5, + 0x343b43, + 0x230d41, 0x2009c1, 0x200a01, - 0x201301, - 0x201281, - 0x205ac1, - 0x202881, - 0x220541, - 0x204341, + 0x202c41, + 0x201b41, + 0x211101, + 0x209c01, + 0x230e41, + 0x2fd181, 0x200001, 0x2000c1, 0x200201, - 0x129245, - 0xa7c88, + 0x146c05, + 0x793c8, 0x200101, - 0x2015c1, + 0x201381, 0x200501, - 0x2014c1, + 0x201281, 0x200041, 0x200801, 0x200181, @@ -2347,7067 +2355,7413 @@ var nodes = [...]uint32{ 0x200581, 0x2003c1, 0x200a81, - 0x216b41, + 0x2210c1, 0x200401, 0x200741, 0x2007c1, 0x200081, - 0x200f01, - 0x202d01, - 0x201241, - 0x2018c1, - 0x2086c1, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x203102, - 0x22f743, - 0x234e83, + 0x2017c1, + 0x201641, + 0x207281, + 0x2024c1, + 0x208481, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x216542, + 0x216543, + 0x222bc3, 0x2003c2, - 0x23f7c3, - 0x1b583, - 0xe747, - 0x11e87, - 0x25786, - 0x36a8a, - 0x8ac88, - 0x56548, - 0x57007, - 0x1757c6, - 0xe0a45, - 0x1339c5, - 0x11d483, - 0x1c6b46, - 0xfd986, - 0x250784, - 0x3bd8c7, - 0xa7c88, - 0x2dbb04, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x3102, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x323d48, - 0x330684, - 0x234dc4, - 0x226804, - 0x367a07, - 0x2d7607, - 0x22f743, - 0x2375cb, - 0x316cca, - 0x326807, - 0x302288, - 0x32aac8, - 0x234e83, - 0x32d787, - 0x20d343, - 0x2083c8, - 0x20b5c9, - 0x221b84, - 0x214503, - 0x23b2c8, - 0x211d83, - 0x2d430a, - 0x2daa46, - 0x3aa987, - 0x20ce83, - 0x398446, - 0x271688, - 0x23f7c3, - 0x258f86, - 0x2e9b0d, - 0x2ec208, - 0x2f304b, - 0x3c6506, - 0x368587, - 0x212885, - 0x22914a, - 0x220205, - 0x23444a, - 0x210782, - 0x2050c3, - 0x2ff104, + 0x20cb83, + 0x22a83, + 0xb46c7, + 0x1cdf07, + 0x32f46, + 0x4280a, + 0x95748, + 0x60c88, + 0x61607, + 0xbc3c4, + 0x15c246, + 0xeec85, + 0x10f7c5, + 0x129643, + 0x30846, + 0x13906, + 0x25dd04, + 0x336147, + 0x793c8, + 0x2e8fc4, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x16542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x330b88, + 0x202304, + 0x23c4c4, + 0x20e804, + 0x39dac7, + 0x2e59c7, + 0x216543, + 0x23ec8b, + 0x33100a, + 0x38f947, + 0x300288, + 0x353348, + 0x222bc3, + 0x3c2e87, + 0x2f5503, + 0x214fc8, + 0x224309, + 0x2b1b84, + 0x243543, + 0x244688, + 0x216443, + 0x2e320a, + 0x2e8706, + 0x3b1d47, + 0x2296c3, + 0x2f1b46, + 0x3d2288, + 0x20cb83, + 0x275546, + 0x2fd6cd, + 0x2ffe48, + 0x305b0b, + 0x223bc6, + 0x354b47, + 0x21d985, + 0x22e68a, + 0x2fce05, + 0x26f9ca, + 0x22a042, + 0x201643, + 0x35a784, 0x200006, - 0x3b2f83, - 0x2a7b83, - 0x24e8c3, - 0x2c5d43, - 0x2b5903, - 0x203082, - 0x2fcf85, - 0x2a9749, - 0x240503, - 0x21c183, - 0x224cc3, + 0x3bb603, + 0x2b4083, + 0x28bb03, + 0x202303, + 0x37a403, + 0x202002, + 0x39d805, + 0x2b5949, + 0x209983, + 0x2492c3, + 0x203b43, + 0x216c43, 0x200201, - 0x2e6f07, - 0x2d15c5, - 0x3a8343, - 0x3c6083, - 0x226804, - 0x327003, - 0x20f588, - 0x368d83, - 0x3097cd, - 0x38cc48, - 0x20bcc6, - 0x329143, - 0x391783, - 0x3acf43, - 0xc62f743, - 0x2346c8, - 0x2375c4, - 0x241183, + 0x2d2807, + 0x2eaa85, + 0x3c1fc3, + 0x26b383, + 0x3e9683, + 0x20e804, + 0x3c3303, + 0x2271c8, + 0x35bdc3, + 0x3e1ecd, + 0x284a88, + 0x20b486, + 0x2e9443, + 0x35a2c3, + 0x361ac3, + 0xda16543, + 0x23bdc8, + 0x23ec84, + 0x247203, + 0x249f03, 0x200106, - 0x244988, - 0x27d8c3, - 0x229183, - 0x22f8c3, - 0x234e83, - 0x2199c3, - 0x250603, - 0x286583, - 0x3290c3, - 0x28e243, - 0x2227c3, - 0x38f685, - 0x252404, - 0x252d87, - 0x2b1d82, - 0x2562c3, - 0x259106, - 0x25ab43, - 0x25b203, - 0x279e43, - 0x376083, - 0x3311c3, - 0x298c07, - 0xca24943, - 0x249203, - 0x3d66c3, - 0x2083c3, - 0x214343, - 0x2f8683, - 0x3b9485, - 0x374ec3, - 0x200e09, - 0x201503, - 0x304c43, - 0xce37bc3, - 0x2bd483, - 0x21acc8, - 0x2a9686, - 0x375e46, - 0x29e046, - 0x38c287, - 0x222e43, - 0x225a83, - 0x211d83, - 0x28ad86, - 0x203282, - 0x2a2c03, - 0x33e985, - 0x20ce83, - 0x3104c7, - 0x1604783, - 0x271683, + 0x24e888, + 0x266943, + 0x228fc3, + 0x2ba1c3, + 0x220a83, + 0x22e6c3, + 0x23a543, + 0x222bc3, + 0x22d743, + 0x255ec3, + 0x209a43, + 0x290583, + 0x325243, + 0x20ae83, + 0x232d43, + 0x3a4e85, + 0x25c504, + 0x25dfc7, + 0x25c082, + 0x260183, + 0x263c46, + 0x265743, + 0x266c03, + 0x2822c3, + 0x35cb03, + 0x21fb43, + 0x32d103, + 0x2a1807, + 0xe743b43, + 0x2d3103, 0x207c83, - 0x212ec3, - 0x209b43, - 0x23f7c3, - 0x20c586, - 0x326d46, - 0x37da83, - 0x2eb003, - 0x214e03, - 0x21c283, - 0x30a443, - 0x2f8c83, - 0x2fae43, - 0x216f45, - 0x259703, - 0x387b06, - 0x32b588, - 0x212c03, - 0x3be389, - 0x363348, - 0x215a48, - 0x21fc05, - 0x2ff34a, - 0x35fcca, - 0x3a128b, - 0x22ecc8, - 0x2ed043, - 0x390c43, - 0x2f2f83, - 0x305a48, - 0x3788c3, - 0x32ee04, - 0x20b102, - 0x25e943, + 0x20e443, + 0x26a7c3, + 0x217203, + 0x3b5945, + 0x37cac3, + 0x252749, + 0x2012c3, + 0x3139c3, + 0xea53203, + 0x2daf43, + 0x20e843, + 0x214808, + 0x2b5886, + 0x35c8c6, + 0x2be186, + 0x267347, + 0x202143, + 0x233243, + 0x216443, + 0x295846, + 0x2165c2, + 0x2e69c3, + 0x33c405, + 0x2296c3, + 0x31c887, + 0x160d903, + 0x29ae43, + 0x2183c3, + 0x23c9c3, + 0x23b843, + 0x20cb83, + 0x21de86, + 0x202fc6, + 0x37db83, + 0x29a8c3, + 0x21f6c3, + 0x259143, + 0x317783, + 0x309603, + 0x30ac03, + 0x219045, + 0x24c343, + 0x250046, + 0x21b103, + 0x2f4f88, + 0x22a543, + 0x22a549, + 0x37ad08, + 0x220548, + 0x22eac5, + 0x38ac4a, + 0x3e08ca, + 0x3e110b, + 0x3e1ac8, + 0x2aa6c3, + 0x230143, + 0x390b83, + 0x2f34c3, + 0x312588, + 0x355303, + 0x36c344, + 0x203bc2, + 0x22e683, + 0x24c0c3, 0x2007c3, - 0x222d03, - 0x254f83, - 0x2021c3, - 0x210782, - 0x22ab43, - 0x239383, - 0x30ca83, - 0x30e284, - 0x2ff104, - 0x3c6903, - 0xa7c88, + 0x3d8883, + 0x281003, + 0x202883, + 0x22a042, + 0x2d3703, + 0x241403, + 0x31a2c3, + 0x31b444, + 0x35a784, + 0x227083, + 0x793c8, + 0xdf1854c, + 0xe2ac245, + 0xbb705, 0x2000c2, 0x200ac2, - 0x203082, - 0x202602, + 0x202002, + 0x202cc2, 0x200202, - 0x201ec2, - 0x255002, - 0x201bc2, + 0x202402, + 0x250cc2, + 0x202bc2, 0x200382, 0x200c42, - 0x32a2c2, - 0x204fc2, - 0x26ff42, + 0x30df02, + 0x203742, + 0x277782, 0x200a82, - 0x2e4e02, - 0x204ac2, - 0x201c82, - 0x214e02, - 0x2b2002, - 0x2046c2, + 0x2160c2, + 0x208402, + 0x219d02, + 0x2037c2, + 0x2cb042, + 0x205d42, 0x200682, - 0x215742, - 0x203e42, - 0x202442, - 0x205c82, - 0x234542, - 0x201942, + 0x214f42, + 0x212742, + 0x202b02, + 0x201702, + 0x203782, + 0x202a02, 0xc2, 0xac2, - 0x3082, - 0x2602, + 0x2002, + 0x2cc2, 0x202, - 0x1ec2, - 0x55002, - 0x1bc2, + 0x2402, + 0x50cc2, + 0x2bc2, 0x382, 0xc42, - 0x12a2c2, - 0x4fc2, - 0x6ff42, + 0x10df02, + 0x3742, + 0x77782, 0xa82, - 0xe4e02, - 0x4ac2, - 0x1c82, - 0x14e02, - 0xb2002, - 0x46c2, + 0x160c2, + 0x8402, + 0x19d02, + 0x37c2, + 0xcb042, + 0x5d42, 0x682, - 0x15742, - 0x3e42, - 0x2442, - 0x5c82, - 0x34542, - 0x1942, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x50c2, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x3102, - 0x203102, - 0x23f7c3, - 0xe62f743, - 0x224943, - 0x211d83, - 0x71003, - 0x228002, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x8c42, + 0x14f42, + 0x12742, + 0x2b02, + 0x1702, + 0x3782, + 0x2a02, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x1642, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x16542, + 0x216542, + 0x20cb83, + 0x10216543, + 0x343b43, + 0x216443, + 0xeb2c7, + 0x7ca83, + 0x2386c2, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x30103, + 0x2296c3, + 0xd903, + 0x7ca83, + 0x20cb83, + 0xe042, 0x2001c2, - 0x143c845, - 0x129245, - 0x20bac2, - 0xa7c88, - 0x3102, - 0x2366c2, - 0x204482, - 0x20f782, - 0x211cc2, - 0x24dc02, - 0x1339c5, - 0x2016c2, - 0x201e02, - 0x218782, - 0x201dc2, - 0x204ac2, - 0x3a1642, - 0x201782, - 0x296d02, - 0xf731fc4, + 0x15ca1c5, + 0x146c05, + 0x20cd42, + 0x793c8, + 0x16542, + 0x23dec2, + 0x204202, + 0x202702, + 0x23a382, + 0x24ba82, + 0x10f7c5, + 0x201482, + 0x203c82, + 0x201102, + 0x203382, + 0x208402, + 0x2473c2, + 0x20b5c2, + 0x21c282, + 0x11278384, 0x142, - 0xe747, - 0x14f80d, - 0xe0ac9, - 0xd700b, - 0xe2f48, - 0x668c9, - 0x105546, - 0x224943, - 0xa7c88, + 0xb46c7, + 0x15a43, + 0x1b63cd, + 0xeed09, + 0xef94b, + 0xf1748, + 0x64f09, + 0x114786, + 0x343b43, + 0x793c8, 0x9c4, - 0x11c3, - 0x1273c5, - 0xa7c88, - 0xde387, - 0x57b06, - 0x127409, - 0xe50e, - 0x14bf47, + 0x12db83, + 0x10e645, + 0x793c8, + 0xebe47, + 0x12455f47, + 0x12a5f244, + 0x62246, + 0x10e689, + 0xb448e, + 0x13e247, + 0x15d8303, + 0x12e0ad42, + 0x9989, + 0xa144, 0x2000c2, - 0x250784, - 0x203102, - 0x22f743, - 0x201d02, - 0x234e83, - 0x143c3, + 0x25dd04, + 0x216542, + 0x216543, + 0x2104c2, + 0x222bc3, + 0x1a003, 0x200382, - 0x2dbb04, - 0x214503, - 0x249602, - 0x20ce83, + 0x2e8fc4, + 0x243543, + 0x256e02, + 0x2296c3, + 0x4ba82, 0x2003c2, - 0x23f7c3, - 0x22a7c6, - 0x3347cf, + 0x20cb83, + 0x24d906, + 0x33538f, 0x602, - 0x776243, - 0xa7c88, - 0x203102, - 0x20d343, - 0x224943, - 0x211d83, - 0x4783, - 0xe508, - 0x1428f0b, - 0x1540cca, - 0x152bd0a, - 0x1427bc7, - 0xa3dcb, - 0x178945, - 0x110209, - 0x129245, - 0xe747, - 0xef6c4, - 0x203102, - 0x22f743, - 0x224943, - 0x20ce83, + 0x723543, + 0x2f5dca, + 0x793c8, + 0x216542, + 0x2f5503, + 0x343b43, + 0x216443, + 0xd903, + 0x147b5e07, + 0x157cd06, + 0x13f046, + 0x14bc4b88, + 0x1db944, + 0x14ebe40a, + 0x15abe40d, + 0xb4488, + 0x142e44b, + 0x147888a, + 0x15c66b43, + 0xf3949, + 0x16104b48, + 0x1664c347, + 0x15e360a, + 0x1513e47, + 0xaec8b, + 0x16a9068c, + 0xa5545, + 0xcf9c5, + 0x11c5c9, + 0x1a0c84, + 0x117703, + 0x152be545, + 0x124443, + 0x15635c43, + 0x124443, + 0x1d7607, + 0x2bdc2, + 0x6502, + 0x6502, + 0x4182, + 0x6502, + 0x4a42, + 0xd42, + 0x3242, + 0x146c05, + 0xb46c7, + 0x1db944, + 0x102784, + 0x216542, + 0x216543, + 0x343b43, + 0x2296c3, 0x2000c2, 0x200c82, - 0x33d3c2, - 0x12a2f743, - 0x23e8c2, - 0x234e83, - 0x2014c2, - 0x2268c2, - 0x224943, - 0x203942, - 0x28bec2, - 0x21e202, + 0x206342, + 0x17a16543, + 0x247382, + 0x222bc3, + 0x201282, + 0x234402, + 0x343b43, + 0x2038c2, + 0x271cc2, + 0x22f402, 0x200cc2, - 0x291f82, + 0x29a402, 0x200802, 0x200d82, - 0x25ce02, - 0x27bc02, - 0x216842, - 0x15388c, - 0x2b2a02, - 0x2ea082, - 0x214682, - 0x242bc2, - 0x211d83, + 0x205102, + 0x2870c2, + 0x2027c2, + 0x132a0c, + 0x2c1442, + 0x25adc2, + 0x230c02, + 0x253582, + 0x216443, 0x200bc2, - 0x20ce83, - 0x224a82, - 0x2d33c2, - 0x23f7c3, - 0x240582, - 0x202442, - 0x214d02, - 0x2033c2, - 0x210b82, - 0x2e4542, - 0x214642, - 0x21ddc2, - 0x21d9c2, - 0x31ac4a, - 0x36630a, - 0x39c18a, - 0x3dd442, - 0x20fd02, - 0x3b9442, - 0x12e45889, - 0x13363c4a, - 0x1430787, - 0x13605102, - 0x14ed383, - 0x2542, - 0x163c4a, - 0x18b84e, - 0x23d544, - 0x77605, - 0x13e2f743, - 0x3f0c3, - 0x234e83, - 0x24f044, - 0x224943, - 0x221b84, - 0x214503, - 0x1405c9, - 0x1a2ac6, - 0x211d83, - 0xe3e84, - 0x176943, - 0x20ce83, - 0x7085, - 0x204783, - 0x23f7c3, - 0x143d444, - 0x259703, - 0x1069c4, - 0x2050c3, - 0xa7c88, - 0x176186, - 0x1575744, - 0x16d005, - 0x14bd0a, - 0x1237c2, - 0x1a7ac6, - 0x55e11, - 0x14645889, - 0x16d088, - 0x4e388, - 0x1c7bc7, - 0x3002, - 0xe31ce, - 0x12924b, - 0x1355cb, - 0x19c68a, - 0x892ca, - 0x26807, - 0xa7c88, - 0x114748, - 0x4e87, - 0x1b01530b, - 0x1b587, - 0x1c782, - 0x5d4c7, - 0x27f0a, - 0x5588f, - 0x3cb4f, - 0x291c2, - 0x3102, - 0x864c8, - 0xe3aca, - 0xdde8a, - 0x52b0a, - 0x18ca48, - 0xc288, - 0x5bb48, - 0xde348, - 0x16c848, - 0x7682, - 0x3c8cf, - 0xa1f8b, - 0x18d648, - 0x39dc7, - 0x168a, - 0x13a0cb, - 0x35309, - 0x49547, - 0xc188, - 0x15fe8c, - 0x1385c7, - 0xdad4a, - 0xfcc8, - 0x2578e, - 0x25f4e, - 0x2664b, - 0x296cb, - 0x2c0cb, - 0x2cf89, - 0x6cb8b, - 0x6d68d, - 0xdc28b, - 0xf990d, - 0xf9c8d, - 0xfd7ca, - 0xfef4b, - 0x3b8cb, + 0x2296c3, + 0x20f502, + 0x298642, + 0x20cb83, + 0x249342, + 0x202b02, + 0x20a0c2, + 0x2014c2, + 0x2010c2, + 0x215a82, + 0x20d782, + 0x232982, + 0x22cec2, + 0x325d0a, + 0x36918a, + 0x39ecca, + 0x3e9b42, + 0x20cec2, + 0x2be702, + 0x17f8cc49, + 0x183bb68a, + 0x14380c7, + 0x18601682, + 0x1430483, + 0x2c02, + 0x1bb68a, + 0x14f0ce, + 0x21d684, + 0xe8805, + 0x18e16543, + 0x48383, + 0x222bc3, + 0x256d44, + 0x343b43, + 0x2b1b84, + 0x243543, + 0x13e049, + 0x133e86, + 0x216443, + 0xf1dc4, + 0x1b03, + 0x2296c3, + 0x149f05, + 0x20d903, + 0x20cb83, + 0x1561c04, + 0x24c343, + 0x114bc4, + 0x201643, + 0x793c8, + 0x154db43, + 0x123486, + 0x155c1c4, + 0x1a0d45, + 0x1a0a8a, + 0x130602, + 0x199a16cd, + 0x1b3dc6, + 0x147f11, + 0x19f8cc49, + 0x1a0dc8, + 0x42008, + 0x20869487, + 0x3b42, + 0x18cdc7, + 0x208ce, + 0x146c0b, + 0x148d8b, + 0x1c0dca, + 0x34347, + 0x793c8, + 0xb4188, + 0xfd87, + 0x20c1fe0b, + 0x22a87, + 0x4242, + 0x3288d, + 0x163907, + 0x127b0a, + 0x12510c, + 0x1252cf, + 0x1ca4cf, + 0x212eb34d, + 0x2e702, + 0x16542, + 0x904c8, + 0x214e91cc, + 0x1aab8a, + 0xeb94a, + 0x7d54a, + 0x84888, + 0x1db88, + 0x68608, + 0xebe08, + 0x17bbc8, + 0x3242, + 0x1ca24f, + 0xcaa8b, + 0x1dcf08, + 0x3e1c7, + 0x874ca, + 0x3aa4b, + 0x51b89, + 0x873c7, + 0x136f46, + 0x1da88, + 0x1e0a8c, + 0xf4547, + 0x31a0a, + 0x1c74c8, + 0x32f4e, + 0x3370e, + 0x3418b, + 0x3518b, + 0x3678b, + 0xfc849, + 0x880cb, + 0xb688d, + 0x158a8b, + 0xf7a8d, + 0xf7e0d, + 0x12378a, + 0x15a5cb, + 0x1e150b, 0x3f545, - 0x1b424010, - 0x174cf, - 0x13218f, - 0x6e90d, - 0x140790, - 0x69102, - 0x1ba1ed48, - 0x11d08, - 0xa1150, - 0x11578e, - 0x1bf68d45, - 0x4e18b, - 0x13f6d0, - 0x55548, - 0xc38a, - 0x29889, - 0x63007, - 0x63347, - 0x63507, - 0x63d47, - 0x65147, - 0x65747, - 0x66087, - 0x665c7, - 0x67107, - 0x67487, - 0x67b47, - 0x67d07, - 0x67ec7, - 0x68087, - 0x69207, - 0x69ac7, - 0x6ac47, - 0x6b007, - 0x6b647, - 0x6b907, - 0x6bac7, - 0x6bdc7, - 0x6fe07, - 0x70007, - 0x703c7, - 0x70587, - 0x70747, - 0x71387, - 0x72987, - 0x72e07, - 0x73907, - 0x73bc7, - 0x73f47, - 0x74107, - 0x74507, - 0x755c7, - 0x75a07, - 0x75f87, - 0x76147, - 0x76307, + 0x219c4bd0, + 0x21c41a88, + 0x3610f, + 0x7854f, + 0x2254d, + 0x17a710, + 0x13242, + 0x22258908, + 0x1cdd88, + 0x1b0350, + 0x106a4e, + 0x2275bd85, + 0x555cb, + 0x13d150, + 0x1dc8a, + 0x35349, + 0x6ff47, + 0x70287, + 0x70447, + 0x71587, + 0x72407, + 0x72787, + 0x734c7, + 0x73a07, + 0x73f07, + 0x74287, + 0x74947, + 0x74b07, + 0x74cc7, + 0x74e87, + 0x75207, + 0x756c7, + 0x75ec7, + 0x76287, + 0x768c7, 0x76b87, - 0x77747, - 0x77c87, - 0x78207, - 0x783c7, - 0x78747, - 0x79347, - 0x4582, - 0x5bc4a, - 0xe3fc7, - 0x888c5, - 0xa6411, - 0x1b9e06, - 0xf5a8a, - 0x8634a, - 0x57b06, - 0xacf8b, + 0x76d47, + 0x77047, + 0x77647, + 0x77847, + 0x78d07, + 0x78ec7, + 0x79087, + 0x79807, + 0x7a047, + 0x7a8c7, + 0x7d387, + 0x7d7c7, + 0x7db47, + 0x7dd07, + 0x7e107, + 0x7e547, + 0x7ea07, + 0x7ef87, + 0x7f147, + 0x7f307, + 0x7f747, + 0x7fd07, + 0x80247, + 0x80847, + 0x80a07, + 0x810c7, + 0x81607, + 0xc342, + 0x6870a, + 0x1a608, + 0x1bbfcc, + 0x12fb47, + 0x44405, + 0xc3d91, + 0x13dc6, + 0x12100a, + 0x9034a, + 0x62246, + 0xb7f4b, 0x642, - 0x31b11, - 0x1522c9, - 0x98009, - 0x5ce02, - 0x8268a, - 0xa8c49, - 0xa938f, - 0xa998e, - 0xac2c8, - 0x5dc2, - 0x175c89, - 0x19b74e, - 0x1c1f4c, - 0xe534f, - 0x1b380e, - 0x2b3cc, - 0x6d309, - 0x6ee11, - 0x6f3c8, - 0x139312, - 0x13a8cd, - 0x16028d, - 0x172b4b, - 0x4e555, - 0x53889, - 0x5ac8a, - 0x5f309, - 0x74a50, - 0x7574b, - 0x8678f, - 0x171dcb, - 0x1c998c, - 0x91ad0, - 0x9748a, - 0xa2acd, - 0xabf4e, - 0xadcca, - 0xb00cc, - 0xc2a94, - 0x151f51, - 0xb5b0b, - 0xb7d0f, - 0xb970d, - 0xb9f8e, - 0xbc5cc, - 0xbe58c, - 0xc278b, - 0xc334e, - 0xc3c10, - 0xc4a0b, - 0x170d8d, - 0x14388f, - 0xcbe4c, - 0xcea0e, - 0xcfc11, - 0xd830c, - 0xe0e07, - 0xeea0d, - 0xf6c0c, - 0x108c10, - 0x1ccf4d, - 0xfffc7, - 0x145d10, - 0x166548, - 0x1730cb, - 0xb184f, - 0x120648, - 0xf5c8d, - 0x103a10, - 0x17ef89, - 0x1c2b36c6, - 0xb4d43, - 0xba545, - 0x51b42, - 0x1b09, - 0x584ca, - 0x1c7397c6, - 0x1ca5d6c4, - 0x58e46, - 0x1d40a, - 0x81b0d, - 0x1cd68009, - 0x166c3, - 0x106cca, - 0xdd091, - 0xdd4c9, - 0xdde07, - 0xdeb88, - 0xdf187, - 0xe4088, - 0x3c9cb, - 0x125b89, - 0xe4810, - 0xe4ccc, - 0xe5808, - 0xe5c85, - 0xa088, - 0x10630a, - 0x139147, - 0x129f47, - 0x2f42, - 0x1403ca, - 0x14aac8, - 0x1c5009, - 0x79d05, - 0x11034a, - 0x8f30f, - 0x12284b, - 0x1b954c, - 0x146252, - 0x7ce85, - 0xe7948, - 0x4f34a, - 0x1d2f1585, - 0x1866cc, - 0x13d203, - 0x1a1642, - 0xfafcb, - 0xfc88a, - 0x14fcc0c, - 0x138948, - 0xf9ac8, - 0x1d74ab46, - 0x688c7, - 0x129c2, - 0x5fc2, - 0x4cb90, - 0x69387, - 0x3128f, - 0x1c6b46, - 0x15b10e, - 0x9640b, - 0x18fe88, - 0x356c9, - 0x17bf92, - 0x10ac0d, - 0x10b488, - 0xd6ec9, - 0x14c80d, - 0x19a249, - 0x5c8b, - 0x6bf48, - 0x79148, - 0x7ccc8, - 0x7ffc9, - 0x801ca, - 0x872cc, - 0x3bb8a, - 0xe898a, - 0x10a487, - 0x4840d, - 0x6f6d1, - 0x1daba286, - 0x1b1c4b, - 0x1241cc, - 0x2eb08, - 0x47309, - 0x18058d, - 0x1a7cd0, - 0x17dbcd, - 0x13602, - 0x66dcd, - 0x4cc2, - 0x187c2, - 0x10a3ca, - 0x124ca, - 0xf598a, - 0x11308b, - 0x261cc, - 0x11424a, - 0x1144ce, - 0x18820d, - 0x1dddd305, - 0x12d5c8, - 0x8c42, - 0x14b7704e, - 0x15203f4e, - 0x15a0260a, - 0x1636ccce, - 0x16b21f4e, - 0x172fbe8c, - 0x1430787, - 0x1430789, - 0x14ed383, - 0x17bbeccc, - 0x18342d09, - 0x18b44d49, - 0x1934bb09, - 0x2542, - 0x176f91, - 0x3e91, - 0x254d, - 0x16cc11, - 0x121e91, - 0xfbdcf, - 0x1bec0f, - 0x142c4c, - 0x144c8c, - 0x14ba4c, - 0x16880d, - 0x6a395, - 0x7eb8c, - 0x135ccc, - 0x17ca50, - 0x1947cc, - 0x1a9b4c, - 0x1ae759, - 0x1b4c99, - 0x1b6c19, - 0x1bb6d4, - 0x1c3194, - 0x1c42d4, - 0x1c5614, - 0x5014, - 0x19a7ec49, - 0x1a1c4589, - 0x1ab35d89, - 0x14e6f5c9, - 0x2542, - 0x1566f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x15e6f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x1666f5c9, - 0x2542, - 0x16e6f5c9, - 0x2542, - 0x1766f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x17e6f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x1866f5c9, - 0x2542, - 0x18e6f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x1966f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x19e6f5c9, - 0x2542, - 0x1a66f5c9, - 0x2542, - 0x1ae6f5c9, - 0x2542, - 0x500a, - 0x2542, - 0x55e05, - 0x19c684, - 0x17704e, - 0x3f4e, - 0x7b4ce, - 0x260a, - 0x16ccce, - 0x121f4e, - 0xfbe8c, - 0x1beccc, - 0x142d09, - 0x144d49, - 0x14bb09, - 0x7ec49, - 0x1c4589, - 0x135d89, - 0x6a58d, - 0x194889, - 0x52c9, - 0x1497c4, - 0x1d7144, - 0x69104, - 0x154b84, - 0xa4084, - 0x2dd44, - 0x37dc4, - 0x4df04, - 0xfe484, - 0x15a1203, - 0xe3687, - 0x35fcc, - 0x31643, - 0x69102, - 0x188203, - 0x31643, - 0x90f43, - 0x7842, - 0x7848, - 0x125c07, - 0x7682, + 0x39c91, + 0xc5889, + 0xa0689, + 0xa12c6, + 0x5102, + 0x9c50a, + 0xb4e49, + 0xb558f, + 0xb5b8e, + 0xb7288, + 0x22a17a92, + 0x19b88, + 0x22f2fd07, + 0x1ec82, + 0x15c709, + 0x15490a, + 0x23347589, + 0x19de09, + 0x19de0c, + 0x15f4b, + 0x436ce, + 0xe6cc, + 0xf364f, + 0x1bfdce, + 0x4594c, + 0x5e789, + 0x658d1, + 0x65e88, + 0x7bd12, + 0x7cd4d, + 0x7e6cd, + 0x8564b, + 0x8b795, + 0x932c9, + 0x18500a, + 0x1b0049, + 0x1d4350, + 0x99acb, + 0x9ee0f, + 0xa3fcb, + 0xad6cc, + 0xbac90, + 0xd844a, + 0x18264d, + 0x19210e, + 0xbc48a, + 0xc090c, + 0x1997d4, + 0xc5511, + 0xca64b, + 0xccc8f, + 0xd048d, + 0xd42ce, + 0xd55cc, + 0xd5dcc, + 0xd814b, + 0x14284e, + 0x197d50, + 0x1aa38b, + 0xddacd, + 0xe730f, + 0xec90c, + 0x108b4e, + 0x10c891, + 0x18214c, + 0x11ca07, + 0x144e8d, + 0x15ffcc, + 0x1693d0, + 0x17208d, + 0x172dc7, + 0x195a10, + 0x1a5888, + 0x1abd0b, + 0xbd9cf, + 0x1bc248, + 0x68e8d, + 0x111f10, + 0x174389, + 0x237c4b88, + 0x23ac2a86, + 0xc3943, + 0x52a89, + 0x54c9, + 0xcbc45, + 0x7bc2, + 0x18fd89, + 0x62c8a, + 0x23e7c1c6, + 0x147c1cd, + 0x24363b04, + 0x1da806, + 0x2630a, + 0x2778d, + 0x246da54b, + 0x2484f809, + 0x2b203, + 0x11b88a, + 0xe9951, + 0xe9d89, + 0xeb8c7, + 0xec648, + 0xecd07, + 0x12fc08, + 0x14808b, + 0x1326c9, + 0xf2550, + 0xf2a0c, + 0x24ef31cd, + 0xf5c48, + 0xf7685, + 0x1d0608, + 0x19a8ca, + 0x16c507, + 0x1cc2, + 0x25239155, + 0x13de4a, + 0x1363c9, + 0x5688, + 0xa2549, + 0x1df185, + 0x11c70a, + 0x97c4f, + 0xa55cb, + 0x15ee8c, + 0xc8052, + 0x1b5a06, + 0x9a905, + 0x15f148, + 0xfa0cb, + 0xfa9d1, + 0x143847, + 0x5788a, + 0x25704a05, + 0x1b560c, + 0x13a843, + 0x1953c6, + 0x473c2, + 0x10ad8b, + 0x10b8ca, + 0x150bc4c, + 0xf48c8, + 0xf7c48, + 0x25a05706, + 0x1b7287, + 0x4a02, + 0x1ec2, + 0x1a6e50, + 0x67dc7, + 0x67ecf, + 0x30846, + 0x12270e, + 0x9d3cb, + 0x46c88, + 0x51f49, + 0x117052, + 0x11820d, + 0x118d88, + 0xef809, + 0x19c60d, + 0x112c9, + 0x6824b, + 0x69d88, + 0x73d08, + 0x75388, + 0x771c9, + 0x773ca, + 0x799cc, + 0x1e17ca, + 0xf14ca, + 0x1177c7, + 0xa38ca, + 0x738d, + 0x174cd1, + 0x25ed45c6, + 0x17768b, + 0xbe0c, + 0x414c8, + 0x3d609, + 0x14c6cd, + 0x57110, + 0x190c8d, + 0x6502, + 0x6540d, + 0x4a42, + 0x66342, + 0x11770a, + 0x263d034a, + 0x25c4a, + 0x26680b48, + 0x120f0a, + 0x12f4cb, + 0x3398c, + 0x1203ca, + 0x2692064f, + 0x120a0e, + 0x26de9a05, + 0x12bf48, + 0xe042, + 0x1420a83, + 0x1a38e20e, + 0x1ab2eb8e, + 0x1b202cca, + 0x1bb7c04e, + 0x1c32d84e, + 0x1cb3408c, + 0x14380c7, + 0x14380c9, + 0x1430483, + 0x1d3419cc, + 0x1db54e89, + 0x1e36d309, + 0x1eba0889, + 0x2c02, + 0x1a3511, + 0x12ead1, + 0x2c0d, + 0x17bf91, + 0x12d791, + 0x133fcf, + 0x14190f, + 0x154dcc, + 0x16d24c, + 0x1a07cc, + 0x1b764d, + 0x17d415, + 0xc510c, + 0xe140c, + 0x1439d0, + 0x14a18c, + 0x18758c, + 0x18df59, + 0x1bed19, + 0x1cabd9, + 0x1cc7d4, + 0x1d2454, + 0x1e8694, + 0x5e54, + 0xff14, + 0x1f2c51c9, + 0x1f9e8949, + 0x202e14c9, + 0x1a666089, + 0x2c02, + 0x1ae66089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1b666089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1be66089, + 0x2c02, + 0x1c666089, + 0x2c02, + 0x1ce66089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1d666089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1de66089, + 0x2c02, + 0x1e666089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1ee66089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1f666089, + 0x2c02, + 0x1fe66089, + 0x2c02, + 0x20666089, + 0x2c02, + 0x5e4a, + 0x2c02, + 0x1400401, + 0x147f05, + 0x1c0dc4, + 0x8903, + 0x8502, + 0x54642, + 0x1419303, + 0x1403603, + 0x14fea83, + 0x18e20e, + 0x12eb8e, + 0x89e8e, + 0x2cca, + 0x17c04e, + 0x12d84e, + 0x13408c, + 0x1419cc, + 0x154e89, + 0x16d309, + 0x1a0889, + 0xc51c9, + 0x1e8949, + 0xe14c9, + 0x143a8d, + 0x6109, + 0x101c9, + 0x3d1c2, + 0x1cbcc4, + 0x1cec84, + 0x1d1104, + 0x1df604, + 0xaef44, + 0xacdc4, + 0x4a9c4, + 0x35644, + 0x1a704, + 0x136fc4, + 0x7b0c9, + 0x7b0cc, + 0x158286, + 0x15828e, + 0x7ce84, + 0x155cf03, + 0x14a007, + 0x148ae0c, + 0x9983, + 0x136fc4, + 0x13242, + 0xe91c8, + 0xd6b04, + 0x1e9706, + 0xdd5c4, + 0x121646, + 0x1f8c2, + 0x7281, + 0x27c44, + 0x69306, + 0x15b83, + 0x9983, + 0x71703, + 0xc7e43, + 0x14803, + 0xf7a03, + 0xc8045, + 0x5adc2, + 0x148a42, + 0x1a1e88, + 0xee7c7, + 0x132747, + 0x3242, 0x2000c2, - 0x203102, - 0x201d02, - 0x2143c2, + 0x216542, + 0x2104c2, + 0x218242, 0x200382, 0x2003c2, - 0x205fc2, - 0x22f743, - 0x234e83, - 0x224943, - 0x214343, - 0x20ce83, - 0x23f7c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x20ce83, - 0x23f7c3, - 0xb9c3, - 0x224943, - 0x21b84, + 0x201ec2, + 0x216543, + 0x222bc3, + 0x343b43, + 0x26a7c3, + 0x2296c3, + 0x20cb83, + 0x793c8, + 0x216543, + 0x222bc3, + 0x2296c3, + 0x20cb83, + 0xb303, + 0x343b43, + 0xb1b84, 0x2000c2, - 0x24af03, - 0x2022f743, - 0x38fa87, - 0x224943, - 0x20e943, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x21d64a, - 0x22a7c5, - 0x214e03, - 0x21a602, - 0xa7c88, - 0xa7c88, - 0x3102, - 0x1379c2, - 0x20b67d8b, - 0x20e2f9c4, - 0x5d605, - 0xe745, - 0x100a86, - 0x2120e745, - 0x54f03, - 0x1668c3, + 0x253c43, + 0x29216543, + 0x3a5287, + 0x343b43, + 0x21b283, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x23098a, + 0x24d905, + 0x21f6c3, + 0x213402, + 0x793c8, + 0x296df98a, + 0xe01, + 0x793c8, + 0x16542, + 0x138402, + 0x29e4f58b, + 0x2a2093c4, + 0x163a45, + 0x1403ec5, + 0xe91c6, + 0x2a603ec5, + 0x5fa83, + 0x1b0243, 0x9c4, - 0x11c3, - 0x1273c5, - 0x129245, - 0xa7c88, - 0x1b587, - 0x2f743, - 0x21a3a407, - 0x15c6, - 0x21d6cb05, - 0x3a507, - 0xac8a, - 0xab48, - 0xcb47, - 0x6624a, - 0x18e448, - 0x64bc7, - 0x1a63cf, - 0x3f147, - 0x4dd06, - 0x13f6d0, - 0x7338f, - 0x19209, - 0x58ec4, - 0x2203a5ce, - 0x3ad49, - 0x681c6, - 0x102ec9, - 0x190b46, - 0x1a8ac6, - 0x18d40c, - 0x13a2ca, - 0x35487, - 0x12184a, - 0x176749, - 0xe938c, - 0x1b920a, - 0x8970a, - 0x127409, - 0x58e46, - 0x3554a, - 0x10bb0a, - 0x9fcca, - 0x112349, - 0xdb6c8, - 0xdb946, - 0xe0fcd, - 0xbaf85, - 0x2275308c, - 0x14bf47, - 0x1015c9, - 0xb3207, - 0x103e14, - 0x10430b, - 0x39c0a, - 0x17be0a, - 0xa5a0d, - 0x1513289, - 0x10a9cc, - 0x10b28b, - 0xfcc3, - 0xfcc3, - 0x25786, - 0xfcc3, - 0x100a88, - 0x156b03, - 0x35685, - 0x1412703, - 0x52449, - 0x14cc0c3, - 0x146dbc7, - 0x74cc7, - 0x235c7a89, - 0xcd46, - 0x174f49, - 0x4af03, - 0xa7c88, - 0x3102, - 0x4f044, - 0x7b83, - 0x7ac5, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x21c183, - 0x22f743, - 0x234e83, - 0x20d343, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x2981c3, - 0x2050c3, - 0x21c183, - 0x250784, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x209983, - 0x251c7b85, - 0x142da83, - 0x22f743, - 0x234e83, - 0x2143c3, - 0x20d343, - 0x224943, - 0x221b84, - 0x201143, - 0x225a83, - 0x211d83, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x214e03, - 0x25e1e383, - 0x146149, - 0x3102, - 0x3a8583, - 0x26a2f743, - 0x234e83, - 0x249843, - 0x224943, - 0x215cc3, - 0x225a83, - 0x23f7c3, - 0x2f16c3, - 0x39cb04, - 0xa7c88, - 0x2722f743, - 0x234e83, - 0x2ac383, - 0x224943, - 0x211d83, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x230e03, - 0xa7c88, - 0x27a2f743, - 0x234e83, - 0x20d343, - 0x204783, - 0x23f7c3, - 0xa7c88, - 0x1430787, - 0x24af03, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x129245, - 0xe747, - 0x10404b, - 0xdd8c4, - 0xbaf85, - 0x14441c8, - 0x1e00d, - 0x28e6fcc5, - 0x81b84, - 0x3102, - 0xd103, - 0x17ee85, - 0x28002, - 0x1dc2, - 0x326705, - 0xa7c88, - 0xfcc2, - 0x2a83, - 0x16264f, - 0x3102, - 0xf7806, - 0x28002, - 0x3248c8, - 0x250784, - 0x348806, - 0x34b906, - 0xa7c88, - 0x31a3c3, - 0x2c5c09, - 0x359a95, - 0x159a9f, - 0x22f743, - 0x3c2d52, - 0x172886, - 0x1825c5, - 0xc38a, - 0x29889, - 0x3c2b0f, - 0x2dbb04, - 0x36b785, - 0x304a10, - 0x245d47, - 0x204783, - 0x314d88, - 0x1324c6, - 0x29248a, - 0x203b04, - 0x2f0fc3, - 0x21a602, - 0x2eaa8b, - 0x4783, - 0x19fbc4, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x2f8f83, - 0x203102, - 0x1a95c3, - 0x6d84, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x20e943, - 0x225283, - 0x23f7c3, - 0x4af03, - 0x203102, - 0x22f743, - 0x234e83, - 0x20ce83, - 0x4783, - 0x23f7c3, + 0x12db83, + 0x10e645, + 0x146c05, + 0x793c8, + 0x22a87, + 0x16543, + 0x1b4bcd, + 0x2ae42647, + 0x1386, + 0x2b17be85, + 0x186012, + 0x1447, + 0x1e48a, + 0x17588, + 0x1e387, + 0x7368a, + 0x1bd188, + 0x110a47, + 0x165d8f, + 0x3db87, + 0x4bb86, + 0x13d150, + 0x19350f, + 0x1b009, + 0x1da884, + 0x2b40150e, + 0x5b0c9, + 0x74fc6, + 0x1113c9, + 0x190a86, + 0x6ac6, + 0xb8e4c, + 0x3ac4a, + 0x51d07, + 0x14140a, + 0x1909, + 0x25e8c, + 0x2954a, + 0x6b44a, + 0x10e689, + 0x1da806, + 0x51dca, + 0x11934a, + 0xa954a, + 0x114309, + 0xe8b88, + 0xe8e06, + 0xef08d, + 0x5b88b, + 0xcc205, + 0x2bb1e14c, + 0x13e247, + 0x10fcc9, + 0xd6187, + 0xc5c14, + 0x11230b, + 0x1dcd4a, + 0x116eca, + 0xb080d, + 0x152f6c9, + 0x117fcc, + 0x118b8b, + 0x31a03, + 0x31a03, + 0x32f46, + 0x31a03, + 0xe91c8, + 0x157243, + 0x4ebc4, + 0x5fc83, + 0x14a9607, + 0x51f05, + 0x15186c3, + 0x5c549, + 0xc8045, + 0xfa0cb, + 0x14ecb83, + 0x152e06, + 0x1523947, + 0x1d45c7, + 0x2c97ce89, + 0x1d1a86, + 0x53c43, + 0x793c8, + 0x16542, + 0x56d44, + 0x43ac3, + 0x155b45, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x203b43, + 0x216543, + 0x222bc3, + 0x2f5503, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x2a0843, + 0x201643, + 0x203b43, + 0x25dd04, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x20e603, + 0x2192c3, + 0x213402, + 0x2e17cf85, + 0x1438003, + 0x216543, + 0x222bc3, + 0x21a003, + 0x2f5503, + 0x343b43, + 0x2b1b84, + 0x34b203, + 0x233243, + 0x216443, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x21f6c3, + 0x2ee0fc03, + 0xc7f49, + 0x16542, + 0x225103, + 0x2fa16543, + 0x222bc3, + 0x252183, + 0x343b43, + 0x2207c3, + 0x233243, + 0x20cb83, + 0x2037c3, + 0x3df304, + 0x793c8, + 0x30216543, + 0x222bc3, + 0x2b7343, + 0x343b43, + 0x216443, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x238743, + 0x793c8, + 0x30a16543, + 0x222bc3, + 0x2f5503, + 0x20d903, + 0x20cb83, + 0x793c8, + 0x14380c7, + 0x253c43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x146c05, + 0xb46c7, + 0xc5e4b, + 0x31a3ca06, + 0x31efdb4b, + 0xea184, + 0xcc205, + 0x1472588, + 0x2f20d, + 0x1c4b88, + 0x136fc4, + 0x3264ccc5, + 0x27804, + 0x16542, + 0x1a143, + 0x158185, + 0x386c2, + 0x34aac5, + 0x793c8, + 0x33e98f0d, + 0x343a11ca, + 0x24642, + 0x5483, + 0x164f4f, + 0x18242, + 0x7ce84, + 0x136fc4, + 0x16542, 0x2000c2, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0xe745, - 0x250784, - 0x22f743, - 0x234e83, - 0x346484, - 0x20ce83, - 0x23f7c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x144a49, - 0x22f743, - 0x234e83, - 0x20d343, - 0x2083c3, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x342644, - 0x221b84, - 0x20ce83, - 0x23f7c3, - 0x2050c3, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x203843, - 0x45e83, - 0xe943, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x31ac4a, - 0x346cc9, - 0x35db4b, - 0x35e24a, - 0x36630a, - 0x37a0cb, - 0x39090a, - 0x395f8a, - 0x39c18a, - 0x39c40b, - 0x3bcf09, - 0x3c8bca, - 0x3c910b, - 0x3d588b, - 0x3da58a, - 0x22f743, - 0x234e83, - 0x20d343, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x1872cb, - 0x5c848, - 0x14c944, - 0x3cb06, - 0xfda89, - 0xa7c88, - 0x22f743, - 0xc384, - 0x263004, - 0x213482, - 0x209c04, - 0x327905, - 0x21c183, - 0x250784, - 0x22f743, - 0x2375c4, - 0x234e83, - 0x24f044, - 0x2dbb04, - 0x221b84, - 0x225a83, - 0x20ce83, - 0x23f7c3, - 0x266f85, - 0x209983, - 0x214e03, - 0x252c43, - 0x23bb84, - 0x376104, - 0x375205, - 0xa7c88, - 0x331c04, - 0x3a8c46, - 0x327544, - 0x203102, - 0x346647, - 0x247947, - 0x24bd44, - 0x25a1c5, - 0x3cd145, - 0x230145, - 0x221b84, - 0x38c348, - 0x22a1c6, - 0x34de48, - 0x27bc45, - 0x2e1985, - 0x265e44, - 0x23f7c3, - 0x2f2484, - 0x378f06, - 0x22a8c3, - 0x23bb84, - 0x234545, - 0x201a84, - 0x248244, - 0x21a602, - 0x337e86, - 0x3b01c6, - 0x308005, + 0x253c43, + 0x216543, + 0x343b43, + 0x2b1b84, + 0x216443, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x21f6c3, + 0x216543, + 0x222bc3, + 0x2296c3, + 0x20cb83, + 0x19045, + 0x331408, + 0x25dd04, + 0x379ac6, + 0x3a0686, + 0x793c8, + 0x2b6643, + 0x2f6689, + 0x21c495, + 0x1c49f, + 0x216543, + 0xf4d87, + 0x38db12, + 0x16a146, + 0x182c45, + 0x1dc8a, + 0x35349, + 0x38d8cf, + 0x2e8fc4, + 0x237a05, + 0x313790, + 0x2b1087, + 0x20d903, + 0x2c2308, + 0x13846, + 0x29fc4a, + 0x26fb04, + 0x304443, + 0x213402, + 0x2fe64b, + 0x222bc3, + 0x343b43, + 0xd903, + 0x15b044, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x309a43, + 0x216542, + 0x187003, + 0x149c04, + 0x2296c3, + 0x20cb83, + 0x364419c5, + 0x1de746, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x21b283, + 0x233c83, + 0x20cb83, + 0x53c43, + 0x216542, + 0x216543, + 0x222bc3, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x19f42, + 0x2000c2, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x3ec5, + 0x63a09, + 0x9983, + 0x25dd04, + 0x216543, + 0x222bc3, + 0x28d4c4, + 0x2296c3, + 0x20cb83, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x1b7409, + 0xe804, + 0x216543, + 0x3242, + 0x222bc3, + 0x2f5503, + 0x20e443, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x2a02, + 0x216543, + 0x222bc3, + 0x343b43, + 0x3636c4, + 0x2b1b84, + 0x2296c3, + 0x20cb83, + 0x201643, + 0x4702, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x284103, + 0xe103, + 0x1b283, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x38bc6, + 0x325d0a, + 0x3453c9, + 0x35fd4b, + 0x36084a, + 0x36918a, + 0x37860b, + 0x39084a, + 0x3979ca, + 0x39ecca, + 0x39ef4b, + 0x3c5589, + 0x3d368a, + 0x3d3acb, + 0x3dfecb, + 0x3e914a, + 0x4042, + 0x216543, + 0x222bc3, + 0x2f5503, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x3ecb, + 0x106a47, + 0x69a08, + 0x19c744, + 0x1db944, + 0x98e48, + 0xedac6, + 0x1481c6, + 0x13a09, + 0x793c8, + 0x216543, + 0x1dc84, + 0x26ff44, + 0x215d42, + 0x21b544, + 0x30eb85, + 0x203b43, + 0x25dd04, + 0x216543, + 0x23ec84, + 0x222bc3, + 0x256d44, + 0x2e8fc4, + 0x2b1b84, + 0x233243, + 0x2296c3, + 0x20cb83, + 0x2655c5, + 0x20e603, + 0x21f6c3, + 0x27d683, + 0x2d1984, + 0x323404, + 0x34bd45, + 0x793c8, + 0x32e744, + 0x3c2086, + 0x30e7c4, + 0x216542, + 0x2c8447, + 0x250707, + 0x254744, + 0x2ee845, + 0x372285, + 0x2b96c5, + 0x2b1b84, + 0x267408, + 0x25d206, + 0x392c88, + 0x287105, + 0x2efe85, + 0x257204, + 0x20cb83, + 0x305504, + 0x3770c6, + 0x24da03, + 0x2d1984, + 0x26fac5, + 0x38fd04, + 0x2aacc4, + 0x213402, + 0x38f846, + 0x3b8fc6, + 0x315f85, 0x2000c2, - 0x24af03, - 0x31203102, - 0x21eec4, + 0x253c43, + 0xedc46, + 0x3b616542, + 0x231d44, + 0x63dc5, 0x200382, - 0x211d83, - 0x23c9c2, - 0x20ce83, + 0x216443, + 0x2a9542, + 0x2296c3, 0x2003c2, - 0x2edc06, - 0x202443, - 0x2050c3, - 0xa7c88, - 0xa7c88, - 0x224943, - 0x71003, + 0x301a46, + 0x202b03, + 0x1da785, + 0x201643, + 0x793c8, + 0x793c8, + 0x343b43, + 0x7ca83, 0x2000c2, - 0x31e03102, - 0x224943, - 0x264983, - 0x201143, - 0x22f9c4, - 0x20ce83, - 0x23f7c3, - 0xa7c88, + 0x3c216542, + 0x343b43, + 0x274c43, + 0x34b203, + 0x2093c4, + 0x2296c3, + 0x20cb83, + 0x793c8, 0x2000c2, - 0x32603102, - 0x22f743, - 0x20ce83, - 0x4783, - 0x23f7c3, + 0x3ca16542, + 0x216543, + 0x2296c3, + 0xd903, + 0x20cb83, 0x682, - 0x205842, - 0x210782, - 0x20e943, - 0x2e9343, + 0x2091c2, + 0x22a042, + 0x21b283, + 0x2faf43, 0x2000c2, - 0x129245, - 0xa7c88, - 0xe747, - 0x203102, - 0x234e83, - 0x24f044, - 0x2020c3, - 0x224943, - 0x2083c3, - 0x211d83, - 0x20ce83, - 0x2130c3, - 0x23f7c3, - 0x22a803, - 0x11f293, - 0x125d94, - 0x129245, - 0xe747, - 0x109706, - 0x113ccb, - 0x25786, - 0x56387, - 0x5a1c6, + 0x146c05, + 0x793c8, + 0xb46c7, + 0x216542, + 0x222bc3, + 0x256d44, + 0x204f03, + 0x343b43, + 0x20e443, + 0x216443, + 0x2296c3, + 0x20b243, + 0x20cb83, + 0x23d343, + 0x1643, + 0x13ff13, + 0x142f14, + 0x146c05, + 0xb46c7, + 0x1e489, + 0x1e1e06, + 0x19108b, + 0x32f46, + 0x60ac7, + 0x145246, 0x649, - 0xd39ca, - 0x8ab4d, - 0x14f50c, - 0x10c48a, - 0xf3dc8, - 0x1339c5, - 0xacc8, - 0x1c6b46, - 0x1c0ec6, - 0xfd986, + 0x15d3ca, + 0x9560d, + 0x1b60cc, + 0x119cca, + 0x46688, + 0x10f7c5, + 0x1e4c8, + 0x30846, + 0x1d1806, + 0x13906, 0x602, - 0x269102, - 0x4284, - 0x90f46, - 0x187010, - 0x82e4e, - 0x2906, - 0x186dcc, - 0x33e5570b, - 0x129245, - 0x14420b, - 0x343c0e04, - 0x19c847, - 0x21fd1, - 0xfe30a, - 0x22f743, - 0x661c5, - 0x12a3c8, - 0x12984, - 0x586c5, - 0x3448e546, - 0xa6406, - 0xc1886, - 0x9224a, - 0x1a8383, - 0x34a436c4, - 0x52449, - 0x14dfc7, - 0x161ca, - 0x14cd7c9, + 0x213242, + 0x15cb84, + 0x1d4b06, + 0x1255d0, + 0x14dbf0e, + 0x1a1146, + 0x41dcc, + 0x3e37cd0b, + 0x146c05, + 0x152c0b, + 0x3e7d1744, + 0x1c0f87, + 0x2c191, + 0x12140a, + 0x216543, + 0x3ea8ad08, + 0x73605, + 0x89288, + 0x2a2c4, + 0x62e85, + 0x3ec0b186, + 0x1bc60b, + 0xc3d86, + 0x72206, + 0x9a6ca, + 0x16c5cc, + 0x1c2003, + 0x1db944, + 0x3f218004, + 0x5c549, + 0x192e07, + 0xac00a, + 0x14df889, 0x605, - 0xfd743, - 0x34f39847, - 0x7085, - 0x1563286, - 0xad04c, - 0xf4f88, - 0xeaccb, - 0x10f9cb, - 0x35249bcc, - 0x1405a83, - 0xbc288, - 0xeaf45, - 0xa1e09, - 0x113388, - 0x141d346, - 0x891c7, - 0x35780589, - 0xc6787, - 0x17894a, - 0x10af4d, - 0x7608, - 0x31643, - 0x1756c3, - 0x100a88, - 0xfe484, - 0x120b85, - 0xe3387, - 0x35a3c8c3, - 0x35f54206, - 0x362f2d04, - 0x366fca47, - 0x100a84, - 0x100a84, - 0x100a84, - 0x100a84, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, + 0xb6803, + 0x3f63d487, + 0x149f05, + 0x1565b86, + 0x157ac46, + 0x3fb92f4f, + 0xb800c, + 0x107588, + 0x3fc473c3, + 0x10a3c4, + 0xfe88b, + 0x1d694b, + 0x4025240c, + 0x14110c3, + 0xcddc8, + 0xfeb05, + 0xca909, + 0xeb643, + 0x12f7c8, + 0x1426246, + 0x95c87, + 0x4074c6c9, + 0x41a7a6c8, + 0x9dc07, + 0xcf9ca, + 0x41fc9408, + 0x11884d, + 0x12248, + 0x9983, + 0x146a249, + 0x14c203, + 0x32f46, + 0xe91c8, + 0x1a704, + 0x1d8645, + 0xfea83, + 0x1497d03, + 0x20a87, + 0x40a20a83, + 0x40fc2486, + 0x41240644, + 0x4170ba87, + 0xe91c4, + 0xe91c4, + 0xe91c4, + 0xe91c4, + 0x3ec5, + 0x1a18c8, + 0x148209, + 0x41, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, 0x2000c2, - 0x203102, - 0x224943, - 0x203842, - 0x20ce83, - 0x23f7c3, - 0x202443, - 0x382e0f, - 0x3831ce, - 0xa7c88, - 0x22f743, - 0x447c7, - 0x234e83, - 0x224943, - 0x214503, - 0x20ce83, - 0x23f7c3, - 0x2844, - 0x1304, - 0x131544, - 0x21c743, - 0x332907, - 0x202e82, - 0x2c9089, + 0x216542, + 0x343b43, + 0x2042c2, + 0x2296c3, + 0x20cb83, + 0x202b03, + 0x3835cf, + 0x38398e, + 0x793c8, + 0x216543, + 0x4e6c7, + 0x222bc3, + 0x343b43, + 0x243543, + 0x2296c3, + 0x20cb83, + 0x1a1084, + 0x12dcc4, + 0x9c04, + 0x224503, + 0x3a2347, + 0x202302, + 0x277c09, 0x200ac2, - 0x24ce8b, - 0x29d7ca, - 0x268f09, + 0x3a714b, + 0x2e808a, + 0x2ec409, 0x200542, - 0x3be4c6, - 0x33ad55, - 0x24cfd5, - 0x3ad113, - 0x24d553, - 0x2197c2, - 0x21dbc5, - 0x32f1cc, - 0x2779cb, - 0x298645, - 0x202602, - 0x2fae02, - 0x393ac6, - 0x203002, - 0x37de46, - 0x20c60d, - 0x206e0c, - 0x224084, + 0x22a686, + 0x256255, + 0x3a7295, + 0x259fd3, + 0x3a7813, + 0x22d0c2, + 0x22d0c5, + 0x363e0c, + 0x27ff8b, + 0x281405, + 0x202cc2, + 0x30a8c2, + 0x37ed06, + 0x203b42, + 0x2d4b06, + 0x21df0d, + 0x349c8c, + 0x3c4c44, 0x200882, - 0x206c82, - 0x3396c8, + 0x205242, + 0x27c0c8, 0x200202, - 0x305bc6, - 0x305bcf, - 0x397e50, - 0x3a3c04, - 0x33af15, - 0x3ad293, - 0x209843, - 0x34850a, - 0x206207, - 0x36a889, - 0x216087, - 0x21c342, + 0x32dd86, + 0x39a18f, + 0x32dd90, + 0x3abc44, + 0x256415, + 0x25a153, + 0x20a883, + 0x3630ca, + 0x211d47, + 0x39f1c9, + 0x3129c7, + 0x328c42, 0x200282, - 0x3b6906, - 0x204382, - 0xa7c88, - 0x208d42, - 0x209002, - 0x209007, - 0x268d07, - 0x268d11, - 0x217fc5, - 0x217fce, - 0x21a94f, - 0x21c782, - 0x398507, - 0x21cd88, - 0x205142, - 0x2bfa42, - 0x20f7c6, - 0x20f7cf, - 0x281750, - 0x22c542, - 0x207982, - 0x32b408, - 0x207983, - 0x25ed88, - 0x2e1d0d, - 0x280c03, - 0x34b748, - 0x280c0f, - 0x280fce, - 0x37baca, - 0x223111, - 0x223590, - 0x2c7bcd, - 0x2c7f0c, - 0x3a8407, - 0x348687, - 0x3488c9, - 0x21c302, - 0x201ec2, - 0x257f8c, - 0x25828b, + 0x3cb7c6, + 0x207dc2, + 0x793c8, + 0x202502, + 0x20bd42, + 0x212e47, + 0x38d507, + 0x38d511, + 0x221a05, + 0x221a0e, + 0x22204f, + 0x204242, + 0x2f1c07, + 0x224b48, + 0x2016c2, + 0x2295c2, + 0x227406, + 0x22740f, + 0x23ff50, + 0x237242, + 0x204182, + 0x336588, + 0x210903, + 0x2920c8, + 0x2cb30d, + 0x204183, + 0x3a04c8, + 0x28e48f, + 0x28e84e, + 0x316b8a, + 0x3b3ed1, + 0x3b4350, + 0x21b9cd, + 0x21bd0c, + 0x386987, + 0x363247, + 0x379b89, + 0x20cd02, + 0x202402, + 0x26274c, + 0x262a4b, 0x200d42, - 0x2c2946, - 0x227f02, + 0x2d8306, + 0x20c602, 0x200482, - 0x2291c2, - 0x203102, - 0x22fb44, - 0x23a0c7, - 0x22ca82, - 0x23ffc7, - 0x241a47, - 0x227d02, - 0x231082, - 0x244685, - 0x224502, - 0x2e738e, - 0x38564d, - 0x234e83, - 0x28814e, - 0x3d1a0d, - 0x348cc3, - 0x202102, - 0x286204, - 0x24ab42, - 0x2072c2, - 0x39ee05, - 0x3a0887, - 0x2491c2, - 0x2143c2, - 0x24ec47, - 0x2527c8, - 0x2b1d82, - 0x27cf06, - 0x257e0c, - 0x25814b, - 0x208142, - 0x25f7cf, - 0x25fb90, - 0x25ff8f, - 0x260355, - 0x260894, - 0x260d8e, - 0x26110e, - 0x26148f, - 0x26184e, - 0x261bd4, - 0x2620d3, - 0x26258d, - 0x279509, - 0x28ce83, - 0x2020c2, - 0x35ac05, - 0x3ce486, + 0x22e702, + 0x216542, + 0x3dbec4, + 0x241787, + 0x213b02, + 0x248d87, + 0x24a7c7, + 0x215a42, + 0x219d82, + 0x24e585, + 0x20c542, + 0x250e0e, + 0x39654d, + 0x222bc3, + 0x243c8e, + 0x2c764d, + 0x3c4143, + 0x2026c2, + 0x2730c4, + 0x2b3802, + 0x213642, + 0x3a6a05, + 0x3acc07, + 0x250d02, + 0x218242, + 0x256947, + 0x25c8c8, + 0x25c082, + 0x29a986, + 0x2625cc, + 0x26290b, + 0x20eb02, + 0x26c34f, + 0x26c710, + 0x26cb0f, + 0x26ced5, + 0x26d414, + 0x26d90e, + 0x26dc8e, + 0x26e00f, + 0x26e3ce, + 0x26e754, + 0x26ec53, + 0x26f10d, + 0x2817c9, + 0x2975c3, + 0x204342, + 0x322205, + 0x204f06, 0x200382, - 0x2b5787, - 0x224943, + 0x2bfd47, + 0x343b43, 0x200642, - 0x233b88, - 0x223351, - 0x223790, - 0x203702, - 0x28b387, - 0x201742, - 0x2a1687, - 0x251b42, - 0x3bde09, - 0x393a87, - 0x293348, - 0x28e386, - 0x2e9243, - 0x349345, - 0x212702, + 0x23e448, + 0x3b4111, + 0x3b4550, + 0x202102, + 0x296907, + 0x202642, + 0x25c247, + 0x207bc2, + 0x208309, + 0x37ecc7, + 0x3e5848, + 0x20afc6, + 0x208703, + 0x208705, + 0x225e82, 0x2004c2, - 0x3d7045, - 0x386b45, - 0x201b02, - 0x22cb43, - 0x344587, - 0x20ea47, - 0x201f82, - 0x201f84, - 0x20fb43, - 0x2e64c9, - 0x20fb48, - 0x20e942, - 0x205542, - 0x2dcec7, - 0x2fa285, - 0x3635c8, - 0x227807, - 0x222303, - 0x290dc6, - 0x2c7a4d, - 0x2c7dcc, - 0x2d8a06, - 0x204482, - 0x2030c2, - 0x205982, - 0x280a8f, - 0x280e8e, - 0x3cd1c7, - 0x204802, - 0x31c445, - 0x31c446, - 0x21f382, + 0x3cbbc5, + 0x36bd85, + 0x20b402, + 0x237843, + 0x352f87, + 0x3c3c47, + 0x203f02, + 0x38f0c4, + 0x271f43, + 0x33eec9, + 0x3c7348, + 0x209d42, + 0x210442, + 0x22cac7, + 0x231745, + 0x20c708, + 0x327287, + 0x20f543, + 0x3d4986, + 0x21b84d, + 0x21bbcc, + 0x223046, + 0x204202, + 0x31de42, + 0x201582, + 0x28e30f, + 0x28e70e, + 0x372307, + 0x202042, + 0x3d2185, + 0x3d2186, + 0x228882, 0x200bc2, - 0x28fc06, - 0x20a643, - 0x20a646, - 0x2cb845, - 0x2cb84d, - 0x2cc255, - 0x2ccc8c, - 0x2cd00d, - 0x2cd352, - 0x204fc2, - 0x26ff42, - 0x202142, - 0x2fbc86, - 0x3c1e06, - 0x202f42, - 0x3ce506, - 0x218782, - 0x333105, - 0x2090c2, - 0x2e74c9, - 0x21980c, - 0x219b4b, + 0x298346, + 0x210783, + 0x3c2c46, + 0x2dd585, + 0x2dd58d, + 0x2de195, + 0x2ded4c, + 0x2df0cd, + 0x2df412, + 0x203742, + 0x277782, + 0x202802, + 0x3437c6, + 0x20e586, + 0x43296084, + 0x201cc2, + 0x204f86, + 0x201102, + 0x3a2b45, + 0x205c02, + 0x250f49, + 0x22d58c, + 0x22d8cb, 0x2003c2, - 0x253188, - 0x201902, + 0x25e3c8, + 0x211c02, 0x200a82, - 0x274246, - 0x26f545, + 0x27de46, + 0x266005, 0x200a87, - 0x222d85, - 0x277485, - 0x23cb02, - 0x20ad82, - 0x204ac2, - 0x2e5647, - 0x2edccd, - 0x2ee04c, - 0x3ac4c7, - 0x27ce82, - 0x201c82, - 0x20da88, - 0x201c88, - 0x2e2ac8, - 0x2f5c44, - 0x2c35c7, - 0x25d743, - 0x21a142, - 0x203b02, - 0x2ef7c9, - 0x225b87, - 0x214e02, - 0x274645, - 0x203542, - 0x228742, - 0x30b703, - 0x30b706, - 0x2f8c82, - 0x2faa02, + 0x2fca45, + 0x2824c5, + 0x23d7c2, + 0x21e582, + 0x208402, + 0x29f107, + 0x301b0d, + 0x301e8c, + 0x25d707, + 0x29a902, + 0x219d02, + 0x3e8008, + 0x38ff08, + 0x2e5e08, + 0x3bc204, + 0x342ac7, + 0x363b83, + 0x206bc2, + 0x203482, + 0x302889, + 0x233347, + 0x2037c2, + 0x27e245, + 0x24cec2, + 0x204682, + 0x30b0c3, + 0x30b0c6, + 0x309602, + 0x30a282, 0x200402, - 0x278f46, - 0x2e2087, - 0x214c02, + 0x2abc86, + 0x273007, + 0x213582, 0x200902, - 0x25ebcf, - 0x287f8d, - 0x39bb4e, - 0x3d188c, - 0x204542, - 0x2023c2, - 0x28e1c5, - 0x319386, + 0x291f0f, + 0x243acd, + 0x39e2ce, + 0x2c74cc, + 0x20cbc2, + 0x202a82, + 0x20ae05, + 0x324106, 0x200b82, - 0x2046c2, + 0x205d42, 0x200682, - 0x227784, - 0x2e1b84, - 0x3580c6, - 0x205fc2, - 0x27c847, - 0x23df83, - 0x23df88, - 0x23e6c8, - 0x3729c7, - 0x24fb06, - 0x201702, - 0x238f43, - 0x2ab4c7, - 0x30d6c6, - 0x2e4f85, - 0x2f5fc8, - 0x2026c2, - 0x3be287, - 0x234542, - 0x354282, - 0x205c42, - 0x21aac9, - 0x201082, - 0xbe948, + 0x243e44, + 0x2c4b44, + 0x36c186, + 0x201ec2, + 0x292d47, + 0x23f643, + 0x23f648, + 0x2408c8, + 0x24ad47, + 0x251646, + 0x204ac2, + 0x2118c3, + 0x2118c7, + 0x28a6c6, + 0x2ed245, + 0x27f908, + 0x202d82, + 0x35b4c7, + 0x203782, + 0x352902, + 0x204102, + 0x2221c9, + 0x24b302, + 0x14448, + 0x201b82, + 0x25d983, + 0x32e887, + 0x200f02, + 0x22d70c, + 0x22da0b, + 0x2abf06, + 0x223e85, + 0x43609d83, + 0x22bdc2, 0x202a02, - 0x24d983, - 0x203c47, - 0x205202, - 0x21998c, - 0x219c8b, - 0x2d8a86, - 0x2fd685, - 0x244d02, - 0x201942, - 0x2bdbc6, - 0x229043, - 0x3423c7, - 0x282482, + 0x2cf7c6, + 0x209003, + 0x363447, + 0x211482, 0x2008c2, - 0x33abd5, - 0x24d195, - 0x3acfd3, - 0x24d6d3, - 0x248f47, - 0x259d91, - 0x25e050, - 0x2652d2, - 0x275191, - 0x277e08, - 0x277e10, - 0x29784f, - 0x29d593, - 0x2a6812, - 0x2a7e50, - 0x30014f, - 0x373352, - 0x3bc7d1, - 0x2b3813, - 0x2c0892, - 0x3a22cf, - 0x2cb4ce, - 0x2d47d2, - 0x2d51d1, - 0x2d94cf, - 0x2da2ce, - 0x2de751, - 0x2dfa90, - 0x2f8812, - 0x2eb451, - 0x2f5150, - 0x2f900f, - 0x2fc451, - 0x3018d0, - 0x35efc6, - 0x3cbf07, - 0x2137c7, - 0x201a42, - 0x283c05, - 0x304787, - 0x210782, - 0x20e802, - 0x22ab45, - 0x21e5c3, - 0x375b86, - 0x2ede8d, - 0x2ee1cc, - 0x2038c2, - 0x32f04b, - 0x27788a, - 0x21da8a, - 0x2bd149, - 0x2ecb4b, - 0x22794d, - 0x304e8c, - 0x27680a, - 0x272f8c, - 0x2788cb, - 0x29848c, - 0x2ef24e, - 0x2b458b, - 0x36e20c, - 0x2e1643, - 0x34c706, - 0x3c0dc2, - 0x2f6602, - 0x206603, - 0x205d42, - 0x21ed83, - 0x323386, - 0x260507, - 0x2d2b06, - 0x2e3c88, - 0x344408, - 0x315a46, - 0x200f02, - 0x3079cd, - 0x307d0c, - 0x30fb87, - 0x30c2c7, - 0x236942, - 0x215002, - 0x277dc2, - 0x27b2c2, - 0x336d56, - 0x33ead5, - 0x341c16, - 0x344f93, - 0x345652, - 0x356693, - 0x356dd2, - 0x3af0cf, - 0x3bf998, - 0x3c0897, - 0x3c13d9, - 0x3c2258, - 0x3c3698, - 0x3c47d7, - 0x3c5b17, - 0x3c70d6, - 0x3cad53, - 0x3cb695, - 0x3cc2d2, - 0x3cc753, - 0x203102, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x202443, + 0x2560d5, + 0x3a7455, + 0x259e93, + 0x3a7993, + 0x279587, + 0x294d91, + 0x2f9010, + 0x2a27d2, + 0x2a7411, + 0x2aae48, + 0x2aae50, + 0x372f4f, + 0x3a5e53, + 0x3abf92, + 0x2c2690, + 0x2bec4f, + 0x2c2bd2, + 0x2c4191, + 0x2d73d3, + 0x2dd112, + 0x2e3d4f, + 0x2e664e, + 0x2e7e92, + 0x2ec211, + 0x2ed70f, + 0x2f58ce, + 0x2f7251, + 0x2f8450, + 0x2ff012, + 0x307751, + 0x309ad0, + 0x30b50f, + 0x366211, + 0x355510, + 0x37f0c6, + 0x31e787, + 0x234ac7, + 0x201c02, + 0x28ce85, + 0x313507, + 0x22a042, + 0x203f82, + 0x3d0545, + 0x228183, + 0x35c606, + 0x301ccd, + 0x30200c, + 0x205002, + 0x363c8b, + 0x27fe4a, + 0x22cf8a, + 0x2ceb09, + 0x300a8b, + 0x3273cd, + 0x313c0c, + 0x2477ca, + 0x24ec8c, + 0x27aa4b, + 0x28124c, + 0x28418e, + 0x2a0b0b, + 0x2eafcc, + 0x2f3103, + 0x2ef706, + 0x3c9402, + 0x308542, + 0x2651c3, + 0x2017c2, + 0x23d203, + 0x351d46, + 0x26d087, + 0x2e2846, + 0x3aad48, + 0x352e08, + 0x306d06, + 0x208e42, + 0x31594d, + 0x315c8c, + 0x3d6b07, + 0x319b07, + 0x221e02, + 0x21f8c2, + 0x211842, + 0x289c82, + 0x3377d6, + 0x33c555, + 0x33f9d6, + 0x344113, + 0x3447d2, + 0x356dd3, + 0x357512, + 0x3b7ccf, + 0x3c6b58, + 0x3c8ed7, + 0x3c98d9, + 0x3cb218, + 0x3cbdd8, + 0x3cccd7, + 0x3ced97, + 0x3d1216, + 0x3d6013, + 0x3d6f55, + 0x3d77d2, + 0x3d7c53, + 0x30182, + 0x43a13a04, + 0x43fc4b88, + 0x3ec5, + 0x216542, + 0x2296c3, + 0x386c2, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x202b03, 0x2000c2, - 0x203782, - 0x386948c5, - 0x38a89f05, - 0x38e78c06, - 0xa7c88, - 0x392b3e85, - 0x203102, - 0x201d02, - 0x3972c885, - 0x39a82105, - 0x39e83387, - 0x3a284089, - 0x3a638644, + 0x2070c2, + 0x44e9bcc5, + 0x4529b285, + 0x4567ad86, + 0x793c8, + 0x45ac3205, + 0x216542, + 0x2104c2, + 0x45f336c5, + 0x4628b685, + 0x4668c587, + 0x46a93f89, + 0x46e1eb44, 0x200382, 0x200642, - 0x3aa5f145, - 0x3ae99b89, - 0x3b336408, - 0x3b6b0985, - 0x3bb0ce07, - 0x3be20688, - 0x3c2e7805, - 0x3c63c586, - 0x3ca47a89, - 0x3cedb288, - 0x3d2c3188, - 0x3d69a1ca, - 0x3dba9704, - 0x3de08705, - 0x3e2bf288, - 0x3e601885, - 0x2131c2, - 0x3ea32003, - 0x3eea5146, - 0x3f26d148, - 0x3f602e46, - 0x3fa09148, - 0x3ff26406, - 0x40241f04, - 0x40608ac2, - 0x40fdb307, - 0x412acd84, - 0x4167b947, - 0x41b2b747, + 0x4725a945, + 0x4769b3c9, + 0x47b36dc8, + 0x47ebb2c5, + 0x4834ff07, + 0x4861cf88, + 0x48b18f85, + 0x48e21486, + 0x4924b649, + 0x496f9ec8, + 0x49ad5408, + 0x49ea4e8a, + 0x4a387144, + 0x4a6b2605, + 0x4aad1108, + 0x4ae876c5, + 0x21ab82, + 0x4b2e3303, + 0x4b6aff46, + 0x4bba9148, + 0x4bf53fc6, + 0x4c273148, + 0x4c7da086, + 0x4ca4fb84, + 0x4ce04cc2, + 0x4d6e2c47, + 0x4dab7d44, + 0x4de85287, + 0x4e3e3047, 0x2003c2, - 0x41e9e485, - 0x42245a84, - 0x426d7fc7, - 0x42a31607, - 0x42e86046, - 0x43282bc5, - 0x43699c87, - 0x43adb108, - 0x43f2bac7, - 0x442b3489, - 0x446d4505, - 0x44b08a87, - 0x44e93f06, - 0x81b8b, - 0x45209d88, - 0x22034d, - 0x28bf09, - 0x2a8e4b, - 0x2ac48b, - 0x30f00b, - 0x30cb0b, - 0x31958b, - 0x31984b, - 0x319d89, - 0x31aecb, - 0x31b18b, - 0x31b70b, - 0x31ce0a, - 0x31d34a, - 0x31d94c, - 0x322b0b, - 0x3235ca, - 0x34340a, - 0x34cc8e, - 0x34d88e, - 0x34dc0a, - 0x34ffca, - 0x3509cb, - 0x350c8b, - 0x35190b, - 0x36ed0b, - 0x36f30a, - 0x36ffcb, - 0x37028a, - 0x37050a, - 0x37078a, - 0x3919cb, - 0x396f4b, - 0x39984e, - 0x399bcb, - 0x3a0a4b, - 0x3a19cb, - 0x3a540a, - 0x3a5689, - 0x3a58ca, - 0x3a75ca, - 0x3bf38b, - 0x3c93cb, - 0x3c9c8a, - 0x3ca78b, - 0x3d2f4b, - 0x3d9fcb, - 0x456849c8, - 0x45a8a2c9, - 0x45ea1c89, - 0x462e2608, - 0x357e45, - 0x209ec3, - 0x23d284, - 0x2c86c5, - 0x238386, - 0x23c305, - 0x289984, - 0x2b5688, - 0x312ec5, - 0x296184, - 0x3dc887, - 0x2a04ca, - 0x384bca, - 0x3cd2c7, - 0x218747, - 0x2decc7, - 0x27e007, - 0x35cf45, - 0x3cf6c6, - 0x33a747, - 0x32a7c4, - 0x2b6486, - 0x2ed886, - 0x3ce8c5, - 0x329d04, - 0x29b206, - 0x29f587, - 0x26c806, - 0x3daf07, - 0x27f503, - 0x3d3206, - 0x233105, - 0x283487, - 0x269c8a, - 0x233c84, - 0x218f88, - 0x346a89, - 0x2d2347, - 0x397806, - 0x36b848, - 0x203589, - 0x36aa44, - 0x35af84, - 0x2d5fc5, - 0x22af48, - 0x2c9ac7, - 0x2f7149, - 0x224d08, - 0x30e406, - 0x23d386, - 0x29bb48, - 0x373ac6, - 0x289f05, - 0x286106, - 0x27c1c8, - 0x280986, - 0x2405cb, - 0x366786, - 0x29d10d, - 0x3dc385, - 0x2acc46, - 0x202c45, - 0x367649, - 0x24c047, - 0x39cf08, - 0x292fc6, - 0x29c3c9, - 0x3bd346, - 0x269c05, - 0x2a2fc6, - 0x2bd946, - 0x2ce4c9, - 0x2bb546, - 0x2a01c7, - 0x2a3645, - 0x21a1c3, - 0x21a1c5, - 0x2ad647, - 0x32f846, - 0x3dc289, - 0x278c06, - 0x274886, - 0x3cf389, - 0x285b09, - 0x2a3bc7, - 0x3286c8, - 0x2a6249, - 0x283888, - 0x36eb86, - 0x2db485, - 0x31608a, - 0x274906, - 0x2096c6, - 0x2d2e45, - 0x253e48, - 0x2aa007, - 0x23190a, - 0x24f846, - 0x2f6245, - 0x2facc6, - 0x228987, - 0x3976c7, - 0x21b8c5, - 0x269dc5, - 0x2815c6, - 0x28e686, - 0x2a9cc6, - 0x2bf744, - 0x285089, - 0x28b146, - 0x2cf20a, - 0x21c588, - 0x308788, - 0x384bca, - 0x21b105, - 0x29f4c5, - 0x23b4c8, - 0x2bfc88, - 0x237187, - 0x2b7bc6, - 0x33cd48, - 0x20fec7, - 0x282d08, - 0x2b9e46, - 0x286e88, - 0x2991c6, - 0x27bdc7, - 0x2af486, - 0x29b206, - 0x26e40a, - 0x2d8b86, - 0x2db489, - 0x369786, - 0x2684ca, - 0x241f09, - 0x2ee686, - 0x2bbd04, - 0x35accd, - 0x28a547, - 0x32c386, - 0x2c3045, - 0x3bd3c5, - 0x393146, - 0x2d7e09, - 0x2ba7c7, - 0x27d386, - 0x2d0d06, - 0x289a09, - 0x289e44, - 0x242a84, - 0x327f08, - 0x265d46, - 0x2a30c8, - 0x2f7f88, - 0x32e307, - 0x3bb0c9, - 0x3b8c47, - 0x2b3d4a, - 0x2f028f, - 0x281e8a, - 0x28dfc5, - 0x27c405, - 0x2140c5, - 0x3ba6c7, - 0x228543, - 0x3288c8, - 0x25ce46, - 0x25cf49, - 0x2dbdc6, - 0x2ce307, - 0x29c189, - 0x39ce08, - 0x2d2f07, - 0x316fc3, - 0x357ec5, - 0x2284c5, - 0x2bf58b, - 0x201944, - 0x302084, - 0x27a646, - 0x317187, - 0x39e38a, - 0x232087, - 0x3a8647, - 0x282105, - 0x3c2845, - 0x2725c9, - 0x29b206, - 0x231f0d, - 0x363505, - 0x2b6e03, - 0x204943, - 0x21ef45, - 0x35cbc5, - 0x36b848, - 0x27dcc7, - 0x242806, - 0x2a1906, - 0x22b6c5, - 0x235147, - 0x32de07, - 0x22a087, - 0x20878a, - 0x3d32c8, - 0x2bf744, - 0x280707, - 0x280447, - 0x350f06, - 0x298847, - 0x2d1348, - 0x2d3b88, - 0x24bf46, - 0x218988, - 0x2bb5c4, - 0x33a746, - 0x253a86, - 0x39d606, - 0x330946, - 0x21af84, - 0x27e0c6, - 0x2c1a86, - 0x29b5c6, - 0x231f06, - 0x204806, - 0x2457c6, - 0x242708, - 0x2b6308, - 0x2d72c8, - 0x23c508, - 0x23b446, - 0x20b3c5, - 0x21a186, - 0x2b0a05, - 0x395647, - 0x224dc5, - 0x20d443, - 0x3ceac5, - 0x22e384, - 0x204945, - 0x201903, - 0x3a3787, - 0x3436c8, - 0x3dafc6, - 0x2b4ecd, - 0x27c3c6, - 0x29ab85, - 0x21aac3, - 0x2bec49, - 0x289fc6, - 0x2969c6, - 0x282604, - 0x281e07, - 0x338446, - 0x2baa85, - 0x23c043, - 0x205b44, - 0x280606, - 0x3cf7c4, - 0x253b88, - 0x3d4a09, - 0x302a89, - 0x2a2eca, - 0x29370d, - 0x234007, - 0x3a8986, - 0x20adc4, - 0x284089, - 0x288c08, - 0x28a146, - 0x236d86, - 0x298847, - 0x2c1606, - 0x22d906, - 0x32ca06, - 0x32b7ca, - 0x220688, - 0x26ed05, - 0x36c209, - 0x2ca24a, - 0x2ffbc8, - 0x29ecc8, - 0x296948, - 0x2ad80c, - 0x351e45, - 0x2a1b88, - 0x2b7946, - 0x310e06, - 0x3a1c47, - 0x231f85, - 0x286285, - 0x302949, - 0x20d207, - 0x25cf05, - 0x238cc7, - 0x204943, - 0x2ca705, - 0x21a748, - 0x284e07, - 0x29eb89, - 0x2e2e05, - 0x3a6744, - 0x2a4448, - 0x3db447, - 0x2d30c8, - 0x3dd108, - 0x2adbc5, - 0x3baa86, - 0x24c3c6, - 0x2d6389, - 0x31c0c7, - 0x2b0e46, - 0x21ea07, - 0x202103, - 0x238644, - 0x2cf8c5, - 0x235284, - 0x2515c4, - 0x38c647, - 0x2675c7, - 0x27d544, - 0x29e9d0, - 0x36c407, - 0x3c2845, - 0x3303cc, - 0x206784, - 0x37f5c8, - 0x27bcc9, - 0x388d86, - 0x3134c8, - 0x23d044, - 0x27a948, - 0x3dbb06, - 0x26e288, - 0x29fb46, - 0x28ae8b, - 0x325045, - 0x2cf748, - 0x20f1c4, - 0x3d4e4a, - 0x29eb89, - 0x2af386, - 0x30e988, - 0x286685, - 0x2be1c4, - 0x37f4c6, - 0x229f48, - 0x2849c8, - 0x33d5c6, - 0x321104, - 0x316006, - 0x3b8cc7, - 0x27b847, - 0x29884f, - 0x329587, - 0x2ee747, - 0x31c305, - 0x377fc5, - 0x2a3889, - 0x2e6c46, - 0x38c885, - 0x285e07, - 0x3a1ec8, - 0x3cf845, - 0x2af486, - 0x21c3c8, - 0x202e4a, - 0x229c48, - 0x28f987, - 0x2f06c6, - 0x36c1c6, - 0x2003c3, - 0x2060c3, - 0x2ca409, - 0x2a60c9, - 0x2b3386, - 0x2e2e05, - 0x218c08, - 0x30e988, - 0x373c48, - 0x32ca8b, - 0x2b5107, - 0x314bc9, - 0x298ac8, - 0x35bb44, - 0x39d248, - 0x291489, - 0x2b1145, - 0x3ba5c7, - 0x2386c5, - 0x2848c8, - 0x29474b, - 0x2999d0, - 0x2ac885, - 0x20f10c, - 0x2429c5, - 0x282183, - 0x2ef046, - 0x2c0d04, - 0x2af746, - 0x29f587, - 0x21c444, - 0x243108, - 0x32878d, - 0x30e845, - 0x234044, - 0x294e44, - 0x294e49, - 0x2c4008, - 0x325507, - 0x3dbb88, - 0x285148, - 0x27d685, - 0x211907, - 0x27d607, - 0x2c59c7, - 0x269dc9, - 0x32d909, - 0x20bdc6, - 0x2c8106, - 0x285ec6, - 0x34d0c5, - 0x3adbc4, - 0x3bff46, - 0x3c19c6, - 0x27d6c8, - 0x22864b, - 0x2658c7, - 0x20adc4, - 0x338386, - 0x2d1687, - 0x2453c5, - 0x333385, - 0x227044, - 0x32d886, - 0x3bffc8, - 0x284089, - 0x247086, - 0x288a08, - 0x2bab46, - 0x35c1c8, - 0x2b8c0c, - 0x27d546, - 0x29a84d, - 0x29accb, - 0x2a0285, - 0x32df47, - 0x2bb646, - 0x397588, - 0x20be49, - 0x3b2508, - 0x3c2845, - 0x32a507, - 0x283988, - 0x232b49, - 0x3380c6, - 0x27f74a, - 0x397308, - 0x3b234b, - 0x22090c, - 0x27aa48, - 0x27fdc6, - 0x211308, - 0x202ac7, - 0x2092c9, - 0x30cf4d, - 0x29b106, - 0x239808, - 0x2b61c9, - 0x2bf848, - 0x286f88, - 0x2c24cc, - 0x2c3787, - 0x2c44c7, - 0x269c05, - 0x2b91c7, - 0x3a1d88, - 0x37f546, - 0x246f0c, - 0x2f4408, - 0x2d0648, - 0x232e46, - 0x228247, - 0x20bfc4, - 0x23c508, - 0x315b4c, - 0x28844c, - 0x28e045, - 0x3ce947, - 0x321086, - 0x2281c6, - 0x367808, - 0x21d004, - 0x26c80b, - 0x27c98b, - 0x2f06c6, - 0x328607, - 0x331e05, - 0x273d05, - 0x26c946, - 0x286645, - 0x201905, - 0x2ccac7, - 0x3c6349, - 0x28e844, - 0x25b245, - 0x30b645, - 0x3bae48, - 0x28d605, - 0x2a0ec9, - 0x2e8247, - 0x2e824b, - 0x2ee3c6, - 0x242449, - 0x329c48, - 0x2919c5, - 0x2c5ac8, - 0x32d948, - 0x264587, - 0x3db907, - 0x38c6c9, - 0x26e1c7, - 0x29cec9, - 0x308fcc, - 0x2b3388, - 0x2bb089, - 0x2bc447, - 0x285209, - 0x23bec7, - 0x220a08, - 0x202a05, - 0x33a6c6, - 0x2c3088, - 0x2f07c8, - 0x2ca109, - 0x201947, - 0x274705, - 0x248809, - 0x2d66c6, - 0x293f04, - 0x35f406, - 0x26cfc8, - 0x2fa847, - 0x228848, - 0x218a49, - 0x32b087, - 0x2a0686, - 0x32e004, - 0x3ceb49, - 0x211788, - 0x232d07, - 0x22e7c6, - 0x228586, - 0x209644, - 0x36d946, - 0x2048c3, - 0x324bc9, - 0x325006, - 0x2acec5, - 0x2a1906, - 0x2ce885, - 0x283e08, - 0x369b87, - 0x2feac6, - 0x32c8c6, - 0x308788, - 0x2a3a07, - 0x29b145, - 0x29e7c8, - 0x3c97c8, - 0x397308, - 0x242885, - 0x33a746, - 0x302849, - 0x2d6204, - 0x2ce70b, - 0x22d60b, - 0x26ec09, - 0x204943, - 0x258c45, - 0x23d606, - 0x242dc8, - 0x2aae04, - 0x3dafc6, - 0x2088c9, - 0x2d0445, - 0x2cca06, - 0x3db446, - 0x214184, - 0x29ee4a, - 0x2ace08, - 0x2f07c6, - 0x245205, - 0x328487, - 0x35ce07, - 0x3baa84, - 0x22d847, - 0x224d84, - 0x224d86, - 0x210143, - 0x269dc5, - 0x2b1b05, - 0x369dc8, - 0x2808c5, - 0x27d289, - 0x23c347, - 0x23c34b, - 0x2a4f4c, - 0x2a554a, - 0x30ce07, - 0x202e03, - 0x38cd48, - 0x242a45, - 0x3cf8c5, - 0x357f84, - 0x220906, - 0x27bcc6, - 0x36d987, - 0x247d8b, - 0x21af84, - 0x2fd104, - 0x2b52c4, - 0x2ce186, - 0x21c444, - 0x22b048, - 0x357d85, - 0x21b745, - 0x373b87, - 0x32e049, - 0x35cbc5, - 0x39314a, - 0x2a3549, - 0x2afb0a, - 0x32b909, - 0x350204, - 0x2d0dc5, - 0x2c1708, - 0x2d808b, - 0x2d5fc5, - 0x2f8106, - 0x241b04, - 0x27d7c6, - 0x32af09, - 0x2d1787, - 0x278dc8, - 0x293a86, - 0x3b8c47, - 0x2849c8, - 0x3936c6, - 0x3c1c04, - 0x383507, - 0x371cc5, - 0x385207, - 0x23c584, - 0x2bb5c6, - 0x2ff8c8, - 0x29ae88, - 0x2f1d87, - 0x320dc8, - 0x299285, - 0x204784, - 0x384ac8, - 0x31c544, - 0x214045, - 0x2ffac4, - 0x20ffc7, - 0x28b207, - 0x285348, - 0x2d3246, - 0x280845, - 0x27d088, - 0x2516c8, - 0x2a2e09, - 0x22d906, - 0x231988, - 0x3d4cca, - 0x245448, - 0x2e7805, - 0x21a386, - 0x2a3408, - 0x32a5ca, - 0x2aaa07, - 0x289045, - 0x294108, - 0x3d2484, - 0x253ec6, - 0x2c4848, - 0x204806, - 0x3ca308, - 0x358587, - 0x3dc786, - 0x2bbd04, - 0x26c187, - 0x2b6784, - 0x32aec7, - 0x2af0cd, - 0x237205, - 0x2d7c0b, - 0x2886c6, - 0x253288, - 0x2430c4, - 0x23b646, - 0x280606, - 0x211647, - 0x29a50d, - 0x2f6a87, - 0x2b6d48, - 0x284245, - 0x37b488, - 0x2c9a46, - 0x299308, - 0x360146, - 0x330147, - 0x2856c9, - 0x35fac7, - 0x28a408, - 0x276cc5, - 0x22b748, - 0x228105, - 0x225d05, - 0x34b085, - 0x24f543, - 0x286184, - 0x245505, - 0x247a89, - 0x36d746, - 0x2d1448, - 0x3db6c5, - 0x2b9087, - 0x31098a, - 0x2cc949, - 0x2bd84a, - 0x2d7348, - 0x238b0c, - 0x285e8d, - 0x3cc203, - 0x3ca208, - 0x205b05, - 0x202c06, - 0x39cc86, - 0x35a985, - 0x21eb09, - 0x36b3c5, - 0x27d088, - 0x2574c6, - 0x35e9c6, - 0x2a4309, - 0x3ab3c7, - 0x294a06, - 0x310908, - 0x39d508, - 0x2e2807, - 0x2c1c0e, - 0x2c9c85, - 0x232a45, - 0x204708, - 0x2e42c7, - 0x200e42, - 0x2c2044, - 0x2af64a, - 0x232dc8, - 0x32da86, - 0x29c2c8, - 0x24c3c6, - 0x32f488, - 0x2b0e48, - 0x225cc4, - 0x2b9445, - 0x727544, - 0x727544, - 0x727544, - 0x208343, - 0x228406, - 0x27d546, - 0x29ff4c, - 0x204743, - 0x23cf46, - 0x21c4c4, - 0x289f48, - 0x208705, - 0x2af746, - 0x2bf388, - 0x2d9206, - 0x2fea46, - 0x3ae0c8, - 0x2cf947, - 0x26df89, - 0x31a70a, - 0x208744, - 0x224dc5, - 0x23d345, - 0x358206, - 0x234046, - 0x2a0a86, - 0x3cce06, - 0x26e0c4, - 0x26e0cb, - 0x224b84, - 0x2425c5, - 0x2affc5, - 0x32e3c6, - 0x204c88, - 0x285d47, - 0x324f84, - 0x25c6c3, - 0x3d1f85, - 0x35f2c7, - 0x285c4b, - 0x369cc7, - 0x2bf288, - 0x2b9587, - 0x26b786, - 0x28c1c8, - 0x272b0b, - 0x2c8606, - 0x20df49, - 0x272c85, - 0x316fc3, - 0x2cca06, - 0x358488, - 0x213603, - 0x28c7c3, - 0x209e86, - 0x24c3c6, - 0x379a8a, - 0x27fe05, - 0x28044b, - 0x2a184b, - 0x246183, - 0x20a043, - 0x2b3cc4, - 0x24c187, - 0x27aa44, - 0x289f44, - 0x2b77c4, - 0x245748, + 0x4e6a8485, + 0x4ea7fa84, + 0x4efafd07, + 0x4f23cc07, + 0x4f690046, + 0x4fa8c145, + 0x4fea2f07, + 0x502cdf88, + 0x507e33c7, + 0x50abb909, + 0x50ee3405, + 0x5131f287, + 0x5169b0c6, + 0x2780b, + 0x51a2e2c8, + 0x230c4d, + 0x271d09, + 0x27f48b, + 0x29868b, + 0x2b744b, + 0x2d24cb, + 0x32430b, + 0x3245cb, + 0x324a89, + 0x325f8b, + 0x32624b, + 0x3283cb, + 0x328fca, + 0x32950a, + 0x329b0c, + 0x32fecb, + 0x33040a, + 0x34218a, + 0x34c2ce, + 0x34d44e, + 0x34d7ca, + 0x34f78a, + 0x35044b, + 0x35070b, + 0x35120b, + 0x36e7cb, + 0x36edca, + 0x36fa8b, + 0x36fd4a, + 0x36ffca, + 0x37024a, + 0x391a8b, + 0x39944b, + 0x39bc0e, + 0x39bf8b, + 0x3a7e4b, + 0x3a9ecb, + 0x3ada8a, + 0x3add09, + 0x3adf4a, + 0x3afa0a, + 0x3c654b, + 0x3d3d8b, + 0x3d4f4a, + 0x3d5a4b, + 0x3dbc4b, + 0x3e8b8b, + 0x51e8d908, + 0x522946c9, + 0x526ab689, + 0x52af0788, + 0x359645, + 0x20dec3, + 0x25cd84, + 0x2cbb05, + 0x21e886, + 0x221205, + 0x293a44, + 0x2bfc48, + 0x31fc85, + 0x29d144, + 0x20d007, + 0x2aa84a, + 0x24104a, + 0x372407, + 0x3a9307, + 0x2ec787, + 0x291247, + 0x313305, + 0x219686, + 0x372c47, + 0x35a804, + 0x2c9046, + 0x3dc846, + 0x203345, + 0x333144, + 0x2a80c6, + 0x2a9a07, + 0x22fa86, + 0x2b6407, + 0x23e343, + 0x39f546, + 0x3367c5, + 0x28c687, + 0x27588a, + 0x23e544, + 0x21ad88, + 0x2ba709, + 0x2c9607, + 0x3c6006, + 0x267608, + 0x37ae89, + 0x39f384, + 0x322584, + 0x30c2c5, + 0x21b448, + 0x2dbb47, + 0x30a449, + 0x3d8f48, + 0x31b5c6, + 0x361b46, + 0x2a5ac8, + 0x36d846, + 0x29b285, + 0x290106, + 0x285988, + 0x28e206, + 0x261acb, + 0x38a106, + 0x2a6f8d, + 0x20d485, + 0x2b7c06, + 0x21d045, + 0x3c8609, + 0x2e4747, + 0x3d2008, + 0x3c4f86, + 0x2a6209, + 0x2c48c6, + 0x275805, + 0x216b86, + 0x2d7cc6, + 0x2e02c9, + 0x2cc886, + 0x31d5c7, + 0x2dec05, + 0x20c043, + 0x261c45, + 0x2bc687, + 0x3640c6, + 0x20d389, + 0x27ad86, + 0x285486, + 0x226a89, + 0x28fb09, + 0x2aea87, + 0x201dc8, + 0x29f949, + 0x28cb08, + 0x3e5e06, + 0x2e8945, + 0x2834ca, + 0x285506, + 0x3cfc86, + 0x2e2b85, + 0x25ec08, + 0x358d07, + 0x239a8a, + 0x257686, + 0x303885, + 0x30aa86, + 0x2048c7, + 0x3c5ec7, + 0x2ac545, + 0x2759c5, + 0x23fdc6, + 0x36a446, + 0x269f46, + 0x2d15c4, + 0x28ebc9, + 0x2966c6, + 0x3097ca, + 0x232148, + 0x31ef88, + 0x24104a, + 0x2421c5, + 0x2a9945, + 0x3def48, + 0x2ce108, + 0x23ae87, + 0x288686, + 0x33a388, + 0x20b607, + 0x28d208, + 0x2ca506, + 0x290f08, + 0x2a1dc6, + 0x287287, + 0x29ea46, + 0x2a80c6, + 0x2313ca, + 0x3dbf46, + 0x2e8949, + 0x2abb86, + 0x212f8a, + 0x24fb89, + 0x3024c6, + 0x2cd844, + 0x3222cd, + 0x28b4c7, + 0x39fe06, + 0x2d52c5, + 0x2c4945, + 0x394246, + 0x2ae109, + 0x369787, + 0x286386, + 0x393386, + 0x293ac9, + 0x2e37c4, + 0x3025c4, + 0x30f188, + 0x2fbec6, + 0x2adc88, + 0x216b08, + 0x260507, + 0x30e2c9, + 0x347a47, + 0x2c30ca, + 0x30334f, + 0x2396ca, + 0x20ac05, + 0x285bc5, + 0x216945, + 0x3cd547, + 0x204483, + 0x201fc8, + 0x2f6086, + 0x2f6189, + 0x2f5f86, + 0x2e0c87, + 0x2a5fc9, + 0x3d1f08, + 0x3c87c7, + 0x322d43, + 0x3596c5, + 0x204405, + 0x2d140b, + 0x287784, + 0x300084, + 0x282c86, + 0x322f07, + 0x3947ca, + 0x3b0887, + 0x29bf07, + 0x28b685, + 0x3de685, + 0x2934c9, + 0x2a80c6, + 0x3b070d, + 0x354745, + 0x2c7183, + 0x20dac3, + 0x258b05, + 0x33ac85, + 0x267608, + 0x286cc7, + 0x245246, + 0x2ab306, + 0x235745, + 0x23c847, + 0x3e4107, + 0x25d0c7, + 0x2b268a, + 0x39f608, + 0x2d15c4, + 0x28df87, + 0x28a847, + 0x35df46, + 0x2a1447, + 0x2ea808, + 0x35d588, + 0x27a306, + 0x3a9548, + 0x2cc904, + 0x372c46, + 0x266286, + 0x246046, + 0x2025c6, + 0x214ac4, + 0x291306, + 0x2d3e46, + 0x2a5386, + 0x224006, + 0x20d986, + 0x2ea646, 0x245148, - 0x206049, - 0x2d4588, - 0x2686c7, - 0x231f06, - 0x2d108f, - 0x2c9dc6, - 0x2d6b04, - 0x244f8a, - 0x35f1c7, - 0x2b6886, - 0x293f49, - 0x205fc5, - 0x369f05, - 0x206106, - 0x22b883, - 0x3d24c9, - 0x220806, - 0x218809, - 0x39e386, - 0x269dc5, - 0x28e445, - 0x20a703, - 0x24c2c8, - 0x3256c7, - 0x25ce44, - 0x289dc8, - 0x310b84, - 0x300f46, - 0x2ef046, - 0x23ebc6, - 0x2cf609, - 0x3cf845, - 0x29b206, - 0x2a1509, - 0x2c8886, - 0x2457c6, - 0x3a3b86, - 0x203685, - 0x2ffac6, - 0x330144, - 0x202a05, - 0x2c3084, - 0x2b76c6, - 0x3634c4, - 0x201a43, - 0x288cc5, - 0x235e48, - 0x22cdc7, - 0x2aae89, - 0x288f48, - 0x29b911, - 0x3db4ca, - 0x2f0607, - 0x2d3ec6, - 0x21c4c4, - 0x2c3188, - 0x3cf988, - 0x29baca, - 0x2a0c8d, - 0x2a2fc6, - 0x3ae1c6, - 0x26c246, - 0x21b747, - 0x2b6e05, - 0x3be587, - 0x289e85, - 0x2e8384, - 0x2adec6, - 0x33a587, - 0x3d21cd, - 0x2a3347, - 0x2b5588, - 0x27d389, - 0x21a286, - 0x338045, - 0x230344, - 0x26d0c6, - 0x3ba986, - 0x232f46, - 0x29cb48, - 0x219783, - 0x209e43, - 0x320405, - 0x35b006, - 0x2b0e05, - 0x293c88, - 0x29f74a, - 0x3bab84, - 0x289f48, - 0x296948, - 0x32e207, - 0x3db789, - 0x2bef88, - 0x284107, - 0x2b7a46, - 0x20480a, - 0x26d148, - 0x390e89, - 0x2c40c8, - 0x226c49, - 0x2d3d87, - 0x2f3bc5, - 0x32cc86, - 0x37f3c8, - 0x253408, - 0x339cc8, - 0x214188, - 0x2425c5, + 0x2c6648, + 0x2e5688, + 0x221408, + 0x3deec6, + 0x20f1c5, + 0x27b9c6, + 0x2bb345, + 0x397087, + 0x246005, + 0x217943, + 0x26a545, + 0x23b844, + 0x20dac5, + 0x223a03, + 0x2c4707, + 0x3aa1c8, + 0x2b64c6, + 0x2d630d, + 0x285b86, + 0x2a4905, + 0x2221c3, + 0x2d0ac9, + 0x2e3946, + 0x2a34c6, + 0x29c484, + 0x239647, + 0x2f43c6, + 0x303ac5, + 0x244243, + 0x211184, + 0x28aa06, + 0x219784, + 0x3c11c8, + 0x2064c9, + 0x369d09, + 0x2ada8a, + 0x2495cd, + 0x23e8c7, + 0x206986, + 0x21e5c4, + 0x293f89, + 0x2924c8, + 0x294546, + 0x242b06, + 0x2a1447, + 0x2c3b06, + 0x223686, + 0x3d0c06, + 0x3e30ca, + 0x21cf88, + 0x234885, + 0x245749, + 0x270b0a, + 0x33b008, + 0x2a8cc8, + 0x2a3448, + 0x3e450c, + 0x3996c5, + 0x2ab588, + 0x2ca006, + 0x29dac6, + 0x2dab47, + 0x3b0785, + 0x290285, + 0x369bc9, + 0x210b07, + 0x2f6145, + 0x2286c7, + 0x20dac3, + 0x2dc505, + 0x229108, + 0x2cc507, + 0x2a8b89, + 0x2e1dc5, + 0x30a804, + 0x31dc08, + 0x2cb5c7, + 0x3c8988, + 0x22aa48, + 0x392005, + 0x353b46, + 0x2ab406, + 0x30c689, + 0x266387, + 0x2bbb86, + 0x2585c7, + 0x215103, + 0x21eb44, + 0x2e6fc5, + 0x23c984, + 0x2526c4, + 0x28db87, + 0x2743c7, + 0x286544, + 0x2a89d0, + 0x333847, + 0x3de685, + 0x25084c, + 0x22a804, + 0x2c1108, + 0x287189, + 0x2be9c6, + 0x32f908, + 0x27a484, + 0x282f88, + 0x23a086, + 0x231248, + 0x2a93c6, + 0x2d2d4b, + 0x331b85, + 0x2e6e48, + 0x21a484, + 0x28f78a, + 0x2a8b89, + 0x29e946, + 0x21b6c8, + 0x2657c5, + 0x2d00c4, + 0x2c1006, + 0x25cf88, + 0x28d908, + 0x3356c6, + 0x36c104, + 0x283446, + 0x347ac7, + 0x285187, + 0x2a144f, + 0x346f47, + 0x395747, + 0x368945, + 0x3410c5, + 0x2ae749, + 0x2f8c06, + 0x28c7c5, + 0x28fe07, + 0x2de9c8, + 0x219805, + 0x29ea46, + 0x231f88, + 0x353fca, + 0x32c888, + 0x2980c7, + 0x303786, + 0x245706, + 0x2003c3, + 0x211c03, + 0x270cc9, + 0x29f7c9, + 0x2bb806, + 0x2e1dc5, + 0x3a97c8, + 0x21b6c8, + 0x2a7d08, + 0x3d0c8b, + 0x2d6547, + 0x31d409, + 0x2a16c8, + 0x329f44, + 0x3e3a48, + 0x299dc9, + 0x2bbe85, + 0x3cd447, + 0x21ebc5, + 0x28d808, + 0x29bb4b, + 0x2a2c50, + 0x2b7845, + 0x21a3cc, + 0x245405, + 0x28b703, + 0x2b49c6, + 0x2d3004, + 0x27fb86, + 0x2a9a07, + 0x221404, + 0x24cf48, + 0x201e8d, + 0x342545, + 0x23e904, + 0x2b60c4, + 0x395489, + 0x2afa88, + 0x332047, + 0x23a108, + 0x28ec88, + 0x286685, + 0x3cd987, + 0x286607, + 0x2f6447, + 0x2759c9, + 0x3c3009, + 0x375346, + 0x21bf06, + 0x28fec6, + 0x31a6c5, + 0x3c7104, + 0x3cf306, + 0x3d9dc6, + 0x2866c8, + 0x20458b, + 0x2fba47, + 0x21e5c4, + 0x2f4306, + 0x2eab47, + 0x38c785, + 0x3a1b45, + 0x266844, + 0x3c2f86, + 0x3cf388, + 0x293f89, + 0x254986, + 0x2922c8, + 0x303b86, + 0x360fc8, + 0x3603cc, + 0x286546, + 0x2a45cd, + 0x2a4a4b, + 0x31d685, + 0x3e4247, + 0x2cc986, + 0x3c5d88, + 0x3753c9, + 0x21d3c8, + 0x3de685, + 0x2893c7, + 0x28cc08, + 0x3c3709, + 0x2f4046, + 0x26af8a, + 0x3c5b08, + 0x21d20b, + 0x2d668c, + 0x283088, + 0x28a286, + 0x22de48, + 0x353c47, + 0x224e49, + 0x29b2cd, + 0x2a7fc6, + 0x3dc948, + 0x2c6509, + 0x2d16c8, + 0x291008, + 0x2d4c8c, + 0x2d5947, + 0x2d7887, + 0x275805, + 0x2c9987, + 0x2de888, + 0x2c1086, + 0x25480c, + 0x306808, + 0x2e1708, + 0x3cf646, + 0x327e47, + 0x375544, + 0x221408, + 0x29594c, + 0x243f8c, + 0x20ac85, + 0x2033c7, + 0x36c086, + 0x327dc6, + 0x39d8c8, + 0x224dc4, + 0x22fa8b, + 0x292e8b, + 0x303786, + 0x201d07, + 0x208805, + 0x27d905, + 0x22fbc6, + 0x265785, + 0x287745, + 0x2e0107, + 0x223a09, + 0x36a604, + 0x247245, + 0x30b005, + 0x3477c8, + 0x3a89c5, + 0x2d7089, + 0x3982c7, + 0x3982cb, + 0x302206, + 0x244e89, + 0x333088, + 0x2931c5, + 0x2f6548, + 0x3c3048, + 0x283d07, + 0x2455c7, + 0x28dc09, + 0x231187, + 0x29a109, + 0x2b984c, + 0x2bb808, + 0x2bf649, + 0x2c0787, + 0x28ed49, + 0x38fbc7, + 0x2d6788, + 0x3c1585, + 0x372bc6, + 0x2d5308, + 0x2fa4c8, + 0x2709c9, + 0x287787, + 0x27e305, + 0x207789, + 0x31f546, + 0x29b0c4, + 0x37f506, + 0x3a8fc8, + 0x23bc07, + 0x204788, + 0x3a9609, + 0x353907, + 0x2a7e46, + 0x3e3d84, + 0x26a5c9, + 0x3cd808, + 0x3cf507, + 0x291846, + 0x2044c6, + 0x3cfc04, + 0x2f3b46, + 0x207843, + 0x331709, + 0x331b46, + 0x2b7e85, + 0x2ab306, + 0x224185, + 0x28d088, + 0x205387, + 0x3c2786, + 0x333706, + 0x31ef88, + 0x2ae8c7, + 0x2a8005, + 0x2a87c8, + 0x3d4188, + 0x3c5b08, + 0x2452c5, + 0x372c46, + 0x369ac9, + 0x30c504, + 0x22400b, + 0x22338b, + 0x234789, + 0x20dac3, + 0x263745, + 0x2b62c6, + 0x246508, + 0x2fb584, + 0x2b64c6, + 0x2b27c9, + 0x3201c5, + 0x2e0046, + 0x2cb5c6, + 0x21b6c4, + 0x2a8e4a, + 0x2b7dc8, + 0x2fa4c6, + 0x371545, + 0x201b87, + 0x33aec7, + 0x353b44, + 0x2235c7, + 0x245fc4, + 0x245fc6, + 0x202003, + 0x2759c5, + 0x2bdc85, + 0x347188, + 0x28e145, + 0x286289, + 0x221247, + 0x22124b, + 0x2afd4c, + 0x2b034a, + 0x34ff07, + 0x20ac43, + 0x284b88, + 0x302585, + 0x219885, + 0x359784, + 0x2d6686, + 0x287186, + 0x2f3b87, + 0x26030b, + 0x214ac4, + 0x368a84, + 0x2bf884, + 0x2dfe06, + 0x221404, + 0x21b548, + 0x359585, + 0x249c05, + 0x2a7c47, + 0x3e4349, + 0x33ac85, + 0x39424a, + 0x2deb09, + 0x2ae3ca, + 0x3e3209, + 0x31c284, + 0x393445, + 0x2c3c08, + 0x3afdcb, + 0x30c2c5, + 0x216c86, + 0x24a884, + 0x2867c6, + 0x353789, + 0x2eac47, + 0x27af48, + 0x249946, + 0x347a47, + 0x28d908, + 0x3780c6, + 0x3e3e04, + 0x3b2687, + 0x384f05, + 0x396107, + 0x221484, + 0x2cc906, + 0x3aea88, + 0x2a4c08, + 0x32a647, + 0x306e08, + 0x2a1e85, + 0x20d904, + 0x240f48, + 0x29ae44, + 0x2168c5, + 0x3ae984, + 0x20b707, + 0x296787, + 0x28ee88, + 0x322f46, + 0x28e0c5, + 0x286088, + 0x32ca88, + 0x2ad9c9, + 0x223686, + 0x239b08, + 0x28f60a, + 0x38c808, + 0x318f85, + 0x27bbc6, + 0x2adfc8, + 0x28948a, + 0x232b87, + 0x292905, + 0x29df48, + 0x272e04, + 0x25ec86, + 0x2d7f88, + 0x20d986, + 0x3d55c8, + 0x237bc7, + 0x20cf06, + 0x2cd844, + 0x326687, + 0x2c6a84, + 0x353747, + 0x3cf84d, + 0x234805, + 0x2cc30b, + 0x244206, + 0x25e4c8, + 0x24cf04, + 0x26a146, + 0x28aa06, + 0x22e187, + 0x2a428d, + 0x3089c7, + 0x2c70c8, + 0x294145, + 0x219948, + 0x2dbac6, + 0x2a1f08, + 0x3e0d46, + 0x36c9c7, + 0x2e2d89, + 0x338587, + 0x294808, + 0x269145, + 0x2357c8, + 0x327d05, + 0x2334c5, + 0x379205, + 0x20af03, + 0x202644, + 0x245745, + 0x24b649, + 0x372a06, + 0x2ea908, + 0x289685, + 0x2c9847, + 0x2a90ca, + 0x2dff89, + 0x2d7bca, + 0x2e5708, + 0x22850c, + 0x28fe8d, + 0x31e443, + 0x3d54c8, + 0x211145, + 0x353d86, + 0x3d1d86, + 0x321f85, + 0x2586c9, + 0x30db85, + 0x286088, + 0x2648c6, + 0x36ad46, + 0x2af1c9, + 0x266e47, + 0x29be06, + 0x2a9048, + 0x245f48, + 0x2f0987, + 0x2e050e, + 0x2dbd05, + 0x3c3605, + 0x20d888, + 0x3a21c7, + 0x204502, + 0x2d4944, + 0x27fa8a, + 0x3cf5c8, + 0x3c3186, + 0x2a6108, + 0x2ab406, + 0x340f48, + 0x2bbb88, + 0x233484, + 0x2c9c05, + 0x70e7c4, + 0x70e7c4, + 0x70e7c4, + 0x201f03, + 0x204346, + 0x286546, + 0x2aa3cc, + 0x20cf43, + 0x270b06, + 0x201fc4, + 0x2e38c8, + 0x2b2605, + 0x27fb86, + 0x2d1208, + 0x2e6386, + 0x3c2706, + 0x29e748, + 0x2e7047, + 0x230f49, + 0x2f04ca, + 0x274544, + 0x246005, + 0x30a405, + 0x2e3646, + 0x23e906, + 0x2aa146, + 0x382006, + 0x231084, + 0x23108b, + 0x239644, + 0x201c05, + 0x2bab85, + 0x2605c6, + 0x20ec48, + 0x28fd47, + 0x331ac4, + 0x211583, + 0x272905, + 0x37f3c7, + 0x28fc4b, + 0x347087, + 0x2d1108, + 0x2c9d47, + 0x276a06, + 0x271fc8, + 0x2cf3cb, + 0x2cba46, + 0x212949, + 0x2cf545, + 0x322d43, + 0x2e0046, + 0x237ac8, + 0x215ec3, + 0x29acc3, + 0x28d906, + 0x2ab406, + 0x37604a, + 0x28a2c5, + 0x28a84b, + 0x2ab24b, + 0x217e03, + 0x209b03, + 0x2c3044, + 0x2e4887, + 0x237b44, + 0x29b2c4, + 0x2c9e84, + 0x38cb08, + 0x371488, + 0x211b89, + 0x2e3488, + 0x3a0087, + 0x224006, + 0x2ea54f, + 0x2dbe46, + 0x2e4dc4, + 0x3712ca, + 0x37f2c7, + 0x2c6b86, + 0x29b109, + 0x211b05, + 0x3472c5, + 0x211c46, + 0x235903, + 0x272e49, + 0x21d106, + 0x3a93c9, + 0x3947c6, + 0x2759c5, + 0x20b085, + 0x202643, + 0x2e49c8, + 0x332207, + 0x2f6084, + 0x2e3748, + 0x29d844, + 0x31ff46, + 0x2b49c6, + 0x247dc6, + 0x2e6d09, + 0x219805, + 0x2a80c6, + 0x25c0c9, + 0x2db246, + 0x2ea646, + 0x3abbc6, + 0x209085, + 0x3ae986, + 0x36c9c4, + 0x3c1585, + 0x2d5304, + 0x2c8f46, + 0x354704, + 0x201c03, + 0x292585, + 0x23d308, + 0x35a407, + 0x2fb609, + 0x292808, + 0x2a5891, + 0x2cb64a, + 0x3036c7, + 0x237d06, + 0x201fc4, + 0x2d5408, + 0x293688, + 0x2a5a4a, + 0x2d6e4d, + 0x216b86, + 0x29e846, + 0x326746, + 0x2ac3c7, + 0x2c7185, + 0x30d607, + 0x201e85, + 0x398404, + 0x3c2d46, + 0x2884c7, + 0x272b4d, + 0x2adf07, + 0x2bfb48, + 0x286389, + 0x27bac6, + 0x2f3fc5, + 0x2e9284, + 0x3a90c6, + 0x353a46, + 0x3cf746, + 0x2a6988, + 0x22d503, + 0x21b783, + 0x32c105, + 0x322606, + 0x2bbb45, + 0x249b48, + 0x2a9bca, + 0x239084, + 0x2e38c8, + 0x2a3448, + 0x3a9947, + 0x37b249, + 0x2d0e08, + 0x294007, + 0x2d3fc6, + 0x20d98a, + 0x3a9148, + 0x31dac9, + 0x2afb48, + 0x222849, + 0x35d787, + 0x208f45, + 0x2ab806, + 0x2c0f08, + 0x281fc8, + 0x261d08, + 0x342688, + 0x201c05, 0x200d04, - 0x2347c8, - 0x241884, - 0x32b704, - 0x269dc5, - 0x2961c7, - 0x32de09, - 0x211447, - 0x2319c5, - 0x27a846, - 0x369406, - 0x202fc4, - 0x2a4646, - 0x27f244, - 0x292b46, - 0x32dbc6, - 0x213446, - 0x3c2845, - 0x293b47, - 0x202e03, - 0x269889, - 0x308588, - 0x283f84, - 0x283f8d, - 0x29af88, - 0x2ec008, - 0x390e06, - 0x2857c9, - 0x2cc949, - 0x32ac05, - 0x29f84a, - 0x25364a, - 0x27108c, - 0x271206, - 0x27b146, - 0x2ca646, - 0x39eec9, - 0x202e46, - 0x220a86, - 0x36b486, - 0x23c508, - 0x229c46, - 0x2d5acb, - 0x296345, - 0x21b745, - 0x27b945, - 0x327c86, - 0x2047c3, - 0x23eb46, - 0x2a32c7, - 0x2c3045, - 0x25ab85, - 0x3bd3c5, - 0x312906, - 0x32acc4, - 0x336306, - 0x2abc89, - 0x327b0c, - 0x2e80c8, - 0x229ec4, - 0x2ff7c6, - 0x2887c6, - 0x358488, - 0x30e988, - 0x327a09, - 0x328487, - 0x265a89, - 0x273dc6, - 0x22c644, - 0x205584, - 0x283704, - 0x2849c8, - 0x32dc4a, - 0x35cb46, - 0x36d607, - 0x385487, - 0x242545, - 0x2f70c4, - 0x291446, - 0x2b6e46, - 0x202a83, - 0x3083c7, - 0x3dd008, - 0x32ad4a, - 0x23d9c8, - 0x209148, - 0x363505, - 0x2a0385, - 0x2659c5, - 0x242906, - 0x390046, - 0x37b985, - 0x324e09, - 0x2f6ecc, - 0x380907, - 0x29bb48, - 0x296685, - 0x727544, - 0x2270c4, - 0x284f44, - 0x218606, - 0x2a268e, - 0x369f87, - 0x21b945, - 0x2d618c, - 0x3cb3c7, - 0x33a507, - 0x358fc9, - 0x219049, - 0x289045, - 0x308588, - 0x302849, - 0x3971c5, - 0x2c2f88, - 0x2bb2c6, - 0x384d46, - 0x241f04, - 0x290108, - 0x21a443, - 0x387344, - 0x3d2005, - 0x398bc7, - 0x22c405, - 0x3d4b89, - 0x2a4c0d, - 0x371086, - 0x3b9904, - 0x2b7b48, - 0x3c618a, - 0x221e07, - 0x326945, - 0x280883, - 0x2a1a0e, - 0x24c3cc, - 0x2ffcc7, - 0x2a2847, - 0x40b06207, - 0x1282c6, - 0x81b84, - 0x202e83, - 0x202e85, - 0x284f45, - 0x29c688, - 0x29a009, - 0x229dc6, - 0x27aa44, - 0x2f0546, - 0x2395cb, - 0x2c77cc, - 0x24f607, - 0x2d5d85, - 0x3c96c8, - 0x2e25c5, - 0x244f87, - 0x3db307, - 0x339b45, - 0x2047c3, - 0x210584, - 0x23d245, - 0x28e745, - 0x28e746, - 0x2a8a48, - 0x33a587, - 0x39cf86, - 0x209546, - 0x34afc6, - 0x239989, - 0x211a07, - 0x27f346, - 0x2c7946, - 0x3a9606, - 0x2acd45, - 0x208bc6, + 0x23bec8, + 0x24a604, + 0x3e3004, + 0x2759c5, + 0x29d187, + 0x3e4109, + 0x22df87, + 0x226b05, + 0x282e86, + 0x370d46, + 0x20ed44, + 0x2af4c6, + 0x28ac84, + 0x3d4886, + 0x3e3ec6, + 0x215d06, + 0x3de685, + 0x249a07, + 0x20ac43, + 0x22bf49, + 0x31ed88, + 0x293e84, + 0x293e8d, + 0x2a4d08, + 0x3082c8, + 0x31da46, + 0x2e2e89, + 0x2dff89, + 0x353485, + 0x2a9cca, + 0x27cb0a, + 0x291a4c, + 0x291bc6, + 0x284786, + 0x2dc446, + 0x3a6ac9, + 0x353fc6, + 0x2ae906, + 0x30dc46, + 0x221408, + 0x306e06, + 0x2e43cb, + 0x29d305, + 0x249c05, + 0x285285, + 0x30ef06, + 0x20d943, + 0x247d46, + 0x2ade87, + 0x2d52c5, + 0x2f4ec5, + 0x2c4945, + 0x2f9646, + 0x336cc4, + 0x336cc6, + 0x2a3d09, + 0x30ed8c, + 0x398148, + 0x25cf04, + 0x39d6c6, + 0x244306, + 0x237ac8, + 0x21b6c8, + 0x30ec89, + 0x201b87, + 0x2fbc09, + 0x27d9c6, + 0x216b04, + 0x210484, + 0x28df04, + 0x28d908, + 0x3e3f4a, + 0x33ac06, + 0x368807, + 0x396387, + 0x244f85, + 0x2b9304, + 0x299d86, + 0x2c71c6, + 0x205483, + 0x31ebc7, + 0x22a948, + 0x3535ca, + 0x202148, + 0x273148, + 0x354745, + 0x237105, + 0x2fbb45, + 0x245346, + 0x246e46, + 0x316a45, + 0x331949, + 0x2b910c, + 0x34ca47, + 0x2a5ac8, + 0x282185, + 0x70e7c4, + 0x236b04, + 0x2cc644, + 0x3d0ac6, + 0x2ad28e, + 0x347347, + 0x2ac5c5, + 0x30c48c, + 0x29d707, + 0x288447, + 0x2c8989, + 0x21ae49, + 0x292905, + 0x31ed88, + 0x369ac9, + 0x3c59c5, + 0x2d5208, + 0x2c1f86, + 0x2411c6, + 0x24fb84, + 0x2aa648, + 0x206743, + 0x203f44, + 0x272985, + 0x39b187, + 0x26a445, + 0x28f4c9, + 0x29b80d, + 0x2b2ec6, + 0x2115c4, + 0x288608, + 0x22384a, + 0x3e9847, + 0x2b0c45, + 0x203f83, + 0x2ab40e, + 0x2e4acc, + 0x33b107, + 0x2ad447, + 0x4d39a7c7, + 0x143386, + 0x27804, + 0x212fc3, + 0x354005, + 0x2cc645, + 0x2a64c8, + 0x2a3289, + 0x25ce06, + 0x237b44, + 0x303606, + 0x245d0b, + 0x2da2cc, + 0x257b47, + 0x2e4685, + 0x3d4088, + 0x2f0745, + 0x3712c7, + 0x2e2c47, + 0x2494c5, + 0x20d943, + 0x2abd84, + 0x288cc5, + 0x36a505, + 0x36a506, + 0x2a0088, + 0x2884c7, + 0x3d2086, + 0x3cfb06, + 0x379146, + 0x3dcac9, + 0x3cda87, + 0x25cc86, + 0x2da446, + 0x387046, + 0x2b7d05, + 0x218586, + 0x3b5545, + 0x3a8a48, + 0x29cdcb, + 0x2998c6, + 0x3963c4, + 0x222e09, + 0x221244, + 0x2c1f08, + 0x311007, + 0x290f04, + 0x2d02c8, + 0x2d6984, + 0x2b7d44, + 0x293dc5, + 0x342586, + 0x38ca47, + 0x235f03, + 0x2a7f05, + 0x34bb44, + 0x3c3646, + 0x353508, + 0x32c785, + 0x29ca89, + 0x207985, + 0x3ca8c8, + 0x326c47, + 0x331c48, + 0x2cff07, + 0x395809, + 0x291186, + 0x397c06, + 0x29fa84, + 0x223f45, + 0x3151cc, + 0x285287, + 0x285a87, + 0x23e548, + 0x2b2ec6, + 0x2addc4, + 0x37ddc4, + 0x28da89, + 0x2dc546, + 0x293547, + 0x27b884, + 0x2af5c6, + 0x3de9c5, + 0x2e2ac7, + 0x2e4346, + 0x26ae49, + 0x2d2747, + 0x2a1447, + 0x2af046, + 0x291785, + 0x28c108, + 0x21cf88, + 0x36db46, + 0x32c7c5, + 0x2d8fc6, + 0x20d083, + 0x2a6349, + 0x2a9ece, + 0x2cfc48, + 0x29d948, + 0x36d94b, + 0x29ccc6, + 0x396284, + 0x28fa84, + 0x2a9fca, + 0x21a2c7, + 0x25cd45, + 0x212949, + 0x2d3f05, + 0x3e3047, + 0x29e6c4, + 0x206647, + 0x216a08, + 0x2c96c6, + 0x2cca89, + 0x2d0f0a, + 0x21a246, + 0x2a4846, + 0x2bab05, + 0x39c545, + 0x3b0e47, + 0x24f388, + 0x3de908, + 0x233486, + 0x20b105, + 0x23e68e, + 0x2d15c4, + 0x2a6445, + 0x282809, + 0x2f8a08, + 0x298006, + 0x2a82cc, + 0x2a97d0, + 0x2acecf, + 0x2ae648, + 0x34ff07, + 0x3de685, + 0x245745, + 0x38c8c9, + 0x29e149, + 0x283546, + 0x30c347, + 0x39d7c5, + 0x23ae89, + 0x35dfc6, + 0x353e0d, + 0x28ddc9, + 0x29b2c4, + 0x2cf6c8, + 0x23bf89, + 0x33adc6, + 0x284d85, + 0x397c06, + 0x27ae09, + 0x27b708, + 0x20f1c5, + 0x28f704, + 0x2a848b, + 0x33ac85, + 0x246586, + 0x2901c6, + 0x259446, + 0x3d0e8b, + 0x29cb89, + 0x225005, + 0x396f87, + 0x2cb5c6, + 0x25e646, + 0x28f388, + 0x2d40c9, + 0x2bf90c, + 0x37f1c8, + 0x31d186, + 0x3356c3, + 0x38adc6, + 0x302505, + 0x28b388, + 0x20ab06, + 0x3c8888, + 0x3b0905, + 0x267305, + 0x326d88, + 0x3b6ec7, + 0x3d1cc7, + 0x2f3b87, + 0x32f908, + 0x350048, + 0x2f1086, + 0x2c8d87, + 0x21ea07, + 0x39558a, + 0x210843, + 0x30ef06, + 0x23e605, + 0x27fa84, + 0x286389, + 0x395784, + 0x2c96c4, + 0x2a9444, + 0x2ad44b, + 0x332147, + 0x23e8c5, + 0x2a1b88, + 0x282e86, + 0x282e88, + 0x28a206, + 0x298945, + 0x298b85, + 0x29a546, + 0x30e148, + 0x29b048, + 0x286546, + 0x2a19cf, + 0x2a5e10, + 0x20d485, + 0x20ac43, + 0x237405, + 0x31d348, + 0x29e049, + 0x3c5b08, + 0x30c148, + 0x25ae48, + 0x332207, + 0x282b49, + 0x3c8a88, + 0x2b3944, + 0x2a92c8, + 0x347889, + 0x2c9307, + 0x2bc7c4, + 0x22e048, + 0x2497ca, + 0x2ee946, + 0x216b86, + 0x223549, + 0x2a9a07, + 0x2e0b08, + 0x244808, + 0x3d01c8, + 0x2796c5, 0x386605, - 0x28d688, - 0x295b4b, - 0x290cc6, - 0x3854c4, - 0x2d87c9, - 0x23c344, - 0x2bb248, - 0x35f507, - 0x286e84, - 0x2be3c8, - 0x2c42c4, - 0x2acd84, - 0x289d05, - 0x30e886, - 0x245687, - 0x2172c3, - 0x2a0745, - 0x273304, - 0x232a86, - 0x32ac88, - 0x320cc5, - 0x295809, - 0x248a05, - 0x23cf48, - 0x3d28c7, - 0x325108, - 0x2be007, - 0x2ee809, - 0x27df46, - 0x370c46, - 0x2a6384, - 0x2fd045, - 0x30724c, - 0x27b947, - 0x27c2c7, - 0x233c88, - 0x371086, - 0x2a3204, - 0x3415c4, - 0x38c549, - 0x2ca746, - 0x272647, - 0x211284, - 0x2a4746, - 0x37adc5, - 0x2d2d87, - 0x2d5a46, - 0x27f609, - 0x2e6e47, - 0x298847, - 0x2a4186, - 0x22e705, - 0x282b88, - 0x220688, - 0x2dccc6, - 0x320d05, - 0x2c5406, - 0x2017c3, - 0x29c509, - 0x2a080e, - 0x2bdd48, - 0x310c88, - 0x2dcacb, - 0x295a46, - 0x326404, - 0x285a84, - 0x2a090a, - 0x20f007, - 0x27f405, - 0x20df49, - 0x2c1b45, - 0x32b747, - 0x2329c4, - 0x297307, - 0x2f7e88, - 0x2d2406, - 0x2bb749, - 0x2bf08a, - 0x20ef86, - 0x29aac6, - 0x2aff45, - 0x39a185, - 0x31fa87, - 0x246d08, - 0x37ad08, - 0x225cc6, - 0x28e4c5, - 0x233dce, - 0x2bf744, - 0x29c605, + 0x249c05, + 0x2cc605, + 0x2c6347, + 0x20d945, + 0x2d52c5, + 0x386b86, + 0x3c5a47, + 0x3afd07, + 0x249ac6, + 0x2e5c45, + 0x246586, + 0x205405, + 0x2c1d88, + 0x2f9e44, + 0x2db2c6, + 0x351e44, + 0x2d00c8, + 0x2db3ca, + 0x286ccc, + 0x2aaa05, + 0x2ac486, + 0x2bfac6, + 0x3b6806, + 0x31d204, + 0x3df285, + 0x289ac7, + 0x2a9a89, + 0x2e03c7, + 0x70e7c4, + 0x70e7c4, + 0x331fc5, + 0x312a84, + 0x2a7a8a, + 0x282d06, + 0x3698c4, + 0x203345, + 0x2c5405, + 0x2c70c4, + 0x28fe07, + 0x207907, + 0x2dfe08, + 0x2d90c8, + 0x20f1c9, + 0x29ae48, + 0x29494b, + 0x239704, + 0x29eb45, + 0x28c845, + 0x2f3b09, + 0x2d40c9, + 0x222d08, + 0x3d8dc8, + 0x2605c4, + 0x244345, + 0x20dec3, + 0x2e3605, + 0x2a8146, + 0x2a30cc, + 0x21d006, + 0x284c86, + 0x298285, + 0x2f96c8, + 0x2dac86, + 0x237e86, + 0x216b86, + 0x22b48c, + 0x27d4c4, + 0x37928a, + 0x2981c8, + 0x2a2f07, + 0x34ba46, + 0x25cec7, + 0x303205, + 0x291846, + 0x35ecc6, + 0x3728c7, + 0x2d0c04, + 0x20b805, + 0x282804, + 0x398487, + 0x282a48, + 0x28460a, + 0x28ca87, + 0x2b7907, + 0x34fe87, + 0x2f0889, + 0x2a30ca, + 0x208fc3, + 0x35a3c5, + 0x215d43, + 0x2c9ec9, + 0x36cc48, + 0x368947, + 0x3c5c09, + 0x21d086, + 0x3c1648, + 0x2c4685, + 0x32cb8a, + 0x20df09, 0x27a1c9, - 0x2e6a48, - 0x28f8c6, - 0x29e2cc, - 0x29f350, - 0x2a22cf, - 0x2a3788, - 0x30ce07, - 0x3c2845, - 0x245505, - 0x245509, - 0x294309, - 0x316106, - 0x2d6047, - 0x2fcf45, - 0x237189, - 0x350f86, - 0x202c8d, - 0x2835c9, - 0x289f44, - 0x2bdac8, - 0x234889, - 0x35cd06, - 0x38cf45, - 0x370c46, - 0x278c89, - 0x212348, - 0x20b3c5, - 0x290104, - 0x29e48b, - 0x35cbc5, - 0x242e46, - 0x2861c6, - 0x32eb86, - 0x29524b, - 0x295909, - 0x209485, - 0x395547, - 0x3db446, - 0x3ae2c6, - 0x284cc8, - 0x22b1c9, - 0x2b534c, - 0x35f0c8, - 0x3118c6, - 0x33d5c3, - 0x2ff4c6, - 0x295085, - 0x281348, - 0x28dec6, - 0x2d2fc8, - 0x232105, - 0x29bc85, - 0x3d2a08, - 0x39d3c7, - 0x39cbc7, - 0x36d987, - 0x3134c8, - 0x358308, - 0x2d1bc6, - 0x2b7507, - 0x238507, - 0x294f4a, - 0x2292c3, - 0x327c86, - 0x22a005, - 0x245a84, - 0x27d389, - 0x2ee784, - 0x203c44, - 0x29fbc4, - 0x2a284b, - 0x325607, - 0x234005, - 0x298f88, - 0x27a846, - 0x27a848, - 0x27fd46, - 0x290045, - 0x290305, - 0x2920c6, - 0x293548, - 0x293e88, - 0x27d546, - 0x298dcf, - 0x29bfd0, - 0x3dc385, - 0x202e03, - 0x22c705, - 0x314b08, - 0x294209, - 0x397308, - 0x2d5e48, - 0x23aac8, - 0x3256c7, - 0x27a509, - 0x2d31c8, - 0x291204, - 0x29fa48, - 0x3baf09, - 0x2b87c7, - 0x2ad784, - 0x211508, - 0x29390a, - 0x2ddc86, - 0x2a2fc6, - 0x22d7c9, - 0x29f587, - 0x2cf488, - 0x2e21c8, - 0x209c08, - 0x249085, - 0x39af85, - 0x21b745, - 0x284f05, - 0x2b6007, - 0x2047c5, - 0x2c3045, - 0x2389c6, - 0x397247, - 0x2d7fc7, - 0x293c06, - 0x2d7885, - 0x242e46, - 0x2b9605, - 0x2bfb08, - 0x2fcec4, - 0x2c8906, - 0x323484, - 0x2be1c8, - 0x2c8a0a, - 0x27dccc, - 0x247f85, - 0x21b806, - 0x2b5506, - 0x3202c6, - 0x311944, - 0x39ca85, - 0x27ef87, - 0x29f609, - 0x2ce5c7, - 0x727544, - 0x727544, - 0x325485, - 0x216144, - 0x29dc8a, - 0x27a6c6, - 0x302644, - 0x3ce8c5, - 0x2b5a05, - 0x2b6d44, - 0x285e07, - 0x248987, - 0x2ce188, - 0x2c5508, - 0x20b3c9, - 0x31c548, - 0x29de4b, - 0x245644, - 0x3ae3c5, - 0x38c905, - 0x36d909, - 0x22b1c9, - 0x2d86c8, - 0x224b88, - 0x2dd504, - 0x288805, - 0x209ec3, - 0x3581c5, - 0x29b286, - 0x299e4c, - 0x211186, - 0x38ce46, - 0x28fb45, - 0x312988, - 0x30eb06, - 0x2d4046, - 0x2a2fc6, - 0x23d74c, - 0x38c9c4, - 0x34b10a, - 0x28fa88, - 0x299c87, - 0x273206, - 0x229e87, - 0x2f0145, - 0x22e7c6, - 0x366086, - 0x377e87, - 0x22ce84, - 0x2100c5, - 0x27a1c4, - 0x2e8407, - 0x27a408, - 0x27afca, - 0x283807, - 0x2ac947, - 0x30cd87, - 0x2e2709, - 0x299e4a, - 0x22c603, - 0x22cd85, - 0x213483, - 0x2b7809, - 0x3586c8, - 0x31c307, - 0x397409, - 0x220786, - 0x3296c8, - 0x3a3705, - 0x2517ca, - 0x328a49, - 0x24be09, - 0x3a1c47, - 0x3cfa89, - 0x213348, - 0x32f686, - 0x21b9c8, - 0x3c3e47, - 0x26e1c7, - 0x2a3547, - 0x2db108, - 0x2ff646, - 0x2936c5, - 0x27ef87, - 0x29a5c8, - 0x34af44, - 0x2cf0c4, - 0x294907, - 0x2b11c7, - 0x3026ca, - 0x32f606, - 0x37b28a, - 0x2c1f87, - 0x2bf507, - 0x210184, - 0x29cf84, - 0x2d2c86, - 0x3386c4, - 0x3386cc, - 0x302585, - 0x213fc9, - 0x23d0c4, - 0x2b6e05, - 0x3c6108, - 0x293f45, - 0x393146, - 0x294444, - 0x2ae3ca, - 0x31bfc6, - 0x24080a, - 0x32bac7, - 0x228985, - 0x22b885, - 0x24258a, - 0x339c05, - 0x2454c6, - 0x241884, - 0x2b3e46, - 0x31fb45, - 0x28df86, - 0x2f1d8c, - 0x2d9bca, - 0x253744, - 0x231f06, - 0x29f587, - 0x2d59c4, - 0x23c508, - 0x2e5046, - 0x385309, - 0x2cbc49, - 0x2b3489, - 0x2ce8c6, - 0x3c3f46, - 0x21bb07, - 0x324d48, - 0x3c3d49, - 0x325607, - 0x299106, - 0x3b8cc7, - 0x26c105, - 0x2bf744, - 0x21b6c7, - 0x2386c5, - 0x289c45, + 0x2dab47, + 0x293789, + 0x215c08, + 0x3e3c46, + 0x2ac648, + 0x2f5207, + 0x231187, + 0x2deb07, + 0x2cdf88, + 0x39ab06, + 0x249585, + 0x289ac7, + 0x2a4348, + 0x3790c4, + 0x309684, + 0x29bd07, + 0x2bbf07, + 0x36994a, + 0x3e3bc6, + 0x3ce54a, + 0x2d4887, + 0x2d1387, + 0x20b8c4, + 0x29a1c4, + 0x2e29c6, + 0x2f4644, + 0x2f464c, + 0x310f45, + 0x216849, + 0x3caa44, + 0x2c7185, + 0x2237c8, + 0x27a545, + 0x394246, + 0x29e284, + 0x2a6d0a, + 0x2dddc6, + 0x3501ca, + 0x3e33c7, + 0x2048c5, + 0x235905, + 0x244fca, + 0x281f05, + 0x2ada86, + 0x24a604, + 0x2c31c6, + 0x3b0f05, + 0x20abc6, + 0x32a64c, + 0x22b70a, + 0x27cc04, + 0x224006, + 0x2a9a07, + 0x2e42c4, + 0x221408, + 0x2ed306, + 0x396209, + 0x3dd0c9, + 0x2bb909, + 0x2241c6, + 0x2f5306, + 0x2ac787, + 0x331888, + 0x2f5109, + 0x332147, + 0x2a1d06, + 0x347ac7, + 0x326605, + 0x2d15c4, + 0x2ac347, + 0x21ebc5, + 0x293d05, 0x200cc7, - 0x339a08, - 0x3c9646, - 0x29b40d, - 0x29c88f, - 0x2a184d, - 0x208904, - 0x235f46, - 0x2d9f88, - 0x36b445, - 0x295108, - 0x26444a, - 0x289f44, - 0x2ed986, - 0x2d6b87, - 0x21af87, - 0x2cfa09, - 0x21b985, - 0x2b6d44, - 0x2b938a, - 0x2beb49, - 0x3cfb87, - 0x2eecc6, - 0x35cd06, - 0x288746, - 0x3835c6, - 0x2d988f, - 0x2d9e49, - 0x229c46, - 0x38c186, - 0x324409, - 0x2b7607, - 0x222b43, - 0x23d8c6, - 0x2060c3, - 0x35a848, - 0x2a9d87, - 0x2a3989, - 0x2eeec8, - 0x39cd08, - 0x23c006, - 0x2110c9, - 0x380845, - 0x273204, - 0x2f3c87, - 0x39ef45, - 0x208904, - 0x2340c8, - 0x20f2c4, - 0x2b7347, - 0x343646, - 0x281685, - 0x2c40c8, - 0x35cbcb, - 0x308a87, - 0x242806, - 0x2c9e44, - 0x326386, - 0x269dc5, - 0x2386c5, - 0x282909, - 0x285a09, - 0x26e204, - 0x26e245, - 0x231f45, - 0x251646, - 0x308688, - 0x2c1086, - 0x3dce4b, - 0x388c0a, - 0x2be105, - 0x290386, - 0x25cb45, - 0x2e1fc5, - 0x296ac7, - 0x327f08, - 0x265a84, - 0x264046, - 0x293f06, - 0x213507, - 0x316f84, - 0x280606, - 0x3ba7c5, - 0x3ba7c9, - 0x20d344, - 0x2f7249, - 0x27d546, - 0x2c3848, - 0x231f45, - 0x385585, - 0x28df86, - 0x2b5249, - 0x219049, - 0x38cec6, - 0x2e6b48, - 0x2a4d48, - 0x25cb04, - 0x2b9c44, - 0x2b9c48, - 0x32c488, - 0x265b89, - 0x29b206, - 0x2a2fc6, - 0x33cc0d, - 0x3dafc6, - 0x2b8ac9, - 0x3bb285, - 0x206106, - 0x209d88, - 0x336245, - 0x238544, - 0x269dc5, - 0x285548, - 0x29da49, - 0x27a284, - 0x2bb5c6, - 0x39104a, - 0x2ffbc8, - 0x302849, - 0x26ad8a, - 0x397386, - 0x29ca48, - 0x244d45, - 0x28fd08, - 0x2f01c5, - 0x220649, - 0x33ef89, - 0x210642, - 0x272c85, - 0x273a46, - 0x27d487, - 0x245a85, - 0x2f6146, - 0x30c0c8, - 0x371086, - 0x2c15c9, - 0x27c3c6, - 0x284b48, - 0x38d285, - 0x2fe046, - 0x330248, - 0x2849c8, - 0x2d3c88, - 0x30e488, - 0x208bc4, - 0x23b083, - 0x2c1804, - 0x283a06, - 0x26c144, - 0x310bc7, - 0x2d3f49, - 0x2c8c85, - 0x2e21c6, - 0x23d8c6, - 0x2a888b, - 0x2b67c6, - 0x363746, - 0x2cc7c8, - 0x23d386, - 0x228783, - 0x2077c3, - 0x2bf744, - 0x231885, - 0x2ba987, - 0x27a408, - 0x27a40f, - 0x27ee8b, - 0x308488, - 0x2bb646, - 0x30878e, - 0x232ac3, - 0x2ba904, - 0x2b6745, - 0x2b6bc6, - 0x29154b, - 0x296286, - 0x21c449, - 0x281685, - 0x24fc08, - 0x208208, - 0x218f0c, - 0x2a2886, - 0x358206, - 0x2e2e05, - 0x28a1c8, - 0x27dcc5, - 0x35bb48, - 0x29e64a, - 0x2a1c89, - 0x727544, + 0x249388, + 0x3d4006, + 0x2a51cd, + 0x2a66cf, + 0x2ab24d, + 0x223444, + 0x23d406, + 0x2e7b48, + 0x30dc05, + 0x245488, + 0x283bca, + 0x29b2c4, + 0x2c67c6, + 0x215307, + 0x214ac7, + 0x2e7109, + 0x2ac605, + 0x2c70c4, + 0x2c9b4a, + 0x2d09c9, + 0x293887, + 0x2a5486, + 0x33adc6, + 0x244286, + 0x3b2746, + 0x2e69cf, + 0x2e7a09, + 0x306e06, + 0x267246, + 0x20c049, + 0x2c8e87, + 0x201543, + 0x209046, + 0x211c03, + 0x321e48, + 0x26a007, + 0x2ae849, + 0x2b4848, + 0x3d1e08, + 0x2878c6, + 0x225a89, + 0x34c985, + 0x2a7d04, + 0x209007, + 0x3a6b45, + 0x223444, + 0x23e988, + 0x21a584, + 0x2c8bc7, + 0x3aa146, + 0x23fe85, + 0x2afb48, + 0x33ac8b, + 0x31f287, + 0x245246, + 0x2dbec4, + 0x3da006, + 0x2759c5, + 0x21ebc5, + 0x28be89, + 0x28fa09, + 0x2311c4, + 0x231205, + 0x224045, + 0x32ca06, + 0x31ee88, + 0x2d3506, + 0x22a78b, + 0x2be84a, + 0x2d0005, + 0x298c06, + 0x238d85, + 0x386ac5, + 0x2a35c7, + 0x30f188, + 0x29aec4, + 0x34ae06, + 0x29b0c6, + 0x215dc7, + 0x322d04, + 0x28aa06, + 0x3cd645, + 0x3cd649, + 0x2f5504, + 0x30a549, + 0x286546, + 0x2d5a08, + 0x224045, + 0x396485, + 0x20abc6, + 0x2bf809, + 0x21ae49, + 0x284d06, + 0x2f8b08, + 0x29b948, + 0x238d44, + 0x2ca304, + 0x2ca308, + 0x39ff08, + 0x2fbd09, + 0x2a80c6, + 0x216b86, + 0x33a24d, + 0x2b64c6, + 0x360289, + 0x30e485, + 0x211c46, + 0x22e2c8, + 0x336c05, + 0x21ea44, + 0x2759c5, + 0x28f088, + 0x2a7849, + 0x2828c4, + 0x2cc906, + 0x27a40a, + 0x33b008, + 0x369ac9, + 0x27600a, + 0x3c5b86, + 0x2a6888, + 0x371085, + 0x298448, + 0x303285, + 0x21cf49, + 0x33ca09, + 0x234702, + 0x2cf545, + 0x28c906, + 0x286487, + 0x2b0dc5, + 0x34b946, + 0x319908, + 0x2b2ec6, + 0x2c3ac9, + 0x285b86, + 0x28f208, + 0x2b8cc5, + 0x24e406, + 0x36cac8, + 0x28d908, + 0x35d688, + 0x31b648, + 0x218584, + 0x20c8c3, + 0x2c3d04, + 0x28cc86, + 0x326644, + 0x29d887, + 0x237d89, + 0x2db645, + 0x244806, + 0x209046, + 0x29fecb, + 0x2c6ac6, + 0x20c886, + 0x2de708, + 0x361b46, + 0x2046c3, + 0x212403, + 0x2d15c4, + 0x239a05, + 0x3039c7, + 0x282a48, + 0x282a4f, + 0x2899cb, + 0x31ec88, + 0x2cc986, + 0x31ef8e, + 0x20abc3, + 0x303944, + 0x2c6a45, + 0x2c6f46, + 0x299e8b, + 0x29d246, + 0x232009, + 0x23fe85, + 0x251748, + 0x20e288, + 0x21ad0c, + 0x2ad486, + 0x2e3646, + 0x2e1dc5, + 0x2945c8, + 0x286cc5, + 0x329f48, + 0x2a864a, + 0x2ab689, + 0x70e7c4, 0x2000c2, - 0x46a03102, + 0x53216542, 0x200382, - 0x221b84, - 0x205982, - 0x346484, - 0x208ac2, - 0x4783, + 0x2b1b84, + 0x201582, + 0x28d4c4, + 0x204cc2, + 0xd903, 0x2003c2, - 0x202442, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x24af03, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x20ce83, - 0x23f7c3, - 0x232d43, - 0x250784, - 0x22f743, - 0x2375c4, - 0x234e83, - 0x2dbb04, - 0x224943, - 0x245d47, - 0x211d83, - 0x204783, - 0x314d88, - 0x23f7c3, - 0x29248b, - 0x2f0fc3, - 0x22a7c6, - 0x21a602, - 0x2eaa8b, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x23f7c3, - 0x203a83, - 0x207cc3, + 0x202b02, + 0x793c8, + 0xe804, + 0x216543, + 0x222bc3, + 0x343b43, + 0x87c2, + 0x54202, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x2a042, + 0x6502, + 0x4a42, + 0x253c43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x2296c3, + 0x20cb83, + 0x20f7c3, + 0x25dd04, + 0x216543, + 0x23ec84, + 0x222bc3, + 0x2e8fc4, + 0x343b43, + 0x2b1087, + 0x216443, + 0x20d903, + 0x2c2308, + 0x20cb83, + 0x29fc4b, + 0x304443, + 0x24d906, + 0x213402, + 0x2fe64b, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x20cb83, + 0x21b103, + 0x2072c3, 0x2000c2, - 0xa7c88, - 0x217285, - 0x238748, - 0x2f9448, - 0x203102, - 0x342585, - 0x3b8e07, - 0x201bc2, - 0x243307, + 0x793c8, + 0x235ec5, + 0x21ec48, + 0x3585c8, + 0x216542, + 0x363605, + 0x347c07, + 0x202bc2, + 0x24d147, 0x200382, - 0x256d07, - 0x375509, - 0x2c93c8, - 0x209a89, - 0x20ba42, - 0x3bb387, - 0x2dc944, - 0x3b8ec7, - 0x388b07, - 0x25bd02, - 0x211d83, - 0x204fc2, - 0x208ac2, + 0x25be87, + 0x34c049, + 0x277f48, + 0x3d0049, + 0x214182, + 0x20e107, + 0x387c84, + 0x347cc7, + 0x2be747, + 0x2687c2, + 0x216443, + 0x203742, + 0x204cc2, 0x2003c2, - 0x204ac2, + 0x208402, 0x200902, - 0x202442, - 0x20a745, - 0x20f805, - 0x3102, - 0x34e83, - 0x22f743, - 0x234e83, - 0x211343, - 0x224943, - 0x2083c3, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x8d43, + 0x202b02, + 0x2e5245, + 0x227445, + 0x16542, + 0x22bc3, + 0x216543, + 0x222bc3, + 0x22de83, + 0x343b43, + 0x20e443, + 0x2296c3, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x158286, + 0x55fa5a4b, + 0x216443, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x175285, + 0x12b83, 0x101, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x214503, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x2158c3, - 0x49c27bc6, - 0x3c8c3, - 0xca085, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x39c2, - 0xa7c88, - 0x123fc3, - 0x4783, - 0x71003, - 0x46cc4, - 0x1421004, - 0xe29c5, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x243543, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x2203c3, + 0x56869306, + 0x20a83, + 0x70945, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x6482, + 0x793c8, + 0x38c43, + 0xd903, + 0x7ca83, + 0x4f344, + 0x1480c44, + 0xf0b45, 0x2000c2, - 0x395904, - 0x22f743, - 0x234e83, - 0x224943, - 0x250483, - 0x230145, - 0x214503, - 0x20e943, - 0x20ce83, - 0x22c483, - 0x23f7c3, - 0x202443, - 0x250803, - 0x2050c3, + 0x397344, + 0x216543, + 0x222bc3, + 0x343b43, + 0x24cc43, + 0x2b96c5, + 0x243543, + 0x21b283, + 0x2296c3, + 0x257743, + 0x20cb83, + 0x202b03, + 0x2192c3, + 0x201643, + 0x11d783, 0x5c2, - 0x28002, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, + 0x386c2, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, 0x2000c2, - 0x24af03, - 0x203102, - 0x234e83, - 0x224943, - 0x221b84, - 0x20ce83, - 0x23f7c3, - 0x202442, - 0xa7c88, - 0x224943, - 0x71003, - 0xa7c88, - 0x71003, - 0x271803, - 0x22f743, - 0x232244, - 0x234e83, - 0x224943, - 0x203842, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x203842, - 0x225a83, - 0x20ce83, - 0x23f7c3, - 0x2e9343, - 0x202443, + 0x253c43, + 0x216542, + 0x3242, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x2296c3, + 0x20cb83, + 0x202b02, + 0x793c8, + 0x343b43, + 0x7ca83, + 0x793c8, + 0x7ca83, + 0x2cc803, + 0x216543, + 0x23a304, + 0x222bc3, + 0x343b43, + 0x2042c2, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2042c2, + 0x233243, + 0x2296c3, + 0x20cb83, + 0x2faf43, + 0x202b03, 0x2000c2, - 0x203102, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x22a7c5, - 0x112406, - 0x250784, - 0x21a602, - 0xa7c88, + 0x216542, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x24d905, + 0x1143c6, + 0x6ff44, + 0x329c4, + 0x25dd04, + 0x213402, + 0x882, + 0x793c8, + 0x3242, + 0x54202, + 0x2a02, 0x2000c2, - 0x129245, - 0x1cb88, - 0x133c43, - 0x203102, - 0x4e495d86, - 0xc284, - 0x10404b, - 0x369c6, - 0x11e87, - 0x234e83, - 0x4a308, - 0x4a30b, - 0x4a78b, - 0x4ac8b, - 0x4afcb, - 0x4b28b, - 0x4b6cb, - 0x1c6986, - 0x224943, - 0x34c5, - 0x128c44, - 0x20ff83, - 0x10e2c7, - 0xdf604, - 0x70144, - 0x20ce83, - 0x18cfc6, - 0xb40c4, - 0x71003, - 0x23f7c3, - 0x2f2484, - 0x125c07, - 0x112009, - 0x103e08, - 0x127304, - 0xfd986, - 0x7608, - 0x68c45, - 0x7909, - 0x31e43, - 0x129245, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x204783, - 0x23f7c3, - 0x2f0fc3, - 0x21a602, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x214343, - 0x209c04, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x2dbb04, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x22a7c6, - 0x234e83, - 0x224943, - 0x3fc83, - 0x71003, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x129245, - 0x11e87, - 0x4b83, - 0x31e43, - 0xa7c88, - 0x224943, - 0x22f743, - 0x234e83, - 0x224943, - 0x5ee03, - 0x20ce83, - 0x23f7c3, - 0x51a2f743, - 0x234e83, - 0x20ce83, - 0x23f7c3, - 0xa7c88, + 0x146c05, + 0x24948, + 0xe9883, + 0x216542, + 0x45c44, + 0x5b910646, + 0x1db84, + 0xc5e4b, + 0x42746, + 0x1cdf07, + 0x174bc9, + 0x222bc3, + 0x53188, + 0x5318b, + 0x5360b, + 0x539cb, + 0x53d0b, + 0x53fcb, + 0x5440b, + 0x18c86, + 0x343b43, + 0x154645, + 0x10e584, + 0x20b6c3, + 0x11b487, + 0x133604, + 0xed184, + 0x77984, + 0x2296c3, + 0x84e06, + 0xac8c4, + 0x7ca83, + 0x20cb83, + 0x305504, + 0x132747, + 0x113fc9, + 0xc5c08, + 0x1c8dc4, + 0x147e04, + 0x179dc3, + 0x13906, + 0x12248, + 0x18d445, + 0x1a1f49, + 0x39fc3, + 0x13ea86, + 0x146c05, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x20d903, + 0x20cb83, + 0x304443, + 0x213402, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x26a7c3, + 0x21b544, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x2e8fc4, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x24d906, + 0x222bc3, + 0x343b43, + 0x1e803, + 0x7ca83, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x146c05, + 0x1cdf07, + 0x69c3, + 0x39fc3, + 0x793c8, + 0x343b43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x722c3, + 0x2296c3, + 0x20cb83, + 0x5ee16543, + 0x222bc3, + 0x2296c3, + 0x20cb83, + 0x793c8, 0x2000c2, - 0x203102, - 0x22f743, - 0x224943, - 0x20ce83, + 0x216542, + 0x216543, + 0x343b43, + 0x2296c3, 0x2003c2, - 0x23f7c3, - 0x33f4c7, - 0x2c5d4b, - 0x2171c3, - 0x315dc8, - 0x324ac7, - 0x206686, - 0x213a45, - 0x3426c9, - 0x211b08, - 0x37e609, - 0x3a5f50, - 0x37e60b, - 0x2e3949, - 0x204b83, - 0x2eb149, - 0x233646, - 0x23364c, - 0x217348, - 0x3d7e08, - 0x3759c9, - 0x2b828e, - 0x3752cb, - 0x32cecc, - 0x21c183, - 0x28764c, - 0x3c7709, - 0x302187, - 0x234dcc, - 0x2b238a, - 0x23d544, - 0x3b27cd, - 0x287508, - 0x35460d, - 0x30d5c6, - 0x25078b, - 0x312189, - 0x38c407, - 0x2fb986, - 0x3be009, - 0x32a88a, - 0x31a548, - 0x2f0bc4, - 0x391e47, - 0x23b747, - 0x330ac4, - 0x215dc4, - 0x331609, - 0x268309, - 0x28dc48, - 0x2ed2c5, - 0x20b985, - 0x2045c6, - 0x3b2689, - 0x2646cd, - 0x2f8208, - 0x2044c7, - 0x213ac8, - 0x23ae06, - 0x3a1344, - 0x284505, - 0x3c3c46, - 0x3c4d44, - 0x3c7607, - 0x3d030a, - 0x20d144, - 0x20eec6, - 0x212fc9, - 0x212fcf, - 0x213ccd, - 0x214886, - 0x21c790, - 0x21cb86, - 0x21d287, - 0x21e347, - 0x21e34f, - 0x21f549, - 0x223f06, - 0x224f07, - 0x224f08, - 0x226e89, - 0x3b9c48, - 0x3ac987, - 0x217283, - 0x22f5c6, - 0x3c5448, - 0x2b854a, - 0x387589, - 0x211c43, - 0x342486, - 0x263e8a, - 0x2ec387, - 0x301fca, - 0x366ece, - 0x21f686, - 0x30f8c7, - 0x22d3c6, - 0x243e86, - 0x39ad8b, - 0x216c8a, - 0x2c638d, - 0x3c4007, - 0x267788, - 0x267789, - 0x26778f, - 0x2ab00c, - 0x269509, - 0x2d368e, - 0x245e4a, - 0x228e06, - 0x3009c6, - 0x31b40c, - 0x31dc0c, - 0x337a48, - 0x35f9c7, - 0x237085, - 0x22adc4, - 0x32fa8e, - 0x264b44, - 0x320907, - 0x3d5d8a, - 0x22de54, - 0x22f00f, - 0x21e508, - 0x22f488, - 0x36174d, - 0x36174e, - 0x22f909, - 0x2309c8, - 0x2309cf, - 0x234acc, - 0x234acf, - 0x235c87, - 0x237eca, - 0x2467cb, - 0x2392c8, - 0x23b187, - 0x25e68d, - 0x32d486, - 0x3b2986, - 0x23e9c9, - 0x259788, - 0x243c88, - 0x243c8e, - 0x2c5e47, - 0x2f6645, - 0x246a85, - 0x20a544, - 0x206946, - 0x28db48, - 0x332f43, - 0x2f190e, - 0x25ea48, - 0x2a5ccb, - 0x2719c7, - 0x225b05, - 0x2877c6, - 0x2aeb87, - 0x3139c8, - 0x268a49, - 0x3cbc05, - 0x288d08, - 0x217b46, - 0x3a79ca, - 0x32f989, - 0x234e89, - 0x234e8b, - 0x33dd48, - 0x330989, - 0x2ed386, - 0x36baca, - 0x2b4aca, - 0x2380cc, - 0x3448c7, - 0x2c91ca, - 0x34a50b, - 0x34a519, - 0x323088, - 0x22a845, - 0x25e846, - 0x2167c9, - 0x2c98c6, - 0x387cca, - 0x211d06, - 0x2227c4, - 0x2cb1cd, - 0x331247, - 0x2227c9, - 0x249845, - 0x249a88, - 0x24a0c9, - 0x24bd44, - 0x24c9c7, - 0x24c9c8, - 0x24db87, - 0x266708, - 0x2529c7, - 0x338285, - 0x25928c, - 0x259989, - 0x2def0a, - 0x3ab249, - 0x2eb249, - 0x38bf4c, - 0x25c58b, - 0x25dbc8, - 0x25ef88, - 0x262984, - 0x286b48, - 0x287dc9, - 0x2b2447, - 0x213206, - 0x29fd87, - 0x291009, - 0x31f6cb, - 0x326207, - 0x390347, - 0x32bc07, - 0x354584, - 0x354585, - 0x2db805, - 0x3577cb, - 0x3b7bc4, - 0x34fa88, - 0x2f478a, - 0x217c07, - 0x3d7a47, - 0x290852, - 0x292a46, - 0x231b06, - 0x31fe4e, - 0x293286, - 0x2967c8, - 0x296e0f, - 0x3549c8, - 0x39b9c8, - 0x343b4a, - 0x343b51, - 0x2a48ce, - 0x20228a, - 0x20228c, - 0x230bc7, - 0x230bd0, - 0x3c1a48, - 0x2a4ac5, - 0x2af8ca, - 0x3c4d8c, - 0x29944d, - 0x3c1cc6, - 0x3c1cc7, - 0x3c1ccc, - 0x3ced4c, - 0x31540c, - 0x2b028b, - 0x38f704, - 0x22d944, - 0x2b1c49, - 0x341647, - 0x39ff49, - 0x2b4909, - 0x2b2047, - 0x2b2206, - 0x2b2209, - 0x2b2603, - 0x37118a, - 0x316987, - 0x36c5cb, - 0x2c620a, - 0x2dc9c4, - 0x37c586, - 0x283a89, - 0x338544, - 0x2f630a, - 0x242b05, - 0x2bfe85, - 0x2bfe8d, - 0x2c01ce, - 0x2c1945, - 0x33e186, - 0x22a3c7, - 0x25950a, - 0x2dafc6, - 0x2e8fc4, - 0x3b2b47, - 0x2cd98b, - 0x266407, - 0x24e444, - 0x310fc6, - 0x310fcd, - 0x2ddfcc, - 0x20cd46, - 0x2f840a, - 0x26ce06, - 0x230448, - 0x380b87, - 0x2bd50a, - 0x23ef46, - 0x203743, - 0x203746, - 0x3c52c8, - 0x2b1dca, - 0x287107, - 0x287108, - 0x2d3344, - 0x28fe87, - 0x2d6748, - 0x29bcc8, - 0x272788, - 0x2d1cca, - 0x2e1985, - 0x2e1c07, - 0x2566d3, - 0x26b306, - 0x376588, - 0x221349, - 0x2431c8, - 0x23c08b, - 0x39d088, - 0x287cc4, - 0x3d2b06, - 0x319406, - 0x30e6c9, - 0x3d7fc7, - 0x259388, - 0x29be46, + 0x20cb83, + 0x33cf47, + 0x2f67cb, + 0x2153c3, + 0x283208, + 0x331607, + 0x349506, + 0x234d45, + 0x363749, + 0x24d688, + 0x37e649, + 0x3ae5d0, + 0x37e64b, + 0x3aaa09, + 0x2069c3, + 0x2fed09, + 0x23b286, + 0x23b28c, + 0x235f88, + 0x3e5c48, + 0x35c449, + 0x2cd20e, + 0x34be0b, + 0x2c340c, + 0x203b43, + 0x279d4c, + 0x203b49, + 0x300187, + 0x23c4cc, + 0x2c024a, + 0x21d684, + 0x21d68d, + 0x279c08, + 0x20f7cd, + 0x28a5c6, + 0x25dd0b, + 0x314149, + 0x2674c7, + 0x32cdc6, + 0x3339c9, + 0x35310a, + 0x30a088, + 0x304044, + 0x2bc2c7, + 0x24ea07, + 0x202744, + 0x2208c4, + 0x209cc9, + 0x30d489, + 0x20a888, + 0x2303c5, + 0x2140c5, + 0x20f086, + 0x21d549, + 0x283e4d, + 0x216d88, + 0x20ef87, + 0x234dc8, + 0x25b186, + 0x3e11c4, + 0x26b385, + 0x3e2f06, + 0x3e7984, + 0x203a47, + 0x20588a, + 0x216784, + 0x21a186, + 0x21a989, + 0x21a98f, + 0x21cc4d, + 0x21e706, + 0x224550, + 0x224946, + 0x226187, + 0x227f07, + 0x227f0f, + 0x229309, + 0x22cc86, + 0x22e907, + 0x22e908, + 0x22ed09, + 0x206e88, + 0x317a87, + 0x20c903, + 0x391906, + 0x37a588, + 0x2cd4ca, + 0x204189, + 0x22cb43, + 0x363506, + 0x34ac4a, + 0x282647, + 0x2fffca, + 0x31034e, + 0x229446, + 0x3d6847, + 0x24b006, + 0x203c06, + 0x38640b, + 0x218d8a, + 0x2f6e0d, + 0x2f53c7, + 0x274588, + 0x274589, + 0x27458f, + 0x2fb78c, + 0x2fb0c9, + 0x287bce, + 0x2b118a, + 0x20c606, + 0x2e9106, + 0x30cd4c, + 0x3bb08c, + 0x3d8388, + 0x338487, + 0x208c45, + 0x347e84, + 0x36430e, + 0x3109c4, + 0x3406c7, + 0x36be4a, + 0x3806d4, + 0x38a70f, + 0x2280c8, + 0x3917c8, + 0x38c34d, + 0x38c34e, + 0x3b4bc9, + 0x238308, + 0x23830f, + 0x23c1cc, + 0x23c1cf, + 0x23d147, + 0x23f90a, + 0x240acb, + 0x241348, + 0x244547, + 0x24be0d, + 0x362546, + 0x21d846, + 0x247bc9, + 0x26bac8, + 0x24db08, + 0x24db0e, + 0x26b907, + 0x308585, + 0x24f085, + 0x220744, + 0x3497c6, + 0x20a788, + 0x3a2983, + 0x2bf30e, + 0x24c1c8, + 0x3e534b, + 0x3c7807, + 0x2332c5, + 0x279ec6, + 0x2ba1c7, + 0x33e8c8, + 0x32c449, + 0x23cb05, + 0x2925c8, + 0x22fe06, + 0x3b3cca, + 0x364209, + 0x23c589, + 0x23c58b, + 0x33b7c8, + 0x202609, + 0x230486, + 0x3c298a, + 0x2a104a, + 0x23fb0c, + 0x371707, + 0x277d4a, + 0x39f78b, + 0x39f799, + 0x351a48, + 0x24d985, + 0x24bfc6, + 0x296489, + 0x250206, + 0x22b24a, + 0x2163c6, + 0x232d44, + 0x2dce0d, + 0x32d187, + 0x232d49, + 0x252185, + 0x2522c8, + 0x252f49, + 0x254744, + 0x254e07, + 0x254e08, + 0x255287, + 0x273b48, + 0x25cac7, + 0x2dfac5, + 0x26420c, + 0x2646c9, + 0x3b930a, + 0x266cc9, + 0x2fee09, + 0x26700c, + 0x26974b, + 0x26ac88, + 0x26bcc8, + 0x26f504, + 0x290988, + 0x291d49, + 0x2c0307, + 0x21abc6, + 0x2a9607, + 0x3d4bc9, + 0x21070b, + 0x247047, + 0x21fc47, + 0x3e3507, + 0x20f744, + 0x20f745, + 0x2e8cc5, + 0x357f0b, + 0x30df44, + 0x3b6648, + 0x25974a, + 0x22fec7, + 0x3e5007, + 0x299452, + 0x3d4786, + 0x239c86, + 0x340ace, + 0x3e5786, + 0x29ddc8, + 0x29f2cf, + 0x20fb88, + 0x243948, + 0x2e75ca, + 0x2e75d1, + 0x2af74e, + 0x20294a, + 0x20294c, + 0x238507, + 0x238510, + 0x3d9e48, + 0x2af945, + 0x2ba4ca, + 0x3e79cc, + 0x2a204d, + 0x20e446, + 0x20e447, + 0x20e44c, + 0x20f3cc, + 0x26a98c, + 0x39304b, + 0x3a4f04, + 0x205604, + 0x2be009, + 0x37de47, + 0x361f89, + 0x2a0e89, + 0x2bff07, + 0x2c00c6, + 0x2c00c9, + 0x2c04c3, + 0x2b2fca, + 0x37a447, + 0x37b94b, + 0x2f6c8a, + 0x25bfc4, + 0x3ceb46, + 0x28cd09, + 0x2f44c4, + 0x2e4e4a, + 0x302645, + 0x2d1b85, + 0x2d1b8d, + 0x2d1ece, + 0x2722c5, + 0x33bc06, + 0x24d507, + 0x25d40a, + 0x231c86, + 0x37ee04, + 0x301887, + 0x300e4b, + 0x273847, + 0x2420c4, + 0x316546, + 0x31654d, + 0x2eba8c, + 0x3d1a86, + 0x216f8a, + 0x221d46, + 0x227bc8, + 0x2fd2c7, + 0x2dafca, + 0x3e7346, + 0x28aa83, + 0x354806, + 0x213448, + 0x36dc0a, + 0x25aa07, + 0x25aa08, + 0x2985c4, + 0x2a5c47, + 0x31f5c8, + 0x2f3cc8, + 0x2f1188, + 0x32a8ca, + 0x2efe85, + 0x2cb207, + 0x260e13, + 0x276586, + 0x38d188, + 0x22bb49, + 0x24d008, + 0x28794b, + 0x2ca108, + 0x2eb7c4, + 0x326e86, + 0x324186, + 0x3423c9, + 0x2dae07, + 0x264308, + 0x2aa246, 0x200bc4, - 0x3a5005, - 0x2cef08, - 0x201d8a, - 0x2cae48, - 0x2d0246, - 0x29cc4a, - 0x28e8c8, - 0x2d57c8, - 0x2d6d48, - 0x2d7546, - 0x2da186, - 0x3aad0c, - 0x2da650, - 0x2a2c05, - 0x3547c8, - 0x3b48d0, - 0x3547d0, - 0x3a5dce, - 0x3aa98e, - 0x3aa994, - 0x3b164f, - 0x3b1a06, - 0x202151, - 0x330b93, - 0x331008, - 0x32efc5, - 0x316308, - 0x383a45, - 0x33580c, - 0x295f49, - 0x22ac09, - 0x2fa547, - 0x265e49, - 0x387887, - 0x35cfc6, - 0x284307, - 0x204005, - 0x208d83, - 0x23fc83, - 0x210484, - 0x34290d, - 0x34944f, + 0x3de805, + 0x33f188, + 0x39000a, + 0x2dca88, + 0x2e1046, + 0x2a6a8a, + 0x36a688, + 0x3bc6c8, + 0x2e50c8, + 0x2e5906, + 0x2e7d46, + 0x3b20cc, + 0x2e8310, + 0x2e8705, + 0x20f988, + 0x288910, + 0x20f990, + 0x3ae44e, + 0x3b1d4e, + 0x3b1d54, + 0x3ba5cf, + 0x3ba986, + 0x202811, + 0x209613, + 0x32cf48, + 0x363c05, + 0x283748, + 0x32d685, + 0x348fcc, + 0x2718c9, + 0x310809, + 0x2fbfc7, + 0x368f49, + 0x3a8747, + 0x313386, + 0x26b187, + 0x2649c5, + 0x212bc3, + 0x21e803, + 0x2433c4, + 0x21574d, + 0x3c3dcf, 0x200c05, - 0x335706, - 0x212b07, - 0x2170c7, - 0x207b46, - 0x207b4b, - 0x2a5705, - 0x25af46, - 0x300847, - 0x252ec9, - 0x21fcc6, - 0x389205, - 0x36820b, - 0x3a8f06, - 0x207f45, - 0x241d88, - 0x292808, - 0x2a77cc, - 0x2a77d0, - 0x3524c9, - 0x2b2b47, - 0x34e14b, - 0x2e59c6, - 0x3ac84a, - 0x306a4b, - 0x2e85ca, - 0x2e8846, - 0x2e9205, - 0x3249c6, - 0x27c588, - 0x2fa60a, - 0x3613dc, - 0x2f108c, - 0x2f1388, - 0x22a7c5, - 0x38ef47, - 0x2b7ec6, - 0x367985, - 0x216b46, - 0x207d08, - 0x2bedc7, - 0x2b8188, - 0x26b3ca, - 0x212c0c, - 0x3331c9, - 0x2e2347, - 0x227784, - 0x246b46, - 0x39b54a, - 0x2b4a05, - 0x215a4c, - 0x219408, - 0x28eb48, - 0x227d4c, - 0x3d2c4c, - 0x2dc509, - 0x2dc747, - 0x35b44c, - 0x220284, - 0x24baca, - 0x309ccc, - 0x25204b, - 0x25450b, - 0x254c06, - 0x257c47, - 0x230e07, - 0x230e0f, - 0x303551, - 0x2e03d2, - 0x25a48d, - 0x25a48e, - 0x25a7ce, - 0x3b1808, - 0x3b1812, - 0x262b08, - 0x221987, - 0x250bca, - 0x2a86c8, - 0x293245, - 0x2b5e4a, - 0x21cf07, - 0x2e6804, - 0x201783, - 0x237b05, - 0x343dc7, - 0x306547, - 0x29964e, - 0x31e1cd, - 0x3372c9, - 0x248405, - 0x356b83, - 0x34bf46, - 0x25b545, - 0x2a5f08, - 0x321b09, - 0x25e885, - 0x25e88f, - 0x2d9047, - 0x2138c5, - 0x27238a, - 0x3dc646, - 0x2f3f49, - 0x38200c, - 0x3cbd09, - 0x205b86, - 0x2f458c, - 0x33d6c6, - 0x3013c8, - 0x301cc6, - 0x340fc6, - 0x2b6944, - 0x315343, - 0x318f4a, - 0x32bf11, - 0x26c5ca, - 0x25c9c5, - 0x27e1c7, - 0x257107, - 0x2d6844, - 0x2d684b, - 0x209908, - 0x2bdbc6, - 0x233d05, - 0x322804, - 0x234449, + 0x348ec6, + 0x22a447, + 0x235d07, + 0x355bc6, + 0x355bcb, + 0x2b0505, + 0x289146, + 0x3baf07, + 0x25e109, + 0x22eb86, + 0x3881c5, + 0x20368b, + 0x20de06, + 0x22f7c5, + 0x24fa08, + 0x2a3b08, + 0x2b3ccc, + 0x2b3cd0, + 0x2b89c9, + 0x2cad07, + 0x34de4b, + 0x2f0c46, + 0x31794a, + 0x38cf0b, + 0x314c4a, + 0x2f9406, + 0x2fae05, + 0x331506, + 0x292a88, + 0x3a5c0a, + 0x38bfdc, + 0x30450c, + 0x304808, + 0x24d905, + 0x38f6c7, + 0x2cce46, + 0x39da45, + 0x2210c6, + 0x355d88, + 0x2d0c47, + 0x2cd108, + 0x27664a, + 0x35b5cc, + 0x3a2c09, + 0x35b847, + 0x243e44, + 0x204a06, + 0x2434ca, + 0x2a0f85, + 0x22054c, + 0x220c08, + 0x236f48, + 0x32794c, + 0x33878c, + 0x35cf89, + 0x361d87, + 0x24808c, + 0x2fce84, + 0x322a4a, + 0x3e23cc, + 0x254fcb, + 0x255c8b, + 0x259186, + 0x25f087, + 0x238747, + 0x23874f, + 0x311a51, + 0x2ee312, + 0x25f3cd, + 0x25f3ce, + 0x25f70e, + 0x3ba788, + 0x3ba792, + 0x2fc688, + 0x2b1987, + 0x259c4a, + 0x2125c8, + 0x3e5745, + 0x2c618a, + 0x224cc7, + 0x2f0d84, + 0x20b5c3, + 0x23f1c5, + 0x2e7847, + 0x306587, + 0x2a224e, + 0x3dc44d, + 0x316209, + 0x207385, + 0x34f9c3, + 0x33e246, + 0x267c45, + 0x3e5588, + 0x22d149, + 0x24c005, + 0x24c00f, + 0x2c5f47, + 0x234bc5, + 0x3c81ca, + 0x20d746, + 0x246809, + 0x3599cc, + 0x37eec9, + 0x2111c6, + 0x25954c, + 0x3357c6, + 0x30fac8, + 0x38c686, + 0x278b86, + 0x2c6c44, + 0x386d83, + 0x3e380a, + 0x209211, + 0x2fb28a, + 0x3e19c5, + 0x263e87, + 0x261707, + 0x2e20c4, + 0x31f6cb, + 0x3cfec8, + 0x2cf7c6, + 0x23e5c5, + 0x257104, + 0x26f9c9, 0x2008c4, - 0x243ac7, - 0x349b05, - 0x349b07, - 0x320085, - 0x2535c3, - 0x221848, - 0x31650a, - 0x2172c3, - 0x2172ca, - 0x279006, - 0x25e60f, - 0x3d16c9, - 0x2f1890, - 0x2f7908, - 0x2d0749, - 0x29a347, - 0x310f4f, - 0x3977c4, - 0x2dbb84, - 0x21ca06, - 0x3ac686, - 0x2e7e8a, - 0x250346, - 0x398f87, - 0x30a7c8, - 0x30a9c7, - 0x30be87, - 0x30d84a, - 0x30c78b, - 0x32b1c5, - 0x2e0008, - 0x21b803, - 0x3c02cc, - 0x361acf, - 0x236e8d, - 0x257707, - 0x337409, - 0x22bac7, - 0x240b48, - 0x22e04c, - 0x287bc8, - 0x23ba88, - 0x328d4e, - 0x347494, - 0x3479a4, - 0x35e78a, - 0x37eacb, - 0x387944, - 0x387949, - 0x2eda08, - 0x247245, - 0x332a4a, - 0x291287, - 0x21f004, - 0x24af03, - 0x22f743, - 0x2375c4, - 0x234e83, - 0x224943, - 0x221b84, - 0x214503, - 0x211d83, - 0x2da646, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x214e03, + 0x218407, + 0x37e8c5, + 0x37e8c7, + 0x340d05, + 0x212483, + 0x2b1848, + 0x2484ca, + 0x235f03, + 0x235f0a, + 0x2ae286, + 0x24bd8f, + 0x26b889, + 0x2bf290, + 0x2e2248, + 0x2e1809, + 0x2a5007, + 0x3164cf, + 0x3c5fc4, + 0x2e9044, + 0x2247c6, + 0x25d8c6, + 0x252c0a, + 0x24cb06, + 0x2bcc47, + 0x317dc8, + 0x317fc7, + 0x3196c7, + 0x31aa0a, + 0x319fcb, + 0x271385, + 0x2edf48, + 0x20c183, + 0x3c17cc, + 0x2089cf, + 0x22158d, + 0x35e207, + 0x236c89, + 0x35d247, + 0x2cbd48, + 0x3808cc, + 0x2eb6c8, + 0x3e16c8, + 0x33438e, + 0x345b94, + 0x3460a4, + 0x360d8a, + 0x37ea8b, + 0x3a8804, + 0x3a8809, + 0x2c6848, + 0x24fe05, + 0x3a248a, + 0x2b39c7, + 0x258bc4, + 0x253c43, + 0x216543, + 0x23ec84, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x243543, + 0x216443, + 0x2e8306, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x21f6c3, 0x2000c2, - 0x24af03, - 0x203102, - 0x22f743, - 0x2375c4, - 0x234e83, - 0x224943, - 0x214503, - 0x2da646, - 0x20ce83, - 0x23f7c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x20d343, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x209c04, - 0x20ce83, - 0x23f7c3, + 0x253c43, + 0x216542, + 0x216543, + 0x23ec84, + 0x222bc3, + 0x343b43, + 0x243543, + 0x2e8306, + 0x2296c3, + 0x20cb83, + 0x793c8, + 0x216543, + 0x222bc3, + 0x2f5503, + 0x606296c3, + 0x7ca83, + 0x20cb83, + 0x60a01704, + 0xc1442, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x21b544, + 0x2296c3, + 0x20cb83, 0x2000c2, - 0x24e8c3, - 0x203102, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x207982, - 0x247502, - 0x203102, - 0x22f743, - 0x2037c2, + 0x28bb03, + 0x216542, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x204182, + 0x204042, + 0x216542, + 0x216543, + 0x2080c2, 0x2005c2, - 0x221b84, - 0x346484, - 0x2254c2, - 0x209c04, + 0x2b1b84, + 0x28d4c4, + 0x233ec2, + 0x21b544, 0x2003c2, - 0x23f7c3, - 0x214e03, - 0x254c06, - 0x210782, - 0x204cc2, - 0x222082, - 0x5421f943, - 0x54602283, - 0x57a46, - 0x57a46, - 0x250784, - 0x204783, - 0x8d9ca, - 0x14b54c, - 0x18840c, - 0xc9e8d, - 0x129245, - 0x8d14c, - 0x26807, - 0xd886, - 0x14a08, - 0x1b587, - 0x20048, - 0x19458a, - 0x109547, - 0x5528d385, - 0xdd949, - 0x3670b, - 0x1872cb, - 0x1c7a88, - 0x11f09, - 0x153a4a, - 0x17f08e, - 0x8f58d, - 0x1442fcb, - 0xdde8a, - 0xc284, - 0x5b086, - 0x12a3c8, - 0x18d648, - 0x39dc7, - 0xac85, - 0x10607, - 0x35309, - 0x1385c7, - 0xfcc8, - 0x229c9, - 0x48cc4, - 0x49945, - 0x16388e, - 0x18d2cd, - 0x11d08, - 0x556a1146, - 0x561669c8, - 0x772c8, - 0x13f6d0, - 0x5504c, - 0x636c7, - 0x64a07, - 0x6a8c7, - 0x73747, - 0x4582, - 0x113707, - 0x16e4c, - 0x17ba45, - 0x126bc7, - 0xa7686, - 0xa8c49, - 0xac2c8, - 0x5dc2, + 0x20cb83, + 0x21f6c3, + 0x259186, + 0x22a042, + 0x204a42, + 0x208f02, + 0x61e0fb83, + 0x62202943, + 0x62186, + 0x62186, + 0x25dd04, + 0x20d903, + 0x1a16cd, + 0xa60a, + 0x1a02cc, + 0x8d34c, + 0x62c691cf, + 0x7074d, + 0x15c104, + 0x75104, + 0xffd44, + 0x146c05, + 0x95d89, + 0x17488c, + 0x34347, + 0x17f06, + 0x1f2c8, + 0x22a87, + 0x29e88, + 0x1beaca, + 0x1e1c47, + 0x174ac9, + 0x632ea205, + 0xea209, + 0x6343df0b, + 0x123308, + 0x3ecb, + 0x17ce88, + 0x18484a, + 0x132bce, + 0x6397448a, + 0x12808d, + 0x1b4bcd, + 0x144ce0b, + 0xeb94a, + 0x1db84, + 0x53846, + 0x89288, + 0x1dcf08, + 0x3e1c7, + 0x1e485, + 0x63eabe08, + 0x1d74c7, + 0x51b89, + 0xf4547, + 0x1c74c8, + 0x32649, + 0x48404, + 0x48985, + 0xc9ce, + 0x1402c7, + 0x6462cd86, + 0xb8d0d, + 0x1cdd88, + 0xedb48, + 0x64b7cb46, + 0x6557cb48, + 0xb3588, + 0x13d150, + 0x5fc8c, + 0x70607, + 0x71b07, + 0x75c07, + 0x7c947, + 0xc342, + 0x1d8707, + 0x18f4c, + 0x116b05, + 0xb8847, + 0xb3b86, + 0xb4e49, + 0xb7288, + 0x1ec82, 0x5c2, - 0x190b46, - 0x1a87cb, - 0x1a8ac6, - 0x175f44, - 0x133a87, - 0x6d309, - 0x53889, - 0x120648, - 0x4b4c2, - 0x195789, - 0xd488, - 0xe7cca, - 0x12eac6, - 0xcd7c9, - 0xdde07, - 0xde549, - 0xdf8c8, - 0xe0887, - 0xe1909, - 0xe4485, - 0xe4810, - 0x1bb506, - 0x1339c5, - 0x930c7, - 0x6d84d, - 0x41c85, - 0xeb046, - 0xeb887, - 0xf2498, - 0x138948, - 0x17638a, - 0x129c2, - 0x542ca, - 0x64e0d, - 0x5c82, - 0x1c6b46, - 0x9d3c8, - 0x18fe88, - 0x70949, - 0x10b488, - 0x74e4e, - 0x70b88, - 0x14bf47, - 0x56766904, - 0xecd4d, - 0xfc9c5, - 0x1769c8, - 0x1ac248, - 0x105546, - 0x13602, - 0x72d04, - 0x64cc6, - 0xfd986, - 0x56934b0b, - 0x8c42, + 0x190a86, + 0x67cb, + 0x6ac6, + 0x15c9c4, + 0x10f887, + 0x5e789, + 0x932c9, + 0x1bc248, + 0x54202, + 0x1971c9, + 0x17988, + 0x104e4a, + 0x65ada54b, + 0x145149, + 0x12506, + 0xdf889, + 0xeb8c7, + 0xec009, + 0xed548, + 0xeeac7, + 0xefe09, + 0xf2185, + 0xf2550, + 0x1e84c6, + 0x10f7c5, + 0x120047, + 0xb6a4d, + 0x4ab45, + 0xfec06, + 0xff487, + 0x105518, + 0xf48c8, + 0x80d4a, + 0x4a02, + 0x663a540b, + 0x666df98a, + 0x55a4a, + 0x6334d, + 0x1702, + 0xd9c46, + 0x30846, + 0xa7248, + 0xb700a, + 0x46c88, + 0x79289, + 0x118d88, + 0x6f68e, + 0x16208, + 0x13e247, + 0x66bb0284, + 0x12764d, + 0x10ba05, + 0x1a2f48, + 0x4fec8, + 0x66eaf2c8, + 0x114786, + 0x6502, + 0xcf5c4, + 0x110b46, + 0x6724b348, + 0x13906, + 0x678ddecb, + 0xe042, + 0xacc09, + 0x12d408, + 0x164647, + 0x35b4a, + 0x40407, 0x401, - 0x5d807, - 0x10d203, - 0x55af2d04, - 0x55e98183, + 0x81, + 0x183c47, + 0x116348, + 0x642c1503, + 0x1616c4, + 0xc1508, + 0xc1708, + 0xc1908, + 0x69c07, + 0x9b583, + 0x64e40644, + 0x652a0803, 0xc1, - 0x1cf0c6, + 0x267c6, 0xc1, 0x201, - 0x1cf0c6, - 0x10d203, - 0x50803, - 0x81b84, - 0x305c7, - 0x50c7, - 0x145d285, - 0x4ff04, - 0x63807, - 0x3102, - 0x23d544, - 0x22f743, - 0x24f044, - 0x221b84, - 0x20ce83, - 0x221205, - 0x2158c3, - 0x259703, - 0x207ac5, - 0x2050c3, - 0x6e83, - 0x57a2f743, - 0x234e83, - 0x4f044, - 0x20c3, - 0x224943, + 0x267c6, + 0x9b583, + 0x65f36fc4, + 0x18b2c4, + 0x1a845, + 0x88e45, + 0x10f9c4, + 0x16684, + 0x54644, + 0x1c4b88, + 0x1866cc, + 0xe01, + 0x192c3, + 0x27804, + 0x1c4b88, + 0x677c4b88, + 0x674c3, + 0x79943, + 0x27d47, + 0x5f07, + 0x156d145, + 0x57e04, + 0x10dfc7, + 0x16542, + 0x88e04, + 0x21d684, + 0x216543, + 0x256d44, + 0x2b1b84, + 0x2296c3, + 0x22ba05, + 0x2203c3, + 0x24c343, + 0x355b45, + 0x201643, + 0x1df83, + 0x68a16543, + 0x222bc3, + 0x56d44, + 0x4f03, + 0x343b43, 0x200181, - 0xe943, - 0x211d83, - 0x346484, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x202443, - 0xa7c88, + 0x1b283, + 0x216443, + 0x28d4c4, + 0x21b544, + 0x2296c3, + 0x57743, + 0x20cb83, + 0x202b03, + 0x793c8, 0x2000c2, - 0x24af03, - 0x203102, - 0x22f743, - 0x234e83, - 0x20d343, + 0x253c43, + 0x216542, + 0x216543, + 0x222bc3, + 0x2f5503, 0x2005c2, - 0x221b84, - 0x214503, - 0x211d83, - 0x20ce83, - 0x204783, - 0x23f7c3, - 0x2050c3, - 0xa7c88, - 0x1daa47, - 0x3102, - 0x1a4f85, - 0x5518f, - 0xd8ec6, - 0x14441c8, - 0x10b88e, - 0x58a06dc2, - 0x324048, - 0x28e106, - 0x250086, - 0x305fc7, - 0x58e00c82, - 0x593d1548, - 0x210eca, - 0x263148, + 0x2b1b84, + 0x243543, + 0x216443, + 0x2296c3, + 0x20d903, + 0x20cb83, + 0x201643, + 0x8904, + 0x793c8, + 0xf0007, + 0x16542, + 0x13f105, + 0x5fdcf, + 0xfa946, + 0x1472588, + 0x1190ce, + 0x69a0bc42, + 0x20bc88, + 0x20ad46, + 0x257f86, + 0x39a587, + 0x69e00c82, + 0x6a2bf108, + 0x22588a, + 0x270088, 0x200ac2, - 0x3167c9, - 0x32b207, - 0x213186, - 0x221589, - 0x2e1d44, - 0x206586, - 0x2c5144, - 0x295a04, - 0x258c89, - 0x309a06, - 0x2270c5, - 0x267345, - 0x22fe87, - 0x2c2207, - 0x292c84, - 0x35aa06, - 0x2f3705, - 0x20fe45, - 0x25ca85, - 0x2b0587, - 0x271805, - 0x24a549, - 0x321605, - 0x313b04, - 0x2daf07, - 0x32e50e, - 0x36afc9, - 0x31fd09, - 0x344706, - 0x240288, - 0x244b0b, - 0x36950c, - 0x34d146, - 0x32cd87, - 0x2b3f45, - 0x215dca, - 0x28dd49, - 0x2013c9, - 0x3d6746, - 0x300605, - 0x246e05, - 0x354009, - 0x25cc0b, - 0x3a9786, - 0x352886, - 0x2044c4, - 0x26de46, - 0x2f66c8, - 0x3ba3c6, - 0x2aa506, - 0x3ce108, - 0x3d4887, - 0x3d6509, - 0x3d9a85, - 0xa7c88, - 0x3cbb84, - 0x30c404, - 0x20b805, - 0x345409, - 0x220d87, - 0x220d8b, - 0x223b8a, - 0x2293c5, - 0x5960f7c2, - 0x2c60c7, - 0x59a2a9c8, - 0x3d6987, - 0x2c8445, - 0x34678a, - 0x3102, - 0x27b24b, - 0x27f0ca, - 0x24a9c6, - 0x207683, - 0x2aee0d, - 0x3ade4c, - 0x3dcb8d, - 0x232985, - 0x27bf05, - 0x332f87, - 0x20a3c9, - 0x210dc6, - 0x2501c5, - 0x2ea2c8, - 0x26dd43, - 0x2f9748, - 0x26dd48, - 0x2c71c7, - 0x36aac8, - 0x3adc49, - 0x2d0f07, - 0x2c58c7, - 0x25d108, - 0x29b744, - 0x29b747, - 0x30d4c8, - 0x35ee06, - 0x37c6cf, - 0x26d507, - 0x35a506, - 0x2dc885, - 0x222203, - 0x248b47, - 0x38b103, - 0x24e006, - 0x24fe06, - 0x251286, - 0x295605, - 0x266703, - 0x395408, - 0x38de49, - 0x39da0b, - 0x251408, - 0x252685, - 0x253d85, - 0x59eb1d82, - 0x2843c9, - 0x221c07, - 0x25afc5, - 0x258b87, - 0x25a346, - 0x383485, - 0x25b38b, - 0x25dbc4, - 0x262d05, - 0x262e47, - 0x279746, - 0x279b85, - 0x286d47, - 0x287947, - 0x2d7f44, - 0x28cf4a, - 0x28ed48, - 0x244dc9, - 0x36a0c5, - 0x2b42c6, - 0x2f688a, - 0x267246, - 0x22e407, - 0x2c954d, - 0x2a5249, - 0x36b2c5, - 0x321d07, - 0x32e908, - 0x330008, - 0x3491c7, - 0x367306, - 0x2195c7, - 0x24f243, - 0x309984, + 0x37b789, + 0x2713c7, + 0x21ab46, + 0x2b1589, + 0x2cb344, + 0x349406, + 0x2d8d04, + 0x223984, + 0x263789, + 0x3e2106, + 0x236b05, + 0x274145, + 0x3e04c7, + 0x2d3b87, + 0x2d8684, + 0x322006, + 0x3061c5, + 0x20b585, + 0x238cc5, + 0x337047, + 0x3c7645, + 0x2533c9, + 0x3411c5, + 0x33ea04, + 0x231bc7, + 0x379ece, + 0x208509, + 0x340989, + 0x36ce06, + 0x249048, + 0x370e4b, + 0x2ab90c, + 0x31a746, + 0x2c32c7, + 0x2f19c5, + 0x31270a, + 0x20a989, + 0x201189, + 0x207d06, + 0x3bacc5, + 0x24f485, + 0x385e09, + 0x238e4b, + 0x3871c6, + 0x352106, + 0x20ef84, + 0x323bc6, + 0x308608, + 0x3cd246, + 0x228d06, + 0x204b88, + 0x206347, + 0x207ac9, + 0x20a245, + 0x793c8, + 0x3d7444, + 0x319c44, + 0x213f45, + 0x344589, + 0x22adc7, + 0x22adcb, + 0x22c88a, + 0x232345, + 0x6a606e82, + 0x2f6b47, + 0x6aa34fc8, + 0x207f47, + 0x21c245, + 0x2c858a, + 0x16542, + 0x289c0b, + 0x28ab0a, + 0x22bd06, + 0x2122c3, + 0x214ccd, + 0x3c338c, + 0x3dec0d, + 0x29e685, + 0x2bdd45, + 0x3a29c7, + 0x214609, + 0x225786, + 0x24c985, + 0x37f7c8, + 0x2d9c83, + 0x3588c8, + 0x323ac8, + 0x39f407, + 0x3c7188, + 0x2251c9, + 0x2d7a47, + 0x2f6347, + 0x36cfc8, + 0x37b644, + 0x37b647, + 0x28a4c8, + 0x361486, + 0x205acf, + 0x323607, + 0x321b06, + 0x361ec5, + 0x22c3c3, + 0x250b47, + 0x251243, + 0x255446, + 0x257d06, + 0x25a606, + 0x29c885, + 0x273b43, + 0x396e48, + 0x38b949, + 0x3a3c8b, + 0x25a788, + 0x25c785, + 0x25eb45, + 0x6ae5c082, + 0x26b249, + 0x3d1907, + 0x2891c5, + 0x263687, + 0x264dc6, + 0x3b2605, + 0x267a8b, + 0x26ac84, + 0x26fc45, + 0x26fd87, + 0x281a06, + 0x281e45, + 0x290dc7, + 0x291487, + 0x2ae244, + 0x37468a, + 0x297688, + 0x371109, + 0x2acac5, + 0x347486, + 0x3087ca, + 0x274046, + 0x23b8c7, + 0x2780cd, + 0x2b0049, + 0x394d85, + 0x37d287, + 0x32bbc8, + 0x36c888, + 0x3c3ac7, + 0x3ce246, + 0x22d347, + 0x257783, + 0x357f04, 0x380f85, - 0x3aa087, - 0x3afcc9, - 0x226488, - 0x22e305, - 0x249204, - 0x25dd85, - 0x266acd, + 0x3b1447, + 0x3bbe49, + 0x287f08, + 0x23b7c5, + 0x382fc4, + 0x2574c5, + 0x26510d, 0x200cc2, - 0x2b71c6, + 0x221ec6, + 0x2f8e06, + 0x33f34a, + 0x39e886, + 0x3afc45, + 0x2d91c5, + 0x2d91c7, + 0x3b3b0c, + 0x2b340a, + 0x298d86, + 0x2e7c45, + 0x323a06, + 0x299287, + 0x29ab06, + 0x29c78c, + 0x2b16c9, + 0x6b226c47, + 0x29f685, + 0x29f686, + 0x2a0288, + 0x24c885, + 0x2b0785, + 0x2b2048, + 0x2b224a, + 0x6b6870c2, + 0x6ba10f82, + 0x368b05, + 0x317b83, + 0x23d9c8, + 0x20b383, + 0x2b24c4, + 0x24694b, + 0x2231c8, + 0x2c1bc8, + 0x6bf4a9c9, + 0x2b8309, + 0x2b8c06, + 0x2b9e48, + 0x2ba049, + 0x2ba946, + 0x2baac5, + 0x251986, + 0x2bb089, + 0x2d46c7, + 0x24e2c6, + 0x273307, + 0x37bd07, + 0x39d584, + 0x6c2f4bc9, + 0x39dc88, + 0x2bf008, + 0x200e07, + 0x2dc706, + 0x20db89, + 0x257f47, + 0x3c840a, + 0x3ce388, + 0x21f107, + 0x221886, + 0x29ac4a, + 0x3a6c88, + 0x2f8885, + 0x22f6c5, + 0x31bd47, + 0x324849, + 0x32864b, + 0x3bc408, + 0x341249, + 0x25b607, + 0x2cdbcc, + 0x2ce30c, + 0x2ce60a, + 0x2ce88c, + 0x2d8888, + 0x2d8a88, + 0x2d8c84, + 0x2d9409, + 0x2d9649, + 0x2d988a, + 0x2d9b09, + 0x2d9e87, + 0x3cb8cc, + 0x3e7f06, + 0x277a88, + 0x274106, + 0x392b46, + 0x394c87, + 0x3ab788, + 0x3499cb, + 0x207e07, + 0x263fc9, + 0x28d5c9, + 0x252907, + 0x24b5c4, + 0x26bfc7, + 0x2d2bc6, + 0x218946, + 0x217145, + 0x2db8c8, + 0x310704, + 0x310706, + 0x2b32cb, + 0x266749, + 0x25b246, + 0x228f09, + 0x214006, + 0x38f0c8, + 0x271f43, + 0x3bae45, + 0x218a89, + 0x3e97c5, + 0x308104, + 0x3b7146, + 0x36aa05, + 0x260006, + 0x31c407, + 0x2109c6, + 0x2374cb, + 0x3c2887, + 0x267786, + 0x27e3c6, + 0x3e0586, + 0x2d8649, + 0x20308a, + 0x2cfdc5, + 0x2fcb0d, + 0x2b2346, + 0x259946, + 0x2e2146, + 0x227b45, + 0x2f2847, + 0x233587, + 0x27ec0e, + 0x216443, + 0x2dc6c9, + 0x3a1c09, + 0x312b07, + 0x276e87, + 0x291945, + 0x2f3e45, + 0x6c609e0f, + 0x2e1a47, + 0x2e1c08, + 0x2e1f04, + 0x2e2446, + 0x6ca4f102, + 0x2e5b86, + 0x2e8306, + 0x30f40e, + 0x35870a, + 0x2c7906, + 0x21498a, + 0x20d109, + 0x23f7c5, + 0x30bfc8, + 0x3dc706, + 0x2be208, + 0x343648, + 0x285dcb, + 0x39a685, + 0x3c76c8, + 0x204ccc, + 0x21c107, 0x259b86, - 0x2f8d0a, - 0x394dc6, - 0x39b485, - 0x2c5605, - 0x2c5607, - 0x3a780c, - 0x27714a, - 0x290506, - 0x202fc5, - 0x26dc86, - 0x290687, - 0x292e86, - 0x29550c, - 0x2216c9, - 0x5a3cf547, - 0x2971c5, - 0x2971c6, - 0x297c08, - 0x2bcd85, - 0x2a5985, - 0x2a6c88, - 0x2a6e8a, - 0x5a67bc02, - 0x5aa05942, - 0x2fd185, - 0x26c143, - 0x22bf08, - 0x20bbc3, - 0x2a7104, - 0x2f408b, - 0x3ce688, - 0x31be08, - 0x5af26609, - 0x2ad349, - 0x2adb06, - 0x2ae808, - 0x2aea09, - 0x2afd86, - 0x2aff05, - 0x249346, - 0x2b0749, - 0x2ba387, - 0x2fdf06, - 0x21d0c7, - 0x36c987, - 0x21fac4, - 0x5b338c49, - 0x367bc8, - 0x3d1448, - 0x239f07, - 0x2ca906, - 0x204a09, - 0x250047, - 0x36744a, - 0x37b0c8, - 0x20cf87, - 0x20ed46, - 0x28c74a, - 0x2ff188, - 0x2e68c5, - 0x227385, - 0x355107, - 0x311c49, - 0x3179cb, - 0x36dec8, - 0x321689, - 0x251b47, - 0x2bc08c, - 0x2bc94c, - 0x2bcc4a, - 0x2bcecc, - 0x2c4cc8, - 0x2c4ec8, - 0x2c50c4, - 0x2c6949, - 0x2c6b89, - 0x2c6dca, - 0x2c7049, - 0x2c7387, - 0x3d6d4c, - 0x20d986, - 0x2c8f08, - 0x267306, - 0x3a35c6, - 0x36b1c7, - 0x36bd08, - 0x206b4b, - 0x3d6847, - 0x258949, - 0x27e309, - 0x2845c7, - 0x2c5384, - 0x200fc7, - 0x2fe8c6, - 0x20e3c6, - 0x2f85c5, - 0x3d8108, - 0x295e44, - 0x295e46, - 0x27700b, - 0x371489, - 0x23aec6, - 0x2aa709, - 0x20b8c6, - 0x201f88, - 0x20fb43, - 0x300785, - 0x21bdc9, - 0x221d85, - 0x353404, - 0x2785c6, - 0x237485, - 0x2553c6, - 0x310047, - 0x34a406, - 0x22c7cb, - 0x36b9c7, - 0x247c46, - 0x2dcd86, - 0x22ff46, - 0x292c49, - 0x2f200a, - 0x2bdec5, - 0x3a900d, - 0x2a6f86, - 0x2f4986, - 0x2f1786, - 0x2303c5, - 0x2e4b07, - 0x225dc7, - 0x275c0e, - 0x211d83, - 0x2ca8c9, - 0x333449, - 0x22fbc7, - 0x26bc07, - 0x2a0b85, - 0x22e8c5, - 0x5b73174f, - 0x2d0987, - 0x2d0b48, - 0x2d2284, - 0x2d2586, - 0x5ba46b02, - 0x2d77c6, - 0x2da646, - 0x33360e, - 0x2f958a, - 0x3d1cc6, - 0x21ae4a, - 0x3dc989, - 0x23e105, - 0x3b21c8, - 0x31e486, - 0x29e0c8, - 0x2fbb08, - 0x27ad0b, - 0x3060c5, - 0x271888, - 0x3ce24c, - 0x2c8307, - 0x250b06, - 0x2fa0c8, - 0x206808, - 0x5be4dc02, - 0x20634b, - 0x3d9c89, - 0x28d809, - 0x21bc47, - 0x3a8d48, - 0x5c39b048, - 0x20c8cb, - 0x3204c9, - 0x25c24d, - 0x320ec8, - 0x28c948, - 0x5c601e02, - 0x31fc44, - 0x5ca28002, - 0x3b1fc6, - 0x5ce06ec2, - 0x2ee48a, - 0x2a5806, - 0x26c9c8, - 0x3c11c8, - 0x255d06, - 0x32d286, - 0x2f7686, - 0x2a5e85, - 0x23a104, - 0x5d229a44, - 0x357fc6, - 0x298687, - 0x5d60d5c7, - 0x38d08b, - 0x3d6b89, - 0x27bf4a, - 0x2039c4, - 0x2c5748, - 0x2fdccd, - 0x2efb09, - 0x2efd48, - 0x2effc9, - 0x2f2484, - 0x246684, - 0x39f245, - 0x36988b, - 0x3ce606, - 0x357e05, - 0x2dc089, - 0x35aac8, - 0x229bc4, - 0x215f49, - 0x3d2685, - 0x2c2248, - 0x2c5f87, - 0x320108, - 0x283c86, - 0x3b9b07, - 0x2df3c9, - 0x368389, - 0x207fc5, - 0x2af585, - 0x5da0a202, - 0x3138c4, - 0x212e85, - 0x305ec6, - 0x312845, - 0x2bac47, - 0x2eedc5, - 0x21dd04, - 0x3447c6, - 0x250247, - 0x2331c6, - 0x318745, - 0x20b208, - 0x28e305, - 0x20e8c7, - 0x21f309, - 0x3715ca, - 0x226987, - 0x22698c, - 0x227086, - 0x23f649, - 0x3826c5, - 0x38fc08, - 0x225003, - 0x2ed345, - 0x2fe585, - 0x27da07, - 0x5de01482, - 0x2ea607, - 0x2e5b06, - 0x37e946, - 0x2e9086, - 0x206746, - 0x2fed88, - 0x316445, - 0x35a5c7, - 0x35a5cd, - 0x201783, - 0x20de45, - 0x272147, - 0x2ea948, - 0x271d05, - 0x215048, - 0x39fe46, - 0x2ddb07, - 0x2c8e45, - 0x306146, - 0x395985, - 0x210b8a, - 0x2f3ac6, - 0x26e607, - 0x2d0505, - 0x383d47, - 0x3b2ac4, - 0x353386, - 0x3b2105, - 0x2177cb, - 0x2fe749, - 0x24e9ca, - 0x208048, - 0x304588, - 0x313f4c, - 0x382c47, - 0x308288, - 0x309f88, - 0x30f645, - 0x354eca, - 0x356b89, - 0x5e202302, - 0x3c2a06, - 0x227bc4, - 0x2bd2c9, - 0x3050c9, - 0x2769c7, - 0x2ef507, - 0x2b4789, - 0x2d1ec8, - 0x2d1ecf, - 0x219fc6, - 0x2dd60b, - 0x25b885, - 0x25b887, - 0x3794c9, - 0x2108c6, - 0x215ec7, - 0x2e0745, - 0x232884, - 0x380a46, - 0x220f44, - 0x2b6587, - 0x2b8e88, - 0x5e700508, - 0x300c85, - 0x300dc7, - 0x323209, - 0x206104, - 0x241848, - 0x5ea696c8, - 0x2d6844, - 0x2e6308, - 0x2fba44, - 0x3299c9, - 0x3a9305, - 0x5ee1a602, - 0x21a005, - 0x2e5145, - 0x32fe48, - 0x235ac7, - 0x5f2008c2, - 0x229b85, - 0x2d5646, - 0x233306, - 0x313888, - 0x315108, - 0x312806, - 0x3414c6, - 0x3dab09, - 0x37e886, - 0x21078b, - 0x316705, - 0x2a8606, - 0x3be9c8, - 0x335b86, - 0x339f46, - 0x21550a, - 0x20a80a, - 0x25f505, - 0x391307, - 0x2f5f46, - 0x5f6038c2, - 0x272287, - 0x23be05, - 0x2f6804, - 0x2f6805, - 0x2038c6, - 0x274347, - 0x21ca05, - 0x20a984, - 0x2d29c8, - 0x33a005, - 0x3c8e07, - 0x3d36c5, - 0x210ac5, - 0x26f1c4, - 0x26f1c9, - 0x2f3548, - 0x23a886, - 0x3bad86, - 0x28c486, - 0x5fb056c8, - 0x3058c7, - 0x30670d, - 0x306f4c, - 0x307549, - 0x307789, - 0x5ff77902, - 0x3d1203, - 0x2010c3, - 0x2fe985, - 0x3aa18a, - 0x341386, - 0x244545, - 0x311304, - 0x31130b, - 0x3344cc, - 0x334dcc, - 0x3350d5, - 0x335fcd, - 0x33b44f, - 0x33b812, - 0x33bc8f, - 0x33c052, - 0x33c4d3, - 0x33c98d, - 0x33cf4d, - 0x33d2ce, - 0x33d84e, - 0x33df4c, - 0x33e30c, - 0x33e74b, - 0x33f1ce, - 0x33fad2, - 0x34114c, - 0x341810, - 0x34d412, - 0x34e4cc, - 0x34eb8d, - 0x34eecc, - 0x3514d1, - 0x352a0d, - 0x35584d, - 0x355e4a, - 0x3560cc, - 0x35758c, - 0x357b0c, - 0x3588cc, - 0x35bd53, - 0x35c3d0, - 0x35c7d0, - 0x35d14d, - 0x35d74c, - 0x35e4c9, - 0x360a4d, - 0x360d93, - 0x362211, - 0x362a13, - 0x363ecf, - 0x36428c, - 0x36458f, - 0x36494d, - 0x364f4f, - 0x365310, - 0x365d8e, - 0x36d30e, - 0x36e510, - 0x36efcd, - 0x36f94e, - 0x36fccc, - 0x371853, - 0x3737ce, - 0x373e50, - 0x374251, - 0x37468f, - 0x374a53, - 0x37748d, - 0x3777cf, - 0x377b8e, - 0x378110, - 0x378509, - 0x379710, - 0x379d0f, - 0x37a38f, - 0x37a752, - 0x37ce4e, - 0x37d84d, - 0x37dfcd, - 0x37e30d, - 0x37f7cd, - 0x37fb0d, - 0x37fe50, - 0x38024b, + 0x36a848, + 0x349688, + 0x6ce4ba82, + 0x32e38b, + 0x211e89, + 0x20a449, + 0x3c2187, + 0x3a8bc8, + 0x6d21e1c8, + 0x32c1cb, + 0x268d09, + 0x29420d, + 0x306f08, + 0x3c5088, + 0x6d603c82, + 0x210c84, + 0x6da386c2, + 0x377a06, + 0x6de00e42, + 0x3022ca, + 0x2b0606, + 0x22fc48, + 0x2b1e48, + 0x260946, + 0x2c37c6, + 0x3090c6, + 0x3e5505, + 0x2417c4, + 0x6e235504, + 0x3597c6, + 0x281447, + 0x6e684ec7, + 0x391e0b, + 0x208149, + 0x2bdd8a, + 0x2d9304, + 0x258208, + 0x24e08d, + 0x302bc9, + 0x302e08, + 0x303089, + 0x305504, + 0x251104, + 0x28c445, + 0x20508b, + 0x223146, + 0x359605, + 0x23f349, + 0x3220c8, + 0x2aeb04, + 0x312889, + 0x21eec5, + 0x2d3bc8, + 0x2f6a07, + 0x340d88, + 0x28cf06, + 0x206d47, + 0x2ecf49, + 0x203809, + 0x22f845, + 0x2b0d05, + 0x6ea1f182, + 0x33e7c4, + 0x244985, + 0x39a486, + 0x34b885, + 0x303c87, + 0x3598c5, + 0x281a44, + 0x36cec6, + 0x24ca07, + 0x3a01c6, + 0x32c605, + 0x212788, + 0x20af45, + 0x21b207, + 0x22c649, + 0x26688a, + 0x2344c7, + 0x2344cc, + 0x236ac6, + 0x242d89, + 0x24c505, + 0x24c7c8, + 0x22ea03, + 0x230445, + 0x2c7d85, + 0x286a07, + 0x6ee01242, + 0x2fe1c7, + 0x2eef06, + 0x3ad646, + 0x2f2006, + 0x3495c6, + 0x24b9c8, + 0x283885, + 0x321bc7, + 0x321bcd, + 0x20b5c3, + 0x3e83c5, + 0x3c7f87, + 0x2fe508, + 0x3c7b45, + 0x21f908, + 0x35b2c6, + 0x2ea3c7, + 0x2f5685, + 0x39a706, + 0x3973c5, + 0x22554a, + 0x2f9546, + 0x2315c7, + 0x320285, + 0x2fdec7, + 0x301804, + 0x308086, + 0x30bf05, + 0x23640b, + 0x2d2a49, + 0x28bc0a, + 0x22f8c8, + 0x377b48, + 0x30fecc, + 0x310c87, + 0x31ea88, + 0x391308, + 0x3d65c5, + 0x32a40a, + 0x34f9c9, + 0x6f200ec2, + 0x210606, + 0x24c004, + 0x300c89, + 0x247989, + 0x24eec7, + 0x284447, + 0x2a0d09, + 0x32aac8, + 0x32aacf, + 0x22dd46, + 0x2e9ecb, + 0x261445, + 0x261447, + 0x3572c9, + 0x22a186, + 0x312807, + 0x2ee685, + 0x23a944, + 0x34cb86, + 0x2174c4, + 0x2c9147, + 0x360648, + 0x6f7babc8, + 0x30d045, + 0x30d187, + 0x351bc9, + 0x211c44, + 0x24a5c8, + 0x6fb04c88, + 0x2e20c4, + 0x33ed08, + 0x32ce84, + 0x217389, + 0x227a85, + 0x6fe13402, + 0x22dd85, + 0x2ed405, + 0x3b69c8, + 0x23cf87, + 0x702008c2, + 0x3c2645, + 0x2e4146, + 0x25fb06, + 0x33e788, + 0x348688, + 0x34b846, + 0x37dcc6, + 0x2f00c9, + 0x3ad586, + 0x22a04b, + 0x349345, + 0x259386, + 0x261f88, + 0x362646, + 0x29e506, + 0x22000a, + 0x2e530a, + 0x22be45, + 0x24f187, + 0x27f886, + 0x70605002, + 0x3c80c7, + 0x38fb05, + 0x308744, + 0x308745, + 0x258106, + 0x27df47, + 0x2247c5, + 0x247a44, + 0x2e2708, + 0x29e5c5, + 0x355387, + 0x383485, + 0x225485, + 0x265c84, + 0x265c89, + 0x306008, + 0x2017c6, + 0x347706, + 0x3b6c06, + 0x70bd38c8, + 0x3dc2c7, + 0x31490d, + 0x314ecc, + 0x3154c9, + 0x315709, + 0x70f75ac2, + 0x3db703, + 0x22bec3, + 0x2d2c85, + 0x3b154a, + 0x33e646, + 0x34ce85, + 0x31cbc4, + 0x31cbcb, + 0x33508c, + 0x33594c, + 0x335c55, + 0x33698d, + 0x338a8f, + 0x338e52, + 0x3392cf, + 0x339692, + 0x339b13, + 0x339fcd, + 0x33a58d, + 0x33a90e, + 0x33b2ce, + 0x33b9cc, + 0x33bd8c, + 0x33c1cb, + 0x33cc4e, + 0x33d552, + 0x33e40c, + 0x33f5d0, + 0x34cfd2, + 0x34e1cc, + 0x34e88d, + 0x34ebcc, + 0x350dd1, + 0x35228d, + 0x355f8d, + 0x35658a, + 0x35680c, + 0x357ccc, + 0x35930c, + 0x359ccc, + 0x35dad3, + 0x35e550, + 0x35e950, + 0x35f34d, + 0x35f94c, + 0x360ac9, + 0x36290d, + 0x362c53, + 0x364b11, + 0x365313, + 0x36664f, + 0x366a0c, + 0x366d0f, + 0x3670cd, + 0x3676cf, + 0x367a90, + 0x36850e, + 0x36d54e, + 0x36de90, + 0x36ea8d, + 0x36f40e, + 0x36f78c, + 0x3708d3, + 0x3725ce, + 0x373310, + 0x373711, + 0x373b4f, + 0x373f13, + 0x37564d, + 0x37598f, + 0x375d4e, + 0x3762d0, + 0x3766c9, + 0x377d50, + 0x37824f, + 0x3788cf, + 0x378c92, + 0x37c3ce, + 0x37d94d, + 0x37e00d, + 0x37e34d, + 0x37f9cd, + 0x37fd0d, + 0x380050, + 0x38044b, 0x380d4c, 0x3810cc, 0x3816cc, 0x3819ce, - 0x390510, - 0x392012, - 0x39248b, - 0x3927ce, - 0x392b4e, - 0x3933ce, - 0x39384b, - 0x60393f56, - 0x394acd, - 0x394f54, - 0x395c4d, - 0x397995, - 0x39950d, - 0x399e8f, - 0x39a54f, - 0x39dccf, - 0x39e08e, - 0x39e60d, - 0x3a0491, - 0x3a2d8c, - 0x3a308c, - 0x3a338b, - 0x3a394c, - 0x3a3fcf, - 0x3a4392, - 0x3a4a4d, - 0x3a5b4c, - 0x3a684c, - 0x3a6b4d, - 0x3a6e8f, - 0x3a724e, - 0x3a9e4c, - 0x3aa40d, - 0x3aa74b, - 0x3ab00c, - 0x3ab90d, - 0x3abc4e, - 0x3abfc9, - 0x3ad753, - 0x3aed8d, - 0x3af48d, - 0x3afa8c, - 0x3aff0e, - 0x3b060f, - 0x3b09cc, - 0x3b0ccd, - 0x3b100f, - 0x3b13cc, - 0x3b2d0c, - 0x3b31cc, - 0x3b34cc, - 0x3b3b8d, - 0x3b3ed2, - 0x3b52cc, - 0x3b55cc, - 0x3b58d1, - 0x3b5d0f, - 0x3b60cf, - 0x3b6493, - 0x3b724e, - 0x3b75cf, - 0x3b798c, - 0x607b7cce, - 0x3b804f, - 0x3b8416, - 0x3b9f92, - 0x3bcc0c, - 0x3befcf, - 0x3bf64d, - 0x3c7e8f, - 0x3c824c, - 0x3c854d, - 0x3c888d, - 0x3c9f0e, - 0x3caa4c, - 0x3cd48c, - 0x3cd790, - 0x3d0591, - 0x3d09cb, - 0x3d0e0c, - 0x3d110e, - 0x3d3b11, - 0x3d3f4e, - 0x3d42cd, - 0x3d830b, - 0x3d8c0f, - 0x3d95d4, - 0x203942, - 0x203942, - 0x226a83, - 0x203942, - 0x226a83, - 0x203942, - 0x207a82, - 0x249385, - 0x3d380c, - 0x203942, - 0x203942, - 0x207a82, - 0x203942, - 0x298285, - 0x3715c5, - 0x203942, - 0x203942, - 0x209002, - 0x298285, - 0x336789, - 0x361f0c, - 0x203942, - 0x203942, - 0x203942, - 0x203942, - 0x249385, - 0x203942, - 0x203942, - 0x203942, - 0x203942, - 0x209002, - 0x336789, - 0x203942, - 0x203942, - 0x203942, - 0x3715c5, - 0x203942, - 0x3715c5, - 0x361f0c, - 0x3d380c, - 0x24af03, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x20ce83, - 0x23f7c3, - 0x61309b07, - 0x1c780f, - 0x131308, - 0x74f84, - 0x4783, - 0x1a2108, - 0x5184, + 0x390450, + 0x392492, + 0x39290b, + 0x3938ce, + 0x393c4e, + 0x3944ce, + 0x394a4b, + 0x71394ed6, + 0x395e0d, + 0x396994, + 0x39768d, + 0x399cd5, + 0x39b8cd, + 0x39c24f, + 0x39cb8f, + 0x3a3f4f, + 0x3a430e, + 0x3a468d, + 0x3a6611, + 0x3aaf4c, + 0x3ab24c, + 0x3ab54b, + 0x3ab98c, + 0x3ac40f, + 0x3ac7d2, + 0x3acdcd, + 0x3ae1cc, + 0x3aec8c, + 0x3aef8d, + 0x3af2cf, + 0x3af68e, + 0x3b120c, + 0x3b17cd, + 0x3b1b0b, + 0x3b23cc, + 0x3b318d, + 0x3b34ce, + 0x3b3849, + 0x3b50d3, + 0x3b798d, + 0x3b808d, + 0x3b868c, + 0x3b8d0e, + 0x3b958f, + 0x3b994c, + 0x3b9c4d, + 0x3b9f8f, + 0x3ba34c, + 0x3bb38c, + 0x3bb90c, + 0x3bbc0c, + 0x3bc8cd, + 0x3bcc12, + 0x3bd38c, + 0x3bd68c, + 0x3bd991, + 0x3bddcf, + 0x3be18f, + 0x3be553, + 0x3bf34e, + 0x3bf6cf, + 0x3bfa8c, + 0x717c014e, + 0x3c04cf, + 0x3c0896, + 0x3c1b92, + 0x3c528c, + 0x3c618f, + 0x3c680d, + 0x3d294f, + 0x3d2d0c, + 0x3d300d, + 0x3d334d, + 0x3d51ce, + 0x3d5d0c, + 0x3d914c, + 0x3d9450, + 0x3daa91, + 0x3daecb, + 0x3db30c, + 0x3db60e, + 0x3dd8d1, + 0x3ddd0e, + 0x3de08d, + 0x3e5f8b, + 0x3e688f, + 0x3e74d4, + 0x2038c2, + 0x2038c2, + 0x204cc3, + 0x2038c2, + 0x204cc3, + 0x2038c2, + 0x201082, + 0x2519c5, + 0x3dd5cc, + 0x2038c2, + 0x2038c2, + 0x201082, + 0x2038c2, + 0x2a0905, + 0x266885, + 0x2038c2, + 0x2038c2, + 0x20bd42, + 0x2a0905, + 0x337209, + 0x36480c, + 0x2038c2, + 0x2038c2, + 0x2038c2, + 0x2038c2, + 0x2519c5, + 0x2038c2, + 0x2038c2, + 0x2038c2, + 0x2038c2, + 0x20bd42, + 0x337209, + 0x2038c2, + 0x2038c2, + 0x2038c2, + 0x266885, + 0x2038c2, + 0x266885, + 0x36480c, + 0x3dd5cc, + 0x253c43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x2296c3, + 0x20cb83, + 0x3c4f, + 0x12d248, + 0x6f7c4, + 0xd903, + 0x17b4c8, + 0x1d5b83, 0x2000c2, - 0x61a03102, - 0x241183, - 0x2539c4, - 0x2020c3, - 0x2d4704, - 0x231b06, - 0x3c6f83, - 0x3cb504, - 0x25f205, - 0x211d83, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0x21d64a, - 0x254c06, - 0x392ecc, - 0xa7c88, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x225a83, - 0x2da646, - 0x20ce83, - 0x23f7c3, - 0x214e03, - 0x31e43, - 0xa8248, - 0x625bdb45, - 0x49d07, - 0x129245, - 0x187409, - 0xe2c2, - 0x1b448a, - 0x63383985, - 0x129245, - 0x26807, - 0x70a88, - 0x574e, - 0x8a7d2, - 0x116acb, - 0x109646, - 0x6368d385, - 0x63a8d38c, - 0x16b647, - 0xe747, - 0x14f64a, - 0x3dbd0, - 0x16cb05, - 0x10404b, - 0x18d648, - 0x39dc7, - 0x13a0cb, - 0x35309, - 0x49547, - 0x1385c7, - 0x1a99c7, - 0x36906, - 0xfcc8, - 0x64025786, - 0x18fdc7, - 0x146086, - 0x18d2cd, - 0x138e10, - 0x64469102, - 0x11d08, - 0x40cd0, - 0x18468c, - 0x64b8edcd, - 0x5ba48, - 0x5becb, - 0x6b1c7, - 0x17b589, - 0x57b06, - 0x97e08, - 0x5ce02, - 0x8268a, - 0x2c287, - 0x126bc7, - 0xa8c49, - 0xac2c8, - 0x34c5, - 0x190b46, - 0x1a8ac6, - 0xf0c4e, - 0x1b20e, - 0x2d28f, - 0x6d309, - 0x53889, - 0x8220b, - 0x94b4f, - 0xb0b0c, - 0xbb94b, - 0xdee48, - 0x110647, - 0x15ddc8, - 0x191c4b, - 0x198d4c, - 0x19f54c, - 0x1a3ccc, - 0xb138d, - 0x120648, - 0xea082, - 0x195789, - 0xf3dc8, - 0x1961cb, - 0xcab06, + 0x72616542, + 0x249f03, + 0x23adc4, + 0x204f03, + 0x36c284, + 0x239c86, + 0x220e43, + 0x3b7004, + 0x2999c5, + 0x216443, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x23098a, + 0x259186, + 0x393fcc, + 0x793c8, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x233243, + 0x2e8306, + 0x2296c3, + 0x20cb83, + 0x21f6c3, + 0x39fc3, + 0xb4388, + 0x731e7c45, + 0x7c4c7, + 0xb1845, + 0x52547, + 0x146c05, + 0x4009, + 0xad42, + 0x1c138a, + 0x73f2d5c5, + 0x146c05, + 0x34347, + 0x16108, + 0x10d8e, + 0x95292, + 0x130e0b, + 0x1e1d46, + 0x742ea205, + 0x7479e04c, + 0x10de07, + 0xb46c7, + 0x1b620a, + 0x44ad0, + 0x17be85, + 0xc5e4b, + 0x1dcf08, + 0x3e1c7, + 0x3aa4b, + 0x51b89, + 0x873c7, + 0xf4547, + 0x187407, + 0x3e106, + 0x1c74c8, + 0x74c32f46, + 0x46bc7, + 0xc7e86, + 0xb8d0d, + 0x96110, + 0x75013242, + 0x1cdd88, + 0x184590, + 0x18ed0c, + 0x7578f54d, + 0x68508, + 0x6898b, + 0x76447, + 0x19a49, + 0x62246, + 0xa0488, + 0x5102, + 0x9c50a, + 0x36947, + 0xb8847, + 0xb4e49, + 0xb7288, + 0x154645, + 0x190a86, + 0x6ac6, + 0x1040ce, + 0x422ce, + 0x4aecf, + 0x5e789, + 0x932c9, + 0x9c08b, + 0xbb44f, + 0x1dd2cc, 0xd4f4b, - 0x13f60b, - 0xdfe8a, - 0xe0a45, - 0xe4810, - 0xe5f86, - 0x129e06, - 0x1339c5, - 0x930c7, - 0xf7d08, - 0xeb887, - 0xebb47, - 0x1c7cc7, - 0xbf9c6, - 0x1b1e0a, - 0xa7b0a, - 0x1c6b46, - 0xab84d, - 0x18fe88, - 0x10b488, - 0xd6ec9, - 0xbaf85, - 0x1b030c, - 0xb158b, - 0x190d44, - 0x105309, - 0x105546, - 0x4ab06, - 0x1b9006, - 0x4cc2, - 0xfd986, - 0x1762cb, - 0x111e87, - 0x8c42, - 0xcc705, - 0x22f04, + 0x1b9248, + 0x191d07, + 0x19b308, + 0xbc0cb, + 0xbca0c, + 0xbce0c, + 0xbd20c, + 0xbd50d, + 0x1bc248, + 0x5adc2, + 0x1971c9, + 0x46688, + 0xda88b, + 0xdc906, + 0xe3acb, + 0x13d08b, + 0xeddca, + 0xeec85, + 0xf2550, + 0xf8286, + 0x583c6, + 0x10f7c5, + 0x120047, + 0xfa348, + 0xff487, + 0xff747, + 0x69587, + 0xd1846, + 0x17784a, + 0xb400a, + 0x30846, + 0xb860d, + 0x46c88, + 0x118d88, + 0xef809, + 0x1b2a09, + 0xcc205, + 0x176a8c, + 0xbd70b, + 0x10d989, + 0x112cc4, + 0x114549, + 0x114786, + 0x143506, + 0x4a42, + 0x13906, + 0x80c8b, + 0x11de07, + 0x11dfc7, + 0xe042, + 0xde645, + 0x9204, 0x101, - 0x54283, - 0x63e6c306, - 0x98183, + 0x5b843, + 0x74b26806, + 0xa0803, 0x382, - 0x22b04, + 0x1504, 0xac2, - 0x50784, + 0x5dd04, 0x882, - 0x4602, - 0x19c2, - 0x1c342, - 0x7982, - 0x8d382, + 0x8502, + 0x4702, + 0x128c42, + 0x4182, + 0xea202, 0xd42, - 0x291c2, - 0x38142, - 0x24502, - 0x7682, - 0x50002, - 0x34e83, + 0x2e702, + 0x3fb82, + 0xc542, + 0x3242, + 0x57f02, + 0x22bc3, 0x942, - 0x1bc2, - 0x143c2, - 0x8142, + 0x2bc2, + 0x18242, + 0xeb02, 0x642, - 0x33702, - 0x5dc2, - 0x1cc2, - 0xf42, + 0x3b342, + 0x1ec82, + 0x8e82, + 0x5502, 0x5c2, - 0x14503, - 0x1742, - 0x51c2, - 0x4b4c2, - 0x51b42, - 0xe942, - 0x5542, - 0x65c2, - 0x30c2, - 0x5982, - 0x127e02, - 0x6ff42, - 0x3c9c2, - 0xce83, + 0x43543, + 0x2642, + 0x6002, + 0x54202, + 0x7bc2, + 0x9d42, + 0x10442, + 0x205c2, + 0x11de42, + 0x1582, + 0x10f082, + 0x77782, + 0xa9542, + 0x296c3, 0x602, - 0x4dc02, - 0x2f42, - 0xdbc2, - 0x7f45, - 0x7702, - 0x3542, - 0x3e903, + 0x4ba82, + 0x1cc2, + 0x2d4c2, + 0x2f7c5, + 0x59c2, + 0x4cec2, + 0x179e43, 0x682, - 0x129c2, - 0x5c82, + 0x4a02, 0x1702, - 0x1782, + 0x4ac2, + 0xb5c2, 0x8c2, - 0x13602, - 0x4cc2, - 0xe745, - 0x64e07a82, - 0x652cc0c3, - 0x31643, - 0x65607a82, - 0x31643, - 0x83107, - 0x20b7c3, + 0x6502, + 0x4a42, + 0x3ec5, + 0x75a01082, + 0x75eecb83, + 0x9983, + 0x76201082, + 0x9983, + 0xdc1c7, + 0x215483, 0x2000c2, - 0x22f743, - 0x234e83, - 0x20d343, + 0x216543, + 0x222bc3, + 0x2f5503, 0x2005c3, - 0x225a83, - 0x20ce83, - 0x204783, - 0x23f7c3, - 0x2981c3, - 0xf6585, - 0xd103, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x20d343, - 0x211d83, - 0x20ce83, - 0x204783, - 0x71003, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, + 0x233243, + 0x2296c3, + 0x20d903, + 0x20cb83, + 0x2a0843, + 0xcc244, + 0x143845, + 0x1084c5, + 0x1a143, + 0x793c8, + 0x216543, + 0x222bc3, + 0x2f5503, + 0x216443, + 0x2296c3, + 0x20d903, + 0x7ca83, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, 0x200181, - 0x211d83, - 0x20ce83, - 0x22c483, - 0x23f7c3, - 0x177384, - 0x24af03, - 0x22f743, - 0x234e83, - 0x211d03, - 0x20d343, - 0x35b003, - 0x207c03, - 0x2a57c3, - 0x228c43, - 0x224943, - 0x221b84, - 0x20ce83, - 0x23f7c3, - 0x2050c3, - 0x330684, - 0x22cf03, - 0x1c183, - 0x3c5243, - 0x3226c8, - 0x28c784, + 0x216443, + 0x2296c3, + 0x257743, + 0x20cb83, + 0x1a3904, + 0x253c43, + 0x216543, + 0x222bc3, + 0x2163c3, + 0x2f5503, + 0x322603, + 0x285483, + 0x2b05c3, + 0x205383, + 0x343b43, + 0x2b1b84, + 0x2296c3, + 0x20cb83, + 0x201643, + 0x202304, + 0x239843, + 0x3b43, + 0x2133c3, + 0x32f308, + 0x29ac84, 0x20020a, - 0x23ac46, - 0x123004, - 0x38e307, - 0x21e64a, - 0x219e89, - 0x3b4307, - 0x3b894a, - 0x24af03, - 0x2fd20b, - 0x228b89, - 0x2d6645, - 0x3b3007, - 0x3102, - 0x22f743, - 0x224507, - 0x26e885, - 0x2c5249, - 0x234e83, - 0x375106, - 0x2c4683, - 0xe5b83, - 0x10ed86, - 0x1327c6, - 0x1c6f07, - 0x217d86, - 0x21c385, - 0x3d9b47, - 0x30bcc7, - 0x68224943, - 0x34e707, - 0x3b9103, - 0x20afc5, - 0x221b84, - 0x271508, - 0x37d54c, - 0x2b28c5, - 0x2a53c6, - 0x2243c7, - 0x2e2407, - 0x25f607, - 0x263b48, - 0x30dccf, - 0x21a0c5, - 0x241287, - 0x2085c7, - 0x2a724a, - 0x2ea109, - 0x319ac5, - 0x31b98a, - 0x148f06, - 0xbb447, - 0x2c4705, - 0x3926c4, - 0x255c46, - 0xc8506, - 0x384907, - 0x2e9f87, - 0x36ac88, - 0x218305, - 0x26e786, - 0x225c8, - 0x2aa485, - 0xaa646, - 0x22e585, - 0x26cd44, - 0x3d2747, - 0x2febca, - 0x248108, - 0x32f706, - 0x25a83, - 0x2e1985, - 0x320ac6, - 0x3d6f86, - 0x3338c6, - 0x211d83, - 0x3a4cc7, - 0x208545, - 0x20ce83, - 0x2e014d, - 0x204783, - 0x36ad88, - 0x210504, - 0x279a45, - 0x2a7146, - 0x3981c6, - 0x2a8507, - 0x25c107, - 0x28ba85, - 0x23f7c3, - 0x2e41c7, - 0x310749, - 0x37b709, - 0x32a04a, - 0x23cb02, - 0x20af84, - 0x39a444, - 0x2e9e47, - 0x2ea4c8, - 0x2ec7c9, - 0x20dd09, - 0x2ed507, - 0xfab89, - 0x34b446, - 0xf09c6, - 0x2f2484, - 0x2f2a8a, - 0x2f57c8, - 0x2f7549, - 0x2f7b06, - 0x2b6ec5, - 0x247fc8, - 0x2caf4a, - 0x252c43, - 0x330806, - 0x2ed607, - 0x2aa905, - 0x39c985, - 0x22a8c3, - 0x23bb84, - 0x227345, - 0x287a47, - 0x2f3685, - 0x2f1c46, - 0x1017c5, - 0x289e43, - 0x3d1d89, - 0x27980c, - 0x2b994c, - 0x2d4d48, - 0x2abdc7, - 0x301e48, - 0x102487, - 0x302cca, - 0x30338b, - 0x228cc8, - 0x3982c8, - 0x22a2c6, - 0x28c345, - 0x33db4a, - 0x2cc105, - 0x21a602, - 0x2c8d07, - 0x250e06, - 0x378e85, - 0x3cb209, - 0x2120c5, - 0x31c245, - 0x3be6c9, - 0x320a06, - 0x3c0148, - 0x269f83, - 0x208e06, - 0x278506, - 0x311a45, - 0x311a49, - 0x21de09, - 0x28c0c7, - 0x114944, - 0x314947, - 0x20dc09, - 0x21e845, - 0x3a208, - 0x348a05, - 0x2fb885, - 0x3869c9, - 0x202602, - 0x22cd04, - 0x201e82, - 0x201742, - 0x2fb305, - 0x322d88, - 0x2baec5, - 0x2c7543, - 0x2c7545, - 0x2d79c3, - 0x2075c2, - 0x3dba44, - 0x28e843, + 0x25afc6, + 0x1519c4, + 0x3bd047, + 0x22820a, + 0x22dc09, + 0x3c9ec7, + 0x3cc38a, + 0x253c43, + 0x368b8b, + 0x20c389, + 0x31f4c5, + 0x20cd87, + 0x16542, + 0x216543, + 0x226f07, + 0x2224c5, + 0x2d8e09, + 0x222bc3, + 0x34bc46, + 0x32a4c3, + 0xd2b03, + 0x11bc06, + 0x17a2c6, + 0x20dc7, + 0x229a46, + 0x231f45, + 0x20a307, + 0x319507, + 0x78f43b43, + 0x34e407, + 0x3b29c3, + 0x2712c5, + 0x2b1b84, + 0x2c2188, + 0x3db94c, + 0x2c1305, + 0x2b01c6, + 0x226dc7, + 0x35b907, + 0x2678c7, + 0x26c148, + 0x31ae8f, + 0x27b905, + 0x24a007, + 0x2151c7, + 0x28974a, + 0x37f609, + 0x330145, + 0x34da0a, + 0x101546, + 0xcc787, + 0x2d7e45, + 0x2f5744, + 0x340486, + 0xcb946, + 0x256ec7, + 0x25acc7, + 0x3b5b48, + 0x3d07c5, + 0x2223c6, + 0x2f048, + 0x228c85, + 0x28e46, + 0x240305, + 0x288284, + 0x21ef87, + 0x24b80a, + 0x2aab88, + 0x3e3cc6, + 0x33243, + 0x2efe85, + 0x3d8586, + 0x3cbb06, + 0x30f6c6, + 0x216443, + 0x3ad047, + 0x215145, + 0x2296c3, + 0x2ee08d, + 0x20d903, + 0x3b5c48, + 0x243444, + 0x281d05, + 0x2b2506, + 0x32e106, + 0x259287, + 0x268bc7, + 0x27c805, + 0x20cb83, + 0x3a20c7, + 0x24b489, + 0x36a249, + 0x382d0a, + 0x23d7c2, + 0x271284, + 0x3211c4, + 0x2fda07, + 0x2fe088, + 0x300709, + 0x3e8289, + 0x301107, + 0x10a949, + 0x2132c6, + 0x103e46, + 0x305504, + 0x3b4e4a, + 0x307e08, + 0x308f89, + 0x309246, + 0x2c7245, + 0x2aaa48, + 0x2dcb8a, + 0x27d683, + 0x202486, + 0x301207, + 0x2c8885, + 0x3c10c5, + 0x24da03, + 0x2d1984, + 0x22f685, + 0x291587, + 0x306145, + 0x2f2cc6, + 0x166105, + 0x2c79c3, + 0x2c79c9, + 0x281acc, + 0x2d06cc, + 0x3416c8, + 0x2a3e47, + 0x3101c8, + 0x110e47, + 0x3111ca, + 0x31188b, + 0x20c4c8, + 0x32e208, + 0x25d306, + 0x272145, + 0x33b5ca, + 0x2ecbc5, + 0x213402, + 0x2db6c7, + 0x27d046, + 0x377045, + 0x313149, + 0x27b485, + 0x1dea48, + 0x29d645, + 0x270e89, + 0x3d84c6, + 0x3407c8, + 0x31dd83, + 0x212c46, + 0x3b7086, + 0x31d845, + 0x31d849, + 0x2cee49, + 0x271ec7, + 0x120d84, + 0x320d87, + 0x3e8189, + 0x228405, + 0x418c8, + 0x379cc5, + 0x3a14c5, + 0x36bc09, + 0x202cc2, + 0x35a344, + 0x204542, + 0x202642, + 0x2ffc05, + 0x351748, + 0x2cc145, + 0x2da043, + 0x2da045, + 0x2e5d83, + 0x212202, + 0x333544, + 0x36a603, 0x200a82, - 0x3bd804, - 0x2e77c3, - 0x203b02, - 0x2baf43, - 0x2fe504, - 0x2f7c83, - 0x256c84, - 0x205fc2, - 0x214d03, - 0x21af43, - 0x2026c2, - 0x354282, - 0x21dc49, - 0x210242, - 0x28b304, - 0x205e02, - 0x247e44, - 0x34b404, - 0x32ecc4, - 0x204cc2, - 0x229f02, - 0x2dc6c3, - 0x303143, - 0x22e684, - 0x26a004, - 0x2d0384, - 0x2ed784, - 0x314ac3, - 0x245a43, - 0x348e84, - 0x316f44, - 0x317086, - 0x224682, - 0x3102, - 0x41c83, - 0x203102, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, + 0x2c4d84, + 0x318f43, + 0x203482, + 0x269503, + 0x2307c4, + 0x3093c3, + 0x25be04, + 0x201ec2, + 0x21f5c3, + 0x214a83, + 0x202d82, + 0x352902, + 0x2cec89, + 0x204942, + 0x296884, + 0x21ef42, + 0x2603c4, + 0x213284, + 0x2d7284, + 0x204a42, + 0x247e02, + 0x35d143, + 0x2a2683, + 0x291704, + 0x2e1184, + 0x307fc4, + 0x31fe44, + 0x31d303, + 0x208f03, + 0x3014c4, + 0x322cc4, + 0x322e06, + 0x229782, + 0x16542, + 0x4ab43, + 0x216542, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x14c45, 0x2000c2, - 0x24af03, - 0x22f743, - 0x234e83, - 0x2053c3, - 0x224943, - 0x221b84, - 0x21df04, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x214e03, - 0x2f3044, - 0x324003, - 0x2a96c3, - 0x37db04, - 0x348806, - 0x20fc03, - 0x129245, - 0xe747, - 0x26f503, - 0x69a49648, - 0x250603, - 0x2b5943, - 0x20b003, - 0x225a83, - 0x3542c5, - 0x1b2fc3, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x207703, - 0x231283, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x214503, - 0x20ce83, - 0x281184, - 0x71003, - 0x23f7c3, - 0x2b7ec4, - 0x129245, - 0x2c1185, - 0xe747, - 0x203102, - 0x201d02, + 0x253c43, + 0x216543, + 0x222bc3, + 0x206203, + 0x343b43, + 0x2b1b84, + 0x2cef44, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x21f6c3, + 0x305b04, + 0x20bc43, + 0x21bcc3, + 0x37dc04, + 0x379ac6, + 0x2079c3, + 0x146c05, + 0xb46c7, + 0x203643, + 0x7aa176c8, + 0x209a43, + 0x2c45c3, + 0x24c243, + 0x233243, + 0x3c2545, + 0xcd43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x212343, + 0x203e43, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x243543, + 0x2296c3, + 0x28ea04, + 0x7ca83, + 0x20cb83, + 0x2cce44, + 0x146c05, + 0x2d3605, + 0xb46c7, + 0x216542, + 0x2104c2, 0x200382, - 0x208ac2, - 0x4783, + 0x204cc2, + 0xd903, 0x2003c2, - 0x1244, - 0x22f743, - 0x2375c4, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x209c04, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x202443, - 0x250784, - 0xa7c88, - 0x22f743, - 0x204783, - 0xd103, - 0x14cfc4, - 0x23d544, - 0xa7c88, - 0x22f743, - 0x24f044, - 0x221b84, - 0x204783, - 0x201e02, - 0x71003, - 0x23f7c3, - 0x259703, - 0x3bb84, - 0x207ac5, - 0x21a602, - 0x376243, - 0x127409, - 0xde2c6, - 0x148b08, + 0x12dc04, + 0x216543, + 0x23ec84, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x21b544, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x202b03, + 0x25dd04, + 0x793c8, + 0x216543, + 0x20d903, + 0x1a143, + 0x11a5c4, + 0x21d684, + 0x793c8, + 0x16542, + 0x216543, + 0x256d44, + 0x2b1b84, + 0x20d903, + 0x203c82, + 0x7ca83, + 0x20cb83, + 0x24c343, + 0xd1984, + 0x355b45, + 0x213402, + 0x323543, + 0x10e689, + 0xebd86, + 0x1c4688, 0x2000c2, - 0xa7c88, - 0x203102, - 0x234e83, - 0x224943, + 0x793c8, + 0x216542, + 0x222bc3, + 0x343b43, 0x2005c2, - 0x4783, - 0x23f7c3, - 0x4f02, + 0xd903, + 0x20cb83, + 0xfe02, 0x82, + 0xc2, + 0x1cc547, + 0x14a709, + 0x3a43, + 0x793c8, + 0x17d0c3, + 0x7e3e71c7, + 0x16543, + 0x10508, + 0x22bc3, + 0x143b43, + 0x432c6, + 0x43543, + 0x15d8c8, + 0xd5c08, + 0x1c1ac3, + 0x83646, + 0x7e5a9d85, + 0x16443, + 0x98e48, + 0xdfc08, + 0x103d03, + 0x7e8ef3c6, + 0xf3585, + 0x1a1dc4, + 0x3c787, + 0x296c3, + 0x4f83, + 0xcb83, + 0x4642, + 0x15b0ca, + 0xc205, + 0x7303, + 0x7eed308c, + 0xffcc3, + 0x10ba84, + 0x11ac8b, + 0x11b248, + 0x15d184, + 0x9a402, + 0x4b343, + 0x145fdc7, + 0x157a147, + 0x14da108, + 0x144b343, + 0x1c4b88, + 0x1ad30b, + 0x14182, + 0x132747, + 0x114bc4, 0x2000c2, - 0x1b8b07, - 0x142149, - 0x7d6c3, - 0xa7c88, - 0x1c303, - 0x6d34f3c7, - 0x2f743, - 0x1c2908, - 0x234e83, - 0x224943, - 0x3fb86, - 0x214503, - 0x96c08, - 0xc3a48, - 0x116206, - 0x211d83, - 0xcdf88, - 0xbacc3, - 0x6d4e1306, - 0xe5285, - 0x35087, - 0xce83, - 0x444c3, - 0x3f7c3, - 0xda42, - 0x19fc4a, - 0x8283, - 0xfb3c3, - 0x2fca44, - 0x10dacb, - 0x10e088, - 0x91f82, - 0x1455187, - 0x152e787, - 0x14c7608, - 0x1515883, - 0x12708b, - 0xba42, - 0x125c07, - 0x1069c4, - 0x2000c2, - 0x203102, - 0x2375c4, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x225a83, - 0x20ce83, - 0x23f7c3, - 0x228743, - 0x202443, - 0x31e43, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, + 0x216542, + 0x23ec84, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x233243, + 0x2296c3, + 0x20cb83, + 0x204683, + 0x202b03, + 0x39fc3, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, 0x602, - 0xd103, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x225a83, - 0x20ce83, - 0x23f7c3, - 0x210782, + 0x1a143, + 0x143b43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x233243, + 0x2296c3, + 0x20cb83, + 0x22a042, 0x2000c1, 0x2000c2, 0x200201, - 0x33b542, - 0xa7c88, - 0x21c785, + 0x338b82, + 0x793c8, + 0x224545, 0x200101, - 0x2f743, - 0x32244, - 0x2015c1, + 0x16543, + 0x3a304, + 0x201381, 0x200501, - 0x2014c1, - 0x249302, - 0x38b104, - 0x249303, + 0x201281, + 0x251242, + 0x251244, + 0x251943, 0x200041, 0x200801, 0x200181, + 0x18ab06, 0x200701, - 0x3535c7, - 0x31e5cf, - 0x30eec6, + 0x30d307, + 0x312d8f, + 0x399086, 0x2004c1, - 0x34d006, + 0x31a606, 0x200bc1, 0x200581, - 0x3d854e, + 0x3e61ce, 0x2003c1, - 0x23f7c3, + 0x20cb83, 0x200a81, - 0x22d185, - 0x20da42, - 0x22a7c5, + 0x3a8d85, + 0x204642, + 0x24d905, 0x200401, 0x200741, 0x2007c1, - 0x21a602, + 0x213402, 0x200081, - 0x202d01, - 0x201241, - 0x2018c1, - 0x2086c1, - 0x52449, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x2158c3, - 0x22f743, - 0x224943, - 0x91ec8, - 0x211d83, - 0x20ce83, - 0x71283, - 0x23f7c3, - 0x14e8c08, - 0x7608, - 0x129245, - 0xa7c88, - 0x4783, - 0x129245, - 0x45344, - 0x40f88, - 0x46cc4, - 0xbd485, - 0x52449, - 0x14e8c0a, - 0xa7c88, - 0x71003, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x21c183, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x2dbb04, - 0x23f7c3, - 0x266f85, - 0x316504, - 0x22f743, - 0x234e83, - 0x224943, - 0x205982, - 0x20ce83, - 0x23f7c3, - 0x2443, - 0xa834a, - 0x113284, - 0x119f46, - 0x24af03, - 0x22f743, - 0x234e83, - 0x224943, - 0x20ce83, - 0x23f7c3, - 0x203102, - 0x22f743, - 0x2327c9, - 0x234e83, - 0x2aca09, - 0x224943, - 0x211d83, - 0x20ce83, - 0x18cfc4, - 0x4783, - 0x23f7c3, - 0x2f2288, - 0x230287, - 0x207ac5, - 0x1d0c08, - 0x1b8b07, - 0xea74a, - 0x71acb, - 0x14d247, - 0x40148, - 0x138a8a, - 0x1cf188, - 0x142149, - 0x27207, - 0x38887, - 0x127d48, - 0x1c2908, - 0x4154f, - 0x16705, - 0x190347, - 0x3fb86, - 0x44407, - 0x119c06, - 0x96c08, - 0x9f046, - 0x120807, - 0x121409, - 0x1c0607, - 0xb2689, - 0xbbc09, - 0xc0f06, - 0xc3a48, - 0xc2385, - 0x7ba8a, - 0xcdf88, - 0xbacc3, - 0xd8d08, - 0x35087, - 0x16c105, - 0x7f950, - 0x444c3, - 0x71003, - 0x121287, - 0x196c5, - 0xebe48, - 0x67705, - 0xfb3c3, - 0x176b88, - 0x1c67c6, - 0x1ae489, - 0xaec07, - 0x1276cb, - 0x701c4, - 0x104e04, - 0x10dacb, - 0x10e088, - 0x10ec87, - 0x129245, - 0x22f743, - 0x234e83, - 0x20d343, - 0x23f7c3, - 0x23f343, - 0x224943, - 0x71003, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x8234b, + 0x201641, + 0x207281, + 0x2024c1, + 0x208481, + 0x5c549, + 0x793c8, + 0x216543, + 0x222bc3, + 0xac1c8, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x2203c3, + 0x2f43, + 0x216543, + 0x343b43, + 0x9a348, + 0x216443, + 0x2296c3, + 0x91c43, + 0x20cb83, + 0x82a99048, + 0x1e9343, + 0x12248, + 0xcd42, + 0x3c43, + 0x13242, + 0x4a42, + 0x146c05, + 0x793c8, + 0x9fb06, + 0x15edc7, + 0xd903, + 0x146c05, + 0x171684, + 0x1cdf88, + 0x4f344, + 0x106a47, + 0x60244, + 0xb1c0c, + 0x1db944, + 0xdaf45, + 0x5c549, + 0x16e507, + 0x28846, + 0x191ca, + 0x14f990a, + 0x793c8, + 0x7ca83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x203b43, + 0x793c8, + 0x216543, + 0x222bc3, + 0x2e8fc4, + 0x20cb83, + 0x2655c5, + 0x2484c4, + 0x216543, + 0x222bc3, + 0x343b43, + 0x201582, + 0x2296c3, + 0x20cb83, + 0x2b03, + 0xedac6, + 0x12f6c4, + 0x124c46, + 0x253c43, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2296c3, + 0x20cb83, + 0x216542, + 0x216543, + 0x23a889, + 0x222bc3, + 0x2b79c9, + 0x343b43, + 0x216443, + 0x2296c3, + 0x84e04, + 0xd903, + 0x20cb83, + 0x305308, + 0x3e2687, + 0x355b45, + 0xd3a48, + 0x1db108, + 0x1cc547, + 0xfe30a, + 0x1c790b, + 0x11a847, + 0x48f08, + 0xf4a0a, + 0x26888, + 0x14a709, + 0x2f547, + 0x1ed87, + 0x10efc8, + 0x10508, + 0x4a2cf, + 0xaad45, + 0x1fc47, + 0x432c6, + 0x14cd47, + 0x130286, + 0x15d8c8, + 0xa3706, + 0x1405c7, + 0x1798c9, + 0x1df3c7, + 0xc6d09, + 0xcd749, + 0xd3386, + 0xd5c08, + 0xd3d05, + 0x86f4a, + 0xdfc08, + 0x103d03, + 0xe6008, + 0x3c787, + 0x133485, + 0x649d0, + 0x4f83, + 0x7ca83, + 0x179747, + 0x2d445, + 0xffa48, + 0x74505, + 0xffcc3, + 0x1a3108, + 0x1a1386, + 0x9ec09, + 0xba247, + 0x10e94b, + 0x77a04, + 0x113b84, + 0x11ac8b, + 0x11b248, + 0x11bb07, + 0x146c05, + 0x216543, + 0x222bc3, + 0x2f5503, + 0x20cb83, + 0x248783, + 0x343b43, + 0x7ca83, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x9c1cb, 0x2000c2, - 0x203102, - 0x23f7c3, - 0xa7c88, - 0x3102, + 0x216542, + 0x20cb83, + 0xd42, + 0x1582, + 0x1642, + 0x793c8, + 0x1b7409, + 0x1c4b88, + 0x16542, 0x2000c2, - 0x203102, + 0x216542, 0x200382, 0x2005c2, - 0x204802, - 0x20ce83, - 0x135706, + 0x202042, + 0x2296c3, + 0x148ec6, 0x2003c2, - 0x3bb84, + 0xd1984, 0x2000c2, - 0x24af03, - 0x203102, - 0x22f743, - 0x234e83, + 0x253c43, + 0x216542, + 0x216543, + 0x222bc3, 0x200382, - 0x224943, - 0x214503, - 0x211d83, - 0x209c04, - 0x20ce83, - 0x2130c3, - 0x4783, - 0x23f7c3, - 0x2fca44, - 0x2050c3, - 0x224943, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x204783, - 0x23f7c3, - 0x3bd0c7, - 0x22f743, - 0x27d8c7, - 0x35df46, - 0x20a8c3, - 0x2143c3, - 0x224943, - 0x2083c3, - 0x221b84, - 0x39b5c4, - 0x30f746, - 0x202143, - 0x20ce83, - 0x23f7c3, - 0x266f85, - 0x3283c4, - 0x34fb43, - 0x2c6703, - 0x2c8d07, - 0x2c5f05, - 0x22f743, - 0x234e83, - 0x224943, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x772fc18c, - 0x4ddc7, - 0xdd286, - 0x930c7, - 0x1a29c5, - 0x206c82, - 0x38ffc3, - 0x206203, - 0x24af03, - 0x77e2f743, - 0x2037c2, - 0x234e83, - 0x2020c3, - 0x224943, - 0x221b84, - 0x201143, - 0x21a0c3, - 0x211d83, - 0x209c04, - 0x78205682, - 0x20ce83, - 0x23f7c3, - 0x209983, - 0x222f03, - 0x20cf03, - 0x210782, - 0x2050c3, - 0xa7c88, - 0x224943, - 0xd103, - 0x21f004, - 0x24af03, - 0x203102, - 0x22f743, - 0x2375c4, - 0x234e83, - 0x224943, - 0x221b84, - 0x214503, - 0x3bac04, - 0x346484, - 0x2da646, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x214e03, - 0x250e06, - 0x36b8b, - 0x25786, - 0x6da0a, - 0x112d0a, - 0xa7c88, - 0x222584, - 0x7962f743, - 0x320c84, - 0x234e83, - 0x2d7004, - 0x224943, - 0x203843, - 0x211d83, - 0x20ce83, - 0x71003, - 0x23f7c3, - 0xa1c3, - 0x349f4b, - 0x3c8bca, - 0x3da28c, - 0xe1708, + 0x343b43, + 0x243543, + 0x216443, + 0x21b544, + 0x2296c3, + 0x20b243, + 0xd903, + 0x20cb83, + 0x30ba84, + 0x201643, + 0x343b43, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x20d903, + 0x20cb83, + 0x3c5747, + 0x216543, + 0x2868c7, + 0x3823c6, + 0x209843, + 0x21a003, + 0x343b43, + 0x20e443, + 0x2b1b84, + 0x243544, + 0x3d66c6, + 0x202803, + 0x2296c3, + 0x127f0b, + 0x20cb83, + 0x2655c5, + 0x2f7184, + 0x3b6703, + 0x343483, + 0x2db6c7, + 0x2f6985, + 0x1a1003, + 0x216543, + 0x222bc3, + 0x343b43, + 0x216443, + 0x2296c3, + 0x1c1184, + 0x20cb83, + 0x1fa83, + 0x89f0b24c, + 0x58083, + 0x4bc47, + 0x80dc6, + 0x120047, + 0x133d85, + 0x205242, + 0x246dc3, + 0x211d43, + 0x253c43, + 0x8aa16543, + 0x2080c2, + 0x222bc3, + 0x204f03, + 0x343b43, + 0x2b1b84, + 0x34b203, + 0x27b903, + 0x216443, + 0x21b544, + 0x8ae06c02, + 0x2296c3, + 0x20cb83, + 0x20e603, + 0x209203, + 0x2883c3, + 0x22a042, + 0x201643, + 0x793c8, + 0x343b43, + 0x1a143, + 0x258bc4, + 0x253c43, + 0x216542, + 0x216543, + 0x23ec84, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x243543, + 0x239104, + 0x28d4c4, + 0x2e8306, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x21f6c3, + 0x27d046, + 0x4290b, + 0x32f46, + 0xb6c0a, + 0x11faca, + 0x793c8, + 0x22f004, + 0x8c216543, + 0x32c744, + 0x222bc3, + 0x219a44, + 0x343b43, + 0x284103, + 0x216443, + 0x2296c3, + 0x7ca83, + 0x20cb83, + 0x31c03, + 0x348b0b, + 0x3d368a, + 0x3e8e4c, + 0xefc08, 0x2000c2, - 0x203102, + 0x216542, 0x200382, - 0x230145, - 0x221b84, - 0x205982, - 0x211d83, - 0x346484, - 0x208ac2, + 0x2b96c5, + 0x2b1b84, + 0x201582, + 0x216443, + 0x28d4c4, + 0x204cc2, 0x2003c2, - 0x202442, - 0x210782, - 0x4af03, - 0x47502, - 0x2be789, - 0x340e48, - 0x2247c9, - 0x21f909, - 0x2ab2ca, - 0x318c0a, - 0x214c42, - 0x2291c2, - 0x3102, - 0x22f743, - 0x22ca82, - 0x241446, - 0x37a202, - 0x201682, - 0x271e4e, - 0x214d4e, - 0x281447, - 0x20ce07, - 0x24f302, - 0x234e83, - 0x224943, - 0x207282, + 0x202b02, + 0x22a042, + 0x53c43, + 0x4042, + 0x2d5fc9, + 0x278a08, + 0x3d8a09, + 0x39d3c9, + 0x2116ca, + 0x21424a, + 0x208d02, + 0x22e702, + 0x16542, + 0x216543, + 0x213b02, + 0x24a1c6, + 0x378742, + 0x47402, + 0x201442, + 0x3c7c8e, + 0x21f60e, + 0x3d1b47, + 0x219cc2, + 0x222bc3, + 0x343b43, + 0x20bac2, 0x2005c2, - 0x14343, - 0x2377cf, - 0x238902, - 0x2b4407, - 0x36e087, - 0x2b6a07, - 0x2d198c, - 0x2d26cc, - 0x21ecc4, - 0x39f08a, - 0x214c82, - 0x251b42, - 0x2bd784, + 0x6a7c3, + 0x23ee8f, + 0x21ee02, + 0x2eae47, + 0x2e2587, + 0x2e61c7, + 0x2f0e4c, + 0x2f2e0c, + 0x258884, + 0x28c28a, + 0x21f542, + 0x207bc2, + 0x2cf304, 0x200702, - 0x2b0602, - 0x2d2904, - 0x2131c2, - 0x20e942, - 0xe943, - 0x29f0c7, - 0x23a9c5, - 0x2065c2, - 0x244384, - 0x327e02, - 0x2e1488, - 0x20ce83, - 0x379208, - 0x201fc2, - 0x21ee85, - 0x398ac6, - 0x23f7c3, - 0x207702, - 0x2eca07, - 0xda42, - 0x3a4905, - 0x321185, - 0x205d02, - 0x20ba82, - 0x2097ca, - 0x28b90a, - 0x287542, - 0x29fc44, - 0x205202, - 0x20ae48, - 0x208c02, - 0x301148, - 0x309407, - 0x30a189, - 0x2e5d02, - 0x30ffc5, - 0x36d845, - 0x2183cb, - 0x30fccc, - 0x22c588, - 0x325a48, - 0x224682, - 0x2a85c2, + 0x2d8882, + 0x2f3044, + 0x21ab82, + 0x209d42, + 0x1b283, + 0x2a3787, + 0x288345, + 0x2205c2, + 0x319f04, + 0x30f082, + 0x2ef548, + 0x2296c3, + 0x3773c8, + 0x204d82, + 0x258a45, + 0x39b086, + 0x20cb83, + 0x2059c2, + 0x300947, + 0x4642, + 0x2504c5, + 0x203505, + 0x201782, + 0x207f02, + 0x3cfd8a, + 0x27c68a, + 0x279c42, + 0x2a94c4, + 0x200f02, + 0x271148, + 0x20e002, + 0x2b4bc8, + 0x17c1, + 0x316887, + 0x3174c9, + 0x203582, + 0x31c385, + 0x372b05, + 0x3d088b, + 0x3d6c4c, + 0x237288, + 0x332588, + 0x229782, + 0x259342, 0x2000c2, - 0xa7c88, - 0x203102, - 0x22f743, + 0x793c8, + 0x216542, + 0x216543, 0x200382, - 0x208ac2, - 0x4783, + 0x204cc2, + 0xd903, 0x2003c2, - 0x23f7c3, - 0x202442, + 0x20cb83, + 0x202b02, 0x2000c2, - 0x129245, - 0x7aa03102, - 0x7b224943, - 0x20e943, - 0x205982, - 0x20ce83, - 0x3bb643, - 0x7b63f7c3, - 0x2e9343, - 0x283206, - 0x1602443, - 0x129245, - 0x1355cb, - 0xa7c88, - 0x7ae8c588, - 0x895c7, - 0x70887, - 0x1339c5, - 0x1e00d, - 0x3f982, - 0x10e682, - 0xa910a, - 0x8b747, - 0x1bfc4, - 0x1c003, - 0x1b9084, - 0x7be048c2, - 0x7c200ac2, - 0x7c603002, - 0x7ca04182, - 0x7ce09fc2, - 0x7d207982, - 0xe747, - 0x7d603102, - 0x7da31082, - 0x7de1f642, - 0x7e207682, - 0x214d43, - 0x12984, - 0x239043, - 0x7e60e382, - 0x5ba48, - 0x7ea02ec2, - 0x4f947, - 0x7ee00042, - 0x7f200d82, - 0x7f600182, - 0x7fa03842, - 0x7fe00f42, - 0x802005c2, - 0xd6585, - 0x24f543, - 0x338544, - 0x80600702, - 0x80a01882, - 0x80e04b42, - 0x7c68b, - 0x81200c42, - 0x81a49602, - 0x81e05982, - 0x82204802, - 0x8261f382, - 0x82a00bc2, - 0x82e04fc2, - 0x8326ff42, - 0x83605682, - 0x83a04bc2, - 0x83e08ac2, - 0x84216e02, - 0x8463d2c2, - 0x84a24a82, - 0xb40c4, - 0x2163c3, - 0x84e00ec2, - 0x85210482, - 0x85602f82, - 0x85a006c2, - 0x85e003c2, - 0x86200a82, - 0x824c7, - 0x86614e02, - 0x86a023c2, - 0x86e02442, - 0x87214d02, - 0x1b030c, - 0x87644d02, - 0x87a20302, - 0x87e02742, - 0x882038c2, - 0x88600f02, - 0x88a77dc2, - 0x88e02d02, - 0x8921c902, - 0x89678882, - 0x89a79482, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x15cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x81601143, - 0x215cc3, - 0x354344, - 0x2246c6, - 0x2f8f83, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x3758c9, - 0x247502, - 0x3d31c3, - 0x2bbf03, - 0x32fdc5, - 0x2020c3, - 0x201143, - 0x215cc3, - 0x2a2c03, - 0x229143, - 0x23c689, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x201143, - 0x215cc3, - 0x247502, - 0x247502, - 0x201143, - 0x215cc3, - 0x8a22f743, - 0x234e83, - 0x21fb43, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0xa7c88, - 0x203102, - 0x22f743, - 0x20ce83, - 0x23f7c3, - 0x22f743, - 0x234e83, - 0x224943, - 0x8ace63c2, - 0x211d83, - 0x20ce83, - 0x4783, - 0x23f7c3, - 0x15c1, - 0x23d544, - 0x203102, - 0x22f743, + 0x146c05, + 0x8d616542, + 0x10b384, + 0x405c5, + 0x8e743b43, + 0x21b283, + 0x201582, + 0x2296c3, + 0x3e8603, + 0x8ea0cb83, + 0x2faf43, + 0x2dc2c6, + 0xf57c5, + 0x1602b03, + 0x146c05, + 0x148d8b, + 0x793c8, + 0x8dbb6d08, + 0x6be87, + 0x8deca7ca, + 0x791c7, + 0x10f7c5, + 0x8e200f89, + 0x2f20d, + 0x430c2, + 0x11b842, + 0xe01, + 0xe91c4, + 0xb530a, + 0x7c4c7, + 0x30044, + 0x30083, + 0x30084, + 0x8f201f02, + 0x8f600ac2, + 0x8fa03b42, + 0x8fe030c2, + 0x90208742, + 0x90604182, + 0xb46c7, + 0x90a16542, + 0x90e19d82, + 0x9121d802, + 0x91603242, + 0x21f603, + 0x2a2c4, + 0x91aac1c8, + 0x213643, + 0x91e18902, + 0x68508, + 0x92204982, + 0x63187, + 0x1b88c7, + 0x92600042, + 0x92a00d82, + 0x92e00182, + 0x932042c2, + 0x93605502, + 0x93a005c2, + 0x11f405, + 0x20af03, + 0x2f44c4, + 0x93e00702, + 0x94211b82, + 0x94605542, + 0x92b8b, + 0x94a00c42, + 0x95256e02, + 0x95601582, + 0x95a02042, + 0x98e48, + 0x95e28882, + 0x96200bc2, + 0x96603742, + 0x96a77782, + 0x96e06c02, + 0x97205782, + 0x97604cc2, + 0x97a18f02, + 0x97e0d502, + 0x9820f502, + 0xac8c4, + 0x332ec3, + 0x9863d1c2, + 0x98a0bbc2, + 0x98e0cfc2, + 0x992006c2, + 0x996003c2, + 0x99a00a82, + 0xfa6c8, + 0x9c347, + 0x99e037c2, + 0x9a202a82, + 0x9a602b02, + 0x9aa0a0c2, + 0x176a8c, + 0x9ae2bdc2, + 0x9b22ce82, + 0x9b602e02, + 0x9ba05002, + 0x9be08e42, + 0x9c211842, + 0x9c6089c2, + 0x9ca13342, + 0x9ce81202, + 0x9d281742, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x207c3, + 0xd2443, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x94f4b203, + 0x2207c3, + 0x3c25c4, + 0x3d8906, + 0x309a43, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x35c349, + 0x204042, + 0x271c43, + 0x2cda43, + 0x3b6945, + 0x204f03, + 0x34b203, + 0x2207c3, + 0x2e69c3, + 0x22e683, + 0x3ca009, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x34b203, + 0x2207c3, + 0x204042, + 0x204042, + 0x34b203, + 0x2207c3, + 0x9da16543, + 0x222bc3, + 0x39d603, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x793c8, + 0x216542, + 0x216543, + 0x2296c3, + 0x20cb83, + 0x145842, + 0x216543, + 0x222bc3, + 0x343b43, + 0x9e51d0c2, + 0x216443, + 0x2296c3, + 0xd903, + 0x20cb83, + 0x1381, + 0x21d684, + 0x216542, + 0x216543, 0x200983, - 0x234e83, - 0x24f044, - 0x20d343, - 0x224943, - 0x221b84, - 0x214503, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x259703, - 0x207ac5, - 0x229143, - 0x2050c3, - 0x4783, - 0x203102, - 0x22f743, - 0x201143, - 0x20ce83, - 0x23f7c3, + 0x222bc3, + 0x256d44, + 0x2f5503, + 0x343b43, + 0x2b1b84, + 0x243543, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x24c343, + 0x355b45, + 0x22e683, + 0x201643, + 0x882, + 0xd903, + 0x216542, + 0x216543, + 0x34b203, + 0x2296c3, + 0x20cb83, 0x2000c2, - 0x24af03, - 0xa7c88, - 0x22f743, - 0x234e83, - 0x224943, - 0x231b06, - 0x221b84, - 0x214503, - 0x209c04, - 0x20ce83, - 0x23f7c3, - 0x214e03, - 0x22f743, - 0x234e83, - 0x20ce83, - 0x23f7c3, - 0x28002, - 0x1942, - 0x144e8c7, - 0x56107, - 0x22f743, - 0x25786, - 0x234e83, - 0x224943, - 0xe2cc6, - 0x20ce83, - 0x23f7c3, - 0x322548, - 0x325889, - 0x342f49, - 0x34c4c8, - 0x39abc8, - 0x39abc9, - 0x31ac4a, - 0x35e24a, - 0x395f8a, - 0x39c18a, - 0x3c8bca, - 0x3d588b, - 0x24638d, - 0x368e4f, - 0x276490, - 0x3605cd, + 0x253c43, + 0x793c8, + 0x216543, + 0x222bc3, + 0x343b43, + 0x239c86, + 0x2b1b84, + 0x243543, + 0x21b544, + 0x2296c3, + 0x20cb83, + 0x21f6c3, + 0xe804, + 0x2e702, + 0x216543, + 0x20a83, + 0x222bc3, + 0x1582, + 0x2296c3, + 0x20cb83, + 0x10e104, + 0x6ff44, + 0x2a02, + 0x148bb07, + 0x125887, + 0x216543, + 0x32f46, + 0x222bc3, + 0x343b43, + 0xf1386, + 0x2296c3, + 0x20cb83, + 0x32f188, + 0x3323c9, + 0x341cc9, + 0x34b688, + 0x39d208, + 0x39d209, + 0x325d0a, + 0x36084a, + 0x3979ca, + 0x39ecca, + 0x3d368a, + 0x3dfecb, + 0x2fc28d, + 0x2fcf4f, + 0x247450, + 0x3621cd, 0x3813cc, - 0x39becb, - 0x70a88, - 0xe6208, - 0x166745, - 0x14891c7, - 0xcc705, + 0x39ea0b, + 0x16108, + 0x13ec08, + 0x18a0c5, + 0x190209, + 0x1495c87, + 0xde645, 0x2000c2, - 0x2c5d45, - 0x20e903, - 0x8e203102, - 0x234e83, - 0x224943, - 0x391807, - 0x20b003, - 0x211d83, - 0x20ce83, - 0x22c483, - 0x2130c3, - 0x20b3c3, - 0x204783, - 0x23f7c3, - 0x254c06, - 0x21a602, - 0x2050c3, - 0xa7c88, + 0x2f67c5, + 0x209d03, + 0xa1e16542, + 0x222bc3, + 0x343b43, + 0x380b87, + 0x24c243, + 0x216443, + 0x2296c3, + 0x257743, + 0x20b243, + 0x20f1c3, + 0x20d903, + 0x20cb83, + 0x259186, + 0x213402, + 0x201643, + 0x793c8, 0x2000c2, - 0x24af03, - 0x203102, - 0x22f743, - 0x234e83, - 0x224943, - 0x221b84, - 0x211d83, - 0x20ce83, - 0x23f7c3, - 0x202443, - 0x56107, - 0xba42, - 0x127404, - 0x15c8f86, + 0x253c43, + 0x216542, + 0x216543, + 0x222bc3, + 0x343b43, + 0x2b1b84, + 0x216443, + 0x2296c3, + 0x20cb83, + 0x202b03, + 0x125887, + 0x14182, + 0x10e684, + 0x1534746, 0x2000c2, - 0x203102, - 0x224943, - 0x211d83, - 0x23f7c3, + 0x216542, + 0x343b43, + 0x216443, + 0x20cb83, } // children is the list of nodes' children, the parent's wildcard bit and the @@ -9427,576 +9781,655 @@ var children = [...]uint32{ 0x40000000, 0x50000000, 0x60000000, - 0x1820602, - 0x1824608, - 0x1828609, - 0x184c60a, - 0x19a8613, - 0x19c066a, - 0x19d4670, - 0x19ec675, - 0x1a0c67b, - 0x1a24683, - 0x1a3c689, - 0x1a5468f, + 0x17bc5e9, + 0x17c05ef, + 0x17c45f0, + 0x17e85f1, + 0x19405fa, + 0x1958650, + 0x196c656, + 0x198465b, + 0x19a4661, + 0x19c8669, + 0x19e0672, + 0x1a08678, + 0x1a0c682, + 0x1a34683, + 0x1a3868d, + 0x1a5068e, + 0x1a54694, 0x1a58695, - 0x1a80696, - 0x1a846a0, - 0x1a9c6a1, + 0x1a98696, + 0x1a9c6a6, 0x1aa06a7, - 0x1aa46a8, - 0x1ae06a9, - 0x1ae46b8, - 0x61aec6b9, - 0x21af46bb, - 0x1b3c6bd, - 0x1b406cf, - 0x1b686d0, - 0x1b6c6da, - 0x1b706db, - 0x1b846dc, - 0x1b886e1, - 0x1bb86e2, - 0x1bd46ee, - 0x1bfc6f5, - 0x1c0c6ff, - 0x1c10703, - 0x1ca8704, - 0x1cbc72a, - 0x1cd072f, - 0x1d08734, - 0x1d18742, - 0x1d2c746, - 0x1d4474b, - 0x1de8751, - 0x1fec77a, - 0x1ff07fb, - 0x205c7fc, - 0x20c8817, - 0x20e0832, - 0x20f4838, - 0x20f883d, - 0x210083e, - 0x2114840, - 0x2118845, - 0x2134846, - 0x218484d, - 0x2188861, - 0x2218c862, - 0x21a8863, - 0x21ac86a, - 0x21b086b, - 0x21d486c, - 0x2214875, - 0x2218885, - 0x6221c886, - 0x2234887, - 0x225488d, - 0x2260895, - 0x2270898, - 0x232489c, - 0x23288c9, - 0x223388ca, - 0x2233c8ce, - 0x223448cf, - 0x239c8d1, - 0x23a08e7, - 0x28948e8, - 0x2293ca25, - 0x22940a4f, - 0x22944a50, - 0x22950a51, - 0x22954a54, - 0x22960a55, - 0x22964a58, - 0x22968a59, - 0x2296ca5a, - 0x22970a5b, - 0x22974a5c, - 0x22980a5d, - 0x22984a60, - 0x22990a61, - 0x22994a64, - 0x22998a65, - 0x2299ca66, - 0x229a8a67, - 0x229aca6a, - 0x229b8a6b, - 0x229bca6e, - 0x229c0a6f, - 0x229c4a70, - 0x29c8a71, - 0x229cca72, - 0x229d8a73, - 0x229dca76, - 0x29e4a77, - 0x2a28a79, - 0x22a48a8a, - 0x22a4ca92, - 0x22a50a93, - 0x22a58a94, - 0x22a5ca96, - 0x2a60a97, - 0x22a64a98, - 0x22a68a99, - 0x22a6ca9a, - 0x2a74a9b, - 0x2a78a9d, - 0x2a7ca9e, - 0x2a98a9f, - 0x2ab0aa6, - 0x2ab4aac, - 0x2ac4aad, - 0x2ad0ab1, - 0x2b04ab4, - 0x2b08ac1, - 0x2b20ac2, - 0x22b28ac8, - 0x22b2caca, - 0x22b34acb, - 0x2c24acd, + 0x21aa46a8, + 0x61aac6a9, + 0x21ab46ab, + 0x1afc6ad, + 0x1b046bf, + 0x21b086c1, + 0x1b2c6c2, + 0x1b306cb, + 0x1b446cc, + 0x1b486d1, + 0x1b686d2, + 0x1b986da, + 0x1bb46e6, + 0x1bbc6ed, + 0x1be46ef, + 0x1bf86f9, + 0x21bfc6fe, + 0x1c006ff, + 0x1c98700, + 0x1cac726, + 0x1cc072b, + 0x1cfc730, + 0x1d0c73f, + 0x1d20743, + 0x1d38748, + 0x1ddc74e, + 0x2010777, + 0x2018804, + 0x2201c806, + 0x22020807, + 0x208c808, + 0x20f8823, + 0x211083e, + 0x2124844, + 0x2128849, + 0x213084a, + 0x214884c, + 0x214c852, + 0x2170853, + 0x21c085c, + 0x21c4870, + 0x221c8871, + 0x21e8872, + 0x21ec87a, + 0x21f087b, + 0x221c87c, + 0x62220887, + 0x22228888, + 0x2222c88a, + 0x227088b, + 0x227489c, + 0x6227889d, + 0x229489e, + 0x22e88a5, + 0x222ec8ba, + 0x222f08bb, + 0x222f88bc, + 0x222fc8be, + 0x223008bf, + 0x223048c0, + 0x230c8c1, + 0x23108c3, + 0x2231c8c4, + 0x223248c7, + 0x23348c9, + 0x23448cd, + 0x23f88d1, + 0x23fc8fe, + 0x2240c8ff, + 0x22410903, + 0x22418904, + 0x2470906, + 0x247491c, + 0x247891d, + 0x29ec91e, + 0x29f0a7b, + 0x22a98a7c, + 0x22a9caa6, + 0x22aa0aa7, + 0x22aacaa8, + 0x22ab0aab, + 0x22abcaac, + 0x22ac0aaf, + 0x22ac4ab0, + 0x22ac8ab1, + 0x22accab2, + 0x22ad0ab3, + 0x22adcab4, + 0x22ae0ab7, + 0x22aecab8, + 0x22af0abb, + 0x22af4abc, + 0x22af8abd, + 0x22b04abe, + 0x22b08ac1, + 0x22b14ac2, + 0x22b18ac5, + 0x22b1cac6, + 0x22b20ac7, + 0x2b24ac8, + 0x22b28ac9, + 0x22b34aca, + 0x22b38acd, + 0x2b3cace, + 0x2b44acf, + 0x22b50ad1, + 0x62b5cad4, + 0x2ba0ad7, + 0x2ba4ae8, + 0x22bc4ae9, + 0x22bc8af1, + 0x22bccaf2, + 0x22bd4af3, + 0x22bdcaf5, + 0x22be0af7, + 0x22be4af8, + 0x22becaf9, + 0x22bf0afb, + 0x22bf4afc, + 0x2bf8afd, + 0x22c18afe, + 0x22c1cb06, + 0x22c20b07, + 0x22c24b08, 0x22c28b09, - 0x2c30b0a, - 0x2c34b0c, + 0x22c34b0a, 0x22c38b0d, 0x2c3cb0e, - 0x2c54b0f, - 0x2c58b15, - 0x2c5cb16, - 0x2c60b17, - 0x2c78b18, - 0x2c8cb1e, - 0x2cb4b23, - 0x2cd4b2d, - 0x2cd8b35, - 0x62cdcb36, - 0x2d10b37, - 0x2d14b44, - 0x22d18b45, - 0x2d1cb46, - 0x2d44b47, - 0x2d48b51, - 0x2d6cb52, - 0x2d70b5b, - 0x2d84b5c, - 0x2d88b61, - 0x2d8cb62, - 0x2dacb63, - 0x2dc8b6b, - 0x2dccb72, - 0x22dd0b73, - 0x2dd4b74, - 0x2dd8b75, - 0x2ddcb76, - 0x2de4b77, - 0x2df8b79, - 0x2dfcb7e, - 0x2e00b7f, - 0x2e04b80, - 0x2e74b81, - 0x2e78b9d, - 0x2e7cb9e, - 0x2e9cb9f, - 0x2eb0ba7, - 0x2ec4bac, - 0x2edcbb1, - 0x2ef8bb7, - 0x2f10bbe, - 0x2f14bc4, - 0x2f2cbc5, - 0x2f48bcb, + 0x2c44b0f, + 0x2c4cb11, + 0x2c50b13, + 0x2c6cb14, + 0x2c84b1b, + 0x2c88b21, + 0x2c98b22, + 0x2ca4b26, + 0x2cd8b29, + 0x2ce0b36, + 0x22ce4b38, + 0x2cfcb39, + 0x22d04b3f, + 0x22d08b41, + 0x22d10b42, + 0x2e0cb44, + 0x22e10b83, + 0x2e18b84, + 0x2e1cb86, + 0x22e20b87, + 0x2e24b88, + 0x2e54b89, + 0x2e58b95, + 0x2e5cb96, + 0x2e74b97, + 0x2e88b9d, + 0x2eb0ba2, + 0x2ed8bac, + 0x2edcbb6, + 0x62ee0bb7, + 0x2f14bb8, + 0x2f18bc5, + 0x22f1cbc6, + 0x2f20bc7, + 0x2f48bc8, 0x2f4cbd2, - 0x2f6cbd3, - 0x2f8cbdb, - 0x2fa8be3, - 0x300cbea, - 0x3028c03, - 0x3038c0a, - 0x303cc0e, - 0x3054c0f, - 0x3098c15, - 0x3118c26, - 0x3148c46, - 0x314cc52, - 0x3158c53, - 0x3178c56, - 0x317cc5e, - 0x31a0c5f, - 0x31a8c68, - 0x31e4c6a, - 0x3234c79, - 0x3238c8d, - 0x323cc8e, - 0x3304c8f, - 0x23308cc1, - 0x2330ccc2, - 0x3310cc3, - 0x23314cc4, - 0x23318cc5, - 0x2331ccc6, - 0x2332ccc7, - 0x23330ccb, - 0x23334ccc, - 0x23338ccd, - 0x2333ccce, - 0x3354ccf, - 0x3378cd5, - 0x3398cde, - 0x3a04ce6, - 0x3a10e81, - 0x3a30e84, - 0x3bf0e8c, - 0x3cc0efc, - 0x3d30f30, - 0x3d88f4c, - 0x3e70f62, - 0x3ec8f9c, - 0x3f04fb2, - 0x4000fc1, - 0x40cd000, - 0x4165033, - 0x41f5059, - 0x425907d, - 0x4491096, - 0x4549124, - 0x4615152, - 0x4661185, - 0x46e9198, - 0x47251ba, - 0x47751c9, - 0x47ed1dd, - 0x647f11fb, - 0x647f51fc, - 0x647f91fd, - 0x48751fe, - 0x48d121d, - 0x494d234, - 0x49c5253, - 0x4a45271, - 0x4ab1291, - 0x4bdd2ac, - 0x4c352f7, - 0x64c3930d, - 0x4cd130e, - 0x4cd9334, - 0x24cdd336, - 0x4d65337, - 0x4db1359, - 0x4e1936c, - 0x4ec1386, - 0x4f893b0, - 0x4ff13e2, - 0x51053fc, - 0x65109441, - 0x6510d442, - 0x5169443, - 0x51c545a, - 0x5255471, - 0x52d1495, - 0x53154b4, - 0x53f94c5, - 0x542d4fe, - 0x548d50b, - 0x5501523, - 0x5589540, - 0x55c9562, - 0x5639572, - 0x6563d58e, - 0x566558f, - 0x5669599, - 0x568159a, - 0x569d5a0, - 0x56e15a7, - 0x56f15b8, - 0x57095bc, - 0x57815c2, - 0x57895e0, - 0x57a55e2, - 0x57b95e9, - 0x57d55ee, - 0x58015f5, - 0x5805600, - 0x580d601, - 0x5821603, - 0x5841608, - 0x5851610, - 0x585d614, - 0x5899617, - 0x58a1626, - 0x58b5628, - 0x58d962d, - 0x58e5636, - 0x58ed639, - 0x591163b, - 0x5935644, - 0x594d64d, - 0x5951653, - 0x5959654, - 0x595d656, - 0x59f9657, - 0x59fd67e, - 0x5a0167f, - 0x5a05680, - 0x5a29681, - 0x5a4d68a, - 0x5a69693, - 0x5a7d69a, - 0x5a9169f, - 0x5a996a4, - 0x5aa16a6, - 0x5aa96a8, - 0x5ac16aa, - 0x5ad16b0, - 0x5ad56b4, - 0x5af16b5, - 0x63796bc, - 0x63b18de, - 0x63dd8ec, - 0x63f98f7, - 0x64198fe, - 0x6439906, - 0x647d90e, - 0x648591f, - 0x26489921, - 0x2648d922, - 0x6495923, - 0x665d925, - 0x26661997, - 0x26671998, - 0x2667999c, - 0x2668599e, - 0x66899a1, - 0x266919a2, - 0x66999a4, - 0x66a99a6, - 0x66d19aa, - 0x67099b4, - 0x670d9c2, - 0x67459c3, - 0x67659d1, - 0x72bd9d9, - 0x72c1caf, - 0x72c5cb0, - 0x272c9cb1, - 0x72cdcb2, - 0x272d1cb3, - 0x72d5cb4, - 0x272e1cb5, - 0x72e5cb8, - 0x72e9cb9, - 0x272edcba, - 0x72f1cbb, - 0x272f9cbc, - 0x72fdcbe, - 0x7301cbf, - 0x27311cc0, - 0x7315cc4, - 0x7319cc5, - 0x731dcc6, - 0x7321cc7, - 0x27325cc8, - 0x7329cc9, - 0x732dcca, - 0x7331ccb, - 0x7335ccc, - 0x2733dccd, - 0x7341ccf, - 0x7345cd0, - 0x7349cd1, - 0x2734dcd2, - 0x7351cd3, - 0x27359cd4, - 0x2735dcd6, - 0x7379cd7, - 0x7391cde, - 0x27395ce4, - 0x73d9ce5, - 0x73ddcf6, - 0x7401cf7, - 0x740dd00, - 0x7411d03, - 0x7415d04, - 0x75d1d05, - 0x275d5d74, - 0x275ddd75, - 0x275e1d77, - 0x275e5d78, - 0x75edd79, - 0x76c9d7b, - 0x276d5db2, - 0x276d9db5, - 0x276dddb6, - 0x276e1db7, - 0x76e5db8, - 0x7711db9, + 0x2f70bd3, + 0x2f74bdc, + 0x2f88bdd, + 0x2f8cbe2, + 0x2f90be3, + 0x2fb0be4, + 0x2fd4bec, + 0x22fd8bf5, + 0x22fdcbf6, + 0x2fe0bf7, + 0x22fe4bf8, + 0x2fe8bf9, + 0x2fecbfa, + 0x2ff0bfb, + 0x2ff4bfc, + 0x3010bfd, + 0x23014c04, + 0x2301cc05, + 0x3020c07, + 0x3048c08, + 0x305cc12, + 0x30d0c17, + 0x30dcc34, + 0x30e0c37, + 0x3100c38, + 0x3118c40, + 0x311cc46, + 0x3130c47, + 0x3148c4c, + 0x3168c52, + 0x3180c5a, + 0x3188c60, + 0x31a4c62, + 0x31c0c69, + 0x31c4c70, + 0x31f0c71, + 0x3210c7c, + 0x3230c84, + 0x3298c8c, + 0x32b8ca6, + 0x32d8cae, + 0x32dccb6, + 0x32f4cb7, + 0x3338cbd, + 0x33b8cce, + 0x33f4cee, + 0x33f8cfd, + 0x3404cfe, + 0x3424d01, + 0x3428d09, + 0x344cd0a, + 0x3454d13, + 0x3494d15, + 0x34e8d25, + 0x34ecd3a, + 0x34f0d3b, + 0x35e4d3c, + 0x235ecd79, + 0x235f0d7b, + 0x235f4d7c, + 0x35f8d7d, + 0x235fcd7e, + 0x23600d7f, + 0x23604d80, + 0x3608d81, + 0x2360cd82, + 0x2361cd83, + 0x23620d87, + 0x23624d88, + 0x23628d89, + 0x2362cd8a, + 0x23638d8b, + 0x2363cd8e, + 0x3654d8f, + 0x3678d95, + 0x3698d9e, + 0x3d0cda6, + 0x23d10f43, + 0x23d14f44, + 0x23d18f45, + 0x23d1cf46, + 0x3d2cf47, + 0x3d4cf4b, + 0x3f0cf53, + 0x3fdcfc3, + 0x404cff7, + 0x40a5013, + 0x418d029, + 0x41e5063, + 0x4221079, + 0x431d088, + 0x43e90c7, + 0x44810fa, + 0x4511120, + 0x4575144, + 0x47ad15d, + 0x48651eb, + 0x4931219, + 0x497d24c, + 0x4a0525f, + 0x4a41281, + 0x4a91290, + 0x4b092a4, + 0x64b0d2c2, + 0x64b112c3, + 0x64b152c4, + 0x4b912c5, + 0x4bed2e4, + 0x4c692fb, + 0x4ce131a, + 0x4d61338, + 0x4dcd358, + 0x4ef9373, + 0x4f513be, + 0x64f553d4, + 0x4fed3d5, + 0x4ff53fb, + 0x24ff93fd, + 0x50813fe, + 0x50cd420, + 0x5135433, + 0x51dd44d, + 0x52a5477, + 0x530d4a9, + 0x54214c3, + 0x65425508, + 0x65429509, + 0x548550a, + 0x54e1521, + 0x5571538, + 0x55ed55c, + 0x563157b, + 0x571558c, + 0x57495c5, + 0x57a95d2, + 0x581d5ea, + 0x58a5607, + 0x58e5629, + 0x5955639, + 0x65959655, + 0x5981656, + 0x5985660, + 0x59b5661, + 0x59d166d, + 0x5a15674, + 0x5a25685, + 0x5a3d689, + 0x5ab568f, + 0x5abd6ad, + 0x5ad96af, + 0x5aed6b6, + 0x5b116bb, + 0x25b156c4, + 0x5b416c5, + 0x5b456d0, + 0x5b4d6d1, + 0x5b616d3, + 0x5b816d8, + 0x5b916e0, + 0x5b9d6e4, + 0x5bd96e7, + 0x5bdd6f6, + 0x5be56f7, + 0x5bf96f9, + 0x5c216fe, + 0x5c2d708, + 0x5c3570b, + 0x5c5d70d, + 0x5c81717, + 0x5c99720, + 0x5c9d726, + 0x5ca5727, + 0x5cad729, + 0x5cc172b, + 0x5d71730, + 0x5d7575c, + 0x5d7d75d, + 0x5d8175f, + 0x5da5760, + 0x5dc9769, + 0x5de5772, + 0x5df9779, + 0x5e0d77e, + 0x5e15783, + 0x5e1d785, + 0x5e25787, + 0x5e3d789, + 0x5e4d78f, + 0x5e51793, + 0x5e6d794, + 0x66f579b, + 0x672d9bd, + 0x67599cb, + 0x67759d6, + 0x67799dd, + 0x2677d9de, + 0x679d9df, + 0x67bd9e7, + 0x68019ef, + 0x6809a00, + 0x2680da02, + 0x26811a03, + 0x6819a04, + 0x6a35a06, + 0x6a49a8d, + 0x26a4da92, + 0x6a51a93, + 0x6a59a94, + 0x26a5da96, + 0x26a61a97, + 0x26a6da98, + 0x26a7da9b, + 0x26a85a9f, + 0x26a91aa1, + 0x6a95aa4, + 0x26a99aa5, + 0x26ab1aa6, + 0x26ab9aac, + 0x26abdaae, + 0x26ac5aaf, + 0x26ac9ab1, + 0x26acdab2, + 0x26ad5ab3, + 0x6addab5, + 0x6af1ab7, + 0x6b19abc, + 0x6b55ac6, + 0x6b59ad5, + 0x6b91ad6, + 0x6bb5ae4, + 0x770daed, + 0x7711dc3, 0x7715dc4, - 0x7719dc5, - 0x773ddc6, - 0x7749dcf, - 0x7769dd2, + 0x27719dc5, + 0x771ddc6, + 0x27721dc7, + 0x7725dc8, + 0x27731dc9, + 0x7735dcc, + 0x7739dcd, + 0x2773ddce, + 0x7741dcf, + 0x27749dd0, + 0x774ddd2, + 0x7751dd3, + 0x27761dd4, + 0x7765dd8, + 0x7769dd9, 0x776ddda, - 0x77a5ddb, - 0x7a55de9, - 0x7b11e95, - 0x7b15ec4, - 0x7b19ec5, - 0x7b2dec6, - 0x7b61ecb, - 0x7b99ed8, - 0x27b9dee6, - 0x7bb9ee7, - 0x7be1eee, - 0x7be5ef8, - 0x7c09ef9, - 0x7c25f02, - 0x7c4df09, - 0x7c5df13, - 0x7c61f17, - 0x7c65f18, - 0x7c9df19, - 0x7ca9f27, - 0x7cd1f2a, - 0x7d51f34, - 0x27d55f54, - 0x7d65f55, - 0x7d75f59, - 0x7d91f5d, - 0x7db1f64, - 0x7db5f6c, - 0x7dc9f6d, - 0x7dddf72, - 0x7de1f77, - 0x7de5f78, - 0x7e05f79, - 0x7eadf81, - 0x7eb1fab, - 0x7ecdfac, - 0x7ef1fb3, - 0x7ef5fbc, - 0x7efdfbd, - 0x7f19fbf, - 0x7f21fc6, - 0x7f35fc8, - 0x7f55fcd, - 0x7f71fd5, - 0x7f7dfdc, - 0x7f95fdf, - 0x7fcdfe5, - 0x80a1ff3, - 0x80a6028, - 0x80ba029, - 0x80c202e, - 0x80da030, - 0x80de036, - 0x80ea037, - 0x80ee03a, - 0x80f203b, - 0x811603c, - 0x8156045, - 0x815a055, - 0x817a056, - 0x81ca05e, - 0x81ea072, - 0x281ee07a, - 0x81f607b, - 0x824e07d, - 0x8252093, - 0x8256094, - 0x825a095, - 0x829e096, - 0x82ae0a7, - 0x82ee0ab, - 0x82f20bb, - 0x83220bc, - 0x846a0c8, - 0x849211a, - 0x84c2124, - 0x84e2130, - 0x284ea138, - 0x84f213a, - 0x84fe13c, - 0x861213f, - 0x861e184, - 0x862a187, - 0x863618a, - 0x864218d, - 0x864e190, - 0x865a193, - 0x8666196, - 0x8672199, - 0x867e19c, - 0x868a19f, - 0x86961a2, - 0x86a21a5, - 0x86ae1a8, - 0x86b61ab, - 0x86c21ad, - 0x86ce1b0, - 0x86da1b3, - 0x86e61b6, - 0x86f21b9, - 0x86fe1bc, - 0x870a1bf, - 0x87161c2, - 0x87221c5, - 0x872e1c8, - 0x873a1cb, - 0x87661ce, - 0x87721d9, - 0x877e1dc, - 0x878a1df, - 0x87961e2, - 0x87a21e5, - 0x87aa1e8, - 0x87b61ea, - 0x87c21ed, - 0x87ce1f0, - 0x87da1f3, - 0x87e61f6, - 0x87f21f9, - 0x87fe1fc, - 0x880a1ff, - 0x8816202, - 0x8822205, - 0x882e208, - 0x883a20b, - 0x884620e, - 0x884e211, - 0x885a213, - 0x8866216, - 0x8872219, - 0x887e21c, - 0x888a21f, - 0x8896222, - 0x88a2225, - 0x88ae228, - 0x88b222b, - 0x88be22c, - 0x88da22f, - 0x88de236, - 0x88ee237, - 0x890e23b, - 0x8912243, - 0x8956244, - 0x895a255, - 0x896e256, - 0x89a225b, - 0x89b2268, - 0x89ba26c, - 0x89de26e, - 0x89f6277, - 0x8a0e27d, - 0x8a26283, - 0x8a3a289, - 0x28a8228e, - 0x8a862a0, - 0x8ab22a1, - 0x8ac22ac, - 0x8ad62b0, + 0x7771ddb, + 0x27775ddc, + 0x7779ddd, + 0x777ddde, + 0x7781ddf, + 0x7785de0, + 0x2778dde1, + 0x7791de3, + 0x7795de4, + 0x7799de5, + 0x2779dde6, + 0x77a1de7, + 0x277a9de8, + 0x277addea, + 0x77c9deb, + 0x77e1df2, + 0x7825df8, + 0x7829e09, + 0x784de0a, + 0x7861e13, + 0x7865e18, + 0x7869e19, + 0x7a2de1a, + 0x27a31e8b, + 0x27a39e8c, + 0x27a3de8e, + 0x27a41e8f, + 0x7a49e90, + 0x7b25e92, + 0x27b31ec9, + 0x27b35ecc, + 0x27b39ecd, + 0x27b3dece, + 0x7b41ecf, + 0x7b6ded0, + 0x7b79edb, + 0x7b7dede, + 0x7ba1edf, + 0x7badee8, + 0x7bcdeeb, + 0x7bd1ef3, + 0x7c09ef4, + 0x7ebdf02, + 0x7f79faf, + 0x7f7dfde, + 0x7f81fdf, + 0x7f95fe0, + 0x7f99fe5, + 0x7fcdfe6, + 0x8005ff3, + 0x2800a001, + 0x8026002, + 0x804e009, + 0x8052013, + 0x8076014, + 0x809201d, + 0x80ba024, + 0x80ca02e, + 0x80ce032, + 0x80d2033, + 0x810e034, + 0x811a043, + 0x8142046, + 0x81de050, + 0x281e2077, + 0x81e6078, + 0x81f6079, + 0x281fa07d, + 0x820a07e, + 0x8226082, + 0x8246089, + 0x824a091, + 0x825e092, + 0x8272097, + 0x827609c, + 0x827a09d, + 0x827e09e, + 0x829e09f, + 0x834a0a7, + 0x834e0d2, + 0x836e0d3, + 0x839a0db, + 0x283aa0e6, + 0x83ae0ea, + 0x83be0eb, + 0x83f60ef, + 0x83fe0fd, + 0x84120ff, + 0x8432104, + 0x844e10c, + 0x845a113, + 0x8472116, + 0x84aa11c, + 0x84ae12a, + 0x858212b, + 0x8586160, + 0x859a161, + 0x85a2166, + 0x85ba168, + 0x85be16e, + 0x85ca16f, + 0x85d6172, + 0x85da175, + 0x85e2176, + 0x85e6178, + 0x860a179, + 0x864a182, + 0x864e192, + 0x866e193, + 0x86c219b, + 0x86f21b0, + 0x286f61bc, + 0x86fe1bd, + 0x87561bf, + 0x875a1d5, + 0x875e1d6, + 0x87621d7, + 0x87a61d8, + 0x87b61e9, + 0x87f61ed, + 0x87fa1fd, + 0x882a1fe, + 0x897620a, + 0x899e25d, + 0x89da267, + 0x8a02276, + 0x28a0a280, + 0x28a0e282, + 0x28a12283, + 0x8a1a284, + 0x8a26286, + 0x8b4a289, + 0x8b562d2, + 0x8b622d5, + 0x8b6e2d8, + 0x8b7a2db, + 0x8b862de, + 0x8b922e1, + 0x8b9e2e4, + 0x8baa2e7, + 0x8bb62ea, + 0x8bc22ed, + 0x28bc62f0, + 0x8bd22f1, + 0x8bde2f4, + 0x8bea2f7, + 0x8bf22fa, + 0x8bfe2fc, + 0x8c0a2ff, + 0x8c16302, + 0x8c22305, + 0x8c2e308, + 0x8c3a30b, + 0x8c4630e, + 0x8c52311, + 0x8c5e314, + 0x8c6a317, + 0x8c7631a, + 0x8ca231d, + 0x8cae328, + 0x8cba32b, + 0x8cc632e, + 0x8cd2331, + 0x8cde334, + 0x8ce6337, + 0x8cf2339, + 0x8cfe33c, + 0x8d0a33f, + 0x8d16342, + 0x8d22345, + 0x8d2e348, + 0x8d3a34b, + 0x8d4634e, + 0x8d52351, + 0x8d5e354, + 0x8d6a357, + 0x8d7235a, + 0x8d7e35c, + 0x8d8635f, + 0x8d92361, + 0x8d9e364, + 0x8daa367, + 0x8db636a, + 0x8dc236d, + 0x8dce370, + 0x8dda373, + 0x8de6376, + 0x8dea379, + 0x8df637a, + 0x8e1237d, + 0x8e16384, + 0x8e26385, + 0x8e4a389, + 0x8e4e392, + 0x8e92393, + 0x8e9a3a4, + 0x8eae3a6, + 0x8ee23ab, + 0x8f023b8, + 0x8f063c0, + 0x8f0e3c1, + 0x8f323c3, + 0x8f4a3cc, + 0x8f623d2, + 0x8f7a3d8, + 0x8f923de, + 0x28fda3e4, + 0x8fde3f6, + 0x900a3f7, + 0x901a402, + 0x902e406, } -// max children 571 (capacity 1023) -// max text offset 30545 (capacity 32767) +// max children 650 (capacity 1023) +// max text offset 31341 (capacity 32767) // max text length 36 (capacity 63) -// max hi 8885 (capacity 16383) -// max lo 8880 (capacity 16383) +// max hi 9227 (capacity 16383) +// max lo 9222 (capacity 16383) diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md index 0f443e6..8cfd606 100644 --- a/vendor/golang.org/x/oauth2/README.md +++ b/vendor/golang.org/x/oauth2/README.md @@ -16,15 +16,16 @@ Or you can manually git clone the repository to See godoc for further documentation and examples. -* [godoc.org/golang.org/x/oauth2](http://godoc.org/golang.org/x/oauth2) -* [godoc.org/golang.org/x/oauth2/google](http://godoc.org/golang.org/x/oauth2/google) +* [godoc.org/golang.org/x/oauth2](https://godoc.org/golang.org/x/oauth2) +* [godoc.org/golang.org/x/oauth2/google](https://godoc.org/golang.org/x/oauth2/google) ## Policy for new packages -We no longer accept new provider-specific packages in this repo. For -defining provider endpoints and provider-specific OAuth2 behavior, we -encourage you to create packages elsewhere. We'll keep the existing -packages for compatibility. +We no longer accept new provider-specific packages in this repo if all +they do is add a single endpoint variable. If you just want to add a +single endpoint, add it to the +[godoc.org/golang.org/x/oauth2/endpoints](https://godoc.org/golang.org/x/oauth2/endpoints) +package. ## Report Issues / Send Patches diff --git a/vendor/golang.org/x/oauth2/bitbucket/bitbucket.go b/vendor/golang.org/x/oauth2/bitbucket/bitbucket.go new file mode 100644 index 0000000..44af1f1 --- /dev/null +++ b/vendor/golang.org/x/oauth2/bitbucket/bitbucket.go @@ -0,0 +1,16 @@ +// Copyright 2015 The oauth2 Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package bitbucket provides constants for using OAuth2 to access Bitbucket. +package bitbucket + +import ( + "golang.org/x/oauth2" +) + +// Endpoint is Bitbucket's OAuth 2.0 endpoint. +var Endpoint = oauth2.Endpoint{ + AuthURL: "https://bitbucket.org/site/oauth2/authorize", + TokenURL: "https://bitbucket.org/site/oauth2/access_token", +} diff --git a/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go b/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go new file mode 100644 index 0000000..7a0b9ed --- /dev/null +++ b/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go @@ -0,0 +1,120 @@ +// Copyright 2014 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package clientcredentials implements the OAuth2.0 "client credentials" token flow, +// also known as the "two-legged OAuth 2.0". +// +// This should be used when the client is acting on its own behalf or when the client +// is the resource owner. It may also be used when requesting access to protected +// resources based on an authorization previously arranged with the authorization +// server. +// +// See https://tools.ietf.org/html/rfc6749#section-4.4 +package clientcredentials // import "golang.org/x/oauth2/clientcredentials" + +import ( + "context" + "fmt" + "net/http" + "net/url" + "strings" + + "golang.org/x/oauth2" + "golang.org/x/oauth2/internal" +) + +// Config describes a 2-legged OAuth2 flow, with both the +// client application information and the server's endpoint URLs. +type Config struct { + // ClientID is the application's ID. + ClientID string + + // ClientSecret is the application's secret. + ClientSecret string + + // TokenURL is the resource server's token endpoint + // URL. This is a constant specific to each server. + TokenURL string + + // Scope specifies optional requested permissions. + Scopes []string + + // EndpointParams specifies additional parameters for requests to the token endpoint. + EndpointParams url.Values + + // AuthStyle optionally specifies how the endpoint wants the + // client ID & client secret sent. The zero value means to + // auto-detect. + AuthStyle oauth2.AuthStyle +} + +// Token uses client credentials to retrieve a token. +// +// The provided context optionally controls which HTTP client is used. See the oauth2.HTTPClient variable. +func (c *Config) Token(ctx context.Context) (*oauth2.Token, error) { + return c.TokenSource(ctx).Token() +} + +// Client returns an HTTP client using the provided token. +// The token will auto-refresh as necessary. +// +// The provided context optionally controls which HTTP client +// is returned. See the oauth2.HTTPClient variable. +// +// The returned Client and its Transport should not be modified. +func (c *Config) Client(ctx context.Context) *http.Client { + return oauth2.NewClient(ctx, c.TokenSource(ctx)) +} + +// TokenSource returns a TokenSource that returns t until t expires, +// automatically refreshing it as necessary using the provided context and the +// client ID and client secret. +// +// Most users will use Config.Client instead. +func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource { + source := &tokenSource{ + ctx: ctx, + conf: c, + } + return oauth2.ReuseTokenSource(nil, source) +} + +type tokenSource struct { + ctx context.Context + conf *Config +} + +// Token refreshes the token by using a new client credentials request. +// tokens received this way do not include a refresh token +func (c *tokenSource) Token() (*oauth2.Token, error) { + v := url.Values{ + "grant_type": {"client_credentials"}, + } + if len(c.conf.Scopes) > 0 { + v.Set("scope", strings.Join(c.conf.Scopes, " ")) + } + for k, p := range c.conf.EndpointParams { + // Allow grant_type to be overridden to allow interoperability with + // non-compliant implementations. + if _, ok := v[k]; ok && k != "grant_type" { + return nil, fmt.Errorf("oauth2: cannot overwrite parameter %q", k) + } + v[k] = p + } + + tk, err := internal.RetrieveToken(c.ctx, c.conf.ClientID, c.conf.ClientSecret, c.conf.TokenURL, v, internal.AuthStyle(c.conf.AuthStyle)) + if err != nil { + if rErr, ok := err.(*internal.RetrieveError); ok { + return nil, (*oauth2.RetrieveError)(rErr) + } + return nil, err + } + t := &oauth2.Token{ + AccessToken: tk.AccessToken, + TokenType: tk.TokenType, + RefreshToken: tk.RefreshToken, + Expiry: tk.Expiry, + } + return t.WithExtra(tk.Raw), nil +} diff --git a/vendor/golang.org/x/oauth2/go.mod b/vendor/golang.org/x/oauth2/go.mod deleted file mode 100644 index b345781..0000000 --- a/vendor/golang.org/x/oauth2/go.mod +++ /dev/null @@ -1,10 +0,0 @@ -module golang.org/x/oauth2 - -go 1.11 - -require ( - cloud.google.com/go v0.34.0 - golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect - google.golang.org/appengine v1.4.0 -) diff --git a/vendor/golang.org/x/oauth2/go.sum b/vendor/golang.org/x/oauth2/go.sum deleted file mode 100644 index 6f0079b..0000000 --- a/vendor/golang.org/x/oauth2/go.sum +++ /dev/null @@ -1,12 +0,0 @@ -cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/vendor/golang.org/x/oauth2/transport.go b/vendor/golang.org/x/oauth2/transport.go index aa0d34f..9065791 100644 --- a/vendor/golang.org/x/oauth2/transport.go +++ b/vendor/golang.org/x/oauth2/transport.go @@ -6,7 +6,7 @@ package oauth2 import ( "errors" - "io" + "log" "net/http" "sync" ) @@ -25,9 +25,6 @@ type Transport struct { // Base is the base RoundTripper used to make HTTP requests. // If nil, http.DefaultTransport is used. Base http.RoundTripper - - mu sync.Mutex // guards modReq - modReq map[*http.Request]*http.Request // original -> modified } // RoundTrip authorizes and authenticates the request with an @@ -52,35 +49,22 @@ func (t *Transport) RoundTrip(req *http.Request) (*http.Response, error) { req2 := cloneRequest(req) // per RoundTripper contract token.SetAuthHeader(req2) - t.setModReq(req, req2) - res, err := t.base().RoundTrip(req2) - // req.Body is assumed to have been closed by the base RoundTripper. + // req.Body is assumed to be closed by the base RoundTripper. reqBodyClosed = true - - if err != nil { - t.setModReq(req, nil) - return nil, err - } - res.Body = &onEOFReader{ - rc: res.Body, - fn: func() { t.setModReq(req, nil) }, - } - return res, nil + return t.base().RoundTrip(req2) } -// CancelRequest cancels an in-flight request by closing its connection. +var cancelOnce sync.Once + +// CancelRequest does nothing. It used to be a legacy cancellation mechanism +// but now only it only logs on first use to warn that it's deprecated. +// +// Deprecated: use contexts for cancellation instead. func (t *Transport) CancelRequest(req *http.Request) { - type canceler interface { - CancelRequest(*http.Request) - } - if cr, ok := t.base().(canceler); ok { - t.mu.Lock() - modReq := t.modReq[req] - delete(t.modReq, req) - t.mu.Unlock() - cr.CancelRequest(modReq) - } + cancelOnce.Do(func() { + log.Printf("deprecated: golang.org/x/oauth2: Transport.CancelRequest no longer does anything; use contexts") + }) } func (t *Transport) base() http.RoundTripper { @@ -90,19 +74,6 @@ func (t *Transport) base() http.RoundTripper { return http.DefaultTransport } -func (t *Transport) setModReq(orig, mod *http.Request) { - t.mu.Lock() - defer t.mu.Unlock() - if t.modReq == nil { - t.modReq = make(map[*http.Request]*http.Request) - } - if mod == nil { - delete(t.modReq, orig) - } else { - t.modReq[orig] = mod - } -} - // cloneRequest returns a clone of the provided *http.Request. // The clone is a shallow copy of the struct and its Header map. func cloneRequest(r *http.Request) *http.Request { @@ -116,29 +87,3 @@ func cloneRequest(r *http.Request) *http.Request { } return r2 } - -type onEOFReader struct { - rc io.ReadCloser - fn func() -} - -func (r *onEOFReader) Read(p []byte) (n int, err error) { - n, err = r.rc.Read(p) - if err == io.EOF { - r.runFunc() - } - return -} - -func (r *onEOFReader) Close() error { - err := r.rc.Close() - r.runFunc() - return err -} - -func (r *onEOFReader) runFunc() { - if fn := r.fn; fn != nil { - fn() - r.fn = nil - } -} diff --git a/vendor/gopkg.in/yaml.v2/.travis.yml b/vendor/gopkg.in/yaml.v2/.travis.yml deleted file mode 100644 index 9f55693..0000000 --- a/vendor/gopkg.in/yaml.v2/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go - -go: - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - 1.8 - - 1.9 - - tip - -go_import_path: gopkg.in/yaml.v2 diff --git a/vendor/gopkg.in/yaml.v2/LICENSE b/vendor/gopkg.in/yaml.v2/LICENSE deleted file mode 100644 index 8dada3e..0000000 --- a/vendor/gopkg.in/yaml.v2/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/gopkg.in/yaml.v2/decode.go b/vendor/gopkg.in/yaml.v2/decode.go deleted file mode 100644 index e4e56e2..0000000 --- a/vendor/gopkg.in/yaml.v2/decode.go +++ /dev/null @@ -1,775 +0,0 @@ -package yaml - -import ( - "encoding" - "encoding/base64" - "fmt" - "io" - "math" - "reflect" - "strconv" - "time" -) - -const ( - documentNode = 1 << iota - mappingNode - sequenceNode - scalarNode - aliasNode -) - -type node struct { - kind int - line, column int - tag string - // For an alias node, alias holds the resolved alias. - alias *node - value string - implicit bool - children []*node - anchors map[string]*node -} - -// ---------------------------------------------------------------------------- -// Parser, produces a node tree out of a libyaml event stream. - -type parser struct { - parser yaml_parser_t - event yaml_event_t - doc *node - doneInit bool -} - -func newParser(b []byte) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - if len(b) == 0 { - b = []byte{'\n'} - } - yaml_parser_set_input_string(&p.parser, b) - return &p -} - -func newParserFromReader(r io.Reader) *parser { - p := parser{} - if !yaml_parser_initialize(&p.parser) { - panic("failed to initialize YAML emitter") - } - yaml_parser_set_input_reader(&p.parser, r) - return &p -} - -func (p *parser) init() { - if p.doneInit { - return - } - p.expect(yaml_STREAM_START_EVENT) - p.doneInit = true -} - -func (p *parser) destroy() { - if p.event.typ != yaml_NO_EVENT { - yaml_event_delete(&p.event) - } - yaml_parser_delete(&p.parser) -} - -// expect consumes an event from the event stream and -// checks that it's of the expected type. -func (p *parser) expect(e yaml_event_type_t) { - if p.event.typ == yaml_NO_EVENT { - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - } - if p.event.typ == yaml_STREAM_END_EVENT { - failf("attempted to go past the end of stream; corrupted value?") - } - if p.event.typ != e { - p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) - p.fail() - } - yaml_event_delete(&p.event) - p.event.typ = yaml_NO_EVENT -} - -// peek peeks at the next event in the event stream, -// puts the results into p.event and returns the event type. -func (p *parser) peek() yaml_event_type_t { - if p.event.typ != yaml_NO_EVENT { - return p.event.typ - } - if !yaml_parser_parse(&p.parser, &p.event) { - p.fail() - } - return p.event.typ -} - -func (p *parser) fail() { - var where string - var line int - if p.parser.problem_mark.line != 0 { - line = p.parser.problem_mark.line - // Scanner errors don't iterate line before returning error - if p.parser.error == yaml_SCANNER_ERROR { - line++ - } - } else if p.parser.context_mark.line != 0 { - line = p.parser.context_mark.line - } - if line != 0 { - where = "line " + strconv.Itoa(line) + ": " - } - var msg string - if len(p.parser.problem) > 0 { - msg = p.parser.problem - } else { - msg = "unknown problem parsing YAML content" - } - failf("%s%s", where, msg) -} - -func (p *parser) anchor(n *node, anchor []byte) { - if anchor != nil { - p.doc.anchors[string(anchor)] = n - } -} - -func (p *parser) parse() *node { - p.init() - switch p.peek() { - case yaml_SCALAR_EVENT: - return p.scalar() - case yaml_ALIAS_EVENT: - return p.alias() - case yaml_MAPPING_START_EVENT: - return p.mapping() - case yaml_SEQUENCE_START_EVENT: - return p.sequence() - case yaml_DOCUMENT_START_EVENT: - return p.document() - case yaml_STREAM_END_EVENT: - // Happens when attempting to decode an empty buffer. - return nil - default: - panic("attempted to parse unknown event: " + p.event.typ.String()) - } -} - -func (p *parser) node(kind int) *node { - return &node{ - kind: kind, - line: p.event.start_mark.line, - column: p.event.start_mark.column, - } -} - -func (p *parser) document() *node { - n := p.node(documentNode) - n.anchors = make(map[string]*node) - p.doc = n - p.expect(yaml_DOCUMENT_START_EVENT) - n.children = append(n.children, p.parse()) - p.expect(yaml_DOCUMENT_END_EVENT) - return n -} - -func (p *parser) alias() *node { - n := p.node(aliasNode) - n.value = string(p.event.anchor) - n.alias = p.doc.anchors[n.value] - if n.alias == nil { - failf("unknown anchor '%s' referenced", n.value) - } - p.expect(yaml_ALIAS_EVENT) - return n -} - -func (p *parser) scalar() *node { - n := p.node(scalarNode) - n.value = string(p.event.value) - n.tag = string(p.event.tag) - n.implicit = p.event.implicit - p.anchor(n, p.event.anchor) - p.expect(yaml_SCALAR_EVENT) - return n -} - -func (p *parser) sequence() *node { - n := p.node(sequenceNode) - p.anchor(n, p.event.anchor) - p.expect(yaml_SEQUENCE_START_EVENT) - for p.peek() != yaml_SEQUENCE_END_EVENT { - n.children = append(n.children, p.parse()) - } - p.expect(yaml_SEQUENCE_END_EVENT) - return n -} - -func (p *parser) mapping() *node { - n := p.node(mappingNode) - p.anchor(n, p.event.anchor) - p.expect(yaml_MAPPING_START_EVENT) - for p.peek() != yaml_MAPPING_END_EVENT { - n.children = append(n.children, p.parse(), p.parse()) - } - p.expect(yaml_MAPPING_END_EVENT) - return n -} - -// ---------------------------------------------------------------------------- -// Decoder, unmarshals a node into a provided value. - -type decoder struct { - doc *node - aliases map[*node]bool - mapType reflect.Type - terrors []string - strict bool -} - -var ( - mapItemType = reflect.TypeOf(MapItem{}) - durationType = reflect.TypeOf(time.Duration(0)) - defaultMapType = reflect.TypeOf(map[interface{}]interface{}{}) - ifaceType = defaultMapType.Elem() - timeType = reflect.TypeOf(time.Time{}) - ptrTimeType = reflect.TypeOf(&time.Time{}) -) - -func newDecoder(strict bool) *decoder { - d := &decoder{mapType: defaultMapType, strict: strict} - d.aliases = make(map[*node]bool) - return d -} - -func (d *decoder) terror(n *node, tag string, out reflect.Value) { - if n.tag != "" { - tag = n.tag - } - value := n.value - if tag != yaml_SEQ_TAG && tag != yaml_MAP_TAG { - if len(value) > 10 { - value = " `" + value[:7] + "...`" - } else { - value = " `" + value + "`" - } - } - d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.line+1, shortTag(tag), value, out.Type())) -} - -func (d *decoder) callUnmarshaler(n *node, u Unmarshaler) (good bool) { - terrlen := len(d.terrors) - err := u.UnmarshalYAML(func(v interface{}) (err error) { - defer handleErr(&err) - d.unmarshal(n, reflect.ValueOf(v)) - if len(d.terrors) > terrlen { - issues := d.terrors[terrlen:] - d.terrors = d.terrors[:terrlen] - return &TypeError{issues} - } - return nil - }) - if e, ok := err.(*TypeError); ok { - d.terrors = append(d.terrors, e.Errors...) - return false - } - if err != nil { - fail(err) - } - return true -} - -// d.prepare initializes and dereferences pointers and calls UnmarshalYAML -// if a value is found to implement it. -// It returns the initialized and dereferenced out value, whether -// unmarshalling was already done by UnmarshalYAML, and if so whether -// its types unmarshalled appropriately. -// -// If n holds a null value, prepare returns before doing anything. -func (d *decoder) prepare(n *node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { - if n.tag == yaml_NULL_TAG || n.kind == scalarNode && n.tag == "" && (n.value == "null" || n.value == "~" || n.value == "" && n.implicit) { - return out, false, false - } - again := true - for again { - again = false - if out.Kind() == reflect.Ptr { - if out.IsNil() { - out.Set(reflect.New(out.Type().Elem())) - } - out = out.Elem() - again = true - } - if out.CanAddr() { - if u, ok := out.Addr().Interface().(Unmarshaler); ok { - good = d.callUnmarshaler(n, u) - return out, true, good - } - } - } - return out, false, false -} - -func (d *decoder) unmarshal(n *node, out reflect.Value) (good bool) { - switch n.kind { - case documentNode: - return d.document(n, out) - case aliasNode: - return d.alias(n, out) - } - out, unmarshaled, good := d.prepare(n, out) - if unmarshaled { - return good - } - switch n.kind { - case scalarNode: - good = d.scalar(n, out) - case mappingNode: - good = d.mapping(n, out) - case sequenceNode: - good = d.sequence(n, out) - default: - panic("internal error: unknown node kind: " + strconv.Itoa(n.kind)) - } - return good -} - -func (d *decoder) document(n *node, out reflect.Value) (good bool) { - if len(n.children) == 1 { - d.doc = n - d.unmarshal(n.children[0], out) - return true - } - return false -} - -func (d *decoder) alias(n *node, out reflect.Value) (good bool) { - if d.aliases[n] { - // TODO this could actually be allowed in some circumstances. - failf("anchor '%s' value contains itself", n.value) - } - d.aliases[n] = true - good = d.unmarshal(n.alias, out) - delete(d.aliases, n) - return good -} - -var zeroValue reflect.Value - -func resetMap(out reflect.Value) { - for _, k := range out.MapKeys() { - out.SetMapIndex(k, zeroValue) - } -} - -func (d *decoder) scalar(n *node, out reflect.Value) bool { - var tag string - var resolved interface{} - if n.tag == "" && !n.implicit { - tag = yaml_STR_TAG - resolved = n.value - } else { - tag, resolved = resolve(n.tag, n.value) - if tag == yaml_BINARY_TAG { - data, err := base64.StdEncoding.DecodeString(resolved.(string)) - if err != nil { - failf("!!binary value contains invalid base64 data") - } - resolved = string(data) - } - } - if resolved == nil { - if out.Kind() == reflect.Map && !out.CanAddr() { - resetMap(out) - } else { - out.Set(reflect.Zero(out.Type())) - } - return true - } - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - // We've resolved to exactly the type we want, so use that. - out.Set(resolvedv) - return true - } - // Perhaps we can use the value as a TextUnmarshaler to - // set its value. - if out.CanAddr() { - u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) - if ok { - var text []byte - if tag == yaml_BINARY_TAG { - text = []byte(resolved.(string)) - } else { - // We let any value be unmarshaled into TextUnmarshaler. - // That might be more lax than we'd like, but the - // TextUnmarshaler itself should bowl out any dubious values. - text = []byte(n.value) - } - err := u.UnmarshalText(text) - if err != nil { - fail(err) - } - return true - } - } - switch out.Kind() { - case reflect.String: - if tag == yaml_BINARY_TAG { - out.SetString(resolved.(string)) - return true - } - if resolved != nil { - out.SetString(n.value) - return true - } - case reflect.Interface: - if resolved == nil { - out.Set(reflect.Zero(out.Type())) - } else if tag == yaml_TIMESTAMP_TAG { - // It looks like a timestamp but for backward compatibility - // reasons we set it as a string, so that code that unmarshals - // timestamp-like values into interface{} will continue to - // see a string and not a time.Time. - // TODO(v3) Drop this. - out.Set(reflect.ValueOf(n.value)) - } else { - out.Set(reflect.ValueOf(resolved)) - } - return true - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - switch resolved := resolved.(type) { - case int: - if !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case int64: - if !out.OverflowInt(resolved) { - out.SetInt(resolved) - return true - } - case uint64: - if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case float64: - if resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { - out.SetInt(int64(resolved)) - return true - } - case string: - if out.Type() == durationType { - d, err := time.ParseDuration(resolved) - if err == nil { - out.SetInt(int64(d)) - return true - } - } - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - switch resolved := resolved.(type) { - case int: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case int64: - if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case uint64: - if !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - case float64: - if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { - out.SetUint(uint64(resolved)) - return true - } - } - case reflect.Bool: - switch resolved := resolved.(type) { - case bool: - out.SetBool(resolved) - return true - } - case reflect.Float32, reflect.Float64: - switch resolved := resolved.(type) { - case int: - out.SetFloat(float64(resolved)) - return true - case int64: - out.SetFloat(float64(resolved)) - return true - case uint64: - out.SetFloat(float64(resolved)) - return true - case float64: - out.SetFloat(resolved) - return true - } - case reflect.Struct: - if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { - out.Set(resolvedv) - return true - } - case reflect.Ptr: - if out.Type().Elem() == reflect.TypeOf(resolved) { - // TODO DOes this make sense? When is out a Ptr except when decoding a nil value? - elem := reflect.New(out.Type().Elem()) - elem.Elem().Set(reflect.ValueOf(resolved)) - out.Set(elem) - return true - } - } - d.terror(n, tag, out) - return false -} - -func settableValueOf(i interface{}) reflect.Value { - v := reflect.ValueOf(i) - sv := reflect.New(v.Type()).Elem() - sv.Set(v) - return sv -} - -func (d *decoder) sequence(n *node, out reflect.Value) (good bool) { - l := len(n.children) - - var iface reflect.Value - switch out.Kind() { - case reflect.Slice: - out.Set(reflect.MakeSlice(out.Type(), l, l)) - case reflect.Array: - if l != out.Len() { - failf("invalid array: want %d elements but got %d", out.Len(), l) - } - case reflect.Interface: - // No type hints. Will have to use a generic sequence. - iface = out - out = settableValueOf(make([]interface{}, l)) - default: - d.terror(n, yaml_SEQ_TAG, out) - return false - } - et := out.Type().Elem() - - j := 0 - for i := 0; i < l; i++ { - e := reflect.New(et).Elem() - if ok := d.unmarshal(n.children[i], e); ok { - out.Index(j).Set(e) - j++ - } - } - if out.Kind() != reflect.Array { - out.Set(out.Slice(0, j)) - } - if iface.IsValid() { - iface.Set(out) - } - return true -} - -func (d *decoder) mapping(n *node, out reflect.Value) (good bool) { - switch out.Kind() { - case reflect.Struct: - return d.mappingStruct(n, out) - case reflect.Slice: - return d.mappingSlice(n, out) - case reflect.Map: - // okay - case reflect.Interface: - if d.mapType.Kind() == reflect.Map { - iface := out - out = reflect.MakeMap(d.mapType) - iface.Set(out) - } else { - slicev := reflect.New(d.mapType).Elem() - if !d.mappingSlice(n, slicev) { - return false - } - out.Set(slicev) - return true - } - default: - d.terror(n, yaml_MAP_TAG, out) - return false - } - outt := out.Type() - kt := outt.Key() - et := outt.Elem() - - mapType := d.mapType - if outt.Key() == ifaceType && outt.Elem() == ifaceType { - d.mapType = outt - } - - if out.IsNil() { - out.Set(reflect.MakeMap(outt)) - } - l := len(n.children) - for i := 0; i < l; i += 2 { - if isMerge(n.children[i]) { - d.merge(n.children[i+1], out) - continue - } - k := reflect.New(kt).Elem() - if d.unmarshal(n.children[i], k) { - kkind := k.Kind() - if kkind == reflect.Interface { - kkind = k.Elem().Kind() - } - if kkind == reflect.Map || kkind == reflect.Slice { - failf("invalid map key: %#v", k.Interface()) - } - e := reflect.New(et).Elem() - if d.unmarshal(n.children[i+1], e) { - d.setMapIndex(n.children[i+1], out, k, e) - } - } - } - d.mapType = mapType - return true -} - -func (d *decoder) setMapIndex(n *node, out, k, v reflect.Value) { - if d.strict && out.MapIndex(k) != zeroValue { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: key %#v already set in map", n.line+1, k.Interface())) - return - } - out.SetMapIndex(k, v) -} - -func (d *decoder) mappingSlice(n *node, out reflect.Value) (good bool) { - outt := out.Type() - if outt.Elem() != mapItemType { - d.terror(n, yaml_MAP_TAG, out) - return false - } - - mapType := d.mapType - d.mapType = outt - - var slice []MapItem - var l = len(n.children) - for i := 0; i < l; i += 2 { - if isMerge(n.children[i]) { - d.merge(n.children[i+1], out) - continue - } - item := MapItem{} - k := reflect.ValueOf(&item.Key).Elem() - if d.unmarshal(n.children[i], k) { - v := reflect.ValueOf(&item.Value).Elem() - if d.unmarshal(n.children[i+1], v) { - slice = append(slice, item) - } - } - } - out.Set(reflect.ValueOf(slice)) - d.mapType = mapType - return true -} - -func (d *decoder) mappingStruct(n *node, out reflect.Value) (good bool) { - sinfo, err := getStructInfo(out.Type()) - if err != nil { - panic(err) - } - name := settableValueOf("") - l := len(n.children) - - var inlineMap reflect.Value - var elemType reflect.Type - if sinfo.InlineMap != -1 { - inlineMap = out.Field(sinfo.InlineMap) - inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) - elemType = inlineMap.Type().Elem() - } - - var doneFields []bool - if d.strict { - doneFields = make([]bool, len(sinfo.FieldsList)) - } - for i := 0; i < l; i += 2 { - ni := n.children[i] - if isMerge(ni) { - d.merge(n.children[i+1], out) - continue - } - if !d.unmarshal(ni, name) { - continue - } - if info, ok := sinfo.FieldsMap[name.String()]; ok { - if d.strict { - if doneFields[info.Id] { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.line+1, name.String(), out.Type())) - continue - } - doneFields[info.Id] = true - } - var field reflect.Value - if info.Inline == nil { - field = out.Field(info.Num) - } else { - field = out.FieldByIndex(info.Inline) - } - d.unmarshal(n.children[i+1], field) - } else if sinfo.InlineMap != -1 { - if inlineMap.IsNil() { - inlineMap.Set(reflect.MakeMap(inlineMap.Type())) - } - value := reflect.New(elemType).Elem() - d.unmarshal(n.children[i+1], value) - d.setMapIndex(n.children[i+1], inlineMap, name, value) - } else if d.strict { - d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.line+1, name.String(), out.Type())) - } - } - return true -} - -func failWantMap() { - failf("map merge requires map or sequence of maps as the value") -} - -func (d *decoder) merge(n *node, out reflect.Value) { - switch n.kind { - case mappingNode: - d.unmarshal(n, out) - case aliasNode: - an, ok := d.doc.anchors[n.value] - if ok && an.kind != mappingNode { - failWantMap() - } - d.unmarshal(n, out) - case sequenceNode: - // Step backwards as earlier nodes take precedence. - for i := len(n.children) - 1; i >= 0; i-- { - ni := n.children[i] - if ni.kind == aliasNode { - an, ok := d.doc.anchors[ni.value] - if ok && an.kind != mappingNode { - failWantMap() - } - } else if ni.kind != mappingNode { - failWantMap() - } - d.unmarshal(ni, out) - } - default: - failWantMap() - } -} - -func isMerge(n *node) bool { - return n.kind == scalarNode && n.value == "<<" && (n.implicit == true || n.tag == yaml_MERGE_TAG) -} diff --git a/vendor/gopkg.in/yaml.v2/encode.go b/vendor/gopkg.in/yaml.v2/encode.go deleted file mode 100644 index 0ee738e..0000000 --- a/vendor/gopkg.in/yaml.v2/encode.go +++ /dev/null @@ -1,390 +0,0 @@ -package yaml - -import ( - "encoding" - "fmt" - "io" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -// jsonNumber is the interface of the encoding/json.Number datatype. -// Repeating the interface here avoids a dependency on encoding/json, and also -// supports other libraries like jsoniter, which use a similar datatype with -// the same interface. Detecting this interface is useful when dealing with -// structures containing json.Number, which is a string under the hood. The -// encoder should prefer the use of Int64(), Float64() and string(), in that -// order, when encoding this type. -type jsonNumber interface { - Float64() (float64, error) - Int64() (int64, error) - String() string -} - -type encoder struct { - emitter yaml_emitter_t - event yaml_event_t - out []byte - flow bool - // doneInit holds whether the initial stream_start_event has been - // emitted. - doneInit bool -} - -func newEncoder() *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_string(&e.emitter, &e.out) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func newEncoderWithWriter(w io.Writer) *encoder { - e := &encoder{} - yaml_emitter_initialize(&e.emitter) - yaml_emitter_set_output_writer(&e.emitter, w) - yaml_emitter_set_unicode(&e.emitter, true) - return e -} - -func (e *encoder) init() { - if e.doneInit { - return - } - yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) - e.emit() - e.doneInit = true -} - -func (e *encoder) finish() { - e.emitter.open_ended = false - yaml_stream_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) destroy() { - yaml_emitter_delete(&e.emitter) -} - -func (e *encoder) emit() { - // This will internally delete the e.event value. - e.must(yaml_emitter_emit(&e.emitter, &e.event)) -} - -func (e *encoder) must(ok bool) { - if !ok { - msg := e.emitter.problem - if msg == "" { - msg = "unknown problem generating YAML content" - } - failf("%s", msg) - } -} - -func (e *encoder) marshalDoc(tag string, in reflect.Value) { - e.init() - yaml_document_start_event_initialize(&e.event, nil, nil, true) - e.emit() - e.marshal(tag, in) - yaml_document_end_event_initialize(&e.event, true) - e.emit() -} - -func (e *encoder) marshal(tag string, in reflect.Value) { - if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { - e.nilv() - return - } - iface := in.Interface() - switch m := iface.(type) { - case jsonNumber: - integer, err := m.Int64() - if err == nil { - // In this case the json.Number is a valid int64 - in = reflect.ValueOf(integer) - break - } - float, err := m.Float64() - if err == nil { - // In this case the json.Number is a valid float64 - in = reflect.ValueOf(float) - break - } - // fallback case - no number could be obtained - in = reflect.ValueOf(m.String()) - case time.Time, *time.Time: - // Although time.Time implements TextMarshaler, - // we don't want to treat it as a string for YAML - // purposes because YAML has special support for - // timestamps. - case Marshaler: - v, err := m.MarshalYAML() - if err != nil { - fail(err) - } - if v == nil { - e.nilv() - return - } - in = reflect.ValueOf(v) - case encoding.TextMarshaler: - text, err := m.MarshalText() - if err != nil { - fail(err) - } - in = reflect.ValueOf(string(text)) - case nil: - e.nilv() - return - } - switch in.Kind() { - case reflect.Interface: - e.marshal(tag, in.Elem()) - case reflect.Map: - e.mapv(tag, in) - case reflect.Ptr: - if in.Type() == ptrTimeType { - e.timev(tag, in.Elem()) - } else { - e.marshal(tag, in.Elem()) - } - case reflect.Struct: - if in.Type() == timeType { - e.timev(tag, in) - } else { - e.structv(tag, in) - } - case reflect.Slice, reflect.Array: - if in.Type().Elem() == mapItemType { - e.itemsv(tag, in) - } else { - e.slicev(tag, in) - } - case reflect.String: - e.stringv(tag, in) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - if in.Type() == durationType { - e.stringv(tag, reflect.ValueOf(iface.(time.Duration).String())) - } else { - e.intv(tag, in) - } - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - e.uintv(tag, in) - case reflect.Float32, reflect.Float64: - e.floatv(tag, in) - case reflect.Bool: - e.boolv(tag, in) - default: - panic("cannot marshal type: " + in.Type().String()) - } -} - -func (e *encoder) mapv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - keys := keyList(in.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - e.marshal("", k) - e.marshal("", in.MapIndex(k)) - } - }) -} - -func (e *encoder) itemsv(tag string, in reflect.Value) { - e.mappingv(tag, func() { - slice := in.Convert(reflect.TypeOf([]MapItem{})).Interface().([]MapItem) - for _, item := range slice { - e.marshal("", reflect.ValueOf(item.Key)) - e.marshal("", reflect.ValueOf(item.Value)) - } - }) -} - -func (e *encoder) structv(tag string, in reflect.Value) { - sinfo, err := getStructInfo(in.Type()) - if err != nil { - panic(err) - } - e.mappingv(tag, func() { - for _, info := range sinfo.FieldsList { - var value reflect.Value - if info.Inline == nil { - value = in.Field(info.Num) - } else { - value = in.FieldByIndex(info.Inline) - } - if info.OmitEmpty && isZero(value) { - continue - } - e.marshal("", reflect.ValueOf(info.Key)) - e.flow = info.Flow - e.marshal("", value) - } - if sinfo.InlineMap >= 0 { - m := in.Field(sinfo.InlineMap) - if m.Len() > 0 { - e.flow = false - keys := keyList(m.MapKeys()) - sort.Sort(keys) - for _, k := range keys { - if _, found := sinfo.FieldsMap[k.String()]; found { - panic(fmt.Sprintf("Can't have key %q in inlined map; conflicts with struct field", k.String())) - } - e.marshal("", k) - e.flow = false - e.marshal("", m.MapIndex(k)) - } - } - } - }) -} - -func (e *encoder) mappingv(tag string, f func()) { - implicit := tag == "" - style := yaml_BLOCK_MAPPING_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_MAPPING_STYLE - } - yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) - e.emit() - f() - yaml_mapping_end_event_initialize(&e.event) - e.emit() -} - -func (e *encoder) slicev(tag string, in reflect.Value) { - implicit := tag == "" - style := yaml_BLOCK_SEQUENCE_STYLE - if e.flow { - e.flow = false - style = yaml_FLOW_SEQUENCE_STYLE - } - e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) - e.emit() - n := in.Len() - for i := 0; i < n; i++ { - e.marshal("", in.Index(i)) - } - e.must(yaml_sequence_end_event_initialize(&e.event)) - e.emit() -} - -// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. -// -// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported -// in YAML 1.2 and by this package, but these should be marshalled quoted for -// the time being for compatibility with other parsers. -func isBase60Float(s string) (result bool) { - // Fast path. - if s == "" { - return false - } - c := s[0] - if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { - return false - } - // Do the full match. - return base60float.MatchString(s) -} - -// From http://yaml.org/type/float.html, except the regular expression there -// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. -var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) - -func (e *encoder) stringv(tag string, in reflect.Value) { - var style yaml_scalar_style_t - s := in.String() - canUsePlain := true - switch { - case !utf8.ValidString(s): - if tag == yaml_BINARY_TAG { - failf("explicitly tagged !!binary data must be base64-encoded") - } - if tag != "" { - failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) - } - // It can't be encoded directly as YAML so use a binary tag - // and encode it as base64. - tag = yaml_BINARY_TAG - s = encodeBase64(s) - case tag == "": - // Check to see if it would resolve to a specific - // tag when encoded unquoted. If it doesn't, - // there's no need to quote it. - rtag, _ := resolve("", s) - canUsePlain = rtag == yaml_STR_TAG && !isBase60Float(s) - } - // Note: it's possible for user code to emit invalid YAML - // if they explicitly specify a tag and a string containing - // text that's incompatible with that tag. - switch { - case strings.Contains(s, "\n"): - style = yaml_LITERAL_SCALAR_STYLE - case canUsePlain: - style = yaml_PLAIN_SCALAR_STYLE - default: - style = yaml_DOUBLE_QUOTED_SCALAR_STYLE - } - e.emitScalar(s, "", tag, style) -} - -func (e *encoder) boolv(tag string, in reflect.Value) { - var s string - if in.Bool() { - s = "true" - } else { - s = "false" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) intv(tag string, in reflect.Value) { - s := strconv.FormatInt(in.Int(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) uintv(tag string, in reflect.Value) { - s := strconv.FormatUint(in.Uint(), 10) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) timev(tag string, in reflect.Value) { - t := in.Interface().(time.Time) - s := t.Format(time.RFC3339Nano) - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) floatv(tag string, in reflect.Value) { - // Issue #352: When formatting, use the precision of the underlying value - precision := 64 - if in.Kind() == reflect.Float32 { - precision = 32 - } - - s := strconv.FormatFloat(in.Float(), 'g', -1, precision) - switch s { - case "+Inf": - s = ".inf" - case "-Inf": - s = "-.inf" - case "NaN": - s = ".nan" - } - e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) nilv() { - e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE) -} - -func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t) { - implicit := tag == "" - e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) - e.emit() -} diff --git a/vendor/gopkg.in/yaml.v2/go.mod b/vendor/gopkg.in/yaml.v2/go.mod deleted file mode 100644 index 1934e87..0000000 --- a/vendor/gopkg.in/yaml.v2/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module "gopkg.in/yaml.v2" - -require ( - "gopkg.in/check.v1" v0.0.0-20161208181325-20d25e280405 -) diff --git a/vendor/gopkg.in/yaml.v2/writerc.go b/vendor/gopkg.in/yaml.v2/writerc.go deleted file mode 100644 index a2dde60..0000000 --- a/vendor/gopkg.in/yaml.v2/writerc.go +++ /dev/null @@ -1,26 +0,0 @@ -package yaml - -// Set the writer error and return false. -func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { - emitter.error = yaml_WRITER_ERROR - emitter.problem = problem - return false -} - -// Flush the output buffer. -func yaml_emitter_flush(emitter *yaml_emitter_t) bool { - if emitter.write_handler == nil { - panic("write handler not set") - } - - // Check if the buffer is empty. - if emitter.buffer_pos == 0 { - return true - } - - if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { - return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) - } - emitter.buffer_pos = 0 - return true -} diff --git a/vendor/gopkg.in/yaml.v2/LICENSE.libyaml b/vendor/gopkg.in/yaml.v3/LICENSE similarity index 51% rename from vendor/gopkg.in/yaml.v2/LICENSE.libyaml rename to vendor/gopkg.in/yaml.v3/LICENSE index 8da58fb..2683e4b 100644 --- a/vendor/gopkg.in/yaml.v2/LICENSE.libyaml +++ b/vendor/gopkg.in/yaml.v3/LICENSE @@ -1,16 +1,17 @@ + +This project is covered by two different licenses: MIT and Apache. + +#### MIT License #### + The following files were ported to Go from C files of libyaml, and thus -are still covered by their original copyright and license: +are still covered by their original MIT license, with the additional +copyright staring in 2011 when the project was ported over: - apic.go - emitterc.go - parserc.go - readerc.go - scannerc.go - writerc.go - yamlh.go - yamlprivateh.go + apic.go emitterc.go parserc.go readerc.go scannerc.go + writerc.go yamlh.go yamlprivateh.go -Copyright (c) 2006 Kirill Simonov +Copyright (c) 2006-2010 Kirill Simonov +Copyright (c) 2006-2011 Kirill Simonov Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in @@ -29,3 +30,21 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +### Apache License ### + +All the remaining project files are covered by the Apache license: + +Copyright (c) 2011-2019 Canonical Ltd + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/gopkg.in/yaml.v2/NOTICE b/vendor/gopkg.in/yaml.v3/NOTICE similarity index 100% rename from vendor/gopkg.in/yaml.v2/NOTICE rename to vendor/gopkg.in/yaml.v3/NOTICE diff --git a/vendor/gopkg.in/yaml.v2/README.md b/vendor/gopkg.in/yaml.v3/README.md similarity index 66% rename from vendor/gopkg.in/yaml.v2/README.md rename to vendor/gopkg.in/yaml.v3/README.md index b50c6e8..08eb1ba 100644 --- a/vendor/gopkg.in/yaml.v2/README.md +++ b/vendor/gopkg.in/yaml.v3/README.md @@ -12,7 +12,23 @@ C library to parse and generate YAML data quickly and reliably. Compatibility ------------- -The yaml package supports most of YAML 1.1 and 1.2, including support for +The yaml package supports most of YAML 1.2, but preserves some behavior +from 1.1 for backwards compatibility. + +Specifically, as of v3 of the yaml package: + + - YAML 1.1 bools (_yes/no, on/off_) are supported as long as they are being + decoded into a typed bool value. Otherwise they behave as a string. Booleans + in YAML 1.2 are _true/false_ only. + - Octals encode and decode as _0777_ per YAML 1.1, rather than _0o777_ + as specified in YAML 1.2, because most parsers still use the old format. + Octals in the _0o777_ format are supported though, so new files work. + - Does not support base-60 floats. These are gone from YAML 1.2, and were + actually never supported by this package as it's clearly a poor choice. + +and offers backwards +compatibility with YAML 1.1 in some cases. +1.2, including support for anchors, tags, map merging, etc. Multi-document unmarshalling is not yet implemented, and base-60 floats from YAML 1.1 are purposefully not supported since they're a poor design and are gone in YAML 1.2. @@ -20,29 +36,30 @@ supported since they're a poor design and are gone in YAML 1.2. Installation and usage ---------------------- -The import path for the package is *gopkg.in/yaml.v2*. +The import path for the package is *gopkg.in/yaml.v3*. To install it, run: - go get gopkg.in/yaml.v2 + go get gopkg.in/yaml.v3 API documentation ----------------- If opened in a browser, the import path itself leads to the API documentation: - * [https://gopkg.in/yaml.v2](https://gopkg.in/yaml.v2) + - [https://gopkg.in/yaml.v3](https://gopkg.in/yaml.v3) API stability ------------- -The package API for yaml v2 will remain stable as described in [gopkg.in](https://gopkg.in). +The package API for yaml v3 will remain stable as described in [gopkg.in](https://gopkg.in). License ------- -The yaml package is licensed under the Apache License 2.0. Please see the LICENSE file for details. +The yaml package is licensed under the MIT and Apache License 2.0 licenses. +Please see the LICENSE file for details. Example @@ -55,7 +72,7 @@ import ( "fmt" "log" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) var data = ` diff --git a/vendor/gopkg.in/yaml.v2/apic.go b/vendor/gopkg.in/yaml.v3/apic.go similarity index 93% rename from vendor/gopkg.in/yaml.v2/apic.go rename to vendor/gopkg.in/yaml.v3/apic.go index 1f7e87e..ae7d049 100644 --- a/vendor/gopkg.in/yaml.v2/apic.go +++ b/vendor/gopkg.in/yaml.v3/apic.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml import ( @@ -86,6 +108,7 @@ func yaml_emitter_initialize(emitter *yaml_emitter_t) { raw_buffer: make([]byte, 0, output_raw_buffer_size), states: make([]yaml_emitter_state_t, 0, initial_stack_size), events: make([]yaml_event_t, 0, initial_queue_size), + best_width: -1, } } @@ -138,7 +161,7 @@ func yaml_emitter_set_canonical(emitter *yaml_emitter_t, canonical bool) { emitter.canonical = canonical } -//// Set the indentation increment. +// Set the indentation increment. func yaml_emitter_set_indent(emitter *yaml_emitter_t, indent int) { if indent < 2 || indent > 9 { indent = 2 @@ -288,29 +311,14 @@ func yaml_document_end_event_initialize(event *yaml_event_t, implicit bool) { } } -///* -// * Create ALIAS. -// */ -// -//YAML_DECLARE(int) -//yaml_alias_event_initialize(event *yaml_event_t, anchor *yaml_char_t) -//{ -// mark yaml_mark_t = { 0, 0, 0 } -// anchor_copy *yaml_char_t = NULL -// -// assert(event) // Non-NULL event object is expected. -// assert(anchor) // Non-NULL anchor is expected. -// -// if (!yaml_check_utf8(anchor, strlen((char *)anchor))) return 0 -// -// anchor_copy = yaml_strdup(anchor) -// if (!anchor_copy) -// return 0 -// -// ALIAS_EVENT_INIT(*event, anchor_copy, mark, mark) -// -// return 1 -//} +// Create ALIAS. +func yaml_alias_event_initialize(event *yaml_event_t, anchor []byte) bool { + *event = yaml_event_t{ + typ: yaml_ALIAS_EVENT, + anchor: anchor, + } + return true +} // Create SCALAR. func yaml_scalar_event_initialize(event *yaml_event_t, anchor, tag, value []byte, plain_implicit, quoted_implicit bool, style yaml_scalar_style_t) bool { diff --git a/vendor/gopkg.in/yaml.v3/decode.go b/vendor/gopkg.in/yaml.v3/decode.go new file mode 100644 index 0000000..df36e3a --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/decode.go @@ -0,0 +1,950 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding" + "encoding/base64" + "fmt" + "io" + "math" + "reflect" + "strconv" + "time" +) + +// ---------------------------------------------------------------------------- +// Parser, produces a node tree out of a libyaml event stream. + +type parser struct { + parser yaml_parser_t + event yaml_event_t + doc *Node + anchors map[string]*Node + doneInit bool + textless bool +} + +func newParser(b []byte) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + if len(b) == 0 { + b = []byte{'\n'} + } + yaml_parser_set_input_string(&p.parser, b) + return &p +} + +func newParserFromReader(r io.Reader) *parser { + p := parser{} + if !yaml_parser_initialize(&p.parser) { + panic("failed to initialize YAML emitter") + } + yaml_parser_set_input_reader(&p.parser, r) + return &p +} + +func (p *parser) init() { + if p.doneInit { + return + } + p.anchors = make(map[string]*Node) + p.expect(yaml_STREAM_START_EVENT) + p.doneInit = true +} + +func (p *parser) destroy() { + if p.event.typ != yaml_NO_EVENT { + yaml_event_delete(&p.event) + } + yaml_parser_delete(&p.parser) +} + +// expect consumes an event from the event stream and +// checks that it's of the expected type. +func (p *parser) expect(e yaml_event_type_t) { + if p.event.typ == yaml_NO_EVENT { + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + } + if p.event.typ == yaml_STREAM_END_EVENT { + failf("attempted to go past the end of stream; corrupted value?") + } + if p.event.typ != e { + p.parser.problem = fmt.Sprintf("expected %s event but got %s", e, p.event.typ) + p.fail() + } + yaml_event_delete(&p.event) + p.event.typ = yaml_NO_EVENT +} + +// peek peeks at the next event in the event stream, +// puts the results into p.event and returns the event type. +func (p *parser) peek() yaml_event_type_t { + if p.event.typ != yaml_NO_EVENT { + return p.event.typ + } + if !yaml_parser_parse(&p.parser, &p.event) { + p.fail() + } + return p.event.typ +} + +func (p *parser) fail() { + var where string + var line int + if p.parser.context_mark.line != 0 { + line = p.parser.context_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } else if p.parser.problem_mark.line != 0 { + line = p.parser.problem_mark.line + // Scanner errors don't iterate line before returning error + if p.parser.error == yaml_SCANNER_ERROR { + line++ + } + } + if line != 0 { + where = "line " + strconv.Itoa(line) + ": " + } + var msg string + if len(p.parser.problem) > 0 { + msg = p.parser.problem + } else { + msg = "unknown problem parsing YAML content" + } + failf("%s%s", where, msg) +} + +func (p *parser) anchor(n *Node, anchor []byte) { + if anchor != nil { + n.Anchor = string(anchor) + p.anchors[n.Anchor] = n + } +} + +func (p *parser) parse() *Node { + p.init() + switch p.peek() { + case yaml_SCALAR_EVENT: + return p.scalar() + case yaml_ALIAS_EVENT: + return p.alias() + case yaml_MAPPING_START_EVENT: + return p.mapping() + case yaml_SEQUENCE_START_EVENT: + return p.sequence() + case yaml_DOCUMENT_START_EVENT: + return p.document() + case yaml_STREAM_END_EVENT: + // Happens when attempting to decode an empty buffer. + return nil + case yaml_TAIL_COMMENT_EVENT: + panic("internal error: unexpected tail comment event (please report)") + default: + panic("internal error: attempted to parse unknown event (please report): " + p.event.typ.String()) + } +} + +func (p *parser) node(kind Kind, defaultTag, tag, value string) *Node { + var style Style + if tag != "" && tag != "!" { + tag = shortTag(tag) + style = TaggedStyle + } else if defaultTag != "" { + tag = defaultTag + } else if kind == ScalarNode { + tag, _ = resolve("", value) + } + n := &Node{ + Kind: kind, + Tag: tag, + Value: value, + Style: style, + } + if !p.textless { + n.Line = p.event.start_mark.line + 1 + n.Column = p.event.start_mark.column + 1 + n.HeadComment = string(p.event.head_comment) + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + } + return n +} + +func (p *parser) parseChild(parent *Node) *Node { + child := p.parse() + parent.Content = append(parent.Content, child) + return child +} + +func (p *parser) document() *Node { + n := p.node(DocumentNode, "", "", "") + p.doc = n + p.expect(yaml_DOCUMENT_START_EVENT) + p.parseChild(n) + if p.peek() == yaml_DOCUMENT_END_EVENT { + n.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_DOCUMENT_END_EVENT) + return n +} + +func (p *parser) alias() *Node { + n := p.node(AliasNode, "", "", string(p.event.anchor)) + n.Alias = p.anchors[n.Value] + if n.Alias == nil { + failf("unknown anchor '%s' referenced", n.Value) + } + p.expect(yaml_ALIAS_EVENT) + return n +} + +func (p *parser) scalar() *Node { + var parsedStyle = p.event.scalar_style() + var nodeStyle Style + switch { + case parsedStyle&yaml_DOUBLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = DoubleQuotedStyle + case parsedStyle&yaml_SINGLE_QUOTED_SCALAR_STYLE != 0: + nodeStyle = SingleQuotedStyle + case parsedStyle&yaml_LITERAL_SCALAR_STYLE != 0: + nodeStyle = LiteralStyle + case parsedStyle&yaml_FOLDED_SCALAR_STYLE != 0: + nodeStyle = FoldedStyle + } + var nodeValue = string(p.event.value) + var nodeTag = string(p.event.tag) + var defaultTag string + if nodeStyle == 0 { + if nodeValue == "<<" { + defaultTag = mergeTag + } + } else { + defaultTag = strTag + } + n := p.node(ScalarNode, defaultTag, nodeTag, nodeValue) + n.Style |= nodeStyle + p.anchor(n, p.event.anchor) + p.expect(yaml_SCALAR_EVENT) + return n +} + +func (p *parser) sequence() *Node { + n := p.node(SequenceNode, seqTag, string(p.event.tag), "") + if p.event.sequence_style()&yaml_FLOW_SEQUENCE_STYLE != 0 { + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_SEQUENCE_START_EVENT) + for p.peek() != yaml_SEQUENCE_END_EVENT { + p.parseChild(n) + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + p.expect(yaml_SEQUENCE_END_EVENT) + return n +} + +func (p *parser) mapping() *Node { + n := p.node(MappingNode, mapTag, string(p.event.tag), "") + block := true + if p.event.mapping_style()&yaml_FLOW_MAPPING_STYLE != 0 { + block = false + n.Style |= FlowStyle + } + p.anchor(n, p.event.anchor) + p.expect(yaml_MAPPING_START_EVENT) + for p.peek() != yaml_MAPPING_END_EVENT { + k := p.parseChild(n) + if block && k.FootComment != "" { + // Must be a foot comment for the prior value when being dedented. + if len(n.Content) > 2 { + n.Content[len(n.Content)-3].FootComment = k.FootComment + k.FootComment = "" + } + } + v := p.parseChild(n) + if k.FootComment == "" && v.FootComment != "" { + k.FootComment = v.FootComment + v.FootComment = "" + } + if p.peek() == yaml_TAIL_COMMENT_EVENT { + if k.FootComment == "" { + k.FootComment = string(p.event.foot_comment) + } + p.expect(yaml_TAIL_COMMENT_EVENT) + } + } + n.LineComment = string(p.event.line_comment) + n.FootComment = string(p.event.foot_comment) + if n.Style&FlowStyle == 0 && n.FootComment != "" && len(n.Content) > 1 { + n.Content[len(n.Content)-2].FootComment = n.FootComment + n.FootComment = "" + } + p.expect(yaml_MAPPING_END_EVENT) + return n +} + +// ---------------------------------------------------------------------------- +// Decoder, unmarshals a node into a provided value. + +type decoder struct { + doc *Node + aliases map[*Node]bool + terrors []string + + stringMapType reflect.Type + generalMapType reflect.Type + + knownFields bool + uniqueKeys bool + decodeCount int + aliasCount int + aliasDepth int +} + +var ( + nodeType = reflect.TypeOf(Node{}) + durationType = reflect.TypeOf(time.Duration(0)) + stringMapType = reflect.TypeOf(map[string]interface{}{}) + generalMapType = reflect.TypeOf(map[interface{}]interface{}{}) + ifaceType = generalMapType.Elem() + timeType = reflect.TypeOf(time.Time{}) + ptrTimeType = reflect.TypeOf(&time.Time{}) +) + +func newDecoder() *decoder { + d := &decoder{ + stringMapType: stringMapType, + generalMapType: generalMapType, + uniqueKeys: true, + } + d.aliases = make(map[*Node]bool) + return d +} + +func (d *decoder) terror(n *Node, tag string, out reflect.Value) { + if n.Tag != "" { + tag = n.Tag + } + value := n.Value + if tag != seqTag && tag != mapTag { + if len(value) > 10 { + value = " `" + value[:7] + "...`" + } else { + value = " `" + value + "`" + } + } + d.terrors = append(d.terrors, fmt.Sprintf("line %d: cannot unmarshal %s%s into %s", n.Line, shortTag(tag), value, out.Type())) +} + +func (d *decoder) callUnmarshaler(n *Node, u Unmarshaler) (good bool) { + err := u.UnmarshalYAML(n) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +func (d *decoder) callObsoleteUnmarshaler(n *Node, u obsoleteUnmarshaler) (good bool) { + terrlen := len(d.terrors) + err := u.UnmarshalYAML(func(v interface{}) (err error) { + defer handleErr(&err) + d.unmarshal(n, reflect.ValueOf(v)) + if len(d.terrors) > terrlen { + issues := d.terrors[terrlen:] + d.terrors = d.terrors[:terrlen] + return &TypeError{issues} + } + return nil + }) + if e, ok := err.(*TypeError); ok { + d.terrors = append(d.terrors, e.Errors...) + return false + } + if err != nil { + fail(err) + } + return true +} + +// d.prepare initializes and dereferences pointers and calls UnmarshalYAML +// if a value is found to implement it. +// It returns the initialized and dereferenced out value, whether +// unmarshalling was already done by UnmarshalYAML, and if so whether +// its types unmarshalled appropriately. +// +// If n holds a null value, prepare returns before doing anything. +func (d *decoder) prepare(n *Node, out reflect.Value) (newout reflect.Value, unmarshaled, good bool) { + if n.ShortTag() == nullTag { + return out, false, false + } + again := true + for again { + again = false + if out.Kind() == reflect.Ptr { + if out.IsNil() { + out.Set(reflect.New(out.Type().Elem())) + } + out = out.Elem() + again = true + } + if out.CanAddr() { + outi := out.Addr().Interface() + if u, ok := outi.(Unmarshaler); ok { + good = d.callUnmarshaler(n, u) + return out, true, good + } + if u, ok := outi.(obsoleteUnmarshaler); ok { + good = d.callObsoleteUnmarshaler(n, u) + return out, true, good + } + } + } + return out, false, false +} + +func (d *decoder) fieldByIndex(n *Node, v reflect.Value, index []int) (field reflect.Value) { + if n.ShortTag() == nullTag { + return reflect.Value{} + } + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + v.Set(reflect.New(v.Type().Elem())) + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +const ( + // 400,000 decode operations is ~500kb of dense object declarations, or + // ~5kb of dense object declarations with 10000% alias expansion + alias_ratio_range_low = 400000 + + // 4,000,000 decode operations is ~5MB of dense object declarations, or + // ~4.5MB of dense object declarations with 10% alias expansion + alias_ratio_range_high = 4000000 + + // alias_ratio_range is the range over which we scale allowed alias ratios + alias_ratio_range = float64(alias_ratio_range_high - alias_ratio_range_low) +) + +func allowedAliasRatio(decodeCount int) float64 { + switch { + case decodeCount <= alias_ratio_range_low: + // allow 99% to come from alias expansion for small-to-medium documents + return 0.99 + case decodeCount >= alias_ratio_range_high: + // allow 10% to come from alias expansion for very large documents + return 0.10 + default: + // scale smoothly from 99% down to 10% over the range. + // this maps to 396,000 - 400,000 allowed alias-driven decodes over the range. + // 400,000 decode operations is ~100MB of allocations in worst-case scenarios (single-item maps). + return 0.99 - 0.89*(float64(decodeCount-alias_ratio_range_low)/alias_ratio_range) + } +} + +func (d *decoder) unmarshal(n *Node, out reflect.Value) (good bool) { + d.decodeCount++ + if d.aliasDepth > 0 { + d.aliasCount++ + } + if d.aliasCount > 100 && d.decodeCount > 1000 && float64(d.aliasCount)/float64(d.decodeCount) > allowedAliasRatio(d.decodeCount) { + failf("document contains excessive aliasing") + } + if out.Type() == nodeType { + out.Set(reflect.ValueOf(n).Elem()) + return true + } + switch n.Kind { + case DocumentNode: + return d.document(n, out) + case AliasNode: + return d.alias(n, out) + } + out, unmarshaled, good := d.prepare(n, out) + if unmarshaled { + return good + } + switch n.Kind { + case ScalarNode: + good = d.scalar(n, out) + case MappingNode: + good = d.mapping(n, out) + case SequenceNode: + good = d.sequence(n, out) + case 0: + if n.IsZero() { + return d.null(out) + } + fallthrough + default: + failf("cannot decode node with unknown kind %d", n.Kind) + } + return good +} + +func (d *decoder) document(n *Node, out reflect.Value) (good bool) { + if len(n.Content) == 1 { + d.doc = n + d.unmarshal(n.Content[0], out) + return true + } + return false +} + +func (d *decoder) alias(n *Node, out reflect.Value) (good bool) { + if d.aliases[n] { + // TODO this could actually be allowed in some circumstances. + failf("anchor '%s' value contains itself", n.Value) + } + d.aliases[n] = true + d.aliasDepth++ + good = d.unmarshal(n.Alias, out) + d.aliasDepth-- + delete(d.aliases, n) + return good +} + +var zeroValue reflect.Value + +func resetMap(out reflect.Value) { + for _, k := range out.MapKeys() { + out.SetMapIndex(k, zeroValue) + } +} + +func (d *decoder) null(out reflect.Value) bool { + if out.CanAddr() { + switch out.Kind() { + case reflect.Interface, reflect.Ptr, reflect.Map, reflect.Slice: + out.Set(reflect.Zero(out.Type())) + return true + } + } + return false +} + +func (d *decoder) scalar(n *Node, out reflect.Value) bool { + var tag string + var resolved interface{} + if n.indicatedString() { + tag = strTag + resolved = n.Value + } else { + tag, resolved = resolve(n.Tag, n.Value) + if tag == binaryTag { + data, err := base64.StdEncoding.DecodeString(resolved.(string)) + if err != nil { + failf("!!binary value contains invalid base64 data") + } + resolved = string(data) + } + } + if resolved == nil { + return d.null(out) + } + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + // We've resolved to exactly the type we want, so use that. + out.Set(resolvedv) + return true + } + // Perhaps we can use the value as a TextUnmarshaler to + // set its value. + if out.CanAddr() { + u, ok := out.Addr().Interface().(encoding.TextUnmarshaler) + if ok { + var text []byte + if tag == binaryTag { + text = []byte(resolved.(string)) + } else { + // We let any value be unmarshaled into TextUnmarshaler. + // That might be more lax than we'd like, but the + // TextUnmarshaler itself should bowl out any dubious values. + text = []byte(n.Value) + } + err := u.UnmarshalText(text) + if err != nil { + fail(err) + } + return true + } + } + switch out.Kind() { + case reflect.String: + if tag == binaryTag { + out.SetString(resolved.(string)) + return true + } + out.SetString(n.Value) + return true + case reflect.Interface: + out.Set(reflect.ValueOf(resolved)) + return true + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + // This used to work in v2, but it's very unfriendly. + isDuration := out.Type() == durationType + + switch resolved := resolved.(type) { + case int: + if !isDuration && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case int64: + if !isDuration && !out.OverflowInt(resolved) { + out.SetInt(resolved) + return true + } + case uint64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case float64: + if !isDuration && resolved <= math.MaxInt64 && !out.OverflowInt(int64(resolved)) { + out.SetInt(int64(resolved)) + return true + } + case string: + if out.Type() == durationType { + d, err := time.ParseDuration(resolved) + if err == nil { + out.SetInt(int64(d)) + return true + } + } + } + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + switch resolved := resolved.(type) { + case int: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case int64: + if resolved >= 0 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case uint64: + if !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + case float64: + if resolved <= math.MaxUint64 && !out.OverflowUint(uint64(resolved)) { + out.SetUint(uint64(resolved)) + return true + } + } + case reflect.Bool: + switch resolved := resolved.(type) { + case bool: + out.SetBool(resolved) + return true + case string: + // This offers some compatibility with the 1.1 spec (https://yaml.org/type/bool.html). + // It only works if explicitly attempting to unmarshal into a typed bool value. + switch resolved { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON": + out.SetBool(true) + return true + case "n", "N", "no", "No", "NO", "off", "Off", "OFF": + out.SetBool(false) + return true + } + } + case reflect.Float32, reflect.Float64: + switch resolved := resolved.(type) { + case int: + out.SetFloat(float64(resolved)) + return true + case int64: + out.SetFloat(float64(resolved)) + return true + case uint64: + out.SetFloat(float64(resolved)) + return true + case float64: + out.SetFloat(resolved) + return true + } + case reflect.Struct: + if resolvedv := reflect.ValueOf(resolved); out.Type() == resolvedv.Type() { + out.Set(resolvedv) + return true + } + case reflect.Ptr: + panic("yaml internal error: please report the issue") + } + d.terror(n, tag, out) + return false +} + +func settableValueOf(i interface{}) reflect.Value { + v := reflect.ValueOf(i) + sv := reflect.New(v.Type()).Elem() + sv.Set(v) + return sv +} + +func (d *decoder) sequence(n *Node, out reflect.Value) (good bool) { + l := len(n.Content) + + var iface reflect.Value + switch out.Kind() { + case reflect.Slice: + out.Set(reflect.MakeSlice(out.Type(), l, l)) + case reflect.Array: + if l != out.Len() { + failf("invalid array: want %d elements but got %d", out.Len(), l) + } + case reflect.Interface: + // No type hints. Will have to use a generic sequence. + iface = out + out = settableValueOf(make([]interface{}, l)) + default: + d.terror(n, seqTag, out) + return false + } + et := out.Type().Elem() + + j := 0 + for i := 0; i < l; i++ { + e := reflect.New(et).Elem() + if ok := d.unmarshal(n.Content[i], e); ok { + out.Index(j).Set(e) + j++ + } + } + if out.Kind() != reflect.Array { + out.Set(out.Slice(0, j)) + } + if iface.IsValid() { + iface.Set(out) + } + return true +} + +func (d *decoder) mapping(n *Node, out reflect.Value) (good bool) { + l := len(n.Content) + if d.uniqueKeys { + nerrs := len(d.terrors) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + for j := i + 2; j < l; j += 2 { + nj := n.Content[j] + if ni.Kind == nj.Kind && ni.Value == nj.Value { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: mapping key %#v already defined at line %d", nj.Line, nj.Value, ni.Line)) + } + } + } + if len(d.terrors) > nerrs { + return false + } + } + switch out.Kind() { + case reflect.Struct: + return d.mappingStruct(n, out) + case reflect.Map: + // okay + case reflect.Interface: + iface := out + if isStringMap(n) { + out = reflect.MakeMap(d.stringMapType) + } else { + out = reflect.MakeMap(d.generalMapType) + } + iface.Set(out) + default: + d.terror(n, mapTag, out) + return false + } + + outt := out.Type() + kt := outt.Key() + et := outt.Elem() + + stringMapType := d.stringMapType + generalMapType := d.generalMapType + if outt.Elem() == ifaceType { + if outt.Key().Kind() == reflect.String { + d.stringMapType = outt + } else if outt.Key() == ifaceType { + d.generalMapType = outt + } + } + + mapIsNew := false + if out.IsNil() { + out.Set(reflect.MakeMap(outt)) + mapIsNew = true + } + for i := 0; i < l; i += 2 { + if isMerge(n.Content[i]) { + d.merge(n.Content[i+1], out) + continue + } + k := reflect.New(kt).Elem() + if d.unmarshal(n.Content[i], k) { + kkind := k.Kind() + if kkind == reflect.Interface { + kkind = k.Elem().Kind() + } + if kkind == reflect.Map || kkind == reflect.Slice { + failf("invalid map key: %#v", k.Interface()) + } + e := reflect.New(et).Elem() + if d.unmarshal(n.Content[i+1], e) || n.Content[i+1].ShortTag() == nullTag && (mapIsNew || !out.MapIndex(k).IsValid()) { + out.SetMapIndex(k, e) + } + } + } + d.stringMapType = stringMapType + d.generalMapType = generalMapType + return true +} + +func isStringMap(n *Node) bool { + if n.Kind != MappingNode { + return false + } + l := len(n.Content) + for i := 0; i < l; i += 2 { + if n.Content[i].ShortTag() != strTag { + return false + } + } + return true +} + +func (d *decoder) mappingStruct(n *Node, out reflect.Value) (good bool) { + sinfo, err := getStructInfo(out.Type()) + if err != nil { + panic(err) + } + + var inlineMap reflect.Value + var elemType reflect.Type + if sinfo.InlineMap != -1 { + inlineMap = out.Field(sinfo.InlineMap) + inlineMap.Set(reflect.New(inlineMap.Type()).Elem()) + elemType = inlineMap.Type().Elem() + } + + for _, index := range sinfo.InlineUnmarshalers { + field := d.fieldByIndex(n, out, index) + d.prepare(n, field) + } + + var doneFields []bool + if d.uniqueKeys { + doneFields = make([]bool, len(sinfo.FieldsList)) + } + name := settableValueOf("") + l := len(n.Content) + for i := 0; i < l; i += 2 { + ni := n.Content[i] + if isMerge(ni) { + d.merge(n.Content[i+1], out) + continue + } + if !d.unmarshal(ni, name) { + continue + } + if info, ok := sinfo.FieldsMap[name.String()]; ok { + if d.uniqueKeys { + if doneFields[info.Id] { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s already set in type %s", ni.Line, name.String(), out.Type())) + continue + } + doneFields[info.Id] = true + } + var field reflect.Value + if info.Inline == nil { + field = out.Field(info.Num) + } else { + field = d.fieldByIndex(n, out, info.Inline) + } + d.unmarshal(n.Content[i+1], field) + } else if sinfo.InlineMap != -1 { + if inlineMap.IsNil() { + inlineMap.Set(reflect.MakeMap(inlineMap.Type())) + } + value := reflect.New(elemType).Elem() + d.unmarshal(n.Content[i+1], value) + inlineMap.SetMapIndex(name, value) + } else if d.knownFields { + d.terrors = append(d.terrors, fmt.Sprintf("line %d: field %s not found in type %s", ni.Line, name.String(), out.Type())) + } + } + return true +} + +func failWantMap() { + failf("map merge requires map or sequence of maps as the value") +} + +func (d *decoder) merge(n *Node, out reflect.Value) { + switch n.Kind { + case MappingNode: + d.unmarshal(n, out) + case AliasNode: + if n.Alias != nil && n.Alias.Kind != MappingNode { + failWantMap() + } + d.unmarshal(n, out) + case SequenceNode: + // Step backwards as earlier nodes take precedence. + for i := len(n.Content) - 1; i >= 0; i-- { + ni := n.Content[i] + if ni.Kind == AliasNode { + if ni.Alias != nil && ni.Alias.Kind != MappingNode { + failWantMap() + } + } else if ni.Kind != MappingNode { + failWantMap() + } + d.unmarshal(ni, out) + } + default: + failWantMap() + } +} + +func isMerge(n *Node) bool { + return n.Kind == ScalarNode && n.Value == "<<" && (n.Tag == "" || n.Tag == "!" || shortTag(n.Tag) == mergeTag) +} diff --git a/vendor/gopkg.in/yaml.v2/emitterc.go b/vendor/gopkg.in/yaml.v3/emitterc.go similarity index 80% rename from vendor/gopkg.in/yaml.v2/emitterc.go rename to vendor/gopkg.in/yaml.v3/emitterc.go index a1c2cc5..0f47c9c 100644 --- a/vendor/gopkg.in/yaml.v2/emitterc.go +++ b/vendor/gopkg.in/yaml.v3/emitterc.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml import ( @@ -43,8 +65,13 @@ func put_break(emitter *yaml_emitter_t) bool { default: panic("unknown line break setting") } + if emitter.column == 0 { + emitter.space_above = true + } emitter.column = 0 emitter.line++ + // [Go] Do this here and below and drop from everywhere else (see commented lines). + emitter.indention = true return true } @@ -97,8 +124,13 @@ func write_break(emitter *yaml_emitter_t, s []byte, i *int) bool { if !write(emitter, s, i) { return false } + if emitter.column == 0 { + emitter.space_above = true + } emitter.column = 0 emitter.line++ + // [Go] Do this here and above and drop from everywhere else (see commented lines). + emitter.indention = true } return true } @@ -203,7 +235,14 @@ func yaml_emitter_increase_indent(emitter *yaml_emitter_t, flow, indentless bool emitter.indent = 0 } } else if !indentless { - emitter.indent += emitter.best_indent + // [Go] This was changed so that indentations are more regular. + if emitter.states[len(emitter.states)-1] == yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE { + // The first indent inside a sequence will just skip the "- " indicator. + emitter.indent += 2 + } else { + // Everything else aligns to the chosen indentation. + emitter.indent = emitter.best_indent*((emitter.indent+emitter.best_indent)/emitter.best_indent) + } } return true } @@ -228,16 +267,22 @@ func yaml_emitter_state_machine(emitter *yaml_emitter_t, event *yaml_event_t) bo return yaml_emitter_emit_document_end(emitter, event) case yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, true) + return yaml_emitter_emit_flow_sequence_item(emitter, event, true, false) + + case yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE: + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, true) case yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE: - return yaml_emitter_emit_flow_sequence_item(emitter, event, false) + return yaml_emitter_emit_flow_sequence_item(emitter, event, false, false) case yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, true) + return yaml_emitter_emit_flow_mapping_key(emitter, event, true, false) + + case yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE: + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, true) case yaml_EMIT_FLOW_MAPPING_KEY_STATE: - return yaml_emitter_emit_flow_mapping_key(emitter, event, false) + return yaml_emitter_emit_flow_mapping_key(emitter, event, false, false) case yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE: return yaml_emitter_emit_flow_mapping_value(emitter, event, true) @@ -298,6 +343,8 @@ func yaml_emitter_emit_stream_start(emitter *yaml_emitter_t, event *yaml_event_t emitter.column = 0 emitter.whitespace = true emitter.indention = true + emitter.space_above = true + emitter.foot_indent = -1 if emitter.encoding != yaml_UTF8_ENCODING { if !yaml_emitter_write_bom(emitter) { @@ -392,13 +439,22 @@ func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event if !yaml_emitter_write_indicator(emitter, []byte("---"), true, false, false) { return false } - if emitter.canonical { + if emitter.canonical || true { if !yaml_emitter_write_indent(emitter) { return false } } } + if len(emitter.head_comment) > 0 { + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !put_break(emitter) { + return false + } + } + emitter.state = yaml_EMIT_DOCUMENT_CONTENT_STATE return true } @@ -425,7 +481,20 @@ func yaml_emitter_emit_document_start(emitter *yaml_emitter_t, event *yaml_event // Expect the root node. func yaml_emitter_emit_document_content(emitter *yaml_emitter_t, event *yaml_event_t) bool { emitter.states = append(emitter.states, yaml_EMIT_DOCUMENT_END_STATE) - return yaml_emitter_emit_node(emitter, event, true, false, false, false) + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if !yaml_emitter_emit_node(emitter, event, true, false, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true } // Expect DOCUMENT-END. @@ -433,6 +502,12 @@ func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t if event.typ != yaml_DOCUMENT_END_EVENT { return yaml_emitter_set_emitter_error(emitter, "expected DOCUMENT-END") } + // [Go] Force document foot separation. + emitter.foot_indent = 0 + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + emitter.foot_indent = -1 if !yaml_emitter_write_indent(emitter) { return false } @@ -454,7 +529,7 @@ func yaml_emitter_emit_document_end(emitter *yaml_emitter_t, event *yaml_event_t } // Expect a flow item node. -func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { +func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { if first { if !yaml_emitter_write_indicator(emitter, []byte{'['}, true, true, false) { return false @@ -466,13 +541,15 @@ func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_e } if event.typ == yaml_SEQUENCE_END_EVENT { - emitter.flow_level-- - emitter.indent = emitter.indents[len(emitter.indents)-1] - emitter.indents = emitter.indents[:len(emitter.indents)-1] - if emitter.canonical && !first { + if emitter.canonical && !first && !trail { if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { return false } + } + emitter.flow_level-- + emitter.indent = emitter.indents[len(emitter.indents)-1] + emitter.indents = emitter.indents[:len(emitter.indents)-1] + if emitter.column == 0 || emitter.canonical && !first { if !yaml_emitter_write_indent(emitter) { return false } @@ -480,29 +557,62 @@ func yaml_emitter_emit_flow_sequence_item(emitter *yaml_emitter_t, event *yaml_e if !yaml_emitter_write_indicator(emitter, []byte{']'}, false, false, false) { return false } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } emitter.state = emitter.states[len(emitter.states)-1] emitter.states = emitter.states[:len(emitter.states)-1] return true } - if !first { + if !first && !trail { if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { return false } } + if !yaml_emitter_process_head_comment(emitter) { + return false + } + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if emitter.canonical || emitter.column > emitter.best_width { if !yaml_emitter_write_indent(emitter) { return false } } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) - return yaml_emitter_emit_node(emitter, event, false, true, false, false) + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true } // Expect a flow key node. -func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { +func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_event_t, first, trail bool) bool { if first { if !yaml_emitter_write_indicator(emitter, []byte{'{'}, true, true, false) { return false @@ -514,13 +624,18 @@ func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_eve } if event.typ == yaml_MAPPING_END_EVENT { + if (emitter.canonical || len(emitter.head_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0) && !first && !trail { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_head_comment(emitter) { + return false + } emitter.flow_level-- emitter.indent = emitter.indents[len(emitter.indents)-1] emitter.indents = emitter.indents[:len(emitter.indents)-1] if emitter.canonical && !first { - if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { - return false - } if !yaml_emitter_write_indent(emitter) { return false } @@ -528,16 +643,33 @@ func yaml_emitter_emit_flow_mapping_key(emitter *yaml_emitter_t, event *yaml_eve if !yaml_emitter_write_indicator(emitter, []byte{'}'}, false, false, false) { return false } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } emitter.state = emitter.states[len(emitter.states)-1] emitter.states = emitter.states[:len(emitter.states)-1] return true } - if !first { + if !first && !trail { if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { return false } } + + if !yaml_emitter_process_head_comment(emitter) { + return false + } + + if emitter.column == 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + } + if emitter.canonical || emitter.column > emitter.best_width { if !yaml_emitter_write_indent(emitter) { return false @@ -571,14 +703,32 @@ func yaml_emitter_emit_flow_mapping_value(emitter *yaml_emitter_t, event *yaml_e return false } } - emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE) + } else { + emitter.states = append(emitter.states, yaml_EMIT_FLOW_MAPPING_KEY_STATE) + } + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if len(emitter.line_comment)+len(emitter.foot_comment)+len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indicator(emitter, []byte{','}, false, false, false) { + return false + } + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true } // Expect a block item node. func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_event_t, first bool) bool { if first { - if !yaml_emitter_increase_indent(emitter, false, emitter.mapping_context && !emitter.indention) { + if !yaml_emitter_increase_indent(emitter, false, false) { return false } } @@ -589,6 +739,9 @@ func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_ emitter.states = emitter.states[:len(emitter.states)-1] return true } + if !yaml_emitter_process_head_comment(emitter) { + return false + } if !yaml_emitter_write_indent(emitter) { return false } @@ -596,7 +749,16 @@ func yaml_emitter_emit_block_sequence_item(emitter *yaml_emitter_t, event *yaml_ return false } emitter.states = append(emitter.states, yaml_EMIT_BLOCK_SEQUENCE_ITEM_STATE) - return yaml_emitter_emit_node(emitter, event, false, true, false, false) + if !yaml_emitter_emit_node(emitter, event, false, true, false, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true } // Expect a block key node. @@ -606,6 +768,9 @@ func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_ev return false } } + if !yaml_emitter_process_head_comment(emitter) { + return false + } if event.typ == yaml_MAPPING_END_EVENT { emitter.indent = emitter.indents[len(emitter.indents)-1] emitter.indents = emitter.indents[:len(emitter.indents)-1] @@ -616,6 +781,13 @@ func yaml_emitter_emit_block_mapping_key(emitter *yaml_emitter_t, event *yaml_ev if !yaml_emitter_write_indent(emitter) { return false } + if len(emitter.line_comment) > 0 { + // [Go] A line comment was provided for the key. That's unusual as the + // scanner associates line comments with the value. Either way, + // save the line comment and render it appropriately later. + emitter.key_line_comment = emitter.line_comment + emitter.line_comment = nil + } if yaml_emitter_check_simple_key(emitter) { emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_SIMPLE_VALUE_STATE) return yaml_emitter_emit_node(emitter, event, false, false, true, true) @@ -641,8 +813,42 @@ func yaml_emitter_emit_block_mapping_value(emitter *yaml_emitter_t, event *yaml_ return false } } + if len(emitter.key_line_comment) > 0 { + // [Go] Line comments are generally associated with the value, but when there's + // no value on the same line as a mapping key they end up attached to the + // key itself. + if event.typ == yaml_SCALAR_EVENT { + if len(emitter.line_comment) == 0 { + // A scalar is coming and it has no line comments by itself yet, + // so just let it handle the line comment as usual. If it has a + // line comment, we can't have both so the one from the key is lost. + emitter.line_comment = emitter.key_line_comment + emitter.key_line_comment = nil + } + } else if event.sequence_style() != yaml_FLOW_SEQUENCE_STYLE && (event.typ == yaml_MAPPING_START_EVENT || event.typ == yaml_SEQUENCE_START_EVENT) { + // An indented block follows, so write the comment right now. + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + if !yaml_emitter_process_line_comment(emitter) { + return false + } + emitter.line_comment, emitter.key_line_comment = emitter.key_line_comment, emitter.line_comment + } + } emitter.states = append(emitter.states, yaml_EMIT_BLOCK_MAPPING_KEY_STATE) - return yaml_emitter_emit_node(emitter, event, false, false, true, false) + if !yaml_emitter_emit_node(emitter, event, false, false, true, false) { + return false + } + if !yaml_emitter_process_line_comment(emitter) { + return false + } + if !yaml_emitter_process_foot_comment(emitter) { + return false + } + return true +} + +func yaml_emitter_silent_nil_event(emitter *yaml_emitter_t, event *yaml_event_t) bool { + return event.typ == yaml_SCALAR_EVENT && event.implicit && !emitter.canonical && len(emitter.scalar_data.value) == 0 } // Expect a node. @@ -908,6 +1114,71 @@ func yaml_emitter_process_scalar(emitter *yaml_emitter_t) bool { panic("unknown scalar style") } +// Write a head comment. +func yaml_emitter_process_head_comment(emitter *yaml_emitter_t) bool { + if len(emitter.tail_comment) > 0 { + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.tail_comment) { + return false + } + emitter.tail_comment = emitter.tail_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + } + + if len(emitter.head_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.head_comment) { + return false + } + emitter.head_comment = emitter.head_comment[:0] + return true +} + +// Write an line comment. +func yaml_emitter_process_line_comment(emitter *yaml_emitter_t) bool { + if len(emitter.line_comment) == 0 { + return true + } + if !emitter.whitespace { + if !put(emitter, ' ') { + return false + } + } + if !yaml_emitter_write_comment(emitter, emitter.line_comment) { + return false + } + emitter.line_comment = emitter.line_comment[:0] + return true +} + +// Write a foot comment. +func yaml_emitter_process_foot_comment(emitter *yaml_emitter_t) bool { + if len(emitter.foot_comment) == 0 { + return true + } + if !yaml_emitter_write_indent(emitter) { + return false + } + if !yaml_emitter_write_comment(emitter, emitter.foot_comment) { + return false + } + emitter.foot_comment = emitter.foot_comment[:0] + emitter.foot_indent = emitter.indent + if emitter.foot_indent < 0 { + emitter.foot_indent = 0 + } + return true +} + // Check if a %YAML directive is valid. func yaml_emitter_analyze_version_directive(emitter *yaml_emitter_t, version_directive *yaml_version_directive_t) bool { if version_directive.major != 1 || version_directive.minor != 1 { @@ -987,6 +1258,7 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { flow_indicators = false line_breaks = false special_characters = false + tab_characters = false leading_space = false leading_break = false @@ -1055,7 +1327,9 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { } } - if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { + if value[i] == '\t' { + tab_characters = true + } else if !is_printable(value, i) || !is_ascii(value, i) && !emitter.unicode { special_characters = true } if is_space(value, i) { @@ -1110,10 +1384,12 @@ func yaml_emitter_analyze_scalar(emitter *yaml_emitter_t, value []byte) bool { emitter.scalar_data.block_plain_allowed = false emitter.scalar_data.single_quoted_allowed = false } - if space_break || special_characters { + if space_break || tab_characters || special_characters { emitter.scalar_data.flow_plain_allowed = false emitter.scalar_data.block_plain_allowed = false emitter.scalar_data.single_quoted_allowed = false + } + if space_break || special_characters { emitter.scalar_data.block_allowed = false } if line_breaks { @@ -1137,6 +1413,19 @@ func yaml_emitter_analyze_event(emitter *yaml_emitter_t, event *yaml_event_t) bo emitter.tag_data.suffix = nil emitter.scalar_data.value = nil + if len(event.head_comment) > 0 { + emitter.head_comment = event.head_comment + } + if len(event.line_comment) > 0 { + emitter.line_comment = event.line_comment + } + if len(event.foot_comment) > 0 { + emitter.foot_comment = event.foot_comment + } + if len(event.tail_comment) > 0 { + emitter.tail_comment = event.tail_comment + } + switch event.typ { case yaml_ALIAS_EVENT: if !yaml_emitter_analyze_anchor(emitter, event.anchor, true) { @@ -1208,13 +1497,20 @@ func yaml_emitter_write_indent(emitter *yaml_emitter_t) bool { return false } } + if emitter.foot_indent == indent { + if !put_break(emitter) { + return false + } + } for emitter.column < indent { if !put(emitter, ' ') { return false } } emitter.whitespace = true - emitter.indention = true + //emitter.indention = true + emitter.space_above = false + emitter.foot_indent = -1 return true } @@ -1311,7 +1607,7 @@ func yaml_emitter_write_tag_content(emitter *yaml_emitter_t, value []byte, need_ } func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allow_breaks bool) bool { - if !emitter.whitespace { + if len(value) > 0 && !emitter.whitespace { if !put(emitter, ' ') { return false } @@ -1341,7 +1637,7 @@ func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allo if !write_break(emitter, value, &i) { return false } - emitter.indention = true + //emitter.indention = true breaks = true } else { if breaks { @@ -1358,7 +1654,9 @@ func yaml_emitter_write_plain_scalar(emitter *yaml_emitter_t, value []byte, allo } } - emitter.whitespace = false + if len(value) > 0 { + emitter.whitespace = false + } emitter.indention = false if emitter.root_context { emitter.open_ended = true @@ -1397,7 +1695,7 @@ func yaml_emitter_write_single_quoted_scalar(emitter *yaml_emitter_t, value []by if !write_break(emitter, value, &i) { return false } - emitter.indention = true + //emitter.indention = true breaks = true } else { if breaks { @@ -1596,10 +1894,10 @@ func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bo if !yaml_emitter_write_block_scalar_hints(emitter, value) { return false } - if !put_break(emitter) { + if !yaml_emitter_process_line_comment(emitter) { return false } - emitter.indention = true + //emitter.indention = true emitter.whitespace = true breaks := true for i := 0; i < len(value); { @@ -1607,7 +1905,7 @@ func yaml_emitter_write_literal_scalar(emitter *yaml_emitter_t, value []byte) bo if !write_break(emitter, value, &i) { return false } - emitter.indention = true + //emitter.indention = true breaks = true } else { if breaks { @@ -1633,11 +1931,11 @@ func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) boo if !yaml_emitter_write_block_scalar_hints(emitter, value) { return false } - - if !put_break(emitter) { + if !yaml_emitter_process_line_comment(emitter) { return false } - emitter.indention = true + + //emitter.indention = true emitter.whitespace = true breaks := true @@ -1658,7 +1956,7 @@ func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) boo if !write_break(emitter, value, &i) { return false } - emitter.indention = true + //emitter.indention = true breaks = true } else { if breaks { @@ -1683,3 +1981,40 @@ func yaml_emitter_write_folded_scalar(emitter *yaml_emitter_t, value []byte) boo } return true } + +func yaml_emitter_write_comment(emitter *yaml_emitter_t, comment []byte) bool { + breaks := false + pound := false + for i := 0; i < len(comment); { + if is_break(comment, i) { + if !write_break(emitter, comment, &i) { + return false + } + //emitter.indention = true + breaks = true + pound = false + } else { + if breaks && !yaml_emitter_write_indent(emitter) { + return false + } + if !pound { + if comment[i] != '#' && (!put(emitter, '#') || !put(emitter, ' ')) { + return false + } + pound = true + } + if !write(emitter, comment, &i) { + return false + } + emitter.indention = false + breaks = false + } + } + if !breaks && !put_break(emitter) { + return false + } + + emitter.whitespace = true + //emitter.indention = true + return true +} diff --git a/vendor/gopkg.in/yaml.v3/encode.go b/vendor/gopkg.in/yaml.v3/encode.go new file mode 100644 index 0000000..de9e72a --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/encode.go @@ -0,0 +1,577 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package yaml + +import ( + "encoding" + "fmt" + "io" + "reflect" + "regexp" + "sort" + "strconv" + "strings" + "time" + "unicode/utf8" +) + +type encoder struct { + emitter yaml_emitter_t + event yaml_event_t + out []byte + flow bool + indent int + doneInit bool +} + +func newEncoder() *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_string(&e.emitter, &e.out) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func newEncoderWithWriter(w io.Writer) *encoder { + e := &encoder{} + yaml_emitter_initialize(&e.emitter) + yaml_emitter_set_output_writer(&e.emitter, w) + yaml_emitter_set_unicode(&e.emitter, true) + return e +} + +func (e *encoder) init() { + if e.doneInit { + return + } + if e.indent == 0 { + e.indent = 4 + } + e.emitter.best_indent = e.indent + yaml_stream_start_event_initialize(&e.event, yaml_UTF8_ENCODING) + e.emit() + e.doneInit = true +} + +func (e *encoder) finish() { + e.emitter.open_ended = false + yaml_stream_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) destroy() { + yaml_emitter_delete(&e.emitter) +} + +func (e *encoder) emit() { + // This will internally delete the e.event value. + e.must(yaml_emitter_emit(&e.emitter, &e.event)) +} + +func (e *encoder) must(ok bool) { + if !ok { + msg := e.emitter.problem + if msg == "" { + msg = "unknown problem generating YAML content" + } + failf("%s", msg) + } +} + +func (e *encoder) marshalDoc(tag string, in reflect.Value) { + e.init() + var node *Node + if in.IsValid() { + node, _ = in.Interface().(*Node) + } + if node != nil && node.Kind == DocumentNode { + e.nodev(in) + } else { + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.emit() + e.marshal(tag, in) + yaml_document_end_event_initialize(&e.event, true) + e.emit() + } +} + +func (e *encoder) marshal(tag string, in reflect.Value) { + tag = shortTag(tag) + if !in.IsValid() || in.Kind() == reflect.Ptr && in.IsNil() { + e.nilv() + return + } + iface := in.Interface() + switch value := iface.(type) { + case *Node: + e.nodev(in) + return + case Node: + if !in.CanAddr() { + var n = reflect.New(in.Type()).Elem() + n.Set(in) + in = n + } + e.nodev(in.Addr()) + return + case time.Time: + e.timev(tag, in) + return + case *time.Time: + e.timev(tag, in.Elem()) + return + case time.Duration: + e.stringv(tag, reflect.ValueOf(value.String())) + return + case Marshaler: + v, err := value.MarshalYAML() + if err != nil { + fail(err) + } + if v == nil { + e.nilv() + return + } + e.marshal(tag, reflect.ValueOf(v)) + return + case encoding.TextMarshaler: + text, err := value.MarshalText() + if err != nil { + fail(err) + } + in = reflect.ValueOf(string(text)) + case nil: + e.nilv() + return + } + switch in.Kind() { + case reflect.Interface: + e.marshal(tag, in.Elem()) + case reflect.Map: + e.mapv(tag, in) + case reflect.Ptr: + e.marshal(tag, in.Elem()) + case reflect.Struct: + e.structv(tag, in) + case reflect.Slice, reflect.Array: + e.slicev(tag, in) + case reflect.String: + e.stringv(tag, in) + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + e.intv(tag, in) + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + e.uintv(tag, in) + case reflect.Float32, reflect.Float64: + e.floatv(tag, in) + case reflect.Bool: + e.boolv(tag, in) + default: + panic("cannot marshal type: " + in.Type().String()) + } +} + +func (e *encoder) mapv(tag string, in reflect.Value) { + e.mappingv(tag, func() { + keys := keyList(in.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + e.marshal("", k) + e.marshal("", in.MapIndex(k)) + } + }) +} + +func (e *encoder) fieldByIndex(v reflect.Value, index []int) (field reflect.Value) { + for _, num := range index { + for { + if v.Kind() == reflect.Ptr { + if v.IsNil() { + return reflect.Value{} + } + v = v.Elem() + continue + } + break + } + v = v.Field(num) + } + return v +} + +func (e *encoder) structv(tag string, in reflect.Value) { + sinfo, err := getStructInfo(in.Type()) + if err != nil { + panic(err) + } + e.mappingv(tag, func() { + for _, info := range sinfo.FieldsList { + var value reflect.Value + if info.Inline == nil { + value = in.Field(info.Num) + } else { + value = e.fieldByIndex(in, info.Inline) + if !value.IsValid() { + continue + } + } + if info.OmitEmpty && isZero(value) { + continue + } + e.marshal("", reflect.ValueOf(info.Key)) + e.flow = info.Flow + e.marshal("", value) + } + if sinfo.InlineMap >= 0 { + m := in.Field(sinfo.InlineMap) + if m.Len() > 0 { + e.flow = false + keys := keyList(m.MapKeys()) + sort.Sort(keys) + for _, k := range keys { + if _, found := sinfo.FieldsMap[k.String()]; found { + panic(fmt.Sprintf("cannot have key %q in inlined map: conflicts with struct field", k.String())) + } + e.marshal("", k) + e.flow = false + e.marshal("", m.MapIndex(k)) + } + } + } + }) +} + +func (e *encoder) mappingv(tag string, f func()) { + implicit := tag == "" + style := yaml_BLOCK_MAPPING_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, nil, []byte(tag), implicit, style) + e.emit() + f() + yaml_mapping_end_event_initialize(&e.event) + e.emit() +} + +func (e *encoder) slicev(tag string, in reflect.Value) { + implicit := tag == "" + style := yaml_BLOCK_SEQUENCE_STYLE + if e.flow { + e.flow = false + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, nil, []byte(tag), implicit, style)) + e.emit() + n := in.Len() + for i := 0; i < n; i++ { + e.marshal("", in.Index(i)) + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.emit() +} + +// isBase60 returns whether s is in base 60 notation as defined in YAML 1.1. +// +// The base 60 float notation in YAML 1.1 is a terrible idea and is unsupported +// in YAML 1.2 and by this package, but these should be marshalled quoted for +// the time being for compatibility with other parsers. +func isBase60Float(s string) (result bool) { + // Fast path. + if s == "" { + return false + } + c := s[0] + if !(c == '+' || c == '-' || c >= '0' && c <= '9') || strings.IndexByte(s, ':') < 0 { + return false + } + // Do the full match. + return base60float.MatchString(s) +} + +// From http://yaml.org/type/float.html, except the regular expression there +// is bogus. In practice parsers do not enforce the "\.[0-9_]*" suffix. +var base60float = regexp.MustCompile(`^[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+(?:\.[0-9_]*)?$`) + +// isOldBool returns whether s is bool notation as defined in YAML 1.1. +// +// We continue to force strings that YAML 1.1 would interpret as booleans to be +// rendered as quotes strings so that the marshalled output valid for YAML 1.1 +// parsing. +func isOldBool(s string) (result bool) { + switch s { + case "y", "Y", "yes", "Yes", "YES", "on", "On", "ON", + "n", "N", "no", "No", "NO", "off", "Off", "OFF": + return true + default: + return false + } +} + +func (e *encoder) stringv(tag string, in reflect.Value) { + var style yaml_scalar_style_t + s := in.String() + canUsePlain := true + switch { + case !utf8.ValidString(s): + if tag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if tag != "" { + failf("cannot marshal invalid UTF-8 data as %s", shortTag(tag)) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + s = encodeBase64(s) + case tag == "": + // Check to see if it would resolve to a specific + // tag when encoded unquoted. If it doesn't, + // there's no need to quote it. + rtag, _ := resolve("", s) + canUsePlain = rtag == strTag && !(isBase60Float(s) || isOldBool(s)) + } + // Note: it's possible for user code to emit invalid YAML + // if they explicitly specify a tag and a string containing + // text that's incompatible with that tag. + switch { + case strings.Contains(s, "\n"): + if e.flow { + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } else { + style = yaml_LITERAL_SCALAR_STYLE + } + case canUsePlain: + style = yaml_PLAIN_SCALAR_STYLE + default: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + e.emitScalar(s, "", tag, style, nil, nil, nil, nil) +} + +func (e *encoder) boolv(tag string, in reflect.Value) { + var s string + if in.Bool() { + s = "true" + } else { + s = "false" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) intv(tag string, in reflect.Value) { + s := strconv.FormatInt(in.Int(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) uintv(tag string, in reflect.Value) { + s := strconv.FormatUint(in.Uint(), 10) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) timev(tag string, in reflect.Value) { + t := in.Interface().(time.Time) + s := t.Format(time.RFC3339Nano) + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) floatv(tag string, in reflect.Value) { + // Issue #352: When formatting, use the precision of the underlying value + precision := 64 + if in.Kind() == reflect.Float32 { + precision = 32 + } + + s := strconv.FormatFloat(in.Float(), 'g', -1, precision) + switch s { + case "+Inf": + s = ".inf" + case "-Inf": + s = "-.inf" + case "NaN": + s = ".nan" + } + e.emitScalar(s, "", tag, yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) nilv() { + e.emitScalar("null", "", "", yaml_PLAIN_SCALAR_STYLE, nil, nil, nil, nil) +} + +func (e *encoder) emitScalar(value, anchor, tag string, style yaml_scalar_style_t, head, line, foot, tail []byte) { + // TODO Kill this function. Replace all initialize calls by their underlining Go literals. + implicit := tag == "" + if !implicit { + tag = longTag(tag) + } + e.must(yaml_scalar_event_initialize(&e.event, []byte(anchor), []byte(tag), []byte(value), implicit, implicit, style)) + e.event.head_comment = head + e.event.line_comment = line + e.event.foot_comment = foot + e.event.tail_comment = tail + e.emit() +} + +func (e *encoder) nodev(in reflect.Value) { + e.node(in.Interface().(*Node), "") +} + +func (e *encoder) node(node *Node, tail string) { + // Zero nodes behave as nil. + if node.Kind == 0 && node.IsZero() { + e.nilv() + return + } + + // If the tag was not explicitly requested, and dropping it won't change the + // implicit tag of the value, don't include it in the presentation. + var tag = node.Tag + var stag = shortTag(tag) + var forceQuoting bool + if tag != "" && node.Style&TaggedStyle == 0 { + if node.Kind == ScalarNode { + if stag == strTag && node.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0 { + tag = "" + } else { + rtag, _ := resolve("", node.Value) + if rtag == stag { + tag = "" + } else if stag == strTag { + tag = "" + forceQuoting = true + } + } + } else { + var rtag string + switch node.Kind { + case MappingNode: + rtag = mapTag + case SequenceNode: + rtag = seqTag + } + if rtag == stag { + tag = "" + } + } + } + + switch node.Kind { + case DocumentNode: + yaml_document_start_event_initialize(&e.event, nil, nil, true) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + yaml_document_end_event_initialize(&e.event, true) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case SequenceNode: + style := yaml_BLOCK_SEQUENCE_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_SEQUENCE_STYLE + } + e.must(yaml_sequence_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style)) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + for _, node := range node.Content { + e.node(node, "") + } + e.must(yaml_sequence_end_event_initialize(&e.event)) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case MappingNode: + style := yaml_BLOCK_MAPPING_STYLE + if node.Style&FlowStyle != 0 { + style = yaml_FLOW_MAPPING_STYLE + } + yaml_mapping_start_event_initialize(&e.event, []byte(node.Anchor), []byte(longTag(tag)), tag == "", style) + e.event.tail_comment = []byte(tail) + e.event.head_comment = []byte(node.HeadComment) + e.emit() + + // The tail logic below moves the foot comment of prior keys to the following key, + // since the value for each key may be a nested structure and the foot needs to be + // processed only the entirety of the value is streamed. The last tail is processed + // with the mapping end event. + var tail string + for i := 0; i+1 < len(node.Content); i += 2 { + k := node.Content[i] + foot := k.FootComment + if foot != "" { + kopy := *k + kopy.FootComment = "" + k = &kopy + } + e.node(k, tail) + tail = foot + + v := node.Content[i+1] + e.node(v, "") + } + + yaml_mapping_end_event_initialize(&e.event) + e.event.tail_comment = []byte(tail) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case AliasNode: + yaml_alias_event_initialize(&e.event, []byte(node.Value)) + e.event.head_comment = []byte(node.HeadComment) + e.event.line_comment = []byte(node.LineComment) + e.event.foot_comment = []byte(node.FootComment) + e.emit() + + case ScalarNode: + value := node.Value + if !utf8.ValidString(value) { + if stag == binaryTag { + failf("explicitly tagged !!binary data must be base64-encoded") + } + if stag != "" { + failf("cannot marshal invalid UTF-8 data as %s", stag) + } + // It can't be encoded directly as YAML so use a binary tag + // and encode it as base64. + tag = binaryTag + value = encodeBase64(value) + } + + style := yaml_PLAIN_SCALAR_STYLE + switch { + case node.Style&DoubleQuotedStyle != 0: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + case node.Style&SingleQuotedStyle != 0: + style = yaml_SINGLE_QUOTED_SCALAR_STYLE + case node.Style&LiteralStyle != 0: + style = yaml_LITERAL_SCALAR_STYLE + case node.Style&FoldedStyle != 0: + style = yaml_FOLDED_SCALAR_STYLE + case strings.Contains(value, "\n"): + style = yaml_LITERAL_SCALAR_STYLE + case forceQuoting: + style = yaml_DOUBLE_QUOTED_SCALAR_STYLE + } + + e.emitScalar(value, node.Anchor, tag, style, []byte(node.HeadComment), []byte(node.LineComment), []byte(node.FootComment), []byte(tail)) + default: + failf("cannot encode node with unknown kind %d", node.Kind) + } +} diff --git a/vendor/gopkg.in/yaml.v2/parserc.go b/vendor/gopkg.in/yaml.v3/parserc.go similarity index 85% rename from vendor/gopkg.in/yaml.v2/parserc.go rename to vendor/gopkg.in/yaml.v3/parserc.go index 81d05df..ac66fcc 100644 --- a/vendor/gopkg.in/yaml.v2/parserc.go +++ b/vendor/gopkg.in/yaml.v3/parserc.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml import ( @@ -45,11 +67,46 @@ import ( // Peek the next token in the token queue. func peek_token(parser *yaml_parser_t) *yaml_token_t { if parser.token_available || yaml_parser_fetch_more_tokens(parser) { - return &parser.tokens[parser.tokens_head] + token := &parser.tokens[parser.tokens_head] + yaml_parser_unfold_comments(parser, token) + return token } return nil } +// yaml_parser_unfold_comments walks through the comments queue and joins all +// comments behind the position of the provided token into the respective +// top-level comment slices in the parser. +func yaml_parser_unfold_comments(parser *yaml_parser_t, token *yaml_token_t) { + for parser.comments_head < len(parser.comments) && token.start_mark.index >= parser.comments[parser.comments_head].token_mark.index { + comment := &parser.comments[parser.comments_head] + if len(comment.head) > 0 { + if token.typ == yaml_BLOCK_END_TOKEN { + // No heads on ends, so keep comment.head for a follow up token. + break + } + if len(parser.head_comment) > 0 { + parser.head_comment = append(parser.head_comment, '\n') + } + parser.head_comment = append(parser.head_comment, comment.head...) + } + if len(comment.foot) > 0 { + if len(parser.foot_comment) > 0 { + parser.foot_comment = append(parser.foot_comment, '\n') + } + parser.foot_comment = append(parser.foot_comment, comment.foot...) + } + if len(comment.line) > 0 { + if len(parser.line_comment) > 0 { + parser.line_comment = append(parser.line_comment, '\n') + } + parser.line_comment = append(parser.line_comment, comment.line...) + } + *comment = yaml_comment_t{} + parser.comments_head++ + } +} + // Remove the next token from the queue (must be called after peek_token). func skip_token(parser *yaml_parser_t) { parser.token_available = false @@ -224,10 +281,32 @@ func yaml_parser_parse_document_start(parser *yaml_parser_t, event *yaml_event_t parser.states = append(parser.states, yaml_PARSE_DOCUMENT_END_STATE) parser.state = yaml_PARSE_BLOCK_NODE_STATE + var head_comment []byte + if len(parser.head_comment) > 0 { + // [Go] Scan the header comment backwards, and if an empty line is found, break + // the header so the part before the last empty line goes into the + // document header, while the bottom of it goes into a follow up event. + for i := len(parser.head_comment) - 1; i > 0; i-- { + if parser.head_comment[i] == '\n' { + if i == len(parser.head_comment)-1 { + head_comment = parser.head_comment[:i] + parser.head_comment = parser.head_comment[i+1:] + break + } else if parser.head_comment[i-1] == '\n' { + head_comment = parser.head_comment[:i-1] + parser.head_comment = parser.head_comment[i+1:] + break + } + } + } + } + *event = yaml_event_t{ typ: yaml_DOCUMENT_START_EVENT, start_mark: token.start_mark, end_mark: token.end_mark, + + head_comment: head_comment, } } else if token.typ != yaml_STREAM_END_TOKEN { @@ -284,6 +363,7 @@ func yaml_parser_parse_document_content(parser *yaml_parser_t, event *yaml_event if token == nil { return false } + if token.typ == yaml_VERSION_DIRECTIVE_TOKEN || token.typ == yaml_TAG_DIRECTIVE_TOKEN || token.typ == yaml_DOCUMENT_START_TOKEN || @@ -327,9 +407,25 @@ func yaml_parser_parse_document_end(parser *yaml_parser_t, event *yaml_event_t) end_mark: end_mark, implicit: implicit, } + yaml_parser_set_event_comments(parser, event) + if len(event.head_comment) > 0 && len(event.foot_comment) == 0 { + event.foot_comment = event.head_comment + event.head_comment = nil + } return true } +func yaml_parser_set_event_comments(parser *yaml_parser_t, event *yaml_event_t) { + event.head_comment = parser.head_comment + event.line_comment = parser.line_comment + event.foot_comment = parser.foot_comment + parser.head_comment = nil + parser.line_comment = nil + parser.foot_comment = nil + parser.tail_comment = nil + parser.stem_comment = nil +} + // Parse the productions: // block_node_or_indentless_sequence ::= // ALIAS @@ -373,6 +469,7 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i end_mark: token.end_mark, anchor: token.value, } + yaml_parser_set_event_comments(parser, event) skip_token(parser) return true } @@ -486,6 +583,7 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i quoted_implicit: quoted_implicit, style: yaml_style_t(token.style), } + yaml_parser_set_event_comments(parser, event) skip_token(parser) return true } @@ -502,6 +600,7 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i implicit: implicit, style: yaml_style_t(yaml_FLOW_SEQUENCE_STYLE), } + yaml_parser_set_event_comments(parser, event) return true } if token.typ == yaml_FLOW_MAPPING_START_TOKEN { @@ -516,6 +615,7 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i implicit: implicit, style: yaml_style_t(yaml_FLOW_MAPPING_STYLE), } + yaml_parser_set_event_comments(parser, event) return true } if block && token.typ == yaml_BLOCK_SEQUENCE_START_TOKEN { @@ -530,6 +630,10 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i implicit: implicit, style: yaml_style_t(yaml_BLOCK_SEQUENCE_STYLE), } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } return true } if block && token.typ == yaml_BLOCK_MAPPING_START_TOKEN { @@ -544,6 +648,10 @@ func yaml_parser_parse_node(parser *yaml_parser_t, event *yaml_event_t, block, i implicit: implicit, style: yaml_style_t(yaml_BLOCK_MAPPING_STYLE), } + if parser.stem_comment != nil { + event.head_comment = parser.stem_comment + parser.stem_comment = nil + } return true } if len(anchor) > 0 || len(tag) > 0 { @@ -590,7 +698,9 @@ func yaml_parser_parse_block_sequence_entry(parser *yaml_parser_t, event *yaml_e if token.typ == yaml_BLOCK_ENTRY_TOKEN { mark := token.end_mark + prior_head_len := len(parser.head_comment) skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) token = peek_token(parser) if token == nil { return false @@ -636,7 +746,9 @@ func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *y if token.typ == yaml_BLOCK_ENTRY_TOKEN { mark := token.end_mark + prior_head_len := len(parser.head_comment) skip_token(parser) + yaml_parser_split_stem_comment(parser, prior_head_len) token = peek_token(parser) if token == nil { return false @@ -662,6 +774,32 @@ func yaml_parser_parse_indentless_sequence_entry(parser *yaml_parser_t, event *y return true } +// Split stem comment from head comment. +// +// When a sequence or map is found under a sequence entry, the former head comment +// is assigned to the underlying sequence or map as a whole, not the individual +// sequence or map entry as would be expected otherwise. To handle this case the +// previous head comment is moved aside as the stem comment. +func yaml_parser_split_stem_comment(parser *yaml_parser_t, stem_len int) { + if stem_len == 0 { + return + } + + token := peek_token(parser) + if token.typ != yaml_BLOCK_SEQUENCE_START_TOKEN && token.typ != yaml_BLOCK_MAPPING_START_TOKEN { + return + } + + parser.stem_comment = parser.head_comment[:stem_len] + if len(parser.head_comment) == stem_len { + parser.head_comment = nil + } else { + // Copy suffix to prevent very strange bugs if someone ever appends + // further bytes to the prefix in the stem_comment slice above. + parser.head_comment = append([]byte(nil), parser.head_comment[stem_len+1:]...) + } +} + // Parse the productions: // block_mapping ::= BLOCK-MAPPING_START // ******************* @@ -684,6 +822,19 @@ func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_even return false } + // [Go] A tail comment was left from the prior mapping value processed. Emit an event + // as it needs to be processed with that value and not the following key. + if len(parser.tail_comment) > 0 { + *event = yaml_event_t{ + typ: yaml_TAIL_COMMENT_EVENT, + start_mark: token.start_mark, + end_mark: token.end_mark, + foot_comment: parser.tail_comment, + } + parser.tail_comment = nil + return true + } + if token.typ == yaml_KEY_TOKEN { mark := token.end_mark skip_token(parser) @@ -709,6 +860,7 @@ func yaml_parser_parse_block_mapping_key(parser *yaml_parser_t, event *yaml_even start_mark: token.start_mark, end_mark: token.end_mark, } + yaml_parser_set_event_comments(parser, event) skip_token(parser) return true } @@ -820,6 +972,7 @@ func yaml_parser_parse_flow_sequence_entry(parser *yaml_parser_t, event *yaml_ev start_mark: token.start_mark, end_mark: token.end_mark, } + yaml_parser_set_event_comments(parser, event) skip_token(parser) return true @@ -959,6 +1112,7 @@ func yaml_parser_parse_flow_mapping_key(parser *yaml_parser_t, event *yaml_event start_mark: token.start_mark, end_mark: token.end_mark, } + yaml_parser_set_event_comments(parser, event) skip_token(parser) return true } diff --git a/vendor/gopkg.in/yaml.v2/readerc.go b/vendor/gopkg.in/yaml.v3/readerc.go similarity index 91% rename from vendor/gopkg.in/yaml.v2/readerc.go rename to vendor/gopkg.in/yaml.v3/readerc.go index 7c1f5fa..b7de0a8 100644 --- a/vendor/gopkg.in/yaml.v2/readerc.go +++ b/vendor/gopkg.in/yaml.v3/readerc.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml import ( @@ -95,7 +117,7 @@ func yaml_parser_update_buffer(parser *yaml_parser_t, length int) bool { // [Go] This function was changed to guarantee the requested length size at EOF. // The fact we need to do this is pretty awful, but the description above implies - // for that to be the case, and there are tests + // for that to be the case, and there are tests // If the EOF flag is set and the raw buffer is empty, do nothing. if parser.eof && parser.raw_buffer_pos == len(parser.raw_buffer) { diff --git a/vendor/gopkg.in/yaml.v2/resolve.go b/vendor/gopkg.in/yaml.v3/resolve.go similarity index 59% rename from vendor/gopkg.in/yaml.v2/resolve.go rename to vendor/gopkg.in/yaml.v3/resolve.go index 6c151db..64ae888 100644 --- a/vendor/gopkg.in/yaml.v2/resolve.go +++ b/vendor/gopkg.in/yaml.v3/resolve.go @@ -1,3 +1,18 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package yaml import ( @@ -34,18 +49,14 @@ func init() { tag string l []string }{ - {true, yaml_BOOL_TAG, []string{"y", "Y", "yes", "Yes", "YES"}}, - {true, yaml_BOOL_TAG, []string{"true", "True", "TRUE"}}, - {true, yaml_BOOL_TAG, []string{"on", "On", "ON"}}, - {false, yaml_BOOL_TAG, []string{"n", "N", "no", "No", "NO"}}, - {false, yaml_BOOL_TAG, []string{"false", "False", "FALSE"}}, - {false, yaml_BOOL_TAG, []string{"off", "Off", "OFF"}}, - {nil, yaml_NULL_TAG, []string{"", "~", "null", "Null", "NULL"}}, - {math.NaN(), yaml_FLOAT_TAG, []string{".nan", ".NaN", ".NAN"}}, - {math.Inf(+1), yaml_FLOAT_TAG, []string{".inf", ".Inf", ".INF"}}, - {math.Inf(+1), yaml_FLOAT_TAG, []string{"+.inf", "+.Inf", "+.INF"}}, - {math.Inf(-1), yaml_FLOAT_TAG, []string{"-.inf", "-.Inf", "-.INF"}}, - {"<<", yaml_MERGE_TAG, []string{"<<"}}, + {true, boolTag, []string{"true", "True", "TRUE"}}, + {false, boolTag, []string{"false", "False", "FALSE"}}, + {nil, nullTag, []string{"", "~", "null", "Null", "NULL"}}, + {math.NaN(), floatTag, []string{".nan", ".NaN", ".NAN"}}, + {math.Inf(+1), floatTag, []string{".inf", ".Inf", ".INF"}}, + {math.Inf(+1), floatTag, []string{"+.inf", "+.Inf", "+.INF"}}, + {math.Inf(-1), floatTag, []string{"-.inf", "-.Inf", "-.INF"}}, + {"<<", mergeTag, []string{"<<"}}, } m := resolveMap @@ -56,11 +67,37 @@ func init() { } } +const ( + nullTag = "!!null" + boolTag = "!!bool" + strTag = "!!str" + intTag = "!!int" + floatTag = "!!float" + timestampTag = "!!timestamp" + seqTag = "!!seq" + mapTag = "!!map" + binaryTag = "!!binary" + mergeTag = "!!merge" +) + +var longTags = make(map[string]string) +var shortTags = make(map[string]string) + +func init() { + for _, stag := range []string{nullTag, boolTag, strTag, intTag, floatTag, timestampTag, seqTag, mapTag, binaryTag, mergeTag} { + ltag := longTag(stag) + longTags[stag] = ltag + shortTags[ltag] = stag + } +} + const longTagPrefix = "tag:yaml.org,2002:" func shortTag(tag string) string { - // TODO This can easily be made faster and produce less garbage. if strings.HasPrefix(tag, longTagPrefix) { + if stag, ok := shortTags[tag]; ok { + return stag + } return "!!" + tag[len(longTagPrefix):] } return tag @@ -68,6 +105,9 @@ func shortTag(tag string) string { func longTag(tag string) string { if strings.HasPrefix(tag, "!!") { + if ltag, ok := longTags[tag]; ok { + return ltag + } return longTagPrefix + tag[2:] } return tag @@ -75,32 +115,33 @@ func longTag(tag string) string { func resolvableTag(tag string) bool { switch tag { - case "", yaml_STR_TAG, yaml_BOOL_TAG, yaml_INT_TAG, yaml_FLOAT_TAG, yaml_NULL_TAG, yaml_TIMESTAMP_TAG: + case "", strTag, boolTag, intTag, floatTag, nullTag, timestampTag: return true } return false } -var yamlStyleFloat = regexp.MustCompile(`^[-+]?[0-9]*\.?[0-9]+([eE][-+][0-9]+)?$`) +var yamlStyleFloat = regexp.MustCompile(`^[-+]?(\.[0-9]+|[0-9]+(\.[0-9]*)?)([eE][-+]?[0-9]+)?$`) func resolve(tag string, in string) (rtag string, out interface{}) { + tag = shortTag(tag) if !resolvableTag(tag) { return tag, in } defer func() { switch tag { - case "", rtag, yaml_STR_TAG, yaml_BINARY_TAG: + case "", rtag, strTag, binaryTag: return - case yaml_FLOAT_TAG: - if rtag == yaml_INT_TAG { + case floatTag: + if rtag == intTag { switch v := out.(type) { case int64: - rtag = yaml_FLOAT_TAG + rtag = floatTag out = float64(v) return case int: - rtag = yaml_FLOAT_TAG + rtag = floatTag out = float64(v) return } @@ -115,7 +156,7 @@ func resolve(tag string, in string) (rtag string, out interface{}) { if in != "" { hint = resolveTable[in[0]] } - if hint != 0 && tag != yaml_STR_TAG && tag != yaml_BINARY_TAG { + if hint != 0 && tag != strTag && tag != binaryTag { // Handle things we can lookup in a map. if item, ok := resolveMap[in]; ok { return item.tag, item.value @@ -133,17 +174,17 @@ func resolve(tag string, in string) (rtag string, out interface{}) { // Not in the map, so maybe a normal float. floatv, err := strconv.ParseFloat(in, 64) if err == nil { - return yaml_FLOAT_TAG, floatv + return floatTag, floatv } case 'D', 'S': // Int, float, or timestamp. // Only try values as a timestamp if the value is unquoted or there's an explicit // !!timestamp tag. - if tag == "" || tag == yaml_TIMESTAMP_TAG { + if tag == "" || tag == timestampTag { t, ok := parseTimestamp(in) if ok { - return yaml_TIMESTAMP_TAG, t + return timestampTag, t } } @@ -151,49 +192,76 @@ func resolve(tag string, in string) (rtag string, out interface{}) { intv, err := strconv.ParseInt(plain, 0, 64) if err == nil { if intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) + return intTag, int(intv) } else { - return yaml_INT_TAG, intv + return intTag, intv } } uintv, err := strconv.ParseUint(plain, 0, 64) if err == nil { - return yaml_INT_TAG, uintv + return intTag, uintv } if yamlStyleFloat.MatchString(plain) { floatv, err := strconv.ParseFloat(plain, 64) if err == nil { - return yaml_FLOAT_TAG, floatv + return floatTag, floatv } } if strings.HasPrefix(plain, "0b") { intv, err := strconv.ParseInt(plain[2:], 2, 64) if err == nil { if intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) + return intTag, int(intv) } else { - return yaml_INT_TAG, intv + return intTag, intv } } uintv, err := strconv.ParseUint(plain[2:], 2, 64) if err == nil { - return yaml_INT_TAG, uintv + return intTag, uintv } } else if strings.HasPrefix(plain, "-0b") { - intv, err := strconv.ParseInt("-" + plain[3:], 2, 64) + intv, err := strconv.ParseInt("-"+plain[3:], 2, 64) + if err == nil { + if true || intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + } + // Octals as introduced in version 1.2 of the spec. + // Octals from the 1.1 spec, spelled as 0777, are still + // decoded by default in v3 as well for compatibility. + // May be dropped in v4 depending on how usage evolves. + if strings.HasPrefix(plain, "0o") { + intv, err := strconv.ParseInt(plain[2:], 8, 64) + if err == nil { + if intv == int64(int(intv)) { + return intTag, int(intv) + } else { + return intTag, intv + } + } + uintv, err := strconv.ParseUint(plain[2:], 8, 64) + if err == nil { + return intTag, uintv + } + } else if strings.HasPrefix(plain, "-0o") { + intv, err := strconv.ParseInt("-"+plain[3:], 8, 64) if err == nil { if true || intv == int64(int(intv)) { - return yaml_INT_TAG, int(intv) + return intTag, int(intv) } else { - return yaml_INT_TAG, intv + return intTag, intv } } } default: - panic("resolveTable item not yet handled: " + string(rune(hint)) + " (with " + in + ")") + panic("internal error: missing handler for resolver table: " + string(rune(hint)) + " (with " + in + ")") } } - return yaml_STR_TAG, in + return strTag, in } // encodeBase64 encodes s as base64 that is broken up into multiple lines diff --git a/vendor/gopkg.in/yaml.v2/scannerc.go b/vendor/gopkg.in/yaml.v3/scannerc.go similarity index 84% rename from vendor/gopkg.in/yaml.v2/scannerc.go rename to vendor/gopkg.in/yaml.v3/scannerc.go index 077fd1d..ca00701 100644 --- a/vendor/gopkg.in/yaml.v2/scannerc.go +++ b/vendor/gopkg.in/yaml.v3/scannerc.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml import ( @@ -489,6 +511,9 @@ func cache(parser *yaml_parser_t, length int) bool { // Advance the buffer pointer. func skip(parser *yaml_parser_t) { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } parser.mark.index++ parser.mark.column++ parser.unread-- @@ -502,17 +527,22 @@ func skip_line(parser *yaml_parser_t) { parser.mark.line++ parser.unread -= 2 parser.buffer_pos += 2 + parser.newlines++ } else if is_break(parser.buffer, parser.buffer_pos) { parser.mark.index++ parser.mark.column = 0 parser.mark.line++ parser.unread-- parser.buffer_pos += width(parser.buffer[parser.buffer_pos]) + parser.newlines++ } } // Copy a character to a string buffer and advance pointers. func read(parser *yaml_parser_t, s []byte) []byte { + if !is_blank(parser.buffer, parser.buffer_pos) { + parser.newlines = 0 + } w := width(parser.buffer[parser.buffer_pos]) if w == 0 { panic("invalid character sequence") @@ -564,6 +594,7 @@ func read_line(parser *yaml_parser_t, s []byte) []byte { parser.mark.column = 0 parser.mark.line++ parser.unread-- + parser.newlines++ return s } @@ -626,30 +657,21 @@ func trace(args ...interface{}) func() { func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { // While we need more tokens to fetch, do it. for { - // Check if we really need to fetch more tokens. - need_more_tokens := false - - if parser.tokens_head == len(parser.tokens) { - // Queue is empty. - need_more_tokens = true - } else { - // Check if any potential simple key may occupy the head position. - if !yaml_parser_stale_simple_keys(parser) { + // [Go] The comment parsing logic requires a lookahead of two tokens + // so that foot comments may be parsed in time of associating them + // with the tokens that are parsed before them, and also for line + // comments to be transformed into head comments in some edge cases. + if parser.tokens_head < len(parser.tokens)-2 { + // If a potential simple key is at the head position, we need to fetch + // the next token to disambiguate it. + head_tok_idx, ok := parser.simple_keys_by_tok[parser.tokens_parsed] + if !ok { + break + } else if valid, ok := yaml_simple_key_is_valid(parser, &parser.simple_keys[head_tok_idx]); !ok { return false + } else if !valid { + break } - - for i := range parser.simple_keys { - simple_key := &parser.simple_keys[i] - if simple_key.possible && simple_key.token_number == parser.tokens_parsed { - need_more_tokens = true - break - } - } - } - - // We are finished. - if !need_more_tokens { - break } // Fetch the next token. if !yaml_parser_fetch_next_token(parser) { @@ -662,7 +684,7 @@ func yaml_parser_fetch_more_tokens(parser *yaml_parser_t) bool { } // The dispatcher for token fetchers. -func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { +func yaml_parser_fetch_next_token(parser *yaml_parser_t) (ok bool) { // Ensure that the buffer is initialized. if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { return false @@ -673,18 +695,19 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { return yaml_parser_fetch_stream_start(parser) } + scan_mark := parser.mark + // Eat whitespaces and comments until we reach the next token. if !yaml_parser_scan_to_next_token(parser) { return false } - // Remove obsolete potential simple keys. - if !yaml_parser_stale_simple_keys(parser) { - return false - } + // [Go] While unrolling indents, transform the head comments of prior + // indentation levels observed after scan_start into foot comments at + // the respective indexes. // Check the indentation level against the current column. - if !yaml_parser_unroll_indent(parser, parser.mark.column) { + if !yaml_parser_unroll_indent(parser, parser.mark.column, scan_mark) { return false } @@ -717,6 +740,26 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { return yaml_parser_fetch_document_indicator(parser, yaml_DOCUMENT_END_TOKEN) } + comment_mark := parser.mark + if len(parser.tokens) > 0 && (parser.flow_level == 0 && buf[pos] == ':' || parser.flow_level > 0 && buf[pos] == ',') { + // Associate any following comments with the prior token. + comment_mark = parser.tokens[len(parser.tokens)-1].start_mark + } + defer func() { + if !ok { + return + } + if len(parser.tokens) > 0 && parser.tokens[len(parser.tokens)-1].typ == yaml_BLOCK_ENTRY_TOKEN { + // Sequence indicators alone have no line comments. It becomes + // a head comment for whatever follows. + return + } + if !yaml_parser_scan_line_comment(parser, comment_mark) { + ok = false + return + } + }() + // Is it the flow sequence start indicator? if buf[pos] == '[' { return yaml_parser_fetch_flow_collection_start(parser, yaml_FLOW_SEQUENCE_START_TOKEN) @@ -810,7 +853,7 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { // if it is followed by a non-space character. // // The last rule is more restrictive than the specification requires. - // [Go] Make this logic more reasonable. + // [Go] TODO Make this logic more reasonable. //switch parser.buffer[parser.buffer_pos] { //case '-', '?', ':', ',', '?', '-', ',', ':', ']', '[', '}', '{', '&', '#', '!', '*', '>', '|', '"', '\'', '@', '%', '-', '`': //} @@ -837,29 +880,30 @@ func yaml_parser_fetch_next_token(parser *yaml_parser_t) bool { "found character that cannot start any token") } -// Check the list of potential simple keys and remove the positions that -// cannot contain simple keys anymore. -func yaml_parser_stale_simple_keys(parser *yaml_parser_t) bool { - // Check for a potential simple key for each flow level. - for i := range parser.simple_keys { - simple_key := &parser.simple_keys[i] +func yaml_simple_key_is_valid(parser *yaml_parser_t, simple_key *yaml_simple_key_t) (valid, ok bool) { + if !simple_key.possible { + return false, true + } - // The specification requires that a simple key - // - // - is limited to a single line, - // - is shorter than 1024 characters. - if simple_key.possible && (simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index) { - - // Check if the potential simple key to be removed is required. - if simple_key.required { - return yaml_parser_set_scanner_error(parser, - "while scanning a simple key", simple_key.mark, - "could not find expected ':'") - } - simple_key.possible = false + // The 1.2 specification says: + // + // "If the ? indicator is omitted, parsing needs to see past the + // implicit key to recognize it as such. To limit the amount of + // lookahead required, the “:” indicator must appear at most 1024 + // Unicode characters beyond the start of the key. In addition, the key + // is restricted to a single line." + // + if simple_key.mark.line < parser.mark.line || simple_key.mark.index+1024 < parser.mark.index { + // Check if the potential simple key to be removed is required. + if simple_key.required { + return false, yaml_parser_set_scanner_error(parser, + "while scanning a simple key", simple_key.mark, + "could not find expected ':'") } + simple_key.possible = false + return false, true } - return true + return true, true } // Check if a simple key may start at the current position and add it if @@ -879,13 +923,14 @@ func yaml_parser_save_simple_key(parser *yaml_parser_t) bool { possible: true, required: required, token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, } - simple_key.mark = parser.mark if !yaml_parser_remove_simple_key(parser) { return false } parser.simple_keys[len(parser.simple_keys)-1] = simple_key + parser.simple_keys_by_tok[simple_key.token_number] = len(parser.simple_keys) - 1 } return true } @@ -900,19 +945,33 @@ func yaml_parser_remove_simple_key(parser *yaml_parser_t) bool { "while scanning a simple key", parser.simple_keys[i].mark, "could not find expected ':'") } + // Remove the key from the stack. + parser.simple_keys[i].possible = false + delete(parser.simple_keys_by_tok, parser.simple_keys[i].token_number) } - // Remove the key from the stack. - parser.simple_keys[i].possible = false return true } +// max_flow_level limits the flow_level +const max_flow_level = 10000 + // Increase the flow level and resize the simple key list if needed. func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { // Reset the simple key on the next level. - parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{ + possible: false, + required: false, + token_number: parser.tokens_parsed + (len(parser.tokens) - parser.tokens_head), + mark: parser.mark, + }) // Increase the flow level. parser.flow_level++ + if parser.flow_level > max_flow_level { + return yaml_parser_set_scanner_error(parser, + "while increasing flow level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_flow_level)) + } return true } @@ -920,11 +979,16 @@ func yaml_parser_increase_flow_level(parser *yaml_parser_t) bool { func yaml_parser_decrease_flow_level(parser *yaml_parser_t) bool { if parser.flow_level > 0 { parser.flow_level-- - parser.simple_keys = parser.simple_keys[:len(parser.simple_keys)-1] + last := len(parser.simple_keys) - 1 + delete(parser.simple_keys_by_tok, parser.simple_keys[last].token_number) + parser.simple_keys = parser.simple_keys[:last] } return true } +// max_indents limits the indents stack size +const max_indents = 10000 + // Push the current indentation level to the stack and set the new level // the current column is greater than the indentation level. In this case, // append or insert the specified token into the token queue. @@ -939,6 +1003,11 @@ func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml // indentation level. parser.indents = append(parser.indents, parser.indent) parser.indent = column + if len(parser.indents) > max_indents { + return yaml_parser_set_scanner_error(parser, + "while increasing indent level", parser.simple_keys[len(parser.simple_keys)-1].mark, + fmt.Sprintf("exceeded max depth of %d", max_indents)) + } // Create a token and insert it into the queue. token := yaml_token_t{ @@ -957,19 +1026,49 @@ func yaml_parser_roll_indent(parser *yaml_parser_t, column, number int, typ yaml // Pop indentation levels from the indents stack until the current level // becomes less or equal to the column. For each indentation level, append // the BLOCK-END token. -func yaml_parser_unroll_indent(parser *yaml_parser_t, column int) bool { +func yaml_parser_unroll_indent(parser *yaml_parser_t, column int, scan_mark yaml_mark_t) bool { // In the flow context, do nothing. if parser.flow_level > 0 { return true } + block_mark := scan_mark + block_mark.index-- + // Loop through the indentation levels in the stack. for parser.indent > column { + + // [Go] Reposition the end token before potential following + // foot comments of parent blocks. For that, search + // backwards for recent comments that were at the same + // indent as the block that is ending now. + stop_index := block_mark.index + for i := len(parser.comments) - 1; i >= 0; i-- { + comment := &parser.comments[i] + + if comment.end_mark.index < stop_index { + // Don't go back beyond the start of the comment/whitespace scan, unless column < 0. + // If requested indent column is < 0, then the document is over and everything else + // is a foot anyway. + break + } + if comment.start_mark.column == parser.indent+1 { + // This is a good match. But maybe there's a former comment + // at that same indent level, so keep searching. + block_mark = comment.start_mark + } + + // While the end of the former comment matches with + // the start of the following one, we know there's + // nothing in between and scanning is still safe. + stop_index = comment.scan_mark.index + } + // Create a token and append it to the queue. token := yaml_token_t{ typ: yaml_BLOCK_END_TOKEN, - start_mark: parser.mark, - end_mark: parser.mark, + start_mark: block_mark, + end_mark: block_mark, } yaml_insert_token(parser, -1, &token) @@ -989,6 +1088,8 @@ func yaml_parser_fetch_stream_start(parser *yaml_parser_t) bool { // Initialize the simple key stack. parser.simple_keys = append(parser.simple_keys, yaml_simple_key_t{}) + parser.simple_keys_by_tok = make(map[int]int) + // A simple key is allowed at the beginning of the stream. parser.simple_key_allowed = true @@ -1016,7 +1117,7 @@ func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { } // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { return false } @@ -1040,7 +1141,7 @@ func yaml_parser_fetch_stream_end(parser *yaml_parser_t) bool { // Produce a VERSION-DIRECTIVE or TAG-DIRECTIVE token. func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { return false } @@ -1064,7 +1165,7 @@ func yaml_parser_fetch_directive(parser *yaml_parser_t) bool { // Produce the DOCUMENT-START or DOCUMENT-END token. func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_type_t) bool { // Reset the indentation level. - if !yaml_parser_unroll_indent(parser, -1) { + if !yaml_parser_unroll_indent(parser, -1, parser.mark) { return false } @@ -1097,6 +1198,7 @@ func yaml_parser_fetch_document_indicator(parser *yaml_parser_t, typ yaml_token_ // Produce the FLOW-SEQUENCE-START or FLOW-MAPPING-START token. func yaml_parser_fetch_flow_collection_start(parser *yaml_parser_t, typ yaml_token_type_t) bool { + // The indicators '[' and '{' may start a simple key. if !yaml_parser_save_simple_key(parser) { return false @@ -1270,7 +1372,11 @@ func yaml_parser_fetch_value(parser *yaml_parser_t) bool { simple_key := &parser.simple_keys[len(parser.simple_keys)-1] // Have we found a simple key? - if simple_key.possible { + if valid, ok := yaml_simple_key_is_valid(parser, simple_key); !ok { + return false + + } else if valid { + // Create the KEY token and insert it into the queue. token := yaml_token_t{ typ: yaml_KEY_TOKEN, @@ -1288,6 +1394,7 @@ func yaml_parser_fetch_value(parser *yaml_parser_t) bool { // Remove the simple key. simple_key.possible = false + delete(parser.simple_keys_by_tok, simple_key.token_number) // A simple key cannot follow another simple key. parser.simple_key_allowed = false @@ -1427,6 +1534,8 @@ func yaml_parser_fetch_plain_scalar(parser *yaml_parser_t) bool { // Eat whitespaces and comments until the next token is found. func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { + scan_mark := parser.mark + // Until the next token is not found. for { // Allow the BOM mark to start a line. @@ -1453,13 +1562,33 @@ func yaml_parser_scan_to_next_token(parser *yaml_parser_t) bool { } } + // Check if we just had a line comment under a sequence entry that + // looks more like a header to the following content. Similar to this: + // + // - # The comment + // - Some data + // + // If so, transform the line comment to a head comment and reposition. + if len(parser.comments) > 0 && len(parser.tokens) > 1 { + tokenA := parser.tokens[len(parser.tokens)-2] + tokenB := parser.tokens[len(parser.tokens)-1] + comment := &parser.comments[len(parser.comments)-1] + if tokenA.typ == yaml_BLOCK_SEQUENCE_START_TOKEN && tokenB.typ == yaml_BLOCK_ENTRY_TOKEN && len(comment.line) > 0 && !is_break(parser.buffer, parser.buffer_pos) { + // If it was in the prior line, reposition so it becomes a + // header of the follow up token. Otherwise, keep it in place + // so it becomes a header of the former. + comment.head = comment.line + comment.line = nil + if comment.start_mark.line == parser.mark.line-1 { + comment.token_mark = parser.mark + } + } + } + // Eat a comment until a line break. if parser.buffer[parser.buffer_pos] == '#' { - for !is_breakz(parser.buffer, parser.buffer_pos) { - skip(parser) - if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { - return false - } + if !yaml_parser_scan_comments(parser, scan_mark) { + return false } } @@ -1557,6 +1686,10 @@ func yaml_parser_scan_directive(parser *yaml_parser_t, token *yaml_token_t) bool } if parser.buffer[parser.buffer_pos] == '#' { + // [Go] Discard this inline comment for the time being. + //if !yaml_parser_scan_line_comment(parser, start_mark) { + // return false + //} for !is_breakz(parser.buffer, parser.buffer_pos) { skip(parser) if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -1972,7 +2105,7 @@ func yaml_parser_scan_tag_uri(parser *yaml_parser_t, directive bool, head []byte // '0'-'9', 'A'-'Z', 'a'-'z', '_', '-', ';', '/', '?', ':', '@', '&', // '=', '+', '$', ',', '.', '!', '~', '*', '\'', '(', ')', '[', ']', // '%'. - // [Go] Convert this into more reasonable logic. + // [Go] TODO Convert this into more reasonable logic. for is_alpha(parser.buffer, parser.buffer_pos) || parser.buffer[parser.buffer_pos] == ';' || parser.buffer[parser.buffer_pos] == '/' || parser.buffer[parser.buffer_pos] == '?' || parser.buffer[parser.buffer_pos] == ':' || parser.buffer[parser.buffer_pos] == '@' || @@ -2127,6 +2260,9 @@ func yaml_parser_scan_block_scalar(parser *yaml_parser_t, token *yaml_token_t, l } } if parser.buffer[parser.buffer_pos] == '#' { + if !yaml_parser_scan_line_comment(parser, start_mark) { + return false + } for !is_breakz(parser.buffer, parser.buffer_pos) { skip(parser) if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { @@ -2694,3 +2830,209 @@ func yaml_parser_scan_plain_scalar(parser *yaml_parser_t, token *yaml_token_t) b } return true } + +func yaml_parser_scan_line_comment(parser *yaml_parser_t, token_mark yaml_mark_t) bool { + if parser.newlines > 0 { + return true + } + + var start_mark yaml_mark_t + var text []byte + + for peek := 0; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + if parser.buffer[parser.buffer_pos+peek] == '#' { + seen := parser.mark.index+peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + if len(text) == 0 { + start_mark = parser.mark + } + text = read(parser, text) + } else { + skip(parser) + } + } + } + break + } + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + token_mark: token_mark, + start_mark: start_mark, + line: text, + }) + } + return true +} + +func yaml_parser_scan_comments(parser *yaml_parser_t, scan_mark yaml_mark_t) bool { + token := parser.tokens[len(parser.tokens)-1] + + if token.typ == yaml_FLOW_ENTRY_TOKEN && len(parser.tokens) > 1 { + token = parser.tokens[len(parser.tokens)-2] + } + + var token_mark = token.start_mark + var start_mark yaml_mark_t + var next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } + + var recent_empty = false + var first_empty = parser.newlines <= 1 + + var line = parser.mark.line + var column = parser.mark.column + + var text []byte + + // The foot line is the place where a comment must start to + // still be considered as a foot of the prior content. + // If there's some content in the currently parsed line, then + // the foot is the line below it. + var foot_line = -1 + if scan_mark.line > 0 { + foot_line = parser.mark.line-parser.newlines+1 + if parser.newlines == 0 && parser.mark.column > 1 { + foot_line++ + } + } + + var peek = 0 + for ; peek < 512; peek++ { + if parser.unread < peek+1 && !yaml_parser_update_buffer(parser, peek+1) { + break + } + column++ + if is_blank(parser.buffer, parser.buffer_pos+peek) { + continue + } + c := parser.buffer[parser.buffer_pos+peek] + var close_flow = parser.flow_level > 0 && (c == ']' || c == '}') + if close_flow || is_breakz(parser.buffer, parser.buffer_pos+peek) { + // Got line break or terminator. + if close_flow || !recent_empty { + if close_flow || first_empty && (start_mark.line == foot_line && token.typ != yaml_VALUE_TOKEN || start_mark.column-1 < next_indent) { + // This is the first empty line and there were no empty lines before, + // so this initial part of the comment is a foot of the prior token + // instead of being a head for the following one. Split it up. + // Alternatively, this might also be the last comment inside a flow + // scope, so it must be a footer. + if len(text) > 0 { + if start_mark.column-1 < next_indent { + // If dedented it's unrelated to the prior token. + token_mark = start_mark + } + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + } else { + if len(text) > 0 && parser.buffer[parser.buffer_pos+peek] != 0 { + text = append(text, '\n') + } + } + } + if !is_break(parser.buffer, parser.buffer_pos+peek) { + break + } + first_empty = false + recent_empty = true + column = 0 + line++ + continue + } + + if len(text) > 0 && (close_flow || column-1 < next_indent && column != start_mark.column) { + // The comment at the different indentation is a foot of the + // preceding data rather than a head of the upcoming one. + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: token_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek, line, column}, + foot: text, + }) + scan_mark = yaml_mark_t{parser.mark.index + peek, line, column} + token_mark = scan_mark + text = nil + } + + if parser.buffer[parser.buffer_pos+peek] != '#' { + break + } + + if len(text) == 0 { + start_mark = yaml_mark_t{parser.mark.index + peek, line, column} + } else { + text = append(text, '\n') + } + + recent_empty = false + + // Consume until after the consumed comment line. + seen := parser.mark.index+peek + for { + if parser.unread < 1 && !yaml_parser_update_buffer(parser, 1) { + return false + } + if is_breakz(parser.buffer, parser.buffer_pos) { + if parser.mark.index >= seen { + break + } + if parser.unread < 2 && !yaml_parser_update_buffer(parser, 2) { + return false + } + skip_line(parser) + } else if parser.mark.index >= seen { + text = read(parser, text) + } else { + skip(parser) + } + } + + peek = 0 + column = 0 + line = parser.mark.line + next_indent = parser.indent + if next_indent < 0 { + next_indent = 0 + } + } + + if len(text) > 0 { + parser.comments = append(parser.comments, yaml_comment_t{ + scan_mark: scan_mark, + token_mark: start_mark, + start_mark: start_mark, + end_mark: yaml_mark_t{parser.mark.index + peek - 1, line, column}, + head: text, + }) + } + return true +} diff --git a/vendor/gopkg.in/yaml.v2/sorter.go b/vendor/gopkg.in/yaml.v3/sorter.go similarity index 76% rename from vendor/gopkg.in/yaml.v2/sorter.go rename to vendor/gopkg.in/yaml.v3/sorter.go index 4c45e66..9210ece 100644 --- a/vendor/gopkg.in/yaml.v2/sorter.go +++ b/vendor/gopkg.in/yaml.v3/sorter.go @@ -1,3 +1,18 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + package yaml import ( @@ -37,8 +52,10 @@ func (l keyList) Less(i, j int) bool { return ak < bk } ar, br := []rune(a.String()), []rune(b.String()) + digits := false for i := 0; i < len(ar) && i < len(br); i++ { if ar[i] == br[i] { + digits = unicode.IsDigit(ar[i]) continue } al := unicode.IsLetter(ar[i]) @@ -47,12 +64,16 @@ func (l keyList) Less(i, j int) bool { return ar[i] < br[i] } if al || bl { - return bl + if digits { + return al + } else { + return bl + } } var ai, bi int var an, bn int64 if ar[i] == '0' || br[i] == '0' { - for j := i-1; j >= 0 && unicode.IsDigit(ar[j]); j-- { + for j := i - 1; j >= 0 && unicode.IsDigit(ar[j]); j-- { if ar[j] != '0' { an = 1 bn = 1 diff --git a/vendor/gopkg.in/yaml.v3/writerc.go b/vendor/gopkg.in/yaml.v3/writerc.go new file mode 100644 index 0000000..b8a116b --- /dev/null +++ b/vendor/gopkg.in/yaml.v3/writerc.go @@ -0,0 +1,48 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +package yaml + +// Set the writer error and return false. +func yaml_emitter_set_writer_error(emitter *yaml_emitter_t, problem string) bool { + emitter.error = yaml_WRITER_ERROR + emitter.problem = problem + return false +} + +// Flush the output buffer. +func yaml_emitter_flush(emitter *yaml_emitter_t) bool { + if emitter.write_handler == nil { + panic("write handler not set") + } + + // Check if the buffer is empty. + if emitter.buffer_pos == 0 { + return true + } + + if err := emitter.write_handler(emitter, emitter.buffer[:emitter.buffer_pos]); err != nil { + return yaml_emitter_set_writer_error(emitter, "write error: "+err.Error()) + } + emitter.buffer_pos = 0 + return true +} diff --git a/vendor/gopkg.in/yaml.v2/yaml.go b/vendor/gopkg.in/yaml.v3/yaml.go similarity index 55% rename from vendor/gopkg.in/yaml.v2/yaml.go rename to vendor/gopkg.in/yaml.v3/yaml.go index de85aa4..8cec6da 100644 --- a/vendor/gopkg.in/yaml.v2/yaml.go +++ b/vendor/gopkg.in/yaml.v3/yaml.go @@ -1,3 +1,18 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + // Package yaml implements YAML support for the Go language. // // Source code and other details for the project are available at GitHub: @@ -13,23 +28,16 @@ import ( "reflect" "strings" "sync" + "unicode/utf8" ) -// MapSlice encodes and decodes as a YAML map. -// The order of keys is preserved when encoding and decoding. -type MapSlice []MapItem - -// MapItem is an item in a MapSlice. -type MapItem struct { - Key, Value interface{} -} - // The Unmarshaler interface may be implemented by types to customize their -// behavior when being unmarshaled from a YAML document. The UnmarshalYAML -// method receives a function that may be called to unmarshal the original -// YAML value into a field or variable. It is safe to call the unmarshal -// function parameter more than once if necessary. +// behavior when being unmarshaled from a YAML document. type Unmarshaler interface { + UnmarshalYAML(value *Node) error +} + +type obsoleteUnmarshaler interface { UnmarshalYAML(unmarshal func(interface{}) error) error } @@ -81,18 +89,10 @@ func Unmarshal(in []byte, out interface{}) (err error) { return unmarshal(in, out, false) } -// UnmarshalStrict is like Unmarshal except that any fields that are found -// in the data that do not have corresponding struct members, or mapping -// keys that are duplicates, will result in -// an error. -func UnmarshalStrict(in []byte, out interface{}) (err error) { - return unmarshal(in, out, true) -} - -// A Decorder reads and decodes YAML values from an input stream. +// A Decoder reads and decodes YAML values from an input stream. type Decoder struct { - strict bool - parser *parser + parser *parser + knownFields bool } // NewDecoder returns a new decoder that reads from r. @@ -105,10 +105,10 @@ func NewDecoder(r io.Reader) *Decoder { } } -// SetStrict sets whether strict decoding behaviour is enabled when -// decoding items in the data (see UnmarshalStrict). By default, decoding is not strict. -func (dec *Decoder) SetStrict(strict bool) { - dec.strict = strict +// KnownFields ensures that the keys in decoded mappings to +// exist as fields in the struct being decoded into. +func (dec *Decoder) KnownFields(enable bool) { + dec.knownFields = enable } // Decode reads the next YAML-encoded value from its input @@ -117,7 +117,8 @@ func (dec *Decoder) SetStrict(strict bool) { // See the documentation for Unmarshal for details about the // conversion of YAML into a Go value. func (dec *Decoder) Decode(v interface{}) (err error) { - d := newDecoder(dec.strict) + d := newDecoder() + d.knownFields = dec.knownFields defer handleErr(&err) node := dec.parser.parse() if node == nil { @@ -134,9 +135,27 @@ func (dec *Decoder) Decode(v interface{}) (err error) { return nil } +// Decode decodes the node and stores its data into the value pointed to by v. +// +// See the documentation for Unmarshal for details about the +// conversion of YAML into a Go value. +func (n *Node) Decode(v interface{}) (err error) { + d := newDecoder() + defer handleErr(&err) + out := reflect.ValueOf(v) + if out.Kind() == reflect.Ptr && !out.IsNil() { + out = out.Elem() + } + d.unmarshal(n, out) + if len(d.terrors) > 0 { + return &TypeError{d.terrors} + } + return nil +} + func unmarshal(in []byte, out interface{}, strict bool) (err error) { defer handleErr(&err) - d := newDecoder(strict) + d := newDecoder() p := newParser(in) defer p.destroy() node := p.parse() @@ -175,7 +194,7 @@ func unmarshal(in []byte, out interface{}, strict bool) (err error) { // Zero valued structs will be omitted if all their public // fields are zero, unless they implement an IsZero // method (see the IsZeroer interface type), in which -// case the field will be included if that method returns true. +// case the field will be excluded if IsZero returns true. // // flow Marshal using a flow style (useful for structs, // sequences and maps). @@ -233,6 +252,32 @@ func (e *Encoder) Encode(v interface{}) (err error) { return nil } +// Encode encodes value v and stores its representation in n. +// +// See the documentation for Marshal for details about the +// conversion of Go values into YAML. +func (n *Node) Encode(v interface{}) (err error) { + defer handleErr(&err) + e := newEncoder() + defer e.destroy() + e.marshalDoc("", reflect.ValueOf(v)) + e.finish() + p := newParser(e.out) + p.textless = true + defer p.destroy() + doc := p.parse() + *n = *doc.Content[0] + return nil +} + +// SetIndent changes the used indentation used when encoding. +func (e *Encoder) SetIndent(spaces int) { + if spaces < 0 { + panic("yaml: cannot indent to a negative number of spaces") + } + e.encoder.indent = spaces +} + // Close closes the encoder by writing any remaining data. // It does not write a stream terminating string "...". func (e *Encoder) Close() (err error) { @@ -275,6 +320,168 @@ func (e *TypeError) Error() string { return fmt.Sprintf("yaml: unmarshal errors:\n %s", strings.Join(e.Errors, "\n ")) } +type Kind uint32 + +const ( + DocumentNode Kind = 1 << iota + SequenceNode + MappingNode + ScalarNode + AliasNode +) + +type Style uint32 + +const ( + TaggedStyle Style = 1 << iota + DoubleQuotedStyle + SingleQuotedStyle + LiteralStyle + FoldedStyle + FlowStyle +) + +// Node represents an element in the YAML document hierarchy. While documents +// are typically encoded and decoded into higher level types, such as structs +// and maps, Node is an intermediate representation that allows detailed +// control over the content being decoded or encoded. +// +// It's worth noting that although Node offers access into details such as +// line numbers, colums, and comments, the content when re-encoded will not +// have its original textual representation preserved. An effort is made to +// render the data plesantly, and to preserve comments near the data they +// describe, though. +// +// Values that make use of the Node type interact with the yaml package in the +// same way any other type would do, by encoding and decoding yaml data +// directly or indirectly into them. +// +// For example: +// +// var person struct { +// Name string +// Address yaml.Node +// } +// err := yaml.Unmarshal(data, &person) +// +// Or by itself: +// +// var person Node +// err := yaml.Unmarshal(data, &person) +// +type Node struct { + // Kind defines whether the node is a document, a mapping, a sequence, + // a scalar value, or an alias to another node. The specific data type of + // scalar nodes may be obtained via the ShortTag and LongTag methods. + Kind Kind + + // Style allows customizing the apperance of the node in the tree. + Style Style + + // Tag holds the YAML tag defining the data type for the value. + // When decoding, this field will always be set to the resolved tag, + // even when it wasn't explicitly provided in the YAML content. + // When encoding, if this field is unset the value type will be + // implied from the node properties, and if it is set, it will only + // be serialized into the representation if TaggedStyle is used or + // the implicit tag diverges from the provided one. + Tag string + + // Value holds the unescaped and unquoted represenation of the value. + Value string + + // Anchor holds the anchor name for this node, which allows aliases to point to it. + Anchor string + + // Alias holds the node that this alias points to. Only valid when Kind is AliasNode. + Alias *Node + + // Content holds contained nodes for documents, mappings, and sequences. + Content []*Node + + // HeadComment holds any comments in the lines preceding the node and + // not separated by an empty line. + HeadComment string + + // LineComment holds any comments at the end of the line where the node is in. + LineComment string + + // FootComment holds any comments following the node and before empty lines. + FootComment string + + // Line and Column hold the node position in the decoded YAML text. + // These fields are not respected when encoding the node. + Line int + Column int +} + +// IsZero returns whether the node has all of its fields unset. +func (n *Node) IsZero() bool { + return n.Kind == 0 && n.Style == 0 && n.Tag == "" && n.Value == "" && n.Anchor == "" && n.Alias == nil && n.Content == nil && + n.HeadComment == "" && n.LineComment == "" && n.FootComment == "" && n.Line == 0 && n.Column == 0 +} + + +// LongTag returns the long form of the tag that indicates the data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) LongTag() string { + return longTag(n.ShortTag()) +} + +// ShortTag returns the short form of the YAML tag that indicates data type for +// the node. If the Tag field isn't explicitly defined, one will be computed +// based on the node properties. +func (n *Node) ShortTag() string { + if n.indicatedString() { + return strTag + } + if n.Tag == "" || n.Tag == "!" { + switch n.Kind { + case MappingNode: + return mapTag + case SequenceNode: + return seqTag + case AliasNode: + if n.Alias != nil { + return n.Alias.ShortTag() + } + case ScalarNode: + tag, _ := resolve("", n.Value) + return tag + case 0: + // Special case to make the zero value convenient. + if n.IsZero() { + return nullTag + } + } + return "" + } + return shortTag(n.Tag) +} + +func (n *Node) indicatedString() bool { + return n.Kind == ScalarNode && + (shortTag(n.Tag) == strTag || + (n.Tag == "" || n.Tag == "!") && n.Style&(SingleQuotedStyle|DoubleQuotedStyle|LiteralStyle|FoldedStyle) != 0) +} + +// SetString is a convenience function that sets the node to a string value +// and defines its style in a pleasant way depending on its content. +func (n *Node) SetString(s string) { + n.Kind = ScalarNode + if utf8.ValidString(s) { + n.Value = s + n.Tag = strTag + } else { + n.Value = encodeBase64(s) + n.Tag = binaryTag + } + if strings.Contains(n.Value, "\n") { + n.Style = LiteralStyle + } +} + // -------------------------------------------------------------------------- // Maintain a mapping of keys to structure field indexes @@ -289,6 +496,10 @@ type structInfo struct { // InlineMap is the number of the field in the struct that // contains an ,inline map, or -1 if there's none. InlineMap int + + // InlineUnmarshalers holds indexes to inlined fields that + // contain unmarshaler values. + InlineUnmarshalers [][]int } type fieldInfo struct { @@ -306,6 +517,12 @@ type fieldInfo struct { var structMap = make(map[reflect.Type]*structInfo) var fieldMapMutex sync.RWMutex +var unmarshalerType reflect.Type + +func init() { + var v Unmarshaler + unmarshalerType = reflect.ValueOf(&v).Elem().Type() +} func getStructInfo(st reflect.Type) (*structInfo, error) { fieldMapMutex.RLock() @@ -319,6 +536,7 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { fieldsMap := make(map[string]fieldInfo) fieldsList := make([]fieldInfo, 0, n) inlineMap := -1 + inlineUnmarshalers := [][]int(nil) for i := 0; i != n; i++ { field := st.Field(i) if field.PkgPath != "" && !field.Anonymous { @@ -347,7 +565,7 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { case "inline": inline = true default: - return nil, errors.New(fmt.Sprintf("Unsupported flag %q in tag %q of type %s", flag, tag, st)) + return nil, errors.New(fmt.Sprintf("unsupported flag %q in tag %q of type %s", flag, tag, st)) } } tag = fields[0] @@ -357,34 +575,47 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { switch field.Type.Kind() { case reflect.Map: if inlineMap >= 0 { - return nil, errors.New("Multiple ,inline maps in struct " + st.String()) + return nil, errors.New("multiple ,inline maps in struct " + st.String()) } if field.Type.Key() != reflect.TypeOf("") { - return nil, errors.New("Option ,inline needs a map with string keys in struct " + st.String()) + return nil, errors.New("option ,inline needs a map with string keys in struct " + st.String()) } inlineMap = info.Num - case reflect.Struct: - sinfo, err := getStructInfo(field.Type) - if err != nil { - return nil, err + case reflect.Struct, reflect.Ptr: + ftype := field.Type + for ftype.Kind() == reflect.Ptr { + ftype = ftype.Elem() } - for _, finfo := range sinfo.FieldsList { - if _, found := fieldsMap[finfo.Key]; found { - msg := "Duplicated key '" + finfo.Key + "' in struct " + st.String() - return nil, errors.New(msg) + if ftype.Kind() != reflect.Struct { + return nil, errors.New("option ,inline may only be used on a struct or map field") + } + if reflect.PtrTo(ftype).Implements(unmarshalerType) { + inlineUnmarshalers = append(inlineUnmarshalers, []int{i}) + } else { + sinfo, err := getStructInfo(ftype) + if err != nil { + return nil, err + } + for _, index := range sinfo.InlineUnmarshalers { + inlineUnmarshalers = append(inlineUnmarshalers, append([]int{i}, index...)) } - if finfo.Inline == nil { - finfo.Inline = []int{i, finfo.Num} - } else { - finfo.Inline = append([]int{i}, finfo.Inline...) + for _, finfo := range sinfo.FieldsList { + if _, found := fieldsMap[finfo.Key]; found { + msg := "duplicated key '" + finfo.Key + "' in struct " + st.String() + return nil, errors.New(msg) + } + if finfo.Inline == nil { + finfo.Inline = []int{i, finfo.Num} + } else { + finfo.Inline = append([]int{i}, finfo.Inline...) + } + finfo.Id = len(fieldsList) + fieldsMap[finfo.Key] = finfo + fieldsList = append(fieldsList, finfo) } - finfo.Id = len(fieldsList) - fieldsMap[finfo.Key] = finfo - fieldsList = append(fieldsList, finfo) } default: - //return nil, errors.New("Option ,inline needs a struct value or map field") - return nil, errors.New("Option ,inline needs a struct value field") + return nil, errors.New("option ,inline may only be used on a struct or map field") } continue } @@ -396,7 +627,7 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { } if _, found = fieldsMap[info.Key]; found { - msg := "Duplicated key '" + info.Key + "' in struct " + st.String() + msg := "duplicated key '" + info.Key + "' in struct " + st.String() return nil, errors.New(msg) } @@ -406,9 +637,10 @@ func getStructInfo(st reflect.Type) (*structInfo, error) { } sinfo = &structInfo{ - FieldsMap: fieldsMap, - FieldsList: fieldsList, - InlineMap: inlineMap, + FieldsMap: fieldsMap, + FieldsList: fieldsList, + InlineMap: inlineMap, + InlineUnmarshalers: inlineUnmarshalers, } fieldMapMutex.Lock() diff --git a/vendor/gopkg.in/yaml.v2/yamlh.go b/vendor/gopkg.in/yaml.v3/yamlh.go similarity index 88% rename from vendor/gopkg.in/yaml.v2/yamlh.go rename to vendor/gopkg.in/yaml.v3/yamlh.go index e25cee5..7c6d007 100644 --- a/vendor/gopkg.in/yaml.v2/yamlh.go +++ b/vendor/gopkg.in/yaml.v3/yamlh.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml import ( @@ -73,13 +95,13 @@ type yaml_scalar_style_t yaml_style_t // Scalar styles. const ( // Let the emitter choose the style. - yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = iota + yaml_ANY_SCALAR_STYLE yaml_scalar_style_t = 0 - yaml_PLAIN_SCALAR_STYLE // The plain scalar style. - yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. - yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. - yaml_LITERAL_SCALAR_STYLE // The literal scalar style. - yaml_FOLDED_SCALAR_STYLE // The folded scalar style. + yaml_PLAIN_SCALAR_STYLE yaml_scalar_style_t = 1 << iota // The plain scalar style. + yaml_SINGLE_QUOTED_SCALAR_STYLE // The single-quoted scalar style. + yaml_DOUBLE_QUOTED_SCALAR_STYLE // The double-quoted scalar style. + yaml_LITERAL_SCALAR_STYLE // The literal scalar style. + yaml_FOLDED_SCALAR_STYLE // The folded scalar style. ) type yaml_sequence_style_t yaml_style_t @@ -238,6 +260,7 @@ const ( yaml_SEQUENCE_END_EVENT // A SEQUENCE-END event. yaml_MAPPING_START_EVENT // A MAPPING-START event. yaml_MAPPING_END_EVENT // A MAPPING-END event. + yaml_TAIL_COMMENT_EVENT ) var eventStrings = []string{ @@ -252,6 +275,7 @@ var eventStrings = []string{ yaml_SEQUENCE_END_EVENT: "sequence end", yaml_MAPPING_START_EVENT: "mapping start", yaml_MAPPING_END_EVENT: "mapping end", + yaml_TAIL_COMMENT_EVENT: "tail comment", } func (e yaml_event_type_t) String() string { @@ -279,6 +303,12 @@ type yaml_event_t struct { // The list of tag directives (for yaml_DOCUMENT_START_EVENT). tag_directives []yaml_tag_directive_t + // The comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + // The anchor (for yaml_SCALAR_EVENT, yaml_SEQUENCE_START_EVENT, yaml_MAPPING_START_EVENT, yaml_ALIAS_EVENT). anchor []byte @@ -554,6 +584,8 @@ type yaml_parser_t struct { unread int // The number of unread characters in the buffer. + newlines int // The number of line breaks since last non-break/non-blank character + raw_buffer []byte // The raw buffer. raw_buffer_pos int // The current position of the buffer. @@ -562,6 +594,17 @@ type yaml_parser_t struct { offset int // The offset of the current position (in bytes). mark yaml_mark_t // The mark of the current position. + // Comments + + head_comment []byte // The current head comments + line_comment []byte // The current line comments + foot_comment []byte // The current foot comments + tail_comment []byte // Foot comment that happens at the end of a block. + stem_comment []byte // Comment in item preceding a nested structure (list inside list item, etc) + + comments []yaml_comment_t // The folded comments for all parsed tokens + comments_head int + // Scanner stuff stream_start_produced bool // Have we started to scan the input stream? @@ -579,6 +622,7 @@ type yaml_parser_t struct { simple_key_allowed bool // May a simple key occur at the current position? simple_keys []yaml_simple_key_t // The stack of simple keys. + simple_keys_by_tok map[int]int // possible simple_key indexes indexed by token_number // Parser stuff @@ -594,6 +638,18 @@ type yaml_parser_t struct { document *yaml_document_t // The currently parsed document. } +type yaml_comment_t struct { + + scan_mark yaml_mark_t // Position where scanning for comments started + token_mark yaml_mark_t // Position after which tokens will be associated with this comment + start_mark yaml_mark_t // Position of '#' comment mark + end_mark yaml_mark_t // Position where comment terminated + + head []byte + line []byte + foot []byte +} + // Emitter Definitions // The prototype of a write handler. @@ -624,8 +680,10 @@ const ( yaml_EMIT_DOCUMENT_CONTENT_STATE // Expect the content of a document. yaml_EMIT_DOCUMENT_END_STATE // Expect DOCUMENT-END. yaml_EMIT_FLOW_SEQUENCE_FIRST_ITEM_STATE // Expect the first item of a flow sequence. + yaml_EMIT_FLOW_SEQUENCE_TRAIL_ITEM_STATE // Expect the next item of a flow sequence, with the comma already written out yaml_EMIT_FLOW_SEQUENCE_ITEM_STATE // Expect an item of a flow sequence. yaml_EMIT_FLOW_MAPPING_FIRST_KEY_STATE // Expect the first key of a flow mapping. + yaml_EMIT_FLOW_MAPPING_TRAIL_KEY_STATE // Expect the next key of a flow mapping, with the comma already written out yaml_EMIT_FLOW_MAPPING_KEY_STATE // Expect a key of a flow mapping. yaml_EMIT_FLOW_MAPPING_SIMPLE_VALUE_STATE // Expect a value for a simple key of a flow mapping. yaml_EMIT_FLOW_MAPPING_VALUE_STATE // Expect a value of a flow mapping. @@ -697,6 +755,9 @@ type yaml_emitter_t struct { indention bool // If the last character was an indentation character (' ', '-', '?', ':')? open_ended bool // If an explicit document end is required? + space_above bool // Is there's an empty line above? + foot_indent int // The indent used to write the foot comment above, or -1 if none. + // Anchor analysis. anchor_data struct { anchor []byte // The anchor value. @@ -720,6 +781,14 @@ type yaml_emitter_t struct { style yaml_scalar_style_t // The output style. } + // Comments + head_comment []byte + line_comment []byte + foot_comment []byte + tail_comment []byte + + key_line_comment []byte + // Dumper stuff opened bool // If the stream was already opened? diff --git a/vendor/gopkg.in/yaml.v2/yamlprivateh.go b/vendor/gopkg.in/yaml.v3/yamlprivateh.go similarity index 78% rename from vendor/gopkg.in/yaml.v2/yamlprivateh.go rename to vendor/gopkg.in/yaml.v3/yamlprivateh.go index 8110ce3..e88f9c5 100644 --- a/vendor/gopkg.in/yaml.v2/yamlprivateh.go +++ b/vendor/gopkg.in/yaml.v3/yamlprivateh.go @@ -1,3 +1,25 @@ +// +// Copyright (c) 2011-2019 Canonical Ltd +// Copyright (c) 2006-2010 Kirill Simonov +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + package yaml const ( @@ -114,8 +136,9 @@ func is_crlf(b []byte, i int) bool { // Check if the character is a line break or NUL. func is_breakz(b []byte, i int) bool { //return is_break(b, i) || is_z(b, i) - return ( // is_break: - b[i] == '\r' || // CR (#xD) + return ( + // is_break: + b[i] == '\r' || // CR (#xD) b[i] == '\n' || // LF (#xA) b[i] == 0xC2 && b[i+1] == 0x85 || // NEL (#x85) b[i] == 0xE2 && b[i+1] == 0x80 && b[i+2] == 0xA8 || // LS (#x2028) @@ -127,8 +150,9 @@ func is_breakz(b []byte, i int) bool { // Check if the character is a line break, space, or NUL. func is_spacez(b []byte, i int) bool { //return is_space(b, i) || is_breakz(b, i) - return ( // is_space: - b[i] == ' ' || + return ( + // is_space: + b[i] == ' ' || // is_breakz: b[i] == '\r' || // CR (#xD) b[i] == '\n' || // LF (#xA) @@ -141,8 +165,9 @@ func is_spacez(b []byte, i int) bool { // Check if the character is a line break, space, tab, or NUL. func is_blankz(b []byte, i int) bool { //return is_blank(b, i) || is_breakz(b, i) - return ( // is_blank: - b[i] == ' ' || b[i] == '\t' || + return ( + // is_blank: + b[i] == ' ' || b[i] == '\t' || // is_breakz: b[i] == '\r' || // CR (#xD) b[i] == '\n' || // LF (#xA) diff --git a/vendor/modules.txt b/vendor/modules.txt index abf8b33..87a0b0e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,25 +1,37 @@ -# github.com/davecgh/go-spew v1.1.0 +# github.com/davecgh/go-spew v1.1.1 +## explicit github.com/davecgh/go-spew/spew # github.com/davidji99/go-querystring v1.0.2 +## explicit github.com/davidji99/go-querystring/query -# github.com/davidji99/simpleresty v0.2.1 +# github.com/davidji99/simpleresty v0.3.0 +## explicit; go 1.16 github.com/davidji99/simpleresty -# github.com/go-resty/resty/v2 v2.2.0 +# github.com/go-resty/resty/v2 v2.6.0 +## explicit; go 1.11 github.com/go-resty/resty/v2 # github.com/golang/protobuf v1.2.0 +## explicit github.com/golang/protobuf/proto # github.com/pmezard/go-difflib v1.0.0 +## explicit github.com/pmezard/go-difflib/difflib -# github.com/stretchr/testify v1.4.0 +# github.com/stretchr/testify v1.7.0 +## explicit; go 1.13 github.com/stretchr/testify/assert -# golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 +# golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 +## explicit; go 1.11 golang.org/x/net/context golang.org/x/net/context/ctxhttp golang.org/x/net/publicsuffix -# golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 +# golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d +## explicit; go 1.11 golang.org/x/oauth2 +golang.org/x/oauth2/bitbucket +golang.org/x/oauth2/clientcredentials golang.org/x/oauth2/internal # google.golang.org/appengine v1.4.0 +## explicit google.golang.org/appengine/internal google.golang.org/appengine/internal/base google.golang.org/appengine/internal/datastore @@ -27,5 +39,6 @@ google.golang.org/appengine/internal/log google.golang.org/appengine/internal/remote_api google.golang.org/appengine/internal/urlfetch google.golang.org/appengine/urlfetch -# gopkg.in/yaml.v2 v2.2.2 -gopkg.in/yaml.v2 +# gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b +## explicit +gopkg.in/yaml.v3