Prune dependencies (#1917)

When running `dep prune` explicitly, the following message show up:
```
dep prune
Pruning is now performed automatically by dep ensure.
```

However, after the explicit `dep prune`, there are still many files deleted. (Guess `dep ensure` is not complete yet).

This fix did a `dep prune` to clean up unneeded files.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
This commit is contained in:
Yong Tang 2018-06-30 14:47:19 -07:00 committed by Miek Gieben
parent fcc32a79d4
commit c7321fabc2
10332 changed files with 0 additions and 4102992 deletions

View file

@ -1,14 +0,0 @@
Please fill out the sections below to help us address your issue.
### Version of AWS SDK for Go?
### Version of Go (`go version`)?
### What issue did you see?
### Steps to reproduce
If you have an runnable example, please include it.

View file

@ -1,3 +0,0 @@
For changes to files under the `/model/` folder, and manual edits to autogenerated code (e.g. `/service/s3/api.go`) please create an Issue instead of a PR for those type of changes.
If there is an existing bug or feature this PR is answers please reference it here.

View file

@ -1,86 +0,0 @@
// Package arn provides a parser for interacting with Amazon Resource Names.
package arn
import (
"errors"
"strings"
)
const (
arnDelimiter = ":"
arnSections = 6
arnPrefix = "arn:"
// zero-indexed
sectionPartition = 1
sectionService = 2
sectionRegion = 3
sectionAccountID = 4
sectionResource = 5
// errors
invalidPrefix = "arn: invalid prefix"
invalidSections = "arn: not enough sections"
)
// ARN captures the individual fields of an Amazon Resource Name.
// See http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html for more information.
type ARN struct {
// The partition that the resource is in. For standard AWS regions, the partition is "aws". If you have resources in
// other partitions, the partition is "aws-partitionname". For example, the partition for resources in the China
// (Beijing) region is "aws-cn".
Partition string
// The service namespace that identifies the AWS product (for example, Amazon S3, IAM, or Amazon RDS). For a list of
// namespaces, see
// http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces.
Service string
// The region the resource resides in. Note that the ARNs for some resources do not require a region, so this
// component might be omitted.
Region string
// The ID of the AWS account that owns the resource, without the hyphens. For example, 123456789012. Note that the
// ARNs for some resources don't require an account number, so this component might be omitted.
AccountID string
// The content of this part of the ARN varies by service. It often includes an indicator of the type of resource —
// for example, an IAM user or Amazon RDS database - followed by a slash (/) or a colon (:), followed by the
// resource name itself. Some services allows paths for resource names, as described in
// http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arns-paths.
Resource string
}
// Parse parses an ARN into its constituent parts.
//
// Some example ARNs:
// arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/My App/MyEnvironment
// arn:aws:iam::123456789012:user/David
// arn:aws:rds:eu-west-1:123456789012:db:mysql-db
// arn:aws:s3:::my_corporate_bucket/exampleobject.png
func Parse(arn string) (ARN, error) {
if !strings.HasPrefix(arn, arnPrefix) {
return ARN{}, errors.New(invalidPrefix)
}
sections := strings.SplitN(arn, arnDelimiter, arnSections)
if len(sections) != arnSections {
return ARN{}, errors.New(invalidSections)
}
return ARN{
Partition: sections[sectionPartition],
Service: sections[sectionService],
Region: sections[sectionRegion],
AccountID: sections[sectionAccountID],
Resource: sections[sectionResource],
}, nil
}
// String returns the canonical representation of the ARN
func (arn ARN) String() string {
return arnPrefix +
arn.Partition + arnDelimiter +
arn.Service + arnDelimiter +
arn.Region + arnDelimiter +
arn.AccountID + arnDelimiter +
arn.Resource
}

View file

@ -1,90 +0,0 @@
// +build go1.7
package arn
import (
"errors"
"testing"
)
func TestParseARN(t *testing.T) {
cases := []struct {
input string
arn ARN
err error
}{
{
input: "invalid",
err: errors.New(invalidPrefix),
},
{
input: "arn:nope",
err: errors.New(invalidSections),
},
{
input: "arn:aws:ecr:us-west-2:123456789012:repository/foo/bar",
arn: ARN{
Partition: "aws",
Service: "ecr",
Region: "us-west-2",
AccountID: "123456789012",
Resource: "repository/foo/bar",
},
},
{
input: "arn:aws:elasticbeanstalk:us-east-1:123456789012:environment/My App/MyEnvironment",
arn: ARN{
Partition: "aws",
Service: "elasticbeanstalk",
Region: "us-east-1",
AccountID: "123456789012",
Resource: "environment/My App/MyEnvironment",
},
},
{
input: "arn:aws:iam::123456789012:user/David",
arn: ARN{
Partition: "aws",
Service: "iam",
Region: "",
AccountID: "123456789012",
Resource: "user/David",
},
},
{
input: "arn:aws:rds:eu-west-1:123456789012:db:mysql-db",
arn: ARN{
Partition: "aws",
Service: "rds",
Region: "eu-west-1",
AccountID: "123456789012",
Resource: "db:mysql-db",
},
},
{
input: "arn:aws:s3:::my_corporate_bucket/exampleobject.png",
arn: ARN{
Partition: "aws",
Service: "s3",
Region: "",
AccountID: "",
Resource: "my_corporate_bucket/exampleobject.png",
},
},
}
for _, tc := range cases {
t.Run(tc.input, func(t *testing.T) {
spec, err := Parse(tc.input)
if tc.arn != spec {
t.Errorf("Expected %q to parse as %v, but got %v", tc.input, tc.arn, spec)
}
if err == nil && tc.err != nil {
t.Errorf("Expected err to be %v, but got nil", tc.err)
} else if err != nil && tc.err == nil {
t.Errorf("Expected err to be nil, but got %v", err)
} else if err != nil && tc.err != nil && err.Error() != tc.err.Error() {
t.Errorf("Expected err to be %v, but got %v", tc.err, err)
}
})
}
}

View file

@ -1,5 +0,0 @@
// +build !go1.8
// Package plugincreds provides usage of Go plugins for providing credentials
// to the SDK. Only available with Go 1.8 and above.
package plugincreds

View file

@ -1,211 +0,0 @@
// +build go1.8
// Package plugincreds implements a credentials provider sourced from a Go
// plugin. This package allows you to use a Go plugin to retrieve AWS credentials
// for the SDK to use for service API calls.
//
// As of Go 1.8 plugins are only supported on the Linux platform.
//
// Plugin Symbol Name
//
// The "GetAWSSDKCredentialProvider" is the symbol name that will be used to
// lookup the credentials provider getter from the plugin. If you want to use a
// custom symbol name you should use GetPluginProviderFnsByName to lookup the
// symbol by a custom name.
//
// This symbol is a function that returns two additional functions. One to
// retrieve the credentials, and another to determine if the credentials have
// expired.
//
// Plugin Symbol Signature
//
// The plugin credential provider requires the symbol to match the
// following signature.
//
// func() (RetrieveFn func() (key, secret, token string, err error), IsExpiredFn func() bool)
//
// Plugin Implementation Exmaple
//
// The following is an example implementation of a SDK credential provider using
// the plugin provider in this package. See the SDK's example/aws/credential/plugincreds/plugin
// folder for a runnable example of this.
//
// package main
//
// func main() {}
//
// var myCredProvider provider
//
// // Build: go build -o plugin.so -buildmode=plugin plugin.go
// func init() {
// // Initialize a mock credential provider with stubs
// myCredProvider = provider{"a","b","c"}
// }
//
// // GetAWSSDKCredentialProvider is the symbol SDK will lookup and use to
// // get the credential provider's retrieve and isExpired functions.
// func GetAWSSDKCredentialProvider() (func() (key, secret, token string, err error), func() bool) {
// return myCredProvider.Retrieve, myCredProvider.IsExpired
// }
//
// // mock implementation of a type that returns retrieves credentials and
// // returns if they have expired.
// type provider struct {
// key, secret, token string
// }
//
// func (p provider) Retrieve() (key, secret, token string, err error) {
// return p.key, p.secret, p.token, nil
// }
//
// func (p *provider) IsExpired() bool {
// return false;
// }
//
// Configuring SDK for Plugin Credentials
//
// To configure the SDK to use a plugin's credential provider you'll need to first
// open the plugin file using the plugin standard library package. Once you have
// a handle to the plugin you can use the NewCredentials function of this package
// to create a new credentials.Credentials value that can be set as the
// credentials loader of a Session or Config. See the SDK's example/aws/credential/plugincreds
// folder for a runnable example of this.
//
// // Open plugin, and load it into the process.
// p, err := plugin.Open("somefile.so")
// if err != nil {
// return nil, err
// }
//
// // Create a new Credentials value which will source the provider's Retrieve
// // and IsExpired functions from the plugin.
// creds, err := plugincreds.NewCredentials(p)
// if err != nil {
// return nil, err
// }
//
// // Example to configure a Session with the newly created credentials that
// // will be sourced using the plugin's functionality.
// sess := session.Must(session.NewSession(&aws.Config{
// Credentials: creds,
// }))
package plugincreds
import (
"fmt"
"plugin"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
)
// ProviderSymbolName the symbol name the SDK will use to lookup the plugin
// provider value from.
const ProviderSymbolName = `GetAWSSDKCredentialProvider`
// ProviderName is the name this credentials provider will label any returned
// credentials Value with.
const ProviderName = `PluginCredentialsProvider`
const (
// ErrCodeLookupSymbolError failed to lookup symbol
ErrCodeLookupSymbolError = "LookupSymbolError"
// ErrCodeInvalidSymbolError symbol invalid
ErrCodeInvalidSymbolError = "InvalidSymbolError"
// ErrCodePluginRetrieveNil Retrieve function was nil
ErrCodePluginRetrieveNil = "PluginRetrieveNilError"
// ErrCodePluginIsExpiredNil IsExpired Function was nil
ErrCodePluginIsExpiredNil = "PluginIsExpiredNilError"
// ErrCodePluginProviderRetrieve plugin provider's retrieve returned error
ErrCodePluginProviderRetrieve = "PluginProviderRetrieveError"
)
// Provider is the credentials provider that will use the plugin provided
// Retrieve and IsExpired functions to retrieve credentials.
type Provider struct {
RetrieveFn func() (key, secret, token string, err error)
IsExpiredFn func() bool
}
// NewCredentials returns a new Credentials loader using the plugin provider.
// If the symbol isn't found or is invalid in the plugin an error will be
// returned.
func NewCredentials(p *plugin.Plugin) (*credentials.Credentials, error) {
retrieve, isExpired, err := GetPluginProviderFns(p)
if err != nil {
return nil, err
}
return credentials.NewCredentials(Provider{
RetrieveFn: retrieve,
IsExpiredFn: isExpired,
}), nil
}
// Retrieve will return the credentials Value if they were successfully retrieved
// from the underlying plugin provider. An error will be returned otherwise.
func (p Provider) Retrieve() (credentials.Value, error) {
creds := credentials.Value{
ProviderName: ProviderName,
}
k, s, t, err := p.RetrieveFn()
if err != nil {
return creds, awserr.New(ErrCodePluginProviderRetrieve,
"failed to retrieve credentials with plugin provider", err)
}
creds.AccessKeyID = k
creds.SecretAccessKey = s
creds.SessionToken = t
return creds, nil
}
// IsExpired will return the expired state of the underlying plugin provider.
func (p Provider) IsExpired() bool {
return p.IsExpiredFn()
}
// GetPluginProviderFns returns the plugin's Retrieve and IsExpired functions
// returned by the plugin's credential provider getter.
//
// Uses ProviderSymbolName as the symbol name when lookup up the symbol. If you
// want to use a different symbol name, use GetPluginProviderFnsByName.
func GetPluginProviderFns(p *plugin.Plugin) (func() (key, secret, token string, err error), func() bool, error) {
return GetPluginProviderFnsByName(p, ProviderSymbolName)
}
// GetPluginProviderFnsByName returns the plugin's Retrieve and IsExpired functions
// returned by the plugin's credential provider getter.
//
// Same as GetPluginProviderFns, but takes a custom symbolName to lookup with.
func GetPluginProviderFnsByName(p *plugin.Plugin, symbolName string) (func() (key, secret, token string, err error), func() bool, error) {
sym, err := p.Lookup(symbolName)
if err != nil {
return nil, nil, awserr.New(ErrCodeLookupSymbolError,
fmt.Sprintf("failed to lookup %s plugin provider symbol", symbolName), err)
}
fn, ok := sym.(func() (func() (key, secret, token string, err error), func() bool))
if !ok {
return nil, nil, awserr.New(ErrCodeInvalidSymbolError,
fmt.Sprintf("symbol %T, does not match the 'func() (func() (key, secret, token string, err error), func() bool)' type", sym), nil)
}
retrieveFn, isExpiredFn := fn()
if retrieveFn == nil {
return nil, nil, awserr.New(ErrCodePluginRetrieveNil,
"the plugin provider retrieve function cannot be nil", nil)
}
if isExpiredFn == nil {
return nil, nil, awserr.New(ErrCodePluginIsExpiredNil,
"the plugin provider isExpired function cannot be nil", nil)
}
return retrieveFn, isExpiredFn, nil
}

View file

@ -1,71 +0,0 @@
// +build go1.8,awsinclude
package plugincreds
import (
"fmt"
"testing"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
)
func TestProvider_Passthrough(t *testing.T) {
p := Provider{
RetrieveFn: func() (string, string, string, error) {
return "key", "secret", "token", nil
},
IsExpiredFn: func() bool {
return false
},
}
actual, err := p.Retrieve()
if err != nil {
t.Fatalf("expect no error, got %v", err)
}
expect := credentials.Value{
AccessKeyID: "key",
SecretAccessKey: "secret",
SessionToken: "token",
ProviderName: ProviderName,
}
if expect != actual {
t.Errorf("expect %+v credentials, got %+v", expect, actual)
}
}
func TestProvider_Error(t *testing.T) {
expectErr := fmt.Errorf("expect error")
p := Provider{
RetrieveFn: func() (string, string, string, error) {
return "", "", "", expectErr
},
IsExpiredFn: func() bool {
return false
},
}
actual, err := p.Retrieve()
if err == nil {
t.Fatalf("expect error, got none")
}
aerr := err.(awserr.Error)
if e, a := ErrCodePluginProviderRetrieve, aerr.Code(); e != a {
t.Errorf("expect %s error code, got %s", e, a)
}
if e, a := expectErr, aerr.OrigErr(); e != a {
t.Errorf("expect %v cause error, got %v", e, a)
}
expect := credentials.Value{
ProviderName: ProviderName,
}
if expect != actual {
t.Errorf("expect %+v credentials, got %+v", expect, actual)
}
}

View file

@ -1,65 +0,0 @@
[default]
s3 =
unsupported_key=123
other_unsupported=abc
region = default_region
[profile alt_profile_name]
region = alt_profile_name_region
[short_profile_name_first]
region = short_profile_name_first_short
[profile short_profile_name_first]
region = short_profile_name_first_alt
[partial_creds]
aws_access_key_id = partial_creds_akid
[complete_creds]
aws_access_key_id = complete_creds_akid
aws_secret_access_key = complete_creds_secret
[complete_creds_with_token]
aws_access_key_id = complete_creds_with_token_akid
aws_secret_access_key = complete_creds_with_token_secret
aws_session_token = complete_creds_with_token_token
[full_profile]
aws_access_key_id = full_profile_akid
aws_secret_access_key = full_profile_secret
region = full_profile_region
[config_file_load_order]
region = shared_config_region
aws_access_key_id = shared_config_akid
aws_secret_access_key = shared_config_secret
[partial_assume_role]
role_arn = partial_assume_role_role_arn
[assume_role]
role_arn = assume_role_role_arn
source_profile = complete_creds
[assume_role_w_mfa]
role_arn = assume_role_role_arn
source_profile = complete_creds
mfa_serial = 0123456789
[assume_role_invalid_source_profile]
role_arn = assume_role_invalid_source_profile_role_arn
source_profile = profile_not_exists
[assume_role_w_creds]
role_arn = assume_role_w_creds_role_arn
source_profile = assume_role_w_creds
external_id = 1234
role_session_name = assume_role_w_creds_session_name
aws_access_key_id = assume_role_w_creds_akid
aws_secret_access_key = assume_role_w_creds_secret
[assume_role_wo_creds]
role_arn = assume_role_wo_creds_role_arn
source_profile = assume_role_wo_creds

View file

@ -1 +0,0 @@
[profile_nam

View file

@ -1,17 +0,0 @@
[default]
region = default_region
[partial_creds]
aws_access_key_id = AKID
[profile alt_profile_name]
region = alt_profile_name_region
[creds_from_credentials]
aws_access_key_id = creds_from_config_akid
aws_secret_access_key = creds_from_config_secret
[config_file_load_order]
region = shared_config_other_region
aws_access_key_id = shared_config_other_akid
aws_secret_access_key = shared_config_other_secret

View file

@ -1,19 +0,0 @@
{
"ImportPath": "github.com/aws/aws-sdk-go/awsmigrate/awsmigrate-renamer",
"GoVersion": "go1.6",
"GodepVersion": "v60",
"Deps": [
{
"ImportPath": "golang.org/x/tools/go/ast/astutil",
"Rev": "b75b3f5cd5d50fbb1fb88ce784d2e7cca17bba8a"
},
{
"ImportPath": "golang.org/x/tools/go/buildutil",
"Rev": "b75b3f5cd5d50fbb1fb88ce784d2e7cca17bba8a"
},
{
"ImportPath": "golang.org/x/tools/go/loader",
"Rev": "b75b3f5cd5d50fbb1fb88ce784d2e7cca17bba8a"
}
]
}

View file

@ -1,5 +0,0 @@
This directory tree is generated automatically by godep.
Please do not edit.
See https://github.com/tools/godep for more information.

View file

@ -1,200 +0,0 @@
// +build go1.5,deprecated
package main
import (
"bytes"
"go/format"
"io"
"os"
"path/filepath"
"sort"
"strings"
"text/template"
"github.com/aws/aws-sdk-go/private/model/api"
)
type pkg struct {
oldAPI *api.API
newAPI *api.API
shapes map[string]*shapentry
operations map[string]*opentry
}
type shapentry struct {
oldShape *api.Shape
newShape *api.Shape
}
type opentry struct {
oldName string
newName string
}
type packageRenames struct {
Shapes map[string]string
Operations map[string]string
Fields map[string]string
}
var exportMap = map[string]*packageRenames{}
func generateRenames(w io.Writer) error {
tmpl, err := template.New("renames").Parse(t)
if err != nil {
return err
}
out := bytes.NewBuffer(nil)
if err = tmpl.Execute(out, exportMap); err != nil {
return err
}
b, err := format.Source(bytes.TrimSpace(out.Bytes()))
if err != nil {
return err
}
_, err = io.Copy(w, bytes.NewReader(b))
return err
}
const t = `
package rename
// THIS FILE IS AUTOMATICALLY GENERATED. DO NOT EDIT.
var renamedPackages = map[string]*packageRenames{
{{ range $key, $entry := . }}"{{ $key }}": &packageRenames{
operations: map[string]string{
{{ range $old, $new := $entry.Operations }}"{{ $old }}": "{{ $new }}",
{{ end }}
},
shapes: map[string]string{
{{ range $old, $new := $entry.Shapes }}"{{ $old }}": "{{ $new }}",
{{ end }}
},
fields: map[string]string{
{{ range $old, $new := $entry.Fields }}"{{ $old }}": "{{ $new }}",
{{ end }}
},
},
{{ end }}
}
`
func (p *pkg) buildRenames() {
pkgName := "github.com/aws/aws-sdk-go/service/" + p.oldAPI.PackageName()
if exportMap[pkgName] == nil {
exportMap[pkgName] = &packageRenames{map[string]string{}, map[string]string{}, map[string]string{}}
}
ifacename := "github.com/aws/aws-sdk-go/service/" + p.oldAPI.PackageName() + "/" +
p.oldAPI.InterfacePackageName()
if exportMap[ifacename] == nil {
exportMap[ifacename] = &packageRenames{map[string]string{}, map[string]string{}, map[string]string{}}
}
for _, entry := range p.operations {
if entry.oldName != entry.newName {
pkgNames := []string{pkgName, ifacename}
for _, p := range pkgNames {
exportMap[p].Operations[entry.oldName] = entry.newName
exportMap[p].Operations[entry.oldName+"Request"] = entry.newName + "Request"
exportMap[p].Operations[entry.oldName+"Pages"] = entry.newName + "Pages"
}
}
}
for _, entry := range p.shapes {
if entry.oldShape.Type == "structure" {
if entry.oldShape.ShapeName != entry.newShape.ShapeName {
exportMap[pkgName].Shapes[entry.oldShape.ShapeName] = entry.newShape.ShapeName
}
for _, n := range entry.oldShape.MemberNames() {
for _, m := range entry.newShape.MemberNames() {
if n != m && strings.ToLower(n) == strings.ToLower(m) {
exportMap[pkgName].Fields[n] = m
}
}
}
}
}
}
func load(file string) *pkg {
p := &pkg{&api.API{}, &api.API{}, map[string]*shapentry{}, map[string]*opentry{}}
p.oldAPI.Attach(file)
p.oldAPI.Setup()
p.newAPI.Attach(file)
p.newAPI.Setup()
for _, name := range p.oldAPI.OperationNames() {
p.operations[strings.ToLower(name)] = &opentry{oldName: name}
}
for _, name := range p.newAPI.OperationNames() {
p.operations[strings.ToLower(name)].newName = name
}
for _, shape := range p.oldAPI.ShapeList() {
p.shapes[strings.ToLower(shape.ShapeName)] = &shapentry{oldShape: shape}
}
for _, shape := range p.newAPI.ShapeList() {
if _, ok := p.shapes[strings.ToLower(shape.ShapeName)]; !ok {
panic("missing shape " + shape.ShapeName)
}
p.shapes[strings.ToLower(shape.ShapeName)].newShape = shape
}
return p
}
var excludeServices = map[string]struct{}{
"simpledb": {},
"importexport": {},
}
func main() {
files, _ := filepath.Glob("../../apis/*/*/api-2.json")
sort.Strings(files)
// Remove old API versions from list
m := map[string]bool{}
for i := range files {
idx := len(files) - 1 - i
parts := strings.Split(files[idx], string(filepath.Separator))
svc := parts[len(parts)-3] // service name is 2nd-to-last component
if m[svc] {
files[idx] = "" // wipe this one out if we already saw the service
}
m[svc] = true
}
for i := range files {
file := files[i]
if file == "" { // empty file
continue
}
if g := load(file); g != nil {
if _, ok := excludeServices[g.oldAPI.PackageName()]; !ok {
g.buildRenames()
}
}
}
outfile, err := os.Create("rename/renames.go")
if err != nil {
panic(err)
}
if err := generateRenames(outfile); err != nil {
panic(err)
}
}

View file

@ -1,116 +0,0 @@
// +build go1.5,deprecated
package rename
import (
"bytes"
"flag"
"fmt"
"go/format"
"go/parser"
"go/token"
"go/types"
"io/ioutil"
"golang.org/x/tools/go/loader"
)
var dryRun = flag.Bool("dryrun", false, "Dry run")
var verbose = flag.Bool("verbose", false, "Verbose")
type packageRenames struct {
operations map[string]string
shapes map[string]string
fields map[string]string
}
type renamer struct {
*loader.Program
files map[*token.File]bool
}
// ParsePathsFromArgs parses arguments from command line and looks at import
// paths to rename objects.
func ParsePathsFromArgs() {
flag.Parse()
for _, dir := range flag.Args() {
var conf loader.Config
conf.ParserMode = parser.ParseComments
conf.ImportWithTests(dir)
prog, err := conf.Load()
if err != nil {
panic(err)
}
r := renamer{prog, map[*token.File]bool{}}
r.parse()
if !*dryRun {
r.write()
}
}
}
func (r *renamer) dryInfo() string {
if *dryRun {
return "[DRY-RUN]"
}
return "[!]"
}
func (r *renamer) printf(msg string, args ...interface{}) {
if *verbose {
fmt.Printf(msg, args...)
}
}
func (r *renamer) parse() {
for _, pkg := range r.InitialPackages() {
r.parseUses(pkg)
}
}
func (r *renamer) write() {
for _, pkg := range r.InitialPackages() {
for _, f := range pkg.Files {
tokenFile := r.Fset.File(f.Pos())
if r.files[tokenFile] {
var buf bytes.Buffer
format.Node(&buf, r.Fset, f)
if err := ioutil.WriteFile(tokenFile.Name(), buf.Bytes(), 0644); err != nil {
panic(err)
}
}
}
}
}
func (r *renamer) parseUses(pkg *loader.PackageInfo) {
for k, v := range pkg.Uses {
if v.Pkg() != nil {
pkgPath := v.Pkg().Path()
if renames, ok := renamedPackages[pkgPath]; ok {
name := k.Name
switch t := v.(type) {
case *types.Func:
if newName, ok := renames.operations[t.Name()]; ok && newName != name {
r.printf("%s Rename [OPERATION]: %q -> %q\n", r.dryInfo(), name, newName)
r.files[r.Fset.File(k.Pos())] = true
k.Name = newName
}
case *types.TypeName:
if newName, ok := renames.shapes[name]; ok && newName != name {
r.printf("%s Rename [SHAPE]: %q -> %q\n", r.dryInfo(), t.Name(), newName)
r.files[r.Fset.File(k.Pos())] = true
k.Name = newName
}
case *types.Var:
if newName, ok := renames.fields[name]; ok && newName != name {
r.printf("%s Rename [FIELD]: %q -> %q\n", r.dryInfo(), t.Name(), newName)
r.files[r.Fset.File(k.Pos())] = true
k.Name = newName
}
}
}
}
}
}

File diff suppressed because it is too large Load diff

View file

@ -1,45 +0,0 @@
// +build go1.5,deprecated
package main
//go:generate go run -tags deprecated gen/gen.go
import (
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/aws/aws-sdk-go/awsmigrate/awsmigrate-renamer/rename"
)
var safeTag = "4e554f77f00d527b452c68a46f2e68595284121b"
func main() {
gopath := os.Getenv("GOPATH")
if gopath == "" {
panic("GOPATH not set!")
}
gopath = strings.Split(gopath, ":")[0]
// change directory to SDK
err := os.Chdir(filepath.Join(gopath, "src", "github.com", "aws", "aws-sdk-go"))
if err != nil {
panic("Cannot find SDK repository")
}
// store orig HEAD
head, err := exec.Command("git", "rev-parse", "--abbrev-ref", "HEAD").Output()
if err != nil {
panic("Cannot find SDK repository")
}
origHEAD := strings.Trim(string(head), " \r\n")
// checkout to safe tag and run conversion
exec.Command("git", "checkout", safeTag).Run()
defer func() {
exec.Command("git", "checkout", origHEAD).Run()
}()
rename.ParsePathsFromArgs()
}

View file

@ -1,212 +0,0 @@
package awstesting
import (
"encoding/json"
"encoding/xml"
"fmt"
"net/url"
"reflect"
"regexp"
"sort"
"strings"
"testing"
)
// Match is a testing helper to test for testing error by comparing expected
// with a regular expression.
func Match(t *testing.T, regex, expected string) {
if !regexp.MustCompile(regex).Match([]byte(expected)) {
t.Errorf("%q\n\tdoes not match /%s/", expected, regex)
}
}
// AssertURL verifies the expected URL is matches the actual.
func AssertURL(t *testing.T, expect, actual string, msgAndArgs ...interface{}) bool {
expectURL, err := url.Parse(expect)
if err != nil {
t.Errorf(errMsg("unable to parse expected URL", err, msgAndArgs))
return false
}
actualURL, err := url.Parse(actual)
if err != nil {
t.Errorf(errMsg("unable to parse actual URL", err, msgAndArgs))
return false
}
equal(t, expectURL.Host, actualURL.Host, msgAndArgs...)
equal(t, expectURL.Scheme, actualURL.Scheme, msgAndArgs...)
equal(t, expectURL.Path, actualURL.Path, msgAndArgs...)
return AssertQuery(t, expectURL.Query().Encode(), actualURL.Query().Encode(), msgAndArgs...)
}
var queryMapKey = regexp.MustCompile("(.*?)\\.[0-9]+\\.key")
// AssertQuery verifies the expect HTTP query string matches the actual.
func AssertQuery(t *testing.T, expect, actual string, msgAndArgs ...interface{}) bool {
expectQ, err := url.ParseQuery(expect)
if err != nil {
t.Errorf(errMsg("unable to parse expected Query", err, msgAndArgs))
return false
}
actualQ, err := url.ParseQuery(actual)
if err != nil {
t.Errorf(errMsg("unable to parse actual Query", err, msgAndArgs))
return false
}
// Make sure the keys are the same
if !equal(t, queryValueKeys(expectQ), queryValueKeys(actualQ), msgAndArgs...) {
return false
}
keys := map[string][]string{}
for key, v := range expectQ {
if queryMapKey.Match([]byte(key)) {
submatch := queryMapKey.FindStringSubmatch(key)
keys[submatch[1]] = append(keys[submatch[1]], v...)
}
}
for k, v := range keys {
// clear all keys that have prefix
for key := range expectQ {
if strings.HasPrefix(key, k) {
delete(expectQ, key)
}
}
sort.Strings(v)
for i, value := range v {
expectQ[fmt.Sprintf("%s.%d.key", k, i+1)] = []string{value}
}
}
for k, expectQVals := range expectQ {
sort.Strings(expectQVals)
actualQVals := actualQ[k]
sort.Strings(actualQVals)
if !equal(t, expectQVals, actualQVals, msgAndArgs...) {
return false
}
}
return true
}
// AssertJSON verifies that the expect json string matches the actual.
func AssertJSON(t *testing.T, expect, actual string, msgAndArgs ...interface{}) bool {
expectVal := map[string]interface{}{}
if err := json.Unmarshal([]byte(expect), &expectVal); err != nil {
t.Errorf(errMsg("unable to parse expected JSON", err, msgAndArgs...))
return false
}
actualVal := map[string]interface{}{}
if err := json.Unmarshal([]byte(actual), &actualVal); err != nil {
t.Errorf(errMsg("unable to parse actual JSON", err, msgAndArgs...))
return false
}
return equal(t, expectVal, actualVal, msgAndArgs...)
}
// AssertXML verifies that the expect xml string matches the actual.
func AssertXML(t *testing.T, expect, actual string, container interface{}, msgAndArgs ...interface{}) bool {
expectVal := container
if err := xml.Unmarshal([]byte(expect), &expectVal); err != nil {
t.Errorf(errMsg("unable to parse expected XML", err, msgAndArgs...))
}
actualVal := container
if err := xml.Unmarshal([]byte(actual), &actualVal); err != nil {
t.Errorf(errMsg("unable to parse actual XML", err, msgAndArgs...))
}
return equal(t, expectVal, actualVal, msgAndArgs...)
}
// DidPanic returns if the function paniced and returns true if the function paniced.
func DidPanic(fn func()) (bool, interface{}) {
var paniced bool
var msg interface{}
func() {
defer func() {
if msg = recover(); msg != nil {
paniced = true
}
}()
fn()
}()
return paniced, msg
}
// objectsAreEqual determines if two objects are considered equal.
//
// This function does no assertion of any kind.
//
// Based on github.com/stretchr/testify/assert.ObjectsAreEqual
// Copied locally to prevent non-test build dependencies on testify
func objectsAreEqual(expected, actual interface{}) bool {
if expected == nil || actual == nil {
return expected == actual
}
return reflect.DeepEqual(expected, actual)
}
// Equal asserts that two objects are equal.
//
// assert.Equal(t, 123, 123, "123 and 123 should be equal")
//
// Returns whether the assertion was successful (true) or not (false).
//
// Based on github.com/stretchr/testify/assert.Equal
// Copied locally to prevent non-test build dependencies on testify
func equal(t *testing.T, expected, actual interface{}, msgAndArgs ...interface{}) bool {
if !objectsAreEqual(expected, actual) {
t.Errorf("%s\n%s", messageFromMsgAndArgs(msgAndArgs),
SprintExpectActual(expected, actual))
return false
}
return true
}
func errMsg(baseMsg string, err error, msgAndArgs ...interface{}) string {
message := messageFromMsgAndArgs(msgAndArgs)
if message != "" {
message += ", "
}
return fmt.Sprintf("%s%s, %v", message, baseMsg, err)
}
// Based on github.com/stretchr/testify/assert.messageFromMsgAndArgs
// Copied locally to prevent non-test build dependencies on testify
func messageFromMsgAndArgs(msgAndArgs []interface{}) string {
if len(msgAndArgs) == 0 || msgAndArgs == nil {
return ""
}
if len(msgAndArgs) == 1 {
return msgAndArgs[0].(string)
}
if len(msgAndArgs) > 1 {
return fmt.Sprintf(msgAndArgs[0].(string), msgAndArgs[1:]...)
}
return ""
}
func queryValueKeys(v url.Values) []string {
keys := make([]string, 0, len(v))
for k := range v {
keys = append(keys, k)
}
sort.Strings(keys)
return keys
}
// SprintExpectActual returns a string for test failure cases when the actual
// value is not the same as the expected.
func SprintExpectActual(expect, actual interface{}) string {
return fmt.Sprintf("expect: %+v\nactual: %+v\n", expect, actual)
}

View file

@ -1,89 +0,0 @@
package awstesting_test
import (
"encoding/xml"
"testing"
"github.com/aws/aws-sdk-go/awstesting"
)
func TestAssertJSON(t *testing.T) {
cases := []struct {
e, a string
asserts bool
}{
{
e: `{"RecursiveStruct":{"RecursiveMap":{"foo":{"NoRecurse":"foo"},"bar":{"NoRecurse":"bar"}}}}`,
a: `{"RecursiveStruct":{"RecursiveMap":{"bar":{"NoRecurse":"bar"},"foo":{"NoRecurse":"foo"}}}}`,
asserts: true,
},
}
for i, c := range cases {
mockT := &testing.T{}
if awstesting.AssertJSON(mockT, c.e, c.a) != c.asserts {
t.Error("Assert JSON result was not expected.", i)
}
}
}
func TestAssertXML(t *testing.T) {
cases := []struct {
e, a string
asserts bool
container struct {
XMLName xml.Name `xml:"OperationRequest"`
NS string `xml:"xmlns,attr"`
RecursiveStruct struct {
RecursiveMap struct {
Entries []struct {
XMLName xml.Name `xml:"entries"`
Key string `xml:"key"`
Value struct {
XMLName xml.Name `xml:"value"`
NoRecurse string
}
}
}
}
}
}{
{
e: `<OperationRequest xmlns="https://foo/"><RecursiveStruct xmlns="https://foo/"><RecursiveMap xmlns="https://foo/"><entry xmlns="https://foo/"><key xmlns="https://foo/">foo</key><value xmlns="https://foo/"><NoRecurse xmlns="https://foo/">foo</NoRecurse></value></entry><entry xmlns="https://foo/"><key xmlns="https://foo/">bar</key><value xmlns="https://foo/"><NoRecurse xmlns="https://foo/">bar</NoRecurse></value></entry></RecursiveMap></RecursiveStruct></OperationRequest>`,
a: `<OperationRequest xmlns="https://foo/"><RecursiveStruct xmlns="https://foo/"><RecursiveMap xmlns="https://foo/"><entry xmlns="https://foo/"><key xmlns="https://foo/">bar</key><value xmlns="https://foo/"><NoRecurse xmlns="https://foo/">bar</NoRecurse></value></entry><entry xmlns="https://foo/"><key xmlns="https://foo/">foo</key><value xmlns="https://foo/"><NoRecurse xmlns="https://foo/">foo</NoRecurse></value></entry></RecursiveMap></RecursiveStruct></OperationRequest>`,
asserts: true,
},
}
for i, c := range cases {
// mockT := &testing.T{}
if awstesting.AssertXML(t, c.e, c.a, c.container) != c.asserts {
t.Error("Assert XML result was not expected.", i)
}
}
}
func TestAssertQuery(t *testing.T) {
cases := []struct {
e, a string
asserts bool
}{
{
e: `Action=OperationName&Version=2014-01-01&Foo=val1&Bar=val2`,
a: `Action=OperationName&Version=2014-01-01&Foo=val2&Bar=val3`,
asserts: false,
},
{
e: `Action=OperationName&Version=2014-01-01&Foo=val1&Bar=val2`,
a: `Action=OperationName&Version=2014-01-01&Foo=val1&Bar=val2`,
asserts: true,
},
}
for i, c := range cases {
mockT := &testing.T{}
if awstesting.AssertQuery(mockT, c.e, c.a) != c.asserts {
t.Error("Assert Query result was not expected.", i)
}
}
}

View file

@ -1,24 +0,0 @@
package awstesting
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/client"
"github.com/aws/aws-sdk-go/aws/client/metadata"
"github.com/aws/aws-sdk-go/aws/defaults"
)
// NewClient creates and initializes a generic service client for testing.
func NewClient(cfgs ...*aws.Config) *client.Client {
info := metadata.ClientInfo{
Endpoint: "http://endpoint",
SigningName: "",
}
def := defaults.Get()
def.Config.MergeIn(cfgs...)
if v := aws.StringValue(def.Config.Endpoint); len(v) > 0 {
info.Endpoint = v
}
return client.New(*def.Config, info, def.Handlers)
}

View file

@ -1,94 +0,0 @@
// +build integration
package main
import (
"fmt"
"os"
"strings"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
)
// Searches the buckets of an account that match the prefix, and deletes
// those buckets, and all objects within. Before deleting will prompt user
// to confirm bucket should be deleted. Positive confirmation is required.
//
// Usage:
// go run deleteBuckets.go <bucketPrefix>
func main() {
sess := session.Must(session.NewSession())
svc := s3.New(sess)
buckets, err := svc.ListBuckets(&s3.ListBucketsInput{})
if err != nil {
panic(fmt.Sprintf("failed to list buckets, %v", err))
}
if len(os.Args) < 2 {
fmt.Fprintln(os.Stderr, "bucket prefix required")
os.Exit(1)
}
bucketPrefix := os.Args[1]
var failed bool
for _, b := range buckets.Buckets {
bucket := aws.StringValue(b.Name)
if !strings.HasPrefix(bucket, bucketPrefix) {
continue
}
fmt.Printf("Delete bucket %q? [y/N]: ", bucket)
var v string
if _, err := fmt.Scanln(&v); err != nil || !(v == "Y" || v == "y") {
fmt.Println("\tSkipping")
continue
}
fmt.Println("\tDeleting")
if err := deleteBucket(svc, bucket); err != nil {
fmt.Fprintf(os.Stderr, "failed to delete bucket %q, %v", bucket, err)
failed = true
}
}
if failed {
os.Exit(1)
}
}
func deleteBucket(svc *s3.S3, bucket string) error {
bucketName := &bucket
objs, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to list bucket %q objects, %v", bucketName, err)
}
for _, o := range objs.Contents {
svc.DeleteObject(&s3.DeleteObjectInput{Bucket: bucketName, Key: o.Key})
}
uploads, err := svc.ListMultipartUploads(&s3.ListMultipartUploadsInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to list bucket %q multipart objects, %v", bucketName, err)
}
for _, u := range uploads.Uploads {
svc.AbortMultipartUpload(&s3.AbortMultipartUploadInput{
Bucket: bucketName,
Key: u.Key,
UploadId: u.UploadId,
})
}
_, err = svc.DeleteBucket(&s3.DeleteBucketInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to delete bucket %q, %v", bucketName, err)
}
return nil
}

View file

@ -1,199 +0,0 @@
package awstesting
import (
"io/ioutil"
"net"
"net/http"
"os"
"strings"
"time"
)
func availableLocalAddr(ip string) (string, error) {
l, err := net.Listen("tcp", ip+":0")
if err != nil {
return "", err
}
defer l.Close()
return l.Addr().String(), nil
}
// CreateTLSServer will create the TLS server on an open port using the
// certificate and key. The address will be returned that the server is running on.
func CreateTLSServer(cert, key string, mux *http.ServeMux) (string, error) {
addr, err := availableLocalAddr("127.0.0.1")
if err != nil {
return "", err
}
if mux == nil {
mux = http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {})
}
go func() {
if err := http.ListenAndServeTLS(addr, cert, key, mux); err != nil {
panic(err)
}
}()
for i := 0; i < 60; i++ {
if _, err := http.Get("https://" + addr); err != nil && !strings.Contains(err.Error(), "connection refused") {
break
}
time.Sleep(1 * time.Second)
}
return "https://" + addr, nil
}
// CreateTLSBundleFiles returns the temporary filenames for the certificate
// key, and CA PEM content. These files should be deleted when no longer
// needed. CleanupTLSBundleFiles can be used for this cleanup.
func CreateTLSBundleFiles() (cert, key, ca string, err error) {
cert, err = createTmpFile(TLSBundleCert)
if err != nil {
return "", "", "", err
}
key, err = createTmpFile(TLSBundleKey)
if err != nil {
return "", "", "", err
}
ca, err = createTmpFile(TLSBundleCA)
if err != nil {
return "", "", "", err
}
return cert, key, ca, nil
}
// CleanupTLSBundleFiles takes variadic list of files to be deleted.
func CleanupTLSBundleFiles(files ...string) error {
for _, file := range files {
if err := os.Remove(file); err != nil {
return err
}
}
return nil
}
func createTmpFile(b []byte) (string, error) {
bundleFile, err := ioutil.TempFile(os.TempDir(), "aws-sdk-go-session-test")
if err != nil {
return "", err
}
_, err = bundleFile.Write(b)
if err != nil {
return "", err
}
defer bundleFile.Close()
return bundleFile.Name(), nil
}
/* Cert generation steps
# Create the CA key
openssl genrsa -des3 -out ca.key 1024
# Create the CA Cert
openssl req -new -sha256 -x509 -days 3650 \
-subj "/C=GO/ST=Gopher/O=Testing ROOT CA" \
-key ca.key -out ca.crt
# Create config
cat > csr_details.txt <<-EOF
[req]
default_bits = 1024
prompt = no
default_md = sha256
req_extensions = SAN
distinguished_name = dn
[ dn ]
C=GO
ST=Gopher
O=Testing Certificate
OU=Testing IP
[SAN]
subjectAltName = IP:127.0.0.1
EOF
# Create certificate signing request
openssl req -new -sha256 -nodes -newkey rsa:1024 \
-config <( cat csr_details.txt ) \
-keyout ia.key -out ia.csr
# Create a signed certificate
openssl x509 -req -days 3650 \
-CAcreateserial \
-extfile <( cat csr_details.txt ) \
-extensions SAN \
-CA ca.crt -CAkey ca.key -in ia.csr -out ia.crt
# Verify
openssl req -noout -text -in ia.csr
openssl x509 -noout -text -in ia.crt
*/
var (
// TLSBundleCA ca.crt
TLSBundleCA = []byte(`-----BEGIN CERTIFICATE-----
MIICiTCCAfKgAwIBAgIJAJ5X1olt05XjMA0GCSqGSIb3DQEBCwUAMDgxCzAJBgNV
BAYTAkdPMQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBD
QTAeFw0xNzAzMDkwMDAyMDZaFw0yNzAzMDcwMDAyMDZaMDgxCzAJBgNVBAYTAkdP
MQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBDQTCBnzAN
BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAw/8DN+t9XQR60jx42rsQ2WE2Dx85rb3n
GQxnKZZLNddsT8rDyxJNP18aFalbRbFlyln5fxWxZIblu9Xkm/HRhOpbSimSqo1y
uDx21NVZ1YsOvXpHby71jx3gPrrhSc/t/zikhi++6D/C6m1CiIGuiJ0GBiJxtrub
UBMXT0QtI2ECAwEAAaOBmjCBlzAdBgNVHQ4EFgQU8XG3X/YHBA6T04kdEkq6+4GV
YykwaAYDVR0jBGEwX4AU8XG3X/YHBA6T04kdEkq6+4GVYymhPKQ6MDgxCzAJBgNV
BAYTAkdPMQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBD
QYIJAJ5X1olt05XjMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADgYEAeILv
z49+uxmPcfOZzonuOloRcpdvyjiXblYxbzz6ch8GsE7Q886FTZbvwbgLhzdwSVgG
G8WHkodDUsymVepdqAamS3f8PdCUk8xIk9mop8LgaB9Ns0/TssxDvMr3sOD2Grb3
xyWymTWMcj6uCiEBKtnUp4rPiefcvCRYZ17/hLE=
-----END CERTIFICATE-----
`)
// TLSBundleCert ai.crt
TLSBundleCert = []byte(`-----BEGIN CERTIFICATE-----
MIICGjCCAYOgAwIBAgIJAIIu+NOoxxM0MA0GCSqGSIb3DQEBBQUAMDgxCzAJBgNV
BAYTAkdPMQ8wDQYDVQQIEwZHb3BoZXIxGDAWBgNVBAoTD1Rlc3RpbmcgUk9PVCBD
QTAeFw0xNzAzMDkwMDAzMTRaFw0yNzAzMDcwMDAzMTRaMFExCzAJBgNVBAYTAkdP
MQ8wDQYDVQQIDAZHb3BoZXIxHDAaBgNVBAoME1Rlc3RpbmcgQ2VydGlmaWNhdGUx
EzARBgNVBAsMClRlc3RpbmcgSVAwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGB
AN1hWHeioo/nASvbrjwCQzXCiWiEzGkw353NxsAB54/NqDL3LXNATtiSJu8kJBrm
Ah12IFLtWLGXjGjjYlHbQWnOR6awveeXnQZukJyRWh7m/Qlt9Ho0CgZE1U+832ac
5GWVldNxW1Lz4I+W9/ehzqe8I80RS6eLEKfUFXGiW+9RAgMBAAGjEzARMA8GA1Ud
EQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEFBQADgYEAdF4WQHfVdPCbgv9sxgJjcR1H
Hgw9rZ47gO1IiIhzglnLXQ6QuemRiHeYFg4kjcYBk1DJguxzDTGnUwhUXOibAB+S
zssmrkdYYvn9aUhjc3XK3tjAoDpsPpeBeTBamuUKDHoH/dNRXxerZ8vu6uPR3Pgs
5v/KCV6IAEcvNyOXMPo=
-----END CERTIFICATE-----
`)
// TLSBundleKey ai.key
TLSBundleKey = []byte(`-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDdYVh3oqKP5wEr2648AkM1wolohMxpMN+dzcbAAeePzagy9y1z
QE7YkibvJCQa5gIddiBS7Vixl4xo42JR20FpzkemsL3nl50GbpCckVoe5v0JbfR6
NAoGRNVPvN9mnORllZXTcVtS8+CPlvf3oc6nvCPNEUunixCn1BVxolvvUQIDAQAB
AoGBAMISrcirddGrlLZLLrKC1ULS2T0cdkqdQtwHYn4+7S5+/z42vMx1iumHLsSk
rVY7X41OWkX4trFxhvEIrc/O48bo2zw78P7flTxHy14uxXnllU8cLThE29SlUU7j
AVBNxJZMsXMlS/DowwD4CjFe+x4Pu9wZcReF2Z9ntzMpySABAkEA+iWoJCPE2JpS
y78q3HYYgpNY3gF3JqQ0SI/zTNkb3YyEIUffEYq0Y9pK13HjKtdsSuX4osTIhQkS
+UgRp6tCAQJBAOKPYTfQ2FX8ijgUpHZRuEAVaxASAS0UATiLgzXxLvOh/VC2at5x
wjOX6sD65pPz/0D8Qj52Cq6Q1TQ+377SDVECQAIy0od+yPweXxvrUjUd1JlRMjbB
TIrKZqs8mKbUQapw0bh5KTy+O1elU4MRPS3jNtBxtP25PQnuSnxmZcFTgAECQFzg
DiiFcsn9FuRagfkHExMiNJuH5feGxeFaP9WzI144v9GAllrOI6Bm3JNzx2ZLlg4b
20Qju8lIEj6yr6JYFaECQHM1VSojGRKpOl9Ox/R4yYSA9RV5Gyn00/aJNxVYyPD5
i3acL2joQm2kLD/LO8paJ4+iQdRXCOMMIpjxSNjGQjQ=
-----END RSA PRIVATE KEY-----
`)
)

View file

@ -1,188 +0,0 @@
// +build integration
package s3
import (
"bytes"
"encoding/csv"
"fmt"
"io"
"os"
"path/filepath"
"strings"
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/service/s3"
)
func TestSelectObjectContent(t *testing.T) {
keyName := "selectObject.csv"
putTestFile(t, filepath.Join("testdata", "positive_select.csv"), keyName)
resp, err := svc.SelectObjectContent(&s3.SelectObjectContentInput{
Bucket: bucketName,
Key: &keyName,
Expression: aws.String("Select * from S3Object"),
ExpressionType: aws.String(s3.ExpressionTypeSql),
InputSerialization: &s3.InputSerialization{
CSV: &s3.CSVInput{
FieldDelimiter: aws.String(","),
FileHeaderInfo: aws.String(s3.FileHeaderInfoIgnore),
},
},
OutputSerialization: &s3.OutputSerialization{
CSV: &s3.CSVOutput{
FieldDelimiter: aws.String(","),
},
},
})
if err != nil {
t.Fatalf("expect no error, %v", err)
}
defer resp.EventStream.Close()
var sum int64
var processed int64
for event := range resp.EventStream.Events() {
switch tv := event.(type) {
case *s3.RecordsEvent:
sum += int64(len(tv.Payload))
case *s3.StatsEvent:
processed = *tv.Details.BytesProcessed
}
}
if sum == 0 {
t.Errorf("expect selected content, got none")
}
if processed == 0 {
t.Errorf("expect selected status bytes processed, got none")
}
if err := resp.EventStream.Err(); err != nil {
t.Fatalf("exect no error, %v", err)
}
}
func TestSelectObjectContent_Error(t *testing.T) {
keyName := "negativeSelect.csv"
buf := make([]byte, 0, 1024*1024*6)
buf = append(buf, []byte("name,number\n")...)
line := []byte("jj,0\n")
for i := 0; i < (cap(buf)/len(line))-2; i++ {
buf = append(buf, line...)
}
buf = append(buf, []byte("gg,NaN\n")...)
putTestContent(t, bytes.NewReader(buf), keyName)
resp, err := svc.SelectObjectContent(&s3.SelectObjectContentInput{
Bucket: bucketName,
Key: &keyName,
Expression: aws.String("SELECT name FROM S3Object WHERE cast(number as int) < 1"),
ExpressionType: aws.String(s3.ExpressionTypeSql),
InputSerialization: &s3.InputSerialization{
CSV: &s3.CSVInput{
FileHeaderInfo: aws.String(s3.FileHeaderInfoUse),
},
},
OutputSerialization: &s3.OutputSerialization{
CSV: &s3.CSVOutput{
FieldDelimiter: aws.String(","),
},
},
})
if err != nil {
t.Fatalf("expect no error, %v", err)
}
defer resp.EventStream.Close()
var sum int64
for event := range resp.EventStream.Events() {
switch tv := event.(type) {
case *s3.RecordsEvent:
sum += int64(len(tv.Payload))
}
}
if sum == 0 {
t.Errorf("expect selected content")
}
err = resp.EventStream.Err()
if err == nil {
t.Fatalf("exepct error")
}
aerr := err.(awserr.Error)
if a := aerr.Code(); len(a) == 0 {
t.Errorf("expect, error code")
}
if a := aerr.Message(); len(a) == 0 {
t.Errorf("expect, error message")
}
}
func TestSelectObjectContent_Stream(t *testing.T) {
keyName := "selectGopher.csv"
buf := `name,number
gopher,0
ᵷodɥǝɹ,1
`
// Put a mock CSV file to the S3 bucket so that its contents can be
// selected.
putTestContent(t, strings.NewReader(buf), keyName)
// Make the Select Object Content API request using the object uploaded.
resp, err := svc.SelectObjectContent(&s3.SelectObjectContentInput{
Bucket: bucketName,
Key: &keyName,
Expression: aws.String("SELECT name FROM S3Object WHERE cast(number as int) < 1"),
ExpressionType: aws.String(s3.ExpressionTypeSql),
InputSerialization: &s3.InputSerialization{
CSV: &s3.CSVInput{
FileHeaderInfo: aws.String(s3.FileHeaderInfoUse),
},
},
OutputSerialization: &s3.OutputSerialization{
CSV: &s3.CSVOutput{},
},
})
if err != nil {
fmt.Fprintf(os.Stderr, "failed making API request, %v\n", err)
return
}
defer resp.EventStream.Close()
results, resultWriter := io.Pipe()
go func() {
defer resultWriter.Close()
for event := range resp.EventStream.Events() {
switch e := event.(type) {
case *s3.RecordsEvent:
resultWriter.Write(e.Payload)
case *s3.StatsEvent:
fmt.Printf("Processed %d bytes\n", *e.Details.BytesProcessed)
}
}
}()
// Printout the results
resReader := csv.NewReader(results)
for {
record, err := resReader.Read()
if err == io.EOF {
break
}
fmt.Println(record)
}
if err := resp.EventStream.Err(); err != nil {
fmt.Fprintf(os.Stderr, "reading from event stream failed, %v\n", err)
}
}

View file

@ -1,98 +0,0 @@
// +build integration
// Package s3 runs integration tests for S3
package s3
import (
"bytes"
"io/ioutil"
"net/http"
"reflect"
"testing"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
)
func TestWriteToObject(t *testing.T) {
_, err := svc.PutObject(&s3.PutObjectInput{
Bucket: bucketName,
Key: aws.String("key name"),
Body: bytes.NewReader([]byte("hello world")),
})
if err != nil {
t.Errorf("expect no error, got %v", err)
}
resp, err := svc.GetObject(&s3.GetObjectInput{
Bucket: bucketName,
Key: aws.String("key name"),
})
if err != nil {
t.Errorf("expect no error, got %v", err)
}
b, _ := ioutil.ReadAll(resp.Body)
if e, a := []byte("hello world"), b; !reflect.DeepEqual(e, a) {
t.Errorf("expect %v, got %v", e, a)
}
}
func TestPresignedGetPut(t *testing.T) {
putreq, _ := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: bucketName,
Key: aws.String("presigned-key"),
})
var err error
// Presign a PUT request
var puturl string
puturl, err = putreq.Presign(300 * time.Second)
if err != nil {
t.Errorf("expect no error, got %v", err)
}
// PUT to the presigned URL with a body
var puthttpreq *http.Request
buf := bytes.NewReader([]byte("hello world"))
puthttpreq, err = http.NewRequest("PUT", puturl, buf)
if err != nil {
t.Errorf("expect no error, got %v", err)
}
var putresp *http.Response
putresp, err = http.DefaultClient.Do(puthttpreq)
if err != nil {
t.Errorf("expect put with presign url no error, got %v", err)
}
if e, a := 200, putresp.StatusCode; e != a {
t.Errorf("expect %v, got %v", e, a)
}
// Presign a GET on the same URL
getreq, _ := svc.GetObjectRequest(&s3.GetObjectInput{
Bucket: bucketName,
Key: aws.String("presigned-key"),
})
var geturl string
geturl, err = getreq.Presign(300 * time.Second)
if err != nil {
t.Errorf("expect no error, got %v", err)
}
// Get the body
var getresp *http.Response
getresp, err = http.Get(geturl)
if err != nil {
t.Errorf("expect no error, got %v", err)
}
var b []byte
defer getresp.Body.Close()
b, err = ioutil.ReadAll(getresp.Body)
if e, a := "hello world", string(b); e != a {
t.Errorf("expect %v, got %v", e, a)
}
}

View file

@ -1,102 +0,0 @@
// +build integration
package s3
import (
"bytes"
"crypto/md5"
"encoding/base64"
"fmt"
"io"
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/service/s3"
)
func base64Sum(content []byte) string {
sum := md5.Sum(content)
return base64.StdEncoding.EncodeToString(sum[:])
}
func SkipTestContentMD5Validate(t *testing.T) {
body := []byte("really cool body content")
cases := []struct {
Name string
Body []byte
Sum64 string
RangeGet []int64
}{
{
Body: body,
Sum64: base64Sum(body),
Name: "contentMD5validation.pop",
},
{
Body: []byte{},
Sum64: base64Sum([]byte{}),
Name: "contentMD5validation.empty",
},
{
Body: body,
Sum64: base64Sum(body),
RangeGet: []int64{0, 9},
Name: "contentMD5validation.range",
},
}
for i, c := range cases {
keyName := aws.String(c.Name)
req, _ := svc.PutObjectRequest(&s3.PutObjectInput{
Bucket: bucketName,
Key: keyName,
Body: bytes.NewReader(c.Body),
})
req.Build()
if e, a := c.Sum64, req.HTTPRequest.Header.Get("Content-Md5"); e != a {
t.Errorf("%d, expect %v sum, got %v", i, e, a)
}
if err := req.Send(); err != nil {
t.Fatalf("%d, expect no error, got %v", i, err)
}
getObjIn := &s3.GetObjectInput{
Bucket: bucketName,
Key: keyName,
}
expectBody := c.Body
if c.RangeGet != nil {
getObjIn.Range = aws.String(fmt.Sprintf("bytes=%d-%d", c.RangeGet[0], c.RangeGet[1]-1))
expectBody = c.Body[c.RangeGet[0]:c.RangeGet[1]]
}
getReq, getOut := svc.GetObjectRequest(getObjIn)
getReq.Build()
if e, a := "append-md5", getReq.HTTPRequest.Header.Get("X-Amz-Te"); e != a {
t.Errorf("%d, expect %v encoding, got %v", i, e, a)
}
if err := getReq.Send(); err != nil {
t.Fatalf("%d, expect no error, got %v", i, err)
}
defer getOut.Body.Close()
if e, a := "append-md5", getReq.HTTPResponse.Header.Get("X-Amz-Transfer-Encoding"); e != a {
t.Fatalf("%d, expect response tx encoding header %v, got %v", i, e, a)
}
var readBody bytes.Buffer
_, err := io.Copy(&readBody, getOut.Body)
if err != nil {
t.Fatalf("%d, expect no error, got %v", i, err)
}
if e, a := expectBody, readBody.Bytes(); !bytes.Equal(e, a) {
t.Errorf("%d, expect %v body, got %v", i, e, a)
}
}
}

View file

@ -1,29 +0,0 @@
// +build integration
//Package s3crypto provides gucumber integration tests support.
package s3crypto
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3crypto"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@s3crypto", func() {
sess := session.New((&aws.Config{
Region: aws.String("us-west-2"),
}))
encryptionClient := s3crypto.NewEncryptionClient(sess, nil, func(c *s3crypto.EncryptionClient) {
})
gucumber.World["encryptionClient"] = encryptionClient
decryptionClient := s3crypto.NewDecryptionClient(sess)
gucumber.World["decryptionClient"] = decryptionClient
gucumber.World["client"] = s3.New(sess)
})
}

View file

@ -1,33 +0,0 @@
# language: en
@s3crypto @client
Feature: S3 Integration Crypto Tests
Scenario: Uploading Go's SDK fixtures
When I get all fixtures for "aes_gcm" from "aws-s3-shared-tests"
Then I encrypt each fixture with "kms" "AWS_SDK_TEST_ALIAS" "us-west-2" and "aes_gcm"
And upload "Go" data with folder "version_2"
Scenario: Uploading Go's SDK fixtures
When I get all fixtures for "aes_cbc" from "aws-s3-shared-tests"
Then I encrypt each fixture with "kms" "AWS_SDK_TEST_ALIAS" "us-west-2" and "aes_cbc"
And upload "Go" data with folder "version_2"
Scenario: Get all plaintext fixtures for symmetric masterkey aes gcm
When I get all fixtures for "aes_gcm" from "aws-s3-shared-tests"
Then I decrypt each fixture against "Go" "version_2"
And I compare the decrypted ciphertext to the plaintext
Scenario: Get all plaintext fixtures for symmetric masterkey aes cbc
When I get all fixtures for "aes_cbc" from "aws-s3-shared-tests"
Then I decrypt each fixture against "Go" "version_2"
And I compare the decrypted ciphertext to the plaintext
Scenario: Get all plaintext fixtures for symmetric masterkey aes gcm
When I get all fixtures for "aes_gcm" from "aws-s3-shared-tests"
Then I decrypt each fixture against "Java" "version_2"
And I compare the decrypted ciphertext to the plaintext
Scenario: Get all plaintext fixtures for symmetric masterkey aes cbc
When I get all fixtures for "aes_cbc" from "aws-s3-shared-tests"
Then I decrypt each fixture against "Java" "version_2"
And I compare the decrypted ciphertext to the plaintext

View file

@ -1,211 +0,0 @@
// +build integration
// Package s3crypto contains shared step definitions that are used across integration tests
package s3crypto
import (
"bytes"
"encoding/base64"
"errors"
"io/ioutil"
"strings"
"github.com/gucumber/gucumber"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/kms"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3crypto"
)
func init() {
gucumber.When(`^I get all fixtures for "(.+?)" from "(.+?)"$`,
func(cekAlg, bucket string) {
prefix := "plaintext_test_case_"
baseFolder := "crypto_tests/" + cekAlg
s3Client := gucumber.World["client"].(*s3.S3)
out, err := s3Client.ListObjects(&s3.ListObjectsInput{
Bucket: aws.String(bucket),
Prefix: aws.String(baseFolder + "/" + prefix),
})
if err != nil {
gucumber.T.Errorf("expect no error, got %v", err)
}
plaintexts := make(map[string][]byte)
for _, obj := range out.Contents {
plaintextKey := obj.Key
ptObj, err := s3Client.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: plaintextKey,
})
if err != nil {
gucumber.T.Errorf("expect no error, got %v", err)
}
caseKey := strings.TrimPrefix(*plaintextKey, baseFolder+"/"+prefix)
plaintext, err := ioutil.ReadAll(ptObj.Body)
if err != nil {
gucumber.T.Errorf("expect no error, got %v", err)
}
plaintexts[caseKey] = plaintext
}
gucumber.World["baseFolder"] = baseFolder
gucumber.World["bucket"] = bucket
gucumber.World["plaintexts"] = plaintexts
})
gucumber.Then(`^I decrypt each fixture against "(.+?)" "(.+?)"$`, func(lang, version string) {
plaintexts := gucumber.World["plaintexts"].(map[string][]byte)
baseFolder := gucumber.World["baseFolder"].(string)
bucket := gucumber.World["bucket"].(string)
prefix := "ciphertext_test_case_"
s3Client := gucumber.World["client"].(*s3.S3)
s3CryptoClient := gucumber.World["decryptionClient"].(*s3crypto.DecryptionClient)
language := "language_" + lang
ciphertexts := make(map[string][]byte)
for caseKey := range plaintexts {
cipherKey := baseFolder + "/" + version + "/" + language + "/" + prefix + caseKey
// To get metadata for encryption key
ctObj, err := s3Client.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: &cipherKey,
})
if err != nil {
continue
}
// We don't support wrap, so skip it
if ctObj.Metadata["X-Amz-Wrap-Alg"] == nil || *ctObj.Metadata["X-Amz-Wrap-Alg"] != "kms" {
continue
}
ctObj, err = s3CryptoClient.GetObject(&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: &cipherKey,
},
)
if err != nil {
gucumber.T.Errorf("expect no error, got %v", err)
}
ciphertext, err := ioutil.ReadAll(ctObj.Body)
if err != nil {
gucumber.T.Errorf("expect no error, got %v", err)
}
ciphertexts[caseKey] = ciphertext
}
gucumber.World["decrypted"] = ciphertexts
})
gucumber.And(`^I compare the decrypted ciphertext to the plaintext$`, func() {
plaintexts := gucumber.World["plaintexts"].(map[string][]byte)
ciphertexts := gucumber.World["decrypted"].(map[string][]byte)
for caseKey, ciphertext := range ciphertexts {
if e, a := len(plaintexts[caseKey]), len(ciphertext); e != a {
gucumber.T.Errorf("expect %v, got %v", e, a)
}
if e, a := plaintexts[caseKey], ciphertext; !bytes.Equal(e, a) {
gucumber.T.Errorf("expect %v, got %v", e, a)
}
}
})
gucumber.Then(`^I encrypt each fixture with "(.+?)" "(.+?)" "(.+?)" and "(.+?)"$`, func(kek, v1, v2, cek string) {
var handler s3crypto.CipherDataGenerator
var builder s3crypto.ContentCipherBuilder
switch kek {
case "kms":
arn, err := getAliasInformation(v1, v2)
if err != nil {
gucumber.T.Errorf("expect nil, got %v", nil)
}
b64Arn := base64.StdEncoding.EncodeToString([]byte(arn))
if err != nil {
gucumber.T.Errorf("expect nil, got %v", nil)
}
gucumber.World["Masterkey"] = b64Arn
handler = s3crypto.NewKMSKeyGenerator(kms.New(session.New(&aws.Config{
Region: &v2,
})), arn)
if err != nil {
gucumber.T.Errorf("expect nil, got %v", nil)
}
default:
gucumber.T.Skip()
}
switch cek {
case "aes_gcm":
builder = s3crypto.AESGCMContentCipherBuilder(handler)
case "aes_cbc":
builder = s3crypto.AESCBCContentCipherBuilder(handler, s3crypto.AESCBCPadder)
default:
gucumber.T.Skip()
}
sess := session.New(&aws.Config{
Region: aws.String("us-west-2"),
})
c := s3crypto.NewEncryptionClient(sess, builder, func(c *s3crypto.EncryptionClient) {
})
gucumber.World["encryptionClient"] = c
gucumber.World["cek"] = cek
})
gucumber.And(`^upload "(.+?)" data with folder "(.+?)"$`, func(language, folder string) {
c := gucumber.World["encryptionClient"].(*s3crypto.EncryptionClient)
cek := gucumber.World["cek"].(string)
bucket := gucumber.World["bucket"].(string)
plaintexts := gucumber.World["plaintexts"].(map[string][]byte)
key := gucumber.World["Masterkey"].(string)
for caseKey, plaintext := range plaintexts {
input := &s3.PutObjectInput{
Bucket: &bucket,
Key: aws.String("crypto_tests/" + cek + "/" + folder + "/language_" + language + "/ciphertext_test_case_" + caseKey),
Body: bytes.NewReader(plaintext),
Metadata: map[string]*string{
"Masterkey": &key,
},
}
_, err := c.PutObject(input)
if err != nil {
gucumber.T.Errorf("expect nil, got %v", nil)
}
}
})
}
func getAliasInformation(alias, region string) (string, error) {
arn := ""
svc := kms.New(session.New(&aws.Config{
Region: &region,
}))
truncated := true
var marker *string
for truncated {
out, err := svc.ListAliases(&kms.ListAliasesInput{
Marker: marker,
})
if err != nil {
return arn, err
}
for _, aliasEntry := range out.Aliases {
if *aliasEntry.AliasName == "alias/"+alias {
return *aliasEntry.AliasArn, nil
}
}
truncated = *out.Truncated
marker = out.NextMarker
}
return "", errors.New("The alias " + alias + " does not exist in your account. Please add the proper alias to a key")
}

View file

@ -1,27 +0,0 @@
// +build integration
package s3manager
import (
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/integration"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
func TestGetBucketRegion(t *testing.T) {
expectRegion := aws.StringValue(integration.Session.Config.Region)
ctx := aws.BackgroundContext()
region, err := s3manager.GetBucketRegion(ctx, integration.Session,
aws.StringValue(bucketName), expectRegion)
if err != nil {
t.Fatalf("expect no error, got %v", err)
}
if e, a := expectRegion, region; e != a {
t.Errorf("expect %s bucket region, got %s", e, a)
}
}

View file

@ -1,209 +0,0 @@
// +build integration
// Package s3manager provides integration tests for the service/s3/s3manager package
package s3manager
import (
"bytes"
"crypto/md5"
"fmt"
"io"
"os"
"regexp"
"strings"
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/request"
"github.com/aws/aws-sdk-go/awstesting/integration"
"github.com/aws/aws-sdk-go/service/s3"
"github.com/aws/aws-sdk-go/service/s3/s3manager"
)
var integBuf12MB = make([]byte, 1024*1024*12)
var integMD512MB = fmt.Sprintf("%x", md5.Sum(integBuf12MB))
var bucketName *string
func TestMain(m *testing.M) {
if err := setup(); err != nil {
panic(fmt.Sprintf("failed to setup integration test, %v", err))
}
var result int
defer func() {
if err := teardown(); err != nil {
fmt.Fprintf(os.Stderr, "teardown failed, %v", err)
}
if r := recover(); r != nil {
fmt.Println("S3Manager integration test hit a panic,", r)
result = 1
}
os.Exit(result)
}()
result = m.Run()
}
func setup() error {
svc := s3.New(integration.Session)
// Create a bucket for testing
bucketName = aws.String(
fmt.Sprintf("aws-sdk-go-integration-%s", integration.UniqueID()))
_, err := svc.CreateBucket(&s3.CreateBucketInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to create bucket %q, %v", *bucketName, err)
}
err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to wait for bucket %q to exist, %v", bucketName, err)
}
return nil
}
// Delete the bucket
func teardown() error {
svc := s3.New(integration.Session)
objs, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to list bucket %q objects, %v", bucketName, err)
}
for _, o := range objs.Contents {
svc.DeleteObject(&s3.DeleteObjectInput{Bucket: bucketName, Key: o.Key})
}
uploads, err := svc.ListMultipartUploads(&s3.ListMultipartUploadsInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to list bucket %q multipart objects, %v", bucketName, err)
}
for _, u := range uploads.Uploads {
svc.AbortMultipartUpload(&s3.AbortMultipartUploadInput{
Bucket: bucketName,
Key: u.Key,
UploadId: u.UploadId,
})
}
_, err = svc.DeleteBucket(&s3.DeleteBucketInput{Bucket: bucketName})
if err != nil {
return fmt.Errorf("failed to delete bucket %q, %v", bucketName, err)
}
return nil
}
type dlwriter struct {
buf []byte
}
func newDLWriter(size int) *dlwriter {
return &dlwriter{buf: make([]byte, size)}
}
func (d dlwriter) WriteAt(p []byte, pos int64) (n int, err error) {
if pos > int64(len(d.buf)) {
return 0, io.EOF
}
written := 0
for i, b := range p {
if i >= len(d.buf) {
break
}
d.buf[pos+int64(i)] = b
written++
}
return written, nil
}
func validate(t *testing.T, key string, md5value string) {
mgr := s3manager.NewDownloader(integration.Session)
params := &s3.GetObjectInput{Bucket: bucketName, Key: &key}
w := newDLWriter(1024 * 1024 * 20)
n, err := mgr.Download(w, params)
if err != nil {
t.Fatalf("expect no error, got %v", err)
}
if e, a := md5value, fmt.Sprintf("%x", md5.Sum(w.buf[0:n])); e != a {
t.Errorf("expect %s md5 value, got %s", e, a)
}
}
func TestUploadConcurrently(t *testing.T) {
key := "12mb-1"
mgr := s3manager.NewUploader(integration.Session)
out, err := mgr.Upload(&s3manager.UploadInput{
Bucket: bucketName,
Key: &key,
Body: bytes.NewReader(integBuf12MB),
})
if err != nil {
t.Fatalf("expect no error, got %v", err)
}
if len(out.UploadID) == 0 {
t.Errorf("expect upload ID but was empty")
}
re := regexp.MustCompile(`^https?://.+/` + key + `$`)
if e, a := re.String(), out.Location; !re.MatchString(a) {
t.Errorf("expect %s to match URL regexp %q, did not", e, a)
}
validate(t, key, integMD512MB)
}
func TestUploadFailCleanup(t *testing.T) {
svc := s3.New(integration.Session)
// Break checksum on 2nd part so it fails
part := 0
svc.Handlers.Build.PushBack(func(r *request.Request) {
if r.Operation.Name == "UploadPart" {
if part == 1 {
r.HTTPRequest.Header.Set("X-Amz-Content-Sha256", "000")
}
part++
}
})
key := "12mb-leave"
mgr := s3manager.NewUploaderWithClient(svc, func(u *s3manager.Uploader) {
u.LeavePartsOnError = false
})
_, err := mgr.Upload(&s3manager.UploadInput{
Bucket: bucketName,
Key: &key,
Body: bytes.NewReader(integBuf12MB),
})
if err == nil {
t.Fatalf("expect error, but did not get one")
}
aerr := err.(awserr.Error)
if e, a := "MissingRegion", aerr.Code(); strings.Contains(a, e) {
t.Errorf("expect %q to not be in error code %q", e, a)
}
uploadID := ""
merr := err.(s3manager.MultiUploadFailure)
if uploadID = merr.UploadID(); len(uploadID) == 0 {
t.Errorf("expect upload ID to not be empty, but was")
}
_, err = svc.ListParts(&s3.ListPartsInput{
Bucket: bucketName, Key: &key, UploadId: &uploadID,
})
if err == nil {
t.Errorf("expect error for list parts, but got none")
}
}

View file

@ -1 +0,0 @@
package s3manager

View file

@ -1,89 +0,0 @@
// +build integration
package s3
import (
"fmt"
"io"
"os"
"testing"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/integration"
"github.com/aws/aws-sdk-go/service/s3"
)
const integBucketPrefix = "aws-sdk-go-integration"
var bucketName *string
var svc *s3.S3
func TestMain(m *testing.M) {
setup()
defer teardown() // only called if we panic
result := m.Run()
teardown()
os.Exit(result)
}
// Create a bucket for testing
func setup() {
svc = s3.New(integration.Session)
bucketName = aws.String(
fmt.Sprintf("%s-%s",
integBucketPrefix, integration.UniqueID()))
_, err := svc.CreateBucket(&s3.CreateBucketInput{Bucket: bucketName})
if err != nil {
panic(fmt.Sprintf("failed to create bucket %s, %v", *bucketName, err))
}
err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{Bucket: bucketName})
if err != nil {
panic(fmt.Sprintf("failed waiting for bucket %s to be created", *bucketName))
}
}
// Delete the bucket
func teardown() {
resp, err := svc.ListObjects(&s3.ListObjectsInput{Bucket: bucketName})
if err != nil {
panic(fmt.Sprintf("failed to list s3 bucket %s objects, %v", *bucketName, err))
}
errs := []error{}
for _, o := range resp.Contents {
_, err = svc.DeleteObject(&s3.DeleteObjectInput{Bucket: bucketName, Key: o.Key})
if err != nil {
errs = append(errs, err)
}
}
if len(errs) != 0 {
panic(fmt.Sprintf("failed to delete objects, %s", errs))
}
svc.DeleteBucket(&s3.DeleteBucketInput{Bucket: bucketName})
}
func putTestFile(t *testing.T, filename, key string) {
f, err := os.Open(filename)
if err != nil {
t.Fatalf("failed to open testfile, %v", err)
}
defer f.Close()
putTestContent(t, f, key)
}
func putTestContent(t *testing.T, reader io.ReadSeeker, key string) {
_, err := svc.PutObject(&s3.PutObjectInput{
Bucket: bucketName,
Key: aws.String(key),
Body: reader,
})
if err != nil {
t.Errorf("expect no error, got %v", err)
}
}

View file

@ -1 +0,0 @@
package s3

View file

@ -1,556 +0,0 @@
A,B,C,D,E,F,G,H,I,J
0,0,0.5,217.371,217.658,218.002,269.445,487.447,2.106,489.554
0,0,490.077,0.657,0.84,1.588,121.092,122.681,2.185,124.867
0,9,490.077,1.602,1.676,1.977,184.155,186.132,1.198,187.331
0,6,490.384,1.787,1.962,2.451,270.592,273.044,4.158,277.202
0,5,491.125,0.693,0.877,1.9,295.589,297.49,19.456,316.946
0,8,491.348,1.833,1.924,66.432,250.035,316.467,2.379,318.847
0,0,614.955,0.455,0.507,8.554,229.261,237.815,15.761,253.577
0,9,677.418,0.493,0.546,14.288,176.628,190.917,6.522,197.44
0,3,491.864,1.034,1.109,250.552,132.254,382.806,2.485,385.291
0,2,491.351,1.763,1.807,276.239,122.283,398.523,26.436,424.96
0,4,490.154,1.867,1.935,341.544,86.243,427.787,15.659,443.447
0,8,810.203,0.381,0.453,21.4,101.836,123.236,9.01,132.246
0,6,767.595,0.54,0.592,68.928,105.705,174.633,0.93,175.564
0,0,868.54,0.384,0.483,8.721,82.83,91.552,37.154,128.706
0,9,874.866,0.472,0.574,41.728,80.617,122.345,11.14,133.486
0,1,490.757,2.284,2.336,426.145,91.084,517.229,0.507,517.736
0,7,490.755,1.652,1.816,426.521,90.913,517.435,2.244,519.679
0,6,943.165,0.324,0.391,2.676,116.421,119.098,0.452,119.551
0,2,916.32,0.609,0.884,81.097,83.55,164.647,1.342,165.989
0,8,942.462,0.374,0.464,55.682,84.915,140.597,46.844,187.442
0,4,933.61,0.377,0.451,64.784,131.147,195.932,9.997,205.929
0,5,808.083,0.565,0.641,190.27,140.808,331.078,0.465,331.543
0,3,877.165,0.47,0.546,121.153,141.078,262.231,2.558,264.789
0,7,1010.442,0.372,0.441,2.201,129.116,131.318,7.148,138.467
0,6,1062.725,0.483,0.581,6.402,80.848,87.251,45.416,132.668
0,1,1008.502,1.579,1.706,65.348,121.324,186.672,1.251,187.924
0,0,997.256,0.402,0.832,76.472,121.367,197.839,18.513,216.353
0,9,1008.364,1.428,1.582,70.936,133.941,204.878,2.255,207.133
0,8,1129.916,0.458,0.551,19.07,113.216,132.287,0.38,132.667
0,4,1139.547,0.388,0.457,9.775,113.036,122.812,1.531,124.343
0,2,1082.318,0.352,0.43,67.775,112.768,180.543,22.578,203.122
0,5,1139.629,0.416,0.466,10.429,135.269,145.699,2.425,148.124
0,3,1141.962,0.394,0.472,53.375,92.295,145.67,0.212,145.883
0,0,1213.618,0.408,0.481,2.655,112.525,115.18,0.547,115.728
0,9,1215.504,0.427,0.672,2.233,111.382,113.615,1.145,114.761
0,6,1195.403,0.437,0.511,25.098,109.564,134.662,22.852,157.515
0,7,1148.919,0.486,1.021,138.981,91.884,230.865,16.504,247.369
0,4,1263.894,0.711,0.788,33.761,98.396,132.158,0.671,132.83
0,1,1196.433,0.301,0.364,100.757,99.252,200.01,1.116,201.126
0,8,1262.594,0.964,1.248,66.394,96.747,163.141,1.173,164.315
0,2,1285.445,0.209,0.254,43.808,97.338,141.146,0.548,141.694
0,9,1330.271,0.288,0.355,35.329,84.511,119.84,16.98,136.821
0,6,1352.928,0.474,0.579,12.904,100.981,113.886,0.517,114.403
0,0,1329.353,0.294,0.366,36.781,100.857,137.638,0.532,138.171
0,2,1427.143,0.532,0.58,9.336,79.756,89.093,1.239,90.332
0,4,1396.736,0.503,0.592,44.925,80.622,125.548,10.972,136.52
0,8,1426.921,0.631,0.71,15.906,90.068,105.975,1.38,107.356
0,5,1287.759,0.278,0.316,181.454,80.529,261.984,10.774,272.759
0,1,1397.566,0.268,0.324,99.635,82.55,182.186,8.445,190.632
0,0,1467.53,1.354,1.536,33.298,87.09,120.388,0.517,120.905
0,7,1396.3,0.593,0.684,104.729,87.108,191.838,1.133,192.971
0,9,1467.103,1.422,1.546,42.719,82.771,125.491,9.398,134.89
0,3,1287.85,0.245,0.272,248.437,79.849,328.286,9.318,337.605
0,6,1467.339,0.933,1.132,69.074,88.797,157.871,0.891,158.762
0,4,1533.267,0.449,0.548,42.003,81.379,123.383,9.108,132.491
0,2,1517.483,0.32,0.399,56.455,91.585,148.04,0.44,148.48
0,8,1534.284,0.425,0.48,39.738,91.427,131.166,1.247,132.413
0,5,1560.528,0.396,0.499,19.318,86.69,106.008,1.54,107.548
0,6,1626.109,0.34,0.43,6.88,82.575,89.455,0.568,90.023
0,1,1588.231,0.451,0.541,44.902,84.635,129.537,24.285,153.823
0,7,1589.279,0.288,0.352,57.597,94.892,152.489,0.555,153.044
0,9,1602.002,0.424,0.68,45.095,94.862,139.957,0.797,140.755
0,5,1668.084,0.29,0.351,29.143,84.196,113.34,26.201,139.542
0,4,1665.766,0.373,0.457,34.457,107.029,141.486,0.715,142.201
0,2,1665.971,0.303,0.375,47.175,94.572,141.748,0.861,142.609
0,0,1588.445,0.517,0.625,154.081,80.415,234.496,7.112,241.608
0,3,1625.463,0.647,0.751,143.666,83.075,226.742,21.951,248.694
0,7,1742.325,0.53,0.624,25.438,84.393,109.831,22.061,131.893
0,1,1742.079,0.555,0.659,34.769,97.152,131.921,0.364,132.286
0,8,1666.705,0.883,1.046,113.237,94.162,207.4,1.118,208.519
0,2,1808.586,0.3,0.362,21.568,78.537,100.106,1.979,102.085
0,0,1830.064,0.405,0.481,7.114,81.532,88.647,2.392,91.04
0,6,1716.143,0.49,0.557,121.371,87.089,208.46,14.395,222.856
0,5,1807.634,0.442,0.527,36.463,94.602,131.065,1.369,132.434
0,8,1875.228,0.164,0.198,3.582,79.597,83.179,1.504,84.684
0,1,1874.367,0.562,0.645,28.304,79.054,107.358,0.456,107.815
0,4,1807.975,0.4,0.482,99.4,81.109,180.509,1.133,181.643
0,9,1742.773,0.339,0.39,168.948,80.077,249.025,2.367,251.393
0,3,1874.166,0.495,0.593,38.988,84.602,123.59,7.982,131.572
0,8,1959.921,0.415,0.494,9.861,82.855,92.717,2.765,95.483
0,2,1910.682,0.995,1.109,69.161,85.346,154.507,1.625,156.133
0,0,1921.114,0.394,0.473,92.984,80.599,173.584,1.153,174.738
0,3,2005.748,0.476,0.556,7.441,83.841,91.283,1.422,92.705
0,5,1940.076,0.325,0.401,73.91,84.342,158.253,1.718,159.972
0,7,1874.22,0.557,0.642,140.027,91.031,231.059,1.754,232.814
0,6,1939.008,0.377,0.455,95.473,81.569,177.042,1.072,178.115
0,4,1989.626,0.314,0.388,51.23,81.724,132.955,11.694,144.65
0,9,1994.183,0.321,0.394,57.158,82.743,139.902,0.758,140.66
0,2,2066.819,0.204,0.259,13.808,84.448,98.256,1.366,99.623
0,1,1982.189,0.295,0.368,99.448,85.395,184.843,1.56,186.403
0,8,2055.408,0.203,0.253,51.567,82.101,133.668,1.073,134.741
0,9,2134.846,0.25,0.306,16.106,85.649,101.755,0.176,101.931
0,1,2168.598,0.229,0.302,6.826,81.481,88.307,1.143,89.45
0,4,2134.304,0.373,0.492,45.962,81.137,127.099,0.549,127.648
0,7,2107.039,0.483,0.555,73.813,81.641,155.455,1.562,157.017
0,6,2117.128,0.208,0.255,63.776,83.028,146.805,1.656,148.461
0,8,2190.154,0.225,0.285,29.098,80.996,110.094,1.344,111.439
0,9,2236.784,0.256,0.32,4.01,82.88,86.89,2.12,89.011
0,2,2166.449,0.317,0.395,80.763,84.208,164.971,2.32,167.291
0,5,2100.052,0.294,0.365,146.743,86.973,233.716,0.672,234.389
0,3,2098.458,0.241,0.3,150.5,84.733,235.234,1.292,236.526
0,0,2095.857,0.215,0.271,153.005,85.917,238.923,0.534,239.458
0,6,2265.593,0.182,0.218,20.159,80.738,100.897,1.449,102.347
0,4,2261.957,0.207,0.256,42.386,82.309,124.696,1.433,126.13
0,7,2264.061,0.243,0.288,51.339,80.631,131.97,0.973,132.943
0,8,2301.604,0.391,0.474,24.05,81.886,105.937,1.805,107.743
0,1,2258.053,0.206,0.26,93.644,81.876,175.52,1.331,176.852
0,0,2335.321,0.204,0.245,21.603,81.849,103.452,0.941,104.394
0,6,2367.949,0.434,0.515,6.274,83.161,89.435,4.495,93.931
0,3,2334.991,0.332,0.403,58.507,88.463,146.971,1.116,148.088
0,8,2409.356,0.385,0.463,13.78,83.24,97.02,0.344,97.364
0,5,2334.448,0.364,0.451,106.034,82.488,188.523,1.39,189.914
0,9,2325.809,0.429,0.506,114.736,84.279,199.015,1.209,200.225
0,2,2333.745,0.423,0.517,106.853,85.698,192.551,1.745,194.296
0,4,2388.097,0.399,0.498,67.532,84.096,151.628,0.599,152.228
0,3,2483.086,0.35,0.427,19.21,81.612,100.822,3.51,104.333
0,1,2434.913,0.435,0.577,86.727,83.002,169.729,1.902,171.632
0,7,2397.012,0.331,0.416,142.874,80.866,223.74,1.672,225.413
0,6,2461.891,0.36,0.441,78.194,82.238,160.433,0.613,161.046
0,9,2526.038,0.665,0.74,32.614,86.809,119.423,1.275,120.699
0,4,2540.332,0.326,0.387,42.093,80.618,122.711,2.268,124.979
0,8,2506.727,0.378,0.456,99.838,79.225,179.064,0.294,179.358
0,6,2622.939,0.33,0.385,1.186,81.73,82.917,2.248,85.165
0,3,2587.429,0.61,0.72,59.939,82.437,142.376,0.97,143.346
0,1,2606.549,0.391,0.459,40.636,83.436,124.072,2.096,126.169
0,7,2622.432,0.383,0.463,30.735,80.765,111.501,0.733,112.234
0,2,2528.046,0.199,0.244,128.905,85.696,214.602,0.334,214.936
0,4,2665.318,0.312,0.399,26.866,81.414,108.281,0.222,108.504
0,5,2524.369,0.329,0.413,167.907,84.934,252.841,1.305,254.147
0,8,2686.096,0.401,0.494,7.747,85.181,92.928,2.125,95.053
0,0,2439.722,0.357,0.696,254.259,89.099,343.358,2.809,346.167
0,9,2646.75,0.681,0.799,73.064,84.639,157.704,3.532,161.236
0,6,2708.115,0.4,0.481,14.501,86.758,101.259,0.934,102.194
0,3,2730.783,0.303,0.377,35.013,88.845,123.858,1.666,125.524
0,1,2732.726,0.318,0.414,53.138,78.873,132.011,0.237,132.249
0,0,2785.893,0.375,0.447,25.451,83.295,108.746,4.165,112.911
0,9,2807.993,0.31,0.384,35.981,91.657,127.639,0.466,128.106
0,2,2742.992,0.403,0.56,101.119,91.707,192.827,5.458,198.285
0,8,2781.157,0.365,0.446,70.781,90.886,161.667,0.817,162.484
0,1,2864.982,0.311,0.402,19.474,86.691,106.165,3.435,109.601
0,3,2856.319,0.429,0.493,54.672,82.88,137.553,0.33,137.884
0,5,2778.523,0.309,0.392,132.818,84.58,217.399,1.527,218.927
0,0,2898.815,0.362,0.463,12.416,86.002,98.418,1.107,99.525
0,7,2734.674,0.744,0.873,195.477,83.728,279.205,7.848,287.053
0,4,2773.831,0.339,0.428,156.128,91.457,247.585,1.311,248.897
0,6,2810.317,0.339,0.432,125.657,102.335,227.993,2.034,230.027
0,2,2941.285,0.294,0.367,38.02,79.84,117.86,1.696,119.556
0,8,2943.648,0.293,0.373,38.288,79.728,118.016,2.042,120.058
0,9,2936.108,0.466,0.563,63.933,82.084,146.017,1.602,147.619
0,4,3022.735,0.269,0.339,3.697,87.616,91.313,0.516,91.83
0,3,2994.213,0.418,0.495,42.946,81.806,124.752,0.29,125.043
0,1,2974.591,0.641,0.762,72.809,81.187,153.997,1.512,155.51
0,9,3083.737,0.352,0.425,15.144,84.807,99.951,1.383,101.335
0,6,3040.353,0.399,0.48,61.605,83.294,144.899,9.906,154.806
0,2,3060.852,0.407,0.487,40.928,92.521,133.449,0.893,134.342
0,0,2998.348,0.336,0.417,115.561,82.329,197.89,2.808,200.698
0,8,3063.714,0.314,0.391,50.53,84.619,135.15,28.56,163.71
0,1,3130.111,0.381,0.484,36.604,82.182,118.787,1.306,120.094
0,5,2997.458,0.349,0.427,169.477,83.501,252.978,2.447,255.425
0,7,3021.738,0.425,0.518,148.774,83.974,232.748,0.411,233.16
0,3,3119.263,0.315,0.392,50.462,85,135.463,4.92,140.383
0,4,3114.576,0.397,0.465,66.492,81.543,148.035,1.216,149.251
0,9,3185.086,0.49,0.563,0.843,79.106,79.95,28.271,108.222
0,6,3195.164,0.659,0.878,41.861,81.999,123.86,0.305,124.166
0,8,3227.436,0.588,0.685,13.471,80.559,94.03,0.675,94.705
0,0,3199.056,0.344,0.417,55.856,81.147,137.003,2.313,139.317
0,2,3195.197,0.89,0.993,59.866,83.95,143.817,2.518,146.336
0,1,3250.212,0.555,0.641,53.457,80.43,133.887,1.541,135.428
0,5,3252.89,0.347,0.424,55.768,81.876,137.644,2.326,139.971
0,9,3293.317,0.516,0.622,39.115,78.826,117.941,1.674,119.615
0,2,3341.541,0.379,0.456,26.056,81.181,107.238,1.453,108.691
0,4,3263.836,0.304,0.385,109.176,79.223,188.399,1.336,189.736
0,6,3319.341,0.424,0.509,52.086,83.572,135.658,1.93,137.589
0,3,3259.654,0.318,0.4,115.781,84.483,200.264,2.851,203.116
0,9,3412.942,0.36,0.432,19.904,83.186,103.091,0.294,103.386
0,5,3392.869,0.364,0.438,46.674,81.708,128.382,2.336,130.718
0,7,3254.902,0.434,0.504,184.8,83.725,268.526,1.536,270.063
0,0,3338.38,0.334,0.412,104.769,84.635,189.405,0.579,189.984
0,8,3322.15,0.363,0.429,120.337,85.709,206.047,1.064,207.111
0,3,3462.777,0.285,0.363,32.857,78.802,111.659,3.064,114.724
0,2,3450.24,0.329,0.416,53.507,82.338,135.845,0.291,136.137
0,1,3385.654,0.404,0.479,125.574,82.017,207.591,1.116,208.708
0,6,3456.937,0.306,0.374,58.496,80.921,139.418,1.87,141.288
0,4,3453.579,0.31,0.387,61.685,82.969,144.655,1.418,146.073
0,8,3529.268,0.324,0.408,31.325,78.86,110.186,1.213,111.4
0,5,3523.596,0.334,0.417,39.494,83.382,122.877,0.347,123.225
0,7,3524.971,0.36,0.472,47.432,80.801,128.234,0.953,129.187
0,4,3599.659,0.319,0.398,27.195,80.69,107.885,1.895,109.781
0,3,3577.512,0.571,0.652,51.889,82.948,134.837,1.141,135.979
0,1,3594.371,0.341,0.422,42.685,81.099,123.785,1.473,125.259
0,7,3654.167,0.306,0.383,15.528,81.986,97.515,2.405,99.92
0,9,3516.338,0.397,0.472,178.897,79.745,258.642,2.238,260.881
0,2,3586.389,1.185,1.333,109.11,81.551,190.661,2.03,192.692
0,5,3646.833,0.424,0.488,56.484,81.305,137.789,1.209,138.999
0,0,3528.372,0.397,0.487,176.378,80.819,257.198,0.746,257.944
0,6,3598.234,0.336,0.428,102.676,85.142,187.818,1.845,189.664
0,8,3640.677,0.476,0.58,83.915,81.6,165.515,12.681,178.196
0,4,3709.449,0.415,0.495,25.988,83.141,109.13,1.996,111.126
0,3,3713.499,0.322,0.402,55.534,81.807,137.341,0.906,138.248
0,0,3786.324,0.919,1.147,3.983,80.348,84.331,1.885,86.217
0,7,3754.097,0.438,0.543,36.421,81.782,118.204,1.217,119.421
0,9,3777.227,0.339,0.419,18.041,81.599,99.641,2.512,102.154
0,1,3719.638,0.353,0.419,112.793,82.398,195.191,1.433,196.624
0,4,3820.583,0.299,0.38,14.112,83.485,97.598,1.551,99.149
0,6,3787.905,0.358,0.44,49.391,82.265,131.656,1.218,132.874
0,2,3779.087,0.323,0.402,81.512,79.373,160.885,3.793,164.679
0,5,3785.843,1.116,1.253,82.986,77.901,160.888,1.176,162.064
0,8,3818.882,0.383,0.46,80.581,80.539,161.121,2.24,163.361
0,9,3879.424,0.314,0.394,21.002,81.687,102.689,1.579,104.268
0,6,3920.787,0.287,0.38,3.32,80.808,84.129,2.54,86.669
0,7,3873.527,0.371,0.436,60.962,79.343,140.305,1.693,141.998
0,5,3947.917,0.324,0.401,18.55,86.417,104.968,1.132,106.101
0,3,3851.755,0.345,0.42,114.969,87.007,201.977,0.317,202.294
0,9,3983.709,0.467,0.534,6.466,81.73,88.196,0.443,88.64
0,8,3982.255,0.767,0.998,14.279,81.449,95.729,1.705,97.435
0,4,3919.74,0.346,0.424,85.31,79.932,165.243,0.644,165.887
0,7,4015.534,0.333,0.409,17.541,80.366,97.907,1.668,99.575
0,1,3916.272,0.432,0.512,128.903,84.8,213.703,2.03,215.733
0,0,3872.552,0.463,0.605,190.345,81.085,271.43,2.323,273.754
0,2,3943.776,0.456,0.565,124.062,79.417,203.479,2.947,206.427
0,5,4054.025,0.473,0.519,16.707,81.618,98.325,2.546,100.872
0,4,4085.637,0.444,0.528,14.533,83.168,97.701,1.309,99.01
0,7,4115.136,0.466,0.563,10.979,80.789,91.768,1.994,93.762
0,9,4072.356,0.332,0.411,61.405,81.35,142.756,1.96,144.716
0,6,4007.465,0.323,0.404,173.194,81.587,254.782,1.562,256.344
0,0,4146.315,0.415,0.495,47.446,82.791,130.237,1.332,131.569
0,3,4054.052,0.334,0.407,140.693,83.369,224.063,5.103,229.166
0,8,4079.697,0.352,0.431,114.177,84.118,198.295,7.426,205.722
0,4,4184.657,0.346,0.42,13.748,86.813,100.561,0.308,100.869
0,2,4150.211,0.297,0.391,50.058,85.067,135.125,2.111,137.237
0,9,4217.079,0.289,0.372,15.913,78.546,94.459,1.492,95.952
0,7,4208.903,0.592,0.799,46.416,79.377,125.794,1.363,127.157
0,5,4154.904,0.378,0.458,105.65,86.733,192.384,0.306,192.69
0,1,4132.012,0.351,0.423,128.658,87.255,215.914,1.377,217.291
0,6,4263.817,0.316,0.392,7.054,80.022,87.076,2.867,89.944
0,2,4287.456,0.418,0.519,13.658,77.869,91.528,1.837,93.365
0,8,4285.427,0.371,0.448,46.607,81.282,127.89,1.193,129.083
0,6,4353.769,0.428,0.512,12.728,83.385,96.114,1.372,97.486
0,9,4313.041,0.452,0.544,65.025,81.466,146.492,1.454,147.947
0,7,4336.069,0.547,0.631,62.669,80.678,143.347,1.741,145.089
0,4,4285.532,0.421,0.489,126.035,80.128,206.164,1.865,208.029
0,1,4349.311,0.344,0.419,83.199,81.257,164.457,2.457,166.915
0,5,4347.602,0.336,0.415,84.785,84.577,169.362,0.205,169.568
0,3,4283.225,0.311,0.39,165.412,81.631,247.043,2.736,249.779
0,6,4451.266,0.349,0.435,16.483,81.492,97.976,1.693,99.669
0,2,4380.832,0.957,1.096,87.309,82.649,169.959,1.588,171.547
0,8,4414.518,0.362,0.479,53.482,84.438,137.92,1.534,139.454
0,0,4277.9,0.615,0.698,190.489,85.361,275.85,1.139,276.99
0,4,4493.572,0.353,0.433,5.668,79.869,85.538,1.985,87.523
0,9,4460.995,0.297,0.379,72.698,82.185,154.884,1.312,156.196
0,7,4481.166,0.353,0.43,52.934,82.767,135.702,0.9,136.602
0,1,4516.236,0.426,0.513,21.016,82.575,103.591,1.242,104.834
0,0,4554.897,0.284,0.36,14.035,80.027,94.063,0.644,94.708
0,2,4552.387,0.34,0.416,49.053,82.256,131.309,1.498,132.807
0,6,4550.944,0.374,0.452,58.083,82.241,140.324,0.226,140.55
0,5,4517.178,0.287,0.348,92.038,83.638,175.677,2.136,177.813
0,3,4533.015,0.387,0.482,81.677,80.321,161.999,0.881,162.88
0,8,4553.982,0.403,0.5,92.788,79.698,172.487,2.855,175.343
0,0,4649.615,0.455,0.528,19.45,84.334,103.785,1.69,105.475
0,4,4581.108,0.727,0.888,88.144,85.538,173.683,0.515,174.198
0,7,4617.775,0.309,0.38,57.266,80.933,138.2,1.523,139.723
0,9,4617.201,0.408,0.513,79.382,81.334,160.716,0.872,161.589
0,1,4621.077,0.313,0.394,79.38,80.484,159.864,1.538,161.403
0,5,4695,0.323,0.398,26.916,80.04,106.957,1.254,108.212
0,8,4729.336,0.417,0.504,8.58,81.443,90.024,1.481,91.506
0,6,4691.503,0.315,0.393,52.131,81.54,133.672,1.764,135.436
0,7,4757.506,0.336,0.402,8.604,82.634,91.239,2.208,93.447
0,3,4695.901,0.364,0.612,110.355,79.703,190.059,2.086,192.145
0,4,4755.316,0.387,0.444,71.444,80.424,151.868,1.02,152.889
0,1,4782.487,0.804,0.913,71.209,80.168,151.377,1.373,152.751
0,2,4685.202,0.318,0.395,168.695,81.247,249.943,1.572,251.515
0,0,4755.102,0.475,0.548,109.227,80.705,189.933,0.478,190.411
0,7,4850.962,0.47,0.583,25.01,82.997,108.007,1.157,109.164
0,5,4803.219,0.334,0.445,72.976,85.095,158.071,1.135,159.207
0,9,4778.799,0.486,0.589,120.634,80.375,201.009,1.331,202.341
0,4,4908.214,0.415,0.488,15.698,82.28,97.979,1.139,99.118
0,6,4826.949,0.393,0.479,97.059,83.146,180.206,1.672,181.879
0,8,4820.854,0.484,0.577,109.039,81.594,190.634,0.318,190.953
0,2,4936.725,0.354,0.431,6.303,83.521,89.824,1.867,91.692
0,3,4888.057,0.498,0.577,71.038,81.397,152.435,0.342,152.777
0,5,4962.434,0.279,0.331,14.723,82.679,97.402,0.279,97.682
0,7,4960.133,0.327,0.397,44.946,83.613,128.56,0.245,128.805
0,3,5040.845,0.439,0.546,14.402,85.033,99.435,2.166,101.602
0,8,5011.814,0.411,0.481,59.326,83.914,143.24,1.398,144.639
0,2,5028.425,0.366,0.446,42.929,84.889,127.819,0.305,128.124
0,0,4945.521,0.346,0.418,150.986,80.727,231.713,2.023,233.737
0,9,4981.151,0.45,0.557,115.5,82.904,198.405,2.823,201.228
0,5,5060.124,0.398,0.501,64.278,83.236,147.514,2.355,149.869
0,6,5008.836,0.28,0.353,115.728,85.538,201.267,0.603,201.871
0,1,4935.247,0.379,0.458,189.72,85.303,275.023,0.465,275.488
0,4,5007.34,0.542,0.741,117.463,85.645,203.108,2.146,205.255
0,7,5088.946,0.313,0.394,49.444,81.597,131.042,1.646,132.688
0,3,5142.457,0.399,0.478,5.147,81.287,86.435,0.881,87.317
0,2,5156.557,0.291,0.362,5.203,81.382,86.585,1.92,88.505
0,8,5156.462,0.521,0.69,19.219,80.308,99.528,1.821,101.349
0,9,5182.387,0.32,0.399,23.899,80.953,104.852,1.121,105.973
0,7,5221.642,0.307,0.391,5.745,81.815,87.561,1.817,89.378
0,0,5179.266,0.363,0.443,49.741,84.892,134.633,2.054,136.688
0,5,5210.018,0.568,0.643,61.334,81.577,142.911,1.418,144.33
0,3,5229.782,0.339,0.44,49.632,85.029,134.661,1.34,136.002
0,1,5210.738,0.792,1.471,86.688,81.747,168.435,0.87,169.305
0,9,5288.37,0.428,0.512,5.724,86.497,92.221,2.111,94.333
0,2,5245.07,0.351,0.431,61.536,81.418,142.954,1.728,144.682
0,0,5315.961,0.382,0.447,20.382,79.869,100.252,1.409,101.661
0,8,5257.815,0.423,0.49,92.566,80.892,173.459,1.496,174.955
0,7,5311.029,0.435,0.516,52.528,81.313,133.841,1.413,135.255
0,6,5210.712,1.532,1.63,151.833,85.155,236.989,1.118,238.107
0,3,5365.791,0.299,0.377,50.784,81.585,132.369,1.452,133.822
0,2,5389.757,0.474,0.554,26.667,82.959,109.627,1.814,111.441
0,0,5417.631,0.784,0.907,8.897,81.026,89.924,1.412,91.336
0,4,5212.602,0.386,0.447,217.003,82.217,299.221,1.166,300.387
0,9,5382.712,0.311,0.389,75.127,83.211,158.339,1.983,160.323
0,5,5354.356,0.305,0.39,112.1,80.95,193.05,1.376,194.427
0,7,5446.296,0.356,0.432,36.105,80.157,116.262,0.92,117.183
0,1,5380.053,0.405,0.494,111.048,85.12,196.168,1.345,197.514
0,6,5448.827,0.315,0.388,42.469,86.109,128.578,0.571,129.149
0,8,5432.778,0.329,0.409,64.109,83.938,148.048,0.344,148.393
0,4,5512.997,0.298,0.374,12.336,81.353,93.69,2.014,95.704
0,3,5499.624,0.486,0.595,59.894,82.285,142.179,1.619,143.799
0,5,5548.792,0.428,0.535,10.625,83.853,94.479,1.992,96.472
0,2,5501.208,0.575,0.684,90.412,78.346,168.759,0.685,169.444
0,4,5608.705,0.558,0.815,8.557,78.683,87.24,1.117,88.358
0,1,5577.576,0.426,0.513,55.869,79.618,135.487,1.607,137.095
0,0,5508.975,0.328,0.404,126.867,81.307,208.175,1.943,210.118
0,9,5543.047,0.36,0.436,90.905,85.163,176.069,2.65,178.719
0,2,5670.662,0.41,0.496,11.867,80.168,92.035,2.243,94.278
0,7,5563.487,0.303,0.384,127.359,84.02,211.379,1.073,212.452
0,6,5577.982,0.339,0.414,117.634,83.729,201.363,0.301,201.665
0,5,5645.292,0.373,0.455,50.568,84.436,135.005,1.355,136.36
0,4,5697.074,0.417,0.514,14.751,79.581,94.332,2.424,96.757
0,3,5643.43,0.367,0.462,102.833,81.493,184.327,2.916,187.244
0,0,5719.101,0.348,0.427,42.935,78.555,121.491,1.886,123.377
0,8,5581.178,0.307,0.381,181.001,83.057,264.059,1.295,265.354
0,9,5721.773,0.324,0.406,46.37,81.578,127.949,1.29,129.239
0,2,5764.95,0.399,0.477,28.761,79.071,107.832,2.316,110.149
0,1,5714.679,0.318,0.404,98.197,82.491,180.689,1.885,182.574
0,4,5793.839,0.314,0.382,30.597,81.38,111.978,1.234,113.212
0,7,5775.948,0.332,0.413,51.577,84.088,135.665,0.377,136.043
0,3,5830.686,0.955,1.072,11.735,81.606,93.341,1.701,95.043
0,9,5851.02,0.333,0.414,18.739,81.701,100.441,1.33,101.771
0,2,5875.109,0.396,0.478,15.164,81.893,97.058,1.217,98.275
0,5,5781.659,0.318,0.386,119.27,83.15,202.42,0.376,202.797
0,7,5911.998,0.339,0.418,11.726,82.093,93.82,1.495,95.315
0,3,5925.738,0.447,0.516,21.925,79.87,101.795,0.344,102.14
0,0,5842.488,0.338,0.409,124.073,81.734,205.807,2.047,207.855
0,6,5779.654,0.326,0.406,188.882,82.945,271.828,0.958,272.786
0,1,5897.261,0.301,0.377,74.047,81.4,155.448,0.967,156.415
0,8,5846.539,0.337,0.429,140.2,79.976,220.176,2.328,222.505
0,9,5952.801,0.344,0.421,54.536,79.755,134.291,1.41,135.702
0,7,6007.318,0.522,0.618,14.816,79.956,94.772,16.419,111.192
0,2,5973.394,0.518,0.592,60.307,84.753,145.06,0.75,145.81
0,5,5984.463,0.449,0.524,50.467,84.478,134.945,1.93,136.876
0,4,5907.056,0.402,0.484,129.229,84.9,214.129,1.722,215.851
0,3,6027.888,0.42,0.494,39.048,80.015,119.064,1.978,121.042
0,0,6050.355,1.316,1.485,29.107,82.111,111.218,1.742,112.96
0,1,6053.684,0.311,0.379,47.288,81.844,129.132,1.182,130.315
0,6,6052.444,0.503,0.615,67.027,81.05,148.077,1.152,149.229
0,5,6121.346,0.337,0.446,23.684,78.068,101.752,2.019,103.772
0,8,6069.053,0.397,0.478,79.682,79.537,159.219,1.582,160.802
0,9,6088.518,0.344,0.419,65.681,81.3,146.982,13.495,160.477
0,7,6118.543,0.547,0.608,50.691,81.862,132.554,0.377,132.931
0,3,6148.938,0.351,0.416,38.998,82.443,121.442,10.62,132.062
0,1,6184.009,0.625,0.847,30.097,79.57,109.667,2.015,111.682
0,4,6122.915,0.478,0.554,133.957,92.839,226.796,1.7,228.497
0,2,6119.207,0.42,0.468,136.749,95.595,232.345,3.165,235.51
0,5,6225.127,0.307,0.389,30.625,98.714,129.339,0.471,129.811
0,8,6229.86,0.669,0.746,51.831,97.397,149.228,1.67,150.898
0,6,6201.683,0.393,0.475,85.686,96.242,181.928,5.483,187.412
0,9,6249.004,0.394,0.467,68.533,82.42,150.954,0.531,151.485
0,0,6163.324,0.47,0.577,154.586,83.082,237.668,12.538,250.207
0,7,6251.483,0.329,0.409,71.341,90.405,161.747,0.44,162.188
0,3,6281.008,0.413,0.572,45.589,86.798,132.388,1.088,133.476
0,1,6295.702,0.418,0.499,51.953,79.591,131.545,1.322,132.867
0,4,6351.453,0.526,0.622,1.002,79.648,80.651,2.773,83.424
0,2,6354.728,0.554,0.647,34.466,80.677,115.143,0.939,116.083
0,5,6354.95,0.507,0.659,65.208,80.513,145.721,4.54,150.262
0,6,6389.103,0.371,0.453,31.17,84.714,115.884,0.492,116.376
0,0,6413.542,0.446,0.573,10.238,84.236,94.475,0.223,94.699
0,1,6428.577,0.312,0.401,27.804,81.855,109.659,1.676,111.336
0,7,6413.677,0.485,0.6,45.942,80.918,126.86,2.002,128.863
0,2,6470.818,0.322,0.4,18.925,81.521,100.446,0.952,101.399
0,4,6434.885,0.367,0.43,63.441,84.026,147.468,2.273,149.741
0,0,6508.249,0.291,0.367,14.539,80.234,94.774,2.012,96.787
0,9,6400.496,0.321,0.422,124.092,86.419,210.512,2.121,212.633
0,6,6505.483,0.332,0.395,50.891,82.623,133.515,2.367,135.883
0,5,6505.215,0.47,0.546,66.876,80.667,147.543,1.659,149.202
0,2,6572.224,0.316,0.376,17.54,84.437,101.978,0.329,102.308
0,4,6584.634,0.383,0.482,15.541,81.204,96.746,1.192,97.939
0,9,6613.139,0.441,0.554,10.492,79.826,90.318,1.596,91.915
0,7,6542.547,0.337,0.417,113.17,80.125,193.295,1.239,194.535
0,0,6605.043,0.334,0.415,57.477,82.496,139.973,1.355,141.329
0,3,6414.491,0.775,0.919,247.767,84.12,331.888,2.017,333.905
0,8,6380.768,0.437,0.526,281.598,85.832,367.431,0.649,368.081
0,5,6654.422,0.74,0.895,7.715,86.517,94.233,1.298,95.531
0,1,6539.923,0.391,0.483,149.274,83.239,232.513,2.996,235.509
0,4,6682.579,0.336,0.416,6.481,86.19,92.672,10.253,102.925
0,6,6641.381,0.317,0.393,59.657,84.226,143.884,0.521,144.405
0,9,6705.064,0.411,0.478,19.864,80.4,100.264,1.428,101.693
0,2,6674.542,0.419,0.494,53.331,81.556,134.888,1.243,136.131
0,7,6737.093,0.433,0.512,18.865,80.421,99.287,0.362,99.649
0,8,6748.856,0.377,0.434,17.681,84.385,102.067,0.776,102.843
0,6,6785.795,0.516,0.607,9.629,79.503,89.133,2.355,91.488
0,5,6749.962,0.412,0.48,73.922,79.8,153.722,1.568,155.291
0,0,6746.38,0.315,0.39,110.351,80.636,190.987,1.112,192.1
0,7,6836.754,0.55,0.613,24.537,80.93,105.467,2.694,108.162
0,8,6851.707,0.33,0.393,20.472,81.812,102.285,1.242,103.527
0,6,6877.293,0.396,0.464,12.523,81.162,93.686,1.659,95.345
0,4,6785.508,0.589,0.692,115.734,86.656,202.391,0.733,203.124
0,1,6775.441,0.33,0.414,130.532,83.319,213.851,1.687,215.538
0,9,6806.765,0.34,0.423,99.015,85.013,184.029,3.078,187.108
0,3,6748.406,0.486,0.618,174.309,81.219,255.529,4.272,259.801
0,5,6905.264,0.568,0.647,23.753,80.364,104.118,0.631,104.749
0,8,6955.243,0.326,0.406,2.524,80.645,83.169,0.755,83.925
0,0,6938.49,0.461,0.541,27.562,81.761,109.323,1.228,110.552
0,2,6810.68,0.93,1.1,197.267,80.838,278.105,1.271,279.376
0,7,6944.924,0.37,0.455,63.266,82.346,145.613,1.637,147.251
0,4,6988.643,0.466,0.606,34.89,83.461,118.352,3.998,122.35
0,3,7008.212,0.533,0.621,66.77,79.833,146.603,1.377,147.98
0,0,7049.053,0.377,0.459,25.731,82.163,107.895,1.657,109.553
0,6,6972.667,0.354,0.428,119.457,80.472,199.93,0.336,200.266
0,7,7092.184,0.337,0.406,4.213,82.36,86.573,1.179,87.752
0,9,6993.88,0.439,0.511,110.675,82.611,193.287,1.277,194.564
0,1,6990.987,0.309,0.389,131.279,80.628,211.907,1.199,213.107
0,8,7039.181,1.011,1.109,91.879,83.571,175.451,1.855,177.306
0,2,7090.066,0.356,0.455,51.305,82.594,133.899,1.56,135.459
0,4,7111.004,0.415,0.497,30.584,84.877,115.461,1.764,117.225
0,5,7010.022,0.464,0.541,141.61,82.79,224.4,2.016,226.417
0,0,7158.615,0.364,0.442,4.359,80.082,84.441,1.28,85.722
0,6,7172.942,0.521,0.598,26.196,79.661,105.858,1.066,106.924
0,3,7156.204,0.42,0.502,53.726,79.747,133.473,1.584,135.058
0,1,7204.101,0.331,0.416,26.093,81.632,107.725,2,109.726
0,0,7244.345,0.32,0.398,21.466,80.972,102.438,1.166,103.605
0,5,7236.446,0.493,0.55,41.039,79.52,120.56,2.102,122.662
0,9,7188.454,0.601,0.747,110.165,80.817,190.983,0.996,191.979
0,8,7216.494,0.341,0.427,81.98,80.888,162.869,2.197,165.067
0,7,7179.945,0.403,0.485,119.842,81.613,201.455,0.476,201.931
0,2,7225.536,0.484,0.582,74.136,81.65,155.786,1.136,156.923
0,1,7313.837,0.452,0.567,18.595,83.189,101.784,2.503,104.288
0,6,7279.875,0.328,0.411,61.184,81.339,142.524,2.233,144.757
0,5,7359.116,0.325,0.402,6.764,82.524,89.288,1.53,90.819
0,4,7228.237,0.716,0.876,138.937,84.177,223.115,0.301,223.416
0,7,7381.883,0.288,0.383,22.346,80.881,103.228,1.238,104.466
0,3,7291.272,0.443,0.52,113.137,81.756,194.893,1.745,196.639
0,8,7381.568,0.403,0.472,54.796,80.499,135.296,0.451,135.748
0,0,7347.958,0.324,0.405,118.366,81.119,199.485,1.507,200.992
0,9,7380.444,0.554,0.68,93.055,79.533,172.588,1.514,174.103
0,4,7451.66,0.316,0.384,22.329,80.797,103.127,2.351,105.478
0,3,7487.919,0.325,0.403,15.077,82.38,97.457,17.729,115.187
0,1,7418.133,0.432,0.498,97.07,87.573,184.644,0.619,185.263
0,8,7517.326,0.441,0.512,15.017,86.247,101.265,0.225,101.49
0,6,7424.648,0.311,0.394,113.912,82.157,196.07,0.29,196.361
0,5,7449.946,0.966,1.145,91.384,80.285,171.67,1.546,173.216
0,2,7382.465,0.311,0.368,155.965,84.581,240.547,6.505,247.052
0,7,7486.358,0.32,0.403,62.472,82.007,144.479,5.539,150.018
0,4,7557.146,0.366,0.452,15.698,80.87,96.568,13.833,110.402
0,0,7548.957,0.315,0.408,53.927,80.333,134.26,1.998,136.259
0,9,7554.554,0.424,0.512,48.698,81.789,130.488,2.084,132.572
0,3,7603.119,0.564,0.632,66.287,80.673,146.961,1.472,148.433
0,6,7621.016,0.287,0.361,50.611,79.755,130.366,2.06,132.427
0,1,7603.404,0.35,0.44,71.549,81.794,153.343,1.394,154.737
0,7,7636.385,0.328,0.393,38.377,83.192,121.569,7.821,129.391
0,8,7618.824,0.315,0.391,58.371,88.394,146.766,0.268,147.034
0,4,7667.559,0.458,0.544,41.885,80.925,122.811,2.257,125.068
0,0,7685.224,0.379,0.462,51.5,85.236,136.737,1.835,138.572
0,5,7623.17,0.345,0.429,113.716,86.773,200.489,2.099,202.589
0,9,7687.135,0.365,0.44,55.114,83.348,138.463,1.93,140.394
0,2,7629.525,0.75,0.881,112.85,84.984,197.834,1.481,199.316
0,6,7753.451,0.348,0.443,19.425,81.92,101.345,0.235,101.581
0,8,7765.861,0.295,0.382,42.989,83.301,126.291,0.309,126.6
0,3,7751.56,0.371,0.447,57.895,83.908,141.804,1.772,143.577
0,1,7758.148,0.305,0.375,61.756,83.904,145.661,0.303,145.964
0,4,7792.635,0.385,0.467,48.907,82.184,131.091,1.903,132.995
0,7,7765.787,0.508,0.598,82.233,80.202,162.436,0.937,163.373
0,5,7825.768,0.352,0.433,48.817,83.915,132.733,1.856,134.59
0,0,7823.804,0.347,0.42,81.14,78.737,159.878,2.87,162.748
0,3,7895.144,0.324,0.404,19.162,79.062,98.225,1.353,99.579
0,1,7904.124,0.531,0.75,44.278,80.547,124.825,2.869,127.694
0,7,7929.169,0.305,0.4,22.345,80.727,103.073,0.274,103.347
0,9,7827.535,0.315,0.398,125.914,79.985,205.899,1.407,207.306
0,4,7925.637,0.295,0.37,55.306,79.662,134.969,1.413,136.382
0,6,7855.04,0.348,0.424,129.077,82.84,211.917,1.083,213
0,2,7828.844,0.332,0.377,154.911,84.522,239.433,0.778,240.211
0,8,7892.473,0.449,0.525,91.578,85.603,177.182,9.727,186.909
0,5,7960.366,0.389,0.468,55.094,82.706,137.801,1.851,139.652
0,3,7994.732,0.337,0.41,22.79,83.043,105.834,1.32,107.154
0,7,8032.525,0.351,0.425,16.842,80.964,97.806,3.531,101.338
0,0,7986.561,0.295,0.37,65.496,81.656,147.152,1.49,148.643
0,9,8034.848,0.327,0.409,49.351,81.008,130.359,9.179,139.539
0,4,8062.031,0.837,1.09,46.288,82.287,128.575,3.955,132.531
0,5,8100.03,0.389,0.486,18.157,82.12,100.278,2.442,102.72
0,1,8031.827,0.478,0.608,96.665,82.449,179.114,1.973,181.087
0,2,8069.062,0.342,0.407,85.309,81.496,166.805,0.329,167.135
0,9,8174.399,0.474,0.569,11.749,83.111,94.861,1.975,96.836
0,3,8101.893,0.317,0.394,85.135,84.047,169.183,2.215,171.398
0,8,8079.389,0.343,0.409,114.95,81.574,196.524,0.902,197.427
0,1,8212.925,0.393,0.494,5.508,81.466,86.974,2.467,89.442
0,6,8068.049,0.4,0.476,153.286,83.743,237.03,1.172,238.202
0,4,8194.572,0.388,0.455,46.45,82.449,128.899,3.487,132.387
0,7,8133.87,0.316,0.402,127.895,81.295,209.19,0.378,209.569
0,0,8135.211,0.37,0.49,149.827,95.401,245.228,0.525,245.753
0,5,8202.758,0.299,0.378,83.997,93.829,177.826,0.433,178.259
0,2,8236.206,0.419,0.527,47.407,97.117,144.525,0.519,145.044
0,6,8306.259,0.336,0.413,3.622,81.754,85.377,3.954,89.331
0,9,8271.247,0.468,1.138,48.801,82.285,131.086,5.775,136.861
0,7,8343.45,0.445,0.55,7.533,83.535,91.069,12.373,103.442
0,1,8302.377,0.352,0.429,54.306,89.95,144.257,1.044,145.301
0,8,8276.825,0.397,0.494,104.45,87.657,192.107,1.003,193.111
0,3,8273.295,0.582,0.657,107.827,88.457,196.284,0.432,196.717
0,4,8326.967,0.382,0.454,55.066,88.862,143.928,3.529,147.457
0,9,8408.118,0.387,0.47,10.387,81.323,91.711,2.096,93.808
0,5,8381.02,0.737,0.809,72.154,82.173,154.327,2.08,156.408
0,6,8395.599,0.31,0.381,60.746,88.193,148.94,0.223,149.163
0,1,8447.686,0.287,0.348,15.042,82.895,97.937,3.174,101.111
0,0,8380.969,0.55,0.685,84.005,88.633,172.638,1.193,173.831
0,4,8474.432,0.295,0.375,10.992,87.808,98.8,15.063,113.864
0,8,8469.946,0.996,1.127,55.763,87.871,143.635,0.35,143.985
0,0,8554.808,0.306,0.389,4.062,97.274,101.336,1.629,102.966
0,9,8501.936,0.364,0.441,57.994,97.65,155.644,0.333,155.977
0,5,8537.438,0.409,0.487,24.686,95.581,120.268,0.765,121.034
0,7,8446.903,0.418,0.538,166.93,82.688,249.618,12.816,262.434
0,3,8470.014,1.107,1.204,144.07,95.186,239.257,0.458,239.715
0,1,8548.805,0.291,0.366,65.599,95.008,160.607,1.759,162.367
0,2,8381.252,0.64,0.703,232.706,95.11,327.816,2.124,329.941
0,4,8588.308,0.451,0.53,47.676,81.686,129.363,19.95,149.313
0,6,8544.77,0.425,0.514,94.256,98.361,192.617,1.175,193.793
0,8,8613.935,0.482,0.648,66.74,79.822,146.562,13.637,160.199
0,5,8658.478,0.364,0.461,23.727,91.555,115.283,0.678,115.961
0,0,8657.783,0.359,0.437,29.469,86.909,116.378,1.615,117.994
0,9,8657.92,0.434,0.494,52.377,80.121,132.499,2.162,134.661
0,7,8709.341,1.143,1.286,2.176,84.412,86.589,18.531,105.121
0,0,8775.784,0.34,0.447,2.582,677.582,680.165,1.972,682.138
0,4,8737.632,0.477,0.553,40.936,679.191,720.127,46.877,767.005
0,1,8711.177,0.458,0.532,46.203,746.914,793.118,0.676,793.795
0,2,8711.197,0.549,0.614,36.637,756.865,793.503,0.62,794.123
0,3,8709.732,0.968,1.401,729.574,148.167,877.741,1.855,879.597
0,9,8792.592,0.382,0.461,647.063,212.999,860.063,2.327,862.391
0,5,8774.449,0.442,0.497,665.322,278.888,944.21,1.71,945.921
0,8,8774.139,0.542,0.675,666.023,348.013,1014.037,3.225,1017.262
0,7,8814.472,0.42,0.499,625.747,350.894,976.641,1.077,977.719
0,3,9589.338,0.74,0.84,52.156,212.561,264.717,1.988,266.706
0,1,9504.98,0.395,0.478,199.746,152.4,352.146,1.436,353.583
0,2,9505.326,0.369,0.408,200.027,212.787,412.815,0.346,413.162
0,5,9720.381,0.408,0.468,50.974,150.027,201.002,0.889,201.892
0,9,9654.994,0.436,0.496,119.325,206.595,325.92,1.9,327.82
0,7,9792.196,0.259,0.853,45.479,147.983,193.463,1.292,194.756
0,8,9791.412,0.416,0.474,47.556,209.663,257.22,1.399,258.62
0,1,9858.571,0.332,0.388,47.169,146.521,193.691,1.358,195.049
0,6,8738.566,0.293,0.349,1167.354,156.58,1323.935,0.934,1324.869
0,5,9922.281,0.382,0.438,49.221,145.247,194.469,1.392,195.862
0,7,9986.962,0.364,0.42,47.021,150.528,197.549,1.334,198.884
0,0,9457.939,0.316,0.395,578.457,150.278,728.735,1.254,729.99
0,9,9982.825,0.43,0.5,64.168,199.563,263.731,0.345,264.077
0,3,9856.054,0.416,0.472,247.039,147.388,394.428,1.72,396.148
0,4,9504.641,0.548,0.619,664.554,141.019,805.573,1.417,806.991
0,2,9918.499,0.404,0.459,250.86,142.241,393.101,1.155,394.257
1 A B C D E F G H I J
2 0 0 0.5 217.371 217.658 218.002 269.445 487.447 2.106 489.554
3 0 0 490.077 0.657 0.84 1.588 121.092 122.681 2.185 124.867
4 0 9 490.077 1.602 1.676 1.977 184.155 186.132 1.198 187.331
5 0 6 490.384 1.787 1.962 2.451 270.592 273.044 4.158 277.202
6 0 5 491.125 0.693 0.877 1.9 295.589 297.49 19.456 316.946
7 0 8 491.348 1.833 1.924 66.432 250.035 316.467 2.379 318.847
8 0 0 614.955 0.455 0.507 8.554 229.261 237.815 15.761 253.577
9 0 9 677.418 0.493 0.546 14.288 176.628 190.917 6.522 197.44
10 0 3 491.864 1.034 1.109 250.552 132.254 382.806 2.485 385.291
11 0 2 491.351 1.763 1.807 276.239 122.283 398.523 26.436 424.96
12 0 4 490.154 1.867 1.935 341.544 86.243 427.787 15.659 443.447
13 0 8 810.203 0.381 0.453 21.4 101.836 123.236 9.01 132.246
14 0 6 767.595 0.54 0.592 68.928 105.705 174.633 0.93 175.564
15 0 0 868.54 0.384 0.483 8.721 82.83 91.552 37.154 128.706
16 0 9 874.866 0.472 0.574 41.728 80.617 122.345 11.14 133.486
17 0 1 490.757 2.284 2.336 426.145 91.084 517.229 0.507 517.736
18 0 7 490.755 1.652 1.816 426.521 90.913 517.435 2.244 519.679
19 0 6 943.165 0.324 0.391 2.676 116.421 119.098 0.452 119.551
20 0 2 916.32 0.609 0.884 81.097 83.55 164.647 1.342 165.989
21 0 8 942.462 0.374 0.464 55.682 84.915 140.597 46.844 187.442
22 0 4 933.61 0.377 0.451 64.784 131.147 195.932 9.997 205.929
23 0 5 808.083 0.565 0.641 190.27 140.808 331.078 0.465 331.543
24 0 3 877.165 0.47 0.546 121.153 141.078 262.231 2.558 264.789
25 0 7 1010.442 0.372 0.441 2.201 129.116 131.318 7.148 138.467
26 0 6 1062.725 0.483 0.581 6.402 80.848 87.251 45.416 132.668
27 0 1 1008.502 1.579 1.706 65.348 121.324 186.672 1.251 187.924
28 0 0 997.256 0.402 0.832 76.472 121.367 197.839 18.513 216.353
29 0 9 1008.364 1.428 1.582 70.936 133.941 204.878 2.255 207.133
30 0 8 1129.916 0.458 0.551 19.07 113.216 132.287 0.38 132.667
31 0 4 1139.547 0.388 0.457 9.775 113.036 122.812 1.531 124.343
32 0 2 1082.318 0.352 0.43 67.775 112.768 180.543 22.578 203.122
33 0 5 1139.629 0.416 0.466 10.429 135.269 145.699 2.425 148.124
34 0 3 1141.962 0.394 0.472 53.375 92.295 145.67 0.212 145.883
35 0 0 1213.618 0.408 0.481 2.655 112.525 115.18 0.547 115.728
36 0 9 1215.504 0.427 0.672 2.233 111.382 113.615 1.145 114.761
37 0 6 1195.403 0.437 0.511 25.098 109.564 134.662 22.852 157.515
38 0 7 1148.919 0.486 1.021 138.981 91.884 230.865 16.504 247.369
39 0 4 1263.894 0.711 0.788 33.761 98.396 132.158 0.671 132.83
40 0 1 1196.433 0.301 0.364 100.757 99.252 200.01 1.116 201.126
41 0 8 1262.594 0.964 1.248 66.394 96.747 163.141 1.173 164.315
42 0 2 1285.445 0.209 0.254 43.808 97.338 141.146 0.548 141.694
43 0 9 1330.271 0.288 0.355 35.329 84.511 119.84 16.98 136.821
44 0 6 1352.928 0.474 0.579 12.904 100.981 113.886 0.517 114.403
45 0 0 1329.353 0.294 0.366 36.781 100.857 137.638 0.532 138.171
46 0 2 1427.143 0.532 0.58 9.336 79.756 89.093 1.239 90.332
47 0 4 1396.736 0.503 0.592 44.925 80.622 125.548 10.972 136.52
48 0 8 1426.921 0.631 0.71 15.906 90.068 105.975 1.38 107.356
49 0 5 1287.759 0.278 0.316 181.454 80.529 261.984 10.774 272.759
50 0 1 1397.566 0.268 0.324 99.635 82.55 182.186 8.445 190.632
51 0 0 1467.53 1.354 1.536 33.298 87.09 120.388 0.517 120.905
52 0 7 1396.3 0.593 0.684 104.729 87.108 191.838 1.133 192.971
53 0 9 1467.103 1.422 1.546 42.719 82.771 125.491 9.398 134.89
54 0 3 1287.85 0.245 0.272 248.437 79.849 328.286 9.318 337.605
55 0 6 1467.339 0.933 1.132 69.074 88.797 157.871 0.891 158.762
56 0 4 1533.267 0.449 0.548 42.003 81.379 123.383 9.108 132.491
57 0 2 1517.483 0.32 0.399 56.455 91.585 148.04 0.44 148.48
58 0 8 1534.284 0.425 0.48 39.738 91.427 131.166 1.247 132.413
59 0 5 1560.528 0.396 0.499 19.318 86.69 106.008 1.54 107.548
60 0 6 1626.109 0.34 0.43 6.88 82.575 89.455 0.568 90.023
61 0 1 1588.231 0.451 0.541 44.902 84.635 129.537 24.285 153.823
62 0 7 1589.279 0.288 0.352 57.597 94.892 152.489 0.555 153.044
63 0 9 1602.002 0.424 0.68 45.095 94.862 139.957 0.797 140.755
64 0 5 1668.084 0.29 0.351 29.143 84.196 113.34 26.201 139.542
65 0 4 1665.766 0.373 0.457 34.457 107.029 141.486 0.715 142.201
66 0 2 1665.971 0.303 0.375 47.175 94.572 141.748 0.861 142.609
67 0 0 1588.445 0.517 0.625 154.081 80.415 234.496 7.112 241.608
68 0 3 1625.463 0.647 0.751 143.666 83.075 226.742 21.951 248.694
69 0 7 1742.325 0.53 0.624 25.438 84.393 109.831 22.061 131.893
70 0 1 1742.079 0.555 0.659 34.769 97.152 131.921 0.364 132.286
71 0 8 1666.705 0.883 1.046 113.237 94.162 207.4 1.118 208.519
72 0 2 1808.586 0.3 0.362 21.568 78.537 100.106 1.979 102.085
73 0 0 1830.064 0.405 0.481 7.114 81.532 88.647 2.392 91.04
74 0 6 1716.143 0.49 0.557 121.371 87.089 208.46 14.395 222.856
75 0 5 1807.634 0.442 0.527 36.463 94.602 131.065 1.369 132.434
76 0 8 1875.228 0.164 0.198 3.582 79.597 83.179 1.504 84.684
77 0 1 1874.367 0.562 0.645 28.304 79.054 107.358 0.456 107.815
78 0 4 1807.975 0.4 0.482 99.4 81.109 180.509 1.133 181.643
79 0 9 1742.773 0.339 0.39 168.948 80.077 249.025 2.367 251.393
80 0 3 1874.166 0.495 0.593 38.988 84.602 123.59 7.982 131.572
81 0 8 1959.921 0.415 0.494 9.861 82.855 92.717 2.765 95.483
82 0 2 1910.682 0.995 1.109 69.161 85.346 154.507 1.625 156.133
83 0 0 1921.114 0.394 0.473 92.984 80.599 173.584 1.153 174.738
84 0 3 2005.748 0.476 0.556 7.441 83.841 91.283 1.422 92.705
85 0 5 1940.076 0.325 0.401 73.91 84.342 158.253 1.718 159.972
86 0 7 1874.22 0.557 0.642 140.027 91.031 231.059 1.754 232.814
87 0 6 1939.008 0.377 0.455 95.473 81.569 177.042 1.072 178.115
88 0 4 1989.626 0.314 0.388 51.23 81.724 132.955 11.694 144.65
89 0 9 1994.183 0.321 0.394 57.158 82.743 139.902 0.758 140.66
90 0 2 2066.819 0.204 0.259 13.808 84.448 98.256 1.366 99.623
91 0 1 1982.189 0.295 0.368 99.448 85.395 184.843 1.56 186.403
92 0 8 2055.408 0.203 0.253 51.567 82.101 133.668 1.073 134.741
93 0 9 2134.846 0.25 0.306 16.106 85.649 101.755 0.176 101.931
94 0 1 2168.598 0.229 0.302 6.826 81.481 88.307 1.143 89.45
95 0 4 2134.304 0.373 0.492 45.962 81.137 127.099 0.549 127.648
96 0 7 2107.039 0.483 0.555 73.813 81.641 155.455 1.562 157.017
97 0 6 2117.128 0.208 0.255 63.776 83.028 146.805 1.656 148.461
98 0 8 2190.154 0.225 0.285 29.098 80.996 110.094 1.344 111.439
99 0 9 2236.784 0.256 0.32 4.01 82.88 86.89 2.12 89.011
100 0 2 2166.449 0.317 0.395 80.763 84.208 164.971 2.32 167.291
101 0 5 2100.052 0.294 0.365 146.743 86.973 233.716 0.672 234.389
102 0 3 2098.458 0.241 0.3 150.5 84.733 235.234 1.292 236.526
103 0 0 2095.857 0.215 0.271 153.005 85.917 238.923 0.534 239.458
104 0 6 2265.593 0.182 0.218 20.159 80.738 100.897 1.449 102.347
105 0 4 2261.957 0.207 0.256 42.386 82.309 124.696 1.433 126.13
106 0 7 2264.061 0.243 0.288 51.339 80.631 131.97 0.973 132.943
107 0 8 2301.604 0.391 0.474 24.05 81.886 105.937 1.805 107.743
108 0 1 2258.053 0.206 0.26 93.644 81.876 175.52 1.331 176.852
109 0 0 2335.321 0.204 0.245 21.603 81.849 103.452 0.941 104.394
110 0 6 2367.949 0.434 0.515 6.274 83.161 89.435 4.495 93.931
111 0 3 2334.991 0.332 0.403 58.507 88.463 146.971 1.116 148.088
112 0 8 2409.356 0.385 0.463 13.78 83.24 97.02 0.344 97.364
113 0 5 2334.448 0.364 0.451 106.034 82.488 188.523 1.39 189.914
114 0 9 2325.809 0.429 0.506 114.736 84.279 199.015 1.209 200.225
115 0 2 2333.745 0.423 0.517 106.853 85.698 192.551 1.745 194.296
116 0 4 2388.097 0.399 0.498 67.532 84.096 151.628 0.599 152.228
117 0 3 2483.086 0.35 0.427 19.21 81.612 100.822 3.51 104.333
118 0 1 2434.913 0.435 0.577 86.727 83.002 169.729 1.902 171.632
119 0 7 2397.012 0.331 0.416 142.874 80.866 223.74 1.672 225.413
120 0 6 2461.891 0.36 0.441 78.194 82.238 160.433 0.613 161.046
121 0 9 2526.038 0.665 0.74 32.614 86.809 119.423 1.275 120.699
122 0 4 2540.332 0.326 0.387 42.093 80.618 122.711 2.268 124.979
123 0 8 2506.727 0.378 0.456 99.838 79.225 179.064 0.294 179.358
124 0 6 2622.939 0.33 0.385 1.186 81.73 82.917 2.248 85.165
125 0 3 2587.429 0.61 0.72 59.939 82.437 142.376 0.97 143.346
126 0 1 2606.549 0.391 0.459 40.636 83.436 124.072 2.096 126.169
127 0 7 2622.432 0.383 0.463 30.735 80.765 111.501 0.733 112.234
128 0 2 2528.046 0.199 0.244 128.905 85.696 214.602 0.334 214.936
129 0 4 2665.318 0.312 0.399 26.866 81.414 108.281 0.222 108.504
130 0 5 2524.369 0.329 0.413 167.907 84.934 252.841 1.305 254.147
131 0 8 2686.096 0.401 0.494 7.747 85.181 92.928 2.125 95.053
132 0 0 2439.722 0.357 0.696 254.259 89.099 343.358 2.809 346.167
133 0 9 2646.75 0.681 0.799 73.064 84.639 157.704 3.532 161.236
134 0 6 2708.115 0.4 0.481 14.501 86.758 101.259 0.934 102.194
135 0 3 2730.783 0.303 0.377 35.013 88.845 123.858 1.666 125.524
136 0 1 2732.726 0.318 0.414 53.138 78.873 132.011 0.237 132.249
137 0 0 2785.893 0.375 0.447 25.451 83.295 108.746 4.165 112.911
138 0 9 2807.993 0.31 0.384 35.981 91.657 127.639 0.466 128.106
139 0 2 2742.992 0.403 0.56 101.119 91.707 192.827 5.458 198.285
140 0 8 2781.157 0.365 0.446 70.781 90.886 161.667 0.817 162.484
141 0 1 2864.982 0.311 0.402 19.474 86.691 106.165 3.435 109.601
142 0 3 2856.319 0.429 0.493 54.672 82.88 137.553 0.33 137.884
143 0 5 2778.523 0.309 0.392 132.818 84.58 217.399 1.527 218.927
144 0 0 2898.815 0.362 0.463 12.416 86.002 98.418 1.107 99.525
145 0 7 2734.674 0.744 0.873 195.477 83.728 279.205 7.848 287.053
146 0 4 2773.831 0.339 0.428 156.128 91.457 247.585 1.311 248.897
147 0 6 2810.317 0.339 0.432 125.657 102.335 227.993 2.034 230.027
148 0 2 2941.285 0.294 0.367 38.02 79.84 117.86 1.696 119.556
149 0 8 2943.648 0.293 0.373 38.288 79.728 118.016 2.042 120.058
150 0 9 2936.108 0.466 0.563 63.933 82.084 146.017 1.602 147.619
151 0 4 3022.735 0.269 0.339 3.697 87.616 91.313 0.516 91.83
152 0 3 2994.213 0.418 0.495 42.946 81.806 124.752 0.29 125.043
153 0 1 2974.591 0.641 0.762 72.809 81.187 153.997 1.512 155.51
154 0 9 3083.737 0.352 0.425 15.144 84.807 99.951 1.383 101.335
155 0 6 3040.353 0.399 0.48 61.605 83.294 144.899 9.906 154.806
156 0 2 3060.852 0.407 0.487 40.928 92.521 133.449 0.893 134.342
157 0 0 2998.348 0.336 0.417 115.561 82.329 197.89 2.808 200.698
158 0 8 3063.714 0.314 0.391 50.53 84.619 135.15 28.56 163.71
159 0 1 3130.111 0.381 0.484 36.604 82.182 118.787 1.306 120.094
160 0 5 2997.458 0.349 0.427 169.477 83.501 252.978 2.447 255.425
161 0 7 3021.738 0.425 0.518 148.774 83.974 232.748 0.411 233.16
162 0 3 3119.263 0.315 0.392 50.462 85 135.463 4.92 140.383
163 0 4 3114.576 0.397 0.465 66.492 81.543 148.035 1.216 149.251
164 0 9 3185.086 0.49 0.563 0.843 79.106 79.95 28.271 108.222
165 0 6 3195.164 0.659 0.878 41.861 81.999 123.86 0.305 124.166
166 0 8 3227.436 0.588 0.685 13.471 80.559 94.03 0.675 94.705
167 0 0 3199.056 0.344 0.417 55.856 81.147 137.003 2.313 139.317
168 0 2 3195.197 0.89 0.993 59.866 83.95 143.817 2.518 146.336
169 0 1 3250.212 0.555 0.641 53.457 80.43 133.887 1.541 135.428
170 0 5 3252.89 0.347 0.424 55.768 81.876 137.644 2.326 139.971
171 0 9 3293.317 0.516 0.622 39.115 78.826 117.941 1.674 119.615
172 0 2 3341.541 0.379 0.456 26.056 81.181 107.238 1.453 108.691
173 0 4 3263.836 0.304 0.385 109.176 79.223 188.399 1.336 189.736
174 0 6 3319.341 0.424 0.509 52.086 83.572 135.658 1.93 137.589
175 0 3 3259.654 0.318 0.4 115.781 84.483 200.264 2.851 203.116
176 0 9 3412.942 0.36 0.432 19.904 83.186 103.091 0.294 103.386
177 0 5 3392.869 0.364 0.438 46.674 81.708 128.382 2.336 130.718
178 0 7 3254.902 0.434 0.504 184.8 83.725 268.526 1.536 270.063
179 0 0 3338.38 0.334 0.412 104.769 84.635 189.405 0.579 189.984
180 0 8 3322.15 0.363 0.429 120.337 85.709 206.047 1.064 207.111
181 0 3 3462.777 0.285 0.363 32.857 78.802 111.659 3.064 114.724
182 0 2 3450.24 0.329 0.416 53.507 82.338 135.845 0.291 136.137
183 0 1 3385.654 0.404 0.479 125.574 82.017 207.591 1.116 208.708
184 0 6 3456.937 0.306 0.374 58.496 80.921 139.418 1.87 141.288
185 0 4 3453.579 0.31 0.387 61.685 82.969 144.655 1.418 146.073
186 0 8 3529.268 0.324 0.408 31.325 78.86 110.186 1.213 111.4
187 0 5 3523.596 0.334 0.417 39.494 83.382 122.877 0.347 123.225
188 0 7 3524.971 0.36 0.472 47.432 80.801 128.234 0.953 129.187
189 0 4 3599.659 0.319 0.398 27.195 80.69 107.885 1.895 109.781
190 0 3 3577.512 0.571 0.652 51.889 82.948 134.837 1.141 135.979
191 0 1 3594.371 0.341 0.422 42.685 81.099 123.785 1.473 125.259
192 0 7 3654.167 0.306 0.383 15.528 81.986 97.515 2.405 99.92
193 0 9 3516.338 0.397 0.472 178.897 79.745 258.642 2.238 260.881
194 0 2 3586.389 1.185 1.333 109.11 81.551 190.661 2.03 192.692
195 0 5 3646.833 0.424 0.488 56.484 81.305 137.789 1.209 138.999
196 0 0 3528.372 0.397 0.487 176.378 80.819 257.198 0.746 257.944
197 0 6 3598.234 0.336 0.428 102.676 85.142 187.818 1.845 189.664
198 0 8 3640.677 0.476 0.58 83.915 81.6 165.515 12.681 178.196
199 0 4 3709.449 0.415 0.495 25.988 83.141 109.13 1.996 111.126
200 0 3 3713.499 0.322 0.402 55.534 81.807 137.341 0.906 138.248
201 0 0 3786.324 0.919 1.147 3.983 80.348 84.331 1.885 86.217
202 0 7 3754.097 0.438 0.543 36.421 81.782 118.204 1.217 119.421
203 0 9 3777.227 0.339 0.419 18.041 81.599 99.641 2.512 102.154
204 0 1 3719.638 0.353 0.419 112.793 82.398 195.191 1.433 196.624
205 0 4 3820.583 0.299 0.38 14.112 83.485 97.598 1.551 99.149
206 0 6 3787.905 0.358 0.44 49.391 82.265 131.656 1.218 132.874
207 0 2 3779.087 0.323 0.402 81.512 79.373 160.885 3.793 164.679
208 0 5 3785.843 1.116 1.253 82.986 77.901 160.888 1.176 162.064
209 0 8 3818.882 0.383 0.46 80.581 80.539 161.121 2.24 163.361
210 0 9 3879.424 0.314 0.394 21.002 81.687 102.689 1.579 104.268
211 0 6 3920.787 0.287 0.38 3.32 80.808 84.129 2.54 86.669
212 0 7 3873.527 0.371 0.436 60.962 79.343 140.305 1.693 141.998
213 0 5 3947.917 0.324 0.401 18.55 86.417 104.968 1.132 106.101
214 0 3 3851.755 0.345 0.42 114.969 87.007 201.977 0.317 202.294
215 0 9 3983.709 0.467 0.534 6.466 81.73 88.196 0.443 88.64
216 0 8 3982.255 0.767 0.998 14.279 81.449 95.729 1.705 97.435
217 0 4 3919.74 0.346 0.424 85.31 79.932 165.243 0.644 165.887
218 0 7 4015.534 0.333 0.409 17.541 80.366 97.907 1.668 99.575
219 0 1 3916.272 0.432 0.512 128.903 84.8 213.703 2.03 215.733
220 0 0 3872.552 0.463 0.605 190.345 81.085 271.43 2.323 273.754
221 0 2 3943.776 0.456 0.565 124.062 79.417 203.479 2.947 206.427
222 0 5 4054.025 0.473 0.519 16.707 81.618 98.325 2.546 100.872
223 0 4 4085.637 0.444 0.528 14.533 83.168 97.701 1.309 99.01
224 0 7 4115.136 0.466 0.563 10.979 80.789 91.768 1.994 93.762
225 0 9 4072.356 0.332 0.411 61.405 81.35 142.756 1.96 144.716
226 0 6 4007.465 0.323 0.404 173.194 81.587 254.782 1.562 256.344
227 0 0 4146.315 0.415 0.495 47.446 82.791 130.237 1.332 131.569
228 0 3 4054.052 0.334 0.407 140.693 83.369 224.063 5.103 229.166
229 0 8 4079.697 0.352 0.431 114.177 84.118 198.295 7.426 205.722
230 0 4 4184.657 0.346 0.42 13.748 86.813 100.561 0.308 100.869
231 0 2 4150.211 0.297 0.391 50.058 85.067 135.125 2.111 137.237
232 0 9 4217.079 0.289 0.372 15.913 78.546 94.459 1.492 95.952
233 0 7 4208.903 0.592 0.799 46.416 79.377 125.794 1.363 127.157
234 0 5 4154.904 0.378 0.458 105.65 86.733 192.384 0.306 192.69
235 0 1 4132.012 0.351 0.423 128.658 87.255 215.914 1.377 217.291
236 0 6 4263.817 0.316 0.392 7.054 80.022 87.076 2.867 89.944
237 0 2 4287.456 0.418 0.519 13.658 77.869 91.528 1.837 93.365
238 0 8 4285.427 0.371 0.448 46.607 81.282 127.89 1.193 129.083
239 0 6 4353.769 0.428 0.512 12.728 83.385 96.114 1.372 97.486
240 0 9 4313.041 0.452 0.544 65.025 81.466 146.492 1.454 147.947
241 0 7 4336.069 0.547 0.631 62.669 80.678 143.347 1.741 145.089
242 0 4 4285.532 0.421 0.489 126.035 80.128 206.164 1.865 208.029
243 0 1 4349.311 0.344 0.419 83.199 81.257 164.457 2.457 166.915
244 0 5 4347.602 0.336 0.415 84.785 84.577 169.362 0.205 169.568
245 0 3 4283.225 0.311 0.39 165.412 81.631 247.043 2.736 249.779
246 0 6 4451.266 0.349 0.435 16.483 81.492 97.976 1.693 99.669
247 0 2 4380.832 0.957 1.096 87.309 82.649 169.959 1.588 171.547
248 0 8 4414.518 0.362 0.479 53.482 84.438 137.92 1.534 139.454
249 0 0 4277.9 0.615 0.698 190.489 85.361 275.85 1.139 276.99
250 0 4 4493.572 0.353 0.433 5.668 79.869 85.538 1.985 87.523
251 0 9 4460.995 0.297 0.379 72.698 82.185 154.884 1.312 156.196
252 0 7 4481.166 0.353 0.43 52.934 82.767 135.702 0.9 136.602
253 0 1 4516.236 0.426 0.513 21.016 82.575 103.591 1.242 104.834
254 0 0 4554.897 0.284 0.36 14.035 80.027 94.063 0.644 94.708
255 0 2 4552.387 0.34 0.416 49.053 82.256 131.309 1.498 132.807
256 0 6 4550.944 0.374 0.452 58.083 82.241 140.324 0.226 140.55
257 0 5 4517.178 0.287 0.348 92.038 83.638 175.677 2.136 177.813
258 0 3 4533.015 0.387 0.482 81.677 80.321 161.999 0.881 162.88
259 0 8 4553.982 0.403 0.5 92.788 79.698 172.487 2.855 175.343
260 0 0 4649.615 0.455 0.528 19.45 84.334 103.785 1.69 105.475
261 0 4 4581.108 0.727 0.888 88.144 85.538 173.683 0.515 174.198
262 0 7 4617.775 0.309 0.38 57.266 80.933 138.2 1.523 139.723
263 0 9 4617.201 0.408 0.513 79.382 81.334 160.716 0.872 161.589
264 0 1 4621.077 0.313 0.394 79.38 80.484 159.864 1.538 161.403
265 0 5 4695 0.323 0.398 26.916 80.04 106.957 1.254 108.212
266 0 8 4729.336 0.417 0.504 8.58 81.443 90.024 1.481 91.506
267 0 6 4691.503 0.315 0.393 52.131 81.54 133.672 1.764 135.436
268 0 7 4757.506 0.336 0.402 8.604 82.634 91.239 2.208 93.447
269 0 3 4695.901 0.364 0.612 110.355 79.703 190.059 2.086 192.145
270 0 4 4755.316 0.387 0.444 71.444 80.424 151.868 1.02 152.889
271 0 1 4782.487 0.804 0.913 71.209 80.168 151.377 1.373 152.751
272 0 2 4685.202 0.318 0.395 168.695 81.247 249.943 1.572 251.515
273 0 0 4755.102 0.475 0.548 109.227 80.705 189.933 0.478 190.411
274 0 7 4850.962 0.47 0.583 25.01 82.997 108.007 1.157 109.164
275 0 5 4803.219 0.334 0.445 72.976 85.095 158.071 1.135 159.207
276 0 9 4778.799 0.486 0.589 120.634 80.375 201.009 1.331 202.341
277 0 4 4908.214 0.415 0.488 15.698 82.28 97.979 1.139 99.118
278 0 6 4826.949 0.393 0.479 97.059 83.146 180.206 1.672 181.879
279 0 8 4820.854 0.484 0.577 109.039 81.594 190.634 0.318 190.953
280 0 2 4936.725 0.354 0.431 6.303 83.521 89.824 1.867 91.692
281 0 3 4888.057 0.498 0.577 71.038 81.397 152.435 0.342 152.777
282 0 5 4962.434 0.279 0.331 14.723 82.679 97.402 0.279 97.682
283 0 7 4960.133 0.327 0.397 44.946 83.613 128.56 0.245 128.805
284 0 3 5040.845 0.439 0.546 14.402 85.033 99.435 2.166 101.602
285 0 8 5011.814 0.411 0.481 59.326 83.914 143.24 1.398 144.639
286 0 2 5028.425 0.366 0.446 42.929 84.889 127.819 0.305 128.124
287 0 0 4945.521 0.346 0.418 150.986 80.727 231.713 2.023 233.737
288 0 9 4981.151 0.45 0.557 115.5 82.904 198.405 2.823 201.228
289 0 5 5060.124 0.398 0.501 64.278 83.236 147.514 2.355 149.869
290 0 6 5008.836 0.28 0.353 115.728 85.538 201.267 0.603 201.871
291 0 1 4935.247 0.379 0.458 189.72 85.303 275.023 0.465 275.488
292 0 4 5007.34 0.542 0.741 117.463 85.645 203.108 2.146 205.255
293 0 7 5088.946 0.313 0.394 49.444 81.597 131.042 1.646 132.688
294 0 3 5142.457 0.399 0.478 5.147 81.287 86.435 0.881 87.317
295 0 2 5156.557 0.291 0.362 5.203 81.382 86.585 1.92 88.505
296 0 8 5156.462 0.521 0.69 19.219 80.308 99.528 1.821 101.349
297 0 9 5182.387 0.32 0.399 23.899 80.953 104.852 1.121 105.973
298 0 7 5221.642 0.307 0.391 5.745 81.815 87.561 1.817 89.378
299 0 0 5179.266 0.363 0.443 49.741 84.892 134.633 2.054 136.688
300 0 5 5210.018 0.568 0.643 61.334 81.577 142.911 1.418 144.33
301 0 3 5229.782 0.339 0.44 49.632 85.029 134.661 1.34 136.002
302 0 1 5210.738 0.792 1.471 86.688 81.747 168.435 0.87 169.305
303 0 9 5288.37 0.428 0.512 5.724 86.497 92.221 2.111 94.333
304 0 2 5245.07 0.351 0.431 61.536 81.418 142.954 1.728 144.682
305 0 0 5315.961 0.382 0.447 20.382 79.869 100.252 1.409 101.661
306 0 8 5257.815 0.423 0.49 92.566 80.892 173.459 1.496 174.955
307 0 7 5311.029 0.435 0.516 52.528 81.313 133.841 1.413 135.255
308 0 6 5210.712 1.532 1.63 151.833 85.155 236.989 1.118 238.107
309 0 3 5365.791 0.299 0.377 50.784 81.585 132.369 1.452 133.822
310 0 2 5389.757 0.474 0.554 26.667 82.959 109.627 1.814 111.441
311 0 0 5417.631 0.784 0.907 8.897 81.026 89.924 1.412 91.336
312 0 4 5212.602 0.386 0.447 217.003 82.217 299.221 1.166 300.387
313 0 9 5382.712 0.311 0.389 75.127 83.211 158.339 1.983 160.323
314 0 5 5354.356 0.305 0.39 112.1 80.95 193.05 1.376 194.427
315 0 7 5446.296 0.356 0.432 36.105 80.157 116.262 0.92 117.183
316 0 1 5380.053 0.405 0.494 111.048 85.12 196.168 1.345 197.514
317 0 6 5448.827 0.315 0.388 42.469 86.109 128.578 0.571 129.149
318 0 8 5432.778 0.329 0.409 64.109 83.938 148.048 0.344 148.393
319 0 4 5512.997 0.298 0.374 12.336 81.353 93.69 2.014 95.704
320 0 3 5499.624 0.486 0.595 59.894 82.285 142.179 1.619 143.799
321 0 5 5548.792 0.428 0.535 10.625 83.853 94.479 1.992 96.472
322 0 2 5501.208 0.575 0.684 90.412 78.346 168.759 0.685 169.444
323 0 4 5608.705 0.558 0.815 8.557 78.683 87.24 1.117 88.358
324 0 1 5577.576 0.426 0.513 55.869 79.618 135.487 1.607 137.095
325 0 0 5508.975 0.328 0.404 126.867 81.307 208.175 1.943 210.118
326 0 9 5543.047 0.36 0.436 90.905 85.163 176.069 2.65 178.719
327 0 2 5670.662 0.41 0.496 11.867 80.168 92.035 2.243 94.278
328 0 7 5563.487 0.303 0.384 127.359 84.02 211.379 1.073 212.452
329 0 6 5577.982 0.339 0.414 117.634 83.729 201.363 0.301 201.665
330 0 5 5645.292 0.373 0.455 50.568 84.436 135.005 1.355 136.36
331 0 4 5697.074 0.417 0.514 14.751 79.581 94.332 2.424 96.757
332 0 3 5643.43 0.367 0.462 102.833 81.493 184.327 2.916 187.244
333 0 0 5719.101 0.348 0.427 42.935 78.555 121.491 1.886 123.377
334 0 8 5581.178 0.307 0.381 181.001 83.057 264.059 1.295 265.354
335 0 9 5721.773 0.324 0.406 46.37 81.578 127.949 1.29 129.239
336 0 2 5764.95 0.399 0.477 28.761 79.071 107.832 2.316 110.149
337 0 1 5714.679 0.318 0.404 98.197 82.491 180.689 1.885 182.574
338 0 4 5793.839 0.314 0.382 30.597 81.38 111.978 1.234 113.212
339 0 7 5775.948 0.332 0.413 51.577 84.088 135.665 0.377 136.043
340 0 3 5830.686 0.955 1.072 11.735 81.606 93.341 1.701 95.043
341 0 9 5851.02 0.333 0.414 18.739 81.701 100.441 1.33 101.771
342 0 2 5875.109 0.396 0.478 15.164 81.893 97.058 1.217 98.275
343 0 5 5781.659 0.318 0.386 119.27 83.15 202.42 0.376 202.797
344 0 7 5911.998 0.339 0.418 11.726 82.093 93.82 1.495 95.315
345 0 3 5925.738 0.447 0.516 21.925 79.87 101.795 0.344 102.14
346 0 0 5842.488 0.338 0.409 124.073 81.734 205.807 2.047 207.855
347 0 6 5779.654 0.326 0.406 188.882 82.945 271.828 0.958 272.786
348 0 1 5897.261 0.301 0.377 74.047 81.4 155.448 0.967 156.415
349 0 8 5846.539 0.337 0.429 140.2 79.976 220.176 2.328 222.505
350 0 9 5952.801 0.344 0.421 54.536 79.755 134.291 1.41 135.702
351 0 7 6007.318 0.522 0.618 14.816 79.956 94.772 16.419 111.192
352 0 2 5973.394 0.518 0.592 60.307 84.753 145.06 0.75 145.81
353 0 5 5984.463 0.449 0.524 50.467 84.478 134.945 1.93 136.876
354 0 4 5907.056 0.402 0.484 129.229 84.9 214.129 1.722 215.851
355 0 3 6027.888 0.42 0.494 39.048 80.015 119.064 1.978 121.042
356 0 0 6050.355 1.316 1.485 29.107 82.111 111.218 1.742 112.96
357 0 1 6053.684 0.311 0.379 47.288 81.844 129.132 1.182 130.315
358 0 6 6052.444 0.503 0.615 67.027 81.05 148.077 1.152 149.229
359 0 5 6121.346 0.337 0.446 23.684 78.068 101.752 2.019 103.772
360 0 8 6069.053 0.397 0.478 79.682 79.537 159.219 1.582 160.802
361 0 9 6088.518 0.344 0.419 65.681 81.3 146.982 13.495 160.477
362 0 7 6118.543 0.547 0.608 50.691 81.862 132.554 0.377 132.931
363 0 3 6148.938 0.351 0.416 38.998 82.443 121.442 10.62 132.062
364 0 1 6184.009 0.625 0.847 30.097 79.57 109.667 2.015 111.682
365 0 4 6122.915 0.478 0.554 133.957 92.839 226.796 1.7 228.497
366 0 2 6119.207 0.42 0.468 136.749 95.595 232.345 3.165 235.51
367 0 5 6225.127 0.307 0.389 30.625 98.714 129.339 0.471 129.811
368 0 8 6229.86 0.669 0.746 51.831 97.397 149.228 1.67 150.898
369 0 6 6201.683 0.393 0.475 85.686 96.242 181.928 5.483 187.412
370 0 9 6249.004 0.394 0.467 68.533 82.42 150.954 0.531 151.485
371 0 0 6163.324 0.47 0.577 154.586 83.082 237.668 12.538 250.207
372 0 7 6251.483 0.329 0.409 71.341 90.405 161.747 0.44 162.188
373 0 3 6281.008 0.413 0.572 45.589 86.798 132.388 1.088 133.476
374 0 1 6295.702 0.418 0.499 51.953 79.591 131.545 1.322 132.867
375 0 4 6351.453 0.526 0.622 1.002 79.648 80.651 2.773 83.424
376 0 2 6354.728 0.554 0.647 34.466 80.677 115.143 0.939 116.083
377 0 5 6354.95 0.507 0.659 65.208 80.513 145.721 4.54 150.262
378 0 6 6389.103 0.371 0.453 31.17 84.714 115.884 0.492 116.376
379 0 0 6413.542 0.446 0.573 10.238 84.236 94.475 0.223 94.699
380 0 1 6428.577 0.312 0.401 27.804 81.855 109.659 1.676 111.336
381 0 7 6413.677 0.485 0.6 45.942 80.918 126.86 2.002 128.863
382 0 2 6470.818 0.322 0.4 18.925 81.521 100.446 0.952 101.399
383 0 4 6434.885 0.367 0.43 63.441 84.026 147.468 2.273 149.741
384 0 0 6508.249 0.291 0.367 14.539 80.234 94.774 2.012 96.787
385 0 9 6400.496 0.321 0.422 124.092 86.419 210.512 2.121 212.633
386 0 6 6505.483 0.332 0.395 50.891 82.623 133.515 2.367 135.883
387 0 5 6505.215 0.47 0.546 66.876 80.667 147.543 1.659 149.202
388 0 2 6572.224 0.316 0.376 17.54 84.437 101.978 0.329 102.308
389 0 4 6584.634 0.383 0.482 15.541 81.204 96.746 1.192 97.939
390 0 9 6613.139 0.441 0.554 10.492 79.826 90.318 1.596 91.915
391 0 7 6542.547 0.337 0.417 113.17 80.125 193.295 1.239 194.535
392 0 0 6605.043 0.334 0.415 57.477 82.496 139.973 1.355 141.329
393 0 3 6414.491 0.775 0.919 247.767 84.12 331.888 2.017 333.905
394 0 8 6380.768 0.437 0.526 281.598 85.832 367.431 0.649 368.081
395 0 5 6654.422 0.74 0.895 7.715 86.517 94.233 1.298 95.531
396 0 1 6539.923 0.391 0.483 149.274 83.239 232.513 2.996 235.509
397 0 4 6682.579 0.336 0.416 6.481 86.19 92.672 10.253 102.925
398 0 6 6641.381 0.317 0.393 59.657 84.226 143.884 0.521 144.405
399 0 9 6705.064 0.411 0.478 19.864 80.4 100.264 1.428 101.693
400 0 2 6674.542 0.419 0.494 53.331 81.556 134.888 1.243 136.131
401 0 7 6737.093 0.433 0.512 18.865 80.421 99.287 0.362 99.649
402 0 8 6748.856 0.377 0.434 17.681 84.385 102.067 0.776 102.843
403 0 6 6785.795 0.516 0.607 9.629 79.503 89.133 2.355 91.488
404 0 5 6749.962 0.412 0.48 73.922 79.8 153.722 1.568 155.291
405 0 0 6746.38 0.315 0.39 110.351 80.636 190.987 1.112 192.1
406 0 7 6836.754 0.55 0.613 24.537 80.93 105.467 2.694 108.162
407 0 8 6851.707 0.33 0.393 20.472 81.812 102.285 1.242 103.527
408 0 6 6877.293 0.396 0.464 12.523 81.162 93.686 1.659 95.345
409 0 4 6785.508 0.589 0.692 115.734 86.656 202.391 0.733 203.124
410 0 1 6775.441 0.33 0.414 130.532 83.319 213.851 1.687 215.538
411 0 9 6806.765 0.34 0.423 99.015 85.013 184.029 3.078 187.108
412 0 3 6748.406 0.486 0.618 174.309 81.219 255.529 4.272 259.801
413 0 5 6905.264 0.568 0.647 23.753 80.364 104.118 0.631 104.749
414 0 8 6955.243 0.326 0.406 2.524 80.645 83.169 0.755 83.925
415 0 0 6938.49 0.461 0.541 27.562 81.761 109.323 1.228 110.552
416 0 2 6810.68 0.93 1.1 197.267 80.838 278.105 1.271 279.376
417 0 7 6944.924 0.37 0.455 63.266 82.346 145.613 1.637 147.251
418 0 4 6988.643 0.466 0.606 34.89 83.461 118.352 3.998 122.35
419 0 3 7008.212 0.533 0.621 66.77 79.833 146.603 1.377 147.98
420 0 0 7049.053 0.377 0.459 25.731 82.163 107.895 1.657 109.553
421 0 6 6972.667 0.354 0.428 119.457 80.472 199.93 0.336 200.266
422 0 7 7092.184 0.337 0.406 4.213 82.36 86.573 1.179 87.752
423 0 9 6993.88 0.439 0.511 110.675 82.611 193.287 1.277 194.564
424 0 1 6990.987 0.309 0.389 131.279 80.628 211.907 1.199 213.107
425 0 8 7039.181 1.011 1.109 91.879 83.571 175.451 1.855 177.306
426 0 2 7090.066 0.356 0.455 51.305 82.594 133.899 1.56 135.459
427 0 4 7111.004 0.415 0.497 30.584 84.877 115.461 1.764 117.225
428 0 5 7010.022 0.464 0.541 141.61 82.79 224.4 2.016 226.417
429 0 0 7158.615 0.364 0.442 4.359 80.082 84.441 1.28 85.722
430 0 6 7172.942 0.521 0.598 26.196 79.661 105.858 1.066 106.924
431 0 3 7156.204 0.42 0.502 53.726 79.747 133.473 1.584 135.058
432 0 1 7204.101 0.331 0.416 26.093 81.632 107.725 2 109.726
433 0 0 7244.345 0.32 0.398 21.466 80.972 102.438 1.166 103.605
434 0 5 7236.446 0.493 0.55 41.039 79.52 120.56 2.102 122.662
435 0 9 7188.454 0.601 0.747 110.165 80.817 190.983 0.996 191.979
436 0 8 7216.494 0.341 0.427 81.98 80.888 162.869 2.197 165.067
437 0 7 7179.945 0.403 0.485 119.842 81.613 201.455 0.476 201.931
438 0 2 7225.536 0.484 0.582 74.136 81.65 155.786 1.136 156.923
439 0 1 7313.837 0.452 0.567 18.595 83.189 101.784 2.503 104.288
440 0 6 7279.875 0.328 0.411 61.184 81.339 142.524 2.233 144.757
441 0 5 7359.116 0.325 0.402 6.764 82.524 89.288 1.53 90.819
442 0 4 7228.237 0.716 0.876 138.937 84.177 223.115 0.301 223.416
443 0 7 7381.883 0.288 0.383 22.346 80.881 103.228 1.238 104.466
444 0 3 7291.272 0.443 0.52 113.137 81.756 194.893 1.745 196.639
445 0 8 7381.568 0.403 0.472 54.796 80.499 135.296 0.451 135.748
446 0 0 7347.958 0.324 0.405 118.366 81.119 199.485 1.507 200.992
447 0 9 7380.444 0.554 0.68 93.055 79.533 172.588 1.514 174.103
448 0 4 7451.66 0.316 0.384 22.329 80.797 103.127 2.351 105.478
449 0 3 7487.919 0.325 0.403 15.077 82.38 97.457 17.729 115.187
450 0 1 7418.133 0.432 0.498 97.07 87.573 184.644 0.619 185.263
451 0 8 7517.326 0.441 0.512 15.017 86.247 101.265 0.225 101.49
452 0 6 7424.648 0.311 0.394 113.912 82.157 196.07 0.29 196.361
453 0 5 7449.946 0.966 1.145 91.384 80.285 171.67 1.546 173.216
454 0 2 7382.465 0.311 0.368 155.965 84.581 240.547 6.505 247.052
455 0 7 7486.358 0.32 0.403 62.472 82.007 144.479 5.539 150.018
456 0 4 7557.146 0.366 0.452 15.698 80.87 96.568 13.833 110.402
457 0 0 7548.957 0.315 0.408 53.927 80.333 134.26 1.998 136.259
458 0 9 7554.554 0.424 0.512 48.698 81.789 130.488 2.084 132.572
459 0 3 7603.119 0.564 0.632 66.287 80.673 146.961 1.472 148.433
460 0 6 7621.016 0.287 0.361 50.611 79.755 130.366 2.06 132.427
461 0 1 7603.404 0.35 0.44 71.549 81.794 153.343 1.394 154.737
462 0 7 7636.385 0.328 0.393 38.377 83.192 121.569 7.821 129.391
463 0 8 7618.824 0.315 0.391 58.371 88.394 146.766 0.268 147.034
464 0 4 7667.559 0.458 0.544 41.885 80.925 122.811 2.257 125.068
465 0 0 7685.224 0.379 0.462 51.5 85.236 136.737 1.835 138.572
466 0 5 7623.17 0.345 0.429 113.716 86.773 200.489 2.099 202.589
467 0 9 7687.135 0.365 0.44 55.114 83.348 138.463 1.93 140.394
468 0 2 7629.525 0.75 0.881 112.85 84.984 197.834 1.481 199.316
469 0 6 7753.451 0.348 0.443 19.425 81.92 101.345 0.235 101.581
470 0 8 7765.861 0.295 0.382 42.989 83.301 126.291 0.309 126.6
471 0 3 7751.56 0.371 0.447 57.895 83.908 141.804 1.772 143.577
472 0 1 7758.148 0.305 0.375 61.756 83.904 145.661 0.303 145.964
473 0 4 7792.635 0.385 0.467 48.907 82.184 131.091 1.903 132.995
474 0 7 7765.787 0.508 0.598 82.233 80.202 162.436 0.937 163.373
475 0 5 7825.768 0.352 0.433 48.817 83.915 132.733 1.856 134.59
476 0 0 7823.804 0.347 0.42 81.14 78.737 159.878 2.87 162.748
477 0 3 7895.144 0.324 0.404 19.162 79.062 98.225 1.353 99.579
478 0 1 7904.124 0.531 0.75 44.278 80.547 124.825 2.869 127.694
479 0 7 7929.169 0.305 0.4 22.345 80.727 103.073 0.274 103.347
480 0 9 7827.535 0.315 0.398 125.914 79.985 205.899 1.407 207.306
481 0 4 7925.637 0.295 0.37 55.306 79.662 134.969 1.413 136.382
482 0 6 7855.04 0.348 0.424 129.077 82.84 211.917 1.083 213
483 0 2 7828.844 0.332 0.377 154.911 84.522 239.433 0.778 240.211
484 0 8 7892.473 0.449 0.525 91.578 85.603 177.182 9.727 186.909
485 0 5 7960.366 0.389 0.468 55.094 82.706 137.801 1.851 139.652
486 0 3 7994.732 0.337 0.41 22.79 83.043 105.834 1.32 107.154
487 0 7 8032.525 0.351 0.425 16.842 80.964 97.806 3.531 101.338
488 0 0 7986.561 0.295 0.37 65.496 81.656 147.152 1.49 148.643
489 0 9 8034.848 0.327 0.409 49.351 81.008 130.359 9.179 139.539
490 0 4 8062.031 0.837 1.09 46.288 82.287 128.575 3.955 132.531
491 0 5 8100.03 0.389 0.486 18.157 82.12 100.278 2.442 102.72
492 0 1 8031.827 0.478 0.608 96.665 82.449 179.114 1.973 181.087
493 0 2 8069.062 0.342 0.407 85.309 81.496 166.805 0.329 167.135
494 0 9 8174.399 0.474 0.569 11.749 83.111 94.861 1.975 96.836
495 0 3 8101.893 0.317 0.394 85.135 84.047 169.183 2.215 171.398
496 0 8 8079.389 0.343 0.409 114.95 81.574 196.524 0.902 197.427
497 0 1 8212.925 0.393 0.494 5.508 81.466 86.974 2.467 89.442
498 0 6 8068.049 0.4 0.476 153.286 83.743 237.03 1.172 238.202
499 0 4 8194.572 0.388 0.455 46.45 82.449 128.899 3.487 132.387
500 0 7 8133.87 0.316 0.402 127.895 81.295 209.19 0.378 209.569
501 0 0 8135.211 0.37 0.49 149.827 95.401 245.228 0.525 245.753
502 0 5 8202.758 0.299 0.378 83.997 93.829 177.826 0.433 178.259
503 0 2 8236.206 0.419 0.527 47.407 97.117 144.525 0.519 145.044
504 0 6 8306.259 0.336 0.413 3.622 81.754 85.377 3.954 89.331
505 0 9 8271.247 0.468 1.138 48.801 82.285 131.086 5.775 136.861
506 0 7 8343.45 0.445 0.55 7.533 83.535 91.069 12.373 103.442
507 0 1 8302.377 0.352 0.429 54.306 89.95 144.257 1.044 145.301
508 0 8 8276.825 0.397 0.494 104.45 87.657 192.107 1.003 193.111
509 0 3 8273.295 0.582 0.657 107.827 88.457 196.284 0.432 196.717
510 0 4 8326.967 0.382 0.454 55.066 88.862 143.928 3.529 147.457
511 0 9 8408.118 0.387 0.47 10.387 81.323 91.711 2.096 93.808
512 0 5 8381.02 0.737 0.809 72.154 82.173 154.327 2.08 156.408
513 0 6 8395.599 0.31 0.381 60.746 88.193 148.94 0.223 149.163
514 0 1 8447.686 0.287 0.348 15.042 82.895 97.937 3.174 101.111
515 0 0 8380.969 0.55 0.685 84.005 88.633 172.638 1.193 173.831
516 0 4 8474.432 0.295 0.375 10.992 87.808 98.8 15.063 113.864
517 0 8 8469.946 0.996 1.127 55.763 87.871 143.635 0.35 143.985
518 0 0 8554.808 0.306 0.389 4.062 97.274 101.336 1.629 102.966
519 0 9 8501.936 0.364 0.441 57.994 97.65 155.644 0.333 155.977
520 0 5 8537.438 0.409 0.487 24.686 95.581 120.268 0.765 121.034
521 0 7 8446.903 0.418 0.538 166.93 82.688 249.618 12.816 262.434
522 0 3 8470.014 1.107 1.204 144.07 95.186 239.257 0.458 239.715
523 0 1 8548.805 0.291 0.366 65.599 95.008 160.607 1.759 162.367
524 0 2 8381.252 0.64 0.703 232.706 95.11 327.816 2.124 329.941
525 0 4 8588.308 0.451 0.53 47.676 81.686 129.363 19.95 149.313
526 0 6 8544.77 0.425 0.514 94.256 98.361 192.617 1.175 193.793
527 0 8 8613.935 0.482 0.648 66.74 79.822 146.562 13.637 160.199
528 0 5 8658.478 0.364 0.461 23.727 91.555 115.283 0.678 115.961
529 0 0 8657.783 0.359 0.437 29.469 86.909 116.378 1.615 117.994
530 0 9 8657.92 0.434 0.494 52.377 80.121 132.499 2.162 134.661
531 0 7 8709.341 1.143 1.286 2.176 84.412 86.589 18.531 105.121
532 0 0 8775.784 0.34 0.447 2.582 677.582 680.165 1.972 682.138
533 0 4 8737.632 0.477 0.553 40.936 679.191 720.127 46.877 767.005
534 0 1 8711.177 0.458 0.532 46.203 746.914 793.118 0.676 793.795
535 0 2 8711.197 0.549 0.614 36.637 756.865 793.503 0.62 794.123
536 0 3 8709.732 0.968 1.401 729.574 148.167 877.741 1.855 879.597
537 0 9 8792.592 0.382 0.461 647.063 212.999 860.063 2.327 862.391
538 0 5 8774.449 0.442 0.497 665.322 278.888 944.21 1.71 945.921
539 0 8 8774.139 0.542 0.675 666.023 348.013 1014.037 3.225 1017.262
540 0 7 8814.472 0.42 0.499 625.747 350.894 976.641 1.077 977.719
541 0 3 9589.338 0.74 0.84 52.156 212.561 264.717 1.988 266.706
542 0 1 9504.98 0.395 0.478 199.746 152.4 352.146 1.436 353.583
543 0 2 9505.326 0.369 0.408 200.027 212.787 412.815 0.346 413.162
544 0 5 9720.381 0.408 0.468 50.974 150.027 201.002 0.889 201.892
545 0 9 9654.994 0.436 0.496 119.325 206.595 325.92 1.9 327.82
546 0 7 9792.196 0.259 0.853 45.479 147.983 193.463 1.292 194.756
547 0 8 9791.412 0.416 0.474 47.556 209.663 257.22 1.399 258.62
548 0 1 9858.571 0.332 0.388 47.169 146.521 193.691 1.358 195.049
549 0 6 8738.566 0.293 0.349 1167.354 156.58 1323.935 0.934 1324.869
550 0 5 9922.281 0.382 0.438 49.221 145.247 194.469 1.392 195.862
551 0 7 9986.962 0.364 0.42 47.021 150.528 197.549 1.334 198.884
552 0 0 9457.939 0.316 0.395 578.457 150.278 728.735 1.254 729.99
553 0 9 9982.825 0.43 0.5 64.168 199.563 263.731 0.345 264.077
554 0 3 9856.054 0.416 0.472 247.039 147.388 394.428 1.72 396.148
555 0 4 9504.641 0.548 0.619 664.554 141.019 805.573 1.417 806.991
556 0 2 9918.499 0.404 0.459 250.86 142.241 393.101 1.155 394.257

View file

@ -1,44 +0,0 @@
// +build integration
// Package integration performs initialization and validation for integration
// tests.
package integration
import (
"crypto/rand"
"fmt"
"io"
"os"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
)
// Session is a shared session for all integration tests to use.
var Session = session.Must(session.NewSession())
func init() {
logLevel := Session.Config.LogLevel
if os.Getenv("DEBUG") != "" {
logLevel = aws.LogLevel(aws.LogDebug)
}
if os.Getenv("DEBUG_SIGNING") != "" {
logLevel = aws.LogLevel(aws.LogDebugWithSigning)
}
if os.Getenv("DEBUG_BODY") != "" {
logLevel = aws.LogLevel(aws.LogDebugWithSigning | aws.LogDebugWithHTTPBody)
}
Session.Config.LogLevel = logLevel
if aws.StringValue(Session.Config.Region) == "" {
panic("AWS_REGION must be configured to run integration tests")
}
}
// UniqueID returns a unique UUID-like identifier for use in generating
// resources for integration tests.
func UniqueID() string {
uuid := make([]byte, 16)
io.ReadFull(rand.Reader, uuid)
return fmt.Sprintf("%x", uuid)
}

View file

@ -1,14 +0,0 @@
#language en
@acm @client
Feature: AWS Certificate Manager
Scenario: Making a request
When I call the "ListCertificates" API
Then the request should be successful
Scenario: Handling errors
When I attempt to call the "GetCertificate" API with:
| CertificateArn | arn:aws:acm:region:123456789012:certificate/12345678-1234-1234-1234-123456789012 |
Then I expect the response error code to be "ResourceNotFoundException"
And I expect the response error message not be empty

View file

@ -1,16 +0,0 @@
// +build integration
//Package acm provides gucumber integration tests support.
package acm
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/acm"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@acm", func() {
gucumber.World["client"] = acm.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@apigateway @client
Feature: Amazon API Gateway
Scenario: Making a request
When I call the "GetAccountRequest" API
Then the request should be successful
Scenario: Handing errors
When I attempt to call the "GetRestApi" API with:
| RestApiId | api123 |
Then I expect the response error code to be "NotFoundException"
And I expect the response error message to include:
"""
Invalid REST API identifier specified
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package apigateway provides gucumber integration tests support.
package apigateway
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/apigateway"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@apigateway", func() {
gucumber.World["client"] = apigateway.New(smoke.Session)
})
}

View file

@ -1,8 +0,0 @@
#language en
@applicationdiscoveryservice @client
Feature: AWS Application Discovery Service
Scenario: Making a request
When I call the "DescribeAgents" API
Then the request should be successful

View file

@ -1,19 +0,0 @@
// +build integration
//Package applicationdiscoveryservice provides gucumber integration tests support.
package applicationdiscoveryservice
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/applicationdiscoveryservice"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@applicationdiscoveryservice", func() {
gucumber.World["client"] = applicationdiscoveryservice.New(
smoke.Session, &aws.Config{Region: aws.String("us-west-2")},
)
})
}

View file

@ -1,18 +0,0 @@
# language: en
@autoscaling @client
Feature: Auto Scaling
Scenario: Making a request
When I call the "DescribeScalingProcessTypes" API
Then the value at "Processes" should be a list
Scenario: Handing errors
When I attempt to call the "CreateLaunchConfiguration" API with:
| LaunchConfigurationName | |
| ImageId | ami-12345678 |
| InstanceType | m1.small |
Then I expect the response error code to be "InvalidParameter"
And I expect the response error message to include:
"""
LaunchConfigurationName
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package autoscaling provides gucumber integration tests support.
package autoscaling
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/autoscaling"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@autoscaling", func() {
gucumber.World["client"] = autoscaling.New(smoke.Session)
})
}

View file

@ -1,7 +0,0 @@
# language: en
@autoscalingplans @client
Feature: AWS Auto Scaling Plans
Scenario: Making a request
When I call the "DescribeScalingPlans" API
Then the request should be successful

View file

@ -1,16 +0,0 @@
// +build integration
//Package autoscalingplans provides gucumber integration tests support.
package autoscalingplans
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/autoscalingplans"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@autoscalingplans", func() {
gucumber.World["client"] = autoscalingplans.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudformation provides gucumber integration tests support.
package cloudformation
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudformation"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudformation", func() {
gucumber.World["client"] = cloudformation.New(smoke.Session)
})
}

View file

@ -1,17 +0,0 @@
# language: en
@cloudformation @client
Feature: AWS CloudFormation
Scenario: Making a request
When I call the "ListStacks" API
Then the value at "StackSummaries" should be a list
Scenario: Handling errors
When I attempt to call the "CreateStack" API with:
| StackName | fakestack |
| TemplateURL | http://s3.amazonaws.com/foo/bar |
Then I expect the response error code to be "ValidationError"
And I expect the response error message to include:
"""
TemplateURL must reference a valid S3 object to which you have access.
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudfront provides gucumber integration tests support.
package cloudfront
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudfront"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudfront", func() {
gucumber.World["client"] = cloudfront.New(smoke.Session)
})
}

View file

@ -1,17 +0,0 @@
# language: en
@cloudfront @client
Feature: Amazon CloudFront
Scenario: Making a basic request
When I call the "ListDistributions" API with:
| MaxItems | 1 |
Then the value at "DistributionList.Items" should be a list
Scenario: Error handling
When I attempt to call the "GetDistribution" API with:
| Id | fake-id |
Then I expect the response error code to be "NoSuchDistribution"
And I expect the response error message to include:
"""
The specified distribution does not exist.
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudhsm provides gucumber integration tests support.
package cloudhsm
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudhsm"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudhsm", func() {
gucumber.World["client"] = cloudhsm.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@cloudhsm @client
Feature: Amazon CloudHSM
Scenario: Making a request
When I call the "ListHapgs" API
Then the value at "HapgList" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeHapg" API with:
| HapgArn | bogus-arn |
Then I expect the response error code to be "ValidationException"
And I expect the response error message to include:
"""
Value 'bogus-arn' at 'hapgArn' failed to satisfy constraint
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudhsmv2 provides gucumber integration tests support.
package cloudhsmv2
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudhsmv2"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudhsmv2", func() {
gucumber.World["client"] = cloudhsmv2.New(smoke.Session)
})
}

View file

@ -1,7 +0,0 @@
# language: en
@cloudhsmv2 @client
Feature: Amazon CloudHSMv2
Scenario: Making a request
When I call the "DescribeBackups" API
Then the request should be successful

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudsearch provides gucumber integration tests support.
package cloudsearch
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudsearch"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudsearch", func() {
gucumber.World["client"] = cloudsearch.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@cloudsearch @client
Feature: Amazon CloudSearch
Scenario: Making a request
When I call the "DescribeDomains" API
Then the response should contain a "DomainStatusList"
Scenario: Handling errors
When I attempt to call the "DescribeIndexFields" API with:
| DomainName | fakedomain |
Then I expect the response error code to be "ResourceNotFound"
And I expect the response error message to include:
"""
Domain not found: fakedomain
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudtrail provides gucumber integration tests support.
package cloudtrail
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudtrail"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudtrail", func() {
gucumber.World["client"] = cloudtrail.New(smoke.Session)
})
}

View file

@ -1,12 +0,0 @@
# language: en
@cloudtrail @client
Feature: AWS CloudTrail
Scenario: Making a request
When I call the "DescribeTrails" API
Then the request should be successful
Scenario: Handling errors
When I attempt to call the "DeleteTrail" API with:
| Name | faketrail |
Then I expect the response error code to be "TrailNotFoundException"

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudwatch provides gucumber integration tests support.
package cloudwatch
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudwatch"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudwatch", func() {
gucumber.World["client"] = cloudwatch.New(smoke.Session)
})
}

View file

@ -1,19 +0,0 @@
# language: en
@cloudwatch @monitoring @client
Feature: Amazon CloudWatch
Scenario: Making a request
When I call the "ListMetrics" API with:
| Namespace | AWS/EC2 |
Then the value at "Metrics" should be a list
Scenario: Handling errors
When I attempt to call the "SetAlarmState" API with:
| AlarmName | abc |
| StateValue | mno |
| StateReason | xyz |
Then I expect the response error code to be "ValidationError"
And I expect the response error message to include:
"""
failed to satisfy constraint
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cloudwatchlogs provides gucumber integration tests support.
package cloudwatchlogs
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cloudwatchlogs"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cloudwatchlogs", func() {
gucumber.World["client"] = cloudwatchlogs.New(smoke.Session)
})
}

View file

@ -1,17 +0,0 @@
# language: en
@cloudwatchlogs @logs
Feature: Amazon CloudWatch Logs
Scenario: Making a request
When I call the "DescribeLogGroups" API
Then the value at "logGroups" should be a list
Scenario: Handling errors
When I attempt to call the "GetLogEvents" API with:
| logGroupName | fakegroup |
| logStreamName | fakestream |
Then I expect the response error code to be "ResourceNotFoundException"
And I expect the response error message to include:
"""
The specified log group does not exist.
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package codecommit provides gucumber integration tests support.
package codecommit
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/codecommit"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@codecommit", func() {
gucumber.World["client"] = codecommit.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@codecommit @client
Feature: Amazon CodeCommit
Scenario: Making a request
When I call the "ListRepositories" API
Then the value at "repositories" should be a list
Scenario: Handling errors
When I attempt to call the "ListBranches" API with:
| repositoryName | fake-repo |
Then I expect the response error code to be "RepositoryDoesNotExistException"
And I expect the response error message to include:
"""
fake-repo does not exist
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package codedeploy provides gucumber integration tests support.
package codedeploy
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/codedeploy"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@codedeploy", func() {
gucumber.World["client"] = codedeploy.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@codedeploy @client
Feature: Amazon CodeDeploy
Scenario: Making a request
When I call the "ListApplications" API
Then the value at "applications" should be a list
Scenario: Handling errors
When I attempt to call the "GetDeployment" API with:
| deploymentId | d-USUAELQEX |
Then I expect the response error code to be "DeploymentDoesNotExistException"
And I expect the response error message to include:
"""
The deployment d-USUAELQEX could not be found
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package codepipeline provides gucumber integration tests support.
package codepipeline
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/codepipeline"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@codepipeline", func() {
gucumber.World["client"] = codepipeline.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@codepipeline @client
Feature: Amazon CodePipeline
Scenario: Making a request
When I call the "ListPipelines" API
Then the value at "pipelines" should be a list
Scenario: Handling errors
When I attempt to call the "GetPipeline" API with:
| name | fake-pipeline |
Then I expect the response error code to be "PipelineNotFoundException"
And I expect the response error message to include:
"""
does not have a pipeline with name 'fake-pipeline'
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cognitoidentity provides gucumber integration tests support.
package cognitoidentity
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cognitoidentity"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cognitoidentity", func() {
gucumber.World["client"] = cognitoidentity.New(smoke.Session)
})
}

View file

@ -1,19 +0,0 @@
# language: en
@cognitoidentity @client
Feature: Amazon Cognito Idenity
Scenario: Making a request
When I call the "ListIdentityPools" API with JSON:
"""
{"MaxResults": 10}
"""
Then the value at "IdentityPools" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeIdentityPool" API with:
| IdentityPoolId | us-east-1:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee |
Then I expect the response error code to be "ResourceNotFoundException"
And I expect the response error message to include:
"""
IdentityPool 'us-east-1:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' not found
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package cognitosync provides gucumber integration tests support.
package cognitosync
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/cognitosync"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@cognitosync", func() {
gucumber.World["client"] = cognitosync.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@cognitosync @client
Feature: Amazon Cognito Sync
Scenario: Making a request
When I call the "ListIdentityPoolUsage" API
Then the value at "IdentityPoolUsages" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeIdentityPoolUsage" API with:
| IdentityPoolId | us-east-1:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee |
Then I expect the response error code to be "ResourceNotFoundException"
And I expect the response error message to include:
"""
IdentityPool 'us-east-1:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' not found
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package configservice provides gucumber integration tests support.
package configservice
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/configservice"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@configservice", func() {
gucumber.World["client"] = configservice.New(smoke.Session)
})
}

View file

@ -1,17 +0,0 @@
# language: en
@configservice @config @client
Feature: AWS Config
Scenario: Making a request
When I call the "DescribeConfigurationRecorders" API
Then the value at "ConfigurationRecorders" should be a list
Scenario: Handling errors
When I attempt to call the "GetResourceConfigHistory" API with:
| resourceType | fake-type |
| resourceId | fake-id |
Then I expect the response error code to be "ValidationException"
And I expect the response error message to include:
"""
failed to satisfy constraint
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package datapipeline provides gucumber integration tests support.
package datapipeline
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/datapipeline"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@datapipeline", func() {
gucumber.World["client"] = datapipeline.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@datapipeline @client
Feature: AWS Data Pipeline
Scenario: Making a request
When I call the "ListPipelines" API
Then the response should contain a "pipelineIdList"
Scenario: Handling errors
When I attempt to call the "GetPipelineDefinition" API with:
| pipelineId | fake-id |
Then I expect the response error code to be "PipelineNotFoundException"
And I expect the response error message to include:
"""
does not exist
"""

View file

@ -1,19 +0,0 @@
// +build integration
//Package devicefarm provides gucumber integration tests support.
package devicefarm
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/devicefarm"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@devicefarm", func() {
// FIXME remove custom region
gucumber.World["client"] = devicefarm.New(smoke.Session,
aws.NewConfig().WithRegion("us-west-2"))
})
}

View file

@ -1,16 +0,0 @@
# language: en
@devicefarm @client
Feature: AWS Device Farm
Scenario: Making a request
When I call the "ListDevices" API
Then the value at "devices" should be a list
Scenario: Handling errors
When I attempt to call the "GetDevice" API with:
| arn | arn:aws:devicefarm:us-west-2::device:000000000000000000000000fake-arn |
Then I expect the response error code to be "NotFoundException"
And I expect the response error message to include:
"""
No device was found for arn
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package directconnect provides gucumber integration tests support.
package directconnect
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/directconnect"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@directconnect", func() {
gucumber.World["client"] = directconnect.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@directconnect @client
Feature: AWS Direct Connect
Scenario: Making a request
When I call the "DescribeConnections" API
Then the value at "connections" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeConnections" API with:
| connectionId | fake-connection |
Then I expect the response error code to be "DirectConnectClientException"
And I expect the response error message to include:
"""
Connection ID fake-connection has an invalid format
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package directoryservice provides gucumber integration tests support.
package directoryservice
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/directoryservice"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@directoryservice", func() {
gucumber.World["client"] = directoryservice.New(smoke.Session)
})
}

View file

@ -1,17 +0,0 @@
# language: en
@directoryservice @ds @client
Feature: AWS Directory Service
I want to use AWS Directory Service
Scenario: Making a request
When I call the "DescribeDirectories" API
Then the value at "DirectoryDescriptions" should be a list
Scenario: Handling errors
When I attempt to call the "CreateDirectory" API with:
| Name | |
| Password | |
| Size | |
Then I expect the response error code to be "ValidationException"

View file

@ -1,16 +0,0 @@
// +build integration
//Package dynamodb provides gucumber integration tests support.
package dynamodb
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/dynamodb"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@dynamodb", func() {
gucumber.World["client"] = dynamodb.New(smoke.Session)
})
}

View file

@ -1,19 +0,0 @@
# language: en
@dynamodb @client
Feature: Amazon DynamoDB
Scenario: Making a request
When I call the "ListTables" API with JSON:
"""
{"Limit": 1}
"""
Then the value at "TableNames" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeTable" API with:
| TableName | fake-table |
Then I expect the response error code to be "ResourceNotFoundException"
And I expect the response error message to include:
"""
Requested resource not found: Table: fake-table not found
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package dynamodbstreams provides gucumber integration tests support.
package dynamodbstreams
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/dynamodbstreams"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@dynamodbstreams", func() {
gucumber.World["client"] = dynamodbstreams.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@dynamodbstreams @client
Feature: Amazon DynamoDB Streams
Scenario: Making a request
When I call the "ListStreams" API
Then the value at "Streams" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeStream" API with:
| StreamArn | fake-stream |
Then I expect the response error code to be "InvalidParameter"
And I expect the response error message to include:
"""
StreamArn
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package ec2 provides gucumber integration tests support.
package ec2
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@ec2", func() {
gucumber.World["client"] = ec2.New(smoke.Session)
})
}

View file

@ -1,18 +0,0 @@
# language: en
@ec2 @client
Feature: Amazon Elastic Compute Cloud
Scenario: Making a request
When I call the "DescribeRegions" API
Then the value at "Regions" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeInstances" API with JSON:
"""
{"InstanceIds": ["i-12345678"]}
"""
Then I expect the response error code to be "InvalidInstanceID.NotFound"
And I expect the response error message to include:
"""
The instance ID 'i-12345678' does not exist
"""

View file

@ -1,19 +0,0 @@
// +build integration
//Package ecs provides gucumber integration tests support.
package ecs
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/ecs"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@ecs", func() {
// FIXME remove custom region
gucumber.World["client"] = ecs.New(smoke.Session,
aws.NewConfig().WithRegion("us-west-2"))
})
}

View file

@ -1,14 +0,0 @@
# language: en
@ecs @client
Feature: Amazon ECS
I want to use Amazon ECS
Scenario: Making a request
When I call the "ListClusters" API
Then the value at "clusterArns" should be a list
Scenario: Handling errors
When I attempt to call the "StopTask" API with:
| task | xxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxx |
Then the error code should be "ClusterNotFoundException"

View file

@ -1,19 +0,0 @@
// +build integration
//Package efs provides gucumber integration tests support.
package efs
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/efs"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@efs", func() {
// FIXME remove custom region
gucumber.World["client"] = efs.New(smoke.Session,
aws.NewConfig().WithRegion("us-west-2"))
})
}

View file

@ -1,14 +0,0 @@
# language: en
@efs @elasticfilesystem @client
Feature: Amazon Elastic File System
I want to use Amazon Elastic File System
Scenario: Making a request
When I call the "DescribeFileSystems" API
Then the value at "FileSystems" should be a list
Scenario: Handling errors
When I attempt to call the "DeleteFileSystem" API with:
| FileSystemId | fake-id |
Then the error code should be "BadRequest"

View file

@ -1,16 +0,0 @@
// +build integration
//Package elasticache provides gucumber integration tests support.
package elasticache
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@elasticache", func() {
gucumber.World["client"] = elasticache.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@elasticache @client
Feature: ElastiCache
Scenario: Making a request
When I call the "DescribeEvents" API
Then the value at "Events" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeCacheClusters" API with:
| CacheClusterId | fake_cluster |
Then I expect the response error code to be "InvalidParameterValue"
And I expect the response error message to include:
"""
The parameter CacheClusterIdentifier is not a valid identifier.
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package elasticbeanstalk provides gucumber integration tests support.
package elasticbeanstalk
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/elasticbeanstalk"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@elasticbeanstalk", func() {
gucumber.World["client"] = elasticbeanstalk.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@elasticbeanstalk @client
Feature: AWS Elastic Beanstalk
Scenario: Making a request
When I call the "ListAvailableSolutionStacks" API
Then the value at "SolutionStacks" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeEnvironmentResources" API with:
| EnvironmentId | fake_environment |
Then I expect the response error code to be "InvalidParameterValue"
And I expect the response error message to include:
"""
No Environment found for EnvironmentId = 'fake_environment'.
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package elasticloadbalancing provides gucumber integration tests support.
package elasticloadbalancing
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/elb"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@elasticloadbalancing", func() {
gucumber.World["client"] = elb.New(smoke.Session)
})
}

View file

@ -1,18 +0,0 @@
# language: en
@elasticloadbalancing @client
Feature: Elastic Load Balancing
Scenario: Making a request
When I call the "DescribeLoadBalancers" API
Then the value at "LoadBalancerDescriptions" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeLoadBalancers" API with JSON:
"""
{"LoadBalancerNames": ["fake_load_balancer"]}
"""
Then I expect the response error code to be "ValidationError"
And I expect the response error message to include:
"""
LoadBalancer name cannot contain characters that are not letters, or digits or the dash.
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package elastictranscoder provides gucumber integration tests support.
package elastictranscoder
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/elastictranscoder"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@elastictranscoder", func() {
gucumber.World["client"] = elastictranscoder.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@elastictranscoder @client
Feature: Amazon Elastic Transcoder
Scenario: Making a request
When I call the "ListPresets" API
Then the value at "Presets" should be a list
Scenario: Handling errors
When I attempt to call the "ReadJob" API with:
| Id | fake_job |
Then I expect the response error code to be "ValidationException"
And I expect the response error message to include:
"""
Value 'fake_job' at 'id' failed to satisfy constraint
"""

View file

@ -1,16 +0,0 @@
// +build integration
//Package emr provides gucumber integration tests support.
package emr
import (
"github.com/aws/aws-sdk-go/awstesting/integration/smoke"
"github.com/aws/aws-sdk-go/service/emr"
"github.com/gucumber/gucumber"
)
func init() {
gucumber.Before("@emr", func() {
gucumber.World["client"] = emr.New(smoke.Session)
})
}

View file

@ -1,16 +0,0 @@
# language: en
@emr @client @elasticmapreduce
Feature: Amazon EMR
Scenario: Making a request
When I call the "ListClusters" API
Then the value at "Clusters" should be a list
Scenario: Handling errors
When I attempt to call the "DescribeCluster" API with:
| ClusterId | fake_cluster |
Then I expect the response error code to be "InvalidRequestException"
And I expect the response error message to include:
"""
Cluster id 'fake_cluster' is not valid.
"""

Some files were not shown because too many files have changed in this diff Show more