diff --git a/cmd/egress/cmd.go b/cmd/egress/cmd.go index 4f09d294..5f2d280f 100644 --- a/cmd/egress/cmd.go +++ b/cmd/egress/cmd.go @@ -12,6 +12,8 @@ import ( "strings" "time" + "golang.org/x/oauth2/google" + "github.com/openshift/osd-network-verifier/cmd/utils" "github.com/openshift/osd-network-verifier/pkg/data/cloud" "github.com/openshift/osd-network-verifier/pkg/data/cpu" @@ -20,7 +22,6 @@ import ( "github.com/openshift/osd-network-verifier/pkg/proxy" "github.com/openshift/osd-network-verifier/pkg/verifier" gcpverifier "github.com/openshift/osd-network-verifier/pkg/verifier/gcp" - "golang.org/x/oauth2/google" "github.com/spf13/cobra" ) @@ -137,7 +138,7 @@ are set correctly before execution. } // AWS workflow - if platformType == cloud.AWSClassic || platformType == cloud.AWSHCP { + if platformType == cloud.AWSClassic || platformType == cloud.AWSHCP || platformType == cloud.AWSHCPZeroEgress { if len(vei.Tags) == 0 { vei.Tags = awsDefaultTags @@ -253,7 +254,8 @@ are set correctly before execution. }, } - validateEgressCmd.Flags().StringVar(&config.platformType, "platform", platformTypeDefault, fmt.Sprintf("(optional) infra platform type, which determines which endpoints to test. Either '%s', '%s', or '%s' (hypershift)", cloud.AWSClassic, cloud.GCPClassic, cloud.AWSHCP)) + validateEgressCmd.Flags().StringVar(&config.platformType, "platform", platformTypeDefault, fmt.Sprintf("(optional) infra platform type, which determines which endpoints to test. "+ + "Either '%s', '%s', '%s', or '%s' (hypershift)", cloud.AWSClassic, cloud.GCPClassic, cloud.AWSHCP, cloud.AWSHCPZeroEgress)) validateEgressCmd.Flags().StringVar(&config.vpcSubnetID, "subnet-id", "", "target subnet ID") validateEgressCmd.Flags().StringVar(&config.cloudImageID, "image-id", "", "(optional) cloud image for the compute instance") validateEgressCmd.Flags().StringVar(&config.instanceType, "instance-type", "", "(optional) compute instance type") diff --git a/pkg/data/cloud/platform.go b/pkg/data/cloud/platform.go index af45fb21..80aedcb4 100644 --- a/pkg/data/cloud/platform.go +++ b/pkg/data/cloud/platform.go @@ -22,6 +22,9 @@ var ( AWSHCP = Platform{ names: [2]string{"aws-hcp", "hostedcluster"}, } + AWSHCPZeroEgress = Platform{ + names: [2]string{"aws-hcp-zeroegress"}, + } GCPClassic = Platform{ names: [2]string{"gcp-classic", "gcp"}, } @@ -49,13 +52,17 @@ func ByName(name string) (Platform, error) { return GCPClassic, nil } + if slices.Contains(AWSHCPZeroEgress.names[:], normalizedName) { + return AWSHCPZeroEgress, nil + } + return Platform{}, fmt.Errorf("no platform with name %s", name) } // IsValid returns true if the Platform is non-empty and supported by the network verifier func (plat Platform) IsValid() bool { switch plat { - case AWSClassic, AWSHCP, GCPClassic: + case AWSClassic, AWSHCP, GCPClassic, AWSHCPZeroEgress: return true default: return false diff --git a/pkg/data/cpu/cpu.go b/pkg/data/cpu/cpu.go index 35087872..cdb8bd19 100644 --- a/pkg/data/cpu/cpu.go +++ b/pkg/data/cpu/cpu.go @@ -59,7 +59,7 @@ func (arch Architecture) DefaultInstanceType(platformType cloud.Platform) (strin } switch platformType { - case cloud.AWSClassic, cloud.AWSHCP: + case cloud.AWSClassic, cloud.AWSHCP, cloud.AWSHCPZeroEgress: return arch.defaultAWSInstanceType, nil case cloud.GCPClassic: return arch.defaultGCPInstanceType, nil diff --git a/pkg/data/egress_lists/aws-hcp-zeroegress.yaml b/pkg/data/egress_lists/aws-hcp-zeroegress.yaml new file mode 100644 index 00000000..8350d3f1 --- /dev/null +++ b/pkg/data/egress_lists/aws-hcp-zeroegress.yaml @@ -0,0 +1,10 @@ +endpoints: +- host: sts.${AWS_REGION}.amazonaws.com + ports: + - 443 +- host: example.dkr.ecr.${AWS_REGION}.amazonaws.com + ports: + - 443 +- host: api.ecr.${AWS_REGION}.amazonaws.com + ports: + - 443 \ No newline at end of file diff --git a/pkg/data/egress_lists/egress_lists.go b/pkg/data/egress_lists/egress_lists.go index d37ee7ca..70f07835 100644 --- a/pkg/data/egress_lists/egress_lists.go +++ b/pkg/data/egress_lists/egress_lists.go @@ -14,8 +14,9 @@ import ( "os" "github.com/google/go-github/v63/github" - "github.com/openshift/osd-network-verifier/pkg/data/cloud" "gopkg.in/yaml.v3" + + "github.com/openshift/osd-network-verifier/pkg/data/cloud" ) //go:embed aws-classic.yaml @@ -27,6 +28,9 @@ var templateAWSHCP string //go:embed gcp-classic.yaml var templateGCPClassic string +//go:embed aws-hcp-zeroegress.yaml +var templateAWSHCPZeroEgress string + func GetLocalEgressList(platformType cloud.Platform) (string, error) { if !platformType.IsValid() { fmt.Printf("platform type %s is invalid", platformType) @@ -39,6 +43,8 @@ func GetLocalEgressList(platformType cloud.Platform) (string, error) { return templateAWSHCP, nil case cloud.AWSClassic: return templateAWSClassic, nil + case cloud.AWSHCPZeroEgress: + return templateAWSHCPZeroEgress, nil default: return "", fmt.Errorf("no egress list registered for platform '%s'", platformType) } @@ -58,6 +64,8 @@ func GetGithubEgressList(platformType cloud.Platform) (*github.RepositoryContent path += cloud.AWSHCP.String() case cloud.AWSClassic: path += cloud.AWSClassic.String() + case cloud.AWSHCPZeroEgress: + path += cloud.AWSHCPZeroEgress.String() default: return nil, fmt.Errorf("no egress list registered for platform '%s'", platformType) } diff --git a/pkg/probes/curl/curl_json.go b/pkg/probes/curl/curl_json.go index 1a11a04a..4f8c4461 100644 --- a/pkg/probes/curl/curl_json.go +++ b/pkg/probes/curl/curl_json.go @@ -4,6 +4,7 @@ import ( _ "embed" "encoding/base64" "fmt" + "net" "os" "strconv" "strings" @@ -11,6 +12,7 @@ import ( "gopkg.in/yaml.v3" "github.com/openshift/osd-network-verifier/pkg/data/cloud" + "github.com/openshift/osd-network-verifier/pkg/data/cpu" handledErrors "github.com/openshift/osd-network-verifier/pkg/errors" "github.com/openshift/osd-network-verifier/pkg/helpers" @@ -33,8 +35,8 @@ var userDataTemplate string //go:embed systemd-template.sh var systemdTemplate string -const startingToken = "NV_CURLJSON_BEGIN" -const endingToken = "NV_CURLJSON_END" +const startingToken = "NV_CURLJSON_BEGIN" //nolint:gosec +const endingToken = "NV_CURLJSON_END" //nolint:gosec const outputLinePrefix = "@NV@" var presetUserDataVariables = map[string]string{ @@ -56,7 +58,7 @@ func (clp Probe) GetMachineImageID(platformType cloud.Platform, cpuArch cpu.Arch return "", handledErrors.NewGenericError(fmt.Errorf("invalid platform type specified %s", platformType)) } - if platformType == cloud.AWSHCP { + if platformType == cloud.AWSHCP || platformType == cloud.AWSHCPZeroEgress { // HCP uses the same AMIs as Classic platformType = cloud.AWSClassic } @@ -190,7 +192,7 @@ func (clp Probe) GetExpandedUserData(userDataVariables map[string]string) (strin // ParseProbeOutput accepts a string containing all probe output that appeared between // the startingToken and the endingToken and a pointer to an Output object. outputDestination // will be filled with the results from the egress check -func (clp Probe) ParseProbeOutput(probeOutput string, outputDestination *output.Output) { +func (clp Probe) ParseProbeOutput(ensurePrivate bool, probeOutput string, outputDestination *output.Output) { // probeOutput first needs to be "repaired" due to curl and AWS bugs repairedProbeOutput := helpers.FixLeadingZerosInJSON(helpers.RemoveTimestamps(probeOutput)) probeResults, errMap := bulkDeserializeCurlJSONProbeResult(repairedProbeOutput) @@ -204,6 +206,15 @@ func (clp Probe) ParseProbeOutput(probeOutput string, outputDestination *output. []string{fmt.Sprintf("%s (%s)", url, probeResult.ErrorMsg)}, ) } + if ensurePrivate { + remoteIP := net.ParseIP(probeResult.RemoteIP) + if !remoteIP.IsPrivate() { + probeResult.ErrorMsg = "The endpoint is non private" + url := strings.Replace(probeResult.URL, "telnet", "tcp", 1) + outputDestination.SetEgressFailures( + []string{fmt.Sprintf("%s (%s)", url, probeResult.ErrorMsg)}) + } + } } for lineNum, err := range errMap { outputDestination.AddError( diff --git a/pkg/probes/legacy/legacy.go b/pkg/probes/legacy/legacy.go index f9a1ac7b..7b480b15 100644 --- a/pkg/probes/legacy/legacy.go +++ b/pkg/probes/legacy/legacy.go @@ -55,7 +55,7 @@ func (lgp Probe) GetMachineImageID(platformType cloud.Platform, cpuArch cpu.Arch os.Exit(1) } - if platformType == cloud.AWSHCP { + if platformType == cloud.AWSHCP || platformType == cloud.AWSHCPZeroEgress { // HCP uses the same AMIs as Classic platformType = cloud.AWSClassic } @@ -104,7 +104,7 @@ func (lgp Probe) GetExpandedUserData(userDataVariables map[string]string) (strin // ParseProbeOutput accepts a string containing all probe output that appeared between // the startingToken and the endingToken and a pointer to an Output object. outputDestination // will be filled with the results from the egress check -func (lgp Probe) ParseProbeOutput(probeOutput string, outputDestination *output.Output) { +func (lgp Probe) ParseProbeOutput(ensurePrivate bool, probeOutput string, outputDestination *output.Output) { // reSuccess indicates that network validation was successful reSuccess := regexp.MustCompile(`Success!`) diff --git a/pkg/probes/package_probes.go b/pkg/probes/package_probes.go index 39ec4935..4e13fca1 100644 --- a/pkg/probes/package_probes.go +++ b/pkg/probes/package_probes.go @@ -11,5 +11,5 @@ type Probe interface { GetStartingToken() string GetEndingToken() string GetExpandedUserData(map[string]string) (string, error) - ParseProbeOutput(string, *output.Output) + ParseProbeOutput(bool, string, *output.Output) } diff --git a/pkg/verifier/aws/aws_verifier.go b/pkg/verifier/aws/aws_verifier.go index a896718b..445285fc 100644 --- a/pkg/verifier/aws/aws_verifier.go +++ b/pkg/verifier/aws/aws_verifier.go @@ -16,6 +16,7 @@ import ( ec2Types "github.com/aws/aws-sdk-go-v2/service/ec2/types" "github.com/go-playground/validator" ocmlog "github.com/openshift-online/ocm-sdk-go/logging" + "github.com/openshift/osd-network-verifier/pkg/clients/aws" "github.com/openshift/osd-network-verifier/pkg/data/cloud" "github.com/openshift/osd-network-verifier/pkg/data/cpu" @@ -348,7 +349,7 @@ func (a *AwsVerifier) createEC2Instance(input createEC2InstanceInput) (string, e return instanceID, nil } -func (a *AwsVerifier) findUnreachableEndpoints(ctx context.Context, instanceID string, probe probes.Probe) error { +func (a *AwsVerifier) findUnreachableEndpoints(ctx context.Context, instanceID string, probe probes.Probe, ensurePrivate bool) error { var consoleOutput string a.writeDebugLogs(ctx, "Scraping console output and waiting for user data script to complete...") @@ -409,8 +410,7 @@ func (a *AwsVerifier) findUnreachableEndpoints(ctx context.Context, instanceID s // Send probe's output off to the Probe interface for parsing a.writeDebugLogs(ctx, fmt.Sprintf("probe output:\n---\n%s\n---", rawProbeOutput)) - probe.ParseProbeOutput(rawProbeOutput, &a.Output) - + probe.ParseProbeOutput(ensurePrivate, rawProbeOutput, &a.Output) return true, nil }) diff --git a/pkg/verifier/aws/aws_verifier_test.go b/pkg/verifier/aws/aws_verifier_test.go index acdd3d8e..6e3fcb83 100644 --- a/pkg/verifier/aws/aws_verifier_test.go +++ b/pkg/verifier/aws/aws_verifier_test.go @@ -10,14 +10,95 @@ import ( "github.com/aws/aws-sdk-go-v2/service/ec2" ec2Types "github.com/aws/aws-sdk-go-v2/service/ec2/types" ocmlog "github.com/openshift-online/ocm-sdk-go/logging" + gomock "go.uber.org/mock/gomock" + "github.com/openshift/osd-network-verifier/pkg/clients/aws" "github.com/openshift/osd-network-verifier/pkg/data/cloud" "github.com/openshift/osd-network-verifier/pkg/data/cpu" "github.com/openshift/osd-network-verifier/pkg/mocks" + "github.com/openshift/osd-network-verifier/pkg/probes/curl" "github.com/openshift/osd-network-verifier/pkg/probes/legacy" - gomock "go.uber.org/mock/gomock" ) +func TestFindUnreachableEndpointsWithCurlProbe(t *testing.T) { + tests := []struct { + name string + output string + ensurePrivate bool + expectSuccess bool + errorMessage string + }{ + { + name: "SuccessWithPrivateRemoteIP", + // NV_CURLJSON_BEGIN + // ... + // "remote_ip":"10.0.0.10" + // ... + // NV_CURLJSON_END + output: "TlZfQ1VSTEpTT05fQkVHSU4KQE5WQHsiY2VydHMiOiJTdWJqZWN0OkNOID0gc3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tXG5Jc3N1ZXI6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSU0EgMjA0OCBNMDFcblZlcnNpb246MlxuU2VyaWFsIE51bWJlcjowMWU0MjMyMjM5NmRlODRkNjkzZjkwOGQ3MzBhMDJmM1xuU2lnbmF0dXJlIEFsZ29yaXRobTpzaGEyNTZXaXRoUlNBRW5jcnlwdGlvblxuUHVibGljIEtleSBBbGdvcml0aG06cnNhRW5jcnlwdGlvblxuWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjo4MTpCODowRTo2Mzo4QTo4OToxMjoxODpFNTpGQTozQjozQjo1MDo5NTo5RjpFNjpFNTo5MDoxMzo4NVxuWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6OTE6NzM6MUE6MUQ6Q0M6MUI6RkE6NjU6RjY6Q0U6RDc6Rjk6MTc6QUE6MjI6MDk6NjQ6Qjg6NDA6RDVcblg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWU6RE5TOnN0cy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSwgRE5TOiouc3RzLnVzLXdlc3QtMi52cGNlLmFtYXpvbmF3cy5jb21cblg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczpQb2xpY3k6IDIuMjMuMTQwLjEuMi4xXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBLZXkgRW5jaXBoZXJtZW50XG5YNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlOlRMUyBXZWIgU2VydmVyIEF1dGhlbnRpY2F0aW9uLCBUTFMgV2ViIENsaWVudCBBdXRoZW50aWNhdGlvblxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucjJtMDEuYW1hem9udHJ1c3QuY29tL3IybTAxLmNybFxuQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzczpPQ1NQIC0gVVJJOmh0dHA6Ly9vY3NwLnIybTAxLmFtYXpvbnRydXN0LmNvbVxuQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXJcblg1MDl2MyBCYXNpYyBDb25zdHJhaW50czpDQTpGQUxTRVxuQ1QgUHJlY2VydGlmaWNhdGUgU0NUczpTaWduZWQgQ2VydGlmaWNhdGUgVGltZXN0YW1wOlxuICAgIFZlcnNpb24gICA6IHYxICgweDApXG4gICAgTG9nIElEICAgIDogQ0Y6MTE6NTY6RUU6RDU6MkU6N0M6QUY6RjM6ODc6NUI6RDk6Njk6MkU6OUI6RTk6XG4gICAgICAgICAgICAgICAgMUE6NzE6Njc6NEE6QjA6MTc6RUM6QUM6MDE6RDI6NUI6Nzc6Q0U6Q0M6M0I6MDhcbiAgICBUaW1lc3RhbXAgOiBKYW4gMTggMDc6MzQ6MjUuOTI2IDIwMjQgR01UXG4gICAgRXh0ZW5zaW9uczogbm9uZVxuICAgIFNpZ25hdHVyZSA6IGVjZHNhLXdpdGgtU0hBMjU2XG4gICAgICAgICAgICAgICAgMzA6NDQ6MDI6MjA6NUU6OEI6MTY6MzY6QTQ6MkM6MDE6QjY6M0Y6RkU6MTE6NTA6XG4gICAgICAgICAgICAgICAgNDI6MUE6MDQ6RTU6QTk6QTI6OUU6MEM6MEM6QTU6MDc6RUY6NDk6QUU6QTY6ODE6XG4gICAgICAgICAgICAgICAgNUE6NzQ6QTA6OUI6MDI6MjA6NUM6QzA6MkM6Nzc6QzY6Qzk6M0E6MzI6RDM6Qzk6XG4gICAgICAgICAgICAgICAgODU6QTc6NTQ6QUU6REI6RTY6OTE6NzA6ODc6Mzk6RDQ6QTU6QTM6ODk6NzU6Q0Q6XG4gICAgICAgICAgICAgICAgQjI6OEY6RTY6MTA6QjY6NkFcblNpZ25lZCBDZXJ0aWZpY2F0ZSBUaW1lc3RhbXA6XG4gICAgVmVyc2lvbiAgIDogdjEgKDB4MClcbiAgICBMb2cgSUQgICAgOiAzRjoxNzo0Qjo0RjpENzoyMjo0Nzo1ODo5NDoxRDo2NToxQzo4NDpCRTowRDoxMjpcbiAgICAgICAgICAgICAgICBFRDo5MDozNzo3RjoxRjo4NTo2QTpFQjpDMTpCRjoyODo4NTpFQzpGODo2NDo2RVxuICAgIFRpbWVzdGFtcCA6IEphbiAxOCAwNzozNDoyNS44NjggMjAyNCBHTVRcbiAgICBFeHRlbnNpb25zOiBub25lXG4gICAgU2lnbmF0dXJlIDogZWNkc2Etd2l0aC1TSEEyNTZcbiAgICAgICAgICAgICAgICAzMDo0NDowMjoyMDowOTo4NjowNjo2NzpBMToyRjo4NTpFNTozMzpEMjpFNjo5RjpcbiAgICAgICAgICAgICAgICBGMzo2MDpCMjpBODpBMTozRDo3NDowNzpGRDo4MDpBMTpBMDowMjpCQTo0MjpDMTpcbiAgICAgICAgICAgICAgICAwNDowMjo4NzpDMjowMjoyMDo0RDo3ODpEMTo5QzpEMzpERjpDMTo3RjpBMjpENDpcbiAgICAgICAgICAgICAgICAyNjpFNjo3OTpBOTpDNDo2NDo4MzpDNTpCNzpGOTo1Qjo3QzpBNjpEMzo0QTpEMTpcbiAgICAgICAgICAgICAgICBBNTo2NTo1MzozOTpGQjoyNlxuU2lnbmVkIENlcnRpZmljYXRlIFRpbWVzdGFtcDpcbiAgICBWZXJzaW9uICAgOiB2MSAoMHgwKVxuICAgIExvZyBJRCAgICA6IDdEOjU5OjFFOjEyOkUxOjc4OjJBOjdCOjFDOjYxOjY3OjdDOjVFOkZEOkY4OkQwOlxuICAgICAgICAgICAgICAgIDg3OjVDOjE0OkEwOjRFOjk1OjlFOkI5OjAzOjJGOkQ5OjBFOjhDOjJFOjc5OkI4XG4gICAgVGltZXN0YW1wIDogSmFuIDE4IDA3OjM0OjI1Ljg2MyAyMDI0IEdNVFxuICAgIEV4dGVuc2lvbnM6IG5vbmVcbiAgICBTaWduYXR1cmUgOiBlY2RzYS13aXRoLVNIQTI1NlxuICAgICAgICAgICAgICAgIDMwOjQ2OjAyOjIxOjAwOkQzOjNCOkRFOkQ2OjZBOkM0OjNBOkQ0OjVDOjNGOjAwOlxuICAgICAgICAgICAgICAgIDBGOkQ0OkJFOjY5OjMyOkZFOkMyOkEwOjlEOjU4OjgxOjI4OjkxOkYzOjE2OjFGOlxuICAgICAgICAgICAgICAgIEYyOjYxOjhCOjEyOkNBOjAyOjIxOjAwOjk4OjA0OjQzOjA5OjY2OkNEOjE0OkMwOlxuICAgICAgICAgICAgICAgIDU0OkExOkYwOjBCOkY0OjhBOjEwOkFFOkQ1OjE5OjY1OjdFOkM1OkI3OjREOjhEOlxuICAgICAgICAgICAgICAgIDU3OkU0OjNCOkZCOkNGOjZGOkRFOjkyXG5TdGFydCBkYXRlOkphbiAxOCAwMDowMDowMCAyMDI0IEdNVFxuRXhwaXJlIGRhdGU6SmFuICA2IDIzOjU5OjU5IDIwMjUgR01UXG5SU0EgUHVibGljIEtleToyMDQ4XG5yc2Eobik6QjM1MkMxOTQ3QkVBOUNDOEEzRjY0RTdDODc3NEEyRjY0NzI1MzBBQkUyOEZBOUJGNkMzMUIwM0E5NTYwMjJBMTIyNDA1QUM0Q0Q0NkIwRjcxOENCQTIzMDU1NTJDNEJFRURBRThDMERDOTE2NTkwRDM2QzM3NkM3MDMzMTU4NTBGMjY3MUU1RTNFMUIyODUwMUFFQzlDOTNFODU0NUUzRDRCNTc0RDFGM0Q0QTJBMDc1RTFDMzg5RTYwOUM2RkI0RUVBMzVFMkVGMEMwRDc2MDZFMDVGRkIyMUY2NzYyRDBFOEY5Q0IxQTczRjFFMzg2QjY0OEI5QjA0QzBDQTMyN0REN0U1OTIzRkVCRERENDZBRjA5QUE2ODQ3Qjc5NTE3QUQxODMyNUMwMTJEMUU4QjYyQUI4MUU1OEYzQzc0NjU3Nzc5NUM0MUQ4MEI1RDFGQTExMDE3MTFCREVBNzI1OTc1RUI0NzYwM0QyQUIyQTk4QTZDNTBCQkI0OTZEMUREQTMwMDNGNEFDREE5NTVGMjFGNTQxMjkyNDVBMEMzNjA0Njk1RjVCODczRDZCN0EwMTc1N0MwMjkxNTAyMzQzNEIwQjlDQUZCOEI3QjkyNzA3RTdCMTQwMzFBMjlCQjAwNzdGNTc2OUJDMzk5NzI4M0M2RjVFRTk4RDMxQTc4MjlcbnJzYShlKToxMDAwMVxuU2lnbmF0dXJlOjllOjA0OmNjOmMwOmJkOmY1OjlkOmIyOmI2Ojk3OmE1OmQyOmFhOjAwOmU4OjhmOjBhOmIyOjJiOjM4OjQ3OmRmOmIwOmJlOjI4OjIyOjMxOjZiOmJlOjNmOmNkOmNmOjcxOmI3OmZkOmE3OjQ3OjZkOjFmOjY2OmZhOjQ3OjdlOjVjOmYwOjRjOjNkOmU0OjEwOjUyOjhiOjFmOjMwOjA3OjRiOjE4OmNmOmI0OmQzOjE4OjI3OjEwOmJiOjI5OmVkOmZlOjc4OjdkOmY1OjY2OjRkOjc2OjlkOjRjOmFlOmZhOmUxOjIzOmQxOjU2OjI4OjNjOjYyOjBhOmU0Ojg4OjY3OmE1OmI1OjMxOjYxOmUwOmI5OjIwOjBiOmM0OmQxOjc2OmY3Ojg1OmM4OmQ4OmJjOjU2OmE5OjgxOjczOjRiOjk0OmMzOmM0OjI4OmZlOjNmOjdiOmY3OjI0OmFiOmJhOjU4OjNjOjYxOjdkOjFmOjBkOmE0OmI0OjU3OjRhOjU2OjRmOjlkOjgwOjUzOjdkOjUyOjg1OjEwOmUxOjE4OmU5OmYzOmQwOjRhOjVkOjdmOjExOjFjOjg3OjVmOjU1OjVmOjhiOjhmOmI4Ojc4OjQ3OjU2OjI1OmIxOjhmOjQxOmRlOmI5OjQxOjk0OmE3OjQwOmU5OmJlOmY0OjI1OjAxOjA0OmVlOmY2OjNhOjI4OmViOmExOmMxOjI1OjMzOjY2OmVkOjNlOmEzOmE3OmI4OjVmOjRhOmUwOmRmOmRhOjAxOmRlOmEyOmRlOjE3Ojg0OmQ5OjRhOmVjOmM2OjRjOmE2OmYzOjA1OjhiOjc2OjNiOjcxOjExOjc2OjFjOjlhOjc3OjE4OmM2OmVmOmViOjliOjIxOjYwOjE2OmNiOjljOmI4OjdjOmFkOjdmOjU2OmY3OmM2OmJhOjFkOjVkOjA1OjgxOjk0OjlhOmZiOjk2OjZlOjI1OmJhOmJhOjFhOjNkOjc3OjI5Ojg1OjU1OjI1OjA5OjFjOlxuLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlHQlRDQ0JPMmdBd0lCQWdJUUFlUWpJamx0NkUxcFA1Q05jd29DOHpBTkJna3Foa2lHOXcwQkFRc0ZBREE4XG5NUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJ3d0dnWURWUVFERXhOQmJXRjZiMjRnXG5VbE5CSURJd05EZ2dUVEF4TUI0WERUSTBNREV4T0RBd01EQXdNRm9YRFRJMU1ERXdOakl6TlRrMU9Wb3dKakVrXG5NQ0lHQTFVRUF4TWJjM1J6TG5WekxYZGxjM1F0TWk1aGJXRjZiMjVoZDNNdVkyOXRNSUlCSWpBTkJna3Foa2lHXG45dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBczFMQmxIdnFuTWlqOWs1OGgzU2k5a2NsTUt2aWo2bS9iREd3XG5PcFZnSXFFaVFGckV6VWF3OXhqTG9qQlZVc1MrN2E2TURja1dXUTAydzNiSEF6RllVUEpuSGw0K0d5aFFHdXljXG5rK2hVWGoxTFYwMGZQVW9xQjE0Y09KNWduRyswN3FOZUx2REExMkJ1QmYreUgyZGkwT2o1eXhwejhlT0d0a2k1XG5zRXdNb3lmZGZsa2ovcjNkUnE4SnFtaEh0NVVYclJneVhBRXRIb3RpcTRIbGp6eDBaWGQ1WEVIWUMxMGZvUkFYXG5FYjNxY2xsMTYwZGdQU3F5cVlwc1VMdTBsdEhkb3dBL1NzMnBWZklmVkJLU1JhRERZRWFWOWJoejFyZWdGMWZBXG5LUlVDTkRTd3VjcjdpM3VTY0g1N0ZBTWFLYnNBZC9WMm04T1pjb1BHOWU2WTB4cDRLUUlEQVFBQm80SURGekNDXG5BeE13SHdZRFZSMGpCQmd3Rm9BVWdiZ09ZNHFKRWhqbCtqczdVSldmNXVXUUU0VXdIUVlEVlIwT0JCWUVGSkZ6XG5HaDNNRy9wbDlzN1grUmVxSWdsa3VFRFZNRW9HQTFVZEVRUkRNRUdDRzNOMGN5NTFjeTEzWlhOMExUSXVZVzFoXG5lbTl1WVhkekxtTnZiWUlpS2k1emRITXVkWE10ZDJWemRDMHlMblp3WTJVdVlXMWhlbTl1WVhkekxtTnZiVEFUXG5CZ05WSFNBRUREQUtNQWdHQm1lQkRBRUNBVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdIUVlEVlIwbEJCWXdGQVlJXG5Ld1lCQlFVSEF3RUdDQ3NHQVFVRkJ3TUNNRHNHQTFVZEh3UTBNREl3TUtBdW9DeUdLbWgwZEhBNkx5OWpjbXd1XG5jakp0TURFdVlXMWhlbTl1ZEhKMWMzUXVZMjl0TDNJeWJUQXhMbU55YkRCMUJnZ3JCZ0VGQlFjQkFRUnBNR2N3XG5MUVlJS3dZQkJRVUhNQUdHSVdoMGRIQTZMeTl2WTNOd0xuSXliVEF4TG1GdFlYcHZiblJ5ZFhOMExtTnZiVEEyXG5CZ2dyQmdFRkJRY3dBb1lxYUhSMGNEb3ZMMk55ZEM1eU1tMHdNUzVoYldGNmIyNTBjblZ6ZEM1amIyMHZjakp0XG5NREV1WTJWeU1Bd0dBMVVkRXdFQi93UUNNQUF3Z2dGOUJnb3JCZ0VFQWRaNUFnUUNCSUlCYlFTQ0FXa0Jad0IxXG5BTThSVnU3VkxueXY4NGRiMldrdW0ra2FjV2RLc0Jmc3JBSFNXM2ZPekRzSUFBQUJqUnQrRzRZQUFBUURBRVl3XG5SQUlnWG9zV05xUXNBYlkvL2hGUVFob0U1YW1pbmd3TXBRZnZTYTZtZ1ZwMG9Kc0NJRnpBTEhmR3lUb3kwOG1GXG5wMVN1MithUmNJYzUxS1dqaVhYTnNvL21FTFpxQUhVQVB4ZExUOWNpUjFpVUhXVWNoTDRORXUyUU4zOGZoV3JyXG53YjhvaGV6NFpHNEFBQUdORzM0YlRBQUFCQU1BUmpCRUFpQUpoZ1pub1MrRjVUUFM1cC96WUxLb29UMTBCLzJBXG5vYUFDdWtMQkJBS0h3Z0lnVFhqUm5OUGZ3WCtpMUNibWVhbkVaSVBGdC9sYmZLYlRTdEdsWlZNNSt5WUFkd0I5XG5XUjRTNFhncWV4eGhaM3hlL2ZqUWgxd1VvRTZWbnJrREw5a09qQzU1dUFBQUFZMGJmaHRIQUFBRUF3QklNRVlDXG5JUURUTzk3V2FzUTYxRncvQUEvVXZta3kvc0tnblZpQktKSHpGaC95WVlzU3lnSWhBSmdFUXdsbXpSVEFWS0h3XG5DL1NLRUs3VkdXVit4YmROalZma08vdlBiOTZTTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDZUJNekF2ZldkXG5zcmFYcGRLcUFPaVBDcklyT0VmZnNMNG9JakZydmovTnozRzMvYWRIYlI5bStrZCtYUEJNUGVRUVVvc2ZNQWRMXG5HTSswMHhnbkVMc3A3ZjU0ZmZWbVRYYWRUSzc2NFNQUlZpZzhZZ3JraUdlbHRURmg0TGtnQzhUUmR2ZUZ5Tmk4XG5WcW1CYzB1VXc4UW8vajk3OXlTcnVsZzhZWDBmRGFTMFYwcFdUNTJBVTMxU2hSRGhHT256MEVwZGZ4RWNoMTlWXG5YNHVQdUhoSFZpV3hqMEhldVVHVXAwRHB2dlFsQVFUdTlqb282NkhCSlRObTdUNmpwN2hmU3VEZjJnSGVvdDRYXG5oTmxLN01aTXB2TUZpM1k3Y1JGMkhKcDNHTWJ2NjVzaFlCYkxuTGg4clg5Vzk4YTZIVjBGZ1pTYSs1WnVKYnE2XG5HajEzS1lWVkpRa2Ncbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSU0EgMjA0OCBNMDFcbklzc3VlcjpDID0gVVMsIE8gPSBBbWF6b24sIENOID0gQW1hem9uIFJvb3QgQ0EgMVxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOjA3NzMxMjM4MGI5ZDY2ODhhMzNiMWVkOWJmOWNjZGE2OGUwZTBmXG5TaWduYXR1cmUgQWxnb3JpdGhtOnNoYTI1NldpdGhSU0FFbmNyeXB0aW9uXG5QdWJsaWMgS2V5IEFsZ29yaXRobTpyc2FFbmNyeXB0aW9uXG5YNTA5djMgQmFzaWMgQ29uc3RyYWludHM6Q0E6VFJVRSwgcGF0aGxlbjowXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnblxuWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZTpUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiwgVExTIFdlYiBDbGllbnQgQXV0aGVudGljYXRpb25cblg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOjgxOkI4OjBFOjYzOjhBOjg5OjEyOjE4OkU1OkZBOjNCOjNCOjUwOjk1OjlGOkU2OkU1OjkwOjEzOjg1XG5YNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOjg0OjE4OkNDOjg1OjM0OkVDOkJDOjBDOjk0Ojk0OjJFOjA4OjU5OjlDOkM3OkIyOjEwOjRFOjBBOjA4XG5BdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzOk9DU1AgLSBVUkk6aHR0cDovL29jc3Aucm9vdGNhMS5hbWF6b250cnVzdC5jb21cbkNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbS9yb290Y2ExLmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucm9vdGNhMS5hbWF6b250cnVzdC5jb20vcm9vdGNhMS5jcmxcblg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczpQb2xpY3k6IDIuMjMuMTQwLjEuMi4xXG5TdGFydCBkYXRlOkF1ZyAyMyAyMjoyMToyOCAyMDIyIEdNVFxuRXhwaXJlIGRhdGU6QXVnIDIzIDIyOjIxOjI4IDIwMzAgR01UXG5SU0EgUHVibGljIEtleToyMDQ4XG5yc2Eobik6RUI3MTJDQTlDQjFGODgyODkyMzIzMEFGOEE1NzBGNzhCNzM3MjU5NTU1ODdBQzY3NUM5N0QzMjJDOERBQTIxNDY3NkI3Q0YwNjdEQUUyMDMyQUIzNTYxMjVEQzZCNTQ3Rjk2NzA4QTc5MzdBOTU5MjE4MEZCNEY5RjkxMDM2OUE3RjJGODBCNjRGQkExMzRFQzc1RDUzMUVFMEREOTYzMzA3MjBEMzk2QkMxMkU0NzQ1MDQyQTEwNTEzNzNCNTRGOUI0NDI0RkUyRDdGRURCQzIyODVFQzM2MjEzMzk3NzUwNkNFMjcxODgyRENFM0Q5QzU4MjA3OEQ1RTI2MDEyNjI2NjcxRkQ5M0YxM0NGMzJCQTZCQUQ3ODY0RkNBQUZGMEUwMjNDMDdERjlDMDU3ODcyOENGREVBNzVCNzAzMjg4NERBRTg2RTA3OENEMDUwODVFRjgxNTRCMjcxNkVFQzZENjJFRjhGOTRDMzVFRTlDNEE0RDA5MUMwMkUyNDkxOThDQUVFQkEyNThFRDRGNjcxQjZGQjVCNkIzODA2NDgzNzQ3OEQ4NkRDRjJFQTA2RkI3NjM3N0Q5RUZGNDI0RTRENTg4MjkzQ0ZFMjcxQzI3OEIxN0FBQjRCNUI5NDM3ODg4MUU0RDlBRjI0QUVGODcyQzU2NUZCNEJCNDUxRTdcbnJzYShlKToxMDAwMVxuU2lnbmF0dXJlOmFkOjAwOmRlOjAyOjA1OjIzOjJlOjA2OjMyOjYyOmI0OjZiOmIxOjk0OjE2OmU0OjExOjQwOmRlOjJiOmZhOjU5OmMxOjM1OmVmOmUwOmFhOjhmOjJiOjQxOmI5OmQxOmYzOjg3OjM5OjAwOjFkOmYyOjNkOmI1OmE3OjQ3OjBjOjA2OjA2OmM2OjkxOmYzOjA3OjU3OjAyOmQ0OmVkOmJkOjE3OmMxOjkwOjlhOmJmOjQ4Ojc1OmEyOjA3OjRmOjMwOmRkOjRhOjZhOjQyOmI1OjBkOjNkOjE1OmMwOjBmOmZlOjg0OjViOmM2OjNjOjk5OmNjOjU3OjUyOmIxOmQ4OjZlOjEyOmQ1Ojk2OjkyOjkzOjRiOjk0OmU1OjA3OmU4Ojg5OjgyOjA4OjZhOjdhOjM0OmQ0OjllOjY0OmUxOjNkOjg3OjZhOjkyOjkwOjlhOjYzOmExOjRiOmY4OjhmOmI2OmVhOjM0OmQzOjA1OmJlOjIwOmMyOmRlOjA2OmUyOjhjOjlmOjczOjhiOjlmOjRkOjM5Ojg1OmNhOmNlOjE5OjM2OjlkOjg1OmM5OjllOmM5OmY4OjUwOjNmOmI2OjdlOjg4OmExOmVmOmNhOjg0OjA2OjhiOjUwOmI0OjBhOjVjOmE2OjFjOjQ0OmYxOmZkOmM4OjYxOjQwOjYwOmYyOjYxOjI1OmFhOjA3OmY0OmM3OmMyOjczOjc1OmU0OjBjOjBiOjQyOjhkOjA0OmU1OjVmOjQ0OjQ4Ojk5OjViOjdiOjg5OjgxOjk2OmE3Ojg4OjlkOjRiOjBkOjYyOmU4OjA0OmM0OmQ3OmZlOmI0OmU4OmIyOjZkOmNhOmVjOmMwOjFjOmJjOjM4OjViOjFkOmRmOjg1OmNlOjViOjdhOmUzOjQ5OjRiOjZjOmI5OmE3OmRkOmY0OjA1OmIyOjQ5OmFkOmUxOmM1OjE0OjZiOmMyOmNjOmViOmNkOjdmOmQ2OjU4OjY5OmJhOmMzOjIwOjdlOjdmOmIwOmI4OlxuLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlFWGpDQ0EwYWdBd0lCQWdJVEIzTVNPQXVkWm9pak94N1p2NXpOcG80T0R6QU5CZ2txaGtpRzl3MEJBUXNGXG5BREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2XG5iMjRnVW05dmRDQkRRU0F4TUI0WERUSXlNRGd5TXpJeU1qRXlPRm9YRFRNd01EZ3lNekl5TWpFeU9Gb3dQREVMXG5NQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVjTUJvR0ExVUVBeE1UUVcxaGVtOXVJRkpUXG5RU0F5TURRNElFMHdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPdHhMS25MXG5INGdva2pJd3I0cFhEM2kzTnlXVlZZZXNaMXlYMHlMSTJxSVVaMnQ4OEdmYTRnTXFzMVlTWGNhMVIvbG5DS2VUXG5lcFdTR0ErMCtma1FOcHAvTDRDMlQ3b1RUc2RkVXg3ZzNaWXpCeURUbHJ3UzVIUlFRcUVGRTNPMVQ1dEVKUDR0XG5mKzI4SW9Yc05pRXpsM1VHemljWWd0emoyY1dDQjQxZUpnRW1KbWNmMlQ4VHp6SzZhNjE0WlB5cS93NENQQWZmXG5uQVY0Y296OTZuVzNBeWlFMnVodUI0elFVSVh2Z1ZTeWNXN3NiV0x2ajVURFh1bkVwTkNSd0M0a2taaks3cm9sXG5qdFQyY2JiN1cyczRCa2czUjQyRzNQTHFCdnQyTjMyZS8wSk9UVmlDazgvaWNjSjRzWHFyUzF1VU40aUI1Tm12XG5KSzc0Y3NWbCswdTBVZWNDQXdFQUFhT0NBVm93Z2dGV01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdEZ1lEXG5WUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQWRCZ05WXG5IUTRFRmdRVWdiZ09ZNHFKRWhqbCtqczdVSldmNXVXUUU0VXdId1lEVlIwakJCZ3dGb0FVaEJqTWhUVHN2QXlVXG5sQzRJV1p6SHNoQk9DZ2d3ZXdZSUt3WUJCUVVIQVFFRWJ6QnRNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2XG5iMk56Y0M1eWIyOTBZMkV4TG1GdFlYcHZiblJ5ZFhOMExtTnZiVEE2QmdnckJnRUZCUWN3QW9ZdWFIUjBjRG92XG5MMk55ZEM1eWIyOTBZMkV4TG1GdFlYcHZiblJ5ZFhOMExtTnZiUzl5YjI5MFkyRXhMbU5sY2pBL0JnTlZIUjhFXG5PREEyTURTZ01xQXdoaTVvZEhSd09pOHZZM0pzTG5KdmIzUmpZVEV1WVcxaGVtOXVkSEoxYzNRdVkyOXRMM0p2XG5iM1JqWVRFdVkzSnNNQk1HQTFVZElBUU1NQW93Q0FZR1o0RU1BUUlCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCXG5BUUN0QU40Q0JTTXVCakppdEd1eGxCYmtFVURlSy9wWndUWHY0S3FQSzBHNTBmT0hPUUFkOGoyMXAwY01CZ2JHXG5rZk1IVndMVTdiMFh3WkNhdjBoMW9nZFBNTjFLYWtLMURUMFZ3QS8raEZ2R1BKbk1WMUt4Mkc0UzFaYVNrMHVVXG41UWZvaVlJSWFubzAxSjVrNFQySGFwS1FtbU9oUy9pUHR1bzAwd1crSU1MZUJ1S01uM09MbjAwNWhjck9HVGFkXG5oY21leWZoUVA3WitpS0h2eW9RR2kxQzBDbHltSEVUeC9jaGhRR0R5WVNXcUIvVEh3bk4xNUF3TFFvMEU1VjlFXG5TSmxiZTRtQmxxZUluVXNOWXVnRXhOZit0T2l5YmNyc3dCeThPRnNkMzRYT1czcmpTVXRzdWFmZDlBV3lTYTNoXG54UlJyd3N6cnpYL1dXR202d3lCK2Y3QzRcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSb290IENBIDFcbklzc3VlcjpDID0gVVMsIFNUID0gQXJpem9uYSwgTCA9IFNjb3R0c2RhbGUsIE8gPSBcIlN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy5cIiwgQ04gPSBTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMlxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOjA2N2Y5NDRhMmEyN2NkZjNmYWMyYWUyYjAxZjkwOGVlYjljNGM2XG5TaWduYXR1cmUgQWxnb3JpdGhtOnNoYTI1NldpdGhSU0FFbmNyeXB0aW9uXG5QdWJsaWMgS2V5IEFsZ29yaXRobTpyc2FFbmNyeXB0aW9uXG5YNTA5djMgQmFzaWMgQ29uc3RyYWludHM6Q0E6VFJVRVxuWDUwOXYzIEtleSBVc2FnZTpEaWdpdGFsIFNpZ25hdHVyZSwgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ25cblg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOjg0OjE4OkNDOjg1OjM0OkVDOkJDOjBDOjk0Ojk0OjJFOjA4OjU5OjlDOkM3OkIyOjEwOjRFOjBBOjA4XG5YNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOjlDOjVGOjAwOkRGOkFBOjAxOkQ3OjMwOjJCOjM4Ojg4OkEyOkI4OjZEOjRBOjlDOkYyOjExOjkxOjgzXG5BdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzOk9DU1AgLSBVUkk6aHR0cDovL29jc3Aucm9vdGcyLmFtYXpvbnRydXN0LmNvbVxuQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY3J0LnJvb3RnMi5hbWF6b250cnVzdC5jb20vcm9vdGcyLmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY3JsXG5YNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6UG9saWN5OiBYNTA5djMgQW55IFBvbGljeVxuU3RhcnQgZGF0ZTpNYXkgMjUgMTI6MDA6MDAgMjAxNSBHTVRcbkV4cGlyZSBkYXRlOkRlYyAzMSAwMTowMDowMCAyMDM3IEdNVFxuUlNBIFB1YmxpYyBLZXk6MjA0OFxucnNhKG4pOkIyNzg4MDcxQ0E3OEQ1RTM3MUFGNDc4MDUwNzQ3RDZFRDhENzg4NzZGNDk5NjhGNzU4MjE2MEY5NzQ4NDAxMkZBQzAyMkQ4NkQzQTA0MzdBNEVCMkE0RDAzNkJBMDFCRThEREI0OEM4MDcxNzM2NENGNEVFODgyM0M3M0VFQjM3RjVCNTE5Rjg0OTY4QjBERUQ3Qjk3NjM4MUQ2MTlFQTRGRTgyMzZBNUU1NEE1NkU0NDVFMUY5RkRCNDE2RkE3NERBOUM5QjM1MzkyRkZBQjAyMDUwMDY2QzdBRDA4MEIyQTZGOUFGRUM0NzE5OEY1MDM4MDdEQ0EyODczOTU4RjhCQUQ1QTlGOTQ4NjczMDk2RUU5NDc4NUU2Rjg5QTM1MUMwMzA4NjY2QTE0NTY2QkE1NEVCQTNDMzkxRjk0OERDRkZEMUU4MzAyRDdEMkQ3NDcwMzVENzg4MjRGNzlFQzQ1OTZFQkI3Mzg3MTdGMjMyNDYyOEI4NDNGQUI3MURBQUNBQjRGMjlGMjQwRTJENEJGNzcxNUM1RTY5RkZFQTk1MDJDQjM4OEFBRTUwMzg2RkRCRkIyRDYyMUJDNUM3MUU1NEUxNzdFMDY3QzgwRjlDODcyM0Q2M0Y0MDIwN0YyMDgwQzQ4MDRDM0UzQjI0MjY4RTA0QUU2QzlBQzhBQTBEXG5yc2EoZSk6MTAwMDFcblNpZ25hdHVyZTo2MjozNzo0Mjo1YzpiYzoxMDpiNTozZTo4YjoyYzplOTowYzo5Yjo2Yzo0NTplMjowNzowMDo3YTpmOTpjNTo1ODowYjpiOTowODo4YzozZTplZDpiMzoyNTozYzpiNTo2Zjo1MDplNDpjZDozNTo2YTphNzo5MzozNDo5NjozMjoyMTphOTo0ODo0NDphYjo5YzplZDozZDpiNDphYTo3Mzo2ZDplNDo3ZjoxNjo4MDo4OTo2YzpjZjoyODowMzoxODo4Mzo0Nzo3OTphMzoxMDo3ZTozMDo1YjphYzozYjpiMDo2MDplMDo3NzpkNDowODphNjplMToxZDo3Yzo1ZTpjMDpiYjpmOTo5YTo3YjoyMjo5ZDphNzowMDowOTo3ZTphYzo0NjoxNzo4MzpkYzo5YzoyNjo1Nzo5OTozMDozOTo2Mjo5Njo4ZjplZDpkYTpkZTphYTpjNTpjYzoxYjozZTpjYTo0Mzo2ODo2Yzo1NzoxNjpiYzpkNTowZToyMDoyZTpmZTpmZjpjMjo2YTo1ZDoyZTphMDo0YTo2ZDoxNDo1ODo4Nzo5NDplNjozOTozMTo1Zjo3Yzo3MzpjYjo5MDo4ODo2YTo4NDoxMTo5NjoyNzphNjplZDpkOTo4MTo0NjphNjo3ZTphMzo3MjowMDowYTo1MjozZTo4Mzo4ODowNzo2Mzo3Nzo4OTo2OToxNzowZjozOTo4NTpkMjphYjowODo0NTo0ZDpkMDo1MTozYTpmZDo1ZDo1ZDozNzo2NDo0Yzo3ZTozMDpiMjo1NToyNDo0Mjo5ZDozNjpiMDo1ZDo5YzoxNzo4MTo2MTpmMTpjYTpmOToxMDowMjoyNDphYjplYjowZDo3NDo5MTo4ZDo3Yjo0NToyOTo1MDozOTo4ODpiMjphNjo4OTozNToyNToxZToxNDo2YTo0NzoyMzozMToyZjo1Yzo5YTpmYTphZDo5YTowZTo2Mjo1MTphNDoyYTphOTpjNDpmOTozNDo5ZDoyMToxODpcbi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRWtqQ0NBM3FnQXdJQkFnSVRCbitVU2lvbnpmUDZ3cTRyQWZrSTdybkV4akFOQmdrcWhraUc5dzBCQVFzRlxuQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOalxuYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eFxuT3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMVxuZEdodmNtbDBlU0F0SUVjeU1CNFhEVEUxTURVeU5URXlNREF3TUZvWERUTTNNVEl6TVRBeE1EQXdNRm93T1RFTFxuTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdlxuYjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMSjRnSEhLZU5YalxuY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdIRnpaTVxuOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xd1xuSUZBR2JIclFnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNlxuVk91anc1SDVTTnovMGVnd0xYMHRkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTFxuOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbVxuamdTdWJKcklxZzBDQXdFQUFhT0NBVEV3Z2dFdE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL1xuQkFRREFnR0dNQjBHQTFVZERnUVdCQlNFR015Rk5PeThESlNVTGdoWm5NZXlFRTRLQ0RBZkJnTlZIU01FR0RBV1xuZ0JTY1h3RGZxZ0hYTUNzNGlLSzRiVXFjOGhHUmd6QjRCZ2dyQmdFRkJRY0JBUVJzTUdvd0xnWUlLd1lCQlFVSFxuTUFHR0ltaDBkSEE2THk5dlkzTndMbkp2YjNSbk1pNWhiV0Y2YjI1MGNuVnpkQzVqYjIwd09BWUlLd1lCQlFVSFxuTUFLR0xHaDBkSEE2THk5amNuUXVjbTl2ZEdjeUxtRnRZWHB2Ym5SeWRYTjBMbU52YlM5eWIyOTBaekl1WTJWeVxuTUQwR0ExVWRId1EyTURRd01xQXdvQzZHTEdoMGRIQTZMeTlqY213dWNtOXZkR2N5TG1GdFlYcHZiblJ5ZFhOMFxuTG1OdmJTOXliMjkwWnpJdVkzSnNNQkVHQTFVZElBUUtNQWd3QmdZRVZSMGdBREFOQmdrcWhraUc5dzBCQVFzRlxuQUFPQ0FRRUFZamRDWEx3UXRUNkxMT2tNbTJ4RjRnY0Fldm5GV0F1NUNJdys3Yk1sUExWdlVPVE5OV3Fua3pTV1xuTWlHcFNFU3JuTzA5dEtwemJlUi9Gb0NKYk04b0F4aURSM21qRUg0d1c2dzdzR0RnZDlRSXB1RWRmRjdBdS9tYVxuZXlLZHB3QUpmcXhHRjRQY25DWlhtVEE1WXBhUDdkcmVxc1hNR3o3S1EyaHNWeGE4MVE0Z0x2Ny93bXBkTHFCS1xuYlJSWWg1VG1PVEZmZkhQTGtJaHFoQkdXSjZidDJZRkdwbjZqY2dBS1VqNkRpQWRqZDRscEZ3ODVoZEtyQ0VWTlxuMEZFNi9WMWROMlJNZmpDeVZTUkNuVGF3WFp3WGdXSHh5dmtRQWlTcjZ3MTBrWTE3UlNsUU9ZaXlwb2sxSlI0VVxuYWtjak1TOWNtdnF0bWc1aVVhUXFxY1Q1TkowaEdBPT1cbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBTVCA9IEFyaXpvbmEsIEwgPSBTY290dHNkYWxlLCBPID0gXCJTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuXCIsIENOID0gU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzJcbklzc3VlcjpDID0gVVMsIE8gPSBcIlN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy5cIiwgT1UgPSBTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eVxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOmE3MGU0YTRjMzQ4MmI3N2ZcblNpZ25hdHVyZSBBbGdvcml0aG06c2hhMjU2V2l0aFJTQUVuY3J5cHRpb25cblB1YmxpYyBLZXkgQWxnb3JpdGhtOnJzYUVuY3J5cHRpb25cblg1MDl2MyBCYXNpYyBDb25zdHJhaW50czpDQTpUUlVFXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnblxuWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6OUM6NUY6MDA6REY6QUE6MDE6RDc6MzA6MkI6Mzg6ODg6QTI6Qjg6NkQ6NEE6OUM6RjI6MTE6OTE6ODNcblg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6QkY6NUY6Qjc6RDE6Q0U6REQ6MUY6ODY6RjQ6NUI6NTU6QUM6REM6RDc6MTA6QzI6MEU6QTk6ODg6RTdcbkF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3M6T0NTUCAtIFVSSTpodHRwOi8vby5zczIudXMvXG5DQSBJc3N1ZXJzIC0gVVJJOmh0dHA6Ly94LnNzMi51cy94LmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9zLnNzMi51cy9yLmNybFxuWDUwOXYzIENlcnRpZmljYXRlIFBvbGljaWVzOlBvbGljeTogWDUwOXYzIEFueSBQb2xpY3lcblN0YXJ0IGRhdGU6U2VwICAyIDAwOjAwOjAwIDIwMDkgR01UXG5FeHBpcmUgZGF0ZTpKdW4gMjggMTc6Mzk6MTYgMjAzNCBHTVRcblJTQSBQdWJsaWMgS2V5OjIwNDhcbnJzYShuKTpENTBDM0FDNDJBRjk0RUUyRjVCRTE5OTc1RjhFODg1M0IxMUYzRkNCQ0Y5RjIwMTM2RDI5M0FDODBGN0QzQ0Y3NkI3NjM4NjNEOTM2NjBBODlCNUU1QzAwODBCMjJGNTk3RkY2ODdGOTI1NDM4NkU3NjkxQjUyOUE5MEUxNzFFM0Q4MkQwRDRFNkZGNkM4NDlEOUI2RjMxQTU2QUUyQkI2NzQxNEVCQ0ZGQjI2RTMxQUJBMUQ5NjJFNkEzQjU4OTQ4OTQ3NTZGRjI1QTA5MzcwNTM4M0RBODQ3NDE0QzM2NzlFMDQ2ODNBREY4RTQwNUExRDRBNEVDRjQzOTEzQkU3NTZENjAwNzBDQjUyRUU3QjdEQUUzQUU3QkMzMUY5NDVGNkMyNjBDRjEzNTkwMjJCODBDQzM0NDdERkI5REU5MDY1NkQwMkNGMkM5MUE2QTZFN0RFODUxODQ5N0M2NjRFQTMzQTZEQTlCNUVFMzQyRUJBMEQwM0I4MzNERjQ3RUJCMTZCOEQyNUQ5OUJDRTgxRDE0NTQ2MzI5NjcwODdERTAyMEU0OTQzODVCNjZDNzNCQjY0RUE2MTQxQUNDOUQ0NTRERjg3MkZDNzIyQjIyNkNDOUY1OTU0Njg5RkZDQkUyQTJGQzQ1NTFDNzU0MDYwMTc4NTAyNTUzOThCN0YwNVxucnNhKGUpOjEwMDAxXG5TaWduYXR1cmU6MjM6MWQ6ZTM6OGE6NTc6Y2E6N2Q6ZTk6MTc6Nzk6NGM6ZjE6MWU6NTU6ZmQ6Y2M6NTM6NmU6M2U6NDc6MGY6ZGY6YzY6NTU6ZjI6YjI6MDQ6MzY6ZWQ6ODA6MWY6NTM6YzQ6NWQ6MzQ6Mjg6NmI6YmU6Yzc6NTU6ZmM6Njc6ZWE6Y2I6M2Y6N2Y6OTA6YjI6MzM6Y2Q6MWI6NTg6MTA6ODI6MDI6Zjg6Zjg6MmY6ZjU6MTM6NjA6ZDQ6MDU6Y2U6ZjE6ODE6MDg6YzE6ZGQ6YTc6NzU6OTc6NGY6MTg6Yjk6NmQ6ZGU6Zjc6OTM6OTE6MDg6YmE6N2U6NDA6MmM6ZWQ6YzE6ZWE6YmI6NzY6OWU6MzM6MDY6Nzc6MWQ6MGQ6MDg6N2Y6NTM6ZGQ6MWI6NjQ6YWI6ODI6Mjc6ZjE6Njk6ZDU6NGQ6NWU6YWU6ZjQ6YTE6YzM6NzU6YTc6NTg6NDQ6MmQ6ZjI6M2M6NzA6OTg6YWM6YmE6Njk6YjY6OTU6Nzc6N2Y6MGY6MzE6NWU6MmM6ZmM6YTA6ODc6M2E6NDc6Njk6ZjA6Nzk6NWY6ZjQ6MTQ6NTQ6YTQ6OTU6NWU6MTE6Nzg6MTI6NjA6Mjc6Y2U6OWY6YzI6Nzc6ZmY6MjM6NTM6Nzc6NWQ6YmE6ZmY6ZWE6NTk6ZTc6ZGI6Y2Y6YWY6OTI6OTY6ZWY6MjQ6OWE6MzU6MTA6N2E6OWM6OTE6YzY6MGU6N2Q6OTk6ZjY6M2Y6MTk6ZGY6ZjU6NzI6NTQ6ZTE6MTU6YTk6MDc6NTk6N2I6ODM6YmY6NTI6MmU6NDY6OGM6YjI6MDA6NjQ6NzY6MWM6NDg6ZDM6ZDg6Nzk6ZTg6NmU6NTY6Y2M6YWU6MmM6MDM6OTA6ZDc6MTk6Mzg6OTk6ZTQ6Y2E6MDk6MTk6NWI6ZmY6MDc6OTY6YjA6YTg6N2Y6MzQ6NDk6ZGY6NTY6YTk6Zjc6YjA6NWY6ZWQ6MzM6ZWQ6OGM6NDc6Yjc6MzA6MDM6NWQ6ZjQ6MDM6OGM6XG4tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbk1JSUVkVENDQTEyZ0F3SUJBZ0lKQUtjT1NrdzBncmQvTUEwR0NTcUdTSWIzRFFFQkN3VUFNR2d4Q3pBSkJnTlZcbkJBWVRBbFZUTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdcbk1BWURWUVFMRXlsVGRHRnlabWxsYkdRZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBcbmVUQWVGdzB3T1RBNU1ESXdNREF3TURCYUZ3MHpOREEyTWpneE56TTVNVFphTUlHWU1Rc3dDUVlEVlFRR0V3SlZcblV6RVFNQTRHQTFVRUNCTUhRWEpwZW05dVlURVRNQkVHQTFVRUJ4TUtVMk52ZEhSelpHRnNaVEVsTUNNR0ExVUVcbkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakU3TURrR0ExVUVBeE15VTNSaGNtWnBcblpXeGtJRk5sY25acFkyVnpJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlcbk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZERHJFS3ZsTzR2VytHWmRmam9oVHNSOC9cbnk4K2ZJQk50S1RySUQzMDg5MnQyT0dQWk5tQ29tMTVjQUlDeUwxbC85b2Y1SlVPRzUya2JVcHFRNFhIajJDME5cblRtLzJ5RW5adHZNYVZxNHJ0blFVNjgvN0p1TWF1aDJXTG1vN1dKU0pSMWIvSmFDVGNGT0Qyb1IwRk1Obm5nUm9cbk90K09RRm9kU2s3UFE1RTc1MWJXQUhETFV1NTdmYTQ2NTd3eCtVWDJ3bURQRTFrQ0s0RE1ORWZmdWQ2UVpXMENcbnp5eVJwcWJuM29VWVNYeG1UcU02YmFtMTdqUXV1ZzBEdURQZlIrdXhhNDBsMlp2T2dkRkZSaktXY0lmZUFnNUpcblE0VzJiSE83Wk9waFFhekoxRlRmaHkvSElySW16SjlaVkdpZi9MNHFMOFJWSEhWQVlCZUZBbFU1aTM4RkFnTUJcbkFBR2pnZkF3Z2Uwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9cbkJCWUVGSnhmQU4rcUFkY3dLemlJb3JodFNwenlFWkdETUI4R0ExVWRJd1FZTUJhQUZMOWZ0OUhPM1IrRzlGdFZcbnJOelhFTUlPcVlqbk1FOEdDQ3NHQVFVRkJ3RUJCRU13UVRBY0JnZ3JCZ0VGQlFjd0FZWVFhSFIwY0RvdkwyOHVcbmMzTXlMblZ6THpBaEJnZ3JCZ0VGQlFjd0FvWVZhSFIwY0RvdkwzZ3VjM015TG5WekwzZ3VZMlZ5TUNZR0ExVWRcbkh3UWZNQjB3RzZBWm9CZUdGV2gwZEhBNkx5OXpMbk56TWk1MWN5OXlMbU55YkRBUkJnTlZIU0FFQ2pBSU1BWUdcbkJGVWRJQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUNNZDQ0cFh5bjNwRjNsTThSNVYvY3hUYmo1SEQ5L0dcblZmS3lCRGJ0Z0I5VHhGMDBLR3UreDFYOForckxQMytRc2pQTkcxZ1FnZ0w0K0MvMUUyRFVCYzd4Z1FqQjNhZDFcbmwwOFl1VzNlOTVPUkNMcCtRQ3p0d2VxN2RwNHpCbmNkRFFoL1U5MGJaS3VDSi9GcDFVMWVydlNodzNXbldFUXRcbjhqeHdtS3k2YWJhVmQzOFBNVjRzL0tDSE9rZHA4SGxmOUJSVXBKVmVFWGdTWUNmT244SjMveU5UZDEyNi8rcFpcbjU5dlByNUtXN3lTYU5SQjZuSkhHRG4yWjlqOFozL1Z5Vk9FVnFRZFplNE8vVWk1R2pMSUFaSFljU05QWWVlaHVcblZzeXVMQU9RMXhrNG1lVEtDUmxiL3dlV3NLaC9ORW5mVnFuM3NGL3RNKzJNUjdjd0ExMzBBNHc9XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLCJjb250ZW50X3R5cGUiOm51bGwsImNvbm5faWQiOjAsImVycm9ybXNnIjpudWxsLCJleGl0Y29kZSI6MCwiZmlsZW5hbWVfZWZmZWN0aXZlIjpudWxsLCJmdHBfZW50cnlfcGF0aCI6bnVsbCwiaHR0cF9jb2RlIjozMDIsImh0dHBfY29ubmVjdCI6MCwiaHR0cF92ZXJzaW9uIjoiMS4xIiwibG9jYWxfaXAiOiIxOTIuMTY4LjExLjExMCIsImxvY2FsX3BvcnQiOjU0ODg2LCJtZXRob2QiOiJHRVQiLCJudW1fY2VydHMiOjQsIm51bV9jb25uZWN0cyI6MSwibnVtX2hlYWRlcnMiOjQsIm51bV9yZWRpcmVjdHMiOjAsInByb3h5X3NzbF92ZXJpZnlfcmVzdWx0IjowLCJyZWRpcmVjdF91cmwiOiJodHRwczovL2F3cy5hbWF6b24uY29tL2lhbSIsInJlZmVyZXIiOm51bGwsInJlbW90ZV9pcCI6IjEwLjAuMC4xMCIsInJlbW90ZV9wb3J0Ijo0NDMsInJlc3BvbnNlX2NvZGUiOjMwMiwic2NoZW1lIjoiSFRUUFMiLCJzaXplX2Rvd25sb2FkIjowLCJzaXplX2hlYWRlciI6MTcyLCJzaXplX3JlcXVlc3QiOjkwLCJzaXplX3VwbG9hZCI6MCwic3BlZWRfZG93bmxvYWQiOjAsInNwZWVkX3VwbG9hZCI6MCwic3NsX3ZlcmlmeV9yZXN1bHQiOjAsInRpbWVfYXBwY29ubmVjdCI6MC42NzA0MTgsInRpbWVfY29ubmVjdCI6MC4yMTg4MTAsInRpbWVfbmFtZWxvb2t1cCI6MC4wMDExOTEsInRpbWVfcHJldHJhbnNmZXIiOjAuNjcwNTE0LCJ0aW1lX3JlZGlyZWN0IjowLjAwMDAwMCwidGltZV9zdGFydHRyYW5zZmVyIjowLjg3ODcxMSwidGltZV90b3RhbCI6MC44Nzg3NTksInVybCI6Imh0dHBzOi8vc3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tOjQ0MyIsInVybC5zY2hlbWUiOiJodHRwcyIsInVybC51c2VyIjpudWxsLCJ1cmwucGFzc3dvcmQiOm51bGwsInVybC5vcHRpb25zIjpudWxsLCJ1cmwuaG9zdCI6InN0cy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsInVybC5wb3J0IjoiNDQzIiwidXJsLnBhdGgiOiIvIiwidXJsLnF1ZXJ5IjpudWxsLCJ1cmwuZnJhZ21lbnQiOm51bGwsInVybC56b25laWQiOm51bGwsInVybGUuc2NoZW1lIjoiaHR0cHMiLCJ1cmxlLnVzZXIiOm51bGwsInVybGUucGFzc3dvcmQiOm51bGwsInVybGUub3B0aW9ucyI6bnVsbCwidXJsZS5ob3N0Ijoic3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwidXJsZS5wb3J0IjoiNDQzIiwidXJsZS5wYXRoIjoiLyIsInVybGUucXVlcnkiOm51bGwsInVybGUuZnJhZ21lbnQiOm51bGwsInVybGUuem9uZWlkIjpudWxsLCJ1cmxfZWZmZWN0aXZlIjoiaHR0cHM6Ly9zdHMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb206NDQzLyIsInVybG51bSI6MCwieGZlcl9pZCI6MCwiY3VybF92ZXJzaW9uIjoibGliY3VybC84LjIuMSBPcGVuU1NMLzMuMS40IHpsaWIvMS4yLjEzIGJyb3RsaS8xLjEuMCBsaWJpZG4yLzIuMy43IGxpYnBzbC8wLjIxLjIgKCtsaWJpZG4yLzIuMy40KSBsaWJzc2gvMC4xMC42L29wZW5zc2wvemxpYiBuZ2h0dHAyLzEuNTUuMSBPcGVuTERBUC8yLjYuNyJ9Ck5WX0NVUkxKU09OX0VORAo=", + ensurePrivate: true, + expectSuccess: true, + errorMessage: "the remote IP is non-private while it should be", + }, + { + name: "FailureWithPrivateRemoteIP", + // NV_CURLJSON_BEGIN + // ... + // "remote_ip":"54.240.248.204" + // ... + // NV_CURLJSON_END + output: "TlZfQ1VSTEpTT05fQkVHSU4KQE5WQHsiY2VydHMiOiJTdWJqZWN0OkNOID0gc3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tXG5Jc3N1ZXI6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSU0EgMjA0OCBNMDFcblZlcnNpb246MlxuU2VyaWFsIE51bWJlcjowMWU0MjMyMjM5NmRlODRkNjkzZjkwOGQ3MzBhMDJmM1xuU2lnbmF0dXJlIEFsZ29yaXRobTpzaGEyNTZXaXRoUlNBRW5jcnlwdGlvblxuUHVibGljIEtleSBBbGdvcml0aG06cnNhRW5jcnlwdGlvblxuWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjo4MTpCODowRTo2Mzo4QTo4OToxMjoxODpFNTpGQTozQjozQjo1MDo5NTo5RjpFNjpFNTo5MDoxMzo4NVxuWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6OTE6NzM6MUE6MUQ6Q0M6MUI6RkE6NjU6RjY6Q0U6RDc6Rjk6MTc6QUE6MjI6MDk6NjQ6Qjg6NDA6RDVcblg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWU6RE5TOnN0cy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSwgRE5TOiouc3RzLnVzLXdlc3QtMi52cGNlLmFtYXpvbmF3cy5jb21cblg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczpQb2xpY3k6IDIuMjMuMTQwLjEuMi4xXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBLZXkgRW5jaXBoZXJtZW50XG5YNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlOlRMUyBXZWIgU2VydmVyIEF1dGhlbnRpY2F0aW9uLCBUTFMgV2ViIENsaWVudCBBdXRoZW50aWNhdGlvblxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucjJtMDEuYW1hem9udHJ1c3QuY29tL3IybTAxLmNybFxuQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzczpPQ1NQIC0gVVJJOmh0dHA6Ly9vY3NwLnIybTAxLmFtYXpvbnRydXN0LmNvbVxuQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXJcblg1MDl2MyBCYXNpYyBDb25zdHJhaW50czpDQTpGQUxTRVxuQ1QgUHJlY2VydGlmaWNhdGUgU0NUczpTaWduZWQgQ2VydGlmaWNhdGUgVGltZXN0YW1wOlxuICAgIFZlcnNpb24gICA6IHYxICgweDApXG4gICAgTG9nIElEICAgIDogQ0Y6MTE6NTY6RUU6RDU6MkU6N0M6QUY6RjM6ODc6NUI6RDk6Njk6MkU6OUI6RTk6XG4gICAgICAgICAgICAgICAgMUE6NzE6Njc6NEE6QjA6MTc6RUM6QUM6MDE6RDI6NUI6Nzc6Q0U6Q0M6M0I6MDhcbiAgICBUaW1lc3RhbXAgOiBKYW4gMTggMDc6MzQ6MjUuOTI2IDIwMjQgR01UXG4gICAgRXh0ZW5zaW9uczogbm9uZVxuICAgIFNpZ25hdHVyZSA6IGVjZHNhLXdpdGgtU0hBMjU2XG4gICAgICAgICAgICAgICAgMzA6NDQ6MDI6MjA6NUU6OEI6MTY6MzY6QTQ6MkM6MDE6QjY6M0Y6RkU6MTE6NTA6XG4gICAgICAgICAgICAgICAgNDI6MUE6MDQ6RTU6QTk6QTI6OUU6MEM6MEM6QTU6MDc6RUY6NDk6QUU6QTY6ODE6XG4gICAgICAgICAgICAgICAgNUE6NzQ6QTA6OUI6MDI6MjA6NUM6QzA6MkM6Nzc6QzY6Qzk6M0E6MzI6RDM6Qzk6XG4gICAgICAgICAgICAgICAgODU6QTc6NTQ6QUU6REI6RTY6OTE6NzA6ODc6Mzk6RDQ6QTU6QTM6ODk6NzU6Q0Q6XG4gICAgICAgICAgICAgICAgQjI6OEY6RTY6MTA6QjY6NkFcblNpZ25lZCBDZXJ0aWZpY2F0ZSBUaW1lc3RhbXA6XG4gICAgVmVyc2lvbiAgIDogdjEgKDB4MClcbiAgICBMb2cgSUQgICAgOiAzRjoxNzo0Qjo0RjpENzoyMjo0Nzo1ODo5NDoxRDo2NToxQzo4NDpCRTowRDoxMjpcbiAgICAgICAgICAgICAgICBFRDo5MDozNzo3RjoxRjo4NTo2QTpFQjpDMTpCRjoyODo4NTpFQzpGODo2NDo2RVxuICAgIFRpbWVzdGFtcCA6IEphbiAxOCAwNzozNDoyNS44NjggMjAyNCBHTVRcbiAgICBFeHRlbnNpb25zOiBub25lXG4gICAgU2lnbmF0dXJlIDogZWNkc2Etd2l0aC1TSEEyNTZcbiAgICAgICAgICAgICAgICAzMDo0NDowMjoyMDowOTo4NjowNjo2NzpBMToyRjo4NTpFNTozMzpEMjpFNjo5RjpcbiAgICAgICAgICAgICAgICBGMzo2MDpCMjpBODpBMTozRDo3NDowNzpGRDo4MDpBMTpBMDowMjpCQTo0MjpDMTpcbiAgICAgICAgICAgICAgICAwNDowMjo4NzpDMjowMjoyMDo0RDo3ODpEMTo5QzpEMzpERjpDMTo3RjpBMjpENDpcbiAgICAgICAgICAgICAgICAyNjpFNjo3OTpBOTpDNDo2NDo4MzpDNTpCNzpGOTo1Qjo3QzpBNjpEMzo0QTpEMTpcbiAgICAgICAgICAgICAgICBBNTo2NTo1MzozOTpGQjoyNlxuU2lnbmVkIENlcnRpZmljYXRlIFRpbWVzdGFtcDpcbiAgICBWZXJzaW9uICAgOiB2MSAoMHgwKVxuICAgIExvZyBJRCAgICA6IDdEOjU5OjFFOjEyOkUxOjc4OjJBOjdCOjFDOjYxOjY3OjdDOjVFOkZEOkY4OkQwOlxuICAgICAgICAgICAgICAgIDg3OjVDOjE0OkEwOjRFOjk1OjlFOkI5OjAzOjJGOkQ5OjBFOjhDOjJFOjc5OkI4XG4gICAgVGltZXN0YW1wIDogSmFuIDE4IDA3OjM0OjI1Ljg2MyAyMDI0IEdNVFxuICAgIEV4dGVuc2lvbnM6IG5vbmVcbiAgICBTaWduYXR1cmUgOiBlY2RzYS13aXRoLVNIQTI1NlxuICAgICAgICAgICAgICAgIDMwOjQ2OjAyOjIxOjAwOkQzOjNCOkRFOkQ2OjZBOkM0OjNBOkQ0OjVDOjNGOjAwOlxuICAgICAgICAgICAgICAgIDBGOkQ0OkJFOjY5OjMyOkZFOkMyOkEwOjlEOjU4OjgxOjI4OjkxOkYzOjE2OjFGOlxuICAgICAgICAgICAgICAgIEYyOjYxOjhCOjEyOkNBOjAyOjIxOjAwOjk4OjA0OjQzOjA5OjY2OkNEOjE0OkMwOlxuICAgICAgICAgICAgICAgIDU0OkExOkYwOjBCOkY0OjhBOjEwOkFFOkQ1OjE5OjY1OjdFOkM1OkI3OjREOjhEOlxuICAgICAgICAgICAgICAgIDU3OkU0OjNCOkZCOkNGOjZGOkRFOjkyXG5TdGFydCBkYXRlOkphbiAxOCAwMDowMDowMCAyMDI0IEdNVFxuRXhwaXJlIGRhdGU6SmFuICA2IDIzOjU5OjU5IDIwMjUgR01UXG5SU0EgUHVibGljIEtleToyMDQ4XG5yc2Eobik6QjM1MkMxOTQ3QkVBOUNDOEEzRjY0RTdDODc3NEEyRjY0NzI1MzBBQkUyOEZBOUJGNkMzMUIwM0E5NTYwMjJBMTIyNDA1QUM0Q0Q0NkIwRjcxOENCQTIzMDU1NTJDNEJFRURBRThDMERDOTE2NTkwRDM2QzM3NkM3MDMzMTU4NTBGMjY3MUU1RTNFMUIyODUwMUFFQzlDOTNFODU0NUUzRDRCNTc0RDFGM0Q0QTJBMDc1RTFDMzg5RTYwOUM2RkI0RUVBMzVFMkVGMEMwRDc2MDZFMDVGRkIyMUY2NzYyRDBFOEY5Q0IxQTczRjFFMzg2QjY0OEI5QjA0QzBDQTMyN0REN0U1OTIzRkVCRERENDZBRjA5QUE2ODQ3Qjc5NTE3QUQxODMyNUMwMTJEMUU4QjYyQUI4MUU1OEYzQzc0NjU3Nzc5NUM0MUQ4MEI1RDFGQTExMDE3MTFCREVBNzI1OTc1RUI0NzYwM0QyQUIyQTk4QTZDNTBCQkI0OTZEMUREQTMwMDNGNEFDREE5NTVGMjFGNTQxMjkyNDVBMEMzNjA0Njk1RjVCODczRDZCN0EwMTc1N0MwMjkxNTAyMzQzNEIwQjlDQUZCOEI3QjkyNzA3RTdCMTQwMzFBMjlCQjAwNzdGNTc2OUJDMzk5NzI4M0M2RjVFRTk4RDMxQTc4MjlcbnJzYShlKToxMDAwMVxuU2lnbmF0dXJlOjllOjA0OmNjOmMwOmJkOmY1OjlkOmIyOmI2Ojk3OmE1OmQyOmFhOjAwOmU4OjhmOjBhOmIyOjJiOjM4OjQ3OmRmOmIwOmJlOjI4OjIyOjMxOjZiOmJlOjNmOmNkOmNmOjcxOmI3OmZkOmE3OjQ3OjZkOjFmOjY2OmZhOjQ3OjdlOjVjOmYwOjRjOjNkOmU0OjEwOjUyOjhiOjFmOjMwOjA3OjRiOjE4OmNmOmI0OmQzOjE4OjI3OjEwOmJiOjI5OmVkOmZlOjc4OjdkOmY1OjY2OjRkOjc2OjlkOjRjOmFlOmZhOmUxOjIzOmQxOjU2OjI4OjNjOjYyOjBhOmU0Ojg4OjY3OmE1OmI1OjMxOjYxOmUwOmI5OjIwOjBiOmM0OmQxOjc2OmY3Ojg1OmM4OmQ4OmJjOjU2OmE5OjgxOjczOjRiOjk0OmMzOmM0OjI4OmZlOjNmOjdiOmY3OjI0OmFiOmJhOjU4OjNjOjYxOjdkOjFmOjBkOmE0OmI0OjU3OjRhOjU2OjRmOjlkOjgwOjUzOjdkOjUyOjg1OjEwOmUxOjE4OmU5OmYzOmQwOjRhOjVkOjdmOjExOjFjOjg3OjVmOjU1OjVmOjhiOjhmOmI4Ojc4OjQ3OjU2OjI1OmIxOjhmOjQxOmRlOmI5OjQxOjk0OmE3OjQwOmU5OmJlOmY0OjI1OjAxOjA0OmVlOmY2OjNhOjI4OmViOmExOmMxOjI1OjMzOjY2OmVkOjNlOmEzOmE3OmI4OjVmOjRhOmUwOmRmOmRhOjAxOmRlOmEyOmRlOjE3Ojg0OmQ5OjRhOmVjOmM2OjRjOmE2OmYzOjA1OjhiOjc2OjNiOjcxOjExOjc2OjFjOjlhOjc3OjE4OmM2OmVmOmViOjliOjIxOjYwOjE2OmNiOjljOmI4OjdjOmFkOjdmOjU2OmY3OmM2OmJhOjFkOjVkOjA1OjgxOjk0OjlhOmZiOjk2OjZlOjI1OmJhOmJhOjFhOjNkOjc3OjI5Ojg1OjU1OjI1OjA5OjFjOlxuLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlHQlRDQ0JPMmdBd0lCQWdJUUFlUWpJamx0NkUxcFA1Q05jd29DOHpBTkJna3Foa2lHOXcwQkFRc0ZBREE4XG5NUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJ3d0dnWURWUVFERXhOQmJXRjZiMjRnXG5VbE5CSURJd05EZ2dUVEF4TUI0WERUSTBNREV4T0RBd01EQXdNRm9YRFRJMU1ERXdOakl6TlRrMU9Wb3dKakVrXG5NQ0lHQTFVRUF4TWJjM1J6TG5WekxYZGxjM1F0TWk1aGJXRjZiMjVoZDNNdVkyOXRNSUlCSWpBTkJna3Foa2lHXG45dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBczFMQmxIdnFuTWlqOWs1OGgzU2k5a2NsTUt2aWo2bS9iREd3XG5PcFZnSXFFaVFGckV6VWF3OXhqTG9qQlZVc1MrN2E2TURja1dXUTAydzNiSEF6RllVUEpuSGw0K0d5aFFHdXljXG5rK2hVWGoxTFYwMGZQVW9xQjE0Y09KNWduRyswN3FOZUx2REExMkJ1QmYreUgyZGkwT2o1eXhwejhlT0d0a2k1XG5zRXdNb3lmZGZsa2ovcjNkUnE4SnFtaEh0NVVYclJneVhBRXRIb3RpcTRIbGp6eDBaWGQ1WEVIWUMxMGZvUkFYXG5FYjNxY2xsMTYwZGdQU3F5cVlwc1VMdTBsdEhkb3dBL1NzMnBWZklmVkJLU1JhRERZRWFWOWJoejFyZWdGMWZBXG5LUlVDTkRTd3VjcjdpM3VTY0g1N0ZBTWFLYnNBZC9WMm04T1pjb1BHOWU2WTB4cDRLUUlEQVFBQm80SURGekNDXG5BeE13SHdZRFZSMGpCQmd3Rm9BVWdiZ09ZNHFKRWhqbCtqczdVSldmNXVXUUU0VXdIUVlEVlIwT0JCWUVGSkZ6XG5HaDNNRy9wbDlzN1grUmVxSWdsa3VFRFZNRW9HQTFVZEVRUkRNRUdDRzNOMGN5NTFjeTEzWlhOMExUSXVZVzFoXG5lbTl1WVhkekxtTnZiWUlpS2k1emRITXVkWE10ZDJWemRDMHlMblp3WTJVdVlXMWhlbTl1WVhkekxtTnZiVEFUXG5CZ05WSFNBRUREQUtNQWdHQm1lQkRBRUNBVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdIUVlEVlIwbEJCWXdGQVlJXG5Ld1lCQlFVSEF3RUdDQ3NHQVFVRkJ3TUNNRHNHQTFVZEh3UTBNREl3TUtBdW9DeUdLbWgwZEhBNkx5OWpjbXd1XG5jakp0TURFdVlXMWhlbTl1ZEhKMWMzUXVZMjl0TDNJeWJUQXhMbU55YkRCMUJnZ3JCZ0VGQlFjQkFRUnBNR2N3XG5MUVlJS3dZQkJRVUhNQUdHSVdoMGRIQTZMeTl2WTNOd0xuSXliVEF4TG1GdFlYcHZiblJ5ZFhOMExtTnZiVEEyXG5CZ2dyQmdFRkJRY3dBb1lxYUhSMGNEb3ZMMk55ZEM1eU1tMHdNUzVoYldGNmIyNTBjblZ6ZEM1amIyMHZjakp0XG5NREV1WTJWeU1Bd0dBMVVkRXdFQi93UUNNQUF3Z2dGOUJnb3JCZ0VFQWRaNUFnUUNCSUlCYlFTQ0FXa0Jad0IxXG5BTThSVnU3VkxueXY4NGRiMldrdW0ra2FjV2RLc0Jmc3JBSFNXM2ZPekRzSUFBQUJqUnQrRzRZQUFBUURBRVl3XG5SQUlnWG9zV05xUXNBYlkvL2hGUVFob0U1YW1pbmd3TXBRZnZTYTZtZ1ZwMG9Kc0NJRnpBTEhmR3lUb3kwOG1GXG5wMVN1MithUmNJYzUxS1dqaVhYTnNvL21FTFpxQUhVQVB4ZExUOWNpUjFpVUhXVWNoTDRORXUyUU4zOGZoV3JyXG53YjhvaGV6NFpHNEFBQUdORzM0YlRBQUFCQU1BUmpCRUFpQUpoZ1pub1MrRjVUUFM1cC96WUxLb29UMTBCLzJBXG5vYUFDdWtMQkJBS0h3Z0lnVFhqUm5OUGZ3WCtpMUNibWVhbkVaSVBGdC9sYmZLYlRTdEdsWlZNNSt5WUFkd0I5XG5XUjRTNFhncWV4eGhaM3hlL2ZqUWgxd1VvRTZWbnJrREw5a09qQzU1dUFBQUFZMGJmaHRIQUFBRUF3QklNRVlDXG5JUURUTzk3V2FzUTYxRncvQUEvVXZta3kvc0tnblZpQktKSHpGaC95WVlzU3lnSWhBSmdFUXdsbXpSVEFWS0h3XG5DL1NLRUs3VkdXVit4YmROalZma08vdlBiOTZTTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDZUJNekF2ZldkXG5zcmFYcGRLcUFPaVBDcklyT0VmZnNMNG9JakZydmovTnozRzMvYWRIYlI5bStrZCtYUEJNUGVRUVVvc2ZNQWRMXG5HTSswMHhnbkVMc3A3ZjU0ZmZWbVRYYWRUSzc2NFNQUlZpZzhZZ3JraUdlbHRURmg0TGtnQzhUUmR2ZUZ5Tmk4XG5WcW1CYzB1VXc4UW8vajk3OXlTcnVsZzhZWDBmRGFTMFYwcFdUNTJBVTMxU2hSRGhHT256MEVwZGZ4RWNoMTlWXG5YNHVQdUhoSFZpV3hqMEhldVVHVXAwRHB2dlFsQVFUdTlqb282NkhCSlRObTdUNmpwN2hmU3VEZjJnSGVvdDRYXG5oTmxLN01aTXB2TUZpM1k3Y1JGMkhKcDNHTWJ2NjVzaFlCYkxuTGg4clg5Vzk4YTZIVjBGZ1pTYSs1WnVKYnE2XG5HajEzS1lWVkpRa2Ncbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSU0EgMjA0OCBNMDFcbklzc3VlcjpDID0gVVMsIE8gPSBBbWF6b24sIENOID0gQW1hem9uIFJvb3QgQ0EgMVxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOjA3NzMxMjM4MGI5ZDY2ODhhMzNiMWVkOWJmOWNjZGE2OGUwZTBmXG5TaWduYXR1cmUgQWxnb3JpdGhtOnNoYTI1NldpdGhSU0FFbmNyeXB0aW9uXG5QdWJsaWMgS2V5IEFsZ29yaXRobTpyc2FFbmNyeXB0aW9uXG5YNTA5djMgQmFzaWMgQ29uc3RyYWludHM6Q0E6VFJVRSwgcGF0aGxlbjowXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnblxuWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZTpUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiwgVExTIFdlYiBDbGllbnQgQXV0aGVudGljYXRpb25cblg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOjgxOkI4OjBFOjYzOjhBOjg5OjEyOjE4OkU1OkZBOjNCOjNCOjUwOjk1OjlGOkU2OkU1OjkwOjEzOjg1XG5YNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOjg0OjE4OkNDOjg1OjM0OkVDOkJDOjBDOjk0Ojk0OjJFOjA4OjU5OjlDOkM3OkIyOjEwOjRFOjBBOjA4XG5BdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzOk9DU1AgLSBVUkk6aHR0cDovL29jc3Aucm9vdGNhMS5hbWF6b250cnVzdC5jb21cbkNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbS9yb290Y2ExLmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucm9vdGNhMS5hbWF6b250cnVzdC5jb20vcm9vdGNhMS5jcmxcblg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczpQb2xpY3k6IDIuMjMuMTQwLjEuMi4xXG5TdGFydCBkYXRlOkF1ZyAyMyAyMjoyMToyOCAyMDIyIEdNVFxuRXhwaXJlIGRhdGU6QXVnIDIzIDIyOjIxOjI4IDIwMzAgR01UXG5SU0EgUHVibGljIEtleToyMDQ4XG5yc2Eobik6RUI3MTJDQTlDQjFGODgyODkyMzIzMEFGOEE1NzBGNzhCNzM3MjU5NTU1ODdBQzY3NUM5N0QzMjJDOERBQTIxNDY3NkI3Q0YwNjdEQUUyMDMyQUIzNTYxMjVEQzZCNTQ3Rjk2NzA4QTc5MzdBOTU5MjE4MEZCNEY5RjkxMDM2OUE3RjJGODBCNjRGQkExMzRFQzc1RDUzMUVFMEREOTYzMzA3MjBEMzk2QkMxMkU0NzQ1MDQyQTEwNTEzNzNCNTRGOUI0NDI0RkUyRDdGRURCQzIyODVFQzM2MjEzMzk3NzUwNkNFMjcxODgyRENFM0Q5QzU4MjA3OEQ1RTI2MDEyNjI2NjcxRkQ5M0YxM0NGMzJCQTZCQUQ3ODY0RkNBQUZGMEUwMjNDMDdERjlDMDU3ODcyOENGREVBNzVCNzAzMjg4NERBRTg2RTA3OENEMDUwODVFRjgxNTRCMjcxNkVFQzZENjJFRjhGOTRDMzVFRTlDNEE0RDA5MUMwMkUyNDkxOThDQUVFQkEyNThFRDRGNjcxQjZGQjVCNkIzODA2NDgzNzQ3OEQ4NkRDRjJFQTA2RkI3NjM3N0Q5RUZGNDI0RTRENTg4MjkzQ0ZFMjcxQzI3OEIxN0FBQjRCNUI5NDM3ODg4MUU0RDlBRjI0QUVGODcyQzU2NUZCNEJCNDUxRTdcbnJzYShlKToxMDAwMVxuU2lnbmF0dXJlOmFkOjAwOmRlOjAyOjA1OjIzOjJlOjA2OjMyOjYyOmI0OjZiOmIxOjk0OjE2OmU0OjExOjQwOmRlOjJiOmZhOjU5OmMxOjM1OmVmOmUwOmFhOjhmOjJiOjQxOmI5OmQxOmYzOjg3OjM5OjAwOjFkOmYyOjNkOmI1OmE3OjQ3OjBjOjA2OjA2OmM2OjkxOmYzOjA3OjU3OjAyOmQ0OmVkOmJkOjE3OmMxOjkwOjlhOmJmOjQ4Ojc1OmEyOjA3OjRmOjMwOmRkOjRhOjZhOjQyOmI1OjBkOjNkOjE1OmMwOjBmOmZlOjg0OjViOmM2OjNjOjk5OmNjOjU3OjUyOmIxOmQ4OjZlOjEyOmQ1Ojk2OjkyOjkzOjRiOjk0OmU1OjA3OmU4Ojg5OjgyOjA4OjZhOjdhOjM0OmQ0OjllOjY0OmUxOjNkOjg3OjZhOjkyOjkwOjlhOjYzOmExOjRiOmY4OjhmOmI2OmVhOjM0OmQzOjA1OmJlOjIwOmMyOmRlOjA2OmUyOjhjOjlmOjczOjhiOjlmOjRkOjM5Ojg1OmNhOmNlOjE5OjM2OjlkOjg1OmM5OjllOmM5OmY4OjUwOjNmOmI2OjdlOjg4OmExOmVmOmNhOjg0OjA2OjhiOjUwOmI0OjBhOjVjOmE2OjFjOjQ0OmYxOmZkOmM4OjYxOjQwOjYwOmYyOjYxOjI1OmFhOjA3OmY0OmM3OmMyOjczOjc1OmU0OjBjOjBiOjQyOjhkOjA0OmU1OjVmOjQ0OjQ4Ojk5OjViOjdiOjg5OjgxOjk2OmE3Ojg4OjlkOjRiOjBkOjYyOmU4OjA0OmM0OmQ3OmZlOmI0OmU4OmIyOjZkOmNhOmVjOmMwOjFjOmJjOjM4OjViOjFkOmRmOjg1OmNlOjViOjdhOmUzOjQ5OjRiOjZjOmI5OmE3OmRkOmY0OjA1OmIyOjQ5OmFkOmUxOmM1OjE0OjZiOmMyOmNjOmViOmNkOjdmOmQ2OjU4OjY5OmJhOmMzOjIwOjdlOjdmOmIwOmI4OlxuLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlFWGpDQ0EwYWdBd0lCQWdJVEIzTVNPQXVkWm9pak94N1p2NXpOcG80T0R6QU5CZ2txaGtpRzl3MEJBUXNGXG5BREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2XG5iMjRnVW05dmRDQkRRU0F4TUI0WERUSXlNRGd5TXpJeU1qRXlPRm9YRFRNd01EZ3lNekl5TWpFeU9Gb3dQREVMXG5NQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVjTUJvR0ExVUVBeE1UUVcxaGVtOXVJRkpUXG5RU0F5TURRNElFMHdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPdHhMS25MXG5INGdva2pJd3I0cFhEM2kzTnlXVlZZZXNaMXlYMHlMSTJxSVVaMnQ4OEdmYTRnTXFzMVlTWGNhMVIvbG5DS2VUXG5lcFdTR0ErMCtma1FOcHAvTDRDMlQ3b1RUc2RkVXg3ZzNaWXpCeURUbHJ3UzVIUlFRcUVGRTNPMVQ1dEVKUDR0XG5mKzI4SW9Yc05pRXpsM1VHemljWWd0emoyY1dDQjQxZUpnRW1KbWNmMlQ4VHp6SzZhNjE0WlB5cS93NENQQWZmXG5uQVY0Y296OTZuVzNBeWlFMnVodUI0elFVSVh2Z1ZTeWNXN3NiV0x2ajVURFh1bkVwTkNSd0M0a2taaks3cm9sXG5qdFQyY2JiN1cyczRCa2czUjQyRzNQTHFCdnQyTjMyZS8wSk9UVmlDazgvaWNjSjRzWHFyUzF1VU40aUI1Tm12XG5KSzc0Y3NWbCswdTBVZWNDQXdFQUFhT0NBVm93Z2dGV01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdEZ1lEXG5WUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQWRCZ05WXG5IUTRFRmdRVWdiZ09ZNHFKRWhqbCtqczdVSldmNXVXUUU0VXdId1lEVlIwakJCZ3dGb0FVaEJqTWhUVHN2QXlVXG5sQzRJV1p6SHNoQk9DZ2d3ZXdZSUt3WUJCUVVIQVFFRWJ6QnRNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2XG5iMk56Y0M1eWIyOTBZMkV4TG1GdFlYcHZiblJ5ZFhOMExtTnZiVEE2QmdnckJnRUZCUWN3QW9ZdWFIUjBjRG92XG5MMk55ZEM1eWIyOTBZMkV4TG1GdFlYcHZiblJ5ZFhOMExtTnZiUzl5YjI5MFkyRXhMbU5sY2pBL0JnTlZIUjhFXG5PREEyTURTZ01xQXdoaTVvZEhSd09pOHZZM0pzTG5KdmIzUmpZVEV1WVcxaGVtOXVkSEoxYzNRdVkyOXRMM0p2XG5iM1JqWVRFdVkzSnNNQk1HQTFVZElBUU1NQW93Q0FZR1o0RU1BUUlCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCXG5BUUN0QU40Q0JTTXVCakppdEd1eGxCYmtFVURlSy9wWndUWHY0S3FQSzBHNTBmT0hPUUFkOGoyMXAwY01CZ2JHXG5rZk1IVndMVTdiMFh3WkNhdjBoMW9nZFBNTjFLYWtLMURUMFZ3QS8raEZ2R1BKbk1WMUt4Mkc0UzFaYVNrMHVVXG41UWZvaVlJSWFubzAxSjVrNFQySGFwS1FtbU9oUy9pUHR1bzAwd1crSU1MZUJ1S01uM09MbjAwNWhjck9HVGFkXG5oY21leWZoUVA3WitpS0h2eW9RR2kxQzBDbHltSEVUeC9jaGhRR0R5WVNXcUIvVEh3bk4xNUF3TFFvMEU1VjlFXG5TSmxiZTRtQmxxZUluVXNOWXVnRXhOZit0T2l5YmNyc3dCeThPRnNkMzRYT1czcmpTVXRzdWFmZDlBV3lTYTNoXG54UlJyd3N6cnpYL1dXR202d3lCK2Y3QzRcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSb290IENBIDFcbklzc3VlcjpDID0gVVMsIFNUID0gQXJpem9uYSwgTCA9IFNjb3R0c2RhbGUsIE8gPSBcIlN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy5cIiwgQ04gPSBTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMlxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOjA2N2Y5NDRhMmEyN2NkZjNmYWMyYWUyYjAxZjkwOGVlYjljNGM2XG5TaWduYXR1cmUgQWxnb3JpdGhtOnNoYTI1NldpdGhSU0FFbmNyeXB0aW9uXG5QdWJsaWMgS2V5IEFsZ29yaXRobTpyc2FFbmNyeXB0aW9uXG5YNTA5djMgQmFzaWMgQ29uc3RyYWludHM6Q0E6VFJVRVxuWDUwOXYzIEtleSBVc2FnZTpEaWdpdGFsIFNpZ25hdHVyZSwgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ25cblg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOjg0OjE4OkNDOjg1OjM0OkVDOkJDOjBDOjk0Ojk0OjJFOjA4OjU5OjlDOkM3OkIyOjEwOjRFOjBBOjA4XG5YNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOjlDOjVGOjAwOkRGOkFBOjAxOkQ3OjMwOjJCOjM4Ojg4OkEyOkI4OjZEOjRBOjlDOkYyOjExOjkxOjgzXG5BdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzOk9DU1AgLSBVUkk6aHR0cDovL29jc3Aucm9vdGcyLmFtYXpvbnRydXN0LmNvbVxuQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY3J0LnJvb3RnMi5hbWF6b250cnVzdC5jb20vcm9vdGcyLmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY3JsXG5YNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6UG9saWN5OiBYNTA5djMgQW55IFBvbGljeVxuU3RhcnQgZGF0ZTpNYXkgMjUgMTI6MDA6MDAgMjAxNSBHTVRcbkV4cGlyZSBkYXRlOkRlYyAzMSAwMTowMDowMCAyMDM3IEdNVFxuUlNBIFB1YmxpYyBLZXk6MjA0OFxucnNhKG4pOkIyNzg4MDcxQ0E3OEQ1RTM3MUFGNDc4MDUwNzQ3RDZFRDhENzg4NzZGNDk5NjhGNzU4MjE2MEY5NzQ4NDAxMkZBQzAyMkQ4NkQzQTA0MzdBNEVCMkE0RDAzNkJBMDFCRThEREI0OEM4MDcxNzM2NENGNEVFODgyM0M3M0VFQjM3RjVCNTE5Rjg0OTY4QjBERUQ3Qjk3NjM4MUQ2MTlFQTRGRTgyMzZBNUU1NEE1NkU0NDVFMUY5RkRCNDE2RkE3NERBOUM5QjM1MzkyRkZBQjAyMDUwMDY2QzdBRDA4MEIyQTZGOUFGRUM0NzE5OEY1MDM4MDdEQ0EyODczOTU4RjhCQUQ1QTlGOTQ4NjczMDk2RUU5NDc4NUU2Rjg5QTM1MUMwMzA4NjY2QTE0NTY2QkE1NEVCQTNDMzkxRjk0OERDRkZEMUU4MzAyRDdEMkQ3NDcwMzVENzg4MjRGNzlFQzQ1OTZFQkI3Mzg3MTdGMjMyNDYyOEI4NDNGQUI3MURBQUNBQjRGMjlGMjQwRTJENEJGNzcxNUM1RTY5RkZFQTk1MDJDQjM4OEFBRTUwMzg2RkRCRkIyRDYyMUJDNUM3MUU1NEUxNzdFMDY3QzgwRjlDODcyM0Q2M0Y0MDIwN0YyMDgwQzQ4MDRDM0UzQjI0MjY4RTA0QUU2QzlBQzhBQTBEXG5yc2EoZSk6MTAwMDFcblNpZ25hdHVyZTo2MjozNzo0Mjo1YzpiYzoxMDpiNTozZTo4YjoyYzplOTowYzo5Yjo2Yzo0NTplMjowNzowMDo3YTpmOTpjNTo1ODowYjpiOTowODo4YzozZTplZDpiMzoyNTozYzpiNTo2Zjo1MDplNDpjZDozNTo2YTphNzo5MzozNDo5NjozMjoyMTphOTo0ODo0NDphYjo5YzplZDozZDpiNDphYTo3Mzo2ZDplNDo3ZjoxNjo4MDo4OTo2YzpjZjoyODowMzoxODo4Mzo0Nzo3OTphMzoxMDo3ZTozMDo1YjphYzozYjpiMDo2MDplMDo3NzpkNDowODphNjplMToxZDo3Yzo1ZTpjMDpiYjpmOTo5YTo3YjoyMjo5ZDphNzowMDowOTo3ZTphYzo0NjoxNzo4MzpkYzo5YzoyNjo1Nzo5OTozMDozOTo2Mjo5Njo4ZjplZDpkYTpkZTphYTpjNTpjYzoxYjozZTpjYTo0Mzo2ODo2Yzo1NzoxNjpiYzpkNTowZToyMDoyZTpmZTpmZjpjMjo2YTo1ZDoyZTphMDo0YTo2ZDoxNDo1ODo4Nzo5NDplNjozOTozMTo1Zjo3Yzo3MzpjYjo5MDo4ODo2YTo4NDoxMTo5NjoyNzphNjplZDpkOTo4MTo0NjphNjo3ZTphMzo3MjowMDowYTo1MjozZTo4Mzo4ODowNzo2Mzo3Nzo4OTo2OToxNzowZjozOTo4NTpkMjphYjowODo0NTo0ZDpkMDo1MTozYTpmZDo1ZDo1ZDozNzo2NDo0Yzo3ZTozMDpiMjo1NToyNDo0Mjo5ZDozNjpiMDo1ZDo5YzoxNzo4MTo2MTpmMTpjYTpmOToxMDowMjoyNDphYjplYjowZDo3NDo5MTo4ZDo3Yjo0NToyOTo1MDozOTo4ODpiMjphNjo4OTozNToyNToxZToxNDo2YTo0NzoyMzozMToyZjo1Yzo5YTpmYTphZDo5YTowZTo2Mjo1MTphNDoyYTphOTpjNDpmOTozNDo5ZDoyMToxODpcbi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRWtqQ0NBM3FnQXdJQkFnSVRCbitVU2lvbnpmUDZ3cTRyQWZrSTdybkV4akFOQmdrcWhraUc5dzBCQVFzRlxuQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOalxuYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eFxuT3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMVxuZEdodmNtbDBlU0F0SUVjeU1CNFhEVEUxTURVeU5URXlNREF3TUZvWERUTTNNVEl6TVRBeE1EQXdNRm93T1RFTFxuTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdlxuYjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMSjRnSEhLZU5YalxuY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdIRnpaTVxuOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xd1xuSUZBR2JIclFnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNlxuVk91anc1SDVTTnovMGVnd0xYMHRkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTFxuOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbVxuamdTdWJKcklxZzBDQXdFQUFhT0NBVEV3Z2dFdE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL1xuQkFRREFnR0dNQjBHQTFVZERnUVdCQlNFR015Rk5PeThESlNVTGdoWm5NZXlFRTRLQ0RBZkJnTlZIU01FR0RBV1xuZ0JTY1h3RGZxZ0hYTUNzNGlLSzRiVXFjOGhHUmd6QjRCZ2dyQmdFRkJRY0JBUVJzTUdvd0xnWUlLd1lCQlFVSFxuTUFHR0ltaDBkSEE2THk5dlkzTndMbkp2YjNSbk1pNWhiV0Y2YjI1MGNuVnpkQzVqYjIwd09BWUlLd1lCQlFVSFxuTUFLR0xHaDBkSEE2THk5amNuUXVjbTl2ZEdjeUxtRnRZWHB2Ym5SeWRYTjBMbU52YlM5eWIyOTBaekl1WTJWeVxuTUQwR0ExVWRId1EyTURRd01xQXdvQzZHTEdoMGRIQTZMeTlqY213dWNtOXZkR2N5TG1GdFlYcHZiblJ5ZFhOMFxuTG1OdmJTOXliMjkwWnpJdVkzSnNNQkVHQTFVZElBUUtNQWd3QmdZRVZSMGdBREFOQmdrcWhraUc5dzBCQVFzRlxuQUFPQ0FRRUFZamRDWEx3UXRUNkxMT2tNbTJ4RjRnY0Fldm5GV0F1NUNJdys3Yk1sUExWdlVPVE5OV3Fua3pTV1xuTWlHcFNFU3JuTzA5dEtwemJlUi9Gb0NKYk04b0F4aURSM21qRUg0d1c2dzdzR0RnZDlRSXB1RWRmRjdBdS9tYVxuZXlLZHB3QUpmcXhHRjRQY25DWlhtVEE1WXBhUDdkcmVxc1hNR3o3S1EyaHNWeGE4MVE0Z0x2Ny93bXBkTHFCS1xuYlJSWWg1VG1PVEZmZkhQTGtJaHFoQkdXSjZidDJZRkdwbjZqY2dBS1VqNkRpQWRqZDRscEZ3ODVoZEtyQ0VWTlxuMEZFNi9WMWROMlJNZmpDeVZTUkNuVGF3WFp3WGdXSHh5dmtRQWlTcjZ3MTBrWTE3UlNsUU9ZaXlwb2sxSlI0VVxuYWtjak1TOWNtdnF0bWc1aVVhUXFxY1Q1TkowaEdBPT1cbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBTVCA9IEFyaXpvbmEsIEwgPSBTY290dHNkYWxlLCBPID0gXCJTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuXCIsIENOID0gU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzJcbklzc3VlcjpDID0gVVMsIE8gPSBcIlN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy5cIiwgT1UgPSBTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eVxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOmE3MGU0YTRjMzQ4MmI3N2ZcblNpZ25hdHVyZSBBbGdvcml0aG06c2hhMjU2V2l0aFJTQUVuY3J5cHRpb25cblB1YmxpYyBLZXkgQWxnb3JpdGhtOnJzYUVuY3J5cHRpb25cblg1MDl2MyBCYXNpYyBDb25zdHJhaW50czpDQTpUUlVFXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnblxuWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6OUM6NUY6MDA6REY6QUE6MDE6RDc6MzA6MkI6Mzg6ODg6QTI6Qjg6NkQ6NEE6OUM6RjI6MTE6OTE6ODNcblg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6QkY6NUY6Qjc6RDE6Q0U6REQ6MUY6ODY6RjQ6NUI6NTU6QUM6REM6RDc6MTA6QzI6MEU6QTk6ODg6RTdcbkF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3M6T0NTUCAtIFVSSTpodHRwOi8vby5zczIudXMvXG5DQSBJc3N1ZXJzIC0gVVJJOmh0dHA6Ly94LnNzMi51cy94LmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9zLnNzMi51cy9yLmNybFxuWDUwOXYzIENlcnRpZmljYXRlIFBvbGljaWVzOlBvbGljeTogWDUwOXYzIEFueSBQb2xpY3lcblN0YXJ0IGRhdGU6U2VwICAyIDAwOjAwOjAwIDIwMDkgR01UXG5FeHBpcmUgZGF0ZTpKdW4gMjggMTc6Mzk6MTYgMjAzNCBHTVRcblJTQSBQdWJsaWMgS2V5OjIwNDhcbnJzYShuKTpENTBDM0FDNDJBRjk0RUUyRjVCRTE5OTc1RjhFODg1M0IxMUYzRkNCQ0Y5RjIwMTM2RDI5M0FDODBGN0QzQ0Y3NkI3NjM4NjNEOTM2NjBBODlCNUU1QzAwODBCMjJGNTk3RkY2ODdGOTI1NDM4NkU3NjkxQjUyOUE5MEUxNzFFM0Q4MkQwRDRFNkZGNkM4NDlEOUI2RjMxQTU2QUUyQkI2NzQxNEVCQ0ZGQjI2RTMxQUJBMUQ5NjJFNkEzQjU4OTQ4OTQ3NTZGRjI1QTA5MzcwNTM4M0RBODQ3NDE0QzM2NzlFMDQ2ODNBREY4RTQwNUExRDRBNEVDRjQzOTEzQkU3NTZENjAwNzBDQjUyRUU3QjdEQUUzQUU3QkMzMUY5NDVGNkMyNjBDRjEzNTkwMjJCODBDQzM0NDdERkI5REU5MDY1NkQwMkNGMkM5MUE2QTZFN0RFODUxODQ5N0M2NjRFQTMzQTZEQTlCNUVFMzQyRUJBMEQwM0I4MzNERjQ3RUJCMTZCOEQyNUQ5OUJDRTgxRDE0NTQ2MzI5NjcwODdERTAyMEU0OTQzODVCNjZDNzNCQjY0RUE2MTQxQUNDOUQ0NTRERjg3MkZDNzIyQjIyNkNDOUY1OTU0Njg5RkZDQkUyQTJGQzQ1NTFDNzU0MDYwMTc4NTAyNTUzOThCN0YwNVxucnNhKGUpOjEwMDAxXG5TaWduYXR1cmU6MjM6MWQ6ZTM6OGE6NTc6Y2E6N2Q6ZTk6MTc6Nzk6NGM6ZjE6MWU6NTU6ZmQ6Y2M6NTM6NmU6M2U6NDc6MGY6ZGY6YzY6NTU6ZjI6YjI6MDQ6MzY6ZWQ6ODA6MWY6NTM6YzQ6NWQ6MzQ6Mjg6NmI6YmU6Yzc6NTU6ZmM6Njc6ZWE6Y2I6M2Y6N2Y6OTA6YjI6MzM6Y2Q6MWI6NTg6MTA6ODI6MDI6Zjg6Zjg6MmY6ZjU6MTM6NjA6ZDQ6MDU6Y2U6ZjE6ODE6MDg6YzE6ZGQ6YTc6NzU6OTc6NGY6MTg6Yjk6NmQ6ZGU6Zjc6OTM6OTE6MDg6YmE6N2U6NDA6MmM6ZWQ6YzE6ZWE6YmI6NzY6OWU6MzM6MDY6Nzc6MWQ6MGQ6MDg6N2Y6NTM6ZGQ6MWI6NjQ6YWI6ODI6Mjc6ZjE6Njk6ZDU6NGQ6NWU6YWU6ZjQ6YTE6YzM6NzU6YTc6NTg6NDQ6MmQ6ZjI6M2M6NzA6OTg6YWM6YmE6Njk6YjY6OTU6Nzc6N2Y6MGY6MzE6NWU6MmM6ZmM6YTA6ODc6M2E6NDc6Njk6ZjA6Nzk6NWY6ZjQ6MTQ6NTQ6YTQ6OTU6NWU6MTE6Nzg6MTI6NjA6Mjc6Y2U6OWY6YzI6Nzc6ZmY6MjM6NTM6Nzc6NWQ6YmE6ZmY6ZWE6NTk6ZTc6ZGI6Y2Y6YWY6OTI6OTY6ZWY6MjQ6OWE6MzU6MTA6N2E6OWM6OTE6YzY6MGU6N2Q6OTk6ZjY6M2Y6MTk6ZGY6ZjU6NzI6NTQ6ZTE6MTU6YTk6MDc6NTk6N2I6ODM6YmY6NTI6MmU6NDY6OGM6YjI6MDA6NjQ6NzY6MWM6NDg6ZDM6ZDg6Nzk6ZTg6NmU6NTY6Y2M6YWU6MmM6MDM6OTA6ZDc6MTk6Mzg6OTk6ZTQ6Y2E6MDk6MTk6NWI6ZmY6MDc6OTY6YjA6YTg6N2Y6MzQ6NDk6ZGY6NTY6YTk6Zjc6YjA6NWY6ZWQ6MzM6ZWQ6OGM6NDc6Yjc6MzA6MDM6NWQ6ZjQ6MDM6OGM6XG4tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbk1JSUVkVENDQTEyZ0F3SUJBZ0lKQUtjT1NrdzBncmQvTUEwR0NTcUdTSWIzRFFFQkN3VUFNR2d4Q3pBSkJnTlZcbkJBWVRBbFZUTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdcbk1BWURWUVFMRXlsVGRHRnlabWxsYkdRZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBcbmVUQWVGdzB3T1RBNU1ESXdNREF3TURCYUZ3MHpOREEyTWpneE56TTVNVFphTUlHWU1Rc3dDUVlEVlFRR0V3SlZcblV6RVFNQTRHQTFVRUNCTUhRWEpwZW05dVlURVRNQkVHQTFVRUJ4TUtVMk52ZEhSelpHRnNaVEVsTUNNR0ExVUVcbkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakU3TURrR0ExVUVBeE15VTNSaGNtWnBcblpXeGtJRk5sY25acFkyVnpJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlcbk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZERHJFS3ZsTzR2VytHWmRmam9oVHNSOC9cbnk4K2ZJQk50S1RySUQzMDg5MnQyT0dQWk5tQ29tMTVjQUlDeUwxbC85b2Y1SlVPRzUya2JVcHFRNFhIajJDME5cblRtLzJ5RW5adHZNYVZxNHJ0blFVNjgvN0p1TWF1aDJXTG1vN1dKU0pSMWIvSmFDVGNGT0Qyb1IwRk1Obm5nUm9cbk90K09RRm9kU2s3UFE1RTc1MWJXQUhETFV1NTdmYTQ2NTd3eCtVWDJ3bURQRTFrQ0s0RE1ORWZmdWQ2UVpXMENcbnp5eVJwcWJuM29VWVNYeG1UcU02YmFtMTdqUXV1ZzBEdURQZlIrdXhhNDBsMlp2T2dkRkZSaktXY0lmZUFnNUpcblE0VzJiSE83Wk9waFFhekoxRlRmaHkvSElySW16SjlaVkdpZi9MNHFMOFJWSEhWQVlCZUZBbFU1aTM4RkFnTUJcbkFBR2pnZkF3Z2Uwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9cbkJCWUVGSnhmQU4rcUFkY3dLemlJb3JodFNwenlFWkdETUI4R0ExVWRJd1FZTUJhQUZMOWZ0OUhPM1IrRzlGdFZcbnJOelhFTUlPcVlqbk1FOEdDQ3NHQVFVRkJ3RUJCRU13UVRBY0JnZ3JCZ0VGQlFjd0FZWVFhSFIwY0RvdkwyOHVcbmMzTXlMblZ6THpBaEJnZ3JCZ0VGQlFjd0FvWVZhSFIwY0RvdkwzZ3VjM015TG5WekwzZ3VZMlZ5TUNZR0ExVWRcbkh3UWZNQjB3RzZBWm9CZUdGV2gwZEhBNkx5OXpMbk56TWk1MWN5OXlMbU55YkRBUkJnTlZIU0FFQ2pBSU1BWUdcbkJGVWRJQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUNNZDQ0cFh5bjNwRjNsTThSNVYvY3hUYmo1SEQ5L0dcblZmS3lCRGJ0Z0I5VHhGMDBLR3UreDFYOForckxQMytRc2pQTkcxZ1FnZ0w0K0MvMUUyRFVCYzd4Z1FqQjNhZDFcbmwwOFl1VzNlOTVPUkNMcCtRQ3p0d2VxN2RwNHpCbmNkRFFoL1U5MGJaS3VDSi9GcDFVMWVydlNodzNXbldFUXRcbjhqeHdtS3k2YWJhVmQzOFBNVjRzL0tDSE9rZHA4SGxmOUJSVXBKVmVFWGdTWUNmT244SjMveU5UZDEyNi8rcFpcbjU5dlByNUtXN3lTYU5SQjZuSkhHRG4yWjlqOFozL1Z5Vk9FVnFRZFplNE8vVWk1R2pMSUFaSFljU05QWWVlaHVcblZzeXVMQU9RMXhrNG1lVEtDUmxiL3dlV3NLaC9ORW5mVnFuM3NGL3RNKzJNUjdjd0ExMzBBNHc9XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLCJjb250ZW50X3R5cGUiOm51bGwsImNvbm5faWQiOjAsImVycm9ybXNnIjpudWxsLCJleGl0Y29kZSI6MCwiZmlsZW5hbWVfZWZmZWN0aXZlIjpudWxsLCJmdHBfZW50cnlfcGF0aCI6bnVsbCwiaHR0cF9jb2RlIjozMDIsImh0dHBfY29ubmVjdCI6MCwiaHR0cF92ZXJzaW9uIjoiMS4xIiwibG9jYWxfaXAiOiIxOTIuMTY4LjExLjExMCIsImxvY2FsX3BvcnQiOjM3MDc4LCJtZXRob2QiOiJIRUFEIiwibnVtX2NlcnRzIjo0LCJudW1fY29ubmVjdHMiOjEsIm51bV9oZWFkZXJzIjo0LCJudW1fcmVkaXJlY3RzIjowLCJwcm94eV9zc2xfdmVyaWZ5X3Jlc3VsdCI6MCwicmVkaXJlY3RfdXJsIjoiaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9pYW0iLCJyZWZlcmVyIjpudWxsLCJyZW1vdGVfaXAiOiI1NC4yNDAuMjUwLjIzNSIsInJlbW90ZV9wb3J0Ijo0NDMsInJlc3BvbnNlX2NvZGUiOjMwMiwic2NoZW1lIjoiSFRUUFMiLCJzaXplX2Rvd25sb2FkIjowLCJzaXplX2hlYWRlciI6MTgxLCJzaXplX3JlcXVlc3QiOjkxLCJzaXplX3VwbG9hZCI6MCwic3BlZWRfZG93bmxvYWQiOjAsInNwZWVkX3VwbG9hZCI6MCwic3NsX3ZlcmlmeV9yZXN1bHQiOjAsInRpbWVfYXBwY29ubmVjdCI6MC41OTYxNjMsInRpbWVfY29ubmVjdCI6MC4yNTA5MjUsInRpbWVfbmFtZWxvb2t1cCI6MC4wODE2MzMsInRpbWVfcHJldHJhbnNmZXIiOjAuNTk2MjY4LCJ0aW1lX3JlZGlyZWN0IjowLjAwMDAwMCwidGltZV9zdGFydHRyYW5zZmVyIjowLjc2MzY4NSwidGltZV90b3RhbCI6MC43NjM3NTgsInVybCI6Imh0dHBzOi8vc3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tOjQ0MyIsInVybC5zY2hlbWUiOiJodHRwcyIsInVybC51c2VyIjpudWxsLCJ1cmwucGFzc3dvcmQiOm51bGwsInVybC5vcHRpb25zIjpudWxsLCJ1cmwuaG9zdCI6InN0cy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsInVybC5wb3J0IjoiNDQzIiwidXJsLnBhdGgiOiIvIiwidXJsLnF1ZXJ5IjpudWxsLCJ1cmwuZnJhZ21lbnQiOm51bGwsInVybC56b25laWQiOm51bGwsInVybGUuc2NoZW1lIjoiaHR0cHMiLCJ1cmxlLnVzZXIiOm51bGwsInVybGUucGFzc3dvcmQiOm51bGwsInVybGUub3B0aW9ucyI6bnVsbCwidXJsZS5ob3N0Ijoic3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwidXJsZS5wb3J0IjoiNDQzIiwidXJsZS5wYXRoIjoiLyIsInVybGUucXVlcnkiOm51bGwsInVybGUuZnJhZ21lbnQiOm51bGwsInVybGUuem9uZWlkIjpudWxsLCJ1cmxfZWZmZWN0aXZlIjoiaHR0cHM6Ly9zdHMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb206NDQzLyIsInVybG51bSI6MCwieGZlcl9pZCI6MCwiY3VybF92ZXJzaW9uIjoibGliY3VybC84LjIuMSBPcGVuU1NMLzMuMS40IHpsaWIvMS4yLjEzIGJyb3RsaS8xLjEuMCBsaWJpZG4yLzIuMy43IGxpYnBzbC8wLjIxLjIgKCtsaWJpZG4yLzIuMy40KSBsaWJzc2gvMC4xMC42L29wZW5zc2wvemxpYiBuZ2h0dHAyLzEuNTUuMSBPcGVuTERBUC8yLjYuNyJ9Ck5WX0NVUkxKU09OX0VORAo=", + ensurePrivate: true, + expectSuccess: false, + errorMessage: "the remote IP is private while it should not be", + }, + { + name: "SuccessWithPublicRemoteIP", + // NV_CURLJSON_BEGIN + // ... + // "remote_ip":"54.240.248.204" + // ... + // NV_CURLJSON_END + output: "TlZfQ1VSTEpTT05fQkVHSU4KQE5WQHsiY2VydHMiOiJTdWJqZWN0OkNOID0gc3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tXG5Jc3N1ZXI6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSU0EgMjA0OCBNMDFcblZlcnNpb246MlxuU2VyaWFsIE51bWJlcjowMWU0MjMyMjM5NmRlODRkNjkzZjkwOGQ3MzBhMDJmM1xuU2lnbmF0dXJlIEFsZ29yaXRobTpzaGEyNTZXaXRoUlNBRW5jcnlwdGlvblxuUHVibGljIEtleSBBbGdvcml0aG06cnNhRW5jcnlwdGlvblxuWDUwOXYzIEF1dGhvcml0eSBLZXkgSWRlbnRpZmllcjo4MTpCODowRTo2Mzo4QTo4OToxMjoxODpFNTpGQTozQjozQjo1MDo5NTo5RjpFNjpFNTo5MDoxMzo4NVxuWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6OTE6NzM6MUE6MUQ6Q0M6MUI6RkE6NjU6RjY6Q0U6RDc6Rjk6MTc6QUE6MjI6MDk6NjQ6Qjg6NDA6RDVcblg1MDl2MyBTdWJqZWN0IEFsdGVybmF0aXZlIE5hbWU6RE5TOnN0cy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSwgRE5TOiouc3RzLnVzLXdlc3QtMi52cGNlLmFtYXpvbmF3cy5jb21cblg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczpQb2xpY3k6IDIuMjMuMTQwLjEuMi4xXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBLZXkgRW5jaXBoZXJtZW50XG5YNTA5djMgRXh0ZW5kZWQgS2V5IFVzYWdlOlRMUyBXZWIgU2VydmVyIEF1dGhlbnRpY2F0aW9uLCBUTFMgV2ViIENsaWVudCBBdXRoZW50aWNhdGlvblxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucjJtMDEuYW1hem9udHJ1c3QuY29tL3IybTAxLmNybFxuQXV0aG9yaXR5IEluZm9ybWF0aW9uIEFjY2VzczpPQ1NQIC0gVVJJOmh0dHA6Ly9vY3NwLnIybTAxLmFtYXpvbnRydXN0LmNvbVxuQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY3J0LnIybTAxLmFtYXpvbnRydXN0LmNvbS9yMm0wMS5jZXJcblg1MDl2MyBCYXNpYyBDb25zdHJhaW50czpDQTpGQUxTRVxuQ1QgUHJlY2VydGlmaWNhdGUgU0NUczpTaWduZWQgQ2VydGlmaWNhdGUgVGltZXN0YW1wOlxuICAgIFZlcnNpb24gICA6IHYxICgweDApXG4gICAgTG9nIElEICAgIDogQ0Y6MTE6NTY6RUU6RDU6MkU6N0M6QUY6RjM6ODc6NUI6RDk6Njk6MkU6OUI6RTk6XG4gICAgICAgICAgICAgICAgMUE6NzE6Njc6NEE6QjA6MTc6RUM6QUM6MDE6RDI6NUI6Nzc6Q0U6Q0M6M0I6MDhcbiAgICBUaW1lc3RhbXAgOiBKYW4gMTggMDc6MzQ6MjUuOTI2IDIwMjQgR01UXG4gICAgRXh0ZW5zaW9uczogbm9uZVxuICAgIFNpZ25hdHVyZSA6IGVjZHNhLXdpdGgtU0hBMjU2XG4gICAgICAgICAgICAgICAgMzA6NDQ6MDI6MjA6NUU6OEI6MTY6MzY6QTQ6MkM6MDE6QjY6M0Y6RkU6MTE6NTA6XG4gICAgICAgICAgICAgICAgNDI6MUE6MDQ6RTU6QTk6QTI6OUU6MEM6MEM6QTU6MDc6RUY6NDk6QUU6QTY6ODE6XG4gICAgICAgICAgICAgICAgNUE6NzQ6QTA6OUI6MDI6MjA6NUM6QzA6MkM6Nzc6QzY6Qzk6M0E6MzI6RDM6Qzk6XG4gICAgICAgICAgICAgICAgODU6QTc6NTQ6QUU6REI6RTY6OTE6NzA6ODc6Mzk6RDQ6QTU6QTM6ODk6NzU6Q0Q6XG4gICAgICAgICAgICAgICAgQjI6OEY6RTY6MTA6QjY6NkFcblNpZ25lZCBDZXJ0aWZpY2F0ZSBUaW1lc3RhbXA6XG4gICAgVmVyc2lvbiAgIDogdjEgKDB4MClcbiAgICBMb2cgSUQgICAgOiAzRjoxNzo0Qjo0RjpENzoyMjo0Nzo1ODo5NDoxRDo2NToxQzo4NDpCRTowRDoxMjpcbiAgICAgICAgICAgICAgICBFRDo5MDozNzo3RjoxRjo4NTo2QTpFQjpDMTpCRjoyODo4NTpFQzpGODo2NDo2RVxuICAgIFRpbWVzdGFtcCA6IEphbiAxOCAwNzozNDoyNS44NjggMjAyNCBHTVRcbiAgICBFeHRlbnNpb25zOiBub25lXG4gICAgU2lnbmF0dXJlIDogZWNkc2Etd2l0aC1TSEEyNTZcbiAgICAgICAgICAgICAgICAzMDo0NDowMjoyMDowOTo4NjowNjo2NzpBMToyRjo4NTpFNTozMzpEMjpFNjo5RjpcbiAgICAgICAgICAgICAgICBGMzo2MDpCMjpBODpBMTozRDo3NDowNzpGRDo4MDpBMTpBMDowMjpCQTo0MjpDMTpcbiAgICAgICAgICAgICAgICAwNDowMjo4NzpDMjowMjoyMDo0RDo3ODpEMTo5QzpEMzpERjpDMTo3RjpBMjpENDpcbiAgICAgICAgICAgICAgICAyNjpFNjo3OTpBOTpDNDo2NDo4MzpDNTpCNzpGOTo1Qjo3QzpBNjpEMzo0QTpEMTpcbiAgICAgICAgICAgICAgICBBNTo2NTo1MzozOTpGQjoyNlxuU2lnbmVkIENlcnRpZmljYXRlIFRpbWVzdGFtcDpcbiAgICBWZXJzaW9uICAgOiB2MSAoMHgwKVxuICAgIExvZyBJRCAgICA6IDdEOjU5OjFFOjEyOkUxOjc4OjJBOjdCOjFDOjYxOjY3OjdDOjVFOkZEOkY4OkQwOlxuICAgICAgICAgICAgICAgIDg3OjVDOjE0OkEwOjRFOjk1OjlFOkI5OjAzOjJGOkQ5OjBFOjhDOjJFOjc5OkI4XG4gICAgVGltZXN0YW1wIDogSmFuIDE4IDA3OjM0OjI1Ljg2MyAyMDI0IEdNVFxuICAgIEV4dGVuc2lvbnM6IG5vbmVcbiAgICBTaWduYXR1cmUgOiBlY2RzYS13aXRoLVNIQTI1NlxuICAgICAgICAgICAgICAgIDMwOjQ2OjAyOjIxOjAwOkQzOjNCOkRFOkQ2OjZBOkM0OjNBOkQ0OjVDOjNGOjAwOlxuICAgICAgICAgICAgICAgIDBGOkQ0OkJFOjY5OjMyOkZFOkMyOkEwOjlEOjU4OjgxOjI4OjkxOkYzOjE2OjFGOlxuICAgICAgICAgICAgICAgIEYyOjYxOjhCOjEyOkNBOjAyOjIxOjAwOjk4OjA0OjQzOjA5OjY2OkNEOjE0OkMwOlxuICAgICAgICAgICAgICAgIDU0OkExOkYwOjBCOkY0OjhBOjEwOkFFOkQ1OjE5OjY1OjdFOkM1OkI3OjREOjhEOlxuICAgICAgICAgICAgICAgIDU3OkU0OjNCOkZCOkNGOjZGOkRFOjkyXG5TdGFydCBkYXRlOkphbiAxOCAwMDowMDowMCAyMDI0IEdNVFxuRXhwaXJlIGRhdGU6SmFuICA2IDIzOjU5OjU5IDIwMjUgR01UXG5SU0EgUHVibGljIEtleToyMDQ4XG5yc2Eobik6QjM1MkMxOTQ3QkVBOUNDOEEzRjY0RTdDODc3NEEyRjY0NzI1MzBBQkUyOEZBOUJGNkMzMUIwM0E5NTYwMjJBMTIyNDA1QUM0Q0Q0NkIwRjcxOENCQTIzMDU1NTJDNEJFRURBRThDMERDOTE2NTkwRDM2QzM3NkM3MDMzMTU4NTBGMjY3MUU1RTNFMUIyODUwMUFFQzlDOTNFODU0NUUzRDRCNTc0RDFGM0Q0QTJBMDc1RTFDMzg5RTYwOUM2RkI0RUVBMzVFMkVGMEMwRDc2MDZFMDVGRkIyMUY2NzYyRDBFOEY5Q0IxQTczRjFFMzg2QjY0OEI5QjA0QzBDQTMyN0REN0U1OTIzRkVCRERENDZBRjA5QUE2ODQ3Qjc5NTE3QUQxODMyNUMwMTJEMUU4QjYyQUI4MUU1OEYzQzc0NjU3Nzc5NUM0MUQ4MEI1RDFGQTExMDE3MTFCREVBNzI1OTc1RUI0NzYwM0QyQUIyQTk4QTZDNTBCQkI0OTZEMUREQTMwMDNGNEFDREE5NTVGMjFGNTQxMjkyNDVBMEMzNjA0Njk1RjVCODczRDZCN0EwMTc1N0MwMjkxNTAyMzQzNEIwQjlDQUZCOEI3QjkyNzA3RTdCMTQwMzFBMjlCQjAwNzdGNTc2OUJDMzk5NzI4M0M2RjVFRTk4RDMxQTc4MjlcbnJzYShlKToxMDAwMVxuU2lnbmF0dXJlOjllOjA0OmNjOmMwOmJkOmY1OjlkOmIyOmI2Ojk3OmE1OmQyOmFhOjAwOmU4OjhmOjBhOmIyOjJiOjM4OjQ3OmRmOmIwOmJlOjI4OjIyOjMxOjZiOmJlOjNmOmNkOmNmOjcxOmI3OmZkOmE3OjQ3OjZkOjFmOjY2OmZhOjQ3OjdlOjVjOmYwOjRjOjNkOmU0OjEwOjUyOjhiOjFmOjMwOjA3OjRiOjE4OmNmOmI0OmQzOjE4OjI3OjEwOmJiOjI5OmVkOmZlOjc4OjdkOmY1OjY2OjRkOjc2OjlkOjRjOmFlOmZhOmUxOjIzOmQxOjU2OjI4OjNjOjYyOjBhOmU0Ojg4OjY3OmE1OmI1OjMxOjYxOmUwOmI5OjIwOjBiOmM0OmQxOjc2OmY3Ojg1OmM4OmQ4OmJjOjU2OmE5OjgxOjczOjRiOjk0OmMzOmM0OjI4OmZlOjNmOjdiOmY3OjI0OmFiOmJhOjU4OjNjOjYxOjdkOjFmOjBkOmE0OmI0OjU3OjRhOjU2OjRmOjlkOjgwOjUzOjdkOjUyOjg1OjEwOmUxOjE4OmU5OmYzOmQwOjRhOjVkOjdmOjExOjFjOjg3OjVmOjU1OjVmOjhiOjhmOmI4Ojc4OjQ3OjU2OjI1OmIxOjhmOjQxOmRlOmI5OjQxOjk0OmE3OjQwOmU5OmJlOmY0OjI1OjAxOjA0OmVlOmY2OjNhOjI4OmViOmExOmMxOjI1OjMzOjY2OmVkOjNlOmEzOmE3OmI4OjVmOjRhOmUwOmRmOmRhOjAxOmRlOmEyOmRlOjE3Ojg0OmQ5OjRhOmVjOmM2OjRjOmE2OmYzOjA1OjhiOjc2OjNiOjcxOjExOjc2OjFjOjlhOjc3OjE4OmM2OmVmOmViOjliOjIxOjYwOjE2OmNiOjljOmI4OjdjOmFkOjdmOjU2OmY3OmM2OmJhOjFkOjVkOjA1OjgxOjk0OjlhOmZiOjk2OjZlOjI1OmJhOmJhOjFhOjNkOjc3OjI5Ojg1OjU1OjI1OjA5OjFjOlxuLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlHQlRDQ0JPMmdBd0lCQWdJUUFlUWpJamx0NkUxcFA1Q05jd29DOHpBTkJna3Foa2lHOXcwQkFRc0ZBREE4XG5NUXN3Q1FZRFZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJ3d0dnWURWUVFERXhOQmJXRjZiMjRnXG5VbE5CSURJd05EZ2dUVEF4TUI0WERUSTBNREV4T0RBd01EQXdNRm9YRFRJMU1ERXdOakl6TlRrMU9Wb3dKakVrXG5NQ0lHQTFVRUF4TWJjM1J6TG5WekxYZGxjM1F0TWk1aGJXRjZiMjVoZDNNdVkyOXRNSUlCSWpBTkJna3Foa2lHXG45dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBczFMQmxIdnFuTWlqOWs1OGgzU2k5a2NsTUt2aWo2bS9iREd3XG5PcFZnSXFFaVFGckV6VWF3OXhqTG9qQlZVc1MrN2E2TURja1dXUTAydzNiSEF6RllVUEpuSGw0K0d5aFFHdXljXG5rK2hVWGoxTFYwMGZQVW9xQjE0Y09KNWduRyswN3FOZUx2REExMkJ1QmYreUgyZGkwT2o1eXhwejhlT0d0a2k1XG5zRXdNb3lmZGZsa2ovcjNkUnE4SnFtaEh0NVVYclJneVhBRXRIb3RpcTRIbGp6eDBaWGQ1WEVIWUMxMGZvUkFYXG5FYjNxY2xsMTYwZGdQU3F5cVlwc1VMdTBsdEhkb3dBL1NzMnBWZklmVkJLU1JhRERZRWFWOWJoejFyZWdGMWZBXG5LUlVDTkRTd3VjcjdpM3VTY0g1N0ZBTWFLYnNBZC9WMm04T1pjb1BHOWU2WTB4cDRLUUlEQVFBQm80SURGekNDXG5BeE13SHdZRFZSMGpCQmd3Rm9BVWdiZ09ZNHFKRWhqbCtqczdVSldmNXVXUUU0VXdIUVlEVlIwT0JCWUVGSkZ6XG5HaDNNRy9wbDlzN1grUmVxSWdsa3VFRFZNRW9HQTFVZEVRUkRNRUdDRzNOMGN5NTFjeTEzWlhOMExUSXVZVzFoXG5lbTl1WVhkekxtTnZiWUlpS2k1emRITXVkWE10ZDJWemRDMHlMblp3WTJVdVlXMWhlbTl1WVhkekxtTnZiVEFUXG5CZ05WSFNBRUREQUtNQWdHQm1lQkRBRUNBVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdIUVlEVlIwbEJCWXdGQVlJXG5Ld1lCQlFVSEF3RUdDQ3NHQVFVRkJ3TUNNRHNHQTFVZEh3UTBNREl3TUtBdW9DeUdLbWgwZEhBNkx5OWpjbXd1XG5jakp0TURFdVlXMWhlbTl1ZEhKMWMzUXVZMjl0TDNJeWJUQXhMbU55YkRCMUJnZ3JCZ0VGQlFjQkFRUnBNR2N3XG5MUVlJS3dZQkJRVUhNQUdHSVdoMGRIQTZMeTl2WTNOd0xuSXliVEF4TG1GdFlYcHZiblJ5ZFhOMExtTnZiVEEyXG5CZ2dyQmdFRkJRY3dBb1lxYUhSMGNEb3ZMMk55ZEM1eU1tMHdNUzVoYldGNmIyNTBjblZ6ZEM1amIyMHZjakp0XG5NREV1WTJWeU1Bd0dBMVVkRXdFQi93UUNNQUF3Z2dGOUJnb3JCZ0VFQWRaNUFnUUNCSUlCYlFTQ0FXa0Jad0IxXG5BTThSVnU3VkxueXY4NGRiMldrdW0ra2FjV2RLc0Jmc3JBSFNXM2ZPekRzSUFBQUJqUnQrRzRZQUFBUURBRVl3XG5SQUlnWG9zV05xUXNBYlkvL2hGUVFob0U1YW1pbmd3TXBRZnZTYTZtZ1ZwMG9Kc0NJRnpBTEhmR3lUb3kwOG1GXG5wMVN1MithUmNJYzUxS1dqaVhYTnNvL21FTFpxQUhVQVB4ZExUOWNpUjFpVUhXVWNoTDRORXUyUU4zOGZoV3JyXG53YjhvaGV6NFpHNEFBQUdORzM0YlRBQUFCQU1BUmpCRUFpQUpoZ1pub1MrRjVUUFM1cC96WUxLb29UMTBCLzJBXG5vYUFDdWtMQkJBS0h3Z0lnVFhqUm5OUGZ3WCtpMUNibWVhbkVaSVBGdC9sYmZLYlRTdEdsWlZNNSt5WUFkd0I5XG5XUjRTNFhncWV4eGhaM3hlL2ZqUWgxd1VvRTZWbnJrREw5a09qQzU1dUFBQUFZMGJmaHRIQUFBRUF3QklNRVlDXG5JUURUTzk3V2FzUTYxRncvQUEvVXZta3kvc0tnblZpQktKSHpGaC95WVlzU3lnSWhBSmdFUXdsbXpSVEFWS0h3XG5DL1NLRUs3VkdXVit4YmROalZma08vdlBiOTZTTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFDZUJNekF2ZldkXG5zcmFYcGRLcUFPaVBDcklyT0VmZnNMNG9JakZydmovTnozRzMvYWRIYlI5bStrZCtYUEJNUGVRUVVvc2ZNQWRMXG5HTSswMHhnbkVMc3A3ZjU0ZmZWbVRYYWRUSzc2NFNQUlZpZzhZZ3JraUdlbHRURmg0TGtnQzhUUmR2ZUZ5Tmk4XG5WcW1CYzB1VXc4UW8vajk3OXlTcnVsZzhZWDBmRGFTMFYwcFdUNTJBVTMxU2hSRGhHT256MEVwZGZ4RWNoMTlWXG5YNHVQdUhoSFZpV3hqMEhldVVHVXAwRHB2dlFsQVFUdTlqb282NkhCSlRObTdUNmpwN2hmU3VEZjJnSGVvdDRYXG5oTmxLN01aTXB2TUZpM1k3Y1JGMkhKcDNHTWJ2NjVzaFlCYkxuTGg4clg5Vzk4YTZIVjBGZ1pTYSs1WnVKYnE2XG5HajEzS1lWVkpRa2Ncbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSU0EgMjA0OCBNMDFcbklzc3VlcjpDID0gVVMsIE8gPSBBbWF6b24sIENOID0gQW1hem9uIFJvb3QgQ0EgMVxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOjA3NzMxMjM4MGI5ZDY2ODhhMzNiMWVkOWJmOWNjZGE2OGUwZTBmXG5TaWduYXR1cmUgQWxnb3JpdGhtOnNoYTI1NldpdGhSU0FFbmNyeXB0aW9uXG5QdWJsaWMgS2V5IEFsZ29yaXRobTpyc2FFbmNyeXB0aW9uXG5YNTA5djMgQmFzaWMgQ29uc3RyYWludHM6Q0E6VFJVRSwgcGF0aGxlbjowXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnblxuWDUwOXYzIEV4dGVuZGVkIEtleSBVc2FnZTpUTFMgV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiwgVExTIFdlYiBDbGllbnQgQXV0aGVudGljYXRpb25cblg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOjgxOkI4OjBFOjYzOjhBOjg5OjEyOjE4OkU1OkZBOjNCOjNCOjUwOjk1OjlGOkU2OkU1OjkwOjEzOjg1XG5YNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOjg0OjE4OkNDOjg1OjM0OkVDOkJDOjBDOjk0Ojk0OjJFOjA4OjU5OjlDOkM3OkIyOjEwOjRFOjBBOjA4XG5BdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzOk9DU1AgLSBVUkk6aHR0cDovL29jc3Aucm9vdGNhMS5hbWF6b250cnVzdC5jb21cbkNBIElzc3VlcnMgLSBVUkk6aHR0cDovL2NydC5yb290Y2ExLmFtYXpvbnRydXN0LmNvbS9yb290Y2ExLmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucm9vdGNhMS5hbWF6b250cnVzdC5jb20vcm9vdGNhMS5jcmxcblg1MDl2MyBDZXJ0aWZpY2F0ZSBQb2xpY2llczpQb2xpY3k6IDIuMjMuMTQwLjEuMi4xXG5TdGFydCBkYXRlOkF1ZyAyMyAyMjoyMToyOCAyMDIyIEdNVFxuRXhwaXJlIGRhdGU6QXVnIDIzIDIyOjIxOjI4IDIwMzAgR01UXG5SU0EgUHVibGljIEtleToyMDQ4XG5yc2Eobik6RUI3MTJDQTlDQjFGODgyODkyMzIzMEFGOEE1NzBGNzhCNzM3MjU5NTU1ODdBQzY3NUM5N0QzMjJDOERBQTIxNDY3NkI3Q0YwNjdEQUUyMDMyQUIzNTYxMjVEQzZCNTQ3Rjk2NzA4QTc5MzdBOTU5MjE4MEZCNEY5RjkxMDM2OUE3RjJGODBCNjRGQkExMzRFQzc1RDUzMUVFMEREOTYzMzA3MjBEMzk2QkMxMkU0NzQ1MDQyQTEwNTEzNzNCNTRGOUI0NDI0RkUyRDdGRURCQzIyODVFQzM2MjEzMzk3NzUwNkNFMjcxODgyRENFM0Q5QzU4MjA3OEQ1RTI2MDEyNjI2NjcxRkQ5M0YxM0NGMzJCQTZCQUQ3ODY0RkNBQUZGMEUwMjNDMDdERjlDMDU3ODcyOENGREVBNzVCNzAzMjg4NERBRTg2RTA3OENEMDUwODVFRjgxNTRCMjcxNkVFQzZENjJFRjhGOTRDMzVFRTlDNEE0RDA5MUMwMkUyNDkxOThDQUVFQkEyNThFRDRGNjcxQjZGQjVCNkIzODA2NDgzNzQ3OEQ4NkRDRjJFQTA2RkI3NjM3N0Q5RUZGNDI0RTRENTg4MjkzQ0ZFMjcxQzI3OEIxN0FBQjRCNUI5NDM3ODg4MUU0RDlBRjI0QUVGODcyQzU2NUZCNEJCNDUxRTdcbnJzYShlKToxMDAwMVxuU2lnbmF0dXJlOmFkOjAwOmRlOjAyOjA1OjIzOjJlOjA2OjMyOjYyOmI0OjZiOmIxOjk0OjE2OmU0OjExOjQwOmRlOjJiOmZhOjU5OmMxOjM1OmVmOmUwOmFhOjhmOjJiOjQxOmI5OmQxOmYzOjg3OjM5OjAwOjFkOmYyOjNkOmI1OmE3OjQ3OjBjOjA2OjA2OmM2OjkxOmYzOjA3OjU3OjAyOmQ0OmVkOmJkOjE3OmMxOjkwOjlhOmJmOjQ4Ojc1OmEyOjA3OjRmOjMwOmRkOjRhOjZhOjQyOmI1OjBkOjNkOjE1OmMwOjBmOmZlOjg0OjViOmM2OjNjOjk5OmNjOjU3OjUyOmIxOmQ4OjZlOjEyOmQ1Ojk2OjkyOjkzOjRiOjk0OmU1OjA3OmU4Ojg5OjgyOjA4OjZhOjdhOjM0OmQ0OjllOjY0OmUxOjNkOjg3OjZhOjkyOjkwOjlhOjYzOmExOjRiOmY4OjhmOmI2OmVhOjM0OmQzOjA1OmJlOjIwOmMyOmRlOjA2OmUyOjhjOjlmOjczOjhiOjlmOjRkOjM5Ojg1OmNhOmNlOjE5OjM2OjlkOjg1OmM5OjllOmM5OmY4OjUwOjNmOmI2OjdlOjg4OmExOmVmOmNhOjg0OjA2OjhiOjUwOmI0OjBhOjVjOmE2OjFjOjQ0OmYxOmZkOmM4OjYxOjQwOjYwOmYyOjYxOjI1OmFhOjA3OmY0OmM3OmMyOjczOjc1OmU0OjBjOjBiOjQyOjhkOjA0OmU1OjVmOjQ0OjQ4Ojk5OjViOjdiOjg5OjgxOjk2OmE3Ojg4OjlkOjRiOjBkOjYyOmU4OjA0OmM0OmQ3OmZlOmI0OmU4OmIyOjZkOmNhOmVjOmMwOjFjOmJjOjM4OjViOjFkOmRmOjg1OmNlOjViOjdhOmUzOjQ5OjRiOjZjOmI5OmE3OmRkOmY0OjA1OmIyOjQ5OmFkOmUxOmM1OjE0OjZiOmMyOmNjOmViOmNkOjdmOmQ2OjU4OjY5OmJhOmMzOjIwOjdlOjdmOmIwOmI4OlxuLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tXG5NSUlFWGpDQ0EwYWdBd0lCQWdJVEIzTVNPQXVkWm9pak94N1p2NXpOcG80T0R6QU5CZ2txaGtpRzl3MEJBUXNGXG5BREE1TVFzd0NRWURWUVFHRXdKVlV6RVBNQTBHQTFVRUNoTUdRVzFoZW05dU1Sa3dGd1lEVlFRREV4QkJiV0Y2XG5iMjRnVW05dmRDQkRRU0F4TUI0WERUSXlNRGd5TXpJeU1qRXlPRm9YRFRNd01EZ3lNekl5TWpFeU9Gb3dQREVMXG5NQWtHQTFVRUJoTUNWVk14RHpBTkJnTlZCQW9UQmtGdFlYcHZiakVjTUJvR0ExVUVBeE1UUVcxaGVtOXVJRkpUXG5RU0F5TURRNElFMHdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFPdHhMS25MXG5INGdva2pJd3I0cFhEM2kzTnlXVlZZZXNaMXlYMHlMSTJxSVVaMnQ4OEdmYTRnTXFzMVlTWGNhMVIvbG5DS2VUXG5lcFdTR0ErMCtma1FOcHAvTDRDMlQ3b1RUc2RkVXg3ZzNaWXpCeURUbHJ3UzVIUlFRcUVGRTNPMVQ1dEVKUDR0XG5mKzI4SW9Yc05pRXpsM1VHemljWWd0emoyY1dDQjQxZUpnRW1KbWNmMlQ4VHp6SzZhNjE0WlB5cS93NENQQWZmXG5uQVY0Y296OTZuVzNBeWlFMnVodUI0elFVSVh2Z1ZTeWNXN3NiV0x2ajVURFh1bkVwTkNSd0M0a2taaks3cm9sXG5qdFQyY2JiN1cyczRCa2czUjQyRzNQTHFCdnQyTjMyZS8wSk9UVmlDazgvaWNjSjRzWHFyUzF1VU40aUI1Tm12XG5KSzc0Y3NWbCswdTBVZWNDQXdFQUFhT0NBVm93Z2dGV01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdEZ1lEXG5WUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQWRCZ05WXG5IUTRFRmdRVWdiZ09ZNHFKRWhqbCtqczdVSldmNXVXUUU0VXdId1lEVlIwakJCZ3dGb0FVaEJqTWhUVHN2QXlVXG5sQzRJV1p6SHNoQk9DZ2d3ZXdZSUt3WUJCUVVIQVFFRWJ6QnRNQzhHQ0NzR0FRVUZCekFCaGlOb2RIUndPaTh2XG5iMk56Y0M1eWIyOTBZMkV4TG1GdFlYcHZiblJ5ZFhOMExtTnZiVEE2QmdnckJnRUZCUWN3QW9ZdWFIUjBjRG92XG5MMk55ZEM1eWIyOTBZMkV4TG1GdFlYcHZiblJ5ZFhOMExtTnZiUzl5YjI5MFkyRXhMbU5sY2pBL0JnTlZIUjhFXG5PREEyTURTZ01xQXdoaTVvZEhSd09pOHZZM0pzTG5KdmIzUmpZVEV1WVcxaGVtOXVkSEoxYzNRdVkyOXRMM0p2XG5iM1JqWVRFdVkzSnNNQk1HQTFVZElBUU1NQW93Q0FZR1o0RU1BUUlCTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCXG5BUUN0QU40Q0JTTXVCakppdEd1eGxCYmtFVURlSy9wWndUWHY0S3FQSzBHNTBmT0hPUUFkOGoyMXAwY01CZ2JHXG5rZk1IVndMVTdiMFh3WkNhdjBoMW9nZFBNTjFLYWtLMURUMFZ3QS8raEZ2R1BKbk1WMUt4Mkc0UzFaYVNrMHVVXG41UWZvaVlJSWFubzAxSjVrNFQySGFwS1FtbU9oUy9pUHR1bzAwd1crSU1MZUJ1S01uM09MbjAwNWhjck9HVGFkXG5oY21leWZoUVA3WitpS0h2eW9RR2kxQzBDbHltSEVUeC9jaGhRR0R5WVNXcUIvVEh3bk4xNUF3TFFvMEU1VjlFXG5TSmxiZTRtQmxxZUluVXNOWXVnRXhOZit0T2l5YmNyc3dCeThPRnNkMzRYT1czcmpTVXRzdWFmZDlBV3lTYTNoXG54UlJyd3N6cnpYL1dXR202d3lCK2Y3QzRcbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBPID0gQW1hem9uLCBDTiA9IEFtYXpvbiBSb290IENBIDFcbklzc3VlcjpDID0gVVMsIFNUID0gQXJpem9uYSwgTCA9IFNjb3R0c2RhbGUsIE8gPSBcIlN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy5cIiwgQ04gPSBTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMlxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOjA2N2Y5NDRhMmEyN2NkZjNmYWMyYWUyYjAxZjkwOGVlYjljNGM2XG5TaWduYXR1cmUgQWxnb3JpdGhtOnNoYTI1NldpdGhSU0FFbmNyeXB0aW9uXG5QdWJsaWMgS2V5IEFsZ29yaXRobTpyc2FFbmNyeXB0aW9uXG5YNTA5djMgQmFzaWMgQ29uc3RyYWludHM6Q0E6VFJVRVxuWDUwOXYzIEtleSBVc2FnZTpEaWdpdGFsIFNpZ25hdHVyZSwgQ2VydGlmaWNhdGUgU2lnbiwgQ1JMIFNpZ25cblg1MDl2MyBTdWJqZWN0IEtleSBJZGVudGlmaWVyOjg0OjE4OkNDOjg1OjM0OkVDOkJDOjBDOjk0Ojk0OjJFOjA4OjU5OjlDOkM3OkIyOjEwOjRFOjBBOjA4XG5YNTA5djMgQXV0aG9yaXR5IEtleSBJZGVudGlmaWVyOjlDOjVGOjAwOkRGOkFBOjAxOkQ3OjMwOjJCOjM4Ojg4OkEyOkI4OjZEOjRBOjlDOkYyOjExOjkxOjgzXG5BdXRob3JpdHkgSW5mb3JtYXRpb24gQWNjZXNzOk9DU1AgLSBVUkk6aHR0cDovL29jc3Aucm9vdGcyLmFtYXpvbnRydXN0LmNvbVxuQ0EgSXNzdWVycyAtIFVSSTpodHRwOi8vY3J0LnJvb3RnMi5hbWF6b250cnVzdC5jb20vcm9vdGcyLmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9jcmwucm9vdGcyLmFtYXpvbnRydXN0LmNvbS9yb290ZzIuY3JsXG5YNTA5djMgQ2VydGlmaWNhdGUgUG9saWNpZXM6UG9saWN5OiBYNTA5djMgQW55IFBvbGljeVxuU3RhcnQgZGF0ZTpNYXkgMjUgMTI6MDA6MDAgMjAxNSBHTVRcbkV4cGlyZSBkYXRlOkRlYyAzMSAwMTowMDowMCAyMDM3IEdNVFxuUlNBIFB1YmxpYyBLZXk6MjA0OFxucnNhKG4pOkIyNzg4MDcxQ0E3OEQ1RTM3MUFGNDc4MDUwNzQ3RDZFRDhENzg4NzZGNDk5NjhGNzU4MjE2MEY5NzQ4NDAxMkZBQzAyMkQ4NkQzQTA0MzdBNEVCMkE0RDAzNkJBMDFCRThEREI0OEM4MDcxNzM2NENGNEVFODgyM0M3M0VFQjM3RjVCNTE5Rjg0OTY4QjBERUQ3Qjk3NjM4MUQ2MTlFQTRGRTgyMzZBNUU1NEE1NkU0NDVFMUY5RkRCNDE2RkE3NERBOUM5QjM1MzkyRkZBQjAyMDUwMDY2QzdBRDA4MEIyQTZGOUFGRUM0NzE5OEY1MDM4MDdEQ0EyODczOTU4RjhCQUQ1QTlGOTQ4NjczMDk2RUU5NDc4NUU2Rjg5QTM1MUMwMzA4NjY2QTE0NTY2QkE1NEVCQTNDMzkxRjk0OERDRkZEMUU4MzAyRDdEMkQ3NDcwMzVENzg4MjRGNzlFQzQ1OTZFQkI3Mzg3MTdGMjMyNDYyOEI4NDNGQUI3MURBQUNBQjRGMjlGMjQwRTJENEJGNzcxNUM1RTY5RkZFQTk1MDJDQjM4OEFBRTUwMzg2RkRCRkIyRDYyMUJDNUM3MUU1NEUxNzdFMDY3QzgwRjlDODcyM0Q2M0Y0MDIwN0YyMDgwQzQ4MDRDM0UzQjI0MjY4RTA0QUU2QzlBQzhBQTBEXG5yc2EoZSk6MTAwMDFcblNpZ25hdHVyZTo2MjozNzo0Mjo1YzpiYzoxMDpiNTozZTo4YjoyYzplOTowYzo5Yjo2Yzo0NTplMjowNzowMDo3YTpmOTpjNTo1ODowYjpiOTowODo4YzozZTplZDpiMzoyNTozYzpiNTo2Zjo1MDplNDpjZDozNTo2YTphNzo5MzozNDo5NjozMjoyMTphOTo0ODo0NDphYjo5YzplZDozZDpiNDphYTo3Mzo2ZDplNDo3ZjoxNjo4MDo4OTo2YzpjZjoyODowMzoxODo4Mzo0Nzo3OTphMzoxMDo3ZTozMDo1YjphYzozYjpiMDo2MDplMDo3NzpkNDowODphNjplMToxZDo3Yzo1ZTpjMDpiYjpmOTo5YTo3YjoyMjo5ZDphNzowMDowOTo3ZTphYzo0NjoxNzo4MzpkYzo5YzoyNjo1Nzo5OTozMDozOTo2Mjo5Njo4ZjplZDpkYTpkZTphYTpjNTpjYzoxYjozZTpjYTo0Mzo2ODo2Yzo1NzoxNjpiYzpkNTowZToyMDoyZTpmZTpmZjpjMjo2YTo1ZDoyZTphMDo0YTo2ZDoxNDo1ODo4Nzo5NDplNjozOTozMTo1Zjo3Yzo3MzpjYjo5MDo4ODo2YTo4NDoxMTo5NjoyNzphNjplZDpkOTo4MTo0NjphNjo3ZTphMzo3MjowMDowYTo1MjozZTo4Mzo4ODowNzo2Mzo3Nzo4OTo2OToxNzowZjozOTo4NTpkMjphYjowODo0NTo0ZDpkMDo1MTozYTpmZDo1ZDo1ZDozNzo2NDo0Yzo3ZTozMDpiMjo1NToyNDo0Mjo5ZDozNjpiMDo1ZDo5YzoxNzo4MTo2MTpmMTpjYTpmOToxMDowMjoyNDphYjplYjowZDo3NDo5MTo4ZDo3Yjo0NToyOTo1MDozOTo4ODpiMjphNjo4OTozNToyNToxZToxNDo2YTo0NzoyMzozMToyZjo1Yzo5YTpmYTphZDo5YTowZTo2Mjo1MTphNDoyYTphOTpjNDpmOTozNDo5ZDoyMToxODpcbi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuTUlJRWtqQ0NBM3FnQXdJQkFnSVRCbitVU2lvbnpmUDZ3cTRyQWZrSTdybkV4akFOQmdrcWhraUc5dzBCQVFzRlxuQURDQm1ERUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOalxuYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eFxuT3pBNUJnTlZCQU1UTWxOMFlYSm1hV1ZzWkNCVFpYSjJhV05sY3lCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMVxuZEdodmNtbDBlU0F0SUVjeU1CNFhEVEUxTURVeU5URXlNREF3TUZvWERUTTNNVEl6TVRBeE1EQXdNRm93T1RFTFxuTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWk1CY0dBMVVFQXhNUVFXMWhlbTl1SUZKdlxuYjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMSjRnSEhLZU5YalxuY2E5SGdGQjBmVzdZMTRoMjlKbG85MWdoWVBsMGhBRXZyQUl0aHRPZ1EzcE9zcVRRTnJvQnZvM2JTTWdIRnpaTVxuOU82SUk4Yys2emYxdFJuNFNXaXczdGU1ZGpnZFlaNmsvb0kycGVWS1Z1UkY0Zm45dEJiNmROcWNtelU1TC9xd1xuSUZBR2JIclFnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNlxuVk91anc1SDVTTnovMGVnd0xYMHRkSEExMTRnazk1N0VXVzY3YzRjWDhqSkdLTGhEK3JjZHFzcTA4cDhrRGkxTFxuOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2VWT0YzNEdmSUQ1eUhJOVkvUUNCL0lJREVnRXcrT3lRbVxuamdTdWJKcklxZzBDQXdFQUFhT0NBVEV3Z2dFdE1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL1xuQkFRREFnR0dNQjBHQTFVZERnUVdCQlNFR015Rk5PeThESlNVTGdoWm5NZXlFRTRLQ0RBZkJnTlZIU01FR0RBV1xuZ0JTY1h3RGZxZ0hYTUNzNGlLSzRiVXFjOGhHUmd6QjRCZ2dyQmdFRkJRY0JBUVJzTUdvd0xnWUlLd1lCQlFVSFxuTUFHR0ltaDBkSEE2THk5dlkzTndMbkp2YjNSbk1pNWhiV0Y2YjI1MGNuVnpkQzVqYjIwd09BWUlLd1lCQlFVSFxuTUFLR0xHaDBkSEE2THk5amNuUXVjbTl2ZEdjeUxtRnRZWHB2Ym5SeWRYTjBMbU52YlM5eWIyOTBaekl1WTJWeVxuTUQwR0ExVWRId1EyTURRd01xQXdvQzZHTEdoMGRIQTZMeTlqY213dWNtOXZkR2N5TG1GdFlYcHZiblJ5ZFhOMFxuTG1OdmJTOXliMjkwWnpJdVkzSnNNQkVHQTFVZElBUUtNQWd3QmdZRVZSMGdBREFOQmdrcWhraUc5dzBCQVFzRlxuQUFPQ0FRRUFZamRDWEx3UXRUNkxMT2tNbTJ4RjRnY0Fldm5GV0F1NUNJdys3Yk1sUExWdlVPVE5OV3Fua3pTV1xuTWlHcFNFU3JuTzA5dEtwemJlUi9Gb0NKYk04b0F4aURSM21qRUg0d1c2dzdzR0RnZDlRSXB1RWRmRjdBdS9tYVxuZXlLZHB3QUpmcXhHRjRQY25DWlhtVEE1WXBhUDdkcmVxc1hNR3o3S1EyaHNWeGE4MVE0Z0x2Ny93bXBkTHFCS1xuYlJSWWg1VG1PVEZmZkhQTGtJaHFoQkdXSjZidDJZRkdwbjZqY2dBS1VqNkRpQWRqZDRscEZ3ODVoZEtyQ0VWTlxuMEZFNi9WMWROMlJNZmpDeVZTUkNuVGF3WFp3WGdXSHh5dmtRQWlTcjZ3MTBrWTE3UlNsUU9ZaXlwb2sxSlI0VVxuYWtjak1TOWNtdnF0bWc1aVVhUXFxY1Q1TkowaEdBPT1cbi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS1cblN1YmplY3Q6QyA9IFVTLCBTVCA9IEFyaXpvbmEsIEwgPSBTY290dHNkYWxlLCBPID0gXCJTdGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuXCIsIENOID0gU3RhcmZpZWxkIFNlcnZpY2VzIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzJcbklzc3VlcjpDID0gVVMsIE8gPSBcIlN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy5cIiwgT1UgPSBTdGFyZmllbGQgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eVxuVmVyc2lvbjoyXG5TZXJpYWwgTnVtYmVyOmE3MGU0YTRjMzQ4MmI3N2ZcblNpZ25hdHVyZSBBbGdvcml0aG06c2hhMjU2V2l0aFJTQUVuY3J5cHRpb25cblB1YmxpYyBLZXkgQWxnb3JpdGhtOnJzYUVuY3J5cHRpb25cblg1MDl2MyBCYXNpYyBDb25zdHJhaW50czpDQTpUUlVFXG5YNTA5djMgS2V5IFVzYWdlOkRpZ2l0YWwgU2lnbmF0dXJlLCBDZXJ0aWZpY2F0ZSBTaWduLCBDUkwgU2lnblxuWDUwOXYzIFN1YmplY3QgS2V5IElkZW50aWZpZXI6OUM6NUY6MDA6REY6QUE6MDE6RDc6MzA6MkI6Mzg6ODg6QTI6Qjg6NkQ6NEE6OUM6RjI6MTE6OTE6ODNcblg1MDl2MyBBdXRob3JpdHkgS2V5IElkZW50aWZpZXI6QkY6NUY6Qjc6RDE6Q0U6REQ6MUY6ODY6RjQ6NUI6NTU6QUM6REM6RDc6MTA6QzI6MEU6QTk6ODg6RTdcbkF1dGhvcml0eSBJbmZvcm1hdGlvbiBBY2Nlc3M6T0NTUCAtIFVSSTpodHRwOi8vby5zczIudXMvXG5DQSBJc3N1ZXJzIC0gVVJJOmh0dHA6Ly94LnNzMi51cy94LmNlclxuWDUwOXYzIENSTCBEaXN0cmlidXRpb24gUG9pbnRzOkZ1bGwgTmFtZTpcbiAgVVJJOmh0dHA6Ly9zLnNzMi51cy9yLmNybFxuWDUwOXYzIENlcnRpZmljYXRlIFBvbGljaWVzOlBvbGljeTogWDUwOXYzIEFueSBQb2xpY3lcblN0YXJ0IGRhdGU6U2VwICAyIDAwOjAwOjAwIDIwMDkgR01UXG5FeHBpcmUgZGF0ZTpKdW4gMjggMTc6Mzk6MTYgMjAzNCBHTVRcblJTQSBQdWJsaWMgS2V5OjIwNDhcbnJzYShuKTpENTBDM0FDNDJBRjk0RUUyRjVCRTE5OTc1RjhFODg1M0IxMUYzRkNCQ0Y5RjIwMTM2RDI5M0FDODBGN0QzQ0Y3NkI3NjM4NjNEOTM2NjBBODlCNUU1QzAwODBCMjJGNTk3RkY2ODdGOTI1NDM4NkU3NjkxQjUyOUE5MEUxNzFFM0Q4MkQwRDRFNkZGNkM4NDlEOUI2RjMxQTU2QUUyQkI2NzQxNEVCQ0ZGQjI2RTMxQUJBMUQ5NjJFNkEzQjU4OTQ4OTQ3NTZGRjI1QTA5MzcwNTM4M0RBODQ3NDE0QzM2NzlFMDQ2ODNBREY4RTQwNUExRDRBNEVDRjQzOTEzQkU3NTZENjAwNzBDQjUyRUU3QjdEQUUzQUU3QkMzMUY5NDVGNkMyNjBDRjEzNTkwMjJCODBDQzM0NDdERkI5REU5MDY1NkQwMkNGMkM5MUE2QTZFN0RFODUxODQ5N0M2NjRFQTMzQTZEQTlCNUVFMzQyRUJBMEQwM0I4MzNERjQ3RUJCMTZCOEQyNUQ5OUJDRTgxRDE0NTQ2MzI5NjcwODdERTAyMEU0OTQzODVCNjZDNzNCQjY0RUE2MTQxQUNDOUQ0NTRERjg3MkZDNzIyQjIyNkNDOUY1OTU0Njg5RkZDQkUyQTJGQzQ1NTFDNzU0MDYwMTc4NTAyNTUzOThCN0YwNVxucnNhKGUpOjEwMDAxXG5TaWduYXR1cmU6MjM6MWQ6ZTM6OGE6NTc6Y2E6N2Q6ZTk6MTc6Nzk6NGM6ZjE6MWU6NTU6ZmQ6Y2M6NTM6NmU6M2U6NDc6MGY6ZGY6YzY6NTU6ZjI6YjI6MDQ6MzY6ZWQ6ODA6MWY6NTM6YzQ6NWQ6MzQ6Mjg6NmI6YmU6Yzc6NTU6ZmM6Njc6ZWE6Y2I6M2Y6N2Y6OTA6YjI6MzM6Y2Q6MWI6NTg6MTA6ODI6MDI6Zjg6Zjg6MmY6ZjU6MTM6NjA6ZDQ6MDU6Y2U6ZjE6ODE6MDg6YzE6ZGQ6YTc6NzU6OTc6NGY6MTg6Yjk6NmQ6ZGU6Zjc6OTM6OTE6MDg6YmE6N2U6NDA6MmM6ZWQ6YzE6ZWE6YmI6NzY6OWU6MzM6MDY6Nzc6MWQ6MGQ6MDg6N2Y6NTM6ZGQ6MWI6NjQ6YWI6ODI6Mjc6ZjE6Njk6ZDU6NGQ6NWU6YWU6ZjQ6YTE6YzM6NzU6YTc6NTg6NDQ6MmQ6ZjI6M2M6NzA6OTg6YWM6YmE6Njk6YjY6OTU6Nzc6N2Y6MGY6MzE6NWU6MmM6ZmM6YTA6ODc6M2E6NDc6Njk6ZjA6Nzk6NWY6ZjQ6MTQ6NTQ6YTQ6OTU6NWU6MTE6Nzg6MTI6NjA6Mjc6Y2U6OWY6YzI6Nzc6ZmY6MjM6NTM6Nzc6NWQ6YmE6ZmY6ZWE6NTk6ZTc6ZGI6Y2Y6YWY6OTI6OTY6ZWY6MjQ6OWE6MzU6MTA6N2E6OWM6OTE6YzY6MGU6N2Q6OTk6ZjY6M2Y6MTk6ZGY6ZjU6NzI6NTQ6ZTE6MTU6YTk6MDc6NTk6N2I6ODM6YmY6NTI6MmU6NDY6OGM6YjI6MDA6NjQ6NzY6MWM6NDg6ZDM6ZDg6Nzk6ZTg6NmU6NTY6Y2M6YWU6MmM6MDM6OTA6ZDc6MTk6Mzg6OTk6ZTQ6Y2E6MDk6MTk6NWI6ZmY6MDc6OTY6YjA6YTg6N2Y6MzQ6NDk6ZGY6NTY6YTk6Zjc6YjA6NWY6ZWQ6MzM6ZWQ6OGM6NDc6Yjc6MzA6MDM6NWQ6ZjQ6MDM6OGM6XG4tLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbk1JSUVkVENDQTEyZ0F3SUJBZ0lKQUtjT1NrdzBncmQvTUEwR0NTcUdTSWIzRFFFQkN3VUFNR2d4Q3pBSkJnTlZcbkJBWVRBbFZUTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1USXdcbk1BWURWUVFMRXlsVGRHRnlabWxsYkdRZ1EyeGhjM01nTWlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBcbmVUQWVGdzB3T1RBNU1ESXdNREF3TURCYUZ3MHpOREEyTWpneE56TTVNVFphTUlHWU1Rc3dDUVlEVlFRR0V3SlZcblV6RVFNQTRHQTFVRUNCTUhRWEpwZW05dVlURVRNQkVHQTFVRUJ4TUtVMk52ZEhSelpHRnNaVEVsTUNNR0ExVUVcbkNoTWNVM1JoY21acFpXeGtJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakU3TURrR0ExVUVBeE15VTNSaGNtWnBcblpXeGtJRk5sY25acFkyVnpJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJQzBnUnpJd2dnRWlcbk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFZERHJFS3ZsTzR2VytHWmRmam9oVHNSOC9cbnk4K2ZJQk50S1RySUQzMDg5MnQyT0dQWk5tQ29tMTVjQUlDeUwxbC85b2Y1SlVPRzUya2JVcHFRNFhIajJDME5cblRtLzJ5RW5adHZNYVZxNHJ0blFVNjgvN0p1TWF1aDJXTG1vN1dKU0pSMWIvSmFDVGNGT0Qyb1IwRk1Obm5nUm9cbk90K09RRm9kU2s3UFE1RTc1MWJXQUhETFV1NTdmYTQ2NTd3eCtVWDJ3bURQRTFrQ0s0RE1ORWZmdWQ2UVpXMENcbnp5eVJwcWJuM29VWVNYeG1UcU02YmFtMTdqUXV1ZzBEdURQZlIrdXhhNDBsMlp2T2dkRkZSaktXY0lmZUFnNUpcblE0VzJiSE83Wk9waFFhekoxRlRmaHkvSElySW16SjlaVkdpZi9MNHFMOFJWSEhWQVlCZUZBbFU1aTM4RkFnTUJcbkFBR2pnZkF3Z2Uwd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9cbkJCWUVGSnhmQU4rcUFkY3dLemlJb3JodFNwenlFWkdETUI4R0ExVWRJd1FZTUJhQUZMOWZ0OUhPM1IrRzlGdFZcbnJOelhFTUlPcVlqbk1FOEdDQ3NHQVFVRkJ3RUJCRU13UVRBY0JnZ3JCZ0VGQlFjd0FZWVFhSFIwY0RvdkwyOHVcbmMzTXlMblZ6THpBaEJnZ3JCZ0VGQlFjd0FvWVZhSFIwY0RvdkwzZ3VjM015TG5WekwzZ3VZMlZ5TUNZR0ExVWRcbkh3UWZNQjB3RzZBWm9CZUdGV2gwZEhBNkx5OXpMbk56TWk1MWN5OXlMbU55YkRBUkJnTlZIU0FFQ2pBSU1BWUdcbkJGVWRJQUF3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUNNZDQ0cFh5bjNwRjNsTThSNVYvY3hUYmo1SEQ5L0dcblZmS3lCRGJ0Z0I5VHhGMDBLR3UreDFYOForckxQMytRc2pQTkcxZ1FnZ0w0K0MvMUUyRFVCYzd4Z1FqQjNhZDFcbmwwOFl1VzNlOTVPUkNMcCtRQ3p0d2VxN2RwNHpCbmNkRFFoL1U5MGJaS3VDSi9GcDFVMWVydlNodzNXbldFUXRcbjhqeHdtS3k2YWJhVmQzOFBNVjRzL0tDSE9rZHA4SGxmOUJSVXBKVmVFWGdTWUNmT244SjMveU5UZDEyNi8rcFpcbjU5dlByNUtXN3lTYU5SQjZuSkhHRG4yWjlqOFozL1Z5Vk9FVnFRZFplNE8vVWk1R2pMSUFaSFljU05QWWVlaHVcblZzeXVMQU9RMXhrNG1lVEtDUmxiL3dlV3NLaC9ORW5mVnFuM3NGL3RNKzJNUjdjd0ExMzBBNHc9XG4tLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tXG4iLCJjb250ZW50X3R5cGUiOm51bGwsImNvbm5faWQiOjAsImVycm9ybXNnIjpudWxsLCJleGl0Y29kZSI6MCwiZmlsZW5hbWVfZWZmZWN0aXZlIjpudWxsLCJmdHBfZW50cnlfcGF0aCI6bnVsbCwiaHR0cF9jb2RlIjozMDIsImh0dHBfY29ubmVjdCI6MCwiaHR0cF92ZXJzaW9uIjoiMS4xIiwibG9jYWxfaXAiOiIxOTIuMTY4LjExLjExMCIsImxvY2FsX3BvcnQiOjM3MDc4LCJtZXRob2QiOiJIRUFEIiwibnVtX2NlcnRzIjo0LCJudW1fY29ubmVjdHMiOjEsIm51bV9oZWFkZXJzIjo0LCJudW1fcmVkaXJlY3RzIjowLCJwcm94eV9zc2xfdmVyaWZ5X3Jlc3VsdCI6MCwicmVkaXJlY3RfdXJsIjoiaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9pYW0iLCJyZWZlcmVyIjpudWxsLCJyZW1vdGVfaXAiOiI1NC4yNDAuMjUwLjIzNSIsInJlbW90ZV9wb3J0Ijo0NDMsInJlc3BvbnNlX2NvZGUiOjMwMiwic2NoZW1lIjoiSFRUUFMiLCJzaXplX2Rvd25sb2FkIjowLCJzaXplX2hlYWRlciI6MTgxLCJzaXplX3JlcXVlc3QiOjkxLCJzaXplX3VwbG9hZCI6MCwic3BlZWRfZG93bmxvYWQiOjAsInNwZWVkX3VwbG9hZCI6MCwic3NsX3ZlcmlmeV9yZXN1bHQiOjAsInRpbWVfYXBwY29ubmVjdCI6MC41OTYxNjMsInRpbWVfY29ubmVjdCI6MC4yNTA5MjUsInRpbWVfbmFtZWxvb2t1cCI6MC4wODE2MzMsInRpbWVfcHJldHJhbnNmZXIiOjAuNTk2MjY4LCJ0aW1lX3JlZGlyZWN0IjowLjAwMDAwMCwidGltZV9zdGFydHRyYW5zZmVyIjowLjc2MzY4NSwidGltZV90b3RhbCI6MC43NjM3NTgsInVybCI6Imh0dHBzOi8vc3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tOjQ0MyIsInVybC5zY2hlbWUiOiJodHRwcyIsInVybC51c2VyIjpudWxsLCJ1cmwucGFzc3dvcmQiOm51bGwsInVybC5vcHRpb25zIjpudWxsLCJ1cmwuaG9zdCI6InN0cy51cy13ZXN0LTIuYW1hem9uYXdzLmNvbSIsInVybC5wb3J0IjoiNDQzIiwidXJsLnBhdGgiOiIvIiwidXJsLnF1ZXJ5IjpudWxsLCJ1cmwuZnJhZ21lbnQiOm51bGwsInVybC56b25laWQiOm51bGwsInVybGUuc2NoZW1lIjoiaHR0cHMiLCJ1cmxlLnVzZXIiOm51bGwsInVybGUucGFzc3dvcmQiOm51bGwsInVybGUub3B0aW9ucyI6bnVsbCwidXJsZS5ob3N0Ijoic3RzLnVzLXdlc3QtMi5hbWF6b25hd3MuY29tIiwidXJsZS5wb3J0IjoiNDQzIiwidXJsZS5wYXRoIjoiLyIsInVybGUucXVlcnkiOm51bGwsInVybGUuZnJhZ21lbnQiOm51bGwsInVybGUuem9uZWlkIjpudWxsLCJ1cmxfZWZmZWN0aXZlIjoiaHR0cHM6Ly9zdHMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb206NDQzLyIsInVybG51bSI6MCwieGZlcl9pZCI6MCwiY3VybF92ZXJzaW9uIjoibGliY3VybC84LjIuMSBPcGVuU1NMLzMuMS40IHpsaWIvMS4yLjEzIGJyb3RsaS8xLjEuMCBsaWJpZG4yLzIuMy43IGxpYnBzbC8wLjIxLjIgKCtsaWJpZG4yLzIuMy40KSBsaWJzc2gvMC4xMC42L29wZW5zc2wvemxpYiBuZ2h0dHAyLzEuNTUuMSBPcGVuTERBUC8yLjYuNyJ9Ck5WX0NVUkxKU09OX0VORAo=", + ensurePrivate: false, + expectSuccess: true, + errorMessage: "the remote IP is not accessible", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + FakeEC2Cli := mocks.NewMockEC2Client(ctrl) + + out := &ec2.GetConsoleOutputOutput{ + InstanceId: awss.String("dummy-instance"), + Output: awss.String(tt.output), + } + + FakeEC2Cli.EXPECT().GetConsoleOutput(gomock.Any(), gomock.Any()).Times(1).Return(out, nil) + + cli := AwsVerifier{ + AwsClient: &aws.Client{ + Region: "us-west-2", + }, + } + + cli.AwsClient.SetClient(FakeEC2Cli) + cli.Logger = &ocmlog.GlogLogger{} + + err := cli.findUnreachableEndpoints(context.TODO(), "dummy-instance", curl.Probe{}, tt.ensurePrivate) + if err != nil { + t.Errorf("err should be nil when there's success in output, got: %v", err) + } + + if tt.expectSuccess != cli.Output.IsSuccessful() { + t.Errorf(tt.errorMessage) + } + }) + } +} + func TestFindUnreachableEndpointsSuccessWithLegacyProbe(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() @@ -42,7 +123,7 @@ func TestFindUnreachableEndpointsSuccessWithLegacyProbe(t *testing.T) { cli.AwsClient.SetClient(FakeEC2Cli) cli.Logger = &ocmlog.GlogLogger{} - err := cli.findUnreachableEndpoints(context.TODO(), "dummy-instance", legacy.Probe{}) + err := cli.findUnreachableEndpoints(context.TODO(), "dummy-instance", legacy.Probe{}, false) if err != nil { t.Errorf("err should be nil when there's success in output, got: %v", err) } @@ -71,7 +152,7 @@ func TestFindUnreachableEndpointsNoSuccessWithLegacyProbe(t *testing.T) { cli.AwsClient.SetClient(FakeEC2Cli) cli.Logger = &ocmlog.GlogLogger{} - err := cli.findUnreachableEndpoints(context.TODO(), "dummy-instance", legacy.Probe{}) + err := cli.findUnreachableEndpoints(context.TODO(), "dummy-instance", legacy.Probe{}, false) if err != nil { t.Errorf("Success! not found, but userdata end exists, err should be nil, got: %v", err) } diff --git a/pkg/verifier/aws/entry_point.go b/pkg/verifier/aws/entry_point.go index 001e0ee0..9a72dfe9 100644 --- a/pkg/verifier/aws/entry_point.go +++ b/pkg/verifier/aws/entry_point.go @@ -10,7 +10,9 @@ import ( awsTools "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/ec2" ec2Types "github.com/aws/aws-sdk-go-v2/service/ec2/types" + "github.com/openshift/osd-network-verifier/pkg/data/cloud" + "github.com/openshift/osd-network-verifier/pkg/data/egress_lists" handledErrors "github.com/openshift/osd-network-verifier/pkg/errors" "github.com/openshift/osd-network-verifier/pkg/output" @@ -244,7 +246,12 @@ func (a *AwsVerifier) ValidateEgress(vei verifier.ValidateEgressInput) *output.O } // findUnreachableEndpoints will call Probe.ParseProbeOutput(), which will store egress failures in a.Output.failures - err = a.findUnreachableEndpoints(vei.Ctx, instanceID, vei.Probe) + ensurePrivate := false + if vei.PlatformType == cloud.AWSHCPZeroEgress { + ensurePrivate = true + } + err = a.findUnreachableEndpoints(vei.Ctx, instanceID, vei.Probe, ensurePrivate) + if err != nil { a.Output.AddError(err) // Don't return yet; still need to terminate instance diff --git a/pkg/verifier/gcp/gcp_verifier.go b/pkg/verifier/gcp/gcp_verifier.go index 162ddd46..e1b76fde 100644 --- a/pkg/verifier/gcp/gcp_verifier.go +++ b/pkg/verifier/gcp/gcp_verifier.go @@ -7,13 +7,14 @@ import ( "time" ocmlog "github.com/openshift-online/ocm-sdk-go/logging" + "golang.org/x/oauth2/google" + computev1 "google.golang.org/api/compute/v1" + "github.com/openshift/osd-network-verifier/pkg/clients/gcp" handledErrors "github.com/openshift/osd-network-verifier/pkg/errors" "github.com/openshift/osd-network-verifier/pkg/helpers" "github.com/openshift/osd-network-verifier/pkg/output" "github.com/openshift/osd-network-verifier/pkg/probes" - "golang.org/x/oauth2/google" - computev1 "google.golang.org/api/compute/v1" ) type GcpVerifier struct { @@ -209,7 +210,7 @@ func (g *GcpVerifier) findUnreachableEndpoints(projectID, zone, instanceName str // Send probe's output off to the Probe interface for parsing g.Logger.Debug(context.TODO(), "probe output:\n---\n%s\n---", rawProbeOutput) - probe.ParseProbeOutput(rawProbeOutput, &g.Output) + probe.ParseProbeOutput(false, rawProbeOutput, &g.Output) return true, nil })